Fix Animators pausing on a wrong Window am: feda490114 am: 42156d4d7c
am: 5929af1048
Change-Id: I365b04bc47bd8ef8c70f7f6a6bae7f7b3cf92888
diff --git a/transition/ics/android/support/transition/TransitionManagerPort.java b/transition/ics/android/support/transition/TransitionManagerPort.java
index 7857f57..d6ca154 100644
--- a/transition/ics/android/support/transition/TransitionManagerPort.java
+++ b/transition/ics/android/support/transition/TransitionManagerPort.java
@@ -132,7 +132,7 @@
if (runningTransitions != null && runningTransitions.size() > 0) {
for (TransitionPort runningTransition : runningTransitions) {
- runningTransition.pause();
+ runningTransition.pause(sceneRoot);
}
}
@@ -397,7 +397,7 @@
ArrayList<TransitionPort> runningTransitions = getRunningTransitions().get(mSceneRoot);
if (runningTransitions != null && runningTransitions.size() > 0) {
for (TransitionPort runningTransition : runningTransitions) {
- runningTransition.resume();
+ runningTransition.resume(mSceneRoot);
}
}
mTransition.clearValues(true);
@@ -430,7 +430,7 @@
mTransition.captureValues(mSceneRoot, false);
if (previousRunningTransitions != null) {
for (TransitionPort runningTransition : previousRunningTransitions) {
- runningTransition.resume();
+ runningTransition.resume(mSceneRoot);
}
}
mTransition.playTransition(mSceneRoot);
diff --git a/transition/ics/android/support/transition/TransitionPort.java b/transition/ics/android/support/transition/TransitionPort.java
index 31b4221..f6c3346 100644
--- a/transition/ics/android/support/transition/TransitionPort.java
+++ b/transition/ics/android/support/transition/TransitionPort.java
@@ -343,7 +343,8 @@
view = start.view;
}
if (animator != null) {
- AnimationInfo info = new AnimationInfo(view, getName(), infoValues);
+ AnimationInfo info = new AnimationInfo(view, getName(),
+ WindowIdPort.getWindowId(sceneRoot), infoValues);
runningAnimators.put(animator, info);
mAnimators.add(animator);
}
@@ -788,13 +789,17 @@
*
* @hide
*/
- public void pause() {
+ public void pause(View sceneRoot) {
if (!mEnded) {
ArrayMap<Animator, AnimationInfo> runningAnimators = getRunningAnimators();
int numOldAnims = runningAnimators.size();
+ WindowIdPort windowId = WindowIdPort.getWindowId(sceneRoot);
for (int i = numOldAnims - 1; i >= 0; i--) {
- Animator anim = runningAnimators.keyAt(i);
-// anim.pause();
+ AnimationInfo info = runningAnimators.valueAt(i);
+ if (info.view != null && windowId.equals(info.windowId)) {
+ Animator anim = runningAnimators.keyAt(i);
+ anim.cancel(); // pause() is API Level 19
+ }
}
if (mListeners != null && mListeners.size() > 0) {
ArrayList<TransitionListener> tmpListeners =
@@ -815,14 +820,18 @@
*
* @hide
*/
- public void resume() {
+ public void resume(View sceneRoot) {
if (mPaused) {
if (!mEnded) {
ArrayMap<Animator, AnimationInfo> runningAnimators = getRunningAnimators();
int numOldAnims = runningAnimators.size();
+ WindowIdPort windowId = WindowIdPort.getWindowId(sceneRoot);
for (int i = numOldAnims - 1; i >= 0; i--) {
- Animator anim = runningAnimators.keyAt(i);
-// anim.resume();
+ AnimationInfo info = runningAnimators.valueAt(i);
+ if (info.view != null && windowId.equals(info.windowId)) {
+ Animator anim = runningAnimators.keyAt(i);
+ anim.end(); // resume() is API Level 19
+ }
}
if (mListeners != null && mListeners.size() > 0) {
ArrayList<TransitionListener> tmpListeners =
@@ -1211,10 +1220,13 @@
TransitionValues values;
- AnimationInfo(View view, String name, TransitionValues values) {
+ WindowIdPort windowId;
+
+ AnimationInfo(View view, String name, WindowIdPort windowId, TransitionValues values) {
this.view = view;
this.name = name;
this.values = values;
+ this.windowId = windowId;
}
}
diff --git a/transition/ics/android/support/transition/TransitionSetPort.java b/transition/ics/android/support/transition/TransitionSetPort.java
index eab84c9..97985a5 100644
--- a/transition/ics/android/support/transition/TransitionSetPort.java
+++ b/transition/ics/android/support/transition/TransitionSetPort.java
@@ -232,21 +232,21 @@
/** @hide */
@Override
- public void pause() {
- super.pause();
+ public void pause(View sceneRoot) {
+ super.pause(sceneRoot);
int numTransitions = mTransitions.size();
for (int i = 0; i < numTransitions; ++i) {
- mTransitions.get(i).pause();
+ mTransitions.get(i).pause(sceneRoot);
}
}
/** @hide */
@Override
- public void resume() {
- super.resume();
+ public void resume(View sceneRoot) {
+ super.resume(sceneRoot);
int numTransitions = mTransitions.size();
for (int i = 0; i < numTransitions; ++i) {
- mTransitions.get(i).resume();
+ mTransitions.get(i).resume(sceneRoot);
}
}
diff --git a/transition/ics/android/support/transition/WindowIdPort.java b/transition/ics/android/support/transition/WindowIdPort.java
new file mode 100644
index 0000000..f768b2e
--- /dev/null
+++ b/transition/ics/android/support/transition/WindowIdPort.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.transition;
+
+import android.os.IBinder;
+import android.support.annotation.NonNull;
+import android.view.View;
+
+
+/**
+ * Backport of WindowId.
+ *
+ * <p>Since the use of WindowId in Transition API is limited to identifying windows, we can just
+ * wrap a window token and use it as an identifier.</p>
+ */
+class WindowIdPort {
+
+ private final IBinder mToken;
+
+ private WindowIdPort(IBinder token) {
+ mToken = token;
+ }
+
+ static WindowIdPort getWindowId(@NonNull View view) {
+ return new WindowIdPort(view.getWindowToken());
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ return obj instanceof WindowIdPort && ((WindowIdPort) obj).mToken.equals(this.mToken);
+ }
+
+}