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