From 764511384b25d4d5cc052474c87aa414ae919135 Mon Sep 17 00:00:00 2001 From: Federico Iosue Date: Wed, 31 May 2023 15:40:35 +0200 Subject: [PATCH 1/6] Spent some time on code quality and technical debt --- assets/ic_launcher-web.png | Bin 30454 -> 0 bytes .../android/en-US/images/feature-graphic.png | 0 .../metadata/android/en-US/images/icon.png | 0 .../feio/android/omninotes/AboutActivity.java | 1 + .../feio/android/omninotes/BaseActivity.java | 2 +- .../feio/android/omninotes/BaseFragment.java | 5 -- .../android/omninotes/CategoryActivity.java | 3 +- .../android/omninotes/DetailFragment.java | 53 +++++++++--------- .../feio/android/omninotes/MainActivity.java | 2 +- .../android/omninotes/SettingsFragment.java | 4 +- .../android/omninotes/SketchFragment.java | 6 +- .../omninotes/async/AttachmentTask.java | 1 + .../omninotes/async/CategoryMenuTask.java | 4 +- .../omninotes/async/UpdateWidgetsTask.java | 7 ++- .../feio/android/omninotes/db/DbHelper.java | 15 ++--- .../omninotes/helpers/BackupHelper.java | 2 +- .../helpers/GeocodeProviderBaseFactory.java | 4 +- .../omninotes/helpers/count/WordCounter.java | 2 +- .../feio/android/omninotes/models/Stats.java | 6 ++ .../models/adapters/AttachmentAdapter.java | 17 ++---- .../misc/DynamicNavigationLookupTable.java | 4 +- .../android/omninotes/models/views/Fab.java | 8 +-- .../models/views/SquareImageView.java | 6 +- .../omninotes/utils/GeocodeHelper.java | 2 + .../omninotes/utils/StorageHelper.java | 24 ++++---- .../android/omninotes/utils/SystemHelper.java | 17 ++---- .../android/omninotes/utils/TagsHelper.java | 9 ++- .../android/omninotes/utils/TextHelper.java | 10 ++-- .../utils/date/SublimePickerFragment.java | 7 ++- .../omninotes/widget/WidgetProvider.java | 2 +- .../omninotes/utils/TagsHelperTest.java | 19 +++---- 31 files changed, 119 insertions(+), 123 deletions(-) delete mode 100644 assets/ic_launcher-web.png create mode 100644 fastlane/metadata/android/en-US/images/feature-graphic.png create mode 100644 fastlane/metadata/android/en-US/images/icon.png diff --git a/assets/ic_launcher-web.png b/assets/ic_launcher-web.png deleted file mode 100644 index efcf350a8b59dd7d848a43b63646a234b709aee1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30454 zcmdRW_dnJD`~UL{>maA>t&)uFS=K>h?`%0nMz-w2v1KM(*)xQ!YzLvNtdLC-*<`QJ z^Yngw|A?<&bUV)TF|Nn;xUT#CeqGOAX{tXWMbIGt03cOTe5efoQ1G8nfDj-2_1Ams z6aYM1lpf0HdQWYb5_s!AouaI)EH9n@JMZB&`⪙jTTCXplejLu?FNR@F4Q-u@SPb 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 V notes, boolean askForPassword = false; for (Note note : notes) { - if (note.isLocked()) { + if (Boolean.TRUE.equals(note.isLocked())) { askForPassword = true; break; } diff --git a/omniNotes/src/main/java/it/feio/android/omninotes/BaseFragment.java b/omniNotes/src/main/java/it/feio/android/omninotes/BaseFragment.java index 57a62354d0..d45ea6461a 100644 --- a/omniNotes/src/main/java/it/feio/android/omninotes/BaseFragment.java +++ b/omniNotes/src/main/java/it/feio/android/omninotes/BaseFragment.java @@ -26,11 +26,6 @@ public class BaseFragment extends Fragment { private static final long OPTIONS_ITEM_CLICK_DELAY_TIME = 1000; private long mLastClickTime; - @Override - public void onDestroy() { - super.onDestroy(); - } - protected boolean isOptionsItemFastClick() { if (SystemClock.elapsedRealtime() - mLastClickTime < OPTIONS_ITEM_CLICK_DELAY_TIME) { return true; diff --git a/omniNotes/src/main/java/it/feio/android/omninotes/CategoryActivity.java b/omniNotes/src/main/java/it/feio/android/omninotes/CategoryActivity.java index ebe9667451..c7d4a20a38 100644 --- a/omniNotes/src/main/java/it/feio/android/omninotes/CategoryActivity.java +++ b/omniNotes/src/main/java/it/feio/android/omninotes/CategoryActivity.java @@ -26,6 +26,7 @@ import android.os.Bundle; import android.text.TextUtils; import android.view.View; +import android.view.ViewGroup.LayoutParams; import android.view.Window; import android.view.WindowManager; @@ -89,7 +90,7 @@ private void resetWindowSize() { Window window = getWindow(); WindowManager.LayoutParams params = window.getAttributes(); params.width = (int) (screen.x * 0.6); - params.height = WindowManager.LayoutParams.WRAP_CONTENT; + params.height = LayoutParams.WRAP_CONTENT; window.setAttributes(params); } diff --git a/omniNotes/src/main/java/it/feio/android/omninotes/DetailFragment.java b/omniNotes/src/main/java/it/feio/android/omninotes/DetailFragment.java index 318b10c52d..564a5604a0 100644 --- a/omniNotes/src/main/java/it/feio/android/omninotes/DetailFragment.java +++ b/omniNotes/src/main/java/it/feio/android/omninotes/DetailFragment.java @@ -23,6 +23,7 @@ import static it.feio.android.omninotes.BaseActivity.TRANSITION_HORIZONTAL; import static it.feio.android.omninotes.BaseActivity.TRANSITION_VERTICAL; import static it.feio.android.omninotes.MainActivity.FRAGMENT_DETAIL_TAG; +import static it.feio.android.omninotes.MainActivity.FRAGMENT_SKETCH_TAG; import static it.feio.android.omninotes.OmniNotes.getAppContext; import static it.feio.android.omninotes.utils.ConstantsBase.ACTION_DISMISS; import static it.feio.android.omninotes.utils.ConstantsBase.ACTION_FAB_TAKE_PHOTO; @@ -149,6 +150,7 @@ import it.feio.android.omninotes.models.Category; import it.feio.android.omninotes.models.Note; import it.feio.android.omninotes.models.ONStyle; +import it.feio.android.omninotes.models.PasswordValidator.Result; import it.feio.android.omninotes.models.Tag; import it.feio.android.omninotes.models.adapters.AttachmentAdapter; import it.feio.android.omninotes.models.adapters.CategoryRecyclerViewAdapter; @@ -241,9 +243,9 @@ public class DetailFragment extends BaseFragment implements OnReminderPickedList private int contentCursorPosition; private ArrayList mergedNotesIds; private MainActivity mainActivity; - TextLinkClickListener textLinkClickListener = new TextLinkClickListener() { - @Override - public void onTextLinkClick(View view, final String clickedString, final String url) { + private boolean activityPausing; + + TextLinkClickListener textLinkClickListener = (view, clickedString, url) -> { new MaterialDialog.Builder(mainActivity) .content(clickedString) .negativeColorRes(R.color.colorPrimary) @@ -267,16 +269,15 @@ public void onTextLinkClick(View view, final String clickedString, final String clickedString); clipboard.setPrimaryClip(clip); }).build().show(); - View clickedView = noteTmp.isChecklist() ? toggleChecklistView : binding.contentWrapper; + View clickedView = + Boolean.TRUE.equals(noteTmp.isChecklist()) ? toggleChecklistView : binding.contentWrapper; clickedView.clearFocus(); KeyboardUtils.hideKeyboard(clickedView); new Handler().post(() -> { - View clickedView1 = noteTmp.isChecklist() ? toggleChecklistView : binding.contentWrapper; + View clickedView1 = Boolean.TRUE.equals(noteTmp.isChecklist()) ? toggleChecklistView : binding.contentWrapper; KeyboardUtils.hideKeyboard(clickedView1); }); - } }; - private boolean activityPausing; @Override public void onCreate(Bundle savedInstanceState) { @@ -419,7 +420,7 @@ private void init() { noteTmp = new Note(note); } - if (noteTmp.isLocked() && !noteTmp.isPasswordChecked()) { + if (Boolean.TRUE.equals(noteTmp.isLocked()) && !noteTmp.isPasswordChecked()) { checkNoteLock(noteTmp); return; } @@ -432,8 +433,8 @@ private void init() { */ private void checkNoteLock(Note note) { // If note is locked security password will be requested - if (note.isLocked() - && Prefs.getString(PREF_PASSWORD, null) != null + if (Boolean.TRUE.equals(note.isLocked() + && Prefs.getString(PREF_PASSWORD, null) != null) && !Prefs.getBoolean("settings_password_access", false)) { PasswordHelper.requestPassword(mainActivity, passwordConfirmed -> { switch (passwordConfirmed) { @@ -720,8 +721,7 @@ private void initViewAttachments() { mGridView = binding.detailRoot.findViewById(R.id.gridview); // Some fields can be filled by third party application and are always shown - mAttachmentAdapter = new AttachmentAdapter(mainActivity, noteTmp.getAttachmentsList(), - mGridView); + mAttachmentAdapter = new AttachmentAdapter(mainActivity, noteTmp.getAttachmentsList()); // Initialzation of gridview for images mGridView.setAdapter(mAttachmentAdapter); @@ -855,10 +855,7 @@ private void initViewTitle() { binding.detailTitle.gatherLinksForText(); binding.detailTitle.setOnTextLinkClickListener(textLinkClickListener); // To avoid dropping here the dragged checklist items - binding.detailTitle.setOnDragListener((v, event) -> { -// ((View)event.getLocalState()).setVisibility(View.VISIBLE); - return true; - }); + binding.detailTitle.setOnDragListener((v, event) -> true); //When editor action is pressed focus is moved to last character in content field binding.detailTitle.setOnEditorActionListener((v, actionId, event) -> { binding.fragmentDetailContent.detailContent.requestFocus(); @@ -954,6 +951,9 @@ public void onLocationUnavailable() { mainActivity.showMessage(R.string.location_not_found, ONStyle.ALERT); } + public void onLocationNotEnabled(){ + mainActivity.showMessage(R.string.location_not_enabled, ONStyle.ALERT); + } @Override public void onAddressResolved(String address) { if (TextUtils.isEmpty(address)) { @@ -1364,7 +1364,7 @@ private void takeSketch(Attachment attachment) { b.putParcelable("base", attachment.getUri()); } mSketchFragment.setArguments(b); - transaction.replace(R.id.fragment_container, mSketchFragment, mainActivity.FRAGMENT_SKETCH_TAG) + transaction.replace(R.id.fragment_container, mSketchFragment, FRAGMENT_SKETCH_TAG) .addToBackStack(FRAGMENT_DETAIL_TAG).commit(); } @@ -1632,7 +1632,7 @@ private String getNoteTitle() { private String getNoteContent() { String contentText = ""; - if (!noteTmp.isChecklist()) { + if (Boolean.FALSE.equals(noteTmp.isChecklist())) { // Due to checklist library introduction the returned EditText class is no more a // com.neopixl.pixlui.components.edittext.EditText but a standard android.widget.EditText View contentView = binding.detailRoot.findViewById(R.id.detail_content); @@ -1681,12 +1681,8 @@ private void lockNote() { // Password will be requested here PasswordHelper.requestPassword(mainActivity, passwordConfirmed -> { - switch (passwordConfirmed) { - case SUCCEED: - lockUnlock(); - break; - default: - break; + if (passwordConfirmed == Result.SUCCEED) { + lockUnlock(); } }); } @@ -1996,7 +1992,7 @@ private void removeAttachment(int position) { private void removeAllAttachments() { noteTmp.setAttachmentsList(new ArrayList<>()); - mAttachmentAdapter = new AttachmentAdapter(mainActivity, new ArrayList<>(), mGridView); + mAttachmentAdapter = new AttachmentAdapter(mainActivity, new ArrayList<>()); mGridView.invalidateViews(); mGridView.setAdapter(mAttachmentAdapter); } @@ -2049,7 +2045,7 @@ public void onCheckListChanged() { } private void scrollContent() { - if (noteTmp.isChecklist()) { + if (Boolean.TRUE.equals(noteTmp.isChecklist())) { if (mChecklistManager.getCount() > contentLineCounter) { binding.contentWrapper.scrollBy(0, 60); } @@ -2219,7 +2215,10 @@ public void onCoordinatesResolved(Location location, String address) { public void onLocationUnavailable() { mainActivityWeakReference.get().showMessage(R.string.location_not_found, ONStyle.ALERT); } - + @Override + public void onLocationNotEnabled(){ + mainActivityWeakReference.get().showMessage(R.string.location_not_enabled,ONStyle.ALERT); + } @Override public void onLocationRetrieved(Location location) { if (!checkWeakReferences()) { diff --git a/omniNotes/src/main/java/it/feio/android/omninotes/MainActivity.java b/omniNotes/src/main/java/it/feio/android/omninotes/MainActivity.java index 73295da489..1adda78800 100755 --- a/omniNotes/src/main/java/it/feio/android/omninotes/MainActivity.java +++ b/omniNotes/src/main/java/it/feio/android/omninotes/MainActivity.java @@ -387,7 +387,7 @@ private void handleIntents() { } if (ACTION_RESTART_APP.equals(i.getAction())) { - SystemHelper.restartApp(getApplicationContext(), MainActivity.class); + SystemHelper.restartApp(); } if (receivedIntent(i)) { diff --git a/omniNotes/src/main/java/it/feio/android/omninotes/SettingsFragment.java b/omniNotes/src/main/java/it/feio/android/omninotes/SettingsFragment.java index 3a04349f32..04150cd8ed 100644 --- a/omniNotes/src/main/java/it/feio/android/omninotes/SettingsFragment.java +++ b/omniNotes/src/main/java/it/feio/android/omninotes/SettingsFragment.java @@ -384,7 +384,7 @@ R.string.permission_external_storage, getActivity().findViewById(R.id.crouton_ha + languageName.substring(1)); lang.setOnPreferenceChangeListener((preference, value) -> { LanguageHelper.updateLanguage(getActivity(), value.toString()); - SystemHelper.restartApp(getActivity().getApplicationContext(), MainActivity.class); + SystemHelper.restartApp(); return false; }); } @@ -528,7 +528,7 @@ R.string.permission_external_storage, getActivity().findViewById(R.id.crouton_ha File cacheDir = StorageHelper.getCacheDir(getActivity()); StorageHelper.delete(getActivity(), cacheDir.getAbsolutePath()); Prefs.edit().clear().apply(); - SystemHelper.restartApp(getActivity().getApplicationContext(), MainActivity.class); + SystemHelper.restartApp(); }).build().show(); return false; diff --git a/omniNotes/src/main/java/it/feio/android/omninotes/SketchFragment.java b/omniNotes/src/main/java/it/feio/android/omninotes/SketchFragment.java index 90965b0f38..057efa2ed4 100644 --- a/omniNotes/src/main/java/it/feio/android/omninotes/SketchFragment.java +++ b/omniNotes/src/main/java/it/feio/android/omninotes/SketchFragment.java @@ -17,6 +17,8 @@ package it.feio.android.omninotes; +import static android.content.Context.LAYOUT_INFLATER_SERVICE; + import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; @@ -147,11 +149,11 @@ private void askForErase() { // Inflate the popup_layout.XML LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService( - AppCompatActivity.LAYOUT_INFLATER_SERVICE); + LAYOUT_INFLATER_SERVICE); popupLayout = inflater.inflate(R.layout.popup_sketch_stroke, null); // And the one for eraser LayoutInflater inflaterEraser = (LayoutInflater) getActivity().getSystemService( - AppCompatActivity.LAYOUT_INFLATER_SERVICE); + LAYOUT_INFLATER_SERVICE); popupEraserLayout = inflaterEraser.inflate(R.layout.popup_sketch_eraser, null); // Actual stroke shape size is retrieved diff --git a/omniNotes/src/main/java/it/feio/android/omninotes/async/AttachmentTask.java b/omniNotes/src/main/java/it/feio/android/omninotes/async/AttachmentTask.java index 42ad5cf7db..2b01444eb2 100644 --- a/omniNotes/src/main/java/it/feio/android/omninotes/async/AttachmentTask.java +++ b/omniNotes/src/main/java/it/feio/android/omninotes/async/AttachmentTask.java @@ -62,6 +62,7 @@ protected Attachment doInBackground(Void... params) { @Override + @Deprecated protected void onPostExecute(Attachment mAttachment) { if (isAlive()) { if (mAttachment != null) { diff --git a/omniNotes/src/main/java/it/feio/android/omninotes/async/CategoryMenuTask.java b/omniNotes/src/main/java/it/feio/android/omninotes/async/CategoryMenuTask.java index c8048c4fdf..bf8c011347 100644 --- a/omniNotes/src/main/java/it/feio/android/omninotes/async/CategoryMenuTask.java +++ b/omniNotes/src/main/java/it/feio/android/omninotes/async/CategoryMenuTask.java @@ -18,6 +18,7 @@ package it.feio.android.omninotes.async; import android.app.Activity; +import android.content.Context; import android.content.Intent; import android.os.AsyncTask; import android.view.LayoutInflater; @@ -59,7 +60,7 @@ protected void onPreExecute() { super.onPreExecute(); mDrawerList = mainActivity.findViewById(R.id.drawer_nav_list); LayoutInflater inflater = (LayoutInflater) mainActivity - .getSystemService(Activity.LAYOUT_INFLATER_SERVICE); + .getSystemService(Context.LAYOUT_INFLATER_SERVICE); settingsView = mainActivity.findViewById(R.id.settings_view); @@ -88,6 +89,7 @@ protected List doInBackground(Void... params) { @Override + @Deprecated protected void onPostExecute(final List categories) { if (isAlive()) { mDrawerCategoriesList.setAdapter(new CategoryBaseAdapter(mainActivity, categories, diff --git a/omniNotes/src/main/java/it/feio/android/omninotes/async/UpdateWidgetsTask.java b/omniNotes/src/main/java/it/feio/android/omninotes/async/UpdateWidgetsTask.java index 643cc2d7f2..08a5eb0973 100644 --- a/omniNotes/src/main/java/it/feio/android/omninotes/async/UpdateWidgetsTask.java +++ b/omniNotes/src/main/java/it/feio/android/omninotes/async/UpdateWidgetsTask.java @@ -22,13 +22,14 @@ import de.greenrobot.event.EventBus; import it.feio.android.omninotes.BaseActivity; import it.feio.android.omninotes.async.bus.NotesUpdatedEvent; +import java.lang.ref.WeakReference; public class UpdateWidgetsTask extends AsyncTask { - private Context context; + private WeakReference context; public UpdateWidgetsTask(Context context) { - this.context = context; + this.context = new WeakReference<>(context); } @Override @@ -44,7 +45,7 @@ class WidgetUpdateSubscriber { } public void onEvent(NotesUpdatedEvent event) { - BaseActivity.notifyAppWidgets(context); + BaseActivity.notifyAppWidgets(context.get()); EventBus.getDefault().unregister(this); } } diff --git a/omniNotes/src/main/java/it/feio/android/omninotes/db/DbHelper.java b/omniNotes/src/main/java/it/feio/android/omninotes/db/DbHelper.java index f039bde87a..8d53b2cda9 100644 --- a/omniNotes/src/main/java/it/feio/android/omninotes/db/DbHelper.java +++ b/omniNotes/src/main/java/it/feio/android/omninotes/db/DbHelper.java @@ -59,6 +59,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Map.Entry; import java.util.Objects; import java.util.regex.Pattern; @@ -642,7 +643,7 @@ public List getTodayReminders() { /** * Retrieves all attachments related to specific note */ - public ArrayList getNoteAttachments(Note note) { + public List getNoteAttachments(Note note) { String whereCondition = " WHERE " + KEY_ATTACHMENT_NOTE_ID + " = " + note.get_id(); return getAttachments(whereCondition); } @@ -706,7 +707,7 @@ public List getTags(Note note) { List notesRetrieved = getNotes(whereCondition, true); for (Note noteRetrieved : notesRetrieved) { - HashMap tagsRetrieved = TagsHelper.retrieveTags(noteRetrieved); + Map tagsRetrieved = TagsHelper.retrieveTags(noteRetrieved); for (String s : tagsRetrieved.keySet()) { int count = tagsMap.get(s) == null ? 0 : tagsMap.get(s); tagsMap.put(s, ++count); @@ -766,7 +767,7 @@ public List getNotesByTag(String[] tags) { }).toBlocking().single(); return matches ? note : null; }) - .filter(Objects::nonNull) + .filter(o -> o != null) .toList().toBlocking().single(); } @@ -817,7 +818,7 @@ public ArrayList getAttachments(String whereCondition) { do { var attachment = new Attachment(cursor.getLong(0), Uri.parse(cursor.getString(1)), cursor.getString(2), cursor.getInt(3), - (long) cursor.getInt(4), cursor.getString(5)); + cursor.getInt(4), cursor.getString(5)); attachment.setNoteId(cursor.getLong(6)); attachmentsList.add(attachment); } while (cursor.moveToNext()); @@ -991,7 +992,7 @@ public Stats getStats() { int chars; List notes = getAllNotes(false); for (Note note : notes) { - if (note.isTrashed()) { + if (Boolean.TRUE.equals(note.isTrashed())) { notesTrashed++; } else if (note.isArchived()) { notesArchived++; @@ -1005,10 +1006,10 @@ public Stats getStats() { reminders++; } } - if (note.isChecklist()) { + if (Boolean.TRUE.equals(note.isChecklist())) { checklists++; } - if (note.isLocked()) { + if (Boolean.TRUE.equals(note.isLocked())) { notesMasked++; } tags += TagsHelper.retrieveTags(note).size(); diff --git a/omniNotes/src/main/java/it/feio/android/omninotes/helpers/BackupHelper.java b/omniNotes/src/main/java/it/feio/android/omninotes/helpers/BackupHelper.java index ac0267bd29..8167742a68 100644 --- a/omniNotes/src/main/java/it/feio/android/omninotes/helpers/BackupHelper.java +++ b/omniNotes/src/main/java/it/feio/android/omninotes/helpers/BackupHelper.java @@ -261,7 +261,7 @@ public static void deleteNote(File file) { * * @deprecated {@link BackupHelper#importNotes(DocumentFileCompat)} */ - @Deprecated + @Deprecated(forRemoval = true) public static void importDB(Context context, File backupDir) throws IOException { File database = context.getDatabasePath(DATABASE_NAME); if (database.exists() && database.delete()) { diff --git a/omniNotes/src/main/java/it/feio/android/omninotes/helpers/GeocodeProviderBaseFactory.java b/omniNotes/src/main/java/it/feio/android/omninotes/helpers/GeocodeProviderBaseFactory.java index 49cde5f531..c3c5756dcb 100644 --- a/omniNotes/src/main/java/it/feio/android/omninotes/helpers/GeocodeProviderBaseFactory.java +++ b/omniNotes/src/main/java/it/feio/android/omninotes/helpers/GeocodeProviderBaseFactory.java @@ -35,9 +35,7 @@ protected GeocodeProviderBaseFactory() { } public static LocationProvider getProvider(Context context) { - if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT - && android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.P - && checkHighAccuracyLocationProvider(context)) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P && checkHighAccuracyLocationProvider(context)) { Toast.makeText(context, R.string.location_set_high_accuracy, Toast.LENGTH_SHORT).show(); context.startActivity((new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS))); } diff --git a/omniNotes/src/main/java/it/feio/android/omninotes/helpers/count/WordCounter.java b/omniNotes/src/main/java/it/feio/android/omninotes/helpers/count/WordCounter.java index 9be0c63bc3..06caf97e64 100644 --- a/omniNotes/src/main/java/it/feio/android/omninotes/helpers/count/WordCounter.java +++ b/omniNotes/src/main/java/it/feio/android/omninotes/helpers/count/WordCounter.java @@ -27,7 +27,7 @@ public interface WordCounter { int countChars(Note note); default String sanitizeTextForWordsAndCharsCount(Note note, String field) { - if (note.isChecklist()) { + if (Boolean.TRUE.equals(note.isChecklist())) { String regex = "(" + Pattern.quote(it.feio.android.checklistview.interfaces.Constants.CHECKED_SYM) + "|" + Pattern.quote(it.feio.android.checklistview.interfaces.Constants.UNCHECKED_SYM) diff --git a/omniNotes/src/main/java/it/feio/android/omninotes/models/Stats.java b/omniNotes/src/main/java/it/feio/android/omninotes/models/Stats.java index 59cf330b5e..1ccae8a99e 100644 --- a/omniNotes/src/main/java/it/feio/android/omninotes/models/Stats.java +++ b/omniNotes/src/main/java/it/feio/android/omninotes/models/Stats.java @@ -122,31 +122,37 @@ public void setCategories(int categories) { } + @Override public int getTags() { return tags; } + @Override public void setTags(int tags) { this.tags = tags; } + @Override public int getWords() { return words; } + @Override public void setWords(int words) { this.words = words; } + @Override public int getChars() { return chars; } + @Override public void setChars(int chars) { this.chars = chars; } diff --git a/omniNotes/src/main/java/it/feio/android/omninotes/models/adapters/AttachmentAdapter.java b/omniNotes/src/main/java/it/feio/android/omninotes/models/adapters/AttachmentAdapter.java index 585c917853..3f1602d6a0 100644 --- a/omniNotes/src/main/java/it/feio/android/omninotes/models/adapters/AttachmentAdapter.java +++ b/omniNotes/src/main/java/it/feio/android/omninotes/models/adapters/AttachmentAdapter.java @@ -43,13 +43,12 @@ public class AttachmentAdapter extends BaseAdapter { - private Activity mActivity; - private List attachmentsList; - private LayoutInflater inflater; + private final Activity mActivity; + private final List attachmentsList; + private final LayoutInflater inflater; - public AttachmentAdapter(Activity mActivity, List attachmentsList, - ExpandableHeightGridView mGridView) { + public AttachmentAdapter(Activity mActivity, List attachmentsList) { this.mActivity = mActivity; if (attachmentsList == null) { attachmentsList = Collections.emptyList(); @@ -58,22 +57,18 @@ public AttachmentAdapter(Activity mActivity, List attachmentsList, inflater = (LayoutInflater) mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } - public int getCount() { return attachmentsList.size(); } - public Attachment getItem(int position) { return attachmentsList.get(position); } - public long getItemId(int position) { return 0; } - public View getView(int position, View convertView, ViewGroup parent) { LogDelegate.v("GridView called for position " + position); @@ -129,17 +124,13 @@ public View getView(int position, View convertView, ViewGroup parent) { return convertView; } - public List getAttachmentsList() { return attachmentsList; } - public class AttachmentHolder { - TextView text; SquareImageView image; } - } diff --git a/omniNotes/src/main/java/it/feio/android/omninotes/models/misc/DynamicNavigationLookupTable.java b/omniNotes/src/main/java/it/feio/android/omninotes/models/misc/DynamicNavigationLookupTable.java index f4222ed38f..8c3549c681 100644 --- a/omniNotes/src/main/java/it/feio/android/omninotes/models/misc/DynamicNavigationLookupTable.java +++ b/omniNotes/src/main/java/it/feio/android/omninotes/models/misc/DynamicNavigationLookupTable.java @@ -55,9 +55,9 @@ public void update() { archived = trashed = uncategorized = reminders = 0; List notes = DbHelper.getInstance().getAllNotes(false); for (int i = 0; i < notes.size(); i++) { - if (notes.get(i).isTrashed()) { + if (Boolean.TRUE.equals(notes.get(i).isTrashed())) { trashed++; - } else if (notes.get(i).isArchived()) { + } else if (Boolean.TRUE.equals(notes.get(i).isArchived())) { archived++; } else if (notes.get(i).getAlarm() != null) { reminders++; diff --git a/omniNotes/src/main/java/it/feio/android/omninotes/models/views/Fab.java b/omniNotes/src/main/java/it/feio/android/omninotes/models/views/Fab.java index b4daec6790..12d91e46fe 100644 --- a/omniNotes/src/main/java/it/feio/android/omninotes/models/views/Fab.java +++ b/omniNotes/src/main/java/it/feio/android/omninotes/models/views/Fab.java @@ -77,6 +77,7 @@ private void init() { }); recyclerView.addOnScrollListener( new RecyclerView.OnScrollListener() { + @Override public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { if (dy > 0) { hideFab(); @@ -99,12 +100,7 @@ public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { } } - private final View.OnClickListener onClickListener = new View.OnClickListener() { - @Override - public void onClick(View v) { - onFabItemClickedListener.onFabItemClick(v.getId()); - } - }; + private final View.OnClickListener onClickListener = v -> onFabItemClickedListener.onFabItemClick(v.getId()); public void performToggle() { fabExpanded = !fabExpanded; diff --git a/omniNotes/src/main/java/it/feio/android/omninotes/models/views/SquareImageView.java b/omniNotes/src/main/java/it/feio/android/omninotes/models/views/SquareImageView.java index 48a20e49d6..7472f1462d 100644 --- a/omniNotes/src/main/java/it/feio/android/omninotes/models/views/SquareImageView.java +++ b/omniNotes/src/main/java/it/feio/android/omninotes/models/views/SquareImageView.java @@ -20,11 +20,11 @@ import android.content.Context; import android.os.AsyncTask; import android.util.AttributeSet; -import android.widget.ImageView; +import androidx.appcompat.widget.AppCompatImageView; import java.lang.ref.WeakReference; -public class SquareImageView extends ImageView { +public class SquareImageView extends AppCompatImageView { private WeakReference> mAsyncTaskReference; @@ -53,7 +53,7 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { public void setAsyncTask(AsyncTask mAsyncTask) { - this.mAsyncTaskReference = new WeakReference>(mAsyncTask); + this.mAsyncTaskReference = new WeakReference<>(mAsyncTask); } diff --git a/omniNotes/src/main/java/it/feio/android/omninotes/utils/GeocodeHelper.java b/omniNotes/src/main/java/it/feio/android/omninotes/utils/GeocodeHelper.java index 0e0ea8d97e..eca3a8fb69 100644 --- a/omniNotes/src/main/java/it/feio/android/omninotes/utils/GeocodeHelper.java +++ b/omniNotes/src/main/java/it/feio/android/omninotes/utils/GeocodeHelper.java @@ -18,6 +18,7 @@ package it.feio.android.omninotes.utils; import static it.feio.android.omninotes.BuildConfig.MAPS_API_KEY; +import static it.feio.android.omninotes.helpers.GeocodeProviderBaseFactory.checkHighAccuracyLocationProvider; import static it.feio.android.omninotes.helpers.GeocodeProviderBaseFactory.getProvider; import android.content.Context; @@ -66,6 +67,7 @@ public void onLocationChanged(Location newLocation) { @Override + @Deprecated public void onStatusChanged(String provider, int status, Bundle extras) { // Nothing to do } diff --git a/omniNotes/src/main/java/it/feio/android/omninotes/utils/StorageHelper.java b/omniNotes/src/main/java/it/feio/android/omninotes/utils/StorageHelper.java index f2be33ac43..aeb1a272e6 100644 --- a/omniNotes/src/main/java/it/feio/android/omninotes/utils/StorageHelper.java +++ b/omniNotes/src/main/java/it/feio/android/omninotes/utils/StorageHelper.java @@ -16,6 +16,12 @@ */ package it.feio.android.omninotes.utils; +import static android.os.Environment.DIRECTORY_DOWNLOADS; +import static it.feio.android.omninotes.utils.ConstantsBase.MIME_TYPE_AUDIO; +import static it.feio.android.omninotes.utils.ConstantsBase.MIME_TYPE_FILES; +import static it.feio.android.omninotes.utils.ConstantsBase.MIME_TYPE_IMAGE; +import static it.feio.android.omninotes.utils.ConstantsBase.MIME_TYPE_VIDEO; + import android.content.ContentResolver; import android.content.Context; import android.database.Cursor; @@ -78,10 +84,7 @@ public static boolean checkStorage() { public static String getStorageDir() { - // return Environment.getExternalStorageDirectory() + File.separator + - // Constants.TAG + File.separator; - return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) - .toString(); + return Environment.getExternalStoragePublicDirectory(DIRECTORY_DOWNLOADS).toString(); } @@ -402,24 +405,23 @@ public static String getMimeType(String url) { */ public static String getMimeTypeInternal(Context mContext, Uri uri) { String mimeType = getMimeType(mContext, uri); - mimeType = getMimeTypeInternal(mContext, mimeType); - return mimeType; + return getMimeTypeInternal(mimeType); } /** * Retrieves mime-type between the ones managed by application from given string */ - public static String getMimeTypeInternal(Context mContext, String mimeType) { + public static String getMimeTypeInternal(String mimeType) { if (mimeType != null) { if (mimeType.contains("image/")) { - mimeType = Constants.MIME_TYPE_IMAGE; + mimeType = MIME_TYPE_IMAGE; } else if (mimeType.contains("audio/")) { - mimeType = Constants.MIME_TYPE_AUDIO; + mimeType = MIME_TYPE_AUDIO; } else if (mimeType.contains("video/")) { - mimeType = Constants.MIME_TYPE_VIDEO; + mimeType = MIME_TYPE_VIDEO; } else { - mimeType = Constants.MIME_TYPE_FILES; + mimeType = MIME_TYPE_FILES; } } return mimeType; diff --git a/omniNotes/src/main/java/it/feio/android/omninotes/utils/SystemHelper.java b/omniNotes/src/main/java/it/feio/android/omninotes/utils/SystemHelper.java index 2e848a7200..4c1ae8215c 100644 --- a/omniNotes/src/main/java/it/feio/android/omninotes/utils/SystemHelper.java +++ b/omniNotes/src/main/java/it/feio/android/omninotes/utils/SystemHelper.java @@ -17,29 +17,25 @@ package it.feio.android.omninotes.utils; +import static android.content.Context.CLIPBOARD_SERVICE; + import android.app.Activity; import android.content.Context; import it.feio.android.omninotes.helpers.LogDelegate; import java.io.Closeable; import java.io.IOException; +import lombok.experimental.UtilityClass; /** * Various utility methods */ +@UtilityClass public class SystemHelper { /** * Performs a full app restart */ - public static void restartApp(final Context mContext, Class activityClass) { -// Intent intent = new Intent(mContext, activityClass); -// intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); -// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); -// int mPendingIntentId = Long.valueOf(Calendar.getInstance().getTimeInMillis()).intValue(); -// PendingIntent mPendingIntent = PendingIntent.getActivity(mContext, mPendingIntentId, intent, -// PendingIntent.FLAG_CANCEL_CURRENT); -// AlarmManager mgr = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); -// mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent); + public static void restartApp() { System.exit(0); } @@ -63,8 +59,7 @@ public static void closeCloseable(Closeable... closeables) { public static void copyToClipboard(Context context, String text) { android.content.ClipboardManager clipboard = (android.content.ClipboardManager) context - .getSystemService( - Activity.CLIPBOARD_SERVICE); + .getSystemService(CLIPBOARD_SERVICE); android.content.ClipData clip = android.content.ClipData.newPlainText("text label", text); clipboard.setPrimaryClip(clip); } diff --git a/omniNotes/src/main/java/it/feio/android/omninotes/utils/TagsHelper.java b/omniNotes/src/main/java/it/feio/android/omninotes/utils/TagsHelper.java index 865a018ed9..567d1dcb74 100644 --- a/omniNotes/src/main/java/it/feio/android/omninotes/utils/TagsHelper.java +++ b/omniNotes/src/main/java/it/feio/android/omninotes/utils/TagsHelper.java @@ -29,9 +29,12 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; +import lombok.experimental.UtilityClass; import org.apache.commons.lang3.StringUtils; +@UtilityClass public class TagsHelper { @@ -40,7 +43,7 @@ public static List getAllTags() { } - public static HashMap retrieveTags(Note note) { + public static Map retrieveTags(Note note) { HashMap tagsMap = new HashMap<>(); String[] words = (note.getTitle() + " " + note.getContent()).replaceAll("\n", " ").trim() .split(" "); @@ -58,7 +61,7 @@ public static Pair> addTagToNote(List tags, Integer[] sel Note note) { StringBuilder sbTags = new StringBuilder(); List tagsToRemove = new ArrayList<>(); - HashMap tagsMap = retrieveTags(note); + Map tagsMap = retrieveTags(note); List selectedTagsList = Arrays.asList(selectedTags); for (int i = 0; i < tags.size(); i++) { @@ -78,7 +81,7 @@ public static Pair> addTagToNote(List tags, Integer[] sel return Pair.create(sbTags.toString(), tagsToRemove); } - private static boolean mapContainsTag(HashMap tagsMap, Tag tag) { + private static boolean mapContainsTag(Map tagsMap, Tag tag) { for (String tagsMapItem : tagsMap.keySet()) { if (tagsMapItem.equals(tag.getText())) { return true; diff --git a/omniNotes/src/main/java/it/feio/android/omninotes/utils/TextHelper.java b/omniNotes/src/main/java/it/feio/android/omninotes/utils/TextHelper.java index 1287c10d49..d58cb48461 100644 --- a/omniNotes/src/main/java/it/feio/android/omninotes/utils/TextHelper.java +++ b/omniNotes/src/main/java/it/feio/android/omninotes/utils/TextHelper.java @@ -37,13 +37,13 @@ import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; +import lombok.experimental.UtilityClass; +@UtilityClass public class TextHelper { - /** - * - */ + public static Spanned[] parseTitleAndContent(Context mContext, Note note) { final int CONTENT_SUBSTRING_LENGTH = 300; @@ -52,7 +52,7 @@ public static Spanned[] parseTitleAndContent(Context mContext, Note note) { String contentText = limit(note.getContent().trim(), CONTENT_SUBSTRING_LENGTH, false, true); // Masking title and content string if note is locked - if (note.isLocked() && !Prefs.getBoolean( + if (Boolean.TRUE.equals(note.isLocked()) && !Prefs.getBoolean( "settings_password_access", false)) { // This checks if a part of content is used as title and should be partially masked if (!note.getTitle().equals(titleText) && titleText.length() > 3) { @@ -63,7 +63,7 @@ public static Spanned[] parseTitleAndContent(Context mContext, Note note) { // Replacing checkmarks symbols with html entities Spanned contentSpanned; - if (note.isChecklist() && !TextUtils.isEmpty(contentText)) { + if (Boolean.TRUE.equals(Boolean.TRUE.equals(note.isChecklist())) && !TextUtils.isEmpty(contentText)) { contentSpanned = Html.fromHtml(contentText .replace(CHECKED_SYM, CHECKED_ENTITY) .replace(UNCHECKED_SYM, UNCHECKED_ENTITY) diff --git a/omniNotes/src/main/java/it/feio/android/omninotes/utils/date/SublimePickerFragment.java b/omniNotes/src/main/java/it/feio/android/omninotes/utils/date/SublimePickerFragment.java index d9d3b4fd78..73a5798997 100644 --- a/omniNotes/src/main/java/it/feio/android/omninotes/utils/date/SublimePickerFragment.java +++ b/omniNotes/src/main/java/it/feio/android/omninotes/utils/date/SublimePickerFragment.java @@ -21,6 +21,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.DialogFragment; import com.appeaser.sublimepickerlibrary.SublimePicker; @@ -35,8 +36,8 @@ public class SublimePickerFragment extends DialogFragment { - public static final String DEFAULT_TIME = "default_time"; - DateFormat mDateFormatter, mTimeFormatter; + DateFormat mDateFormatter; + DateFormat mTimeFormatter; SublimePicker mSublimePicker; @@ -77,7 +78,7 @@ public void setCallback(Callback callback) { @Nullable @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mSublimePicker = (SublimePicker) getActivity().getLayoutInflater() .inflate(R.layout.sublime_picker, container); diff --git a/omniNotes/src/main/java/it/feio/android/omninotes/widget/WidgetProvider.java b/omniNotes/src/main/java/it/feio/android/omninotes/widget/WidgetProvider.java index 145179e506..7036796f09 100644 --- a/omniNotes/src/main/java/it/feio/android/omninotes/widget/WidgetProvider.java +++ b/omniNotes/src/main/java/it/feio/android/omninotes/widget/WidgetProvider.java @@ -114,7 +114,7 @@ private void setLayout(Context context, AppWidgetManager appWidgetManager, int w } - abstract protected RemoteViews getRemoteViews(Context context, int widgetId, boolean isSmall, + protected abstract RemoteViews getRemoteViews(Context context, int widgetId, boolean isSmall, boolean isSingleLine, SparseArray pendingIntentsMap); diff --git a/omniNotes/src/test/java/it/feio/android/omninotes/utils/TagsHelperTest.java b/omniNotes/src/test/java/it/feio/android/omninotes/utils/TagsHelperTest.java index 22c817a796..ad459d662d 100644 --- a/omniNotes/src/test/java/it/feio/android/omninotes/utils/TagsHelperTest.java +++ b/omniNotes/src/test/java/it/feio/android/omninotes/utils/TagsHelperTest.java @@ -28,7 +28,7 @@ import it.feio.android.omninotes.models.Tag; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; +import java.util.Map; import java.util.List; import org.junit.Before; import org.junit.Test; @@ -55,18 +55,17 @@ public void setup() { @Test public void retrievesTagsFromNote() { - HashMap tags = TagsHelper.retrieveTags(note); - assertEquals(tags.size(), 4); - assertTrue(tags.containsKey(TAG1.getText()) && tags.containsKey(TAG2.getText()) && tags - .containsKey(TAG3.getText()) - && tags.containsKey(TAG4.getText())); + Map tags = TagsHelper.retrieveTags(note); + assertEquals(4, tags.size()); + assertTrue(tags.containsKey(TAG1.getText()) && tags.containsKey(TAG2.getText()) + && tags.containsKey(TAG3.getText()) && tags.containsKey(TAG4.getText())); assertFalse(tags.containsKey(TAG_INVALID.getText())); } @Test public void retrievesTagsFromNoteMultilanguage() { note.setContent("#привет"); - HashMap tags = TagsHelper.retrieveTags(note); + Map tags = TagsHelper.retrieveTags(note); assertTrue(tags.containsKey("#привет")); note.setContent("#中华人民共和国"); @@ -86,7 +85,7 @@ public void getPreselectedTagsArray() { Integer[] preselectedTags = TagsHelper.getPreselectedTagsArray(notes, tags); - assertEquals(preselectedTags.length, 4); + assertEquals(4, preselectedTags.length); for (Integer preselectedTag : preselectedTags) { assertNotEquals((int) preselectedTag, tags.indexOf(TAG4)); } @@ -99,7 +98,7 @@ public void removesTags_noteCheck() { note.setTitle(title); note.setContent(content); - HashMap tags = TagsHelper.retrieveTags(note); + Map tags = TagsHelper.retrieveTags(note); assertTrue(tags.containsKey(TAG1.getText())); assertTrue(tags.containsKey(TAG2.getText())); @@ -124,7 +123,7 @@ public void TestTagWithComma() { List tags = new ArrayList<>(); tags.add(new Tag(newTag, 1)); Pair> newTags = TagsHelper.addTagToNote(tags, new Integer[]{0, 1}, note); - HashMap tags1 = TagsHelper.retrieveTags(note); + Map tags1 = TagsHelper.retrieveTags(note); assertTrue(newTags.first.contains(newTag)); assertFalse(tags1.containsKey(newTag)); } From 6f7e2ccb15dcb03e7e0bdcab0cee3744bc6c9c33 Mon Sep 17 00:00:00 2001 From: Federico Iosue Date: Wed, 31 May 2023 01:49:12 +0200 Subject: [PATCH 2/6] Removed duplicated test class left after Kotlin conversion --- .../android/omninotes/utils/SecurityTest.java | 65 ------------------- 1 file changed, 65 deletions(-) delete mode 100644 omniNotes/src/androidTest/java/it/feio/android/omninotes/utils/SecurityTest.java diff --git a/omniNotes/src/androidTest/java/it/feio/android/omninotes/utils/SecurityTest.java b/omniNotes/src/androidTest/java/it/feio/android/omninotes/utils/SecurityTest.java deleted file mode 100644 index a9944572b2..0000000000 --- a/omniNotes/src/androidTest/java/it/feio/android/omninotes/utils/SecurityTest.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2013-2023 Federico Iosue (federico@iosue.it) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package it.feio.android.omninotes.utils; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotEquals; - -import androidx.test.ext.junit.runners.AndroidJUnit4; -import it.feio.android.omninotes.testutils.BaseAndroidTestCase; -import org.junit.Test; -import org.junit.runner.RunWith; - - -@RunWith(AndroidJUnit4.class) -public class SecurityTest extends BaseAndroidTestCase { - - private final String PASS = "12345uselessPasswords"; - private final String TEXT = "Today is a - good - day to test useless things!"; - private final String LOREM = - "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor" - + " incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco" - + " laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit " - + "esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa " - + "qui officia deserunt mollit anim ID est laborum."; - - @Test - public void checkUtilityClassWellDefined() throws Exception { - assertUtilityClassWellDefined(Security.class); - } - - @Test - public void testEncrypt() { - String encryptedText = Security.encrypt(TEXT, PASS); - assertNotEquals(TEXT, encryptedText); - } - - @Test - public void testDecrypt() { - String encryptedText = Security.encrypt(TEXT, PASS); - assertEquals(TEXT, Security.decrypt(encryptedText, PASS)); - assertNotEquals(TEXT, Security.decrypt(encryptedText, "zaza" + PASS)); - } - - @Test - public void testDecryptUnencrypted() { - String result = Security.decrypt(LOREM, PASS); - assertNotEquals(0, result.length()); - } -} From 351062129286366579ad7b28feb838686398a438 Mon Sep 17 00:00:00 2001 From: Dries Date: Sun, 28 May 2023 14:30:50 +0200 Subject: [PATCH 3/6] when location not enabled show different message --- .../java/it/feio/android/omninotes/DetailFragment.java | 10 ++++++++++ .../models/listeners/OnGeoUtilResultListener.java | 1 + .../it/feio/android/omninotes/utils/GeocodeHelper.java | 6 +++++- omniNotes/src/main/res/values/strings.xml | 1 + 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/omniNotes/src/main/java/it/feio/android/omninotes/DetailFragment.java b/omniNotes/src/main/java/it/feio/android/omninotes/DetailFragment.java index 564a5604a0..28f6dac763 100644 --- a/omniNotes/src/main/java/it/feio/android/omninotes/DetailFragment.java +++ b/omniNotes/src/main/java/it/feio/android/omninotes/DetailFragment.java @@ -25,6 +25,8 @@ import static it.feio.android.omninotes.MainActivity.FRAGMENT_DETAIL_TAG; import static it.feio.android.omninotes.MainActivity.FRAGMENT_SKETCH_TAG; import static it.feio.android.omninotes.OmniNotes.getAppContext; +import static it.feio.android.omninotes.helpers.GeocodeProviderBaseFactory.checkHighAccuracyLocationProvider; +import static it.feio.android.omninotes.helpers.GeocodeProviderBaseFactory.getProvider; import static it.feio.android.omninotes.utils.ConstantsBase.ACTION_DISMISS; import static it.feio.android.omninotes.utils.ConstantsBase.ACTION_FAB_TAKE_PHOTO; import static it.feio.android.omninotes.utils.ConstantsBase.ACTION_MERGE; @@ -117,11 +119,19 @@ import androidx.fragment.app.FragmentTransaction; import com.afollestad.materialdialogs.DialogAction; import com.afollestad.materialdialogs.MaterialDialog; +import com.google.android.gms.common.api.GoogleApiClient; +import com.google.android.gms.common.api.PendingResult; +import com.google.android.gms.location.LocationRequest; +import com.google.android.gms.location.LocationServices; +import com.google.android.gms.location.LocationSettingsRequest; +import com.google.android.gms.location.LocationSettingsResult; +import com.google.android.gms.tasks.Task; import com.neopixl.pixlui.components.edittext.EditText; import com.pixplicity.easyprefs.library.Prefs; import com.pushbullet.android.extension.MessagingExtension; import de.greenrobot.event.EventBus; import de.keyboardsurfer.android.widget.crouton.Style; +import io.nlopez.smartlocation.location.LocationProvider; import it.feio.android.checklistview.exceptions.ViewNotSupportedException; import it.feio.android.checklistview.interfaces.CheckListChangedListener; import it.feio.android.checklistview.models.CheckListView; diff --git a/omniNotes/src/main/java/it/feio/android/omninotes/models/listeners/OnGeoUtilResultListener.java b/omniNotes/src/main/java/it/feio/android/omninotes/models/listeners/OnGeoUtilResultListener.java index 58b0e95e9b..6e60a0c4a7 100644 --- a/omniNotes/src/main/java/it/feio/android/omninotes/models/listeners/OnGeoUtilResultListener.java +++ b/omniNotes/src/main/java/it/feio/android/omninotes/models/listeners/OnGeoUtilResultListener.java @@ -30,4 +30,5 @@ public interface OnGeoUtilResultListener { void onLocationRetrieved(Location location); void onLocationUnavailable(); + void onLocationNotEnabled(); } diff --git a/omniNotes/src/main/java/it/feio/android/omninotes/utils/GeocodeHelper.java b/omniNotes/src/main/java/it/feio/android/omninotes/utils/GeocodeHelper.java index eca3a8fb69..4aad231f75 100644 --- a/omniNotes/src/main/java/it/feio/android/omninotes/utils/GeocodeHelper.java +++ b/omniNotes/src/main/java/it/feio/android/omninotes/utils/GeocodeHelper.java @@ -105,7 +105,11 @@ public void onCompleted() { @Override public void onError(Throwable e) { - onGeoUtilResultListener.onLocationUnavailable(); + if(checkHighAccuracyLocationProvider(OmniNotes.getAppContext()) == true) { + onGeoUtilResultListener.onLocationUnavailable(); + }else{ + onGeoUtilResultListener.onLocationNotEnabled(); + } unsubscribe(); } }); diff --git a/omniNotes/src/main/res/values/strings.xml b/omniNotes/src/main/res/values/strings.xml index f816b3b9c5..e07f2f51e8 100644 --- a/omniNotes/src/main/res/values/strings.xml +++ b/omniNotes/src/main/res/values/strings.xml @@ -440,5 +440,6 @@ Notifications for notes\' reminders Pinned Notifications for pinned notes + Device location turned off From 4da24a5e12abd868033ce5378195859f0d15f92e Mon Sep 17 00:00:00 2001 From: Federico Iosue Date: Wed, 31 May 2023 15:59:35 +0200 Subject: [PATCH 4/6] Dirty fix for missing main menu items but migration to Binding should be done --- .../android/omninotes/async/MainMenuTask.java | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/omniNotes/src/main/java/it/feio/android/omninotes/async/MainMenuTask.java b/omniNotes/src/main/java/it/feio/android/omninotes/async/MainMenuTask.java index 2dbcb103dc..90ecf479d5 100644 --- a/omniNotes/src/main/java/it/feio/android/omninotes/async/MainMenuTask.java +++ b/omniNotes/src/main/java/it/feio/android/omninotes/async/MainMenuTask.java @@ -29,10 +29,10 @@ import it.feio.android.omninotes.MainActivity; import it.feio.android.omninotes.R; import it.feio.android.omninotes.async.bus.NavigationUpdatedEvent; -import it.feio.android.omninotes.databinding.FragmentNavigationDrawerBinding; import it.feio.android.omninotes.models.NavigationItem; import it.feio.android.omninotes.models.adapters.NavDrawerAdapter; import it.feio.android.omninotes.models.misc.DynamicNavigationLookupTable; +import it.feio.android.omninotes.models.views.NonScrollableListView; import it.feio.android.omninotes.utils.Navigation; import java.lang.ref.WeakReference; import java.util.ArrayList; @@ -42,14 +42,13 @@ public class MainMenuTask extends AsyncTask> { private final WeakReference fragmentWeakReference; - private final MainActivity mainActivity; + private final WeakReference mainActivity; + private NonScrollableListView navDrawer; - FragmentNavigationDrawerBinding navDrawer; public MainMenuTask(Fragment fragment) { fragmentWeakReference = new WeakReference<>(fragment); - mainActivity = (MainActivity) fragment.getActivity(); - navDrawer = FragmentNavigationDrawerBinding.inflate(fragment.getLayoutInflater()); + mainActivity = new WeakReference<>((MainActivity) fragment.getActivity()); } @Override @@ -59,24 +58,25 @@ protected List doInBackground(Void... params) { @Override protected void onPostExecute(final List items) { + navDrawer = mainActivity.get().findViewById(R.id.drawer_nav_list); if (isAlive()) { - navDrawer.drawerNavList.setAdapter(new NavDrawerAdapter(mainActivity, items)); - navDrawer.drawerNavList.setOnItemClickListener((arg0, arg1, position, arg3) -> { + navDrawer.setAdapter(new NavDrawerAdapter(mainActivity.get(), items)); + navDrawer.setOnItemClickListener((arg0, arg1, position, arg3) -> { String navigation = fragmentWeakReference.get().getResources().getStringArray(R.array .navigation_list_codes)[items.get(position).getArrayIndex()]; updateNavigation(position, navigation); }); - navDrawer.drawerNavList.justifyListViewHeightBasedOnChildren(); + navDrawer.justifyListViewHeightBasedOnChildren(); } } private void updateNavigation(int position, String navigation) { - if (mainActivity.updateNavigation(navigation)) { - navDrawer.drawerNavList.setItemChecked(position, true); - navDrawer.drawerTagList.setItemChecked(0, false); // Called to force redraw - mainActivity.getIntent().setAction(Intent.ACTION_MAIN); + if (mainActivity.get().updateNavigation(navigation)) { + navDrawer.setItemChecked(position, true); + navDrawer.setItemChecked(0, false); // Called to force redraw + mainActivity.get().getIntent().setAction(Intent.ACTION_MAIN); EventBus.getDefault() - .post(new NavigationUpdatedEvent(navDrawer.drawerNavList.getItemAtPosition(position))); + .post(new NavigationUpdatedEvent(navDrawer.getItemAtPosition(position))); } } @@ -92,10 +92,10 @@ private List buildMainMenu() { return new ArrayList<>(); } - String[] mNavigationArray = mainActivity.getResources().getStringArray(R.array.navigation_list); - TypedArray mNavigationIconsArray = mainActivity.getResources() + String[] mNavigationArray = mainActivity.get().getResources().getStringArray(R.array.navigation_list); + TypedArray mNavigationIconsArray = mainActivity.get().getResources() .obtainTypedArray(R.array.navigation_list_icons); - TypedArray mNavigationIconsSelectedArray = mainActivity.getResources().obtainTypedArray(R.array + TypedArray mNavigationIconsSelectedArray = mainActivity.get().getResources().obtainTypedArray(R.array .navigation_list_icons_selected); final List items = new ArrayList<>(); From 62c1e389e4acebbc73feb6c28d417e7d2c8ddb90 Mon Sep 17 00:00:00 2001 From: Federico Iosue Date: Wed, 31 May 2023 16:04:04 +0200 Subject: [PATCH 5/6] Version 6.2.8 (323) and updated changelog --- gradle.properties | 4 ++-- omniNotes/src/main/res/raw/changelog.xml | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index a69df043b1..f9e569d959 100644 --- a/gradle.properties +++ b/gradle.properties @@ -14,8 +14,8 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . # -VERSION_NAME=6.2.7 -VERSION_CODE=322 +VERSION_NAME=6.2.8 +VERSION_CODE=323 PACKAGE=it.feio.android.omninotes MIN_SDK=21 TARGET_SDK=31 diff --git a/omniNotes/src/main/res/raw/changelog.xml b/omniNotes/src/main/res/raw/changelog.xml index 42d6b62494..c59f277e17 100644 --- a/omniNotes/src/main/res/raw/changelog.xml +++ b/omniNotes/src/main/res/raw/changelog.xml @@ -16,6 +16,13 @@ --> + + [i]Improved![/i] Better GPS errors management (thanks [a href='https://github.com/Dries04']Dries04[/a] + [u]Fix[/u] Disappearing main menu items from latest version + + From 05e2e10eaca0cbb91d6aaf8dba90faf473cb543b Mon Sep 17 00:00:00 2001 From: Federico Iosue Date: Wed, 31 May 2023 16:12:31 +0200 Subject: [PATCH 6/6] Revert undesired changes to assets due to wrong cherry pick from develop --- assets/ic_launcher-web.png | Bin 0 -> 30454 bytes .../android/en-US/images/feature-graphic.png | 0 fastlane/metadata/android/en-US/images/icon.png | 0 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/ic_launcher-web.png delete mode 100644 fastlane/metadata/android/en-US/images/feature-graphic.png delete mode 100644 fastlane/metadata/android/en-US/images/icon.png diff --git a/assets/ic_launcher-web.png b/assets/ic_launcher-web.png new file mode 100644 index 0000000000000000000000000000000000000000..efcf350a8b59dd7d848a43b63646a234b709aee1 GIT binary patch literal 30454 zcmdRW_dnJD`~UL{>maA>t&)uFS=K>h?`%0nMz-w2v1KM(*)xQ!YzLvNtdLC-*<`QJ z^Yngw|A?<&bUV)TF|Nn;xUT#CeqGOAX{tXWMbIGt03cOTe5efoQ1G8nfDj-2_1Ams z6aYM1lpf0HdQWYb5_s!AouaI)EH9n@JMZB&`⪙jTTCXplejLu?FNR@F4Q-u@SPb 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 V