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 15:45:45 +0300
committerStefan Niedermann <info@niedermann.it>2022-11-12 11:02:24 +0300
commit4f5e0b70ce2268fffdc858be8b4870004fc58574 (patch)
treee048f46359b2d78eeff7a7bf5bc4988ef1dd2ed0
parent7ee5b615878fcf4063c8a4f6474cb74922b58e03 (diff)
Material 3: Refactor settings dialog
Signed-off-by: Stefan Niedermann <info@niedermann.it>
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/branding/BrandingUtil.java52
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/edit/BaseNoteFragment.java33
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/edit/NoteEditFragment.java1
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/edit/NotePreviewFragment.java1
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java6
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountsActivity.java40
-rw-r--r--app/src/main/res/layout/dialog_edit_setting.xml37
7 files changed, 107 insertions, 63 deletions
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 2de58640..666a12be 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
@@ -1,10 +1,12 @@
package it.niedermann.owncloud.notes.branding;
+import static it.niedermann.owncloud.notes.NotesApplication.isDarkThemeActive;
+import static it.niedermann.owncloud.notes.shared.util.NotesColorUtil.contrastRatioIsSufficient;
+import static it.niedermann.owncloud.notes.shared.util.NotesColorUtil.contrastRatioIsSufficientBigAreas;
+
import android.content.Context;
-import android.content.SharedPreferences;
import android.content.res.ColorStateList;
import android.graphics.Color;
-import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.util.Log;
import android.util.TypedValue;
@@ -23,14 +25,13 @@ import androidx.lifecycle.LiveData;
import androidx.lifecycle.MediatorLiveData;
import androidx.preference.PreferenceManager;
+import com.google.android.material.textfield.TextInputLayout;
+
import it.niedermann.android.sharedpreferences.SharedPreferenceIntLiveData;
+import it.niedermann.android.util.ColorUtil;
import it.niedermann.owncloud.notes.NotesApplication;
import it.niedermann.owncloud.notes.R;
-
-import static it.niedermann.owncloud.notes.shared.util.NotesColorUtil.contrastRatioIsSufficient;
-import static it.niedermann.owncloud.notes.shared.util.NotesColorUtil.contrastRatioIsSufficientBigAreas;
-
-import com.google.android.material.textfield.TextInputLayout;
+import it.niedermann.owncloud.notes.shared.util.NotesColorUtil;
public class BrandingUtil {
@@ -158,6 +159,10 @@ public class BrandingUtil {
til.setErrorTextColor(colorDanger);
til.setBoxStrokeErrorColor(colorDanger);
til.setErrorIconTintList(colorDanger);
+ final var editText = til.getEditText();
+ if (editText != null) {
+ editText.setHighlightColor(getTextHighlightBackgroundColor(editText.getContext(), color, colorPrimary, colorAccent));
+ }
}
public static void tintMenuIcon(@NonNull MenuItem menuItem, @ColorInt int color) {
@@ -184,4 +189,37 @@ public class BrandingUtil {
context.getTheme().resolveAttribute(id, typedValue, true);
return typedValue.data;
}
+
+ @ColorInt
+ public static int getTextHighlightBackgroundColor(@NonNull Context context, @ColorInt int mainColor, @ColorInt int colorPrimary, @ColorInt int colorAccent) {
+ if (isDarkThemeActive(context)) { // Dark background
+ if (ColorUtil.INSTANCE.isColorDark(mainColor)) { // Dark brand color
+ if (NotesColorUtil.contrastRatioIsSufficient(mainColor, colorPrimary)) { // But also dark text
+ return mainColor;
+ } else {
+ return ContextCompat.getColor(context, R.color.defaultTextHighlightBackground);
+ }
+ } else { // Light brand color
+ if (NotesColorUtil.contrastRatioIsSufficient(mainColor, colorAccent)) { // But also dark text
+ return Color.argb(77, Color.red(mainColor), Color.green(mainColor), Color.blue(mainColor));
+ } else {
+ return ContextCompat.getColor(context, R.color.defaultTextHighlightBackground);
+ }
+ }
+ } else { // Light background
+ if (ColorUtil.INSTANCE.isColorDark(mainColor)) { // Dark brand color
+ if (NotesColorUtil.contrastRatioIsSufficient(mainColor, colorAccent)) { // But also dark text
+ return Color.argb(77, Color.red(mainColor), Color.green(mainColor), Color.blue(mainColor));
+ } else {
+ return ContextCompat.getColor(context, R.color.defaultTextHighlightBackground);
+ }
+ } else { // Light brand color
+ if (NotesColorUtil.contrastRatioIsSufficient(mainColor, colorPrimary)) { // But also dark text
+ return mainColor;
+ } else {
+ return ContextCompat.getColor(context, R.color.defaultTextHighlightBackground);
+ }
+ }
+ }
+ }
}
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 6a13d8b7..b524e2fb 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
@@ -370,39 +370,6 @@ public abstract class BaseNoteFragment extends BrandedFragment implements Catego
listener.close();
}
- @ColorInt
- protected static int getTextHighlightBackgroundColor(@NonNull Context context, @ColorInt int mainColor, @ColorInt int colorPrimary, @ColorInt int colorAccent) {
- if (isDarkThemeActive(context)) { // Dark background
- if (ColorUtil.INSTANCE.isColorDark(mainColor)) { // Dark brand color
- if (NotesColorUtil.contrastRatioIsSufficient(mainColor, colorPrimary)) { // But also dark text
- return mainColor;
- } else {
- return ContextCompat.getColor(context, R.color.defaultTextHighlightBackground);
- }
- } else { // Light brand color
- if (NotesColorUtil.contrastRatioIsSufficient(mainColor, colorAccent)) { // But also dark text
- return Color.argb(77, Color.red(mainColor), Color.green(mainColor), Color.blue(mainColor));
- } else {
- return ContextCompat.getColor(context, R.color.defaultTextHighlightBackground);
- }
- }
- } else { // Light background
- if (ColorUtil.INSTANCE.isColorDark(mainColor)) { // Dark brand color
- if (NotesColorUtil.contrastRatioIsSufficient(mainColor, colorAccent)) { // But also dark text
- return Color.argb(77, Color.red(mainColor), Color.green(mainColor), Color.blue(mainColor));
- } else {
- return ContextCompat.getColor(context, R.color.defaultTextHighlightBackground);
- }
- } else { // Light brand color
- if (NotesColorUtil.contrastRatioIsSufficient(mainColor, colorPrimary)) { // But also dark text
- return mainColor;
- } else {
- return ContextCompat.getColor(context, R.color.defaultTextHighlightBackground);
- }
- }
- }
- }
-
public interface NoteFragmentListener {
void close();
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 6733f4d3..3346024f 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
@@ -32,6 +32,7 @@ import it.niedermann.owncloud.notes.shared.model.ISyncCallback;
import it.niedermann.owncloud.notes.shared.util.DisplayUtils;
import static androidx.core.view.ViewCompat.isAttachedToWindow;
+import static it.niedermann.owncloud.notes.branding.BrandingUtil.getTextHighlightBackgroundColor;
import static it.niedermann.owncloud.notes.shared.util.NoteUtil.getFontSizeFromPreferences;
public class NoteEditFragment extends SearchableBaseNoteFragment {
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 9d26f500..902b704c 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
@@ -32,6 +32,7 @@ import it.niedermann.owncloud.notes.persistence.entity.Note;
import it.niedermann.owncloud.notes.shared.util.SSOUtil;
import static androidx.core.view.ViewCompat.isAttachedToWindow;
+import static it.niedermann.owncloud.notes.branding.BrandingUtil.getTextHighlightBackgroundColor;
import static it.niedermann.owncloud.notes.shared.util.NoteUtil.getFontSizeFromPreferences;
public class NotePreviewFragment extends SearchableBaseNoteFragment implements OnRefreshListener {
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 046f0e7d..846d28eb 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
@@ -7,6 +7,7 @@ import static android.view.View.VISIBLE;
import static it.niedermann.owncloud.notes.NotesApplication.isDarkThemeActive;
import static it.niedermann.owncloud.notes.NotesApplication.isGridViewEnabled;
import static it.niedermann.owncloud.notes.branding.BrandingUtil.getSecondaryForegroundColorDependingOnTheme;
+import static it.niedermann.owncloud.notes.branding.BrandingUtil.getTextHighlightBackgroundColor;
import static it.niedermann.owncloud.notes.shared.model.ENavigationCategoryType.DEFAULT_CATEGORY;
import static it.niedermann.owncloud.notes.shared.model.ENavigationCategoryType.FAVORITES;
import static it.niedermann.owncloud.notes.shared.model.ENavigationCategoryType.RECENT;
@@ -607,6 +608,11 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A
adapter.applyBrand(mainColor, textColor);
adapterCategories.applyBrand(mainColor, textColor);
invalidateOptionsMenu();
+
+ // FIXME doesn't work
+ final int colorPrimary = ContextCompat.getColor(this, R.color.primary);
+ final int colorAccent = ContextCompat.getColor(this, R.color.accent);
+ activityBinding.searchText.setHighlightColor(getTextHighlightBackgroundColor(this, mainColor, colorPrimary, colorAccent));
}
@Override
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountsActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountsActivity.java
index 6be9397b..ca04c284 100644
--- a/app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountsActivity.java
+++ b/app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountsActivity.java
@@ -1,14 +1,13 @@
package it.niedermann.owncloud.notes.manageaccounts;
+import static it.niedermann.owncloud.notes.branding.BrandingUtil.applyBrandToEditTextInputLayout;
+import static it.niedermann.owncloud.notes.branding.BrandingUtil.readBrandMainColorLiveData;
import static it.niedermann.owncloud.notes.shared.util.ApiVersionUtil.getPreferredApiVersion;
import android.accounts.NetworkErrorException;
import android.os.Bundle;
import android.util.TypedValue;
-import android.view.ViewGroup;
-import android.widget.EditText;
-import android.widget.FrameLayout;
-import android.widget.ProgressBar;
+import android.view.View;
import android.widget.Toast;
import androidx.annotation.AttrRes;
@@ -30,6 +29,7 @@ import it.niedermann.owncloud.notes.LockedActivity;
import it.niedermann.owncloud.notes.R;
import it.niedermann.owncloud.notes.branding.DeleteAlertDialogBuilder;
import it.niedermann.owncloud.notes.databinding.ActivityManageAccountsBinding;
+import it.niedermann.owncloud.notes.databinding.DialogEditSettingBinding;
import it.niedermann.owncloud.notes.exception.ExceptionDialogFragment;
import it.niedermann.owncloud.notes.persistence.NotesRepository;
import it.niedermann.owncloud.notes.persistence.entity.Account;
@@ -132,15 +132,21 @@ public class ManageAccountsActivity extends LockedActivity implements IManageAcc
private void changeAccountSetting(@NonNull Account localAccount, @StringRes int title, @StringRes int message, @StringRes int successMessage, @NonNull Function<NotesSettings, String> propertyExtractor, @NonNull Function<String, NotesSettings> settingsFactory) {
final var repository = NotesRepository.getInstance(getApplicationContext());
- final var editText = new EditText(this);
- final var wrapper = createDialogViewWrapper();
+ final var binding = DialogEditSettingBinding.inflate(getLayoutInflater());
+ final var mainColor$ = readBrandMainColorLiveData(this);
+ mainColor$.observe(this, color -> {
+ mainColor$.removeObservers(this);
+ applyBrandToEditTextInputLayout(color, binding.inputWrapper);
+ binding.progress.setIndicatorColor(color);
+ });
+
final var dialog = new MaterialAlertDialogBuilder(this)
.setTitle(title)
.setMessage(message)
- .setView(wrapper)
+ .setView(binding.getRoot())
.setNeutralButton(android.R.string.cancel, null)
.setPositiveButton(R.string.action_edit_save, (v, d) -> {
- final var property = editText.getText().toString();
+ final var property = binding.property.getText().toString();
executor.execute(() -> {
try {
final var putSettingsCall = repository.putServerSettings(AccountImporter.getSingleSignOnAccount(this, localAccount.getAccountName()), settingsFactory.apply(property), getPreferredApiVersion(localAccount.getApiVersion()));
@@ -174,9 +180,9 @@ public class ManageAccountsActivity extends LockedActivity implements IManageAcc
runOnUiThread(() -> {
final var body = response.body();
if (response.isSuccessful() && body != null) {
- wrapper.removeAllViews();
- editText.setText(propertyExtractor.apply(body));
- wrapper.addView(editText);
+ binding.getRoot().removeView(binding.progress);
+ binding.property.setText(propertyExtractor.apply(body));
+ binding.inputWrapper.setVisibility(View.VISIBLE);
} else {
dialog.dismiss();
ExceptionDialogFragment.newInstance(new NetworkErrorException(getString(R.string.http_status_code, response.code()))).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName());
@@ -198,18 +204,6 @@ public class ManageAccountsActivity extends LockedActivity implements IManageAcc
}
}
- @NonNull
- private ViewGroup createDialogViewWrapper() {
- final var progressBar = new ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal);
- progressBar.setIndeterminate(true);
- final var wrapper = new FrameLayout(this);
- final int paddingVertical = getResources().getDimensionPixelSize(R.dimen.spacer_1x);
- final int paddingHorizontal = getDimensionFromAttribute(android.R.attr.dialogPreferredPadding);
- wrapper.setPadding(paddingHorizontal, paddingVertical, paddingHorizontal, paddingVertical);
- wrapper.addView(progressBar);
- return wrapper;
- }
-
@Px
private int getDimensionFromAttribute(@SuppressWarnings("SameParameterValue") @AttrRes int attr) {
final var typedValue = new TypedValue();
diff --git a/app/src/main/res/layout/dialog_edit_setting.xml b/app/src/main/res/layout/dialog_edit_setting.xml
new file mode 100644
index 00000000..d2ed4789
--- /dev/null
+++ b/app/src/main/res/layout/dialog_edit_setting.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <com.google.android.material.progressindicator.LinearProgressIndicator
+ android:id="@+id/progress"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:indeterminate="true"
+ android:paddingHorizontal="?attr/dialogPreferredPadding" />
+
+ <com.google.android.material.textfield.TextInputLayout
+ android:id="@+id/inputWrapper"
+ style="@style/textInputLayoutStyle"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:hint="@string/change_note_title"
+ android:padding="?attr/dialogPreferredPadding"
+ android:visibility="invisible"
+ tools:visibility="visible">
+
+ <com.google.android.material.textfield.TextInputEditText
+ android:id="@+id/property"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:imeOptions="actionDone"
+ android:importantForAutofill="no"
+ android:inputType="text">
+
+ <requestFocus />
+ </com.google.android.material.textfield.TextInputEditText>
+
+ </com.google.android.material.textfield.TextInputLayout>
+</FrameLayout> \ No newline at end of file