Cherish:HeadsUp blacklists (2/2)

@xyyx: delete app with one tap and some diff in code)

Signed-off-by: Hưng Phan <phandinhhungvp2001@gmail.com>
This commit is contained in:
Adnan
2017-09-28 23:09:03 +08:00
committed by Hưng Phan
parent 3076662eed
commit b919f5d01e
3 changed files with 143 additions and 81 deletions

View File

@@ -508,7 +508,9 @@
<string name="summary_heads_up_disabled">Pop-up notifications are disabled</string> <string name="summary_heads_up_disabled">Pop-up notifications are disabled</string>
<string name="add_heads_up_package">Add app</string> <string name="add_heads_up_package">Add app</string>
<string name="add_heads_up_stoplist_summary">Disable heads up notifications in these applications</string> <string name="add_heads_up_stoplist_summary">Disable heads up notifications in these applications</string>
<string name="heads_up_stoplist_title">Applist</string> <string name="add_heads_up_blacklist_summary">Disable heads up from these applications</string>
<string name="heads_up_stoplist_title">Stoplist</string>
<string name="heads_up_blacklist_title">Blacklist</string>
<string name="profile_choose_app">Choose app</string> <string name="profile_choose_app">Choose app</string>
<string name="dialog_delete_title">Delete</string> <string name="dialog_delete_title">Delete</string>
<string name="dialog_delete_message">Remove selected item?</string> <string name="dialog_delete_message">Remove selected item?</string>

View File

@@ -1,47 +1,48 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- <!-- Copyright (C) 2014 The CyanogenMod Project
Copyright (C) 2020 The CherishOS Project Licensed under the Apache License, Version 2.0 (the "License");
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
you may not use this file except in compliance with the License. You may obtain a copy of the License at
You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and
See the License for the specific language governing permissions and limitations under the License.
limitations under the License.
--> -->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
android:title="@string/notifications_title"
xmlns:settings="http://schemas.android.com/apk/res/com.android.settings">
<!-- Heads up --> <PreferenceCategory
<Preference android:title="@string/heads_up_notifications" >
android:key="heads_up_notifications"
android:title="@string/heads_up_notifications"
android:summary="@string/heads_up_summary"
android:fragment="com.cherish.settings.fragments.HeadsUpSettings" />
<Preference <com.cherish.settings.preferences.GlobalSettingSwitchPreference
android:key="notification_light" android:key="heads_up_notifications_enabled"
android:fragment="com.android.settings.applications.manageapplications.ManageApplications" android:title="@string/heads_up_notifications"
android:title="@string/notification_light_settings" > android:summaryOn="@string/summary_heads_up_enabled"
<extra android:summaryOff="@string/summary_heads_up_disabled"
android:name="classname"
android:value="com.android.settings.Settings$NotificationAppListActivity" />
</Preference>
<Preference
android:key="charging_light"
android:icon="@drawable/ic_battery_almostfull"
android:fragment="com.cherish.settings.fragments.BatteryLightSettings"
android:title="@string/battery_light_settings" />
<com.cherish.settings.preferences.SystemSettingSwitchPreference
android:key="notification_sound_vib_screen_on"
android:icon="@drawable/ic_notification"
android:title="@string/notification_sound_vib_screen_on_title"
android:summary="@string/notification_sound_vib_screen_on_summary"
android:defaultValue="true" /> android:defaultValue="true" />
<PreferenceCategory
android:title="@string/heads_up_stoplist_title"
android:key="stoplist_applications"
android:dependency="heads_up_notifications_enabled" >
<Preference
android:key="add_stoplist_packages"
android:icon="@drawable/ic_menu_add_activated_tint"
android:title="@string/add_heads_up_package"
android:summary="@string/add_heads_up_stoplist_summary" />
</PreferenceCategory>
</PreferenceCategory>
<PreferenceCategory
android:title="@string/heads_up_blacklist_title"
android:key="blacklist_applications"
android:dependency="heads_up_notifications_enabled" >
<Preference
android:key="add_blacklist_packages"
android:icon="@drawable/ic_menu_add_activated_tint"
android:title="@string/add_heads_up_package"
android:summary="@string/add_heads_up_blacklist_summary" />
</PreferenceCategory>
</PreferenceScreen> </PreferenceScreen>

View File

