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 54f23cf50..01acdda3c 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 @@ -248,7 +248,7 @@ public boolean onOptionsItemSelected(MenuItem item) { return true; } else if (itemId == R.id.menu_favorite) { note.setFavorite(!note.getFavorite()); - repo.toggleFavoriteAndSync(localAccount, note.getId()); + repo.toggleFavoriteAndSync(localAccount, note); listener.onNoteUpdated(note); prepareFavoriteOption(item); return true; 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 c94f2ba44..29f40c5e9 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 @@ -783,8 +783,15 @@ public void onNoteClick(int position, View v) { @Override public void onNoteFavoriteClick(int position, View view) { - final var toggleLiveData = mainViewModel.toggleFavoriteAndSync(((Note) adapter.getItem(position)).getId()); - toggleLiveData.observe(this, (next) -> toggleLiveData.removeObservers(this)); + if (!(adapter.getItem(position) instanceof Note note)) { + return; + } + + final var toggleLiveData = mainViewModel.toggleFavoriteAndSync(note); + toggleLiveData.observe(this, (next) -> {{ + toggleLiveData.removeObservers(this); + adapter.notifyItemChanged(position); + }}); } @Override diff --git a/app/src/main/java/it/niedermann/owncloud/notes/main/MainViewModel.java b/app/src/main/java/it/niedermann/owncloud/notes/main/MainViewModel.java index a40a6f715..183e659ea 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/main/MainViewModel.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/main/MainViewModel.java @@ -513,16 +513,15 @@ public LiveData moveNoteToAnotherAccount(Account account, long noteId) { }); } - public LiveData toggleFavoriteAndSync(long noteId) { - return switchMap(getCurrentAccount(), currentAccount -> { - if (currentAccount == null) { - return new MutableLiveData<>(null); - } else { - Log.v(TAG, "[toggleFavoriteAndSync] - currentAccount: " + currentAccount.getAccountName()); - repo.toggleFavoriteAndSync(currentAccount, noteId); - return new MutableLiveData<>(null); - } - }); + public LiveData toggleFavoriteAndSync(Note note) { + final var currentAccount = getCurrentAccount().getValue(); + + if (currentAccount != null) { + Log.v(TAG, "[toggleFavoriteAndSync] - currentAccount: " + currentAccount.getAccountName()); + repo.toggleFavoriteAndSync(currentAccount, note); + } + + return new MutableLiveData<>(null); } public LiveData deleteNoteAndSync(long id) { 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 4b9734d7f..05b7c4d34 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 @@ -101,7 +101,7 @@ public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) case ItemTouchHelper.RIGHT -> { viewHolder.setIsRecyclable(false); final var adapterNote = (Note) adapter.getItem(viewHolder.getLayoutPosition()); - final var toggleLiveData = mainViewModel.toggleFavoriteAndSync(adapterNote.getId()); + final var toggleLiveData = mainViewModel.toggleFavoriteAndSync(adapterNote); toggleLiveData.observe(lifecycleOwner, (next) -> toggleLiveData.removeObservers(lifecycleOwner)); } default -> { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesRepository.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesRepository.java index 172ebc5f9..5bd57540f 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesRepository.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesRepository.java @@ -12,6 +12,7 @@ import static androidx.lifecycle.Transformations.map; import static java.util.stream.Collectors.toMap; import static it.niedermann.owncloud.notes.edit.EditNoteActivity.ACTION_SHORTCUT; +import static it.niedermann.owncloud.notes.shared.util.ApiVersionUtil.getPreferredApiVersion; import static it.niedermann.owncloud.notes.shared.util.NoteUtil.generateNoteExcerpt; import static it.niedermann.owncloud.notes.widget.notelist.NoteListWidget.updateNoteListWidgets; import static it.niedermann.owncloud.notes.widget.singlenote.SingleNoteWidget.updateSingleNoteWidgets; @@ -47,6 +48,7 @@ import com.nextcloud.android.sso.exceptions.NoCurrentAccountSelectedException; import com.nextcloud.android.sso.helper.SingleAccountHelper; import com.nextcloud.android.sso.model.SingleSignOnAccount; +import com.owncloud.android.lib.common.utils.Log_OC; import java.util.ArrayList; import java.util.Calendar; @@ -539,10 +541,23 @@ public Map getIdMap(long accountId) { } @AnyThread - public void toggleFavoriteAndSync(Account account, long noteId) { + public void toggleFavoriteAndSync(Account account, Note note) { executor.submit(() -> { - db.getNoteDao().toggleFavorite(noteId); - scheduleSync(account, true); + try { + final var ssoAccount = AccountImporter.getSingleSignOnAccount(context, account.getAccountName()); + final var notesAPI = apiProvider.getNotesAPI(context, ssoAccount, getPreferredApiVersion(account.getApiVersion())); + note.setFavorite(!note.getFavorite()); + final var result = notesAPI.updateNote(note); + final var response = result.execute(); + if (response.isSuccessful()) { + final var updatedNote = response.body(); + if (updatedNote != null) { + scheduleSync(account, false); + } + } + } catch (Exception e) { + Log_OC.e(TAG, "toggleFavoriteAndSync: " + e); + } }); } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/NotesAPI.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/NotesAPI.java index 2cf077b90..9f0189931 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/NotesAPI.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/NotesAPI.java @@ -17,7 +17,9 @@ import com.nextcloud.android.sso.api.ParsedResponse; import java.util.Calendar; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; import io.reactivex.Observable; @@ -106,6 +108,21 @@ public Call createNote(Note note) { } } + public Call updateNote(@NonNull Note note) { + final Long remoteId = note.getRemoteId(); + if (remoteId == null) { + return null; + } + + if (ApiVersion.API_VERSION_1_0.equals(usedApiVersion)) { + return notesAPI_1_0.updateNote(remoteId, note); + } else if (ApiVersion.API_VERSION_0_2.equals(usedApiVersion)) { + return notesAPI_0_2.updateNote(remoteId, new Note_0_2(note)); + } else { + return null; + } + } + public Call editNote(@NonNull Note note) { final Long remoteId = note.getRemoteId(); if (remoteId == null) { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/NotesAPI_0_2.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/NotesAPI_0_2.java index 060cae353..9a26c0e83 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/NotesAPI_0_2.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/NotesAPI_0_2.java @@ -10,6 +10,7 @@ import com.nextcloud.android.sso.api.ParsedResponse; import java.util.List; +import java.util.Map; import io.reactivex.Observable; import it.niedermann.owncloud.notes.persistence.entity.Note; @@ -46,4 +47,7 @@ public interface NotesAPI_0_2 { @DELETE("notes/{remoteId}") Call deleteNote(@Path("remoteId") long noteId); + + @PUT("notes/{id}") + Call updateNote(@Path("id") long id, @Body NotesAPI.Note_0_2 note); } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/NotesAPI_1_0.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/NotesAPI_1_0.java index ea5d822c7..2a857c98f 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/NotesAPI_1_0.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/NotesAPI_1_0.java @@ -10,6 +10,7 @@ import com.nextcloud.android.sso.api.ParsedResponse; import java.util.List; +import java.util.Map; import io.reactivex.Observable; import it.niedermann.owncloud.notes.persistence.entity.Note; @@ -52,4 +53,7 @@ public interface NotesAPI_1_0 { @PUT("settings") Call putSettings(@Body NotesSettings settings); + + @PUT("notes/{id}") + Call updateNote(@Path("id") long id, @Body Note note); } diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 4af2b4973..c3f1deec2 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -6,6 +6,7 @@ +