From 2edff23929047edc272d16f7f6f545eacee02ce7 Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Tue, 9 Jun 2020 10:58:55 +0200 Subject: Simplify translations for formatting help --- .../formattinghelp/FormattingHelpActivity.java | 42 +++++++++---------- app/src/main/res/values/strings.xml | 48 ++++++++++++---------- 2 files changed, 46 insertions(+), 44 deletions(-) (limited to 'app/src/main') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/formattinghelp/FormattingHelpActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/formattinghelp/FormattingHelpActivity.java index 04a4a5a3..a1078504 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/formattinghelp/FormattingHelpActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/formattinghelp/FormattingHelpActivity.java @@ -111,39 +111,35 @@ public class FormattingHelpActivity extends BrandedActivity { final String divider = getString(R.string.formatting_help_divider); final String codefence = getString(R.string.formatting_help_codefence); + int numberedListItem = 1; final String lists = getString(R.string.formatting_help_lists_body_1) + lineBreak + lineBreak + - getString(R.string.formatting_help_lists_body_2) + lineBreak + - getString(R.string.formatting_help_lists_body_3) + lineBreak + - getString(R.string.formatting_help_lists_body_4) + lineBreak + + getString(R.string.formatting_help_ol, numberedListItem++, getString(R.string.formatting_help_lists_body_2)) + lineBreak + + getString(R.string.formatting_help_ol, numberedListItem++, getString(R.string.formatting_help_lists_body_3)) + lineBreak + + getString(R.string.formatting_help_ol, numberedListItem, getString(R.string.formatting_help_lists_body_4)) + lineBreak + lineBreak + getString(R.string.formatting_help_lists_body_5) + lineBreak + lineBreak + - getString(R.string.formatting_help_lists_body_6) + lineBreak + - getString(R.string.formatting_help_lists_body_7) + lineBreak + - lineBreak + - getString(R.string.formatting_help_lists_body_8) + lineBreak + - lineBreak + - getString(R.string.formatting_help_lists_body_9) + lineBreak + - getString(R.string.formatting_help_lists_body_10) + lineBreak + - indention + getString(R.string.formatting_help_lists_body_11) + lineBreak + - indention + getString(R.string.formatting_help_lists_body_12) + lineBreak; + getString(R.string.formatting_help_ul, getString(R.string.formatting_help_lists_body_6)) + lineBreak + + getString(R.string.formatting_help_ul, getString(R.string.formatting_help_lists_body_7)) + lineBreak + + indention + getString(R.string.formatting_help_ul, getString(R.string.formatting_help_lists_body_8)) + lineBreak + + indention + getString(R.string.formatting_help_ul, getString(R.string.formatting_help_lists_body_9)) + lineBreak; final String checkboxes = getString(R.string.formatting_help_checkboxes_body_1) + lineBreak + lineBreak + - getString(R.string.formatting_help_checkboxes_body_2) + lineBreak + - getString(R.string.formatting_help_checkboxes_body_3) + lineBreak; + getString(R.string.formatting_help_checkbox_checked, getString(R.string.formatting_help_checkboxes_body_2)) + lineBreak + + getString(R.string.formatting_help_checkbox_unchecked, getString(R.string.formatting_help_checkboxes_body_3)) + lineBreak; final String structuredDocuments = getString(R.string.formatting_help_structured_documents_body_1) + lineBreak + lineBreak + - getString(R.string.formatting_help_structured_documents_body_2) + lineBreak + + getString(R.string.formatting_help_title_level_3, getString(R.string.formatting_help_structured_documents_body_2)) + lineBreak + lineBreak + getString(R.string.formatting_help_structured_documents_body_3) + lineBreak + lineBreak + getString(R.string.formatting_help_structured_documents_body_4) + lineBreak + lineBreak + - getString(R.string.formatting_help_structured_documents_body_5) + lineBreak + - getString(R.string.formatting_help_structured_documents_body_6) + lineBreak; + getString(R.string.formatting_help_quote, getString(R.string.formatting_help_structured_documents_body_5)) + lineBreak + + getString(R.string.formatting_help_quote, getString(R.string.formatting_help_structured_documents_body_6)) + lineBreak; final String javascript = getString(R.string.formatting_help_javascript_1) + lineBreak + indention + indention + getString(R.string.formatting_help_javascript_2) + lineBreak + @@ -200,10 +196,10 @@ public class FormattingHelpActivity extends BrandedActivity { lineBreak + getString(R.string.formatting_help_code_body_1) + lineBreak + lineBreak + - getString(R.string.formatting_help_code_body_2) + lineBreak + - getString(R.string.formatting_help_code_body_3) + lineBreak + + getString(R.string.formatting_help_codefence_inline_escaped) + getString(R.string.formatting_help_code_javascript_inline) + getString(R.string.formatting_help_codefence_inline_escaped) + lineBreak + + getString(R.string.formatting_help_codefence_inline) + getString(R.string.formatting_help_code_javascript_inline) + getString(R.string.formatting_help_codefence_inline) + lineBreak + lineBreak + - getString(R.string.formatting_help_code_body_4) + lineBreak + + getString(R.string.formatting_help_code_body_2) + lineBreak + lineBreak + getString(R.string.formatting_help_codefence_escaped) + lineBreak + javascript + @@ -213,7 +209,7 @@ public class FormattingHelpActivity extends BrandedActivity { javascript + codefence + lineBreak + lineBreak + - getString(R.string.formatting_help_code_body_5) + lineBreak + + getString(R.string.formatting_help_code_body_3) + lineBreak + lineBreak + getString(R.string.formatting_help_codefence_javascript_escaped) + lineBreak + javascript + @@ -229,8 +225,8 @@ public class FormattingHelpActivity extends BrandedActivity { lineBreak + getString(R.string.formatting_help_unsupported_body_1) + lineBreak + lineBreak + - getString(R.string.formatting_help_unsupported_body_2) + lineBreak + - getString(R.string.formatting_help_unsupported_body_3) + lineBreak + + getString(R.string.formatting_help_ul, getString(R.string.formatting_help_unsupported_body_2)) + lineBreak + + getString(R.string.formatting_help_ul, getString(R.string.formatting_help_unsupported_body_3)) + lineBreak + lineBreak + getString(R.string.formatting_help_unsupported_body_4) + lineBreak; } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a6e8df07..fd222e89 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -233,8 +233,13 @@ %d selected + + # %1$s + ### %1$s --- + ` + \\` ``` \\`\\`\\` if (isAwesome){ @@ -242,6 +247,12 @@ } \\`\\`\\`javascript ```javascript + var example = true + %1$d. %2$s + - %1$s + - [x] %1$s + - [ ] %1$s + > %1$s Context based formatting A major design goal of the Notes app is to provide a distraction free tool. Though you will be able to format your texts with Markdown. For various of the below mentioned examples, you can use shortcuts so you can format your notes without typing in the codes below. @@ -252,41 +263,36 @@ Lists Sometimes you want numbered lists: - 1. One - 2. Two - 3. Three + One + Two + Three Sometimes you want bullet points: - * Start a line with a star - * Profit! - Alternatively, - - Dashes work just as well - - And if you have sub points, put two spaces before the dash or star: - - Like this - - And this + Start a line with a dash + And if you have sub points, put two spaces before the dash or star: + Like this + And this Checkboxes To create a checkbox, use a list followed by brackets - - [ ] Item 1 - * [ ] Item 2 + Item 1 + Item 2 Structured documents Sometimes it\'s useful to have different levels of headings to structure your documents. Start lines with a `#` to create headings. Multiple `##` in a row denote smaller heading sizes. - ### This is a third-tier heading + This is a third-tier heading You can use one `#` all the way up to `######` six for different heading sizes. If you\'d like to quote someone, use the > character before the line: - > Coffee. The finest organic suspension ever devised… I beat the Borg with it. - > - Captain Janeway + Coffee. The finest organic suspension ever devised… I beat the Borg with it. + - Captain Janeway Code There are many different ways to style code with Markdown. If you have inline code blocks, wrap them in backticks: - \\`var example = true\\` - `var example = true` - Markdown also supports something called code fencing, which allows for multiple lines without indentation: - And if you\'d like to use syntax highlighting, include the language: + Markdown also supports something called code fencing, which allows for multiple lines without indentation: + And if you\'d like to use syntax highlighting, include the language: Unsupported While we try to continuously improve the support for Markdown, there are a few features which are not yet supported by Notes: - - Tables - - Images + Tables + Images If you are interested in contributing support for one of those features, get in contact with us via GitHub or E-Mail. -- cgit v1.2.3 From 51d9513b0abbe2c148216e4eca7acd90728bbae9 Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Tue, 9 Jun 2020 03:32:16 +0000 Subject: [tx-robot] updated from transifex --- app/src/main/res/values-cs-rCZ/strings.xml | 5 ++++- app/src/main/res/values-de/strings.xml | 5 ++++- app/src/main/res/values-el/strings.xml | 9 ++++++++- app/src/main/res/values-es/strings.xml | 3 ++- app/src/main/res/values-eu/strings.xml | 3 ++- app/src/main/res/values-fr/strings.xml | 3 ++- app/src/main/res/values-gl/strings.xml | 5 ++++- app/src/main/res/values-it/strings.xml | 5 ++++- app/src/main/res/values-nl/strings.xml | 3 ++- app/src/main/res/values-pl/strings.xml | 5 ++++- app/src/main/res/values-pt-rBR/strings.xml | 3 ++- app/src/main/res/values-ru/strings.xml | 3 ++- app/src/main/res/values-sk-rSK/strings.xml | 5 ++++- app/src/main/res/values-sl/strings.xml | 3 ++- app/src/main/res/values-tr/strings.xml | 3 ++- 15 files changed, 48 insertions(+), 15 deletions(-) (limited to 'app/src/main') diff --git a/app/src/main/res/values-cs-rCZ/strings.xml b/app/src/main/res/values-cs-rCZ/strings.xml index 23b22204..bd73681a 100644 --- a/app/src/main/res/values-cs-rCZ/strings.xml +++ b/app/src/main/res/values-cs-rCZ/strings.xml @@ -161,6 +161,8 @@ Chování Sdílet obsah %1$d poznámek Spravovat účty + Formátování + Otevřít v režimu úprav @@ -196,4 +198,5 @@ vybráno %d vybrány %d - + + diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 34f7e1d4..2fae90b4 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -161,6 +161,8 @@ Verhalten Inhalt von %1$d Notizen teilen Konten verwalten + Formatierung + Im Bearbeitungsmodus öffnen @@ -194,4 +196,5 @@ %d ausgewählt %d ausgewählt - + + diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 9f50951c..a3573c7b 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -29,6 +29,9 @@ Προεπισκόπηση Διαμοιρασμός + Αναζήτηση σε %1$s + Αναζήτηση όλων των σημειώσεων + Επιλογή κατηγορίας Σήμερα @@ -155,8 +158,11 @@ Ασφάλεια Εμφάνιση Συγχρονισμός + Συμπεριφορά Κοινόχρηστο περιεχόμενο από %1$d σημειώσεις Διαχείριση λογαριασμών + Διαμόρφωση σε εξέλιξη + Άνοιγμα σε λειτουργία τροποποίησης @@ -190,4 +196,5 @@ %d επιλέχτηκε %d επιλέχτηκαν - + + diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index f62dbd6d..4beddf5d 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -190,4 +190,5 @@ %d selecionado %d seleccionados - + + diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 86ee5b6a..577ff7ce 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -189,4 +189,5 @@ %d hautatuta %d hautatuta - + + diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 30540e84..100951d1 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -194,4 +194,5 @@ %d sélectionné %d sélectionné(s) - + + diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index a55eac01..eab8c152 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -161,6 +161,8 @@ Comportamento Compartir o contido de %1$dnotas Administrar contas + Formatado + Abrir en modo de edición @@ -194,4 +196,5 @@ %d seleccionado %d seleccionados - + + diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 485668ee..6a6a2687 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -161,6 +161,8 @@ Comportamento Condividi il contenuto di %1$d note Gestisci account + Formattazione + Apri in modalità modifica @@ -194,4 +196,5 @@ %d selezionato %d selezionati - + + diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 2c2bb06a..887fb0aa 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -191,4 +191,5 @@ %d geselecteerd %d geselecteerd - + + diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 3eeaf2b0..858119e8 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -161,6 +161,8 @@ Zachowane Udostępnij treść notatki %1$d Zarządzaj kontami + Formatowanie + Otwórz w trybie edycji @@ -196,4 +198,5 @@ %d wybranych %d wybranych - + + diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index de8b8f2b..7e50aa88 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -190,4 +190,5 @@ %d selecionado %d selecionados - + + diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 1234da29..e8f233c8 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -191,4 +191,5 @@ %d выбрано %d выбрано - + + diff --git a/app/src/main/res/values-sk-rSK/strings.xml b/app/src/main/res/values-sk-rSK/strings.xml index 47f1c578..a75b41de 100644 --- a/app/src/main/res/values-sk-rSK/strings.xml +++ b/app/src/main/res/values-sk-rSK/strings.xml @@ -161,6 +161,8 @@ Chod Zdieľať obsah %1$d poznámok Spravovať účty + Formátovanie + Otvoriť v režime úprav @@ -196,4 +198,5 @@ %d vybraný %d vybraný - + + diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 78872be0..a3b94cba 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -191,4 +191,5 @@ %d izbrane %d izbranih - + + diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index cc221c44..2e01690b 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -190,4 +190,5 @@ %d seçilmiş %d seçilmiş - + + -- cgit v1.2.3 From ceaf6dd47fbeeb2c2cee9b97ded4316e764cdaca Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Tue, 9 Jun 2020 19:13:46 +0200 Subject: Branding for NoteListWidget --- .../notes/android/appwidget/NoteListWidget.java | 35 +++++++++++++++++++++- .../notes/android/appwidget/SingleNoteWidget.java | 7 +++++ .../android/fragment/PreferencesFragment.java | 10 ++++++- .../owncloud/notes/persistence/NotesDatabase.java | 20 ++----------- app/src/main/res/layout/widget_note_list.xml | 3 +- app/src/main/res/layout/widget_note_list_dark.xml | 1 + 6 files changed, 55 insertions(+), 21 deletions(-) (limited to 'app/src/main') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/android/appwidget/NoteListWidget.java b/app/src/main/java/it/niedermann/owncloud/notes/android/appwidget/NoteListWidget.java index 391f9bee..2a59aaa8 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/android/appwidget/NoteListWidget.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/android/appwidget/NoteListWidget.java @@ -6,6 +6,7 @@ import android.appwidget.AppWidgetProvider; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.graphics.Color; import android.net.Uri; import android.util.Log; import android.widget.RemoteViews; @@ -16,7 +17,9 @@ import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.android.DarkModeSetting; import it.niedermann.owncloud.notes.android.activity.EditNoteActivity; import it.niedermann.owncloud.notes.android.activity.NotesListViewActivity; +import it.niedermann.owncloud.notes.branding.BrandingUtil; import it.niedermann.owncloud.notes.model.Category; +import it.niedermann.owncloud.notes.model.LocalAccount; import it.niedermann.owncloud.notes.model.NoteListsWidgetData; import it.niedermann.owncloud.notes.persistence.NotesDatabase; import it.niedermann.owncloud.notes.util.Notes; @@ -42,6 +45,7 @@ public class NoteListWidget extends AppWidgetProvider { for (int appWidgetId : appWidgetIds) { try { final NoteListsWidgetData data = db.getNoteListWidgetData(appWidgetId); + final LocalAccount localAccount = db.getAccount(data.getAccountId()); String category = null; if (data.getCategoryId() != null) { @@ -61,7 +65,7 @@ public class NoteListWidget extends AppWidgetProvider { // Open the main app if the user taps the widget header PendingIntent openAppI = PendingIntent.getActivity(context, PENDING_INTENT_OPEN_APP_RQ, - intent, + intent, PendingIntent.FLAG_UPDATE_CURRENT); // Launch create note activity if user taps "+" icon on header @@ -85,6 +89,17 @@ public class NoteListWidget extends AppWidgetProvider { views.setRemoteAdapter(appWidgetId, R.id.note_list_widget_lv_dark, serviceIntent); views.setEmptyView(R.id.note_list_widget_lv_dark, R.id.widget_note_list_placeholder_tv_dark); awm.notifyAppWidgetViewDataChanged(appWidgetId, R.id.note_list_widget_lv_dark); + if (BrandingUtil.isBrandingEnabled(context)) { + views.setInt(R.id.widget_note_header_dark, "setBackgroundColor", localAccount.getColor()); + views.setInt(R.id.widget_note_header_icon_dark, "setColorFilter", localAccount.getTextColor()); + views.setInt(R.id.widget_note_list_create_icon_dark, "setColorFilter", localAccount.getTextColor()); + views.setTextColor(R.id.widget_note_list_title_tv_dark, localAccount.getTextColor()); + } else { + views.setInt(R.id.widget_note_header_dark, "setBackgroundColor", context.getResources().getColor(R.color.defaultBrand)); + views.setInt(R.id.widget_note_header_icon_dark, "setColorFilter", Color.WHITE); + views.setInt(R.id.widget_note_list_create_icon_dark, "setColorFilter", Color.WHITE); + views.setTextColor(R.id.widget_note_list_title_tv_dark, Color.WHITE); + } } else { views = new RemoteViews(context.getPackageName(), R.layout.widget_note_list); views.setTextViewText(R.id.widget_note_list_title_tv, getWidgetTitle(context, data.getMode(), category)); @@ -95,6 +110,17 @@ public class NoteListWidget extends AppWidgetProvider { views.setRemoteAdapter(appWidgetId, R.id.note_list_widget_lv, serviceIntent); views.setEmptyView(R.id.note_list_widget_lv, R.id.widget_note_list_placeholder_tv); awm.notifyAppWidgetViewDataChanged(appWidgetId, R.id.note_list_widget_lv); + if (BrandingUtil.isBrandingEnabled(context)) { + views.setInt(R.id.widget_note_header, "setBackgroundColor", localAccount.getColor()); + views.setInt(R.id.widget_note_header_icon, "setColorFilter", localAccount.getTextColor()); + views.setInt(R.id.widget_note_list_create_icon, "setColorFilter", localAccount.getTextColor()); + views.setTextColor(R.id.widget_note_list_title_tv, localAccount.getTextColor()); + } else { + views.setInt(R.id.widget_note_header, "setBackgroundColor", context.getResources().getColor(R.color.defaultBrand)); + views.setInt(R.id.widget_note_header_icon, "setColorFilter", Color.WHITE); + views.setInt(R.id.widget_note_list_create_icon, "setColorFilter", Color.WHITE); + views.setTextColor(R.id.widget_note_list_title_tv, Color.WHITE); + } } awm.updateAppWidget(appWidgetId, views); @@ -158,4 +184,11 @@ public class NoteListWidget extends AppWidgetProvider { return null; } } + + /** + * Update note list widgets, if the note data was changed. + */ + public static void updateNoteListWidgets(Context context) { + context.sendBroadcast(new Intent(context, NoteListWidget.class).setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE)); + } } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/android/appwidget/SingleNoteWidget.java b/app/src/main/java/it/niedermann/owncloud/notes/android/appwidget/SingleNoteWidget.java index 1257b74a..2237b9cb 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/android/appwidget/SingleNoteWidget.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/android/appwidget/SingleNoteWidget.java @@ -87,4 +87,11 @@ public class SingleNoteWidget extends AppWidgetProvider { } super.onDeleted(context, appWidgetIds); } + + /** + * Update single note widget, if the note data was changed. + */ + public static void updateSingleNoteWidgets(Context context) { + context.sendBroadcast(new Intent(context, SingleNoteWidget.class).setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE)); + } } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java b/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java index ccc046cf..bebe3fee 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java @@ -20,6 +20,8 @@ import it.niedermann.owncloud.notes.persistence.SyncWorker; import it.niedermann.owncloud.notes.util.DeviceCredentialUtil; import it.niedermann.owncloud.notes.util.Notes; +import static it.niedermann.owncloud.notes.android.appwidget.NoteListWidget.updateNoteListWidgets; + public class PreferencesFragment extends PreferenceFragmentCompat implements Branded { private static final String TAG = PreferencesFragment.class.getSimpleName(); @@ -43,6 +45,7 @@ public class PreferencesFragment extends PreferenceFragmentCompat implements Bra brandingPref = findPreference(getString(R.string.pref_key_branding)); if (brandingPref != null) { brandingPref.setOnPreferenceChangeListener((Preference preference, Object newValue) -> { + updateNoteListWidgets(requireContext()); final Boolean branding = (Boolean) newValue; Log.v(TAG, "branding: " + branding); requireActivity().setResult(Activity.RESULT_OK); @@ -57,7 +60,12 @@ public class PreferencesFragment extends PreferenceFragmentCompat implements Bra if (lockPref != null) { if (!DeviceCredentialUtil.areCredentialsAvailable(requireContext())) { lockPref.setVisible(false); - findPreference(getString(R.string.pref_category_security)).setVisible(false); + Preference securityCategory = findPreference(getString(R.string.pref_category_security)); + if (securityCategory != null) { + securityCategory.setVisible(false); + } else { + Log.e(TAG, "Could not find preference " + getString(R.string.pref_category_security)); + } } else { lockPref.setOnPreferenceChangeListener((preference, newValue) -> { Notes.setLockedPreference((Boolean) newValue); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesDatabase.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesDatabase.java index d19c5734..1a31ae0a 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesDatabase.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesDatabase.java @@ -57,6 +57,8 @@ import it.niedermann.owncloud.notes.util.ColorUtil; import it.niedermann.owncloud.notes.util.NoteUtil; import static it.niedermann.owncloud.notes.android.activity.EditNoteActivity.ACTION_SHORTCUT; +import static it.niedermann.owncloud.notes.android.appwidget.NoteListWidget.updateNoteListWidgets; +import static it.niedermann.owncloud.notes.android.appwidget.SingleNoteWidget.updateSingleNoteWidgets; import static it.niedermann.owncloud.notes.model.NoteListsWidgetData.MODE_DISPLAY_CATEGORY; /** @@ -682,24 +684,6 @@ public class NotesDatabase extends AbstractNotesDatabase { }).start(); } - /** - * Update single note widget, if the note data was changed. - */ - private static void updateSingleNoteWidgets(Context context) { - Intent intent = new Intent(context, SingleNoteWidget.class); - intent.setAction("android.appwidget.action.APPWIDGET_UPDATE"); - context.sendBroadcast(intent); - } - - /** - * Update note list widgets, if the note data was changed. - */ - private static void updateNoteListWidgets(Context context) { - Intent intent = new Intent(context, NoteListWidget.class); - intent.setAction("android.appwidget.action.APPWIDGET_UPDATE"); - context.sendBroadcast(intent); - } - public boolean hasAccounts() { return DatabaseUtils.queryNumEntries(getReadableDatabase(), table_accounts) > 0; } diff --git a/app/src/main/res/layout/widget_note_list.xml b/app/src/main/res/layout/widget_note_list.xml index 63fb9144..6f13212f 100644 --- a/app/src/main/res/layout/widget_note_list.xml +++ b/app/src/main/res/layout/widget_note_list.xml @@ -8,9 +8,10 @@ Date: Tue, 9 Jun 2020 21:44:39 +0200 Subject: #374 Title and category should be centered if no excerpt is given --- .../owncloud/notes/model/ItemAdapter.java | 63 ++++++---- .../owncloud/notes/model/NoteViewHolder.java | 114 +----------------- .../notes/model/NoteViewHolderWithExcerpt.java | 126 +++++++++++++++++++ .../notes/model/NoteViewHolderWithoutExcerpt.java | 126 +++++++++++++++++++ .../owncloud/notes/model/SectionViewHolder.java | 6 +- .../main/res/layout/activity_notes_list_view.xml | 2 +- .../main/res/layout/item_notes_list_note_item.xml | 133 --------------------- .../item_notes_list_note_item_with_excerpt.xml | 133 +++++++++++++++++++++ .../item_notes_list_note_item_without_excerpt.xml | 96 +++++++++++++++ 9 files changed, 531 insertions(+), 268 deletions(-) create mode 100644 app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java create mode 100644 app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java delete mode 100644 app/src/main/res/layout/item_notes_list_note_item.xml create mode 100644 app/src/main/res/layout/item_notes_list_note_item_with_excerpt.xml create mode 100644 app/src/main/res/layout/item_notes_list_note_item_without_excerpt.xml (limited to 'app/src/main') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java b/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java index ba6042bc..ee5132f8 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java @@ -2,9 +2,9 @@ package it.niedermann.owncloud.notes.model; import android.content.Context; import android.graphics.Color; +import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; -import android.view.View; import android.view.ViewGroup; import androidx.annotation.ColorInt; @@ -16,19 +16,22 @@ import java.util.List; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.branding.Branded; +import it.niedermann.owncloud.notes.databinding.ItemNotesListNoteItemWithExcerptBinding; +import it.niedermann.owncloud.notes.databinding.ItemNotesListSectionItemBinding; + +import static it.niedermann.owncloud.notes.databinding.ItemNotesListNoteItemWithoutExcerptBinding.inflate; public class ItemAdapter extends RecyclerView.Adapter implements Branded { private static final String TAG = ItemAdapter.class.getSimpleName(); - private static final int section_type = 0; - private static final int note_type = 1; + private static final int TYPE_SECTION = R.layout.item_notes_list_section_item; + private static final int TYPE_NOTE_WITH_EXCERPT = R.layout.item_notes_list_note_item_with_excerpt; + private static final int TYPE_NOTE_WITHOUT_EXCERPT = R.layout.item_notes_list_note_item_without_excerpt; private final NoteClickListener noteClickListener; private List itemList = new ArrayList<>(); private boolean showCategory = true; private CharSequence searchQuery; - @NonNull - private Context context; private final List selected = new ArrayList<>(); @ColorInt private int mainColor; @@ -36,7 +39,6 @@ public class ItemAdapter extends RecyclerView.Adapter i private int textColor; public ItemAdapter(@NonNull T context) { - this.context = context; this.noteClickListener = context; this.mainColor = context.getResources().getColor(R.color.defaultBrand); this.textColor = Color.WHITE; @@ -74,24 +76,37 @@ public class ItemAdapter extends RecyclerView.Adapter i @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - View v; - if (viewType == section_type) { - v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_notes_list_section_item, parent, false); - return new SectionViewHolder(v); - } else { - v = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.item_notes_list_note_item, parent, false); - return new NoteViewHolder(v, noteClickListener); + switch (viewType) { + case TYPE_SECTION: { + return new SectionViewHolder(ItemNotesListSectionItemBinding.inflate(LayoutInflater.from(parent.getContext()))); + } + case TYPE_NOTE_WITH_EXCERPT: { + return new NoteViewHolderWithExcerpt(ItemNotesListNoteItemWithExcerptBinding.inflate(LayoutInflater.from(parent.getContext())), noteClickListener); + } + case TYPE_NOTE_WITHOUT_EXCERPT: { + return new NoteViewHolderWithoutExcerpt(inflate(LayoutInflater.from(parent.getContext())), noteClickListener); + } + default: { + throw new IllegalArgumentException("Not supported viewType: " + viewType); + } } } @Override public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, int position) { - final Item item = itemList.get(position); - if (item.isSection()) { - ((SectionViewHolder) holder).bind((SectionItem) item); - } else { - ((NoteViewHolder) holder).bind((DBNote) item, noteClickListener, showCategory, mainColor, textColor, searchQuery); + switch (getItemViewType(position)) { + case TYPE_SECTION: { + ((SectionViewHolder) holder).bind((SectionItem) itemList.get(position)); + break; + } + case TYPE_NOTE_WITH_EXCERPT: { + ((NoteViewHolderWithExcerpt) holder).bind((DBNote) itemList.get(position), noteClickListener, showCategory, mainColor, textColor, searchQuery); + break; + } + case TYPE_NOTE_WITHOUT_EXCERPT: { + ((NoteViewHolderWithoutExcerpt) holder).bind((DBNote) itemList.get(position), noteClickListener, showCategory, mainColor, textColor, searchQuery); + break; + } } } @@ -147,7 +162,15 @@ public class ItemAdapter extends RecyclerView.Adapter i @Override public int getItemViewType(int position) { - return getItem(position).isSection() ? section_type : note_type; + Item item = getItem(position); + if (item == null) { + throw new IllegalArgumentException("Item at position " + position + " must not be null"); + } + return getItem(position).isSection() + ? TYPE_SECTION + : TextUtils.isEmpty(((DBNote) getItem(position)).getExcerpt()) + ? TYPE_NOTE_WITHOUT_EXCERPT + : TYPE_NOTE_WITH_EXCERPT; } @Override diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java index a42c8377..00c06073 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java @@ -1,40 +1,16 @@ package it.niedermann.owncloud.notes.model; -import android.content.Context; -import android.graphics.Color; -import android.graphics.drawable.GradientDrawable; -import android.os.Build; -import android.text.SpannableString; -import android.text.TextUtils; -import android.text.style.BackgroundColorSpan; -import android.text.style.ForegroundColorSpan; import android.view.View; -import androidx.annotation.ColorInt; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.core.graphics.drawable.DrawableCompat; import androidx.recyclerview.widget.RecyclerView; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import it.niedermann.owncloud.notes.R; -import it.niedermann.owncloud.notes.branding.BrandingUtil; -import it.niedermann.owncloud.notes.databinding.ItemNotesListNoteItemBinding; -import it.niedermann.owncloud.notes.util.Notes; - import static androidx.recyclerview.widget.RecyclerView.NO_POSITION; -import static it.niedermann.owncloud.notes.util.ColorUtil.contrastRatioIsSufficient; -import static it.niedermann.owncloud.notes.util.ColorUtil.isColorDark; -public class NoteViewHolder extends RecyclerView.ViewHolder implements View.OnLongClickListener, View.OnClickListener { - private final ItemNotesListNoteItemBinding binding; +public abstract class NoteViewHolder extends RecyclerView.ViewHolder implements View.OnLongClickListener, View.OnClickListener { private final NoteClickListener noteClickListener; public NoteViewHolder(View v, NoteClickListener noteClickListener) { super(v); - binding = ItemNotesListNoteItemBinding.bind(v); this.noteClickListener = noteClickListener; v.setOnClickListener(this); v.setOnLongClickListener(this); @@ -53,91 +29,7 @@ public class NoteViewHolder extends RecyclerView.ViewHolder implements View.OnLo return noteClickListener.onNoteLongClick(getAdapterPosition(), v); } - public void showSwipe(boolean left) { - binding.noteFavoriteLeft.setVisibility(left ? View.VISIBLE : View.INVISIBLE); - binding.noteDeleteRight.setVisibility(left ? View.INVISIBLE : View.VISIBLE); - binding.noteSwipeFrame.setBackgroundResource(left ? R.color.bg_warning : R.color.bg_attention); - } - - public void bind(DBNote note, NoteClickListener noteClickListener, boolean showCategory, int mainColor, int textColor, @Nullable CharSequence searchQuery) { - @NonNull final Context context = itemView.getContext(); - final boolean isDarkThemeActive = Notes.isDarkThemeActive(context); - - binding.noteSwipeable.setAlpha(DBStatus.LOCAL_DELETED.equals(note.getStatus()) ? 0.5f : 1.0f); - - binding.noteCategory.setVisibility(showCategory && !note.getCategory().isEmpty() ? View.VISIBLE : View.GONE); - binding.noteCategory.setText(note.getCategory()); - - @ColorInt int categoryForeground; - @ColorInt int categoryBackground; - - if (isDarkThemeActive) { - if (isColorDark(mainColor)) { - if (contrastRatioIsSufficient(mainColor, Color.BLACK)) { - categoryBackground = mainColor; - categoryForeground = Color.WHITE; - } else { - categoryBackground = Color.WHITE; - categoryForeground = mainColor; - } - } else { - categoryBackground = mainColor; - categoryForeground = Color.BLACK; - } - } else { - categoryForeground = Color.BLACK; - if (isColorDark(mainColor) || contrastRatioIsSufficient(mainColor, Color.WHITE)) { - categoryBackground = mainColor; - } else { - categoryBackground = Color.BLACK; - } - } - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - DrawableCompat.setTint(binding.noteCategory.getBackground(), categoryBackground); - } else { - final GradientDrawable drawable = (GradientDrawable) binding.noteCategory.getBackground(); - drawable.setStroke(1, categoryBackground); - drawable.setColor(isDarkThemeActive ? categoryBackground : Color.TRANSPARENT); - } - binding.noteCategory.setTextColor(categoryForeground); - - binding.noteStatus.setVisibility(DBStatus.VOID.equals(note.getStatus()) ? View.INVISIBLE : View.VISIBLE); - binding.noteFavorite.setImageResource(note.isFavorite() ? R.drawable.ic_star_yellow_24dp : R.drawable.ic_star_grey_ccc_24dp); - binding.noteFavorite.setOnClickListener(view -> noteClickListener.onNoteFavoriteClick(getAdapterPosition(), view)); - - if (!TextUtils.isEmpty(searchQuery)) { - @ColorInt final int searchBackground = context.getResources().getColor(R.color.bg_highlighted); - @ColorInt final int searchForeground = BrandingUtil.getSecondaryForegroundColorDependingOnTheme(context, mainColor); - - // The Pattern.quote method will add \Q to the very beginning of the string and \E to the end of the string - // It implies that the string between \Q and \E is a literal string and thus the reserved keyword in such string will be ignored. - // See https://stackoverflow.com/questions/15409296/what-is-the-use-of-pattern-quote-method - final Pattern pattern = Pattern.compile("(" + Pattern.quote(searchQuery.toString()) + ")", Pattern.CASE_INSENSITIVE); - SpannableString spannableString = new SpannableString(note.getTitle()); - Matcher matcher = pattern.matcher(spannableString); - while (matcher.find()) { - spannableString.setSpan(new ForegroundColorSpan(searchForeground), matcher.start(), matcher.end(), 0); - spannableString.setSpan(new BackgroundColorSpan(searchBackground), matcher.start(), matcher.end(), 0); - } - - binding.noteTitle.setText(spannableString); + public abstract void showSwipe(boolean left); - spannableString = new SpannableString(note.getExcerpt()); - matcher = pattern.matcher(spannableString); - while (matcher.find()) { - spannableString.setSpan(new ForegroundColorSpan(searchForeground), matcher.start(), matcher.end(), 0); - spannableString.setSpan(new BackgroundColorSpan(searchBackground), matcher.start(), matcher.end(), 0); - } - - binding.noteExcerpt.setText(spannableString); - } else { - binding.noteTitle.setText(note.getTitle()); - binding.noteExcerpt.setText(note.getExcerpt()); - } - } - - public View getNoteSwipeable() { - return binding.noteSwipeable; - } + public abstract View getNoteSwipeable(); } \ No newline at end of file diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java new file mode 100644 index 00000000..bb64d009 --- /dev/null +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java @@ -0,0 +1,126 @@ +package it.niedermann.owncloud.notes.model; + +import android.content.Context; +import android.graphics.Color; +import android.graphics.drawable.GradientDrawable; +import android.os.Build; +import android.text.SpannableString; +import android.text.TextUtils; +import android.text.style.BackgroundColorSpan; +import android.text.style.ForegroundColorSpan; +import android.view.View; + +import androidx.annotation.ColorInt; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.graphics.drawable.DrawableCompat; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import it.niedermann.owncloud.notes.R; +import it.niedermann.owncloud.notes.branding.BrandingUtil; +import it.niedermann.owncloud.notes.databinding.ItemNotesListNoteItemWithExcerptBinding; +import it.niedermann.owncloud.notes.util.Notes; + +import static it.niedermann.owncloud.notes.util.ColorUtil.contrastRatioIsSufficient; +import static it.niedermann.owncloud.notes.util.ColorUtil.isColorDark; + +public class NoteViewHolderWithExcerpt extends NoteViewHolder { + @NonNull + private final ItemNotesListNoteItemWithExcerptBinding binding; + + public NoteViewHolderWithExcerpt(@NonNull ItemNotesListNoteItemWithExcerptBinding binding, @NonNull NoteClickListener noteClickListener) { + super(binding.getRoot(), noteClickListener); + this.binding = binding; + itemView.setOnClickListener(this); + itemView.setOnLongClickListener(this); + } + + public void showSwipe(boolean left) { + binding.noteFavoriteLeft.setVisibility(left ? View.VISIBLE : View.INVISIBLE); + binding.noteDeleteRight.setVisibility(left ? View.INVISIBLE : View.VISIBLE); + binding.noteSwipeFrame.setBackgroundResource(left ? R.color.bg_warning : R.color.bg_attention); + } + + public void bind(DBNote note, NoteClickListener noteClickListener, boolean showCategory, int mainColor, int textColor, @Nullable CharSequence searchQuery) { + @NonNull final Context context = itemView.getContext(); + final boolean isDarkThemeActive = Notes.isDarkThemeActive(context); + + binding.noteSwipeable.setAlpha(DBStatus.LOCAL_DELETED.equals(note.getStatus()) ? 0.5f : 1.0f); + binding.noteCategory.setVisibility(showCategory && !note.getCategory().isEmpty() ? View.VISIBLE : View.GONE); + binding.noteCategory.setText(note.getCategory()); + + @ColorInt int categoryForeground; + @ColorInt int categoryBackground; + + if (isDarkThemeActive) { + if (isColorDark(mainColor)) { + if (contrastRatioIsSufficient(mainColor, Color.BLACK)) { + categoryBackground = mainColor; + categoryForeground = Color.WHITE; + } else { + categoryBackground = Color.WHITE; + categoryForeground = mainColor; + } + } else { + categoryBackground = mainColor; + categoryForeground = Color.BLACK; + } + } else { + categoryForeground = Color.BLACK; + if (isColorDark(mainColor) || contrastRatioIsSufficient(mainColor, Color.WHITE)) { + categoryBackground = mainColor; + } else { + categoryBackground = Color.BLACK; + } + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + DrawableCompat.setTint(binding.noteCategory.getBackground(), categoryBackground); + } else { + final GradientDrawable drawable = (GradientDrawable) binding.noteCategory.getBackground(); + drawable.setStroke(1, categoryBackground); + drawable.setColor(isDarkThemeActive ? categoryBackground : Color.TRANSPARENT); + } + binding.noteCategory.setTextColor(categoryForeground); + + binding.noteStatus.setVisibility(DBStatus.VOID.equals(note.getStatus()) ? View.INVISIBLE : View.VISIBLE); + binding.noteFavorite.setImageResource(note.isFavorite() ? R.drawable.ic_star_yellow_24dp : R.drawable.ic_star_grey_ccc_24dp); + binding.noteFavorite.setOnClickListener(view -> noteClickListener.onNoteFavoriteClick(getAdapterPosition(), view)); + + if (!TextUtils.isEmpty(searchQuery)) { + @ColorInt final int searchBackground = context.getResources().getColor(R.color.bg_highlighted); + @ColorInt final int searchForeground = BrandingUtil.getSecondaryForegroundColorDependingOnTheme(context, mainColor); + + // The Pattern.quote method will add \Q to the very beginning of the string and \E to the end of the string + // It implies that the string between \Q and \E is a literal string and thus the reserved keyword in such string will be ignored. + // See https://stackoverflow.com/questions/15409296/what-is-the-use-of-pattern-quote-method + final Pattern pattern = Pattern.compile("(" + Pattern.quote(searchQuery.toString()) + ")", Pattern.CASE_INSENSITIVE); + SpannableString spannableString = new SpannableString(note.getTitle()); + Matcher matcher = pattern.matcher(spannableString); + while (matcher.find()) { + spannableString.setSpan(new ForegroundColorSpan(searchForeground), matcher.start(), matcher.end(), 0); + spannableString.setSpan(new BackgroundColorSpan(searchBackground), matcher.start(), matcher.end(), 0); + } + + binding.noteTitle.setText(spannableString); + + spannableString = new SpannableString(note.getExcerpt()); + matcher = pattern.matcher(spannableString); + while (matcher.find()) { + spannableString.setSpan(new ForegroundColorSpan(searchForeground), matcher.start(), matcher.end(), 0); + spannableString.setSpan(new BackgroundColorSpan(searchBackground), matcher.start(), matcher.end(), 0); + } + + binding.noteExcerpt.setText(spannableString); + } else { + binding.noteTitle.setText(note.getTitle()); + binding.noteExcerpt.setText(note.getExcerpt()); + } + } + + public View getNoteSwipeable() { + return binding.noteSwipeable; + } +} \ No newline at end of file diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java new file mode 100644 index 00000000..a20245d2 --- /dev/null +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java @@ -0,0 +1,126 @@ +package it.niedermann.owncloud.notes.model; + +import android.content.Context; +import android.graphics.Color; +import android.graphics.drawable.GradientDrawable; +import android.os.Build; +import android.text.SpannableString; +import android.text.TextUtils; +import android.text.style.BackgroundColorSpan; +import android.text.style.ForegroundColorSpan; +import android.view.View; + +import androidx.annotation.ColorInt; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.graphics.drawable.DrawableCompat; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import it.niedermann.owncloud.notes.R; +import it.niedermann.owncloud.notes.branding.BrandingUtil; +import it.niedermann.owncloud.notes.databinding.ItemNotesListNoteItemWithoutExcerptBinding; +import it.niedermann.owncloud.notes.util.Notes; + +import static it.niedermann.owncloud.notes.util.ColorUtil.contrastRatioIsSufficient; +import static it.niedermann.owncloud.notes.util.ColorUtil.isColorDark; + +public class NoteViewHolderWithoutExcerpt extends NoteViewHolder { + @NonNull + private final ItemNotesListNoteItemWithoutExcerptBinding binding; + + public NoteViewHolderWithoutExcerpt(@NonNull ItemNotesListNoteItemWithoutExcerptBinding binding, @NonNull NoteClickListener noteClickListener) { + super(binding.getRoot(), noteClickListener); + this.binding = binding; + itemView.setOnClickListener(this); + itemView.setOnLongClickListener(this); + } + + + public void showSwipe(boolean left) { + binding.noteFavoriteLeft.setVisibility(left ? View.VISIBLE : View.INVISIBLE); + binding.noteDeleteRight.setVisibility(left ? View.INVISIBLE : View.VISIBLE); + binding.noteSwipeFrame.setBackgroundResource(left ? R.color.bg_warning : R.color.bg_attention); + } + + public void bind(DBNote note, NoteClickListener noteClickListener, boolean showCategory, int mainColor, int textColor, @Nullable CharSequence searchQuery) { + @NonNull final Context context = itemView.getContext(); + final boolean isDarkThemeActive = Notes.isDarkThemeActive(context); + + binding.noteSwipeable.setAlpha(DBStatus.LOCAL_DELETED.equals(note.getStatus()) ? 0.5f : 1.0f); + + binding.noteCategory.setVisibility(showCategory && !note.getCategory().isEmpty() ? View.VISIBLE : View.GONE); + binding.noteCategory.setText(note.getCategory()); + + @ColorInt int categoryForeground; + @ColorInt int categoryBackground; + + if (isDarkThemeActive) { + if (isColorDark(mainColor)) { + if (contrastRatioIsSufficient(mainColor, Color.BLACK)) { + categoryBackground = mainColor; + categoryForeground = Color.WHITE; + } else { + categoryBackground = Color.WHITE; + categoryForeground = mainColor; + } + } else { + categoryBackground = mainColor; + categoryForeground = Color.BLACK; + } + } else { + categoryForeground = Color.BLACK; + if (isColorDark(mainColor) || contrastRatioIsSufficient(mainColor, Color.WHITE)) { + categoryBackground = mainColor; + } else { + categoryBackground = Color.BLACK; + } + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + DrawableCompat.setTint(binding.noteCategory.getBackground(), categoryBackground); + } else { + final GradientDrawable drawable = (GradientDrawable) binding.noteCategory.getBackground(); + drawable.setStroke(1, categoryBackground); + drawable.setColor(isDarkThemeActive ? categoryBackground : Color.TRANSPARENT); + } + binding.noteCategory.setTextColor(categoryForeground); + + binding.noteStatus.setVisibility(DBStatus.VOID.equals(note.getStatus()) ? View.INVISIBLE : View.VISIBLE); + binding.noteFavorite.setImageResource(note.isFavorite() ? R.drawable.ic_star_yellow_24dp : R.drawable.ic_star_grey_ccc_24dp); + binding.noteFavorite.setOnClickListener(view -> noteClickListener.onNoteFavoriteClick(getAdapterPosition(), view)); + + if (!TextUtils.isEmpty(searchQuery)) { + @ColorInt final int searchBackground = context.getResources().getColor(R.color.bg_highlighted); + @ColorInt final int searchForeground = BrandingUtil.getSecondaryForegroundColorDependingOnTheme(context, mainColor); + + // The Pattern.quote method will add \Q to the very beginning of the string and \E to the end of the string + // It implies that the string between \Q and \E is a literal string and thus the reserved keyword in such string will be ignored. + // See https://stackoverflow.com/questions/15409296/what-is-the-use-of-pattern-quote-method + final Pattern pattern = Pattern.compile("(" + Pattern.quote(searchQuery.toString()) + ")", Pattern.CASE_INSENSITIVE); + SpannableString spannableString = new SpannableString(note.getTitle()); + Matcher matcher = pattern.matcher(spannableString); + while (matcher.find()) { + spannableString.setSpan(new ForegroundColorSpan(searchForeground), matcher.start(), matcher.end(), 0); + spannableString.setSpan(new BackgroundColorSpan(searchBackground), matcher.start(), matcher.end(), 0); + } + + binding.noteTitle.setText(spannableString); + + spannableString = new SpannableString(note.getExcerpt()); + matcher = pattern.matcher(spannableString); + while (matcher.find()) { + spannableString.setSpan(new ForegroundColorSpan(searchForeground), matcher.start(), matcher.end(), 0); + spannableString.setSpan(new BackgroundColorSpan(searchBackground), matcher.start(), matcher.end(), 0); + } + + } else { + binding.noteTitle.setText(note.getTitle()); + } + } + + public View getNoteSwipeable() { + return binding.noteSwipeable; + } +} \ No newline at end of file diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/SectionViewHolder.java b/app/src/main/java/it/niedermann/owncloud/notes/model/SectionViewHolder.java index 3441cc85..98a273a2 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/SectionViewHolder.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/SectionViewHolder.java @@ -9,9 +9,9 @@ import it.niedermann.owncloud.notes.databinding.ItemNotesListSectionItemBinding; public class SectionViewHolder extends RecyclerView.ViewHolder { private final ItemNotesListSectionItemBinding binding; - public SectionViewHolder(View view) { - super(view); - binding = ItemNotesListSectionItemBinding.bind(view); + public SectionViewHolder(ItemNotesListSectionItemBinding binding) { + super(binding.getRoot()); + this.binding = binding; } public void bind(SectionItem item) { diff --git a/app/src/main/res/layout/activity_notes_list_view.xml b/app/src/main/res/layout/activity_notes_list_view.xml index e94a5c5c..b1f318ed 100644 --- a/app/src/main/res/layout/activity_notes_list_view.xml +++ b/app/src/main/res/layout/activity_notes_list_view.xml @@ -124,7 +124,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:scrollbars="vertical" - tools:listitem="@layout/item_notes_list_note_item" /> + tools:listitem="@layout/item_notes_list_note_item_with_excerpt" /> diff --git a/app/src/main/res/layout/item_notes_list_note_item.xml b/app/src/main/res/layout/item_notes_list_note_item.xml deleted file mode 100644 index ba88af2a..00000000 --- a/app/src/main/res/layout/item_notes_list_note_item.xml +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/item_notes_list_note_item_with_excerpt.xml b/app/src/main/res/layout/item_notes_list_note_item_with_excerpt.xml new file mode 100644 index 00000000..ba88af2a --- /dev/null +++ b/app/src/main/res/layout/item_notes_list_note_item_with_excerpt.xml @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_notes_list_note_item_without_excerpt.xml b/app/src/main/res/layout/item_notes_list_note_item_without_excerpt.xml new file mode 100644 index 00000000..6645dc2e --- /dev/null +++ b/app/src/main/res/layout/item_notes_list_note_item_without_excerpt.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3 From db517049b09ff86ffbdfe9394c5cde060c73b037 Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Tue, 9 Jun 2020 22:04:31 +0200 Subject: #374 Title and category should be centered if no excerpt is given --- .../owncloud/notes/model/ItemAdapter.java | 4 +- .../owncloud/notes/model/NoteViewHolder.java | 106 ++++++++++++++++++++- .../notes/model/NoteViewHolderWithExcerpt.java | 93 +----------------- .../notes/model/NoteViewHolderWithoutExcerpt.java | 92 +----------------- 4 files changed, 115 insertions(+), 180 deletions(-) (limited to 'app/src/main') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java b/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java index ee5132f8..239dc146 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java @@ -100,11 +100,11 @@ public class ItemAdapter extends RecyclerView.Adapter i break; } case TYPE_NOTE_WITH_EXCERPT: { - ((NoteViewHolderWithExcerpt) holder).bind((DBNote) itemList.get(position), noteClickListener, showCategory, mainColor, textColor, searchQuery); + ((NoteViewHolderWithExcerpt) holder).bind((DBNote) itemList.get(position), showCategory, mainColor, textColor, searchQuery); break; } case TYPE_NOTE_WITHOUT_EXCERPT: { - ((NoteViewHolderWithoutExcerpt) holder).bind((DBNote) itemList.get(position), noteClickListener, showCategory, mainColor, textColor, searchQuery); + ((NoteViewHolderWithoutExcerpt) holder).bind((DBNote) itemList.get(position), showCategory, mainColor, textColor, searchQuery); break; } } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java index 00c06073..fe201aa2 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java @@ -1,15 +1,38 @@ package it.niedermann.owncloud.notes.model; +import android.content.Context; +import android.graphics.Color; +import android.graphics.drawable.GradientDrawable; +import android.os.Build; +import android.text.SpannableString; +import android.text.TextUtils; +import android.text.style.BackgroundColorSpan; +import android.text.style.ForegroundColorSpan; import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; +import androidx.annotation.ColorInt; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.graphics.drawable.DrawableCompat; import androidx.recyclerview.widget.RecyclerView; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import it.niedermann.owncloud.notes.R; +import it.niedermann.owncloud.notes.branding.BrandingUtil; +import it.niedermann.owncloud.notes.util.Notes; + import static androidx.recyclerview.widget.RecyclerView.NO_POSITION; +import static it.niedermann.owncloud.notes.util.ColorUtil.contrastRatioIsSufficient; +import static it.niedermann.owncloud.notes.util.ColorUtil.isColorDark; public abstract class NoteViewHolder extends RecyclerView.ViewHolder implements View.OnLongClickListener, View.OnClickListener { private final NoteClickListener noteClickListener; - public NoteViewHolder(View v, NoteClickListener noteClickListener) { + public NoteViewHolder(@NonNull View v, @NonNull NoteClickListener noteClickListener) { super(v); this.noteClickListener = noteClickListener; v.setOnClickListener(this); @@ -29,6 +52,87 @@ public abstract class NoteViewHolder extends RecyclerView.ViewHolder implements return noteClickListener.onNoteLongClick(getAdapterPosition(), v); } + protected void bindCategory(Context context, TextView noteCategory, boolean showCategory, String category, int mainColor) { + final boolean isDarkThemeActive = Notes.isDarkThemeActive(context); + noteCategory.setVisibility(showCategory && !category.isEmpty() ? View.VISIBLE : View.GONE); + noteCategory.setText(category); + + @ColorInt int categoryForeground; + @ColorInt int categoryBackground; + + if (isDarkThemeActive) { + if (isColorDark(mainColor)) { + if (contrastRatioIsSufficient(mainColor, Color.BLACK)) { + categoryBackground = mainColor; + categoryForeground = Color.WHITE; + } else { + categoryBackground = Color.WHITE; + categoryForeground = mainColor; + } + } else { + categoryBackground = mainColor; + categoryForeground = Color.BLACK; + } + } else { + categoryForeground = Color.BLACK; + if (isColorDark(mainColor) || contrastRatioIsSufficient(mainColor, Color.WHITE)) { + categoryBackground = mainColor; + } else { + categoryBackground = Color.BLACK; + } + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + DrawableCompat.setTint(noteCategory.getBackground(), categoryBackground); + } else { + final GradientDrawable drawable = (GradientDrawable) noteCategory.getBackground(); + drawable.setStroke(1, categoryBackground); + drawable.setColor(isDarkThemeActive ? categoryBackground : Color.TRANSPARENT); + } + noteCategory.setTextColor(categoryForeground); + } + + protected void bindFavorite(ImageView noteFavorite, boolean isFavorite) { + noteFavorite.setImageResource(isFavorite ? R.drawable.ic_star_yellow_24dp : R.drawable.ic_star_grey_ccc_24dp); + noteFavorite.setOnClickListener(view -> noteClickListener.onNoteFavoriteClick(getAdapterPosition(), view)); + } + + protected void bindTitleAndExcerpt(Context context, TextView noteTitle, @Nullable TextView noteExcerpt, CharSequence searchQuery, DBNote note, int mainColor) { + if (!TextUtils.isEmpty(searchQuery)) { + @ColorInt final int searchBackground = context.getResources().getColor(R.color.bg_highlighted); + @ColorInt final int searchForeground = BrandingUtil.getSecondaryForegroundColorDependingOnTheme(context, mainColor); + + // The Pattern.quote method will add \Q to the very beginning of the string and \E to the end of the string + // It implies that the string between \Q and \E is a literal string and thus the reserved keyword in such string will be ignored. + // See https://stackoverflow.com/questions/15409296/what-is-the-use-of-pattern-quote-method + final Pattern pattern = Pattern.compile("(" + Pattern.quote(searchQuery.toString()) + ")", Pattern.CASE_INSENSITIVE); + SpannableString spannableString = new SpannableString(note.getTitle()); + Matcher matcher = pattern.matcher(spannableString); + while (matcher.find()) { + spannableString.setSpan(new ForegroundColorSpan(searchForeground), matcher.start(), matcher.end(), 0); + spannableString.setSpan(new BackgroundColorSpan(searchBackground), matcher.start(), matcher.end(), 0); + } + + noteTitle.setText(spannableString); + + spannableString = new SpannableString(note.getExcerpt()); + matcher = pattern.matcher(spannableString); + while (matcher.find()) { + spannableString.setSpan(new ForegroundColorSpan(searchForeground), matcher.start(), matcher.end(), 0); + spannableString.setSpan(new BackgroundColorSpan(searchBackground), matcher.start(), matcher.end(), 0); + } + + if (noteExcerpt != null) { + noteExcerpt.setText(spannableString); + } + } else { + noteTitle.setText(note.getTitle()); + if (noteExcerpt != null) { + noteExcerpt.setText(note.getExcerpt()); + } + } + } + public abstract void showSwipe(boolean left); public abstract View getNoteSwipeable(); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java index bb64d009..bcf445b6 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java @@ -1,30 +1,13 @@ package it.niedermann.owncloud.notes.model; import android.content.Context; -import android.graphics.Color; -import android.graphics.drawable.GradientDrawable; -import android.os.Build; -import android.text.SpannableString; -import android.text.TextUtils; -import android.text.style.BackgroundColorSpan; -import android.text.style.ForegroundColorSpan; import android.view.View; -import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.core.graphics.drawable.DrawableCompat; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; import it.niedermann.owncloud.notes.R; -import it.niedermann.owncloud.notes.branding.BrandingUtil; import it.niedermann.owncloud.notes.databinding.ItemNotesListNoteItemWithExcerptBinding; -import it.niedermann.owncloud.notes.util.Notes; - -import static it.niedermann.owncloud.notes.util.ColorUtil.contrastRatioIsSufficient; -import static it.niedermann.owncloud.notes.util.ColorUtil.isColorDark; public class NoteViewHolderWithExcerpt extends NoteViewHolder { @NonNull @@ -43,81 +26,13 @@ public class NoteViewHolderWithExcerpt extends NoteViewHolder { binding.noteSwipeFrame.setBackgroundResource(left ? R.color.bg_warning : R.color.bg_attention); } - public void bind(DBNote note, NoteClickListener noteClickListener, boolean showCategory, int mainColor, int textColor, @Nullable CharSequence searchQuery) { + public void bind(DBNote note, boolean showCategory, int mainColor, int textColor, @Nullable CharSequence searchQuery) { @NonNull final Context context = itemView.getContext(); - final boolean isDarkThemeActive = Notes.isDarkThemeActive(context); - binding.noteSwipeable.setAlpha(DBStatus.LOCAL_DELETED.equals(note.getStatus()) ? 0.5f : 1.0f); - binding.noteCategory.setVisibility(showCategory && !note.getCategory().isEmpty() ? View.VISIBLE : View.GONE); - binding.noteCategory.setText(note.getCategory()); - - @ColorInt int categoryForeground; - @ColorInt int categoryBackground; - - if (isDarkThemeActive) { - if (isColorDark(mainColor)) { - if (contrastRatioIsSufficient(mainColor, Color.BLACK)) { - categoryBackground = mainColor; - categoryForeground = Color.WHITE; - } else { - categoryBackground = Color.WHITE; - categoryForeground = mainColor; - } - } else { - categoryBackground = mainColor; - categoryForeground = Color.BLACK; - } - } else { - categoryForeground = Color.BLACK; - if (isColorDark(mainColor) || contrastRatioIsSufficient(mainColor, Color.WHITE)) { - categoryBackground = mainColor; - } else { - categoryBackground = Color.BLACK; - } - } - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - DrawableCompat.setTint(binding.noteCategory.getBackground(), categoryBackground); - } else { - final GradientDrawable drawable = (GradientDrawable) binding.noteCategory.getBackground(); - drawable.setStroke(1, categoryBackground); - drawable.setColor(isDarkThemeActive ? categoryBackground : Color.TRANSPARENT); - } - binding.noteCategory.setTextColor(categoryForeground); - + bindCategory(context, binding.noteCategory, showCategory, note.getCategory(), mainColor); binding.noteStatus.setVisibility(DBStatus.VOID.equals(note.getStatus()) ? View.INVISIBLE : View.VISIBLE); - binding.noteFavorite.setImageResource(note.isFavorite() ? R.drawable.ic_star_yellow_24dp : R.drawable.ic_star_grey_ccc_24dp); - binding.noteFavorite.setOnClickListener(view -> noteClickListener.onNoteFavoriteClick(getAdapterPosition(), view)); - - if (!TextUtils.isEmpty(searchQuery)) { - @ColorInt final int searchBackground = context.getResources().getColor(R.color.bg_highlighted); - @ColorInt final int searchForeground = BrandingUtil.getSecondaryForegroundColorDependingOnTheme(context, mainColor); - - // The Pattern.quote method will add \Q to the very beginning of the string and \E to the end of the string - // It implies that the string between \Q and \E is a literal string and thus the reserved keyword in such string will be ignored. - // See https://stackoverflow.com/questions/15409296/what-is-the-use-of-pattern-quote-method - final Pattern pattern = Pattern.compile("(" + Pattern.quote(searchQuery.toString()) + ")", Pattern.CASE_INSENSITIVE); - SpannableString spannableString = new SpannableString(note.getTitle()); - Matcher matcher = pattern.matcher(spannableString); - while (matcher.find()) { - spannableString.setSpan(new ForegroundColorSpan(searchForeground), matcher.start(), matcher.end(), 0); - spannableString.setSpan(new BackgroundColorSpan(searchBackground), matcher.start(), matcher.end(), 0); - } - - binding.noteTitle.setText(spannableString); - - spannableString = new SpannableString(note.getExcerpt()); - matcher = pattern.matcher(spannableString); - while (matcher.find()) { - spannableString.setSpan(new ForegroundColorSpan(searchForeground), matcher.start(), matcher.end(), 0); - spannableString.setSpan(new BackgroundColorSpan(searchBackground), matcher.start(), matcher.end(), 0); - } - - binding.noteExcerpt.setText(spannableString); - } else { - binding.noteTitle.setText(note.getTitle()); - binding.noteExcerpt.setText(note.getExcerpt()); - } + bindFavorite(binding.noteFavorite, note.isFavorite()); + bindTitleAndExcerpt(context, binding.noteTitle, binding.noteExcerpt, searchQuery, note, mainColor); } public View getNoteSwipeable() { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java index a20245d2..6e127847 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java @@ -1,30 +1,13 @@ package it.niedermann.owncloud.notes.model; import android.content.Context; -import android.graphics.Color; -import android.graphics.drawable.GradientDrawable; -import android.os.Build; -import android.text.SpannableString; -import android.text.TextUtils; -import android.text.style.BackgroundColorSpan; -import android.text.style.ForegroundColorSpan; import android.view.View; -import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.core.graphics.drawable.DrawableCompat; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; import it.niedermann.owncloud.notes.R; -import it.niedermann.owncloud.notes.branding.BrandingUtil; import it.niedermann.owncloud.notes.databinding.ItemNotesListNoteItemWithoutExcerptBinding; -import it.niedermann.owncloud.notes.util.Notes; - -import static it.niedermann.owncloud.notes.util.ColorUtil.contrastRatioIsSufficient; -import static it.niedermann.owncloud.notes.util.ColorUtil.isColorDark; public class NoteViewHolderWithoutExcerpt extends NoteViewHolder { @NonNull @@ -44,80 +27,13 @@ public class NoteViewHolderWithoutExcerpt extends NoteViewHolder { binding.noteSwipeFrame.setBackgroundResource(left ? R.color.bg_warning : R.color.bg_attention); } - public void bind(DBNote note, NoteClickListener noteClickListener, boolean showCategory, int mainColor, int textColor, @Nullable CharSequence searchQuery) { + public void bind(DBNote note, boolean showCategory, int mainColor, int textColor, @Nullable CharSequence searchQuery) { @NonNull final Context context = itemView.getContext(); - final boolean isDarkThemeActive = Notes.isDarkThemeActive(context); - binding.noteSwipeable.setAlpha(DBStatus.LOCAL_DELETED.equals(note.getStatus()) ? 0.5f : 1.0f); - - binding.noteCategory.setVisibility(showCategory && !note.getCategory().isEmpty() ? View.VISIBLE : View.GONE); - binding.noteCategory.setText(note.getCategory()); - - @ColorInt int categoryForeground; - @ColorInt int categoryBackground; - - if (isDarkThemeActive) { - if (isColorDark(mainColor)) { - if (contrastRatioIsSufficient(mainColor, Color.BLACK)) { - categoryBackground = mainColor; - categoryForeground = Color.WHITE; - } else { - categoryBackground = Color.WHITE; - categoryForeground = mainColor; - } - } else { - categoryBackground = mainColor; - categoryForeground = Color.BLACK; - } - } else { - categoryForeground = Color.BLACK; - if (isColorDark(mainColor) || contrastRatioIsSufficient(mainColor, Color.WHITE)) { - categoryBackground = mainColor; - } else { - categoryBackground = Color.BLACK; - } - } - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - DrawableCompat.setTint(binding.noteCategory.getBackground(), categoryBackground); - } else { - final GradientDrawable drawable = (GradientDrawable) binding.noteCategory.getBackground(); - drawable.setStroke(1, categoryBackground); - drawable.setColor(isDarkThemeActive ? categoryBackground : Color.TRANSPARENT); - } - binding.noteCategory.setTextColor(categoryForeground); - + bindCategory(context, binding.noteCategory, showCategory, note.getCategory(), mainColor); binding.noteStatus.setVisibility(DBStatus.VOID.equals(note.getStatus()) ? View.INVISIBLE : View.VISIBLE); - binding.noteFavorite.setImageResource(note.isFavorite() ? R.drawable.ic_star_yellow_24dp : R.drawable.ic_star_grey_ccc_24dp); - binding.noteFavorite.setOnClickListener(view -> noteClickListener.onNoteFavoriteClick(getAdapterPosition(), view)); - - if (!TextUtils.isEmpty(searchQuery)) { - @ColorInt final int searchBackground = context.getResources().getColor(R.color.bg_highlighted); - @ColorInt final int searchForeground = BrandingUtil.getSecondaryForegroundColorDependingOnTheme(context, mainColor); - - // The Pattern.quote method will add \Q to the very beginning of the string and \E to the end of the string - // It implies that the string between \Q and \E is a literal string and thus the reserved keyword in such string will be ignored. - // See https://stackoverflow.com/questions/15409296/what-is-the-use-of-pattern-quote-method - final Pattern pattern = Pattern.compile("(" + Pattern.quote(searchQuery.toString()) + ")", Pattern.CASE_INSENSITIVE); - SpannableString spannableString = new SpannableString(note.getTitle()); - Matcher matcher = pattern.matcher(spannableString); - while (matcher.find()) { - spannableString.setSpan(new ForegroundColorSpan(searchForeground), matcher.start(), matcher.end(), 0); - spannableString.setSpan(new BackgroundColorSpan(searchBackground), matcher.start(), matcher.end(), 0); - } - - binding.noteTitle.setText(spannableString); - - spannableString = new SpannableString(note.getExcerpt()); - matcher = pattern.matcher(spannableString); - while (matcher.find()) { - spannableString.setSpan(new ForegroundColorSpan(searchForeground), matcher.start(), matcher.end(), 0); - spannableString.setSpan(new BackgroundColorSpan(searchBackground), matcher.start(), matcher.end(), 0); - } - - } else { - binding.noteTitle.setText(note.getTitle()); - } + bindFavorite(binding.noteFavorite, note.isFavorite()); + bindTitleAndExcerpt(context, binding.noteTitle, null, searchQuery, note, mainColor); } public View getNoteSwipeable() { -- cgit v1.2.3 From c8930e90ef317827a0612d78ec28189962d415c5 Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Tue, 9 Jun 2020 22:40:51 +0200 Subject: Fix #374 Title and category should be centered if no excerpt is given --- .../owncloud/notes/model/ItemAdapter.java | 4 +-- .../item_notes_list_note_item_with_excerpt.xml | 32 ++++++++++------------ .../item_notes_list_note_item_without_excerpt.xml | 3 ++ 3 files changed, 19 insertions(+), 20 deletions(-) (limited to 'app/src/main') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java b/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java index 239dc146..21eece55 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java @@ -81,10 +81,10 @@ public class ItemAdapter extends RecyclerView.Adapter i return new SectionViewHolder(ItemNotesListSectionItemBinding.inflate(LayoutInflater.from(parent.getContext()))); } case TYPE_NOTE_WITH_EXCERPT: { - return new NoteViewHolderWithExcerpt(ItemNotesListNoteItemWithExcerptBinding.inflate(LayoutInflater.from(parent.getContext())), noteClickListener); + return new NoteViewHolderWithExcerpt(ItemNotesListNoteItemWithExcerptBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false), noteClickListener); } case TYPE_NOTE_WITHOUT_EXCERPT: { - return new NoteViewHolderWithoutExcerpt(inflate(LayoutInflater.from(parent.getContext())), noteClickListener); + return new NoteViewHolderWithoutExcerpt(inflate(LayoutInflater.from(parent.getContext()), parent, false), noteClickListener); } default: { throw new IllegalArgumentException("Not supported viewType: " + viewType); diff --git a/app/src/main/res/layout/item_notes_list_note_item_with_excerpt.xml b/app/src/main/res/layout/item_notes_list_note_item_with_excerpt.xml index ba88af2a..fe4d8b0b 100644 --- a/app/src/main/res/layout/item_notes_list_note_item_with_excerpt.xml +++ b/app/src/main/res/layout/item_notes_list_note_item_with_excerpt.xml @@ -27,16 +27,16 @@ android:contentDescription="@string/menu_delete" app:srcCompat="@drawable/ic_delete_white_32dp" /> - + android:background="@drawable/list_item_background_selector" + android:baselineAligned="false"> + android:layout_height="match_parent"> - - - + - - - - + + + diff --git a/app/src/main/res/layout/item_notes_list_note_item_without_excerpt.xml b/app/src/main/res/layout/item_notes_list_note_item_without_excerpt.xml index 6645dc2e..cf61752d 100644 --- a/app/src/main/res/layout/item_notes_list_note_item_without_excerpt.xml +++ b/app/src/main/res/layout/item_notes_list_note_item_without_excerpt.xml @@ -64,6 +64,8 @@ android:id="@+id/noteTitle" android:layout_width="0dp" android:layout_height="wrap_content" + android:layout_marginTop="10sp" + android:layout_marginBottom="10sp" android:layout_weight="1" android:ellipsize="end" android:maxLines="1" @@ -79,6 +81,7 @@ android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacer_1x" android:layout_marginLeft="@dimen/spacer_1x" + android:layout_marginTop="1dp" android:layout_marginEnd="@dimen/spacer_2x" android:layout_marginRight="@dimen/spacer_2x" android:background="@drawable/border" -- cgit v1.2.3 From 3d0a1fdc12acc1377802a3be0ede1d9373a19c77 Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Tue, 9 Jun 2020 22:48:35 +0200 Subject: Chore --- .../java/it/niedermann/owncloud/notes/model/NoteViewHolder.java | 6 +++--- .../niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java | 2 +- .../owncloud/notes/model/NoteViewHolderWithoutExcerpt.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) (limited to 'app/src/main') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java index fe201aa2..31155700 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java @@ -52,7 +52,7 @@ public abstract class NoteViewHolder extends RecyclerView.ViewHolder implements return noteClickListener.onNoteLongClick(getAdapterPosition(), v); } - protected void bindCategory(Context context, TextView noteCategory, boolean showCategory, String category, int mainColor) { + protected void bindCategory(@NonNull Context context, @NonNull TextView noteCategory, boolean showCategory, @NonNull String category, int mainColor) { final boolean isDarkThemeActive = Notes.isDarkThemeActive(context); noteCategory.setVisibility(showCategory && !category.isEmpty() ? View.VISIBLE : View.GONE); noteCategory.setText(category); @@ -92,12 +92,12 @@ public abstract class NoteViewHolder extends RecyclerView.ViewHolder implements noteCategory.setTextColor(categoryForeground); } - protected void bindFavorite(ImageView noteFavorite, boolean isFavorite) { + protected void bindFavorite(@NonNull ImageView noteFavorite, boolean isFavorite) { noteFavorite.setImageResource(isFavorite ? R.drawable.ic_star_yellow_24dp : R.drawable.ic_star_grey_ccc_24dp); noteFavorite.setOnClickListener(view -> noteClickListener.onNoteFavoriteClick(getAdapterPosition(), view)); } - protected void bindTitleAndExcerpt(Context context, TextView noteTitle, @Nullable TextView noteExcerpt, CharSequence searchQuery, DBNote note, int mainColor) { + protected void bindTitleAndExcerpt(@NonNull Context context, @NonNull TextView noteTitle, @Nullable TextView noteExcerpt, @Nullable CharSequence searchQuery, @NonNull DBNote note, int mainColor) { if (!TextUtils.isEmpty(searchQuery)) { @ColorInt final int searchBackground = context.getResources().getColor(R.color.bg_highlighted); @ColorInt final int searchForeground = BrandingUtil.getSecondaryForegroundColorDependingOnTheme(context, mainColor); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java index bcf445b6..4d1ee302 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java @@ -26,7 +26,7 @@ public class NoteViewHolderWithExcerpt extends NoteViewHolder { binding.noteSwipeFrame.setBackgroundResource(left ? R.color.bg_warning : R.color.bg_attention); } - public void bind(DBNote note, boolean showCategory, int mainColor, int textColor, @Nullable CharSequence searchQuery) { + public void bind(@NonNull DBNote note, boolean showCategory, int mainColor, int textColor, @Nullable CharSequence searchQuery) { @NonNull final Context context = itemView.getContext(); binding.noteSwipeable.setAlpha(DBStatus.LOCAL_DELETED.equals(note.getStatus()) ? 0.5f : 1.0f); bindCategory(context, binding.noteCategory, showCategory, note.getCategory(), mainColor); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java index 6e127847..bd7c7e9d 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java @@ -27,7 +27,7 @@ public class NoteViewHolderWithoutExcerpt extends NoteViewHolder { binding.noteSwipeFrame.setBackgroundResource(left ? R.color.bg_warning : R.color.bg_attention); } - public void bind(DBNote note, boolean showCategory, int mainColor, int textColor, @Nullable CharSequence searchQuery) { + public void bind(@NonNull DBNote note, boolean showCategory, int mainColor, int textColor, @Nullable CharSequence searchQuery) { @NonNull final Context context = itemView.getContext(); binding.noteSwipeable.setAlpha(DBStatus.LOCAL_DELETED.equals(note.getStatus()) ? 0.5f : 1.0f); bindCategory(context, binding.noteCategory, showCategory, note.getCategory(), mainColor); -- cgit v1.2.3 From 00e1b5d6f1aee60212b701a3a985eef62f6e70e9 Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Wed, 10 Jun 2020 10:29:17 +0200 Subject: Implement first version of a GridView --- .../android/NotesListViewItemTouchHelper.java | 6 +- .../android/activity/NotesListViewActivity.java | 20 ++++- .../owncloud/notes/model/ItemAdapter.java | 59 +++++++++----- .../owncloud/notes/model/NoteViewGridHolder.java | 39 +++++++++ .../owncloud/notes/model/NoteViewHolder.java | 38 +++++---- .../notes/model/NoteViewHolderWithExcerpt.java | 3 +- .../notes/model/NoteViewHolderWithoutExcerpt.java | 2 +- .../owncloud/notes/model/SectionViewHolder.java | 7 +- .../res/layout/item_notes_list_note_item_grid.xml | 92 ++++++++++++++++++++++ app/src/main/res/values/integers.xml | 4 + 10 files changed, 225 insertions(+), 45 deletions(-) create mode 100644 app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java create mode 100644 app/src/main/res/layout/item_notes_list_note_item_grid.xml create mode 100644 app/src/main/res/values/integers.xml (limited to 'app/src/main') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/android/NotesListViewItemTouchHelper.java b/app/src/main/java/it/niedermann/owncloud/notes/android/NotesListViewItemTouchHelper.java index 9ec2eac3..67feb6bb 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/android/NotesListViewItemTouchHelper.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/android/NotesListViewItemTouchHelper.java @@ -37,8 +37,8 @@ public class NotesListViewItemTouchHelper extends ItemTouchHelper { @NonNull ISyncCallback syncCallBack, @NonNull Runnable refreshLists, @Nullable SwipeRefreshLayout swipeRefreshLayout, - @Nullable ViewProvider viewProvider - ) { + @Nullable ViewProvider viewProvider, + boolean gridView) { super(new SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) { private boolean swipeRefreshLayoutEnabled; @@ -56,7 +56,7 @@ public class NotesListViewItemTouchHelper extends ItemTouchHelper { */ @Override public int getSwipeDirs(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) { - if (viewHolder instanceof SectionViewHolder) return 0; + if (gridView || viewHolder instanceof SectionViewHolder) return 0; return super.getSwipeDirs(recyclerView, viewHolder); } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java index 3daf809a..3523e35c 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java @@ -13,6 +13,7 @@ import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.text.TextUtils; +import android.util.DisplayMetrics; import android.util.Log; import android.view.View; import android.view.ViewTreeObserver; @@ -27,6 +28,7 @@ import androidx.core.view.GravityCompat; import androidx.core.view.ViewCompat; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.StaggeredGridLayoutManager; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import com.bumptech.glide.Glide; @@ -90,6 +92,8 @@ public class NotesListViewActivity extends LockedActivity implements NoteClickLi private static final String TAG = NotesListViewActivity.class.getSimpleName(); + public static final boolean FEATURE_TOGGLE_GRID_VIEW = true; + public static final String CREATED_NOTE = "it.niedermann.owncloud.notes.created_notes"; public static final String ADAPTER_KEY_RECENT = "recent"; public static final String ADAPTER_KEY_STARRED = "starred"; @@ -229,7 +233,8 @@ public class NotesListViewActivity extends LockedActivity implements NoteClickLi try { BrandingUtil.saveBrandColors(this, localAccount.getColor(), localAccount.getTextColor()); ssoAccount = SingleAccountHelper.getCurrentSingleSignOnAccount(getApplicationContext()); - new NotesListViewItemTouchHelper(ssoAccount, this, db, adapter, syncCallBack, this::refreshLists, swipeRefreshLayout, this).attachToRecyclerView(listView); + new NotesListViewItemTouchHelper(ssoAccount, this, db, adapter, syncCallBack, this::refreshLists, swipeRefreshLayout, this, FEATURE_TOGGLE_GRID_VIEW) + .attachToRecyclerView(listView); synchronize(); } catch (NextcloudFilesAppAccountNotFoundException | NoCurrentAccountSelectedException e) { Log.i(TAG, "Tried to select account, but got an " + e.getClass().getSimpleName() + ". Asking for importing an account..."); @@ -588,10 +593,17 @@ public class NotesListViewActivity extends LockedActivity implements NoteClickLi binding.navigationMenu.setAdapter(adapterMenu); } - public void initList() { - adapter = new ItemAdapter(this); + private void initList() { + adapter = new ItemAdapter(this, FEATURE_TOGGLE_GRID_VIEW); listView.setAdapter(adapter); - listView.setLayoutManager(new LinearLayoutManager(this)); + + final DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); + int spanCount = (int) ((displayMetrics.widthPixels / displayMetrics.density) / getResources().getInteger(R.integer.max_dp_grid_view)); + listView.setLayoutManager( + FEATURE_TOGGLE_GRID_VIEW + ? new StaggeredGridLayoutManager(spanCount, StaggeredGridLayoutManager.VERTICAL) + : new LinearLayoutManager(this) + ); } private void refreshLists() { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java b/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java index 21eece55..0b2bb528 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java @@ -8,14 +8,17 @@ import android.view.LayoutInflater; import android.view.ViewGroup; import androidx.annotation.ColorInt; +import androidx.annotation.IntRange; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.StaggeredGridLayoutManager; import java.util.ArrayList; import java.util.List; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.branding.Branded; +import it.niedermann.owncloud.notes.databinding.ItemNotesListNoteItemGridBinding; import it.niedermann.owncloud.notes.databinding.ItemNotesListNoteItemWithExcerptBinding; import it.niedermann.owncloud.notes.databinding.ItemNotesListSectionItemBinding; @@ -25,10 +28,12 @@ public class ItemAdapter extends RecyclerView.Adapter i private static final String TAG = ItemAdapter.class.getSimpleName(); - private static final int TYPE_SECTION = R.layout.item_notes_list_section_item; - private static final int TYPE_NOTE_WITH_EXCERPT = R.layout.item_notes_list_note_item_with_excerpt; - private static final int TYPE_NOTE_WITHOUT_EXCERPT = R.layout.item_notes_list_note_item_without_excerpt; + public static final int TYPE_SECTION = 0; + public static final int TYPE_NOTE_WITH_EXCERPT = 1; + public static final int TYPE_NOTE_WITHOUT_EXCERPT = 2; + private final NoteClickListener noteClickListener; + private final boolean gridView; private List itemList = new ArrayList<>(); private boolean showCategory = true; private CharSequence searchQuery; @@ -38,8 +43,9 @@ public class ItemAdapter extends RecyclerView.Adapter i @ColorInt private int textColor; - public ItemAdapter(@NonNull T context) { + public ItemAdapter(@NonNull T context, boolean gridView) { this.noteClickListener = context; + this.gridView = gridView; this.mainColor = context.getResources().getColor(R.color.defaultBrand); this.textColor = Color.WHITE; } @@ -76,18 +82,33 @@ public class ItemAdapter extends RecyclerView.Adapter i @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - switch (viewType) { - case TYPE_SECTION: { - return new SectionViewHolder(ItemNotesListSectionItemBinding.inflate(LayoutInflater.from(parent.getContext()))); + if (gridView) { + switch (viewType) { + case TYPE_SECTION: { + return new SectionViewHolder(ItemNotesListSectionItemBinding.inflate(LayoutInflater.from(parent.getContext()))); + } + case TYPE_NOTE_WITH_EXCERPT: + case TYPE_NOTE_WITHOUT_EXCERPT: { + return new NoteViewGridHolder(ItemNotesListNoteItemGridBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false), noteClickListener); + } + default: { + throw new IllegalArgumentException("Not supported viewType: " + viewType); + } } - case TYPE_NOTE_WITH_EXCERPT: { - return new NoteViewHolderWithExcerpt(ItemNotesListNoteItemWithExcerptBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false), noteClickListener); - } - case TYPE_NOTE_WITHOUT_EXCERPT: { - return new NoteViewHolderWithoutExcerpt(inflate(LayoutInflater.from(parent.getContext()), parent, false), noteClickListener); - } - default: { - throw new IllegalArgumentException("Not supported viewType: " + viewType); + } else { + switch (viewType) { + case TYPE_SECTION: { + return new SectionViewHolder(ItemNotesListSectionItemBinding.inflate(LayoutInflater.from(parent.getContext()))); + } + case TYPE_NOTE_WITH_EXCERPT: { + return new NoteViewHolderWithExcerpt(ItemNotesListNoteItemWithExcerptBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false), noteClickListener); + } + case TYPE_NOTE_WITHOUT_EXCERPT: { + return new NoteViewHolderWithoutExcerpt(inflate(LayoutInflater.from(parent.getContext()), parent, false), noteClickListener); + } + default: { + throw new IllegalArgumentException("Not supported viewType: " + viewType); + } } } } @@ -99,12 +120,9 @@ public class ItemAdapter extends RecyclerView.Adapter i ((SectionViewHolder) holder).bind((SectionItem) itemList.get(position)); break; } - case TYPE_NOTE_WITH_EXCERPT: { - ((NoteViewHolderWithExcerpt) holder).bind((DBNote) itemList.get(position), showCategory, mainColor, textColor, searchQuery); - break; - } + case TYPE_NOTE_WITH_EXCERPT: case TYPE_NOTE_WITHOUT_EXCERPT: { - ((NoteViewHolderWithoutExcerpt) holder).bind((DBNote) itemList.get(position), showCategory, mainColor, textColor, searchQuery); + ((NoteViewHolder) holder).bind((DBNote) itemList.get(position), showCategory, mainColor, textColor, searchQuery); break; } } @@ -160,6 +178,7 @@ public class ItemAdapter extends RecyclerView.Adapter i return itemList.size(); } + @IntRange(from = 0, to = 2) @Override public int getItemViewType(int position) { Item item = getItem(position); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java new file mode 100644 index 00000000..d9cd30f1 --- /dev/null +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java @@ -0,0 +1,39 @@ +package it.niedermann.owncloud.notes.model; + +import android.content.Context; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import it.niedermann.owncloud.notes.databinding.ItemNotesListNoteItemGridBinding; + +public class NoteViewGridHolder extends NoteViewHolder { + @NonNull + private final ItemNotesListNoteItemGridBinding binding; + + public NoteViewGridHolder(@NonNull ItemNotesListNoteItemGridBinding binding, @NonNull NoteClickListener noteClickListener) { + super(binding.getRoot(), noteClickListener); + this.binding = binding; + itemView.setOnClickListener(this); + itemView.setOnLongClickListener(this); + } + + + public void showSwipe(boolean left) { + + } + + public void bind(@NonNull DBNote note, boolean showCategory, int mainColor, int textColor, @Nullable CharSequence searchQuery) { + @NonNull final Context context = itemView.getContext(); + bindCategory(context, binding.noteCategory, showCategory, note.getCategory(), mainColor); + binding.noteStatus.setVisibility(DBStatus.VOID.equals(note.getStatus()) ? View.INVISIBLE : View.VISIBLE); + bindFavorite(binding.noteFavorite, note.isFavorite()); + bindTitle(context, binding.noteTitle, searchQuery, note, mainColor); + bindExcerpt(context, binding.noteContent, searchQuery, note, mainColor); + } + + public View getNoteSwipeable() { + return null; + } +} \ No newline at end of file diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java index 31155700..6272dcf4 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java @@ -52,6 +52,8 @@ public abstract class NoteViewHolder extends RecyclerView.ViewHolder implements return noteClickListener.onNoteLongClick(getAdapterPosition(), v); } + public abstract void bind(@NonNull DBNote note, boolean showCategory, int mainColor, int textColor, @Nullable CharSequence searchQuery); + protected void bindCategory(@NonNull Context context, @NonNull TextView noteCategory, boolean showCategory, @NonNull String category, int mainColor) { final boolean isDarkThemeActive = Notes.isDarkThemeActive(context); noteCategory.setVisibility(showCategory && !category.isEmpty() ? View.VISIBLE : View.GONE); @@ -97,8 +99,10 @@ public abstract class NoteViewHolder extends RecyclerView.ViewHolder implements noteFavorite.setOnClickListener(view -> noteClickListener.onNoteFavoriteClick(getAdapterPosition(), view)); } - protected void bindTitleAndExcerpt(@NonNull Context context, @NonNull TextView noteTitle, @Nullable TextView noteExcerpt, @Nullable CharSequence searchQuery, @NonNull DBNote note, int mainColor) { - if (!TextUtils.isEmpty(searchQuery)) { + protected void bindTitle(@NonNull Context context, @NonNull TextView noteTitle, @Nullable CharSequence searchQuery, @NonNull DBNote note, int mainColor) { + if (TextUtils.isEmpty(searchQuery)) { + noteTitle.setText(note.getTitle()); + } else { @ColorInt final int searchBackground = context.getResources().getColor(R.color.bg_highlighted); @ColorInt final int searchForeground = BrandingUtil.getSecondaryForegroundColorDependingOnTheme(context, mainColor); @@ -108,28 +112,34 @@ public abstract class NoteViewHolder extends RecyclerView.ViewHolder implements final Pattern pattern = Pattern.compile("(" + Pattern.quote(searchQuery.toString()) + ")", Pattern.CASE_INSENSITIVE); SpannableString spannableString = new SpannableString(note.getTitle()); Matcher matcher = pattern.matcher(spannableString); + while (matcher.find()) { spannableString.setSpan(new ForegroundColorSpan(searchForeground), matcher.start(), matcher.end(), 0); spannableString.setSpan(new BackgroundColorSpan(searchBackground), matcher.start(), matcher.end(), 0); } - noteTitle.setText(spannableString); + } + } + + protected void bindExcerpt(@NonNull Context context, @NonNull TextView noteExcerpt, @Nullable CharSequence searchQuery, @NonNull DBNote note, int mainColor) { + if (TextUtils.isEmpty(searchQuery)) { + noteExcerpt.setText(note.getExcerpt()); + } else { + @ColorInt final int searchBackground = context.getResources().getColor(R.color.bg_highlighted); + @ColorInt final int searchForeground = BrandingUtil.getSecondaryForegroundColorDependingOnTheme(context, mainColor); + + // The Pattern.quote method will add \Q to the very beginning of the string and \E to the end of the string + // It implies that the string between \Q and \E is a literal string and thus the reserved keyword in such string will be ignored. + // See https://stackoverflow.com/questions/15409296/what-is-the-use-of-pattern-quote-method + final Pattern pattern = Pattern.compile("(" + Pattern.quote(searchQuery.toString()) + ")", Pattern.CASE_INSENSITIVE); + SpannableString spannableString = new SpannableString(note.getExcerpt()); + Matcher matcher = pattern.matcher(spannableString); - spannableString = new SpannableString(note.getExcerpt()); - matcher = pattern.matcher(spannableString); while (matcher.find()) { spannableString.setSpan(new ForegroundColorSpan(searchForeground), matcher.start(), matcher.end(), 0); spannableString.setSpan(new BackgroundColorSpan(searchBackground), matcher.start(), matcher.end(), 0); } - - if (noteExcerpt != null) { - noteExcerpt.setText(spannableString); - } - } else { - noteTitle.setText(note.getTitle()); - if (noteExcerpt != null) { - noteExcerpt.setText(note.getExcerpt()); - } + noteExcerpt.setText(spannableString); } } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java index 4d1ee302..4433b982 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java @@ -32,7 +32,8 @@ public class NoteViewHolderWithExcerpt extends NoteViewHolder { bindCategory(context, binding.noteCategory, showCategory, note.getCategory(), mainColor); binding.noteStatus.setVisibility(DBStatus.VOID.equals(note.getStatus()) ? View.INVISIBLE : View.VISIBLE); bindFavorite(binding.noteFavorite, note.isFavorite()); - bindTitleAndExcerpt(context, binding.noteTitle, binding.noteExcerpt, searchQuery, note, mainColor); + bindTitle(context, binding.noteTitle, searchQuery, note, mainColor); + bindExcerpt(context, binding.noteExcerpt, searchQuery, note, mainColor); } public View getNoteSwipeable() { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java index bd7c7e9d..acacda32 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java @@ -33,7 +33,7 @@ public class NoteViewHolderWithoutExcerpt extends NoteViewHolder { bindCategory(context, binding.noteCategory, showCategory, note.getCategory(), mainColor); binding.noteStatus.setVisibility(DBStatus.VOID.equals(note.getStatus()) ? View.INVISIBLE : View.VISIBLE); bindFavorite(binding.noteFavorite, note.isFavorite()); - bindTitleAndExcerpt(context, binding.noteTitle, null, searchQuery, note, mainColor); + bindTitle(context, binding.noteTitle, searchQuery, note, mainColor); } public View getNoteSwipeable() { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/SectionViewHolder.java b/app/src/main/java/it/niedermann/owncloud/notes/model/SectionViewHolder.java index 98a273a2..b39f77ad 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/SectionViewHolder.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/SectionViewHolder.java @@ -1,8 +1,7 @@ package it.niedermann.owncloud.notes.model; -import android.view.View; - import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.StaggeredGridLayoutManager; import it.niedermann.owncloud.notes.databinding.ItemNotesListSectionItemBinding; @@ -16,5 +15,9 @@ public class SectionViewHolder extends RecyclerView.ViewHolder { public void bind(SectionItem item) { binding.sectionTitle.setText(item.getTitle()); + + if (itemView.getLayoutParams() != null && itemView.getLayoutParams() instanceof StaggeredGridLayoutManager.LayoutParams) { + ((StaggeredGridLayoutManager.LayoutParams) itemView.getLayoutParams()).setFullSpan(true); + } } } \ No newline at end of file diff --git a/app/src/main/res/layout/item_notes_list_note_item_grid.xml b/app/src/main/res/layout/item_notes_list_note_item_grid.xml new file mode 100644 index 00000000..694b5dd4 --- /dev/null +++ b/app/src/main/res/layout/item_notes_list_note_item_grid.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/integers.xml b/app/src/main/res/values/integers.xml new file mode 100644 index 00000000..76c18a8b --- /dev/null +++ b/app/src/main/res/values/integers.xml @@ -0,0 +1,4 @@ + + + 150 + \ No newline at end of file -- cgit v1.2.3 From 2b771d947baafed8c521fe4f44cea5ada63d2583 Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Wed, 10 Jun 2020 10:39:16 +0200 Subject: Make graphical preference for en/disabling GridView --- .../notes/android/activity/NotesListViewActivity.java | 11 +++++++---- .../notes/android/fragment/PreferencesFragment.java | 14 ++++++++++++++ .../niedermann/owncloud/notes/branding/BrandingUtil.java | 1 - app/src/main/res/drawable/ic_baseline_dashboard_24.xml | 5 +++++ app/src/main/res/values/strings.xml | 2 ++ app/src/main/res/xml/preferences.xml | 6 ++++++ 6 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 app/src/main/res/drawable/ic_baseline_dashboard_24.xml (limited to 'app/src/main') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java index 3523e35c..a309dc5d 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java @@ -83,6 +83,7 @@ import it.niedermann.owncloud.notes.util.NoteUtil; import static android.view.View.GONE; import static android.view.View.VISIBLE; +import static androidx.preference.PreferenceManager.getDefaultSharedPreferences; import static it.niedermann.owncloud.notes.branding.BrandingUtil.getSecondaryForegroundColorDependingOnTheme; import static it.niedermann.owncloud.notes.util.ColorUtil.contrastRatioIsSufficient; import static it.niedermann.owncloud.notes.util.SSOUtil.askForNewAccount; @@ -92,7 +93,7 @@ public class NotesListViewActivity extends LockedActivity implements NoteClickLi private static final String TAG = NotesListViewActivity.class.getSimpleName(); - public static final boolean FEATURE_TOGGLE_GRID_VIEW = true; + private boolean gridView = true; public static final String CREATED_NOTE = "it.niedermann.owncloud.notes.created_notes"; public static final String ADAPTER_KEY_RECENT = "recent"; @@ -181,6 +182,8 @@ public class NotesListViewActivity extends LockedActivity implements NoteClickLi db = NotesDatabase.getInstance(this); + gridView = getDefaultSharedPreferences(this).getBoolean(getString(R.string.pref_key_gridview), false); + setupToolbars(); setupNavigationList(categoryAdapterSelectedItem); setupNavigationMenu(); @@ -233,7 +236,7 @@ public class NotesListViewActivity extends LockedActivity implements NoteClickLi try { BrandingUtil.saveBrandColors(this, localAccount.getColor(), localAccount.getTextColor()); ssoAccount = SingleAccountHelper.getCurrentSingleSignOnAccount(getApplicationContext()); - new NotesListViewItemTouchHelper(ssoAccount, this, db, adapter, syncCallBack, this::refreshLists, swipeRefreshLayout, this, FEATURE_TOGGLE_GRID_VIEW) + new NotesListViewItemTouchHelper(ssoAccount, this, db, adapter, syncCallBack, this::refreshLists, swipeRefreshLayout, this, gridView) .attachToRecyclerView(listView); synchronize(); } catch (NextcloudFilesAppAccountNotFoundException | NoCurrentAccountSelectedException e) { @@ -594,13 +597,13 @@ public class NotesListViewActivity extends LockedActivity implements NoteClickLi } private void initList() { - adapter = new ItemAdapter(this, FEATURE_TOGGLE_GRID_VIEW); + adapter = new ItemAdapter(this, gridView); listView.setAdapter(adapter); final DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); int spanCount = (int) ((displayMetrics.widthPixels / displayMetrics.density) / getResources().getInteger(R.integer.max_dp_grid_view)); listView.setLayoutManager( - FEATURE_TOGGLE_GRID_VIEW + gridView ? new StaggeredGridLayoutManager(spanCount, StaggeredGridLayoutManager.VERTICAL) : new LinearLayoutManager(this) ); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java b/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java index bebe3fee..db2d8ee5 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java @@ -30,6 +30,7 @@ public class PreferencesFragment extends PreferenceFragmentCompat implements Bra private BrandedSwitchPreference lockPref; private BrandedSwitchPreference wifiOnlyPref; private BrandedSwitchPreference brandingPref; + private BrandedSwitchPreference gridViewPref; @Override public void onCreate(@Nullable Bundle savedInstanceState) { @@ -56,6 +57,18 @@ public class PreferencesFragment extends PreferenceFragmentCompat implements Bra Log.e(TAG, "Could not find preference with key: \"" + getString(R.string.pref_key_branding) + "\""); } + gridViewPref = findPreference(getString(R.string.pref_key_gridview)); + if (gridViewPref != null) { + gridViewPref.setOnPreferenceChangeListener((Preference preference, Object newValue) -> { + final Boolean gridView = (Boolean) newValue; + Log.v(TAG, "gridView: " + gridView); + requireActivity().setResult(Activity.RESULT_OK); + return true; + }); + } else { + Log.e(TAG, "Could not find preference with key: \"" + getString(R.string.pref_key_branding) + "\""); + } + lockPref = findPreference(getString(R.string.pref_key_lock)); if (lockPref != null) { if (!DeviceCredentialUtil.areCredentialsAvailable(requireContext())) { @@ -119,5 +132,6 @@ public class PreferencesFragment extends PreferenceFragmentCompat implements Bra lockPref.applyBrand(mainColor, textColor); wifiOnlyPref.applyBrand(mainColor, textColor); brandingPref.applyBrand(mainColor, textColor); + gridViewPref.applyBrand(mainColor, textColor); } } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandingUtil.java b/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandingUtil.java index f84bd8e4..878917fa 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandingUtil.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandingUtil.java @@ -31,7 +31,6 @@ public class BrandingUtil { } - public static boolean isBrandingEnabled(@NonNull Context context) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); return prefs.getBoolean(context.getString(R.string.pref_key_branding), true); diff --git a/app/src/main/res/drawable/ic_baseline_dashboard_24.xml b/app/src/main/res/drawable/ic_baseline_dashboard_24.xml new file mode 100644 index 00000000..6c526e9c --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_dashboard_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fd222e89..e90e858b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -117,6 +117,7 @@ darkTheme font branding + gridview fontSize wifiOnly lock @@ -191,6 +192,7 @@ Shared text was empty Append to note Branding + Grid view Security Appearance Synchronization diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 191d4819..06e1f1be 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -45,6 +45,12 @@ android:layout="@layout/item_pref" android:title="@string/settings_branding" /> + + Date: Wed, 10 Jun 2020 13:00:23 +0200 Subject: Performance and rendering enhancements --- .../android/activity/NotesListViewActivity.java | 5 +- .../android/fragment/PreferencesFragment.java | 2 + .../owncloud/notes/model/ItemAdapter.java | 1 - .../owncloud/notes/model/NoteViewGridHolder.java | 8 +-- .../owncloud/notes/model/NoteViewHolder.java | 60 ++++++++++--------- .../notes/model/NoteViewHolderWithExcerpt.java | 7 ++- .../notes/model/NoteViewHolderWithoutExcerpt.java | 4 +- .../owncloud/notes/model/SectionViewHolder.java | 8 +-- .../owncloud/notes/persistence/NotesDatabase.java | 15 ++++- .../owncloud/notes/util/MarkDownUtil.java | 4 -- .../niedermann/owncloud/notes/util/NoteUtil.java | 22 +++++-- .../res/layout/item_notes_list_note_item_grid.xml | 67 ++++++++++++---------- 12 files changed, 118 insertions(+), 85 deletions(-) (limited to 'app/src/main') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java index a309dc5d..c6b14fef 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java @@ -325,7 +325,7 @@ public class NotesListViewActivity extends LockedActivity implements NoteClickLi } private void setupNotesList() { - initList(); + initRecyclerView(); ((RecyclerView) findViewById(R.id.recycler_view)).addOnScrollListener(new RecyclerView.OnScrollListener() { @Override @@ -596,7 +596,7 @@ public class NotesListViewActivity extends LockedActivity implements NoteClickLi binding.navigationMenu.setAdapter(adapterMenu); } - private void initList() { + private void initRecyclerView() { adapter = new ItemAdapter(this, gridView); listView.setAdapter(adapter); @@ -802,7 +802,6 @@ public class NotesListViewActivity extends LockedActivity implements NoteClickLi Intent intent = new Intent(getApplicationContext(), EditNoteActivity.class); intent.putExtra(EditNoteActivity.PARAM_NOTE_ID, note.getId()); startActivityForResult(intent, show_single_note_cmd); - } } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java b/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java index db2d8ee5..d8034ae6 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java @@ -16,6 +16,7 @@ import it.niedermann.owncloud.notes.android.DarkModeSetting; import it.niedermann.owncloud.notes.branding.Branded; import it.niedermann.owncloud.notes.branding.BrandedSwitchPreference; import it.niedermann.owncloud.notes.branding.BrandingUtil; +import it.niedermann.owncloud.notes.persistence.NotesDatabase; import it.niedermann.owncloud.notes.persistence.SyncWorker; import it.niedermann.owncloud.notes.util.DeviceCredentialUtil; import it.niedermann.owncloud.notes.util.Notes; @@ -61,6 +62,7 @@ public class PreferencesFragment extends PreferenceFragmentCompat implements Bra if (gridViewPref != null) { gridViewPref.setOnPreferenceChangeListener((Preference preference, Object newValue) -> { final Boolean gridView = (Boolean) newValue; + NotesDatabase.getInstance(requireContext()).regenerateExcerpts(!gridView); Log.v(TAG, "gridView: " + gridView); requireActivity().setResult(Activity.RESULT_OK); return true; diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java b/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java index 0b2bb528..05a5bcfb 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java @@ -11,7 +11,6 @@ import androidx.annotation.ColorInt; import androidx.annotation.IntRange; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; -import androidx.recyclerview.widget.StaggeredGridLayoutManager; import java.util.ArrayList; import java.util.List; diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java index d9cd30f1..7091d87e 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java @@ -1,6 +1,7 @@ package it.niedermann.owncloud.notes.model; import android.content.Context; +import android.util.Log; import android.view.View; import androidx.annotation.NonNull; @@ -13,13 +14,12 @@ public class NoteViewGridHolder extends NoteViewHolder { private final ItemNotesListNoteItemGridBinding binding; public NoteViewGridHolder(@NonNull ItemNotesListNoteItemGridBinding binding, @NonNull NoteClickListener noteClickListener) { - super(binding.getRoot(), noteClickListener); + super(binding.getRoot(), noteClickListener, true); this.binding = binding; itemView.setOnClickListener(this); itemView.setOnLongClickListener(this); } - public void showSwipe(boolean left) { } @@ -29,8 +29,8 @@ public class NoteViewGridHolder extends NoteViewHolder { bindCategory(context, binding.noteCategory, showCategory, note.getCategory(), mainColor); binding.noteStatus.setVisibility(DBStatus.VOID.equals(note.getStatus()) ? View.INVISIBLE : View.VISIBLE); bindFavorite(binding.noteFavorite, note.isFavorite()); - bindTitle(context, binding.noteTitle, searchQuery, note, mainColor); - bindExcerpt(context, binding.noteContent, searchQuery, note, mainColor); + bindSearchableContent(context, binding.noteTitle, searchQuery, note.getTitle(), mainColor); + bindSearchableContent(context, binding.noteContent, searchQuery, note.getExcerpt(), mainColor); } public View getNoteSwipeable() { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java index 6272dcf4..db8f39f8 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java @@ -4,6 +4,8 @@ import android.content.Context; import android.graphics.Color; import android.graphics.drawable.GradientDrawable; import android.os.Build; +import android.os.Handler; +import android.os.Looper; import android.text.SpannableString; import android.text.TextUtils; import android.text.style.BackgroundColorSpan; @@ -18,23 +20,36 @@ import androidx.annotation.Nullable; import androidx.core.graphics.drawable.DrawableCompat; import androidx.recyclerview.widget.RecyclerView; +import com.yydcdut.markdown.MarkdownProcessor; +import com.yydcdut.markdown.syntax.text.TextFactory; + import java.util.regex.Matcher; import java.util.regex.Pattern; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.branding.BrandingUtil; +import it.niedermann.owncloud.notes.util.MarkDownUtil; import it.niedermann.owncloud.notes.util.Notes; import static androidx.recyclerview.widget.RecyclerView.NO_POSITION; import static it.niedermann.owncloud.notes.util.ColorUtil.contrastRatioIsSufficient; import static it.niedermann.owncloud.notes.util.ColorUtil.isColorDark; +import static it.niedermann.owncloud.notes.util.MarkDownUtil.parseCompat; public abstract class NoteViewHolder extends RecyclerView.ViewHolder implements View.OnLongClickListener, View.OnClickListener { private final NoteClickListener noteClickListener; + private final boolean renderMarkdown; + private MarkdownProcessor markdownProcessor; - public NoteViewHolder(@NonNull View v, @NonNull NoteClickListener noteClickListener) { + public NoteViewHolder(@NonNull View v, @NonNull NoteClickListener noteClickListener, boolean renderMarkdown) { super(v); this.noteClickListener = noteClickListener; + this.renderMarkdown = renderMarkdown; + if (renderMarkdown) { + markdownProcessor = new MarkdownProcessor(itemView.getContext()); + markdownProcessor.factory(TextFactory.create()); + markdownProcessor.config(MarkDownUtil.getMarkDownConfiguration(itemView.getContext()).build()); + } v.setOnClickListener(this); v.setOnLongClickListener(this); } @@ -99,10 +114,9 @@ public abstract class NoteViewHolder extends RecyclerView.ViewHolder implements noteFavorite.setOnClickListener(view -> noteClickListener.onNoteFavoriteClick(getAdapterPosition(), view)); } - protected void bindTitle(@NonNull Context context, @NonNull TextView noteTitle, @Nullable CharSequence searchQuery, @NonNull DBNote note, int mainColor) { - if (TextUtils.isEmpty(searchQuery)) { - noteTitle.setText(note.getTitle()); - } else { + protected void bindSearchableContent(@NonNull Context context, @NonNull TextView textView, @Nullable CharSequence searchQuery, @NonNull String content, int mainColor) { + CharSequence processedContent = content; + if (!TextUtils.isEmpty(searchQuery)) { @ColorInt final int searchBackground = context.getResources().getColor(R.color.bg_highlighted); @ColorInt final int searchForeground = BrandingUtil.getSecondaryForegroundColorDependingOnTheme(context, mainColor); @@ -110,36 +124,30 @@ public abstract class NoteViewHolder extends RecyclerView.ViewHolder implements // It implies that the string between \Q and \E is a literal string and thus the reserved keyword in such string will be ignored. // See https://stackoverflow.com/questions/15409296/what-is-the-use-of-pattern-quote-method final Pattern pattern = Pattern.compile("(" + Pattern.quote(searchQuery.toString()) + ")", Pattern.CASE_INSENSITIVE); - SpannableString spannableString = new SpannableString(note.getTitle()); + SpannableString spannableString = new SpannableString(content); Matcher matcher = pattern.matcher(spannableString); while (matcher.find()) { spannableString.setSpan(new ForegroundColorSpan(searchForeground), matcher.start(), matcher.end(), 0); spannableString.setSpan(new BackgroundColorSpan(searchBackground), matcher.start(), matcher.end(), 0); } - noteTitle.setText(spannableString); + + processedContent = spannableString; } + bindContent(textView, processedContent); } - protected void bindExcerpt(@NonNull Context context, @NonNull TextView noteExcerpt, @Nullable CharSequence searchQuery, @NonNull DBNote note, int mainColor) { - if (TextUtils.isEmpty(searchQuery)) { - noteExcerpt.setText(note.getExcerpt()); - } else { - @ColorInt final int searchBackground = context.getResources().getColor(R.color.bg_highlighted); - @ColorInt final int searchForeground = BrandingUtil.getSecondaryForegroundColorDependingOnTheme(context, mainColor); - - // The Pattern.quote method will add \Q to the very beginning of the string and \E to the end of the string - // It implies that the string between \Q and \E is a literal string and thus the reserved keyword in such string will be ignored. - // See https://stackoverflow.com/questions/15409296/what-is-the-use-of-pattern-quote-method - final Pattern pattern = Pattern.compile("(" + Pattern.quote(searchQuery.toString()) + ")", Pattern.CASE_INSENSITIVE); - SpannableString spannableString = new SpannableString(note.getExcerpt()); - Matcher matcher = pattern.matcher(spannableString); - - while (matcher.find()) { - spannableString.setSpan(new ForegroundColorSpan(searchForeground), matcher.start(), matcher.end(), 0); - spannableString.setSpan(new BackgroundColorSpan(searchBackground), matcher.start(), matcher.end(), 0); - } - noteExcerpt.setText(spannableString); + private void bindContent(@NonNull TextView textView, @NonNull CharSequence charSequence) { + textView.setText(charSequence); + if (renderMarkdown) { + new Thread(() -> { + try { + final CharSequence parsedCharSequence = parseCompat(markdownProcessor, charSequence); + new Handler(Looper.getMainLooper()).post(() -> textView.setText(parsedCharSequence)); + } catch (StringIndexOutOfBoundsException e) { + // Workaround for RxMarkdown: https://github.com/stefan-niedermann/nextcloud-notes/issues/668 + } + }).start(); } } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java index 4433b982..05a743ab 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java @@ -14,7 +14,7 @@ public class NoteViewHolderWithExcerpt extends NoteViewHolder { private final ItemNotesListNoteItemWithExcerptBinding binding; public NoteViewHolderWithExcerpt(@NonNull ItemNotesListNoteItemWithExcerptBinding binding, @NonNull NoteClickListener noteClickListener) { - super(binding.getRoot(), noteClickListener); + super(binding.getRoot(), noteClickListener, false); this.binding = binding; itemView.setOnClickListener(this); itemView.setOnLongClickListener(this); @@ -32,8 +32,9 @@ public class NoteViewHolderWithExcerpt extends NoteViewHolder { bindCategory(context, binding.noteCategory, showCategory, note.getCategory(), mainColor); binding.noteStatus.setVisibility(DBStatus.VOID.equals(note.getStatus()) ? View.INVISIBLE : View.VISIBLE); bindFavorite(binding.noteFavorite, note.isFavorite()); - bindTitle(context, binding.noteTitle, searchQuery, note, mainColor); - bindExcerpt(context, binding.noteExcerpt, searchQuery, note, mainColor); + + bindSearchableContent(context, binding.noteTitle, searchQuery, note.getTitle(), mainColor); + bindSearchableContent(context, binding.noteExcerpt, searchQuery, note.getExcerpt(), mainColor); } public View getNoteSwipeable() { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java index acacda32..59a42f5c 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java @@ -14,7 +14,7 @@ public class NoteViewHolderWithoutExcerpt extends NoteViewHolder { private final ItemNotesListNoteItemWithoutExcerptBinding binding; public NoteViewHolderWithoutExcerpt(@NonNull ItemNotesListNoteItemWithoutExcerptBinding binding, @NonNull NoteClickListener noteClickListener) { - super(binding.getRoot(), noteClickListener); + super(binding.getRoot(), noteClickListener, false); this.binding = binding; itemView.setOnClickListener(this); itemView.setOnLongClickListener(this); @@ -33,7 +33,7 @@ public class NoteViewHolderWithoutExcerpt extends NoteViewHolder { bindCategory(context, binding.noteCategory, showCategory, note.getCategory(), mainColor); binding.noteStatus.setVisibility(DBStatus.VOID.equals(note.getStatus()) ? View.INVISIBLE : View.VISIBLE); bindFavorite(binding.noteFavorite, note.isFavorite()); - bindTitle(context, binding.noteTitle, searchQuery, note, mainColor); + bindSearchableContent(context, binding.noteTitle, searchQuery, note.getTitle(), mainColor); } public View getNoteSwipeable() { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/SectionViewHolder.java b/app/src/main/java/it/niedermann/owncloud/notes/model/SectionViewHolder.java index b39f77ad..45eeb140 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/SectionViewHolder.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/SectionViewHolder.java @@ -11,13 +11,13 @@ public class SectionViewHolder extends RecyclerView.ViewHolder { public SectionViewHolder(ItemNotesListSectionItemBinding binding) { super(binding.getRoot()); this.binding = binding; - } - - public void bind(SectionItem item) { - binding.sectionTitle.setText(item.getTitle()); if (itemView.getLayoutParams() != null && itemView.getLayoutParams() instanceof StaggeredGridLayoutManager.LayoutParams) { ((StaggeredGridLayoutManager.LayoutParams) itemView.getLayoutParams()).setFullSpan(true); } } + + public void bind(SectionItem item) { + binding.sectionTitle.setText(item.getTitle()); + } } \ No newline at end of file diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesDatabase.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesDatabase.java index 1a31ae0a..286bfbd2 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesDatabase.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesDatabase.java @@ -41,8 +41,6 @@ import java.util.Set; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.android.activity.EditNoteActivity; -import it.niedermann.owncloud.notes.android.appwidget.NoteListWidget; -import it.niedermann.owncloud.notes.android.appwidget.SingleNoteWidget; import it.niedermann.owncloud.notes.model.ApiVersion; import it.niedermann.owncloud.notes.model.Capabilities; import it.niedermann.owncloud.notes.model.CloudNote; @@ -137,6 +135,17 @@ public class NotesDatabase extends AbstractNotesDatabase { return db.insert(table_notes, null, values); } + public void regenerateExcerpts(boolean stripMarkdown) { + SQLiteDatabase db = this.getWritableDatabase(); + Cursor cursor = db.query(table_notes, new String[]{key_id, key_content}, key_status + " != ?", new String[]{DBStatus.LOCAL_DELETED.getTitle()}, null, null, null); + ContentValues values = new ContentValues(1); + while (cursor.moveToNext()) { + values.put(key_excerpt, NoteUtil.generateNoteExcerpt(cursor.getString(1), stripMarkdown)); + db.update(table_notes, values, key_id + " = ?", new String[]{String.valueOf(cursor.getInt(0))}); + } + cursor.close(); + } + public void moveNoteToAnotherAccount(SingleSignOnAccount ssoAccount, long oldAccountId, DBNote note, long newAccountId) { // Add new note addNoteAndSync(ssoAccount, newAccountId, new CloudNote(0, note.getModified(), note.getTitle(), note.getContent(), note.isFavorite(), note.getCategory(), null)); @@ -616,7 +625,7 @@ public class NotesDatabase extends AbstractNotesDatabase { if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { ShortcutManager shortcutManager = getContext().getSystemService(ShortcutManager.class); - if(shortcutManager != null) { + if (shortcutManager != null) { shortcutManager.getPinnedShortcuts().forEach((shortcut) -> { String shortcutId = id + ""; if (shortcut.getId().equals(shortcutId)) { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/util/MarkDownUtil.java b/app/src/main/java/it/niedermann/owncloud/notes/util/MarkDownUtil.java index 66f89280..1a8c4b15 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/util/MarkDownUtil.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/util/MarkDownUtil.java @@ -85,14 +85,10 @@ public class MarkDownUtil { return ""; } - Log.v(TAG, "parseCompat - Original: \"" + text + "\""); - while (TextUtils.indexOf(text, MD_IMAGE_WITH_EMPTY_DESCRIPTION) >= 0) { text = TextUtils.replace(text, MD_IMAGE_WITH_EMPTY_DESCRIPTION_ARRAY, MD_IMAGE_WITH_SPACE_DESCRIPTION_ARRAY); } - Log.v(TAG, "parseCompat - Replaced empty image descriptions: \"" + text + "\""); - return markdownProcessor.parse(text); } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/util/NoteUtil.java b/app/src/main/java/it/niedermann/owncloud/notes/util/NoteUtil.java index bd83ce5c..11802b2b 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/util/NoteUtil.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/util/NoteUtil.java @@ -81,15 +81,29 @@ public class NoteUtil { /** * Generates an excerpt of a content String (reads second line which is not empty) * - * @param content String + * @param content {@link String} * @return excerpt String */ @NonNull public static String generateNoteExcerpt(@NonNull String content) { - if (content.contains("\n")) - return truncateString(removeMarkDown(content.replaceFirst("^.*\n", "")), 200).replace("\n", " "); - else + return generateNoteExcerpt(content, true); // TODO check gridview + } + + /** + * Generates an excerpt of a content String (reads second line which is not empty) + * + * @param content {@link String} + * @param stripMarkdown whether or not the markdown should be stripped from the excerpt + * @return excerpt String + */ + @NonNull + public static String generateNoteExcerpt(@NonNull String content, boolean stripMarkdown) { + if (!content.contains("\n")) { return ""; + } + return stripMarkdown + ? truncateString(removeMarkDown(content.replaceFirst("^.*\n", "")), 200).replace("\n", " ") + : truncateString(content.replaceFirst("^.*\n", ""), 200); } @NonNull diff --git a/app/src/main/res/layout/item_notes_list_note_item_grid.xml b/app/src/main/res/layout/item_notes_list_note_item_grid.xml index 694b5dd4..c3fe3676 100644 --- a/app/src/main/res/layout/item_notes_list_note_item_grid.xml +++ b/app/src/main/res/layout/item_notes_list_note_item_grid.xml @@ -2,40 +2,57 @@ + android:focusable="true"> + + - @@ -65,18 +82,6 @@ - - Date: Wed, 10 Jun 2020 13:10:49 +0200 Subject: Use stable ids in adapter --- .../main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java | 8 ++++++++ .../java/it/niedermann/owncloud/notes/model/NoteViewHolder.java | 3 ++- .../it/niedermann/owncloud/notes/model/SectionViewHolder.java | 7 +++---- 3 files changed, 13 insertions(+), 5 deletions(-) (limited to 'app/src/main') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java b/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java index 05a5bcfb..32fa3f1a 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java @@ -47,6 +47,14 @@ public class ItemAdapter extends RecyclerView.Adapter i this.gridView = gridView; this.mainColor = context.getResources().getColor(R.color.defaultBrand); this.textColor = Color.WHITE; + setHasStableIds(true); + } + + @Override + public long getItemId(int position) { + return getItemViewType(position) == TYPE_SECTION + ? ((SectionItem) getItem(position)).getTitle().hashCode() + : ((DBNote) getItem(position)).getId(); } /** diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java index db8f39f8..2c6a339a 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java @@ -138,7 +138,6 @@ public abstract class NoteViewHolder extends RecyclerView.ViewHolder implements } private void bindContent(@NonNull TextView textView, @NonNull CharSequence charSequence) { - textView.setText(charSequence); if (renderMarkdown) { new Thread(() -> { try { @@ -148,6 +147,8 @@ public abstract class NoteViewHolder extends RecyclerView.ViewHolder implements // Workaround for RxMarkdown: https://github.com/stefan-niedermann/nextcloud-notes/issues/668 } }).start(); + } else { + textView.setText(charSequence); } } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/SectionViewHolder.java b/app/src/main/java/it/niedermann/owncloud/notes/model/SectionViewHolder.java index 45eeb140..801ea822 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/SectionViewHolder.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/SectionViewHolder.java @@ -11,13 +11,12 @@ public class SectionViewHolder extends RecyclerView.ViewHolder { public SectionViewHolder(ItemNotesListSectionItemBinding binding) { super(binding.getRoot()); this.binding = binding; - - if (itemView.getLayoutParams() != null && itemView.getLayoutParams() instanceof StaggeredGridLayoutManager.LayoutParams) { - ((StaggeredGridLayoutManager.LayoutParams) itemView.getLayoutParams()).setFullSpan(true); - } } public void bind(SectionItem item) { binding.sectionTitle.setText(item.getTitle()); + if (itemView.getLayoutParams() != null && itemView.getLayoutParams() instanceof StaggeredGridLayoutManager.LayoutParams) { + ((StaggeredGridLayoutManager.LayoutParams) itemView.getLayoutParams()).setFullSpan(true); + } } } \ No newline at end of file -- cgit v1.2.3 From 53605bc67bd3f23eff72d0e526884ad47a993d5f Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Wed, 10 Jun 2020 13:30:18 +0200 Subject: Adjust styling --- .../notes/android/fragment/PreferencesFragment.java | 4 +++- .../it/niedermann/owncloud/notes/model/ItemAdapter.java | 2 +- .../it/niedermann/owncloud/notes/util/NoteUtil.java | 2 +- .../main/res/layout/item_notes_list_note_item_grid.xml | 17 ++++++++++++----- 4 files changed, 17 insertions(+), 8 deletions(-) (limited to 'app/src/main') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java b/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java index d8034ae6..e5121b2e 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java @@ -11,6 +11,7 @@ import androidx.preference.ListPreference; import androidx.preference.Preference; import androidx.preference.PreferenceFragmentCompat; +import it.niedermann.owncloud.notes.BuildConfig; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.android.DarkModeSetting; import it.niedermann.owncloud.notes.branding.Branded; @@ -60,11 +61,12 @@ public class PreferencesFragment extends PreferenceFragmentCompat implements Bra gridViewPref = findPreference(getString(R.string.pref_key_gridview)); if (gridViewPref != null) { + gridViewPref.setVisible(BuildConfig.DEBUG); gridViewPref.setOnPreferenceChangeListener((Preference preference, Object newValue) -> { final Boolean gridView = (Boolean) newValue; - NotesDatabase.getInstance(requireContext()).regenerateExcerpts(!gridView); Log.v(TAG, "gridView: " + gridView); requireActivity().setResult(Activity.RESULT_OK); + new Thread(() -> NotesDatabase.getInstance(requireContext()).regenerateExcerpts(!gridView)).start(); return true; }); } else { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java b/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java index 32fa3f1a..0bba4f33 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java @@ -53,7 +53,7 @@ public class ItemAdapter extends RecyclerView.Adapter i @Override public long getItemId(int position) { return getItemViewType(position) == TYPE_SECTION - ? ((SectionItem) getItem(position)).getTitle().hashCode() + ? ((SectionItem) getItem(position)).getTitle().hashCode() * -1 : ((DBNote) getItem(position)).getId(); } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/util/NoteUtil.java b/app/src/main/java/it/niedermann/owncloud/notes/util/NoteUtil.java index 11802b2b..337fb521 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/util/NoteUtil.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/util/NoteUtil.java @@ -102,7 +102,7 @@ public class NoteUtil { return ""; } return stripMarkdown - ? truncateString(removeMarkDown(content.replaceFirst("^.*\n", "")), 200).replace("\n", " ") + ? truncateString(removeMarkDown(content.replaceFirst("^.*\n", "")), 150).replace("\n", " ") : truncateString(content.replaceFirst("^.*\n", ""), 200); } diff --git a/app/src/main/res/layout/item_notes_list_note_item_grid.xml b/app/src/main/res/layout/item_notes_list_note_item_grid.xml index c3fe3676..98b6cb2b 100644 --- a/app/src/main/res/layout/item_notes_list_note_item_grid.xml +++ b/app/src/main/res/layout/item_notes_list_note_item_grid.xml @@ -19,7 +19,7 @@ android:layout_height="wrap_content" android:layout_marginStart="@dimen/spacer_2x" android:layout_marginLeft="@dimen/spacer_2x" - android:layout_marginTop="@dimen/spacer_2x" + android:layout_marginTop="@dimen/spacer_1x" android:background="@drawable/border" android:maxLines="1" android:paddingLeft="@dimen/spacer_1x" @@ -35,6 +35,7 @@ @@ -45,7 +46,6 @@ android:layout_weight="1" android:paddingStart="@dimen/spacer_2x" android:paddingLeft="@dimen/spacer_2x" - android:paddingTop="@dimen/spacer_2x" android:paddingEnd="@dimen/spacer_2x" android:paddingRight="@dimen/spacer_2x" android:textAppearance="?android:attr/textAppearanceMedium" @@ -58,7 +58,7 @@ + android:layout_height="match_parent"> Date: Wed, 10 Jun 2020 14:33:42 +0200 Subject: Use proper ItemDecoration class for defining gutter --- .../android/activity/NotesListViewActivity.java | 17 ++++---- .../owncloud/notes/model/GridItemDecoration.java | 47 ++++++++++++++++++++++ .../owncloud/notes/model/ItemAdapter.java | 12 ++++++ .../owncloud/notes/model/NoteViewGridHolder.java | 3 +- .../owncloud/notes/model/NoteViewHolder.java | 27 +++++-------- .../notes/model/NoteViewHolderWithExcerpt.java | 3 +- .../notes/model/NoteViewHolderWithoutExcerpt.java | 3 +- .../owncloud/notes/model/SectionViewHolder.java | 3 -- .../res/layout/item_notes_list_note_item_grid.xml | 1 - 9 files changed, 81 insertions(+), 35 deletions(-) create mode 100644 app/src/main/java/it/niedermann/owncloud/notes/model/GridItemDecoration.java (limited to 'app/src/main') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java index c6b14fef..ef940a63 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java @@ -64,6 +64,7 @@ import it.niedermann.owncloud.notes.formattinghelp.FormattingHelpActivity; import it.niedermann.owncloud.notes.model.Capabilities; import it.niedermann.owncloud.notes.model.Category; import it.niedermann.owncloud.notes.model.DBNote; +import it.niedermann.owncloud.notes.model.GridItemDecoration; import it.niedermann.owncloud.notes.model.ISyncCallback; import it.niedermann.owncloud.notes.model.Item; import it.niedermann.owncloud.notes.model.ItemAdapter; @@ -600,13 +601,15 @@ public class NotesListViewActivity extends LockedActivity implements NoteClickLi adapter = new ItemAdapter(this, gridView); listView.setAdapter(adapter); - final DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); - int spanCount = (int) ((displayMetrics.widthPixels / displayMetrics.density) / getResources().getInteger(R.integer.max_dp_grid_view)); - listView.setLayoutManager( - gridView - ? new StaggeredGridLayoutManager(spanCount, StaggeredGridLayoutManager.VERTICAL) - : new LinearLayoutManager(this) - ); + if (gridView) { + final DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); + int spanCount = (int) ((displayMetrics.widthPixels / displayMetrics.density) / getResources().getInteger(R.integer.max_dp_grid_view)); + StaggeredGridLayoutManager gridLayoutManager = new StaggeredGridLayoutManager(spanCount, StaggeredGridLayoutManager.VERTICAL); + listView.setLayoutManager(gridLayoutManager); + listView.addItemDecoration(new GridItemDecoration(adapter, getResources().getDimensionPixelSize(R.dimen.spacer_2x))); + } else { + listView.setLayoutManager(new LinearLayoutManager(this)); + } } private void refreshLists() { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/GridItemDecoration.java b/app/src/main/java/it/niedermann/owncloud/notes/model/GridItemDecoration.java new file mode 100644 index 00000000..3d7ae944 --- /dev/null +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/GridItemDecoration.java @@ -0,0 +1,47 @@ +package it.niedermann.owncloud.notes.model; + +import android.graphics.Rect; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.StaggeredGridLayoutManager; + +public class GridItemDecoration extends RecyclerView.ItemDecoration { + + @NonNull + private final ItemAdapter adapter; + private final int gutter; + + public GridItemDecoration(@NonNull ItemAdapter adapter, int gutter) { + this.adapter = adapter; + this.gutter = gutter; + } + + public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { + final int position = parent.getChildAdapterPosition(view); + final StaggeredGridLayoutManager.LayoutParams lp = (StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams(); + + if (adapter.getItemViewType(position) == ItemAdapter.TYPE_SECTION) { + lp.setFullSpan(true); + } else { + final int spanIndex = lp.getSpanIndex(); + + if (position >= 0) { + // First row gets some spacing at the top + if (position < adapter.getFirstPositionOfViewType(ItemAdapter.TYPE_SECTION)) { + outRect.top = gutter; + } + + // First column gets some spacing at the left and the right side + if (spanIndex == 0) { + outRect.left = gutter; + } + + // All columns get some spacing at the bottom and at the right side + outRect.right = gutter; + outRect.bottom = gutter; + } + } + } +} diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java b/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java index 0bba4f33..92635564 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java @@ -209,4 +209,16 @@ public class ItemAdapter extends RecyclerView.Adapter i public void setHighlightSearchQuery(CharSequence searchQuery) { this.searchQuery = searchQuery; } + + /** + * @return the position of the first item which matches the given viewtype, -1 if not available + */ + public int getFirstPositionOfViewType(@IntRange(from = 0, to = 2) int viewType) { + for (int i = 0; i < itemList.size(); i++) { + if (getItemViewType(i) == viewType) { + return i; + } + } + return -1; + } } \ No newline at end of file diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java index 7091d87e..22062832 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java @@ -16,8 +16,6 @@ public class NoteViewGridHolder extends NoteViewHolder { public NoteViewGridHolder(@NonNull ItemNotesListNoteItemGridBinding binding, @NonNull NoteClickListener noteClickListener) { super(binding.getRoot(), noteClickListener, true); this.binding = binding; - itemView.setOnClickListener(this); - itemView.setOnLongClickListener(this); } public void showSwipe(boolean left) { @@ -25,6 +23,7 @@ public class NoteViewGridHolder extends NoteViewHolder { } public void bind(@NonNull DBNote note, boolean showCategory, int mainColor, int textColor, @Nullable CharSequence searchQuery) { + super.bind(note, showCategory, mainColor, textColor, searchQuery); @NonNull final Context context = itemView.getContext(); bindCategory(context, binding.noteCategory, showCategory, note.getCategory(), mainColor); binding.noteStatus.setVisibility(DBStatus.VOID.equals(note.getStatus()) ? View.INVISIBLE : View.VISIBLE); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java index 2c6a339a..f063167a 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java @@ -14,6 +14,7 @@ import android.view.View; import android.widget.ImageView; import android.widget.TextView; +import androidx.annotation.CallSuper; import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -31,14 +32,15 @@ import it.niedermann.owncloud.notes.branding.BrandingUtil; import it.niedermann.owncloud.notes.util.MarkDownUtil; import it.niedermann.owncloud.notes.util.Notes; -import static androidx.recyclerview.widget.RecyclerView.NO_POSITION; import static it.niedermann.owncloud.notes.util.ColorUtil.contrastRatioIsSufficient; import static it.niedermann.owncloud.notes.util.ColorUtil.isColorDark; import static it.niedermann.owncloud.notes.util.MarkDownUtil.parseCompat; -public abstract class NoteViewHolder extends RecyclerView.ViewHolder implements View.OnLongClickListener, View.OnClickListener { +public abstract class NoteViewHolder extends RecyclerView.ViewHolder { + @NonNull private final NoteClickListener noteClickListener; private final boolean renderMarkdown; + @Nullable private MarkdownProcessor markdownProcessor; public NoteViewHolder(@NonNull View v, @NonNull NoteClickListener noteClickListener, boolean renderMarkdown) { @@ -50,25 +52,14 @@ public abstract class NoteViewHolder extends RecyclerView.ViewHolder implements markdownProcessor.factory(TextFactory.create()); markdownProcessor.config(MarkDownUtil.getMarkDownConfiguration(itemView.getContext()).build()); } - v.setOnClickListener(this); - v.setOnLongClickListener(this); } - @Override - public void onClick(View v) { - final int adapterPosition = getAdapterPosition(); - if (adapterPosition != NO_POSITION) { - noteClickListener.onNoteClick(adapterPosition, v); - } - } - - @Override - public boolean onLongClick(View v) { - return noteClickListener.onNoteLongClick(getAdapterPosition(), v); + @CallSuper + public void bind(@NonNull DBNote note, boolean showCategory, int mainColor, int textColor, @Nullable CharSequence searchQuery) { + itemView.setOnClickListener((view) -> noteClickListener.onNoteClick(getAdapterPosition(), view)); + itemView.setOnLongClickListener((view) -> noteClickListener.onNoteLongClick(getAdapterPosition(), view)); } - public abstract void bind(@NonNull DBNote note, boolean showCategory, int mainColor, int textColor, @Nullable CharSequence searchQuery); - protected void bindCategory(@NonNull Context context, @NonNull TextView noteCategory, boolean showCategory, @NonNull String category, int mainColor) { final boolean isDarkThemeActive = Notes.isDarkThemeActive(context); noteCategory.setVisibility(showCategory && !category.isEmpty() ? View.VISIBLE : View.GONE); @@ -138,7 +129,7 @@ public abstract class NoteViewHolder extends RecyclerView.ViewHolder implements } private void bindContent(@NonNull TextView textView, @NonNull CharSequence charSequence) { - if (renderMarkdown) { + if (renderMarkdown && markdownProcessor != null) { new Thread(() -> { try { final CharSequence parsedCharSequence = parseCompat(markdownProcessor, charSequence); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java index 05a743ab..a4ab40a2 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java @@ -16,8 +16,6 @@ public class NoteViewHolderWithExcerpt extends NoteViewHolder { public NoteViewHolderWithExcerpt(@NonNull ItemNotesListNoteItemWithExcerptBinding binding, @NonNull NoteClickListener noteClickListener) { super(binding.getRoot(), noteClickListener, false); this.binding = binding; - itemView.setOnClickListener(this); - itemView.setOnLongClickListener(this); } public void showSwipe(boolean left) { @@ -27,6 +25,7 @@ public class NoteViewHolderWithExcerpt extends NoteViewHolder { } public void bind(@NonNull DBNote note, boolean showCategory, int mainColor, int textColor, @Nullable CharSequence searchQuery) { + super.bind(note, showCategory, mainColor, textColor, searchQuery); @NonNull final Context context = itemView.getContext(); binding.noteSwipeable.setAlpha(DBStatus.LOCAL_DELETED.equals(note.getStatus()) ? 0.5f : 1.0f); bindCategory(context, binding.noteCategory, showCategory, note.getCategory(), mainColor); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java index 59a42f5c..ef56acbb 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java @@ -16,8 +16,6 @@ public class NoteViewHolderWithoutExcerpt extends NoteViewHolder { public NoteViewHolderWithoutExcerpt(@NonNull ItemNotesListNoteItemWithoutExcerptBinding binding, @NonNull NoteClickListener noteClickListener) { super(binding.getRoot(), noteClickListener, false); this.binding = binding; - itemView.setOnClickListener(this); - itemView.setOnLongClickListener(this); } @@ -28,6 +26,7 @@ public class NoteViewHolderWithoutExcerpt extends NoteViewHolder { } public void bind(@NonNull DBNote note, boolean showCategory, int mainColor, int textColor, @Nullable CharSequence searchQuery) { + super.bind(note, showCategory, mainColor, textColor, searchQuery); @NonNull final Context context = itemView.getContext(); binding.noteSwipeable.setAlpha(DBStatus.LOCAL_DELETED.equals(note.getStatus()) ? 0.5f : 1.0f); bindCategory(context, binding.noteCategory, showCategory, note.getCategory(), mainColor); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/SectionViewHolder.java b/app/src/main/java/it/niedermann/owncloud/notes/model/SectionViewHolder.java index 801ea822..eccdd7d9 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/SectionViewHolder.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/SectionViewHolder.java @@ -15,8 +15,5 @@ public class SectionViewHolder extends RecyclerView.ViewHolder { public void bind(SectionItem item) { binding.sectionTitle.setText(item.getTitle()); - if (itemView.getLayoutParams() != null && itemView.getLayoutParams() instanceof StaggeredGridLayoutManager.LayoutParams) { - ((StaggeredGridLayoutManager.LayoutParams) itemView.getLayoutParams()).setFullSpan(true); - } } } \ No newline at end of file diff --git a/app/src/main/res/layout/item_notes_list_note_item_grid.xml b/app/src/main/res/layout/item_notes_list_note_item_grid.xml index 98b6cb2b..3fe1c09e 100644 --- a/app/src/main/res/layout/item_notes_list_note_item_grid.xml +++ b/app/src/main/res/layout/item_notes_list_note_item_grid.xml @@ -5,7 +5,6 @@ android:id="@+id/card" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_margin="@dimen/spacer_1x" android:focusable="true"> Date: Wed, 10 Jun 2020 16:58:43 +0200 Subject: Remove markdown rendering due to its bad performance --- .../android/activity/NotesListViewActivity.java | 28 +++++-- .../android/fragment/PreferencesFragment.java | 3 +- .../owncloud/notes/model/GridItemDecoration.java | 8 +- .../owncloud/notes/model/NoteViewGridHolder.java | 2 +- .../owncloud/notes/model/NoteViewHolder.java | 35 +------- .../notes/model/NoteViewHolderWithExcerpt.java | 2 +- .../notes/model/NoteViewHolderWithoutExcerpt.java | 2 +- .../notes/model/SectionItemDecoration.java | 39 +++++++++ .../owncloud/notes/persistence/NotesDatabase.java | 13 +-- .../persistence/migration/Migration_9_10.java | 2 +- .../niedermann/owncloud/notes/util/NoteUtil.java | 23 ++---- .../it/niedermann/owncloud/notes/util/Notes.java | 13 +++ .../main/res/layout/activity_notes_list_view.xml | 3 +- .../res/layout/item_notes_list_note_item_grid.xml | 95 ++++++++++++---------- .../res/layout/item_notes_list_section_item.xml | 8 +- app/src/main/res/values/dimens.xml | 2 + app/src/main/res/values/integers.xml | 2 +- 17 files changed, 157 insertions(+), 123 deletions(-) create mode 100644 app/src/main/java/it/niedermann/owncloud/notes/model/SectionItemDecoration.java (limited to 'app/src/main') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java index ef940a63..c5956a80 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java @@ -23,6 +23,7 @@ import androidx.annotation.NonNull; import androidx.appcompat.view.ActionMode; import androidx.appcompat.widget.SearchView; import androidx.coordinatorlayout.widget.CoordinatorLayout; +import androidx.core.content.ContextCompat; import androidx.core.graphics.drawable.DrawableCompat; import androidx.core.view.GravityCompat; import androidx.core.view.ViewCompat; @@ -68,6 +69,7 @@ import it.niedermann.owncloud.notes.model.GridItemDecoration; import it.niedermann.owncloud.notes.model.ISyncCallback; import it.niedermann.owncloud.notes.model.Item; import it.niedermann.owncloud.notes.model.ItemAdapter; +import it.niedermann.owncloud.notes.model.SectionItemDecoration; import it.niedermann.owncloud.notes.model.LocalAccount; import it.niedermann.owncloud.notes.model.NavigationAdapter; import it.niedermann.owncloud.notes.model.NavigationAdapter.CategoryNavigationItem; @@ -84,9 +86,9 @@ import it.niedermann.owncloud.notes.util.NoteUtil; import static android.view.View.GONE; import static android.view.View.VISIBLE; -import static androidx.preference.PreferenceManager.getDefaultSharedPreferences; import static it.niedermann.owncloud.notes.branding.BrandingUtil.getSecondaryForegroundColorDependingOnTheme; import static it.niedermann.owncloud.notes.util.ColorUtil.contrastRatioIsSufficient; +import static it.niedermann.owncloud.notes.util.Notes.isGridViewEnabled; import static it.niedermann.owncloud.notes.util.SSOUtil.askForNewAccount; import static java.util.Arrays.asList; @@ -129,7 +131,7 @@ public class NotesListViewActivity extends LockedActivity implements NoteClickLi protected FloatingActionButton fabCreate; private RecyclerView listView; - protected ItemAdapter adapter = null; + protected ItemAdapter adapter; protected NotesDatabase db = null; private NavigationAdapter adapterCategories; @@ -183,7 +185,10 @@ public class NotesListViewActivity extends LockedActivity implements NoteClickLi db = NotesDatabase.getInstance(this); - gridView = getDefaultSharedPreferences(this).getBoolean(getString(R.string.pref_key_gridview), false); + gridView = isGridViewEnabled(this); + if (!gridView) { + activityBinding.activityNotesListView.setBackgroundColor(ContextCompat.getColor(this, R.color.primary)); + } setupToolbars(); setupNavigationList(categoryAdapterSelectedItem); @@ -606,9 +611,22 @@ public class NotesListViewActivity extends LockedActivity implements NoteClickLi int spanCount = (int) ((displayMetrics.widthPixels / displayMetrics.density) / getResources().getInteger(R.integer.max_dp_grid_view)); StaggeredGridLayoutManager gridLayoutManager = new StaggeredGridLayoutManager(spanCount, StaggeredGridLayoutManager.VERTICAL); listView.setLayoutManager(gridLayoutManager); - listView.addItemDecoration(new GridItemDecoration(adapter, getResources().getDimensionPixelSize(R.dimen.spacer_2x))); + listView.addItemDecoration(new GridItemDecoration(adapter, + getResources().getDimensionPixelSize(R.dimen.spacer_3x), + getResources().getDimensionPixelSize(R.dimen.spacer_5x), + getResources().getDimensionPixelSize(R.dimen.spacer_3x), + getResources().getDimensionPixelSize(R.dimen.spacer_1x), + getResources().getDimensionPixelSize(R.dimen.spacer_2x) + )); } else { - listView.setLayoutManager(new LinearLayoutManager(this)); + LinearLayoutManager layoutManager = new LinearLayoutManager(this); + listView.setLayoutManager(layoutManager); + listView.addItemDecoration(new SectionItemDecoration(adapter, + getResources().getDimensionPixelSize(R.dimen.spacer_6x), + getResources().getDimensionPixelSize(R.dimen.spacer_5x), + getResources().getDimensionPixelSize(R.dimen.spacer_1x), + 0 + )); } } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java b/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java index e5121b2e..c89763ef 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java @@ -66,7 +66,8 @@ public class PreferencesFragment extends PreferenceFragmentCompat implements Bra final Boolean gridView = (Boolean) newValue; Log.v(TAG, "gridView: " + gridView); requireActivity().setResult(Activity.RESULT_OK); - new Thread(() -> NotesDatabase.getInstance(requireContext()).regenerateExcerpts(!gridView)).start(); + new Thread(() -> NotesDatabase.getInstance(requireContext()).regenerateExcerpts(gridView)).start(); + Notes.updateGridViewEnabled(gridView); return true; }); } else { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/GridItemDecoration.java b/app/src/main/java/it/niedermann/owncloud/notes/model/GridItemDecoration.java index 3d7ae944..6443121e 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/GridItemDecoration.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/GridItemDecoration.java @@ -4,21 +4,25 @@ import android.graphics.Rect; import android.view.View; import androidx.annotation.NonNull; +import androidx.annotation.Px; import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.StaggeredGridLayoutManager; -public class GridItemDecoration extends RecyclerView.ItemDecoration { +public class GridItemDecoration extends SectionItemDecoration { @NonNull private final ItemAdapter adapter; private final int gutter; - public GridItemDecoration(@NonNull ItemAdapter adapter, int gutter) { + public GridItemDecoration(@NonNull ItemAdapter adapter, @Px int sectionLeft, @Px int sectionTop, @Px int sectionRight, @Px int sectionBottom, @Px int gutter) { + super(adapter, sectionLeft, sectionTop, sectionRight, sectionBottom); this.adapter = adapter; this.gutter = gutter; } + @Override public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { + super.getItemOffsets(outRect, view, parent, state); final int position = parent.getChildAdapterPosition(view); final StaggeredGridLayoutManager.LayoutParams lp = (StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams(); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java index 22062832..0054ce01 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java @@ -14,7 +14,7 @@ public class NoteViewGridHolder extends NoteViewHolder { private final ItemNotesListNoteItemGridBinding binding; public NoteViewGridHolder(@NonNull ItemNotesListNoteItemGridBinding binding, @NonNull NoteClickListener noteClickListener) { - super(binding.getRoot(), noteClickListener, true); + super(binding.getRoot(), noteClickListener); this.binding = binding; } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java index f063167a..db211b85 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java @@ -4,8 +4,6 @@ import android.content.Context; import android.graphics.Color; import android.graphics.drawable.GradientDrawable; import android.os.Build; -import android.os.Handler; -import android.os.Looper; import android.text.SpannableString; import android.text.TextUtils; import android.text.style.BackgroundColorSpan; @@ -21,37 +19,23 @@ import androidx.annotation.Nullable; import androidx.core.graphics.drawable.DrawableCompat; import androidx.recyclerview.widget.RecyclerView; -import com.yydcdut.markdown.MarkdownProcessor; -import com.yydcdut.markdown.syntax.text.TextFactory; - import java.util.regex.Matcher; import java.util.regex.Pattern; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.branding.BrandingUtil; -import it.niedermann.owncloud.notes.util.MarkDownUtil; import it.niedermann.owncloud.notes.util.Notes; import static it.niedermann.owncloud.notes.util.ColorUtil.contrastRatioIsSufficient; import static it.niedermann.owncloud.notes.util.ColorUtil.isColorDark; -import static it.niedermann.owncloud.notes.util.MarkDownUtil.parseCompat; public abstract class NoteViewHolder extends RecyclerView.ViewHolder { @NonNull private final NoteClickListener noteClickListener; - private final boolean renderMarkdown; - @Nullable - private MarkdownProcessor markdownProcessor; - public NoteViewHolder(@NonNull View v, @NonNull NoteClickListener noteClickListener, boolean renderMarkdown) { + public NoteViewHolder(@NonNull View v, @NonNull NoteClickListener noteClickListener) { super(v); this.noteClickListener = noteClickListener; - this.renderMarkdown = renderMarkdown; - if (renderMarkdown) { - markdownProcessor = new MarkdownProcessor(itemView.getContext()); - markdownProcessor.factory(TextFactory.create()); - markdownProcessor.config(MarkDownUtil.getMarkDownConfiguration(itemView.getContext()).build()); - } } @CallSuper @@ -125,22 +109,7 @@ public abstract class NoteViewHolder extends RecyclerView.ViewHolder { processedContent = spannableString; } - bindContent(textView, processedContent); - } - - private void bindContent(@NonNull TextView textView, @NonNull CharSequence charSequence) { - if (renderMarkdown && markdownProcessor != null) { - new Thread(() -> { - try { - final CharSequence parsedCharSequence = parseCompat(markdownProcessor, charSequence); - new Handler(Looper.getMainLooper()).post(() -> textView.setText(parsedCharSequence)); - } catch (StringIndexOutOfBoundsException e) { - // Workaround for RxMarkdown: https://github.com/stefan-niedermann/nextcloud-notes/issues/668 - } - }).start(); - } else { - textView.setText(charSequence); - } + textView.setText(processedContent); } public abstract void showSwipe(boolean left); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java index a4ab40a2..1becf381 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java @@ -14,7 +14,7 @@ public class NoteViewHolderWithExcerpt extends NoteViewHolder { private final ItemNotesListNoteItemWithExcerptBinding binding; public NoteViewHolderWithExcerpt(@NonNull ItemNotesListNoteItemWithExcerptBinding binding, @NonNull NoteClickListener noteClickListener) { - super(binding.getRoot(), noteClickListener, false); + super(binding.getRoot(), noteClickListener); this.binding = binding; } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java index ef56acbb..78a74a5f 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java @@ -14,7 +14,7 @@ public class NoteViewHolderWithoutExcerpt extends NoteViewHolder { private final ItemNotesListNoteItemWithoutExcerptBinding binding; public NoteViewHolderWithoutExcerpt(@NonNull ItemNotesListNoteItemWithoutExcerptBinding binding, @NonNull NoteClickListener noteClickListener) { - super(binding.getRoot(), noteClickListener, false); + super(binding.getRoot(), noteClickListener); this.binding = binding; } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/SectionItemDecoration.java b/app/src/main/java/it/niedermann/owncloud/notes/model/SectionItemDecoration.java new file mode 100644 index 00000000..baf95926 --- /dev/null +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/SectionItemDecoration.java @@ -0,0 +1,39 @@ +package it.niedermann.owncloud.notes.model; + +import android.graphics.Rect; +import android.view.View; + +import androidx.annotation.CallSuper; +import androidx.annotation.NonNull; +import androidx.annotation.Px; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.StaggeredGridLayoutManager; + +public class SectionItemDecoration extends RecyclerView.ItemDecoration { + + @NonNull + private final ItemAdapter adapter; + private final int sectionLeft; + private final int sectionTop; + private final int sectionRight; + private final int sectionBottom; + + public SectionItemDecoration(@NonNull ItemAdapter adapter, @Px int sectionLeft, @Px int sectionTop, @Px int sectionRight, @Px int sectionBottom) { + this.adapter = adapter; + this.sectionLeft = sectionLeft; + this.sectionTop = sectionTop; + this.sectionRight = sectionRight; + this.sectionBottom = sectionBottom; + } + + @CallSuper + public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { + final int position = parent.getChildAdapterPosition(view); + if (adapter.getItemViewType(position) == ItemAdapter.TYPE_SECTION) { + outRect.left = sectionLeft; + outRect.top = sectionTop; + outRect.right = sectionRight; + outRect.bottom = sectionBottom; + } + } +} diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesDatabase.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesDatabase.java index 286bfbd2..ae595cd7 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesDatabase.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesDatabase.java @@ -58,6 +58,7 @@ import static it.niedermann.owncloud.notes.android.activity.EditNoteActivity.ACT import static it.niedermann.owncloud.notes.android.appwidget.NoteListWidget.updateNoteListWidgets; import static it.niedermann.owncloud.notes.android.appwidget.SingleNoteWidget.updateSingleNoteWidgets; import static it.niedermann.owncloud.notes.model.NoteListsWidgetData.MODE_DISPLAY_CATEGORY; +import static it.niedermann.owncloud.notes.util.Notes.isGridViewEnabled; /** * Helps to add, get, update and delete Notes with the option to trigger a Resync with the Server. @@ -94,7 +95,7 @@ public class NotesDatabase extends AbstractNotesDatabase { * @param note Note */ public long addNoteAndSync(SingleSignOnAccount ssoAccount, long accountId, CloudNote note) { - DBNote dbNote = new DBNote(0, 0, note.getModified(), note.getTitle(), note.getContent(), note.isFavorite(), note.getCategory(), note.getEtag(), DBStatus.LOCAL_EDITED, accountId, NoteUtil.generateNoteExcerpt(note.getContent()), 0); + DBNote dbNote = new DBNote(0, 0, note.getModified(), note.getTitle(), note.getContent(), note.isFavorite(), note.getCategory(), note.getEtag(), DBStatus.LOCAL_EDITED, accountId, NoteUtil.generateNoteExcerpt(note.getContent(), isGridViewEnabled(context)), 0); long id = addNote(accountId, dbNote); notifyWidgets(); getNoteServerSyncHelper().scheduleSync(ssoAccount, true); @@ -121,7 +122,7 @@ public class NotesDatabase extends AbstractNotesDatabase { } else { values.put(key_status, DBStatus.VOID.getTitle()); values.put(key_account_id, accountId); - values.put(key_excerpt, NoteUtil.generateNoteExcerpt(note.getContent())); + values.put(key_excerpt, NoteUtil.generateNoteExcerpt(note.getContent(), isGridViewEnabled(context))); } if (note.getRemoteId() > 0) { values.put(key_remote_id, note.getRemoteId()); @@ -135,12 +136,12 @@ public class NotesDatabase extends AbstractNotesDatabase { return db.insert(table_notes, null, values); } - public void regenerateExcerpts(boolean stripMarkdown) { + public void regenerateExcerpts(boolean keepMarkdown) { SQLiteDatabase db = this.getWritableDatabase(); Cursor cursor = db.query(table_notes, new String[]{key_id, key_content}, key_status + " != ?", new String[]{DBStatus.LOCAL_DELETED.getTitle()}, null, null, null); ContentValues values = new ContentValues(1); while (cursor.moveToNext()) { - values.put(key_excerpt, NoteUtil.generateNoteExcerpt(cursor.getString(1), stripMarkdown)); + values.put(key_excerpt, NoteUtil.generateNoteExcerpt(cursor.getString(1), keepMarkdown)); db.update(table_notes, values, key_id + " = ?", new String[]{String.valueOf(cursor.getInt(0))}); } cursor.close(); @@ -521,7 +522,7 @@ public class NotesDatabase extends AbstractNotesDatabase { if (newContent == null) { newNote = new DBNote(oldNote.getId(), oldNote.getRemoteId(), oldNote.getModified(), oldNote.getTitle(), oldNote.getContent(), oldNote.isFavorite(), oldNote.getCategory(), oldNote.getEtag(), DBStatus.LOCAL_EDITED, accountId, oldNote.getExcerpt(), oldNote.getScrollY()); } else { - newNote = new DBNote(oldNote.getId(), oldNote.getRemoteId(), Calendar.getInstance(), NoteUtil.generateNonEmptyNoteTitle(newContent, getContext()), newContent, oldNote.isFavorite(), oldNote.getCategory(), oldNote.getEtag(), DBStatus.LOCAL_EDITED, accountId, NoteUtil.generateNoteExcerpt(newContent), oldNote.getScrollY()); + newNote = new DBNote(oldNote.getId(), oldNote.getRemoteId(), Calendar.getInstance(), NoteUtil.generateNonEmptyNoteTitle(newContent, getContext()), newContent, oldNote.isFavorite(), oldNote.getCategory(), oldNote.getEtag(), DBStatus.LOCAL_EDITED, accountId, NoteUtil.generateNoteExcerpt(newContent, isGridViewEnabled(context)), oldNote.getScrollY()); } SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(7); @@ -585,7 +586,7 @@ public class NotesDatabase extends AbstractNotesDatabase { values.put(key_favorite, remoteNote.isFavorite()); values.put(key_category, getCategoryIdByTitle(localAccount.getId(), remoteNote.getCategory())); values.put(key_etag, remoteNote.getEtag()); - values.put(key_excerpt, NoteUtil.generateNoteExcerpt(remoteNote.getContent())); + values.put(key_excerpt, NoteUtil.generateNoteExcerpt(remoteNote.getContent(), isGridViewEnabled(context))); String whereClause; String[] whereArgs; if (forceUnchangedDBNoteState != null) { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/migration/Migration_9_10.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/migration/Migration_9_10.java index 98ddc601..855130f1 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/migration/Migration_9_10.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/migration/Migration_9_10.java @@ -18,7 +18,7 @@ public class Migration_9_10 { Cursor cursor = db.query("NOTES", new String[]{"ID", "CONTENT"}, null, null, null, null, null, null); while (cursor.moveToNext()) { ContentValues values = new ContentValues(); - values.put("EXCERPT", NoteUtil.generateNoteExcerpt(cursor.getString(1))); + values.put("EXCERPT", NoteUtil.generateNoteExcerpt(cursor.getString(1), false)); db.update("NOTES", values, "ID" + " = ? ", new String[]{cursor.getString(0)}); } cursor.close(); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/util/NoteUtil.java b/app/src/main/java/it/niedermann/owncloud/notes/util/NoteUtil.java index 337fb521..225f63e9 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/util/NoteUtil.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/util/NoteUtil.java @@ -81,29 +81,18 @@ public class NoteUtil { /** * Generates an excerpt of a content String (reads second line which is not empty) * - * @param content {@link String} + * @param content {@link String} + * @param keepMarkdown whether or not the markdown should be stripped from the excerpt * @return excerpt String */ @NonNull - public static String generateNoteExcerpt(@NonNull String content) { - return generateNoteExcerpt(content, true); // TODO check gridview - } - - /** - * Generates an excerpt of a content String (reads second line which is not empty) - * - * @param content {@link String} - * @param stripMarkdown whether or not the markdown should be stripped from the excerpt - * @return excerpt String - */ - @NonNull - public static String generateNoteExcerpt(@NonNull String content, boolean stripMarkdown) { + public static String generateNoteExcerpt(@NonNull String content, boolean keepMarkdown) { if (!content.contains("\n")) { return ""; } - return stripMarkdown - ? truncateString(removeMarkDown(content.replaceFirst("^.*\n", "")), 150).replace("\n", " ") - : truncateString(content.replaceFirst("^.*\n", ""), 200); + return keepMarkdown + ? truncateString(removeMarkDown(content.replaceFirst("^.*\n", "")), 150) + : truncateString(removeMarkDown(content.replaceFirst("^.*\n", "")), 150).replace("\n", " "); } @NonNull diff --git a/app/src/main/java/it/niedermann/owncloud/notes/util/Notes.java b/app/src/main/java/it/niedermann/owncloud/notes/util/Notes.java index 9a4de905..f671bd2b 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/util/Notes.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/util/Notes.java @@ -6,12 +6,15 @@ import android.content.SharedPreferences; import android.content.res.Configuration; import android.util.Log; +import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatDelegate; import androidx.preference.PreferenceManager; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.android.DarkModeSetting; +import static androidx.preference.PreferenceManager.getDefaultSharedPreferences; + public class Notes extends Application { private static final String TAG = Notes.class.getSimpleName(); @@ -20,6 +23,7 @@ public class Notes extends Application { private static boolean isLocked = true; private static long lastInteraction = 0; private static String PREF_KEY_THEME; + private static boolean isGridViewEnabled = false; @Override public void onCreate() { @@ -27,6 +31,7 @@ public class Notes extends Application { setAppTheme(getAppTheme(getApplicationContext())); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); lockedPreference = prefs.getBoolean(getString(R.string.pref_key_lock), false); + isGridViewEnabled = getDefaultSharedPreferences(this).getBoolean(getString(R.string.pref_key_gridview), false); super.onCreate(); } @@ -34,6 +39,14 @@ public class Notes extends Application { AppCompatDelegate.setDefaultNightMode(setting.getModeId()); } + public static boolean isGridViewEnabled(@NonNull Context context) { + return isGridViewEnabled; + } + + public static void updateGridViewEnabled(Boolean gridView) { + isGridViewEnabled = gridView; + } + public static DarkModeSetting getAppTheme(Context context) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); String mode; diff --git a/app/src/main/res/layout/activity_notes_list_view.xml b/app/src/main/res/layout/activity_notes_list_view.xml index b1f318ed..47aa0186 100644 --- a/app/src/main/res/layout/activity_notes_list_view.xml +++ b/app/src/main/res/layout/activity_notes_list_view.xml @@ -4,8 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_notes_list_view" android:layout_width="match_parent" - android:layout_height="match_parent" - android:background="@color/primary"> + android:layout_height="match_parent"> + android:layout_height="match_parent" + android:orientation="vertical" + android:paddingBottom="@dimen/spacer_2x"> - - + android:orientation="vertical" + android:paddingTop="@dimen/spacer_1x"> + + + + + + android:layout_height="wrap_content" + android:layout_gravity="top"> \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index d5578788..3ffa7d38 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -6,6 +6,8 @@ 8dp 16dp 24dp + 40dp + 48dp 100dp diff --git a/app/src/main/res/values/integers.xml b/app/src/main/res/values/integers.xml index 76c18a8b..3a6f3f24 100644 --- a/app/src/main/res/values/integers.xml +++ b/app/src/main/res/values/integers.xml @@ -1,4 +1,4 @@ - 150 + 170 \ No newline at end of file -- cgit v1.2.3 From 484fdd5cf366010b48a95610ad5cfb86872ddd1f Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Wed, 10 Jun 2020 17:16:58 +0200 Subject: Use one excerpt for Grid and List layout --- .../android/activity/NotesListViewActivity.java | 7 ++++--- .../notes/android/fragment/PreferencesFragment.java | 1 - .../owncloud/notes/model/NoteViewGridHolder.java | 11 ++++++++--- .../notes/model/NoteViewHolderWithExcerpt.java | 1 + .../owncloud/notes/persistence/NotesDatabase.java | 20 ++++---------------- .../notes/persistence/migration/Migration_9_10.java | 2 +- .../it/niedermann/owncloud/notes/util/NoteUtil.java | 13 +++++-------- .../it/niedermann/owncloud/notes/util/Notes.java | 4 ++-- .../res/layout/item_notes_list_note_item_grid.xml | 12 +++++++----- 9 files changed, 32 insertions(+), 39 deletions(-) (limited to 'app/src/main') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java index c5956a80..ccfbbe41 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java @@ -69,12 +69,12 @@ import it.niedermann.owncloud.notes.model.GridItemDecoration; import it.niedermann.owncloud.notes.model.ISyncCallback; import it.niedermann.owncloud.notes.model.Item; import it.niedermann.owncloud.notes.model.ItemAdapter; -import it.niedermann.owncloud.notes.model.SectionItemDecoration; import it.niedermann.owncloud.notes.model.LocalAccount; import it.niedermann.owncloud.notes.model.NavigationAdapter; import it.niedermann.owncloud.notes.model.NavigationAdapter.CategoryNavigationItem; import it.niedermann.owncloud.notes.model.NavigationAdapter.NavigationItem; import it.niedermann.owncloud.notes.model.NoteClickListener; +import it.niedermann.owncloud.notes.model.SectionItemDecoration; import it.niedermann.owncloud.notes.persistence.CapabilitiesClient; import it.niedermann.owncloud.notes.persistence.CapabilitiesWorker; import it.niedermann.owncloud.notes.persistence.LoadNotesListTask; @@ -88,6 +88,7 @@ import static android.view.View.GONE; import static android.view.View.VISIBLE; import static it.niedermann.owncloud.notes.branding.BrandingUtil.getSecondaryForegroundColorDependingOnTheme; import static it.niedermann.owncloud.notes.util.ColorUtil.contrastRatioIsSufficient; +import static it.niedermann.owncloud.notes.util.Notes.isDarkThemeActive; import static it.niedermann.owncloud.notes.util.Notes.isGridViewEnabled; import static it.niedermann.owncloud.notes.util.SSOUtil.askForNewAccount; import static java.util.Arrays.asList; @@ -185,8 +186,8 @@ public class NotesListViewActivity extends LockedActivity implements NoteClickLi db = NotesDatabase.getInstance(this); - gridView = isGridViewEnabled(this); - if (!gridView) { + gridView = isGridViewEnabled(); + if (!gridView || isDarkThemeActive(this)) { activityBinding.activityNotesListView.setBackgroundColor(ContextCompat.getColor(this, R.color.primary)); } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java b/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java index c89763ef..f4ea6b02 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java @@ -66,7 +66,6 @@ public class PreferencesFragment extends PreferenceFragmentCompat implements Bra final Boolean gridView = (Boolean) newValue; Log.v(TAG, "gridView: " + gridView); requireActivity().setResult(Activity.RESULT_OK); - new Thread(() -> NotesDatabase.getInstance(requireContext()).regenerateExcerpts(gridView)).start(); Notes.updateGridViewEnabled(gridView); return true; }); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java index 0054ce01..a0a773ec 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java @@ -1,7 +1,7 @@ package it.niedermann.owncloud.notes.model; import android.content.Context; -import android.util.Log; +import android.text.TextUtils; import android.view.View; import androidx.annotation.NonNull; @@ -9,6 +9,10 @@ import androidx.annotation.Nullable; import it.niedermann.owncloud.notes.databinding.ItemNotesListNoteItemGridBinding; +import static android.view.View.GONE; +import static android.view.View.INVISIBLE; +import static android.view.View.VISIBLE; + public class NoteViewGridHolder extends NoteViewHolder { @NonNull private final ItemNotesListNoteItemGridBinding binding; @@ -26,10 +30,11 @@ public class NoteViewGridHolder extends NoteViewHolder { super.bind(note, showCategory, mainColor, textColor, searchQuery); @NonNull final Context context = itemView.getContext(); bindCategory(context, binding.noteCategory, showCategory, note.getCategory(), mainColor); - binding.noteStatus.setVisibility(DBStatus.VOID.equals(note.getStatus()) ? View.INVISIBLE : View.VISIBLE); + binding.noteStatus.setVisibility(DBStatus.VOID.equals(note.getStatus()) ? INVISIBLE : VISIBLE); bindFavorite(binding.noteFavorite, note.isFavorite()); bindSearchableContent(context, binding.noteTitle, searchQuery, note.getTitle(), mainColor); - bindSearchableContent(context, binding.noteContent, searchQuery, note.getExcerpt(), mainColor); + bindSearchableContent(context, binding.noteExcerpt, searchQuery, note.getExcerpt().replace(" ", "\n"), mainColor); + binding.noteExcerpt.setVisibility(TextUtils.isEmpty(note.getExcerpt()) ? GONE : VISIBLE); } public View getNoteSwipeable() { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java index 1becf381..ac87768c 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java @@ -1,6 +1,7 @@ package it.niedermann.owncloud.notes.model; import android.content.Context; +import android.text.TextUtils; import android.view.View; import androidx.annotation.NonNull; diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesDatabase.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesDatabase.java index ae595cd7..40df4efa 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesDatabase.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesDatabase.java @@ -58,7 +58,6 @@ import static it.niedermann.owncloud.notes.android.activity.EditNoteActivity.ACT import static it.niedermann.owncloud.notes.android.appwidget.NoteListWidget.updateNoteListWidgets; import static it.niedermann.owncloud.notes.android.appwidget.SingleNoteWidget.updateSingleNoteWidgets; import static it.niedermann.owncloud.notes.model.NoteListsWidgetData.MODE_DISPLAY_CATEGORY; -import static it.niedermann.owncloud.notes.util.Notes.isGridViewEnabled; /** * Helps to add, get, update and delete Notes with the option to trigger a Resync with the Server. @@ -95,7 +94,7 @@ public class NotesDatabase extends AbstractNotesDatabase { * @param note Note */ public long addNoteAndSync(SingleSignOnAccount ssoAccount, long accountId, CloudNote note) { - DBNote dbNote = new DBNote(0, 0, note.getModified(), note.getTitle(), note.getContent(), note.isFavorite(), note.getCategory(), note.getEtag(), DBStatus.LOCAL_EDITED, accountId, NoteUtil.generateNoteExcerpt(note.getContent(), isGridViewEnabled(context)), 0); + DBNote dbNote = new DBNote(0, 0, note.getModified(), note.getTitle(), note.getContent(), note.isFavorite(), note.getCategory(), note.getEtag(), DBStatus.LOCAL_EDITED, accountId, NoteUtil.generateNoteExcerpt(note.getContent()), 0); long id = addNote(accountId, dbNote); notifyWidgets(); getNoteServerSyncHelper().scheduleSync(ssoAccount, true); @@ -122,7 +121,7 @@ public class NotesDatabase extends AbstractNotesDatabase { } else { values.put(key_status, DBStatus.VOID.getTitle()); values.put(key_account_id, accountId); - values.put(key_excerpt, NoteUtil.generateNoteExcerpt(note.getContent(), isGridViewEnabled(context))); + values.put(key_excerpt, NoteUtil.generateNoteExcerpt(note.getContent())); } if (note.getRemoteId() > 0) { values.put(key_remote_id, note.getRemoteId()); @@ -136,17 +135,6 @@ public class NotesDatabase extends AbstractNotesDatabase { return db.insert(table_notes, null, values); } - public void regenerateExcerpts(boolean keepMarkdown) { - SQLiteDatabase db = this.getWritableDatabase(); - Cursor cursor = db.query(table_notes, new String[]{key_id, key_content}, key_status + " != ?", new String[]{DBStatus.LOCAL_DELETED.getTitle()}, null, null, null); - ContentValues values = new ContentValues(1); - while (cursor.moveToNext()) { - values.put(key_excerpt, NoteUtil.generateNoteExcerpt(cursor.getString(1), keepMarkdown)); - db.update(table_notes, values, key_id + " = ?", new String[]{String.valueOf(cursor.getInt(0))}); - } - cursor.close(); - } - public void moveNoteToAnotherAccount(SingleSignOnAccount ssoAccount, long oldAccountId, DBNote note, long newAccountId) { // Add new note addNoteAndSync(ssoAccount, newAccountId, new CloudNote(0, note.getModified(), note.getTitle(), note.getContent(), note.isFavorite(), note.getCategory(), null)); @@ -522,7 +510,7 @@ public class NotesDatabase extends AbstractNotesDatabase { if (newContent == null) { newNote = new DBNote(oldNote.getId(), oldNote.getRemoteId(), oldNote.getModified(), oldNote.getTitle(), oldNote.getContent(), oldNote.isFavorite(), oldNote.getCategory(), oldNote.getEtag(), DBStatus.LOCAL_EDITED, accountId, oldNote.getExcerpt(), oldNote.getScrollY()); } else { - newNote = new DBNote(oldNote.getId(), oldNote.getRemoteId(), Calendar.getInstance(), NoteUtil.generateNonEmptyNoteTitle(newContent, getContext()), newContent, oldNote.isFavorite(), oldNote.getCategory(), oldNote.getEtag(), DBStatus.LOCAL_EDITED, accountId, NoteUtil.generateNoteExcerpt(newContent, isGridViewEnabled(context)), oldNote.getScrollY()); + newNote = new DBNote(oldNote.getId(), oldNote.getRemoteId(), Calendar.getInstance(), NoteUtil.generateNonEmptyNoteTitle(newContent, getContext()), newContent, oldNote.isFavorite(), oldNote.getCategory(), oldNote.getEtag(), DBStatus.LOCAL_EDITED, accountId, NoteUtil.generateNoteExcerpt(newContent), oldNote.getScrollY()); } SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(7); @@ -586,7 +574,7 @@ public class NotesDatabase extends AbstractNotesDatabase { values.put(key_favorite, remoteNote.isFavorite()); values.put(key_category, getCategoryIdByTitle(localAccount.getId(), remoteNote.getCategory())); values.put(key_etag, remoteNote.getEtag()); - values.put(key_excerpt, NoteUtil.generateNoteExcerpt(remoteNote.getContent(), isGridViewEnabled(context))); + values.put(key_excerpt, NoteUtil.generateNoteExcerpt(remoteNote.getContent())); String whereClause; String[] whereArgs; if (forceUnchangedDBNoteState != null) { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/migration/Migration_9_10.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/migration/Migration_9_10.java index 855130f1..98ddc601 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/migration/Migration_9_10.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/migration/Migration_9_10.java @@ -18,7 +18,7 @@ public class Migration_9_10 { Cursor cursor = db.query("NOTES", new String[]{"ID", "CONTENT"}, null, null, null, null, null, null); while (cursor.moveToNext()) { ContentValues values = new ContentValues(); - values.put("EXCERPT", NoteUtil.generateNoteExcerpt(cursor.getString(1), false)); + values.put("EXCERPT", NoteUtil.generateNoteExcerpt(cursor.getString(1))); db.update("NOTES", values, "ID" + " = ? ", new String[]{cursor.getString(0)}); } cursor.close(); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/util/NoteUtil.java b/app/src/main/java/it/niedermann/owncloud/notes/util/NoteUtil.java index 225f63e9..bd83ce5c 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/util/NoteUtil.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/util/NoteUtil.java @@ -81,18 +81,15 @@ public class NoteUtil { /** * Generates an excerpt of a content String (reads second line which is not empty) * - * @param content {@link String} - * @param keepMarkdown whether or not the markdown should be stripped from the excerpt + * @param content String * @return excerpt String */ @NonNull - public static String generateNoteExcerpt(@NonNull String content, boolean keepMarkdown) { - if (!content.contains("\n")) { + public static String generateNoteExcerpt(@NonNull String content) { + if (content.contains("\n")) + return truncateString(removeMarkDown(content.replaceFirst("^.*\n", "")), 200).replace("\n", " "); + else return ""; - } - return keepMarkdown - ? truncateString(removeMarkDown(content.replaceFirst("^.*\n", "")), 150) - : truncateString(removeMarkDown(content.replaceFirst("^.*\n", "")), 150).replace("\n", " "); } @NonNull diff --git a/app/src/main/java/it/niedermann/owncloud/notes/util/Notes.java b/app/src/main/java/it/niedermann/owncloud/notes/util/Notes.java index f671bd2b..5a5e74c5 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/util/Notes.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/util/Notes.java @@ -39,11 +39,11 @@ public class Notes extends Application { AppCompatDelegate.setDefaultNightMode(setting.getModeId()); } - public static boolean isGridViewEnabled(@NonNull Context context) { + public static boolean isGridViewEnabled() { return isGridViewEnabled; } - public static void updateGridViewEnabled(Boolean gridView) { + public static void updateGridViewEnabled(boolean gridView) { isGridViewEnabled = gridView; } diff --git a/app/src/main/res/layout/item_notes_list_note_item_grid.xml b/app/src/main/res/layout/item_notes_list_note_item_grid.xml index 68d29e26..0e699c84 100644 --- a/app/src/main/res/layout/item_notes_list_note_item_grid.xml +++ b/app/src/main/res/layout/item_notes_list_note_item_grid.xml @@ -11,7 +11,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" - android:paddingBottom="@dimen/spacer_2x"> + android:paddingBottom="@dimen/spacer_1x"> + android:orientation="vertical"> - Date: Wed, 10 Jun 2020 17:33:29 +0200 Subject: Fix multiselection styling --- .../drawable-v21/grid_item_background_selector.xml | 19 +++++++++++++++++++ .../drawable-v21/list_item_background_selector.xml | 2 -- .../res/drawable/grid_item_background_selector.xml | 6 ++++++ .../res/layout/item_notes_list_note_item_grid.xml | 5 ++--- 4 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 app/src/main/res/drawable-v21/grid_item_background_selector.xml create mode 100644 app/src/main/res/drawable/grid_item_background_selector.xml (limited to 'app/src/main') diff --git a/app/src/main/res/drawable-v21/grid_item_background_selector.xml b/app/src/main/res/drawable-v21/grid_item_background_selector.xml new file mode 100644 index 00000000..37de2a6f --- /dev/null +++ b/app/src/main/res/drawable-v21/grid_item_background_selector.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/list_item_background_selector.xml b/app/src/main/res/drawable-v21/list_item_background_selector.xml index ea3fa361..8c562151 100644 --- a/app/src/main/res/drawable-v21/list_item_background_selector.xml +++ b/app/src/main/res/drawable-v21/list_item_background_selector.xml @@ -1,8 +1,6 @@ - - diff --git a/app/src/main/res/drawable/grid_item_background_selector.xml b/app/src/main/res/drawable/grid_item_background_selector.xml new file mode 100644 index 00000000..24ab9be7 --- /dev/null +++ b/app/src/main/res/drawable/grid_item_background_selector.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/app/src/main/res/layout/item_notes_list_note_item_grid.xml b/app/src/main/res/layout/item_notes_list_note_item_grid.xml index 0e699c84..4fbd6c3c 100644 --- a/app/src/main/res/layout/item_notes_list_note_item_grid.xml +++ b/app/src/main/res/layout/item_notes_list_note_item_grid.xml @@ -8,12 +8,13 @@ android:focusable="true"> - @@ -102,7 +102,6 @@ android:layout_marginBottom="@dimen/spacer_1x" android:textAppearance="?android:attr/textAppearanceMedium" android:textColor="@color/fg_default" - android:textIsSelectable="true" android:theme="@style/textViewStyle" tools:maxLength="200" tools:text="@tools:sample/lorem/random" /> -- cgit v1.2.3 From f823e48c7c32c669c17d1173453fd89865fdcaac Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Wed, 10 Jun 2020 18:12:59 +0200 Subject: Update documentation --- .../owncloud/notes/android/NotesListViewItemTouchHelper.java | 4 ++-- .../java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java | 4 ++-- .../niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java | 1 - 3 files changed, 4 insertions(+), 5 deletions(-) (limited to 'app/src/main') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/android/NotesListViewItemTouchHelper.java b/app/src/main/java/it/niedermann/owncloud/notes/android/NotesListViewItemTouchHelper.java index 67feb6bb..ed3cc8c2 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/android/NotesListViewItemTouchHelper.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/android/NotesListViewItemTouchHelper.java @@ -48,11 +48,11 @@ public class NotesListViewItemTouchHelper extends ItemTouchHelper { } /** - * Disable swipe on sections + * Disable swipe on sections and if grid view is enabled * * @param recyclerView RecyclerView * @param viewHolder RecyclerView.ViewHoler - * @return 0 if section, otherwise super() + * @return 0 if viewHolder is section or grid view is enabled, otherwise super() */ @Override public int getSwipeDirs(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java index a0a773ec..13cf735a 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java @@ -23,7 +23,7 @@ public class NoteViewGridHolder extends NoteViewHolder { } public void showSwipe(boolean left) { - + throw new UnsupportedOperationException(NoteViewGridHolder.class.getSimpleName() + " does not support swiping"); } public void bind(@NonNull DBNote note, boolean showCategory, int mainColor, int textColor, @Nullable CharSequence searchQuery) { @@ -38,6 +38,6 @@ public class NoteViewGridHolder extends NoteViewHolder { } public View getNoteSwipeable() { - return null; + throw new UnsupportedOperationException(NoteViewGridHolder.class.getSimpleName() + " does not support swiping"); } } \ No newline at end of file diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java index 78a74a5f..c7c61bd6 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java @@ -18,7 +18,6 @@ public class NoteViewHolderWithoutExcerpt extends NoteViewHolder { this.binding = binding; } - public void showSwipe(boolean left) { binding.noteFavoriteLeft.setVisibility(left ? View.VISIBLE : View.INVISIBLE); binding.noteDeleteRight.setVisibility(left ? View.INVISIBLE : View.VISIBLE); -- cgit v1.2.3 From 09122f4146871308b98451b450ac2e0a40a8a31f Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Wed, 10 Jun 2020 23:35:10 +0200 Subject: Fix #863 Crash when entering not-existing category --- .../it/niedermann/owncloud/notes/android/fragment/CategoryAdapter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/src/main') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/CategoryAdapter.java b/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/CategoryAdapter.java index 886790d8..5872172a 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/CategoryAdapter.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/CategoryAdapter.java @@ -109,7 +109,7 @@ public class CategoryAdapter extends RecyclerView.Adapter 0) { boolean currentSearchStringIsInCategories = false; - for (NavigationItem category : categories.subList(1, categories.size())) { + for (NavigationItem category : categories) { if (currentSearchString.equals(category.label)) { currentSearchStringIsInCategories = true; break; -- cgit v1.2.3 From 7c278d323356b2df9878f33c12fbd75542f89036 Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Thu, 11 Jun 2020 09:26:21 +0200 Subject: Simplify translations fo formatting help --- .../formattinghelp/FormattingHelpActivity.java | 28 ++++++++++++++++------ app/src/main/res/values/strings.xml | 15 +++++++----- 2 files changed, 30 insertions(+), 13 deletions(-) (limited to 'app/src/main') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/formattinghelp/FormattingHelpActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/formattinghelp/FormattingHelpActivity.java index a1078504..17c0f2e6 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/formattinghelp/FormattingHelpActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/formattinghelp/FormattingHelpActivity.java @@ -130,11 +130,11 @@ public class FormattingHelpActivity extends BrandedActivity { getString(R.string.formatting_help_checkbox_checked, getString(R.string.formatting_help_checkboxes_body_2)) + lineBreak + getString(R.string.formatting_help_checkbox_unchecked, getString(R.string.formatting_help_checkboxes_body_3)) + lineBreak; - final String structuredDocuments = getString(R.string.formatting_help_structured_documents_body_1) + lineBreak + + final String structuredDocuments = getString(R.string.formatting_help_structured_documents_body_1, "`#`", "`##`") + lineBreak + lineBreak + getString(R.string.formatting_help_title_level_3, getString(R.string.formatting_help_structured_documents_body_2)) + lineBreak + lineBreak + - getString(R.string.formatting_help_structured_documents_body_3) + lineBreak + + getString(R.string.formatting_help_structured_documents_body_3, "`#`", "`######`") + lineBreak + lineBreak + getString(R.string.formatting_help_structured_documents_body_4) + lineBreak + lineBreak + @@ -148,16 +148,30 @@ public class FormattingHelpActivity extends BrandedActivity { return getString(R.string.formatting_help_title, getString(R.string.formatting_help_cbf_title)) + lineBreak + lineBreak + getString(R.string.formatting_help_cbf_body_1) + lineBreak + - getString(R.string.formatting_help_cbf_body_2) + lineBreak + + getString(R.string.formatting_help_cbf_body_2, + getString(R.string.formatting_help_codefence_inline, getString(android.R.string.cut)), + getString(R.string.formatting_help_codefence_inline, getString(android.R.string.copy)), + getString(R.string.formatting_help_codefence_inline, getString(android.R.string.selectAll)), + getString(R.string.formatting_help_codefence_inline, getString(R.string.simple_link)), + getString(R.string.formatting_help_codefence_inline, getString(R.string.simple_checkbox)) + ) + lineBreak + lineBreak + divider + lineBreak + lineBreak + getString(R.string.formatting_help_title, getString(R.string.formatting_help_text_title)) + lineBreak + lineBreak + - getString(R.string.formatting_help_text_body) + lineBreak + + getString(R.string.formatting_help_text_body, + getString(R.string.formatting_help_bold), + getString(R.string.formatting_help_italic), + getString(R.string.formatting_help_strike_through) + ) + lineBreak + lineBreak + codefence + lineBreak + - getString(R.string.formatting_help_text_body) + lineBreak + + getString(R.string.formatting_help_text_body, + getString(R.string.formatting_help_bold), + getString(R.string.formatting_help_italic), + getString(R.string.formatting_help_strike_through) + ) + lineBreak + codefence + lineBreak + lineBreak + divider + lineBreak + @@ -196,8 +210,8 @@ public class FormattingHelpActivity extends BrandedActivity { lineBreak + getString(R.string.formatting_help_code_body_1) + lineBreak + lineBreak + - getString(R.string.formatting_help_codefence_inline_escaped) + getString(R.string.formatting_help_code_javascript_inline) + getString(R.string.formatting_help_codefence_inline_escaped) + lineBreak + - getString(R.string.formatting_help_codefence_inline) + getString(R.string.formatting_help_code_javascript_inline) + getString(R.string.formatting_help_codefence_inline) + lineBreak + + getString(R.string.formatting_help_codefence_inline_escaped, getString(R.string.formatting_help_code_javascript_inline)) + lineBreak + + getString(R.string.formatting_help_codefence_inline, getString(R.string.formatting_help_code_javascript_inline)) + lineBreak + lineBreak + getString(R.string.formatting_help_code_body_2) + lineBreak + lineBreak + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fd222e89..beba2396 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -238,8 +238,8 @@ # %1$s ### %1$s --- - ` - \\` + `%1$s` + \\`%1$s\\` ``` \\`\\`\\` if (isAwesome){ @@ -253,13 +253,16 @@ - [x] %1$s - [ ] %1$s > %1$s + ~~ + ** + * Context based formatting A major design goal of the Notes app is to provide a distraction free tool. Though you will be able to format your texts with Markdown. For various of the below mentioned examples, you can use shortcuts so you can format your notes without typing in the codes below. - Just select a range of text or tap on your cursor at any position and you will get a popup menu which contains next to the default entries `Cut`, `Copy`, `Select all` entries like `Link` or `Checkbox`. + Just select a range of text or tap on your cursor at any position and you will get a popup menu which contains next to the default entries %1$s, %2$s, %3$s entries like %4$s or %5$s. Text - It\'s very easy to make some words **bold** and other words *italic* with Markdown. You can ~~strike~~ some words through and even [link to Nextcloud](https://nextcloud.com). + It\'s very easy to make some words %1$sbold%1$s and other words %2$sitalic%2$s with Markdown. You can %3$sstrike%3$s some words through and even [link to Nextcloud](https://nextcloud.com). Lists Sometimes you want numbered lists: @@ -278,9 +281,9 @@ Item 2 Structured documents - Sometimes it\'s useful to have different levels of headings to structure your documents. Start lines with a `#` to create headings. Multiple `##` in a row denote smaller heading sizes. + Sometimes it\'s useful to have different levels of headings to structure your documents. Start lines with a %1$s to create headings. Multiple %2$s in a row denote smaller heading sizes. This is a third-tier heading - You can use one `#` all the way up to `######` six for different heading sizes. + You can use one %1$s all the way up to %2$s six for different heading sizes. If you\'d like to quote someone, use the > character before the line: Coffee. The finest organic suspension ever devised… I beat the Borg with it. - Captain Janeway -- cgit v1.2.3 From b2de8df237d9c0bff46d319008478e67504aeaa1 Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Thu, 11 Jun 2020 09:29:47 +0200 Subject: Simplify translations fo formatting help --- .../owncloud/notes/formattinghelp/FormattingHelpActivity.java | 2 +- app/src/main/res/values/strings.xml | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) (limited to 'app/src/main') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/formattinghelp/FormattingHelpActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/formattinghelp/FormattingHelpActivity.java index 17c0f2e6..299a9b18 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/formattinghelp/FormattingHelpActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/formattinghelp/FormattingHelpActivity.java @@ -136,7 +136,7 @@ public class FormattingHelpActivity extends BrandedActivity { lineBreak + getString(R.string.formatting_help_structured_documents_body_3, "`#`", "`######`") + lineBreak + lineBreak + - getString(R.string.formatting_help_structured_documents_body_4) + lineBreak + + getString(R.string.formatting_help_structured_documents_body_4, getString(R.string.formatting_help_quote_keyword)) + lineBreak + lineBreak + getString(R.string.formatting_help_quote, getString(R.string.formatting_help_structured_documents_body_5)) + lineBreak + getString(R.string.formatting_help_quote, getString(R.string.formatting_help_structured_documents_body_6)) + lineBreak; diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index beba2396..1b6898a9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -253,6 +253,7 @@ - [x] %1$s - [ ] %1$s > %1$s + > ~~ ** * @@ -284,7 +285,7 @@ Sometimes it\'s useful to have different levels of headings to structure your documents. Start lines with a %1$s to create headings. Multiple %2$s in a row denote smaller heading sizes. This is a third-tier heading You can use one %1$s all the way up to %2$s six for different heading sizes. - If you\'d like to quote someone, use the > character before the line: + If you\'d like to quote someone, use the %1$s character before the line: Coffee. The finest organic suspension ever devised… I beat the Borg with it. - Captain Janeway -- cgit v1.2.3 From 6da8a01b4dc3faa31187d89887a2eb66484b481d Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Thu, 11 Jun 2020 11:14:57 +0200 Subject: Added some IDE hint annotations --- app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java | 2 +- .../java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java | 3 ++- .../main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java | 1 + .../it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java | 1 + .../niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java | 1 + 5 files changed, 6 insertions(+), 2 deletions(-) (limited to 'app/src/main') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java b/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java index 92635564..4a2a1d9a 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java @@ -139,7 +139,7 @@ public class ItemAdapter extends RecyclerView.Adapter i return !selected.contains(position) && selected.add(position); } - public void clearSelection(RecyclerView recyclerView) { + public void clearSelection(@NonNull RecyclerView recyclerView) { for (Integer i : getSelected()) { RecyclerView.ViewHolder viewHolder = recyclerView.findViewHolderForAdapterPosition(i); if (viewHolder != null) { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java index 13cf735a..6675eb59 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java @@ -37,7 +37,8 @@ public class NoteViewGridHolder extends NoteViewHolder { binding.noteExcerpt.setVisibility(TextUtils.isEmpty(note.getExcerpt()) ? GONE : VISIBLE); } + @Nullable public View getNoteSwipeable() { - throw new UnsupportedOperationException(NoteViewGridHolder.class.getSimpleName() + " does not support swiping"); + return null; } } \ No newline at end of file diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java index db211b85..b40f8c17 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java @@ -114,5 +114,6 @@ public abstract class NoteViewHolder extends RecyclerView.ViewHolder { public abstract void showSwipe(boolean left); + @Nullable public abstract View getNoteSwipeable(); } \ No newline at end of file diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java index ac87768c..032e868f 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java @@ -37,6 +37,7 @@ public class NoteViewHolderWithExcerpt extends NoteViewHolder { bindSearchableContent(context, binding.noteExcerpt, searchQuery, note.getExcerpt(), mainColor); } + @NonNull public View getNoteSwipeable() { return binding.noteSwipeable; } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java index c7c61bd6..acdb4fb6 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java @@ -34,6 +34,7 @@ public class NoteViewHolderWithoutExcerpt extends NoteViewHolder { bindSearchableContent(context, binding.noteTitle, searchQuery, note.getTitle(), mainColor); } + @NonNull public View getNoteSwipeable() { return binding.noteSwipeable; } -- cgit v1.2.3 From de80cde1dd9808631d31ba4c4a943db5d2d7598b Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Thu, 11 Jun 2020 11:44:10 +0200 Subject: Remove stable ids for ItemAdapter since it causes issues with swipe 2 favorite --- .../niedermann/owncloud/notes/model/ItemAdapter.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'app/src/main') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java b/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java index 4a2a1d9a..b77d0019 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java @@ -47,15 +47,20 @@ public class ItemAdapter extends RecyclerView.Adapter i this.gridView = gridView; this.mainColor = context.getResources().getColor(R.color.defaultBrand); this.textColor = Color.WHITE; - setHasStableIds(true); + // FIXME see getItemId() + // setHasStableIds(true); } - @Override - public long getItemId(int position) { - return getItemViewType(position) == TYPE_SECTION - ? ((SectionItem) getItem(position)).getTitle().hashCode() * -1 - : ((DBNote) getItem(position)).getId(); - } + + /* + FIXME this causes {@link it.niedermann.owncloud.notes.android.NotesListViewItemTouchHelper} to not call clearView anymore → After marking a note as favorite, it stays yellow. + @Override + public long getItemId(int position) { + return getItemViewType(position) == TYPE_SECTION + ? ((SectionItem) getItem(position)).getTitle().hashCode() * -1 + : ((DBNote) getItem(position)).getId(); + } + */ /** * Updates the item list and notifies respective view to update. -- cgit v1.2.3 From 4bb5f7513fcc376643f843464b302ca16f33ea19 Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Thu, 11 Jun 2020 13:54:19 +0200 Subject: Use Chip for category in grid view and adjust font size --- .../owncloud/notes/model/ItemAdapter.java | 12 ++- .../owncloud/notes/model/NoteViewGridHolder.java | 12 ++- .../owncloud/notes/model/NoteViewHolder.java | 20 +++-- .../res/layout/item_notes_list_note_item_grid.xml | 91 ++++++++++------------ 4 files changed, 79 insertions(+), 56 deletions(-) (limited to 'app/src/main') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java b/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java index b77d0019..81f46b55 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java @@ -1,6 +1,7 @@ package it.niedermann.owncloud.notes.model; import android.content.Context; +import android.content.SharedPreferences; import android.graphics.Color; import android.text.TextUtils; import android.util.Log; @@ -10,6 +11,8 @@ import android.view.ViewGroup; import androidx.annotation.ColorInt; import androidx.annotation.IntRange; import androidx.annotation.NonNull; +import androidx.annotation.Px; +import androidx.preference.PreferenceManager; import androidx.recyclerview.widget.RecyclerView; import java.util.ArrayList; @@ -22,6 +25,7 @@ import it.niedermann.owncloud.notes.databinding.ItemNotesListNoteItemWithExcerpt import it.niedermann.owncloud.notes.databinding.ItemNotesListSectionItemBinding; import static it.niedermann.owncloud.notes.databinding.ItemNotesListNoteItemWithoutExcerptBinding.inflate; +import static it.niedermann.owncloud.notes.util.NoteUtil.getFontSizeFromPreferences; public class ItemAdapter extends RecyclerView.Adapter implements Branded { @@ -37,6 +41,9 @@ public class ItemAdapter extends RecyclerView.Adapter i private boolean showCategory = true; private CharSequence searchQuery; private final List selected = new ArrayList<>(); + @Px + private final float fontSize; + private final boolean monospace; @ColorInt private int mainColor; @ColorInt @@ -47,6 +54,9 @@ public class ItemAdapter extends RecyclerView.Adapter i this.gridView = gridView; this.mainColor = context.getResources().getColor(R.color.defaultBrand); this.textColor = Color.WHITE; + final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext()); + this.fontSize = getFontSizeFromPreferences(context, sp); + this.monospace = sp.getBoolean(context.getString(R.string.pref_key_font), false); // FIXME see getItemId() // setHasStableIds(true); } @@ -101,7 +111,7 @@ public class ItemAdapter extends RecyclerView.Adapter i } case TYPE_NOTE_WITH_EXCERPT: case TYPE_NOTE_WITHOUT_EXCERPT: { - return new NoteViewGridHolder(ItemNotesListNoteItemGridBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false), noteClickListener); + return new NoteViewGridHolder(ItemNotesListNoteItemGridBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false), noteClickListener, monospace, fontSize); } default: { throw new IllegalArgumentException("Not supported viewType: " + viewType); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java index 6675eb59..984de175 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java @@ -1,11 +1,14 @@ package it.niedermann.owncloud.notes.model; import android.content.Context; +import android.graphics.Typeface; import android.text.TextUtils; +import android.util.TypedValue; import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.annotation.Px; import it.niedermann.owncloud.notes.databinding.ItemNotesListNoteItemGridBinding; @@ -17,9 +20,16 @@ public class NoteViewGridHolder extends NoteViewHolder { @NonNull private final ItemNotesListNoteItemGridBinding binding; - public NoteViewGridHolder(@NonNull ItemNotesListNoteItemGridBinding binding, @NonNull NoteClickListener noteClickListener) { + public NoteViewGridHolder(@NonNull ItemNotesListNoteItemGridBinding binding, @NonNull NoteClickListener noteClickListener, boolean monospace, @Px float fontSize) { super(binding.getRoot(), noteClickListener); this.binding = binding; + + binding.noteTitle.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize * 1.1f); + binding.noteExcerpt.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize * .8f); + if (monospace) { + binding.noteTitle.setTypeface(Typeface.MONOSPACE); + binding.noteExcerpt.setTypeface(Typeface.MONOSPACE); + } } public void showSwipe(boolean left) { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java index b40f8c17..c4e222e3 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java @@ -1,6 +1,7 @@ package it.niedermann.owncloud.notes.model; import android.content.Context; +import android.content.res.ColorStateList; import android.graphics.Color; import android.graphics.drawable.GradientDrawable; import android.os.Build; @@ -19,6 +20,8 @@ import androidx.annotation.Nullable; import androidx.core.graphics.drawable.DrawableCompat; import androidx.recyclerview.widget.RecyclerView; +import com.google.android.material.chip.Chip; + import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -74,14 +77,19 @@ public abstract class NoteViewHolder extends RecyclerView.ViewHolder { } } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - DrawableCompat.setTint(noteCategory.getBackground(), categoryBackground); + noteCategory.setTextColor(categoryForeground); + if (noteCategory instanceof Chip) { + ((Chip) noteCategory).setChipStrokeColor(ColorStateList.valueOf(categoryBackground)); + ((Chip) noteCategory).setChipBackgroundColor(ColorStateList.valueOf(isDarkThemeActive ? categoryBackground : Color.TRANSPARENT)); } else { - final GradientDrawable drawable = (GradientDrawable) noteCategory.getBackground(); - drawable.setStroke(1, categoryBackground); - drawable.setColor(isDarkThemeActive ? categoryBackground : Color.TRANSPARENT); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + DrawableCompat.setTint(noteCategory.getBackground(), categoryBackground); + } else { + final GradientDrawable drawable = (GradientDrawable) noteCategory.getBackground(); + drawable.setStroke(1, categoryBackground); + drawable.setColor(isDarkThemeActive ? categoryBackground : Color.TRANSPARENT); + } } - noteCategory.setTextColor(categoryForeground); } protected void bindFavorite(@NonNull ImageView noteFavorite, boolean isFavorite) { diff --git a/app/src/main/res/layout/item_notes_list_note_item_grid.xml b/app/src/main/res/layout/item_notes_list_note_item_grid.xml index 4fbd6c3c..edd0dc01 100644 --- a/app/src/main/res/layout/item_notes_list_note_item_grid.xml +++ b/app/src/main/res/layout/item_notes_list_note_item_grid.xml @@ -15,59 +15,69 @@ android:orientation="vertical" android:paddingBottom="@dimen/spacer_1x"> + + + + + + - + android:layout_weight="1"> - - - - - + + android:layout_height="wrap_content"> - - \ No newline at end of file -- cgit v1.2.3 From 1a0c9b2319654e4b9909014100c2b54767f2376d Mon Sep 17 00:00:00 2001 From: p-bo Date: Fri, 12 Jun 2020 14:20:22 +0200 Subject: L18n - use quote more unerstandable around the globe See discussion issue #866 (used quote from scientist, because it is less conflicting than political or religion ones) --- app/src/main/res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app/src/main') diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1b6898a9..dedaf45f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -286,8 +286,8 @@ This is a third-tier heading You can use one %1$s all the way up to %2$s six for different heading sizes. If you\'d like to quote someone, use the %1$s character before the line: - Coffee. The finest organic suspension ever devised… I beat the Borg with it. - - Captain Janeway + Imagination is more important than knowledge. Knowledge is limited. Imagination encircles the world. + - Albert Einstein Code There are many different ways to style code with Markdown. If you have inline code blocks, wrap them in backticks: -- cgit v1.2.3 From 0f3a5972b1d2290e77362338bd8d43146f70ea6e Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Fri, 12 Jun 2020 16:56:36 +0200 Subject: Enhances presentation of only-title-notes in grid view --- .../owncloud/notes/model/ItemAdapter.java | 32 ++++++++---- .../notes/model/NoteViewGridHolderOnlyTitle.java | 47 +++++++++++++++++ .../item_notes_list_note_item_grid_only_title.xml | 59 ++++++++++++++++++++++ 3 files changed, 128 insertions(+), 10 deletions(-) create mode 100644 app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolderOnlyTitle.java create mode 100644 app/src/main/res/layout/item_notes_list_note_item_grid_only_title.xml (limited to 'app/src/main') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java b/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java index 81f46b55..f6efada4 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java @@ -21,10 +21,11 @@ import java.util.List; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.branding.Branded; import it.niedermann.owncloud.notes.databinding.ItemNotesListNoteItemGridBinding; +import it.niedermann.owncloud.notes.databinding.ItemNotesListNoteItemGridOnlyTitleBinding; import it.niedermann.owncloud.notes.databinding.ItemNotesListNoteItemWithExcerptBinding; +import it.niedermann.owncloud.notes.databinding.ItemNotesListNoteItemWithoutExcerptBinding; import it.niedermann.owncloud.notes.databinding.ItemNotesListSectionItemBinding; -import static it.niedermann.owncloud.notes.databinding.ItemNotesListNoteItemWithoutExcerptBinding.inflate; import static it.niedermann.owncloud.notes.util.NoteUtil.getFontSizeFromPreferences; public class ItemAdapter extends RecyclerView.Adapter implements Branded { @@ -34,6 +35,7 @@ public class ItemAdapter extends RecyclerView.Adapter i public static final int TYPE_SECTION = 0; public static final int TYPE_NOTE_WITH_EXCERPT = 1; public static final int TYPE_NOTE_WITHOUT_EXCERPT = 2; + public static final int TYPE_NOTE_ONLY_TITLE = 3; private final NoteClickListener noteClickListener; private final boolean gridView; @@ -109,6 +111,9 @@ public class ItemAdapter extends RecyclerView.Adapter i case TYPE_SECTION: { return new SectionViewHolder(ItemNotesListSectionItemBinding.inflate(LayoutInflater.from(parent.getContext()))); } + case TYPE_NOTE_ONLY_TITLE: { + return new NoteViewGridHolderOnlyTitle(ItemNotesListNoteItemGridOnlyTitleBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false), noteClickListener, monospace, fontSize); + } case TYPE_NOTE_WITH_EXCERPT: case TYPE_NOTE_WITHOUT_EXCERPT: { return new NoteViewGridHolder(ItemNotesListNoteItemGridBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false), noteClickListener, monospace, fontSize); @@ -125,8 +130,9 @@ public class ItemAdapter extends RecyclerView.Adapter i case TYPE_NOTE_WITH_EXCERPT: { return new NoteViewHolderWithExcerpt(ItemNotesListNoteItemWithExcerptBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false), noteClickListener); } + case TYPE_NOTE_ONLY_TITLE: case TYPE_NOTE_WITHOUT_EXCERPT: { - return new NoteViewHolderWithoutExcerpt(inflate(LayoutInflater.from(parent.getContext()), parent, false), noteClickListener); + return new NoteViewHolderWithoutExcerpt(ItemNotesListNoteItemWithoutExcerptBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false), noteClickListener); } default: { throw new IllegalArgumentException("Not supported viewType: " + viewType); @@ -143,7 +149,8 @@ public class ItemAdapter extends RecyclerView.Adapter i break; } case TYPE_NOTE_WITH_EXCERPT: - case TYPE_NOTE_WITHOUT_EXCERPT: { + case TYPE_NOTE_WITHOUT_EXCERPT: + case TYPE_NOTE_ONLY_TITLE: { ((NoteViewHolder) holder).bind((DBNote) itemList.get(position), showCategory, mainColor, textColor, searchQuery); break; } @@ -200,18 +207,23 @@ public class ItemAdapter extends RecyclerView.Adapter i return itemList.size(); } - @IntRange(from = 0, to = 2) + @IntRange(from = 0, to = 3) @Override public int getItemViewType(int position) { Item item = getItem(position); if (item == null) { throw new IllegalArgumentException("Item at position " + position + " must not be null"); } - return getItem(position).isSection() - ? TYPE_SECTION - : TextUtils.isEmpty(((DBNote) getItem(position)).getExcerpt()) - ? TYPE_NOTE_WITHOUT_EXCERPT - : TYPE_NOTE_WITH_EXCERPT; + if (getItem(position).isSection()) return TYPE_SECTION; + DBNote note = (DBNote) getItem(position); + if (TextUtils.isEmpty(note.getExcerpt())) { + if (TextUtils.isEmpty(note.getCategory())) { + return TYPE_NOTE_ONLY_TITLE; + } else { + return TYPE_NOTE_WITHOUT_EXCERPT; + } + } + return TYPE_NOTE_WITH_EXCERPT; } @Override @@ -228,7 +240,7 @@ public class ItemAdapter extends RecyclerView.Adapter i /** * @return the position of the first item which matches the given viewtype, -1 if not available */ - public int getFirstPositionOfViewType(@IntRange(from = 0, to = 2) int viewType) { + public int getFirstPositionOfViewType(@IntRange(from = 0, to = 3) int viewType) { for (int i = 0; i < itemList.size(); i++) { if (getItemViewType(i) == viewType) { return i; diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolderOnlyTitle.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolderOnlyTitle.java new file mode 100644 index 00000000..59e14eff --- /dev/null +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolderOnlyTitle.java @@ -0,0 +1,47 @@ +package it.niedermann.owncloud.notes.model; + +import android.content.Context; +import android.graphics.Typeface; +import android.util.TypedValue; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.Px; + +import it.niedermann.owncloud.notes.databinding.ItemNotesListNoteItemGridOnlyTitleBinding; + +import static android.view.View.INVISIBLE; +import static android.view.View.VISIBLE; + +public class NoteViewGridHolderOnlyTitle extends NoteViewHolder { + @NonNull + private final ItemNotesListNoteItemGridOnlyTitleBinding binding; + + public NoteViewGridHolderOnlyTitle(@NonNull ItemNotesListNoteItemGridOnlyTitleBinding binding, @NonNull NoteClickListener noteClickListener, boolean monospace, @Px float fontSize) { + super(binding.getRoot(), noteClickListener); + this.binding = binding; + + binding.noteTitle.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize * 1.1f); + if (monospace) { + binding.noteTitle.setTypeface(Typeface.MONOSPACE); + } + } + + public void showSwipe(boolean left) { + throw new UnsupportedOperationException(NoteViewGridHolderOnlyTitle.class.getSimpleName() + " does not support swiping"); + } + + public void bind(@NonNull DBNote note, boolean showCategory, int mainColor, int textColor, @Nullable CharSequence searchQuery) { + super.bind(note, showCategory, mainColor, textColor, searchQuery); + @NonNull final Context context = itemView.getContext(); + binding.noteStatus.setVisibility(DBStatus.VOID.equals(note.getStatus()) ? INVISIBLE : VISIBLE); + bindFavorite(binding.noteFavorite, note.isFavorite()); + bindSearchableContent(context, binding.noteTitle, searchQuery, note.getTitle(), mainColor); + } + + @Nullable + public View getNoteSwipeable() { + return null; + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/item_notes_list_note_item_grid_only_title.xml b/app/src/main/res/layout/item_notes_list_note_item_grid_only_title.xml new file mode 100644 index 00000000..6bf47835 --- /dev/null +++ b/app/src/main/res/layout/item_notes_list_note_item_grid_only_title.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + \ No newline at end of file -- cgit v1.2.3 From cd91086660501b3fbf1a2c937cdd39298604cfc0 Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Fri, 12 Jun 2020 19:04:41 +0200 Subject: Fix margin top in first row for grid view --- .../owncloud/notes/android/activity/NotesListViewActivity.java | 4 ++-- .../java/it/niedermann/owncloud/notes/model/GridItemDecoration.java | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) (limited to 'app/src/main') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java index ccfbbe41..0cab9274 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java @@ -612,12 +612,12 @@ public class NotesListViewActivity extends LockedActivity implements NoteClickLi int spanCount = (int) ((displayMetrics.widthPixels / displayMetrics.density) / getResources().getInteger(R.integer.max_dp_grid_view)); StaggeredGridLayoutManager gridLayoutManager = new StaggeredGridLayoutManager(spanCount, StaggeredGridLayoutManager.VERTICAL); listView.setLayoutManager(gridLayoutManager); - listView.addItemDecoration(new GridItemDecoration(adapter, + listView.addItemDecoration(new GridItemDecoration(adapter, spanCount, getResources().getDimensionPixelSize(R.dimen.spacer_3x), getResources().getDimensionPixelSize(R.dimen.spacer_5x), getResources().getDimensionPixelSize(R.dimen.spacer_3x), getResources().getDimensionPixelSize(R.dimen.spacer_1x), - getResources().getDimensionPixelSize(R.dimen.spacer_2x) + getResources().getDimensionPixelSize(R.dimen.spacer_1x) )); } else { LinearLayoutManager layoutManager = new LinearLayoutManager(this); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/GridItemDecoration.java b/app/src/main/java/it/niedermann/owncloud/notes/model/GridItemDecoration.java index 6443121e..68b349e0 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/GridItemDecoration.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/GridItemDecoration.java @@ -12,10 +12,12 @@ public class GridItemDecoration extends SectionItemDecoration { @NonNull private final ItemAdapter adapter; + private final int spanCount; private final int gutter; - public GridItemDecoration(@NonNull ItemAdapter adapter, @Px int sectionLeft, @Px int sectionTop, @Px int sectionRight, @Px int sectionBottom, @Px int gutter) { + public GridItemDecoration(@NonNull ItemAdapter adapter, int spanCount, @Px int sectionLeft, @Px int sectionTop, @Px int sectionRight, @Px int sectionBottom, @Px int gutter) { super(adapter, sectionLeft, sectionTop, sectionRight, sectionBottom); + this.spanCount = spanCount; this.adapter = adapter; this.gutter = gutter; } @@ -33,7 +35,7 @@ public class GridItemDecoration extends SectionItemDecoration { if (position >= 0) { // First row gets some spacing at the top - if (position < adapter.getFirstPositionOfViewType(ItemAdapter.TYPE_SECTION)) { + if (position < spanCount && position < adapter.getFirstPositionOfViewType(ItemAdapter.TYPE_SECTION)) { outRect.top = gutter; } -- cgit v1.2.3 From 2367e37e733859909639ddda478ac897baf28c78 Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Fri, 12 Jun 2020 20:41:00 +0200 Subject: Enable hyphenation in grid layout --- app/src/main/res/layout/item_notes_list_note_item_grid.xml | 2 ++ app/src/main/res/layout/item_notes_list_note_item_grid_only_title.xml | 2 ++ 2 files changed, 4 insertions(+) (limited to 'app/src/main') diff --git a/app/src/main/res/layout/item_notes_list_note_item_grid.xml b/app/src/main/res/layout/item_notes_list_note_item_grid.xml index edd0dc01..9f66f71e 100644 --- a/app/src/main/res/layout/item_notes_list_note_item_grid.xml +++ b/app/src/main/res/layout/item_notes_list_note_item_grid.xml @@ -25,9 +25,11 @@ android:layout_marginEnd="@dimen/spacer_2x" android:layout_marginRight="@dimen/spacer_2x" android:layout_marginBottom="@dimen/spacer_1x" + android:hyphenationFrequency="full" android:textAppearance="?attr/textAppearanceHeadline5" android:textColor="@color/fg_default" tools:maxLength="50" + tools:targetApi="m" tools:text="@tools:sample/lorem/random" /> diff --git a/app/src/main/res/layout/item_notes_list_note_item_grid_only_title.xml b/app/src/main/res/layout/item_notes_list_note_item_grid_only_title.xml index 6bf47835..869a4f70 100644 --- a/app/src/main/res/layout/item_notes_list_note_item_grid_only_title.xml +++ b/app/src/main/res/layout/item_notes_list_note_item_grid_only_title.xml @@ -26,9 +26,11 @@ android:layout_marginRight="@dimen/spacer_2x" android:layout_marginBottom="@dimen/spacer_1x" android:layout_weight="1" + android:hyphenationFrequency="full" android:textAppearance="?attr/textAppearanceHeadline5" android:textColor="@color/fg_default" tools:maxLength="50" + tools:targetApi="m" tools:text="@tools:sample/lorem/random" /> Date: Fri, 12 Jun 2020 20:58:32 +0200 Subject: Set span count per viewport width --- .../owncloud/notes/android/activity/NotesListViewActivity.java | 4 +--- app/src/main/res/values-w1280dp/integers.xml | 4 ++++ app/src/main/res/values-w400dp/integers.xml | 4 ++++ app/src/main/res/values-w600dp/integers.xml | 4 ++++ app/src/main/res/values-w800dp/integers.xml | 4 ++++ app/src/main/res/values/integers.xml | 2 +- 6 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 app/src/main/res/values-w1280dp/integers.xml create mode 100644 app/src/main/res/values-w400dp/integers.xml create mode 100644 app/src/main/res/values-w600dp/integers.xml create mode 100644 app/src/main/res/values-w800dp/integers.xml (limited to 'app/src/main') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java index 0cab9274..eca82fef 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java @@ -13,7 +13,6 @@ import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.text.TextUtils; -import android.util.DisplayMetrics; import android.util.Log; import android.view.View; import android.view.ViewTreeObserver; @@ -608,8 +607,7 @@ public class NotesListViewActivity extends LockedActivity implements NoteClickLi listView.setAdapter(adapter); if (gridView) { - final DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); - int spanCount = (int) ((displayMetrics.widthPixels / displayMetrics.density) / getResources().getInteger(R.integer.max_dp_grid_view)); + int spanCount = getResources().getInteger(R.integer.grid_view_span_count); StaggeredGridLayoutManager gridLayoutManager = new StaggeredGridLayoutManager(spanCount, StaggeredGridLayoutManager.VERTICAL); listView.setLayoutManager(gridLayoutManager); listView.addItemDecoration(new GridItemDecoration(adapter, spanCount, diff --git a/app/src/main/res/values-w1280dp/integers.xml b/app/src/main/res/values-w1280dp/integers.xml new file mode 100644 index 00000000..0d3d9c7f --- /dev/null +++ b/app/src/main/res/values-w1280dp/integers.xml @@ -0,0 +1,4 @@ + + + 5 + diff --git a/app/src/main/res/values-w400dp/integers.xml b/app/src/main/res/values-w400dp/integers.xml new file mode 100644 index 00000000..064f91e1 --- /dev/null +++ b/app/src/main/res/values-w400dp/integers.xml @@ -0,0 +1,4 @@ + + + 2 + \ No newline at end of file diff --git a/app/src/main/res/values-w600dp/integers.xml b/app/src/main/res/values-w600dp/integers.xml new file mode 100644 index 00000000..371e127f --- /dev/null +++ b/app/src/main/res/values-w600dp/integers.xml @@ -0,0 +1,4 @@ + + + 3 + \ No newline at end of file diff --git a/app/src/main/res/values-w800dp/integers.xml b/app/src/main/res/values-w800dp/integers.xml new file mode 100644 index 00000000..782d4488 --- /dev/null +++ b/app/src/main/res/values-w800dp/integers.xml @@ -0,0 +1,4 @@ + + + 4 + \ No newline at end of file diff --git a/app/src/main/res/values/integers.xml b/app/src/main/res/values/integers.xml index 3a6f3f24..ade19fa3 100644 --- a/app/src/main/res/values/integers.xml +++ b/app/src/main/res/values/integers.xml @@ -1,4 +1,4 @@ - 170 + 1 \ No newline at end of file -- cgit v1.2.3 From 908c8560a2cad17a8c763b6224fd8f2fd4578a3d Mon Sep 17 00:00:00 2001 From: Nextcloud bot Date: Sat, 13 Jun 2020 03:31:04 +0000 Subject: [tx-robot] updated from transifex --- app/src/main/res/values-cs-rCZ/strings.xml | 45 +++++++++++++++++++++++++- app/src/main/res/values-da/strings.xml | 6 +++- app/src/main/res/values-de/strings.xml | 45 +++++++++++++++++++++++++- app/src/main/res/values-el/strings.xml | 45 +++++++++++++++++++++++++- app/src/main/res/values-es/strings.xml | 5 +++ app/src/main/res/values-eu/strings.xml | 4 +++ app/src/main/res/values-fr/strings.xml | 14 ++++++++ app/src/main/res/values-gl/strings.xml | 4 +++ app/src/main/res/values-hr/strings.xml | 7 +++- app/src/main/res/values-it/strings.xml | 45 +++++++++++++++++++++++++- app/src/main/res/values-ja-rJP/strings.xml | 6 +++- app/src/main/res/values-nl/strings.xml | 5 +++ app/src/main/res/values-pl/strings.xml | 40 +++++++++++++++++++++-- app/src/main/res/values-pt-rBR/strings.xml | 5 +++ app/src/main/res/values-ru/strings.xml | 5 +++ app/src/main/res/values-sk-rSK/strings.xml | 36 ++++++++++++++++++++- app/src/main/res/values-sl/strings.xml | 5 +++ app/src/main/res/values-tr/strings.xml | 51 +++++++++++++++++++++++++++++- 18 files changed, 361 insertions(+), 12 deletions(-) (limited to 'app/src/main') diff --git a/app/src/main/res/values-cs-rCZ/strings.xml b/app/src/main/res/values-cs-rCZ/strings.xml index bd73681a..f9a32f5c 100644 --- a/app/src/main/res/values-cs-rCZ/strings.xml +++ b/app/src/main/res/values-cs-rCZ/strings.xml @@ -199,4 +199,47 @@ vybrány %d - + --- + `%1$s` + \\`%1$s\\` + ``` + ```javascript + Formátování založené na kontextu + Hlavním cílem návrhu aplikace Poznámky je poskytovat nástroj, kterého používání nerozptyluje. Ačkoli můžete texty formátovat pomocí Markdown značek. Pro různé z níže uvedených příkladů můžete použít zkratky, takže své poznámky můžete formátovat bez zadávání níže uvedených kódů. + Stačí jen vybrat část textu nebo klepnout na kurzor v libovolné pozici a obdržíte vyskakovací nabídky, která obsahuje kromě výchozích položek %1$s, %2$s, %3$s položky jako %4$s nebo %5$s. + + Text + Pomocí značkovacího jazyka Markdown je velice jednoduché vypsat některé slova %1$stučně%1$s a jiná %2$sskloněná (kurzíva)%2$s. Je také možné některá slova %3$spřeškrtnout%3$s a dokonce [odkaz na Nextcloud](https://nextcloud.com). + + Seznamy + Pokud budete chtít číslované seznamy: + Jedna + Dva + Tři + Pokud budete chtít odrážky: + Řádek začněte znakem mínus + A pokud máte dílčí body, pak před mínus či hvězdičku dejte dvě mezery: + Dát lajk + A toto + + Zatržítka + Pro vytvoření zaškrtávací kolonky použijte seznam následovaný závorkami + Položka 1 + Položka 2 + + Strukturované dokumenty + Někdy je užitečné mít různé úrovně nadpisů a strukturovat tak dokumenty. Začněte s řádky s %1$s pro vytvoření nadpisů. Vícero %2$s za sebou značí nižší úrovně nadpisů. + Toto je nadpis třetí úrovně + Je také možné použít jedno %1$s až po %2$s šest pro různé velikosti nadpisů. + Pokud chcete někoho citovat, použijte před řádkem znak %1$s: + Kód + Ve značkovacím jazyce Markdown existuje mnoho různých způsobů jak opatřovat stylem zápis kódu. Pokud máte bloky kódu přímo v rámci řádku, obklopte je zpětnými jednoduchými uvozovkami (backticks): + Značkovací jazyk Markdown také podporuje něco co se nazývá „oplocení“ kódu, což umožňuje vícero řádek bez odsazení: + A pokud chcete použít zvýrazňování syntaxe, včetně jazyka: + + Nepodporováno + Byť se neustále snažíme vylepšovat podporu pro Markdown, je zde několik funkcí, které Poznámky ještě nepodporují: + Tabulky + Obrázky + Pokud chcete se chtěli zapojit a přidat podporu pro tyto funkce, obraťte se na nás prostřednictvím portálu GitHub nebo e-mailu. + diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 3e535f3e..6eea7792 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -184,4 +184,8 @@ %d valgt %d valgt - + + Tekst + Kode + Billeder + diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 2fae90b4..d06acda6 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -197,4 +197,47 @@ %d ausgewählt - + --- + `%1$s` + \\`%1$s\\` + ``` + ```javascript + Kontextbasierte Formatierung + Ein wichtiges Designziel der Notes-App ist die Bereitstellung eines ablenkungsfreien Tools. Sie können Ihre Texte jedoch mit Markdown formatieren. Für verschiedene der unten genannten Beispiele können Sie Verknüpfungen verwenden, um Ihre Notizen zu formatieren, ohne die folgenden Codes eingeben zu müssen. + Wählen Sie einfach einen Textbereich aus oder tippen Sie an einer beliebigen Stelle auf den Cursor und Sie erhalten ein Popup-Menü, das neben den Standardeinträgen %1$s, %2$s, %3$s auch Einträge wie %4$s oder %5$s enthält. + + Text + Es ist sehr einfach, einige Wörter %1$sfett%1$s und andere Wörter %2$skursiv%2$s mit Markdown zu versehen. Sie können einige Wörter %3$sdurchstreichen%3$s und sogar zu Nextcloud [verlinken](https://nextcloud.com). + + Listen + Manchmal werden nummerierte Listen benötigt: + Eins + Zwei + Drei + Manchmal werden Aufzählungszeichen benötigt: + Beginnen Sie eine Zeile mit einem Stern + Und wenn Sie Unterpunkte haben, setzen Sie zwei Leerzeichen vor den Bindestrich oder Stern: + Wie dieses + Und dies + + Kontrollkästchen + Verwenden Sie zum Erstellen eines Kontrollkästchens eine Liste gefolgt von Klammern + Punkt 1 + Punkt 2 + + Strukturierte Dokumente + Manchmal ist es nützlich, verschiedene Ebenen von Überschriften zu haben, um Ihre Dokumente zu strukturieren. Beginnen Sie Zeilen mit %1$s, um Überschriften zu erstellen. Mehrere %2$s in einer Reihe kennzeichnen kleinere Überschriftengrößen. + Dies ist eine Überschrift der dritten Stufe + Sie können ein %1$s bis zu sechs %2$s für verschiedene Kopfgrößen verwenden. + Wenn Sie jemanden zitieren möchten, verwenden Sie das %1$s-Zeichen vor der Zeile: + Quelltext + Es gibt viele verschiedene Möglichkeiten, Text mit Markdown zu formatieren. Wenn Sie Inline-Codeblöcke haben, betten Sie diese in Backticks ein: + Markdown unterstützt auch das sogenannte Code-Fencing, das mehrere Zeilen ohne Einrückung zulässt: + Wenn Sie die Syntaxhervorhebung verwenden möchten, geben Sie folgendes ein: + + Nicht unterstützt + Obwohl wir versuchen, die Unterstützung für Markdown ständig zu verbessern, gibt es einige Funktionen, die von Notes noch nicht unterstützt werden: + Tabellen + Bilder + Wenn Sie uns bei der Entwicklung einer dieser Funktionen unterstützen möchten, setzen Sie sich bitte über GitHub oder E-Mail mit uns in Verbindung. + diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index a3573c7b..cf53b0ec 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -197,4 +197,47 @@ %d επιλέχτηκαν - + --- + `%1$s` + \\`%1$s\\` + ``` + ```javascript + Μορφοποίηση βάσει κατάστασης + Ένας κύριος σχεδιαστικός στόχος της εφαρμογής Σημειώσεις, είναι να παρέχει ένα ανεξάρτητο εργαλείο. Θα μπορείτε να μορφοποιήσετε τα κείμενά σας με το Markdown. Για διάφορα από τα παρακάτω παραδείγματα, μπορείτε να χρησιμοποιήσετε συντομεύσεις για να μορφοποιήσετε τις σημειώσεις σας χωρίς να πληκτρολογήσετε τους παρακάτω κωδικούς. + Απλώς επιλέξτε ένα εύρος κειμένου ή πατήστε τον κέρσορα σε οποιαδήποτε θέση και θα λάβετε ένα αναδυόμενο μενού που περιέχει δίπλα στις προεπιλεγμένες καταχωρήσεις %1$s, %2$s, %3$s καταχωρίσεις όπως %4$s ή %5$s. + + Κείμενο + Είναι πολύ εύκολο να γράψετε μερικές λέξεις με %1$sέντονη%1$s και άλλες με %2$sπλάγια%2$s μορφή με το Markdown. Μπορείτε %3$sχτυπήσετε%3$s μερικές λέξεις μέσω του [συνδέσμου για Nextcloud] (https://nextcloud.com). + + Λίστες + Μερικές φορές θέλετε αριθμημένες λίστες: + Ένα + Δύο + Τρία + Μερικές φορές θέλετε κουκκίδες: + Ξεκινήστε μια γραμμή με παύλα + Και αν έχετε δευτερεύοντα σημεία, βάλτε δύο κενά πριν από την παύλα ή το αστέρι: + Όπως αυτό + Και αυτό + + Πλαίσια ελέγχου + Για να δημιουργήσετε ένα πλαίσιο ελέγχου, χρησιμοποιήστε μια λίστα ακολουθούμενη από αγκύλες + Αντικείμενο 1 + Αντικείμενο 2 + + Δομημένα έγγραφα + Μερικές φορές είναι χρήσιμο να έχετε διαφορετικά επίπεδα επικεφαλίδων για τη δομή των εγγράφων σας. Ξεκινήστε τις γραμμές με ένα %1$s για να δημιουργήσετε επικεφαλίδες. Πολλαπλά %2$s στη σειρά δηλώνουν μικρότερα μεγέθη επικεφαλίδας. + Αυτή είναι μια επικεφαλίδα τρίτου επιπέδου + Μπορείτε να χρησιμοποιήσετε ένα %1$s μέχρι έξι %2$s διαφορετικά μεγέθη επικεφαλίδας. + Αν θέλετε να αναφέρετε κάποιο όνομα, χρησιμοποιήστε τον χαρακτήρα %1$s πριν από τη γραμμή: + Κώδικας + Υπάρχουν πολλοί διαφορετικοί τρόποι δημιουργίας κώδικα με το Markdown. Εάν έχετε ενσωματωμένα μπλοκ κώδικα, περικλείεται με πλάγια κάθετο: + Το Markdown υποστηρίζει επίσης κάτι που ονομάζεται code fencing, το οποίο επιτρέπει πολλαπλές γραμμές χωρίς εσοχή: + Και αν θέλετε να χρησιμοποιήσετε την επισήμανση σύνταξης, συμπεριλάβετε τη γλώσσα: + + Μη υποστηριζόμενο + Ενώ προσπαθούμε να βελτιώνουμε συνεχώς την υποστήριξη για το Markdown, υπάρχουν μερικές δυνατότητες που δεν υποστηρίζονται ακόμη από τις Σημειώσεις: + Πίνακες + Εικόνες + Εάν ενδιαφέρεστε να συνεισφέρετε σε μία από αυτές τις λειτουργίες, επικοινωνήστε μαζί μας μέσω GitHub ή E-Mail. + diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 4beddf5d..12279f9e 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -191,4 +191,9 @@ %d seleccionados + Text + Casillas de verificación + Código + No soportado + Imágenes diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 577ff7ce..217f2449 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -190,4 +190,8 @@ %d hautatuta + Testu + Kontrol-laukiak + Ez da onartzen + Irudiak diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 100951d1..9397aaef 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -195,4 +195,18 @@ %d sélectionné(s) + ```javascript + Texte + Listes + Parfois, vous voulez des listes numérotées : + Un + Deux + Trois + Parfois, vous voulez des puces : + Case à cocher + Pour créer une case à cocher, utilisez une liste suivie de crochets. + Documents structurés + Code + Non pris en charge + Images diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index eab8c152..21785e10 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -197,4 +197,8 @@ %d seleccionados + Texto + Caixas de verificación + Non admitido + Imaxes diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 6cf1fac4..1c11e65b 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -186,4 +186,9 @@ Odabrano je %d Odabrano je %d - + + Tekst + Potvrdni okviri + Bez podrške + Slike + diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 6a6a2687..fe5ba82b 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -197,4 +197,47 @@ %d selezionati - + --- + `%1$s` + \\`%1$s\\` + ``` + ```javascript + Formattazione basata sul contesto + Un obiettivo fondamentale dell\'applicazione Note è di fornire uno strumento senza distrazioni. Potrai comunque formattare i tuoi testi con Markdown. Per i vari esempi sotto indicati, puoi usare le scorciatoie in modo da formattare le note senza digitare i codici sottostanti. + Ti basta selezionare un intervallo di testo o toccare il cursore in qualsiasi posizione e apparirà un menu contenente accanto alle voci predefinite %1$s, %2$s, %3$s elementi come %4$s o %5$s. + + Testo + È molto semplice rendere alcune parole in %1$sgrassetto%1$s e altre in %2$scorsivo%2$s con Markdown. Puoi %3$sbarrare%3$s alcune parole e anche [collegarle a Nextcloud](https://nextcloud.com). + + Elenchi + A volte hai bisogno di elenchi numerati: + Uno + Due + Tre + A volte hai bisogno dei punti elenco: + Inizia un riga con un trattino + E se hai sotto-punti, metti due spazi prima del trattino o dell\'asterisco: + Come questo + E questo + + Caselle di selezione + Per creare una casella di selezione, usa un elenco seguito da parentesi + Elemento 1 + Elemento 2 + + Documenti strutturati + Talvolta è utile avere diversi livelli di intestazione per strutturare i tuoi documenti. Inizia le righe con un %1$s per creare intestazioni. Più %2$s in una riga indicano dimensioni minori di intestazione. + Questa è un\'intestazione di terzo livello + Puoi utilizzare da un %1$s fino a sei %2$s per diverse dimensioni di intestazione. + Se vuoi citare qualcuno, utilizza il carattere %1$s prima della riga: + Codice + Esistono molti modi diversi per definire lo stile del codice con Markdown. Se hai blocchi di codice in linea, racchiudili tra apici inversi: + Markdown supporta anche raggruppamenti di codice, che consente a righe multiple senza indentazione: + E se desideri utilizzare l\'evidenziazione della sintassi, includi il linguaggio: + + Non supportato + Mentre proviamo a migliorare continuamente il supporto per Markdown, ci sono alcune funzionalità che non sono ancora supportate da Note: + Tabelle + Immagini + Se sei interessato a fornire supporto per una di queste funzionalità, contattaci tramite GitHub o email. + diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index b992c02a..d59d9c0c 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -184,4 +184,8 @@ %d 選択済 - + + テキスト + サポートされていません。 + 画像 + diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 887fb0aa..6dd6798e 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -192,4 +192,9 @@ %d geselecteerd + Tekst + Aanvinkvakjes + Code + Niet ondersteund + Afbeeldingen diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 858119e8..a025786e 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -30,7 +30,7 @@ Udostępnij Szukaj w %1$s - Szukaj we wszystkich notatkach + Szukaj w notatkach Wybierz kategorię @@ -158,7 +158,7 @@ Bezpieczeństwo Wygląd Synchronizacja - Zachowane + Zachowanie Udostępnij treść notatki %1$d Zarządzaj kontami Formatowanie @@ -199,4 +199,38 @@ %d wybranych - + --- + ``` + ```javascript + Formatowanie kontekstowe + Głównym celem projektowym aplikacji Notes jest zapewnienie narzędzia bez rozpraszania uwagi. Chociaż będziesz mógł sformatować swoje teksty za pomocą Markdown. W przypadku różnych wymienionych poniżej przykładów możesz użyć skrótów, dzięki czemu możesz sformatować swoje notatki bez wpisywania poniższych kodów. + Tekst + Listy + Czasami chcesz mieć listy ponumerowane: + 1 Jeden + 2. Dwa + 3. Trzy + Czasami chcesz wypunktować: + Rozpocznij linię gwiazdką + A jeśli masz podpunkty, umieść dwie spacje przed kreską lub gwiazdką: + Lubię to + I to też + + Pola wyboru + Aby utworzyć pole wyboru, użyj listy i nawiasów + Pozycja 1 + Pozycja 2 + + Dokumenty strukturalne + To nagłówek trzeciego poziomu + Kod + Istnieje wiele różnych sposobów stylizowania kodu za pomocą Markdown. Jeśli masz wbudowane bloki kodu, zawiń je w backticks: + Markdown obsługuje również coś, co nazywa się szermierką kodu, co pozwala na wiele linii bez wcięć: + A jeśli chcesz użyć podświetlania składni, uwzględnij język: + + Niewspierane + Chociaż staramy się ciągle ulepszać obsługę Markdown, istnieje kilka funkcji, które nie są jeszcze obsługiwane przez Notes: + Tabele + Obrazy + Jeśli chcesz pomóc przy jednej z tych funkcji, skontaktuj się z nami za pośrednictwem GitHub lub e-mail. + diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 7e50aa88..cb310a61 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -191,4 +191,9 @@ %d selecionados + Texto + Caixas de seleção + Código + Não suportado + Imagens diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index e8f233c8..afa808be 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -192,4 +192,9 @@ %d выбрано + Текст + Несколько из списка + Код + Не поддерживается + Изображения diff --git a/app/src/main/res/values-sk-rSK/strings.xml b/app/src/main/res/values-sk-rSK/strings.xml index a75b41de..8ec751c7 100644 --- a/app/src/main/res/values-sk-rSK/strings.xml +++ b/app/src/main/res/values-sk-rSK/strings.xml @@ -199,4 +199,38 @@ %d vybraný - + --- + ``` + ```javascript + Kontextové formátovanie + Hlavným cieľom aplikácie Notes je poskytnúť nástroj bez rozptyľovania. Svoje texty však budete môcť formátovať pomocou aplikácie Markdown. Pre rôzne príklady uvedené nižšie môžete použiť klávesové skratky, pomocou ktorých môžete svoje poznámky formátovať bez toho, aby ste museli zadávať kódy uvedené nižšie. + Text + Zoznamy + Niekedy chcete číslované zoznamy: + Jeden + Dva + Tri + Niekedy chcete odrážky: + Riadok začnite pomlčkou + A ak máte vnorený bod, vložte pred pomlčku alebo hviezdičku dve medzery: + Ako toto + A toto + + Zaškrtávacie políčka + Ak chcete vytvoriť zaškrtávacie políčko, použite zoznam nasledovaný hranatými zátvorkami + Položka 1 + Položka 2 + + Štrukturované dokumenty + Toto je nadpis tretej úrovne + Kód + Tam, kde je to možné, ako upraviť štýl vrátane Markdown. Ak chcete vložiť kód, zalomte ich do spätných lomiek: + Markdown tiež podporuje niečo, čo sa nazýva oplotenie kódu, čo umožňuje použiť viac riadkov bez odsadenia: + Ak chcete použiť zvýraznenie syntaxe, uveďte jazyk: + + Nepodporované + Aj keď sa pokúšame neustále zlepšovať podporu Markdown, existuje niekoľko funkcií, ktoré zatiaľ Poznámky nepodporujú: + Tabuľky + Obrázky + Ak máte záujem prispieť k podpore niektorej z týchto funkcií, kontaktujte nás prostredníctvom služby GitHub alebo e-mailom. + diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index a3b94cba..2cf2022b 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -192,4 +192,9 @@ %d izbranih + Besedilo + Izbirna polja + Šifra + Nepodprto + Slike diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 2e01690b..eb31685d 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -29,6 +29,9 @@ Ön izleme Paylaş + %1$s içinde arama + Tüm notlarda arama + Bir kategori seçin Bugün @@ -155,8 +158,11 @@ Güvenlik Görünüm Eşitleme + Davranış %1$d notun içeriğini paylaş Hesap yönetimi + Biçimlendirme + Düzenleme kipinde aç @@ -191,4 +197,47 @@ %d seçilmiş - + --- + `%1$s` + \\`%1$s\\` + ``` + ```javascript + Bağlama göre biçimlendirme + Notlar uygulamasının önemli bir tasarım amacı, dikkat dağıtmayan bir araç sağlamaktır. Yine de metinlerinizi Markdown kullanarak biçimlendirebilirsiniz. Aşağıdaki örneklerden bazılarında kısayolları kullanarak notlarınızı aşağıdaki kodları yazmadan biçimlendirebilirsiniz. + Yalnız bir metin bölümü seçerek ya da herhangi bir konumda imlece dokunarak varsayılan kayıtların yanında açılan menüden %1$s, %2$s, %3$s, %4$s gibi kayıtlar ya da %5$s seçenekleri kullanabilirsiniz. + + Metin + Markdown ile bazı sözcükleri %1$skalın%1$s ya da %2$syatık%2$s yapmak çok kolaydır. Bazı sözcüklerin %3$süzerini çizebilir%3$s ve [Nextcloud bağlantısı](https://nextcloud.com) gibi bağlantı verebilirsiniz. + + Listeler + Bazen listelerin numaralı olmasını istersiniz: + Bir + İki + Üç + Bazen listelerde madde imi kullanılmasını istersiniz: + Bir satıra tire ile başlayın + Alt imler için tire ya da yıldız önüne iki boşluk ekleyin: + Bunun gibi + Ve bunun gibi + + İşaret kutuları + Bir işaret kutusu eklemek için köşeli parantezler ile biten bir liste kullanın + 1. öge + 2. öge + + Yapılandırılmış belgeler + Bazen belgelerinizi yapılandırmak için farklı düzeylerde başlıklar kullanmak yararlı olabilir. Başlık oluşturmak için satırlara %1$s ile başlayın. Bir satırda %2$s gibi birden çok simge kullanılması başlık düzeyini ve boyutunu azaltır. + Bu üçüncü düzey bir başlık + Farklı başlık boyutları için bir %1$s ile altı %2$s arasında seçim yapabilirsiniz. + Birinden alıntı yapmak isterseniz satırdan önce %1$s karakterini kullanın: + Kod + Markdown ile kod yazmanın birçok farklı yolu vardır. Satır arası kod bloklarınız varsa, bunları ters tırnaklar arasında yazın: + Markdown ayrıca kod çiti olarak adlandırılan ve girinti olmadan birden fazla satıra izin veren bir şeyi destekler: + Ve söz dizimi vurgulamasını kullanmak istiyorsanız, dili ekleyin: + + Desteklenmiyor + Markdown desteğini sürekli olarak geliştirmeye çalışıyoruz. Ancak henüz Notes uygulamasının desteklemediği birkaç özellik var: + Tablolar + Görseller + Bu özelliklerden biri için destek olmak isterseniz, GitHub ya da e-posta üzerinden bizimle görüşün. + -- cgit v1.2.3 From f6540b286fab8734f7184037e193eaa381d86853 Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Sat, 13 Jun 2020 10:21:25 +0200 Subject: Change breakpoint for grid view from 400 to 320 --- app/src/main/res/values-w320dp/integers.xml | 4 ++++ app/src/main/res/values-w400dp/integers.xml | 4 ---- 2 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 app/src/main/res/values-w320dp/integers.xml delete mode 100644 app/src/main/res/values-w400dp/integers.xml (limited to 'app/src/main') diff --git a/app/src/main/res/values-w320dp/integers.xml b/app/src/main/res/values-w320dp/integers.xml new file mode 100644 index 00000000..064f91e1 --- /dev/null +++ b/app/src/main/res/values-w320dp/integers.xml @@ -0,0 +1,4 @@ + + + 2 + \ No newline at end of file diff --git a/app/src/main/res/values-w400dp/integers.xml b/app/src/main/res/values-w400dp/integers.xml deleted file mode 100644 index 064f91e1..00000000 --- a/app/src/main/res/values-w400dp/integers.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - 2 - \ No newline at end of file -- cgit v1.2.3 From 377dcee2bd7e15645a2cbe2fe7371f14e87a9013 Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Sat, 13 Jun 2020 10:32:45 +0200 Subject: Create constant for EXCERPT_LINE_SEPARATOR to replace magic string " " --- .../java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java | 3 ++- app/src/main/java/it/niedermann/owncloud/notes/util/NoteUtil.java | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) (limited to 'app/src/main') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java index 984de175..6f840fb1 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java @@ -15,6 +15,7 @@ import it.niedermann.owncloud.notes.databinding.ItemNotesListNoteItemGridBinding import static android.view.View.GONE; import static android.view.View.INVISIBLE; import static android.view.View.VISIBLE; +import static it.niedermann.owncloud.notes.util.NoteUtil.EXCERPT_LINE_SEPARATOR; public class NoteViewGridHolder extends NoteViewHolder { @NonNull @@ -43,7 +44,7 @@ public class NoteViewGridHolder extends NoteViewHolder { binding.noteStatus.setVisibility(DBStatus.VOID.equals(note.getStatus()) ? INVISIBLE : VISIBLE); bindFavorite(binding.noteFavorite, note.isFavorite()); bindSearchableContent(context, binding.noteTitle, searchQuery, note.getTitle(), mainColor); - bindSearchableContent(context, binding.noteExcerpt, searchQuery, note.getExcerpt().replace(" ", "\n"), mainColor); + bindSearchableContent(context, binding.noteExcerpt, searchQuery, note.getExcerpt().replace(EXCERPT_LINE_SEPARATOR, "\n"), mainColor); binding.noteExcerpt.setVisibility(TextUtils.isEmpty(note.getExcerpt()) ? GONE : VISIBLE); } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/util/NoteUtil.java b/app/src/main/java/it/niedermann/owncloud/notes/util/NoteUtil.java index bd83ce5c..26127b44 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/util/NoteUtil.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/util/NoteUtil.java @@ -24,6 +24,8 @@ public class NoteUtil { private static final Pattern pSpace1 = Pattern.compile("^\\s+", Pattern.MULTILINE); private static final Pattern pSpace2 = Pattern.compile("\\s+$", Pattern.MULTILINE); + public static final String EXCERPT_LINE_SEPARATOR = " "; + private NoteUtil() { } @@ -87,7 +89,7 @@ public class NoteUtil { @NonNull public static String generateNoteExcerpt(@NonNull String content) { if (content.contains("\n")) - return truncateString(removeMarkDown(content.replaceFirst("^.*\n", "")), 200).replace("\n", " "); + return truncateString(removeMarkDown(content.replaceFirst("^.*\n", "")), 200).replace("\n", EXCERPT_LINE_SEPARATOR); else return ""; } -- cgit v1.2.3 From 837ced217c73f0e248a45085e7ec38b5be3b405f Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Sat, 13 Jun 2020 10:46:57 +0200 Subject: Add beta hint to grid view preference --- app/src/main/res/values/strings.xml | 2 +- app/src/main/res/xml/preferences.xml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) (limited to 'app/src/main') diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7aebd1ce..2bb3901d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -192,7 +192,7 @@ Shared text was empty Append to note Branding - Grid view + Grid view 🆕 Security Appearance Synchronization diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 06e1f1be..3050e2a8 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -49,6 +49,7 @@ android:icon="@drawable/ic_baseline_dashboard_24" android:key="@string/pref_key_gridview" android:layout="@layout/item_pref" + android:summary="@string/simple_beta" android:title="@string/settings_gridview" /> -- cgit v1.2.3 From 0e6afd42e37166c1f70e57d19d60d8e06f00b966 Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Sat, 13 Jun 2020 11:00:03 +0200 Subject: Enable grid view for prod builds --- .../niedermann/owncloud/notes/android/fragment/PreferencesFragment.java | 1 - 1 file changed, 1 deletion(-) (limited to 'app/src/main') diff --git a/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java b/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java index f4ea6b02..76077f27 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java @@ -61,7 +61,6 @@ public class PreferencesFragment extends PreferenceFragmentCompat implements Bra gridViewPref = findPreference(getString(R.string.pref_key_gridview)); if (gridViewPref != null) { - gridViewPref.setVisible(BuildConfig.DEBUG); gridViewPref.setOnPreferenceChangeListener((Preference preference, Object newValue) -> { final Boolean gridView = (Boolean) newValue; Log.v(TAG, "gridView: " + gridView); -- cgit v1.2.3