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:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user