Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/stefan-niedermann/nextcloud-notes.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Niedermann <info@niedermann.it>2020-06-13 13:48:44 +0300
committerStefan Niedermann <info@niedermann.it>2020-06-13 13:48:44 +0300
commitb5dbfb4734a1287472657b96d723edf9130936f0 (patch)
tree35c56684378ca275206cb5c1223e2f3007d23c4f /app/src/main
parent2b776cb7506d72271b1f20f38218d75690012fff (diff)
parent0e6afd42e37166c1f70e57d19d60d8e06f00b966 (diff)
Merge branch 'master' into api-v1
# Conflicts: # app/src/main/java/it/niedermann/owncloud/notes/util/NoteUtil.java
Diffstat (limited to 'app/src/main')
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/android/NotesListViewItemTouchHelper.java10
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java48
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/android/appwidget/NoteListWidget.java35
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/android/appwidget/SingleNoteWidget.java7
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/android/fragment/CategoryAdapter.java2
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java27
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/branding/BrandingUtil.java1
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/formattinghelp/FormattingHelpActivity.java68
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/model/GridItemDecoration.java53
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/model/ItemAdapter.java130
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java55
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolderOnlyTitle.java47
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java98
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java44
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java41
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/model/SectionItemDecoration.java39
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/model/SectionViewHolder.java9
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesDatabase.java24
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/util/MarkDownUtil.java4
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/util/NoteUtil.java4
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/util/Notes.java13
-rw-r--r--app/src/main/res/drawable-v21/grid_item_background_selector.xml19
-rw-r--r--app/src/main/res/drawable-v21/list_item_background_selector.xml2
-rw-r--r--app/src/main/res/drawable/grid_item_background_selector.xml6
-rw-r--r--app/src/main/res/drawable/ic_baseline_dashboard_24.xml5
-rw-r--r--app/src/main/res/layout/activity_notes_list_view.xml5
-rw-r--r--app/src/main/res/layout/item_notes_list_note_item_grid.xml106
-rw-r--r--app/src/main/res/layout/item_notes_list_note_item_grid_only_title.xml61
-rw-r--r--app/src/main/res/layout/item_notes_list_note_item_with_excerpt.xml (renamed from app/src/main/res/layout/item_notes_list_note_item.xml)32
-rw-r--r--app/src/main/res/layout/item_notes_list_note_item_without_excerpt.xml99
-rw-r--r--app/src/main/res/layout/item_notes_list_section_item.xml8
-rw-r--r--app/src/main/res/layout/widget_note_list.xml3
-rw-r--r--app/src/main/res/layout/widget_note_list_dark.xml1
-rw-r--r--app/src/main/res/values-cs-rCZ/strings.xml46
-rw-r--r--app/src/main/res/values-da/strings.xml6
-rw-r--r--app/src/main/res/values-de/strings.xml46
-rw-r--r--app/src/main/res/values-el/strings.xml50
-rw-r--r--app/src/main/res/values-es/strings.xml8
-rw-r--r--app/src/main/res/values-eu/strings.xml7
-rw-r--r--app/src/main/res/values-fr/strings.xml17
-rw-r--r--app/src/main/res/values-gl/strings.xml9
-rw-r--r--app/src/main/res/values-hr/strings.xml7
-rw-r--r--app/src/main/res/values-it/strings.xml46
-rw-r--r--app/src/main/res/values-ja-rJP/strings.xml6
-rw-r--r--app/src/main/res/values-nl/strings.xml8
-rw-r--r--app/src/main/res/values-pl/strings.xml41
-rw-r--r--app/src/main/res/values-pt-rBR/strings.xml8
-rw-r--r--app/src/main/res/values-ru/strings.xml8
-rw-r--r--app/src/main/res/values-sk-rSK/strings.xml37
-rw-r--r--app/src/main/res/values-sl/strings.xml8
-rw-r--r--app/src/main/res/values-tr/strings.xml50
-rw-r--r--app/src/main/res/values-w1280dp/integers.xml4
-rw-r--r--app/src/main/res/values-w320dp/integers.xml4
-rw-r--r--app/src/main/res/values-w600dp/integers.xml4
-rw-r--r--app/src/main/res/values-w800dp/integers.xml4
-rw-r--r--app/src/main/res/values/dimens.xml2
-rw-r--r--app/src/main/res/values/integers.xml4
-rw-r--r--app/src/main/res/values/strings.xml64
-rw-r--r--app/src/main/res/xml/preferences.xml7
59 files changed, 1383 insertions, 224 deletions
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..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
@@ -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;
@@ -48,15 +48,15 @@ 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) {
- 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..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
@@ -22,11 +22,13 @@ 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;
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;
@@ -62,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;
@@ -70,6 +73,7 @@ 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;
@@ -83,6 +87,8 @@ 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;
@@ -90,6 +96,8 @@ public class NotesListViewActivity extends LockedActivity implements NoteClickLi
private static final String TAG = NotesListViewActivity.class.getSimpleName();
+ private boolean gridView = 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";
@@ -123,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;
@@ -177,6 +185,11 @@ public class NotesListViewActivity extends LockedActivity implements NoteClickLi
db = NotesDatabase.getInstance(this);
+ gridView = isGridViewEnabled();
+ if (!gridView || isDarkThemeActive(this)) {
+ activityBinding.activityNotesListView.setBackgroundColor(ContextCompat.getColor(this, R.color.primary));
+ }
+
setupToolbars();
setupNavigationList(categoryAdapterSelectedItem);
setupNavigationMenu();
@@ -229,7 +242,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, gridView)
+ .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...");
@@ -317,7 +331,7 @@ public class NotesListViewActivity extends LockedActivity implements NoteClickLi
}
private void setupNotesList() {
- initList();
+ initRecyclerView();
((RecyclerView) findViewById(R.id.recycler_view)).addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
@@ -588,10 +602,31 @@ public class NotesListViewActivity extends LockedActivity implements NoteClickLi
binding.navigationMenu.setAdapter(adapterMenu);
}
- public void initList() {
- adapter = new ItemAdapter(this);
+ private void initRecyclerView() {
+ adapter = new ItemAdapter(this, gridView);
listView.setAdapter(adapter);
- listView.setLayoutManager(new LinearLayoutManager(this));
+
+ if (gridView) {
+ 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,
+ 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_1x)
+ ));
+ } else {
+ 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
+ ));
+ }
}
private void refreshLists() {
@@ -787,7 +822,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/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/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<RecyclerView.ViewHolde
this.categories.add(0, clearItem);
if (currentSearchString != null && currentSearchString.trim().length() > 0) {
boolean currentSearchStringIsInCategories = false;
- for (NavigationItem category : categories.subList(1, categories.size())) {
+ for (NavigationItem category : categories) {
if (currentSearchString.equals(category.label)) {
currentSearchStringIsInCategories = true;
break;
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..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
@@ -11,15 +11,19 @@ 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;
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;
+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();
@@ -28,6 +32,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) {
@@ -43,6 +48,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);
@@ -53,11 +59,29 @@ 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);
+ Notes.updateGridViewEnabled(gridView);
+ 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())) {
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);
@@ -111,5 +135,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/java/it/niedermann/owncloud/notes/formattinghelp/FormattingHelpActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/formattinghelp/FormattingHelpActivity.java
index 04a4a5a3..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
@@ -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 +
+ 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 +
+ 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_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 +
@@ -152,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 +
@@ -200,10 +210,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)) + 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_4) + lineBreak +
+ getString(R.string.formatting_help_code_body_2) + lineBreak +
lineBreak +
getString(R.string.formatting_help_codefence_escaped) + lineBreak +
javascript +
@@ -213,7 +223,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 +239,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/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..68b349e0
--- /dev/null
+++ b/app/src/main/java/it/niedermann/owncloud/notes/model/GridItemDecoration.java
@@ -0,0 +1,53 @@
+package it.niedermann.owncloud.notes.model;
+
+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 SectionItemDecoration {
+
+ @NonNull
+ private final ItemAdapter adapter;
+ private final int spanCount;
+ private final 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;
+ }
+
+ @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();
+
+ 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 < spanCount && 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 ba6042bc..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
@@ -1,14 +1,18 @@
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;
import android.view.LayoutInflater;
-import android.view.View;
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;
@@ -16,32 +20,60 @@ 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.util.NoteUtil.getFontSizeFromPreferences;
public class ItemAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements Branded {
private static final String TAG = ItemAdapter.class.getSimpleName();
- private static final int section_type = 0;
- private static final int note_type = 1;
+ 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;
private List<Item> itemList = new ArrayList<>();
private boolean showCategory = true;
private CharSequence searchQuery;
- @NonNull
- private Context context;
private final List<Integer> selected = new ArrayList<>();
+ @Px
+ private final float fontSize;
+ private final boolean monospace;
@ColorInt
private int mainColor;
@ColorInt
private int textColor;
- public <T extends Context & NoteClickListener> ItemAdapter(@NonNull T context) {
- this.context = context;
+ public <T extends Context & NoteClickListener> ItemAdapter(@NonNull T context, boolean gridView) {
this.noteClickListener = context;
+ 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);
}
+
+ /*
+ 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.
*
@@ -74,24 +106,54 @@ public class ItemAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> 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);
+ if (gridView) {
+ switch (viewType) {
+ 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);
+ }
+ default: {
+ throw new IllegalArgumentException("Not supported viewType: " + viewType);
+ }
+ }
} 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()), parent, false), noteClickListener);
+ }
+ case TYPE_NOTE_ONLY_TITLE:
+ case TYPE_NOTE_WITHOUT_EXCERPT: {
+ return new NoteViewHolderWithoutExcerpt(ItemNotesListNoteItemWithoutExcerptBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false), 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:
+ case TYPE_NOTE_WITHOUT_EXCERPT:
+ case TYPE_NOTE_ONLY_TITLE: {
+ ((NoteViewHolder) holder).bind((DBNote) itemList.get(position), showCategory, mainColor, textColor, searchQuery);
+ break;
+ }
}
}
@@ -99,7 +161,7 @@ public class ItemAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> 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) {
@@ -145,9 +207,23 @@ public class ItemAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> i
return itemList.size();
}
+ @IntRange(from = 0, to = 3)
@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");
+ }
+ 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
@@ -160,4 +236,16 @@ public class ItemAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> 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 = 3) 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
new file mode 100644
index 00000000..6f840fb1
--- /dev/null
+++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java
@@ -0,0 +1,55 @@
+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;
+
+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
+ private final ItemNotesListNoteItemGridBinding binding;
+
+ 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) {
+ 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) {
+ 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()) ? INVISIBLE : VISIBLE);
+ bindFavorite(binding.noteFavorite, note.isFavorite());
+ bindSearchableContent(context, binding.noteTitle, searchQuery, note.getTitle(), mainColor);
+ bindSearchableContent(context, binding.noteExcerpt, searchQuery, note.getExcerpt().replace(EXCERPT_LINE_SEPARATOR, "\n"), mainColor);
+ binding.noteExcerpt.setVisibility(TextUtils.isEmpty(note.getExcerpt()) ? GONE : VISIBLE);
+ }
+
+ @Nullable
+ public View getNoteSwipeable() {
+ return null;
+ }
+} \ No newline at end of file
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/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java
index a42c8377..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;
@@ -9,64 +10,47 @@ 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.CallSuper;
import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
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;
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 {
+ @NonNull
private final NoteClickListener noteClickListener;
- public NoteViewHolder(View v, NoteClickListener noteClickListener) {
+ public NoteViewHolder(@NonNull View v, @NonNull NoteClickListener noteClickListener) {
super(v);
- binding = ItemNotesListNoteItemBinding.bind(v);
this.noteClickListener = noteClickListener;
- 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);
}
- 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);
+ @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 void bind(DBNote note, NoteClickListener noteClickListener, boolean showCategory, int mainColor, int textColor, @Nullable CharSequence searchQuery) {
- @NonNull final Context context = itemView.getContext();
+ protected void bindCategory(@NonNull Context context, @NonNull TextView noteCategory, boolean showCategory, @NonNull String category, int mainColor) {
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());
+ noteCategory.setVisibility(showCategory && !category.isEmpty() ? View.VISIBLE : View.GONE);
+ noteCategory.setText(category);
@ColorInt int categoryForeground;
@ColorInt int categoryBackground;
@@ -93,19 +77,28 @@ public class NoteViewHolder extends RecyclerView.ViewHolder implements View.OnLo
}
}
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
- DrawableCompat.setTint(binding.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) binding.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);
+ }
}
- 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));
+ 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 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);
@@ -114,30 +107,21 @@ public class NoteViewHolder extends RecyclerView.ViewHolder implements View.OnLo
// 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);
- }
-
- 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());
+ processedContent = spannableString;
}
+ textView.setText(processedContent);
}
- public View getNoteSwipeable() {
- return binding.noteSwipeable;
- }
+ 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
new file mode 100644
index 00000000..032e868f
--- /dev/null
+++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java
@@ -0,0 +1,44 @@
+package it.niedermann.owncloud.notes.model;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.view.View;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import it.niedermann.owncloud.notes.R;
+import it.niedermann.owncloud.notes.databinding.ItemNotesListNoteItemWithExcerptBinding;
+
+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;
+ }
+
+ 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(@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);
+ binding.noteStatus.setVisibility(DBStatus.VOID.equals(note.getStatus()) ? View.INVISIBLE : View.VISIBLE);
+ bindFavorite(binding.noteFavorite, note.isFavorite());
+
+ bindSearchableContent(context, binding.noteTitle, searchQuery, note.getTitle(), mainColor);
+ bindSearchableContent(context, binding.noteExcerpt, searchQuery, note.getExcerpt(), mainColor);
+ }
+
+ @NonNull
+ 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..acdb4fb6
--- /dev/null
+++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java
@@ -0,0 +1,41 @@
+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.R;
+import it.niedermann.owncloud.notes.databinding.ItemNotesListNoteItemWithoutExcerptBinding;
+
+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;
+ }
+
+ 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(@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);
+ binding.noteStatus.setVisibility(DBStatus.VOID.equals(note.getStatus()) ? View.INVISIBLE : View.VISIBLE);
+ bindFavorite(binding.noteFavorite, note.isFavorite());
+ bindSearchableContent(context, binding.noteTitle, searchQuery, note.getTitle(), mainColor);
+ }
+
+ @NonNull
+ public View getNoteSwipeable() {
+ return binding.noteSwipeable;
+ }
+} \ No newline at end of file
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/model/SectionViewHolder.java b/app/src/main/java/it/niedermann/owncloud/notes/model/SectionViewHolder.java
index 3441cc85..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
@@ -1,17 +1,16 @@
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;
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/java/it/niedermann/owncloud/notes/persistence/NotesDatabase.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesDatabase.java
index 11525a4f..a8cbb8e6 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;
@@ -57,6 +55,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;
import static it.niedermann.owncloud.notes.util.NoteUtil.generateNoteExcerpt;
@@ -629,7 +629,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)) {
@@ -697,24 +697,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/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 f695f8d9..e79635f2 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
@@ -25,6 +25,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() {
}
@@ -99,7 +101,7 @@ public class NoteUtil {
}
}
if (content.contains("\n")) {
- return truncateString(content.trim(), 200).replace("\n", " ");
+ return truncateString(content.trim(), 200).replace("\n", EXCERPT_LINE_SEPARATOR);
} else {
return "";
}
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..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
@@ -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() {
+ 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/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 @@
+<?xml version="1.0" encoding="utf-8"?><!-- Selector is used for Background Colors in List Items -->
+<ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="@color/bg_highlighted">
+ <!-- :selected -->
+ <item>
+ <selector>
+ <item android:state_selected="true">
+ <color android:color="@color/bg_highlighted" />
+ </item>
+
+ <item android:state_activated="true">
+ <color android:color="@color/bg_highlighted" />
+ </item>
+
+ <item>
+ <color android:color="@android:color/transparent" />
+ </item>
+ </selector>
+ </item>
+</ripple> \ 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 @@
<?xml version="1.0" encoding="utf-8"?><!-- Selector is used for Background Colors in List Items -->
<ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="@color/bg_highlighted">
<!-- :selected -->
-
-
<item>
<selector>
<item android:state_selected="true">
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 @@
+<?xml version="1.0" encoding="utf-8"?><!-- Selector is used for Background Colors in List Items -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <!-- :selected -->
+ <item android:drawable="@color/bg_highlighted" android:state_selected="true" />
+ <item android:drawable="@android:color/transparent" />
+</selector>
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 @@
+<vector android:autoMirrored="true" android:height="24dp"
+ android:tint="#757575" android:viewportHeight="24"
+ android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
+ <path android:fillColor="@android:color/white" android:pathData="M3,13h8L11,3L3,3v10zM3,21h8v-6L3,15v6zM13,21h8L21,11h-8v10zM13,3v6h8L21,3h-8z"/>
+</vector>
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..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">
<LinearLayout
android:layout_width="match_parent"
@@ -124,7 +123,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" />
</FrameLayout>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
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..9f66f71e
--- /dev/null
+++ b/app/src/main/res/layout/item_notes_list_note_item_grid.xml
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/card"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:focusable="true">
+
+ <LinearLayout
+ android:id="@+id/wrapper"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@drawable/grid_item_background_selector"
+ android:orientation="vertical"
+ android:paddingBottom="@dimen/spacer_1x">
+
+ <TextView
+ android:id="@+id/noteTitle"
+ android:layout_width="match_parent"
+ 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_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" />
+
+
+ <TextView
+ android:id="@+id/noteExcerpt"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="@dimen/spacer_2x"
+ android:layout_marginLeft="@dimen/spacer_2x"
+ android:layout_marginEnd="@dimen/spacer_2x"
+ android:layout_marginRight="@dimen/spacer_2x"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textColor="@color/fg_default"
+ tools:maxLength="200"
+ tools:text="@tools:sample/lorem/random" />
+
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:baselineAligned="false"
+ android:gravity="center_vertical"
+ android:orientation="horizontal">
+
+ <FrameLayout
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1">
+
+ <com.google.android.material.chip.Chip
+ android:id="@+id/noteCategory"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="@dimen/spacer_2x"
+ android:layout_marginLeft="@dimen/spacer_2x"
+ android:layout_marginEnd="0dp"
+ android:layout_marginRight="0dp"
+ android:ellipsize="middle"
+ android:textColor="?android:textColorPrimary"
+ android:textSize="@dimen/secondary_font_size"
+ app:chipBackgroundColor="@color/primary"
+ app:chipStrokeColor="@color/defaultBrand"
+ app:chipStrokeWidth="1dp"
+ tools:maxLength="50"
+ tools:text="@tools:sample/lorem/random" />
+ </FrameLayout>
+
+ <FrameLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+
+ <ImageView
+ android:id="@+id/noteFavorite"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="?attr/selectableItemBackgroundBorderless"
+ android:contentDescription="@string/menu_favorite"
+ android:padding="@dimen/spacer_2x"
+ tools:src="@drawable/ic_star_yellow_24dp" />
+
+ <androidx.appcompat.widget.AppCompatImageView
+ android:id="@+id/noteStatus"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical|end"
+ android:layout_marginTop="12dp"
+ android:layout_marginEnd="4dp"
+ android:layout_marginRight="4dp"
+ android:baseline="14dp"
+ app:srcCompat="@drawable/ic_sync_blue_18dp" />
+ </FrameLayout>
+ </LinearLayout>
+ </LinearLayout>
+</com.google.android.material.card.MaterialCardView> \ 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..869a4f70
--- /dev/null
+++ b/app/src/main/res/layout/item_notes_list_note_item_grid_only_title.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/card"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:focusable="true">
+
+ <LinearLayout
+ android:id="@+id/wrapper"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@drawable/grid_item_background_selector"
+ android:orientation="horizontal"
+ android:paddingBottom="@dimen/spacer_1x">
+
+ <TextView
+ android:id="@+id/noteTitle"
+ android:layout_width="0dp"
+ 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_marginEnd="@dimen/spacer_2x"
+ 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" />
+
+ <FrameLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+
+ <ImageView
+ android:id="@+id/noteFavorite"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="?attr/selectableItemBackgroundBorderless"
+ android:contentDescription="@string/menu_favorite"
+ android:padding="@dimen/spacer_2x"
+ tools:src="@drawable/ic_star_yellow_24dp" />
+
+ <androidx.appcompat.widget.AppCompatImageView
+ android:id="@+id/noteStatus"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical|end"
+ android:layout_marginTop="12dp"
+ android:layout_marginEnd="4dp"
+ android:layout_marginRight="4dp"
+ android:baseline="14dp"
+ app:srcCompat="@drawable/ic_sync_blue_18dp" />
+ </FrameLayout>
+ </LinearLayout>
+</com.google.android.material.card.MaterialCardView> \ No newline at end of file
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_with_excerpt.xml
index ba88af2a..fe4d8b0b 100644
--- a/app/src/main/res/layout/item_notes_list_note_item.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" />
- <androidx.appcompat.widget.LinearLayoutCompat
+ <LinearLayout
android:id="@+id/noteSwipeable"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:background="@drawable/list_item_background_selector">
+ android:background="@drawable/list_item_background_selector"
+ android:baselineAligned="false">
<FrameLayout
android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:layout_centerVertical="true">
+ android:layout_height="match_parent">
<ImageView
android:id="@+id/noteFavorite"
@@ -60,8 +60,8 @@
</FrameLayout>
- <androidx.appcompat.widget.LinearLayoutCompat
- android:layout_width="wrap_content"
+ <LinearLayout
+ android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
@@ -72,13 +72,13 @@
android:paddingRight="@dimen/spacer_2x"
android:paddingBottom="@dimen/spacer_2x">
- <androidx.appcompat.widget.LinearLayoutCompat
+ <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/noteTitle"
- android:layout_width="wrap_content"
+ android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ellipsize="end"
@@ -86,19 +86,17 @@
android:textColor="?android:textColorPrimary"
android:textSize="@dimen/primary_font_size"
tools:text="@tools:sample/lorem/random" />
- </androidx.appcompat.widget.LinearLayoutCompat>
+ </LinearLayout>
- <androidx.appcompat.widget.LinearLayoutCompat
+ <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/noteExcerpt"
- android:layout_width="wrap_content"
+ android:layout_width="0dp"
android:layout_height="wrap_content"
- android:layout_alignParentStart="true"
- android:layout_alignParentLeft="true"
android:layout_weight="1"
android:ellipsize="end"
android:maxLines="1"
@@ -111,8 +109,6 @@
android:id="@+id/noteCategory"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_alignParentEnd="true"
- android:layout_alignParentRight="true"
android:layout_marginStart="@dimen/spacer_1x"
android:layout_marginLeft="@dimen/spacer_1x"
android:background="@drawable/border"
@@ -126,8 +122,8 @@
android:textSize="@dimen/secondary_font_size"
tools:maxLength="15"
tools:text="@tools:sample/lorem/random" />
- </androidx.appcompat.widget.LinearLayoutCompat>
- </androidx.appcompat.widget.LinearLayoutCompat>
- </androidx.appcompat.widget.LinearLayoutCompat>
+ </LinearLayout>
+ </LinearLayout>
+ </LinearLayout>
</FrameLayout>
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..cf61752d
--- /dev/null
+++ b/app/src/main/res/layout/item_notes_list_note_item_without_excerpt.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/noteSwipeFrame"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="@color/bg_attention">
+
+ <ImageView
+ android:id="@+id/noteFavoriteLeft"
+ android:layout_width="32dp"
+ android:layout_height="32dp"
+ android:layout_gravity="center_vertical"
+ android:layout_marginStart="@dimen/button_padding"
+ android:layout_marginLeft="@dimen/button_padding"
+ android:contentDescription="@string/menu_favorite"
+ app:srcCompat="@drawable/ic_star_white_24dp" />
+
+ <ImageView
+ android:id="@+id/noteDeleteRight"
+ android:layout_width="32dp"
+ android:layout_height="32dp"
+ android:layout_gravity="end|center_vertical"
+ android:layout_marginEnd="@dimen/button_padding"
+ android:layout_marginRight="@dimen/button_padding"
+ android:contentDescription="@string/menu_delete"
+ app:srcCompat="@drawable/ic_delete_white_32dp" />
+
+ <LinearLayout
+ android:id="@+id/noteSwipeable"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="@drawable/list_item_background_selector"
+ android:baselineAligned="false"
+ android:gravity="center_vertical">
+
+ <FrameLayout
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent">
+
+ <ImageView
+ android:id="@+id/noteFavorite"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:background="?attr/selectableItemBackgroundBorderless"
+ android:contentDescription="@string/menu_favorite"
+ android:padding="@dimen/spacer_2x"
+ tools:src="@drawable/ic_star_yellow_24dp" />
+
+ <androidx.appcompat.widget.AppCompatImageView
+ android:id="@+id/noteStatus"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical|end"
+ android:layout_marginTop="12dp"
+ android:layout_marginEnd="4dp"
+ android:layout_marginRight="4dp"
+ android:baseline="14dp"
+ app:srcCompat="@drawable/ic_sync_blue_18dp" />
+ </FrameLayout>
+
+ <TextView
+ 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"
+ android:paddingTop="@dimen/spacer_2x"
+ android:paddingBottom="@dimen/spacer_2x"
+ android:textColor="?android:textColorPrimary"
+ android:textSize="@dimen/primary_font_size"
+ tools:text="@tools:sample/lorem/random" />
+
+ <TextView
+ android:id="@+id/noteCategory"
+ android:layout_width="wrap_content"
+ 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"
+ android:maxLines="1"
+ android:paddingLeft="@dimen/spacer_1x"
+ android:paddingRight="@dimen/spacer_1x"
+ android:paddingBottom="1dp"
+ android:singleLine="true"
+ android:textColor="?android:textColorPrimary"
+ android:textSize="@dimen/secondary_font_size"
+ tools:maxLength="15"
+ tools:text="@tools:sample/lorem/random" />
+ </LinearLayout>
+
+</FrameLayout>
diff --git a/app/src/main/res/layout/item_notes_list_section_item.xml b/app/src/main/res/layout/item_notes_list_section_item.xml
index 6e20555c..3f29866a 100644
--- a/app/src/main/res/layout/item_notes_list_section_item.xml
+++ b/app/src/main/res/layout/item_notes_list_section_item.xml
@@ -9,15 +9,9 @@
android:layout_alignParentTop="true"
android:layout_alignParentEnd="false"
android:layout_alignParentRight="true"
- android:background="@color/bg_normal"
android:ellipsize="end"
android:gravity="center_vertical"
android:hint="@string/listview_updated_yesterday"
- android:paddingStart="56dp"
- android:paddingLeft="56dp"
- android:paddingTop="48dp"
- android:paddingEnd="@dimen/spacer_2x"
- android:paddingRight="@dimen/spacer_2x"
- android:paddingBottom="@dimen/spacer_1x"
+ android:padding="@dimen/spacer_1x"
android:textColor="@color/fg_default_selection"
android:textSize="@dimen/secondary_font_size" /> \ No newline at end of file
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 @@
<!-- Widget header -->
<RelativeLayout
+ android:id="@+id/widget_note_header"
android:layout_width="match_parent"
android:layout_height="@dimen/widget_note_list_header_height"
- android:background="@drawable/ic_launcher_background"
+ android:background="@color/defaultBrand"
android:padding="@dimen/widget_note_list_hdr_padding">
<ImageView
diff --git a/app/src/main/res/layout/widget_note_list_dark.xml b/app/src/main/res/layout/widget_note_list_dark.xml
index 7c864bd2..048a1f70 100644
--- a/app/src/main/res/layout/widget_note_list_dark.xml
+++ b/app/src/main/res/layout/widget_note_list_dark.xml
@@ -9,6 +9,7 @@
<!-- Widget header -->
<RelativeLayout
+ android:id="@+id/widget_note_header_dark"
android:layout_width="match_parent"
android:layout_height="@dimen/widget_note_list_header_height"
android:background="@drawable/ic_launcher_background"
diff --git a/app/src/main/res/values-cs-rCZ/strings.xml b/app/src/main/res/values-cs-rCZ/strings.xml
index 23b22204..f9a32f5c 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 @@
<string name="simple_behavior">Chování</string>
<string name="share_multiple">Sdílet obsah %1$d poznámek</string>
<string name="manage_accounts">Spravovat účty</string>
+ <string name="action_formatting_help">Formátování</string>
+
<!-- Array: note modes -->
<string-array name="noteMode_entries">
<item>Otevřít v režimu úprav</item>
@@ -196,4 +198,48 @@
<item quantity="many">vybráno %d</item>
<item quantity="other">vybrány %d</item>
</plurals>
+
+ <string name="formatting_help_divider" translateable="false">---</string>
+ <string name="formatting_help_codefence_inline" translateable="false">`%1$s`</string>
+ <string name="formatting_help_codefence_inline_escaped" translateable="false">\\`%1$s\\`</string>
+ <string name="formatting_help_codefence" translateable="false">```</string>
+ <string name="formatting_help_codefence_javascript" translateable="false">```javascript</string>
+ <string name="formatting_help_cbf_title">Formátování založené na kontextu</string>
+ <string name="formatting_help_cbf_body_1">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ů.</string>
+ <string name="formatting_help_cbf_body_2">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.</string>
+
+ <string name="formatting_help_text_title">Text</string>
+ <string name="formatting_help_text_body">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).</string>
+
+ <string name="formatting_help_lists_title">Seznamy</string>
+ <string name="formatting_help_lists_body_1">Pokud budete chtít číslované seznamy:</string>
+ <string name="formatting_help_lists_body_2">Jedna</string>
+ <string name="formatting_help_lists_body_3">Dva</string>
+ <string name="formatting_help_lists_body_4">Tři</string>
+ <string name="formatting_help_lists_body_5">Pokud budete chtít odrážky:</string>
+ <string name="formatting_help_lists_body_6">Řádek začněte znakem mínus</string>
+ <string name="formatting_help_lists_body_7">A pokud máte dílčí body, pak před mínus či hvězdičku dejte dvě mezery:</string>
+ <string name="formatting_help_lists_body_8">Dát lajk</string>
+ <string name="formatting_help_lists_body_9">A toto</string>
+
+ <string name="formatting_help_checkboxes_title">Zatržítka</string>
+ <string name="formatting_help_checkboxes_body_1">Pro vytvoření zaškrtávací kolonky použijte seznam následovaný závorkami</string>
+ <string name="formatting_help_checkboxes_body_2">Položka 1</string>
+ <string name="formatting_help_checkboxes_body_3">Položka 2</string>
+
+ <string name="formatting_help_structured_documents_title">Strukturované dokumenty</string>
+ <string name="formatting_help_structured_documents_body_1">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ů.</string>
+ <string name="formatting_help_structured_documents_body_2">Toto je nadpis třetí úrovně</string>
+ <string name="formatting_help_structured_documents_body_3">Je také možné použít jedno %1$s až po %2$s šest pro různé velikosti nadpisů.</string>
+ <string name="formatting_help_structured_documents_body_4">Pokud chcete někoho citovat, použijte před řádkem znak %1$s:</string>
+ <string name="formatting_help_code_title">Kód</string>
+ <string name="formatting_help_code_body_1">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):</string>
+ <string name="formatting_help_code_body_2">Značkovací jazyk Markdown také podporuje něco co se nazývá „oplocení“ kódu, což umožňuje vícero řádek bez odsazení:</string>
+ <string name="formatting_help_code_body_3">A pokud chcete použít zvýrazňování syntaxe, včetně jazyka:</string>
+
+ <string name="formatting_help_unsupported_title">Nepodporováno</string>
+ <string name="formatting_help_unsupported_body_1">Byť se neustále snažíme vylepšovat podporu pro Markdown, je zde několik funkcí, které Poznámky ještě nepodporují:</string>
+ <string name="formatting_help_unsupported_body_2">Tabulky</string>
+ <string name="formatting_help_unsupported_body_3">Obrázky</string>
+ <string name="formatting_help_unsupported_body_4">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.</string>
</resources>
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 @@
<item quantity="one">%d valgt</item>
<item quantity="other">%d valgt</item>
</plurals>
-</resources>
+
+ <string name="formatting_help_text_title">Tekst</string>
+ <string name="formatting_help_code_title">Kode</string>
+ <string name="formatting_help_unsupported_body_3">Billeder</string>
+ </resources>
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 34f7e1d4..d06acda6 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -161,6 +161,8 @@
<string name="simple_behavior">Verhalten</string>
<string name="share_multiple">Inhalt von %1$d Notizen teilen</string>
<string name="manage_accounts">Konten verwalten</string>
+ <string name="action_formatting_help">Formatierung</string>
+
<!-- Array: note modes -->
<string-array name="noteMode_entries">
<item>Im Bearbeitungsmodus öffnen</item>
@@ -194,4 +196,48 @@
<item quantity="one">%d ausgewählt</item>
<item quantity="other">%d ausgewählt</item>
</plurals>
+
+ <string name="formatting_help_divider" translateable="false">---</string>
+ <string name="formatting_help_codefence_inline" translateable="false">`%1$s`</string>
+ <string name="formatting_help_codefence_inline_escaped" translateable="false">\\`%1$s\\`</string>
+ <string name="formatting_help_codefence" translateable="false">```</string>
+ <string name="formatting_help_codefence_javascript" translateable="false">```javascript</string>
+ <string name="formatting_help_cbf_title">Kontextbasierte Formatierung</string>
+ <string name="formatting_help_cbf_body_1">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.</string>
+ <string name="formatting_help_cbf_body_2">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.</string>
+
+ <string name="formatting_help_text_title">Text</string>
+ <string name="formatting_help_text_body">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).</string>
+
+ <string name="formatting_help_lists_title">Listen</string>
+ <string name="formatting_help_lists_body_1">Manchmal werden nummerierte Listen benötigt:</string>
+ <string name="formatting_help_lists_body_2">Eins</string>
+ <string name="formatting_help_lists_body_3">Zwei</string>
+ <string name="formatting_help_lists_body_4">Drei</string>
+ <string name="formatting_help_lists_body_5">Manchmal werden Aufzählungszeichen benötigt:</string>
+ <string name="formatting_help_lists_body_6">Beginnen Sie eine Zeile mit einem Stern</string>
+ <string name="formatting_help_lists_body_7">Und wenn Sie Unterpunkte haben, setzen Sie zwei Leerzeichen vor den Bindestrich oder Stern:</string>
+ <string name="formatting_help_lists_body_8">Wie dieses</string>
+ <string name="formatting_help_lists_body_9">Und dies</string>
+
+ <string name="formatting_help_checkboxes_title">Kontrollkästchen</string>
+ <string name="formatting_help_checkboxes_body_1">Verwenden Sie zum Erstellen eines Kontrollkästchens eine Liste gefolgt von Klammern</string>
+ <string name="formatting_help_checkboxes_body_2">Punkt 1</string>
+ <string name="formatting_help_checkboxes_body_3">Punkt 2</string>
+
+ <string name="formatting_help_structured_documents_title">Strukturierte Dokumente</string>
+ <string name="formatting_help_structured_documents_body_1">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.</string>
+ <string name="formatting_help_structured_documents_body_2">Dies ist eine Überschrift der dritten Stufe</string>
+ <string name="formatting_help_structured_documents_body_3">Sie können ein %1$s bis zu sechs %2$s für verschiedene Kopfgrößen verwenden.</string>
+ <string name="formatting_help_structured_documents_body_4">Wenn Sie jemanden zitieren möchten, verwenden Sie das %1$s-Zeichen vor der Zeile:</string>
+ <string name="formatting_help_code_title">Quelltext</string>
+ <string name="formatting_help_code_body_1">Es gibt viele verschiedene Möglichkeiten, Text mit Markdown zu formatieren. Wenn Sie Inline-Codeblöcke haben, betten Sie diese in Backticks ein:</string>
+ <string name="formatting_help_code_body_2">Markdown unterstützt auch das sogenannte Code-Fencing, das mehrere Zeilen ohne Einrückung zulässt:</string>
+ <string name="formatting_help_code_body_3">Wenn Sie die Syntaxhervorhebung verwenden möchten, geben Sie folgendes ein:</string>
+
+ <string name="formatting_help_unsupported_title">Nicht unterstützt</string>
+ <string name="formatting_help_unsupported_body_1">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:</string>
+ <string name="formatting_help_unsupported_body_2">Tabellen</string>
+ <string name="formatting_help_unsupported_body_3">Bilder</string>
+ <string name="formatting_help_unsupported_body_4">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.</string>
</resources>
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index 9f50951c..cf53b0ec 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -29,6 +29,9 @@
<string name="menu_preview">Προεπισκόπηση</string>
<string name="menu_share">Διαμοιρασμός</string>
+ <string name="search_in_category">Αναζήτηση σε %1$s</string>
+ <string name="search_in_all">Αναζήτηση όλων των σημειώσεων</string>
+
<string name="change_category_title">Επιλογή κατηγορίας</string>
<string name="listview_updated_today">Σήμερα</string>
@@ -155,8 +158,11 @@
<string name="simple_security">Ασφάλεια</string>
<string name="simple_appearance">Εμφάνιση</string>
<string name="simple_synchronization">Συγχρονισμός</string>
+ <string name="simple_behavior">Συμπεριφορά</string>
<string name="share_multiple">Κοινόχρηστο περιεχόμενο από %1$d σημειώσεις</string>
<string name="manage_accounts">Διαχείριση λογαριασμών</string>
+ <string name="action_formatting_help">Διαμόρφωση σε εξέλιξη</string>
+
<!-- Array: note modes -->
<string-array name="noteMode_entries">
<item>Άνοιγμα σε λειτουργία τροποποίησης</item>
@@ -190,4 +196,48 @@
<item quantity="one">%d επιλέχτηκε</item>
<item quantity="other">%d επιλέχτηκαν</item>
</plurals>
+
+ <string name="formatting_help_divider" translateable="false">---</string>
+ <string name="formatting_help_codefence_inline" translateable="false">`%1$s`</string>
+ <string name="formatting_help_codefence_inline_escaped" translateable="false">\\`%1$s\\`</string>
+ <string name="formatting_help_codefence" translateable="false">```</string>
+ <string name="formatting_help_codefence_javascript" translateable="false">```javascript</string>
+ <string name="formatting_help_cbf_title">Μορφοποίηση βάσει κατάστασης</string>
+ <string name="formatting_help_cbf_body_1">Ένας κύριος σχεδιαστικός στόχος της εφαρμογής Σημειώσεις, είναι να παρέχει ένα ανεξάρτητο εργαλείο. Θα μπορείτε να μορφοποιήσετε τα κείμενά σας με το Markdown. Για διάφορα από τα παρακάτω παραδείγματα, μπορείτε να χρησιμοποιήσετε συντομεύσεις για να μορφοποιήσετε τις σημειώσεις σας χωρίς να πληκτρολογήσετε τους παρακάτω κωδικούς.</string>
+ <string name="formatting_help_cbf_body_2">Απλώς επιλέξτε ένα εύρος κειμένου ή πατήστε τον κέρσορα σε οποιαδήποτε θέση και θα λάβετε ένα αναδυόμενο μενού που περιέχει δίπλα στις προεπιλεγμένες καταχωρήσεις %1$s, %2$s, %3$s καταχωρίσεις όπως %4$s ή %5$s.</string>
+
+ <string name="formatting_help_text_title">Κείμενο</string>
+ <string name="formatting_help_text_body">Είναι πολύ εύκολο να γράψετε μερικές λέξεις με %1$sέντονη%1$s και άλλες με %2$sπλάγια%2$s μορφή με το Markdown. Μπορείτε %3$sχτυπήσετε%3$s μερικές λέξεις μέσω του [συνδέσμου για Nextcloud] (https://nextcloud.com).</string>
+
+ <string name="formatting_help_lists_title">Λίστες</string>
+ <string name="formatting_help_lists_body_1">Μερικές φορές θέλετε αριθμημένες λίστες:</string>
+ <string name="formatting_help_lists_body_2">Ένα</string>
+ <string name="formatting_help_lists_body_3">Δύο</string>
+ <string name="formatting_help_lists_body_4">Τρία</string>
+ <string name="formatting_help_lists_body_5">Μερικές φορές θέλετε κουκκίδες:</string>
+ <string name="formatting_help_lists_body_6">Ξεκινήστε μια γραμμή με παύλα</string>
+ <string name="formatting_help_lists_body_7">Και αν έχετε δευτερεύοντα σημεία, βάλτε δύο κενά πριν από την παύλα ή το αστέρι:</string>
+ <string name="formatting_help_lists_body_8">Όπως αυτό</string>
+ <string name="formatting_help_lists_body_9">Και αυτό</string>
+
+ <string name="formatting_help_checkboxes_title">Πλαίσια ελέγχου</string>
+ <string name="formatting_help_checkboxes_body_1">Για να δημιουργήσετε ένα πλαίσιο ελέγχου, χρησιμοποιήστε μια λίστα ακολουθούμενη από αγκύλες</string>
+ <string name="formatting_help_checkboxes_body_2">Αντικείμενο 1</string>
+ <string name="formatting_help_checkboxes_body_3">Αντικείμενο 2</string>
+
+ <string name="formatting_help_structured_documents_title">Δομημένα έγγραφα</string>
+ <string name="formatting_help_structured_documents_body_1">Μερικές φορές είναι χρήσιμο να έχετε διαφορετικά επίπεδα επικεφαλίδων για τη δομή των εγγράφων σας. Ξεκινήστε τις γραμμές με ένα %1$s για να δημιουργήσετε επικεφαλίδες. Πολλαπλά %2$s στη σειρά δηλώνουν μικρότερα μεγέθη επικεφαλίδας.</string>
+ <string name="formatting_help_structured_documents_body_2">Αυτή είναι μια επικεφαλίδα τρίτου επιπέδου</string>
+ <string name="formatting_help_structured_documents_body_3">Μπορείτε να χρησιμοποιήσετε ένα %1$s μέχρι έξι %2$s διαφορετικά μεγέθη επικεφαλίδας.</string>
+ <string name="formatting_help_structured_documents_body_4">Αν θέλετε να αναφέρετε κάποιο όνομα, χρησιμοποιήστε τον χαρακτήρα %1$s πριν από τη γραμμή:</string>
+ <string name="formatting_help_code_title">Κώδικας</string>
+ <string name="formatting_help_code_body_1">Υπάρχουν πολλοί διαφορετικοί τρόποι δημιουργίας κώδικα με το Markdown. Εάν έχετε ενσωματωμένα μπλοκ κώδικα, περικλείεται με πλάγια κάθετο:</string>
+ <string name="formatting_help_code_body_2">Το Markdown υποστηρίζει επίσης κάτι που ονομάζεται code fencing, το οποίο επιτρέπει πολλαπλές γραμμές χωρίς εσοχή:</string>
+ <string name="formatting_help_code_body_3">Και αν θέλετε να χρησιμοποιήσετε την επισήμανση σύνταξης, συμπεριλάβετε τη γλώσσα:</string>
+
+ <string name="formatting_help_unsupported_title">Μη υποστηριζόμενο</string>
+ <string name="formatting_help_unsupported_body_1">Ενώ προσπαθούμε να βελτιώνουμε συνεχώς την υποστήριξη για το Markdown, υπάρχουν μερικές δυνατότητες που δεν υποστηρίζονται ακόμη από τις Σημειώσεις:</string>
+ <string name="formatting_help_unsupported_body_2">Πίνακες</string>
+ <string name="formatting_help_unsupported_body_3">Εικόνες</string>
+ <string name="formatting_help_unsupported_body_4">Εάν ενδιαφέρεστε να συνεισφέρετε σε μία από αυτές τις λειτουργίες, επικοινωνήστε μαζί μας μέσω GitHub ή E-Mail.</string>
</resources>
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index f62dbd6d..12279f9e 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -190,4 +190,10 @@
<item quantity="one">%d selecionado</item>
<item quantity="other">%d seleccionados</item>
</plurals>
-</resources>
+
+ <string name="formatting_help_text_title">Text</string>
+ <string name="formatting_help_checkboxes_title">Casillas de verificación</string>
+ <string name="formatting_help_code_title">Código</string>
+ <string name="formatting_help_unsupported_title">No soportado</string>
+ <string name="formatting_help_unsupported_body_3">Imágenes</string>
+ </resources>
diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml
index 86ee5b6a..217f2449 100644
--- a/app/src/main/res/values-eu/strings.xml
+++ b/app/src/main/res/values-eu/strings.xml
@@ -189,4 +189,9 @@
<item quantity="one">%d hautatuta</item>
<item quantity="other">%d hautatuta</item>
</plurals>
-</resources>
+
+ <string name="formatting_help_text_title">Testu</string>
+ <string name="formatting_help_checkboxes_title">Kontrol-laukiak</string>
+ <string name="formatting_help_unsupported_title">Ez da onartzen</string>
+ <string name="formatting_help_unsupported_body_3">Irudiak</string>
+ </resources>
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 30540e84..9397aaef 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -194,4 +194,19 @@
<item quantity="one">%d sélectionné</item>
<item quantity="other">%d sélectionné(s)</item>
</plurals>
-</resources>
+
+ <string name="formatting_help_codefence_javascript" translateable="false">```javascript</string>
+ <string name="formatting_help_text_title">Texte</string>
+ <string name="formatting_help_lists_title">Listes</string>
+ <string name="formatting_help_lists_body_1">Parfois, vous voulez des listes numérotées :</string>
+ <string name="formatting_help_lists_body_2">Un</string>
+ <string name="formatting_help_lists_body_3">Deux</string>
+ <string name="formatting_help_lists_body_4">Trois</string>
+ <string name="formatting_help_lists_body_5">Parfois, vous voulez des puces :</string>
+ <string name="formatting_help_checkboxes_title">Case à cocher</string>
+ <string name="formatting_help_checkboxes_body_1">Pour créer une case à cocher, utilisez une liste suivie de crochets.</string>
+ <string name="formatting_help_structured_documents_title">Documents structurés</string>
+ <string name="formatting_help_code_title">Code</string>
+ <string name="formatting_help_unsupported_title">Non pris en charge</string>
+ <string name="formatting_help_unsupported_body_3">Images</string>
+ </resources>
diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml
index a55eac01..21785e10 100644
--- a/app/src/main/res/values-gl/strings.xml
+++ b/app/src/main/res/values-gl/strings.xml
@@ -161,6 +161,8 @@
<string name="simple_behavior">Comportamento</string>
<string name="share_multiple">Compartir o contido de %1$dnotas</string>
<string name="manage_accounts">Administrar contas</string>
+ <string name="action_formatting_help">Formatado</string>
+
<!-- Array: note modes -->
<string-array name="noteMode_entries">
<item>Abrir en modo de edición</item>
@@ -194,4 +196,9 @@
<item quantity="one">%d seleccionado</item>
<item quantity="other">%d seleccionados</item>
</plurals>
-</resources>
+
+ <string name="formatting_help_text_title">Texto</string>
+ <string name="formatting_help_checkboxes_title">Caixas de verificación</string>
+ <string name="formatting_help_unsupported_title">Non admitido</string>
+ <string name="formatting_help_unsupported_body_3">Imaxes</string>
+ </resources>
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 @@
<item quantity="few">Odabrano je %d</item>
<item quantity="other">Odabrano je %d</item>
</plurals>
-</resources>
+
+ <string name="formatting_help_text_title">Tekst</string>
+ <string name="formatting_help_checkboxes_title">Potvrdni okviri</string>
+ <string name="formatting_help_unsupported_title">Bez podrške</string>
+ <string name="formatting_help_unsupported_body_3">Slike</string>
+ </resources>
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 485668ee..fe5ba82b 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -161,6 +161,8 @@
<string name="simple_behavior">Comportamento</string>
<string name="share_multiple">Condividi il contenuto di %1$d note</string>
<string name="manage_accounts">Gestisci account</string>
+ <string name="action_formatting_help">Formattazione</string>
+
<!-- Array: note modes -->
<string-array name="noteMode_entries">
<item>Apri in modalità modifica</item>
@@ -194,4 +196,48 @@
<item quantity="one">%d selezionato</item>
<item quantity="other">%d selezionati</item>
</plurals>
+
+ <string name="formatting_help_divider" translateable="false">---</string>
+ <string name="formatting_help_codefence_inline" translateable="false">`%1$s`</string>
+ <string name="formatting_help_codefence_inline_escaped" translateable="false">\\`%1$s\\`</string>
+ <string name="formatting_help_codefence" translateable="false">```</string>
+ <string name="formatting_help_codefence_javascript" translateable="false">```javascript</string>
+ <string name="formatting_help_cbf_title">Formattazione basata sul contesto</string>
+ <string name="formatting_help_cbf_body_1">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.</string>
+ <string name="formatting_help_cbf_body_2">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.</string>
+
+ <string name="formatting_help_text_title">Testo</string>
+ <string name="formatting_help_text_body">È 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).</string>
+
+ <string name="formatting_help_lists_title">Elenchi</string>
+ <string name="formatting_help_lists_body_1">A volte hai bisogno di elenchi numerati:</string>
+ <string name="formatting_help_lists_body_2">Uno</string>
+ <string name="formatting_help_lists_body_3">Due</string>
+ <string name="formatting_help_lists_body_4">Tre</string>
+ <string name="formatting_help_lists_body_5">A volte hai bisogno dei punti elenco:</string>
+ <string name="formatting_help_lists_body_6">Inizia un riga con un trattino</string>
+ <string name="formatting_help_lists_body_7">E se hai sotto-punti, metti due spazi prima del trattino o dell\'asterisco:</string>
+ <string name="formatting_help_lists_body_8">Come questo</string>
+ <string name="formatting_help_lists_body_9">E questo</string>
+
+ <string name="formatting_help_checkboxes_title">Caselle di selezione</string>
+ <string name="formatting_help_checkboxes_body_1">Per creare una casella di selezione, usa un elenco seguito da parentesi</string>
+ <string name="formatting_help_checkboxes_body_2">Elemento 1</string>
+ <string name="formatting_help_checkboxes_body_3">Elemento 2</string>
+
+ <string name="formatting_help_structured_documents_title">Documenti strutturati</string>
+ <string name="formatting_help_structured_documents_body_1">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.</string>
+ <string name="formatting_help_structured_documents_body_2">Questa è un\'intestazione di terzo livello</string>
+ <string name="formatting_help_structured_documents_body_3">Puoi utilizzare da un %1$s fino a sei %2$s per diverse dimensioni di intestazione.</string>
+ <string name="formatting_help_structured_documents_body_4">Se vuoi citare qualcuno, utilizza il carattere %1$s prima della riga:</string>
+ <string name="formatting_help_code_title">Codice</string>
+ <string name="formatting_help_code_body_1">Esistono molti modi diversi per definire lo stile del codice con Markdown. Se hai blocchi di codice in linea, racchiudili tra apici inversi:</string>
+ <string name="formatting_help_code_body_2">Markdown supporta anche raggruppamenti di codice, che consente a righe multiple senza indentazione:</string>
+ <string name="formatting_help_code_body_3">E se desideri utilizzare l\'evidenziazione della sintassi, includi il linguaggio:</string>
+
+ <string name="formatting_help_unsupported_title">Non supportato</string>
+ <string name="formatting_help_unsupported_body_1">Mentre proviamo a migliorare continuamente il supporto per Markdown, ci sono alcune funzionalità che non sono ancora supportate da Note:</string>
+ <string name="formatting_help_unsupported_body_2">Tabelle</string>
+ <string name="formatting_help_unsupported_body_3">Immagini</string>
+ <string name="formatting_help_unsupported_body_4">Se sei interessato a fornire supporto per una di queste funzionalità, contattaci tramite GitHub o email.</string>
</resources>
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 @@
<plurals name="ab_selected">
<item quantity="other">%d 選択済</item>
</plurals>
-</resources>
+
+ <string name="formatting_help_text_title">テキスト</string>
+ <string name="formatting_help_unsupported_title">サポートされていません。</string>
+ <string name="formatting_help_unsupported_body_3">画像</string>
+ </resources>
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 2c2bb06a..6dd6798e 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -191,4 +191,10 @@
<item quantity="one">%d geselecteerd</item>
<item quantity="other">%d geselecteerd</item>
</plurals>
-</resources>
+
+ <string name="formatting_help_text_title">Tekst</string>
+ <string name="formatting_help_checkboxes_title">Aanvinkvakjes</string>
+ <string name="formatting_help_code_title">Code</string>
+ <string name="formatting_help_unsupported_title">Niet ondersteund</string>
+ <string name="formatting_help_unsupported_body_3">Afbeeldingen</string>
+ </resources>
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 3eeaf2b0..a025786e 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -30,7 +30,7 @@
<string name="menu_share">Udostępnij</string>
<string name="search_in_category">Szukaj w %1$s</string>
- <string name="search_in_all">Szukaj we wszystkich notatkach</string>
+ <string name="search_in_all">Szukaj w notatkach</string>
<string name="change_category_title">Wybierz kategorię</string>
@@ -158,9 +158,11 @@
<string name="simple_security">Bezpieczeństwo</string>
<string name="simple_appearance">Wygląd</string>
<string name="simple_synchronization">Synchronizacja</string>
- <string name="simple_behavior">Zachowane</string>
+ <string name="simple_behavior">Zachowanie</string>
<string name="share_multiple">Udostępnij treść notatki %1$d</string>
<string name="manage_accounts">Zarządzaj kontami</string>
+ <string name="action_formatting_help">Formatowanie</string>
+
<!-- Array: note modes -->
<string-array name="noteMode_entries">
<item>Otwórz w trybie edycji</item>
@@ -196,4 +198,39 @@
<item quantity="many">%d wybranych</item>
<item quantity="other">%d wybranych</item>
</plurals>
+
+ <string name="formatting_help_divider" translateable="false">---</string>
+ <string name="formatting_help_codefence" translateable="false">```</string>
+ <string name="formatting_help_codefence_javascript" translateable="false">```javascript</string>
+ <string name="formatting_help_cbf_title">Formatowanie kontekstowe</string>
+ <string name="formatting_help_cbf_body_1">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.</string>
+ <string name="formatting_help_text_title">Tekst</string>
+ <string name="formatting_help_lists_title">Listy</string>
+ <string name="formatting_help_lists_body_1">Czasami chcesz mieć listy ponumerowane:</string>
+ <string name="formatting_help_lists_body_2">1 Jeden</string>
+ <string name="formatting_help_lists_body_3">2. Dwa</string>
+ <string name="formatting_help_lists_body_4">3. Trzy</string>
+ <string name="formatting_help_lists_body_5">Czasami chcesz wypunktować:</string>
+ <string name="formatting_help_lists_body_6">Rozpocznij linię gwiazdką</string>
+ <string name="formatting_help_lists_body_7">A jeśli masz podpunkty, umieść dwie spacje przed kreską lub gwiazdką:</string>
+ <string name="formatting_help_lists_body_8">Lubię to</string>
+ <string name="formatting_help_lists_body_9">I to też</string>
+
+ <string name="formatting_help_checkboxes_title">Pola wyboru</string>
+ <string name="formatting_help_checkboxes_body_1">Aby utworzyć pole wyboru, użyj listy i nawiasów</string>
+ <string name="formatting_help_checkboxes_body_2">Pozycja 1</string>
+ <string name="formatting_help_checkboxes_body_3">Pozycja 2</string>
+
+ <string name="formatting_help_structured_documents_title">Dokumenty strukturalne</string>
+ <string name="formatting_help_structured_documents_body_2">To nagłówek trzeciego poziomu</string>
+ <string name="formatting_help_code_title">Kod</string>
+ <string name="formatting_help_code_body_1">Istnieje wiele różnych sposobów stylizowania kodu za pomocą Markdown. Jeśli masz wbudowane bloki kodu, zawiń je w backticks:</string>
+ <string name="formatting_help_code_body_2">Markdown obsługuje również coś, co nazywa się szermierką kodu, co pozwala na wiele linii bez wcięć:</string>
+ <string name="formatting_help_code_body_3">A jeśli chcesz użyć podświetlania składni, uwzględnij język:</string>
+
+ <string name="formatting_help_unsupported_title">Niewspierane</string>
+ <string name="formatting_help_unsupported_body_1">Chociaż staramy się ciągle ulepszać obsługę Markdown, istnieje kilka funkcji, które nie są jeszcze obsługiwane przez Notes:</string>
+ <string name="formatting_help_unsupported_body_2">Tabele</string>
+ <string name="formatting_help_unsupported_body_3">Obrazy</string>
+ <string name="formatting_help_unsupported_body_4">Jeśli chcesz pomóc przy jednej z tych funkcji, skontaktuj się z nami za pośrednictwem GitHub lub e-mail.</string>
</resources>
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index de8b8f2b..cb310a61 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -190,4 +190,10 @@
<item quantity="one">%d selecionado</item>
<item quantity="other">%d selecionados</item>
</plurals>
-</resources>
+
+ <string name="formatting_help_text_title">Texto</string>
+ <string name="formatting_help_checkboxes_title">Caixas de seleção</string>
+ <string name="formatting_help_code_title">Código</string>
+ <string name="formatting_help_unsupported_title">Não suportado</string>
+ <string name="formatting_help_unsupported_body_3">Imagens</string>
+ </resources>
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 1234da29..afa808be 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -191,4 +191,10 @@
<item quantity="many">%d выбрано</item>
<item quantity="other">%d выбрано</item>
</plurals>
-</resources>
+
+ <string name="formatting_help_text_title">Текст</string>
+ <string name="formatting_help_checkboxes_title">Несколько из списка</string>
+ <string name="formatting_help_code_title">Код</string>
+ <string name="formatting_help_unsupported_title">Не поддерживается</string>
+ <string name="formatting_help_unsupported_body_3">Изображения</string>
+ </resources>
diff --git a/app/src/main/res/values-sk-rSK/strings.xml b/app/src/main/res/values-sk-rSK/strings.xml
index 47f1c578..8ec751c7 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 @@
<string name="simple_behavior">Chod</string>
<string name="share_multiple">Zdieľať obsah %1$d poznámok</string>
<string name="manage_accounts">Spravovať účty</string>
+ <string name="action_formatting_help">Formátovanie</string>
+
<!-- Array: note modes -->
<string-array name="noteMode_entries">
<item>Otvoriť v režime úprav</item>
@@ -196,4 +198,39 @@
<item quantity="many">%d vybraný</item>
<item quantity="other">%d vybraný</item>
</plurals>
+
+ <string name="formatting_help_divider" translateable="false">---</string>
+ <string name="formatting_help_codefence" translateable="false">```</string>
+ <string name="formatting_help_codefence_javascript" translateable="false">```javascript</string>
+ <string name="formatting_help_cbf_title">Kontextové formátovanie</string>
+ <string name="formatting_help_cbf_body_1">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.</string>
+ <string name="formatting_help_text_title">Text</string>
+ <string name="formatting_help_lists_title">Zoznamy</string>
+ <string name="formatting_help_lists_body_1">Niekedy chcete číslované zoznamy:</string>
+ <string name="formatting_help_lists_body_2">Jeden</string>
+ <string name="formatting_help_lists_body_3">Dva</string>
+ <string name="formatting_help_lists_body_4">Tri</string>
+ <string name="formatting_help_lists_body_5">Niekedy chcete odrážky:</string>
+ <string name="formatting_help_lists_body_6">Riadok začnite pomlčkou</string>
+ <string name="formatting_help_lists_body_7">A ak máte vnorený bod, vložte pred pomlčku alebo hviezdičku dve medzery:</string>
+ <string name="formatting_help_lists_body_8">Ako toto</string>
+ <string name="formatting_help_lists_body_9">A toto</string>
+
+ <string name="formatting_help_checkboxes_title">Zaškrtávacie políčka</string>
+ <string name="formatting_help_checkboxes_body_1">Ak chcete vytvoriť zaškrtávacie políčko, použite zoznam nasledovaný hranatými zátvorkami</string>
+ <string name="formatting_help_checkboxes_body_2">Položka 1</string>
+ <string name="formatting_help_checkboxes_body_3">Položka 2</string>
+
+ <string name="formatting_help_structured_documents_title">Štrukturované dokumenty</string>
+ <string name="formatting_help_structured_documents_body_2">Toto je nadpis tretej úrovne</string>
+ <string name="formatting_help_code_title">Kód</string>
+ <string name="formatting_help_code_body_1">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:</string>
+ <string name="formatting_help_code_body_2">Markdown tiež podporuje niečo, čo sa nazýva oplotenie kódu, čo umožňuje použiť viac riadkov bez odsadenia:</string>
+ <string name="formatting_help_code_body_3">Ak chcete použiť zvýraznenie syntaxe, uveďte jazyk:</string>
+
+ <string name="formatting_help_unsupported_title">Nepodporované</string>
+ <string name="formatting_help_unsupported_body_1">Aj keď sa pokúšame neustále zlepšovať podporu Markdown, existuje niekoľko funkcií, ktoré zatiaľ Poznámky nepodporujú:</string>
+ <string name="formatting_help_unsupported_body_2">Tabuľky</string>
+ <string name="formatting_help_unsupported_body_3">Obrázky</string>
+ <string name="formatting_help_unsupported_body_4">Ak máte záujem prispieť k podpore niektorej z týchto funkcií, kontaktujte nás prostredníctvom služby GitHub alebo e-mailom.</string>
</resources>
diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml
index 78872be0..2cf2022b 100644
--- a/app/src/main/res/values-sl/strings.xml
+++ b/app/src/main/res/values-sl/strings.xml
@@ -191,4 +191,10 @@
<item quantity="few">%d izbrane</item>
<item quantity="other">%d izbranih</item>
</plurals>
-</resources>
+
+ <string name="formatting_help_text_title">Besedilo</string>
+ <string name="formatting_help_checkboxes_title">Izbirna polja</string>
+ <string name="formatting_help_code_title">Šifra</string>
+ <string name="formatting_help_unsupported_title">Nepodprto</string>
+ <string name="formatting_help_unsupported_body_3">Slike</string>
+ </resources>
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index cc221c44..eb31685d 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -29,6 +29,9 @@
<string name="menu_preview">Ön izleme</string>
<string name="menu_share">Paylaş</string>
+ <string name="search_in_category">%1$s içinde arama</string>
+ <string name="search_in_all">Tüm notlarda arama</string>
+
<string name="change_category_title">Bir kategori seçin</string>
<string name="listview_updated_today">Bugün</string>
@@ -155,8 +158,11 @@
<string name="simple_security">Güvenlik</string>
<string name="simple_appearance">Görünüm</string>
<string name="simple_synchronization">Eşitleme</string>
+ <string name="simple_behavior">Davranış</string>
<string name="share_multiple">%1$d notun içeriğini paylaş</string>
<string name="manage_accounts">Hesap yönetimi</string>
+ <string name="action_formatting_help">Biçimlendirme</string>
+
<!-- Array: note modes -->
<string-array name="noteMode_entries">
<item>Düzenleme kipinde aç</item>
@@ -190,4 +196,48 @@
<item quantity="one">%d seçilmiş</item>
<item quantity="other">%d seçilmiş</item>
</plurals>
+
+ <string name="formatting_help_divider" translateable="false">---</string>
+ <string name="formatting_help_codefence_inline" translateable="false">`%1$s`</string>
+ <string name="formatting_help_codefence_inline_escaped" translateable="false">\\`%1$s\\`</string>
+ <string name="formatting_help_codefence" translateable="false">```</string>
+ <string name="formatting_help_codefence_javascript" translateable="false">```javascript</string>
+ <string name="formatting_help_cbf_title">Bağlama göre biçimlendirme</string>
+ <string name="formatting_help_cbf_body_1">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.</string>
+ <string name="formatting_help_cbf_body_2">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.</string>
+
+ <string name="formatting_help_text_title">Metin</string>
+ <string name="formatting_help_text_body">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.</string>
+
+ <string name="formatting_help_lists_title">Listeler</string>
+ <string name="formatting_help_lists_body_1">Bazen listelerin numaralı olmasını istersiniz:</string>
+ <string name="formatting_help_lists_body_2">Bir</string>
+ <string name="formatting_help_lists_body_3">İki</string>
+ <string name="formatting_help_lists_body_4">Üç</string>
+ <string name="formatting_help_lists_body_5">Bazen listelerde madde imi kullanılmasını istersiniz:</string>
+ <string name="formatting_help_lists_body_6">Bir satıra tire ile başlayın</string>
+ <string name="formatting_help_lists_body_7">Alt imler için tire ya da yıldız önüne iki boşluk ekleyin:</string>
+ <string name="formatting_help_lists_body_8">Bunun gibi</string>
+ <string name="formatting_help_lists_body_9">Ve bunun gibi</string>
+
+ <string name="formatting_help_checkboxes_title">İşaret kutuları</string>
+ <string name="formatting_help_checkboxes_body_1">Bir işaret kutusu eklemek için köşeli parantezler ile biten bir liste kullanın</string>
+ <string name="formatting_help_checkboxes_body_2">1. öge</string>
+ <string name="formatting_help_checkboxes_body_3">2. öge</string>
+
+ <string name="formatting_help_structured_documents_title">Yapılandırılmış belgeler</string>
+ <string name="formatting_help_structured_documents_body_1">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.</string>
+ <string name="formatting_help_structured_documents_body_2">Bu üçüncü düzey bir başlık</string>
+ <string name="formatting_help_structured_documents_body_3">Farklı başlık boyutları için bir %1$s ile altı %2$s arasında seçim yapabilirsiniz.</string>
+ <string name="formatting_help_structured_documents_body_4">Birinden alıntı yapmak isterseniz satırdan önce %1$s karakterini kullanın:</string>
+ <string name="formatting_help_code_title">Kod</string>
+ <string name="formatting_help_code_body_1">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:</string>
+ <string name="formatting_help_code_body_2">Markdown ayrıca kod çiti olarak adlandırılan ve girinti olmadan birden fazla satıra izin veren bir şeyi destekler:</string>
+ <string name="formatting_help_code_body_3">Ve söz dizimi vurgulamasını kullanmak istiyorsanız, dili ekleyin:</string>
+
+ <string name="formatting_help_unsupported_title">Desteklenmiyor</string>
+ <string name="formatting_help_unsupported_body_1">Markdown desteğini sürekli olarak geliştirmeye çalışıyoruz. Ancak henüz Notes uygulamasının desteklemediği birkaç özellik var:</string>
+ <string name="formatting_help_unsupported_body_2">Tablolar</string>
+ <string name="formatting_help_unsupported_body_3">Görseller</string>
+ <string name="formatting_help_unsupported_body_4">Bu özelliklerden biri için destek olmak isterseniz, GitHub ya da e-posta üzerinden bizimle görüşün.</string>
</resources>
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 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <integer name="grid_view_span_count">5</integer>
+</resources>
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 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <integer name="grid_view_span_count">2</integer>
+</resources> \ 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 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <integer name="grid_view_span_count">3</integer>
+</resources> \ 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 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <integer name="grid_view_span_count">4</integer>
+</resources> \ 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 @@
<dimen name="spacer_1x">8dp</dimen>
<dimen name="spacer_2x">16dp</dimen>
<dimen name="spacer_3x">24dp</dimen>
+ <dimen name="spacer_5x">40dp</dimen>
+ <dimen name="spacer_6x">48dp</dimen>
<!-- Drawer header -->
<dimen name="drawer_header_height">100dp</dimen>
diff --git a/app/src/main/res/values/integers.xml b/app/src/main/res/values/integers.xml
new file mode 100644
index 00000000..ade19fa3
--- /dev/null
+++ b/app/src/main/res/values/integers.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <integer name="grid_view_span_count">1</integer>
+</resources> \ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 76584528..be48cc29 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -117,6 +117,7 @@
<string name="pref_key_theme" translatable="false">darkTheme</string>
<string name="pref_key_font" translatable="false">font</string>
<string name="pref_key_branding" translatable="false">branding</string>
+ <string name="pref_key_gridview" translatable="false">gridview</string>
<string name="pref_key_font_size" translatable="false">fontSize</string>
<string name="pref_key_wifi_only" translatable="false">wifiOnly</string>
<string name="pref_key_lock" translatable="false">lock</string>
@@ -193,6 +194,7 @@
<string name="change_note_title">Change note title</string>
<string name="menu_edit_title">Edit title</string>
<string name="settings_branding">Branding</string>
+ <string name="settings_gridview">Grid view 🆕</string>
<string name="simple_security">Security</string>
<string name="simple_appearance">Appearance</string>
<string name="simple_synchronization">Synchronization</string>
@@ -235,8 +237,13 @@
<item quantity="other">%d selected</item>
</plurals>
+ <!-- Formatting help -->
+
<string name="formatting_help_title" translatable="false"># %1$s</string>
+ <string name="formatting_help_title_level_3" translatable="false">### %1$s</string>
<string name="formatting_help_divider" translateable="false">---</string>
+ <string name="formatting_help_codefence_inline" translateable="false">`%1$s`</string>
+ <string name="formatting_help_codefence_inline_escaped" translateable="false">\\`%1$s\\`</string>
<string name="formatting_help_codefence" translateable="false">```</string>
<string name="formatting_help_codefence_escaped" translatable="false">\\`\\`\\`</string>
<string name="formatting_help_javascript_1" translatable="false">if (isAwesome){</string>
@@ -244,51 +251,56 @@
<string name="formatting_help_javascript_3" translatable="false">}</string>
<string name="formatting_help_codefence_javascript_escaped" translatable="false">\\`\\`\\`javascript</string>
<string name="formatting_help_codefence_javascript" translateable="false">```javascript</string>
+ <string name="formatting_help_code_javascript_inline" translatable="false">var example = true</string>
+ <string name="formatting_help_ol" translatable="false">%1$d. %2$s</string>
+ <string name="formatting_help_ul" translatable="false">- %1$s</string>
+ <string name="formatting_help_checkbox_checked" translatable="false">- [x] %1$s</string>
+ <string name="formatting_help_checkbox_unchecked" translatable="false">- [ ] %1$s</string>
+ <string name="formatting_help_quote" translatable="false">&gt; %1$s</string>
+ <string name="formatting_help_quote_keyword" translatable="false">&gt;</string>
+ <string name="formatting_help_strike_through" translatable="false">~~</string>
+ <string name="formatting_help_bold" translatable="false">**</string>
+ <string name="formatting_help_italic" translatable="false">*</string>
<string name="formatting_help_cbf_title">Context based formatting</string>
<string name="formatting_help_cbf_body_1">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.</string>
- <string name="formatting_help_cbf_body_2">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`.</string>
+ <string name="formatting_help_cbf_body_2">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.</string>
<string name="formatting_help_text_title">Text</string>
- <string name="formatting_help_text_body">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).</string>
+ <string name="formatting_help_text_body">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).</string>
<string name="formatting_help_lists_title">Lists</string>
<string name="formatting_help_lists_body_1">Sometimes you want numbered lists:</string>
- <string name="formatting_help_lists_body_2">1. One</string>
- <string name="formatting_help_lists_body_3">2. Two</string>
- <string name="formatting_help_lists_body_4">3. Three</string>
+ <string name="formatting_help_lists_body_2">One</string>
+ <string name="formatting_help_lists_body_3">Two</string>
+ <string name="formatting_help_lists_body_4">Three</string>
<string name="formatting_help_lists_body_5">Sometimes you want bullet points:</string>
- <string name="formatting_help_lists_body_6">* Start a line with a star</string>
- <string name="formatting_help_lists_body_7">* Profit!</string>
- <string name="formatting_help_lists_body_8">Alternatively,</string>
- <string name="formatting_help_lists_body_9">- Dashes work just as well</string>
- <string name="formatting_help_lists_body_10">- And if you have sub points, put two spaces before the dash or star:</string>
- <string name="formatting_help_lists_body_11">- Like this</string>
- <string name="formatting_help_lists_body_12">- And this</string>
+ <string name="formatting_help_lists_body_6">Start a line with a dash</string>
+ <string name="formatting_help_lists_body_7">And if you have sub points, put two spaces before the dash or star:</string>
+ <string name="formatting_help_lists_body_8">Like this</string>
+ <string name="formatting_help_lists_body_9">And this</string>
<string name="formatting_help_checkboxes_title">Checkboxes</string>
<string name="formatting_help_checkboxes_body_1">To create a checkbox, use a list followed by brackets</string>
- <string name="formatting_help_checkboxes_body_2">- [ ] Item 1</string>
- <string name="formatting_help_checkboxes_body_3">* [ ] Item 2</string>
+ <string name="formatting_help_checkboxes_body_2">Item 1</string>
+ <string name="formatting_help_checkboxes_body_3">Item 2</string>
<string name="formatting_help_structured_documents_title">Structured documents</string>
- <string name="formatting_help_structured_documents_body_1">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.</string>
- <string name="formatting_help_structured_documents_body_2">### This is a third-tier heading</string>
- <string name="formatting_help_structured_documents_body_3">You can use one `#` all the way up to `######` six for different heading sizes.</string>
- <string name="formatting_help_structured_documents_body_4">If you\'d like to quote someone, use the > character before the line:</string>
- <string name="formatting_help_structured_documents_body_5">> Coffee. The finest organic suspension ever devised… I beat the Borg with it.</string>
- <string name="formatting_help_structured_documents_body_6">> - Captain Janeway</string>
+ <string name="formatting_help_structured_documents_body_1">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.</string>
+ <string name="formatting_help_structured_documents_body_2">This is a third-tier heading</string>
+ <string name="formatting_help_structured_documents_body_3">You can use one %1$s all the way up to %2$s six for different heading sizes.</string>
+ <string name="formatting_help_structured_documents_body_4">If you\'d like to quote someone, use the %1$s character before the line:</string>
+ <string name="formatting_help_structured_documents_body_5">Imagination is more important than knowledge. Knowledge is limited. Imagination encircles the world.</string>
+ <string name="formatting_help_structured_documents_body_6">- Albert Einstein</string>
<string name="formatting_help_code_title">Code</string>
<string name="formatting_help_code_body_1">There are many different ways to style code with Markdown. If you have inline code blocks, wrap them in backticks:</string>
- <string name="formatting_help_code_body_2">\\`var example = true\\`</string>
- <string name="formatting_help_code_body_3">`var example = true`</string>
- <string name="formatting_help_code_body_4">Markdown also supports something called code fencing, which allows for multiple lines without indentation:</string>
- <string name="formatting_help_code_body_5">And if you\'d like to use syntax highlighting, include the language:</string>
+ <string name="formatting_help_code_body_2">Markdown also supports something called code fencing, which allows for multiple lines without indentation:</string>
+ <string name="formatting_help_code_body_3">And if you\'d like to use syntax highlighting, include the language:</string>
<string name="formatting_help_unsupported_title">Unsupported</string>
<string name="formatting_help_unsupported_body_1">While we try to continuously improve the support for Markdown, there are a few features which are not yet supported by Notes:</string>
- <string name="formatting_help_unsupported_body_2">- Tables</string>
- <string name="formatting_help_unsupported_body_3">- Images</string>
+ <string name="formatting_help_unsupported_body_2">Tables</string>
+ <string name="formatting_help_unsupported_body_3">Images</string>
<string name="formatting_help_unsupported_body_4">If you are interested in contributing support for one of those features, get in contact with us via GitHub or E-Mail.</string>
</resources>
diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml
index 191d4819..3050e2a8 100644
--- a/app/src/main/res/xml/preferences.xml
+++ b/app/src/main/res/xml/preferences.xml
@@ -45,6 +45,13 @@
android:layout="@layout/item_pref"
android:title="@string/settings_branding" />
+ <it.niedermann.owncloud.notes.branding.BrandedSwitchPreference
+ 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" />
+
</it.niedermann.owncloud.notes.branding.BrandedPreferenceCategory>
<it.niedermann.owncloud.notes.branding.BrandedPreferenceCategory