From bac9fe6f2dd297e3741d35d7e1c7337b4aa249de Mon Sep 17 00:00:00 2001 From: ariffjenong Date: Wed, 1 Feb 2023 14:19:49 +0800 Subject: [PATCH] Cherish: Introduce Dynamic System Bars (DSB) [2/2] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: ariffjenong Signed-off-by: Hưng Phan --- res/values/cherish_strings.xml | 22 ++ res/xml/cherish_settings_statusbar.xml | 7 + res/xml/dsb_settings.xml | 52 ++++ .../settings/fragments/DsbSettings.java | 266 ++++++++++++++++++ 4 files changed, 347 insertions(+) create mode 100644 res/xml/dsb_settings.xml create mode 100644 src/com/cherish/settings/fragments/DsbSettings.java diff --git a/res/values/cherish_strings.xml b/res/values/cherish_strings.xml index cb6961b..8f7dbac 100644 --- a/res/values/cherish_strings.xml +++ b/res/values/cherish_strings.xml @@ -956,4 +956,26 @@ Vivid Colors Use colorful and darker monet shades + + + Automatically change the dark intensity to Accent Color + Accent Mode + Use status bar Dynamic color as navigation bar icon Tint + Status bar color Tint + Automatically linked status bar dynamic color as navigation bar background + Linked Color + Automatically update the background of the navigation bar + Dynamic navigation bar + Overlay a gradient on the navigation bar + Navigation bar gradient + Automatically change the dark intensity to Silver + Silver Mode + Overlay a darkening filter on the status bar + Darker status bar + Automatically update the background of the status bar + Dynamic status bar + Automatically update the background of the status bar and navigation bar + Dynamic system bars + Overlay a gradient on the status bar + Status bar gradient diff --git a/res/xml/cherish_settings_statusbar.xml b/res/xml/cherish_settings_statusbar.xml index 6173cdc..5eb3668 100644 --- a/res/xml/cherish_settings_statusbar.xml +++ b/res/xml/cherish_settings_statusbar.xml @@ -71,6 +71,13 @@ android:targetPackage="com.android.systemui" android:targetClass="com.android.systemui.tuner.StatusbarItemsActivity" /> + + + + + + + + + + + + + + + + + + + + + diff --git a/src/com/cherish/settings/fragments/DsbSettings.java b/src/com/cherish/settings/fragments/DsbSettings.java new file mode 100644 index 0000000..b070e7f --- /dev/null +++ b/src/com/cherish/settings/fragments/DsbSettings.java @@ -0,0 +1,266 @@ +/* + * Copyright (C) 2022 The Nusantara Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cherish.settings.fragments; + +import android.content.ContentResolver; +import android.content.Context; +import android.content.res.Resources; +import android.graphics.Color; +import android.os.Bundle; +import android.os.Handler; +import android.os.UserHandle; +import android.provider.SearchIndexableResource; +import android.provider.Settings; + +import com.android.internal.logging.nano.MetricsProto; + +import androidx.preference.ListPreference; +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; +import androidx.preference.SwitchPreference; + +import com.android.settings.SettingsPreferenceFragment; +import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settingslib.search.SearchIndexable; + +import java.util.ArrayList; +import java.util.List; + +import com.android.settings.R; + +import androidx.preference.SeekBarPreference; + +@SearchIndexable +public class DsbSettings extends SettingsPreferenceFragment + implements Preference.OnPreferenceChangeListener { + + private static final String KEY_DYNAMIC_STATUS_BAR = "DYNAMIC_STATUS_BAR_STATE"; + private static final String KEY_DYNAMIC_NAVIGATION_BAR = "DYNAMIC_NAVIGATION_BAR_STATE"; + private static final String KEY_DYNAMIC_STATUS_BAR_FILTER = "DYNAMIC_STATUS_BAR_FILTER_STATE"; + private static final String KEY_DYNAMIC_LINKED_COLOR = "LINKED_COLOR"; + private static final String KEY_DYNAMIC_ABU_ABU = "ABU_ABU"; + private static final String KEY_DYNAMIC_UI_COLOR = "UI_COLOR"; + private static final String KEY_DYNAMIC_ACCENT_COLOR = "ACCENT_COLOR"; + + private SwitchPreference mDynamicStatusBar; + private SwitchPreference mDynamicNavigationBar; + private SwitchPreference mDynamicStatusBarFilter; + private SwitchPreference mDynamicLinkedColor; + private SwitchPreference mDynamicAbuAbu; + private SwitchPreference mDynamicUiColor; + private SwitchPreference mDynamicAccentColor; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Context ctx = getContext(); + String name = ctx.getPackageName(); + + addPreferencesFromResource(getResources().getIdentifier("dsb_settings", "xml", name)); + + PreferenceScreen prefSet = getPreferenceScreen(); + + ContentResolver resolver = ctx.getContentResolver(); + + SwitchPreference statusBar = mDynamicStatusBar = prefSet.findPreference(KEY_DYNAMIC_STATUS_BAR); + statusBar.setOnPreferenceChangeListener(this); + boolean status = Settings.System.getIntForUser(resolver, "DYNAMIC_STATUS_BAR_STATE", 0, UserHandle.USER_CURRENT) != 0; + statusBar.setChecked(status); + + SwitchPreference navi = mDynamicNavigationBar = prefSet.findPreference(KEY_DYNAMIC_NAVIGATION_BAR); + navi.setOnPreferenceChangeListener(this); + boolean naviEnable = Settings.System.getIntForUser(resolver, "DYNAMIC_NAVIGATION_BAR_STATE", 0, UserHandle.USER_CURRENT) != 0; + navi.setChecked(naviEnable); + Resources res = getResources(); + final boolean hasNavigationBar = res.getDimensionPixelSize(res.getIdentifier( + "navigation_bar_height", "dimen", "android")) > 0; + navi.setEnabled(hasNavigationBar); + + final boolean isAnyBarDynamic = status || naviEnable; + + SwitchPreference linkedColor = mDynamicLinkedColor = prefSet.findPreference(KEY_DYNAMIC_LINKED_COLOR); + linkedColor.setOnPreferenceChangeListener(this); + boolean linkedColorEnabled = Settings.System.getIntForUser(resolver, "LINKED_COLOR", 0, UserHandle.USER_CURRENT) != 0; + boolean uiEnabled = Settings.System.getIntForUser(resolver, "UI_COLOR", 0, UserHandle.USER_CURRENT) != 0; + linkedColor.setChecked(linkedColorEnabled); + linkedColor.setEnabled(status && naviEnable && !uiEnabled); + + SwitchPreference ui = mDynamicUiColor = prefSet.findPreference(KEY_DYNAMIC_UI_COLOR); + ui.setOnPreferenceChangeListener(this); + ui.setChecked(uiEnabled); + ui.setEnabled(status && naviEnable && !linkedColorEnabled); + + SwitchPreference filter = mDynamicStatusBarFilter = prefSet.findPreference(KEY_DYNAMIC_STATUS_BAR_FILTER); + filter.setOnPreferenceChangeListener(this); + boolean filterEnabled = Settings.System.getIntForUser(resolver, "DYNAMIC_STATUS_BAR_FILTER_STATE", 0, UserHandle.USER_CURRENT) != 0; + filter.setChecked(filterEnabled); + filter.setEnabled(status); + + SwitchPreference abu = mDynamicAbuAbu = prefSet.findPreference(KEY_DYNAMIC_ABU_ABU); + abu.setOnPreferenceChangeListener(this); + boolean abuEnabled = Settings.System.getIntForUser(resolver, "ABU_ABU", 0, UserHandle.USER_CURRENT) != 0; + boolean accentEnabled = Settings.System.getIntForUser(resolver, "ACCENT_COLOR", 0, UserHandle.USER_CURRENT) != 0; + abu.setChecked(abuEnabled); + abu.setEnabled(isAnyBarDynamic && !accentEnabled); + + SwitchPreference accent = mDynamicAccentColor = prefSet.findPreference(KEY_DYNAMIC_ACCENT_COLOR); + accent.setOnPreferenceChangeListener(this); + accent.setChecked(accentEnabled); + accent.setEnabled(isAnyBarDynamic && !abuEnabled); + + + updatePrefAll(); + } + + protected void updatePrefAll() { + Context ctx = getContext(); + ContentResolver resolver = ctx.getContentResolver(); + + boolean status = Settings.System.getIntForUser(resolver, "DYNAMIC_STATUS_BAR_STATE", 0, UserHandle.USER_CURRENT) != 0; + + SwitchPreference navi = mDynamicNavigationBar; + boolean naviEnable = Settings.System.getIntForUser(resolver, "DYNAMIC_NAVIGATION_BAR_STATE", 0, UserHandle.USER_CURRENT) != 0; + Resources res = getResources(); + final boolean hasNavigationBar = res.getDimensionPixelSize(res.getIdentifier( + "navigation_bar_height", "dimen", "android")) > 0; + navi.setEnabled(hasNavigationBar); + + final boolean isAnyBarDynamic = status || naviEnable; + + SwitchPreference linkedColor = mDynamicLinkedColor; + boolean linkedColorEnabled = Settings.System.getIntForUser(resolver, "LINKED_COLOR", 0, UserHandle.USER_CURRENT) != 0; + boolean uiEnabled = Settings.System.getIntForUser(resolver, "UI_COLOR", 0, UserHandle.USER_CURRENT) != 0; + linkedColor.setEnabled(status && naviEnable && !uiEnabled); + + SwitchPreference ui = mDynamicUiColor; + ui.setEnabled(status && naviEnable && !linkedColorEnabled); + + SwitchPreference filter = mDynamicStatusBarFilter; + boolean filterEnabled = Settings.System.getIntForUser(resolver, "DYNAMIC_STATUS_BAR_FILTER_STATE", 0, UserHandle.USER_CURRENT) != 0; + filter.setEnabled(status); + + SwitchPreference abu = mDynamicAbuAbu; + boolean abuEnabled = Settings.System.getIntForUser(resolver, "ABU_ABU", 0, UserHandle.USER_CURRENT) != 0; + boolean accentEnabled = Settings.System.getIntForUser(resolver, "ACCENT_COLOR", 0, UserHandle.USER_CURRENT) != 0; + abu.setEnabled(isAnyBarDynamic && !accentEnabled); + + SwitchPreference accent = mDynamicAccentColor; + accent.setEnabled(isAnyBarDynamic && !abuEnabled); + + } + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + ContentResolver resolver = getContext().getContentResolver(); + if (preference == mDynamicStatusBar) { + boolean value = (Boolean) newValue; + Settings.System.putIntForUser(resolver, + "DYNAMIC_STATUS_BAR_STATE", + value ? 1 : 0, UserHandle.USER_CURRENT); + updatePrefAll(); + return true; + } else if (preference == mDynamicNavigationBar) { + boolean value = (Boolean) newValue; + final Resources res = getResources(); + Settings.System.putIntForUser(resolver, + "DYNAMIC_NAVIGATION_BAR_STATE", + value && res.getDimensionPixelSize( + res.getIdentifier("navigation_bar_height", "dimen", "android")) > 0 ? + 1 : 0, UserHandle.USER_CURRENT); + updatePrefAll(); + return true; + } else if (preference == mDynamicLinkedColor) { + boolean value = (Boolean) newValue; + Settings.System.putIntForUser(resolver, "LINKED_COLOR", + value ? 1 : 0, UserHandle.USER_CURRENT); + if (value) { + Settings.System.putIntForUser(resolver, + "UI_COLOR", 0, UserHandle.USER_CURRENT); + } + updatePrefAll(); + return true; + } else if (preference == mDynamicUiColor) { + boolean value = (Boolean) newValue; + Settings.System.putIntForUser(resolver, "UI_COLOR", + value ? 1 : 0, UserHandle.USER_CURRENT); + if (value) { + Settings.System.putIntForUser(resolver, + "LINKED_COLOR", 0, UserHandle.USER_CURRENT); + } + updatePrefAll(); + return true; + } else if (preference == mDynamicStatusBarFilter) { + boolean value = (Boolean) newValue; + Settings.System.putIntForUser(resolver, + "DYNAMIC_STATUS_BAR_FILTER_STATE", + value ? 1 : 0, UserHandle.USER_CURRENT); + updatePrefAll(); + return true; + } else if (preference == mDynamicAbuAbu) { + boolean value = (Boolean) newValue; + Settings.System.putIntForUser(resolver, + "ABU_ABU", + value ? 1 : 0, UserHandle.USER_CURRENT); + if (value) { + Settings.System.putIntForUser(resolver, + "ACCENT_COLOR", 0, UserHandle.USER_CURRENT); + } + updatePrefAll(); + return true; + } else if (preference == mDynamicAccentColor) { + boolean value = (Boolean) newValue; + Settings.System.putIntForUser(resolver, + "ACCENT_COLOR", + value ? 1 : 0, UserHandle.USER_CURRENT); + if (value) { + Settings.System.putIntForUser(resolver, + "ABU_ABU", 0, UserHandle.USER_CURRENT); + } + updatePrefAll(); + return true; + } + return false; + } + + public int getMetricsCategory() { + return MetricsProto.MetricsEvent.CHERISH_SETTINGS; + } + + public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider() { + @Override + public List getXmlResourcesToIndex(Context context, + boolean enabled) { + ArrayList result = + new ArrayList(); + + SearchIndexableResource sir = new SearchIndexableResource(context); + sir.xmlResId = R.xml.dsb_settings; + result.add(sir); + return result; + } + + @Override + public List getNonIndexableKeys(Context context) { + List keys = super.getNonIndexableKeys(context); + return keys; + } + }; + +} + +