diff options
| author | 2015-04-10 14:25:37 +0000 | |
|---|---|---|
| committer | 2015-04-10 14:25:37 +0000 | |
| commit | 44220d7d9a0b63f645ab4a3f18d3358a18b9c3df (patch) | |
| tree | ccda0f5fa39c33bbea59a8732b9a248ffdb984be | |
| parent | 250662a4ae18e95b75cc36789c4157ed414c190a (diff) | |
| parent | 4dc668cd36fbb46b0c2cc196ae4b7105009ec089 (diff) | |
Merge "Revert "Revert "Allow delay of showing/hiding shared element when transferring."""
| -rw-r--r-- | api/current.txt | 5 | ||||
| -rw-r--r-- | api/system-current.txt | 5 | ||||
| -rw-r--r-- | core/java/android/app/EnterTransitionCoordinator.java | 53 | ||||
| -rw-r--r-- | core/java/android/app/ExitTransitionCoordinator.java | 42 | ||||
| -rw-r--r-- | core/java/android/app/SharedElementCallback.java | 38 |
5 files changed, 112 insertions, 31 deletions
diff --git a/api/current.txt b/api/current.txt index 3cc9cc8e09ad..26ac1a73b35c 100644 --- a/api/current.txt +++ b/api/current.txt @@ -5317,6 +5317,11 @@ package android.app { method public void onRejectSharedElements(java.util.List<android.view.View>); method public void onSharedElementEnd(java.util.List<java.lang.String>, java.util.List<android.view.View>, java.util.List<android.view.View>); method public void onSharedElementStart(java.util.List<java.lang.String>, java.util.List<android.view.View>, java.util.List<android.view.View>); + method public void onSharedElementsArrived(java.util.List<java.lang.String>, java.util.List<android.view.View>, android.app.SharedElementCallback.OnSharedElementsReadyListener); + } + + public static abstract interface SharedElementCallback.OnSharedElementsReadyListener { + method public abstract void onSharedElementsReady(); } public deprecated class TabActivity extends android.app.ActivityGroup { diff --git a/api/system-current.txt b/api/system-current.txt index e1e07640a538..37e6db50d16e 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -5408,6 +5408,11 @@ package android.app { method public void onRejectSharedElements(java.util.List<android.view.View>); method public void onSharedElementEnd(java.util.List<java.lang.String>, java.util.List<android.view.View>, java.util.List<android.view.View>); method public void onSharedElementStart(java.util.List<java.lang.String>, java.util.List<android.view.View>, java.util.List<android.view.View>); + method public void onSharedElementsArrived(java.util.List<java.lang.String>, java.util.List<android.view.View>, android.app.SharedElementCallback.OnSharedElementsReadyListener); + } + + public static abstract interface SharedElementCallback.OnSharedElementsReadyListener { + method public abstract void onSharedElementsReady(); } public deprecated class TabActivity extends android.app.ActivityGroup { diff --git a/core/java/android/app/EnterTransitionCoordinator.java b/core/java/android/app/EnterTransitionCoordinator.java index c053c830adfc..e84a8dabf3b7 100644 --- a/core/java/android/app/EnterTransitionCoordinator.java +++ b/core/java/android/app/EnterTransitionCoordinator.java @@ -18,6 +18,7 @@ package android.app; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; +import android.app.SharedElementCallback.OnSharedElementsReadyListener; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.ResultReceiver; @@ -140,13 +141,13 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { } else { decor.getViewTreeObserver() .addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { - @Override - public boolean onPreDraw() { - decor.getViewTreeObserver().removeOnPreDrawListener(this); - viewsReady(sharedElements); - return true; - } - }); + @Override + public boolean onPreDraw() { + decor.getViewTreeObserver().removeOnPreDrawListener(this); + viewsReady(sharedElements); + return true; + } + }); } } @@ -383,23 +384,33 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { } final Bundle sharedElementState = mSharedElementsBundle; mSharedElementsBundle = null; - final View decorView = getDecor(); - if (decorView != null) { - decorView.getViewTreeObserver() - .addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { - @Override - public boolean onPreDraw() { - decorView.getViewTreeObserver().removeOnPreDrawListener(this); - startTransition(new Runnable() { + OnSharedElementsReadyListener listener = new OnSharedElementsReadyListener() { + @Override + public void onSharedElementsReady() { + final View decorView = getDecor(); + if (decorView != null) { + decorView.getViewTreeObserver() + .addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override - public void run() { - startSharedElementTransition(sharedElementState); + public boolean onPreDraw() { + decorView.getViewTreeObserver().removeOnPreDrawListener(this); + startTransition(new Runnable() { + @Override + public void run() { + startSharedElementTransition(sharedElementState); + } + }); + return false; } }); - return false; - } - }); - decorView.invalidate(); + decorView.invalidate(); + } + } + }; + if (mListener == null) { + listener.onSharedElementsReady(); + } else { + mListener.onSharedElementsArrived(mSharedElementNames, mSharedElements, listener); } } diff --git a/core/java/android/app/ExitTransitionCoordinator.java b/core/java/android/app/ExitTransitionCoordinator.java index dd3df47942cc..169952ad1a0b 100644 --- a/core/java/android/app/ExitTransitionCoordinator.java +++ b/core/java/android/app/ExitTransitionCoordinator.java @@ -18,6 +18,7 @@ package android.app; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; +import android.app.SharedElementCallback.OnSharedElementsReadyListener; import android.content.Intent; import android.graphics.Color; import android.graphics.Matrix; @@ -27,6 +28,7 @@ import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Handler; import android.os.Message; +import android.os.ResultReceiver; import android.transition.Transition; import android.transition.TransitionManager; import android.view.View; @@ -408,18 +410,38 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator { if (!mSharedElementNotified) { mSharedElementNotified = true; delayCancel(); - mResultReceiver.send(MSG_TAKE_SHARED_ELEMENTS, mSharedElementBundle); - } - if (!mExitNotified && mExitComplete) { - mExitNotified = true; - mResultReceiver.send(MSG_EXIT_TRANSITION_COMPLETE, null); - mResultReceiver = null; // done talking - ViewGroup decorView = getDecor(); - if (!mIsReturning && decorView != null) { - decorView.suppressLayout(false); + if (mListener == null) { + mResultReceiver.send(MSG_TAKE_SHARED_ELEMENTS, mSharedElementBundle); + notifyExitComplete(); + } else { + final ResultReceiver resultReceiver = mResultReceiver; + final Bundle sharedElementBundle = mSharedElementBundle; + mListener.onSharedElementsArrived(mSharedElementNames, mSharedElements, + new OnSharedElementsReadyListener() { + @Override + public void onSharedElementsReady() { + resultReceiver.send(MSG_TAKE_SHARED_ELEMENTS, + sharedElementBundle); + notifyExitComplete(); + } + }); } - finishIfNecessary(); + } else { + notifyExitComplete(); + } + } + } + + private void notifyExitComplete() { + if (!mExitNotified && mExitComplete) { + mExitNotified = true; + mResultReceiver.send(MSG_EXIT_TRANSITION_COMPLETE, null); + mResultReceiver = null; // done talking + ViewGroup decorView = getDecor(); + if (!mIsReturning && decorView != null) { + decorView.suppressLayout(false); } + finishIfNecessary(); } } diff --git a/core/java/android/app/SharedElementCallback.java b/core/java/android/app/SharedElementCallback.java index 6ac24013672c..e58b7fb14b01 100644 --- a/core/java/android/app/SharedElementCallback.java +++ b/core/java/android/app/SharedElementCallback.java @@ -221,4 +221,42 @@ public abstract class SharedElementCallback { } return view; } + + /** + * Called during an Activity Transition when the shared elements have arrived at the + * final location and are ready to be transferred. This method is called for both the + * source and destination Activities. + * <p> + * When the shared elements are ready to be transferred, + * {@link OnSharedElementsReadyListener#onSharedElementsReady()} + * must be called to trigger the transfer. + * <p> + * The default behavior is to trigger the transfer immediately. + * + * @param sharedElementNames The names of the shared elements that are being transferred.. + * @param sharedElements The shared elements that are part of the View hierarchy. + * @param listener The listener to call when the shared elements are ready to be hidden + * in the source Activity or shown in the destination Activity. + */ + public void onSharedElementsArrived(List<String> sharedElementNames, + List<View> sharedElements, OnSharedElementsReadyListener listener) { + listener.onSharedElementsReady(); + } + + /** + * Listener to be called after {@link + * SharedElementCallback#onSharedElementsArrived(List, List, OnSharedElementsReadyListener)} + * when the shared elements are ready to be hidden in the source Activity and shown in the + * destination Activity. + */ + public interface OnSharedElementsReadyListener { + + /** + * Call this method during or after the OnSharedElementsReadyListener has been received + * in {@link SharedElementCallback#onSharedElementsArrived(List, List, + * OnSharedElementsReadyListener)} to indicate that the shared elements are ready to be + * hidden in the source and shown in the destination Activity. + */ + void onSharedElementsReady(); + } } |