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>2022-11-04 13:33:19 +0300
committerStefan Niedermann <info@niedermann.it>2022-11-12 11:02:24 +0300
commit20bb9481300d02baf9e7f286717e2ce6b3140d90 (patch)
treeae47f5c5b2bcb492e1b20e32e983bc05a45e3004
parent272bf451e8fd897689b2228588cc93c7a1b3a71d (diff)
Material 3: First steps
Signed-off-by: Stefan Niedermann <info@niedermann.it>
-rw-r--r--app/build.gradle2
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/accountswitcher/AccountSwitcherDialog.java11
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/branding/BrandedAlertDialogBuilder.java6
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/branding/BrandedSnackbar.java30
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/branding/BrandingUtil.java9
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/edit/title/EditTitleDialogFragment.java5
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/exception/ExceptionDialogFragment.java4
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java34
-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.java3
-rw-r--r--app/src/main/res/drawable/bg_navdrawer_item.xml6
-rw-r--r--app/src/main/res/layout/activity_exception.xml9
-rw-r--r--app/src/main/res/layout/activity_import_account.xml2
-rw-r--r--app/src/main/res/layout/activity_notes_list_view.xml6
-rw-r--r--app/src/main/res/layout/fragment_note_edit.xml10
-rw-r--r--app/src/main/res/layout/fragment_note_preview.xml10
-rw-r--r--app/src/main/res/values/styles.xml30
17 files changed, 134 insertions, 57 deletions
diff --git a/app/build.gradle b/app/build.gradle
index 0297229b..48677bf6 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -101,7 +101,7 @@ dependencies {
implementation 'androidx.recyclerview:recyclerview:1.2.1'
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
implementation 'androidx.work:work-runtime:2.7.1'
- implementation 'com.google.android.material:material:1.6.1'
+ implementation 'com.google.android.material:material:1.7.0'
// Database
implementation 'androidx.room:room-runtime:2.4.3'
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/accountswitcher/AccountSwitcherDialog.java b/app/src/main/java/it/niedermann/owncloud/notes/accountswitcher/AccountSwitcherDialog.java
index b15f6308..7d088afe 100644
--- a/app/src/main/java/it/niedermann/owncloud/notes/accountswitcher/AccountSwitcherDialog.java
+++ b/app/src/main/java/it/niedermann/owncloud/notes/accountswitcher/AccountSwitcherDialog.java
@@ -1,5 +1,7 @@
package it.niedermann.owncloud.notes.accountswitcher;
+import static it.niedermann.owncloud.notes.branding.BrandingUtil.applyBrandToLayerDrawable;
+
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
@@ -8,14 +10,11 @@ import android.net.Uri;
import android.os.Bundle;
import androidx.annotation.NonNull;
-import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.DialogFragment;
-import androidx.lifecycle.LiveData;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
-
-import java.util.List;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import it.niedermann.owncloud.notes.R;
import it.niedermann.owncloud.notes.branding.BrandedDialogFragment;
@@ -24,8 +23,6 @@ import it.niedermann.owncloud.notes.manageaccounts.ManageAccountsActivity;
import it.niedermann.owncloud.notes.persistence.NotesRepository;
import it.niedermann.owncloud.notes.persistence.entity.Account;
-import static it.niedermann.owncloud.notes.branding.BrandingUtil.applyBrandToLayerDrawable;
-
/**
* Displays all available {@link Account} entries and provides basic operations for them, like adding or switching
*/
@@ -104,7 +101,7 @@ public class AccountSwitcherDialog extends BrandedDialogFragment {
dismiss();
});
- return new AlertDialog.Builder(requireContext())
+ return new MaterialAlertDialogBuilder(requireContext())
.setView(binding.getRoot())
.create();
}
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandedAlertDialogBuilder.java b/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandedAlertDialogBuilder.java
index c48e6298..a30c176f 100644
--- a/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandedAlertDialogBuilder.java
+++ b/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandedAlertDialogBuilder.java
@@ -1,5 +1,7 @@
package it.niedermann.owncloud.notes.branding;
+import static it.niedermann.owncloud.notes.branding.BrandingUtil.getSecondaryForegroundColorDependingOnTheme;
+
import android.content.Context;
import android.content.DialogInterface;
import android.widget.Button;
@@ -9,9 +11,9 @@ import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
-import static it.niedermann.owncloud.notes.branding.BrandingUtil.getSecondaryForegroundColorDependingOnTheme;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
-public class BrandedAlertDialogBuilder extends AlertDialog.Builder implements Branded {
+public class BrandedAlertDialogBuilder extends MaterialAlertDialogBuilder implements Branded {
protected AlertDialog dialog;
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandedSnackbar.java b/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandedSnackbar.java
index 8e3a4d9f..1c0ebf11 100644
--- a/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandedSnackbar.java
+++ b/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandedSnackbar.java
@@ -1,28 +1,46 @@
package it.niedermann.owncloud.notes.branding;
+import static it.niedermann.owncloud.notes.NotesApplication.isDarkThemeActive;
+import static it.niedermann.owncloud.notes.branding.BrandingUtil.getAttribute;
+import static it.niedermann.owncloud.notes.branding.BrandingUtil.readBrandMainColor;
+import static it.niedermann.owncloud.notes.shared.util.NotesColorUtil.contrastRatioIsSufficient;
+
import android.graphics.Color;
import android.view.View;
+import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
+import com.google.android.material.snackbar.BaseTransientBottomBar;
import com.google.android.material.snackbar.Snackbar;
-import it.niedermann.android.util.ColorUtil;
+import it.niedermann.owncloud.notes.R;
public class BrandedSnackbar {
@NonNull
- public static Snackbar make(@NonNull View view, @NonNull CharSequence text, @Snackbar.Duration int duration) {
+ public static Snackbar make(@NonNull View view, @NonNull CharSequence text, @BaseTransientBottomBar.Duration int duration) {
final var snackbar = Snackbar.make(view, text, duration);
- final int color = BrandingUtil.readBrandMainColor(view.getContext());
- snackbar.setActionTextColor(ColorUtil.INSTANCE.isColorDark(color) ? Color.WHITE : color);
+
+ @ColorInt final int backgroundColor = getAttribute(view.getContext(), R.attr.colorSurfaceInverse);
+ @ColorInt final int color = readBrandMainColor(view.getContext());
+
+ if (contrastRatioIsSufficient(backgroundColor, color)) {
+ snackbar.setActionTextColor(color);
+ } else {
+ if (isDarkThemeActive(view.getContext())) {
+ snackbar.setActionTextColor(Color.BLACK);
+ } else {
+ snackbar.setActionTextColor(Color.WHITE);
+ }
+ }
+
return snackbar;
}
@NonNull
- public static Snackbar make(@NonNull View view, @StringRes int resId, @Snackbar.Duration int duration) {
+ public static Snackbar make(@NonNull View view, @StringRes int resId, @BaseTransientBottomBar.Duration int duration) {
return make(view, view.getResources().getText(resId), duration);
}
-
} \ No newline at end of file
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandingUtil.java b/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandingUtil.java
index af2b4a43..44b34eb7 100644
--- a/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandingUtil.java
+++ b/app/src/main/java/it/niedermann/owncloud/notes/branding/BrandingUtil.java
@@ -7,9 +7,11 @@ import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.util.Log;
+import android.util.TypedValue;
import android.view.MenuItem;
import android.widget.EditText;
+import androidx.annotation.AttrRes;
import androidx.annotation.ColorInt;
import androidx.annotation.IdRes;
import androidx.annotation.NonNull;
@@ -161,4 +163,11 @@ public class BrandingUtil {
DrawableCompat.setTint(drawable, mainColor);
}
}
+
+ @ColorInt
+ public static int getAttribute(@NonNull Context context, @AttrRes int id) {
+ final var typedValue = new TypedValue();
+ context.getTheme().resolveAttribute(id, typedValue, true);
+ return typedValue.data;
+ }
}
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/edit/title/EditTitleDialogFragment.java b/app/src/main/java/it/niedermann/owncloud/notes/edit/title/EditTitleDialogFragment.java
index d372cdcb..4d2a770a 100644
--- a/app/src/main/java/it/niedermann/owncloud/notes/edit/title/EditTitleDialogFragment.java
+++ b/app/src/main/java/it/niedermann/owncloud/notes/edit/title/EditTitleDialogFragment.java
@@ -1,6 +1,5 @@
package it.niedermann.owncloud.notes.edit.title;
-import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
@@ -13,6 +12,8 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
+
import it.niedermann.owncloud.notes.R;
import it.niedermann.owncloud.notes.databinding.DialogEditTitleBinding;
@@ -53,7 +54,7 @@ public class EditTitleDialogFragment extends DialogFragment {
binding.title.setText(oldTitle);
}
- return new AlertDialog.Builder(getActivity())
+ return new MaterialAlertDialogBuilder(requireActivity())
.setTitle(R.string.change_note_title)
.setView(dialogView)
.setCancelable(true)
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/exception/ExceptionDialogFragment.java b/app/src/main/java/it/niedermann/owncloud/notes/exception/ExceptionDialogFragment.java
index cfaa543d..ca242a7f 100644
--- a/app/src/main/java/it/niedermann/owncloud/notes/exception/ExceptionDialogFragment.java
+++ b/app/src/main/java/it/niedermann/owncloud/notes/exception/ExceptionDialogFragment.java
@@ -10,6 +10,8 @@ import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatDialogFragment;
import androidx.fragment.app.DialogFragment;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
+
import java.util.ArrayList;
import it.niedermann.android.util.ClipboardUtil;
@@ -62,7 +64,7 @@ public class ExceptionDialogFragment extends AppCompatDialogFragment {
adapter.setThrowables(throwables);
- return new AlertDialog.Builder(requireActivity())
+ return new MaterialAlertDialogBuilder(requireActivity())
.setView(binding.getRoot())
.setTitle(R.string.error_dialog_title)
.setPositiveButton(android.R.string.copy, (a, b) -> ClipboardUtil.INSTANCE.copyToClipboard(requireContext(), getString(R.string.simple_exception), "```\n" + debugInfos + "\n```"))
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 1c901c21..046f0e7d 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
@@ -29,7 +29,6 @@ import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBarDrawerToggle;
-import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.view.ActionMode;
import androidx.appcompat.widget.SearchView;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
@@ -48,6 +47,7 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import com.nextcloud.android.sso.AccountImporter;
@@ -175,7 +175,7 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A
runOnUiThread(() -> mainViewModel.postCurrentAccount(account));
} catch (NextcloudFilesAppAccountNotFoundException e) {
// Verbose log output for https://github.com/stefan-niedermann/nextcloud-notes/issues/1256
- runOnUiThread(() -> new AlertDialog.Builder(this)
+ runOnUiThread(() -> new MaterialAlertDialogBuilder(this)
.setTitle(NextcloudFilesAppAccountNotFoundException.class.getSimpleName())
.setMessage(R.string.backup)
.setPositiveButton(R.string.simple_backup, (a, b) -> executor.submit(() -> {
@@ -218,6 +218,7 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A
mainViewModel.getSyncErrors().observe(this, exceptions -> {
if (mainViewModel.containsNonInfrastructureRelatedItems(exceptions)) {
BrandedSnackbar.make(coordinatorLayout, R.string.error_synchronization, Snackbar.LENGTH_LONG)
+ .setAnchorView(binding.activityNotesListView.fabCreate)
.setAction(R.string.simple_more, v -> ExceptionDialogFragment.newInstance(exceptions)
.show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName()))
.show();
@@ -325,11 +326,14 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A
if (t instanceof IntendedOfflineException) {
Log.i(TAG, "Capabilities and notes not updated because " + nextAccount.getAccountName() + " is offline by intention.");
} else if (t instanceof NetworkErrorException) {
- BrandedSnackbar.make(coordinatorLayout, getString(R.string.error_sync, getString(R.string.error_no_network)), Snackbar.LENGTH_LONG).show();
+ BrandedSnackbar.make(coordinatorLayout, getString(R.string.error_sync, getString(R.string.error_no_network)), Snackbar.LENGTH_LONG)
+ .setAnchorView(binding.activityNotesListView.fabCreate)
+ .show();
} else {
BrandedSnackbar.make(coordinatorLayout, R.string.error_synchronization, Snackbar.LENGTH_LONG)
.setAction(R.string.simple_more, v -> ExceptionDialogFragment.newInstance(t)
.show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName()))
+ .setAnchorView(binding.activityNotesListView.fabCreate)
.show();
}
});
@@ -477,13 +481,18 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A
if (t instanceof IntendedOfflineException) {
Log.i(TAG, "Capabilities and notes not updated because " + currentAccount.getAccountName() + " is offline by intention.");
} else if (t instanceof NextcloudHttpRequestFailedException && ((NextcloudHttpRequestFailedException) t).getStatusCode() == HttpURLConnection.HTTP_UNAVAILABLE) {
- BrandedSnackbar.make(coordinatorLayout, R.string.error_maintenance_mode, Snackbar.LENGTH_LONG).show();
+ BrandedSnackbar.make(coordinatorLayout, R.string.error_maintenance_mode, Snackbar.LENGTH_LONG)
+ .setAnchorView(binding.activityNotesListView.fabCreate)
+ .show();
} else if (t instanceof NetworkErrorException) {
- BrandedSnackbar.make(coordinatorLayout, getString(R.string.error_sync, getString(R.string.error_no_network)), Snackbar.LENGTH_LONG).show();
+ BrandedSnackbar.make(coordinatorLayout, getString(R.string.error_sync, getString(R.string.error_no_network)), Snackbar.LENGTH_LONG)
+ .setAnchorView(binding.activityNotesListView.fabCreate)
+ .show();
} else {
BrandedSnackbar.make(coordinatorLayout, R.string.error_synchronization, Snackbar.LENGTH_LONG)
.setAction(R.string.simple_more, v -> ExceptionDialogFragment.newInstance(t)
.show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName()))
+ .setAnchorView(binding.activityNotesListView.fabCreate)
.show();
}
});
@@ -500,7 +509,7 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A
public void onSelectionChanged() {
super.onSelectionChanged();
if (tracker.hasSelection() && mActionMode == null) {
- mActionMode = startSupportActionMode(new MultiSelectedActionModeCallback(MainActivity.this, coordinatorLayout, mainViewModel, MainActivity.this, canMoveNoteToAnotherAccounts, tracker, getSupportFragmentManager()));
+ mActionMode = startSupportActionMode(new MultiSelectedActionModeCallback(MainActivity.this, coordinatorLayout, binding.activityNotesListView.fabCreate, mainViewModel, MainActivity.this, canMoveNoteToAnotherAccounts, tracker, getSupportFragmentManager()));
}
if (mActionMode != null) {
if (tracker.hasSelection()) {
@@ -515,7 +524,7 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A
}
);
- itemTouchHelper = new NotesListViewItemTouchHelper(this, mainViewModel, this, tracker, adapter, swipeRefreshLayout, coordinatorLayout, gridView);
+ itemTouchHelper = new NotesListViewItemTouchHelper(this, mainViewModel, this, tracker, adapter, swipeRefreshLayout, coordinatorLayout, binding.activityNotesListView.fabCreate, gridView);
itemTouchHelper.attachToRecyclerView(listView);
}
@@ -673,7 +682,8 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A
AccountImporter.onActivityResult(requestCode, resultCode, data, this, (ssoAccount) -> {
CapabilitiesWorker.update(this);
executor.submit(() -> {
- final var importSnackbar = BrandedSnackbar.make(coordinatorLayout, R.string.progress_import_indeterminate, Snackbar.LENGTH_INDEFINITE);
+ final var importSnackbar = BrandedSnackbar.make(coordinatorLayout, R.string.progress_import_indeterminate, Snackbar.LENGTH_INDEFINITE)
+ .setAnchorView(binding.activityNotesListView.fabCreate);
Log.i(TAG, "Added account: " + "name:" + ssoAccount.name + ", " + ssoAccount.url + ", userId" + ssoAccount.userId);
try {
Log.i(TAG, "Refreshing capabilities for " + ssoAccount.name);
@@ -715,11 +725,15 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A
runOnUiThread(() -> {
mainViewModel.postCurrentAccount(mainViewModel.getLocalAccountByAccountName(ssoAccount.name));
// TODO there is already a sync in progress and results in displaying a TokenMissMatchException snackbar which conflicts with this one
- coordinatorLayout.post(() -> BrandedSnackbar.make(coordinatorLayout, R.string.account_already_imported, Snackbar.LENGTH_LONG).show());
+ coordinatorLayout.post(() -> BrandedSnackbar.make(coordinatorLayout, R.string.account_already_imported, Snackbar.LENGTH_LONG)
+ .setAnchorView(binding.activityNotesListView.fabCreate)
+ .show());
});
} else if (e instanceof UnknownErrorException && e.getMessage() != null && e.getMessage().contains("No address associated with hostname")) {
// https://github.com/stefan-niedermann/nextcloud-notes/issues/1014
- runOnUiThread(() -> Snackbar.make(coordinatorLayout, R.string.you_have_to_be_connected_to_the_internet_in_order_to_add_an_account, Snackbar.LENGTH_LONG).show());
+ runOnUiThread(() -> Snackbar.make(coordinatorLayout, R.string.you_have_to_be_connected_to_the_internet_in_order_to_add_an_account, Snackbar.LENGTH_LONG)
+ .setAnchorView(binding.activityNotesListView.fabCreate)
+ .show());
} else {
e.printStackTrace();
runOnUiThread(() -> {
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 a76b2068..194dcbc8 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
@@ -42,6 +42,8 @@ public class MultiSelectedActionModeCallback implements Callback {
@NonNull
private final View view;
@NonNull
+ private final View anchorView;
+ @NonNull
private final MainViewModel mainViewModel;
@NonNull
private final LifecycleOwner lifecycleOwner;
@@ -52,9 +54,17 @@ public class MultiSelectedActionModeCallback implements Callback {
private final FragmentManager fragmentManager;
public MultiSelectedActionModeCallback(
- @NonNull Context context, @NonNull View view, @NonNull MainViewModel mainViewModel, @NonNull LifecycleOwner lifecycleOwner, boolean canMoveNoteToAnotherAccounts, @NonNull SelectionTracker<Long> tracker, @NonNull FragmentManager fragmentManager) {
+ @NonNull Context context,
+ @NonNull View view,
+ @NonNull View anchorView,
+ @NonNull MainViewModel mainViewModel,
+ @NonNull LifecycleOwner lifecycleOwner,
+ boolean canMoveNoteToAnotherAccounts,
+ @NonNull SelectionTracker<Long> tracker,
+ @NonNull FragmentManager fragmentManager) {
this.context = context;
this.view = view;
+ this.anchorView = anchorView;
this.mainViewModel = mainViewModel;
this.lifecycleOwner = lifecycleOwner;
this.canMoveNoteToAnotherAccounts = canMoveNoteToAnotherAccounts;
@@ -110,6 +120,7 @@ public class MultiSelectedActionModeCallback implements Callback {
? context.getString(R.string.action_note_deleted, fullNotes.get(0).getTitle())
: context.getResources().getQuantityString(R.plurals.bulk_notes_deleted, fullNotes.size(), fullNotes.size());
BrandedSnackbar.make(view, deletedSnackbarTitle, Snackbar.LENGTH_LONG)
+ .setAnchorView(anchorView)
.setAction(R.string.action_undo, (View v) -> {
for (final var deletedNote : fullNotes) {
final var undoLiveData = mainViewModel.addNoteAndSync(deletedNote);
@@ -119,6 +130,7 @@ public class MultiSelectedActionModeCallback implements Callback {
? context.getString(R.string.action_note_restored, fullNotes.get(0).getTitle())
: context.getResources().getQuantityString(R.plurals.bulk_notes_restored, fullNotes.size(), fullNotes.size());
BrandedSnackbar.make(view, restoreSnackbarTitle, Snackbar.LENGTH_SHORT)
+ .setAnchorView(anchorView)
.show();
})
.show();
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 d31bb2f3..bb93b7b7 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
@@ -38,6 +38,7 @@ public class NotesListViewItemTouchHelper extends ItemTouchHelper {
@NonNull ItemAdapter adapter,
@NonNull SwipeRefreshLayout swipeRefreshLayout,
@NonNull View view,
+ @NonNull View anchorView,
boolean gridView) {
super(new SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
private boolean swipeRefreshLayoutEnabled;
@@ -81,10 +82,12 @@ public class NotesListViewItemTouchHelper extends ItemTouchHelper {
deleteLiveData.observe(lifecycleOwner, (next) -> deleteLiveData.removeObservers(lifecycleOwner));
Log.v(TAG, "Item deleted through swipe ----------------------------------------------");
BrandedSnackbar.make(view, context.getString(R.string.action_note_deleted, dbNote.getTitle()), UNDO_DURATION)
+ .setAnchorView(anchorView)
.setAction(R.string.action_undo, (View v) -> {
final var undoLiveData = mainViewModel.addNoteAndSync(dbNote);
undoLiveData.observe(lifecycleOwner, (o) -> undoLiveData.removeObservers(lifecycleOwner));
BrandedSnackbar.make(view, context.getString(R.string.action_note_restored, dbNote.getTitle()), Snackbar.LENGTH_SHORT)
+ .setAnchorView(anchorView)
.show();
})
.show();
diff --git a/app/src/main/res/drawable/bg_navdrawer_item.xml b/app/src/main/res/drawable/bg_navdrawer_item.xml
index a366c0d2..008b2abb 100644
--- a/app/src/main/res/drawable/bg_navdrawer_item.xml
+++ b/app/src/main/res/drawable/bg_navdrawer_item.xml
@@ -10,7 +10,7 @@
<shape android:shape="rectangle">
<!-- value of color is irrelevant, but solid needs to be defined for mask to work -->
<solid android:color="@color/bg_highlighted" />
- <corners android:radius="@dimen/spacer_1hx" />
+ <corners android:radius="@dimen/spacer_5x" />
</shape>
</item>
@@ -21,14 +21,14 @@
<selector>
<item android:state_selected="true">
<shape android:shape="rectangle">
- <corners android:radius="@dimen/spacer_1hx" />
+ <corners android:radius="@dimen/spacer_5x" />
<solid android:color="@color/bg_highlighted" />
</shape>
</item>
<item>
<shape android:shape="rectangle">
- <corners android:radius="@dimen/spacer_1hx" />
+ <corners android:radius="@dimen/spacer_5x" />
</shape>
</item>
</selector>
diff --git a/app/src/main/res/layout/activity_exception.xml b/app/src/main/res/layout/activity_exception.xml
index f275a703..919f7dfd 100644
--- a/app/src/main/res/layout/activity_exception.xml
+++ b/app/src/main/res/layout/activity_exception.xml
@@ -74,7 +74,6 @@
</ScrollView>
<LinearLayout
- style="?android:buttonBarStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/spacer_2x"
@@ -84,7 +83,7 @@
<Button
android:id="@+id/close"
- style="?android:buttonBarButtonStyle"
+ style="@style/Widget.Material3.Button.TextButton"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight=".5"
@@ -93,16 +92,14 @@
<Button
android:id="@+id/copy"
- style="?android:buttonBarButtonStyle"
+ style="@style/Widget.Material3.Button"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginTop="6dp"
android:layout_marginBottom="6dp"
android:layout_weight=".5"
- android:background="@color/defaultBrand"
- android:foreground="?attr/selectableItemBackground"
android:text="@string/simple_copy"
- android:textColor="@color/fg_contrast"
+ app:backgroundTint="@color/defaultBrand"
tools:ignore="UnusedAttribute" />
</LinearLayout>
diff --git a/app/src/main/res/layout/activity_import_account.xml b/app/src/main/res/layout/activity_import_account.xml
index 7484a61b..85a0b217 100644
--- a/app/src/main/res/layout/activity_import_account.xml
+++ b/app/src/main/res/layout/activity_import_account.xml
@@ -38,7 +38,7 @@
<Button
android:id="@+id/add_button"
- style="@style/Widget.AppCompat.Button.Colored"
+ style="@style/Widget.Material3.Button.ElevatedButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/welcome_text"
diff --git a/app/src/main/res/layout/activity_notes_list_view.xml b/app/src/main/res/layout/activity_notes_list_view.xml
index 858c3a91..5286b2f0 100644
--- a/app/src/main/res/layout/activity_notes_list_view.xml
+++ b/app/src/main/res/layout/activity_notes_list_view.xml
@@ -139,7 +139,11 @@
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab_create"
- style="@style/fab"
+ style="?attr/floatingActionButtonPrimaryStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="end|bottom"
+ android:layout_margin="@dimen/spacer_2x"
android:contentDescription="@string/action_create"
android:title="@string/action_create"
app:backgroundTint="@color/defaultBrand"
diff --git a/app/src/main/res/layout/fragment_note_edit.xml b/app/src/main/res/layout/fragment_note_edit.xml
index c377998c..61d9000a 100644
--- a/app/src/main/res/layout/fragment_note_edit.xml
+++ b/app/src/main/res/layout/fragment_note_edit.xml
@@ -44,24 +44,26 @@
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/searchPrev"
- style="@style/fab"
+ style="?attr/floatingActionButtonSmallSecondaryStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:contentDescription="@string/simple_prev"
android:translationY="-56dp"
android:visibility="gone"
app:backgroundTint="@color/defaultBrand"
- app:fabSize="mini"
app:srcCompat="@drawable/ic_keyboard_arrow_up_white_24dp"
tools:visibility="visible" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/searchNext"
- style="@style/fab"
+ style="?attr/floatingActionButtonSmallSecondaryStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:contentDescription="@string/simple_next"
android:visibility="gone"
app:backgroundTint="@color/defaultBrand"
- app:fabSize="mini"
app:srcCompat="@drawable/ic_keyboard_arrow_down_white_24dp"
tools:visibility="visible" />
</androidx.coordinatorlayout.widget.CoordinatorLayout> \ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_note_preview.xml b/app/src/main/res/layout/fragment_note_preview.xml
index 0b660f8d..4f79beb4 100644
--- a/app/src/main/res/layout/fragment_note_preview.xml
+++ b/app/src/main/res/layout/fragment_note_preview.xml
@@ -40,24 +40,26 @@
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/searchPrev"
- style="@style/fab"
+ style="?attr/floatingActionButtonSmallSecondaryStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:contentDescription="@string/simple_prev"
android:translationY="-56dp"
android:visibility="gone"
app:backgroundTint="@color/defaultBrand"
- app:fabSize="mini"
app:srcCompat="@drawable/ic_keyboard_arrow_up_white_24dp"
tools:visibility="visible" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/searchNext"
- style="@style/fab"
+ style="?attr/floatingActionButtonSmallSecondaryStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:contentDescription="@string/simple_next"
android:visibility="gone"
app:backgroundTint="@color/defaultBrand"
- app:fabSize="mini"
app:srcCompat="@drawable/ic_keyboard_arrow_down_white_24dp"
tools:visibility="visible" />
</androidx.coordinatorlayout.widget.CoordinatorLayout> \ No newline at end of file
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index c3f28846..6a09ce60 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
- <style name="BaseTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar.Bridge">
+ <style name="BaseTheme" parent="Theme.Material3.DayNight.NoActionBar">
<item name="colorPrimary">@color/primary</item>
<item name="colorAccent">@color/accent</item>
<item name="android:actionModeBackground">?attr/colorPrimary</item>
@@ -11,6 +11,9 @@
<item name="toolbarStyle">@style/toolbarStyle</item>
<item name="android:statusBarColor">?attr/colorPrimary</item>
<item name="android:windowLightStatusBar">@bool/isDayMode</item>
+ <item name="android:textColorLink">?android:colorAccent</item>
+ <item name="materialAlertDialogTheme">@style/MaterialAlertDialogTheme</item>
+ <item name="tabStyle">@style/tabStyle</item>
</style>
<style name="AppTheme" parent="BaseTheme" />
@@ -20,20 +23,31 @@
<item name="android:textColorHighlight">@color/defaultTextHighlightBackground</item>
</style>
- <style name="toolbarStyle" parent="@style/Widget.AppCompat.Toolbar">
+ <style name="toolbarStyle" parent="@style/Widget.Material3.Toolbar">
<item name="android:background">?attr/colorPrimary</item>
</style>
- <style name="actionModeStyle" parent="@style/Widget.AppCompat.ActionMode">
+ <style name="actionModeStyle" parent="@style/Widget.Material3.ActionMode">
<item name="android:paddingStart">@dimen/spacer_activity_sides</item>
<item name="android:paddingEnd">@dimen/spacer_activity_sides</item>
</style>
- <style name="fab">
- <item name="android:layout_margin">16dp</item>
- <item name="android:layout_width">wrap_content</item>
- <item name="android:layout_height">wrap_content</item>
- <item name="android:layout_gravity">end|bottom</item>
+ <style name="tabStyle" parent="Widget.Material3.TabLayout">
+ <item name="backgroundColor">@android:color/transparent</item>
+ <item name="itemBackground">@android:color/transparent</item>
+ <item name="tabIndicatorColor">@android:color/transparent</item>
+ <item name="tabTextColor">?attr/colorAccent</item>
+ <item name="tabIconTint">?attr/colorAccent</item>
+ </style>
+
+ <style name="MaterialAlertDialogTheme" parent="ThemeOverlay.Material3.MaterialAlertDialog">
+ <item name="buttonBarPositiveButtonStyle">@style/buttonStyle</item>
+ <item name="buttonBarNegativeButtonStyle">@style/buttonStyle</item>
+ <item name="buttonBarNeutralButtonStyle">@style/buttonStyle</item>
+ </style>
+
+ <style name="buttonStyle" parent="Widget.Material3.Button.TextButton.Dialog">
+ <item name="android:textColor">?attr/colorAccent</item>
</style>
<style name="Theme.App.Starting" parent="Theme.SplashScreen">