1 /* 2 * Copyright (C) 2018 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 package com.android.quickstep.util; 17 18 import com.android.systemui.shared.system.RemoteAnimationTargetCompat; 19 import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat; 20 21 import java.util.ArrayDeque; 22 import java.util.ArrayList; 23 import java.util.Queue; 24 25 /** 26 * Holds a collection of RemoteAnimationTargets, filtered by different properties. 27 */ 28 public class RemoteAnimationTargetSet { 29 30 private final Queue<SyncRtSurfaceTransactionApplierCompat> mDependentTransactionAppliers = 31 new ArrayDeque<>(1); 32 33 public final RemoteAnimationTargetCompat[] unfilteredApps; 34 public final RemoteAnimationTargetCompat[] apps; 35 public final int targetMode; 36 public final boolean hasRecents; 37 RemoteAnimationTargetSet(RemoteAnimationTargetCompat[] apps, int targetMode)38 public RemoteAnimationTargetSet(RemoteAnimationTargetCompat[] apps, int targetMode) { 39 ArrayList<RemoteAnimationTargetCompat> filteredApps = new ArrayList<>(); 40 boolean hasRecents = false; 41 if (apps != null) { 42 for (RemoteAnimationTargetCompat target : apps) { 43 if (target.mode == targetMode) { 44 filteredApps.add(target); 45 } 46 47 hasRecents |= target.activityType == 48 RemoteAnimationTargetCompat.ACTIVITY_TYPE_RECENTS; 49 } 50 } 51 52 this.unfilteredApps = apps; 53 this.apps = filteredApps.toArray(new RemoteAnimationTargetCompat[filteredApps.size()]); 54 this.targetMode = targetMode; 55 this.hasRecents = hasRecents; 56 } 57 findTask(int taskId)58 public RemoteAnimationTargetCompat findTask(int taskId) { 59 for (RemoteAnimationTargetCompat target : apps) { 60 if (target.taskId == taskId) { 61 return target; 62 } 63 } 64 return null; 65 } 66 isAnimatingHome()67 public boolean isAnimatingHome() { 68 for (RemoteAnimationTargetCompat target : apps) { 69 if (target.activityType == RemoteAnimationTargetCompat.ACTIVITY_TYPE_HOME) { 70 return true; 71 } 72 } 73 return false; 74 } 75 addDependentTransactionApplier(SyncRtSurfaceTransactionApplierCompat delay)76 public void addDependentTransactionApplier(SyncRtSurfaceTransactionApplierCompat delay) { 77 mDependentTransactionAppliers.add(delay); 78 } 79 release()80 public void release() { 81 SyncRtSurfaceTransactionApplierCompat applier = mDependentTransactionAppliers.poll(); 82 if (applier == null) { 83 for (RemoteAnimationTargetCompat target : unfilteredApps) { 84 target.release(); 85 } 86 } else { 87 applier.addAfterApplyCallback(this::release); 88 } 89 } 90 } 91