DetailsOverviewSharedElementHelper.java revision b81a2943b9e150c6caca969e62c5375928c4cd1c
14121f22713bbed467a977ec0d867ef53989ff374Dake Gu/*
24121f22713bbed467a977ec0d867ef53989ff374Dake Gu * Copyright (C) 2014 The Android Open Source Project
34121f22713bbed467a977ec0d867ef53989ff374Dake Gu *
44121f22713bbed467a977ec0d867ef53989ff374Dake Gu * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
54121f22713bbed467a977ec0d867ef53989ff374Dake Gu * in compliance with the License. You may obtain a copy of the License at
64121f22713bbed467a977ec0d867ef53989ff374Dake Gu *
74121f22713bbed467a977ec0d867ef53989ff374Dake Gu * http://www.apache.org/licenses/LICENSE-2.0
84121f22713bbed467a977ec0d867ef53989ff374Dake Gu *
94121f22713bbed467a977ec0d867ef53989ff374Dake Gu * Unless required by applicable law or agreed to in writing, software distributed under the License
104121f22713bbed467a977ec0d867ef53989ff374Dake Gu * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
114121f22713bbed467a977ec0d867ef53989ff374Dake Gu * or implied. See the License for the specific language governing permissions and limitations under
124121f22713bbed467a977ec0d867ef53989ff374Dake Gu * the License.
134121f22713bbed467a977ec0d867ef53989ff374Dake Gu */
144121f22713bbed467a977ec0d867ef53989ff374Dake Gupackage android.support.v17.leanback.widget;
154121f22713bbed467a977ec0d867ef53989ff374Dake Gu
16d391b19d1bf663ce300b0f4550e6fbaa7e12b0d4Dake Guimport android.os.Handler;
174121f22713bbed467a977ec0d867ef53989ff374Dake Guimport android.support.v4.app.ActivityCompat;
189306f07b1d66f4974a81f781d29739b30124fff0George Mountimport android.support.v4.app.SharedElementCallback;
194121f22713bbed467a977ec0d867ef53989ff374Dake Guimport android.support.v4.view.ViewCompat;
20ceb7ab2ddd6e157cd4ade0f14a382c39428163c4Dake Guimport android.support.v17.leanback.R;
2195400e6d31a1ac09e48cb8944a79b7250484aa4cDake Guimport android.support.v17.leanback.transition.TransitionListener;
2295400e6d31a1ac09e48cb8944a79b7250484aa4cDake Guimport android.support.v17.leanback.transition.TransitionHelper;
234121f22713bbed467a977ec0d867ef53989ff374Dake Guimport android.support.v17.leanback.widget.DetailsOverviewRowPresenter.ViewHolder;
244121f22713bbed467a977ec0d867ef53989ff374Dake Guimport android.app.Activity;
25b81a2943b9e150c6caca969e62c5375928c4cd1cDake Guimport android.content.Intent;
26b81a2943b9e150c6caca969e62c5375928c4cd1cDake Guimport android.graphics.Matrix;
274121f22713bbed467a977ec0d867ef53989ff374Dake Guimport android.text.TextUtils;
28b81a2943b9e150c6caca969e62c5375928c4cd1cDake Guimport android.util.Log;
294121f22713bbed467a977ec0d867ef53989ff374Dake Guimport android.view.View;
3095400e6d31a1ac09e48cb8944a79b7250484aa4cDake Guimport android.view.ViewGroup;
314121f22713bbed467a977ec0d867ef53989ff374Dake Guimport android.view.View.MeasureSpec;
32b81a2943b9e150c6caca969e62c5375928c4cd1cDake Guimport android.widget.ImageView;
33b81a2943b9e150c6caca969e62c5375928c4cd1cDake Guimport android.widget.ImageView.ScaleType;
344121f22713bbed467a977ec0d867ef53989ff374Dake Gu
354121f22713bbed467a977ec0d867ef53989ff374Dake Guimport java.util.List;
364121f22713bbed467a977ec0d867ef53989ff374Dake Gu
379306f07b1d66f4974a81f781d29739b30124fff0George Mountfinal class DetailsOverviewSharedElementHelper extends SharedElementCallback {
384121f22713bbed467a977ec0d867ef53989ff374Dake Gu
39b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu    private static final String TAG = "DetailsOverviewSharedElementHelper";
40b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu    private static final boolean DEBUG = false;
41b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu
424121f22713bbed467a977ec0d867ef53989ff374Dake Gu    private ViewHolder mViewHolder;
434121f22713bbed467a977ec0d867ef53989ff374Dake Gu    private Activity mActivityToRunTransition;
444121f22713bbed467a977ec0d867ef53989ff374Dake Gu    private String mSharedElementName;
454121f22713bbed467a977ec0d867ef53989ff374Dake Gu    private int mRightPanelWidth;
464121f22713bbed467a977ec0d867ef53989ff374Dake Gu    private int mRightPanelHeight;
474121f22713bbed467a977ec0d867ef53989ff374Dake Gu
48b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu    private ScaleType mSavedScaleType;
49b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu    private Matrix mSavedMatrix;
50b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu
51b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu    private boolean hasImageViewScaleChange(View snapshotView) {
52b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu        return snapshotView instanceof ImageView;
53b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu    }
54b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu
55b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu    private void saveImageViewScale() {
56b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu        if (mSavedScaleType == null) {
57b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu            // only save first time after initialize/restoreImageViewScale()
58b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu            ImageView imageView = mViewHolder.mImageView;
59b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu            mSavedScaleType = imageView.getScaleType();
60b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu            mSavedMatrix = mSavedScaleType == ScaleType.MATRIX ? imageView.getMatrix() : null;
61b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu            if (DEBUG) {
62b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu                Log.d(TAG, "saveImageViewScale: "+mSavedScaleType);
63b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu            }
64b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu        }
65b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu    }
66b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu
67b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu    private static void updateImageViewAfterScaleTypeChange(ImageView imageView) {
68b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu        // enforcing imageView to update its internal bounds/matrix immediately
69b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu        imageView.measure(
70b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu                MeasureSpec.makeMeasureSpec(imageView.getMeasuredWidth(), MeasureSpec.EXACTLY),
71b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu                MeasureSpec.makeMeasureSpec(imageView.getMeasuredHeight(), MeasureSpec.EXACTLY));
72b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu        imageView.layout(imageView.getLeft(), imageView.getTop(),
73b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu                imageView.getRight(), imageView.getBottom());
74b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu    }
75b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu
76b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu    private void changeImageViewScale(View snapshotView) {
77b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu        ImageView snapshotImageView = (ImageView) snapshotView;
78b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu        ImageView imageView = mViewHolder.mImageView;
79b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu        if (DEBUG) {
80b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu            Log.d(TAG, "changeImageViewScale to "+snapshotImageView.getScaleType());
81b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu        }
82b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu        imageView.setScaleType(snapshotImageView.getScaleType());
83b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu        if (snapshotImageView.getScaleType() == ScaleType.MATRIX) {
84b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu            imageView.setImageMatrix(snapshotImageView.getImageMatrix());
85b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu        }
86b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu        updateImageViewAfterScaleTypeChange(imageView);
87b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu    }
88b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu
89b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu    private void restoreImageViewScale() {
90b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu        if (mSavedScaleType != null) {
91b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu            if (DEBUG) {
92b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu                Log.d(TAG, "restoreImageViewScale to "+mSavedScaleType);
93b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu            }
94b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu            ImageView imageView = mViewHolder.mImageView;
95b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu            imageView.setScaleType(mSavedScaleType);
96b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu            if (mSavedScaleType == ScaleType.MATRIX) {
97b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu                imageView.setImageMatrix(mSavedMatrix);
98b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu            }
99b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu            // only restore once unless another save happens
100b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu            mSavedScaleType = null;
101b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu            updateImageViewAfterScaleTypeChange(imageView);
102b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu        }
103b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu    }
104b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu
1054121f22713bbed467a977ec0d867ef53989ff374Dake Gu    @Override
1069306f07b1d66f4974a81f781d29739b30124fff0George Mount    public void onSharedElementStart(List<String> sharedElementNames,
1074121f22713bbed467a977ec0d867ef53989ff374Dake Gu            List<View> sharedElements, List<View> sharedElementSnapshots) {
1084121f22713bbed467a977ec0d867ef53989ff374Dake Gu        if (sharedElements.size() < 1) {
1094121f22713bbed467a977ec0d867ef53989ff374Dake Gu            return;
1104121f22713bbed467a977ec0d867ef53989ff374Dake Gu        }
1114121f22713bbed467a977ec0d867ef53989ff374Dake Gu        View overviewView = sharedElements.get(0);
112e7b29b745f6562b43ad79074cf5445a26cd4073cDake Gu        if (mViewHolder == null || mViewHolder.mOverviewFrame != overviewView) {
1134121f22713bbed467a977ec0d867ef53989ff374Dake Gu            return;
1144121f22713bbed467a977ec0d867ef53989ff374Dake Gu        }
115b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu        View snapshot = sharedElementSnapshots.get(0);
116b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu        if (hasImageViewScaleChange(snapshot)) {
117b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu            saveImageViewScale();
118b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu            changeImageViewScale(snapshot);
119b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu        }
1204121f22713bbed467a977ec0d867ef53989ff374Dake Gu        View imageView = mViewHolder.mImageView;
1214121f22713bbed467a977ec0d867ef53989ff374Dake Gu        final int width = overviewView.getWidth();
1224121f22713bbed467a977ec0d867ef53989ff374Dake Gu        final int height = overviewView.getHeight();
1234121f22713bbed467a977ec0d867ef53989ff374Dake Gu        imageView.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
1244121f22713bbed467a977ec0d867ef53989ff374Dake Gu                MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
1254121f22713bbed467a977ec0d867ef53989ff374Dake Gu        imageView.layout(0, 0, width, height);
126b0181a77ce38f75a7d218745a330c5d80daacfb6Dake Gu        final View rightPanel = mViewHolder.mRightPanel;
1274121f22713bbed467a977ec0d867ef53989ff374Dake Gu        if (mRightPanelWidth != 0 && mRightPanelHeight != 0) {
1284121f22713bbed467a977ec0d867ef53989ff374Dake Gu            rightPanel.measure(MeasureSpec.makeMeasureSpec(mRightPanelWidth, MeasureSpec.EXACTLY),
1294121f22713bbed467a977ec0d867ef53989ff374Dake Gu                    MeasureSpec.makeMeasureSpec(mRightPanelHeight, MeasureSpec.EXACTLY));
1304121f22713bbed467a977ec0d867ef53989ff374Dake Gu            rightPanel.layout(width, rightPanel.getTop(), width + mRightPanelWidth,
1314121f22713bbed467a977ec0d867ef53989ff374Dake Gu                    rightPanel.getTop() + mRightPanelHeight);
1324121f22713bbed467a977ec0d867ef53989ff374Dake Gu        } else {
1334121f22713bbed467a977ec0d867ef53989ff374Dake Gu            rightPanel.offsetLeftAndRight(width - rightPanel.getLeft());
1344121f22713bbed467a977ec0d867ef53989ff374Dake Gu        }
13572a2146f4c3e6dbb84a5f9f92e7ab42d142dab04Dake Gu        mViewHolder.mActionsRow.setVisibility(View.INVISIBLE);
13672a2146f4c3e6dbb84a5f9f92e7ab42d142dab04Dake Gu        mViewHolder.mDetailsDescriptionFrame.setVisibility(View.INVISIBLE);
137b0181a77ce38f75a7d218745a330c5d80daacfb6Dake Gu    }
138b0181a77ce38f75a7d218745a330c5d80daacfb6Dake Gu
139b0181a77ce38f75a7d218745a330c5d80daacfb6Dake Gu    @Override
1409306f07b1d66f4974a81f781d29739b30124fff0George Mount    public void onSharedElementEnd(List<String> sharedElementNames,
141b0181a77ce38f75a7d218745a330c5d80daacfb6Dake Gu            List<View> sharedElements, List<View> sharedElementSnapshots) {
142b0181a77ce38f75a7d218745a330c5d80daacfb6Dake Gu        if (sharedElements.size() < 1) {
143b0181a77ce38f75a7d218745a330c5d80daacfb6Dake Gu            return;
144b0181a77ce38f75a7d218745a330c5d80daacfb6Dake Gu        }
145b0181a77ce38f75a7d218745a330c5d80daacfb6Dake Gu        View overviewView = sharedElements.get(0);
146e7b29b745f6562b43ad79074cf5445a26cd4073cDake Gu        if (mViewHolder == null || mViewHolder.mOverviewFrame != overviewView) {
147b0181a77ce38f75a7d218745a330c5d80daacfb6Dake Gu            return;
148b0181a77ce38f75a7d218745a330c5d80daacfb6Dake Gu        }
149b81a2943b9e150c6caca969e62c5375928c4cd1cDake Gu        restoreImageViewScale();
15095400e6d31a1ac09e48cb8944a79b7250484aa4cDake Gu        // temporary let action row take focus so we defer button background animation
15195400e6d31a1ac09e48cb8944a79b7250484aa4cDake Gu        mViewHolder.mActionsRow.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
15272a2146f4c3e6dbb84a5f9f92e7ab42d142dab04Dake Gu        mViewHolder.mActionsRow.setVisibility(View.VISIBLE);
15395400e6d31a1ac09e48cb8944a79b7250484aa4cDake Gu        mViewHolder.mActionsRow.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
15472a2146f4c3e6dbb84a5f9f92e7ab42d142dab04Dake Gu        mViewHolder.mDetailsDescriptionFrame.setVisibility(View.VISIBLE);
1554121f22713bbed467a977ec0d867ef53989ff374Dake Gu    }
1564121f22713bbed467a977ec0d867ef53989ff374Dake Gu
157d391b19d1bf663ce300b0f4550e6fbaa7e12b0d4Dake Gu    void setSharedElementEnterTransition(Activity activity, String sharedElementName,
158d391b19d1bf663ce300b0f4550e6fbaa7e12b0d4Dake Gu            long timeoutMs) {
1594121f22713bbed467a977ec0d867ef53989ff374Dake Gu        if (activity == null && !TextUtils.isEmpty(sharedElementName) ||
1604121f22713bbed467a977ec0d867ef53989ff374Dake Gu                activity != null && TextUtils.isEmpty(sharedElementName)) {
1614121f22713bbed467a977ec0d867ef53989ff374Dake Gu            throw new IllegalArgumentException();
1624121f22713bbed467a977ec0d867ef53989ff374Dake Gu        }
1634121f22713bbed467a977ec0d867ef53989ff374Dake Gu        if (activity == mActivityToRunTransition &&
1644121f22713bbed467a977ec0d867ef53989ff374Dake Gu                TextUtils.equals(sharedElementName, mSharedElementName)) {
1654121f22713bbed467a977ec0d867ef53989ff374Dake Gu            return;
1664121f22713bbed467a977ec0d867ef53989ff374Dake Gu        }
1674121f22713bbed467a977ec0d867ef53989ff374Dake Gu        if (mActivityToRunTransition != null) {
1689306f07b1d66f4974a81f781d29739b30124fff0George Mount            ActivityCompat.setEnterSharedElementCallback(mActivityToRunTransition, null);
1694121f22713bbed467a977ec0d867ef53989ff374Dake Gu        }
1704121f22713bbed467a977ec0d867ef53989ff374Dake Gu        mActivityToRunTransition = activity;
1714121f22713bbed467a977ec0d867ef53989ff374Dake Gu        mSharedElementName = sharedElementName;
1724121f22713bbed467a977ec0d867ef53989ff374Dake Gu        if (mActivityToRunTransition != null) {
1739306f07b1d66f4974a81f781d29739b30124fff0George Mount            ActivityCompat.setEnterSharedElementCallback(mActivityToRunTransition, this);
1744121f22713bbed467a977ec0d867ef53989ff374Dake Gu            ActivityCompat.postponeEnterTransition(mActivityToRunTransition);
175d391b19d1bf663ce300b0f4550e6fbaa7e12b0d4Dake Gu            if (timeoutMs > 0) {
176d391b19d1bf663ce300b0f4550e6fbaa7e12b0d4Dake Gu                new Handler().postDelayed(new Runnable() {
177ceb7ab2ddd6e157cd4ade0f14a382c39428163c4Dake Gu                    @Override
178d391b19d1bf663ce300b0f4550e6fbaa7e12b0d4Dake Gu                    public void run() {
179d391b19d1bf663ce300b0f4550e6fbaa7e12b0d4Dake Gu                        if (mActivityToRunTransition == null) {
180d391b19d1bf663ce300b0f4550e6fbaa7e12b0d4Dake Gu                            return;
18195400e6d31a1ac09e48cb8944a79b7250484aa4cDake Gu                        }
182d391b19d1bf663ce300b0f4550e6fbaa7e12b0d4Dake Gu                        ActivityCompat.startPostponedEnterTransition(mActivityToRunTransition);
183d391b19d1bf663ce300b0f4550e6fbaa7e12b0d4Dake Gu                        mActivityToRunTransition = null;
18495400e6d31a1ac09e48cb8944a79b7250484aa4cDake Gu                    }
185d391b19d1bf663ce300b0f4550e6fbaa7e12b0d4Dake Gu                }, timeoutMs);
18695400e6d31a1ac09e48cb8944a79b7250484aa4cDake Gu            }
1874121f22713bbed467a977ec0d867ef53989ff374Dake Gu        }
1884121f22713bbed467a977ec0d867ef53989ff374Dake Gu    }
1894121f22713bbed467a977ec0d867ef53989ff374Dake Gu
1904121f22713bbed467a977ec0d867ef53989ff374Dake Gu    void onBindToDrawable(ViewHolder vh) {
1914121f22713bbed467a977ec0d867ef53989ff374Dake Gu        // After we got a image drawable,  we can determine size of right panel.
1924121f22713bbed467a977ec0d867ef53989ff374Dake Gu        // We want right panel to have fixed size so that the right panel don't change size
1934121f22713bbed467a977ec0d867ef53989ff374Dake Gu        // when the overview is layout as a small bounds in transition.
1944121f22713bbed467a977ec0d867ef53989ff374Dake Gu        mViewHolder = vh;
1954121f22713bbed467a977ec0d867ef53989ff374Dake Gu        mViewHolder.mRightPanel.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
1964121f22713bbed467a977ec0d867ef53989ff374Dake Gu            @Override
1974121f22713bbed467a977ec0d867ef53989ff374Dake Gu            public void onLayoutChange(View v, int left, int top, int right, int bottom,
1984121f22713bbed467a977ec0d867ef53989ff374Dake Gu                    int oldLeft, int oldTop, int oldRight, int oldBottom) {
1994121f22713bbed467a977ec0d867ef53989ff374Dake Gu                mViewHolder.mRightPanel.removeOnLayoutChangeListener(this);
2004121f22713bbed467a977ec0d867ef53989ff374Dake Gu                mRightPanelWidth = mViewHolder.mRightPanel.getWidth();
2014121f22713bbed467a977ec0d867ef53989ff374Dake Gu                mRightPanelHeight = mViewHolder.mRightPanel.getHeight();
2024121f22713bbed467a977ec0d867ef53989ff374Dake Gu            }
2034121f22713bbed467a977ec0d867ef53989ff374Dake Gu        });
2044121f22713bbed467a977ec0d867ef53989ff374Dake Gu        if (mActivityToRunTransition != null) {
2054121f22713bbed467a977ec0d867ef53989ff374Dake Gu            mViewHolder.mRightPanel.postOnAnimation(new Runnable() {
2064121f22713bbed467a977ec0d867ef53989ff374Dake Gu                @Override
2074121f22713bbed467a977ec0d867ef53989ff374Dake Gu                public void run() {
208f4482e64217e38c0ad8f344da0e90e9e1cf3aa11Dake Gu                    if (mActivityToRunTransition == null) {
209f4482e64217e38c0ad8f344da0e90e9e1cf3aa11Dake Gu                        return;
210f4482e64217e38c0ad8f344da0e90e9e1cf3aa11Dake Gu                    }
211d391b19d1bf663ce300b0f4550e6fbaa7e12b0d4Dake Gu                    final TransitionHelper transitionHelper = TransitionHelper.getInstance();
212d391b19d1bf663ce300b0f4550e6fbaa7e12b0d4Dake Gu                    Object transition = transitionHelper.getSharedElementEnterTransition(
213d391b19d1bf663ce300b0f4550e6fbaa7e12b0d4Dake Gu                            mActivityToRunTransition.getWindow());
214d391b19d1bf663ce300b0f4550e6fbaa7e12b0d4Dake Gu                    if (transition != null) {
215d391b19d1bf663ce300b0f4550e6fbaa7e12b0d4Dake Gu                        transitionHelper.setTransitionListener(transition, new TransitionListener() {
216d391b19d1bf663ce300b0f4550e6fbaa7e12b0d4Dake Gu                            @Override
217d391b19d1bf663ce300b0f4550e6fbaa7e12b0d4Dake Gu                            public void onTransitionEnd(Object transition) {
218d391b19d1bf663ce300b0f4550e6fbaa7e12b0d4Dake Gu                                // after transition if the action row still focused, transfer
219d391b19d1bf663ce300b0f4550e6fbaa7e12b0d4Dake Gu                                // focus to its children
220d391b19d1bf663ce300b0f4550e6fbaa7e12b0d4Dake Gu                                if (mViewHolder.mActionsRow.isFocused()) {
221d391b19d1bf663ce300b0f4550e6fbaa7e12b0d4Dake Gu                                    mViewHolder.mActionsRow.requestFocus();
222d391b19d1bf663ce300b0f4550e6fbaa7e12b0d4Dake Gu                                }
223d391b19d1bf663ce300b0f4550e6fbaa7e12b0d4Dake Gu                                transitionHelper.setTransitionListener(transition, null);
224d391b19d1bf663ce300b0f4550e6fbaa7e12b0d4Dake Gu                            }
225d391b19d1bf663ce300b0f4550e6fbaa7e12b0d4Dake Gu                        });
226d391b19d1bf663ce300b0f4550e6fbaa7e12b0d4Dake Gu                    }
227e7b29b745f6562b43ad79074cf5445a26cd4073cDake Gu                    ViewCompat.setTransitionName(mViewHolder.mOverviewFrame, mSharedElementName);
2284121f22713bbed467a977ec0d867ef53989ff374Dake Gu                    ActivityCompat.startPostponedEnterTransition(mActivityToRunTransition);
2294121f22713bbed467a977ec0d867ef53989ff374Dake Gu                    mActivityToRunTransition = null;
2304121f22713bbed467a977ec0d867ef53989ff374Dake Gu                    mSharedElementName = null;
2314121f22713bbed467a977ec0d867ef53989ff374Dake Gu                }
2324121f22713bbed467a977ec0d867ef53989ff374Dake Gu            });
2334121f22713bbed467a977ec0d867ef53989ff374Dake Gu        }
2344121f22713bbed467a977ec0d867ef53989ff374Dake Gu    }
2354121f22713bbed467a977ec0d867ef53989ff374Dake Gu}
236