summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Winson Chung <winsonc@google.com> 2020-12-07 22:54:02 -0800
committer Winson Chung <winsonc@google.com> 2021-01-12 10:05:06 -0800
commit813664c88c949c5db20fdef7f20c32770cf78418 (patch)
tree6053646228a19409714cf34c1d75aa1f7e3ea251
parent5b4318517275d1be027538d62eb8b975ccaf0b7b (diff)
4/ Update HideDisplayCutout and AppPairs to use shell main thread
Bug: 161979899 Test: atest WMShellUnitTests Change-Id: I369e83cbc85fea80b0db4d58ba8d05d12fbd09e3
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPairsController.java90
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutController.java34
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/apppairs/TestAppPairsController.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java6
4 files changed, 114 insertions, 25 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPairsController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPairsController.java
index f2f09820639a..e380426b9ca2 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPairsController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/apppairs/AppPairsController.java
@@ -19,41 +19,58 @@ package com.android.wm.shell.apppairs;
import static com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_TASK_ORG;
import android.app.ActivityManager;
+import android.util.Slog;
import android.util.SparseArray;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.protolog.common.ProtoLog;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.common.DisplayController;
+import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.SyncTransactionQueue;
import java.io.PrintWriter;
+import java.util.concurrent.TimeUnit;
/**
* Class manages app-pairs multitasking mode and implements the main interface {@link AppPairs}.
*/
-public class AppPairsController implements AppPairs {
+public class AppPairsController {
private static final String TAG = AppPairsController.class.getSimpleName();
private final ShellTaskOrganizer mTaskOrganizer;
private final SyncTransactionQueue mSyncQueue;
+ private final ShellExecutor mMainExecutor;
+ private final AppPairsImpl mImpl = new AppPairsImpl();
private AppPairsPool mPairsPool;
// Active app-pairs mapped by root task id key.
private final SparseArray<AppPair> mActiveAppPairs = new SparseArray<>();
private final DisplayController mDisplayController;
- public AppPairsController(ShellTaskOrganizer organizer, SyncTransactionQueue syncQueue,
- DisplayController displayController) {
+ /**
+ * Creates {@link AppPairs}, returns {@code null} if the feature is not supported.
+ */
+ @Nullable
+ public static AppPairs create(ShellTaskOrganizer organizer,
+ SyncTransactionQueue syncQueue, DisplayController displayController,
+ ShellExecutor mainExecutor) {
+ return new AppPairsController(organizer, syncQueue, displayController,
+ mainExecutor).mImpl;
+ }
+
+ AppPairsController(ShellTaskOrganizer organizer, SyncTransactionQueue syncQueue,
+ DisplayController displayController, ShellExecutor mainExecutor) {
mTaskOrganizer = organizer;
mSyncQueue = syncQueue;
mDisplayController = displayController;
+ mMainExecutor = mainExecutor;
}
- @Override
- public void onOrganizerRegistered() {
+ void onOrganizerRegistered() {
if (mPairsPool == null) {
setPairsPool(new AppPairsPool(this));
}
@@ -64,8 +81,7 @@ public class AppPairsController implements AppPairs {
mPairsPool = pool;
}
- @Override
- public boolean pair(int taskId1, int taskId2) {
+ boolean pair(int taskId1, int taskId2) {
final ActivityManager.RunningTaskInfo task1 = mTaskOrganizer.getRunningTaskInfo(taskId1);
final ActivityManager.RunningTaskInfo task2 = mTaskOrganizer.getRunningTaskInfo(taskId2);
if (task1 == null || task2 == null) {
@@ -74,8 +90,7 @@ public class AppPairsController implements AppPairs {
return pair(task1, task2);
}
- @Override
- public boolean pair(ActivityManager.RunningTaskInfo task1,
+ boolean pair(ActivityManager.RunningTaskInfo task1,
ActivityManager.RunningTaskInfo task2) {
return pairInner(task1, task2) != null;
}
@@ -94,8 +109,7 @@ public class AppPairsController implements AppPairs {
return pair;
}
- @Override
- public void unpair(int taskId) {
+ void unpair(int taskId) {
unpair(taskId, true /* releaseToPool */);
}
@@ -135,8 +149,7 @@ public class AppPairsController implements AppPairs {
return mDisplayController;
}
- @Override
- public void dump(@NonNull PrintWriter pw, String prefix) {
+ private void dump(@NonNull PrintWriter pw, String prefix) {
final String innerPrefix = prefix + " ";
final String childPrefix = innerPrefix + " ";
pw.println(prefix + this);
@@ -155,4 +168,55 @@ public class AppPairsController implements AppPairs {
return TAG + "#" + mActiveAppPairs.size();
}
+ private class AppPairsImpl implements AppPairs {
+ @Override
+ public boolean pair(int task1, int task2) {
+ boolean[] result = new boolean[1];
+ try {
+ mMainExecutor.executeBlocking(() -> {
+ result[0] = AppPairsController.this.pair(task1, task2);
+ });
+ } catch (InterruptedException e) {
+ Slog.e(TAG, "Failed to pair tasks: " + task1 + ", " + task2);
+ }
+ return result[0];
+ }
+
+ @Override
+ public boolean pair(ActivityManager.RunningTaskInfo task1,
+ ActivityManager.RunningTaskInfo task2) {
+ boolean[] result = new boolean[1];
+ try {
+ mMainExecutor.executeBlocking(() -> {
+ result[0] = AppPairsController.this.pair(task1, task2);
+ });
+ } catch (InterruptedException e) {
+ Slog.e(TAG, "Failed to pair tasks: " + task1 + ", " + task2);
+ }
+ return result[0];
+ }
+
+ @Override
+ public void unpair(int taskId) {
+ mMainExecutor.execute(() -> {
+ AppPairsController.this.unpair(taskId);
+ });
+ }
+
+ @Override
+ public void onOrganizerRegistered() {
+ mMainExecutor.execute(() -> {
+ AppPairsController.this.onOrganizerRegistered();
+ });
+ }
+
+ @Override
+ public void dump(@NonNull PrintWriter pw, String prefix) {
+ try {
+ mMainExecutor.executeBlocking(() -> AppPairsController.this.dump(pw, prefix));
+ } catch (InterruptedException e) {
+ Slog.e(TAG, "Failed to dump AppPairsController in 2s");
+ }
+ }
+ }
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutController.java
index a89100526b8b..12b8b87f1285 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/hidedisplaycutout/HideDisplayCutoutController.java
@@ -19,6 +19,7 @@ package com.android.wm.shell.hidedisplaycutout;
import android.content.Context;
import android.content.res.Configuration;
import android.os.SystemProperties;
+import android.util.Slog;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -28,17 +29,18 @@ import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.ShellExecutor;
import java.io.PrintWriter;
-import java.util.concurrent.Executor;
+import java.util.concurrent.TimeUnit;
/**
* Manages the hide display cutout status.
*/
-public class HideDisplayCutoutController implements HideDisplayCutout {
+public class HideDisplayCutoutController {
private static final String TAG = "HideDisplayCutoutController";
private final Context mContext;
private final HideDisplayCutoutOrganizer mOrganizer;
private final ShellExecutor mMainExecutor;
+ private final HideDisplayCutoutImpl mImpl = new HideDisplayCutoutImpl();
@VisibleForTesting
boolean mEnabled;
@@ -55,7 +57,7 @@ public class HideDisplayCutoutController implements HideDisplayCutout {
* supported.
*/
@Nullable
- public static HideDisplayCutoutController create(
+ public static HideDisplayCutout create(
Context context, DisplayController displayController, ShellExecutor mainExecutor) {
// The SystemProperty is set for devices that support this feature and is used to control
// whether to create the HideDisplayCutout instance.
@@ -66,7 +68,7 @@ public class HideDisplayCutoutController implements HideDisplayCutout {
HideDisplayCutoutOrganizer organizer =
new HideDisplayCutoutOrganizer(context, displayController, mainExecutor);
- return new HideDisplayCutoutController(context, organizer, mainExecutor);
+ return new HideDisplayCutoutController(context, organizer, mainExecutor).mImpl;
}
@VisibleForTesting
@@ -88,13 +90,11 @@ public class HideDisplayCutoutController implements HideDisplayCutout {
}
}
- @Override
- public void onConfigurationChanged(Configuration newConfig) {
+ private void onConfigurationChanged(Configuration newConfig) {
updateStatus();
}
- @Override
- public void dump(@NonNull PrintWriter pw) {
+ private void dump(@NonNull PrintWriter pw) {
final String prefix = " ";
pw.print(TAG);
pw.println(" states: ");
@@ -103,4 +103,22 @@ public class HideDisplayCutoutController implements HideDisplayCutout {
pw.println(mEnabled);
mOrganizer.dump(pw);
}
+
+ private class HideDisplayCutoutImpl implements HideDisplayCutout {
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ mMainExecutor.execute(() -> {
+ HideDisplayCutoutController.this.onConfigurationChanged(newConfig);
+ });
+ }
+
+ @Override
+ public void dump(@NonNull PrintWriter pw) {
+ try {
+ mMainExecutor.executeBlocking(() -> HideDisplayCutoutController.this.dump(pw));
+ } catch (InterruptedException e) {
+ Slog.e(TAG, "Failed to dump HideDisplayCutoutController in 2s");
+ }
+ }
+ }
}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/apppairs/TestAppPairsController.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/apppairs/TestAppPairsController.java
index be0963628933..e094158e1144 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/apppairs/TestAppPairsController.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/apppairs/TestAppPairsController.java
@@ -16,16 +16,21 @@
package com.android.wm.shell.apppairs;
+import static org.mockito.Mockito.mock;
+
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.common.DisplayController;
+import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.SyncTransactionQueue;
+import org.mockito.Mock;
+
public class TestAppPairsController extends AppPairsController {
- TestAppPairsPool mPool;
+ private TestAppPairsPool mPool;
public TestAppPairsController(ShellTaskOrganizer organizer, SyncTransactionQueue syncQueue,
DisplayController displayController) {
- super(organizer, syncQueue, displayController);
+ super(organizer, syncQueue, displayController, mock(ShellExecutor.class));
mPool = new TestAppPairsPool(this);
setPairsPool(mPool);
}
diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java
index 88f6e1ffac0c..93725ae778b2 100644
--- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java
+++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java
@@ -84,8 +84,10 @@ public class WMShellModule {
@WMSingleton
@Provides
static AppPairs provideAppPairs(ShellTaskOrganizer shellTaskOrganizer,
- SyncTransactionQueue syncQueue, DisplayController displayController) {
- return new AppPairsController(shellTaskOrganizer, syncQueue, displayController);
+ SyncTransactionQueue syncQueue, DisplayController displayController,
+ @ShellMainThread ShellExecutor mainExecutor) {
+ return AppPairsController.create(shellTaskOrganizer, syncQueue, displayController,
+ mainExecutor);
}
@WMSingleton