Merge "Make startTransition one-way" into tm-qpr-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
96eae2359b
@@ -51,16 +51,19 @@ interface IWindowOrganizerController {
|
|||||||
in IWindowContainerTransactionCallback callback);
|
in IWindowContainerTransactionCallback callback);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Starts a transition.
|
* Starts a new transition.
|
||||||
* @param type The transition type.
|
* @param type The transition type.
|
||||||
* @param transitionToken A token associated with the transition to start. If null, a new
|
|
||||||
* transition will be created of the provided type.
|
|
||||||
* @param t Operations that are part of the transition.
|
* @param t Operations that are part of the transition.
|
||||||
* @return a token representing the transition. This will just be transitionToken if it was
|
* @return a token representing the transition.
|
||||||
* non-null.
|
|
||||||
*/
|
*/
|
||||||
IBinder startTransition(int type, in @nullable IBinder transitionToken,
|
IBinder startNewTransition(int type, in @nullable WindowContainerTransaction t);
|
||||||
in @nullable WindowContainerTransaction t);
|
|
||||||
|
/**
|
||||||
|
* Starts the given transition.
|
||||||
|
* @param transitionToken A token associated with the transition to start.
|
||||||
|
* @param t Operations that are part of the transition.
|
||||||
|
*/
|
||||||
|
oneway void startTransition(IBinder transitionToken, in @nullable WindowContainerTransaction t);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Starts a legacy transition.
|
* Starts a legacy transition.
|
||||||
|
|||||||
@@ -84,9 +84,8 @@ public class WindowOrganizer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Start a transition.
|
* Starts a new transition, don't use this to start an already created one.
|
||||||
* @param type The type of the transition. This is ignored if a transitionToken is provided.
|
* @param type The type of the transition. This is ignored if a transitionToken is provided.
|
||||||
* @param transitionToken An existing transition to start. If null, a new transition is created.
|
|
||||||
* @param t The set of window operations that are part of this transition.
|
* @param t The set of window operations that are part of this transition.
|
||||||
* @return A token identifying the transition. This will be the same as transitionToken if it
|
* @return A token identifying the transition. This will be the same as transitionToken if it
|
||||||
* was provided.
|
* was provided.
|
||||||
@@ -94,10 +93,24 @@ public class WindowOrganizer {
|
|||||||
*/
|
*/
|
||||||
@RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS)
|
@RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS)
|
||||||
@NonNull
|
@NonNull
|
||||||
public IBinder startTransition(int type, @Nullable IBinder transitionToken,
|
public IBinder startNewTransition(int type, @Nullable WindowContainerTransaction t) {
|
||||||
|
try {
|
||||||
|
return getWindowOrganizerController().startNewTransition(type, t);
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
throw e.rethrowFromSystemServer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Starts an already created transition.
|
||||||
|
* @param transitionToken An existing transition to start.
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
@RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS)
|
||||||
|
public void startTransition(@NonNull IBinder transitionToken,
|
||||||
@Nullable WindowContainerTransaction t) {
|
@Nullable WindowContainerTransaction t) {
|
||||||
try {
|
try {
|
||||||
return getWindowOrganizerController().startTransition(type, transitionToken, t);
|
getWindowOrganizerController().startTransition(transitionToken, t);
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
throw e.rethrowFromSystemServer();
|
throw e.rethrowFromSystemServer();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -716,8 +716,8 @@ public class Transitions implements RemoteCallable<Transitions> {
|
|||||||
null /* newDisplayAreaInfo */);
|
null /* newDisplayAreaInfo */);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
active.mToken = mOrganizer.startTransition(
|
mOrganizer.startTransition(transitionToken, wct != null && wct.isEmpty() ? null : wct);
|
||||||
request.getType(), transitionToken, wct);
|
active.mToken = transitionToken;
|
||||||
mActiveTransitions.add(active);
|
mActiveTransitions.add(active);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -726,7 +726,7 @@ public class Transitions implements RemoteCallable<Transitions> {
|
|||||||
@NonNull WindowContainerTransaction wct, @Nullable TransitionHandler handler) {
|
@NonNull WindowContainerTransaction wct, @Nullable TransitionHandler handler) {
|
||||||
final ActiveTransition active = new ActiveTransition();
|
final ActiveTransition active = new ActiveTransition();
|
||||||
active.mHandler = handler;
|
active.mHandler = handler;
|
||||||
active.mToken = mOrganizer.startTransition(type, null /* token */, wct);
|
active.mToken = mOrganizer.startNewTransition(type, wct);
|
||||||
mActiveTransitions.add(active);
|
mActiveTransitions.add(active);
|
||||||
return active.mToken;
|
return active.mToken;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,7 +45,6 @@ import static org.junit.Assert.assertNull;
|
|||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
import static org.mockito.ArgumentMatchers.anyBoolean;
|
import static org.mockito.ArgumentMatchers.anyBoolean;
|
||||||
import static org.mockito.ArgumentMatchers.anyInt;
|
|
||||||
import static org.mockito.ArgumentMatchers.eq;
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
import static org.mockito.ArgumentMatchers.isNull;
|
import static org.mockito.ArgumentMatchers.isNull;
|
||||||
import static org.mockito.Mockito.clearInvocations;
|
import static org.mockito.Mockito.clearInvocations;
|
||||||
@@ -67,10 +66,12 @@ import android.view.SurfaceControl;
|
|||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
import android.window.IRemoteTransition;
|
import android.window.IRemoteTransition;
|
||||||
import android.window.IRemoteTransitionFinishedCallback;
|
import android.window.IRemoteTransitionFinishedCallback;
|
||||||
|
import android.window.IWindowContainerToken;
|
||||||
import android.window.RemoteTransition;
|
import android.window.RemoteTransition;
|
||||||
import android.window.TransitionFilter;
|
import android.window.TransitionFilter;
|
||||||
import android.window.TransitionInfo;
|
import android.window.TransitionInfo;
|
||||||
import android.window.TransitionRequestInfo;
|
import android.window.TransitionRequestInfo;
|
||||||
|
import android.window.WindowContainerToken;
|
||||||
import android.window.WindowContainerTransaction;
|
import android.window.WindowContainerTransaction;
|
||||||
import android.window.WindowOrganizer;
|
import android.window.WindowOrganizer;
|
||||||
|
|
||||||
@@ -117,7 +118,7 @@ public class ShellTransitionTests extends ShellTestCase {
|
|||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
doAnswer(invocation -> invocation.getArguments()[1])
|
doAnswer(invocation -> invocation.getArguments()[1])
|
||||||
.when(mOrganizer).startTransition(anyInt(), any(), any());
|
.when(mOrganizer).startTransition(any(), any());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -136,7 +137,7 @@ public class ShellTransitionTests extends ShellTestCase {
|
|||||||
IBinder transitToken = new Binder();
|
IBinder transitToken = new Binder();
|
||||||
transitions.requestStartTransition(transitToken,
|
transitions.requestStartTransition(transitToken,
|
||||||
new TransitionRequestInfo(TRANSIT_OPEN, null /* trigger */, null /* remote */));
|
new TransitionRequestInfo(TRANSIT_OPEN, null /* trigger */, null /* remote */));
|
||||||
verify(mOrganizer, times(1)).startTransition(eq(TRANSIT_OPEN), eq(transitToken), any());
|
verify(mOrganizer, times(1)).startTransition(eq(transitToken), any());
|
||||||
TransitionInfo info = new TransitionInfoBuilder(TRANSIT_OPEN)
|
TransitionInfo info = new TransitionInfoBuilder(TRANSIT_OPEN)
|
||||||
.addChange(TRANSIT_OPEN).addChange(TRANSIT_CLOSE).build();
|
.addChange(TRANSIT_OPEN).addChange(TRANSIT_CLOSE).build();
|
||||||
transitions.onTransitionReady(transitToken, info, mock(SurfaceControl.Transaction.class),
|
transitions.onTransitionReady(transitToken, info, mock(SurfaceControl.Transaction.class),
|
||||||
@@ -188,7 +189,7 @@ public class ShellTransitionTests extends ShellTestCase {
|
|||||||
// Make a request that will be rejected by the testhandler.
|
// Make a request that will be rejected by the testhandler.
|
||||||
transitions.requestStartTransition(transitToken,
|
transitions.requestStartTransition(transitToken,
|
||||||
new TransitionRequestInfo(TRANSIT_OPEN, null /* trigger */, null /* remote */));
|
new TransitionRequestInfo(TRANSIT_OPEN, null /* trigger */, null /* remote */));
|
||||||
verify(mOrganizer, times(1)).startTransition(eq(TRANSIT_OPEN), eq(transitToken), isNull());
|
verify(mOrganizer, times(1)).startTransition(eq(transitToken), isNull());
|
||||||
transitions.onTransitionReady(transitToken, open, mock(SurfaceControl.Transaction.class),
|
transitions.onTransitionReady(transitToken, open, mock(SurfaceControl.Transaction.class),
|
||||||
mock(SurfaceControl.Transaction.class));
|
mock(SurfaceControl.Transaction.class));
|
||||||
assertEquals(1, mDefaultHandler.activeCount());
|
assertEquals(1, mDefaultHandler.activeCount());
|
||||||
@@ -199,10 +200,12 @@ public class ShellTransitionTests extends ShellTestCase {
|
|||||||
// Make a request that will be handled by testhandler but not animated by it.
|
// Make a request that will be handled by testhandler but not animated by it.
|
||||||
RunningTaskInfo mwTaskInfo =
|
RunningTaskInfo mwTaskInfo =
|
||||||
createTaskInfo(1, WINDOWING_MODE_MULTI_WINDOW, ACTIVITY_TYPE_STANDARD);
|
createTaskInfo(1, WINDOWING_MODE_MULTI_WINDOW, ACTIVITY_TYPE_STANDARD);
|
||||||
|
// Make the wct non-empty.
|
||||||
|
handlerWCT.setFocusable(new WindowContainerToken(mock(IWindowContainerToken.class)), true);
|
||||||
transitions.requestStartTransition(transitToken,
|
transitions.requestStartTransition(transitToken,
|
||||||
new TransitionRequestInfo(TRANSIT_OPEN, mwTaskInfo, null /* remote */));
|
new TransitionRequestInfo(TRANSIT_OPEN, mwTaskInfo, null /* remote */));
|
||||||
verify(mOrganizer, times(1)).startTransition(
|
verify(mOrganizer, times(1)).startTransition(
|
||||||
eq(TRANSIT_OPEN), eq(transitToken), eq(handlerWCT));
|
eq(transitToken), eq(handlerWCT));
|
||||||
transitions.onTransitionReady(transitToken, open, mock(SurfaceControl.Transaction.class),
|
transitions.onTransitionReady(transitToken, open, mock(SurfaceControl.Transaction.class),
|
||||||
mock(SurfaceControl.Transaction.class));
|
mock(SurfaceControl.Transaction.class));
|
||||||
assertEquals(1, mDefaultHandler.activeCount());
|
assertEquals(1, mDefaultHandler.activeCount());
|
||||||
@@ -217,8 +220,8 @@ public class ShellTransitionTests extends ShellTestCase {
|
|||||||
transitions.addHandler(topHandler);
|
transitions.addHandler(topHandler);
|
||||||
transitions.requestStartTransition(transitToken,
|
transitions.requestStartTransition(transitToken,
|
||||||
new TransitionRequestInfo(TRANSIT_CHANGE, mwTaskInfo, null /* remote */));
|
new TransitionRequestInfo(TRANSIT_CHANGE, mwTaskInfo, null /* remote */));
|
||||||
verify(mOrganizer, times(1)).startTransition(
|
verify(mOrganizer, times(2)).startTransition(
|
||||||
eq(TRANSIT_CHANGE), eq(transitToken), eq(handlerWCT));
|
eq(transitToken), eq(handlerWCT));
|
||||||
TransitionInfo change = new TransitionInfoBuilder(TRANSIT_CHANGE)
|
TransitionInfo change = new TransitionInfoBuilder(TRANSIT_CHANGE)
|
||||||
.addChange(TRANSIT_CHANGE).build();
|
.addChange(TRANSIT_CHANGE).build();
|
||||||
transitions.onTransitionReady(transitToken, change, mock(SurfaceControl.Transaction.class),
|
transitions.onTransitionReady(transitToken, change, mock(SurfaceControl.Transaction.class),
|
||||||
@@ -256,7 +259,7 @@ public class ShellTransitionTests extends ShellTestCase {
|
|||||||
transitions.requestStartTransition(transitToken,
|
transitions.requestStartTransition(transitToken,
|
||||||
new TransitionRequestInfo(TRANSIT_OPEN, null /* trigger */,
|
new TransitionRequestInfo(TRANSIT_OPEN, null /* trigger */,
|
||||||
new RemoteTransition(testRemote)));
|
new RemoteTransition(testRemote)));
|
||||||
verify(mOrganizer, times(1)).startTransition(eq(TRANSIT_OPEN), eq(transitToken), any());
|
verify(mOrganizer, times(1)).startTransition(eq(transitToken), any());
|
||||||
TransitionInfo info = new TransitionInfoBuilder(TRANSIT_OPEN)
|
TransitionInfo info = new TransitionInfoBuilder(TRANSIT_OPEN)
|
||||||
.addChange(TRANSIT_OPEN).addChange(TRANSIT_CLOSE).build();
|
.addChange(TRANSIT_OPEN).addChange(TRANSIT_CLOSE).build();
|
||||||
transitions.onTransitionReady(transitToken, info, mock(SurfaceControl.Transaction.class),
|
transitions.onTransitionReady(transitToken, info, mock(SurfaceControl.Transaction.class),
|
||||||
@@ -406,7 +409,7 @@ public class ShellTransitionTests extends ShellTestCase {
|
|||||||
IBinder transitToken = new Binder();
|
IBinder transitToken = new Binder();
|
||||||
transitions.requestStartTransition(transitToken,
|
transitions.requestStartTransition(transitToken,
|
||||||
new TransitionRequestInfo(TRANSIT_OPEN, null /* trigger */, null /* remote */));
|
new TransitionRequestInfo(TRANSIT_OPEN, null /* trigger */, null /* remote */));
|
||||||
verify(mOrganizer, times(1)).startTransition(eq(TRANSIT_OPEN), eq(transitToken), any());
|
verify(mOrganizer, times(1)).startTransition(eq(transitToken), any());
|
||||||
TransitionInfo info = new TransitionInfoBuilder(TRANSIT_OPEN)
|
TransitionInfo info = new TransitionInfoBuilder(TRANSIT_OPEN)
|
||||||
.addChange(TRANSIT_OPEN).addChange(TRANSIT_CLOSE).build();
|
.addChange(TRANSIT_OPEN).addChange(TRANSIT_CLOSE).build();
|
||||||
transitions.onTransitionReady(transitToken, info, mock(SurfaceControl.Transaction.class),
|
transitions.onTransitionReady(transitToken, info, mock(SurfaceControl.Transaction.class),
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP
|
|||||||
|
|
||||||
import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_WINDOW_ORGANIZER;
|
import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_WINDOW_ORGANIZER;
|
||||||
import static com.android.server.wm.ActivityTaskManagerService.LAYOUT_REASON_CONFIG_CHANGED;
|
import static com.android.server.wm.ActivityTaskManagerService.LAYOUT_REASON_CONFIG_CHANGED;
|
||||||
|
import static com.android.server.wm.ActivityTaskManagerService.enforceTaskPermission;
|
||||||
import static com.android.server.wm.ActivityTaskSupervisor.PRESERVE_WINDOWS;
|
import static com.android.server.wm.ActivityTaskSupervisor.PRESERVE_WINDOWS;
|
||||||
import static com.android.server.wm.Task.FLAG_FORCE_HIDDEN_FOR_PINNED_TASK;
|
import static com.android.server.wm.Task.FLAG_FORCE_HIDDEN_FOR_PINNED_TASK;
|
||||||
import static com.android.server.wm.Task.FLAG_FORCE_HIDDEN_FOR_TASK_ORG;
|
import static com.android.server.wm.Task.FLAG_FORCE_HIDDEN_FOR_TASK_ORG;
|
||||||
@@ -242,8 +243,18 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IBinder startTransition(int type, @Nullable IBinder transitionToken,
|
public IBinder startNewTransition(int type, @Nullable WindowContainerTransaction t) {
|
||||||
|
return startTransition(type, null /* transitionToken */, t);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startTransition(@NonNull IBinder transitionToken,
|
||||||
@Nullable WindowContainerTransaction t) {
|
@Nullable WindowContainerTransaction t) {
|
||||||
|
startTransition(-1 /* unused type */, transitionToken, t);
|
||||||
|
}
|
||||||
|
|
||||||
|
private IBinder startTransition(@WindowManager.TransitionType int type,
|
||||||
|
@Nullable IBinder transitionToken, @Nullable WindowContainerTransaction t) {
|
||||||
enforceTaskPermission("startTransition()");
|
enforceTaskPermission("startTransition()");
|
||||||
final CallerInfo caller = new CallerInfo();
|
final CallerInfo caller = new CallerInfo();
|
||||||
final long ident = Binder.clearCallingIdentity();
|
final long ident = Binder.clearCallingIdentity();
|
||||||
@@ -1557,10 +1568,6 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
|
|||||||
return (cfgChanges & CONTROLLABLE_CONFIGS) == 0;
|
return (cfgChanges & CONTROLLABLE_CONFIGS) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void enforceTaskPermission(String func) {
|
|
||||||
mService.enforceTaskPermission(func);
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isValidTransaction(@NonNull WindowContainerTransaction t) {
|
private boolean isValidTransaction(@NonNull WindowContainerTransaction t) {
|
||||||
if (t.getTaskFragmentOrganizer() != null && !mTaskFragmentOrganizerController
|
if (t.getTaskFragmentOrganizer() != null && !mTaskFragmentOrganizerController
|
||||||
.isOrganizerRegistered(t.getTaskFragmentOrganizer())) {
|
.isOrganizerRegistered(t.getTaskFragmentOrganizer())) {
|
||||||
|
|||||||
@@ -1727,7 +1727,7 @@ class WindowTestsBase extends SystemServiceTestsBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void startTransition() {
|
void startTransition() {
|
||||||
mOrganizer.startTransition(mLastRequest.getType(), mLastTransit, null);
|
mOrganizer.startTransition(mLastTransit, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
void onTransactionReady(SurfaceControl.Transaction t) {
|
void onTransactionReady(SurfaceControl.Transaction t) {
|
||||||
|
|||||||
Reference in New Issue
Block a user