@@ -51,14 +51,19 @@ public class HeadsUpSettings extends SettingsPreferenceFragment
implements Preference.OnPreferenceClickListener { implements Preference.OnPreferenceClickListener {
private static final int DIALOG_STOPLIST_APPS = 0; private static final int DIALOG_STOPLIST_APPS = 0;
private static final int DIALOG_BLACKLIST_APPS = 1;
private PackageListAdapter mPackageAdapter; private PackageListAdapter mPackageAdapter;
private PackageManager mPackageManager; private PackageManager mPackageManager;
private PreferenceGroup mStoplistPrefList; private PreferenceGroup mStoplistPrefList;
private PreferenceGroup mBlacklistPrefList;
private Preference mAddStoplistPref; private Preference mAddStoplistPref;
private Preference mAddBlacklistPref;
private String mStoplistPackageList; private String mStoplistPackageList;
private String mBlacklistPackageList;
private Map<String, Package> mStoplistPackages; private Map<String, Package> mStoplistPackages;
private Map<String, Package> mBlacklistPackages;
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
@@ -71,11 +76,17 @@ public class HeadsUpSettings extends SettingsPreferenceFragment
mStoplistPrefList = (PreferenceGroup) findPreference("stoplist_applications"); mStoplistPrefList = (PreferenceGroup) findPreference("stoplist_applications");
mStoplistPrefList.setOrderingAsAdded(false); mStoplistPrefList.setOrderingAsAdded(false);
mBlacklistPrefList = (PreferenceGroup) findPreference("blacklist_applications");
mBlacklistPrefList.setOrderingAsAdded(false);
mStoplistPackages = new HashMap<String, Package>(); mStoplistPackages = new HashMap<String, Package>();
mBlacklistPackages = new HashMap<String, Package>();
mAddStoplistPref = findPreference("add_stoplist_packages"); mAddStoplistPref = findPreference("add_stoplist_packages");
mAddBlacklistPref = findPreference("add_blacklist_packages");
mAddStoplistPref.setOnPreferenceClickListener(this); mAddStoplistPref.setOnPreferenceClickListener(this);
mAddBlacklistPref.setOnPreferenceClickListener(this);
} }
@Override @Override
@@ -91,7 +102,7 @@ public class HeadsUpSettings extends SettingsPreferenceFragment
@Override @Override
public int getDialogMetricsCategory(int dialogId) { public int getDialogMetricsCategory(int dialogId) {
if (dialogId == DIALOG_STOPLIST_APPS) { if (dialogId == DIALOG_STOPLIST_APPS || dialogId == DIALOG_BLACKLIST_APPS ) {
return MetricsProto.MetricsEvent.CHERISH_SETTINGS; return MetricsProto.MetricsEvent.CHERISH_SETTINGS;
} }
return 0; return 0;
@@ -104,27 +115,35 @@ public class HeadsUpSettings extends SettingsPreferenceFragment
public Dialog onCreateDialog(int id) { public Dialog onCreateDialog(int id) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
final Dialog dialog; 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) { switch (id) {
case DIALOG_STOPLIST_APPS: case DIALOG_STOPLIST_APPS:
final ListView list = new ListView(getActivity());
list.setAdapter(mPackageAdapter);
builder.setTitle(R.string.profile_choose_app);
builder.setView(list);
dialog = builder.create();
list.setOnItemClickListener(new OnItemClickListener() { list.setOnItemClickListener(new OnItemClickListener() {
@Override @Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// Add empty application definition, the user will be able to edit it later // Add empty application definition, the user will be able to edit it later
PackageItem info = (PackageItem) parent.getItemAtPosition(position); PackageItem info = (PackageItem) parent.getItemAtPosition(position);
addCustomApplicationPref(info.packageName); addCustomApplicationPref(info.packageName, mStoplistPackages);
dialog.cancel(); dialog.cancel();
} }
}); });
break; break;
default: case DIALOG_BLACKLIST_APPS:
dialog = null; 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; return dialog;
} }
@@ -169,8 +188,9 @@ public class HeadsUpSettings extends SettingsPreferenceFragment
} }
// Add the Application Preferences // Add the Application Preferences
if (mStoplistPrefList != null) { if (mStoplistPrefList != null && mBlacklistPrefList != null) {
mStoplistPrefList.removeAll(); mStoplistPrefList.removeAll();
mBlacklistPrefList.removeAll();
for (Package pkg : mStoplistPackages.values()) { for (Package pkg : mStoplistPackages.values()) {
try { try {
@@ -180,27 +200,44 @@ public class HeadsUpSettings extends SettingsPreferenceFragment
// Do nothing // 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 // Keep these at the top
mAddStoplistPref.setOrder(0); mAddStoplistPref.setOrder(0);
mAddBlacklistPref.setOrder(0);
// Add 'add' options // Add 'add' options
mStoplistPrefList.addPreference(mAddStoplistPref); mStoplistPrefList.addPreference(mAddStoplistPref);
mBlacklistPrefList.addPreference(mAddBlacklistPref);
} }
@Override @Override
public boolean onPreferenceClick(Preference preference) { public boolean onPreferenceClick(Preference preference) {
if (preference == mAddStoplistPref) { if (preference == mAddStoplistPref) {
showDialog(DIALOG_STOPLIST_APPS); showDialog(DIALOG_STOPLIST_APPS);
} else if (preference == mAddBlacklistPref) {
showDialog(DIALOG_BLACKLIST_APPS);
} else { } else {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()) AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
.setTitle(R.string.dialog_delete_title) .setTitle(R.string.dialog_delete_title)
.setMessage(R.string.dialog_delete_message) .setMessage(R.string.dialog_delete_message)
.setIconAttribute(android.R.attr.alertDialogIcon) .setIconAttribute(android.R.attr.alertDialogIcon)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override @Override
public void onClick(DialogInterface dialog, int which) { public void onClick(DialogInterface dialog, int which) {
removeCustomApplicationPref(preference.getKey()); 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); .setNegativeButton(android.R.string.cancel, null);
@@ -210,12 +247,12 @@ public class HeadsUpSettings extends SettingsPreferenceFragment
return true; return true;
} }
private void addCustomApplicationPref(String packageName) { private void addCustomApplicationPref(String packageName, Map<String,Package> map) {
Package pkg = mStoplistPackages.get(packageName); Package pkg = map.get(packageName);
if (pkg == null) { if (pkg == null) {
pkg = new Package(packageName); pkg = new Package(packageName);
mStoplistPackages.put(packageName, pkg); map.put(packageName, pkg);
savePackageList(false); savePackageList(false, map);
refreshCustomApplicationPrefs(); refreshCustomApplicationPrefs();
} }
} }
@@ -235,51 +272,73 @@ public class HeadsUpSettings extends SettingsPreferenceFragment
return pref; return pref;
} }
private void removeCustomApplicationPref(String packageName) { private void removeApplicationPref(String packageName, Map<String,Package> map) {
if (mStoplistPackages.remove(packageName) != null) { if (map.remove(packageName) != null) {
savePackageList(false); savePackageList(false, map);
refreshCustomApplicationPrefs(); refreshCustomApplicationPrefs();
} }
} }
private boolean parsePackageList() { private boolean parsePackageList() {
boolean parsed = false;
final String stoplistString = Settings.System.getString(getContentResolver(), final String stoplistString = Settings.System.getString(getContentResolver(),
Settings.System.HEADS_UP_STOPLIST_VALUES); Settings.System.HEADS_UP_STOPLIST_VALUES);
final String blacklistString = Settings.System.getString(getContentResolver(),
Settings.System.HEADS_UP_BLACKLIST_VALUES);
if (TextUtils.equals(mStoplistPackageList, stoplistString)) { if (!TextUtils.equals(mStoplistPackageList, stoplistString)) {
return false;
}
mStoplistPackageList = stoplistString; mStoplistPackageList = stoplistString;
mStoplistPackages.clear(); mStoplistPackages.clear();
parseAndAddToMap(stoplistString, mStoplistPackages);
if (stoplistString != null) { parsed = true;
final String[] array = TextUtils.split(stoplistString, "\\|");
for (String item : array) {
if (TextUtils.isEmpty(item)) {
continue;
}
Package pkg = Package.fromString(item);
if (pkg != null) {
mStoplistPackages.put(pkg.name, pkg);
}
}
} }
return true; if (!TextUtils.equals(mBlacklistPackageList, blacklistString)) {
mBlacklistPackageList = blacklistString;
mBlacklistPackages.clear();
parseAndAddToMap(blacklistString, mBlacklistPackages);
parsed = true;
}
return parsed;
} }
private void savePackageList(boolean preferencesUpdated) { private void parseAndAddToMap(String baseString, Map<String,Package> 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<String,Package> map) {
String setting = map == mStoplistPackages
? Settings.System.HEADS_UP_STOPLIST_VALUES
: Settings.System.HEADS_UP_BLACKLIST_VALUES;
List<String> settings = new ArrayList<String>(); List<String> settings = new ArrayList<String>();
for (Package app : mStoplistPackages.values()) { for (Package app : map.values()) {
settings.add(app.toString()); settings.add(app.toString());
} }
final String value = TextUtils.join("|", settings); final String value = TextUtils.join("|", settings);
if (preferencesUpdated) { if (preferencesUpdated) {
if (TextUtils.equals(setting, Settings.System.HEADS_UP_STOPLIST_VALUES)) {
mStoplistPackageList = value; mStoplistPackageList = value;
} else {
mBlacklistPackageList = value;
} }
}
Settings.System.putString(getContentResolver(), Settings.System.putString(getContentResolver(),
Settings.System.HEADS_UP_STOPLIST_VALUES, value); setting, value);
} }
} }