From c1a78463aee34b1cf8a6c30c7f6ab8b41c244f4f Mon Sep 17 00:00:00 2001 From: Decad3nce Date: Fri, 4 Oct 2019 21:32:56 +0200 Subject: [PATCH] Cherish: HeadsUp blacklists (2/2) Change-Id: Ie86a3d43fdb14f96131e48c14ebb9f2818a222a3 --- res/drawable/ic_blacklist.xml | 17 + res/values-vi/cherish_strings.xml | 11 + res/values/cherish_strings.xml | 12 + res/xml/cherish_settings_quicksettings.xml | 14 + res/xml/heads_up_settings.xml | 39 ++ .../cherish/settings/fragments/HeadsUp.java | 343 ++++++++++++++++++ 6 files changed, 436 insertions(+) create mode 100644 res/drawable/ic_blacklist.xml create mode 100644 res/xml/heads_up_settings.xml create mode 100644 src/com/cherish/settings/fragments/HeadsUp.java diff --git a/res/drawable/ic_blacklist.xml b/res/drawable/ic_blacklist.xml new file mode 100644 index 0000000..8b5da58 --- /dev/null +++ b/res/drawable/ic_blacklist.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + diff --git a/res/values-vi/cherish_strings.xml b/res/values-vi/cherish_strings.xml index cdbc23e..ed01fc6 100644 --- a/res/values-vi/cherish_strings.xml +++ b/res/values-vi/cherish_strings.xml @@ -424,4 +424,15 @@ Hiện thông báo nhanh và thông báo Chế độ động Tự động phát hiện và thêm trò chơi + + Đứng đầu + Bật lên thông báo trên thanh trạng thái + Thêm ứng dụng + Danh sách dừng + Vô hiệu hóa heads up trong các ứng dụng này + Danh sách đen + Vô hiệu hóa các ứng dụng này + Chọn ứng dụng + Xóa + Xóa mục đã chọn? diff --git a/res/values/cherish_strings.xml b/res/values/cherish_strings.xml index 3105eed..b33874e 100644 --- a/res/values/cherish_strings.xml +++ b/res/values/cherish_strings.xml @@ -476,4 +476,16 @@ Dynamic mode Try detecting and adding gaming apps automatically + + Heads Up + Pop up statusbar notifications + Add app + Stoplist + Disable heads up in these applications + Blacklist + Disable heads up for these applications + Choose app + Delete + Remove selected item? + diff --git a/res/xml/cherish_settings_quicksettings.xml b/res/xml/cherish_settings_quicksettings.xml index 3f45936..d30213b 100644 --- a/res/xml/cherish_settings_quicksettings.xml +++ b/res/xml/cherish_settings_quicksettings.xml @@ -62,6 +62,20 @@ android:defaultValue="true" /> + + + + + + diff --git a/res/xml/heads_up_settings.xml b/res/xml/heads_up_settings.xml new file mode 100644 index 0000000..901190d --- /dev/null +++ b/res/xml/heads_up_settings.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + diff --git a/src/com/cherish/settings/fragments/HeadsUp.java b/src/com/cherish/settings/fragments/HeadsUp.java new file mode 100644 index 0000000..3b55294 --- /dev/null +++ b/src/com/cherish/settings/fragments/HeadsUp.java @@ -0,0 +1,343 @@ +/* + * Copyright (C) 2014 The Nitrogen Project + * + * 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.DialogInterface; +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 androidx.preference.PreferenceViewHolder; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; +import android.widget.ListView; + +import com.android.internal.logging.nano.MetricsProto; +import com.android.settings.R; +import com.android.settings.SettingsPreferenceFragment; +import com.cherish.settings.preferences.PackageListAdapter; +import com.cherish.settings.preferences.PackageListAdapter.PackageItem; +import android.provider.Settings; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class HeadsUp extends SettingsPreferenceFragment + implements Preference.OnPreferenceClickListener { + + private static final int DIALOG_STOPLIST_APPS = 0; + private static final int DIALOG_BLACKLIST_APPS = 1; + + private PackageListAdapter mPackageAdapter; + private PackageManager mPackageManager; + private PreferenceGroup mStoplistPrefList; + private PreferenceGroup mBlacklistPrefList; + private Preference mAddStoplistPref; + private Preference mAddBlacklistPref; + + private String mStoplistPackageList; + private String mBlacklistPackageList; + private Map mStoplistPackages; + private Map mBlacklistPackages; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + // Get launch-able applications + addPreferencesFromResource(R.xml.heads_up_settings); + mPackageManager = getPackageManager(); + mPackageAdapter = new PackageListAdapter(getActivity()); + + mStoplistPrefList = (PreferenceGroup) findPreference("stoplist_applications"); + mStoplistPrefList.setOrderingAsAdded(false); + + mBlacklistPrefList = (PreferenceGroup) findPreference("blacklist_applications"); + mBlacklistPrefList.setOrderingAsAdded(false); + + mStoplistPackages = new HashMap(); + mBlacklistPackages = new HashMap(); + + mAddStoplistPref = findPreference("add_stoplist_packages"); + mAddBlacklistPref = findPreference("add_blacklist_packages"); + + mAddStoplistPref.setOnPreferenceClickListener(this); + mAddBlacklistPref.setOnPreferenceClickListener(this); + } + + @Override + public void onResume() { + super.onResume(); + refreshCustomApplicationPrefs(); + } + + @Override + public int getMetricsCategory() { + return MetricsProto.MetricsEvent.CHERISH_SETTINGS; + } + + @Override + public int getDialogMetricsCategory(int dialogId) { + if (dialogId == DIALOG_STOPLIST_APPS || dialogId == DIALOG_BLACKLIST_APPS ) { + return MetricsProto.MetricsEvent.CHERISH_SETTINGS; + } + return 0; + } + + /** + * Utility classes and supporting methods + */ + @Override + public Dialog onCreateDialog(int id) { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + final Dialog dialog; + final ListView list = new ListView(getActivity()); + list.setAdapter(mPackageAdapter); + + builder.setTitle(R.string.profile_choose_app); + builder.setView(list); + dialog = builder.create(); + + switch (id) { + case DIALOG_STOPLIST_APPS: + 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, mStoplistPackages); + dialog.cancel(); + } + }); + break; + case DIALOG_BLACKLIST_APPS: + list.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, + View view, int position, long id) { + PackageItem info = (PackageItem) parent.getItemAtPosition(position); + addCustomApplicationPref(info.packageName, mBlacklistPackages); + dialog.cancel(); + } + }); + } + return dialog; + } + + /** + * 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 (mStoplistPrefList != null && mBlacklistPrefList != null) { + mStoplistPrefList.removeAll(); + mBlacklistPrefList.removeAll(); + + for (Package pkg : mStoplistPackages.values()) { + try { + Preference pref = createPreferenceFromInfo(pkg); + mStoplistPrefList.addPreference(pref); + } catch (PackageManager.NameNotFoundException e) { + // Do nothing + } + } + + for (Package pkg : mBlacklistPackages.values()) { + try { + Preference pref = createPreferenceFromInfo(pkg); + mBlacklistPrefList.addPreference(pref); + } catch (PackageManager.NameNotFoundException e) { + // Do nothing + } + } + } + + // Keep these at the top + mAddStoplistPref.setOrder(0); + mAddBlacklistPref.setOrder(0); + // Add 'add' options + mStoplistPrefList.addPreference(mAddStoplistPref); + mBlacklistPrefList.addPreference(mAddBlacklistPref); + } + + @Override + public boolean onPreferenceClick(Preference preference) { + if (preference == mAddStoplistPref) { + showDialog(DIALOG_STOPLIST_APPS); + } else 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) { + if (preference == mBlacklistPrefList.findPreference(preference.getKey())) { + removeApplicationPref(preference.getKey(), mBlacklistPackages); + } else if (preference == mStoplistPrefList.findPreference(preference.getKey())) { + removeApplicationPref(preference.getKey(), mStoplistPackages); + } + } + }) + .setNegativeButton(android.R.string.cancel, null); + + builder.show(); + } + return true; + } + + 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 stoplistString = Settings.System.getString(getContentResolver(), + Settings.System.HEADS_UP_STOPLIST_VALUES); + final String blacklistString = Settings.System.getString(getContentResolver(), + Settings.System.HEADS_UP_BLACKLIST_VALUES); + + if (!TextUtils.equals(mStoplistPackageList, stoplistString)) { + mStoplistPackageList = stoplistString; + mStoplistPackages.clear(); + parseAndAddToMap(stoplistString, mStoplistPackages); + parsed = true; + } + + 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 = map == mStoplistPackages + ? Settings.System.HEADS_UP_STOPLIST_VALUES + : Settings.System.HEADS_UP_BLACKLIST_VALUES; + + List settings = new ArrayList(); + for (Package app : map.values()) { + settings.add(app.toString()); + } + final String value = TextUtils.join("|", settings); + if (preferencesUpdated) { + if (TextUtils.equals(setting, Settings.System.HEADS_UP_STOPLIST_VALUES)) { + mStoplistPackageList = value; + } else { + mBlacklistPackageList = value; + } + } + Settings.System.putString(getContentResolver(), + setting, value); + } +}