diff options
14 files changed, 106 insertions, 95 deletions
diff --git a/app/src/androidTest/java/it/niedermann/owncloud/notes/persistence/NotesNotesDatabaseTest.java b/app/src/androidTest/java/it/niedermann/owncloud/notes/persistence/NotesNotesDatabaseTest.java index 4723d543..256fa689 100644 --- a/app/src/androidTest/java/it/niedermann/owncloud/notes/persistence/NotesNotesDatabaseTest.java +++ b/app/src/androidTest/java/it/niedermann/owncloud/notes/persistence/NotesNotesDatabaseTest.java @@ -104,7 +104,7 @@ public class NotesNotesDatabaseTest { // Add a new note long noteID = db.addNote(accountID, cloudNote); // Check if this note is added successfully - Note note = db.getNoteDao().getNote(accountID, noteID); + Note note = db.getNoteDao().getNoteWithCategory(accountID, noteID); Log.i("Test_01_addNote_Cur_Note", note.toString()); Log.i("Test_01_addNote_Cur_Note", "Title: " + note.getTitle()); Log.i("Test_01_addNote_Cur_Note", "Content: " + note.getContent()); @@ -130,7 +130,7 @@ public class NotesNotesDatabaseTest { "A Bad Day", getCurDate() + " You're faking a smile with just a coffee to go (Daniel Powter).", true, "A Nice Song", null); noteID = db.addNote(accountID, cloudNote_re0); - note = db.getNoteDao().getNote(accountID, noteID); + note = db.getNoteDao().getNoteWithCategory(accountID, noteID); // Check assertEquals("A Bad Day", note.getTitle()); assertEquals(cloudNote_re0.getContent(), note.getContent()); @@ -161,7 +161,7 @@ public class NotesNotesDatabaseTest { // Add a new note long noteID = db.addNote(accountID, dbNote); // Check if this note is added successfully - Note note = db.getNoteDao().getNote(accountID, noteID); + Note note = db.getNoteDao().getNoteWithCategory(accountID, noteID); assertEquals(dbNote.getTitle(), note.getTitle()); assertEquals(dbNote.getContent(), note.getContent()); assertEquals(dbNote.getCategory(), note.getCategory()); @@ -175,7 +175,7 @@ public class NotesNotesDatabaseTest { // Add a new note noteID = db.addNote(accountID, dbNote); // Check if this note is added successfully - note = db.getNoteDao().getNote(accountID, noteID); + note = db.getNoteDao().getNoteWithCategory(accountID, noteID); assertEquals(dbNote.getTitle(), note.getTitle()); assertEquals(dbNote.getContent(), note.getContent()); assertEquals(dbNote.getCategory(), note.getCategory()); @@ -323,7 +323,7 @@ public class NotesNotesDatabaseTest { // check if the node added successfully for (int i = 0; i < 10; ++i) { - Note nodeTemp = db.getNoteDao().getNote(thisAccountID, multiNoteID[i]); + Note nodeTemp = db.getNoteDao().getNoteWithCategory(thisAccountID, multiNoteID[i]); assertEquals(nodeTemp.getTitle(), multiCloudNote.get(i).getTitle()); assertEquals(nodeTemp.getCategory(), multiCloudNote.get(i).getCategory()); assertEquals(nodeTemp.getContent(), multiCloudNote.get(i).getContent()); @@ -469,7 +469,7 @@ public class NotesNotesDatabaseTest { // Add a new note long noteID = db.addNote(accountID, cloudNote); // Check if this note is added successfully - Note note = db.getNoteDao().getNote(accountID, noteID); + Note note = db.getNoteDao().getNoteWithCategory(accountID, noteID); Log.i("Test_12_Chinese_Cur_Note", note.toString()); Log.i("Test_12_Chinese_Cur_Note", "Title: " + note.getTitle()); Log.i("Test_12_Chinese_Cur_Note", "Content: " + note.getContent()); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/AppendToNoteActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/AppendToNoteActivity.java index 07bcc7bc..f1fad21f 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/AppendToNoteActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/AppendToNoteActivity.java @@ -10,7 +10,6 @@ import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBar; import it.niedermann.owncloud.notes.main.MainActivity; -import it.niedermann.owncloud.notes.persistence.entity.Note; import it.niedermann.owncloud.notes.persistence.entity.NoteWithCategory; public class AppendToNoteActivity extends MainActivity { @@ -37,8 +36,8 @@ public class AppendToNoteActivity extends MainActivity { @Override public void onNoteClick(int position, View v) { if (receivedText != null && receivedText.length() > 0) { - final Note note = db.getNoteDao().getNote(localAccount.getId(), ((NoteWithCategory) adapter.getItem(position)).getNote().getId()); - final String oldContent = note.getContent(); + final NoteWithCategory note = db.getNoteDao().getNoteWithCategory(localAccount.getId(), ((NoteWithCategory) adapter.getItem(position)).getNote().getId()); + final String oldContent = note.getNote().getContent(); String newContent; if (oldContent != null && oldContent.length() > 0) { newContent = oldContent + "\n\n" + receivedText; diff --git a/app/src/main/java/it/niedermann/owncloud/notes/edit/BaseNoteFragment.java b/app/src/main/java/it/niedermann/owncloud/notes/edit/BaseNoteFragment.java index 7e995244..368e85bb 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/edit/BaseNoteFragment.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/edit/BaseNoteFragment.java @@ -39,6 +39,7 @@ import it.niedermann.owncloud.notes.edit.title.EditTitleDialogFragment.EditTitle import it.niedermann.owncloud.notes.persistence.NotesDatabase; import it.niedermann.owncloud.notes.persistence.entity.Account; import it.niedermann.owncloud.notes.persistence.entity.Note; +import it.niedermann.owncloud.notes.persistence.entity.NoteWithCategory; import it.niedermann.owncloud.notes.shared.model.ApiVersion; import it.niedermann.owncloud.notes.shared.model.DBStatus; import it.niedermann.owncloud.notes.shared.model.ISyncCallback; @@ -67,10 +68,10 @@ public abstract class BaseNoteFragment extends BrandedFragment implements Catego private Account localAccount; private SingleSignOnAccount ssoAccount; - protected Note note; + protected NoteWithCategory note; // TODO do we really need this? The reference to note is currently the same @Nullable - private Note originalNote; + private NoteWithCategory originalNote; private int originalScrollY; protected NotesDatabase db; private NoteFragmentListener listener; @@ -106,24 +107,25 @@ public abstract class BaseNoteFragment extends BrandedFragment implements Catego SingleAccountHelper.setCurrentAccount(requireActivity().getApplicationContext(), localAccount.getAccountName()); } isNew = false; - note = originalNote = db.getNoteDao().getNote(localAccount.getId(), id); + note = originalNote = db.getNoteDao().getNoteWithCategory(localAccount.getId(), id); } else { - Note cloudNote = (Note) requireArguments().getSerializable(PARAM_NEWNOTE); + NoteWithCategory cloudNote = (NoteWithCategory) requireArguments().getSerializable(PARAM_NEWNOTE); String content = requireArguments().getString(PARAM_CONTENT); if (cloudNote == null) { if (content == null) { throw new IllegalArgumentException(PARAM_NOTE_ID + " is not given, argument " + PARAM_NEWNOTE + " is missing and " + PARAM_CONTENT + " is missing."); } else { - note = new Note(-1, -1L, null, NoteUtil.generateNoteTitle(content), content, false, getString(R.string.category_readonly), null, DBStatus.VOID, -1, "", 0); + note = new NoteWithCategory(); + note.setNote(new Note(-1, -1L, null, NoteUtil.generateNoteTitle(content), content, false, getString(R.string.category_readonly), null, DBStatus.VOID, -1, "", 0)); } } else { - note = db.getNoteDao().getNote(localAccount.getId(), db.addNoteAndSync(ssoAccount, localAccount.getId(), cloudNote)); + note = db.getNoteDao().getNoteWithCategory(localAccount.getId(), db.addNoteAndSync(ssoAccount, localAccount.getId(), cloudNote)); originalNote = null; } } } else { - note = (Note) savedInstanceState.getSerializable(SAVEDKEY_NOTE); - originalNote = (Note) savedInstanceState.getSerializable(SAVEDKEY_ORIGINAL_NOTE); + note = (NoteWithCategory) savedInstanceState.getSerializable(SAVEDKEY_NOTE); + originalNote = (NoteWithCategory) savedInstanceState.getSerializable(SAVEDKEY_ORIGINAL_NOTE); } setHasOptionsMenu(true); } catch (NextcloudFilesAppAccountNotFoundException | NoCurrentAccountSelectedException e) { @@ -141,7 +143,7 @@ public abstract class BaseNoteFragment extends BrandedFragment implements Catego if (scrollView != null) { scrollView.getViewTreeObserver().addOnScrollChangedListener(() -> { if (scrollView.getScrollY() > 0) { - note.setScrollY(scrollView.getScrollY()); + note.getNote().setScrollY(scrollView.getScrollY()); } }); } @@ -152,7 +154,7 @@ public abstract class BaseNoteFragment extends BrandedFragment implements Catego super.onActivityCreated(savedInstanceState); final ScrollView scrollView = getScrollView(); if (scrollView != null) { - this.originalScrollY = note.getScrollY(); + this.originalScrollY = note.getNote().getScrollY(); scrollView.post(() -> scrollView.scrollTo(0, originalScrollY)); } } @@ -205,8 +207,8 @@ public abstract class BaseNoteFragment extends BrandedFragment implements Catego } private void prepareFavoriteOption(MenuItem item) { - item.setIcon(note.getFavorite() ? R.drawable.ic_star_white_24dp : R.drawable.ic_star_border_white_24dp); - item.setChecked(note.getFavorite()); + item.setIcon(note.getNote().getFavorite() ? R.drawable.ic_star_white_24dp : R.drawable.ic_star_border_white_24dp); + item.setChecked(note.getNote().getFavorite()); tintMenuIcon(item, colorAccent); } @@ -218,18 +220,18 @@ public abstract class BaseNoteFragment extends BrandedFragment implements Catego switch (item.getItemId()) { case R.id.menu_cancel: if (originalNote == null) { - db.deleteNoteAndSync(ssoAccount, note.getId()); + db.deleteNoteAndSync(ssoAccount, note.getNote().getId()); } else { db.updateNoteAndSync(ssoAccount, localAccount, originalNote, null, null, null); } listener.close(); return true; case R.id.menu_delete: - db.deleteNoteAndSync(ssoAccount, note.getId()); + db.deleteNoteAndSync(ssoAccount, note.getNote().getId()); listener.close(); return true; case R.id.menu_favorite: - db.toggleFavoriteAndSync(ssoAccount, note.getId(), null); + db.toggleFavoriteAndSync(ssoAccount, note.getNote().getId(), null); listener.onNoteUpdated(note); prepareFavoriteOption(item); return true; @@ -240,10 +242,10 @@ public abstract class BaseNoteFragment extends BrandedFragment implements Catego showEditTitleDialog(); return true; case R.id.menu_move: - AccountPickerDialogFragment.newInstance(note.getAccountId()).show(requireActivity().getSupportFragmentManager(), BaseNoteFragment.class.getSimpleName()); + AccountPickerDialogFragment.newInstance(note.getNote().getAccountId()).show(requireActivity().getSupportFragmentManager(), BaseNoteFragment.class.getSimpleName()); return true; case R.id.menu_share: - ShareUtil.openShareDialog(requireContext(), note.getTitle(), note.getContent()); + ShareUtil.openShareDialog(requireContext(), note.getNote().getTitle(), note.getNote().getContent()); return false; case MENU_ID_PIN: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { @@ -252,12 +254,12 @@ public abstract class BaseNoteFragment extends BrandedFragment implements Catego if (shortcutManager != null) { if (shortcutManager.isRequestPinShortcutSupported()) { Intent intent = new Intent(getActivity(), EditNoteActivity.class); - intent.putExtra(EditNoteActivity.PARAM_NOTE_ID, note.getId()); + intent.putExtra(EditNoteActivity.PARAM_NOTE_ID, note.getNote().getId()); intent.setAction(ACTION_SHORTCUT); - ShortcutInfo pinShortcutInfo = new ShortcutInfo.Builder(getActivity(), note.getId() + "") - .setShortLabel(note.getTitle()) - .setIcon(Icon.createWithResource(requireActivity().getApplicationContext(), note.getFavorite() ? R.drawable.ic_star_yellow_24dp : R.drawable.ic_star_grey_ccc_24dp)) + ShortcutInfo pinShortcutInfo = new ShortcutInfo.Builder(getActivity(), note.getNote().getId() + "") + .setShortLabel(note.getNote().getTitle()) + .setIcon(Icon.createWithResource(requireActivity().getApplicationContext(), note.getNote().getFavorite() ? R.drawable.ic_star_yellow_24dp : R.drawable.ic_star_grey_ccc_24dp)) .setIntent(intent) .build(); @@ -285,7 +287,7 @@ public abstract class BaseNoteFragment extends BrandedFragment implements Catego public void onCloseNote() { if (!titleModified && originalNote == null && getContent().isEmpty()) { - db.deleteNoteAndSync(ssoAccount, note.getId()); + db.deleteNoteAndSync(ssoAccount, note.getNote().getId()); } } @@ -298,10 +300,10 @@ public abstract class BaseNoteFragment extends BrandedFragment implements Catego Log.d(TAG, "saveData()"); if (note != null) { String newContent = getContent(); - if (note.getContent().equals(newContent)) { - if (note.getScrollY() != originalScrollY) { + if (note.getNote().getContent().equals(newContent)) { + if (note.getNote().getScrollY() != originalScrollY) { Log.v(TAG, "... only saving new scroll state, since content did not change"); - db.getNoteDao().updateScrollY(note.getId(), note.getScrollY()); + db.getNoteDao().updateScrollY(note.getNote().getId(), note.getNote().getScrollY()); } else { Log.v(TAG, "... not saving, since nothing has changed"); } @@ -327,7 +329,7 @@ public abstract class BaseNoteFragment extends BrandedFragment implements Catego if (frag != null) { manager.beginTransaction().remove(frag).commit(); } - final DialogFragment categoryFragment = CategoryDialogFragment.newInstance(note.getAccountId(), note.getCategory()); + final DialogFragment categoryFragment = CategoryDialogFragment.newInstance(note.getNote().getAccountId(), note.getCategory()); categoryFragment.setTargetFragment(this, 0); categoryFragment.show(manager, fragmentId); } @@ -343,27 +345,28 @@ public abstract class BaseNoteFragment extends BrandedFragment implements Catego if (frag != null) { manager.beginTransaction().remove(frag).commit(); } - DialogFragment editTitleFragment = EditTitleDialogFragment.newInstance(note.getTitle()); + DialogFragment editTitleFragment = EditTitleDialogFragment.newInstance(note.getNote().getTitle()); editTitleFragment.setTargetFragment(this, 0); editTitleFragment.show(manager, fragmentId); } @Override public void onCategoryChosen(String category) { - db.setCategory(ssoAccount, note.getAccountId(), note.getId(), category, null); + db.setCategory(ssoAccount, note.getNote().getAccountId(), note.getNote().getId(), category, null); + note.setCategory(category); listener.onNoteUpdated(note); } @Override public void onTitleEdited(String newTitle) { titleModified = true; - note.setTitle(newTitle); - note = db.updateNoteAndSync(ssoAccount, localAccount, note, note.getContent(), newTitle, null); + note.getNote().setTitle(newTitle); + note = db.updateNoteAndSync(ssoAccount, localAccount, note, note.getNote().getContent(), newTitle, null); listener.onNoteUpdated(note); } public void moveNote(Account account) { - db.moveNoteToAnotherAccount(ssoAccount, note.getAccountId(), note, account.getId()); + db.moveNoteToAnotherAccount(ssoAccount, note.getNote().getAccountId(), note.getNote(), account.getId()); listener.close(); } @@ -403,6 +406,6 @@ public abstract class BaseNoteFragment extends BrandedFragment implements Catego public interface NoteFragmentListener { void close(); - void onNoteUpdated(Note note); + void onNoteUpdated(NoteWithCategory note); } } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/edit/EditNoteActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/edit/EditNoteActivity.java index 2eaa5cee..0ad5aeaf 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/edit/EditNoteActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/edit/EditNoteActivity.java @@ -3,6 +3,7 @@ package it.niedermann.owncloud.notes.edit; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; +import android.text.TextUtils; import android.util.Log; import android.view.Menu; import android.view.MenuItem; @@ -26,6 +27,7 @@ import it.niedermann.owncloud.notes.main.MainActivity; import it.niedermann.owncloud.notes.persistence.entity.Account; import it.niedermann.owncloud.notes.persistence.entity.Category; import it.niedermann.owncloud.notes.persistence.entity.Note; +import it.niedermann.owncloud.notes.persistence.entity.NoteWithCategory; import it.niedermann.owncloud.notes.shared.model.ENavigationCategoryType; import it.niedermann.owncloud.notes.shared.model.NavigationCategory; import it.niedermann.owncloud.notes.shared.util.NoteUtil; @@ -256,10 +258,10 @@ public class EditNoteActivity extends LockedActivity implements BaseNoteFragment } @Override - public void onNoteUpdated(Note note) { + public void onNoteUpdated(NoteWithCategory note) { if (note != null) { - binding.toolbar.setTitle(note.getTitle()); - if (note.getCategory().isEmpty()) { + binding.toolbar.setTitle(note.getNote().getTitle()); + if (TextUtils.isEmpty(note.getCategory())) { binding.toolbar.setSubtitle(null); } else { binding.toolbar.setSubtitle(NoteUtil.extendCategory(note.getCategory())); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/edit/NoteEditFragment.java b/app/src/main/java/it/niedermann/owncloud/notes/edit/NoteEditFragment.java index ffb2f479..48a833b0 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/edit/NoteEditFragment.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/edit/NoteEditFragment.java @@ -144,7 +144,7 @@ public class NoteEditFragment extends SearchableBaseNoteFragment { }; if (note != null) { - if (note.getContent().isEmpty()) { + if (note.getNote().getContent().isEmpty()) { binding.editContent.requestFocus(); requireActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); @@ -158,9 +158,9 @@ public class NoteEditFragment extends SearchableBaseNoteFragment { } // workaround for issue yydcdut/RxMarkdown#41 - note.setContent(note.getContent().replace("\r\n", "\n")); + note.getNote().setContent(note.getNote().getContent().replace("\r\n", "\n")); - binding.editContent.setText(note.getContent()); + binding.editContent.setText(note.getNote().getContent()); binding.editContent.setEnabled(true); final MarkdownProcessor markdownProcessor = new MarkdownProcessor(requireContext()); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/edit/NotePreviewFragment.java b/app/src/main/java/it/niedermann/owncloud/notes/edit/NotePreviewFragment.java index db7bcb35..a47c5092 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/edit/NotePreviewFragment.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/edit/NotePreviewFragment.java @@ -115,7 +115,7 @@ public class NotePreviewFragment extends SearchableBaseNoteFragment implements O MarkDownUtil.getMarkDownConfiguration(binding.singleNoteContent.getContext()) .setOnTodoClickCallback((view, line, lineNumber) -> { try { - String[] lines = TextUtils.split(note.getContent(), "\\r?\\n"); + String[] lines = TextUtils.split(note.getNote().getContent(), "\\r?\\n"); /* * Workaround for RxMarkdown-bug: * When (un)checking a checkbox in a note which contains code-blocks, the "`"-characters get stripped out in the TextView and therefore the given lineNumber is wrong @@ -161,7 +161,7 @@ public class NotePreviewFragment extends SearchableBaseNoteFragment implements O .setOnLinkClickCallback((view, link) -> { if (NoteLinksUtils.isNoteLink(link)) { final Intent intent = new Intent(requireActivity().getApplicationContext(), EditNoteActivity.class) - .putExtra(EditNoteActivity.PARAM_NOTE_ID, db.getNoteDao().getLocalIdByRemoteId(this.note.getAccountId(), extractNoteRemoteId(link))); + .putExtra(EditNoteActivity.PARAM_NOTE_ID, db.getNoteDao().getLocalIdByRemoteId(this.note.getNote().getAccountId(), extractNoteRemoteId(link))); startActivity(intent); } else { Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(link)); @@ -170,16 +170,16 @@ public class NotePreviewFragment extends SearchableBaseNoteFragment implements O }) .build()); - TextProcessorChain chain = defaultTextProcessorChain(note); + TextProcessorChain chain = defaultTextProcessorChain(note.getNote()); try { - binding.singleNoteContent.setText(parseCompat(markdownProcessor, chain.apply(note.getContent()))); + binding.singleNoteContent.setText(parseCompat(markdownProcessor, chain.apply(note.getNote().getContent()))); } catch (StringIndexOutOfBoundsException e) { // Workaround for RxMarkdown: https://github.com/stefan-niedermann/nextcloud-notes/issues/668 - binding.singleNoteContent.setText(chain.apply(note.getContent())); + binding.singleNoteContent.setText(chain.apply(note.getNote().getContent())); Toast.makeText(binding.singleNoteContent.getContext(), R.string.could_not_load_preview_two_digit_numbered_list, Toast.LENGTH_LONG).show(); e.printStackTrace(); } - changedText = note.getContent(); + changedText = note.getNote().getContent(); binding.singleNoteContent.setMovementMethod(LinkMovementMethod.getInstance()); binding.swiperefreshlayout.setOnRefreshListener(this); @@ -210,12 +210,12 @@ public class NotePreviewFragment extends SearchableBaseNoteFragment implements O if (db.getNoteServerSyncHelper().isSyncPossible() && SSOUtil.isConfigured(getContext())) { binding.swiperefreshlayout.setRefreshing(true); try { - TextProcessorChain chain = defaultTextProcessorChain(note); + TextProcessorChain chain = defaultTextProcessorChain(note.getNote()); SingleSignOnAccount ssoAccount = SingleAccountHelper.getCurrentSingleSignOnAccount(requireContext()); db.getNoteServerSyncHelper().addCallbackPull(ssoAccount, () -> { - note = db.getNoteDao().getNote(note.getAccountId(), note.getId()); - changedText = note.getContent(); - binding.singleNoteContent.setText(parseCompat(markdownProcessor, chain.apply(note.getContent()))); + note = db.getNoteDao().getNoteWithCategory(note.getNote().getAccountId(), note.getNote().getId()); + changedText = note.getNote().getContent(); + binding.singleNoteContent.setText(parseCompat(markdownProcessor, chain.apply(note.getNote().getContent()))); binding.swiperefreshlayout.setRefreshing(false); }); db.getNoteServerSyncHelper().scheduleSync(ssoAccount, false); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/edit/NoteReadonlyFragment.java b/app/src/main/java/it/niedermann/owncloud/notes/edit/NoteReadonlyFragment.java index 753c6da0..2608a097 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/edit/NoteReadonlyFragment.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/edit/NoteReadonlyFragment.java @@ -104,7 +104,7 @@ public class NoteReadonlyFragment extends SearchableBaseNoteFragment { .setOnLinkClickCallback((view, link) -> { if (NoteLinksUtils.isNoteLink(link)) { long noteRemoteId = NoteLinksUtils.extractNoteRemoteId(link); - long noteLocalId = db.getNoteDao().getLocalIdByRemoteId(this.note.getAccountId(), noteRemoteId); + long noteLocalId = db.getNoteDao().getLocalIdByRemoteId(this.note.getNote().getAccountId(), noteRemoteId); Intent intent = new Intent(requireActivity().getApplicationContext(), EditNoteActivity.class); intent.putExtra(EditNoteActivity.PARAM_NOTE_ID, noteLocalId); startActivity(intent); @@ -115,11 +115,11 @@ public class NoteReadonlyFragment extends SearchableBaseNoteFragment { }) .build()); try { - binding.singleNoteContent.setText(parseCompat(markdownProcessor, note.getContent())); + binding.singleNoteContent.setText(parseCompat(markdownProcessor, note.getNote().getContent())); onResume(); } catch (StringIndexOutOfBoundsException e) { // Workaround for RxMarkdown: https://github.com/stefan-niedermann/nextcloud-notes/issues/668 - binding.singleNoteContent.setText(note.getContent()); + binding.singleNoteContent.setText(note.getNote().getContent()); Toast.makeText(binding.singleNoteContent.getContext(), R.string.could_not_load_preview_two_digit_numbered_list, Toast.LENGTH_LONG).show(); e.printStackTrace(); } @@ -153,7 +153,7 @@ public class NoteReadonlyFragment extends SearchableBaseNoteFragment { @Override protected String getContent() { - return note.getContent(); + return note.getNote().getContent(); } @Override diff --git a/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java index d23a33af..d6ca97a2 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java @@ -833,7 +833,7 @@ public class MainActivity extends LockedActivity implements NoteClickListener, V adapter.deselect(0); for (Integer i : selection) { NoteWithCategory note = (NoteWithCategory) adapter.getItem(i); - db.moveNoteToAnotherAccount(ssoAccount, note.getNote().getAccountId(), db.getNoteDao().getNote(note.getNote().getAccountId(), note.getNote().getId()), account.getId()); + db.moveNoteToAnotherAccount(ssoAccount, note.getNote().getAccountId(), db.getNoteDao().getNoteWithCategory(note.getNote().getAccountId(), note.getNote().getId()).getNote(), account.getId()); RecyclerView.ViewHolder viewHolder = listView.findViewHolderForAdapterPosition(i); if (viewHolder != null) { viewHolder.itemView.setSelected(false); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/main/MultiSelectedActionModeCallback.java b/app/src/main/java/it/niedermann/owncloud/notes/main/MultiSelectedActionModeCallback.java index 654aadd6..81c1978a 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/main/MultiSelectedActionModeCallback.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/main/MultiSelectedActionModeCallback.java @@ -100,28 +100,28 @@ public class MultiSelectedActionModeCallback implements Callback { case R.id.menu_delete: try { SingleSignOnAccount ssoAccount = SingleAccountHelper.getCurrentSingleSignOnAccount(context); - List<Note> deletedNotes = new ArrayList<>(); + List<NoteWithCategory> deletedNotes = new ArrayList<>(); List<Integer> selection = adapter.getSelected(); for (Integer i : selection) { NoteWithCategory note = (NoteWithCategory) adapter.getItem(i); - deletedNotes.add(db.getNoteDao().getNote(note.getNote().getAccountId(), note.getNote().getId())); + deletedNotes.add(db.getNoteDao().getNoteWithCategory(note.getNote().getAccountId(), note.getNote().getId())); db.deleteNoteAndSync(ssoAccount, note.getNote().getId()); } mode.finish(); // Action picked, so close the CAB //after delete selection has to be cleared searchView.setIconified(true); String deletedSnackbarTitle = deletedNotes.size() == 1 - ? context.getString(R.string.action_note_deleted, deletedNotes.get(0).getTitle()) + ? context.getString(R.string.action_note_deleted, deletedNotes.get(0).getNote().getTitle()) : context.getResources().getQuantityString(R.plurals.bulk_notes_deleted, deletedNotes.size(), deletedNotes.size()); BrandedSnackbar.make(viewProvider.getView(), deletedSnackbarTitle, Snackbar.LENGTH_LONG) .setAction(R.string.action_undo, (View v) -> { db.getNoteServerSyncHelper().addCallbackPush(ssoAccount, () -> { }); - for (Note deletedNote : deletedNotes) { - db.addNoteAndSync(ssoAccount, deletedNote.getAccountId(), deletedNote); + for (NoteWithCategory deletedNote : deletedNotes) { + db.addNoteAndSync(ssoAccount, deletedNote.getNote().getAccountId(), deletedNote); } String restoreSnackbarTitle = deletedNotes.size() == 1 - ? context.getString(R.string.action_note_restored, deletedNotes.get(0).getTitle()) + ? context.getString(R.string.action_note_restored, deletedNotes.get(0).getNote().getTitle()) : context.getResources().getQuantityString(R.plurals.bulk_notes_restored, deletedNotes.size(), deletedNotes.size()); BrandedSnackbar.make(viewProvider.getView(), restoreSnackbarTitle, Snackbar.LENGTH_SHORT) .show(); @@ -143,7 +143,7 @@ public class MultiSelectedActionModeCallback implements Callback { final StringBuilder noteContents = new StringBuilder(); for (Integer i : adapter.getSelected()) { final NoteWithCategory noteWithoutContent = (NoteWithCategory) adapter.getItem(i); - final String tempFullNote = db.getNoteDao().getNote(noteWithoutContent.getNote().getAccountId(), noteWithoutContent.getNote().getId()).getContent(); + final String tempFullNote = db.getNoteDao().getNoteWithCategory(noteWithoutContent.getNote().getAccountId(), noteWithoutContent.getNote().getId()).getNote().getContent(); if (!TextUtils.isEmpty(tempFullNote)) { if (noteContents.length() > 0) { noteContents.append("\n\n"); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/main/items/list/NotesListViewItemTouchHelper.java b/app/src/main/java/it/niedermann/owncloud/notes/main/items/list/NotesListViewItemTouchHelper.java index 42762ebe..2361abd3 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/main/items/list/NotesListViewItemTouchHelper.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/main/items/list/NotesListViewItemTouchHelper.java @@ -74,19 +74,19 @@ public class NotesListViewItemTouchHelper extends ItemTouchHelper { switch (direction) { case ItemTouchHelper.LEFT: final NoteWithCategory dbNoteWithoutContent = (NoteWithCategory) adapter.getItem(viewHolder.getAdapterPosition()); - final Note dbNote = db.getNoteDao().getNote(dbNoteWithoutContent.getNote().getAccountId(), dbNoteWithoutContent.getNote().getId()); - db.deleteNoteAndSync(ssoAccount, dbNote.getId()); + final NoteWithCategory dbNote = db.getNoteDao().getNoteWithCategory(dbNoteWithoutContent.getNote().getAccountId(), dbNoteWithoutContent.getNote().getId()); + db.deleteNoteAndSync(ssoAccount, dbNote.getNote().getId()); // FIXME // adapter.remove(dbNote); Log.v(TAG, "Item deleted through swipe ----------------------------------------------"); if (viewProvider == null) { - Toast.makeText(context, context.getString(R.string.action_note_deleted, dbNote.getTitle()), Toast.LENGTH_LONG).show(); + Toast.makeText(context, context.getString(R.string.action_note_deleted, dbNote.getNote().getTitle()), Toast.LENGTH_LONG).show(); } else { - BrandedSnackbar.make(viewProvider.getView(), context.getString(R.string.action_note_deleted, dbNote.getTitle()), UNDO_DURATION) + BrandedSnackbar.make(viewProvider.getView(), context.getString(R.string.action_note_deleted, dbNote.getNote().getTitle()), UNDO_DURATION) .setAction(R.string.action_undo, (View v) -> { db.getNoteServerSyncHelper().addCallbackPush(ssoAccount, () -> {}); - db.addNoteAndSync(ssoAccount, dbNote.getAccountId(), dbNote); - BrandedSnackbar.make(viewProvider.getView(), context.getString(R.string.action_note_restored, dbNote.getTitle()), Snackbar.LENGTH_SHORT) + db.addNoteAndSync(ssoAccount, dbNote.getNote().getAccountId(), dbNote); + BrandedSnackbar.make(viewProvider.getView(), context.getString(R.string.action_note_restored, dbNote.getNote().getTitle()), Snackbar.LENGTH_SHORT) .show(); }) .show(); 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 42a202cf..b158a908 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 @@ -45,6 +45,7 @@ import it.niedermann.owncloud.notes.persistence.entity.Category; import it.niedermann.owncloud.notes.persistence.entity.Converters; import it.niedermann.owncloud.notes.persistence.entity.Account; import it.niedermann.owncloud.notes.persistence.entity.Note; +import it.niedermann.owncloud.notes.persistence.entity.NoteWithCategory; import it.niedermann.owncloud.notes.persistence.entity.NotesListWidgetData; import it.niedermann.owncloud.notes.persistence.entity.SingleNoteWidgetData; import it.niedermann.owncloud.notes.persistence.migration.Migration_10_11; @@ -151,8 +152,8 @@ public abstract class NotesDatabase extends RoomDatabase { * * @param note Note */ - public long addNoteAndSync(SingleSignOnAccount ssoAccount, long accountId, Note note) { - Note entity = new Note(0, null, note.getModified(), note.getTitle(), note.getContent(), note.getFavorite(), note.getCategory(), note.getETag(), DBStatus.LOCAL_EDITED, accountId, generateNoteExcerpt(note.getContent(), note.getTitle()), 0); + public long addNoteAndSync(SingleSignOnAccount ssoAccount, long accountId, NoteWithCategory note) { + Note entity = new Note(0, null, note.getNote().getModified(), note.getNote().getTitle(), note.getNote().getContent(), note.getNote().getFavorite(), note.getCategory(), note.getNote().getETag(), DBStatus.LOCAL_EDITED, accountId, generateNoteExcerpt(note.getNote().getContent(), note.getNote().getTitle()), 0); long id = addNote(accountId, entity); notifyWidgets(); serverSyncHelper.scheduleSync(ssoAccount, true); @@ -193,7 +194,9 @@ public abstract class NotesDatabase extends RoomDatabase { public void moveNoteToAnotherAccount(SingleSignOnAccount ssoAccount, long oldAccountId, Note note, long newAccountId) { // Add new note - addNoteAndSync(ssoAccount, newAccountId, new Note(null, note.getModified(), note.getTitle(), note.getContent(), note.getFavorite(), note.getCategory(), null)); + NoteWithCategory noteWithCategory = new NoteWithCategory(); + noteWithCategory.setNote(new Note(null, note.getModified(), note.getTitle(), note.getContent(), note.getFavorite(), note.getCategory(), null)); + addNoteAndSync(ssoAccount, newAccountId, noteWithCategory); deleteNoteAndSync(ssoAccount, note.getId()); notifyWidgets(); @@ -251,25 +254,25 @@ public abstract class NotesDatabase extends RoomDatabase { * @param callback When the synchronization is finished, this callback will be invoked (optional). * @return changed {@link Note} if differs from database, otherwise the old {@link Note}. */ - public Note updateNoteAndSync(SingleSignOnAccount ssoAccount, @NonNull Account localAccount, @NonNull Note oldNote, @Nullable String newContent, @Nullable String newTitle, @Nullable ISyncCallback callback) { - Note newNote; + public NoteWithCategory updateNoteAndSync(SingleSignOnAccount ssoAccount, @NonNull Account localAccount, @NonNull NoteWithCategory oldNote, @Nullable String newContent, @Nullable String newTitle, @Nullable ISyncCallback callback) { + NoteWithCategory newNote = new NoteWithCategory(); if (newContent == null) { - newNote = new Note(oldNote.getId(), oldNote.getRemoteId(), oldNote.getModified(), oldNote.getTitle(), oldNote.getContent(), oldNote.getFavorite(), oldNote.getCategory(), oldNote.getETag(), DBStatus.LOCAL_EDITED, localAccount.getId(), oldNote.getExcerpt(), oldNote.getScrollY()); + newNote.setNote(new Note(oldNote.getNote().getId(), oldNote.getNote().getRemoteId(), oldNote.getNote().getModified(), oldNote.getNote().getTitle(), oldNote.getNote().getContent(), oldNote.getNote().getFavorite(), oldNote.getCategory(), oldNote.getNote().getETag(), DBStatus.LOCAL_EDITED, localAccount.getId(), oldNote.getNote().getExcerpt(), oldNote.getNote().getScrollY())); } else { final String title; if (newTitle != null) { title = newTitle; } else { - if (oldNote.getRemoteId() == null || oldNote.getRemoteId() == 0 || localAccount.getPreferredApiVersion() == null || localAccount.getPreferredApiVersion().compareTo(new ApiVersion("1.0", 0, 0)) < 0) { + if (oldNote.getNote().getRemoteId() == null || oldNote.getNote().getRemoteId() == 0 || localAccount.getPreferredApiVersion() == null || localAccount.getPreferredApiVersion().compareTo(new ApiVersion("1.0", 0, 0)) < 0) { title = NoteUtil.generateNonEmptyNoteTitle(newContent, context); } else { - title = oldNote.getTitle(); + title = oldNote.getNote().getTitle(); } } - newNote = new Note(oldNote.getId(), oldNote.getRemoteId(), Calendar.getInstance(), title, newContent, oldNote.getFavorite(), oldNote.getCategory(), oldNote.getETag(), DBStatus.LOCAL_EDITED, localAccount.getId(), generateNoteExcerpt(newContent, title), oldNote.getScrollY()); + newNote.setNote(new Note(oldNote.getNote().getId(), oldNote.getNote().getRemoteId(), Calendar.getInstance(), title, newContent, oldNote.getNote().getFavorite(), oldNote.getCategory(), oldNote.getNote().getETag(), DBStatus.LOCAL_EDITED, localAccount.getId(), generateNoteExcerpt(newContent, title), oldNote.getNote().getScrollY())); } - newNote.setCategoryId(getOrCreateCategoryIdByTitle(newNote.getAccountId(), newNote.getCategory())); - int rows = getNoteDao().updateNote(newNote); + newNote.getNote().setCategoryId(getOrCreateCategoryIdByTitle(newNote.getNote().getAccountId(), newNote.getCategory())); + int rows = getNoteDao().updateNote(newNote.getNote()); getCategoryDao().removeEmptyCategory(localAccount.getId()); // if data was changed, set new status and schedule sync (with callback); otherwise invoke callback directly. if (rows > 0) { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/dao/NoteDao.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/dao/NoteDao.java index 2e8a6b80..c0dbc074 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/dao/NoteDao.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/dao/NoteDao.java @@ -61,8 +61,8 @@ public interface NoteDao { @Query("UPDATE NOTE SET scrollY = :scrollY WHERE id = :id") void updateScrollY(long id, int scrollY); - @Query("SELECT * FROM NOTE WHERE id = :id AND accountId = :accountId AND status != :accountId") - Note getNote(long accountId, long id); + @Query("SELECT NOTE.*, CATEGORY.title as 'category' FROM NOTE INNER JOIN CATEGORY ON categoryId = CATEGORY.id WHERE NOTE.id = :id AND NOTE.accountId = :accountId AND status != :accountId") + NoteWithCategory getNoteWithCategory(long accountId, long id); @Query("UPDATE NOTE SET status = :status WHERE id = :id") void updateStatus(long id, DBStatus status); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/NoteWithCategory.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/NoteWithCategory.java index e770b385..a82f6ebc 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/NoteWithCategory.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/NoteWithCategory.java @@ -2,9 +2,12 @@ package it.niedermann.owncloud.notes.persistence.entity; import androidx.room.Embedded; +import java.io.Serializable; + +import it.niedermann.owncloud.notes.shared.model.DBStatus; import it.niedermann.owncloud.notes.shared.model.Item; -public class NoteWithCategory implements Item { +public class NoteWithCategory implements Serializable, Item { @Embedded private Note note; private String category; diff --git a/app/src/main/java/it/niedermann/owncloud/notes/widget/singlenote/SingleNoteWidgetFactory.java b/app/src/main/java/it/niedermann/owncloud/notes/widget/singlenote/SingleNoteWidgetFactory.java index b2c5386c..3a729484 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/widget/singlenote/SingleNoteWidgetFactory.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/widget/singlenote/SingleNoteWidgetFactory.java @@ -16,6 +16,7 @@ import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.edit.EditNoteActivity; import it.niedermann.owncloud.notes.persistence.NotesDatabase; import it.niedermann.owncloud.notes.persistence.entity.Note; +import it.niedermann.owncloud.notes.persistence.entity.NoteWithCategory; import it.niedermann.owncloud.notes.persistence.entity.SingleNoteWidgetData; import it.niedermann.owncloud.notes.preferences.DarkModeSetting; import it.niedermann.owncloud.notes.shared.util.MarkDownUtil; @@ -29,7 +30,7 @@ public class SingleNoteWidgetFactory implements RemoteViewsService.RemoteViewsFa private final int appWidgetId; private NotesDatabase db; - private Note note; + private NoteWithCategory note; private boolean darkModeActive = false; private static final String TAG = SingleNoteWidget.class.getSimpleName(); @@ -61,7 +62,7 @@ public class SingleNoteWidgetFactory implements RemoteViewsService.RemoteViewsFa if (data != null) { final long noteId = data.getNoteId(); Log.v(TAG, "Fetch note with id " + noteId); - note = db.getNoteDao().getNote(data.getAccountId(), noteId); + note = db.getNoteDao().getNoteWithCategory(data.getAccountId(), noteId); if (note == null) { Log.e(TAG, "Error: note not found"); @@ -103,18 +104,18 @@ public class SingleNoteWidgetFactory implements RemoteViewsService.RemoteViewsFa final Intent fillInIntent = new Intent(); final Bundle extras = new Bundle(); - extras.putLong(EditNoteActivity.PARAM_NOTE_ID, note.getId()); - extras.putLong(EditNoteActivity.PARAM_ACCOUNT_ID, note.getAccountId()); + extras.putLong(EditNoteActivity.PARAM_NOTE_ID, note.getNote().getId()); + extras.putLong(EditNoteActivity.PARAM_ACCOUNT_ID, note.getNote().getAccountId()); fillInIntent.putExtras(extras); if (darkModeActive) { note_content = new RemoteViews(context.getPackageName(), R.layout.widget_single_note_content_dark); note_content.setOnClickFillInIntent(R.id.single_note_content_tv_dark, fillInIntent); - note_content.setTextViewText(R.id.single_note_content_tv_dark, parseCompat(markdownProcessor, note.getContent())); + note_content.setTextViewText(R.id.single_note_content_tv_dark, parseCompat(markdownProcessor, note.getNote().getContent())); } else { note_content = new RemoteViews(context.getPackageName(), R.layout.widget_single_note_content); note_content.setOnClickFillInIntent(R.id.single_note_content_tv, fillInIntent); - note_content.setTextViewText(R.id.single_note_content_tv, parseCompat(markdownProcessor, note.getContent())); + note_content.setTextViewText(R.id.single_note_content_tv, parseCompat(markdownProcessor, note.getNote().getContent())); } return note_content; |