OSDN Git Service

Couple more Scoped Directory Access changes.
authorFelipe Leme <felipeal@google.com>
Tue, 3 Apr 2018 20:03:45 +0000 (13:03 -0700)
committerFelipe Leme <felipeal@google.com>
Tue, 3 Apr 2018 21:08:10 +0000 (14:08 -0700)
- Moved DirectoryAccessDetails rendering logic to refreshUi so it's updated.
- Call ScopedAccessProvider to reset preferences on "Clear access" UI.

Test: manual verification
Test: atest CtsAppSecurityHostTestCases:ScopedDirectoryAccessTest#testResetDoNotAskAgain,testResetGranted

Bug: 72055774
Change-Id: I4a6bf187cacfb59d948abbe71afc3b7500cb15aa

src/com/android/settings/applications/AppStorageSettings.java
src/com/android/settings/applications/DirectoryAccessDetails.java

index 7382d20..6e85f56 100644 (file)
@@ -18,12 +18,19 @@ package com.android.settings.applications;
 
 import static android.content.pm.ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA;
 import static android.content.pm.ApplicationInfo.FLAG_SYSTEM;
+import static android.os.storage.StorageVolume.ScopedAccessProviderContract.AUTHORITY;
+import static android.os.storage.StorageVolume.ScopedAccessProviderContract.COL_GRANTED;
+import static android.os.storage.StorageVolume.ScopedAccessProviderContract.TABLE_PERMISSIONS;
+
+import static com.android.settings.applications.AppStateDirectoryAccessBridge.DEBUG;
 
 import android.app.ActivityManager;
 import android.app.AlertDialog;
 import android.app.AppGlobals;
 import android.app.GrantedUriPermission;
 import android.app.LoaderManager;
+import android.content.ContentResolver;
+import android.content.ContentValues;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
@@ -32,6 +39,7 @@ import android.content.pm.ApplicationInfo;
 import android.content.pm.IPackageDataObserver;
 import android.content.pm.PackageManager;
 import android.content.pm.ProviderInfo;
+import android.net.Uri;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
@@ -369,7 +377,7 @@ public class AppStorageSettings extends AppInfoWithHeader
         boolean res = am.clearApplicationUserData(packageName, mClearDataObserver);
         if (!res) {
             // Clearing data failed for some obscure reason. Just log error for now
-            Log.i(TAG, "Couldnt clear application user data for package:" + packageName);
+            Log.i(TAG, "Couldn't clear application user data for package:" + packageName);
             showDialogInner(DLG_CANNOT_CLEAR_DATA, 0);
         } else {
             mButtonsPref.setButton1Text(R.string.recompute_size);
@@ -449,10 +457,23 @@ public class AppStorageSettings extends AppInfoWithHeader
     }
 
     private void clearUriPermissions() {
+        final Context context = getActivity();
+        final String packageName = mAppEntry.info.packageName;
         // Synchronously revoke the permissions.
-        final ActivityManager am = (ActivityManager) getActivity().getSystemService(
+        final ActivityManager am = (ActivityManager) context.getSystemService(
                 Context.ACTIVITY_SERVICE);
-        am.clearGrantedUriPermissions(mAppEntry.info.packageName);
+        am.clearGrantedUriPermissions(packageName);
+
+
+        // Also update the Scoped Directory Access UI permissions
+        final Uri providerUri = new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
+                .authority(AUTHORITY).appendPath(TABLE_PERMISSIONS).appendPath("*")
+                .build();
+        Log.v(TAG, "Asking " + providerUri + " to delete permissions for " + packageName);
+        final int deleted = context.getContentResolver().delete(providerUri, null, new String[] {
+                packageName
+        });
+        Log.d(TAG, "Deleted " + deleted + " entries for package " + packageName);
 
         // Update UI
         refreshGrantedUriPermissions();
index 8346e78..4876e3d 100644 (file)
@@ -121,9 +121,15 @@ public class DirectoryAccessDetails extends AppInfoBase {
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        final Context context = getPrefContext();
         addPreferencesFromResource(R.xml.directory_access_details);
+
+    }
+
+    @Override
+    protected boolean refreshUi() {
+        final Context context = getPrefContext();
         final PreferenceScreen prefsGroup = getPreferenceScreen();
+        prefsGroup.removeAll();
 
         final Map<String, ExternalVolume> externalVolumes = new HashMap<>();
 
@@ -135,14 +141,14 @@ public class DirectoryAccessDetails extends AppInfoBase {
                 TABLE_PERMISSIONS_COLUMNS, null, new String[] { mPackageName }, null)) {
             if (cursor == null) {
                 Log.w(TAG, "Didn't get cursor for " + mPackageName);
-                return;
+                return true;
             }
             final int count = cursor.getCount();
             if (count == 0) {
                 // This setting screen should not be reached if there was no permission, so just
                 // ignore it
                 Log.w(TAG, "No permissions for " + mPackageName);
-                return;
+                return true;
             }
 
             while (cursor.moveToNext()) {
@@ -163,9 +169,14 @@ public class DirectoryAccessDetails extends AppInfoBase {
                 }
 
                 if (uuid == null) {
-                    // Primary storage entry: add right away
-                    prefsGroup.addPreference(newPreference(context, dir, providerUri,
-                            /* uuid= */ null, dir, granted, /* children= */ null));
+                    if (dir == null) {
+                        // Sanity check, shouldn't happen
+                        Log.wtf(TAG, "Ignoring permission on primary storage root");
+                    } else {
+                        // Primary storage entry: add right away
+                        prefsGroup.addPreference(newPreference(context, dir, providerUri,
+                                /* uuid= */ null, dir, granted, /* children= */ null));
+                    }
                 } else {
                     // External volume entry: save it for later.
                     ExternalVolume externalVolume = externalVolumes.get(uuid);
@@ -190,7 +201,7 @@ public class DirectoryAccessDetails extends AppInfoBase {
 
         if (externalVolumes.isEmpty()) {
             // We're done!
-            return;
+            return true;
         }
 
         // Add entries from external volumes
@@ -200,7 +211,7 @@ public class DirectoryAccessDetails extends AppInfoBase {
         final List<VolumeInfo> volumes = sm.getVolumes();
         if (volumes.isEmpty()) {
             Log.w(TAG, "StorageManager returned no secondary volumes");
-            return;
+            return true;
         }
         final Map<String, String> volumeNames = new HashMap<>(volumes.size());
         for (VolumeInfo volume : volumes) {
@@ -243,6 +254,7 @@ public class DirectoryAccessDetails extends AppInfoBase {
                 children.add(childPref);
             });
         }
+        return true;
     }
 
     private SwitchPreference newPreference(Context context, String title, Uri providerUri,
@@ -288,11 +300,6 @@ public class DirectoryAccessDetails extends AppInfoBase {
     }
 
     @Override
-    protected boolean refreshUi() {
-        return true;
-    }
-
-    @Override
     protected AlertDialog createDialog(int id, int errorCode) {
         return null;
     }