Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b5550919 authored by [1;3C's avatar [1;3C
Browse files

Organize Fullscreen tasks

Fix a bug where taskinfo changes weren't recording the
changes.

Add FullscreenTaskListener which is very basic and just
shows surfaces on appear. Fullscreen works fine with
this much because the surfaces are always at 0,0
anyways.

Bug: 162499076
Test: Existing tests pass, phone works like normal
Change-Id: I606bc1cbc85c33c4fc40baf6b3080a1eaa37550c
parent a32bde83
Loading
Loading
Loading
Loading
+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",
@@ -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",
+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) {
    }
}
+9 −2
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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);
    }

    /**
@@ -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
+5 −1
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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<>();
@@ -81,7 +85,7 @@ public class ShellTaskOrganizerTests {
    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        mOrganizer = new ShellTaskOrganizer(mTaskOrganizerController);
        mOrganizer = new ShellTaskOrganizer(mTaskOrganizerController, mTransactionPool);
    }

    @Test
+6 −0
Original line number Diff line number Diff line
@@ -49,6 +49,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.protolog.ShellProtoLogImpl;
@@ -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
@@ -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;
@@ -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