Merge "Fix NPE when Window disappears during a transition." into lmp-dev
diff --git a/core/java/android/app/ActivityTransitionCoordinator.java b/core/java/android/app/ActivityTransitionCoordinator.java
index 0cac6a5..5e0ea17 100644
--- a/core/java/android/app/ActivityTransitionCoordinator.java
+++ b/core/java/android/app/ActivityTransitionCoordinator.java
@@ -467,11 +467,12 @@
}
protected void scheduleSetSharedElementEnd(final ArrayList<View> snapshots) {
- getDecor().getViewTreeObserver().addOnPreDrawListener(
+ final View decorView = getDecor();
+ decorView.getViewTreeObserver().addOnPreDrawListener(
new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
- getDecor().getViewTreeObserver().removeOnPreDrawListener(this);
+ decorView.getViewTreeObserver().removeOnPreDrawListener(this);
notifySharedElementEnd(snapshots);
return true;
}
@@ -664,8 +665,7 @@
GhostView.addGhost(view, decor);
ViewGroup parent = (ViewGroup) view.getParent();
if (moveWithParent && !isInTransitionGroup(parent, decor)) {
- GhostViewListeners listener =
- new GhostViewListeners(view, decor);
+ GhostViewListeners listener = new GhostViewListeners(view, parent, decor);
parent.getViewTreeObserver().addOnPreDrawListener(listener);
mGhostViewListeners.add(listener);
}
@@ -723,11 +723,12 @@
}
protected void scheduleGhostVisibilityChange(final int visibility) {
- getDecor().getViewTreeObserver()
+ final View decorView = getDecor();
+ decorView.getViewTreeObserver()
.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
- getDecor().getViewTreeObserver().removeOnPreDrawListener(this);
+ decorView.getViewTreeObserver().removeOnPreDrawListener(this);
setGhostVisibility(visibility);
return true;
}
@@ -769,10 +770,12 @@
private static class GhostViewListeners implements ViewTreeObserver.OnPreDrawListener {
private View mView;
private ViewGroup mDecor;
+ private View mParent;
private Matrix mMatrix = new Matrix();
- public GhostViewListeners(View view, ViewGroup decor) {
+ public GhostViewListeners(View view, View parent, ViewGroup decor) {
mView = view;
+ mParent = parent;
mDecor = decor;
}
@@ -782,10 +785,9 @@
@Override
public boolean onPreDraw() {
- ViewGroup parent = ((ViewGroup) mView.getParent());
GhostView ghostView = GhostView.getGhost(mView);
if (ghostView == null) {
- parent.getViewTreeObserver().removeOnPreDrawListener(this);
+ mParent.getViewTreeObserver().removeOnPreDrawListener(this);
} else {
GhostView.calculateMatrix(mView, mDecor, mMatrix);
ghostView.setMatrix(mMatrix);
diff --git a/core/java/android/app/EnterTransitionCoordinator.java b/core/java/android/app/EnterTransitionCoordinator.java
index 2bc4166..f432c49 100644
--- a/core/java/android/app/EnterTransitionCoordinator.java
+++ b/core/java/android/app/EnterTransitionCoordinator.java
@@ -69,12 +69,13 @@
Bundle resultReceiverBundle = new Bundle();
resultReceiverBundle.putParcelable(KEY_REMOTE_RECEIVER, this);
mResultReceiver.send(MSG_SET_REMOTE_RECEIVER, resultReceiverBundle);
- getDecor().getViewTreeObserver().addOnPreDrawListener(
+ final View decorView = getDecor();
+ decorView.getViewTreeObserver().addOnPreDrawListener(
new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
if (mIsReadyForTransition) {
- getDecor().getViewTreeObserver().removeOnPreDrawListener(this);
+ decorView.getViewTreeObserver().removeOnPreDrawListener(this);
}
return mIsReadyForTransition;
}
@@ -187,11 +188,12 @@
moveSharedElementsToOverlay();
mResultReceiver.send(MSG_SHARED_ELEMENT_DESTINATION, state);
} else {
- getDecor().getViewTreeObserver()
+ final View decorView = getDecor();
+ decorView.getViewTreeObserver()
.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
- getDecor().getViewTreeObserver().removeOnPreDrawListener(this);
+ decorView.getViewTreeObserver().removeOnPreDrawListener(this);
if (mResultReceiver != null) {
Bundle state = captureSharedElementState();
setSharedElementMatrices();
@@ -342,11 +344,12 @@
}
final Bundle sharedElementState = mSharedElementsBundle;
mSharedElementsBundle = null;
- getDecor().getViewTreeObserver()
+ final View decorView = getDecor();
+ decorView.getViewTreeObserver()
.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
- getDecor().getViewTreeObserver().removeOnPreDrawListener(this);
+ decorView.getViewTreeObserver().removeOnPreDrawListener(this);
startTransition(new Runnable() {
@Override
public void run() {
@@ -356,7 +359,7 @@
return false;
}
});
- getDecor().invalidate();
+ decorView.invalidate();
}
private void requestLayoutForSharedElements() {
diff --git a/core/java/android/app/ExitTransitionCoordinator.java b/core/java/android/app/ExitTransitionCoordinator.java
index 9d5557f..a59a927 100644
--- a/core/java/android/app/ExitTransitionCoordinator.java
+++ b/core/java/android/app/ExitTransitionCoordinator.java
@@ -165,11 +165,12 @@
});
final ArrayList<View> sharedElementSnapshots = createSnapshots(mExitSharedElementBundle,
mSharedElementNames);
- getDecor().getViewTreeObserver()
+ final View decorView = getDecor();
+ decorView.getViewTreeObserver()
.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
- getDecor().getViewTreeObserver().removeOnPreDrawListener(this);
+ decorView.getViewTreeObserver().removeOnPreDrawListener(this);
setSharedElementState(mExitSharedElementBundle, sharedElementSnapshots);
return true;
}