Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -375,6 +375,9 @@ protected void onNoteLoaded(Note note) {
note.setScrollY(scrollY);
}
onScroll(scrollY, oldScrollY);
if (listener != null) {
listener.onScroll(scrollY, oldScrollY);
}
});
}

Expand Down Expand Up @@ -538,5 +541,9 @@ enum Mode {
void onNoteUpdated(Note note);

void changeMode(@NonNull Mode mode, boolean reloadNote);

void onScroll(int scrollY, int oldScrollY);

void onSearchActive(boolean active);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.util.TypedValue;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
Expand All @@ -28,6 +29,7 @@
import androidx.fragment.app.Fragment;
import androidx.preference.PreferenceManager;

import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.nextcloud.android.sso.exceptions.NextcloudFilesAppAccountNotFoundException;
import com.nextcloud.android.sso.exceptions.NoCurrentAccountSelectedException;
import com.nextcloud.android.sso.helper.SingleAccountHelper;
Expand All @@ -50,6 +52,7 @@
import it.niedermann.owncloud.notes.persistence.entity.Account;
import it.niedermann.owncloud.notes.persistence.entity.Note;
import it.niedermann.owncloud.notes.shared.model.NavigationCategory;
import it.niedermann.owncloud.notes.shared.util.ExtendedFabUtil;
import it.niedermann.owncloud.notes.shared.util.NoteUtil;
import it.niedermann.owncloud.notes.shared.util.ShareUtil;

Expand Down Expand Up @@ -109,6 +112,7 @@ protected void onCreate(final Bundle savedInstanceState) {
setSupportActionBar(binding.toolbar);
binding.toolbar.setOnClickListener((v) -> fragment.showEditTitleDialog());
setImeInsets();
setupFabs();

getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
@Override
Expand Down Expand Up @@ -245,8 +249,61 @@ private void replaceFragment() {
} else {
binding.toolbar.setVisibility(View.VISIBLE);
}
updateFabVisibility();
}

private void setupFabs() {
binding.fabEdit.setOnClickListener(v -> changeMode(Mode.EDIT, false));
binding.fabDirectEdit.setOnClickListener(v -> changeMode(Mode.DIRECT_EDIT, false));
binding.fabPreview.setOnClickListener(v -> changeMode(Mode.PREVIEW, false));
}

private void updateFabVisibility() {
final boolean directEditEnabled = isDirectEditEnabled();

binding.fabEdit.hide();
binding.fabDirectEdit.hide();
binding.fabPreview.hide();

final var margin1x = getResources().getDimensionPixelSize(R.dimen.spacer_2x);
final var paramsEdit = (androidx.coordinatorlayout.widget.CoordinatorLayout.LayoutParams) binding.fabEdit.getLayoutParams();
final var paramsPreview = (androidx.coordinatorlayout.widget.CoordinatorLayout.LayoutParams) binding.fabPreview.getLayoutParams();

if (fragment instanceof NotePreviewFragment && !(fragment instanceof NoteReadonlyFragment)) {
if (directEditEnabled) {
binding.fabDirectEdit.show();
binding.fabEdit.show();
paramsEdit.setMargins(margin1x, margin1x, margin1x, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 88, getResources().getDisplayMetrics()));
} else {
binding.fabEdit.show();
paramsEdit.setMargins(margin1x, margin1x, margin1x, margin1x);
}
} else if (fragment instanceof NoteEditFragment || fragment instanceof NoteDirectEditFragment) {
binding.fabPreview.show();
if (fragment instanceof NoteDirectEditFragment) {
paramsPreview.setMargins(margin1x, margin1x, margin1x, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 64, getResources().getDisplayMetrics()));
} else {
paramsPreview.setMargins(margin1x, margin1x, margin1x, margin1x);
}
}
binding.fabEdit.setLayoutParams(paramsEdit);
binding.fabPreview.setLayoutParams(paramsPreview);
}

