From 963dbaf806a010d2407d5af2a2fb942840dbc869 Mon Sep 17 00:00:00 2001 From: sepulzera Date: Thu, 8 Dec 2022 22:01:08 +0100 Subject: [PATCH 1/5] Prepare next version --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 35911a7..3b55ee9 100755 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { minSdkVersion 24 targetSdkVersion 32 versionCode 25 - versionName "3.0.0" + versionName "3.0.1-SNAPSHOT" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" signingConfig signingConfigs.debug } From beb638e28586d83b8a715f9c6ab070e88ef0b370 Mon Sep 17 00:00:00 2001 From: sepulzera Date: Fri, 28 Jul 2023 09:33:33 +0200 Subject: [PATCH 2/5] #40 Fix global context after resuming from process background kill --- .../de/sepulzera/notes/bf/helper/Helper.java | 13 ++++--- .../notes/bf/service/NoteService.java | 1 - .../bf/service/impl/NoteServiceImpl.java | 6 --- .../ui/activity/note/NoteEditFragment.java | 22 ++++++----- .../activity/note/NoteTabViewerActivity.java | 37 +++++++++++++------ .../ui/activity/note/NoteTrashActivity.java | 4 ++ 6 files changed, 49 insertions(+), 34 deletions(-) diff --git a/app/src/main/java/de/sepulzera/notes/bf/helper/Helper.java b/app/src/main/java/de/sepulzera/notes/bf/helper/Helper.java index a697748..2c3ea28 100644 --- a/app/src/main/java/de/sepulzera/notes/bf/helper/Helper.java +++ b/app/src/main/java/de/sepulzera/notes/bf/helper/Helper.java @@ -11,10 +11,8 @@ import android.util.Log; import java.io.BufferedReader; -import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; -import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -252,10 +250,15 @@ private static void setNightMode(@NonNull final Context context) { * @param mode {@code AppCompatDelegate.MODE_NIGHT_NO}, {@code AppCompatDelegate.MODE_NIGHT_YES} or {@code AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM} */ public static void setNightMode(int mode) { + int systemMode; switch (mode) { - case 0: AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); break; - case 1: AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); break; - default: AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); break; + case 0: systemMode = AppCompatDelegate.MODE_NIGHT_NO; break; + case 1: systemMode = AppCompatDelegate.MODE_NIGHT_YES; break; + default: systemMode = AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM; break; + } + + if (systemMode != AppCompatDelegate.getDefaultNightMode()) { + AppCompatDelegate.setDefaultNightMode(systemMode); } } diff --git a/app/src/main/java/de/sepulzera/notes/bf/service/NoteService.java b/app/src/main/java/de/sepulzera/notes/bf/service/NoteService.java index a0251b3..0060e49 100644 --- a/app/src/main/java/de/sepulzera/notes/bf/service/NoteService.java +++ b/app/src/main/java/de/sepulzera/notes/bf/service/NoteService.java @@ -4,7 +4,6 @@ import android.net.Uri; import androidx.annotation.NonNull; -import java.io.File; import java.util.List; import de.sepulzera.notes.ds.model.Note; diff --git a/app/src/main/java/de/sepulzera/notes/bf/service/impl/NoteServiceImpl.java b/app/src/main/java/de/sepulzera/notes/bf/service/impl/NoteServiceImpl.java index 3fd3c0c..5c5f0f6 100644 --- a/app/src/main/java/de/sepulzera/notes/bf/service/impl/NoteServiceImpl.java +++ b/app/src/main/java/de/sepulzera/notes/bf/service/impl/NoteServiceImpl.java @@ -3,17 +3,12 @@ import android.content.ContentValues; import android.content.Context; import android.net.Uri; -import android.os.Build; -import android.os.Environment; -import android.provider.MediaStore; import androidx.annotation.NonNull; import org.json.JSONArray; import org.json.JSONException; -import java.io.File; -import java.nio.file.FileStore; import java.sql.SQLIntegrityConstraintViolationException; import java.text.DateFormat; import java.util.ArrayList; @@ -25,7 +20,6 @@ import java.util.Locale; import de.sepulzera.notes.R; -import de.sepulzera.notes.bf.helper.DateUtil; import de.sepulzera.notes.bf.helper.Helper; import de.sepulzera.notes.bf.helper.StringUtil; import de.sepulzera.notes.bf.helper.vlog.VLog; diff --git a/app/src/main/java/de/sepulzera/notes/ui/activity/note/NoteEditFragment.java b/app/src/main/java/de/sepulzera/notes/ui/activity/note/NoteEditFragment.java index 22c8beb..0ced14b 100644 --- a/app/src/main/java/de/sepulzera/notes/ui/activity/note/NoteEditFragment.java +++ b/app/src/main/java/de/sepulzera/notes/ui/activity/note/NoteEditFragment.java @@ -91,14 +91,16 @@ private void restoreState(@NonNull final Bundle savedInstanceState) { FragmentManager fragmentManager = getChildFragmentManager(); final List frags = fragmentManager.getFragments(); - if (frags.size() == 0) { - throw new IllegalStateException("RunDo Fragment is lost"); - } - // may have additional frags, but only the RunDo is needed - for (final Fragment frag : frags) { - if (frag instanceof RunDoSupport && String.valueOf(mIndex).equals(((RunDoSupport)frag).getIdent())) { - mRunDo = (RunDoSupport)frag; - break; + if (frags.size() > 0) { + // may have additional frags, but only the RunDo is needed + for (final Fragment frag : frags) { + if (frag instanceof RunDoSupport && String.valueOf(mIndex).equals(((RunDoSupport) frag).getIdent())) { + mRunDo = (RunDoSupport) frag; + break; + } + } + if (mRunDo == null) { + throw new IllegalStateException("RunDo Fragment is lost"); } } } @@ -112,10 +114,10 @@ public void onSaveInstanceState(@NonNull final Bundle outState) { outState.putBoolean(KEY_EDITABLE, mIsEditable); } - public void initialize(int index, @NonNull final Note note) { + public void initialize(int index, @NonNull final Note note, boolean openNotesReadonly) { mIndex = index; mNote = note; - mIsEditable = note.getId() == 0L || !NoteTabViewerActivity.mOpenNotesReadonly; + mIsEditable = note.getId() == 0L || !openNotesReadonly; } public Note getNote() { return mNote; } public int getIndex() { return mIndex; } diff --git a/app/src/main/java/de/sepulzera/notes/ui/activity/note/NoteTabViewerActivity.java b/app/src/main/java/de/sepulzera/notes/ui/activity/note/NoteTabViewerActivity.java index 907786a..17f5443 100755 --- a/app/src/main/java/de/sepulzera/notes/ui/activity/note/NoteTabViewerActivity.java +++ b/app/src/main/java/de/sepulzera/notes/ui/activity/note/NoteTabViewerActivity.java @@ -56,6 +56,9 @@ protected void onCreate(Bundle savedInstanceState) { VLog.d(ACTIVITY_IDENT, "Creating activity."); + Helper.localize(getApplicationContext()); + Helper.updatePreferences(this); + Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); @@ -107,6 +110,11 @@ protected void onCreate(Bundle savedInstanceState) { return; } noteFrag.setEditable(true); + if (note.getDraft()) { + mIsDraftFragEditable = true; + } else { + mIsNoteFragEditable = true; + } invalidateFloatingActionButton(true, true); invalidateOptionsMenu(); } @@ -128,7 +136,7 @@ protected void onCreate(Bundle savedInstanceState) { invalidateOptionsMenu(); }); - invalidateFloatingActionButton(mNoteFrags.get(0).getFragment()); + invalidateFloatingActionButton(); invalidateOptionsMenu(); } @@ -145,6 +153,8 @@ private void createState(final Intent intent) { if (mNote == null) { throw new IllegalArgumentException("note must not be null!"); } + mIsDraftFragEditable = !mOpenNotesReadonly; + mIsNoteFragEditable = !mOpenNotesReadonly; } final NoteService srv = NoteServiceImpl.getInstance(); @@ -188,6 +198,8 @@ private void restoreState(@NonNull final Bundle outState) { mNote = (Note)outState.getSerializable(Note.TAG_NOTE); mDraft = (Note)outState.getSerializable(KEY_DRAFT); mDisplayedNote = (Note)outState.getSerializable(KEY_DISPLAYED_NOTE); + mIsDraftFragEditable = outState.getBoolean(KEY_DRAFT_EDITABLE); + mIsNoteFragEditable = outState.getBoolean(KEY_NOTE_EDITABLE); mShowsRevisions = outState.getBoolean(KEY_SHOW_REVS); mShowToolbarEdit = outState.getBoolean(KEY_SHOW_TB_EDIT); mInvalidateList = outState.getBoolean(KEY_INVALID_LIST); @@ -226,8 +238,6 @@ private void restoreState(@NonNull final Bundle outState) { @Override public void onSaveInstanceState(@NonNull final Bundle outState) { - mPager.setCurrentItem(0); - super.onSaveInstanceState(outState); if (mNote != null) { @@ -239,6 +249,8 @@ public void onSaveInstanceState(@NonNull final Bundle outState) { if (mDisplayedNote != null) { outState.putSerializable(KEY_DISPLAYED_NOTE, mDisplayedNote); } + outState.putBoolean(KEY_DRAFT_EDITABLE, mIsDraftFragEditable); + outState.putBoolean(KEY_NOTE_EDITABLE, mIsNoteFragEditable); outState.putString(KEY_TITLE, getTitle().toString()); outState.putBoolean(KEY_SHOW_REVS , mShowsRevisions); outState.putBoolean(KEY_SHOW_TB_EDIT, mShowToolbarEdit); @@ -253,9 +265,10 @@ public static void readPreferences(@NonNull final Context context) { , context.getResources().getString(R.string.PREF_NOTE_OPEN_READONLY_KEY), Boolean.parseBoolean(context.getResources().getString(R.string.pref_note_open_readonly_default))); } - private void invalidateFloatingActionButton(@NonNull final NoteEditFragment frag) { + private void invalidateFloatingActionButton() { final boolean isCurrRev = mDisplayedNote != null && mDisplayedNote.getCurrRev() && mDisplayedNote.getCurr(); - invalidateFloatingActionButton(isCurrRev, frag.isEditable()); + final boolean isEditable = mDisplayedNote != null && mDisplayedNote.getDraft() ? mIsDraftFragEditable : mIsNoteFragEditable; + invalidateFloatingActionButton(isCurrRev, isEditable); } private void invalidateFloatingActionButton(boolean isCurrRev, boolean isEditable) { @@ -693,17 +706,14 @@ private void saveNote(@NonNull final NoteEditFragment frag) { final String newTitle = getTitle().toString(); if (!note.getDraft() && StringUtil.equals(newMsg, note.getMsg()) && StringUtil.equals(newTitle, note.getTitle())) { - VLog.d(ACTIVITY_IDENT, "Closing note=\"" + note + "\". (no changes)"); // no changes made -> just go back executeDone(); return; } - VLog.d(ACTIVITY_IDENT, "Saving note=\"" + note + "\". (title=\"" + newTitle + "\", msg=\"" + newMsg + "\""); - final Note saveNote = NoteServiceImpl.getInstance().clone(note); saveNote.setMsg(newMsg); - saveNote.setTitle(StringUtil.equals(getResources().getString(R.string.new_note_title), newTitle)? "" : newTitle); + saveNote.setTitle(StringUtil.equals(getResources().getString(R.string.new_note_title), newTitle) ? "" : newTitle); final boolean wasDraft = note.getDraft(); if (wasDraft) { @@ -743,7 +753,6 @@ private void saveNote(@NonNull final NoteEditFragment frag) { dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); } dialog.show(); - } private void executeDone() { @@ -800,7 +809,7 @@ private void updatePage() { NoteEditFragment noteFrag = getActiveNoteFragment(getSupportFragmentManager(), mPager); if (noteFrag != null) { mDisplayedNote = noteFrag.getNote(); - invalidateFloatingActionButton(noteFrag); + invalidateFloatingActionButton(); invalidateOptionsMenu(); } } @@ -934,7 +943,7 @@ private static class NoteFragmentAdapter { void add(@NonNull final Note note, @NonNull final String fragmentTitle) { final NoteEditFragment frag = new NoteEditFragment(); - frag.initialize(mNoteFrags.size(), note); + frag.initialize(mNoteFrags.size(), note, mOpenNotesReadonly || !note.getCurrRev()); // The fragment's instances should not be destroyed to not invalidate the references to them frag.setRetainInstance(true); @@ -1026,6 +1035,8 @@ private static Fragment getActiveFragment(@NonNull final FragmentManager fragmen private boolean mInvalidateList = false; private final NoteFragmentAdapter mNoteFrags = new NoteFragmentAdapter(); + private boolean mIsNoteFragEditable = false; + private boolean mIsDraftFragEditable = false; private NoteFragmentPagerAdapter mAdapter; private ViewPager mPager; @@ -1047,6 +1058,8 @@ private static Fragment getActiveFragment(@NonNull final FragmentManager fragmen private static final String KEY_DRAFT = "notetabvieweract_draft"; private static final String KEY_TITLE = "notetabvieweract_title"; private static final String KEY_DISPLAYED_NOTE = "notetabvieweract_displayednote"; + private static final String KEY_DRAFT_EDITABLE = "notetabvieweract_drafteditable"; + private static final String KEY_NOTE_EDITABLE = "notetabvieweract_noteeditable"; private static final String KEY_SHOW_REVS = "notetabvieweract_showrevs"; private static final String KEY_SHOW_TB_EDIT = "notetabvieweract_showtoolbaredit"; private static final String KEY_INVALID_LIST = "notetabvieweract_invalidatelist"; diff --git a/app/src/main/java/de/sepulzera/notes/ui/activity/note/NoteTrashActivity.java b/app/src/main/java/de/sepulzera/notes/ui/activity/note/NoteTrashActivity.java index 0f58c0d..c22945a 100755 --- a/app/src/main/java/de/sepulzera/notes/ui/activity/note/NoteTrashActivity.java +++ b/app/src/main/java/de/sepulzera/notes/ui/activity/note/NoteTrashActivity.java @@ -25,6 +25,7 @@ import java.util.List; import de.sepulzera.notes.R; +import de.sepulzera.notes.bf.helper.Helper; import de.sepulzera.notes.bf.helper.vlog.VLog; import de.sepulzera.notes.bf.service.NoteService; import de.sepulzera.notes.bf.service.impl.NoteServiceImpl; @@ -40,6 +41,9 @@ protected void onCreate(Bundle savedInstanceState) { VLog.d(ACTIVITY_IDENT, "Creating activity."); + Helper.localize(getApplicationContext()); + Helper.updatePreferences(this); + // SETUP APPLICATION if (null != savedInstanceState) { From 6334bd89afe3cea0c7e097ddce0acb3c4b584728 Mon Sep 17 00:00:00 2001 From: sepulzera Date: Fri, 11 Aug 2023 18:39:42 +0200 Subject: [PATCH 3/5] #41 Bump minSdkVersion to 29 (android 10) --- README.md | 2 +- app/build.gradle | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0a4aa84..f66939a 100644 --- a/README.md +++ b/README.md @@ -79,7 +79,7 @@ This app fits your needs. Doesn't? Change it right to your needs. ### System Requirements -* OS: Android 7.0 +* OS: Android 10.0 * Display: 480x800, hdpi * Touch Input diff --git a/app/build.gradle b/app/build.gradle index 3b55ee9..3cee5a2 100755 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,9 +5,9 @@ android { buildToolsVersion '32.0.0' defaultConfig { applicationId "de.sepulzera.notes" - minSdkVersion 24 + minSdkVersion 29 targetSdkVersion 32 - versionCode 25 + versionCode 26 versionName "3.0.1-SNAPSHOT" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" signingConfig signingConfigs.debug From 3fc3571d32cddebef180d3b314f2336c0b867bb5 Mon Sep 17 00:00:00 2001 From: sepulzera Date: Fri, 11 Aug 2023 20:53:15 +0200 Subject: [PATCH 4/5] #41 re-enable apk dex compression (useLegacyPackaging) --- app/build.gradle | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index 3cee5a2..648778d 100755 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,6 +21,11 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + packagingOptions { + dex { + useLegacyPackaging true + } + } testOptions { unitTests.returnDefaultValues = true } From 056cd4604745ccdbc2491943edcfc62d32648423 Mon Sep 17 00:00:00 2001 From: sepulzera Date: Fri, 11 Aug 2023 20:53:32 +0200 Subject: [PATCH 5/5] Version 3.0.1 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 648778d..44c37d0 100755 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { minSdkVersion 29 targetSdkVersion 32 versionCode 26 - versionName "3.0.1-SNAPSHOT" + versionName "3.0.1" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" signingConfig signingConfigs.debug }