1 /* 2 * Copyright (C) 2020 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.systemui.shared.system; 18 19 import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; 20 import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; 21 import static android.view.WindowManager.TRANSIT_CLOSE; 22 import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY; 23 import static android.view.WindowManager.TRANSIT_OPEN; 24 import static android.view.WindowManager.TRANSIT_TO_BACK; 25 import static android.view.WindowManager.TRANSIT_TO_FRONT; 26 import static android.window.TransitionFilter.CONTAINER_ORDER_TOP; 27 28 import android.annotation.NonNull; 29 import android.annotation.Nullable; 30 import android.annotation.SuppressLint; 31 import android.app.ActivityManager; 32 import android.app.ActivityTaskManager; 33 import android.app.IApplicationThread; 34 import android.content.ComponentName; 35 import android.graphics.Rect; 36 import android.os.IBinder; 37 import android.os.Parcelable; 38 import android.os.RemoteException; 39 import android.util.ArrayMap; 40 import android.util.Log; 41 import android.view.IRecentsAnimationController; 42 import android.view.SurfaceControl; 43 import android.window.IRemoteTransition; 44 import android.window.IRemoteTransitionFinishedCallback; 45 import android.window.PictureInPictureSurfaceTransaction; 46 import android.window.RemoteTransition; 47 import android.window.TransitionFilter; 48 import android.window.TransitionInfo; 49 import android.window.WindowContainerToken; 50 import android.window.WindowContainerTransaction; 51 52 import com.android.internal.annotations.VisibleForTesting; 53 import com.android.internal.util.DataClass; 54 import com.android.systemui.shared.recents.model.ThumbnailData; 55 56 import java.util.ArrayList; 57 import java.util.concurrent.Executor; 58 59 /** 60 * Wrapper to expose RemoteTransition (shell transitions) to Launcher. 61 * 62 * @see IRemoteTransition 63 * @see TransitionFilter 64 */ 65 @DataClass 66 public class RemoteTransitionCompat implements Parcelable { 67 private static final String TAG = "RemoteTransitionCompat"; 68 69 @NonNull final RemoteTransition mTransition; 70 @Nullable TransitionFilter mFilter = null; 71 RemoteTransitionCompat(RemoteTransition transition)72 RemoteTransitionCompat(RemoteTransition transition) { 73 mTransition = transition; 74 } 75 RemoteTransitionCompat(@onNull RemoteTransitionRunner runner, @NonNull Executor executor, @Nullable IApplicationThread appThread)76 public RemoteTransitionCompat(@NonNull RemoteTransitionRunner runner, 77 @NonNull Executor executor, @Nullable IApplicationThread appThread) { 78 IRemoteTransition remote = new IRemoteTransition.Stub() { 79 @Override 80 public void startAnimation(IBinder transition, TransitionInfo info, 81 SurfaceControl.Transaction t, 82 IRemoteTransitionFinishedCallback finishedCallback) { 83 final Runnable finishAdapter = () -> { 84 try { 85 finishedCallback.onTransitionFinished(null /* wct */, null /* sct */); 86 } catch (RemoteException e) { 87 Log.e(TAG, "Failed to call transition finished callback", e); 88 } 89 }; 90 executor.execute(() -> runner.startAnimation(transition, info, t, finishAdapter)); 91 } 92 93 @Override 94 public void mergeAnimation(IBinder transition, TransitionInfo info, 95 SurfaceControl.Transaction t, IBinder mergeTarget, 96 IRemoteTransitionFinishedCallback finishedCallback) { 97 final Runnable finishAdapter = () -> { 98 try { 99 finishedCallback.onTransitionFinished(null /* wct */, null /* sct */); 100 } catch (RemoteException e) { 101 Log.e(TAG, "Failed to call transition finished callback", e); 102 } 103 }; 104 executor.execute(() -> runner.mergeAnimation(transition, info, t, mergeTarget, 105 finishAdapter)); 106 } 107 }; 108 mTransition = new RemoteTransition(remote, appThread); 109 } 110 111 /** Constructor specifically for recents animation */ RemoteTransitionCompat(RecentsAnimationListener recents, RecentsAnimationControllerCompat controller, IApplicationThread appThread)112 public RemoteTransitionCompat(RecentsAnimationListener recents, 113 RecentsAnimationControllerCompat controller, IApplicationThread appThread) { 114 IRemoteTransition remote = new IRemoteTransition.Stub() { 115 final RecentsControllerWrap mRecentsSession = new RecentsControllerWrap(); 116 IBinder mToken = null; 117 118 @Override 119 public void startAnimation(IBinder transition, TransitionInfo info, 120 SurfaceControl.Transaction t, 121 IRemoteTransitionFinishedCallback finishedCallback) { 122 final ArrayMap<SurfaceControl, SurfaceControl> leashMap = new ArrayMap<>(); 123 final RemoteAnimationTargetCompat[] apps = 124 RemoteAnimationTargetCompat.wrap(info, false /* wallpapers */, t, leashMap); 125 final RemoteAnimationTargetCompat[] wallpapers = 126 RemoteAnimationTargetCompat.wrap(info, true /* wallpapers */, t, leashMap); 127 // TODO(b/177438007): Move this set-up logic into launcher's animation impl. 128 mToken = transition; 129 // This transition is for opening recents, so recents is on-top. We want to draw 130 // the current going-away task on top of recents, though, so move it to front 131 final ArrayList<WindowContainerToken> pausingTasks = new ArrayList<>(); 132 WindowContainerToken pipTask = null; 133 for (int i = info.getChanges().size() - 1; i >= 0; --i) { 134 final TransitionInfo.Change change = info.getChanges().get(i); 135 if (change.getMode() == TRANSIT_CLOSE || change.getMode() == TRANSIT_TO_BACK) { 136 t.setLayer(leashMap.get(change.getLeash()), 137 info.getChanges().size() * 3 - i); 138 final ActivityManager.RunningTaskInfo taskInfo = change.getTaskInfo(); 139 if (taskInfo == null) { 140 continue; 141 } 142 // Add to front since we are iterating backwards. 143 pausingTasks.add(0, taskInfo.token); 144 if (taskInfo.pictureInPictureParams != null 145 && taskInfo.pictureInPictureParams.isAutoEnterEnabled()) { 146 pipTask = taskInfo.token; 147 } 148 } 149 } 150 // Also make all the wallpapers opaque since we want the visible from the start 151 for (int i = wallpapers.length - 1; i >= 0; --i) { 152 t.setAlpha(wallpapers[i].leash.mSurfaceControl, 1); 153 } 154 t.apply(); 155 mRecentsSession.setup(controller, info, finishedCallback, pausingTasks, pipTask, 156 leashMap, mToken); 157 recents.onAnimationStart(mRecentsSession, apps, wallpapers, new Rect(0, 0, 0, 0), 158 new Rect()); 159 } 160 161 @Override 162 public void mergeAnimation(IBinder transition, TransitionInfo info, 163 SurfaceControl.Transaction t, IBinder mergeTarget, 164 IRemoteTransitionFinishedCallback finishedCallback) { 165 if (!mergeTarget.equals(mToken)) return; 166 if (!mRecentsSession.merge(info, t, recents)) return; 167 try { 168 finishedCallback.onTransitionFinished(null /* wct */, null /* sct */); 169 } catch (RemoteException e) { 170 Log.e(TAG, "Error merging transition.", e); 171 } 172 } 173 }; 174 mTransition = new RemoteTransition(remote, appThread); 175 } 176 177 /** Adds a filter check that restricts this remote transition to home open transitions. */ addHomeOpenCheck(ComponentName homeActivity)178 public void addHomeOpenCheck(ComponentName homeActivity) { 179 if (mFilter == null) { 180 mFilter = new TransitionFilter(); 181 } 182 // No need to handle the transition that also dismisses keyguard. 183 mFilter.mNotFlags = TRANSIT_FLAG_KEYGUARD_GOING_AWAY; 184 mFilter.mRequirements = 185 new TransitionFilter.Requirement[]{new TransitionFilter.Requirement(), 186 new TransitionFilter.Requirement()}; 187 mFilter.mRequirements[0].mActivityType = ACTIVITY_TYPE_HOME; 188 mFilter.mRequirements[0].mTopActivity = homeActivity; 189 mFilter.mRequirements[0].mModes = new int[]{TRANSIT_OPEN, TRANSIT_TO_FRONT}; 190 mFilter.mRequirements[0].mOrder = CONTAINER_ORDER_TOP; 191 mFilter.mRequirements[1].mActivityType = ACTIVITY_TYPE_STANDARD; 192 mFilter.mRequirements[1].mModes = new int[]{TRANSIT_CLOSE, TRANSIT_TO_BACK}; 193 } 194 195 /** 196 * Wrapper to hook up parts of recents animation to shell transition. 197 * TODO(b/177438007): Remove this once Launcher handles shell transitions directly. 198 */ 199 @VisibleForTesting 200 static class RecentsControllerWrap extends RecentsAnimationControllerCompat { 201 private RecentsAnimationControllerCompat mWrapped = null; 202 private IRemoteTransitionFinishedCallback mFinishCB = null; 203 private ArrayList<WindowContainerToken> mPausingTasks = null; 204 private WindowContainerToken mPipTask = null; 205 private TransitionInfo mInfo = null; 206 private ArrayList<SurfaceControl> mOpeningLeashes = null; 207 private ArrayMap<SurfaceControl, SurfaceControl> mLeashMap = null; 208 private PictureInPictureSurfaceTransaction mPipTransaction = null; 209 private IBinder mTransition = null; 210 setup(RecentsAnimationControllerCompat wrapped, TransitionInfo info, IRemoteTransitionFinishedCallback finishCB, ArrayList<WindowContainerToken> pausingTasks, WindowContainerToken pipTask, ArrayMap<SurfaceControl, SurfaceControl> leashMap, IBinder transition)211 void setup(RecentsAnimationControllerCompat wrapped, TransitionInfo info, 212 IRemoteTransitionFinishedCallback finishCB, 213 ArrayList<WindowContainerToken> pausingTasks, WindowContainerToken pipTask, 214 ArrayMap<SurfaceControl, SurfaceControl> leashMap, IBinder transition) { 215 if (mInfo != null) { 216 throw new IllegalStateException("Trying to run a new recents animation while" 217 + " recents is already active."); 218 } 219 mWrapped = wrapped; 220 mInfo = info; 221 mFinishCB = finishCB; 222 mPausingTasks = pausingTasks; 223 mPipTask = pipTask; 224 mLeashMap = leashMap; 225 mTransition = transition; 226 } 227 228 @SuppressLint("NewApi") merge(TransitionInfo info, SurfaceControl.Transaction t, RecentsAnimationListener recents)229 boolean merge(TransitionInfo info, SurfaceControl.Transaction t, 230 RecentsAnimationListener recents) { 231 ArrayList<TransitionInfo.Change> openingTasks = null; 232 for (int i = info.getChanges().size() - 1; i >= 0; --i) { 233 final TransitionInfo.Change change = info.getChanges().get(i); 234 if (change.getMode() == TRANSIT_OPEN || change.getMode() == TRANSIT_TO_FRONT) { 235 if (change.getTaskInfo() != null) { 236 if (openingTasks == null) { 237 openingTasks = new ArrayList<>(); 238 } 239 openingTasks.add(change); 240 } 241 } 242 } 243 if (openingTasks == null) return false; 244 int pauseMatches = 0; 245 for (int i = 0; i < openingTasks.size(); ++i) { 246 if (mPausingTasks.contains(openingTasks.get(i).getContainer())) { 247 ++pauseMatches; 248 } 249 if (openingTasks.get(i).getContainer().equals(mPausingTasks.get(i))) { 250 // In this case, we are "returning" to an already running app, so just consume 251 // the merge and do nothing. 252 } 253 } 254 if (pauseMatches > 0) { 255 if (pauseMatches != mPausingTasks.size()) { 256 // We are not really "returning" properly... something went wrong. 257 throw new IllegalStateException("\"Concelling\" a recents transitions by " 258 + "unpausing " + pauseMatches + " apps after pausing " 259 + mPausingTasks.size() + " apps."); 260 } 261 // In this case, we are "returning" to an already running app, so just consume 262 // the merge and do nothing. 263 return true; 264 } 265 final int layer = mInfo.getChanges().size() * 3; 266 mOpeningLeashes = new ArrayList<>(); 267 final RemoteAnimationTargetCompat[] targets = 268 new RemoteAnimationTargetCompat[openingTasks.size()]; 269 for (int i = 0; i < openingTasks.size(); ++i) { 270 mOpeningLeashes.add(openingTasks.get(i).getLeash()); 271 // We are receiving new opening tasks, so convert to onTasksAppeared. 272 final RemoteAnimationTargetCompat target = new RemoteAnimationTargetCompat( 273 openingTasks.get(i), layer, mInfo, t); 274 mLeashMap.put(mOpeningLeashes.get(i), target.leash.mSurfaceControl); 275 t.reparent(target.leash.mSurfaceControl, mInfo.getRootLeash()); 276 t.setLayer(target.leash.mSurfaceControl, layer); 277 t.hide(target.leash.mSurfaceControl); 278 t.apply(); 279 targets[i] = target; 280 } 281 recents.onTasksAppeared(targets); 282 return true; 283 } 284 screenshotTask(int taskId)285 @Override public ThumbnailData screenshotTask(int taskId) { 286 return mWrapped != null ? mWrapped.screenshotTask(taskId) : null; 287 } 288 setInputConsumerEnabled(boolean enabled)289 @Override public void setInputConsumerEnabled(boolean enabled) { 290 if (mWrapped != null) mWrapped.setInputConsumerEnabled(enabled); 291 } 292 setAnimationTargetsBehindSystemBars(boolean behindSystemBars)293 @Override public void setAnimationTargetsBehindSystemBars(boolean behindSystemBars) { 294 if (mWrapped != null) mWrapped.setAnimationTargetsBehindSystemBars(behindSystemBars); 295 } 296 hideCurrentInputMethod()297 @Override public void hideCurrentInputMethod() { 298 mWrapped.hideCurrentInputMethod(); 299 } 300 setFinishTaskTransaction(int taskId, PictureInPictureSurfaceTransaction finishTransaction, SurfaceControl overlay)301 @Override public void setFinishTaskTransaction(int taskId, 302 PictureInPictureSurfaceTransaction finishTransaction, SurfaceControl overlay) { 303 mPipTransaction = finishTransaction; 304 if (mWrapped != null) { 305 mWrapped.setFinishTaskTransaction(taskId, finishTransaction, overlay); 306 } 307 } 308 309 @Override 310 @SuppressLint("NewApi") finish(boolean toHome, boolean sendUserLeaveHint)311 public void finish(boolean toHome, boolean sendUserLeaveHint) { 312 if (mFinishCB == null) { 313 Log.e(TAG, "Duplicate call to finish", new RuntimeException()); 314 return; 315 } 316 if (mWrapped != null) mWrapped.finish(toHome, sendUserLeaveHint); 317 try { 318 if (!toHome && mPausingTasks != null && mOpeningLeashes == null) { 319 // The gesture went back to opening the app rather than continuing with 320 // recents, so end the transition by moving the app back to the top (and also 321 // re-showing it's task). 322 final WindowContainerTransaction wct = new WindowContainerTransaction(); 323 final SurfaceControl.Transaction t = new SurfaceControl.Transaction(); 324 for (int i = mPausingTasks.size() - 1; i >= 0; ++i) { 325 // reverse order so that index 0 ends up on top 326 wct.reorder(mPausingTasks.get(i), true /* onTop */); 327 t.show(mInfo.getChange(mPausingTasks.get(i)).getLeash()); 328 } 329 mFinishCB.onTransitionFinished(wct, t); 330 } else { 331 if (mOpeningLeashes != null) { 332 // TODO: the launcher animation should handle this 333 final SurfaceControl.Transaction t = new SurfaceControl.Transaction(); 334 for (int i = 0; i < mOpeningLeashes.size(); ++i) { 335 t.show(mOpeningLeashes.get(i)); 336 t.setAlpha(mOpeningLeashes.get(i), 1.f); 337 } 338 t.apply(); 339 } 340 if (mPipTask != null && mPipTransaction != null) { 341 final SurfaceControl.Transaction t = new SurfaceControl.Transaction(); 342 t.show(mInfo.getChange(mPipTask).getLeash()); 343 PictureInPictureSurfaceTransaction.apply(mPipTransaction, 344 mInfo.getChange(mPipTask).getLeash(), t); 345 mPipTask = null; 346 mPipTransaction = null; 347 mFinishCB.onTransitionFinished(null /* wct */, t); 348 } else { 349 mFinishCB.onTransitionFinished(null /* wct */, null /* sct */); 350 } 351 352 } 353 } catch (RemoteException e) { 354 Log.e("RemoteTransitionCompat", "Failed to call animation finish callback", e); 355 } 356 // Release surface references now. This is apparently to free GPU 357 // memory while doing quick operations (eg. during CTS). 358 SurfaceControl.Transaction t = new SurfaceControl.Transaction(); 359 for (int i = 0; i < mLeashMap.size(); ++i) { 360 if (mLeashMap.keyAt(i) == mLeashMap.valueAt(i)) continue; 361 t.remove(mLeashMap.valueAt(i)); 362 } 363 t.apply(); 364 for (int i = 0; i < mInfo.getChanges().size(); ++i) { 365 mInfo.getChanges().get(i).getLeash().release(); 366 } 367 // Reset all members. 368 mWrapped = null; 369 mFinishCB = null; 370 mPausingTasks = null; 371 mInfo = null; 372 mOpeningLeashes = null; 373 mLeashMap = null; 374 mTransition = null; 375 } 376 setDeferCancelUntilNextTransition(boolean defer, boolean screenshot)377 @Override public void setDeferCancelUntilNextTransition(boolean defer, boolean screenshot) { 378 if (mWrapped != null) mWrapped.setDeferCancelUntilNextTransition(defer, screenshot); 379 } 380 cleanupScreenshot()381 @Override public void cleanupScreenshot() { 382 if (mWrapped != null) mWrapped.cleanupScreenshot(); 383 } 384 setWillFinishToHome(boolean willFinishToHome)385 @Override public void setWillFinishToHome(boolean willFinishToHome) { 386 if (mWrapped != null) mWrapped.setWillFinishToHome(willFinishToHome); 387 } 388 389 /** 390 * @see IRecentsAnimationController#removeTask 391 */ removeTask(int taskId)392 @Override public boolean removeTask(int taskId) { 393 return mWrapped != null ? mWrapped.removeTask(taskId) : false; 394 } 395 396 /** 397 * @see IRecentsAnimationController#detachNavigationBarFromApp 398 */ detachNavigationBarFromApp(boolean moveHomeToTop)399 @Override public void detachNavigationBarFromApp(boolean moveHomeToTop) { 400 try { 401 ActivityTaskManager.getService().detachNavigationBarFromApp(mTransition); 402 } catch (RemoteException e) { 403 Log.e(TAG, "Failed to detach the navigation bar from app", e); 404 } 405 } 406 407 /** 408 * @see IRecentsAnimationController#animateNavigationBarToApp(long) 409 */ animateNavigationBarToApp(long duration)410 @Override public void animateNavigationBarToApp(long duration) { 411 } 412 } 413 414 415 416 // Code below generated by codegen v1.0.23. 417 // 418 // DO NOT MODIFY! 419 // CHECKSTYLE:OFF Generated code 420 // 421 // To regenerate run: 422 // $ codegen $ANDROID_BUILD_TOP/frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java 423 // 424 // To exclude the generated code from IntelliJ auto-formatting enable (one-time): 425 // Settings > Editor > Code Style > Formatter Control 426 //@formatter:off 427 428 429 @DataClass.Generated.Member RemoteTransitionCompat( @onNull RemoteTransition transition, @Nullable TransitionFilter filter)430 /* package-private */ RemoteTransitionCompat( 431 @NonNull RemoteTransition transition, 432 @Nullable TransitionFilter filter) { 433 this.mTransition = transition; 434 com.android.internal.util.AnnotationValidations.validate( 435 NonNull.class, null, mTransition); 436 this.mFilter = filter; 437 438 // onConstructed(); // You can define this method to get a callback 439 } 440 441 @DataClass.Generated.Member getTransition()442 public @NonNull RemoteTransition getTransition() { 443 return mTransition; 444 } 445 446 @DataClass.Generated.Member getFilter()447 public @Nullable TransitionFilter getFilter() { 448 return mFilter; 449 } 450 451 @Override 452 @DataClass.Generated.Member writeToParcel(@onNull android.os.Parcel dest, int flags)453 public void writeToParcel(@NonNull android.os.Parcel dest, int flags) { 454 // You can override field parcelling by defining methods like: 455 // void parcelFieldName(Parcel dest, int flags) { ... } 456 457 byte flg = 0; 458 if (mFilter != null) flg |= 0x2; 459 dest.writeByte(flg); 460 dest.writeTypedObject(mTransition, flags); 461 if (mFilter != null) dest.writeTypedObject(mFilter, flags); 462 } 463 464 @Override 465 @DataClass.Generated.Member describeContents()466 public int describeContents() { return 0; } 467 468 /** @hide */ 469 @SuppressWarnings({"unchecked", "RedundantCast"}) 470 @DataClass.Generated.Member RemoteTransitionCompat(@onNull android.os.Parcel in)471 protected RemoteTransitionCompat(@NonNull android.os.Parcel in) { 472 // You can override field unparcelling by defining methods like: 473 // static FieldType unparcelFieldName(Parcel in) { ... } 474 475 byte flg = in.readByte(); 476 RemoteTransition transition = (RemoteTransition) in.readTypedObject(RemoteTransition.CREATOR); 477 TransitionFilter filter = (flg & 0x2) == 0 ? null : (TransitionFilter) in.readTypedObject(TransitionFilter.CREATOR); 478 479 this.mTransition = transition; 480 com.android.internal.util.AnnotationValidations.validate( 481 NonNull.class, null, mTransition); 482 this.mFilter = filter; 483 484 // onConstructed(); // You can define this method to get a callback 485 } 486 487 @DataClass.Generated.Member 488 public static final @NonNull Parcelable.Creator<RemoteTransitionCompat> CREATOR 489 = new Parcelable.Creator<RemoteTransitionCompat>() { 490 @Override 491 public RemoteTransitionCompat[] newArray(int size) { 492 return new RemoteTransitionCompat[size]; 493 } 494 495 @Override 496 public RemoteTransitionCompat createFromParcel(@NonNull android.os.Parcel in) { 497 return new RemoteTransitionCompat(in); 498 } 499 }; 500 501 /** 502 * A builder for {@link RemoteTransitionCompat} 503 */ 504 @SuppressWarnings("WeakerAccess") 505 @DataClass.Generated.Member 506 public static class Builder { 507 508 private @NonNull RemoteTransition mTransition; 509 private @Nullable TransitionFilter mFilter; 510 511 private long mBuilderFieldsSet = 0L; 512 Builder( @onNull RemoteTransition transition)513 public Builder( 514 @NonNull RemoteTransition transition) { 515 mTransition = transition; 516 com.android.internal.util.AnnotationValidations.validate( 517 NonNull.class, null, mTransition); 518 } 519 520 @DataClass.Generated.Member setTransition(@onNull RemoteTransition value)521 public @NonNull Builder setTransition(@NonNull RemoteTransition value) { 522 checkNotUsed(); 523 mBuilderFieldsSet |= 0x1; 524 mTransition = value; 525 return this; 526 } 527 528 @DataClass.Generated.Member setFilter(@onNull TransitionFilter value)529 public @NonNull Builder setFilter(@NonNull TransitionFilter value) { 530 checkNotUsed(); 531 mBuilderFieldsSet |= 0x2; 532 mFilter = value; 533 return this; 534 } 535 536 /** Builds the instance. This builder should not be touched after calling this! */ build()537 public @NonNull RemoteTransitionCompat build() { 538 checkNotUsed(); 539 mBuilderFieldsSet |= 0x4; // Mark builder used 540 541 if ((mBuilderFieldsSet & 0x2) == 0) { 542 mFilter = null; 543 } 544 RemoteTransitionCompat o = new RemoteTransitionCompat( 545 mTransition, 546 mFilter); 547 return o; 548 } 549 checkNotUsed()550 private void checkNotUsed() { 551 if ((mBuilderFieldsSet & 0x4) != 0) { 552 throw new IllegalStateException( 553 "This Builder should not be reused. Use a new Builder instance instead"); 554 } 555 } 556 } 557 558 @DataClass.Generated( 559 time = 1629321609807L, 560 codegenVersion = "1.0.23", 561 sourceFile = "frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java", 562 inputSignatures = "private static final java.lang.String TAG\nfinal @android.annotation.NonNull android.window.RemoteTransition mTransition\n @android.annotation.Nullable android.window.TransitionFilter mFilter\npublic void addHomeOpenCheck(android.content.ComponentName)\nclass RemoteTransitionCompat extends java.lang.Object implements [android.os.Parcelable]\nprivate com.android.systemui.shared.system.RecentsAnimationControllerCompat mWrapped\nprivate android.window.IRemoteTransitionFinishedCallback mFinishCB\nprivate android.window.WindowContainerToken mPausingTask\nprivate android.window.WindowContainerToken mPipTask\nprivate android.window.TransitionInfo mInfo\nprivate android.view.SurfaceControl mOpeningLeash\nprivate android.util.ArrayMap<android.view.SurfaceControl,android.view.SurfaceControl> mLeashMap\nprivate android.window.PictureInPictureSurfaceTransaction mPipTransaction\nprivate android.os.IBinder mTransition\n void setup(com.android.systemui.shared.system.RecentsAnimationControllerCompat,android.window.TransitionInfo,android.window.IRemoteTransitionFinishedCallback,android.window.WindowContainerToken,android.window.WindowContainerToken,android.util.ArrayMap<android.view.SurfaceControl,android.view.SurfaceControl>,android.os.IBinder)\n @android.annotation.SuppressLint boolean merge(android.window.TransitionInfo,android.view.SurfaceControl.Transaction,com.android.systemui.shared.system.RecentsAnimationListener)\npublic @java.lang.Override com.android.systemui.shared.recents.model.ThumbnailData screenshotTask(int)\npublic @java.lang.Override void setInputConsumerEnabled(boolean)\npublic @java.lang.Override void setAnimationTargetsBehindSystemBars(boolean)\npublic @java.lang.Override void hideCurrentInputMethod()\npublic @java.lang.Override void setFinishTaskTransaction(int,android.window.PictureInPictureSurfaceTransaction,android.view.SurfaceControl)\npublic @java.lang.Override @android.annotation.SuppressLint void finish(boolean,boolean)\npublic @java.lang.Override void setDeferCancelUntilNextTransition(boolean,boolean)\npublic @java.lang.Override void cleanupScreenshot()\npublic @java.lang.Override void setWillFinishToHome(boolean)\npublic @java.lang.Override boolean removeTask(int)\npublic @java.lang.Override void detachNavigationBarFromApp(boolean)\npublic @java.lang.Override void animateNavigationBarToApp(long)\nclass RecentsControllerWrap extends com.android.systemui.shared.system.RecentsAnimationControllerCompat implements []\n@com.android.internal.util.DataClass") 563 @Deprecated __metadata()564 private void __metadata() {} 565 566 567 //@formatter:on 568 // End of generated code 569 570 } 571