diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/ActivityTaskManagerService.java | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 7ea7cf1cd015..faa98fa79be9 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -191,6 +191,7 @@ import android.os.Message; import android.os.PersistableBundle; import android.os.PowerManager; import android.os.PowerManagerInternal; +import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; import android.os.StrictMode; @@ -243,6 +244,7 @@ import com.android.internal.util.FastPrintWriter; import com.android.internal.util.Preconditions; import com.android.internal.util.function.pooled.PooledLambda; import com.android.server.AttributeCache; +import com.android.server.DeviceIdleController; import com.android.server.LocalServices; import com.android.server.SystemService; import com.android.server.SystemServiceManager; @@ -425,6 +427,9 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { private static final long START_AS_CALLER_TOKEN_EXPIRED_TIMEOUT = START_AS_CALLER_TOKEN_TIMEOUT_IMPL + 20 * MINUTE_IN_MILLIS; + // How long to whitelist the Services for when requested. + private static final int SERVICE_LAUNCH_IDLE_WHITELIST_DURATION_MS = 5 * 1000; + // Activity tokens of system activities that are delegating their call to // #startActivityByCaller, keyed by the permissionToken granted to the delegate. final HashMap<IBinder, IBinder> mStartActivitySources = new HashMap<>(); @@ -2967,7 +2972,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { if (TextUtils.equals(pae.intent.getAction(), android.service.voice.VoiceInteractionService.SERVICE_INTERFACE)) { pae.intent.putExtras(pae.extras); - mContext.startServiceAsUser(pae.intent, new UserHandle(pae.userHandle)); + + startVoiceInteractionServiceAsUser(pae.intent, pae.userHandle, "AssistContext"); } else { pae.intent.replaceExtras(pae.extras); pae.intent.setFlags(FLAG_ACTIVITY_NEW_TASK @@ -2986,6 +2992,34 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } } + /** + * Workaround for historical API which starts the Assist service with a non-foreground + * {@code startService()} call. + */ + private void startVoiceInteractionServiceAsUser( + Intent intent, int userHandle, String reason) { + // Resolve the intent to find out which package we need to whitelist. + ResolveInfo resolveInfo = + mContext.getPackageManager().resolveServiceAsUser(intent, 0, userHandle); + if (resolveInfo == null || resolveInfo.serviceInfo == null) { + Slog.e(TAG, "VoiceInteractionService intent does not resolve. Not starting."); + return; + } + intent.setPackage(resolveInfo.serviceInfo.packageName); + + // Whitelist background services temporarily. + LocalServices.getService(DeviceIdleController.LocalService.class) + .addPowerSaveTempWhitelistApp(Process.myUid(), intent.getPackage(), + SERVICE_LAUNCH_IDLE_WHITELIST_DURATION_MS, userHandle, false, reason); + + // Finally, try to start the service. + try { + mContext.startServiceAsUser(intent, UserHandle.of(userHandle)); + } catch (RuntimeException e) { + Slog.e(TAG, "VoiceInteractionService failed to start.", e); + } + } + @Override public int addAppTask(IBinder activityToken, Intent intent, ActivityManager.TaskDescription description, Bitmap thumbnail) throws RemoteException { |