Configure the number of tasks to scan to determine Home visibility.
- Auto uses the multi display and its Home uses TaskView, so it's not enough to peek the top Tasks to get the visibility of Home.
- Set the default number of tasks to retrieve as 10 to scan all visible tasks.
- Don't query PM to check if the task is Home, check the ActivityType instead.
Bug: 236099098
Test: atest android.app.cts.ActivityManagerTest#testHomeVisibilityListener
Change-Id: I10b6d84292d3180f095dd9f8cf76b4c9db641091
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index e25e374..449729e 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -5124,7 +5124,7 @@
Preconditions.checkNotNull(listener);
Preconditions.checkNotNull(executor);
try {
- listener.init(mContext, executor, this);
+ listener.init(mContext, executor);
getService().registerProcessObserver(listener.mObserver);
// Notify upon first registration.
executor.execute(() ->
diff --git a/core/java/android/app/HomeVisibilityListener.java b/core/java/android/app/HomeVisibilityListener.java
index 57d868b..ca20648 100644
--- a/core/java/android/app/HomeVisibilityListener.java
+++ b/core/java/android/app/HomeVisibilityListener.java
@@ -16,16 +16,17 @@
package android.app;
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
+import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
+import static android.view.Display.DEFAULT_DISPLAY;
+
import android.annotation.SuppressLint;
import android.annotation.SystemApi;
import android.annotation.TestApi;
-import android.content.ComponentName;
import android.content.Context;
import android.os.Binder;
-import java.util.ArrayList;
import java.util.List;
-import java.util.Objects;
import java.util.concurrent.Executor;
/**
@@ -39,20 +40,21 @@
@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
@TestApi
public abstract class HomeVisibilityListener {
- private Context mContext;
- private ActivityManager mActivityManager;
+ private ActivityTaskManager mActivityTaskManager;
private Executor mExecutor;
+ private int mMaxScanTasksForHomeVisibility;
/** @hide */
android.app.IProcessObserver.Stub mObserver;
/** @hide */
boolean mIsHomeActivityVisible;
/** @hide */
- void init(Context context, Executor executor, ActivityManager activityManager) {
- mContext = context;
- mActivityManager = activityManager;
- mIsHomeActivityVisible = isHomeActivityVisible();
+ void init(Context context, Executor executor) {
+ mActivityTaskManager = ActivityTaskManager.getInstance();
mExecutor = executor;
+ mMaxScanTasksForHomeVisibility = context.getResources().getInteger(
+ com.android.internal.R.integer.config_maxScanTasksForHomeVisibility);
+ mIsHomeActivityVisible = isHomeActivityVisible();
}
/**
@@ -91,22 +93,21 @@
}
private boolean isHomeActivityVisible() {
- List<ActivityManager.RunningTaskInfo> tasks = mActivityManager.getRunningTasks(1);
- if (tasks == null || tasks.isEmpty()) {
+ List<ActivityManager.RunningTaskInfo> tasksTopToBottom = mActivityTaskManager.getTasks(
+ mMaxScanTasksForHomeVisibility, /* filterOnlyVisibleRecents= */ true,
+ /* keepIntentExtra= */ false, DEFAULT_DISPLAY);
+ if (tasksTopToBottom == null || tasksTopToBottom.isEmpty()) {
return false;
}
- String top = tasks.get(0).topActivity.getPackageName();
- if (top == null) {
- return false;
+ for (int i = 0, taskSize = tasksTopToBottom.size(); i < taskSize; ++i) {
+ ActivityManager.RunningTaskInfo task = tasksTopToBottom.get(i);
+ if (!task.isVisible()
+ || (task.baseIntent.getFlags() & FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) != 0) {
+ continue;
+ }
+ return task.getActivityType() == ACTIVITY_TYPE_HOME;
}
-
- // We can assume that the screen is idle if the home application is in the foreground.
- ComponentName defaultHomeComponent = mContext.getPackageManager()
- .getHomeActivities(new ArrayList<>());
- if (defaultHomeComponent == null) return false;
-
- String defaultHomePackage = defaultHomeComponent.getPackageName();
- return Objects.equals(top, defaultHomePackage);
+ return false;
}
}
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 067dc86..26707ca 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -5872,4 +5872,7 @@
<!-- Whether the wake screen on notifications feature is available. -->
<bool name="config_pulseOnNotificationsAvailable">true</bool>
+
+ <!-- The number of tasks to scan to get the visibility of Home -->
+ <integer name="config_maxScanTasksForHomeVisibility">10</integer>
</resources>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index b2fd28f..536e39c 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -3976,6 +3976,8 @@
<java-symbol type="string" name="config_customCountryDetector" />
+ <java-symbol type="integer" name="config_maxScanTasksForHomeVisibility" />
+
<!-- For Foldables -->
<java-symbol type="array" name="config_foldedDeviceStates" />
<java-symbol type="array" name="config_deviceStatesOnWhichToWakeUp" />