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;
}