diff options
author | George Mount <mount@google.com> | 2014-02-26 16:37:03 +0000 |
---|---|---|
committer | George Mount <mount@google.com> | 2014-02-26 08:56:30 -0800 |
commit | 206e30cd93afe3eb72ec94178324417db5424ed2 (patch) | |
tree | efd63a9c86705a18e17c17abab070ca05d202324 /policy | |
parent | 1ec1370a5d8c5ee7318766fbafad59ea76a644c9 (diff) | |
download | frameworks_base-206e30cd93afe3eb72ec94178324417db5424ed2.zip frameworks_base-206e30cd93afe3eb72ec94178324417db5424ed2.tar.gz frameworks_base-206e30cd93afe3eb72ec94178324417db5424ed2.tar.bz2 |
Revert "Change Activity Scene Transitions to be more automatic."
This reverts commit f10587faadb9080a7bf9991cbe04bac5525da482.
Change-Id: I2785a3d2d6b667cad6d61dcbbc1c624161735fa4
Diffstat (limited to 'policy')
-rw-r--r-- | policy/src/com/android/internal/policy/impl/PhoneWindow.java | 345 |
1 files changed, 85 insertions, 260 deletions
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java index 86105ea..c73d90a 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java @@ -29,8 +29,6 @@ import android.transition.Scene; import android.transition.Transition; import android.transition.TransitionInflater; import android.transition.TransitionManager; -import android.transition.TransitionSet; -import android.util.ArrayMap; import android.view.ViewConfiguration; import com.android.internal.R; @@ -107,9 +105,6 @@ import android.widget.TextView; import java.lang.ref.WeakReference; import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; /** * Android-specific Window. @@ -125,13 +120,6 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { private static final long MAX_TRANSITION_START_WAIT = 500; private static final long MAX_TRANSITION_FINISH_WAIT = 1000; - private static final String KEY_SCREEN_X = "shared_element:screenX"; - private static final String KEY_SCREEN_Y = "shared_element:screenY"; - private static final String KEY_TRANSLATION_Z = "shared_element:translationZ"; - private static final String KEY_WIDTH = "shared_element:width"; - private static final String KEY_HEIGHT = "shared_element:height"; - private static final String KEY_NAME = "shared_element:name"; - /** * Simple callback used by the context menu and its submenus. The options * menu submenus do not use this (their behavior is more complex). @@ -251,8 +239,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { private ActivityOptions mActivityOptions; private SceneTransitionListener mSceneTransitionListener; - private boolean mTriggerEarly = true; - private Map<String, String> mSharedElementsMap; + private boolean mFadeEarly = true; static class WindowManagerHolder { static final IWindowManager sWindowManager = IWindowManager.Stub.asInterface( @@ -2575,11 +2562,6 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { return super.fitSystemWindows(insets); } - @Override - public boolean isTransitionGroup() { - return false; - } - private void updateStatusGuard(Rect insets) { boolean showStatusGuard = false; // Show the status guard when the non-overlay contextual action bar is showing @@ -4006,196 +3988,78 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } @Override - public void setTriggerEarlyEnterTransition(boolean triggerEarly) { - mTriggerEarly = triggerEarly; + public void setEarlyBackgroundTransition(boolean fadeEarly) { + mFadeEarly = fadeEarly; } @Override - public void mapTransitionTargets(Map<String, String> sharedElementNames) { - mSharedElementsMap = sharedElementNames; - } - - @Override - public Bundle startExitTransition(Map<String, View> sharedElements) { - if (mContentScene == null) { - return null; - } - Transition transition = mTransitionManager.getExitTransition(mContentScene); + public void startExitTransition(ActivityOptions activityOptions) { + Transition transition = mTransitionManager.getNamedTransition(getContentScene(), "null"); if (transition == null) { - return null; + transition = TransitionManager.getDefaultTransition().clone(); } - - // Find exiting Views and shared elements - final ArrayList<View> transitioningViews = new ArrayList<View>(); - mDecor.captureTransitioningViews(transitioningViews); - transitioningViews.removeAll(sharedElements.values()); - - Transition exitTransition = cloneAndSetTransitionTargets(transition, - transitioningViews, true); - Transition sharedElementTransition = cloneAndSetTransitionTargets(transition, - transitioningViews, false); - - // transitionSet is the total exit transition, including hero animation. - TransitionSet transitionSet = new TransitionSet(); - transitionSet.addTransition(exitTransition); - transitionSet.addTransition(sharedElementTransition); - - ActivityOptions activityOptions = createExitActivityOptions(sharedElements, - sharedElementTransition, exitTransition); - - // Start exiting the Views that need to exit - TransitionManager.beginDelayedTransition(mDecor, transitionSet); - setViewVisibility(transitioningViews, View.INVISIBLE); - - return activityOptions.toBundle(); - } - - private ActivityOptions createExitActivityOptions(final Map<String, View> sharedElements, - Transition sharedElementTransition, Transition exitTransition) { - - // Schedule capturing of the shared element state - final Bundle sharedElementArgs = new Bundle(); - captureTerminalSharedElementState(sharedElements, sharedElementArgs); - - ActivityOptions.SharedElementSource sharedElementSource - = new ActivityOptions.SharedElementSource() { + activityOptions.setExitTransition(transition, new ActivityOptions.SharedElementSource() { @Override - public Bundle getSharedElementExitState() { - return sharedElementArgs; - } - - @Override - public void acceptedSharedElements(ArrayList<String> sharedElementNames) { - if (sharedElementNames.size() == sharedElements.size()) { - return; // They were all accepted - } - Transition transition = mTransitionManager.getExitTransition(mContentScene).clone(); - TransitionManager.beginDelayedTransition(mDecor, transition); - for (String name: sharedElements.keySet()) { - if (!sharedElementNames.contains(name)) { - sharedElements.get(name).setVisibility(View.INVISIBLE); - } - } - sharedElements.keySet().retainAll(sharedElementNames); - } - - @Override - public void hideSharedElements() { - if (sharedElements != null) { - setViewVisibility(sharedElements.values(), View.INVISIBLE); - } - } - }; - - ArrayList<String> names = new ArrayList<String>(sharedElements.keySet()); - return ActivityOptions.makeSceneTransitionAnimation( - exitTransition, names, sharedElementTransition, sharedElementSource); - } - - private void captureTerminalSharedElementState(final Map<String, View> sharedElements, - final Bundle sharedElementArgs) { - mDecor.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { - @Override - public boolean onPreDraw() { - mDecor.getViewTreeObserver().removeOnPreDrawListener(this); - int[] tempLoc = new int[2]; - for (String name: sharedElements.keySet()) { - View sharedElement = sharedElements.get(name); - captureSharedElementState(sharedElement, name, sharedElementArgs, tempLoc); - } - return true; + public int getTextureId() { + // TODO: move shared elements to a layer and return the texture id + recurseHideExitingSharedElements(mContentParent); + return 0; } }); + ViewGroup sceneRoot = getContentScene().getSceneRoot(); + TransitionManager.beginDelayedTransition(sceneRoot, transition); + recurseExitNonSharedElements(mContentParent); } - private static Transition cloneAndSetTransitionTargets(Transition transition, - List<View> views, boolean add) { - transition = transition.clone(); - if (!transition.getTargetIds().isEmpty() || !transition.getTargets().isEmpty()) { - TransitionSet set = new TransitionSet(); - set.addTransition(transition); - transition = set; - } - for (View view: views) { - if (add) { - transition.addTarget(view); + private static void recurseExitNonSharedElements(ViewGroup viewGroup) { + int numChildren = viewGroup.getChildCount(); + for (int i = 0; i < numChildren; i++) { + View child = viewGroup.getChildAt(i); + if (child.getSharedElementName() != null || (child.getVisibility() != View.VISIBLE)) { + continue; + } + if (child instanceof ViewGroup && !((ViewGroup)child).isTransitionGroup()) { + recurseExitNonSharedElements((ViewGroup) child); } else { - transition.excludeTarget(view, true); + child.setVisibility(View.INVISIBLE); } } - return transition; } - private static void setViewVisibility(Collection<View> views, int visibility) { - for (View view : views) { - view.setVisibility(visibility); + private static void recurseHideViews(ViewGroup viewGroup, ArrayList<View> nonSharedElements, + ArrayList<View> sharedElements) { + int numChildren = viewGroup.getChildCount(); + for (int i = 0; i < numChildren; i++) { + View child = viewGroup.getChildAt(i); + if (child.getVisibility() != View.VISIBLE) { + continue; + } + if (child.getSharedElementName() != null) { + sharedElements.add(child); + child.setVisibility(View.INVISIBLE); + } else if (child instanceof ViewGroup && !((ViewGroup)child).isTransitionGroup()) { + recurseHideViews((ViewGroup) child, nonSharedElements, sharedElements); + } else { + nonSharedElements.add(child); + child.setVisibility(View.INVISIBLE); + } } } - /** - * Sets the captured values from a previous - * {@link #captureSharedElementState(android.view.View, String, android.os.Bundle, int[])} - * @param view The View to apply placement changes to. - * @param name The shared element name given from the source Activity. - * @param transitionArgs A <code>Bundle</code> containing all placementinformation for named - * shared elements in the scene. - * @param tempLoc A temporary int[2] for capturing the current location of views. - */ - private static void setSharedElementState(View view, String name, Bundle transitionArgs, - int[] tempLoc) { - Bundle sharedElementBundle = transitionArgs.getBundle(name); - if (sharedElementBundle == null) { - return; + private static void recurseHideExitingSharedElements(ViewGroup viewGroup) { + int numChildren = viewGroup.getChildCount(); + for (int i = 0; i < numChildren; i++) { + View child = viewGroup.getChildAt(i); + if (child.getVisibility() != View.VISIBLE) { + continue; + } + if (child.getSharedElementName() != null) { + child.setVisibility(View.INVISIBLE); + } else if (child instanceof ViewGroup) { + ViewGroup childViewGroup = (ViewGroup) child; + recurseHideExitingSharedElements(childViewGroup); + } } - - int x = sharedElementBundle.getInt(KEY_SCREEN_X); - view.getLocationOnScreen(tempLoc); - int offsetX = x - tempLoc[0]; - view.offsetLeftAndRight(offsetX); - - int width = sharedElementBundle.getInt(KEY_WIDTH); - view.setRight(view.getLeft() + width); - - int y = sharedElementBundle.getInt(KEY_SCREEN_Y); - int offsetY = y - tempLoc[1]; - view.offsetTopAndBottom(offsetY); - - int height = sharedElementBundle.getInt(KEY_HEIGHT); - view.setBottom(view.getTop() + height); - - float z = sharedElementBundle.getFloat(KEY_TRANSLATION_Z); - view.setTranslationZ(z); - } - - /** - * Captures placement information for Views with a shared element name for - * Activity Transitions. - * @param view The View to capture the placement information for. - * @param name The shared element name in the target Activity to apply the placement - * information for. - * @param transitionArgs Bundle to store shared element placement information. - * @param tempLoc A temporary int[2] for capturing the current location of views. - * @see #setSharedElementState(android.view.View, String, android.os.Bundle, int[]) - */ - private static void captureSharedElementState(View view, String name, Bundle transitionArgs, - int[] tempLoc) { - Bundle sharedElementBundle = new Bundle(); - view.getLocationOnScreen(tempLoc); - float scaleX = view.getScaleX(); - sharedElementBundle.putInt(KEY_SCREEN_X, tempLoc[0]); - int width = Math.round(view.getWidth() * scaleX); - sharedElementBundle.putInt(KEY_WIDTH, width); - - float scaleY = view.getScaleY(); - sharedElementBundle.putInt(KEY_SCREEN_Y, tempLoc[1]); - int height= Math.round(view.getHeight() * scaleY); - sharedElementBundle.putInt(KEY_HEIGHT, height); - - sharedElementBundle.putFloat(KEY_TRANSLATION_Z, view.getTranslationZ()); - - sharedElementBundle.putString(KEY_NAME, view.getSharedElementName()); - - transitionArgs.putBundle(name, sharedElementBundle); } /** @@ -4216,57 +4080,46 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { private boolean mAllDone; private Handler mHandler = new Handler(); private boolean mEnterTransitionStarted; - private ArrayMap<String, View> mSharedElementTargets = new ArrayMap<String, View>(); - private ArrayList<View> mEnteringViews = new ArrayList<View>(); + private ArrayList<View> mSharedElements = new ArrayList<View>(); public EnterScene() { mSceneTransitionListener.nullPendingTransition(); Drawable background = getDecorView().getBackground(); if (background != null) { + setBackgroundDrawable(null); background.setAlpha(0); - mDecor.drawableChanged(); + setBackgroundDrawable(background); } mSceneTransitionListener.convertToTranslucent(); } @Override public boolean onPreDraw() { - ViewTreeObserver observer = mDecor.getViewTreeObserver(); + ViewTreeObserver observer = mContentParent.getViewTreeObserver(); observer.removeOnPreDrawListener(this); if (!mEnterTransitionStarted && mSceneTransitionListener != null) { mEnterTransitionStarted = true; - mDecor.captureTransitioningViews(mEnteringViews); - ArrayList<String> sharedElementNames = mActivityOptions.getSharedElementNames(); - if (sharedElementNames != null) { - mDecor.findSharedElements(mSharedElementTargets); - if (mSharedElementsMap != null) { - for (Map.Entry<String, String> entry : mSharedElementsMap.entrySet()) { - View sharedElement = mSharedElementTargets.remove(entry.getValue()); - if (sharedElement != null) { - mSharedElementTargets.put(entry.getKey(), sharedElement); - } - } - } - mSharedElementTargets.keySet().retainAll(sharedElementNames); - mEnteringViews.removeAll(mSharedElementTargets.values()); + ArrayList<View> enteringViews = new ArrayList<View>(); + recurseHideViews(mContentParent, enteringViews, mSharedElements); + Transition transition = getTransitionManager().getNamedTransition("null", + mContentScene); + if (transition == null) { + transition = TransitionManager.getDefaultTransition().clone(); } - - setViewVisibility(mEnteringViews, View.INVISIBLE); - setViewVisibility(mSharedElementTargets.values(), View.INVISIBLE); - if (mTriggerEarly) { - beginEnterScene(); + TransitionManager.beginDelayedTransition(mContentParent, transition); + for (View hidden : enteringViews) { + hidden.setVisibility(View.VISIBLE); } observer.addOnPreDrawListener(this); } else { mHandler.postDelayed(this, MAX_TRANSITION_START_WAIT); - mActivityOptions.dispatchSceneTransitionStarted(this, - new ArrayList<String>(mSharedElementTargets.keySet())); + mActivityOptions.dispatchSceneTransitionStarted(this); } return true; } public void start() { - ViewTreeObserver observer = mDecor.getViewTreeObserver(); + ViewTreeObserver observer = mContentParent.getViewTreeObserver(); observer.addOnPreDrawListener(this); } @@ -4276,43 +4129,25 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } @Override - public void sharedElementTransitionComplete(Bundle transitionArgs) { + public void sharedElementTransitionComplete() { if (!mSharedElementReadyReceived) { mSharedElementReadyReceived = true; mHandler.removeCallbacks(this); mHandler.postDelayed(this, MAX_TRANSITION_FINISH_WAIT); - if (!mSharedElementTargets.isEmpty()) { - Transition transition = getTransitionManager().getEnterTransition( - mContentScene); - if (transition == null) { - transition = TransitionManager.getDefaultTransition(); - } - transition = transition.clone(); - if (transitionArgs == null) { - TransitionManager.beginDelayedTransition(mDecor, transition); - setViewVisibility(mSharedElementTargets.values(), View.VISIBLE); - } else { - int[] tempLoc = new int[2]; - for (Map.Entry<String, View> entry: mSharedElementTargets.entrySet()) { - setSharedElementState(entry.getValue(), entry.getKey(), transitionArgs, - tempLoc); - } - setViewVisibility(mSharedElementTargets.values(), View.VISIBLE); - mSceneTransitionListener.sharedElementStart(transition); - mDecor.getViewTreeObserver().addOnPreDrawListener( - new ViewTreeObserver.OnPreDrawListener() { - @Override - public boolean onPreDraw() { - mDecor.getViewTreeObserver().removeOnPreDrawListener(this); - mSceneTransitionListener.sharedElementEnd(); - mActivityOptions.dispatchSharedElementsReady(); - return true; - } - }); - TransitionManager.beginDelayedTransition(mDecor, transition); - } + for (View sharedElement: mSharedElements) { + sharedElement.setVisibility(View.VISIBLE); } - if (mTriggerEarly) { + mSharedElements.clear(); + mContentParent.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { + @Override + public boolean onPreDraw() { + mContentParent.getViewTreeObserver().removeOnPreDrawListener(this); + mSceneTransitionListener.enterSharedElement( + mActivityOptions.getSceneTransitionArgs()); + return false; + } + }); + if (mFadeEarly) { fadeInBackground(); } } @@ -4335,10 +4170,9 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { return; } mAllDone = true; - sharedElementTransitionComplete(null); + sharedElementTransitionComplete(); mHandler.removeCallbacks(this); - if (!mTriggerEarly) { - beginEnterScene(); + if (!mFadeEarly) { fadeInBackground(); } } @@ -4359,14 +4193,5 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { @Override public void onAnimationRepeat(Animator animation) { } - - private void beginEnterScene() { - Transition transition = getTransitionManager().getEnterTransition(mContentScene); - if (transition == null) { - transition = TransitionManager.getDefaultTransition().clone(); - } - TransitionManager.beginDelayedTransition(mDecor, transition); - setViewVisibility(mEnteringViews, View.VISIBLE); - } } } |