Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b5ef7f8c authored by George Mount's avatar George Mount
Browse files

Don't change View visibility during activity transitions.

Bug 16187776

Changing View visibility can change the View's focused item.
To prevent this, a backdoor is introduced into Transition
and Visiblity to set the target Visibility used in Activity Transitions.

Change-Id: Idfd2c6fba2cad80fecdfd086990ddc604f86ca68
parent 2e3f2c67
Loading
Loading
Loading
Loading
+7 −8
Original line number Diff line number Diff line
@@ -280,14 +280,6 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {

    public ArrayList<String> getAllSharedElementNames() { return mAllSharedElementNames; }

    public static void setViewVisibility(Collection<View> views, int visibility) {
        if (views != null) {
            for (View view : views) {
                view.setVisibility(visibility);
            }
        }
    }

    protected Transition setTargets(Transition transition, boolean add) {
        if (transition == null || (add &&
                (mTransitioningViews == null || mTransitioningViews.isEmpty()))) {
@@ -531,6 +523,13 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
        return getWindow().getTransitionBackgroundFadeDuration();
    }

    protected static void setTransitionAlpha(ArrayList<View> views, float alpha) {
        int numSharedElements = views.size();
        for (int i = 0; i < numSharedElements; i++) {
            views.get(i).setTransitionAlpha(alpha);
        }
    }

    /**
     * Captures placement information for Views with a shared element name for
     * Activity Transitions.
+6 −12
Original line number Diff line number Diff line
@@ -104,9 +104,9 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
            mHandler.sendEmptyMessageDelayed(MSG_CANCEL, MAX_WAIT_MS);
            send(MSG_SEND_SHARED_ELEMENT_DESTINATION, null);
        }
        setViewVisibility(mSharedElements, View.INVISIBLE);
        setTransitionAlpha(mSharedElements, 0);
        if (getViewsTransition() != null) {
            setViewVisibility(mTransitioningViews, View.INVISIBLE);
            setTransitionAlpha(mTransitioningViews, 0);
        }
        if (mSharedElementsBundle != null) {
            onTakeSharedElements();
@@ -221,7 +221,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
        if (!mIsCanceled) {
            mIsCanceled = true;
            if (getViewsTransition() == null || mIsViewsTransitionStarted) {
                setViewVisibility(mSharedElements, View.VISIBLE);
                setTransitionAlpha(mSharedElements, 1);
            } else {
                mTransitioningViews.addAll(mSharedElements);
            }
@@ -281,7 +281,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
        // Now start shared element transition
        ArrayList<View> sharedElementSnapshots = createSnapshots(sharedElementState,
                mSharedElementNames);
        setViewVisibility(mSharedElements, View.VISIBLE);
        setTransitionAlpha(mSharedElements, 1);
        ArrayMap<ImageView, Pair<ImageView.ScaleType, Matrix>> originalImageViewState =
                setSharedElementState(sharedElementState, sharedElementSnapshots);
        requestLayoutForSharedElements();
@@ -314,13 +314,6 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
        }
    }

    @Override
    protected void stripOffscreenViews() {
        setViewVisibility(mTransitioningViews, View.VISIBLE);
        super.stripOffscreenViews();
        setViewVisibility(mTransitioningViews, View.INVISIBLE);
    }

    private void onTakeSharedElements() {
        if (!mIsReadyForTransition || mSharedElementsBundle == null) {
            return;
@@ -362,6 +355,8 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
            viewsTransition = configureTransition(getViewsTransition(), true);
            if (viewsTransition != null) {
                stripOffscreenViews();
                viewsTransition.forceVisibility(View.INVISIBLE, true);
                setTransitionAlpha(mTransitioningViews, 1);
            }
        }
        mIsViewsTransitionStarted = mIsViewsTransitionStarted || startEnterTransition;
@@ -405,7 +400,6 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
    }

    private void startEnterTransition(Transition transition) {
        setViewVisibility(mTransitioningViews, View.VISIBLE);
        if (!mIsReturning) {
            Drawable background = getDecor().getBackground();
            if (background != null) {
+14 −8
Original line number Diff line number Diff line
@@ -68,6 +68,8 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {

    private boolean mIsExitStarted;

    private boolean mSharedElementsHidden;

    public ExitTransitionCoordinator(Activity activity, ArrayList<String> names,
            ArrayList<String> accepted, ArrayList<View> mapped, boolean isReturning) {
        super(activity.getWindow(), names, getListener(activity, isReturning),
@@ -113,8 +115,8 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
    }

    public void resetViews() {
        setViewVisibility(mTransitioningViews, View.VISIBLE);
        setViewVisibility(mSharedElements, View.VISIBLE);
        setTransitionAlpha(mTransitioningViews, 1);
        setTransitionAlpha(mSharedElements, 1);
        mIsHidden = true;
        clearState();
    }
@@ -161,8 +163,9 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {

    private void hideSharedElements() {
        if (!mIsHidden) {
            setViewVisibility(mSharedElements, View.INVISIBLE);
            setTransitionAlpha(mSharedElements, 0);
        }
        mSharedElementsHidden = true;
        finishIfNecessary();
    }

@@ -175,7 +178,6 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
                    beginTransitions();
                }
            });
            setViewVisibility(mTransitioningViews, View.INVISIBLE);
        }
    }

@@ -219,7 +221,7 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
        Transition transition = getExitTransition();
        if (transition != null) {
            TransitionManager.beginDelayedTransition(getDecor(), transition);
            setViewVisibility(mTransitioningViews, View.INVISIBLE);
            mTransitioningViews.get(0).invalidate();
        }
    }

@@ -241,6 +243,8 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
                });
                mBackgroundAnimator.setDuration(getFadeDuration());
                mBackgroundAnimator.start();
            } else {
                mIsBackgroundReady = true;
            }
        }
    }
@@ -259,7 +263,7 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
                    transition.removeListener(this);
                    exitTransitionComplete();
                    if (mIsHidden) {
                        setViewVisibility(mTransitioningViews, View.VISIBLE);
                        setTransitionAlpha(mTransitioningViews, 1);
                    }
                }

@@ -268,6 +272,7 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
                    super.onTransitionCancel(transition);
                }
            });
            viewsTransition.forceVisibility(View.INVISIBLE, false);
        }
        return viewsTransition;
    }
@@ -286,7 +291,7 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
                    transition.removeListener(this);
                    sharedElementTransitionComplete();
                    if (mIsHidden) {
                        setViewVisibility(mSharedElements, View.VISIBLE);
                        setTransitionAlpha(mSharedElements, 1);
                    }
                }
            });
@@ -302,6 +307,7 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
        Transition transition = mergeTransitions(sharedElementTransition, viewsTransition);
        if (transition != null) {
            TransitionManager.beginDelayedTransition(getDecor(), transition);
            getDecor().invalidate();
        }
    }

@@ -353,7 +359,7 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {

    private void finishIfNecessary() {
        if (mIsReturning && mExitNotified && mActivity != null && (mSharedElements.isEmpty() ||
                mSharedElements.get(0).getVisibility() == View.INVISIBLE)) {
                mSharedElementsHidden)) {
            finish();
        }
        if (!mIsReturning && mExitNotified) {
+3 −2
Original line number Diff line number Diff line
@@ -310,7 +310,8 @@ public class ChangeBounds extends Transition {
                Canvas canvas = new Canvas(bitmap);
                view.draw(canvas);
                final BitmapDrawable drawable = new BitmapDrawable(bitmap);
                view.setVisibility(View.INVISIBLE);
                final float transitionAlpha = view.getTransitionAlpha();
                view.setTransitionAlpha(0);
                sceneRoot.getOverlay().add(drawable);
                Path topLeftPath = getPathMotion().getPath(startX - tempLocation[0],
                        startY - tempLocation[1], endX - tempLocation[0], endY - tempLocation[1]);
@@ -321,7 +322,7 @@ public class ChangeBounds extends Transition {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        sceneRoot.getOverlay().remove(drawable);
                        view.setVisibility(View.VISIBLE);
                        view.setTransitionAlpha(transitionAlpha);
                    }
                });
                return anim;
+3 −0
Original line number Diff line number Diff line
@@ -2037,6 +2037,9 @@ public abstract class Transition implements Cloneable {
        return mNameOverrides;
    }

    /** @hide */
    public void forceVisibility(int visibility, boolean isStartValue) {}

    @Override
    public String toString() {
        return toString("");
Loading