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"