RESTRICT AUTOMERGE: Add test case testFgsLocationStartFromBGWithBind
To test while-in-use permission restriction for FGS started by
bindService() from background.
Bug: 163084228, 173516292
Test: atest cts/tests/app/src/android/app/cts/ActivityManagerFgsBgStartTest.java#testFgsLocationStartFromBGWithBind
Change-Id: I7c46e77554dc175acffed6cf9d5bc5aa41546f39
Merged-In: I7c46e77554dc175acffed6cf9d5bc5aa41546f39
(cherry picked from commit 7d4f4f527288f5aa9d98de79f51ab68d2d966816)
diff --git a/tests/app/app/src/android/app/stubs/CommandReceiver.java b/tests/app/app/src/android/app/stubs/CommandReceiver.java
index 12a24c8..5a13eab 100644
--- a/tests/app/app/src/android/app/stubs/CommandReceiver.java
+++ b/tests/app/app/src/android/app/stubs/CommandReceiver.java
@@ -48,6 +48,7 @@
public static final int COMMAND_STOP_ACTIVITY = 11;
public static final int COMMAND_CREATE_FGSL_PENDING_INTENT = 12;
public static final int COMMAND_SEND_FGSL_PENDING_INTENT = 13;
+ public static final int COMMAND_BIND_FOREGROUND_SERVICE = 14;
public static final String EXTRA_COMMAND = "android.app.stubs.extra.COMMAND";
public static final String EXTRA_TARGET_PACKAGE = "android.app.stubs.extra.TARGET_PACKAGE";
@@ -82,7 +83,7 @@
+ intent);
switch (command) {
case COMMAND_BIND_SERVICE:
- doBindService(context, intent);
+ doBindService(context, intent, SERVICE_NAME);
break;
case COMMAND_UNBIND_SERVICE:
doUnbindService(context, intent);
@@ -120,15 +121,18 @@
case COMMAND_SEND_FGSL_PENDING_INTENT:
doSendFgslPendingIntent(context, intent);
break;
+ case COMMAND_BIND_FOREGROUND_SERVICE:
+ doBindService(context, intent, FG_LOCATION_SERVICE_NAME);
+ break;
}
}
- private void doBindService(Context context, Intent commandIntent) {
+ private void doBindService(Context context, Intent commandIntent, String serviceName) {
String targetPackage = getTargetPackage(commandIntent);
int flags = getFlags(commandIntent);
Intent bindIntent = new Intent();
- bindIntent.setComponent(new ComponentName(targetPackage, SERVICE_NAME));
+ bindIntent.setComponent(new ComponentName(targetPackage, serviceName));
ServiceConnection connection = addServiceConnection(targetPackage);
diff --git a/tests/app/src/android/app/cts/ActivityManagerFgsBgStartTest.java b/tests/app/src/android/app/cts/ActivityManagerFgsBgStartTest.java
index 9302e67..c982cd6 100644
--- a/tests/app/src/android/app/cts/ActivityManagerFgsBgStartTest.java
+++ b/tests/app/src/android/app/cts/ActivityManagerFgsBgStartTest.java
@@ -327,4 +327,43 @@
uid2Watcher.finish();
}
}
+
+
+ public void testFgsLocationStartFromBGWithBind() throws Exception {
+ ApplicationInfo app1Info = mContext.getPackageManager().getApplicationInfo(
+ PACKAGE_NAME_APP1, 0);
+ WatchUidRunner uid1Watcher = new WatchUidRunner(mInstrumentation, app1Info.uid,
+ WAITFOR_MSEC);
+
+ try {
+ // Package1 is in BG state, bind FGSL in package1 first.
+ CommandReceiver.sendCommand(mContext, CommandReceiver.COMMAND_BIND_FOREGROUND_SERVICE,
+ PACKAGE_NAME_APP1, PACKAGE_NAME_APP1, 0, null);
+ Bundle bundle = new Bundle();
+ bundle.putInt(LocalForegroundServiceLocation.EXTRA_FOREGROUND_SERVICE_TYPE,
+ ServiceInfo.FOREGROUND_SERVICE_TYPE_LOCATION);
+ // Then start FGSL in package1, it won't get location capability.
+ CommandReceiver.sendCommand(mContext,
+ CommandReceiver.COMMAND_START_FOREGROUND_SERVICE_LOCATION,
+ PACKAGE_NAME_APP1, PACKAGE_NAME_APP1, 0, bundle);
+
+ // Package1 is in FGS state, but won't get location capability.
+ uid1Watcher.waitFor(WatchUidRunner.CMD_PROCSTATE,
+ WatchUidRunner.STATE_FG_SERVICE,
+ new Integer(PROCESS_CAPABILITY_NONE));
+
+ // unbind service.
+ CommandReceiver.sendCommand(mContext, CommandReceiver.COMMAND_UNBIND_SERVICE,
+ PACKAGE_NAME_APP1, PACKAGE_NAME_APP1, 0, null);
+ // stop FGSL
+ CommandReceiver.sendCommand(mContext,
+ CommandReceiver.COMMAND_STOP_FOREGROUND_SERVICE_LOCATION,
+ PACKAGE_NAME_APP1, PACKAGE_NAME_APP1, 0, null);
+ uid1Watcher.waitFor(WatchUidRunner.CMD_PROCSTATE,
+ WatchUidRunner.STATE_CACHED_EMPTY,
+ new Integer(PROCESS_CAPABILITY_NONE));
+ } finally {
+ uid1Watcher.finish();
+ }
+ }
}