diff options
author | Stefan Niedermann <info@niedermann.it> | 2022-11-04 15:45:45 +0300 |
---|---|---|
committer | Stefan Niedermann <info@niedermann.it> | 2022-11-12 11:02:24 +0300 |
commit | 4f5e0b70ce2268fffdc858be8b4870004fc58574 (patch) | |
tree | e048f46359b2d78eeff7a7bf5bc4988ef1dd2ed0 | |
parent | 7ee5b615878fcf4063c8a4f6474cb74922b58e03 (diff) |
Material 3: Refactor settings dialog
Signed-off-by: Stefan Niedermann <info@niedermann.it>
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 |