package com.cherish.settings.fragments; import static com.cherish.settings.utils.Utils.handleOverlays; import com.android.internal.logging.nano.MetricsProto; import static android.os.UserHandle.USER_SYSTEM; import android.app.UiModeManager; import android.graphics.Color; import android.os.Bundle; import android.content.pm.PackageManager.NameNotFoundException; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.UserHandle; import android.os.Bundle; import android.os.SystemProperties; import android.os.ServiceManager; import android.content.om.IOverlayManager; import android.content.om.OverlayInfo; import android.os.RemoteException; import android.provider.SearchIndexableResource; import android.provider.Settings; import android.content.ContentResolver; import android.content.res.Resources; import androidx.preference.ListPreference; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceManager; import androidx.preference.Preference.OnPreferenceChangeListener; import androidx.preference.SwitchPreference; import com.cherish.settings.preferences.CustomSeekBarPreference; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.search.SearchIndexable; import com.android.settings.display.OverlayCategoryPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; import android.provider.Settings; import com.android.settings.R; import androidx.fragment.app.Fragment; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settings.SettingsPreferenceFragment; import java.util.Locale; import android.text.TextUtils; import android.view.View; import java.util.List; import java.util.ArrayList; import java.util.Objects; import com.android.internal.util.cherish.ThemesUtils; import com.android.internal.util.cherish.CherishUtils; import net.margaritov.preference.colorpicker.ColorPickerPreference; public class ThemeSettings extends SettingsPreferenceFragment implements OnPreferenceChangeListener { private static final String PREF_THEME_SWITCH = "theme_switch"; private static final String ACCENT_COLOR = "accent_color"; private static final String ACCENT_COLOR_PROP = "persist.sys.theme.accentcolor"; private static final String GRADIENT_COLOR = "gradient_color"; private static final String GRADIENT_COLOR_PROP = "persist.sys.theme.gradientcolor"; private static final String CUSTOM_THEME_BROWSE = "theme_select_activity"; static final int DEFAULT_QS_PANEL_COLOR = 0xffffffff; static final int DEFAULT = 0xff1a73e8; private IOverlayManager mOverlayService; private UiModeManager mUiModeManager; private ColorPickerPreference mThemeColor; private ColorPickerPreference mGradientColor; private ListPreference mThemeSwitch; private Preference mThemeBrowse; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); addPreferencesFromResource(R.xml.cherish_settings_theme); PreferenceScreen prefScreen = getPreferenceScreen(); ContentResolver resolver = getActivity().getContentResolver(); mUiModeManager = getContext().getSystemService(UiModeManager.class); mOverlayService = IOverlayManager.Stub .asInterface(ServiceManager.getService(Context.OVERLAY_SERVICE)); setupThemeSwitchPref(); setupAccentPref(); setupGradientPref(); } @Override public boolean onPreferenceChange(Preference preference, Object objValue) { ContentResolver resolver = getActivity().getContentResolver(); if (preference == mThemeColor) { int color = (Integer) objValue; String hexColor = String.format("%08X", (0xFFFFFFFF & color)); SystemProperties.set(ACCENT_COLOR_PROP, hexColor); try { mOverlayService.reloadAndroidAssets(UserHandle.USER_CURRENT); mOverlayService.reloadAssets("com.android.settings", UserHandle.USER_CURRENT); mOverlayService.reloadAssets("com.android.systemui", UserHandle.USER_CURRENT); } catch (RemoteException ignored) { } } else if (preference == mGradientColor) { int color = (Integer) objValue; String hexColor = String.format("%08X", (0xFFFFFFFF & color)); SystemProperties.set(GRADIENT_COLOR_PROP, hexColor); try { mOverlayService.reloadAndroidAssets(UserHandle.USER_CURRENT); mOverlayService.reloadAssets("com.android.settings", UserHandle.USER_CURRENT); mOverlayService.reloadAssets("com.android.systemui", UserHandle.USER_CURRENT); } catch (RemoteException ignored) { } } else if (preference == mThemeSwitch) { String theme_switch = (String) objValue; final Context context = getContext(); switch (theme_switch) { case "1": handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_NO, ThemesUtils.SOLARIZED_DARK); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_NO, ThemesUtils.BAKED_GREEN); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_NO, ThemesUtils.CHOCO_X); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_NO, ThemesUtils.PITCH_BLACK); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_NO, ThemesUtils.DARK_GREY); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_NO, ThemesUtils.MATERIAL_OCEAN); break; case "2": handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.SOLARIZED_DARK); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.BAKED_GREEN); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.CHOCO_X); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.PITCH_BLACK); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.DARK_GREY); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.MATERIAL_OCEAN); break; case "3": handleBackgrounds(true, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.SOLARIZED_DARK); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.BAKED_GREEN); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.CHOCO_X); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.PITCH_BLACK); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.DARK_GREY); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.MATERIAL_OCEAN); break; case "4": handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.SOLARIZED_DARK); handleBackgrounds(true, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.BAKED_GREEN); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.CHOCO_X); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.PITCH_BLACK); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.DARK_GREY); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.MATERIAL_OCEAN); break; case "5": handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.SOLARIZED_DARK); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.BAKED_GREEN); handleBackgrounds(true, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.CHOCO_X); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.PITCH_BLACK); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.DARK_GREY); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.MATERIAL_OCEAN); break; case "6": handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.SOLARIZED_DARK); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.BAKED_GREEN); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.CHOCO_X); handleBackgrounds(true, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.PITCH_BLACK); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.DARK_GREY); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.MATERIAL_OCEAN); break; case "7": handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.SOLARIZED_DARK); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.BAKED_GREEN); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.CHOCO_X); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.PITCH_BLACK); handleBackgrounds(true, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.DARK_GREY); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.MATERIAL_OCEAN); break; case "8": handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.SOLARIZED_DARK); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.BAKED_GREEN); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.CHOCO_X); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.PITCH_BLACK); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.DARK_GREY); handleBackgrounds(true, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.MATERIAL_OCEAN); break; case "9": handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.SOLARIZED_DARK); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.BAKED_GREEN); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.CHOCO_X); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.PITCH_BLACK); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.DARK_GREY); handleBackgrounds(false, context, UiModeManager.MODE_NIGHT_YES, ThemesUtils.MATERIAL_OCEAN); break; } try { mOverlayService.reloadAndroidAssets(UserHandle.USER_CURRENT); mOverlayService.reloadAssets("com.android.settings", UserHandle.USER_CURRENT); mOverlayService.reloadAssets("com.android.systemui", UserHandle.USER_CURRENT); } catch (RemoteException ignored) { } } return true; } private void setupThemeSwitchPref() { mThemeSwitch = (ListPreference) findPreference(PREF_THEME_SWITCH); mThemeSwitch.setOnPreferenceChangeListener(this); if (CherishUtils.isThemeEnabled("com.android.theme.darkgrey.system")) { mThemeSwitch.setValue("7"); } else if (CherishUtils.isThemeEnabled("com.android.theme.pitchblack.system")) { mThemeSwitch.setValue("6"); } else if (CherishUtils.isThemeEnabled("com.android.theme.materialocean.system")) { mThemeSwitch.setValue("8"); } else if (CherishUtils.isThemeEnabled("com.android.theme.chocox.system")) { mThemeSwitch.setValue("5"); } else if (CherishUtils.isThemeEnabled("com.android.theme.bakedgreen.system")) { mThemeSwitch.setValue("4"); } else if (CherishUtils.isThemeEnabled("com.android.theme.solarizeddark.system")) { mThemeSwitch.setValue("3"); } else if (mUiModeManager.getNightMode() == UiModeManager.MODE_NIGHT_YES) { mThemeSwitch.setValue("2"); } else { mThemeSwitch.setValue("1"); } } private void setupAccentPref() { mThemeColor = (ColorPickerPreference) findPreference(ACCENT_COLOR); String colorVal = SystemProperties.get(ACCENT_COLOR_PROP, "-1"); int color = "-1".equals(colorVal) ? DEFAULT : Color.parseColor("#" + colorVal); mThemeColor.setNewPreviewColor(color); mThemeColor.setOnPreferenceChangeListener(this); } private void setupGradientPref() { mGradientColor = (ColorPickerPreference) findPreference(GRADIENT_COLOR); String colorVal = SystemProperties.get(GRADIENT_COLOR_PROP, "-1"); int color = "-1".equals(colorVal) ? DEFAULT : Color.parseColor("#" + colorVal); mGradientColor.setNewPreviewColor(color); mGradientColor.setOnPreferenceChangeListener(this); } private boolean isBrowseThemesAvailable() { PackageManager pm = getPackageManager(); Intent browse = new Intent(); browse.setClassName("com.android.customization", "com.android.customization.picker.CustomizationPickerActivity"); return pm.resolveActivity(browse, 0) != null; } private void handleBackgrounds(Boolean state, Context context, int mode, String[] overlays) { if (context != null) { Objects.requireNonNull(context.getSystemService(UiModeManager.class)) .setNightMode(mode); } for (int i = 0; i < overlays.length; i++) { String background = overlays[i]; try { mOverlayService.setEnabled(background, state, USER_SYSTEM); } catch (RemoteException e) { e.printStackTrace(); } } } @Override public int getMetricsCategory() { return MetricsProto.MetricsEvent.CHERISH_SETTINGS; } }