diff --git a/res/drawable/ic_header.xml b/res/drawable/ic_header.xml new file mode 100644 index 0000000..accf60c --- /dev/null +++ b/res/drawable/ic_header.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/res/values/cherish_arrays.xml b/res/values/cherish_arrays.xml index 98f5bc4..256b305 100644 --- a/res/values/cherish_arrays.xml +++ b/res/values/cherish_arrays.xml @@ -553,4 +553,14 @@ 9 10 + + + + @string/daylight_header_provider_title + @string/file_header_provider_title + + + @string/daylight_header_provider + @string/file_header_provider + diff --git a/res/values/cherish_strings.xml b/res/values/cherish_strings.xml index e90fc2a..11d5a80 100644 --- a/res/values/cherish_strings.xml +++ b/res/values/cherish_strings.xml @@ -606,4 +606,20 @@ Translucent (top) Translucent (bottom) Rotate + + + Header image + Use a custom image for QS header + daylight + file + Image type + Automatic (Time based) + Static + Image collection + Disabled + Pick image from collection + Select an image from pre-installed image collections + Pick image from storage + Select an image from internal storage + Darken image diff --git a/res/xml/cherish_settings_quicksettings.xml b/res/xml/cherish_settings_quicksettings.xml index 3315d5d..5938d1e 100644 --- a/res/xml/cherish_settings_quicksettings.xml +++ b/res/xml/cherish_settings_quicksettings.xml @@ -68,6 +68,14 @@ android:title="@string/enable_oneui" android:summary="@string/enable_oneui_summary" android:defaultValue="true" /> + + + + + + + + + + + + + + + + + + diff --git a/src/com/cherish/settings/fragments/QsHeader.java b/src/com/cherish/settings/fragments/QsHeader.java new file mode 100644 index 0000000..df59d34 --- /dev/null +++ b/src/com/cherish/settings/fragments/QsHeader.java @@ -0,0 +1,227 @@ +/* + * Copyright (C) 2019 ion-OS + * + * 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.app.Activity; +import android.content.ContentResolver; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.net.Uri; +import android.os.Bundle; +import android.provider.Settings; +import androidx.preference.ListPreference; +import androidx.preference.Preference; + +import com.android.internal.logging.nano.MetricsProto; + +import com.android.settings.R; +import com.android.settings.SettingsPreferenceFragment; + +import com.cherish.settings.preferences.CustomSeekBarPreference; +import com.cherish.settings.preferences.SystemSettingSwitchPreference; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class QsHeader extends SettingsPreferenceFragment + implements Preference.OnPreferenceChangeListener{ + + private static final String CUSTOM_HEADER_BROWSE = "custom_header_browse"; + private static final String DAYLIGHT_HEADER_PACK = "daylight_header_pack"; + private static final String CUSTOM_HEADER_IMAGE_SHADOW = "status_bar_custom_header_shadow"; + private static final String CUSTOM_HEADER_PROVIDER = "custom_header_provider"; + private static final String FILE_HEADER_SELECT = "file_header_select"; + + private static final int REQUEST_PICK_IMAGE = 0; + + private Preference mHeaderBrowse; + private ListPreference mDaylightHeaderPack; + private CustomSeekBarPreference mHeaderShadow; + private ListPreference mHeaderProvider; + private String mDaylightHeaderProvider; + private Preference mFileHeader; + private String mFileHeaderProvider; + + @Override + public void onResume() { + super.onResume(); + updateEnablement(); + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + addPreferencesFromResource(R.xml.qs_header); + ContentResolver resolver = getActivity().getContentResolver(); + + mDaylightHeaderProvider = getResources().getString(R.string.daylight_header_provider); + mFileHeaderProvider = getResources().getString(R.string.file_header_provider); + mHeaderBrowse = findPreference(CUSTOM_HEADER_BROWSE); + + mDaylightHeaderPack = (ListPreference) findPreference(DAYLIGHT_HEADER_PACK); + + List entries = new ArrayList(); + List values = new ArrayList(); + getAvailableHeaderPacks(entries, values); + mDaylightHeaderPack.setEntries(entries.toArray(new String[entries.size()])); + mDaylightHeaderPack.setEntryValues(values.toArray(new String[values.size()])); + + boolean headerEnabled = Settings.System.getInt(resolver, + Settings.System.STATUS_BAR_CUSTOM_HEADER, 0) != 0; + updateHeaderProviderSummary(headerEnabled); + mDaylightHeaderPack.setOnPreferenceChangeListener(this); + + mHeaderShadow = (CustomSeekBarPreference) findPreference(CUSTOM_HEADER_IMAGE_SHADOW); + final int headerShadow = Settings.System.getInt(resolver, + Settings.System.STATUS_BAR_CUSTOM_HEADER_SHADOW, 0); + mHeaderShadow.setValue((int)(((double) headerShadow / 255) * 100)); + mHeaderShadow.setOnPreferenceChangeListener(this); + + mHeaderProvider = (ListPreference) findPreference(CUSTOM_HEADER_PROVIDER); + mHeaderProvider.setOnPreferenceChangeListener(this); + + mFileHeader = findPreference(FILE_HEADER_SELECT); + + } + + private void updateHeaderProviderSummary(boolean headerEnabled) { + mDaylightHeaderPack.setSummary(getResources().getString(R.string.header_provider_disabled)); + if (headerEnabled) { + String settingHeaderPackage = Settings.System.getString(getContentResolver(), + Settings.System.STATUS_BAR_DAYLIGHT_HEADER_PACK); + if (settingHeaderPackage != null) { + int valueIndex = mDaylightHeaderPack.findIndexOfValue(settingHeaderPackage); + mDaylightHeaderPack.setValueIndex(valueIndex >= 0 ? valueIndex : 0); + mDaylightHeaderPack.setSummary(mDaylightHeaderPack.getEntry()); + } + } + } + + @Override + public boolean onPreferenceTreeClick(Preference preference) { + if (preference == mFileHeader) { + Intent intent = new Intent(Intent.ACTION_PICK); + intent.setType("image/*"); + startActivityForResult(intent, REQUEST_PICK_IMAGE); + return true; + } + return super.onPreferenceTreeClick(preference); + } + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + if (preference == mDaylightHeaderPack) { + String value = (String) newValue; + Settings.System.putString(getContentResolver(), + Settings.System.STATUS_BAR_DAYLIGHT_HEADER_PACK, value); + int valueIndex = mDaylightHeaderPack.findIndexOfValue(value); + mDaylightHeaderPack.setSummary(mDaylightHeaderPack.getEntries()[valueIndex]); + } else if (preference == mHeaderShadow) { + Integer headerShadow = (Integer) newValue; + int realHeaderValue = (int) (((double) headerShadow / 100) * 255); + Settings.System.putInt(getContentResolver(), + Settings.System.STATUS_BAR_CUSTOM_HEADER_SHADOW, realHeaderValue); + } else if (preference == mHeaderProvider) { + String value = (String) newValue; + Settings.System.putString(getContentResolver(), + Settings.System.STATUS_BAR_CUSTOM_HEADER_PROVIDER, value); + int valueIndex = mHeaderProvider.findIndexOfValue(value); + mHeaderProvider.setSummary(mHeaderProvider.getEntries()[valueIndex]); + updateEnablement(); + } + return true; + } + + private boolean isBrowseHeaderAvailable() { + PackageManager pm = getPackageManager(); + Intent browse = new Intent(); + browse.setClassName("org.omnirom.omnistyle", "org.omnirom.omnistyle.PickHeaderActivity"); + return pm.resolveActivity(browse, 0) != null; + } + + private void getAvailableHeaderPacks(List entries, List values) { + Map headerMap = new HashMap(); + Intent i = new Intent(); + PackageManager packageManager = getPackageManager(); + i.setAction("org.omnirom.DaylightHeaderPack"); + for (ResolveInfo r : packageManager.queryIntentActivities(i, 0)) { + String packageName = r.activityInfo.packageName; + String label = r.activityInfo.loadLabel(getPackageManager()).toString(); + if (label == null) { + label = r.activityInfo.packageName; + } + headerMap.put(label, packageName); + } + i.setAction("org.omnirom.DaylightHeaderPack1"); + for (ResolveInfo r : packageManager.queryIntentActivities(i, 0)) { + String packageName = r.activityInfo.packageName; + String label = r.activityInfo.loadLabel(getPackageManager()).toString(); + if (r.activityInfo.name.endsWith(".theme")) { + continue; + } + if (label == null) { + label = packageName; + } + headerMap.put(label, packageName + "/" + r.activityInfo.name); + } + List labelList = new ArrayList(); + labelList.addAll(headerMap.keySet()); + Collections.sort(labelList); + for (String label : labelList) { + entries.add(label); + values.add(headerMap.get(label)); + } + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent result) { + if (requestCode == REQUEST_PICK_IMAGE) { + if (resultCode != Activity.RESULT_OK) { + return; + } + final Uri imageUri = result.getData(); + Settings.System.putString(getContentResolver(), Settings.System.STATUS_BAR_CUSTOM_HEADER_PROVIDER, "file"); + Settings.System.putString(getContentResolver(), Settings.System.STATUS_BAR_FILE_HEADER_IMAGE, imageUri.toString()); + } + } + + private void updateEnablement() { + String providerName = Settings.System.getString(getContentResolver(), + Settings.System.STATUS_BAR_CUSTOM_HEADER_PROVIDER); + if (providerName == null) { + providerName = mDaylightHeaderProvider; + } + if (!providerName.equals(mDaylightHeaderProvider)) { + providerName = mFileHeaderProvider; + } + int valueIndex = mHeaderProvider.findIndexOfValue(providerName); + mHeaderProvider.setValueIndex(valueIndex >= 0 ? valueIndex : 0); + mHeaderProvider.setSummary(mHeaderProvider.getEntry()); + mDaylightHeaderPack.setEnabled(providerName.equals(mDaylightHeaderProvider)); + mFileHeader.setEnabled(providerName.equals(mFileHeaderProvider)); + mHeaderBrowse.setEnabled(isBrowseHeaderAvailable() && providerName.equals(mFileHeaderProvider)); + } + + @Override + public int getMetricsCategory() { + return MetricsProto.MetricsEvent.CHERISH_SETTINGS; + } +} diff --git a/src/com/cherish/settings/fragments/QuickSettings.java b/src/com/cherish/settings/fragments/QuickSettings.java index 72b1714..1619ee9 100644 --- a/src/com/cherish/settings/fragments/QuickSettings.java +++ b/src/com/cherish/settings/fragments/QuickSettings.java @@ -23,7 +23,7 @@ import android.text.TextUtils; import android.view.View; import com.cherish.settings.preferences.SystemSettingEditTextPreference; - +import com.cherish.settings.preferences.SystemSettingMasterSwitchPreference; import java.util.List; import java.util.ArrayList; @@ -33,11 +33,13 @@ public class QuickSettings extends SettingsPreferenceFragment implements private static final String QS_BLUR_INTENSITY = "qs_blur_intensity"; private static final String QUICK_PULLDOWN = "quick_pulldown"; private static final String FOOTER_TEXT_STRING = "footer_text_string"; + private static final String STATUS_BAR_CUSTOM_HEADER = "status_bar_custom_header"; private ListPreference mQuickPulldown; private CustomSeekBarPreference mQSBlurAlpha; private CustomSeekBarPreference mQSBlurIntensity; private SystemSettingEditTextPreference mFooterString; + private SystemSettingMasterSwitchPreference mCustomHeader; @Override public void onCreate(Bundle icicle) { @@ -66,6 +68,12 @@ public class QuickSettings extends SettingsPreferenceFragment implements mQuickPulldown.setValue(String.valueOf(quickPulldownValue)); updatePulldownSummary(quickPulldownValue); + mCustomHeader = (SystemSettingMasterSwitchPreference) findPreference(STATUS_BAR_CUSTOM_HEADER); + int qsHeader = Settings.System.getInt(resolver, + Settings.System.STATUS_BAR_CUSTOM_HEADER, 0); + mCustomHeader.setChecked(qsHeader != 0); + mCustomHeader.setOnPreferenceChangeListener(this); + mFooterString = (SystemSettingEditTextPreference) findPreference(FOOTER_TEXT_STRING); mFooterString.setOnPreferenceChangeListener(this); String footerString = Settings.System.getString(getContentResolver(), @@ -110,6 +118,11 @@ public class QuickSettings extends SettingsPreferenceFragment implements Settings.System.FOOTER_TEXT_STRING, "#KeepTheLove"); } return true; + } else if (preference == mCustomHeader) { + boolean header = (Boolean) newValue; + Settings.System.putInt(resolver, + Settings.System.STATUS_BAR_CUSTOM_HEADER, header ? 1 : 0); + return true; } return false; }