From ff19626d31db0a8df0734463cbf437ec0e3857f3 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Mon, 4 Aug 2025 15:18:24 +0200 Subject: [PATCH 1/2] fix lifecycle calls thus onNoteUpdated will get note always Signed-off-by: alperozturk --- .../owncloud/notes/edit/BaseNoteFragment.java | 110 +++++++++++------- .../owncloud/notes/edit/EditNoteActivity.java | 1 - 2 files changed, 69 insertions(+), 42 deletions(-) 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 a945416b6..0bf99b3e3 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 @@ -98,54 +98,82 @@ public void onAttach(@NonNull Context context) { @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - executor.submit(() -> { + setHasOptionsMenu(true); + + executor.execute(() -> { try { - final var ssoAccount = SingleAccountHelper.getCurrentSingleSignOnAccount(requireContext().getApplicationContext()); - this.localAccount = repo.getAccountByName(ssoAccount.name); - - if (savedInstanceState == null) { - final long id = requireArguments().getLong(PARAM_NOTE_ID); - if (id > 0) { - final long accountId = requireArguments().getLong(PARAM_ACCOUNT_ID); - if (accountId > 0) { - /* Switch account if account id has been provided */ - this.localAccount = repo.getAccountById(accountId); - SingleAccountHelper.commitCurrentAccount(requireContext().getApplicationContext(), localAccount.getAccountName()); - } - isNew = false; - note = originalNote = repo.getNoteById(id); - requireActivity().runOnUiThread(() -> onNoteLoaded(note)); - requireActivity().invalidateOptionsMenu(); - } else { - final var paramNote = (Note) requireArguments().getSerializable(PARAM_NEWNOTE); - final var content = requireArguments().getString(PARAM_CONTENT); - if (paramNote == 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, null, Calendar.getInstance(), NoteUtil.generateNoteTitle(content), content, getString(R.string.category_readonly), false, null, DBStatus.VOID, -1, "", 0, false, false); - requireActivity().runOnUiThread(() -> onNoteLoaded(note)); - requireActivity().invalidateOptionsMenu(); - } - } else { - paramNote.setStatus(DBStatus.LOCAL_EDITED); - note = repo.addNote(localAccount.getId(), paramNote); - originalNote = null; - requireActivity().runOnUiThread(() -> onNoteLoaded(note)); - requireActivity().invalidateOptionsMenu(); - } - } + initializeAccount(); + + if (savedInstanceState != null) { + loadFromSavedState(savedInstanceState); } else { - note = (Note) savedInstanceState.getSerializable(SAVEDKEY_NOTE); - originalNote = (Note) savedInstanceState.getSerializable(SAVEDKEY_ORIGINAL_NOTE); - requireActivity().runOnUiThread(() -> onNoteLoaded(note)); - requireActivity().invalidateOptionsMenu(); + loadFromArguments(); } + + requireActivity().runOnUiThread(() -> { + onNoteLoaded(note); + requireActivity().invalidateOptionsMenu(); + + if (listener != null) { + listener.onNoteUpdated(note); + } + }); } catch (NextcloudFilesAppAccountNotFoundException | NoCurrentAccountSelectedException e) { Log_OC.e(TAG, e.getLocalizedMessage()); } }); - setHasOptionsMenu(true); + } + + private void initializeAccount() throws NextcloudFilesAppAccountNotFoundException, NoCurrentAccountSelectedException { + final var ssoAccount = SingleAccountHelper.getCurrentSingleSignOnAccount(requireContext().getApplicationContext()); + this.localAccount = repo.getAccountByName(ssoAccount.name); + } + + private void loadFromSavedState(Bundle savedInstanceState) { + note = (Note) savedInstanceState.getSerializable(SAVEDKEY_NOTE); + originalNote = (Note) savedInstanceState.getSerializable(SAVEDKEY_ORIGINAL_NOTE); + } + + private void loadFromArguments() { + final long noteId = requireArguments().getLong(PARAM_NOTE_ID); + + if (noteId > 0) { + loadExistingNote(noteId); + } else { + createNewNote(); + } + } + + private void loadExistingNote(long noteId) { + // Switch account if provided + final long accountId = requireArguments().getLong(PARAM_ACCOUNT_ID); + if (accountId > 0) { + this.localAccount = repo.getAccountById(accountId); + SingleAccountHelper.commitCurrentAccount(requireContext().getApplicationContext(), localAccount.getAccountName()); + } + + isNew = false; + note = originalNote = repo.getNoteById(noteId); + } + + private void createNewNote() { + final var paramNote = (Note) requireArguments().getSerializable(PARAM_NEWNOTE); + final var content = requireArguments().getString(PARAM_CONTENT); + + if (paramNote != null) { + // Create from provided note + paramNote.setStatus(DBStatus.LOCAL_EDITED); + note = repo.addNote(localAccount.getId(), paramNote); + originalNote = null; + } else if (content != null) { + // Create from content string + note = new Note(-1, null, Calendar.getInstance(), + NoteUtil.generateNoteTitle(content), content, + getString(R.string.category_readonly), false, null, + DBStatus.VOID, -1, "", 0, false, false); + } else { + throw new IllegalArgumentException("Missing required parameters: noteId, newNote, or content"); + } } @Nullable 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 2c69fa1ba..3beae2cdc 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 @@ -95,7 +95,6 @@ protected void onCreate(final Bundle savedInstanceState) { binding = ActivityEditBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); - setSupportActionBar(binding.toolbar); if (savedInstanceState == null) { launchNoteFragment(); From f7fd4109d55b6cc75a079831314f7ea191244524 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Mon, 4 Aug 2025 16:04:07 +0200 Subject: [PATCH 2/2] npe check Signed-off-by: alperozturk --- .../owncloud/notes/persistence/DirectEditingRepository.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/DirectEditingRepository.kt b/app/src/main/java/it/niedermann/owncloud/notes/persistence/DirectEditingRepository.kt index 8e8ece16c..3376dfed6 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/DirectEditingRepository.kt +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/DirectEditingRepository.kt @@ -40,6 +40,10 @@ class DirectEditingRepository private constructor(private val applicationContext return notesPath .flatMap { notesPath -> val filesAPI = apiProvider.getFilesAPI(applicationContext, account) + if (filesAPI == null) { + return@flatMap null + } + Single.fromCallable { val call = filesAPI.getDirectEditingUrl(