From a8ff71926221c1d5a0c49e97eb49c36f378ba8d3 Mon Sep 17 00:00:00 2001 From: SpiritCroc Date: Thu, 20 Dec 2018 18:58:16 +0530 Subject: [PATCH] Slim recents [2/3] @SKULSHADY: Cleanup, fixes and adapt for SettingsPreferenceFragment @rohanpurohit: bringup to 10 Change-Id: I7fa5703534c9eb76a555db9a6d3349cc2b6a2b2d Signed-off-by: rohan --- res/layout/dialog_iconpack.xml | 29 ++ res/layout/iconpack_view.xml | 39 ++ res/layout/iconpack_view_radio.xml | 45 ++ res/values/cherish_arrays.xml | 41 +- res/values/cherish_strings.xml | 97 ++++- res/xml/cherish_settings_recents.xml | 17 + res/xml/slim_recent_app_sidebar.xml | 23 + res/xml/slim_recent_app_sidebar_style.xml | 58 +++ res/xml/slim_recents.xml | 150 +++++++ res/xml/slim_recents_blacklist.xml | 27 ++ .../settings/fragments/RecentsSettings.java | 79 ++++ .../fragments/SlimRecentAppSidebar.java | 38 ++ .../fragments/SlimRecentAppSidebarStyle.java | 106 +++++ .../settings/fragments/SlimRecents.java | 392 ++++++++++++++++++ .../fragments/SlimRecentsBlacklist.java | 294 +++++++++++++ 15 files changed, 1410 insertions(+), 25 deletions(-) create mode 100644 res/layout/dialog_iconpack.xml create mode 100644 res/layout/iconpack_view.xml create mode 100644 res/layout/iconpack_view_radio.xml create mode 100644 res/xml/slim_recent_app_sidebar.xml create mode 100644 res/xml/slim_recent_app_sidebar_style.xml create mode 100644 res/xml/slim_recents.xml create mode 100644 res/xml/slim_recents_blacklist.xml create mode 100644 src/com/cherish/settings/fragments/SlimRecentAppSidebar.java create mode 100644 src/com/cherish/settings/fragments/SlimRecentAppSidebarStyle.java create mode 100644 src/com/cherish/settings/fragments/SlimRecents.java create mode 100644 src/com/cherish/settings/fragments/SlimRecentsBlacklist.java diff --git a/res/layout/dialog_iconpack.xml b/res/layout/dialog_iconpack.xml new file mode 100644 index 0000000..078f15d --- /dev/null +++ b/res/layout/dialog_iconpack.xml @@ -0,0 +1,29 @@ + + + + + diff --git a/res/layout/iconpack_view.xml b/res/layout/iconpack_view.xml new file mode 100644 index 0000000..ec99ed3 --- /dev/null +++ b/res/layout/iconpack_view.xml @@ -0,0 +1,39 @@ + + + + + + diff --git a/res/layout/iconpack_view_radio.xml b/res/layout/iconpack_view_radio.xml new file mode 100644 index 0000000..6a101f6 --- /dev/null +++ b/res/layout/iconpack_view_radio.xml @@ -0,0 +1,45 @@ + + + + + + + diff --git a/res/values/cherish_arrays.xml b/res/values/cherish_arrays.xml index 1d4c0e8..33dc3c3 100644 --- a/res/values/cherish_arrays.xml +++ b/res/values/cherish_arrays.xml @@ -40,7 +40,7 @@ 6 7 - + @string/lockscreen_clock_hide @@ -67,7 +67,7 @@ 9 10 - + @string/lockscreen_date_selection_default @@ -92,7 +92,7 @@ 7 8 - + @string/status_bar_clock_style_left @@ -155,7 +155,7 @@ EEEE MM/dd @string/clock_date_format_custom - + @string/clock_date_left @string/clock_date_right @@ -213,7 +213,7 @@ 2 3 - + @string/show_network_traffic_up @@ -226,7 +226,7 @@ 2 0 - + @string/volte_icon_asus @@ -245,7 +245,7 @@ 1 0 - + @string/lockscreen_charging_animation_off @@ -264,7 +264,7 @@ 4 5 - + @string/theme_type_light @@ -287,7 +287,7 @@ 7 8 - + @string/adaptive_playback_timeout_30_secs @@ -303,4 +303,27 @@ 300000 600000 + + + + @string/recent_panel_expanded_mode_auto + @string/recent_panel_expanded_mode_always + @string/recent_panel_expanded_mode_never + @string/recent_panel_expanded_mode_disabled + + + 0 + 1 + 2 + 3 + + + + @string/slim_recents_enter_exit_animation_translate + @string/slim_recents_enter_exit_animation_fade + + + 0 + 1 + diff --git a/res/values/cherish_strings.xml b/res/values/cherish_strings.xml index 1c84468..b70ceee 100644 --- a/res/values/cherish_strings.xml +++ b/res/values/cherish_strings.xml @@ -88,7 +88,7 @@ Show a brightness slider on bottom quick settings OneUI Show spacer above settings actionbar for easier use with one hand\nNOTE: restart settings app to see effect - + Clock style Select clock style @@ -102,7 +102,7 @@ Sammy (bold) Sammy (accent hour) Sammy (accent minute) - + Date style Date style @@ -116,12 +116,12 @@ Gradient Dark with accented borders Dark with gradient borders - + Status bar icons System icons Control which status bar icons are shown - + Statusbar items Clock @@ -180,7 +180,7 @@ Icon portrait (default) Circle (Dotted) Circle - Text + Text Hidden Big circle Circle (Filled) @@ -199,7 +199,7 @@ Enabled Enabled (inside icon) Enabled (estimate) - + Traffic indicators Customize network traffic indicators @@ -212,16 +212,16 @@ Net activity autohide threshold (KB/s) Hide arrows Hide the network traffic indicator arrows - + Icons 4G icon Display 4G icon in signal icon instead LTE - + VoLTE icon Display VoLTE icon (Needs a SystemUI restart to take effect) - + Select VoLTE Icon Default Icon @@ -230,7 +230,7 @@ HD Icon VoLTE Miui Icon VoLTE Asus Icon - + Display music visualizer Music visualizer @@ -253,11 +253,11 @@ Medium battery Almost full battery Full (100) battery - + Use old mobile type style Merge signal and type icons - + System theme Select theme @@ -269,7 +269,7 @@ Pitch black Dark Grey Material Ocean - + RGB Accent | Gradient Theming Themes @@ -278,7 +278,7 @@ Gradient Maker Gradient picker Gradient effect maker - + Secure power menu Secure power menu @@ -287,7 +287,7 @@ Power Menu Transparency Power/reboot menu opacity Power/reboot dialog dim background amount - + Rounded corners Adjust rounded corners and padding @@ -309,7 +309,7 @@ 2 minutes 5 minutes 10 minutes - + Label Carrier label @@ -332,4 +332,69 @@ Recognizing animation Show an animation while reading your fingerprint + + OK + Alternative recents + When using swipe up home navigation to open recents, only stock recents are supported + Slim Recents + Enable to use an alternative recents screen + Slim recents settings + Customize the additional settings for slim recents + Max allowed apps + Size + Expanded mode + Recent tasks expanded preview mode + Auto (Default) + Always + Never + Disabled + Panel background color + Card background color + Memory bar longpress gesture + Clear recents by long-pressing the memory bar + Icon Pack + Apply a custom icon pack for apps in the panel + No icon packs installed + Pick icon pack + Default icons + Card corner radius + + Show on the left edge + Show recent apps panel on the left edge of the screen + Blacklist + Apps blacklist + Apps to not show in the panel + Add app + Tap here to add, tap on added app to remove it + + + App Sidebar + Recents app sidebar + Show app shortcuts on the other edge + Sidebar shortcuts + Choose apps to show in the sidebar + Sidebar style + Change the look of the sidebar + Hide icon labels + Label color + Background color + Size + Open simultaneously with recents + Reduce recents opening lag by disabling this + Default (App based) + + + Default + Choose app + Delete + Remove selected item? + Memory Bar + Memory bar + Show a progress bar displaying RAM + Memory bar color + Memory bar text color + Animation + Translate + Fade + diff --git a/res/xml/cherish_settings_recents.xml b/res/xml/cherish_settings_recents.xml index 7784530..ad8cad2 100644 --- a/res/xml/cherish_settings_recents.xml +++ b/res/xml/cherish_settings_recents.xml @@ -18,4 +18,21 @@ android:title="@string/recents_title" xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"> + + + + + + + + diff --git a/res/xml/slim_recent_app_sidebar.xml b/res/xml/slim_recent_app_sidebar.xml new file mode 100644 index 0000000..c0cb87c --- /dev/null +++ b/res/xml/slim_recent_app_sidebar.xml @@ -0,0 +1,23 @@ + + + + + + diff --git a/res/xml/slim_recent_app_sidebar_style.xml b/res/xml/slim_recent_app_sidebar_style.xml new file mode 100644 index 0000000..cd85f50 --- /dev/null +++ b/res/xml/slim_recent_app_sidebar_style.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + diff --git a/res/xml/slim_recents.xml b/res/xml/slim_recents.xml new file mode 100644 index 0000000..fb7344b --- /dev/null +++ b/res/xml/slim_recents.xml @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/xml/slim_recents_blacklist.xml b/res/xml/slim_recents_blacklist.xml new file mode 100644 index 0000000..f47bcd0 --- /dev/null +++ b/res/xml/slim_recents_blacklist.xml @@ -0,0 +1,27 @@ + + + + + + + + diff --git a/src/com/cherish/settings/fragments/RecentsSettings.java b/src/com/cherish/settings/fragments/RecentsSettings.java index 29284b4..0b8b9eb 100644 --- a/src/com/cherish/settings/fragments/RecentsSettings.java +++ b/src/com/cherish/settings/fragments/RecentsSettings.java @@ -11,6 +11,7 @@ import android.os.UserHandle; import androidx.preference.ListPreference; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; +import androidx.preference.PreferenceCategory; import androidx.preference.Preference.OnPreferenceChangeListener; import androidx.preference.SwitchPreference; import android.provider.Settings; @@ -19,11 +20,20 @@ import com.android.settings.R; import java.util.Arrays; import java.util.HashSet; +import com.cherish.settings.preferences.SystemSettingMasterSwitchPreference; import com.android.settings.SettingsPreferenceFragment; public class RecentsSettings extends SettingsPreferenceFragment implements OnPreferenceChangeListener { + private static final String PREF_STOCK_RECENTS_CATEGORY = "stock_recents_category"; + private static final String PREF_ALTERNATIVE_RECENTS_CATEGORY = "alternative_recents_category"; + private static final String PREF_SWIPE_UP_ENABLED = "swipe_up_enabled_warning"; + + private PreferenceCategory mStockRecentsCategory; + private PreferenceCategory mAlternativeRecentsCategory; + private Context mContext; + @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); @@ -32,6 +42,75 @@ public class RecentsSettings extends SettingsPreferenceFragment implements ContentResolver resolver = getActivity().getContentResolver(); + mStockRecentsCategory = (PreferenceCategory) findPreference(PREF_STOCK_RECENTS_CATEGORY); + mAlternativeRecentsCategory = + (PreferenceCategory) findPreference(PREF_ALTERNATIVE_RECENTS_CATEGORY); + + // Alternative recents en-/disabling + Preference.OnPreferenceChangeListener alternativeRecentsChangeListener = + new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + updateDependencies(preference, (Boolean) newValue); + return true; + } + }; + for (int i = 0; i < mAlternativeRecentsCategory.getPreferenceCount(); i++) { + Preference preference = mAlternativeRecentsCategory.getPreference(i); + if (preference instanceof SystemSettingMasterSwitchPreference) { + preference.setOnPreferenceChangeListener(alternativeRecentsChangeListener); + } + } + + updateDependencies(); + + // Warning for alternative recents when gesture navigation is enabled, + // which directly controls quickstep (launcher) recents. + final int navigationMode = getActivity().getResources() + .getInteger(com.android.internal.R.integer.config_navBarInteractionMode); + // config_navBarInteractionMode: + // 0: 3 button mode (supports slim recents) + // 1: 2 button mode (currently does not support alternative recents) + // 2: gesture only (currently does not support alternative recents) + if (navigationMode != 0) { + for (int i = 0; i < mAlternativeRecentsCategory.getPreferenceCount(); i++) { + Preference preference = mAlternativeRecentsCategory.getPreference(i); + if (PREF_SWIPE_UP_ENABLED.equals(preference.getKey())) { + // We want to have that one enabled + continue; + } + preference.setEnabled(false); + } + } else { + mAlternativeRecentsCategory.removePreference(findPreference(PREF_SWIPE_UP_ENABLED)); + } + } + + private void updateDependencies() { + updateDependencies(null, null); + } + + private void updateDependencies(Preference updatedPreference, Boolean newValue) { + // Disable stock recents category if alternative enabled + boolean alternativeRecentsEnabled = newValue != null && newValue; + if (!alternativeRecentsEnabled) { + for (int i = 0; i < mAlternativeRecentsCategory.getPreferenceCount(); i++) { + Preference preference = mAlternativeRecentsCategory.getPreference(i); + if (preference == updatedPreference) { + // Already used newValue + continue; + } + if (preference instanceof SystemSettingMasterSwitchPreference + && ((SystemSettingMasterSwitchPreference) preference).isChecked()) { + alternativeRecentsEnabled = true; + break; + } + } + } + if (mStockRecentsCategory != null) { + mStockRecentsCategory.setEnabled(!alternativeRecentsEnabled); + } + } @Override diff --git a/src/com/cherish/settings/fragments/SlimRecentAppSidebar.java b/src/com/cherish/settings/fragments/SlimRecentAppSidebar.java new file mode 100644 index 0000000..850c394 --- /dev/null +++ b/src/com/cherish/settings/fragments/SlimRecentAppSidebar.java @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2018 Havoc-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.os.Bundle; + +import com.android.internal.logging.nano.MetricsProto; +import com.android.settings.SettingsPreferenceFragment; + +import com.android.settings.R; + +public class SlimRecentAppSidebar extends SettingsPreferenceFragment { + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + addPreferencesFromResource(R.xml.slim_recent_app_sidebar); + } + + @Override + public int getMetricsCategory() { + return MetricsProto.MetricsEvent.CHERISH_SETTINGS; + } +} diff --git a/src/com/cherish/settings/fragments/SlimRecentAppSidebarStyle.java b/src/com/cherish/settings/fragments/SlimRecentAppSidebarStyle.java new file mode 100644 index 0000000..fd4029d --- /dev/null +++ b/src/com/cherish/settings/fragments/SlimRecentAppSidebarStyle.java @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2018 Havoc-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.os.Bundle; +import android.os.UserHandle; +import android.provider.Settings; +import androidx.preference.Preference; + +import com.android.internal.logging.nano.MetricsProto; +import com.android.settings.SettingsPreferenceFragment; + +import com.android.settings.R; + +import net.margaritov.preference.colorpicker.ColorPickerPreference; + +public class SlimRecentAppSidebarStyle extends SettingsPreferenceFragment + implements Preference.OnPreferenceChangeListener { + + private static final String RECENT_APP_SIDEBAR_TEXT_COLOR = "recent_app_sidebar_text_color"; + private static final String RECENT_APP_SIDEBAR_BG_COLOR = "recent_app_sidebar_bg_color"; + + private ColorPickerPreference mRecentSidebarTextColor; + private ColorPickerPreference mRecentSidebarBgColor; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + addPreferencesFromResource(R.xml.slim_recent_app_sidebar_style); + + mRecentSidebarTextColor = (ColorPickerPreference) findPreference(RECENT_APP_SIDEBAR_TEXT_COLOR); + mRecentSidebarTextColor.setOnPreferenceChangeListener(this); + final int intColor = Settings.System.getInt(getContext().getContentResolver(), + Settings.System.RECENT_APP_SIDEBAR_TEXT_COLOR, 0xffffffff); + String hexColor = String.format("#%08x", (0xffffffff & intColor)); + if (hexColor.equals("#ffffffff")) { + mRecentSidebarTextColor.setSummary(R.string.default_string); + } else { + mRecentSidebarTextColor.setSummary(hexColor); + } + mRecentSidebarTextColor.setNewPreviewColor(intColor); + + mRecentSidebarBgColor = (ColorPickerPreference) findPreference(RECENT_APP_SIDEBAR_BG_COLOR); + mRecentSidebarBgColor.setOnPreferenceChangeListener(this); + final int intColorCard = Settings.System.getInt(getContext().getContentResolver(), + Settings.System.RECENT_APP_SIDEBAR_BG_COLOR, 0x00ffffff); + String hexColorCard = String.format("#%08x", (0x00ffffff & intColorCard)); + if (hexColorCard.equals("#00ffffff")) { + mRecentSidebarBgColor.setSummary(R.string.default_string); + } else { + mRecentSidebarBgColor.setSummary(hexColorCard); + } + mRecentSidebarBgColor.setNewPreviewColor(intColorCard); + } + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + if (preference == mRecentSidebarTextColor) { + String hex = ColorPickerPreference.convertToARGB( + Integer.valueOf(String.valueOf(newValue))); + if (hex.equals("#ffffffff")) { + preference.setSummary(R.string.default_string); + } else { + preference.setSummary(hex); + } + int intHex = ColorPickerPreference.convertToColorInt(hex); + Settings.System.putIntForUser(getContext().getContentResolver(), + Settings.System.RECENT_APP_SIDEBAR_TEXT_COLOR, + intHex, UserHandle.USER_CURRENT); + return true; + } else if (preference == mRecentSidebarBgColor) { + String hex = ColorPickerPreference.convertToARGB( + Integer.valueOf(String.valueOf(newValue))); + if (hex.equals("#00ffffff")) { + preference.setSummary(R.string.default_string); + } else { + preference.setSummary(hex); + } + int intHex = ColorPickerPreference.convertToColorInt(hex); + Settings.System.putIntForUser(getContext().getContentResolver(), + Settings.System.RECENT_APP_SIDEBAR_BG_COLOR, + intHex, UserHandle.USER_CURRENT); + return true; + } + return false; + } + + @Override + public int getMetricsCategory() { + return MetricsProto.MetricsEvent.CHERISH_SETTINGS; + } +} diff --git a/src/com/cherish/settings/fragments/SlimRecents.java b/src/com/cherish/settings/fragments/SlimRecents.java new file mode 100644 index 0000000..e795ab5 --- /dev/null +++ b/src/com/cherish/settings/fragments/SlimRecents.java @@ -0,0 +1,392 @@ +/* + * Copyright (C) 2017 AICP + * + * 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.AlertDialog; +import android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.content.res.Resources; +import androidx.preference.Preference; +import androidx.preference.SwitchPreference; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.os.UserHandle; +import android.provider.Settings; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.RadioButton; +import android.widget.TextView; +import android.widget.Toast; + +import com.android.internal.logging.nano.MetricsProto; +import com.android.settings.SettingsPreferenceFragment; +import com.android.settings.R; + +import net.margaritov.preference.colorpicker.ColorPickerPreference; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; + +public class SlimRecents extends SettingsPreferenceFragment + implements Preference.OnPreferenceChangeListener, DialogInterface.OnDismissListener { + + private static final String RECENT_PANEL_LEFTY_MODE = "recent_panel_lefty_mode"; + private static final String RECENT_ICON_PACK = "slim_icon_pack"; + private static final String RECENT_PANEL_BG_COLOR = "recent_panel_bg_color"; + private static final String RECENT_CARD_BG_COLOR = "recent_card_bg_color"; + private static final String SLIM_MEM_BAR_COLOR = "slim_mem_bar_color"; + private static final String SLIM_MEM_TEXT_COLOR = "slim_mem_text_color"; + + private SwitchPreference mRecentPanelLeftyMode; + private Preference mIconPack; + private ColorPickerPreference mRecentPanelBgColor; + private ColorPickerPreference mRecentCardBgColor; + private ColorPickerPreference mMemBarColor; + private ColorPickerPreference mMemTextColor; + + // Icon pack + private final static String[] sSupportedActions = new String[] { + "org.adw.launcher.THEMES", + "com.gau.go.launcherex.theme" + }; + private static final String[] sSupportedCategories = new String[] { + "com.fede.launcher.THEME_ICONPACK", + "com.anddoes.launcher.THEME", + "com.teslacoilsw.launcher.THEME" + }; + private AlertDialog mDialog; + private ListView mListView; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + addPreferencesFromResource(R.xml.slim_recents); + + mRecentPanelLeftyMode = (SwitchPreference) findPreference(RECENT_PANEL_LEFTY_MODE); + mRecentPanelLeftyMode.setOnPreferenceChangeListener(this); + mIconPack = findPreference(RECENT_ICON_PACK); + + // Recent panel background color + mRecentPanelBgColor = (ColorPickerPreference) findPreference(RECENT_PANEL_BG_COLOR); + mRecentPanelBgColor.setOnPreferenceChangeListener(this); + final int intColor = Settings.System.getInt(getContext().getContentResolver(), + Settings.System.RECENT_PANEL_BG_COLOR, 0x00ffffff); + String hexColor = String.format("#%08x", (0x00ffffff & intColor)); + if (hexColor.equals("#00ffffff")) { + mRecentPanelBgColor.setSummary(R.string.default_string); + } else { + mRecentPanelBgColor.setSummary(hexColor); + } + mRecentPanelBgColor.setNewPreviewColor(intColor); + + // Recent card background color + mRecentCardBgColor = (ColorPickerPreference) findPreference(RECENT_CARD_BG_COLOR); + mRecentCardBgColor.setOnPreferenceChangeListener(this); + final int intColorCard = Settings.System.getInt(getContext().getContentResolver(), + Settings.System.RECENT_CARD_BG_COLOR, 0x00ffffff); + String hexColorCard = String.format("#%08x", (0x00ffffff & intColorCard)); + if (hexColorCard.equals("#00ffffff")) { + mRecentCardBgColor.setSummary(R.string.default_auto_string); + } else { + mRecentCardBgColor.setSummary(hexColorCard); + } + mRecentCardBgColor.setNewPreviewColor(intColorCard); + + mMemBarColor = (ColorPickerPreference) findPreference(SLIM_MEM_BAR_COLOR); + mMemBarColor.setOnPreferenceChangeListener(this); + final int intMemColor = Settings.System.getInt(getContext().getContentResolver(), + Settings.System.SLIM_MEM_BAR_COLOR, 0xffffffff); + String hexMemColor = String.format("#%08x", (0xffffffff & intMemColor)); + if (hexMemColor.equals("#ffffffff")) { + mMemBarColor.setSummary(R.string.default_string); + } else { + mMemBarColor.setSummary(hexMemColor); + } + mMemBarColor.setNewPreviewColor(intMemColor); + + mMemTextColor = (ColorPickerPreference) findPreference(SLIM_MEM_TEXT_COLOR); + mMemTextColor.setOnPreferenceChangeListener(this); + final int intTextColor = Settings.System.getInt(getContext().getContentResolver(), + Settings.System.SLIM_MEM_TEXT_COLOR, 0xffffffff); + String hexTextColor = String.format("#%08x", (0xffffffff & intTextColor)); + if (hexTextColor.equals("#ffffffff")) { + mMemTextColor.setSummary(R.string.default_string); + } else { + mMemTextColor.setSummary(hexTextColor); + } + mMemTextColor.setNewPreviewColor(intTextColor); + } + + @Override + public void onResume() { + super.onResume(); + + boolean recentLeftyMode = Settings.System.getInt(getContext().getContentResolver(), + Settings.System.RECENT_PANEL_GRAVITY, Gravity.END) == Gravity.START; + mRecentPanelLeftyMode.setChecked(recentLeftyMode); + } + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + if (preference == mRecentPanelLeftyMode) { + Settings.System.putInt(getContext().getContentResolver(), + Settings.System.RECENT_PANEL_GRAVITY, + ((Boolean) newValue) ? Gravity.START : Gravity.END); + return true; + } else if (preference == mRecentPanelBgColor) { + String hex = ColorPickerPreference.convertToARGB( + Integer.valueOf(String.valueOf(newValue))); + if (hex.equals("#00ffffff")) { + preference.setSummary(R.string.default_string); + } else { + preference.setSummary(hex); + } + int intHex = ColorPickerPreference.convertToColorInt(hex); + Settings.System.putIntForUser(getContext().getContentResolver(), + Settings.System.RECENT_PANEL_BG_COLOR, + intHex, UserHandle.USER_CURRENT); + return true; + } else if (preference == mRecentCardBgColor) { + String hex = ColorPickerPreference.convertToARGB( + Integer.valueOf(String.valueOf(newValue))); + if (hex.equals("#00ffffff")) { + preference.setSummary(R.string.default_auto_string); + } else { + preference.setSummary(hex); + } + int intHex = ColorPickerPreference.convertToColorInt(hex); + Settings.System.putIntForUser(getContext().getContentResolver(), + Settings.System.RECENT_CARD_BG_COLOR, + intHex, UserHandle.USER_CURRENT); + return true; + } else if (preference == mMemBarColor) { + String hex = ColorPickerPreference.convertToARGB( + Integer.valueOf(String.valueOf(newValue))); + if (hex.equals("#ffffffff")) { + preference.setSummary(R.string.default_string); + } else { + preference.setSummary(hex); + } + int intHex = ColorPickerPreference.convertToColorInt(hex); + Settings.System.putIntForUser(getContext().getContentResolver(), + Settings.System.SLIM_MEM_BAR_COLOR, + intHex, UserHandle.USER_CURRENT); + return true; + } else if (preference == mMemTextColor) { + String hex = ColorPickerPreference.convertToARGB( + Integer.valueOf(String.valueOf(newValue))); + if (hex.equals("#ffffffff")) { + preference.setSummary(R.string.default_string); + } else { + preference.setSummary(hex); + } + int intHex = ColorPickerPreference.convertToColorInt(hex); + Settings.System.putIntForUser(getContext().getContentResolver(), + Settings.System.SLIM_MEM_TEXT_COLOR, + intHex, UserHandle.USER_CURRENT); + return true; + } + return false; + } + + @Override + public boolean onPreferenceTreeClick(Preference preference) { + if (preference == mIconPack) { + pickIconPack(getContext()); + return true; + } else { + return super.onPreferenceTreeClick(preference); + } + } + + /** Slim Recents Icon Pack Dialog **/ + private void pickIconPack(final Context context) { + if (mDialog != null) { + return; + } + Map supportedPackages = getSupportedPackages(context); + if (supportedPackages.isEmpty()) { + Toast.makeText(context, R.string.no_iconpacks_summary, Toast.LENGTH_SHORT).show(); + return; + } + AlertDialog.Builder builder = new AlertDialog.Builder(context) + .setTitle(R.string.dialog_pick_iconpack_title) + .setOnDismissListener(this) + .setNegativeButton(R.string.cancel, null) + .setView(createDialogView(context, supportedPackages)); + mDialog = builder.show(); + } + + private View createDialogView(final Context context, Map supportedPackages) { + final LayoutInflater inflater = (LayoutInflater) context + .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + final View view = inflater.inflate(R.layout.dialog_iconpack, null); + final IconAdapter adapter = new IconAdapter(context, supportedPackages); + + mListView = (ListView) view.findViewById(R.id.iconpack_list); + mListView.setAdapter(adapter); + mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, + int position, long id) { + if (adapter.isCurrentIconPack(position)) { + return; + } + String selectedPackage = adapter.getItem(position); + Settings.System.putString(getContext().getContentResolver(), + Settings.System.SLIM_RECENTS_ICON_PACK, selectedPackage); + mDialog.dismiss(); + } + }); + + return view; + } + + @Override + public void onDismiss(DialogInterface dialog) { + if (mDialog != null) { + mDialog = null; + } + } + + private static class IconAdapter extends BaseAdapter { + ArrayList mSupportedPackages; + LayoutInflater mLayoutInflater; + String mCurrentIconPack; + int mCurrentIconPackPosition = -1; + + IconAdapter(Context ctx, Map supportedPackages) { + mLayoutInflater = LayoutInflater.from(ctx); + mSupportedPackages = new ArrayList(supportedPackages.values()); + Collections.sort(mSupportedPackages, new Comparator() { + @Override + public int compare(IconPackInfo lhs, IconPackInfo rhs) { + return lhs.label.toString().compareToIgnoreCase(rhs.label.toString()); + } + }); + + Resources res = ctx.getResources(); + String defaultLabel = res.getString(R.string.default_iconpack_title); + Drawable icon = res.getDrawable(android.R.drawable.sym_def_app_icon); + mSupportedPackages.add(0, new IconPackInfo(defaultLabel, icon, "")); + mCurrentIconPack = Settings.System.getString(ctx.getContentResolver(), + Settings.System.SLIM_RECENTS_ICON_PACK); + } + + @Override + public int getCount() { + return mSupportedPackages.size(); + } + + @Override + public String getItem(int position) { + return (String) mSupportedPackages.get(position).packageName; + } + + @Override + public long getItemId(int position) { + return 0; + } + + public boolean isCurrentIconPack(int position) { + return mCurrentIconPackPosition == position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + if (convertView == null) { + convertView = mLayoutInflater.inflate(R.layout.iconpack_view_radio, null); + } + IconPackInfo info = mSupportedPackages.get(position); + TextView txtView = (TextView) convertView.findViewById(R.id.title); + txtView.setText(info.label); + ImageView imgView = (ImageView) convertView.findViewById(R.id.icon); + imgView.setImageDrawable(info.icon); + RadioButton radioButton = (RadioButton) convertView.findViewById(R.id.radio); + boolean isCurrentIconPack = info.packageName.equals(mCurrentIconPack); + radioButton.setChecked(isCurrentIconPack); + if (isCurrentIconPack) { + mCurrentIconPackPosition = position; + } + return convertView; + } + } + + private Map getSupportedPackages(Context context) { + Intent i = new Intent(); + Map packages = new HashMap(); + PackageManager packageManager = context.getPackageManager(); + for (String action : sSupportedActions) { + i.setAction(action); + for (ResolveInfo r : packageManager.queryIntentActivities(i, 0)) { + IconPackInfo info = new IconPackInfo(r, packageManager); + packages.put(r.activityInfo.packageName, info); + } + } + i = new Intent(Intent.ACTION_MAIN); + for (String category : sSupportedCategories) { + i.addCategory(category); + for (ResolveInfo r : packageManager.queryIntentActivities(i, 0)) { + IconPackInfo info = new IconPackInfo(r, packageManager); + packages.put(r.activityInfo.packageName, info); + } + i.removeCategory(category); + } + return packages; + } + + private static class IconPackInfo { + String packageName; + CharSequence label; + Drawable icon; + + IconPackInfo(ResolveInfo r, PackageManager packageManager) { + packageName = r.activityInfo.packageName; + icon = r.loadIcon(packageManager); + label = r.loadLabel(packageManager); + } + + IconPackInfo(){ + } + + public IconPackInfo(String label, Drawable icon, String packageName) { + this.label = label; + this.icon = icon; + this.packageName = packageName; + } + } + + @Override + public int getMetricsCategory() { + return MetricsProto.MetricsEvent.CHERISH_SETTINGS; + } +} diff --git a/src/com/cherish/settings/fragments/SlimRecentsBlacklist.java b/src/com/cherish/settings/fragments/SlimRecentsBlacklist.java new file mode 100644 index 0000000..4b75820 --- /dev/null +++ b/src/com/cherish/settings/fragments/SlimRecentsBlacklist.java @@ -0,0 +1,294 @@ +/* + * Copyright (C) 2017 The ABC rom + * Copyright (C) 2017 AICP + * + * 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.AlertDialog; +import android.app.Dialog; +import android.content.ContentResolver; +import android.content.Context; +import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.os.Bundle; +import androidx.preference.Preference; +import androidx.preference.PreferenceGroup; +import androidx.preference.PreferenceScreen; +import android.provider.Settings; +import android.text.TextUtils; +import android.view.View; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; +import android.widget.RadioButton; +import android.widget.ListView; + +import com.android.internal.logging.nano.MetricsProto; +import com.android.settings.SettingsPreferenceFragment; +import com.android.settings.R; +import com.cherish.settings.preferences.PackageListAdapter; +import com.cherish.settings.preferences.PackageListAdapter.PackageItem; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; +import java.util.List; + +public class SlimRecentsBlacklist extends SettingsPreferenceFragment implements + Preference.OnPreferenceClickListener { + + private static final String TAG = "SlimRecentsBlacklist"; + + private static final int DIALOG_BLACKLIST_APPS = 1; + + private PackageListAdapter mPackageAdapter; + private PackageManager mPackageManager; + private PreferenceGroup mBlacklistPrefList; + private Preference mAddBlacklistPref; + private String mBlacklistPackageList; + private Map mBlacklistPackages; + + private AlertDialog mDialog; + private ListView mListView; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + addPreferencesFromResource(R.xml.slim_recents_blacklist); + + initializeAllPreferences(); + } + + @Override + public Dialog onCreateDialog(int dialogId) { + switch (dialogId) { + case DIALOG_BLACKLIST_APPS: { + Dialog dialog; + AlertDialog.Builder alertDialog = new AlertDialog.Builder(getActivity()); + final ListView list = new ListView(getActivity()); + list.setAdapter(mPackageAdapter); + alertDialog.setTitle(R.string.profile_choose_app); + alertDialog.setView(list); + dialog = alertDialog.create(); + list.setOnItemClickListener(new OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + // Add empty application definition, the user will be able to edit it later + PackageItem info = (PackageItem) parent.getItemAtPosition(position); + addCustomApplicationPref(info.packageName, mBlacklistPackages); + dialog.cancel(); + } + }); + return dialog; + } + } + return super.onCreateDialog(dialogId); + } + + @Override + public int getDialogMetricsCategory(int dialogId) { + switch (dialogId) { + case DIALOG_BLACKLIST_APPS: + return MetricsProto.MetricsEvent.CHERISH_SETTINGS; + default: + return 0; + } + } + + @Override + public int getMetricsCategory() { + return MetricsProto.MetricsEvent.CHERISH_SETTINGS; + } + + @Override + public void onResume() { + super.onResume(); + refreshCustomApplicationPrefs(); + } + + private void initializeAllPreferences() { + mPackageManager = getActivity().getPackageManager(); + mPackageAdapter = new PackageListAdapter(getActivity()); + //mBlacklistPrefList = (PreferenceGroup) findPreference("blacklist_applications"); + mBlacklistPrefList = getPreferenceScreen(); + mBlacklistPrefList.setOrderingAsAdded(false); + mBlacklistPackages = new HashMap(); + mAddBlacklistPref = findPreference("add_blacklist_packages"); + mAddBlacklistPref.setOnPreferenceClickListener(this); + } + + @Override + public boolean onPreferenceClick(Preference preference) { + if (preference == mAddBlacklistPref) { + showDialog(DIALOG_BLACKLIST_APPS); + } else { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()) + .setTitle(R.string.dialog_delete_title) + .setMessage(R.string.dialog_delete_message) + //.setIconAttribute(android.R.attr.alertDialogIcon) + .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + removeApplicationPref(preference.getKey(), mBlacklistPackages); + } + }) + .setNegativeButton(android.R.string.cancel, null); + + builder.show(); + } + return true; + } + + /** + * Application class + */ + private static class Package { + public String name; + /** + * Stores all the application values in one call + * @param name + */ + public Package(String name) { + this.name = name; + } + + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append(name); + return builder.toString(); + } + + public static Package fromString(String value) { + if (TextUtils.isEmpty(value)) { + return null; + } + + try { + Package item = new Package(value); + return item; + } catch (NumberFormatException e) { + return null; + } + } + + }; + + private void refreshCustomApplicationPrefs() { + if (!parsePackageList()) { + return; + } + + // Add the Application Preferences + if (mBlacklistPrefList != null) { + mBlacklistPrefList.removeAll(); + + for (Package pkg : mBlacklistPackages.values()) { + try { + Preference pref = createPreferenceFromInfo(pkg); + mBlacklistPrefList.addPreference(pref); + } catch (PackageManager.NameNotFoundException e) { + // Do nothing + } + } + } + + // Keep these at the top + mAddBlacklistPref.setOrder(0); + // Add 'add' options + mBlacklistPrefList.addPreference(mAddBlacklistPref); + } + + private void addCustomApplicationPref(String packageName, Map map) { + Package pkg = map.get(packageName); + if (pkg == null) { + pkg = new Package(packageName); + map.put(packageName, pkg); + savePackageList(false, map); + refreshCustomApplicationPrefs(); + } + } + + private Preference createPreferenceFromInfo(Package pkg) + throws PackageManager.NameNotFoundException { + PackageInfo info = mPackageManager.getPackageInfo(pkg.name, + PackageManager.GET_META_DATA); + Preference pref = + new Preference(getActivity()); + + pref.setKey(pkg.name); + pref.setTitle(info.applicationInfo.loadLabel(mPackageManager)); + pref.setIcon(info.applicationInfo.loadIcon(mPackageManager)); + pref.setPersistent(false); + pref.setOnPreferenceClickListener(this); + return pref; + } + + private void removeApplicationPref(String packageName, Map map) { + if (map.remove(packageName) != null) { + savePackageList(false, map); + refreshCustomApplicationPrefs(); + } + } + + private boolean parsePackageList() { + boolean parsed = false; + final String blacklistString = Settings.System.getString(getActivity().getContentResolver(), + Settings.System.SLIM_RECENTS_BLACKLIST_VALUES); + + if (!TextUtils.equals(mBlacklistPackageList, blacklistString)) { + mBlacklistPackageList = blacklistString; + mBlacklistPackages.clear(); + parseAndAddToMap(blacklistString, mBlacklistPackages); + parsed = true; + } + + return parsed; + } + + private void parseAndAddToMap(String baseString, Map map) { + if (baseString == null) { + return; + } + + final String[] array = TextUtils.split(baseString, "\\|"); + for (String item : array) { + if (TextUtils.isEmpty(item)) { + continue; + } + Package pkg = Package.fromString(item); + map.put(pkg.name, pkg); + } + } + + private void savePackageList(boolean preferencesUpdated, Map map) { + String setting = Settings.System.SLIM_RECENTS_BLACKLIST_VALUES; + + List settings = new ArrayList(); + for (Package app : map.values()) { + settings.add(app.toString()); + } + final String value = TextUtils.join("|", settings); + if (preferencesUpdated) { + mBlacklistPackageList = value; + } + Settings.System.putString(getActivity().getContentResolver(), + setting, value); + } +}