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