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

Commit 82ffc141 authored by George Mount's avatar George Mount
Browse files

Ensure views have been laid out before capturing the epicenter.

Bug 15992706

Change-Id: If245040b756882bcc82f56ef2c4563ce25c24e9e
parent 5acf640d
Loading
Loading
Loading
Loading
+24 −9
Original line number Diff line number Diff line
@@ -57,6 +57,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
    private boolean mIsReadyForTransition;
    private Bundle mSharedElementsBundle;
    private boolean mWasOpaque;
    private boolean mAreViewsReady;

    public EnterTransitionCoordinator(Activity activity, ResultReceiver resultReceiver,
            ArrayList<String> sharedElementNames, boolean isReturning) {
@@ -81,18 +82,11 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
    }

    public void viewInstancesReady(ArrayList<String> accepted, ArrayList<View> localViews) {
        if (mIsReadyForTransition) {
            return;
        }
        viewsReady(mapSharedElements(accepted, localViews));
        triggerViewsReady(mapSharedElements(accepted, localViews));
    }

    public void namedViewsReady(ArrayList<String> accepted, ArrayList<String> localNames) {
        if (mIsReadyForTransition) {
            return;
        }

        viewsReady(mapNamedElements(accepted, localNames));
        triggerViewsReady(mapNamedElements(accepted, localNames));
    }

    @Override
@@ -118,6 +112,27 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
        }
    }

    private void triggerViewsReady(final ArrayMap<String, View> sharedElements) {
        if (mAreViewsReady) {
            return;
        }
        mAreViewsReady = true;
        // Ensure the views have been laid out before capturing the views -- we need the epicenter.
        if (sharedElements.isEmpty() || !sharedElements.valueAt(0).isLayoutRequested()) {
            viewsReady(sharedElements);
        } else {
            sharedElements.valueAt(0).getViewTreeObserver()
                    .addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
                @Override
                public boolean onPreDraw() {
                    sharedElements.valueAt(0).getViewTreeObserver().removeOnPreDrawListener(this);
                    viewsReady(sharedElements);
                    return true;
                }
            });
        }
    }

    private ArrayMap<String, View> mapNamedElements(ArrayList<String> accepted,
            ArrayList<String> localNames) {
        ArrayMap<String, View> sharedElements = new ArrayMap<String, View>();