From b55d05919fc98e7aa69a39dbfb1b96f29e043bb1 Mon Sep 17 00:00:00 2001 From: zHd4 <38856321+zHd4@users.noreply.github.com> Date: Mon, 22 Jun 2026 12:05:50 +0200 Subject: [PATCH 01/15] Add Markwon dependency for markdown support --- app/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/app/build.gradle b/app/build.gradle index c87df9d6..5fbbaa46 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -119,6 +119,7 @@ dependencies { implementation "androidx.media3:media3-ui:1.1.0" annotationProcessor 'androidx.room:room-compiler:2.6.1' implementation 'net.zetetic:android-database-sqlcipher:4.5.4' + implementation 'io.noties.markwon:core:4.6.2' testImplementation 'junit:junit:4.13.2' testImplementation 'org.junit.jupiter:junit-jupiter:5.11.4' testImplementation 'org.junit.jupiter:junit-jupiter-params:5.11.4' From 9894dccb335a3c1e6239bc0995dea890bc48eece Mon Sep 17 00:00:00 2001 From: zHd4 <38856321+zHd4@users.noreply.github.com> Date: Mon, 22 Jun 2026 15:58:02 +0200 Subject: [PATCH 02/15] Add vector drawable for visibility icon --- app/src/main/res/drawable/ic_visibility.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 app/src/main/res/drawable/ic_visibility.xml diff --git a/app/src/main/res/drawable/ic_visibility.xml b/app/src/main/res/drawable/ic_visibility.xml new file mode 100644 index 00000000..2b9c462b --- /dev/null +++ b/app/src/main/res/drawable/ic_visibility.xml @@ -0,0 +1,11 @@ + + + + + From 3191da51ed8164fd0f08b95e41d8517af7ecbba1 Mon Sep 17 00:00:00 2001 From: zHd4 <38856321+zHd4@users.noreply.github.com> Date: Mon, 22 Jun 2026 15:58:35 +0200 Subject: [PATCH 03/15] Add markdown support and view mode options in OpenNoteActivity --- .../activity/note/OpenNoteActivity.java | 155 +++++++++++++++--- .../main/res/layout/activity_open_note.xml | 35 ++++ app/src/main/res/menu/menu_note_view_mode.xml | 16 ++ app/src/main/res/menu/menu_open_note.xml | 13 +- app/src/main/res/values/strings.xml | 5 +- 5 files changed, 196 insertions(+), 28 deletions(-) create mode 100644 app/src/main/res/menu/menu_note_view_mode.xml 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 e01eec08..f340386e 100644 --- a/app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java +++ b/app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java @@ -15,8 +15,11 @@ import android.view.MenuItem; import android.view.View; import android.widget.EditText; +import android.widget.PopupMenu; +import android.widget.ScrollView; import android.widget.TextView; +import androidx.annotation.NonNull; import androidx.appcompat.app.ActionBar; import androidx.core.widget.TextViewKt; @@ -34,15 +37,13 @@ import app.notesr.core.security.crypto.CryptoManagerProvider; import app.notesr.core.security.dto.CryptoSecrets; import app.notesr.core.util.FilesUtils; +import io.noties.markwon.Markwon; import kotlin.Unit; import kotlin.jvm.functions.Function1; import java.io.IOException; import java.time.LocalDateTime; -import java.util.HashMap; -import java.util.Map; import java.util.Objects; -import java.util.function.Consumer; import static androidx.core.view.inputmethod.EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING; import static java.util.concurrent.Executors.newSingleThreadExecutor; @@ -52,7 +53,6 @@ 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 long MAX_COUNT_IN_BADGE = 9; - private final Map> menuItemsMap = new HashMap<>(); private NoteService noteService; private FileService fileService; @@ -60,11 +60,27 @@ public final class OpenNoteActivity extends ActivityBase { private Menu activityMenu; private DialogFactory dialogFactory; private boolean isNoteModified; + private EditText nameField; + private EditText textField; + private TextView viewer; + private ScrollView viewerContainer; + private Markwon markwon; + private static final int MODE_EDIT = 0; + private static final int MODE_TEXT = 1; + private static final int MODE_MARKDOWN = 2; + private static final String STATE_VIEW_MODE = "viewMode"; + private int viewMode = MODE_EDIT; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + if (savedInstanceState != null) { + viewMode = savedInstanceState.getInt(STATE_VIEW_MODE, MODE_EDIT); + } else { + viewMode = MODE_EDIT; + } + if (isFinishing()) { return; } @@ -81,6 +97,7 @@ protected void onCreate(Bundle savedInstanceState) { noteService = new NoteService(db); fileService = new FileService(context, db, cryptor, new FilesUtils()); dialogFactory = new DialogFactory(this); + markwon = Markwon.create(this); String noteId = getIntent().getStringExtra(EXTRA_NOTE_ID); @@ -90,7 +107,20 @@ protected void onCreate(Bundle savedInstanceState) { runOnUiThread(() -> { initializeActionBar(); - prepareEditorFields(); + prepareViews(); + + switch (viewMode) { + case MODE_TEXT: + switchToViewTextMode(); + break; + case MODE_MARKDOWN: + switchToViewMarkdownMode(); + break; + case MODE_EDIT: + default: + switchToEditMode(); + break; + } }); }); } @@ -102,7 +132,7 @@ private void initializeActionBar() { actionBar.setDisplayHomeAsUpEnabled(true); if (note != null) { - actionBar.setTitle(getResources().getString(R.string.edit_note)); + actionBar.setTitle(getResources().getString(R.string.edit)); } else { actionBar.setTitle(getResources().getString(R.string.new_note)); } @@ -111,9 +141,11 @@ private void initializeActionBar() { } } - private void prepareEditorFields() { - EditText nameField = findViewById(R.id.noteNameField); - EditText textField = findViewById(R.id.noteTextField); + private void prepareViews() { + nameField = findViewById(R.id.noteNameField); + textField = findViewById(R.id.noteTextField); + viewer = findViewById(R.id.viewer); + viewerContainer = findViewById(R.id.viewerContainer); nameField.setImeOptions(IME_FLAG_NO_PERSONALIZED_LEARNING); textField.setImeOptions(IME_FLAG_NO_PERSONALIZED_LEARNING); @@ -140,25 +172,34 @@ private void prepareEditorFields() { @Override public boolean onCreateOptionsMenu(Menu menu) { - EditText nameField = findViewById(R.id.noteNameField); - EditText textField = findViewById(R.id.noteTextField); - getMenuInflater().inflate(R.menu.menu_open_note, menu); this.activityMenu = menu; + MenuItem changeModeButton = menu.findItem(R.id.changeViewModeButton); MenuItem saveNoteButton = menu.findItem(R.id.saveNoteButton); MenuItem openFilesListButton = menu.findItem(R.id.openFilesListButton); MenuItem deleteNoteButton = menu.findItem(R.id.deleteNoteButton); - menuItemsMap.put(saveNoteButton.getItemId(), - action -> saveNoteOnClick(nameField, textField)); + changeModeButton.setOnMenuItemClickListener(item -> { + changeViewModeButtonOnClick(); + return true; + }); + + saveNoteButton.setOnMenuItemClickListener(item -> { + saveNoteOnClick(nameField, textField); + return true; + }); if (note != null) { - menuItemsMap.put(openFilesListButton.getItemId(), - action -> openFilesListOnClick()); + openFilesListButton.setOnMenuItemClickListener(item -> { + openFilesListOnClick(); + return true; + }); - menuItemsMap.put(deleteNoteButton.getItemId(), - action -> deleteNoteOnClick()); + deleteNoteButton.setOnMenuItemClickListener(item -> { + deleteNoteOnClick(); + return true; + }); setAttachedFilesCountBadge(openFilesListButton); } else { @@ -212,12 +253,6 @@ public boolean onOptionsItemSelected(MenuItem item) { return true; } - Consumer action = menuItemsMap.get(id); - - if (action != null) { - action.accept(null); - } - return super.onOptionsItemSelected(item); } @@ -290,6 +325,78 @@ private DialogInterface.OnClickListener deleteNoteDialogOnClick() { }; } + private void changeViewModeButtonOnClick() { + View anchor = findViewById(R.id.changeViewModeButton); + PopupMenu popup = new PopupMenu(this, anchor); + popup.inflate(R.menu.menu_note_view_mode); + + Menu popupMenu = popup.getMenu(); + + if (viewMode == MODE_EDIT) { + popupMenu.findItem(R.id.editMenuItem).setChecked(true); + } else if (viewMode == MODE_TEXT) { + popupMenu.findItem(R.id.viewTextMenuItem).setChecked(true); + } else if (viewMode == MODE_MARKDOWN) { + popupMenu.findItem(R.id.viewMarkdownMenuItem).setChecked(true); + } + + popup.setOnMenuItemClickListener(item -> { + int id = item.getItemId(); + + if (id == R.id.editMenuItem) { + item.setChecked(true); + viewMode = MODE_EDIT; + switchToEditMode(); + return true; + } else if (id == R.id.viewTextMenuItem) { + item.setChecked(true); + viewMode = MODE_TEXT; + switchToViewTextMode(); + return true; + } else if (id == R.id.viewMarkdownMenuItem) { + item.setChecked(true); + viewMode = MODE_MARKDOWN; + switchToViewMarkdownMode(); + return true; + } + + return false; + }); + + nameField.post(popup::show); + } + + private void switchToEditMode() { + viewMode = MODE_EDIT; + nameField.setEnabled(false); + textField.setVisibility(View.VISIBLE); + viewerContainer.setVisibility(View.GONE); + } + + private void switchToViewTextMode() { + viewMode = MODE_TEXT; + nameField.setEnabled(true); + textField.setVisibility(View.GONE); + + viewer.setText(textField.getText().toString()); + viewerContainer.setVisibility(View.VISIBLE); + } + + private void switchToViewMarkdownMode() { + viewMode = MODE_MARKDOWN; + nameField.setEnabled(true); + textField.setVisibility(View.GONE); + + markwon.setMarkdown(viewer, textField.getText().toString()); + viewerContainer.setVisibility(View.VISIBLE); + } + + @Override + protected void onSaveInstanceState(@NonNull Bundle outState) { + super.onSaveInstanceState(outState); + outState.putInt(STATE_VIEW_MODE, viewMode); + } + private void disableMenuItem(MenuItem item) { item.setEnabled(false); item.setVisible(false); diff --git a/app/src/main/res/layout/activity_open_note.xml b/app/src/main/res/layout/activity_open_note.xml index a4635b74..f0bdd7f9 100644 --- a/app/src/main/res/layout/activity_open_note.xml +++ b/app/src/main/res/layout/activity_open_note.xml @@ -44,6 +44,7 @@ android:hint="@string/start_typing" android:inputType="textMultiLine|textCapSentences" android:scrollbars="vertical" + android:textSize="18sp" android:textColor="@color/text_color" android:textColorHighlight="@color/select_text" android:textColorHint="#8F8F8F" @@ -61,4 +62,38 @@ app:layout_constraintTop_toBottomOf="@+id/noteNameField" app:layout_constraintVertical_bias="0.0" /> + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_note_view_mode.xml b/app/src/main/res/menu/menu_note_view_mode.xml new file mode 100644 index 00000000..1e49444c --- /dev/null +++ b/app/src/main/res/menu/menu_note_view_mode.xml @@ -0,0 +1,16 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_open_note.xml b/app/src/main/res/menu/menu_open_note.xml index f1982bb9..689e2961 100644 --- a/app/src/main/res/menu/menu_open_note.xml +++ b/app/src/main/res/menu/menu_open_note.xml @@ -4,7 +4,7 @@ @@ -12,15 +12,22 @@ + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2650c345..447e80e3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -32,7 +32,7 @@ Name Start typing… New - Edit + Edit This action cannot be undone.\nAre you sure? YES NO @@ -104,4 +104,7 @@ (%1$s) Files of: %2$s Error Re-encryption failed, your key and your data remains unchanged. + View Text + View Markdown + Change view mode \ No newline at end of file From 2e181ddff007378861efabbd50a575d17bf1482c Mon Sep 17 00:00:00 2001 From: zHd4 <38856321+zHd4@users.noreply.github.com> Date: Mon, 22 Jun 2026 16:15:09 +0200 Subject: [PATCH 04/15] Rename view mode to open mode in OpenNoteActivity --- .../activity/note/OpenNoteActivity.java | 40 +++++++++---------- ..._mode.xml => menu_open_node_open_mode.xml} | 0 app/src/main/res/menu/menu_open_note.xml | 4 +- app/src/main/res/values/strings.xml | 2 +- 4 files changed, 23 insertions(+), 23 deletions(-) rename app/src/main/res/menu/{menu_note_view_mode.xml => menu_open_node_open_mode.xml} (100%) 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 f340386e..ecedb34b 100644 --- a/app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java +++ b/app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java @@ -68,17 +68,17 @@ public final class OpenNoteActivity extends ActivityBase { private static final int MODE_EDIT = 0; private static final int MODE_TEXT = 1; private static final int MODE_MARKDOWN = 2; - private static final String STATE_VIEW_MODE = "viewMode"; - private int viewMode = MODE_EDIT; + private static final String STATE_OPEN_MODE = "openMode"; + private int openMode = MODE_EDIT; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState != null) { - viewMode = savedInstanceState.getInt(STATE_VIEW_MODE, MODE_EDIT); + openMode = savedInstanceState.getInt(STATE_OPEN_MODE, MODE_EDIT); } else { - viewMode = MODE_EDIT; + openMode = MODE_EDIT; } if (isFinishing()) { @@ -109,7 +109,7 @@ protected void onCreate(Bundle savedInstanceState) { initializeActionBar(); prepareViews(); - switch (viewMode) { + switch (openMode) { case MODE_TEXT: switchToViewTextMode(); break; @@ -175,13 +175,13 @@ public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_open_note, menu); this.activityMenu = menu; - MenuItem changeModeButton = menu.findItem(R.id.changeViewModeButton); + MenuItem changeModeButton = menu.findItem(R.id.changeOpenModeButton); MenuItem saveNoteButton = menu.findItem(R.id.saveNoteButton); MenuItem openFilesListButton = menu.findItem(R.id.openFilesListButton); MenuItem deleteNoteButton = menu.findItem(R.id.deleteNoteButton); changeModeButton.setOnMenuItemClickListener(item -> { - changeViewModeButtonOnClick(); + changeOpenModeButtonOnClick(); return true; }); @@ -325,18 +325,18 @@ private DialogInterface.OnClickListener deleteNoteDialogOnClick() { }; } - private void changeViewModeButtonOnClick() { - View anchor = findViewById(R.id.changeViewModeButton); + private void changeOpenModeButtonOnClick() { + View anchor = findViewById(R.id.changeOpenModeButton); PopupMenu popup = new PopupMenu(this, anchor); - popup.inflate(R.menu.menu_note_view_mode); + popup.inflate(R.menu.menu_open_node_open_mode); Menu popupMenu = popup.getMenu(); - if (viewMode == MODE_EDIT) { + if (openMode == MODE_EDIT) { popupMenu.findItem(R.id.editMenuItem).setChecked(true); - } else if (viewMode == MODE_TEXT) { + } else if (openMode == MODE_TEXT) { popupMenu.findItem(R.id.viewTextMenuItem).setChecked(true); - } else if (viewMode == MODE_MARKDOWN) { + } else if (openMode == MODE_MARKDOWN) { popupMenu.findItem(R.id.viewMarkdownMenuItem).setChecked(true); } @@ -345,17 +345,17 @@ private void changeViewModeButtonOnClick() { if (id == R.id.editMenuItem) { item.setChecked(true); - viewMode = MODE_EDIT; + openMode = MODE_EDIT; switchToEditMode(); return true; } else if (id == R.id.viewTextMenuItem) { item.setChecked(true); - viewMode = MODE_TEXT; + openMode = MODE_TEXT; switchToViewTextMode(); return true; } else if (id == R.id.viewMarkdownMenuItem) { item.setChecked(true); - viewMode = MODE_MARKDOWN; + openMode = MODE_MARKDOWN; switchToViewMarkdownMode(); return true; } @@ -367,14 +367,14 @@ private void changeViewModeButtonOnClick() { } private void switchToEditMode() { - viewMode = MODE_EDIT; + openMode = MODE_EDIT; nameField.setEnabled(false); textField.setVisibility(View.VISIBLE); viewerContainer.setVisibility(View.GONE); } private void switchToViewTextMode() { - viewMode = MODE_TEXT; + openMode = MODE_TEXT; nameField.setEnabled(true); textField.setVisibility(View.GONE); @@ -383,7 +383,7 @@ private void switchToViewTextMode() { } private void switchToViewMarkdownMode() { - viewMode = MODE_MARKDOWN; + openMode = MODE_MARKDOWN; nameField.setEnabled(true); textField.setVisibility(View.GONE); @@ -394,7 +394,7 @@ private void switchToViewMarkdownMode() { @Override protected void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); - outState.putInt(STATE_VIEW_MODE, viewMode); + outState.putInt(STATE_OPEN_MODE, openMode); } private void disableMenuItem(MenuItem item) { diff --git a/app/src/main/res/menu/menu_note_view_mode.xml b/app/src/main/res/menu/menu_open_node_open_mode.xml similarity index 100% rename from app/src/main/res/menu/menu_note_view_mode.xml rename to app/src/main/res/menu/menu_open_node_open_mode.xml diff --git a/app/src/main/res/menu/menu_open_note.xml b/app/src/main/res/menu/menu_open_note.xml index 689e2961..7b3a81a0 100644 --- a/app/src/main/res/menu/menu_open_note.xml +++ b/app/src/main/res/menu/menu_open_note.xml @@ -25,9 +25,9 @@ app:showAsAction="always" /> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 447e80e3..5e32b4d2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -106,5 +106,5 @@ Re-encryption failed, your key and your data remains unchanged. View Text View Markdown - Change view mode + Change open mode \ No newline at end of file From 55546fe3b30dfdafcf8ae2a5984f1a2157250239 Mon Sep 17 00:00:00 2001 From: zHd4 <38856321+zHd4@users.noreply.github.com> Date: Mon, 22 Jun 2026 16:19:35 +0200 Subject: [PATCH 05/15] Remove view text mode from OpenNoteActivity --- .../activity/note/OpenNoteActivity.java | 30 ++++--------------- .../res/menu/menu_open_node_open_mode.xml | 4 --- 2 files changed, 5 insertions(+), 29 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 ecedb34b..c935b799 100644 --- a/app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java +++ b/app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java @@ -66,8 +66,7 @@ public final class OpenNoteActivity extends ActivityBase { private ScrollView viewerContainer; private Markwon markwon; private static final int MODE_EDIT = 0; - private static final int MODE_TEXT = 1; - private static final int MODE_MARKDOWN = 2; + private static final int MODE_MARKDOWN_VIEW = 1; private static final String STATE_OPEN_MODE = "openMode"; private int openMode = MODE_EDIT; @@ -110,10 +109,7 @@ protected void onCreate(Bundle savedInstanceState) { prepareViews(); switch (openMode) { - case MODE_TEXT: - switchToViewTextMode(); - break; - case MODE_MARKDOWN: + case MODE_MARKDOWN_VIEW: switchToViewMarkdownMode(); break; case MODE_EDIT: @@ -334,9 +330,7 @@ private void changeOpenModeButtonOnClick() { if (openMode == MODE_EDIT) { popupMenu.findItem(R.id.editMenuItem).setChecked(true); - } else if (openMode == MODE_TEXT) { - popupMenu.findItem(R.id.viewTextMenuItem).setChecked(true); - } else if (openMode == MODE_MARKDOWN) { + } else if (openMode == MODE_MARKDOWN_VIEW) { popupMenu.findItem(R.id.viewMarkdownMenuItem).setChecked(true); } @@ -348,14 +342,9 @@ private void changeOpenModeButtonOnClick() { openMode = MODE_EDIT; switchToEditMode(); return true; - } else if (id == R.id.viewTextMenuItem) { - item.setChecked(true); - openMode = MODE_TEXT; - switchToViewTextMode(); - return true; } else if (id == R.id.viewMarkdownMenuItem) { item.setChecked(true); - openMode = MODE_MARKDOWN; + openMode = MODE_MARKDOWN_VIEW; switchToViewMarkdownMode(); return true; } @@ -373,17 +362,8 @@ private void switchToEditMode() { viewerContainer.setVisibility(View.GONE); } - private void switchToViewTextMode() { - openMode = MODE_TEXT; - nameField.setEnabled(true); - textField.setVisibility(View.GONE); - - viewer.setText(textField.getText().toString()); - viewerContainer.setVisibility(View.VISIBLE); - } - private void switchToViewMarkdownMode() { - openMode = MODE_MARKDOWN; + openMode = MODE_MARKDOWN_VIEW; nameField.setEnabled(true); textField.setVisibility(View.GONE); diff --git a/app/src/main/res/menu/menu_open_node_open_mode.xml b/app/src/main/res/menu/menu_open_node_open_mode.xml index 1e49444c..6e54983a 100644 --- a/app/src/main/res/menu/menu_open_node_open_mode.xml +++ b/app/src/main/res/menu/menu_open_node_open_mode.xml @@ -5,10 +5,6 @@ android:title="@string/edit" android:checkable="true" /> - - From 3703d731fb76963fd0340fc3f75cc18140633e75 Mon Sep 17 00:00:00 2001 From: zHd4 <38856321+zHd4@users.noreply.github.com> Date: Mon, 22 Jun 2026 16:21:31 +0200 Subject: [PATCH 06/15] Update markdown view string in strings.xml --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5e32b4d2..4e95a3df 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -105,6 +105,6 @@ Error Re-encryption failed, your key and your data remains unchanged. View Text - View Markdown + Markdown View Change open mode \ No newline at end of file From 1e54ff40a1630581fb2d34b31534f6baefbdc02e Mon Sep 17 00:00:00 2001 From: zHd4 <38856321+zHd4@users.noreply.github.com> Date: Mon, 22 Jun 2026 16:48:13 +0200 Subject: [PATCH 07/15] Refactor OpenNoteActivity to manage ActionBar title updates for edit and markdown view modes --- .../main/java/app/notesr/activity/note/OpenNoteActivity.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 c935b799..8318686a 100644 --- a/app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java +++ b/app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java @@ -57,6 +57,7 @@ public final class OpenNoteActivity extends ActivityBase { private NoteService noteService; private FileService fileService; private Note note; + private ActionBar actionBar; private Menu activityMenu; private DialogFactory dialogFactory; private boolean isNoteModified; @@ -122,7 +123,7 @@ protected void onCreate(Bundle savedInstanceState) { } private void initializeActionBar() { - ActionBar actionBar = getSupportActionBar(); + actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(true); @@ -360,6 +361,7 @@ private void switchToEditMode() { nameField.setEnabled(false); textField.setVisibility(View.VISIBLE); viewerContainer.setVisibility(View.GONE); + actionBar.setTitle(getResources().getString(R.string.edit)); } private void switchToViewMarkdownMode() { @@ -369,6 +371,7 @@ private void switchToViewMarkdownMode() { markwon.setMarkdown(viewer, textField.getText().toString()); viewerContainer.setVisibility(View.VISIBLE); + actionBar.setTitle(getResources().getString(R.string.view_markdown)); } @Override From ec3d9b7e8ca6217a03877cbbb197884fd028c15e Mon Sep 17 00:00:00 2001 From: zHd4 <38856321+zHd4@users.noreply.github.com> Date: Mon, 22 Jun 2026 19:34:50 +0200 Subject: [PATCH 08/15] Refactor OpenNoteActivity to use OpenNoteMode enum for mode management --- .../activity/note/OpenNoteActivity.java | 26 ++++++++--------- .../notesr/activity/note/OpenNoteMode.java | 28 +++++++++++++++++++ 2 files changed, 40 insertions(+), 14 deletions(-) create mode 100644 app/src/main/java/app/notesr/activity/note/OpenNoteMode.java 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 8318686a..c5955b8f 100644 --- a/app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java +++ b/app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java @@ -66,19 +66,17 @@ public final class OpenNoteActivity extends ActivityBase { private TextView viewer; private ScrollView viewerContainer; private Markwon markwon; - private static final int MODE_EDIT = 0; - private static final int MODE_MARKDOWN_VIEW = 1; private static final String STATE_OPEN_MODE = "openMode"; - private int openMode = MODE_EDIT; + private OpenNoteMode openMode = OpenNoteMode.EDIT; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState != null) { - openMode = savedInstanceState.getInt(STATE_OPEN_MODE, MODE_EDIT); + openMode = OpenNoteMode.fromCode(savedInstanceState.getInt(STATE_OPEN_MODE)); } else { - openMode = MODE_EDIT; + openMode = OpenNoteMode.EDIT; } if (isFinishing()) { @@ -110,10 +108,10 @@ protected void onCreate(Bundle savedInstanceState) { prepareViews(); switch (openMode) { - case MODE_MARKDOWN_VIEW: + case MARKDOWN_VIEW: switchToViewMarkdownMode(); break; - case MODE_EDIT: + case EDIT: default: switchToEditMode(); break; @@ -329,9 +327,9 @@ private void changeOpenModeButtonOnClick() { Menu popupMenu = popup.getMenu(); - if (openMode == MODE_EDIT) { + if (openMode == OpenNoteMode.EDIT) { popupMenu.findItem(R.id.editMenuItem).setChecked(true); - } else if (openMode == MODE_MARKDOWN_VIEW) { + } else if (openMode == OpenNoteMode.MARKDOWN_VIEW) { popupMenu.findItem(R.id.viewMarkdownMenuItem).setChecked(true); } @@ -340,12 +338,12 @@ private void changeOpenModeButtonOnClick() { if (id == R.id.editMenuItem) { item.setChecked(true); - openMode = MODE_EDIT; + openMode = OpenNoteMode.EDIT; switchToEditMode(); return true; } else if (id == R.id.viewMarkdownMenuItem) { item.setChecked(true); - openMode = MODE_MARKDOWN_VIEW; + openMode = OpenNoteMode.MARKDOWN_VIEW; switchToViewMarkdownMode(); return true; } @@ -357,7 +355,7 @@ private void changeOpenModeButtonOnClick() { } private void switchToEditMode() { - openMode = MODE_EDIT; + openMode = OpenNoteMode.EDIT; nameField.setEnabled(false); textField.setVisibility(View.VISIBLE); viewerContainer.setVisibility(View.GONE); @@ -365,7 +363,7 @@ private void switchToEditMode() { } private void switchToViewMarkdownMode() { - openMode = MODE_MARKDOWN_VIEW; + openMode = OpenNoteMode.MARKDOWN_VIEW; nameField.setEnabled(true); textField.setVisibility(View.GONE); @@ -377,7 +375,7 @@ private void switchToViewMarkdownMode() { @Override protected void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); - outState.putInt(STATE_OPEN_MODE, openMode); + outState.putInt(STATE_OPEN_MODE, openMode.getModeCode()); } private void disableMenuItem(MenuItem item) { diff --git a/app/src/main/java/app/notesr/activity/note/OpenNoteMode.java b/app/src/main/java/app/notesr/activity/note/OpenNoteMode.java new file mode 100644 index 00000000..285bede2 --- /dev/null +++ b/app/src/main/java/app/notesr/activity/note/OpenNoteMode.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2026 zHd4 + * SPDX-License-Identifier: MIT + */ + +package app.notesr.activity.note; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Getter +public enum OpenNoteMode { + EDIT(0), + MARKDOWN_VIEW(1); + + private final int modeCode; + + public static OpenNoteMode fromCode(int code) { + for (OpenNoteMode mode : values()) { + if (mode.getModeCode() == code) { + return mode; + } + } + + return null; + } +} From d68fddf1c360397764d9d481209cf9a64b8240d6 Mon Sep 17 00:00:00 2001 From: zHd4 <38856321+zHd4@users.noreply.github.com> Date: Mon, 22 Jun 2026 21:22:20 +0200 Subject: [PATCH 09/15] Split onClicks of OpenNoteActivity into classes --- .../activity/note/DeleteNoteOnClick.java | 73 +++++++++++ .../activity/note/OpenFilesListOnClick.java | 32 +++++ .../activity/note/OpenNoteActivity.java | 119 ++++-------------- .../notesr/activity/note/SaveNoteOnClick.java | 62 +++++++++ 4 files changed, 188 insertions(+), 98 deletions(-) create mode 100644 app/src/main/java/app/notesr/activity/note/DeleteNoteOnClick.java create mode 100644 app/src/main/java/app/notesr/activity/note/OpenFilesListOnClick.java create mode 100644 app/src/main/java/app/notesr/activity/note/SaveNoteOnClick.java diff --git a/app/src/main/java/app/notesr/activity/note/DeleteNoteOnClick.java b/app/src/main/java/app/notesr/activity/note/DeleteNoteOnClick.java new file mode 100644 index 00000000..a6585966 --- /dev/null +++ b/app/src/main/java/app/notesr/activity/note/DeleteNoteOnClick.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2026 zHd4 + * SPDX-License-Identifier: MIT + */ + +package app.notesr.activity.note; + +import static java.util.concurrent.Executors.newSingleThreadExecutor; + +import android.app.Dialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.view.MenuItem; + +import androidx.annotation.NonNull; + +import java.io.IOException; + +import app.notesr.R; +import app.notesr.activity.ActivityBase; +import app.notesr.activity.DialogFactory; +import app.notesr.data.model.Note; +import app.notesr.service.file.FileService; +import app.notesr.service.note.NoteService; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class DeleteNoteOnClick implements MenuItem.OnMenuItemClickListener { + + private final ActivityBase activity; + private final Note note; + private final NoteService noteService; + private final FileService fileService; + private final DialogFactory dialogFactory; + + @Override + public boolean onMenuItemClick(@NonNull MenuItem item) { + DialogInterface.OnClickListener buttonHandler = deleteNoteDialogOnClick(); + dialogFactory.getThemedAlertDialogBuilder(R.layout.dialog_action_cannot_be_undo) + .setTitle(R.string.warning) + .setPositiveButton(R.string.delete, buttonHandler) + .setNegativeButton(R.string.no, buttonHandler) + .create() + .show(); + + return true; + } + + private DialogInterface.OnClickListener deleteNoteDialogOnClick() { + return (dialog, result) -> { + if (result == DialogInterface.BUTTON_POSITIVE) { + Dialog progressDialog = dialogFactory + .getThemedProgressDialog(R.layout.progress_dialog_deleting); + + newSingleThreadExecutor().execute(() -> { + activity.runOnUiThread(progressDialog::show); + + try { + noteService.delete(note.getId(), fileService); + } catch (IOException e) { + throw new RuntimeException(e); + } + + activity.runOnUiThread(() -> { + progressDialog.dismiss(); + activity.startActivity(new Intent(activity.getApplicationContext(), + NotesListActivity.class)); + }); + }); + } + }; + } +} diff --git a/app/src/main/java/app/notesr/activity/note/OpenFilesListOnClick.java b/app/src/main/java/app/notesr/activity/note/OpenFilesListOnClick.java new file mode 100644 index 00000000..11496fad --- /dev/null +++ b/app/src/main/java/app/notesr/activity/note/OpenFilesListOnClick.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2026 zHd4 + * SPDX-License-Identifier: MIT + */ + +package app.notesr.activity.note; + +import android.content.Intent; +import android.view.MenuItem; + +import androidx.annotation.NonNull; + +import app.notesr.activity.ActivityBase; +import app.notesr.activity.file.FilesListActivity; +import app.notesr.data.model.Note; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class OpenFilesListOnClick implements MenuItem.OnMenuItemClickListener { + + private final ActivityBase activity; + private final Note note; + + @Override + public boolean onMenuItemClick(@NonNull MenuItem item) { + Intent intent = new Intent(activity.getApplicationContext(), FilesListActivity.class); + + intent.putExtra(FilesListActivity.EXTRA_NOTE_ID, note.getId()); + activity.startActivity(intent); + return true; + } +} 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 c5955b8f..274c936e 100644 --- a/app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java +++ b/app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java @@ -5,9 +5,7 @@ package app.notesr.activity.note; -import android.app.Dialog; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.text.Editable; @@ -28,7 +26,6 @@ import app.notesr.activity.DialogFactory; import app.notesr.data.AppDatabase; import app.notesr.data.DatabaseProvider; -import app.notesr.activity.file.FilesListActivity; import app.notesr.service.file.FileService; import app.notesr.data.model.Note; import app.notesr.service.note.NoteService; @@ -41,8 +38,6 @@ import kotlin.Unit; import kotlin.jvm.functions.Function1; -import java.io.IOException; -import java.time.LocalDateTime; import java.util.Objects; import static androidx.core.view.inputmethod.EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING; @@ -101,6 +96,11 @@ protected void onCreate(Bundle savedInstanceState) { newSingleThreadExecutor().execute(() -> { note = noteService.get(noteId); + + if (isNewNote()) { + note = new Note(); + } + isNoteModified = getIntent().getBooleanExtra(EXTRA_NOTE_MODIFIED, false); runOnUiThread(() -> { @@ -126,11 +126,8 @@ private void initializeActionBar() { if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(true); - if (note != null) { - actionBar.setTitle(getResources().getString(R.string.edit)); - } else { - actionBar.setTitle(getResources().getString(R.string.new_note)); - } + int titleId = isNewNote() ? R.string.new_note : R.string.edit; + actionBar.setTitle(getResources().getString(titleId)); } else { throw new NullPointerException("Action bar is null"); } @@ -145,10 +142,8 @@ private void prepareViews() { nameField.setImeOptions(IME_FLAG_NO_PERSONALIZED_LEARNING); textField.setImeOptions(IME_FLAG_NO_PERSONALIZED_LEARNING); - if (note != null) { - nameField.setText(note.getName()); - textField.setText(note.getText()); - } + nameField.setText(note.getName()); + textField.setText(note.getText()); Function1 afterTextChangedAction = editable -> { if (!isNoteModified) { @@ -165,6 +160,11 @@ private void prepareViews() { TextViewKt.doAfterTextChanged(textField, afterTextChangedAction); } + @SuppressWarnings("ConstantValue") // Because note id could be null before first save + private boolean isNewNote() { + return note == null || note.getId() == null; + } + @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_open_note, menu); @@ -180,21 +180,15 @@ public boolean onCreateOptionsMenu(Menu menu) { return true; }); - saveNoteButton.setOnMenuItemClickListener(item -> { - saveNoteOnClick(nameField, textField); - return true; - }); + saveNoteButton.setOnMenuItemClickListener(new SaveNoteOnClick(this, note, + noteService, dialogFactory, nameField, textField)); - if (note != null) { - openFilesListButton.setOnMenuItemClickListener(item -> { - openFilesListOnClick(); - return true; - }); + if (!isNewNote()) { + openFilesListButton.setOnMenuItemClickListener( + new OpenFilesListOnClick(this, note)); - deleteNoteButton.setOnMenuItemClickListener(item -> { - deleteNoteOnClick(); - return true; - }); + deleteNoteButton.setOnMenuItemClickListener(new DeleteNoteOnClick(this, note, + noteService, fileService, dialogFactory)); setAttachedFilesCountBadge(openFilesListButton); } else { @@ -226,8 +220,6 @@ private void setAttachedFilesCountBadge(MenuItem openFilesListButton) { badge.setText(badgeText); badge.setVisibility(View.VISIBLE); - - view.setOnClickListener(v -> openFilesListOnClick()); } }); }); @@ -251,75 +243,6 @@ public boolean onOptionsItemSelected(MenuItem item) { return super.onOptionsItemSelected(item); } - private void saveNoteOnClick(EditText nameField, EditText textField) { - String name = nameField.getText().toString(); - String text = textField.getText().toString(); - - if (!name.isBlank() && !text.isBlank()) { - if (note == null) { - note = new Note(); - } - - note.setName(name); - note.setText(text); - note.setUpdatedAt(LocalDateTime.now()); - - Dialog progressDialog = dialogFactory - .getThemedProgressDialog(R.layout.progress_dialog_loading); - - newSingleThreadExecutor().execute(() -> { - runOnUiThread(progressDialog::show); - noteService.save(note); - - runOnUiThread(() -> { - progressDialog.dismiss(); - startActivity(new Intent(getApplicationContext(), NotesListActivity.class)); - }); - }); - } - } - - private void deleteNoteOnClick() { - DialogInterface.OnClickListener buttonHandler = deleteNoteDialogOnClick(); - dialogFactory.getThemedAlertDialogBuilder(R.layout.dialog_action_cannot_be_undo) - .setTitle(R.string.warning) - .setPositiveButton(R.string.delete, buttonHandler) - .setNegativeButton(R.string.no, buttonHandler) - .create() - .show(); - } - - private void openFilesListOnClick() { - Intent intent = new Intent(getApplicationContext(), FilesListActivity.class); - - intent.putExtra(FilesListActivity.EXTRA_NOTE_ID, note.getId()); - startActivity(intent); - } - - private DialogInterface.OnClickListener deleteNoteDialogOnClick() { - return (dialog, result) -> { - if (result == DialogInterface.BUTTON_POSITIVE) { - Dialog progressDialog = dialogFactory - .getThemedProgressDialog(R.layout.progress_dialog_deleting); - - newSingleThreadExecutor().execute(() -> { - runOnUiThread(progressDialog::show); - - try { - noteService.delete(note.getId(), fileService); - } catch (IOException e) { - throw new RuntimeException(e); - } - - runOnUiThread(() -> { - progressDialog.dismiss(); - startActivity(new Intent(getApplicationContext(), NotesListActivity.class)); - }); - }); - } - }; - } - private void changeOpenModeButtonOnClick() { View anchor = findViewById(R.id.changeOpenModeButton); 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/SaveNoteOnClick.java new file mode 100644 index 00000000..1b1c2104 --- /dev/null +++ b/app/src/main/java/app/notesr/activity/note/SaveNoteOnClick.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2026 zHd4 + * SPDX-License-Identifier: MIT + */ + +package app.notesr.activity.note; + +import static java.util.concurrent.Executors.newSingleThreadExecutor; + +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; +import app.notesr.activity.ActivityBase; +import app.notesr.activity.DialogFactory; +import app.notesr.data.model.Note; +import app.notesr.service.note.NoteService; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class SaveNoteOnClick implements MenuItem.OnMenuItemClickListener { + + private final ActivityBase activity; + private final Note note; + private final NoteService noteService; + private final DialogFactory dialogFactory; + 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(); + + if (!name.isBlank() && !text.isBlank()) { + note.setName(name); + note.setText(text); + note.setUpdatedAt(LocalDateTime.now()); + + Dialog progressDialog = dialogFactory + .getThemedProgressDialog(R.layout.progress_dialog_loading); + + newSingleThreadExecutor().execute(() -> { + activity.runOnUiThread(progressDialog::show); + noteService.save(note); + + activity.runOnUiThread(() -> { + progressDialog.dismiss(); + activity.startActivity(new Intent(activity, NotesListActivity.class)); + }); + }); + } + + return true; + } +} From 369237cd0591ea0795f30470cdd3cc216b39abdb Mon Sep 17 00:00:00 2001 From: zHd4 <38856321+zHd4@users.noreply.github.com> Date: Mon, 22 Jun 2026 21:49:12 +0200 Subject: [PATCH 10/15] Fix OpenNoteActivity to enable nameField editing in edit mode and disable it in markdown view mode --- .../main/java/app/notesr/activity/note/OpenNoteActivity.java | 4 ++-- 1 file changed, 2 insertions(+), 2 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 274c936e..f6ce64df 100644 --- a/app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java +++ b/app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java @@ -279,7 +279,7 @@ private void changeOpenModeButtonOnClick() { private void switchToEditMode() { openMode = OpenNoteMode.EDIT; - nameField.setEnabled(false); + nameField.setEnabled(true); textField.setVisibility(View.VISIBLE); viewerContainer.setVisibility(View.GONE); actionBar.setTitle(getResources().getString(R.string.edit)); @@ -287,7 +287,7 @@ private void switchToEditMode() { private void switchToViewMarkdownMode() { openMode = OpenNoteMode.MARKDOWN_VIEW; - nameField.setEnabled(true); + nameField.setEnabled(false); textField.setVisibility(View.GONE); markwon.setMarkdown(viewer, textField.getText().toString()); From a21f678c16c72d72dde435fab5fb674b132c3771 Mon Sep 17 00:00:00 2001 From: zHd4 <38856321+zHd4@users.noreply.github.com> Date: Mon, 22 Jun 2026 21:50:28 +0200 Subject: [PATCH 11/15] Update markdown viewer settings in activity_open_note.xml --- app/src/main/res/layout/activity_open_note.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/activity_open_note.xml b/app/src/main/res/layout/activity_open_note.xml index f0bdd7f9..3c06d8e4 100644 --- a/app/src/main/res/layout/activity_open_note.xml +++ b/app/src/main/res/layout/activity_open_note.xml @@ -91,8 +91,9 @@ android:id="@+id/viewer" android:layout_width="match_parent" android:layout_height="wrap_content" - android:textSize="18sp" - android:textColor="@color/text_color" /> + android:textSize="15sp" + android:textColor="@color/text_color" + android:paddingBottom="15dp" /> From 33386a6db416e7de73a3d25b1744de4238019262 Mon Sep 17 00:00:00 2001 From: zHd4 <38856321+zHd4@users.noreply.github.com> Date: Mon, 22 Jun 2026 21:52:20 +0200 Subject: [PATCH 12/15] Rename markdown viewer components --- .../app/notesr/activity/note/OpenNoteActivity.java | 14 +++++++------- app/src/main/res/layout/activity_open_note.xml | 4 ++-- 2 files changed, 9 insertions(+), 9 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 f6ce64df..725701b4 100644 --- a/app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java +++ b/app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java @@ -58,8 +58,8 @@ public final class OpenNoteActivity extends ActivityBase { private boolean isNoteModified; private EditText nameField; private EditText textField; - private TextView viewer; - private ScrollView viewerContainer; + private TextView markdownViewer; + private ScrollView markdownViewerContainer; private Markwon markwon; private static final String STATE_OPEN_MODE = "openMode"; private OpenNoteMode openMode = OpenNoteMode.EDIT; @@ -136,8 +136,8 @@ private void initializeActionBar() { private void prepareViews() { nameField = findViewById(R.id.noteNameField); textField = findViewById(R.id.noteTextField); - viewer = findViewById(R.id.viewer); - viewerContainer = findViewById(R.id.viewerContainer); + markdownViewer = findViewById(R.id.markdownViewer); + markdownViewerContainer = findViewById(R.id.markdownViewerContainer); nameField.setImeOptions(IME_FLAG_NO_PERSONALIZED_LEARNING); textField.setImeOptions(IME_FLAG_NO_PERSONALIZED_LEARNING); @@ -281,7 +281,7 @@ private void switchToEditMode() { openMode = OpenNoteMode.EDIT; nameField.setEnabled(true); textField.setVisibility(View.VISIBLE); - viewerContainer.setVisibility(View.GONE); + markdownViewerContainer.setVisibility(View.GONE); actionBar.setTitle(getResources().getString(R.string.edit)); } @@ -290,8 +290,8 @@ private void switchToViewMarkdownMode() { nameField.setEnabled(false); textField.setVisibility(View.GONE); - markwon.setMarkdown(viewer, textField.getText().toString()); - viewerContainer.setVisibility(View.VISIBLE); + markwon.setMarkdown(markdownViewer, textField.getText().toString()); + markdownViewerContainer.setVisibility(View.VISIBLE); actionBar.setTitle(getResources().getString(R.string.view_markdown)); } diff --git a/app/src/main/res/layout/activity_open_note.xml b/app/src/main/res/layout/activity_open_note.xml index 3c06d8e4..6a6f38d7 100644 --- a/app/src/main/res/layout/activity_open_note.xml +++ b/app/src/main/res/layout/activity_open_note.xml @@ -63,7 +63,7 @@ app:layout_constraintVertical_bias="0.0" /> Date: Tue, 23 Jun 2026 17:10:31 +0200 Subject: [PATCH 13/15] Make text selectable in markdown viewer in OpenNoteActivity --- .../main/java/app/notesr/activity/note/OpenNoteActivity.java | 2 ++ app/src/main/res/layout/activity_open_note.xml | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) 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 725701b4..c17604c1 100644 --- a/app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java +++ b/app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java @@ -9,6 +9,7 @@ import android.content.Intent; import android.os.Bundle; import android.text.Editable; +import android.text.method.LinkMovementMethod; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -291,6 +292,7 @@ private void switchToViewMarkdownMode() { textField.setVisibility(View.GONE); markwon.setMarkdown(markdownViewer, textField.getText().toString()); + markdownViewer.setMovementMethod(LinkMovementMethod.getInstance()); markdownViewerContainer.setVisibility(View.VISIBLE); actionBar.setTitle(getResources().getString(R.string.view_markdown)); } diff --git a/app/src/main/res/layout/activity_open_note.xml b/app/src/main/res/layout/activity_open_note.xml index 6a6f38d7..7e916a96 100644 --- a/app/src/main/res/layout/activity_open_note.xml +++ b/app/src/main/res/layout/activity_open_note.xml @@ -93,7 +93,8 @@ android:layout_height="wrap_content" android:textSize="15sp" android:textColor="@color/text_color" - android:paddingBottom="15dp" /> + android:paddingBottom="15dp" + android:textIsSelectable="true" /> From 5ac2a83c6e79a8cfaabb73eaaeff2be6a09f97ca Mon Sep 17 00:00:00 2001 From: zHd4 <38856321+zHd4@users.noreply.github.com> Date: Tue, 23 Jun 2026 17:16:49 +0200 Subject: [PATCH 14/15] Add click listener for opening files list to corresponding button with badge in OpenNoteActivity --- .../notesr/activity/note/OpenFilesListOnClick.java | 14 ++++++++++++-- .../app/notesr/activity/note/OpenNoteActivity.java | 1 + 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/app/notesr/activity/note/OpenFilesListOnClick.java b/app/src/main/java/app/notesr/activity/note/OpenFilesListOnClick.java index 11496fad..8759ce8b 100644 --- a/app/src/main/java/app/notesr/activity/note/OpenFilesListOnClick.java +++ b/app/src/main/java/app/notesr/activity/note/OpenFilesListOnClick.java @@ -7,6 +7,7 @@ import android.content.Intent; import android.view.MenuItem; +import android.view.View; import androidx.annotation.NonNull; @@ -16,17 +17,26 @@ import lombok.RequiredArgsConstructor; @RequiredArgsConstructor -public class OpenFilesListOnClick implements MenuItem.OnMenuItemClickListener { +public class OpenFilesListOnClick implements MenuItem.OnMenuItemClickListener, View.OnClickListener { 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() { Intent intent = new Intent(activity.getApplicationContext(), FilesListActivity.class); intent.putExtra(FilesListActivity.EXTRA_NOTE_ID, note.getId()); activity.startActivity(intent); - return true; } } 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 c17604c1..523c0ba1 100644 --- a/app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java +++ b/app/src/main/java/app/notesr/activity/note/OpenNoteActivity.java @@ -221,6 +221,7 @@ private void setAttachedFilesCountBadge(MenuItem openFilesListButton) { badge.setText(badgeText); badge.setVisibility(View.VISIBLE); + view.setOnClickListener(new OpenFilesListOnClick(this, note)); } }); }); From ce2e061039ac9b1f67f960e4348adfb8c0891c33 Mon Sep 17 00:00:00 2001 From: zHd4 <38856321+zHd4@users.noreply.github.com> Date: Tue, 23 Jun 2026 19:00:39 +0200 Subject: [PATCH 15/15] Increase text size for note name field in OpenNoteActivity --- app/src/main/res/layout/activity_open_note.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/activity_open_note.xml b/app/src/main/res/layout/activity_open_note.xml index 7e916a96..eacc1064 100644 --- a/app/src/main/res/layout/activity_open_note.xml +++ b/app/src/main/res/layout/activity_open_note.xml @@ -12,7 +12,7 @@ android:id="@+id/noteNameField" android:layout_width="match_parent" android:layout_height="53dp" - android:textSize="25sp" + android:textSize="30sp" android:backgroundTint="@color/activity_background" android:ems="10" android:hint="@string/name"