Merge "Synchronize WCT for TaskView with SurfaceControl.Transaction." into sc-v2-dev

This commit is contained in:
TreeHugger Robot
2021-06-08 18:21:32 +00:00
committed by Android (Google) Code Review
10 changed files with 76 additions and 29 deletions

View File

@@ -1554,12 +1554,21 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall
* @hide * @hide
*/ */
public void setResizeBackgroundColor(int bgColor) { public void setResizeBackgroundColor(int bgColor) {
setResizeBackgroundColor(mTmpTransaction, bgColor);
mTmpTransaction.apply();
}
/**
* Version of {@link #setResizeBackgroundColor(int)} that allows you to provide
* {@link SurfaceControl.Transaction}.
* @hide
*/
public void setResizeBackgroundColor(@NonNull SurfaceControl.Transaction t, int bgColor) {
if (mBackgroundControl == null) { if (mBackgroundControl == null) {
return; return;
} }
mBackgroundColor = bgColor; mBackgroundColor = bgColor;
updateBackgroundColor(mTmpTransaction).apply(); updateBackgroundColor(t);
} }
@UnsupportedAppUsage @UnsupportedAppUsage

View File

@@ -40,6 +40,8 @@ import android.view.ViewTreeObserver;
import android.window.WindowContainerToken; import android.window.WindowContainerToken;
import android.window.WindowContainerTransaction; import android.window.WindowContainerTransaction;
import com.android.wm.shell.common.SyncTransactionQueue;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
@@ -74,6 +76,7 @@ public class TaskView extends SurfaceView implements SurfaceHolder.Callback,
private final ShellTaskOrganizer mTaskOrganizer; private final ShellTaskOrganizer mTaskOrganizer;
private final Executor mShellExecutor; private final Executor mShellExecutor;
private final SyncTransactionQueue mSyncQueue;
private ActivityManager.RunningTaskInfo mTaskInfo; private ActivityManager.RunningTaskInfo mTaskInfo;
private WindowContainerToken mTaskToken; private WindowContainerToken mTaskToken;
@@ -89,11 +92,12 @@ public class TaskView extends SurfaceView implements SurfaceHolder.Callback,
private final Rect mTmpRootRect = new Rect(); private final Rect mTmpRootRect = new Rect();
private final int[] mTmpLocation = new int[2]; private final int[] mTmpLocation = new int[2];
public TaskView(Context context, ShellTaskOrganizer organizer) { public TaskView(Context context, ShellTaskOrganizer organizer, SyncTransactionQueue syncQueue) {
super(context, null, 0, 0, true /* disableBackgroundLayer */); super(context, null, 0, 0, true /* disableBackgroundLayer */);
mTaskOrganizer = organizer; mTaskOrganizer = organizer;
mShellExecutor = organizer.getExecutor(); mShellExecutor = organizer.getExecutor();
mSyncQueue = syncQueue;
setUseAlpha(); setUseAlpha();
getHolder().addCallback(this); getHolder().addCallback(this);
mGuard.open("release"); mGuard.open("release");
@@ -189,8 +193,7 @@ public class TaskView extends SurfaceView implements SurfaceHolder.Callback,
WindowContainerTransaction wct = new WindowContainerTransaction(); WindowContainerTransaction wct = new WindowContainerTransaction();
wct.setBounds(mTaskToken, mTmpRect); wct.setBounds(mTaskToken, mTmpRect);
// TODO(b/151449487): Enable synchronization mSyncQueue.queue(wct);
mTaskOrganizer.applyTransaction(wct);
} }
/** /**
@@ -236,14 +239,16 @@ public class TaskView extends SurfaceView implements SurfaceHolder.Callback,
private void updateTaskVisibility() { private void updateTaskVisibility() {
WindowContainerTransaction wct = new WindowContainerTransaction(); WindowContainerTransaction wct = new WindowContainerTransaction();
wct.setHidden(mTaskToken, !mSurfaceCreated /* hidden */); wct.setHidden(mTaskToken, !mSurfaceCreated /* hidden */);
mTaskOrganizer.applyTransaction(wct); mSyncQueue.queue(wct);
// TODO(b/151449487): Only call callback once we enable synchronization if (mListener == null) {
if (mListener != null) { return;
final int taskId = mTaskInfo.taskId; }
int taskId = mTaskInfo.taskId;
mSyncQueue.runInSync((t) -> {
mListenerExecutor.execute(() -> { mListenerExecutor.execute(() -> {
mListener.onTaskVisibilityChanged(taskId, mSurfaceCreated); mListener.onTaskVisibilityChanged(taskId, mSurfaceCreated);
}); });
} });
} }
@Override @Override
@@ -264,10 +269,12 @@ public class TaskView extends SurfaceView implements SurfaceHolder.Callback,
updateTaskVisibility(); updateTaskVisibility();
} }
mTaskOrganizer.setInterceptBackPressedOnTaskRoot(mTaskToken, true); mTaskOrganizer.setInterceptBackPressedOnTaskRoot(mTaskToken, true);
// TODO: Synchronize show with the resize
onLocationChanged(); onLocationChanged();
if (taskInfo.taskDescription != null) { if (taskInfo.taskDescription != null) {
setResizeBackgroundColor(taskInfo.taskDescription.getBackgroundColor()); int backgroundColor = taskInfo.taskDescription.getBackgroundColor();
mSyncQueue.runInSync((t) -> {
setResizeBackgroundColor(t, backgroundColor);
});
} }
if (mListener != null) { if (mListener != null) {

View File

@@ -20,8 +20,8 @@ import android.annotation.UiContext;
import android.content.Context; import android.content.Context;
import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.SyncTransactionQueue;
import com.android.wm.shell.common.annotations.ExternalThread; import com.android.wm.shell.common.annotations.ExternalThread;
import com.android.wm.shell.common.annotations.ShellMainThread;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import java.util.function.Consumer; import java.util.function.Consumer;
@@ -30,12 +30,14 @@ import java.util.function.Consumer;
public class TaskViewFactoryController { public class TaskViewFactoryController {
private final ShellTaskOrganizer mTaskOrganizer; private final ShellTaskOrganizer mTaskOrganizer;
private final ShellExecutor mShellExecutor; private final ShellExecutor mShellExecutor;
private final SyncTransactionQueue mSyncQueue;
private final TaskViewFactory mImpl = new TaskViewFactoryImpl(); private final TaskViewFactory mImpl = new TaskViewFactoryImpl();
public TaskViewFactoryController(ShellTaskOrganizer taskOrganizer, public TaskViewFactoryController(ShellTaskOrganizer taskOrganizer,
ShellExecutor shellExecutor) { ShellExecutor shellExecutor, SyncTransactionQueue syncQueue) {
mTaskOrganizer = taskOrganizer; mTaskOrganizer = taskOrganizer;
mShellExecutor = shellExecutor; mShellExecutor = shellExecutor;
mSyncQueue = syncQueue;
} }
public TaskViewFactory asTaskViewFactory() { public TaskViewFactory asTaskViewFactory() {
@@ -44,7 +46,7 @@ public class TaskViewFactoryController {
/** Creates an {@link TaskView} */ /** Creates an {@link TaskView} */
public void create(@UiContext Context context, Executor executor, Consumer<TaskView> onCreate) { public void create(@UiContext Context context, Executor executor, Consumer<TaskView> onCreate) {
TaskView taskView = new TaskView(context, mTaskOrganizer); TaskView taskView = new TaskView(context, mTaskOrganizer, mSyncQueue);
executor.execute(() -> { executor.execute(() -> {
onCreate.accept(taskView); onCreate.accept(taskView);
}); });

View File

@@ -85,6 +85,7 @@ import com.android.wm.shell.common.DisplayChangeController;
import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.FloatingContentCoordinator; import com.android.wm.shell.common.FloatingContentCoordinator;
import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.SyncTransactionQueue;
import com.android.wm.shell.common.TaskStackListenerCallback; import com.android.wm.shell.common.TaskStackListenerCallback;
import com.android.wm.shell.common.TaskStackListenerImpl; import com.android.wm.shell.common.TaskStackListenerImpl;
import com.android.wm.shell.pip.PinnedStackListenerForwarder; import com.android.wm.shell.pip.PinnedStackListenerForwarder;
@@ -136,6 +137,7 @@ public class BubbleController {
private final TaskStackListenerImpl mTaskStackListener; private final TaskStackListenerImpl mTaskStackListener;
private final ShellTaskOrganizer mTaskOrganizer; private final ShellTaskOrganizer mTaskOrganizer;
private final DisplayController mDisplayController; private final DisplayController mDisplayController;
private final SyncTransactionQueue mSyncQueue;
// Used to post to main UI thread // Used to post to main UI thread
private final ShellExecutor mMainExecutor; private final ShellExecutor mMainExecutor;
@@ -208,7 +210,8 @@ public class BubbleController {
ShellTaskOrganizer organizer, ShellTaskOrganizer organizer,
DisplayController displayController, DisplayController displayController,
ShellExecutor mainExecutor, ShellExecutor mainExecutor,
Handler mainHandler) { Handler mainHandler,
SyncTransactionQueue syncQueue) {
BubbleLogger logger = new BubbleLogger(uiEventLogger); BubbleLogger logger = new BubbleLogger(uiEventLogger);
BubblePositioner positioner = new BubblePositioner(context, windowManager); BubblePositioner positioner = new BubblePositioner(context, windowManager);
BubbleData data = new BubbleData(context, logger, positioner, mainExecutor); BubbleData data = new BubbleData(context, logger, positioner, mainExecutor);
@@ -216,7 +219,7 @@ public class BubbleController {
new BubbleDataRepository(context, launcherApps, mainExecutor), new BubbleDataRepository(context, launcherApps, mainExecutor),
statusBarService, windowManager, windowManagerShellWrapper, launcherApps, statusBarService, windowManager, windowManagerShellWrapper, launcherApps,
logger, taskStackListener, organizer, positioner, displayController, mainExecutor, logger, taskStackListener, organizer, positioner, displayController, mainExecutor,
mainHandler); mainHandler, syncQueue);
} }
/** /**
@@ -238,7 +241,8 @@ public class BubbleController {
BubblePositioner positioner, BubblePositioner positioner,
DisplayController displayController, DisplayController displayController,
ShellExecutor mainExecutor, ShellExecutor mainExecutor,
Handler mainHandler) { Handler mainHandler,
SyncTransactionQueue syncQueue) {
mContext = context; mContext = context;
mLauncherApps = launcherApps; mLauncherApps = launcherApps;
mBarService = statusBarService == null mBarService = statusBarService == null
@@ -261,6 +265,7 @@ public class BubbleController {
mSavedBubbleKeysPerUser = new SparseSetArray<>(); mSavedBubbleKeysPerUser = new SparseSetArray<>();
mBubbleIconFactory = new BubbleIconFactory(context); mBubbleIconFactory = new BubbleIconFactory(context);
mDisplayController = displayController; mDisplayController = displayController;
mSyncQueue = syncQueue;
} }
public void initialize() { public void initialize() {
@@ -544,6 +549,10 @@ public class BubbleController {
return mTaskOrganizer; return mTaskOrganizer;
} }
SyncTransactionQueue getSyncTransactionQueue() {
return mSyncQueue;
}
/** Contains information to help position things on the screen. */ /** Contains information to help position things on the screen. */
BubblePositioner getPositioner() { BubblePositioner getPositioner() {
return mBubblePositioner; return mBubblePositioner;

View File

@@ -338,7 +338,8 @@ public class BubbleExpandedView extends LinearLayout {
bringChildToFront(mOverflowView); bringChildToFront(mOverflowView);
mManageButton.setVisibility(GONE); mManageButton.setVisibility(GONE);
} else { } else {
mTaskView = new TaskView(mContext, mController.getTaskOrganizer()); mTaskView = new TaskView(mContext, mController.getTaskOrganizer(),
mController.getSyncTransactionQueue());
mTaskView.setListener(mController.getMainExecutor(), mTaskViewListener); mTaskView.setListener(mController.getMainExecutor(), mTaskViewListener);
mExpandedViewContainer.addView(mTaskView); mExpandedViewContainer.addView(mTaskView);
bringChildToFront(mTaskView); bringChildToFront(mTaskView);

View File

@@ -47,6 +47,8 @@ import android.window.WindowContainerToken;
import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest;
import com.android.wm.shell.common.HandlerExecutor; import com.android.wm.shell.common.HandlerExecutor;
import com.android.wm.shell.common.SyncTransactionQueue;
import com.android.wm.shell.common.SyncTransactionQueue.TransactionRunnable;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
@@ -71,6 +73,8 @@ public class TaskViewTest extends ShellTestCase {
ShellTaskOrganizer mOrganizer; ShellTaskOrganizer mOrganizer;
@Mock @Mock
HandlerExecutor mExecutor; HandlerExecutor mExecutor;
@Mock
SyncTransactionQueue mSyncQueue;
SurfaceSession mSession; SurfaceSession mSession;
SurfaceControl mLeash; SurfaceControl mLeash;
@@ -99,7 +103,14 @@ public class TaskViewTest extends ShellTestCase {
}).when(mExecutor).execute(any()); }).when(mExecutor).execute(any());
when(mOrganizer.getExecutor()).thenReturn(mExecutor); when(mOrganizer.getExecutor()).thenReturn(mExecutor);
mTaskView = new TaskView(mContext, mOrganizer);
doAnswer((InvocationOnMock invocationOnMock) -> {
final TransactionRunnable r = invocationOnMock.getArgument(0);
r.runWithTransaction(new SurfaceControl.Transaction());
return null;
}).when(mSyncQueue).runInSync(any());
mTaskView = new TaskView(mContext, mOrganizer, mSyncQueue);
mTaskView.setListener(mExecutor, mViewListener); mTaskView.setListener(mExecutor, mViewListener);
} }
@@ -112,7 +123,7 @@ public class TaskViewTest extends ShellTestCase {
@Test @Test
public void testSetPendingListener_throwsException() { public void testSetPendingListener_throwsException() {
TaskView taskView = new TaskView(mContext, mOrganizer); TaskView taskView = new TaskView(mContext, mOrganizer, mSyncQueue);
taskView.setListener(mExecutor, mViewListener); taskView.setListener(mExecutor, mViewListener);
try { try {
taskView.setListener(mExecutor, mViewListener); taskView.setListener(mExecutor, mViewListener);

View File

@@ -194,11 +194,12 @@ public abstract class WMShellBaseModule {
ShellTaskOrganizer organizer, ShellTaskOrganizer organizer,
DisplayController displayController, DisplayController displayController,
@ShellMainThread ShellExecutor mainExecutor, @ShellMainThread ShellExecutor mainExecutor,
@ShellMainThread Handler mainHandler) { @ShellMainThread Handler mainHandler,
SyncTransactionQueue syncQueue) {
return Optional.of(BubbleController.create(context, null /* synchronizer */, return Optional.of(BubbleController.create(context, null /* synchronizer */,
floatingContentCoordinator, statusBarService, windowManager, floatingContentCoordinator, statusBarService, windowManager,
windowManagerShellWrapper, launcherApps, taskStackListener, windowManagerShellWrapper, launcherApps, taskStackListener,
uiEventLogger, organizer, displayController, mainExecutor, mainHandler)); uiEventLogger, organizer, displayController, mainExecutor, mainHandler, syncQueue));
} }
// //
@@ -424,8 +425,9 @@ public abstract class WMShellBaseModule {
@Provides @Provides
static TaskViewFactoryController provideTaskViewFactoryController( static TaskViewFactoryController provideTaskViewFactoryController(
ShellTaskOrganizer shellTaskOrganizer, ShellTaskOrganizer shellTaskOrganizer,
@ShellMainThread ShellExecutor mainExecutor) { @ShellMainThread ShellExecutor mainExecutor,
return new TaskViewFactoryController(shellTaskOrganizer, mainExecutor); SyncTransactionQueue syncQueue) {
return new TaskViewFactoryController(shellTaskOrganizer, mainExecutor, syncQueue);
} }
// //

View File

@@ -115,6 +115,7 @@ import com.android.wm.shell.bubbles.Bubbles;
import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.FloatingContentCoordinator; import com.android.wm.shell.common.FloatingContentCoordinator;
import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.SyncTransactionQueue;
import com.android.wm.shell.common.TaskStackListenerImpl; import com.android.wm.shell.common.TaskStackListenerImpl;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
@@ -318,7 +319,8 @@ public class BubblesTest extends SysuiTestCase {
mPositioner, mPositioner,
mock(DisplayController.class), mock(DisplayController.class),
syncExecutor, syncExecutor,
mock(Handler.class)); mock(Handler.class),
mock(SyncTransactionQueue.class));
mBubbleController.setExpandListener(mBubbleExpandListener); mBubbleController.setExpandListener(mBubbleExpandListener);
mBubblesManager = new BubblesManager( mBubblesManager = new BubblesManager(

View File

@@ -95,6 +95,7 @@ import com.android.wm.shell.bubbles.Bubbles;
import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.FloatingContentCoordinator; import com.android.wm.shell.common.FloatingContentCoordinator;
import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.SyncTransactionQueue;
import com.android.wm.shell.common.TaskStackListenerImpl; import com.android.wm.shell.common.TaskStackListenerImpl;
import org.junit.Before; import org.junit.Before;
@@ -262,7 +263,8 @@ public class NewNotifPipelineBubblesTest extends SysuiTestCase {
mPositioner, mPositioner,
mock(DisplayController.class), mock(DisplayController.class),
syncExecutor, syncExecutor,
mock(Handler.class)); mock(Handler.class),
mock(SyncTransactionQueue.class));
mBubbleController.setExpandListener(mBubbleExpandListener); mBubbleController.setExpandListener(mBubbleExpandListener);
mBubblesManager = new BubblesManager( mBubblesManager = new BubblesManager(

View File

@@ -32,6 +32,7 @@ import com.android.wm.shell.bubbles.BubblePositioner;
import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.FloatingContentCoordinator; import com.android.wm.shell.common.FloatingContentCoordinator;
import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.SyncTransactionQueue;
import com.android.wm.shell.common.TaskStackListenerImpl; import com.android.wm.shell.common.TaskStackListenerImpl;
/** /**
@@ -54,11 +55,12 @@ public class TestableBubbleController extends BubbleController {
BubblePositioner positioner, BubblePositioner positioner,
DisplayController displayController, DisplayController displayController,
ShellExecutor shellMainExecutor, ShellExecutor shellMainExecutor,
Handler shellMainHandler) { Handler shellMainHandler,
SyncTransactionQueue syncQueue) {
super(context, data, Runnable::run, floatingContentCoordinator, dataRepository, super(context, data, Runnable::run, floatingContentCoordinator, dataRepository,
statusBarService, windowManager, windowManagerShellWrapper, launcherApps, statusBarService, windowManager, windowManagerShellWrapper, launcherApps,
bubbleLogger, taskStackListener, shellTaskOrganizer, positioner, displayController, bubbleLogger, taskStackListener, shellTaskOrganizer, positioner, displayController,
shellMainExecutor, shellMainHandler); shellMainExecutor, shellMainHandler, syncQueue);
setInflateSynchronously(true); setInflateSynchronously(true);
initialize(); initialize();
} }