OSDN Git Service

Default grant coarse loc perm to use-open-wifi app
authorEric Enslen <enslen@google.com>
Mon, 18 Dec 2017 19:30:21 +0000 (11:30 -0800)
committerEric Enslen <enslen@google.com>
Thu, 4 Jan 2018 18:43:46 +0000 (10:43 -0800)
Bug: 70843697
Test: flashed onto walleye and confirmed permission granted when WFA is
enabled.

Change-Id: Ic53886478ec6b8bef311f2f94e0976f7870c8cd1

api/test-current.txt
core/java/android/content/pm/PackageManagerInternal.java
core/java/android/provider/Settings.java
services/core/java/com/android/server/NetworkScoreService.java
services/core/java/com/android/server/pm/PackageManagerService.java
services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java

index d56b085..b4f4f67 100644 (file)
@@ -435,6 +435,10 @@ package android.provider {
     field public static final java.lang.String ACTION_ENTERPRISE_PRIVACY_SETTINGS = "android.settings.ENTERPRISE_PRIVACY_SETTINGS";
   }
 
+  public static final class Settings.Global extends android.provider.Settings.NameValueTable {
+    field public static final java.lang.String USE_OPEN_WIFI_PACKAGE = "use_open_wifi_package";
+  }
+
   public static final class Settings.Secure extends android.provider.Settings.NameValueTable {
     field public static final java.lang.String ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED = "accessibility_display_magnification_enabled";
     field public static final java.lang.String AUTOFILL_FEATURE_FIELD_CLASSIFICATION = "autofill_field_classification";
index 8ee8e10..2c45b8d 100644 (file)
@@ -119,6 +119,12 @@ public abstract class PackageManagerInternal {
     public abstract void setSimCallManagerPackagesProvider(PackagesProvider provider);
 
     /**
+     * Sets the Use Open Wifi packages provider.
+     * @param provider The packages provider.
+     */
+    public abstract void setUseOpenWifiAppPackagesProvider(PackagesProvider provider);
+
+    /**
      * Sets the sync adapter packages provider.
      * @param provider The provider.
      */
@@ -147,6 +153,14 @@ public abstract class PackageManagerInternal {
             int userId);
 
     /**
+     * Requests granting of the default permissions to the current default Use Open Wifi app.
+     * @param packageName The default use open wifi package name.
+     * @param userId The user for which to grant the permissions.
+     */
+    public abstract void grantDefaultPermissionsToDefaultUseOpenWifiApp(String packageName,
+            int userId);
+
+    /**
      * Sets a list of apps to keep in PM's internal data structures and as APKs even if no user has
      * currently installed it. The apps are not preloaded.
      * @param packageList List of package names to keep cached.
index 2f86514..009fc39 100644 (file)
@@ -8790,6 +8790,7 @@ public final class Settings {
          * Type: string package name or null if the feature is either not provided or disabled.
          * @hide
          */
+        @TestApi
         public static final String USE_OPEN_WIFI_PACKAGE = "use_open_wifi_package";
 
         /**
index 44c0227..33f7769 100644 (file)
@@ -26,6 +26,7 @@ import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.ServiceConnection;
 import android.content.pm.PackageManager;
+import android.content.pm.PackageManagerInternal;
 import android.database.ContentObserver;
 import android.location.LocationManager;
 import android.net.INetworkRecommendationProvider;
@@ -50,14 +51,17 @@ import android.os.RemoteCallbackList;
 import android.os.RemoteException;
 import android.os.UserHandle;
 import android.provider.Settings.Global;
+import android.text.TextUtils;
 import android.util.ArrayMap;
 import android.util.ArraySet;
+import android.util.IntArray;
 import android.util.Log;
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.content.PackageMonitor;
 import com.android.internal.os.TransferPipe;
+import com.android.internal.telephony.SmsApplication;
 import com.android.internal.util.DumpUtils;
 
 import java.io.FileDescriptor;
@@ -91,7 +95,8 @@ public class NetworkScoreService extends INetworkScoreService.Stub {
     private final Object mPackageMonitorLock = new Object();
     private final Object mServiceConnectionLock = new Object();
     private final Handler mHandler;
-    private final DispatchingContentObserver mContentObserver;
+    private final DispatchingContentObserver mRecommendationSettingsObserver;
+    private final ContentObserver mUseOpenWifiPackageObserver;
     private final Function<NetworkScorerAppData, ScoringServiceConnection> mServiceConnProducer;
 
     @GuardedBy("mPackageMonitorLock")
@@ -255,8 +260,40 @@ public class NetworkScoreService extends INetworkScoreService.Stub {
         mContext.registerReceiverAsUser(
                 mLocationModeReceiver, UserHandle.SYSTEM, locationModeFilter,
                 null /* broadcastPermission*/, mHandler);
-        mContentObserver = new DispatchingContentObserver(context, mHandler);
+        mRecommendationSettingsObserver = new DispatchingContentObserver(context, mHandler);
         mServiceConnProducer = serviceConnProducer;
+        mUseOpenWifiPackageObserver = new ContentObserver(mHandler) {
+            @Override
+            public void onChange(boolean selfChange, Uri uri, int userId) {
+                Uri useOpenWifiPkgUri = Global.getUriFor(Global.USE_OPEN_WIFI_PACKAGE);
+                if (useOpenWifiPkgUri.equals(uri)) {
+                    String useOpenWifiPackage = Global.getString(mContext.getContentResolver(),
+                            Global.USE_OPEN_WIFI_PACKAGE);
+                    if (!TextUtils.isEmpty(useOpenWifiPackage)) {
+                        LocalServices.getService(PackageManagerInternal.class)
+                                .grantDefaultPermissionsToDefaultUseOpenWifiApp(useOpenWifiPackage,
+                                        userId);
+                    }
+                }
+            }
+        };
+        mContext.getContentResolver().registerContentObserver(
+                Global.getUriFor(Global.USE_OPEN_WIFI_PACKAGE),
+                false /*notifyForDescendants*/,
+                mUseOpenWifiPackageObserver);
+        // Set a callback for the package manager to query the use open wifi app.
+        LocalServices.getService(PackageManagerInternal.class).setUseOpenWifiAppPackagesProvider(
+                new PackageManagerInternal.PackagesProvider() {
+                    @Override
+                    public String[] getPackages(int userId) {
+                        String useOpenWifiPackage = Global.getString(mContext.getContentResolver(),
+                                Global.USE_OPEN_WIFI_PACKAGE);
+                        if (!TextUtils.isEmpty(useOpenWifiPackage)) {
+                            return new String[]{useOpenWifiPackage};
+                        }
+                        return null;
+                    }
+                });
     }
 
     /** Called when the system is ready to run third-party code but before it actually does so. */
