diff options
author | Stefan Niedermann <info@niedermann.it> | 2020-06-10 17:58:43 +0300 |
---|---|---|
committer | Stefan Niedermann <info@niedermann.it> | 2020-06-10 17:58:43 +0300 |
commit | 2b71e1b2f8eca83c40afba079b2379e9e1c5ea1d (patch) | |
tree | 164de8264e0e402d1195e269a89a3be34b38a67f | |
parent | 15b3906b0edde550a566181472f0e9059e2dc731 (diff) |
Remove markdown rendering due to its bad performance
19 files changed, 163 insertions, 129 deletions
diff --git a/app/src/androidTest/java/it/niedermann/owncloud/notes/persistence/NotesDatabaseTest.java b/app/src/androidTest/java/it/niedermann/owncloud/notes/persistence/NotesDatabaseTest.java index 9fe80283..723df312 100644 --- a/app/src/androidTest/java/it/niedermann/owncloud/notes/persistence/NotesDatabaseTest.java +++ b/app/src/androidTest/java/it/niedermann/owncloud/notes/persistence/NotesDatabaseTest.java @@ -146,7 +146,7 @@ public class NotesDatabaseTest { String newContent = getCurDate() + " This is a even greater day my friend."; DBNote dbNote = new DBNote(newNoteID, 1, Calendar.getInstance(), "A Greater Day", newContent, true, "Best Friend's Record", null, DBStatus.VOID, - accountID, NoteUtil.generateNoteExcerpt(newContent), 0); + accountID, NoteUtil.generateNoteExcerpt(newContent, false), 0); // Add a new note long noteID = db.addNote(accountID, dbNote); @@ -161,7 +161,7 @@ public class NotesDatabaseTest { newContent = getCurDate() + " This is a even greater day my friend."; dbNote = new DBNote(0, 1, Calendar.getInstance(), "An Even Greater Day", newContent, true, "Sincere Friend's Record", null, DBStatus.VOID, - accountID, NoteUtil.generateNoteExcerpt(newContent), 0); + accountID, NoteUtil.generateNoteExcerpt(newContent, false), 0); // Add a new note noteID = db.addNote(accountID, dbNote); // Check if this note is added successfully diff --git a/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java index ef940a63..c5956a80 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/android/activity/NotesListViewActivity.java @@ -23,6 +23,7 @@ import androidx.annotation.NonNull; import androidx.appcompat.view.ActionMode; import androidx.appcompat.widget.SearchView; import androidx.coordinatorlayout.widget.CoordinatorLayout; +import androidx.core.content.ContextCompat; import androidx.core.graphics.drawable.DrawableCompat; import androidx.core.view.GravityCompat; import androidx.core.view.ViewCompat; @@ -68,6 +69,7 @@ import it.niedermann.owncloud.notes.model.GridItemDecoration; import it.niedermann.owncloud.notes.model.ISyncCallback; import it.niedermann.owncloud.notes.model.Item; import it.niedermann.owncloud.notes.model.ItemAdapter; +import it.niedermann.owncloud.notes.model.SectionItemDecoration; import it.niedermann.owncloud.notes.model.LocalAccount; import it.niedermann.owncloud.notes.model.NavigationAdapter; import it.niedermann.owncloud.notes.model.NavigationAdapter.CategoryNavigationItem; @@ -84,9 +86,9 @@ import it.niedermann.owncloud.notes.util.NoteUtil; import static android.view.View.GONE; import static android.view.View.VISIBLE; -import static androidx.preference.PreferenceManager.getDefaultSharedPreferences; import static it.niedermann.owncloud.notes.branding.BrandingUtil.getSecondaryForegroundColorDependingOnTheme; import static it.niedermann.owncloud.notes.util.ColorUtil.contrastRatioIsSufficient; +import static it.niedermann.owncloud.notes.util.Notes.isGridViewEnabled; import static it.niedermann.owncloud.notes.util.SSOUtil.askForNewAccount; import static java.util.Arrays.asList; @@ -129,7 +131,7 @@ public class NotesListViewActivity extends LockedActivity implements NoteClickLi protected FloatingActionButton fabCreate; private RecyclerView listView; - protected ItemAdapter adapter = null; + protected ItemAdapter adapter; protected NotesDatabase db = null; private NavigationAdapter adapterCategories; @@ -183,7 +185,10 @@ public class NotesListViewActivity extends LockedActivity implements NoteClickLi db = NotesDatabase.getInstance(this); - gridView = getDefaultSharedPreferences(this).getBoolean(getString(R.string.pref_key_gridview), false); + gridView = isGridViewEnabled(this); + if (!gridView) { + activityBinding.activityNotesListView.setBackgroundColor(ContextCompat.getColor(this, R.color.primary)); + } setupToolbars(); setupNavigationList(categoryAdapterSelectedItem); @@ -606,9 +611,22 @@ public class NotesListViewActivity extends LockedActivity implements NoteClickLi int spanCount = (int) ((displayMetrics.widthPixels / displayMetrics.density) / getResources().getInteger(R.integer.max_dp_grid_view)); StaggeredGridLayoutManager gridLayoutManager = new StaggeredGridLayoutManager(spanCount, StaggeredGridLayoutManager.VERTICAL); listView.setLayoutManager(gridLayoutManager); - listView.addItemDecoration(new GridItemDecoration(adapter, getResources().getDimensionPixelSize(R.dimen.spacer_2x))); + listView.addItemDecoration(new GridItemDecoration(adapter, + getResources().getDimensionPixelSize(R.dimen.spacer_3x), + getResources().getDimensionPixelSize(R.dimen.spacer_5x), + getResources().getDimensionPixelSize(R.dimen.spacer_3x), + getResources().getDimensionPixelSize(R.dimen.spacer_1x), + getResources().getDimensionPixelSize(R.dimen.spacer_2x) + )); } else { - listView.setLayoutManager(new LinearLayoutManager(this)); + LinearLayoutManager layoutManager = new LinearLayoutManager(this); + listView.setLayoutManager(layoutManager); + listView.addItemDecoration(new SectionItemDecoration(adapter, + getResources().getDimensionPixelSize(R.dimen.spacer_6x), + getResources().getDimensionPixelSize(R.dimen.spacer_5x), + getResources().getDimensionPixelSize(R.dimen.spacer_1x), + 0 + )); } } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java b/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java index e5121b2e..c89763ef 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/android/fragment/PreferencesFragment.java @@ -66,7 +66,8 @@ public class PreferencesFragment extends PreferenceFragmentCompat implements Bra final Boolean gridView = (Boolean) newValue; Log.v(TAG, "gridView: " + gridView); requireActivity().setResult(Activity.RESULT_OK); - new Thread(() -> NotesDatabase.getInstance(requireContext()).regenerateExcerpts(!gridView)).start(); + new Thread(() -> NotesDatabase.getInstance(requireContext()).regenerateExcerpts(gridView)).start(); + Notes.updateGridViewEnabled(gridView); return true; }); } else { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/GridItemDecoration.java b/app/src/main/java/it/niedermann/owncloud/notes/model/GridItemDecoration.java index 3d7ae944..6443121e 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/GridItemDecoration.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/GridItemDecoration.java @@ -4,21 +4,25 @@ import android.graphics.Rect; import android.view.View; import androidx.annotation.NonNull; +import androidx.annotation.Px; import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.StaggeredGridLayoutManager; -public class GridItemDecoration extends RecyclerView.ItemDecoration { +public class GridItemDecoration extends SectionItemDecoration { @NonNull private final ItemAdapter adapter; private final int gutter; - public GridItemDecoration(@NonNull ItemAdapter adapter, int gutter) { + public GridItemDecoration(@NonNull ItemAdapter adapter, @Px int sectionLeft, @Px int sectionTop, @Px int sectionRight, @Px int sectionBottom, @Px int gutter) { + super(adapter, sectionLeft, sectionTop, sectionRight, sectionBottom); this.adapter = adapter; this.gutter = gutter; } + @Override public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { + super.getItemOffsets(outRect, view, parent, state); final int position = parent.getChildAdapterPosition(view); final StaggeredGridLayoutManager.LayoutParams lp = (StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams(); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java index 22062832..0054ce01 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewGridHolder.java @@ -14,7 +14,7 @@ public class NoteViewGridHolder extends NoteViewHolder { private final ItemNotesListNoteItemGridBinding binding; public NoteViewGridHolder(@NonNull ItemNotesListNoteItemGridBinding binding, @NonNull NoteClickListener noteClickListener) { - super(binding.getRoot(), noteClickListener, true); + super(binding.getRoot(), noteClickListener); this.binding = binding; } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java index f063167a..db211b85 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolder.java @@ -4,8 +4,6 @@ import android.content.Context; import android.graphics.Color; import android.graphics.drawable.GradientDrawable; import android.os.Build; -import android.os.Handler; -import android.os.Looper; import android.text.SpannableString; import android.text.TextUtils; import android.text.style.BackgroundColorSpan; @@ -21,37 +19,23 @@ import androidx.annotation.Nullable; import androidx.core.graphics.drawable.DrawableCompat; import androidx.recyclerview.widget.RecyclerView; -import com.yydcdut.markdown.MarkdownProcessor; -import com.yydcdut.markdown.syntax.text.TextFactory; - import java.util.regex.Matcher; import java.util.regex.Pattern; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.branding.BrandingUtil; -import it.niedermann.owncloud.notes.util.MarkDownUtil; import it.niedermann.owncloud.notes.util.Notes; import static it.niedermann.owncloud.notes.util.ColorUtil.contrastRatioIsSufficient; import static it.niedermann.owncloud.notes.util.ColorUtil.isColorDark; -import static it.niedermann.owncloud.notes.util.MarkDownUtil.parseCompat; public abstract class NoteViewHolder extends RecyclerView.ViewHolder { @NonNull private final NoteClickListener noteClickListener; - private final boolean renderMarkdown; - @Nullable - private MarkdownProcessor markdownProcessor; - public NoteViewHolder(@NonNull View v, @NonNull NoteClickListener noteClickListener, boolean renderMarkdown) { + public NoteViewHolder(@NonNull View v, @NonNull NoteClickListener noteClickListener) { super(v); this.noteClickListener = noteClickListener; - this.renderMarkdown = renderMarkdown; - if (renderMarkdown) { - markdownProcessor = new MarkdownProcessor(itemView.getContext()); - markdownProcessor.factory(TextFactory.create()); - markdownProcessor.config(MarkDownUtil.getMarkDownConfiguration(itemView.getContext()).build()); - } } @CallSuper @@ -125,22 +109,7 @@ public abstract class NoteViewHolder extends RecyclerView.ViewHolder { processedContent = spannableString; } - bindContent(textView, processedContent); - } - - private void bindContent(@NonNull TextView textView, @NonNull CharSequence charSequence) { - if (renderMarkdown && markdownProcessor != null) { - new Thread(() -> { - try { - final CharSequence parsedCharSequence = parseCompat(markdownProcessor, charSequence); - new Handler(Looper.getMainLooper()).post(() -> textView.setText(parsedCharSequence)); - } catch (StringIndexOutOfBoundsException e) { - // Workaround for RxMarkdown: https://github.com/stefan-niedermann/nextcloud-notes/issues/668 - } - }).start(); - } else { - textView.setText(charSequence); - } + textView.setText(processedContent); } public abstract void showSwipe(boolean left); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java index a4ab40a2..1becf381 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithExcerpt.java @@ -14,7 +14,7 @@ public class NoteViewHolderWithExcerpt extends NoteViewHolder { private final ItemNotesListNoteItemWithExcerptBinding binding; public NoteViewHolderWithExcerpt(@NonNull ItemNotesListNoteItemWithExcerptBinding binding, @NonNull NoteClickListener noteClickListener) { - super(binding.getRoot(), noteClickListener, false); + super(binding.getRoot(), noteClickListener); this.binding = binding; } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java index ef56acbb..78a74a5f 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/NoteViewHolderWithoutExcerpt.java @@ -14,7 +14,7 @@ public class NoteViewHolderWithoutExcerpt extends NoteViewHolder { private final ItemNotesListNoteItemWithoutExcerptBinding binding; public NoteViewHolderWithoutExcerpt(@NonNull ItemNotesListNoteItemWithoutExcerptBinding binding, @NonNull NoteClickListener noteClickListener) { - super(binding.getRoot(), noteClickListener, false); + super(binding.getRoot(), noteClickListener); this.binding = binding; } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/model/SectionItemDecoration.java b/app/src/main/java/it/niedermann/owncloud/notes/model/SectionItemDecoration.java new file mode 100644 index 00000000..baf95926 --- /dev/null +++ b/app/src/main/java/it/niedermann/owncloud/notes/model/SectionItemDecoration.java @@ -0,0 +1,39 @@ +package it.niedermann.owncloud.notes.model; + +import android.graphics.Rect; +import android.view.View; + +import androidx.annotation.CallSuper; +import androidx.annotation.NonNull; +import androidx.annotation.Px; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.StaggeredGridLayoutManager; + +public class SectionItemDecoration extends RecyclerView.ItemDecoration { + + @NonNull + private final ItemAdapter adapter; + private final int sectionLeft; + private final int sectionTop; + private final int sectionRight; + private final int sectionBottom; + + public SectionItemDecoration(@NonNull ItemAdapter adapter, @Px int sectionLeft, @Px int sectionTop, @Px int sectionRight, @Px int sectionBottom) { + this.adapter = adapter; + this.sectionLeft = sectionLeft; + this.sectionTop = sectionTop; + this.sectionRight = sectionRight; + this.sectionBottom = sectionBottom; + } + + @CallSuper + public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { + final int position = parent.getChildAdapterPosition(view); + if (adapter.getItemViewType(position) == ItemAdapter.TYPE_SECTION) { + outRect.left = sectionLeft; + outRect.top = sectionTop; + outRect.right = sectionRight; + outRect.bottom = sectionBottom; + } + } +} diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesDatabase.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesDatabase.java index 286bfbd2..ae595cd7 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesDatabase.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesDatabase.java @@ -58,6 +58,7 @@ import static it.niedermann.owncloud.notes.android.activity.EditNoteActivity.ACT import static it.niedermann.owncloud.notes.android.appwidget.NoteListWidget.updateNoteListWidgets; import static it.niedermann.owncloud.notes.android.appwidget.SingleNoteWidget.updateSingleNoteWidgets; import static it.niedermann.owncloud.notes.model.NoteListsWidgetData.MODE_DISPLAY_CATEGORY; +import static it.niedermann.owncloud.notes.util.Notes.isGridViewEnabled; /** * Helps to add, get, update and delete Notes with the option to trigger a Resync with the Server. @@ -94,7 +95,7 @@ public class NotesDatabase extends AbstractNotesDatabase { * @param note Note */ public long addNoteAndSync(SingleSignOnAccount ssoAccount, long accountId, CloudNote note) { - DBNote dbNote = new DBNote(0, 0, note.getModified(), note.getTitle(), note.getContent(), note.isFavorite(), note.getCategory(), note.getEtag(), DBStatus.LOCAL_EDITED, accountId, NoteUtil.generateNoteExcerpt(note.getContent()), 0); + DBNote dbNote = new DBNote(0, 0, note.getModified(), note.getTitle(), note.getContent(), note.isFavorite(), note.getCategory(), note.getEtag(), DBStatus.LOCAL_EDITED, accountId, NoteUtil.generateNoteExcerpt(note.getContent(), isGridViewEnabled(context)), 0); long id = addNote(accountId, dbNote); notifyWidgets(); getNoteServerSyncHelper().scheduleSync(ssoAccount, true); @@ -121,7 +122,7 @@ public class NotesDatabase extends AbstractNotesDatabase { } else { values.put(key_status, DBStatus.VOID.getTitle()); values.put(key_account_id, accountId); - values.put(key_excerpt, NoteUtil.generateNoteExcerpt(note.getContent())); + values.put(key_excerpt, NoteUtil.generateNoteExcerpt(note.getContent(), isGridViewEnabled(context))); } if (note.getRemoteId() > 0) { values.put(key_remote_id, note.getRemoteId()); @@ -135,12 +136,12 @@ public class NotesDatabase extends AbstractNotesDatabase { return db.insert(table_notes, null, values); } - public void regenerateExcerpts(boolean stripMarkdown) { + public void regenerateExcerpts(boolean keepMarkdown) { SQLiteDatabase db = this.getWritableDatabase(); Cursor cursor = db.query(table_notes, new String[]{key_id, key_content}, key_status + " != ?", new String[]{DBStatus.LOCAL_DELETED.getTitle()}, null, null, null); ContentValues values = new ContentValues(1); while (cursor.moveToNext()) { - values.put(key_excerpt, NoteUtil.generateNoteExcerpt(cursor.getString(1), stripMarkdown)); + values.put(key_excerpt, NoteUtil.generateNoteExcerpt(cursor.getString(1), keepMarkdown)); db.update(table_notes, values, key_id + " = ?", new String[]{String.valueOf(cursor.getInt(0))}); } cursor.close(); @@ -521,7 +522,7 @@ public class NotesDatabase extends AbstractNotesDatabase { if (newContent == null) { newNote = new DBNote(oldNote.getId(), oldNote.getRemoteId(), oldNote.getModified(), oldNote.getTitle(), oldNote.getContent(), oldNote.isFavorite(), oldNote.getCategory(), oldNote.getEtag(), DBStatus.LOCAL_EDITED, accountId, oldNote.getExcerpt(), oldNote.getScrollY()); } else { - newNote = new DBNote(oldNote.getId(), oldNote.getRemoteId(), Calendar.getInstance(), NoteUtil.generateNonEmptyNoteTitle(newContent, getContext()), newContent, oldNote.isFavorite(), oldNote.getCategory(), oldNote.getEtag(), DBStatus.LOCAL_EDITED, accountId, NoteUtil.generateNoteExcerpt(newContent), oldNote.getScrollY()); + newNote = new DBNote(oldNote.getId(), oldNote.getRemoteId(), Calendar.getInstance(), NoteUtil.generateNonEmptyNoteTitle(newContent, getContext()), newContent, oldNote.isFavorite(), oldNote.getCategory(), oldNote.getEtag(), DBStatus.LOCAL_EDITED, accountId, NoteUtil.generateNoteExcerpt(newContent, isGridViewEnabled(context)), oldNote.getScrollY()); } SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(7); @@ -585,7 +586,7 @@ public class NotesDatabase extends AbstractNotesDatabase { values.put(key_favorite, remoteNote.isFavorite()); values.put(key_category, getCategoryIdByTitle(localAccount.getId(), remoteNote.getCategory())); values.put(key_etag, remoteNote.getEtag()); - values.put(key_excerpt, NoteUtil.generateNoteExcerpt(remoteNote.getContent())); + values.put(key_excerpt, NoteUtil.generateNoteExcerpt(remoteNote.getContent(), isGridViewEnabled(context))); String whereClause; String[] whereArgs; if (forceUnchangedDBNoteState != null) { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/migration/Migration_9_10.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/migration/Migration_9_10.java index 98ddc601..855130f1 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/migration/Migration_9_10.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/migration/Migration_9_10.java @@ -18,7 +18,7 @@ public class Migration_9_10 { Cursor cursor = db.query("NOTES", new String[]{"ID", "CONTENT"}, null, null, null, null, null, null); while (cursor.moveToNext()) { ContentValues values = new ContentValues(); - values.put("EXCERPT", NoteUtil.generateNoteExcerpt(cursor.getString(1))); + values.put("EXCERPT", NoteUtil.generateNoteExcerpt(cursor.getString(1), false)); db.update("NOTES", values, "ID" + " = ? ", new String[]{cursor.getString(0)}); } cursor.close(); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/util/NoteUtil.java b/app/src/main/java/it/niedermann/owncloud/notes/util/NoteUtil.java index 337fb521..225f63e9 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/util/NoteUtil.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/util/NoteUtil.java @@ -81,29 +81,18 @@ public class NoteUtil { /** * Generates an excerpt of a content String (reads second line which is not empty) * - * @param content {@link String} + * @param content {@link String} + * @param keepMarkdown whether or not the markdown should be stripped from the excerpt * @return excerpt String */ @NonNull - public static String generateNoteExcerpt(@NonNull String content) { - return generateNoteExcerpt(content, true); // TODO check gridview - } - - /** - * Generates an excerpt of a content String (reads second line which is not empty) - * - * @param content {@link String} - * @param stripMarkdown whether or not the markdown should be stripped from the excerpt - * @return excerpt String - */ - @NonNull - public static String generateNoteExcerpt(@NonNull String content, boolean stripMarkdown) { + public static String generateNoteExcerpt(@NonNull String content, boolean keepMarkdown) { if (!content.contains("\n")) { return ""; } - return stripMarkdown - ? truncateString(removeMarkDown(content.replaceFirst("^.*\n", "")), 150).replace("\n", " ") - : truncateString(content.replaceFirst("^.*\n", ""), 200); + return keepMarkdown + ? truncateString(removeMarkDown(content.replaceFirst("^.*\n", "")), 150) + : truncateString(removeMarkDown(content.replaceFirst("^.*\n", "")), 150).replace("\n", " "); } @NonNull diff --git a/app/src/main/java/it/niedermann/owncloud/notes/util/Notes.java b/app/src/main/java/it/niedermann/owncloud/notes/util/Notes.java index 9a4de905..f671bd2b 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/util/Notes.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/util/Notes.java @@ -6,12 +6,15 @@ import android.content.SharedPreferences; import android.content.res.Configuration; import android.util.Log; +import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatDelegate; import androidx.preference.PreferenceManager; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.android.DarkModeSetting; +import static androidx.preference.PreferenceManager.getDefaultSharedPreferences; + public class Notes extends Application { private static final String TAG = Notes.class.getSimpleName(); @@ -20,6 +23,7 @@ public class Notes extends Application { private static boolean isLocked = true; private static long lastInteraction = 0; private static String PREF_KEY_THEME; + private static boolean isGridViewEnabled = false; @Override public void onCreate() { @@ -27,6 +31,7 @@ public class Notes extends Application { setAppTheme(getAppTheme(getApplicationContext())); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); lockedPreference = prefs.getBoolean(getString(R.string.pref_key_lock), false); + isGridViewEnabled = getDefaultSharedPreferences(this).getBoolean(getString(R.string.pref_key_gridview), false); super.onCreate(); } @@ -34,6 +39,14 @@ public class Notes extends Application { AppCompatDelegate.setDefaultNightMode(setting.getModeId()); } + public static boolean isGridViewEnabled(@NonNull Context context) { + return isGridViewEnabled; + } + + public static void updateGridViewEnabled(Boolean gridView) { + isGridViewEnabled = gridView; + } + public static DarkModeSetting getAppTheme(Context context) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); String mode; diff --git a/app/src/main/res/layout/activity_notes_list_view.xml b/app/src/main/res/layout/activity_notes_list_view.xml index b1f318ed..47aa0186 100644 --- a/app/src/main/res/layout/activity_notes_list_view.xml +++ b/app/src/main/res/layout/activity_notes_list_view.xml @@ -4,8 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_notes_list_view" android:layout_width="match_parent" - android:layout_height="match_parent" - android:background="@color/primary"> + android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" diff --git a/app/src/main/res/layout/item_notes_list_note_item_grid.xml b/app/src/main/res/layout/item_notes_list_note_item_grid.xml index 3fe1c09e..68d29e26 100644 --- a/app/src/main/res/layout/item_notes_list_note_item_grid.xml +++ b/app/src/main/res/layout/item_notes_list_note_item_grid.xml @@ -9,66 +9,72 @@ <LinearLayout android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical"> + android:layout_height="match_parent" + android:orientation="vertical" + android:paddingBottom="@dimen/spacer_2x"> - <TextView - 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_marginTop="@dimen/spacer_1x" - android:background="@drawable/border" - android:maxLines="1" - android:paddingLeft="@dimen/spacer_1x" - android:paddingTop="1dp" - 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 android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/spacer_1x" - android:gravity="center_vertical|end" + android:baselineAligned="false" android:orientation="horizontal"> - <com.yydcdut.markdown.MarkdownTextView - android:id="@+id/noteTitle" + <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" - android:paddingStart="@dimen/spacer_2x" - android:paddingLeft="@dimen/spacer_2x" - android:paddingEnd="@dimen/spacer_2x" - android:paddingRight="@dimen/spacer_2x" - android:textAppearance="?android:attr/textAppearanceMedium" - android:textColor="@color/fg_default" - android:textIsSelectable="true" - android:theme="@style/textViewStyle" - tools:maxLength="50" - tools:text="@tools:sample/lorem/random" /> + android:orientation="vertical" + android:paddingTop="@dimen/spacer_1x"> + + <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:background="@drawable/border" + android:maxLines="1" + android:paddingLeft="@dimen/spacer_1x" + android:paddingTop="1dp" + 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" /> + + <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_1x" + android:layout_marginEnd="0dp" + android:layout_marginRight="0dp" + android:textAppearance="?attr/textAppearanceHeadline5" + android:textColor="@color/fg_default" + android:textIsSelectable="true" + android:theme="@style/textViewStyle" + tools:maxLength="50" + tools:text="@tools:sample/lorem/random" /> + </LinearLayout> <FrameLayout android:layout_width="wrap_content" - android:layout_height="match_parent"> + android:layout_height="wrap_content" + android:layout_gravity="top"> <ImageView android:id="@+id/noteFavorite" android:layout_width="wrap_content" - android:layout_height="match_parent" + android:layout_height="wrap_content" android:background="?attr/selectableItemBackgroundBorderless" android:contentDescription="@string/menu_favorite" - android:paddingStart="@dimen/spacer_2x" - android:paddingLeft="@dimen/spacer_2x" - android:paddingEnd="@dimen/spacer_2x" - android:paddingRight="@dimen/spacer_2x" + android:padding="@dimen/spacer_1x" tools:src="@drawable/ic_star_yellow_24dp" /> <androidx.appcompat.widget.AppCompatImageView @@ -88,11 +94,10 @@ android:id="@+id/noteContent" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingStart="@dimen/spacer_2x" - android:paddingLeft="@dimen/spacer_2x" - android:paddingEnd="@dimen/spacer_2x" - android:paddingRight="@dimen/spacer_2x" - android:paddingBottom="@dimen/spacer_2x" + 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" android:textIsSelectable="true" 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/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 index 76c18a8b..3a6f3f24 100644 --- a/app/src/main/res/values/integers.xml +++ b/app/src/main/res/values/integers.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <integer name="max_dp_grid_view">150</integer> + <integer name="max_dp_grid_view">170</integer> </resources>
\ No newline at end of file diff --git a/app/src/test/java/it/niedermann/owncloud/notes/util/NoteUtilTest.java b/app/src/test/java/it/niedermann/owncloud/notes/util/NoteUtilTest.java index 8f892311..7504c032 100644 --- a/app/src/test/java/it/niedermann/owncloud/notes/util/NoteUtilTest.java +++ b/app/src/test/java/it/niedermann/owncloud/notes/util/NoteUtilTest.java @@ -63,9 +63,9 @@ public class NoteUtilTest extends TestCase { } public void testGenerateNoteExcerpt() { - assertEquals("", NoteUtil.generateNoteExcerpt("Test")); - assertEquals("Foo", NoteUtil.generateNoteExcerpt("Test\nFoo")); - assertEquals("Foo Bar", NoteUtil.generateNoteExcerpt("Test\nFoo\nBar")); - assertEquals("", NoteUtil.generateNoteExcerpt("")); + assertEquals("", NoteUtil.generateNoteExcerpt("Test", false)); + assertEquals("Foo", NoteUtil.generateNoteExcerpt("Test\nFoo", false)); + assertEquals("Foo Bar", NoteUtil.generateNoteExcerpt("Test\nFoo\nBar", false)); + assertEquals("", NoteUtil.generateNoteExcerpt("", false)); } }
\ No newline at end of file |