diff options
14 files changed, 113 insertions, 99 deletions
diff --git a/PermissionController/res/xml/roles.xml b/PermissionController/res/xml/roles.xml index 72e1d9654..0f9ff7112 100644 --- a/PermissionController/res/xml/roles.xml +++ b/PermissionController/res/xml/roles.xml @@ -1878,19 +1878,20 @@ --> <role name="android.app.role.RESERVED_FOR_TESTING_PROFILE_GROUP_EXCLUSIVITY" - behavior="ReservedForTestingProfileGroupExclusivityRoleBehavior" + behavior="v36.ReservedForTestingProfileGroupExclusivityRoleBehavior" description="@string/role_for_testing_profile_group_exclusivity_description" exclusive="true" exclusivity="profileGroup" fallBackToDefaultHolder="true" featureFlag="com.android.permission.flags.Flags.crossUserRoleEnabled" label="@string/role_for_testing_profile_group_exclusivity_label" + minSdkVersion="36" requestable="true" requestDescription="@string/role_for_testing_profile_group_exclusivity_request_description" requestTitle="@string/role_for_testing_profile_group_exclusivity_request_title" shortLabel="@string/role_for_testing_profile_group_exclusivity_short_label" showNone="true" - uiBehavior="ReservedForTestingProfileGroupExclusivityRoleUiBehavior" + uiBehavior="v36.ReservedForTestingProfileGroupExclusivityRoleUiBehavior" visible="false"/> <!--- diff --git a/PermissionController/role-controller/java/com/android/role/controller/behavior/v33/CompanionDeviceAppStreamingRoleBehavior.java b/PermissionController/role-controller/java/com/android/role/controller/behavior/v33/CompanionDeviceAppStreamingRoleBehavior.java index e99ffb58c..85c4be569 100644 --- a/PermissionController/role-controller/java/com/android/role/controller/behavior/v33/CompanionDeviceAppStreamingRoleBehavior.java +++ b/PermissionController/role-controller/java/com/android/role/controller/behavior/v33/CompanionDeviceAppStreamingRoleBehavior.java @@ -22,10 +22,10 @@ import android.os.UserHandle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.android.modules.utils.build.SdkLevel; import com.android.role.controller.model.Role; import com.android.role.controller.model.RoleBehavior; import com.android.role.controller.util.NotificationUtils; -import com.android.role.controller.util.RoleFlags; import com.android.role.controller.util.UserUtils; /** @@ -52,6 +52,6 @@ public class CompanionDeviceAppStreamingRoleBehavior implements RoleBehavior { @Override @Nullable public Boolean shouldAllowBypassingQualification(@NonNull Role role, @NonNull Context context) { - return !RoleFlags.isAtLeastB(); + return !SdkLevel.isAtLeastB(); } } diff --git a/PermissionController/role-controller/java/com/android/role/controller/behavior/v34/CompanionDeviceNearbyDeviceStreamingRoleBehavior.java b/PermissionController/role-controller/java/com/android/role/controller/behavior/v34/CompanionDeviceNearbyDeviceStreamingRoleBehavior.java index b0f58f40b..f941ec68d 100644 --- a/PermissionController/role-controller/java/com/android/role/controller/behavior/v34/CompanionDeviceNearbyDeviceStreamingRoleBehavior.java +++ b/PermissionController/role-controller/java/com/android/role/controller/behavior/v34/CompanionDeviceNearbyDeviceStreamingRoleBehavior.java @@ -21,9 +21,9 @@ import android.content.Context; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.android.modules.utils.build.SdkLevel; import com.android.role.controller.model.Role; import com.android.role.controller.model.RoleBehavior; -import com.android.role.controller.util.RoleFlags; /** * Class for behavior of the "Nearby Device Streaming" Companion device profile role. @@ -33,6 +33,6 @@ public class CompanionDeviceNearbyDeviceStreamingRoleBehavior implements RoleBeh @Override @Nullable public Boolean shouldAllowBypassingQualification(@NonNull Role role, @NonNull Context context) { - return !RoleFlags.isAtLeastB(); + return !SdkLevel.isAtLeastB(); } } diff --git a/PermissionController/role-controller/java/com/android/role/controller/behavior/ReservedForTestingProfileGroupExclusivityRoleBehavior.java b/PermissionController/role-controller/java/com/android/role/controller/behavior/v36/ReservedForTestingProfileGroupExclusivityRoleBehavior.java index 5299886f6..e50f33ffd 100644 --- a/PermissionController/role-controller/java/com/android/role/controller/behavior/ReservedForTestingProfileGroupExclusivityRoleBehavior.java +++ b/PermissionController/role-controller/java/com/android/role/controller/behavior/v36/ReservedForTestingProfileGroupExclusivityRoleBehavior.java @@ -14,15 +14,17 @@ * limitations under the License. */ -package com.android.role.controller.behavior; +package com.android.role.controller.behavior.v36; import android.app.role.RoleManager; import android.content.Context; import android.content.pm.ApplicationInfo; +import android.os.Build; import android.os.UserHandle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; import com.android.role.controller.model.Role; import com.android.role.controller.model.RoleBehavior; @@ -33,7 +35,7 @@ import com.android.role.controller.util.UserUtils; import java.util.ArrayList; import java.util.List; -// TODO(b/383538899): make minSdk36 +@RequiresApi(Build.VERSION_CODES.BAKLAVA) public class ReservedForTestingProfileGroupExclusivityRoleBehavior implements RoleBehavior { @Nullable @Override diff --git a/PermissionController/role-controller/java/com/android/role/controller/model/AppOp.java b/PermissionController/role-controller/java/com/android/role/controller/model/AppOp.java index 99145c747..a0007dcc0 100644 --- a/PermissionController/role-controller/java/com/android/role/controller/model/AppOp.java +++ b/PermissionController/role-controller/java/com/android/role/controller/model/AppOp.java @@ -26,7 +26,6 @@ import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import com.android.modules.utils.build.SdkLevel; -import com.android.role.controller.util.RoleFlags; import com.android.role.controller.util.PackageUtils; import java.util.Objects; @@ -139,7 +138,7 @@ public class AppOp { } return Build.VERSION.SDK_INT >= mMinSdkVersion // Workaround to match the value 36 for B in roles.xml before SDK finalization. - || (mMinSdkVersion == 36 && RoleFlags.isAtLeastB()); + || (mMinSdkVersion == 36 && SdkLevel.isAtLeastB()); } private boolean isAvailableAsUser(@NonNull String packageName, diff --git a/PermissionController/role-controller/java/com/android/role/controller/model/Permission.java b/PermissionController/role-controller/java/com/android/role/controller/model/Permission.java index 889f5263d..c3404be8b 100644 --- a/PermissionController/role-controller/java/com/android/role/controller/model/Permission.java +++ b/PermissionController/role-controller/java/com/android/role/controller/model/Permission.java @@ -26,7 +26,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.modules.utils.build.SdkLevel; -import com.android.role.controller.util.RoleFlags; import com.android.role.controller.util.UserUtils; import java.util.Objects; @@ -99,7 +98,7 @@ public class Permission { } if (Build.VERSION.SDK_INT >= mMinSdkVersion // Workaround to match the value 36 for B in roles.xml before SDK finalization. - || (mMinSdkVersion == 36 && RoleFlags.isAtLeastB())) { + || (mMinSdkVersion == 36 && SdkLevel.isAtLeastB())) { return true; } if (Build.VERSION.SDK_INT >= mOptionalMinSdkVersion) { diff --git a/PermissionController/role-controller/java/com/android/role/controller/model/Role.java b/PermissionController/role-controller/java/com/android/role/controller/model/Role.java index f0df97acc..1b7617b0d 100644 --- a/PermissionController/role-controller/java/com/android/role/controller/model/Role.java +++ b/PermissionController/role-controller/java/com/android/role/controller/model/Role.java @@ -501,7 +501,7 @@ public class Role { } return (Build.VERSION.SDK_INT >= mMinSdkVersion // Workaround to match the value 36 for B in roles.xml before SDK finalization. - || (mMinSdkVersion == 36 && RoleFlags.isAtLeastB())) + || (mMinSdkVersion == 36 && SdkLevel.isAtLeastB())) && Build.VERSION.SDK_INT <= mMaxSdkVersion; } diff --git a/PermissionController/role-controller/java/com/android/role/controller/model/RoleParser.java b/PermissionController/role-controller/java/com/android/role/controller/model/RoleParser.java index 9c3746b79..f0a730647 100644 --- a/PermissionController/role-controller/java/com/android/role/controller/model/RoleParser.java +++ b/PermissionController/role-controller/java/com/android/role/controller/model/RoleParser.java @@ -436,10 +436,9 @@ public class RoleParser { exclusivity = Role.EXCLUSIVITY_USER; break; case EXCLUSIVITY_PROFILE_GROUP: - // TODO(b/372743073): change to isAtLeastB once available // EXCLUSIVITY_PROFILE behavior only available for B+ // fallback to default of EXCLUSIVITY_USER - exclusivity = SdkLevel.isAtLeastV() + exclusivity = SdkLevel.isAtLeastB() ? Role.EXCLUSIVITY_PROFILE_GROUP : Role.EXCLUSIVITY_USER; break; diff --git a/PermissionController/role-controller/java/com/android/role/controller/util/RoleFlags.java b/PermissionController/role-controller/java/com/android/role/controller/util/RoleFlags.java index 2c5a247b6..23e3a2c65 100644 --- a/PermissionController/role-controller/java/com/android/role/controller/util/RoleFlags.java +++ b/PermissionController/role-controller/java/com/android/role/controller/util/RoleFlags.java @@ -20,7 +20,7 @@ import android.os.Build; import androidx.annotation.ChecksSdkIntAtLeast; -import java.util.Objects; +import com.android.modules.utils.build.SdkLevel; /** Util class for getting shared feature flag check logic. */ public final class RoleFlags { @@ -32,14 +32,6 @@ public final class RoleFlags { */ @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.BAKLAVA) public static boolean isProfileGroupExclusivityAvailable() { - // TODO(b/372743073): change to isAtLeastB once available - return isAtLeastB() && com.android.permission.flags.Flags.crossUserRoleEnabled(); - } - - // TODO(b/372743073): remove once SdkLevel.isAtLeastB available - @ChecksSdkIntAtLeast(api = 36 /* BUILD_VERSION_CODES.Baklava */) - public static boolean isAtLeastB() { - return Build.VERSION.SDK_INT >= Build.VERSION_CODES.BAKLAVA - || Objects.equals(Build.VERSION.CODENAME, "Baklava"); + return SdkLevel.isAtLeastB() && com.android.permission.flags.Flags.crossUserRoleEnabled(); } } diff --git a/PermissionController/src/com/android/permissioncontroller/permission/compat/AppPermissionFragmentCompat.java b/PermissionController/src/com/android/permissioncontroller/permission/compat/AppPermissionFragmentCompat.java index a5234562b..50e3688e2 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/compat/AppPermissionFragmentCompat.java +++ b/PermissionController/src/com/android/permissioncontroller/permission/compat/AppPermissionFragmentCompat.java @@ -33,7 +33,6 @@ import com.android.permission.flags.Flags; import com.android.permissioncontroller.R; import com.android.permissioncontroller.permission.ui.handheld.max35.LegacyAppPermissionFragment; import com.android.permissioncontroller.permission.ui.handheld.v36.AppPermissionFragment; -import com.android.role.controller.util.RoleFlags; /** Helper methods for AppPermissionFragment across SDKs for compatibility. */ public class AppPermissionFragmentCompat { @@ -45,7 +44,7 @@ public class AppPermissionFragmentCompat { */ @NonNull public static PreferenceFragmentCompat createFragment(@NonNull Context context) { - if ((RoleFlags.isAtLeastB() && Flags.appPermissionFragmentUsesPreferences()) + if ((SdkLevel.isAtLeastB() && Flags.appPermissionFragmentUsesPreferences()) || (SdkLevel.isAtLeastV() && context.getResources().getBoolean( R.bool.config_usePreferenceForAppPermissionSettings))) { return new AppPermissionFragment(); diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/behavior/ReservedForTestingProfileGroupExclusivityRoleUiBehavior.java b/PermissionController/src/com/android/permissioncontroller/role/ui/behavior/v36/ReservedForTestingProfileGroupExclusivityRoleUiBehavior.java index be51a1e17..00b1ce5b1 100644 --- a/PermissionController/src/com/android/permissioncontroller/role/ui/behavior/ReservedForTestingProfileGroupExclusivityRoleUiBehavior.java +++ b/PermissionController/src/com/android/permissioncontroller/role/ui/behavior/v36/ReservedForTestingProfileGroupExclusivityRoleUiBehavior.java @@ -14,23 +14,27 @@ * limitations under the License. */ -package com.android.permissioncontroller.role.ui.behavior; +package com.android.permissioncontroller.role.ui.behavior.v36; import android.content.Context; import android.content.pm.ApplicationInfo; +import android.os.Build; import android.os.UserHandle; import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; import androidx.preference.Preference; import com.android.permissioncontroller.permission.utils.Utils; import com.android.permissioncontroller.role.ui.RequestRoleItemView; import com.android.permissioncontroller.role.ui.TwoTargetPreference; +import com.android.permissioncontroller.role.ui.behavior.RoleUiBehavior; import com.android.role.controller.model.Role; import com.android.role.controller.util.UserUtils; import java.util.List; +@RequiresApi(Build.VERSION_CODES.BAKLAVA) public class ReservedForTestingProfileGroupExclusivityRoleUiBehavior implements RoleUiBehavior { @Override public void preparePreferenceAsUser(@NonNull Role role, @NonNull TwoTargetPreference preference, diff --git a/tests/cts/permission/AppThatAccessesLocationOnCommand/src/android/permission/cts/appthataccesseslocation/AccessLocationOnCommand.java b/tests/cts/permission/AppThatAccessesLocationOnCommand/src/android/permission/cts/appthataccesseslocation/AccessLocationOnCommand.java index fae03d973..75f4a0ce5 100644 --- a/tests/cts/permission/AppThatAccessesLocationOnCommand/src/android/permission/cts/appthataccesseslocation/AccessLocationOnCommand.java +++ b/tests/cts/permission/AppThatAccessesLocationOnCommand/src/android/permission/cts/appthataccesseslocation/AccessLocationOnCommand.java @@ -16,6 +16,8 @@ package android.permission.cts.appthataccesseslocation; +import static android.location.Criteria.ACCURACY_FINE; + import android.app.Service; import android.content.Intent; import android.location.Criteria; @@ -25,83 +27,42 @@ import android.location.LocationManager; import android.os.Bundle; import android.os.IBinder; import android.os.Looper; -import android.os.SystemClock; - -import java.util.Timer; -import java.util.TimerTask; - -public class AccessLocationOnCommand extends Service implements LocationListener { - private static final String TEST_PROVIDER = "test_provider"; - private LocationManager mLocationManager; - private IAccessLocationOnCommand.Stub mBinder; - private final LocationListener mLocationListener = this; - private final Timer mTimer = new Timer(); - - private void updateMockLocation() { - final Location location = new Location(TEST_PROVIDER); - location.setLatitude(35.657f); - location.setLongitude(139.703f); - location.setAccuracy(1.0f); - location.setTime(System.currentTimeMillis()); - location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos()); - mLocationManager.setTestProviderLocation(TEST_PROVIDER, location); - } +public class AccessLocationOnCommand extends Service { + private IAccessLocationOnCommand.Stub mBinder = new IAccessLocationOnCommand.Stub() { + public void accessLocation() { + Criteria crit = new Criteria(); + crit.setAccuracy(ACCURACY_FINE); + + AccessLocationOnCommand.this.getSystemService(LocationManager.class) + .requestSingleUpdate(crit, new LocationListener() { + @Override + public void onLocationChanged(Location location) { + } + + @Override + public void onStatusChanged(String provider, int status, + Bundle extras) { + } + + @Override + public void onProviderEnabled(String provider) { + } + + @Override + public void onProviderDisabled(String provider) { + } + }, Looper.getMainLooper()); + } + }; @Override public IBinder onBind(Intent intent) { - mLocationManager = getSystemService(LocationManager.class); - - mLocationManager.addTestProvider(TEST_PROVIDER, - /* requiresNetwork= */true, - /* requiresSatellite= */false, - /* requiresCell= */true, - /* hasMonetaryCost= */false, - /* supportsAltitude= */false, - /* supportsSpeed= */false, - /* supportsBearing= */false, - Criteria.POWER_HIGH, - Criteria.ACCURACY_FINE); - mLocationManager.setTestProviderEnabled(TEST_PROVIDER, true); - - mTimer.schedule(new TimerTask() { - @Override - public void run() { - updateMockLocation(); - } - }, 0, 1000); - - mBinder = new IAccessLocationOnCommand.Stub() { - public void accessLocation() { - mLocationManager.requestSingleUpdate( - TEST_PROVIDER, mLocationListener, Looper.getMainLooper()); - } - }; return mBinder; } @Override public boolean onUnbind(Intent intent) { - mTimer.cancel(); - mLocationManager.removeTestProvider(TEST_PROVIDER); return true; } - - @Override - public void onLocationChanged(Location location) { - } - - @Override - public void onStatusChanged(String provider, int status, - Bundle extras) { - } - - @Override - public void onProviderEnabled(String provider) { - } - - @Override - public void onProviderDisabled(String provider) { - } - } diff --git a/tests/cts/permission/src/android/permission/cts/LocationAccessCheckTest.java b/tests/cts/permission/src/android/permission/cts/LocationAccessCheckTest.java index 799a43fe3..024a89f2e 100644 --- a/tests/cts/permission/src/android/permission/cts/LocationAccessCheckTest.java +++ b/tests/cts/permission/src/android/permission/cts/LocationAccessCheckTest.java @@ -22,6 +22,7 @@ import static android.app.AppOpsManager.OPSTR_FINE_LOCATION; import static android.app.AppOpsManager.OP_FLAGS_ALL_TRUSTED; import static android.content.Context.BIND_AUTO_CREATE; import static android.content.Context.BIND_NOT_FOREGROUND; +import static android.location.Criteria.ACCURACY_FINE; import static android.os.Process.myUserHandle; import static android.provider.Settings.Secure.LOCATION_ACCESS_CHECK_DELAY_MILLIS; import static android.provider.Settings.Secure.LOCATION_ACCESS_CHECK_INTERVAL_MILLIS; @@ -37,6 +38,8 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeFalse; import static org.junit.Assume.assumeTrue; +import static java.util.concurrent.TimeUnit.MILLISECONDS; + import android.app.ActivityManager; import android.app.ActivityOptions; import android.app.AppOpsManager; @@ -48,9 +51,14 @@ import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.content.pm.PackageManager; +import android.location.Criteria; +import android.location.Location; +import android.location.LocationListener; import android.location.LocationManager; import android.os.Build; +import android.os.Bundle; import android.os.IBinder; +import android.os.Looper; import android.os.Process; import android.permission.cts.appthataccesseslocation.IAccessLocationOnCommand; import android.platform.test.annotations.AppModeFull; @@ -83,6 +91,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import java.util.List; +import java.util.concurrent.CountDownLatch; /** * Tests the {@code LocationAccessCheck} in permission controller. @@ -135,6 +144,13 @@ public class LocationAccessCheckTest { "com.android.permissioncontroller.permission.service" + ".LocationAccessCheck$SetupPeriodicBackgroundLocationAccessCheck"; + + /** + * The result of {@link #assumeCanGetFineLocation()}, so we don't have to run it over and over + * again. + */ + private static Boolean sCanAccessFineLocation = null; + private static ServiceConnection sConnection; private static IAccessLocationOnCommand sLocationAccessor; @@ -395,7 +411,6 @@ public class LocationAccessCheckTest { assertTrue(output.contains("Success")); // Wait for user sensitive to be updated, which is checked by LocationAccessCheck. Thread.sleep(5000); - runShellCommand("cmd appops set " + TEST_APP_PKG + " android:mock_location allow"); } public static void uninstallTestApp() { @@ -464,6 +479,7 @@ public class LocationAccessCheckTest { wakeUpAndDismissKeyguard(); bindService(); resetPermissionControllerBeforeEachTest(); + assumeCanGetFineLocation(); } /** @@ -486,6 +502,46 @@ public class LocationAccessCheckTest { } /** + * Make sure fine location can be accessed at all. + */ + public void assumeCanGetFineLocation() { + if (sCanAccessFineLocation == null) { + Criteria crit = new Criteria(); + crit.setAccuracy(ACCURACY_FINE); + + CountDownLatch locationCounter = new CountDownLatch(1); + sContext.getSystemService(LocationManager.class).requestSingleUpdate(crit, + new LocationListener() { + @Override + public void onLocationChanged(Location location) { + locationCounter.countDown(); + } + + @Override + public void onStatusChanged(String provider, int status, Bundle extras) { + } + + @Override + public void onProviderEnabled(String provider) { + } + + @Override + public void onProviderDisabled(String provider) { + } + }, Looper.getMainLooper()); + + + try { + sCanAccessFineLocation = locationCounter.await(LOCATION_ACCESS_TIMEOUT_MILLIS, + MILLISECONDS); + } catch (InterruptedException ignored) { + } + } + + assumeTrue(sCanAccessFineLocation); + } + + /** * Reset the permission controllers state. */ private static void resetPermissionController() throws Throwable { diff --git a/tests/cts/role/src/android/app/role/cts/RoleManagerTest.java b/tests/cts/role/src/android/app/role/cts/RoleManagerTest.java index bf1e32676..5e61c66be 100644 --- a/tests/cts/role/src/android/app/role/cts/RoleManagerTest.java +++ b/tests/cts/role/src/android/app/role/cts/RoleManagerTest.java @@ -47,7 +47,6 @@ import android.os.Build; import android.os.Process; import android.os.UserHandle; import android.permission.flags.Flags; -import android.platform.test.annotations.RequiresFlagsDisabled; import android.platform.test.annotations.RequiresFlagsEnabled; import android.platform.test.flag.junit.CheckFlagsRule; import android.platform.test.flag.junit.DeviceFlagsValueProvider; @@ -170,6 +169,9 @@ public class RoleManagerTest { ? By.text("Don\u2019t ask again") : By.res("com.android.permissioncontroller:id/dont_ask_again"); + private static final BySelector PERMISSION_APP_LABEL = + By.pkg(sPackageManager.getPermissionControllerPackageName()).text(APP_LABEL); + @Rule public CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); @Rule @@ -473,7 +475,7 @@ public class RoleManagerTest { private void respondToRoleRequest(boolean allow) throws InterruptedException, UiObjectNotFoundException { if (allow) { - waitFindObject(By.text(APP_LABEL)).click(); + waitFindObject(PERMISSION_APP_LABEL).click(); } Pair<Integer, Intent> result = clickButtonAndWaitForResult(allow); int expectedResult = allow ? Activity.RESULT_OK : Activity.RESULT_CANCELED; |