@@ -287,11 +324,11 @@ public class NetworkScoreService extends INetworkScoreService.Stub {
 
     private void registerRecommendationSettingsObserver() {
         final Uri packageNameUri = Global.getUriFor(Global.NETWORK_RECOMMENDATIONS_PACKAGE);
-        mContentObserver.observe(packageNameUri,
+        mRecommendationSettingsObserver.observe(packageNameUri,
                 ServiceHandler.MSG_RECOMMENDATIONS_PACKAGE_CHANGED);
 
         final Uri settingUri = Global.getUriFor(Global.NETWORK_RECOMMENDATIONS_ENABLED);
-        mContentObserver.observe(settingUri,
+        mRecommendationSettingsObserver.observe(settingUri,
                 ServiceHandler.MSG_RECOMMENDATION_ENABLED_SETTING_CHANGED);
     }
 
index 1157af4..2d55698 100644 (file)
@@ -23049,6 +23049,11 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
         }
 
         @Override
+        public void setUseOpenWifiAppPackagesProvider(PackagesProvider provider) {
+            mDefaultPermissionPolicy.setUseOpenWifiAppPackagesProvider(provider);
+        }
+
+        @Override
         public void setSyncAdapterPackagesprovider(SyncAdapterPackagesProvider provider) {
             mDefaultPermissionPolicy.setSyncAdapterPackagesProvider(provider);
         }
@@ -23073,6 +23078,12 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
         }
 
         @Override
+        public void grantDefaultPermissionsToDefaultUseOpenWifiApp(String packageName, int userId) {
+            mDefaultPermissionPolicy.grantDefaultPermissionsToDefaultUseOpenWifiApp(
+                    packageName, userId);
+        }
+
+        @Override
         public void setKeepUninstalledPackages(final List<String> packageList) {
             Preconditions.checkNotNull(packageList);
             List<String> removedFromList = null;
index d38dc9a..34c3ce3 100644 (file)
@@ -135,6 +135,11 @@ public final class DefaultPermissionGrantPolicy {
         LOCATION_PERMISSIONS.add(Manifest.permission.ACCESS_COARSE_LOCATION);
     }
 
+    private static final Set<String> COARSE_LOCATION_PERMISSIONS = new ArraySet<>();
+    static {
+        COARSE_LOCATION_PERMISSIONS.add(Manifest.permission.ACCESS_COARSE_LOCATION);
+    }
+
     private static final Set<String> CALENDAR_PERMISSIONS = new ArraySet<>();
     static {
         CALENDAR_PERMISSIONS.add(Manifest.permission.READ_CALENDAR);
@@ -183,6 +188,7 @@ public final class DefaultPermissionGrantPolicy {
     private PackagesProvider mSmsAppPackagesProvider;
     private PackagesProvider mDialerAppPackagesProvider;
     private PackagesProvider mSimCallManagerPackagesProvider;
+    private PackagesProvider mUseOpenWifiAppPackagesProvider;
     private SyncAdapterPackagesProvider mSyncAdapterPackagesProvider;
 
     private ArrayMap<String, List<DefaultPermissionGrant>> mGrantExceptions;
@@ -247,6 +253,12 @@ public final class DefaultPermissionGrantPolicy {
         }
     }
 
+    public void setUseOpenWifiAppPackagesProvider(PackagesProvider provider) {
+        synchronized (mLock) {
+            mUseOpenWifiAppPackagesProvider = provider;
+        }
+    }
+
     public void setSyncAdapterPackagesProvider(SyncAdapterPackagesProvider provider) {
         synchronized (mLock) {
             mSyncAdapterPackagesProvider = provider;
@@ -320,6 +332,7 @@ public final class DefaultPermissionGrantPolicy {
         final PackagesProvider smsAppPackagesProvider;
         final PackagesProvider dialerAppPackagesProvider;
         final PackagesProvider simCallManagerPackagesProvider;
+        final PackagesProvider useOpenWifiAppPackagesProvider;
         final SyncAdapterPackagesProvider syncAdapterPackagesProvider;
 
         synchronized (mLock) {
@@ -328,6 +341,7 @@ public final class DefaultPermissionGrantPolicy {
             smsAppPackagesProvider = mSmsAppPackagesProvider;
             dialerAppPackagesProvider = mDialerAppPackagesProvider;
             simCallManagerPackagesProvider = mSimCallManagerPackagesProvider;
+            useOpenWifiAppPackagesProvider = mUseOpenWifiAppPackagesProvider;
             syncAdapterPackagesProvider = mSyncAdapterPackagesProvider;
         }
 
@@ -341,6 +355,8 @@ public final class DefaultPermissionGrantPolicy {
                 ? dialerAppPackagesProvider.getPackages(userId) : null;
         String[] simCallManagerPackageNames = (simCallManagerPackagesProvider != null)
                 ? simCallManagerPackagesProvider.getPackages(userId) : null;
+        String[] useOpenWifiAppPackageNames = (useOpenWifiAppPackagesProvider != null)
+                ? useOpenWifiAppPackagesProvider.getPackages(userId) : null;
         String[] contactsSyncAdapterPackages = (syncAdapterPackagesProvider != null) ?
                 syncAdapterPackagesProvider.getPackages(ContactsContract.AUTHORITY, userId) : null;
         String[] calendarSyncAdapterPackages = (syncAdapterPackagesProvider != null) ?
@@ -458,6 +474,18 @@ public final class DefaultPermissionGrantPolicy {
             }
         }
 
+        // Use Open Wifi
+        if (useOpenWifiAppPackageNames != null) {
+            for (String useOpenWifiPackageName : useOpenWifiAppPackageNames) {
+                PackageParser.Package useOpenWifiPackage =
+                        getSystemPackage(useOpenWifiPackageName);
+                if (useOpenWifiPackage != null) {
+                    grantDefaultPermissionsToDefaultSystemUseOpenWifiApp(useOpenWifiPackage,
+                            userId);
+                }
+            }
+        }
+
         // SMS
         if (smsAppPackageNames == null) {
             Intent smsIntent = new Intent(Intent.ACTION_MAIN);
@@ -827,6 +855,13 @@ public final class DefaultPermissionGrantPolicy {
         }
     }
 
+    private void grantDefaultPermissionsToDefaultSystemUseOpenWifiApp(
+            PackageParser.Package useOpenWifiPackage, int userId) {
+        if (doesPackageSupportRuntimePermissions(useOpenWifiPackage)) {
+            grantRuntimePermissions(useOpenWifiPackage, COARSE_LOCATION_PERMISSIONS, userId);
+        }
+    }
+
     public void grantDefaultPermissionsToDefaultSmsApp(String packageName, int userId) {
         Log.i(TAG, "Granting permissions to default sms app for user:" + userId);
         if (packageName == null) {
@@ -859,6 +894,19 @@ public final class DefaultPermissionGrantPolicy {
         }
     }
 
+    public void grantDefaultPermissionsToDefaultUseOpenWifiApp(String packageName, int userId) {
+        Log.i(TAG, "Granting permissions to default Use Open WiFi app for user:" + userId);
+        if (packageName == null) {
+            return;
+        }
+        PackageParser.Package useOpenWifiPackage = getPackage(packageName);
+        if (useOpenWifiPackage != null
+                && doesPackageSupportRuntimePermissions(useOpenWifiPackage)) {
+            grantRuntimePermissions(
+                    useOpenWifiPackage, COARSE_LOCATION_PERMISSIONS, false, true, userId);
+        }
+    }
+
     private void grantDefaultPermissionsToDefaultSimCallManager(
             PackageParser.Package simCallManagerPackage, int userId) {
         Log.i(TAG, "Granting permissions to sim call manager for user:" + userId);
@@ -1014,7 +1062,7 @@ public final class DefaultPermissionGrantPolicy {
     }
 
     private void grantRuntimePermissions(PackageParser.Package pkg, Set<String> permissions,
-            boolean systemFixed, boolean isDefaultPhoneOrSms, int userId) {
+            boolean systemFixed, boolean ignoreSystemPackage, int userId) {
         if (pkg.requestedPermissions.isEmpty()) {
             return;
         }
@@ -1022,13 +1070,13 @@ public final class DefaultPermissionGrantPolicy {
         List<String> requestedPermissions = pkg.requestedPermissions;
         Set<String> grantablePermissions = null;
 
-        // If this is the default Phone or SMS app we grant permissions regardless
-        // whether the version on the system image declares the permission as used since
-        // selecting the app as the default Phone or SMS the user makes a deliberate
+        // In some cases, like for the Phone or SMS app, we grant permissions regardless
+        // of if the version on the system image declares the permission as used since
+        // selecting the app as the default for that function the user makes a deliberate
         // choice to grant this app the permissions needed to function. For all other
         // apps, (default grants on first boot and user creation) we don't grant default
         // permissions if the version on the system image does not declare them.
-        if (!isDefaultPhoneOrSms && pkg.isUpdatedSystemApp()) {
+        if (!ignoreSystemPackage && pkg.isUpdatedSystemApp()) {
             final PackageParser.Package disabledPkg =
                     mServiceInternal.getDisabledPackage(pkg.packageName);
             if (disabledPkg != null) {
@@ -1062,7 +1110,7 @@ public final class DefaultPermissionGrantPolicy {
                 // Unless the caller wants to override user choices. The override is
                 // to make sure we can grant the needed permission to the default
                 // sms and phone apps after the user chooses this in the UI.
-                if (flags == 0 || isDefaultPhoneOrSms) {
+                if (flags == 0 || ignoreSystemPackage) {
                     // Never clobber policy or system.
                     final int fixedFlags = PackageManager.FLAG_PERMISSION_SYSTEM_FIXED
                             | PackageManager.FLAG_PERMISSION_POLICY_FIXED;
index 3b7db9f..4176d2a 100644 (file)
@@ -24,12 +24,15 @@ import static junit.framework.Assert.assertTrue;
 import static junit.framework.Assert.fail;
 
 import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyBoolean;
 import static org.mockito.Matchers.anyListOf;
 import static org.mockito.Matchers.anyString;
 import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.atLeastOnce;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.timeout;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
@@ -42,7 +45,9 @@ import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
+import android.content.pm.PackageManagerInternal;
 import android.content.res.Resources;
+import android.database.ContentObserver;
 import android.net.INetworkRecommendationProvider;
 import android.net.INetworkScoreCache;
 import android.net.NetworkKey;
@@ -63,6 +68,7 @@ import android.os.Looper;
 import android.os.Message;
 import android.os.RemoteException;
 import android.os.UserHandle;
+import android.provider.Settings;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.MediumTest;
 import android.support.test.runner.AndroidJUnit4;
@@ -128,7 +134,9 @@ public class NetworkScoreServiceTest {
     @Mock private UnaryOperator<List<ScoredNetwork>> mScanResultsFilter;
     @Mock private WifiInfo mWifiInfo;
     @Mock private NetworkScoreService.ScoringServiceConnection mServiceConnection;
+    @Mock private PackageManagerInternal mPackageManagerInternal;
     @Captor private ArgumentCaptor<List<ScoredNetwork>> mScoredNetworkCaptor;
+    @Captor private ArgumentCaptor<PackageManagerInternal.PackagesProvider> mPackagesProviderCaptor;
 
     private ContentResolver mContentResolver;
     private NetworkScoreService mNetworkScoreService;
@@ -156,6 +164,7 @@ public class NetworkScoreServiceTest {
         when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(NEW_SCORER);
         mHandlerThread = new HandlerThread("NetworkScoreServiceTest");
         mHandlerThread.start();
+        LocalServices.addService(PackageManagerInternal.class, mPackageManagerInternal);
         mNetworkScoreService = new NetworkScoreService(mContext, mNetworkScorerAppManager,
                 networkScorerAppData -> mServiceConnection, mHandlerThread.getLooper());
         WifiConfiguration configuration = new WifiConfiguration();
@@ -181,6 +190,29 @@ public class NetworkScoreServiceTest {
     @After
     public void tearDown() throws Exception {
         mHandlerThread.quitSafely();
+        LocalServices.removeServiceForTest(PackageManagerInternal.class);
+    }
+
+    @Test
+    public void testConstructor_setsUseOpenWifiPackagesProvider() {
+        Settings.Global.putString(mContentResolver,
+                Settings.Global.USE_OPEN_WIFI_PACKAGE, "com.some.app");
+
+        verify(mPackageManagerInternal)
+                .setUseOpenWifiAppPackagesProvider(mPackagesProviderCaptor.capture());
+
+        String[] packages = mPackagesProviderCaptor.getValue().getPackages(0);
+        assertEquals(1, packages.length);
+        assertEquals("com.some.app", packages[0]);
+    }
+
+    @Test
+    public void testConstructor_registersUseOpenWifiPackageContentObserver() {
+        Settings.Global.putString(mContentResolver,
+                Settings.Global.USE_OPEN_WIFI_PACKAGE, "com.some.other.app");
+
+        verify(mPackageManagerInternal, timeout(500))
+                .grantDefaultPermissionsToDefaultUseOpenWifiApp("com.some.other.app", 0);
     }
 
     @Test
@@ -947,8 +979,8 @@ public class NetworkScoreServiceTest {
     }
 
     private static class CountDownHandler extends Handler {
-        CountDownLatch latch = new CountDownLatch(1);
-        int receivedWhat;
+        final CountDownLatch latch = new CountDownLatch(1);
+        volatile int receivedWhat;
 
         CountDownHandler(Looper looper) {
             super(looper);
@@ -956,8 +988,8 @@ public class NetworkScoreServiceTest {
 
         @Override
         public void handleMessage(Message msg) {
-            latch.countDown();
             receivedWhat = msg.what;
+            latch.countDown();
         }
     }
 }