From 6611c431fac1561d46171a4924dc21558253dce7 Mon Sep 17 00:00:00 2001 From: zHd4 <38856321+zHd4@users.noreply.github.com> Date: Thu, 25 Jun 2026 18:24:52 +0200 Subject: [PATCH 1/8] Rename menu field in OpenNoteActivity --- .../java/app/notesr/activity/note/OpenNoteActivity.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java b/app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java index 794d1c1d..f4bc8017 100644 --- a/app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java +++ b/app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java @@ -54,7 +54,7 @@ public final class OpenNoteActivity extends ActivityBase { private FileService fileService; private Note note; private ActionBar actionBar; - private Menu activityMenu; + private Menu menu; private DialogFactory dialogFactory; private boolean isNoteModified; private EditText nameField; @@ -150,7 +150,7 @@ private void prepareViews() { if (!isNoteModified) { isNoteModified = true; - MenuItem saveNoteButton = activityMenu.findItem(R.id.saveNoteButton); + MenuItem saveNoteButton = menu.findItem(R.id.saveNoteButton); saveNoteButton.setVisible(true); } @@ -169,7 +169,7 @@ private boolean isNewNote() { @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_open_note, menu); - this.activityMenu = menu; + this.menu = menu; MenuItem changeModeButton = menu.findItem(R.id.changeOpenModeButton); MenuItem saveNoteButton = menu.findItem(R.id.saveNoteButton); From 5f867b480236fd03be0f99639aaecb9e5e926853 Mon Sep 17 00:00:00 2001 From: zHd4 <38856321+zHd4@users.noreply.github.com> Date: Fri, 26 Jun 2026 11:33:32 +0200 Subject: [PATCH 2/8] Add warning dialog message string for unsaved note changes --- app/src/main/res/values/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 96635754..7b394efc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -109,4 +109,5 @@ Markdown View Change mode Invisible popup menu anchor + This note has unsaved changes. If you close it now, your changes will be lost. \ No newline at end of file From 56f944b66d0e28561669a87581de92310c607184 Mon Sep 17 00:00:00 2001 From: zHd4 <38856321+zHd4@users.noreply.github.com> Date: Fri, 26 Jun 2026 11:33:51 +0200 Subject: [PATCH 3/8] Add layout for unsaved note changes warning dialog --- .../layout/dialog_unsaved_note_changes.xml | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 app/src/main/res/layout/dialog_unsaved_note_changes.xml diff --git a/app/src/main/res/layout/dialog_unsaved_note_changes.xml b/app/src/main/res/layout/dialog_unsaved_note_changes.xml new file mode 100644 index 00000000..d54db275 --- /dev/null +++ b/app/src/main/res/layout/dialog_unsaved_note_changes.xml @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file From 55818c348db0f63381e9a0ce82456d09b7fa3b32 Mon Sep 17 00:00:00 2001 From: zHd4 <38856321+zHd4@users.noreply.github.com> Date: Fri, 26 Jun 2026 11:34:08 +0200 Subject: [PATCH 4/8] Add warning dialog for unsaved note changes on back navigation --- .../activity/note/OpenNoteActivity.java | 45 +++++++++++++++---- ...veNoteOnClick.java => SaveNoteAction.java} | 22 ++++----- 2 files changed, 46 insertions(+), 21 deletions(-) rename app/src/main/java/app/notesr/activity/note/{SaveNoteOnClick.java => SaveNoteAction.java} (74%) diff --git a/app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java b/app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java index f4bc8017..318a8d18 100644 --- a/app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java +++ b/app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java @@ -6,6 +6,7 @@ package app.notesr.activity.note; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.text.Editable; @@ -64,6 +65,7 @@ public final class OpenNoteActivity extends ActivityBase { private Markwon markwon; private static final String STATE_OPEN_MODE = "openMode"; private OpenNoteMode openMode = OpenNoteMode.EDIT; + private SaveNoteAction saveNoteAction; @Override protected void onCreate(Bundle savedInstanceState) { @@ -140,6 +142,9 @@ private void prepareViews() { markdownViewer = findViewById(R.id.markdownViewer); markdownViewerContainer = findViewById(R.id.markdownViewerContainer); + saveNoteAction = new SaveNoteAction(this, note, noteService, dialogFactory, + nameField, textField); + nameField.setImeOptions(IME_FLAG_NO_PERSONALIZED_LEARNING); textField.setImeOptions(IME_FLAG_NO_PERSONALIZED_LEARNING); @@ -181,8 +186,10 @@ public boolean onCreateOptionsMenu(Menu menu) { return true; }); - saveNoteButton.setOnMenuItemClickListener(new SaveNoteOnClick(this, note, - noteService, dialogFactory, nameField, textField)); + saveNoteButton.setOnMenuItemClickListener((item) -> { + saveNoteAction.execute(); + return true; + }); if (!isNewNote()) { openFilesListButton.setOnMenuItemClickListener( @@ -228,23 +235,45 @@ private void setAttachedFilesCountBadge(MenuItem openFilesListButton) { } + @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == android.R.id.home) { - if (isNoteModified) { - Intent intent = new Intent(getApplicationContext(), NotesListActivity.class); - startActivity(intent); - } else { - finish(); - } + backButtonOnClick(); return true; } return super.onOptionsItemSelected(item); } + private void backButtonOnClick() { + if (isNoteModified) { + if (!saveNoteAction.isFormCorrect()) { + finish(); + return; + } + + DialogInterface.OnClickListener buttonHandler = (dialog, result) -> { + if (result == DialogInterface.BUTTON_POSITIVE) { + saveNoteAction.execute(); + Intent intent = new Intent(getApplicationContext(), NotesListActivity.class); + startActivity(intent); + } + }; + + dialogFactory.getThemedAlertDialogBuilder(R.layout.dialog_unsaved_note_changes) + .setTitle(R.string.warning) + .setPositiveButton(R.string.save, buttonHandler) + .setNegativeButton(R.string.cancel, buttonHandler) + .create() + .show(); + } else { + finish(); + } + } + private void changeOpenModeButtonOnClick() { View anchor = findViewById(R.id.popupMenuAnchor); PopupMenu popup = new PopupMenu(this, anchor); diff --git a/app/src/main/java/app/notesr/activity/note/SaveNoteOnClick.java b/app/src/main/java/app/notesr/activity/note/SaveNoteAction.java similarity index 74% rename from app/src/main/java/app/notesr/activity/note/SaveNoteOnClick.java rename to app/src/main/java/app/notesr/activity/note/SaveNoteAction.java index 718ad2dd..347cfb7d 100644 --- a/app/src/main/java/app/notesr/activity/note/SaveNoteOnClick.java +++ b/app/src/main/java/app/notesr/activity/note/SaveNoteAction.java @@ -9,11 +9,8 @@ import android.app.Dialog; import android.content.Intent; -import android.view.MenuItem; import android.widget.EditText; -import androidx.annotation.NonNull; - import java.time.LocalDateTime; import app.notesr.R; @@ -24,7 +21,7 @@ import lombok.RequiredArgsConstructor; @RequiredArgsConstructor -public final class SaveNoteOnClick implements MenuItem.OnMenuItemClickListener { +final class SaveNoteAction { private final ActivityBase activity; private final Note note; @@ -33,14 +30,15 @@ public final class SaveNoteOnClick implements MenuItem.OnMenuItemClickListener { private final EditText nameField; private final EditText textField; - @Override - public boolean onMenuItemClick(@NonNull MenuItem item) { - String name = nameField.getText().toString(); - String text = textField.getText().toString(); + boolean isFormCorrect() { + return !nameField.getText().toString().isBlank() + && !textField.getText().toString().isBlank(); + } - if (!name.isBlank() && !text.isBlank()) { - note.setName(name); - note.setText(text); + void execute() { + if (isFormCorrect()) { + note.setName(nameField.getText().toString()); + note.setText(textField.getText().toString()); note.setUpdatedAt(LocalDateTime.now()); Dialog progressDialog = dialogFactory @@ -56,7 +54,5 @@ public boolean onMenuItemClick(@NonNull MenuItem item) { }); }); } - - return true; } } From 035f9018a98b1b59710e80807023c3b3c7b6c3e9 Mon Sep 17 00:00:00 2001 From: zHd4 <38856321+zHd4@users.noreply.github.com> Date: Fri, 26 Jun 2026 12:44:57 +0200 Subject: [PATCH 5/8] Refactor menu item click listeners to use action classes in OpenNoteActivity --- ...NoteOnClick.java => DeleteNoteAction.java} | 10 ++----- ...tOnClick.java => OpenFilesListAction.java} | 19 ++----------- .../activity/note/OpenNoteActivity.java | 27 +++++++++++++------ 3 files changed, 23 insertions(+), 33 deletions(-) rename app/src/main/java/app/notesr/activity/note/{DeleteNoteOnClick.java => DeleteNoteAction.java} (89%) rename app/src/main/java/app/notesr/activity/note/{OpenFilesListOnClick.java => OpenFilesListAction.java} (58%) diff --git a/app/src/main/java/app/notesr/activity/note/DeleteNoteOnClick.java b/app/src/main/java/app/notesr/activity/note/DeleteNoteAction.java similarity index 89% rename from app/src/main/java/app/notesr/activity/note/DeleteNoteOnClick.java rename to app/src/main/java/app/notesr/activity/note/DeleteNoteAction.java index 6903e238..37d8c541 100644 --- a/app/src/main/java/app/notesr/activity/note/DeleteNoteOnClick.java +++ b/app/src/main/java/app/notesr/activity/note/DeleteNoteAction.java @@ -10,9 +10,6 @@ import android.app.Dialog; import android.content.DialogInterface; import android.content.Intent; -import android.view.MenuItem; - -import androidx.annotation.NonNull; import java.io.IOException; @@ -25,7 +22,7 @@ import lombok.RequiredArgsConstructor; @RequiredArgsConstructor -public final class DeleteNoteOnClick implements MenuItem.OnMenuItemClickListener { +final class DeleteNoteAction { private final ActivityBase activity; private final Note note; @@ -33,8 +30,7 @@ public final class DeleteNoteOnClick implements MenuItem.OnMenuItemClickListener private final FileService fileService; private final DialogFactory dialogFactory; - @Override - public boolean onMenuItemClick(@NonNull MenuItem item) { + void execute() { DialogInterface.OnClickListener buttonHandler = deleteNoteDialogOnClick(); dialogFactory.getThemedAlertDialogBuilder(R.layout.dialog_action_cannot_be_undo) .setTitle(R.string.warning) @@ -42,8 +38,6 @@ public boolean onMenuItemClick(@NonNull MenuItem item) { .setNegativeButton(R.string.no, buttonHandler) .create() .show(); - - return true; } private DialogInterface.OnClickListener deleteNoteDialogOnClick() { diff --git a/app/src/main/java/app/notesr/activity/note/OpenFilesListOnClick.java b/app/src/main/java/app/notesr/activity/note/OpenFilesListAction.java similarity index 58% rename from app/src/main/java/app/notesr/activity/note/OpenFilesListOnClick.java rename to app/src/main/java/app/notesr/activity/note/OpenFilesListAction.java index 5583919c..e1d9c13d 100644 --- a/app/src/main/java/app/notesr/activity/note/OpenFilesListOnClick.java +++ b/app/src/main/java/app/notesr/activity/note/OpenFilesListAction.java @@ -6,10 +6,6 @@ package app.notesr.activity.note; import android.content.Intent; -import android.view.MenuItem; -import android.view.View; - -import androidx.annotation.NonNull; import app.notesr.activity.ActivityBase; import app.notesr.activity.file.FilesListActivity; @@ -17,23 +13,12 @@ import lombok.RequiredArgsConstructor; @RequiredArgsConstructor -public final class OpenFilesListOnClick implements MenuItem.OnMenuItemClickListener, View.OnClickListener { +final class OpenFilesListAction { private final ActivityBase activity; private final Note note; - @Override - public boolean onMenuItemClick(@NonNull MenuItem item) { - onClickAction(); - return true; - } - - @Override - public void onClick(View v) { - onClickAction(); - } - - private void onClickAction() { + void execute() { Intent intent = new Intent(activity.getApplicationContext(), FilesListActivity.class); intent.putExtra(FilesListActivity.EXTRA_NOTE_ID, note.getId()); diff --git a/app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java b/app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java index 318a8d18..93a96c42 100644 --- a/app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java +++ b/app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java @@ -49,6 +49,7 @@ public final class OpenNoteActivity extends ActivityBase { public static final String EXTRA_NOTE_ID = "noteId"; public static final String EXTRA_NOTE_MODIFIED = "modified"; + private static final String STATE_OPEN_MODE = "openMode"; private static final long MAX_COUNT_IN_BADGE = 9; private NoteService noteService; @@ -57,15 +58,17 @@ public final class OpenNoteActivity extends ActivityBase { private ActionBar actionBar; private Menu menu; private DialogFactory dialogFactory; - private boolean isNoteModified; private EditText nameField; private EditText textField; private TextView markdownViewer; private ScrollView markdownViewerContainer; private Markwon markwon; - private static final String STATE_OPEN_MODE = "openMode"; - private OpenNoteMode openMode = OpenNoteMode.EDIT; private SaveNoteAction saveNoteAction; + private OpenFilesListAction openFilesListAction; + private DeleteNoteAction deleteNoteAction; + private boolean isNoteModified; + private OpenNoteMode openMode = OpenNoteMode.EDIT; + @Override protected void onCreate(Bundle savedInstanceState) { @@ -144,6 +147,10 @@ private void prepareViews() { saveNoteAction = new SaveNoteAction(this, note, noteService, dialogFactory, nameField, textField); + openFilesListAction = new OpenFilesListAction(this, note); + deleteNoteAction = new DeleteNoteAction(this, note, noteService, fileService, + dialogFactory); + nameField.setImeOptions(IME_FLAG_NO_PERSONALIZED_LEARNING); textField.setImeOptions(IME_FLAG_NO_PERSONALIZED_LEARNING); @@ -192,11 +199,15 @@ public boolean onCreateOptionsMenu(Menu menu) { }); if (!isNewNote()) { - openFilesListButton.setOnMenuItemClickListener( - new OpenFilesListOnClick(this, note)); + openFilesListButton.setOnMenuItemClickListener(item -> { + openFilesListAction.execute(); + return true; + }); - deleteNoteButton.setOnMenuItemClickListener(new DeleteNoteOnClick(this, note, - noteService, fileService, dialogFactory)); + deleteNoteButton.setOnMenuItemClickListener(item -> { + deleteNoteAction.execute(); + return true; + }); setAttachedFilesCountBadge(openFilesListButton); } else { @@ -228,7 +239,7 @@ private void setAttachedFilesCountBadge(MenuItem openFilesListButton) { badge.setText(badgeText); badge.setVisibility(View.VISIBLE); - view.setOnClickListener(new OpenFilesListOnClick(this, note)); + view.setOnClickListener(v -> openFilesListAction.execute()); } }); }); From 1ed58a06863f702076913868fca1f63dbfc3124b Mon Sep 17 00:00:00 2001 From: zHd4 <38856321+zHd4@users.noreply.github.com> Date: Fri, 26 Jun 2026 12:48:14 +0200 Subject: [PATCH 6/8] Refactor package structure for note activities --- app/src/main/AndroidManifest.xml | 4 ++-- app/src/main/java/app/notesr/activity/MainActivity.java | 2 +- .../java/app/notesr/activity/exporter/ExportActivity.java | 2 +- .../main/java/app/notesr/activity/file/FilesListActivity.java | 2 +- .../java/app/notesr/activity/importer/ImportActivity.java | 2 +- .../java/app/notesr/activity/migration/MigrationActivity.java | 2 +- .../notesr/activity/note/{ => editor}/DeleteNoteAction.java | 3 ++- .../activity/note/{ => editor}/OpenFilesListAction.java | 2 +- .../notesr/activity/note/{ => editor}/OpenNoteActivity.java | 3 ++- .../app/notesr/activity/note/{ => editor}/OpenNoteMode.java | 2 +- .../app/notesr/activity/note/{ => editor}/SaveNoteAction.java | 3 ++- .../notesr/activity/note/{ => list}/NotesListActivity.java | 3 ++- .../app/notesr/activity/note/{ => list}/NotesListAdapter.java | 2 +- .../app/notesr/activity/note/{ => list}/OpenNoteOnClick.java | 3 ++- .../app/notesr/activity/security/AuthActivityExtension.java | 2 +- .../notesr/activity/security/KeySetupCompletionHandler.java | 2 +- .../app/notesr/activity/security/ReEncryptionActivity.java | 2 +- app/src/main/res/layout/activity_note_list.xml | 2 +- app/src/main/res/layout/activity_open_note.xml | 2 +- 19 files changed, 25 insertions(+), 20 deletions(-) rename app/src/main/java/app/notesr/activity/note/{ => editor}/DeleteNoteAction.java (95%) rename app/src/main/java/app/notesr/activity/note/{ => editor}/OpenFilesListAction.java (93%) rename app/src/main/java/app/notesr/activity/note/{ => editor}/OpenNoteActivity.java (99%) rename app/src/main/java/app/notesr/activity/note/{ => editor}/OpenNoteMode.java (92%) rename app/src/main/java/app/notesr/activity/note/{ => editor}/SaveNoteAction.java (94%) rename app/src/main/java/app/notesr/activity/note/{ => list}/NotesListActivity.java (98%) rename app/src/main/java/app/notesr/activity/note/{ => list}/NotesListAdapter.java (97%) rename app/src/main/java/app/notesr/activity/note/{ => list}/OpenNoteOnClick.java (89%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cc18a26c..da11c5e6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -56,12 +56,12 @@ android:screenOrientation="locked" android:theme="@style/AppTheme.NoActionBar" /> diff --git a/app/src/main/java/app/notesr/activity/MainActivity.java b/app/src/main/java/app/notesr/activity/MainActivity.java index 7167f049..0c191b39 100644 --- a/app/src/main/java/app/notesr/activity/MainActivity.java +++ b/app/src/main/java/app/notesr/activity/MainActivity.java @@ -19,7 +19,7 @@ import app.notesr.service.AndroidServiceRegistry; import app.notesr.service.lifecycle.AppCloseAndroidService; import app.notesr.service.lifecycle.AppCloseAndroidServiceStarter; -import app.notesr.activity.note.NotesListActivity; +import app.notesr.activity.note.list.NotesListActivity; import app.notesr.activity.security.AuthActivity; import app.notesr.activity.security.KeyRecoveryActivity; diff --git a/app/src/main/java/app/notesr/activity/exporter/ExportActivity.java b/app/src/main/java/app/notesr/activity/exporter/ExportActivity.java index 1882bca2..3d22921d 100644 --- a/app/src/main/java/app/notesr/activity/exporter/ExportActivity.java +++ b/app/src/main/java/app/notesr/activity/exporter/ExportActivity.java @@ -46,7 +46,7 @@ import app.notesr.service.exporter.ExportAndroidServiceStarter; import app.notesr.service.exporter.ExportStatus; import app.notesr.service.file.FileService; -import app.notesr.activity.note.NotesListActivity; +import app.notesr.activity.note.list.NotesListActivity; import app.notesr.service.note.NoteService; import app.notesr.util.VersionFetcherImpl; diff --git a/app/src/main/java/app/notesr/activity/file/FilesListActivity.java b/app/src/main/java/app/notesr/activity/file/FilesListActivity.java index 3f1e63c5..d22d021a 100644 --- a/app/src/main/java/app/notesr/activity/file/FilesListActivity.java +++ b/app/src/main/java/app/notesr/activity/file/FilesListActivity.java @@ -30,7 +30,7 @@ import app.notesr.activity.DialogFactory; import app.notesr.data.AppDatabase; import app.notesr.data.DatabaseProvider; -import app.notesr.activity.note.OpenNoteActivity; +import app.notesr.activity.note.editor.OpenNoteActivity; import app.notesr.service.file.FileService; import app.notesr.service.note.NoteService; import app.notesr.data.model.FileInfo; diff --git a/app/src/main/java/app/notesr/activity/importer/ImportActivity.java b/app/src/main/java/app/notesr/activity/importer/ImportActivity.java index 4e945e12..2af93957 100644 --- a/app/src/main/java/app/notesr/activity/importer/ImportActivity.java +++ b/app/src/main/java/app/notesr/activity/importer/ImportActivity.java @@ -28,7 +28,7 @@ import app.notesr.R; import app.notesr.activity.ActivityBase; -import app.notesr.activity.note.NotesListActivity; +import app.notesr.activity.note.list.NotesListActivity; import app.notesr.service.AndroidServiceRegistry; import app.notesr.service.importer.ImportAndroidService; import app.notesr.service.importer.ImportAndroidServiceStarter; diff --git a/app/src/main/java/app/notesr/activity/migration/MigrationActivity.java b/app/src/main/java/app/notesr/activity/migration/MigrationActivity.java index 12340d47..061ec9c5 100644 --- a/app/src/main/java/app/notesr/activity/migration/MigrationActivity.java +++ b/app/src/main/java/app/notesr/activity/migration/MigrationActivity.java @@ -14,7 +14,7 @@ import app.notesr.BuildConfig; import app.notesr.R; import app.notesr.activity.ActivityBase; -import app.notesr.activity.note.NotesListActivity; +import app.notesr.activity.note.list.NotesListActivity; import app.notesr.service.AndroidServiceRegistry; import app.notesr.service.migration.AppMigrationAndroidService; import app.notesr.service.migration.AppMigrationAndroidServiceStarter; diff --git a/app/src/main/java/app/notesr/activity/note/DeleteNoteAction.java b/app/src/main/java/app/notesr/activity/note/editor/DeleteNoteAction.java similarity index 95% rename from app/src/main/java/app/notesr/activity/note/DeleteNoteAction.java rename to app/src/main/java/app/notesr/activity/note/editor/DeleteNoteAction.java index 37d8c541..f02e6332 100644 --- a/app/src/main/java/app/notesr/activity/note/DeleteNoteAction.java +++ b/app/src/main/java/app/notesr/activity/note/editor/DeleteNoteAction.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: MIT */ -package app.notesr.activity.note; +package app.notesr.activity.note.editor; import static java.util.concurrent.Executors.newSingleThreadExecutor; @@ -16,6 +16,7 @@ import app.notesr.R; import app.notesr.activity.ActivityBase; import app.notesr.activity.DialogFactory; +import app.notesr.activity.note.list.NotesListActivity; import app.notesr.data.model.Note; import app.notesr.service.file.FileService; import app.notesr.service.note.NoteService; diff --git a/app/src/main/java/app/notesr/activity/note/OpenFilesListAction.java b/app/src/main/java/app/notesr/activity/note/editor/OpenFilesListAction.java similarity index 93% rename from app/src/main/java/app/notesr/activity/note/OpenFilesListAction.java rename to app/src/main/java/app/notesr/activity/note/editor/OpenFilesListAction.java index e1d9c13d..afe88b4e 100644 --- a/app/src/main/java/app/notesr/activity/note/OpenFilesListAction.java +++ b/app/src/main/java/app/notesr/activity/note/editor/OpenFilesListAction.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: MIT */ -package app.notesr.activity.note; +package app.notesr.activity.note.editor; import android.content.Intent; diff --git a/app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java b/app/src/main/java/app/notesr/activity/note/editor/OpenNoteActivity.java similarity index 99% rename from app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java rename to app/src/main/java/app/notesr/activity/note/editor/OpenNoteActivity.java index 93a96c42..d15c7eca 100644 --- a/app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java +++ b/app/src/main/java/app/notesr/activity/note/editor/OpenNoteActivity.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: MIT */ -package app.notesr.activity.note; +package app.notesr.activity.note.editor; import android.content.Context; import android.content.DialogInterface; @@ -26,6 +26,7 @@ import app.notesr.R; import app.notesr.activity.ActivityBase; import app.notesr.activity.DialogFactory; +import app.notesr.activity.note.list.NotesListActivity; import app.notesr.data.AppDatabase; import app.notesr.data.DatabaseProvider; import app.notesr.service.file.FileService; diff --git a/app/src/main/java/app/notesr/activity/note/OpenNoteMode.java b/app/src/main/java/app/notesr/activity/note/editor/OpenNoteMode.java similarity index 92% rename from app/src/main/java/app/notesr/activity/note/OpenNoteMode.java rename to app/src/main/java/app/notesr/activity/note/editor/OpenNoteMode.java index 285bede2..ddf264e1 100644 --- a/app/src/main/java/app/notesr/activity/note/OpenNoteMode.java +++ b/app/src/main/java/app/notesr/activity/note/editor/OpenNoteMode.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: MIT */ -package app.notesr.activity.note; +package app.notesr.activity.note.editor; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/app/src/main/java/app/notesr/activity/note/SaveNoteAction.java b/app/src/main/java/app/notesr/activity/note/editor/SaveNoteAction.java similarity index 94% rename from app/src/main/java/app/notesr/activity/note/SaveNoteAction.java rename to app/src/main/java/app/notesr/activity/note/editor/SaveNoteAction.java index 347cfb7d..1b0f183a 100644 --- a/app/src/main/java/app/notesr/activity/note/SaveNoteAction.java +++ b/app/src/main/java/app/notesr/activity/note/editor/SaveNoteAction.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: MIT */ -package app.notesr.activity.note; +package app.notesr.activity.note.editor; import static java.util.concurrent.Executors.newSingleThreadExecutor; @@ -16,6 +16,7 @@ import app.notesr.R; import app.notesr.activity.ActivityBase; import app.notesr.activity.DialogFactory; +import app.notesr.activity.note.list.NotesListActivity; import app.notesr.data.model.Note; import app.notesr.service.note.NoteService; import lombok.RequiredArgsConstructor; diff --git a/app/src/main/java/app/notesr/activity/note/NotesListActivity.java b/app/src/main/java/app/notesr/activity/note/list/NotesListActivity.java similarity index 98% rename from app/src/main/java/app/notesr/activity/note/NotesListActivity.java rename to app/src/main/java/app/notesr/activity/note/list/NotesListActivity.java index a150d1d4..76c2f564 100644 --- a/app/src/main/java/app/notesr/activity/note/NotesListActivity.java +++ b/app/src/main/java/app/notesr/activity/note/list/NotesListActivity.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: MIT */ -package app.notesr.activity.note; +package app.notesr.activity.note.list; import static java.util.Objects.requireNonNull; import static java.util.concurrent.Executors.newSingleThreadExecutor; @@ -31,6 +31,7 @@ import app.notesr.activity.DialogFactory; import app.notesr.activity.exporter.ExportActivity; import app.notesr.activity.importer.ImportActivity; +import app.notesr.activity.note.editor.OpenNoteActivity; import app.notesr.activity.security.ChangePasswordOnClick; import app.notesr.activity.security.GenerateNewKeyOnClick; import app.notesr.activity.security.LockOnClick; diff --git a/app/src/main/java/app/notesr/activity/note/NotesListAdapter.java b/app/src/main/java/app/notesr/activity/note/list/NotesListAdapter.java similarity index 97% rename from app/src/main/java/app/notesr/activity/note/NotesListAdapter.java rename to app/src/main/java/app/notesr/activity/note/list/NotesListAdapter.java index 8e2e63b3..927a13cf 100644 --- a/app/src/main/java/app/notesr/activity/note/NotesListAdapter.java +++ b/app/src/main/java/app/notesr/activity/note/list/NotesListAdapter.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: MIT */ -package app.notesr.activity.note; +package app.notesr.activity.note.list; import android.content.Context; import android.view.LayoutInflater; diff --git a/app/src/main/java/app/notesr/activity/note/OpenNoteOnClick.java b/app/src/main/java/app/notesr/activity/note/list/OpenNoteOnClick.java similarity index 89% rename from app/src/main/java/app/notesr/activity/note/OpenNoteOnClick.java rename to app/src/main/java/app/notesr/activity/note/list/OpenNoteOnClick.java index d0edafab..4557e8e7 100644 --- a/app/src/main/java/app/notesr/activity/note/OpenNoteOnClick.java +++ b/app/src/main/java/app/notesr/activity/note/list/OpenNoteOnClick.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: MIT */ -package app.notesr.activity.note; +package app.notesr.activity.note.list; import android.content.Context; import android.content.Intent; @@ -12,6 +12,7 @@ import java.util.Map; +import app.notesr.activity.note.editor.OpenNoteActivity; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor diff --git a/app/src/main/java/app/notesr/activity/security/AuthActivityExtension.java b/app/src/main/java/app/notesr/activity/security/AuthActivityExtension.java index 5bcf0f6d..c1ddc9e3 100644 --- a/app/src/main/java/app/notesr/activity/security/AuthActivityExtension.java +++ b/app/src/main/java/app/notesr/activity/security/AuthActivityExtension.java @@ -26,7 +26,7 @@ import app.notesr.core.security.crypto.CryptoManager; import app.notesr.activity.migration.MigrationActivity; import app.notesr.core.security.dto.CryptoSecrets; -import app.notesr.activity.note.NotesListActivity; +import app.notesr.activity.note.list.NotesListActivity; import app.notesr.core.util.SecureStringBuilder; import app.notesr.service.AndroidServiceBootstrapper; import app.notesr.service.AndroidServiceRegistry; diff --git a/app/src/main/java/app/notesr/activity/security/KeySetupCompletionHandler.java b/app/src/main/java/app/notesr/activity/security/KeySetupCompletionHandler.java index 9ed20a37..194960ff 100644 --- a/app/src/main/java/app/notesr/activity/security/KeySetupCompletionHandler.java +++ b/app/src/main/java/app/notesr/activity/security/KeySetupCompletionHandler.java @@ -17,7 +17,7 @@ import app.notesr.BuildConfig; import app.notesr.activity.migration.MigrationActivity; -import app.notesr.activity.note.NotesListActivity; +import app.notesr.activity.note.list.NotesListActivity; import app.notesr.core.security.SecretCache; import app.notesr.core.security.dto.CryptoSecrets; import app.notesr.service.security.crypto.setup.SecretsSetupService; diff --git a/app/src/main/java/app/notesr/activity/security/ReEncryptionActivity.java b/app/src/main/java/app/notesr/activity/security/ReEncryptionActivity.java index af067bfd..3b72e397 100644 --- a/app/src/main/java/app/notesr/activity/security/ReEncryptionActivity.java +++ b/app/src/main/java/app/notesr/activity/security/ReEncryptionActivity.java @@ -18,7 +18,7 @@ import app.notesr.R; import app.notesr.activity.ActivityBase; import app.notesr.activity.DialogFactory; -import app.notesr.activity.note.NotesListActivity; +import app.notesr.activity.note.list.NotesListActivity; import app.notesr.service.AndroidServiceRegistry; import app.notesr.service.security.crypto.update.SecretsUpdateAndroidService; import app.notesr.service.security.crypto.update.SecretsUpdateAndroidServiceStarter; diff --git a/app/src/main/res/layout/activity_note_list.xml b/app/src/main/res/layout/activity_note_list.xml index 4dc189ca..f2c6e5e8 100644 --- a/app/src/main/res/layout/activity_note_list.xml +++ b/app/src/main/res/layout/activity_note_list.xml @@ -6,7 +6,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/activity_background" - tools:context=".activity.note.NotesListActivity"> + tools:context=".activity.note.list.NotesListActivity"> + tools:context=".activity.note.editor.OpenNoteActivity"> Date: Fri, 26 Jun 2026 12:57:01 +0200 Subject: [PATCH 7/8] Add "Don't save" string for unsaved note changes warning dialog --- app/src/main/res/values/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7b394efc..da303f2d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -79,6 +79,7 @@ Are you sure? File already exists.\nOverwrite? Save + Don\'t save Overwrite Saving canceled Failed to add all files at once From 04425340a0be315b8412c8f1f9606af083366f4f Mon Sep 17 00:00:00 2001 From: zHd4 <38856321+zHd4@users.noreply.github.com> Date: Fri, 26 Jun 2026 12:57:19 +0200 Subject: [PATCH 8/8] Update unsaved note changes warning dialog to include "Don't save" option --- .../app/notesr/activity/note/editor/OpenNoteActivity.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/app/notesr/activity/note/editor/OpenNoteActivity.java b/app/src/main/java/app/notesr/activity/note/editor/OpenNoteActivity.java index d15c7eca..9ef13d40 100644 --- a/app/src/main/java/app/notesr/activity/note/editor/OpenNoteActivity.java +++ b/app/src/main/java/app/notesr/activity/note/editor/OpenNoteActivity.java @@ -272,13 +272,16 @@ private void backButtonOnClick() { saveNoteAction.execute(); Intent intent = new Intent(getApplicationContext(), NotesListActivity.class); startActivity(intent); + } else if (result == DialogInterface.BUTTON_NEUTRAL) { + finish(); } }; dialogFactory.getThemedAlertDialogBuilder(R.layout.dialog_unsaved_note_changes) .setTitle(R.string.warning) .setPositiveButton(R.string.save, buttonHandler) - .setNegativeButton(R.string.cancel, buttonHandler) + .setNeutralButton(R.string.dont_save, buttonHandler) + .setNegativeButton(R.string.cancel, null) .create() .show(); } else {