Create a page to manage dnd permission for individual app

- Change the original ZenAccessPage to
  - Remove the inline switch
  - Make the preference click target go into the new detail page
  - Some formatting/style change.

- Create a new detail page for zen access.
  - Exit if app didn't declare this permission
  - Preset the switch toggle to their current permission grant state
  - Move the warning dialog logic from ZenAccessSettings to here.

- Move some common functionality into ZenAccessController, a static
  helper class

Bug: 128547723
Test: robotest
Change-Id: I1ebb32396869d07ff4283b300bd716506298c9b5
This commit is contained in:
Fan Zhang
2019-03-15 16:41:24 -07:00
parent 9f5e7b77ff
commit 5bb2a87b7f
12 changed files with 635 additions and 284 deletions

View File

@@ -17,12 +17,29 @@
package com.android.settings.applications.specialaccess.zenaccess;
import android.app.ActivityManager;
import android.app.AppGlobals;
import android.app.NotificationManager;
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.ParceledListSlice;
import android.os.AsyncTask;
import android.os.RemoteException;
import android.util.ArraySet;
import android.util.Log;
import androidx.annotation.VisibleForTesting;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.overlay.FeatureFactory;
import java.util.List;
import java.util.Set;
public class ZenAccessController extends BasePreferenceController {
private static final String TAG = "ZenAccessController";
private final ActivityManager mActivityManager;
public ZenAccessController(Context context, String preferenceKey) {
@@ -32,8 +49,68 @@ public class ZenAccessController extends BasePreferenceController {
@Override
public int getAvailabilityStatus() {
return !mActivityManager.isLowRamDevice()
return isSupported(mActivityManager)
? AVAILABLE_UNSEARCHABLE
: UNSUPPORTED_ON_DEVICE;
}
public static boolean isSupported(ActivityManager activityManager) {
return !activityManager.isLowRamDevice();
}
public static Set<String> getPackagesRequestingNotificationPolicyAccess() {
final ArraySet<String> requestingPackages = new ArraySet<>();
try {
final String[] PERM = {
android.Manifest.permission.ACCESS_NOTIFICATION_POLICY
};
final ParceledListSlice list = AppGlobals.getPackageManager()
.getPackagesHoldingPermissions(PERM, 0 /*flags*/,
ActivityManager.getCurrentUser());
final List<PackageInfo> pkgs = list.getList();
if (pkgs != null) {
for (PackageInfo info : pkgs) {
requestingPackages.add(info.packageName);
}
}
} catch (RemoteException e) {
Log.e(TAG, "Cannot reach packagemanager", e);
}
return requestingPackages;
}
public static Set<String> getAutoApprovedPackages(Context context) {
final Set<String> autoApproved = new ArraySet<>();
autoApproved.addAll(context.getSystemService(NotificationManager.class)
.getEnabledNotificationListenerPackages());
return autoApproved;
}
public static boolean hasAccess(Context context, String pkg) {
return context.getSystemService(
NotificationManager.class).isNotificationPolicyAccessGrantedForPackage(pkg);
}
public static void setAccess(final Context context, final String pkg, final boolean access) {
logSpecialPermissionChange(access, pkg, context);
AsyncTask.execute(() -> {
final NotificationManager mgr = context.getSystemService(NotificationManager.class);
mgr.setNotificationPolicyAccessGranted(pkg, access);
});
}
public static void deleteRules(final Context context, final String pkg) {
AsyncTask.execute(() -> {
final NotificationManager mgr = context.getSystemService(NotificationManager.class);
mgr.removeAutomaticZenRules(pkg);
});
}
@VisibleForTesting
static void logSpecialPermissionChange(boolean enable, String packageName, Context context) {
int logCategory = enable ? SettingsEnums.APP_SPECIAL_PERMISSION_DND_ALLOW
: SettingsEnums.APP_SPECIAL_PERMISSION_DND_DENY;
FeatureFactory.getFactory(context).getMetricsFeatureProvider().action(context,
logCategory, packageName);
}
}