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-10-10 14:03:03 +0300
committerStefan Niedermann <info@niedermann.it>2020-10-10 14:03:03 +0300
commit92430e8c7842749a49ff3ed41810017532391859 (patch)
tree1a9a8865199a8c9f70c6e0f226ffc8a3be047bce /app/src/main/java
parentd59748aa22444105bbb51e74813a49214c2f65ee (diff)
#831 Migrate from SQLiteOpenHelper to Room
Category handling
Diffstat (limited to 'app/src/main/java')
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/AppendToNoteActivity.java5
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/edit/BaseNoteFragment.java67
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/edit/EditNoteActivity.java8
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/edit/NoteEditFragment.java6
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/edit/NotePreviewFragment.java20
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/edit/NoteReadonlyFragment.java8
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java2
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/main/MultiSelectedActionModeCallback.java14
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/main/items/list/NotesListViewItemTouchHelper.java12
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesDatabase.java25
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/persistence/dao/NoteDao.java4
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/persistence/entity/NoteWithCategory.java5
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/widget/singlenote/SingleNoteWidgetFactory.java13
13 files changed, 100 insertions, 89 deletions
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;