diff options
7 files changed, 95 insertions, 26 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityAssistInfo.java b/services/core/java/com/android/server/wm/ActivityAssistInfo.java new file mode 100644 index 000000000000..054044b47245 --- /dev/null +++ b/services/core/java/com/android/server/wm/ActivityAssistInfo.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.wm; + +import android.os.IBinder; + +/** + * Class needed to expose some {@link ActivityRecord} fields in order to provide + * {@link android.service.voice.VoiceInteractionSession#onHandleAssist(AssistState)} + * + * @hide + */ +public class ActivityAssistInfo { + private final IBinder mActivityToken; + private final IBinder mAssistToken; + private final int mTaskId; + + public ActivityAssistInfo(ActivityRecord activityRecord) { + this.mActivityToken = activityRecord.appToken; + this.mAssistToken = activityRecord.assistToken; + this.mTaskId = activityRecord.getTask().mTaskId; + } + + /** @hide */ + public IBinder getActivityToken() { + return mActivityToken; + } + + /** @hide */ + public IBinder getAssistToken() { + return mAssistToken; + } + + /** @hide */ + public int getTaskId() { + return mTaskId; + } +} diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java index 060323c34b40..6bb58e979af1 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java @@ -32,7 +32,6 @@ import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import android.service.voice.IVoiceInteractionSession; -import android.util.Pair; import android.util.proto.ProtoOutputStream; import android.window.TaskSnapshot; @@ -166,7 +165,7 @@ public abstract class ActivityTaskManagerInternal { * Returns the top activity from each of the currently visible root tasks, and the related task * id. The first entry will be the focused activity. */ - public abstract List<Pair<IBinder, Integer>> getTopVisibleActivities(); + public abstract List<ActivityAssistInfo> getTopVisibleActivities(); /** * Returns whether {@code uid} has any resumed activity. diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 09f5c937928c..224599da2ccc 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -215,7 +215,6 @@ import android.text.format.TimeMigrationUtils; import android.util.ArrayMap; import android.util.ArraySet; import android.util.Log; -import android.util.Pair; import android.util.Slog; import android.util.SparseArray; import android.util.TimeUtils; @@ -5075,7 +5074,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } @Override - public List<Pair<IBinder, Integer>> getTopVisibleActivities() { + public List<ActivityAssistInfo> getTopVisibleActivities() { synchronized (mGlobalLock) { return mRootWindowContainer.getTopVisibleActivities(); } diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 857217fb19e2..72610481ad32 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -1817,8 +1817,8 @@ class RootWindowContainer extends WindowContainer<DisplayContent> * @return a list of pairs, containing activities and their task id which are the top ones in * each visible root task. The first entry will be the focused activity. */ - List<Pair<IBinder, Integer>> getTopVisibleActivities() { - final ArrayList<Pair<IBinder, Integer>> topVisibleActivities = new ArrayList<>(); + List<ActivityAssistInfo> getTopVisibleActivities() { + final ArrayList<ActivityAssistInfo> topVisibleActivities = new ArrayList<>(); final Task topFocusedRootTask = getTopDisplayFocusedRootTask(); // Traverse all displays. forAllRootTasks(rootTask -> { @@ -1826,8 +1826,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> if (rootTask.shouldBeVisible(null /* starting */)) { final ActivityRecord top = rootTask.getTopNonFinishingActivity(); if (top != null) { - Pair<IBinder, Integer> visibleActivity = new Pair<>(top.appToken, - top.getTask().mTaskId); + ActivityAssistInfo visibleActivity = new ActivityAssistInfo(top); if (rootTask == topFocusedRootTask) { topVisibleActivities.add(0, visibleActivity); } else { diff --git a/services/voiceinteraction/TEST_MAPPING b/services/voiceinteraction/TEST_MAPPING index 748e5dfe4e91..22a6445843a4 100644 --- a/services/voiceinteraction/TEST_MAPPING +++ b/services/voiceinteraction/TEST_MAPPING @@ -7,6 +7,14 @@ "exclude-annotation": "androidx.test.filters.FlakyTest" } ] + }, + { + "name": "CtsAssistTestCases", + "options": [ + { + "exclude-annotation": "androidx.test.filters.FlakyTest" + } + ] } ] } diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java index 05573f1d7d60..9c3c705b8884 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java @@ -50,7 +50,6 @@ import android.service.voice.IVoiceInteractionSession; import android.service.voice.VoiceInteractionService; import android.service.voice.VoiceInteractionServiceInfo; import android.system.OsConstants; -import android.util.Pair; import android.util.PrintWriterPrinter; import android.util.Slog; import android.view.IWindowManager; @@ -60,6 +59,7 @@ import com.android.internal.app.IVoiceActionCheckCallback; import com.android.internal.app.IVoiceInteractionSessionShowCallback; import com.android.internal.app.IVoiceInteractor; import com.android.server.LocalServices; +import com.android.server.wm.ActivityAssistInfo; import com.android.server.wm.ActivityTaskManagerInternal; import com.android.server.wm.ActivityTaskManagerInternal.ActivityTokens; @@ -187,24 +187,23 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne mSessionComponentName, mUser, mContext, this, mInfo.getServiceInfo().applicationInfo.uid, mHandler); } - List<Pair<IBinder, Integer>> allVisibleActivities = + List<ActivityAssistInfo> allVisibleActivities = LocalServices.getService(ActivityTaskManagerInternal.class) .getTopVisibleActivities(); - List<Pair<IBinder, Integer>> visibleActivities = null; + List<ActivityAssistInfo> visibleActivities = null; if (activityToken != null) { visibleActivities = new ArrayList(); int activitiesCount = allVisibleActivities.size(); for (int i = 0; i < activitiesCount; i++) { - if (allVisibleActivities.get(i).first == activityToken) { - visibleActivities.add( - new Pair<>(activityToken, allVisibleActivities.get(i).second)); + ActivityAssistInfo info = allVisibleActivities.get(i); + if (info.getActivityToken() == activityToken) { + visibleActivities.add(info); break; } } } else { - visibleActivities = LocalServices.getService(ActivityTaskManagerInternal.class) - .getTopVisibleActivities(); + visibleActivities = allVisibleActivities; } return mActiveSession.showLocked(args, flags, mDisabledShowContext, showCallback, visibleActivities); diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java index 428d342a80c9..cc021a9acfe2 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java @@ -56,7 +56,6 @@ import android.service.voice.IVoiceInteractionSession; import android.service.voice.IVoiceInteractionSessionService; import android.service.voice.VoiceInteractionService; import android.service.voice.VoiceInteractionSession; -import android.util.Pair; import android.util.Slog; import android.view.IWindowManager; @@ -68,6 +67,7 @@ import com.android.server.am.AssistDataRequester; import com.android.server.am.AssistDataRequester.AssistDataRequesterCallbacks; import com.android.server.statusbar.StatusBarManagerInternal; import com.android.server.uri.UriGrantsManagerInternal; +import com.android.server.wm.ActivityAssistInfo; import java.io.PrintWriter; import java.util.ArrayList; @@ -102,6 +102,7 @@ final class VoiceInteractionSessionConnection implements ServiceConnection, IVoiceInteractionSession mSession; IVoiceInteractor mInteractor; ArrayList<IVoiceInteractionSessionShowCallback> mPendingShowCallbacks = new ArrayList<>(); + private List<ActivityAssistInfo> mPendingHandleAssistWithoutData = new ArrayList<>(); AssistDataRequester mAssistDataRequester; IVoiceInteractionSessionShowCallback mShowCallback = @@ -192,7 +193,7 @@ final class VoiceInteractionSessionConnection implements ServiceConnection, public boolean showLocked(Bundle args, int flags, int disabledContext, IVoiceInteractionSessionShowCallback showCallback, - List<Pair<IBinder, Integer>> topActivities) { + List<ActivityAssistInfo> topActivities) { if (mBound) { if (!mFullyBound) { mFullyBound = mContext.bindServiceAsUser(mBindIntent, mFullConnection, @@ -216,7 +217,7 @@ final class VoiceInteractionSessionConnection implements ServiceConnection, int topActivitiesCount = topActivities.size(); final ArrayList<IBinder> topActivitiesToken = new ArrayList<>(topActivitiesCount); for (int i = 0; i < topActivitiesCount; i++) { - topActivitiesToken.add(topActivities.get(i).first); + topActivitiesToken.add(topActivities.get(i).getActivityToken()); } mAssistDataRequester.requestAssistData(topActivitiesToken, fetchData, @@ -243,8 +244,16 @@ final class VoiceInteractionSessionConnection implements ServiceConnection, } else { doHandleAssistWithoutData(topActivities); } - } else if (showCallback != null) { - mPendingShowCallbacks.add(showCallback); + } else { + if (showCallback != null) { + mPendingShowCallbacks.add(showCallback); + } + if (!assistDataRequestNeeded) { + // If no data are required we are not passing trough mAssistDataRequester. As + // a consequence, when a new session is delivered it is needed to process those + // requests manually. + mPendingHandleAssistWithoutData = topActivities; + } } mCallback.onSessionShown(this); return true; @@ -258,17 +267,17 @@ final class VoiceInteractionSessionConnection implements ServiceConnection, return false; } - private void doHandleAssistWithoutData(List<Pair<IBinder, Integer>> topActivities) { + private void doHandleAssistWithoutData(List<ActivityAssistInfo> topActivities) { final int activityCount = topActivities.size(); for (int i = 0; i < activityCount; i++) { - final Pair<IBinder, Integer> topActivity = topActivities.get(i); - final IBinder activityId = topActivity.first; - final int taskId = topActivity.second; + final ActivityAssistInfo topActivity = topActivities.get(i); + final IBinder assistToken = topActivity.getAssistToken(); + final int taskId = topActivity.getTaskId(); final int activityIndex = i; try { mSession.handleAssist( taskId, - activityId, + assistToken, /* assistData = */ null, /* assistStructure = */ null, /* assistContent = */ null, @@ -468,6 +477,10 @@ final class VoiceInteractionSessionConnection implements ServiceConnection, } catch (RemoteException e) { } mAssistDataRequester.processPendingAssistData(); + if (!mPendingHandleAssistWithoutData.isEmpty()) { + doHandleAssistWithoutData(mPendingHandleAssistWithoutData); + mPendingHandleAssistWithoutData.clear(); + } } return true; } |