diff options
author | Xin Li <delphij@google.com> | 2020-08-31 21:21:38 -0700 |
---|---|---|
committer | Xin Li <delphij@google.com> | 2020-08-31 21:21:38 -0700 |
commit | 628590d7ec80e10a3fc24b1c18a1afb55cca10a8 (patch) | |
tree | 4b1c3f52d86d7fb53afbe9e9438468588fa489f8 /services/appprediction | |
parent | b11b8ec3aec8bb42f2c07e1c5ac7942da293baa8 (diff) | |
parent | d2d3a20624d968199353ccf6ddbae6f3ac39c9af (diff) |
Merge Android R (rvc-dev-plus-aosp-without-vendor@6692709)
Bug: 166295507
Merged-In: I3d92a6de21a938f6b352ec26dc23420c0fe02b27
Change-Id: Ifdb80563ef042738778ebb8a7581a97c4e3d96e2
Diffstat (limited to 'services/appprediction')
4 files changed, 112 insertions, 126 deletions
diff --git a/services/appprediction/Android.bp b/services/appprediction/Android.bp index e14e1df0b5c7..c12f62fc6cd1 100644 --- a/services/appprediction/Android.bp +++ b/services/appprediction/Android.bp @@ -7,6 +7,7 @@ filegroup { java_library_static { name: "services.appprediction", + defaults: ["services_defaults"], srcs: [":services.appprediction-sources"], libs: ["services.core"], } diff --git a/services/appprediction/java/com/android/server/appprediction/AppPredictionManagerService.java b/services/appprediction/java/com/android/server/appprediction/AppPredictionManagerService.java index 5844f9873001..1c4db1214d3b 100644 --- a/services/appprediction/java/com/android/server/appprediction/AppPredictionManagerService.java +++ b/services/appprediction/java/com/android/server/appprediction/AppPredictionManagerService.java @@ -18,12 +18,14 @@ package com.android.server.appprediction; import static android.Manifest.permission.MANAGE_APP_PREDICTIONS; import static android.Manifest.permission.PACKAGE_USAGE_STATS; +import static android.app.ActivityManagerInternal.ALLOW_NON_FULL; import static android.content.Context.APP_PREDICTION_SERVICE; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; +import android.app.ActivityManagerInternal; import android.app.prediction.AppPredictionContext; import android.app.prediction.AppPredictionSessionId; import android.app.prediction.AppTargetEvent; @@ -34,7 +36,6 @@ import android.content.pm.ParceledListSlice; import android.os.Binder; import android.os.ResultReceiver; import android.os.ShellCallback; -import android.os.UserHandle; import android.util.Slog; import com.android.server.LocalServices; @@ -108,21 +109,21 @@ public class AppPredictionManagerService extends @Override public void createPredictionSession(@NonNull AppPredictionContext context, @NonNull AppPredictionSessionId sessionId) { - runForUserLocked("createPredictionSession", + runForUserLocked("createPredictionSession", sessionId, (service) -> service.onCreatePredictionSessionLocked(context, sessionId)); } @Override public void notifyAppTargetEvent(@NonNull AppPredictionSessionId sessionId, @NonNull AppTargetEvent event) { - runForUserLocked("notifyAppTargetEvent", + runForUserLocked("notifyAppTargetEvent", sessionId, (service) -> service.notifyAppTargetEventLocked(sessionId, event)); } @Override public void notifyLaunchLocationShown(@NonNull AppPredictionSessionId sessionId, @NonNull String launchLocation, @NonNull ParceledListSlice targetIds) { - runForUserLocked("notifyLaunchLocationShown", (service) -> + runForUserLocked("notifyLaunchLocationShown", sessionId, (service) -> service.notifyLaunchLocationShownLocked(sessionId, launchLocation, targetIds)); } @@ -130,32 +131,32 @@ public class AppPredictionManagerService extends public void sortAppTargets(@NonNull AppPredictionSessionId sessionId, @NonNull ParceledListSlice targets, IPredictionCallback callback) { - runForUserLocked("sortAppTargets", + runForUserLocked("sortAppTargets", sessionId, (service) -> service.sortAppTargetsLocked(sessionId, targets, callback)); } @Override public void registerPredictionUpdates(@NonNull AppPredictionSessionId sessionId, @NonNull IPredictionCallback callback) { - runForUserLocked("registerPredictionUpdates", + runForUserLocked("registerPredictionUpdates", sessionId, (service) -> service.registerPredictionUpdatesLocked(sessionId, callback)); } public void unregisterPredictionUpdates(@NonNull AppPredictionSessionId sessionId, @NonNull IPredictionCallback callback) { - runForUserLocked("unregisterPredictionUpdates", + runForUserLocked("unregisterPredictionUpdates", sessionId, (service) -> service.unregisterPredictionUpdatesLocked(sessionId, callback)); } @Override public void requestPredictionUpdate(@NonNull AppPredictionSessionId sessionId) { - runForUserLocked("requestPredictionUpdate", + runForUserLocked("requestPredictionUpdate", sessionId, (service) -> service.requestPredictionUpdateLocked(sessionId)); } @Override public void onDestroyPredictionSession(@NonNull AppPredictionSessionId sessionId) { - runForUserLocked("onDestroyPredictionSession", + runForUserLocked("onDestroyPredictionSession", sessionId, (service) -> service.onDestroyPredictionSessionLocked(sessionId)); } @@ -167,9 +168,12 @@ public class AppPredictionManagerService extends .exec(this, in, out, err, args, callback, resultReceiver); } - private void runForUserLocked(@NonNull String func, - @NonNull Consumer<AppPredictionPerUserService> c) { - final int userId = UserHandle.getCallingUserId(); + private void runForUserLocked(@NonNull final String func, + @NonNull final AppPredictionSessionId sessionId, + @NonNull final Consumer<AppPredictionPerUserService> c) { + ActivityManagerInternal am = LocalServices.getService(ActivityManagerInternal.class); + final int userId = am.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), + sessionId.getUserId(), false, ALLOW_NON_FULL, null, null); Context ctx = getContext(); if (!(ctx.checkCallingPermission(PACKAGE_USAGE_STATS) == PERMISSION_GRANTED diff --git a/services/appprediction/java/com/android/server/appprediction/AppPredictionPerUserService.java b/services/appprediction/java/com/android/server/appprediction/AppPredictionPerUserService.java index f35d334b63a7..7ee607c3eab4 100644 --- a/services/appprediction/java/com/android/server/appprediction/AppPredictionPerUserService.java +++ b/services/appprediction/java/com/android/server/appprediction/AppPredictionPerUserService.java @@ -16,6 +16,8 @@ package com.android.server.appprediction; +import static android.provider.DeviceConfig.NAMESPACE_SYSTEMUI; + import android.annotation.NonNull; import android.annotation.Nullable; import android.app.AppGlobals; @@ -30,12 +32,17 @@ import android.content.pm.ParceledListSlice; import android.content.pm.ServiceInfo; import android.os.RemoteCallbackList; import android.os.RemoteException; +import android.provider.DeviceConfig; import android.service.appprediction.AppPredictionService; +import android.service.appprediction.IPredictionService; import android.util.ArrayMap; import android.util.Slog; import com.android.internal.annotations.GuardedBy; +import com.android.internal.infra.AbstractRemoteService; +import com.android.server.LocalServices; import com.android.server.infra.AbstractPerUserSystemService; +import com.android.server.people.PeopleServiceInternal; import java.util.function.Consumer; @@ -47,6 +54,8 @@ public class AppPredictionPerUserService extends implements RemoteAppPredictionService.RemoteAppPredictionServiceCallbacks { private static final String TAG = AppPredictionPerUserService.class.getSimpleName(); + private static final String PREDICT_USING_PEOPLE_SERVICE_PREFIX = + "predict_using_people_service_"; @Nullable @GuardedBy("mLock") @@ -104,14 +113,16 @@ public class AppPredictionPerUserService extends @GuardedBy("mLock") public void onCreatePredictionSessionLocked(@NonNull AppPredictionContext context, @NonNull AppPredictionSessionId sessionId) { - final RemoteAppPredictionService service = getRemoteServiceLocked(); - if (service != null) { - service.onCreatePredictionSession(context, sessionId); - - if (!mSessionInfos.containsKey(sessionId)) { - mSessionInfos.put(sessionId, new AppPredictionSessionInfo(sessionId, context, - this::removeAppPredictionSessionInfo)); - } + if (!mSessionInfos.containsKey(sessionId)) { + mSessionInfos.put(sessionId, new AppPredictionSessionInfo(sessionId, context, + DeviceConfig.getBoolean(NAMESPACE_SYSTEMUI, + PREDICT_USING_PEOPLE_SERVICE_PREFIX + context.getUiSurface(), false), + this::removeAppPredictionSessionInfo)); + } + final boolean serviceExists = resolveService(sessionId, s -> + s.onCreatePredictionSession(context, sessionId), true); + if (!serviceExists) { + mSessionInfos.remove(sessionId); } } @@ -121,10 +132,7 @@ public class AppPredictionPerUserService extends @GuardedBy("mLock") public void notifyAppTargetEventLocked(@NonNull AppPredictionSessionId sessionId, @NonNull AppTargetEvent event) { - final RemoteAppPredictionService service = getRemoteServiceLocked(); - if (service != null) { - service.notifyAppTargetEvent(sessionId, event); - } + resolveService(sessionId, s -> s.notifyAppTargetEvent(sessionId, event), false); } /** @@ -133,10 +141,8 @@ public class AppPredictionPerUserService extends @GuardedBy("mLock") public void notifyLaunchLocationShownLocked(@NonNull AppPredictionSessionId sessionId, @NonNull String launchLocation, @NonNull ParceledListSlice targetIds) { - final RemoteAppPredictionService service = getRemoteServiceLocked(); - if (service != null) { - service.notifyLaunchLocationShown(sessionId, launchLocation, targetIds); - } + resolveService(sessionId, s -> + s.notifyLaunchLocationShown(sessionId, launchLocation, targetIds), false); } /** @@ -145,10 +151,7 @@ public class AppPredictionPerUserService extends @GuardedBy("mLock") public void sortAppTargetsLocked(@NonNull AppPredictionSessionId sessionId, @NonNull ParceledListSlice targets, @NonNull IPredictionCallback callback) { - final RemoteAppPredictionService service = getRemoteServiceLocked(); - if (service != null) { - service.sortAppTargets(sessionId, targets, callback); - } + resolveService(sessionId, s -> s.sortAppTargets(sessionId, targets, callback), true); } /** @@ -157,14 +160,11 @@ public class AppPredictionPerUserService extends @GuardedBy("mLock") public void registerPredictionUpdatesLocked(@NonNull AppPredictionSessionId sessionId, @NonNull IPredictionCallback callback) { - final RemoteAppPredictionService service = getRemoteServiceLocked(); - if (service != null) { - service.registerPredictionUpdates(sessionId, callback); - - AppPredictionSessionInfo sessionInfo = mSessionInfos.get(sessionId); - if (sessionInfo != null) { - sessionInfo.addCallbackLocked(callback); - } + final boolean serviceExists = resolveService(sessionId, s -> + s.registerPredictionUpdates(sessionId, callback), false); + final AppPredictionSessionInfo sessionInfo = mSessionInfos.get(sessionId); + if (serviceExists && sessionInfo != null) { + sessionInfo.addCallbackLocked(callback); } } @@ -174,14 +174,11 @@ public class AppPredictionPerUserService extends @GuardedBy("mLock") public void unregisterPredictionUpdatesLocked(@NonNull AppPredictionSessionId sessionId, @NonNull IPredictionCallback callback) { - final RemoteAppPredictionService service = getRemoteServiceLocked(); - if (service != null) { - service.unregisterPredictionUpdates(sessionId, callback); - - AppPredictionSessionInfo sessionInfo = mSessionInfos.get(sessionId); - if (sessionInfo != null) { - sessionInfo.removeCallbackLocked(callback); - } + final boolean serviceExists = resolveService(sessionId, s -> + s.unregisterPredictionUpdates(sessionId, callback), false); + final AppPredictionSessionInfo sessionInfo = mSessionInfos.get(sessionId); + if (serviceExists && sessionInfo != null) { + sessionInfo.removeCallbackLocked(callback); } } @@ -190,10 +187,7 @@ public class AppPredictionPerUserService extends */ @GuardedBy("mLock") public void requestPredictionUpdateLocked(@NonNull AppPredictionSessionId sessionId) { - final RemoteAppPredictionService service = getRemoteServiceLocked(); - if (service != null) { - service.requestPredictionUpdate(sessionId); - } + resolveService(sessionId, s -> s.requestPredictionUpdate(sessionId), true); } /** @@ -201,14 +195,11 @@ public class AppPredictionPerUserService extends */ @GuardedBy("mLock") public void onDestroyPredictionSessionLocked(@NonNull AppPredictionSessionId sessionId) { - final RemoteAppPredictionService service = getRemoteServiceLocked(); - if (service != null) { - service.onDestroyPredictionSession(sessionId); - - AppPredictionSessionInfo sessionInfo = mSessionInfos.get(sessionId); - if (sessionInfo != null) { - sessionInfo.destroy(); - } + final boolean serviceExists = resolveService(sessionId, s -> + s.onDestroyPredictionSession(sessionId), false); + final AppPredictionSessionInfo sessionInfo = mSessionInfos.get(sessionId); + if (serviceExists && sessionInfo != null) { + sessionInfo.destroy(); } } @@ -276,6 +267,9 @@ public class AppPredictionPerUserService extends mRemoteService.destroy(); mRemoteService = null; + synchronized (mLock) { + mZombie = true; + } mRemoteService = getRemoteServiceLocked(); if (mRemoteService != null) { if (isDebug()) { @@ -312,6 +306,40 @@ public class AppPredictionPerUserService extends @GuardedBy("mLock") @Nullable + protected boolean resolveService(@NonNull final AppPredictionSessionId sessionId, + @NonNull final AbstractRemoteService.AsyncRequest<IPredictionService> cb, + boolean sendImmediately) { + final AppPredictionSessionInfo sessionInfo = mSessionInfos.get(sessionId); + if (sessionInfo == null) return false; + if (sessionInfo.mUsesPeopleService) { + final IPredictionService service = + LocalServices.getService(PeopleServiceInternal.class); + if (service != null) { + try { + cb.run(service); + } catch (RemoteException e) { + // Shouldn't happen. + Slog.w(TAG, "Failed to invoke service:" + service, e); + } + } + return service != null; + } else { + final RemoteAppPredictionService service = getRemoteServiceLocked(); + if (service != null) { + // TODO(b/155887722): implement a priority system so that latency-sensitive + // requests gets executed first. + if (sendImmediately) { + service.executeOnResolvedService(cb); + } else { + service.scheduleOnResolvedService(cb); + } + } + return service != null; + } + } + + @GuardedBy("mLock") + @Nullable private RemoteAppPredictionService getRemoteServiceLocked() { if (mRemoteService == null) { final String serviceName = getComponentNameLocked(); @@ -334,8 +362,12 @@ public class AppPredictionPerUserService extends private static final class AppPredictionSessionInfo { private static final boolean DEBUG = false; // Do not submit with true + @NonNull private final AppPredictionSessionId mSessionId; + @NonNull private final AppPredictionContext mPredictionContext; + private final boolean mUsesPeopleService; + @NonNull private final Consumer<AppPredictionSessionId> mRemoveSessionInfoAction; private final RemoteCallbackList<IPredictionCallback> mCallbacks = @@ -352,13 +384,17 @@ public class AppPredictionPerUserService extends } }; - AppPredictionSessionInfo(AppPredictionSessionId id, AppPredictionContext predictionContext, - Consumer<AppPredictionSessionId> removeSessionInfoAction) { + AppPredictionSessionInfo( + @NonNull final AppPredictionSessionId id, + @NonNull final AppPredictionContext predictionContext, + final boolean usesPeopleService, + @NonNull final Consumer<AppPredictionSessionId> removeSessionInfoAction) { if (DEBUG) { Slog.d(TAG, "Creating AppPredictionSessionInfo for session Id=" + id); } mSessionId = id; mPredictionContext = predictionContext; + mUsesPeopleService = usesPeopleService; mRemoveSessionInfoAction = removeSessionInfoAction; } diff --git a/services/appprediction/java/com/android/server/appprediction/RemoteAppPredictionService.java b/services/appprediction/java/com/android/server/appprediction/RemoteAppPredictionService.java index 04e0e7f7102f..a57ff11fa20f 100644 --- a/services/appprediction/java/com/android/server/appprediction/RemoteAppPredictionService.java +++ b/services/appprediction/java/com/android/server/appprediction/RemoteAppPredictionService.java @@ -16,13 +16,8 @@ package com.android.server.appprediction; import android.annotation.NonNull; -import android.app.prediction.AppPredictionContext; -import android.app.prediction.AppPredictionSessionId; -import android.app.prediction.AppTargetEvent; -import android.app.prediction.IPredictionCallback; import android.content.ComponentName; import android.content.Context; -import android.content.pm.ParceledListSlice; import android.os.IBinder; import android.service.appprediction.IPredictionService; import android.text.format.DateUtils; @@ -71,74 +66,24 @@ public class RemoteAppPredictionService extends } /** - * Notifies the service of a new prediction session. - */ - public void onCreatePredictionSession(@NonNull AppPredictionContext context, - @NonNull AppPredictionSessionId sessionId) { - scheduleAsyncRequest((s) -> s.onCreatePredictionSession(context, sessionId)); - } - - /** - * Records an app target event to the service. - */ - public void notifyAppTargetEvent(@NonNull AppPredictionSessionId sessionId, - @NonNull AppTargetEvent event) { - scheduleAsyncRequest((s) -> s.notifyAppTargetEvent(sessionId, event)); - } - - /** - * Records when a launch location is shown. - */ - public void notifyLaunchLocationShown(@NonNull AppPredictionSessionId sessionId, - @NonNull String launchLocation, @NonNull ParceledListSlice targetIds) { - scheduleAsyncRequest((s) - -> s.notifyLaunchLocationShown(sessionId, launchLocation, targetIds)); - } - - /** - * Requests the service to sort a list of apps or shortcuts. - */ - public void sortAppTargets(@NonNull AppPredictionSessionId sessionId, - @NonNull ParceledListSlice targets, @NonNull IPredictionCallback callback) { - scheduleAsyncRequest((s) -> s.sortAppTargets(sessionId, targets, callback)); - } - - - /** - * Registers a callback for continuous updates of predicted apps or shortcuts. - */ - public void registerPredictionUpdates(@NonNull AppPredictionSessionId sessionId, - @NonNull IPredictionCallback callback) { - scheduleAsyncRequest((s) -> s.registerPredictionUpdates(sessionId, callback)); - } - - /** - * Unregisters a callback for continuous updates of predicted apps or shortcuts. - */ - public void unregisterPredictionUpdates(@NonNull AppPredictionSessionId sessionId, - @NonNull IPredictionCallback callback) { - scheduleAsyncRequest((s) -> s.unregisterPredictionUpdates(sessionId, callback)); - } - - /** - * Requests a new set of predicted apps or shortcuts. + * Schedules a request to bind to the remote service. */ - public void requestPredictionUpdate(@NonNull AppPredictionSessionId sessionId) { - scheduleAsyncRequest((s) -> s.requestPredictionUpdate(sessionId)); + public void reconnect() { + super.scheduleBind(); } /** - * Notifies the service of the end of an existing prediction session. + * Schedule async request on remote service. */ - public void onDestroyPredictionSession(@NonNull AppPredictionSessionId sessionId) { - scheduleAsyncRequest((s) -> s.onDestroyPredictionSession(sessionId)); + public void scheduleOnResolvedService(@NonNull AsyncRequest<IPredictionService> request) { + scheduleAsyncRequest(request); } /** - * Schedules a request to bind to the remote service. + * Execute async request on remote service immediately instead of sending it to Handler queue. */ - public void reconnect() { - super.scheduleBind(); + public void executeOnResolvedService(@NonNull AsyncRequest<IPredictionService> request) { + executeAsyncRequest(request); } /** |