diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1601a7685..697c368e0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -20,6 +20,8 @@ Changelog
**Next release**
+* Reverted "Manage white/black lists from usage data" ([issue](/../../issues/2093))
+* Added menu *Manage whitelists* to usage data view for a single application ([issue](/../../issues/2093))
* Updated Czech translation
[Open issues](https://github.com/M66B/XPrivacy/issues?state=open)
diff --git a/res/menu/usage.xml b/res/menu/usage.xml
index 452c79270..80a33590e 100644
--- a/res/menu/usage.xml
+++ b/res/menu/usage.xml
@@ -10,6 +10,9 @@
+
diff --git a/src/biz/bokhorst/xprivacy/ActivityUsage.java b/src/biz/bokhorst/xprivacy/ActivityUsage.java
index 2d9bcd41f..922ae2383 100644
--- a/src/biz/bokhorst/xprivacy/ActivityUsage.java
+++ b/src/biz/bokhorst/xprivacy/ActivityUsage.java
@@ -11,7 +11,9 @@
import java.util.concurrent.ThreadFactory;
import android.annotation.SuppressLint;
+import android.app.AlertDialog;
import android.content.Context;
+import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
@@ -101,6 +103,12 @@ public boolean onCreateOptionsMenu(Menu menu) {
return false;
}
+ @Override
+ public boolean onPrepareOptionsMenu(Menu menu) {
+ menu.findItem(R.id.menu_whitelists).setVisible(mUid != 0);
+ return super.onPrepareOptionsMenu(menu);
+ }
+
@Override
public boolean onOptionsItemSelected(MenuItem item) {
UsageTask usageTask;
@@ -132,6 +140,16 @@ public boolean onOptionsItemSelected(MenuItem item) {
usageTask.executeOnExecutor(mExecutor, (Object) null);
return true;
+ case R.id.menu_whitelists:
+ if (Util.hasProLicense(this) == null) {
+ // Redirect to pro page
+ Util.viewUri(this, ActivityMain.cProUri);
+ } else {
+ WhitelistTask whitelistsTask = new WhitelistTask(mUid, null, this);
+ whitelistsTask.executeOnExecutor(mExecutor, (Object) null);
+ }
+ return true;
+
case R.id.menu_settings:
Intent intent = new Intent(this, ActivitySettings.class);
startActivity(intent);
@@ -301,33 +319,56 @@ public void onClick(View view) {
View.OnLongClickListener longClickListener = new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
- final int userId = Util.getUserId(Process.myUid());
+ int userId = Util.getUserId(Process.myUid());
final PRestriction usageData = mUsageAdapter.getItem(position);
final Hook hook = PrivacyManager.getHook(usageData.restrictionName, usageData.methodName);
- final boolean isApp = PrivacyManager.isApplication(usageData.uid);
- final boolean odSystem = PrivacyManager.getSettingBool(userId,
+ boolean isApp = PrivacyManager.isApplication(usageData.uid);
+ boolean odSystem = PrivacyManager.getSettingBool(userId,
PrivacyManager.cSettingOnDemandSystem, false);
+ final boolean wnomod = PrivacyManager.getSettingBool(usageData.uid,
+ PrivacyManager.cSettingWhitelistNoModify, false);
if ((isApp || odSystem) && hook != null && hook.whitelist() != null
&& usageData.extra != null) {
if (Util.hasProLicense(ActivityUsage.this) == null)
Util.viewUri(ActivityUsage.this, ActivityMain.cProUri);
else {
- // Toggle whitelist entry
- Boolean current = PrivacyManager.getSettingBool(usageData.uid, hook.whitelist(),
- usageData.extra, false);
- PrivacyManager.setSetting(usageData.uid, hook.whitelist(), usageData.extra,
- Boolean.toString(!current));
- final boolean wnomod = PrivacyManager.getSettingBool(usageData.uid,
- PrivacyManager.cSettingWhitelistNoModify, false);
- if (!wnomod)
- PrivacyManager.updateState(usageData.uid);
-
- // Show whitelist manager
- WhitelistTask whitelistsTask = new WhitelistTask(usageData.uid, hook.whitelist(),
- ActivityUsage.this);
- whitelistsTask.executeOnExecutor(mExecutor, (Object) null);
+ AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(ActivityUsage.this);
+ alertDialogBuilder.setTitle(R.string.menu_whitelists);
+ alertDialogBuilder.setMessage(usageData.restrictionName + "/"
+ + usageData.methodName + "(" + usageData.extra + ")");
+ alertDialogBuilder.setIcon(getThemed(R.attr.icon_launcher));
+ alertDialogBuilder.setPositiveButton(getString(R.string.title_deny),
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ // Deny
+ PrivacyManager.setSetting(usageData.uid, hook.whitelist(),
+ usageData.extra, Boolean.toString(false));
+ if (!wnomod)
+ PrivacyManager.updateState(usageData.uid);
+ }
+ });
+ alertDialogBuilder.setNeutralButton(getString(R.string.title_allow),
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ // Allow
+ PrivacyManager.setSetting(usageData.uid, hook.whitelist(),
+ usageData.extra, Boolean.toString(true));
+ if (!wnomod)
+ PrivacyManager.updateState(usageData.uid);
+ }
+ });
+ alertDialogBuilder.setNegativeButton(getString(android.R.string.cancel),
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ }
+ });
+ AlertDialog alertDialog = alertDialogBuilder.create();
+ alertDialog.show();
}
return true;
} else