private boolean isDirectEditEnabled() {
final long accountId = getAccountId();
final Account account = repo.getAccountById(accountId);
final boolean directEditRemotelyAvailable = account != null && account.isDirectEditingAvailable();
final var preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
return preferences.getBoolean(getString(R.string.pref_key_enable_direct_edit), true) && directEditRemotelyAvailable;
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
menu.findItem(R.id.menu_preview).setVisible(false);
menu.findItem(R.id.menu_edit).setVisible(false);
return super.onPrepareOptionsMenu(menu);
}

/**
* Returns the preferred mode for the account. If the mode is "remember last" the last mode is returned.
Expand Down Expand Up @@ -449,12 +506,52 @@ public void onAccountPicked(@NonNull Account account) {
fragment.moveNote(account);
}

@Override
public void onSearchActive(boolean active) {
if (active) {
binding.fabEdit.hide();
binding.fabDirectEdit.hide();
binding.fabPreview.hide();
} else {
updateFabVisibility();
}
}

@Override
public void onScroll(int scrollY, int oldScrollY) {
if (isFabActive(binding.fabEdit)) {
ExtendedFabUtil.toggleVisibilityOnScroll(binding.fabEdit, scrollY, oldScrollY);
}
if (isFabActive(binding.fabDirectEdit)) {
ExtendedFabUtil.toggleVisibilityOnScroll(binding.fabDirectEdit, scrollY, oldScrollY);
}
if (isFabActive(binding.fabPreview)) {
ExtendedFabUtil.toggleVisibilityOnScroll(binding.fabPreview, scrollY, oldScrollY);
}
}

private boolean isFabActive(FloatingActionButton fab) {
final boolean directEditEnabled = isDirectEditEnabled();

if (fab == binding.fabEdit) {
return (fragment instanceof NotePreviewFragment && !(fragment instanceof NoteReadonlyFragment));
} else if (fab == binding.fabDirectEdit) {
return (fragment instanceof NotePreviewFragment && directEditEnabled);
} else if (fab == binding.fabPreview) {
return (fragment instanceof NoteEditFragment || fragment instanceof NoteDirectEditFragment);
}
return false;
}

@Override
public void applyBrand(int color) {
final var util = BrandingUtil.of(color, this);
util.platform.themeStatusBar(this);
util.material.themeToolbar(binding.toolbar);
util.platform.colorViewBackground(getWindow().getDecorView());
util.platform.colorViewBackground(binding.getRoot());
util.material.themeFAB(binding.fabEdit);
util.material.themeFAB(binding.fabDirectEdit);
util.material.themeFAB(binding.fabPreview);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ import it.niedermann.owncloud.notes.persistence.entity.Note
import it.niedermann.owncloud.notes.persistence.sync.NotesAPI
import it.niedermann.owncloud.notes.shared.model.ApiVersion
import it.niedermann.owncloud.notes.shared.model.ISyncCallback
import it.niedermann.owncloud.notes.shared.util.ExtendedFabUtil
import it.niedermann.owncloud.notes.shared.util.rx.DisposableSet
import okio.IOException
import java.util.concurrent.TimeUnit
Expand Down Expand Up @@ -84,35 +83,24 @@ class NoteDirectEditFragment : BaseNoteFragment(), Branded {
): View? {
Log.d(TAG, "onCreateView() called")
_binding = FragmentNoteDirectEditBinding.inflate(inflater, container, false)
setupFab()
setupScrollDetection()
prepareWebView()
return binding?.root
}

@SuppressLint("ClickableViewAccessibility") // touch listener only for UI purposes, no need to handle click
private fun setupFab() {
binding?.run {
plainEditingFab.isExtended = false
ExtendedFabUtil.toggleExtendedOnLongClick(plainEditingFab)

// manually detect scroll as we can't get it from the webview (maybe with custom JS?)
noteWebview.setOnTouchListener { _, event ->
when (event.action) {
MotionEvent.ACTION_DOWN -> {
scrollStart = event.y.toInt()
}
MotionEvent.ACTION_UP -> {
val scrollEnd = event.y.toInt()
ExtendedFabUtil.toggleVisibilityOnScroll(
plainEditingFab,
scrollStart,
scrollEnd,
)
}
@SuppressLint("ClickableViewAccessibility")
private fun setupScrollDetection() {
binding?.noteWebview?.setOnTouchListener { _, event ->
when (event.action) {
MotionEvent.ACTION_DOWN -> {
scrollStart = event.y.toInt()
}
MotionEvent.ACTION_UP -> {
val scrollEnd = event.y.toInt()
listener?.onScroll(scrollStart, scrollEnd)
}
return@setOnTouchListener false
}
plainEditingFab.setOnClickListener { switchToPlainEdit() }
return@setOnTouchListener false
}
}

Expand Down Expand Up @@ -218,7 +206,7 @@ class NoteDirectEditFragment : BaseNoteFragment(), Branded {
private fun handleLoadError() {
binding?.run {
val snackbar = BrandedSnackbar.make(
plainEditingFab,
root,
getString(R.string.direct_editing_error),
Snackbar.LENGTH_INDEFINITE,
)
Expand Down Expand Up @@ -328,7 +316,6 @@ class NoteDirectEditFragment : BaseNoteFragment(), Branded {
val util = BrandingUtil.of(color, requireContext())

binding?.run {
util.material.themeExtendedFAB(plainEditingFab)
util.platform.colorCircularProgressBar(progress, ColorRole.PRIMARY)
}
}
Expand Down Expand Up @@ -398,7 +385,6 @@ class NoteDirectEditFragment : BaseNoteFragment(), Branded {
binding?.run {
progress.isVisible = loading
noteWebview.isVisible = !loading
plainEditingFab.isVisible = !loading
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
import androidx.annotation.Nullable;
import androidx.preference.PreferenceManager;

import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.nextcloud.android.sso.helper.SingleAccountHelper;
import com.owncloud.android.lib.common.utils.Log_OC;
Expand Down Expand Up @@ -82,8 +81,6 @@ public void onCreate(@Nullable Bundle savedInstanceState) {
@Override
public void onPrepareOptionsMenu(@NonNull Menu menu) {
super.onPrepareOptionsMenu(menu);
menu.findItem(R.id.menu_edit).setVisible(false);
menu.findItem(R.id.menu_preview).setVisible(true);
}

@Override
Expand Down Expand Up @@ -114,16 +111,6 @@ protected FloatingActionButton getSearchPrevButton() {
return binding.searchPrev;
}

@Override
protected @NonNull ExtendedFloatingActionButton getDirectEditingButton() {
return binding.directEditing;
}

protected ExtendedFloatingActionButton getNormalEditButton() {
// the edit fragment does not have a button
return null;
}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@
import androidx.preference.PreferenceManager;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener;

import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.nextcloud.android.sso.helper.SingleAccountHelper;
import com.owncloud.android.lib.common.utils.Log_OC;
Expand Down Expand Up @@ -57,12 +56,6 @@ public class NotePreviewFragment extends SearchableBaseNoteFragment implements O
@Override
public void onPrepareOptionsMenu(@NonNull Menu menu) {
super.onPrepareOptionsMenu(menu);
menu.findItem(R.id.menu_edit).setVisible(true);
if(getNormalEditButton().getVisibility() == View.VISIBLE) {
menu.findItem(R.id.menu_edit).setVisible(false);
}

menu.findItem(R.id.menu_preview).setVisible(false);
}

@Override
Expand Down Expand Up @@ -91,16 +84,6 @@ protected FloatingActionButton getSearchPrevButton() {
return binding.searchPrev;
}

@Override
protected @NonNull ExtendedFloatingActionButton getDirectEditingButton() {
return binding.directEditing;
}

@Override
protected ExtendedFloatingActionButton getNormalEditButton() {
return binding.edit;
}

@Override
protected Layout getLayout() {
binding.singleNoteContent.onPreDraw();
Expand Down
Loading