Cherish:QS header image [2/4]

This commit is contained in:
maxwen
2019-02-03 15:23:51 +05:30
committed by Hưng Phan
parent d30c5ef102
commit 8a7efcfe77
7 changed files with 341 additions and 1 deletions

View File

@@ -0,0 +1,8 @@
<!-- drawable/page_layout_header.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:width="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:fillColor="?android:attr/colorControlNormal" android:pathData="M6,2H18A2,2 0 0,1 20,4V20A2,2 0 0,1 18,22H6A2,2 0 0,1 4,20V4A2,2 0 0,1 6,2M6,4V8H18V4H6Z" />
</vector>

View File

@@ -553,4 +553,14 @@
<item>9</item> <item>9</item>
<item>10</item> <item>10</item>
</string-array> </string-array>
<!-- QS header image -->
<string-array name="custom_header_provider_entries" translatable="false">
<item>@string/daylight_header_provider_title</item>
<item>@string/file_header_provider_title</item>
</string-array>
<string-array name="custom_header_provider_values" translatable="false">
<item>@string/daylight_header_provider</item>
<item>@string/file_header_provider</item>
</string-array>
</resources> </resources>

View File

@@ -606,4 +606,20 @@
<string name="power_menu_animation_translucent_top">Translucent (top)</string> <string name="power_menu_animation_translucent_top">Translucent (top)</string>
<string name="power_menu_animation_translucent_bottom">Translucent (bottom)</string> <string name="power_menu_animation_translucent_bottom">Translucent (bottom)</string>
<string name="power_menu_animation_rotate">Rotate</string> <string name="power_menu_animation_rotate">Rotate</string>
<!-- QS header image -->
<string name="status_bar_custom_header_title">Header image</string>
<string name="status_bar_custom_header_summary">Use a custom image for QS header</string>
<string name="daylight_header_provider" translatable="false">daylight</string>
<string name="file_header_provider" translatable="false">file</string>
<string name="custom_header_provider_title">Image type</string>
<string name="daylight_header_provider_title">Automatic (Time based)</string>
<string name="file_header_provider_title">Static</string>
<string name="daylight_header_pack_title">Image collection</string>
<string name="header_provider_disabled">Disabled</string>
<string name="custom_header_pick_title">Pick image from collection</string>
<string name="custom_header_pick_summary">Select an image from pre-installed image collections</string>
<string name="file_header_select_title">Pick image from storage</string>
<string name="file_header_select_summary">Select an image from internal storage</string>
<string name="status_bar_custom_header_shadow_title">Darken image</string>
</resources> </resources>

View File

@@ -69,6 +69,14 @@
android:summary="@string/enable_oneui_summary" android:summary="@string/enable_oneui_summary"
android:defaultValue="true" /> android:defaultValue="true" />
<com.cherish.settings.preferences.SystemSettingMasterSwitchPreference
android:key="status_bar_custom_header"
android:icon="@drawable/ic_header"
android:fragment="com.cherish.settings.fragments.QsHeader"
android:title="@string/status_bar_custom_header_title"
android:summary="@string/status_bar_custom_header_summary"
android:defaultValue="false" />
<com.cherish.settings.preferences.SystemSettingSwitchPreference <com.cherish.settings.preferences.SystemSettingSwitchPreference
android:key="footer_text_show" android:key="footer_text_show"
android:icon="@drawable/ic_edit_show" android:icon="@drawable/ic_edit_show"

58
res/xml/qs_header.xml Normal file
View File

@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2020 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.
-->
<PreferenceScreen
android:title="@string/status_bar_custom_header_title"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res/com.android.settings">
<ListPreference
android:key="custom_header_provider"
android:title="@string/custom_header_provider_title"
android:persistent="false"
android:entries="@array/custom_header_provider_entries"
android:entryValues="@array/custom_header_provider_values" />
<ListPreference
android:key="daylight_header_pack"
android:title="@string/daylight_header_pack_title"
android:persistent="false" />
<Preference
android:key="custom_header_browse"
android:title="@string/custom_header_pick_title"
android:summary="@string/custom_header_pick_summary"
android:persistent="false" >
<intent android:action="android.intent.action.MAIN"
android:targetPackage="org.omnirom.omnistyle"
android:targetClass="org.omnirom.omnistyle.PickHeaderActivity" />
</Preference>
<Preference
android:key="file_header_select"
android:title="@string/file_header_select_title"
android:summary="@string/file_header_select_summary"
android:persistent="false" >
</Preference>
<com.cherish.settings.preferences.CustomSeekBarPreference
android:key="status_bar_custom_header_shadow"
android:title="@string/status_bar_custom_header_shadow_title"
android:max="100"
settings:min="0"
android:defaultValue="0"
settings:units="%" />
</PreferenceScreen>

View File

@@ -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<String> entries = new ArrayList<String>();
List<String> values = new ArrayList<String>();
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<String> entries, List<String> values) {
Map<String, String> headerMap = new HashMap<String, String>();
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<String> labelList = new ArrayList<String>();
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;
}
}

View File

@@ -23,7 +23,7 @@ import android.text.TextUtils;
import android.view.View; import android.view.View;
import com.cherish.settings.preferences.SystemSettingEditTextPreference; import com.cherish.settings.preferences.SystemSettingEditTextPreference;
import com.cherish.settings.preferences.SystemSettingMasterSwitchPreference;
import java.util.List; import java.util.List;
import java.util.ArrayList; 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 QS_BLUR_INTENSITY = "qs_blur_intensity";
private static final String QUICK_PULLDOWN = "quick_pulldown"; private static final String QUICK_PULLDOWN = "quick_pulldown";
private static final String FOOTER_TEXT_STRING = "footer_text_string"; 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 ListPreference mQuickPulldown;
private CustomSeekBarPreference mQSBlurAlpha; private CustomSeekBarPreference mQSBlurAlpha;
private CustomSeekBarPreference mQSBlurIntensity; private CustomSeekBarPreference mQSBlurIntensity;
private SystemSettingEditTextPreference mFooterString; private SystemSettingEditTextPreference mFooterString;
private SystemSettingMasterSwitchPreference mCustomHeader;
@Override @Override
public void onCreate(Bundle icicle) { public void onCreate(Bundle icicle) {
@@ -66,6 +68,12 @@ public class QuickSettings extends SettingsPreferenceFragment implements
mQuickPulldown.setValue(String.valueOf(quickPulldownValue)); mQuickPulldown.setValue(String.valueOf(quickPulldownValue));
updatePulldownSummary(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 = (SystemSettingEditTextPreference) findPreference(FOOTER_TEXT_STRING);
mFooterString.setOnPreferenceChangeListener(this); mFooterString.setOnPreferenceChangeListener(this);
String footerString = Settings.System.getString(getContentResolver(), String footerString = Settings.System.getString(getContentResolver(),
@@ -110,6 +118,11 @@ public class QuickSettings extends SettingsPreferenceFragment implements
Settings.System.FOOTER_TEXT_STRING, "#KeepTheLove"); Settings.System.FOOTER_TEXT_STRING, "#KeepTheLove");
} }
return true; 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; return false;
} }