Skip to content

Commit ebcb7d2

Browse files
Merge pull request #3203 from nextcloud/feat/per-note-mode
feat: remember preview/edit mode per note
2 parents e5a6042 + d34dd7f commit ebcb7d2

10 files changed

Lines changed: 1583 additions & 42 deletions

File tree

app/schemas/it.niedermann.owncloud.notes.persistence.NotesDatabase/29.json

Lines changed: 756 additions & 0 deletions
Large diffs are not rendered by default.

app/schemas/it.niedermann.owncloud.notes.persistence.NotesDatabase/30.json

Lines changed: 762 additions & 0 deletions
Large diffs are not rendered by default.

app/src/main/java/it/niedermann/owncloud/notes/edit/EditNoteActivity.java

Lines changed: 41 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -249,40 +249,52 @@ private void replaceFragment() {
249249

250250

251251
/**
252-
* Returns the preferred mode for the account. If the mode is "remember last" the last mode is returned.
253-
* If the mode is "direct edit" and the account does not support direct edit, the default mode is returned.
252+
* Returns the preferred mode for the note. Checks the per-note stored mode first, then falls
253+
* back to the global preference. If the mode is "remember last" the last mode is returned.
254+
* If the mode is "direct edit" and the account does not support direct edit, edit mode is returned.
254255
*/
255-
private String getPreferenceMode(long accountId) {
256-
257-
final var prefKeyNoteMode = getString(R.string.pref_key_note_mode);
258-
final var prefKeyLastMode = getString(R.string.pref_key_last_note_mode);
256+
private String getPreferenceMode(long accountId, long noteId) {
259257
final var defaultMode = getString(R.string.pref_value_mode_edit);
260-
final var prefValueLast = getString(R.string.pref_value_mode_last);
261258
final var prefValueDirectEdit = getString(R.string.pref_value_mode_direct_edit);
262259

260+
final Note note = noteId > 0 ? repo.getNoteById(noteId) : null;
261+
final String storedMode = note == null ? null : note.getNoteMode();
262+
if (storedMode != null) {
263+
if (storedMode.equals(prefValueDirectEdit) && !isDirectEditingAvailable(accountId)) {
264+
return defaultMode;
265+
}
266+
return storedMode;
267+
}
263268

264-
final var preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
265-
final String modePreference = preferences.getString(prefKeyNoteMode, defaultMode);
269+
final var prefKeyNoteMode = getString(R.string.pref_key_note_mode);
270+
final var prefValuePreview = getString(R.string.pref_value_mode_preview);
266271

267-
String effectiveMode = modePreference;
268-
if (modePreference.equals(prefValueLast)) {
269-
effectiveMode = preferences.getString(prefKeyLastMode, defaultMode);
272+
final var preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
273+
String effectiveMode = preferences.getString(prefKeyNoteMode, defaultMode);
274+
275+
// A previously stored "remember last" value is no longer a valid mode; fall back to the default.
276+
final boolean knownMode = effectiveMode.equals(defaultMode)
277+
|| effectiveMode.equals(prefValuePreview)
278+
|| effectiveMode.equals(prefValueDirectEdit);
279+
if (!knownMode) {
280+
effectiveMode = defaultMode;
270281
}
271282

272-
if (effectiveMode.equals(prefValueDirectEdit)) {
273-
final Account accountById = repo.getAccountById(accountId);
274-
final var directEditAvailable = accountById != null && accountById.isDirectEditingAvailable();
275-
if (!directEditAvailable) {
276-
effectiveMode = defaultMode;
277-
}
283+
if (effectiveMode.equals(prefValueDirectEdit) && !isDirectEditingAvailable(accountId)) {
284+
effectiveMode = defaultMode;
278285
}
279286

280287
return effectiveMode;
281288
}
282289

290+
private boolean isDirectEditingAvailable(long accountId) {
291+
final Account account = repo.getAccountById(accountId);
292+
return account != null && account.isDirectEditingAvailable();
293+
}
294+
283295
private BaseNoteFragment getNoteFragment(long accountId, long noteId, final @Nullable String modePref) {
284296

285-
final var effectiveMode = modePref == null ? getPreferenceMode(accountId) : modePref;
297+
final var effectiveMode = modePref == null ? getPreferenceMode(accountId, noteId) : modePref;
286298

287299
final var prefValueEdit = getString(R.string.pref_value_mode_edit);
288300
final var prefValueDirectEdit = getString(R.string.pref_value_mode_direct_edit);
@@ -302,7 +314,7 @@ private BaseNoteFragment getNoteFragment(long accountId, long noteId, final @Nul
302314

303315
@NonNull
304316
private BaseNoteFragment getNewNoteFragment(Note newNote) {
305-
final var mode = getPreferenceMode(getAccountId());
317+
final var mode = getPreferenceMode(getAccountId(), 0);
306318

307319
final var prefValueDirectEdit = getString(R.string.pref_value_mode_direct_edit);
308320

@@ -397,18 +409,6 @@ public boolean onOptionsItemSelected(MenuItem item) {
397409
* Send result and closes the Activity
398410
*/
399411
public void close() {
400-
/* TODO enhancement: store last mode in note
401-
* for cross device functionality per note mode should be stored on the server.
402-
*/
403-
final var preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
404-
final String prefKeyLastMode = getString(R.string.pref_key_last_note_mode);
405-
if (fragment instanceof NoteEditFragment) {
406-
preferences.edit().putString(prefKeyLastMode, getString(R.string.pref_value_mode_edit)).apply();
407-
} else if (fragment instanceof NotePreviewFragment) {
408-
preferences.edit().putString(prefKeyLastMode, getString(R.string.pref_value_mode_preview)).apply();
409-
} else if (fragment instanceof NoteDirectEditFragment) {
410-
preferences.edit().putString(prefKeyLastMode, getString(R.string.pref_value_mode_direct_edit)).apply();
411-
}
412412
fragment.onCloseNote();
413413

414414
if(isTaskRoot()) {
@@ -435,12 +435,17 @@ public void onNoteUpdated(Note note) {
435435

436436
@Override
437437
public void changeMode(@NonNull Mode mode, boolean reloadNote) {
438-
switch (mode) {
439-
case EDIT -> launchExistingNote(getAccountId(), getNoteId(), getString(R.string.pref_value_mode_edit), reloadNote);
440-
case PREVIEW -> launchExistingNote(getAccountId(), getNoteId(), getString(R.string.pref_value_mode_preview), reloadNote);
441-
case DIRECT_EDIT -> launchExistingNote(getAccountId(), getNoteId(), getString(R.string.pref_value_mode_direct_edit), reloadNote);
438+
final String modeString = switch (mode) {
439+
case EDIT -> getString(R.string.pref_value_mode_edit);
440+
case PREVIEW -> getString(R.string.pref_value_mode_preview);
441+
case DIRECT_EDIT -> getString(R.string.pref_value_mode_direct_edit);
442442
default -> throw new IllegalStateException("Unknown mode: " + mode);
443+
};
444+
final long noteId = getNoteId();
445+
if (noteId > 0) {
446+
repo.updateNoteMode(noteId, modeString);
443447
}
448+
launchExistingNote(getAccountId(), noteId, modeString, reloadNote);
444449
}
445450

446451

app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesDatabase.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,13 @@
5858
NotesListWidgetData.class,
5959
ShareEntity.class,
6060
Capabilities.class
61-
}, version = 29,
61+
}, version = 30,
6262
autoMigrations = {
6363
@AutoMigration(from = 25, to = 26),
6464
@AutoMigration(from = 26, to = 27),
6565
@AutoMigration(from = 27, to = 28),
6666
@AutoMigration(from = 28, to = 29),
67+
@AutoMigration(from = 29, to = 30),
6768
}
6869
)
6970
@TypeConverters({Converters.class})

app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesRepository.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,10 @@ public void updateScrollY(long id, int scrollY) {
372372
db.getNoteDao().updateScrollY(id, scrollY);
373373
}
374374

375+
public void updateNoteMode(long id, @Nullable String noteMode) {
376+
db.getNoteDao().updateNoteMode(id, noteMode);
377+
}
378+
375379
public LiveData<List<CategoryWithNotesCount>> searchCategories$(Long accountId, String searchTerm) {
376380
return db.getNoteDao().searchCategories$(accountId, searchTerm);
377381
}

app/src/main/java/it/niedermann/owncloud/notes/persistence/dao/NoteDao.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
*/
77
package it.niedermann.owncloud.notes.persistence.dao;
88

9+
import androidx.annotation.Nullable;
910
import androidx.lifecycle.LiveData;
1011
import androidx.room.Dao;
1112
import androidx.room.Insert;
@@ -125,6 +126,9 @@ public interface NoteDao {
125126
@Query("UPDATE NOTE SET scrollY = :scrollY WHERE id = :id")
126127
void updateScrollY(long id, int scrollY);
127128

129+
@Query("UPDATE NOTE SET noteMode = :noteMode WHERE id = :id")
130+
void updateNoteMode(long id, @Nullable String noteMode);
131+
128132
@Query("UPDATE NOTE SET status = :status WHERE id = :id")
129133
void updateStatus(long id, DBStatus status);
130134

app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/Note.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,10 @@ public class Note implements Serializable, Item {
103103
@ColumnInfo(defaultValue = "0")
104104
private int scrollY = 0;
105105

106+
@Nullable
107+
@ColumnInfo(defaultValue = "NULL")
108+
private String noteMode;
109+
106110
public Note() {
107111
super();
108112
}
@@ -272,6 +276,15 @@ public void setScrollY(int scrollY) {
272276
this.scrollY = scrollY;
273277
}
274278

279+
@Nullable
280+
public String getNoteMode() {
281+
return noteMode;
282+
}
283+
284+
public void setNoteMode(@Nullable String noteMode) {
285+
this.noteMode = noteMode;
286+
}
287+
275288
@Override
276289
public boolean equals(Object o) {
277290
if (this == o) return true;

app/src/main/res/values/arrays.xml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
<item>@string/pref_value_mode_edit</item>
1414
<item>@string/pref_value_mode_preview</item>
1515
<item>@string/pref_value_mode_direct_edit</item>
16-
<item>@string/pref_value_mode_last</item>
1716
</string-array>
1817

1918
<string-array name="fontSize_values">
@@ -32,7 +31,6 @@
3231
<item>@string/noteMode_plain_edit</item>
3332
<item>@string/noteMode_plain_preview</item>
3433
<item>@string/noteMode_rich_edit</item>
35-
<item>@string/noteMode_remember_last</item>
3634
</string-array>
3735

3836
<string-array name="fontSize_entries" translatable="false">

app/src/main/res/values/strings.xml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -260,15 +260,13 @@
260260
<string name="pref_key_lock" translatable="false">lock</string>
261261
<string name="pref_key_prevent_screen_capture" translatable="false">preventScreenCapture</string>
262262
<string name="pref_category_security" translatable="false">security</string>
263-
<string name="pref_key_last_note_mode" translatable="false">lastNoteMode</string>
264263
<string name="pref_key_background_sync" translatable="false">backgroundSync</string>
265264
<string name="pref_key_enable_direct_edit" translatable="false">directEditPreference</string>
266265
<string name="pref_key_show_ecosystem_apps" translatable="false">show_ecosystem_apps</string>
267266
<string name="pref_key_swipe_actions" translatable="false">swipe_actions</string>
268267
<string name="pref_value_mode_edit" translatable="false">edit</string>
269268
<string name="pref_value_mode_direct_edit" translatable="false">directEdit</string>
270269
<string name="pref_value_mode_preview" translatable="false">preview</string>
271-
<string name="pref_value_mode_last" translatable="false">last</string>
272270
<string name="pref_value_font_size_small" translatable="false">small</string>
273271
<string name="pref_value_font_size_medium" translatable="false">medium</string>
274272
<string name="pref_value_font_size_large" translatable="false">large</string>

app/src/main/res/xml/preferences.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
android:summary="@string/settings_show_ecosystem_apps_summary"/>
5252

5353
<ListPreference
54-
android:defaultValue="@string/pref_value_mode_last"
54+
android:defaultValue="@string/pref_value_mode_edit"
5555
android:entries="@array/noteMode_entries_new"
5656
android:entryValues="@array/noteMode_values"
5757
android:icon="@drawable/ic_remove_red_eye_grey_24dp"

0 commit comments

Comments
 (0)