269 lines
15 KiB
Java
269 lines
15 KiB
Java
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;
|
|
}
|
|
} |