diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-01-21 00:01:16 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-01-21 00:01:16 +0000 |
commit | dc45a3cd0b0f45ad1e786c4b9e078bd54c752b9b (patch) | |
tree | 3f243c272a1e8367fb90b5c03c2f9bf4185bc3bd | |
parent | a8b76922c3722f452b7b6a9dacef615e0105cdbc (diff) | |
parent | 2c38f8cb52fd72b2ad2b8a3a973026d81c6022ac (diff) | |
download | cts-dc45a3cd0b0f45ad1e786c4b9e078bd54c752b9b.tar.gz |
Snap for 8099527 from 2c38f8cb52fd72b2ad2b8a3a973026d81c6022ac to sc-d2-release
Change-Id: I2516c2e15b7db45ded626612d79046f6496b4080
-rw-r--r-- | tests/location/location_gnss/AndroidManifest.xml | 1 | ||||
-rw-r--r-- | tests/location/location_gnss/src/android/location/cts/gnss/GnssStatusTest.java | 88 |
2 files changed, 85 insertions, 4 deletions
diff --git a/tests/location/location_gnss/AndroidManifest.xml b/tests/location/location_gnss/AndroidManifest.xml index f463c37aa94..49f136831ba 100644 --- a/tests/location/location_gnss/AndroidManifest.xml +++ b/tests/location/location_gnss/AndroidManifest.xml @@ -25,6 +25,7 @@ <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> + <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.READ_SMS"/> <uses-permission android:name="android.permission.READ_PHONE_NUMBERS"/> diff --git a/tests/location/location_gnss/src/android/location/cts/gnss/GnssStatusTest.java b/tests/location/location_gnss/src/android/location/cts/gnss/GnssStatusTest.java index e23dd841928..c8720703a17 100644 --- a/tests/location/location_gnss/src/android/location/cts/gnss/GnssStatusTest.java +++ b/tests/location/location_gnss/src/android/location/cts/gnss/GnssStatusTest.java @@ -1,38 +1,67 @@ package android.location.cts.gnss; + +import static android.Manifest.permission.ACCESS_COARSE_LOCATION; +import static android.Manifest.permission.ACCESS_FINE_LOCATION; + +import android.app.UiAutomation; +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; import android.location.GnssStatus; import android.location.cts.common.GnssTestCase; import android.location.cts.common.SoftAssert; import android.location.cts.common.TestLocationListener; import android.location.cts.common.TestLocationManager; import android.location.cts.common.TestMeasurementUtil; +import android.platform.test.annotations.AppModeFull; import android.util.Log; +import androidx.test.InstrumentationRegistry; + +import java.util.ArrayList; +import java.util.List; + public class GnssStatusTest extends GnssTestCase { private static final String TAG = "GnssStatusTest"; private static final int LOCATION_TO_COLLECT_COUNT = 1; private static final int STATUS_TO_COLLECT_COUNT = 3; + private UiAutomation mUiAutomation; @Override protected void setUp() throws Exception { super.setUp(); mTestLocationManager = new TestLocationManager(getContext()); + mUiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation(); } /** * Tests that one can listen for {@link GnssStatus}. */ + @AppModeFull(reason = "Instant apps cannot access package manager to scan for permissions") public void testGnssStatusChanges() throws Exception { // Checks if GPS hardware feature is present, skips test (pass) if not if (!TestMeasurementUtil.canTestRunOnCurrentDevice(mTestLocationManager, TAG)) { return; } - // Register Gps Status Listener. - TestGnssStatusCallback testGnssStatusCallback = - new TestGnssStatusCallback(TAG, STATUS_TO_COLLECT_COUNT); - checkGnssChange(testGnssStatusCallback); + // Revoke location permissions from packages before running GnssStatusTest stops + // active location requests, allowing this test to receive all necessary Gnss callbacks. + List<String> courseLocationPackages = revokePermissions(ACCESS_COARSE_LOCATION); + List<String> fineLocationPackages = revokePermissions(ACCESS_FINE_LOCATION); + + try { + // Register Gps Status Listener. + TestGnssStatusCallback testGnssStatusCallback = + new TestGnssStatusCallback(TAG, STATUS_TO_COLLECT_COUNT); + checkGnssChange(testGnssStatusCallback); + } finally { + // For each location package, re-grant the permission + grantLocationPermissions(ACCESS_COARSE_LOCATION, courseLocationPackages); + grantLocationPermissions(ACCESS_FINE_LOCATION, fineLocationPackages); + } } private void checkGnssChange(TestGnssStatusCallback testGnssStatusCallback) @@ -126,4 +155,55 @@ public class GnssStatusTest extends GnssTestCase { Log.i(TAG, "usedInFix: " + status.usedInFix(i)); } } + + private List<String> getPackagesWithPermissions(String permission) { + Context context = InstrumentationRegistry.getTargetContext(); + PackageManager pm = context.getPackageManager(); + + ArrayList<String> packagesWithPermission = new ArrayList<>(); + List<ApplicationInfo> packages = pm.getInstalledApplications(/*flags=*/ 0); + + for (ApplicationInfo applicationInfo : packages) { + String packageName = applicationInfo.packageName; + if (packageName.equals(context.getPackageName())) { + // Don't include this test package. + continue; + } + + if (pm.checkPermission(permission, packageName) == PackageManager.PERMISSION_GRANTED) { + final int flags; + mUiAutomation.adoptShellPermissionIdentity("android.permission.GET_RUNTIME_PERMISSIONS"); + try { + flags = pm.getPermissionFlags(permission, packageName, + android.os.Process.myUserHandle()); + } finally { + mUiAutomation.dropShellPermissionIdentity(); + } + + final boolean fixed = (flags & (PackageManager.FLAG_PERMISSION_USER_FIXED + | PackageManager.FLAG_PERMISSION_POLICY_FIXED + | PackageManager.FLAG_PERMISSION_SYSTEM_FIXED)) != 0; + if (!fixed) { + packagesWithPermission.add(packageName); + } + } + } + return packagesWithPermission; + } + + private List<String> revokePermissions(String permission) { + List<String> packages = getPackagesWithPermissions(permission); + for (String packageWithPermission : packages) { + Log.i(TAG, "Revoking permissions from: " + packageWithPermission); + mUiAutomation.revokeRuntimePermission(packageWithPermission, permission); + } + return packages; + } + + private void grantLocationPermissions(String permission, List<String> packages) { + for (String packageToGivePermission : packages) { + Log.i(TAG, "Granting permissions (back) to: " + packageToGivePermission); + mUiAutomation.grantRuntimePermission(packageToGivePermission, permission); + } + } } |