From 4f5e0b70ce2268fffdc858be8b4870004fc58574 Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Fri, 4 Nov 2022 13:45:45 +0100 Subject: Material 3: Refactor settings dialog Signed-off-by: Stefan Niedermann --- .../owncloud/notes/branding/BrandingUtil.java | 52 +++++++++++++++++++--- .../owncloud/notes/edit/BaseNoteFragment.java | 33 -------------- .../owncloud/notes/edit/NoteEditFragment.java | 1 + .../owncloud/notes/edit/NotePreviewFragment.java | 1 + .../owncloud/notes/main/MainActivity.java | 6 +++ .../manageaccounts/ManageAccountsActivity.java | 40 +++++++---------- app/src/main/res/layout/dialog_edit_setting.xml | 37 +++++++++++++++ 7 files changed, 107 insertions(+), 63 deletions(-) create mode 100644 app/src/main/res/layout/dialog_edit_setting.xml 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 propertyExtractor, @NonNull Function 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 @@ + + + + + + + + + + + + + + \ No newline at end of file -- cgit v1.2.3