diff options
| -rw-r--r-- | core/java/android/app/ActivityThread.java | 25 | ||||
| -rw-r--r-- | services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java | 38 | 
2 files changed, 59 insertions, 4 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 11d42461b4da..badfbf72b9ef 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -298,6 +298,11 @@ public final class ActivityThread extends ClientTransactionHandler      /** Use background GC policy and default JIT threshold. */      private static final int VM_PROCESS_STATE_JANK_IMPERCEPTIBLE = 1; +    /** The delay time for retrying to request DirectActions. */ +    private static final long REQUEST_DIRECT_ACTIONS_RETRY_TIME_MS = 200; +    /** The max count for retrying to request DirectActions. */ +    private static final int REQUEST_DIRECT_ACTIONS_RETRY_MAX_COUNT = 3; +      /**       * Denotes an invalid sequence number corresponding to a process state change.       */ @@ -1864,7 +1869,8 @@ public final class ActivityThread extends ClientTransactionHandler                  cancellationCallback.sendResult(cancellationResult);              }              mH.sendMessage(PooledLambda.obtainMessage(ActivityThread::handleRequestDirectActions, -                    ActivityThread.this, activityToken, interactor, cancellationSignal, callback)); +                    ActivityThread.this, activityToken, interactor, cancellationSignal, callback, +                    REQUEST_DIRECT_ACTIONS_RETRY_MAX_COUNT));          }          @Override @@ -3940,7 +3946,7 @@ public final class ActivityThread extends ClientTransactionHandler      /** Fetches the user actions for the corresponding activity */      private void handleRequestDirectActions(@NonNull IBinder activityToken,              @NonNull IVoiceInteractor interactor, @NonNull CancellationSignal cancellationSignal, -            @NonNull RemoteCallback callback) { +            @NonNull RemoteCallback callback, int retryCount) {          final ActivityClientRecord r = mActivities.get(activityToken);          if (r == null) {              Log.w(TAG, "requestDirectActions(): no activity for " + activityToken); @@ -3948,7 +3954,20 @@ public final class ActivityThread extends ClientTransactionHandler              return;          }          final int lifecycleState = r.getLifecycleState(); -        if (lifecycleState < ON_START || lifecycleState >= ON_STOP) { +        if (lifecycleState < ON_START) { +            // TODO(b/234173463): requestDirectActions callback should indicate errors +            if (retryCount > 0) { +                mH.sendMessageDelayed( +                        PooledLambda.obtainMessage(ActivityThread::handleRequestDirectActions, +                                ActivityThread.this, activityToken, interactor, cancellationSignal, +                                callback, retryCount - 1), REQUEST_DIRECT_ACTIONS_RETRY_TIME_MS); +                return; +            } +            Log.w(TAG, "requestDirectActions(" + r + "): wrong lifecycle: " + lifecycleState); +            callback.sendResult(null); +            return; +        } +        if (lifecycleState >= ON_STOP) {              Log.w(TAG, "requestDirectActions(" + r + "): wrong lifecycle: " + lifecycleState);              callback.sendResult(null);              return; diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java index 055864834b3b..39a6868169a7 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java @@ -70,6 +70,7 @@ import com.android.internal.app.IHotwordRecognitionStatusCallback;  import com.android.internal.app.IVoiceActionCheckCallback;  import com.android.internal.app.IVoiceInteractionSessionShowCallback;  import com.android.internal.app.IVoiceInteractor; +import com.android.internal.util.function.pooled.PooledLambda;  import com.android.server.LocalServices;  import com.android.server.wm.ActivityAssistInfo;  import com.android.server.wm.ActivityTaskManagerInternal; @@ -86,10 +87,14 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne      final static String CLOSE_REASON_VOICE_INTERACTION = "voiceinteraction"; +    /** The delay time for retrying to request DirectActions. */ +    private static final long REQUEST_DIRECT_ACTIONS_RETRY_TIME_MS = 200; +      final boolean mValid;      final Context mContext;      final Handler mHandler; +    final Handler mDirectActionsHandler;      final VoiceInteractionManagerService.VoiceInteractionManagerServiceStub mServiceStub;      final int mUser;      final ComponentName mComponent; @@ -184,6 +189,7 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne              int userHandle, ComponentName service) {          mContext = context;          mHandler = handler; +        mDirectActionsHandler = new Handler(true);          mServiceStub = stub;          mUser = userHandle;          mComponent = service; @@ -343,7 +349,10 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne                  .getAttachedNonFinishingActivityForTask(taskId, null);          if (tokens == null || tokens.getAssistToken() != assistToken) {              Slog.w(TAG, "Unknown activity to query for direct actions"); -            callback.sendResult(null); +            mDirectActionsHandler.sendMessageDelayed(PooledLambda.obtainMessage( +                    VoiceInteractionManagerServiceImpl::retryRequestDirectActions, +                    VoiceInteractionManagerServiceImpl.this, token, taskId, assistToken, +                    cancellationCallback, callback), REQUEST_DIRECT_ACTIONS_RETRY_TIME_MS);          } else {              try {                  tokens.getApplicationThread().requestDirectActions(tokens.getActivityToken(), @@ -355,6 +364,33 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne          }      } +    private void retryRequestDirectActions(@NonNull IBinder token, int taskId, +            @NonNull IBinder assistToken,  @Nullable RemoteCallback cancellationCallback, +            @NonNull RemoteCallback callback) { +        synchronized (mServiceStub) { +            if (mActiveSession == null || token != mActiveSession.mToken) { +                Slog.w(TAG, "retryRequestDirectActions does not match active session"); +                callback.sendResult(null); +                return; +            } +            final ActivityTokens tokens = LocalServices.getService( +                            ActivityTaskManagerInternal.class) +                    .getAttachedNonFinishingActivityForTask(taskId, null); +            if (tokens == null || tokens.getAssistToken() != assistToken) { +                Slog.w(TAG, "Unknown activity to query for direct actions during retrying"); +                callback.sendResult(null); +            } else { +                try { +                    tokens.getApplicationThread().requestDirectActions(tokens.getActivityToken(), +                            mActiveSession.mInteractor, cancellationCallback, callback); +                } catch (RemoteException e) { +                    Slog.w("Unexpected remote error", e); +                    callback.sendResult(null); +                } +            } +        } +    } +      void performDirectActionLocked(@NonNull IBinder token, @NonNull String actionId,              @Nullable Bundle arguments, int taskId, IBinder assistToken,              @Nullable RemoteCallback cancellationCallback,  |