From 9fb59ede63aa601d3eec8131322a90c9e5617994 Mon Sep 17 00:00:00 2001 From: BlackyHawky Date: Mon, 29 Jan 2024 12:54:23 +0100 Subject: [PATCH] Add dynamic colors to settings (#454) --- .../latin/settings/SettingsActivity.java | 3 ++ .../latin/setup/SetupWizardActivity.java | 42 ++++----------- .../SpellCheckerSettingsActivity.java | 1 - .../SpellCheckerSettingsFragment.java | 5 +- .../latin/utils/ActivityThemeUtils.java | 27 ++++++++++ .../inputmethod/latin/utils/MoreKeysUtils.kt | 4 +- app/src/main/res/layout/seek_bar_dialog.xml | 3 +- .../user_dictionary_add_word_fullscreen.xml | 4 +- ...user_dictionary_settings_list_fragment.xml | 2 +- app/src/main/res/values-night-v31/colors.xml | 7 ++- app/src/main/res/values-night/colors.xml | 7 ++- app/src/main/res/values-v31/colors.xml | 7 ++- .../main/res/values-v31/platform-theme.xml | 54 +++++++++++++++++++ app/src/main/res/values/colors.xml | 7 ++- app/src/main/res/values/platform-theme.xml | 3 ++ 15 files changed, 129 insertions(+), 47 deletions(-) create mode 100644 app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/ActivityThemeUtils.java create mode 100644 app/src/main/res/values-v31/platform-theme.xml diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/SettingsActivity.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/SettingsActivity.java index cdbc0552..e1fa4934 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/SettingsActivity.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/SettingsActivity.java @@ -13,6 +13,7 @@ import android.content.Intent; import android.os.Bundle; import org.dslul.openboard.inputmethod.latin.permissions.PermissionsManager; +import org.dslul.openboard.inputmethod.latin.utils.ActivityThemeUtils; import org.dslul.openboard.inputmethod.latin.utils.NewDictionaryAdder; import androidx.annotation.NonNull; @@ -44,6 +45,8 @@ public final class SettingsActivity extends AppCompatActivity getSupportFragmentManager().beginTransaction() .replace(android.R.id.content, new SettingsFragment()) .commit(); + + ActivityThemeUtils.setActivityTheme(this); } @Override diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/setup/SetupWizardActivity.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/setup/SetupWizardActivity.java index 554a1ba0..fc4cd963 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/setup/SetupWizardActivity.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/setup/SetupWizardActivity.java @@ -8,46 +8,42 @@ package org.dslul.openboard.inputmethod.latin.setup; import static android.util.TypedValue.COMPLEX_UNIT_DIP; -import android.app.Activity; import android.content.ContentResolver; -import android.content.Context; import android.content.Intent; import android.content.res.ColorStateList; import android.content.res.Resources; -import android.graphics.Color; import android.graphics.drawable.Drawable; import android.net.Uri; -import android.os.Build; import android.os.Bundle; import android.os.Message; import android.provider.Settings; import android.util.TypedValue; import android.view.View; -import android.view.WindowInsetsController; import android.view.inputmethod.InputMethodManager; import android.widget.ImageView; import android.widget.TextView; import android.widget.VideoView; import androidx.annotation.NonNull; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.content.res.AppCompatResources; import androidx.core.content.ContextCompat; import androidx.core.content.res.ResourcesCompat; -import androidx.core.graphics.ColorUtils; import androidx.core.graphics.drawable.DrawableCompat; import org.dslul.openboard.inputmethod.latin.R; import org.dslul.openboard.inputmethod.latin.settings.SettingsActivity; +import org.dslul.openboard.inputmethod.latin.utils.ActivityThemeUtils; import org.dslul.openboard.inputmethod.latin.utils.JniUtils; import org.dslul.openboard.inputmethod.latin.utils.LeakGuardHandlerWrapper; import org.dslul.openboard.inputmethod.latin.utils.Log; -import org.dslul.openboard.inputmethod.latin.utils.ResourceUtils; import org.dslul.openboard.inputmethod.latin.utils.UncachedInputMethodManagerUtils; import java.util.ArrayList; // TODO: Use Fragment to implement welcome screen and setup steps. -public final class SetupWizardActivity extends Activity implements View.OnClickListener { +public final class SetupWizardActivity extends AppCompatActivity implements View.OnClickListener { static final String TAG = SetupWizardActivity.class.getSimpleName(); // For debugging purpose. @@ -121,8 +117,13 @@ public final class SetupWizardActivity extends Activity implements View.OnClickL @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); - final Context context = getApplicationContext(); - final boolean isNight = ResourceUtils.isNight(context.getResources()); + final ActionBar actionBar = getSupportActionBar(); + if (actionBar == null) { + return; + } + actionBar.hide(); + getWindow().setStatusBarColor(getResources().getColor(R.color.setup_background)); + ActivityThemeUtils.setActivityTheme(this); mImm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE); mHandler = new SettingsPoolingHandler(this, mImm); @@ -220,27 +221,6 @@ public final class SetupWizardActivity extends Activity implements View.OnClickL DrawableCompat.setTintList(finishDrawable, step1.mTextColorStateList); mActionFinish.setCompoundDrawablesRelativeWithIntrinsicBounds(finishDrawable, null, null, null); mActionFinish.setOnClickListener(this); - - // Set the status bar color - getWindow().setStatusBarColor(getResources().getColor(R.color.setup_background)); - // Navigation bar color - if (!isNight && !(Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)) { - getWindow().setNavigationBarColor(ColorUtils.setAlphaComponent(Color.GRAY, 180)); - } else { - getWindow().setNavigationBarColor(getResources().getColor(R.color.setup_background)); - } - // Set the icons of the status bar and the navigation bar light or dark - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - final WindowInsetsController controller = getWindow().getInsetsController(); - if (controller == null) return; - if (!isNight) { - controller.setSystemBarsAppearance(WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS, WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS); - controller.setSystemBarsAppearance(WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS, WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS); - } - } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - final View view = getWindow().getDecorView(); - view.setSystemUiVisibility(!isNight ? View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR : 0); - } } @Override diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/spellcheck/SpellCheckerSettingsActivity.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/spellcheck/SpellCheckerSettingsActivity.java index 0a0f66d2..e8362f26 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/spellcheck/SpellCheckerSettingsActivity.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/spellcheck/SpellCheckerSettingsActivity.java @@ -18,7 +18,6 @@ import androidx.core.app.ActivityCompat; */ public final class SpellCheckerSettingsActivity extends AppCompatActivity implements ActivityCompat.OnRequestPermissionsResultCallback { - private static final String DEFAULT_FRAGMENT = SpellCheckerSettingsFragment.class.getName(); @Override protected void onCreate(Bundle savedInstanceState) { diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/spellcheck/SpellCheckerSettingsFragment.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/spellcheck/SpellCheckerSettingsFragment.java index aa1073e3..f0a92070 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/spellcheck/SpellCheckerSettingsFragment.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/spellcheck/SpellCheckerSettingsFragment.java @@ -15,6 +15,7 @@ import org.dslul.openboard.inputmethod.latin.R; import org.dslul.openboard.inputmethod.latin.permissions.PermissionsManager; import org.dslul.openboard.inputmethod.latin.permissions.PermissionsUtil; import org.dslul.openboard.inputmethod.latin.settings.SubScreenFragment; +import org.dslul.openboard.inputmethod.latin.utils.ActivityThemeUtils; import androidx.preference.SwitchPreferenceCompat; @@ -31,8 +32,10 @@ public final class SpellCheckerSettingsFragment extends SubScreenFragment public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.spell_checker_settings); - mLookupContactsPreference = (SwitchPreferenceCompat) findPreference(AndroidSpellCheckerService.PREF_USE_CONTACTS_KEY); + mLookupContactsPreference = findPreference(AndroidSpellCheckerService.PREF_USE_CONTACTS_KEY); turnOffLookupContactsIfNoPermission(); + + ActivityThemeUtils.setActivityTheme(requireActivity()); } @Override diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/ActivityThemeUtils.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/ActivityThemeUtils.java new file mode 100644 index 00000000..98fd8ec6 --- /dev/null +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/ActivityThemeUtils.java @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: GPL-3.0-only +package org.dslul.openboard.inputmethod.latin.utils; + +import android.app.Activity; +import android.os.Build; +import android.view.View; +import android.view.WindowInsetsController; + +public class ActivityThemeUtils { + + public static void setActivityTheme(final Activity activity) { + final boolean isNight = ResourceUtils.isNight(activity.getResources()); + + // Set the icons of the status bar and the navigation bar light or dark + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + final WindowInsetsController controller = activity.getWindow().getInsetsController(); + if (controller != null && !isNight) { + controller.setSystemBarsAppearance(WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS, WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS); + controller.setSystemBarsAppearance(WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS, WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS); + } + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + final View view = activity.getWindow().getDecorView(); + view.setSystemUiVisibility(!isNight ? View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR : 0); + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/MoreKeysUtils.kt b/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/MoreKeysUtils.kt index dcf6f1b6..e8756345 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/MoreKeysUtils.kt +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/MoreKeysUtils.kt @@ -121,9 +121,7 @@ fun reorderMoreKeysDialog(context: Context, key: String, defaultSetting: String, override fun areItemsTheSame(p0: Pair, p1: Pair) = p0 == p1 override fun areContentsTheSame(p0: Pair, p1: Pair) = p0 == p1 } - val bgColor = if (ResourceUtils.isNight(context.resources)) - ContextCompat.getColor(context, androidx.appcompat.R.color.background_floating_material_dark) - else ContextCompat.getColor(context, androidx.appcompat.R.color.background_floating_material_light) + val bgColor = ContextCompat.getColor(context, R.color.sliding_items_background) val adapter = object : ListAdapter, RecyclerView.ViewHolder>(callback) { override fun onCreateViewHolder(p0: ViewGroup, p1: Int): RecyclerView.ViewHolder { val b = LayoutInflater.from(context).inflate(R.layout.morekeys_list_item, rv, false) diff --git a/app/src/main/res/layout/seek_bar_dialog.xml b/app/src/main/res/layout/seek_bar_dialog.xml index d14148ee..aac8d9a4 100644 --- a/app/src/main/res/layout/seek_bar_dialog.xml +++ b/app/src/main/res/layout/seek_bar_dialog.xml @@ -1,6 +1,7 @@ @@ -19,7 +20,7 @@ + android:textSize="18sp"/>