Loading libs/WindowManager/Shell/res/raw/wm_shell_protolog.json +12 −0 Original line number Diff line number Diff line { "version": "1.0.0", "messages": { "-1501874464": { "message": "Fullscreen Task Appeared: #%d", "level": "VERBOSE", "group": "WM_SHELL_TASK_ORG", "at": "com\/android\/wm\/shell\/FullscreenTaskListener.java" }, "-1340279385": { "message": "Remove listener=%s", "level": "VERBOSE", Loading Loading @@ -31,6 +37,12 @@ "group": "WM_SHELL_TASK_ORG", "at": "com\/android\/wm\/shell\/ShellTaskOrganizer.java" }, "564235578": { "message": "Fullscreen Task Vanished: #%d", "level": "VERBOSE", "group": "WM_SHELL_TASK_ORG", "at": "com\/android\/wm\/shell\/FullscreenTaskListener.java" }, "980952660": { "message": "Task root back pressed taskId=%d", "level": "VERBOSE", Loading libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java 0 → 100644 +69 −0 Original line number Diff line number Diff line /* * Copyright (C) 2020 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.wm.shell; import android.app.ActivityManager; import android.util.ArraySet; import android.util.Slog; import android.view.SurfaceControl; import com.android.internal.protolog.common.ProtoLog; import com.android.wm.shell.common.TransactionPool; import com.android.wm.shell.protolog.ShellProtoLogGroup; class FullscreenTaskListener implements ShellTaskOrganizer.TaskListener { private static final String TAG = "FullscreenTaskOrg"; private final TransactionPool mTransactionPool; private final ArraySet<Integer> mTasks = new ArraySet<>(); FullscreenTaskListener(TransactionPool transactionPool) { mTransactionPool = transactionPool; } @Override public void onTaskAppeared(ActivityManager.RunningTaskInfo taskInfo, SurfaceControl leash) { synchronized (mTasks) { if (mTasks.contains(taskInfo.taskId)) { throw new RuntimeException("Task appeared more than once: #" + taskInfo.taskId); } mTasks.add(taskInfo.taskId); final SurfaceControl.Transaction t = mTransactionPool.acquire(); ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TASK_ORG, "Fullscreen Task Appeared: #%d", taskInfo.taskId); t.show(leash); t.apply(); } } @Override public void onTaskVanished(ActivityManager.RunningTaskInfo taskInfo) { synchronized (mTasks) { if (!mTasks.remove(taskInfo.taskId)) { Slog.e(TAG, "Task already vanished: #" + taskInfo.taskId); return; } ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TASK_ORG, "Fullscreen Task Vanished: #%d", taskInfo.taskId); } } @Override public void onTaskInfoChanged(ActivityManager.RunningTaskInfo taskInfo) { } } libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java +9 −2 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.wm.shell; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import android.app.ActivityManager.RunningTaskInfo; import android.util.Log; import android.util.Pair; Loading @@ -26,6 +28,7 @@ import android.window.TaskOrganizer; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.protolog.common.ProtoLog; import com.android.wm.shell.common.TransactionPool; import com.android.wm.shell.protolog.ShellProtoLogGroup; import java.util.ArrayList; Loading Loading @@ -56,13 +59,16 @@ public class ShellTaskOrganizer extends TaskOrganizer { // require us to report to both old and new listeners) private final SparseArray<Pair<RunningTaskInfo, SurfaceControl>> mTasks = new SparseArray<>(); public ShellTaskOrganizer() { public ShellTaskOrganizer(TransactionPool transactionPool) { super(); addListener(new FullscreenTaskListener(transactionPool), WINDOWING_MODE_FULLSCREEN); } @VisibleForTesting ShellTaskOrganizer(ITaskOrganizerController taskOrganizerController) { ShellTaskOrganizer(ITaskOrganizerController taskOrganizerController, TransactionPool transactionPool) { super(taskOrganizerController); addListener(new FullscreenTaskListener(transactionPool), WINDOWING_MODE_FULLSCREEN); } /** Loading Loading @@ -125,6 +131,7 @@ public class ShellTaskOrganizer extends TaskOrganizer { Pair<RunningTaskInfo, SurfaceControl> data = mTasks.get(taskInfo.taskId); int winMode = getWindowingMode(taskInfo); int prevWinMode = getWindowingMode(data.first); mTasks.put(taskInfo.taskId, new Pair<>(taskInfo, data.second)); if (prevWinMode != -1 && prevWinMode != winMode) { // TODO: We currently send vanished/appeared as the task moves between win modes, but // we should consider adding a different mode-changed callback Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/ShellTaskOrganizerTests.java +5 −1 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import android.app.ActivityManager.RunningTaskInfo; Loading @@ -32,6 +33,8 @@ import android.window.ITaskOrganizerController; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import com.android.wm.shell.common.TransactionPool; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; Loading @@ -51,6 +54,7 @@ public class ShellTaskOrganizerTests { private ITaskOrganizerController mTaskOrganizerController; ShellTaskOrganizer mOrganizer; private final TransactionPool mTransactionPool = mock(TransactionPool.class); private class TrackingTaskListener implements ShellTaskOrganizer.TaskListener { final ArrayList<RunningTaskInfo> appeared = new ArrayList<>(); Loading Loading @@ -81,7 +85,7 @@ public class ShellTaskOrganizerTests { @Before public void setUp() { MockitoAnnotations.initMocks(this); mOrganizer = new ShellTaskOrganizer(mTaskOrganizerController); mOrganizer = new ShellTaskOrganizer(mTaskOrganizerController, mTransactionPool); } @Test Loading packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java +6 −0 Original line number Diff line number Diff line Loading @@ -45,6 +45,7 @@ import com.android.systemui.shared.tracing.ProtoTraceable; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.tracing.ProtoTracer; import com.android.systemui.tracing.nano.SystemUiTraceProto; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.common.DisplayImeController; import com.android.wm.shell.nano.WmShellTraceProto; import com.android.wm.shell.onehanded.OneHanded; Loading Loading @@ -76,6 +77,9 @@ public final class WMShell extends SystemUI implements ProtoTraceable<SystemUiTr private final Optional<Pip> mPipOptional; private final Optional<SplitScreen> mSplitScreenOptional; private final Optional<OneHanded> mOneHandedOptional; // Inject the organizer directly in case the optionals aren't loaded to depend on it. There // are non-optional windowing features like FULLSCREEN. private final ShellTaskOrganizer mShellTaskOrganizer; private final ProtoTracer mProtoTracer; @Inject Loading @@ -89,6 +93,7 @@ public final class WMShell extends SystemUI implements ProtoTraceable<SystemUiTr Optional<Pip> pipOptional, Optional<SplitScreen> splitScreenOptional, Optional<OneHanded> oneHandedOptional, ShellTaskOrganizer shellTaskOrganizer, ProtoTracer protoTracer) { super(context); mCommandQueue = commandQueue; Loading @@ -101,6 +106,7 @@ public final class WMShell extends SystemUI implements ProtoTraceable<SystemUiTr mPipOptional = pipOptional; mSplitScreenOptional = splitScreenOptional; mOneHandedOptional = oneHandedOptional; mShellTaskOrganizer = shellTaskOrganizer; mProtoTracer = protoTracer; mProtoTracer.add(this); } Loading Loading
libs/WindowManager/Shell/res/raw/wm_shell_protolog.json +12 −0 Original line number Diff line number Diff line { "version": "1.0.0", "messages": { "-1501874464": { "message": "Fullscreen Task Appeared: #%d", "level": "VERBOSE", "group": "WM_SHELL_TASK_ORG", "at": "com\/android\/wm\/shell\/FullscreenTaskListener.java" }, "-1340279385": { "message": "Remove listener=%s", "level": "VERBOSE", Loading Loading @@ -31,6 +37,12 @@ "group": "WM_SHELL_TASK_ORG", "at": "com\/android\/wm\/shell\/ShellTaskOrganizer.java" }, "564235578": { "message": "Fullscreen Task Vanished: #%d", "level": "VERBOSE", "group": "WM_SHELL_TASK_ORG", "at": "com\/android\/wm\/shell\/FullscreenTaskListener.java" }, "980952660": { "message": "Task root back pressed taskId=%d", "level": "VERBOSE", Loading
libs/WindowManager/Shell/src/com/android/wm/shell/FullscreenTaskListener.java 0 → 100644 +69 −0 Original line number Diff line number Diff line /* * Copyright (C) 2020 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.wm.shell; import android.app.ActivityManager; import android.util.ArraySet; import android.util.Slog; import android.view.SurfaceControl; import com.android.internal.protolog.common.ProtoLog; import com.android.wm.shell.common.TransactionPool; import com.android.wm.shell.protolog.ShellProtoLogGroup; class FullscreenTaskListener implements ShellTaskOrganizer.TaskListener { private static final String TAG = "FullscreenTaskOrg"; private final TransactionPool mTransactionPool; private final ArraySet<Integer> mTasks = new ArraySet<>(); FullscreenTaskListener(TransactionPool transactionPool) { mTransactionPool = transactionPool; } @Override public void onTaskAppeared(ActivityManager.RunningTaskInfo taskInfo, SurfaceControl leash) { synchronized (mTasks) { if (mTasks.contains(taskInfo.taskId)) { throw new RuntimeException("Task appeared more than once: #" + taskInfo.taskId); } mTasks.add(taskInfo.taskId); final SurfaceControl.Transaction t = mTransactionPool.acquire(); ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TASK_ORG, "Fullscreen Task Appeared: #%d", taskInfo.taskId); t.show(leash); t.apply(); } } @Override public void onTaskVanished(ActivityManager.RunningTaskInfo taskInfo) { synchronized (mTasks) { if (!mTasks.remove(taskInfo.taskId)) { Slog.e(TAG, "Task already vanished: #" + taskInfo.taskId); return; } ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TASK_ORG, "Fullscreen Task Vanished: #%d", taskInfo.taskId); } } @Override public void onTaskInfoChanged(ActivityManager.RunningTaskInfo taskInfo) { } }
libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java +9 −2 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.wm.shell; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import android.app.ActivityManager.RunningTaskInfo; import android.util.Log; import android.util.Pair; Loading @@ -26,6 +28,7 @@ import android.window.TaskOrganizer; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.protolog.common.ProtoLog; import com.android.wm.shell.common.TransactionPool; import com.android.wm.shell.protolog.ShellProtoLogGroup; import java.util.ArrayList; Loading Loading @@ -56,13 +59,16 @@ public class ShellTaskOrganizer extends TaskOrganizer { // require us to report to both old and new listeners) private final SparseArray<Pair<RunningTaskInfo, SurfaceControl>> mTasks = new SparseArray<>(); public ShellTaskOrganizer() { public ShellTaskOrganizer(TransactionPool transactionPool) { super(); addListener(new FullscreenTaskListener(transactionPool), WINDOWING_MODE_FULLSCREEN); } @VisibleForTesting ShellTaskOrganizer(ITaskOrganizerController taskOrganizerController) { ShellTaskOrganizer(ITaskOrganizerController taskOrganizerController, TransactionPool transactionPool) { super(taskOrganizerController); addListener(new FullscreenTaskListener(transactionPool), WINDOWING_MODE_FULLSCREEN); } /** Loading Loading @@ -125,6 +131,7 @@ public class ShellTaskOrganizer extends TaskOrganizer { Pair<RunningTaskInfo, SurfaceControl> data = mTasks.get(taskInfo.taskId); int winMode = getWindowingMode(taskInfo); int prevWinMode = getWindowingMode(data.first); mTasks.put(taskInfo.taskId, new Pair<>(taskInfo, data.second)); if (prevWinMode != -1 && prevWinMode != winMode) { // TODO: We currently send vanished/appeared as the task moves between win modes, but // we should consider adding a different mode-changed callback Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/ShellTaskOrganizerTests.java +5 −1 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import android.app.ActivityManager.RunningTaskInfo; Loading @@ -32,6 +33,8 @@ import android.window.ITaskOrganizerController; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import com.android.wm.shell.common.TransactionPool; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; Loading @@ -51,6 +54,7 @@ public class ShellTaskOrganizerTests { private ITaskOrganizerController mTaskOrganizerController; ShellTaskOrganizer mOrganizer; private final TransactionPool mTransactionPool = mock(TransactionPool.class); private class TrackingTaskListener implements ShellTaskOrganizer.TaskListener { final ArrayList<RunningTaskInfo> appeared = new ArrayList<>(); Loading Loading @@ -81,7 +85,7 @@ public class ShellTaskOrganizerTests { @Before public void setUp() { MockitoAnnotations.initMocks(this); mOrganizer = new ShellTaskOrganizer(mTaskOrganizerController); mOrganizer = new ShellTaskOrganizer(mTaskOrganizerController, mTransactionPool); } @Test Loading
packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java +6 −0 Original line number Diff line number Diff line Loading @@ -45,6 +45,7 @@ import com.android.systemui.shared.tracing.ProtoTraceable; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.tracing.ProtoTracer; import com.android.systemui.tracing.nano.SystemUiTraceProto; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.common.DisplayImeController; import com.android.wm.shell.nano.WmShellTraceProto; import com.android.wm.shell.onehanded.OneHanded; Loading Loading @@ -76,6 +77,9 @@ public final class WMShell extends SystemUI implements ProtoTraceable<SystemUiTr private final Optional<Pip> mPipOptional; private final Optional<SplitScreen> mSplitScreenOptional; private final Optional<OneHanded> mOneHandedOptional; // Inject the organizer directly in case the optionals aren't loaded to depend on it. There // are non-optional windowing features like FULLSCREEN. private final ShellTaskOrganizer mShellTaskOrganizer; private final ProtoTracer mProtoTracer; @Inject Loading @@ -89,6 +93,7 @@ public final class WMShell extends SystemUI implements ProtoTraceable<SystemUiTr Optional<Pip> pipOptional, Optional<SplitScreen> splitScreenOptional, Optional<OneHanded> oneHandedOptional, ShellTaskOrganizer shellTaskOrganizer, ProtoTracer protoTracer) { super(context); mCommandQueue = commandQueue; Loading @@ -101,6 +106,7 @@ public final class WMShell extends SystemUI implements ProtoTraceable<SystemUiTr mPipOptional = pipOptional; mSplitScreenOptional = splitScreenOptional; mOneHandedOptional = oneHandedOptional; mShellTaskOrganizer = shellTaskOrganizer; mProtoTracer = protoTracer; mProtoTracer.add(this); } Loading