DetailsOverviewSharedElementHelper.java revision 4121f22713bbed467a977ec0d867ef53989ff374
1/* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 * in compliance with the License. You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software distributed under the License 10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 * or implied. See the License for the specific language governing permissions and limitations under 12 * the License. 13 */ 14package android.support.v17.leanback.widget; 15 16import android.support.v4.app.ActivityCompat; 17import android.support.v4.app.SharedElementListener; 18import android.support.v4.view.ViewCompat; 19import android.support.v17.leanback.widget.DetailsOverviewRowPresenter.ViewHolder; 20 21import android.app.Activity; 22import android.text.TextUtils; 23import android.view.View; 24import android.view.View.MeasureSpec; 25 26import java.util.List; 27 28final class DetailsOverviewSharedElementHelper extends SharedElementListener { 29 30 private ViewHolder mViewHolder; 31 private Activity mActivityToRunTransition; 32 private String mSharedElementName; 33 private int mRightPanelWidth; 34 private int mRightPanelHeight; 35 36 @Override 37 public void setSharedElementStart(List<String> sharedElementNames, 38 List<View> sharedElements, List<View> sharedElementSnapshots) { 39 if (sharedElements.size() < 1) { 40 return; 41 } 42 View overviewView = sharedElements.get(0); 43 if (mViewHolder == null || mViewHolder.mOverviewView != overviewView) { 44 return; 45 } 46 View imageView = mViewHolder.mImageView; 47 final int width = overviewView.getWidth(); 48 final int height = overviewView.getHeight(); 49 imageView.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), 50 MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)); 51 imageView.layout(0, 0, width, height); 52 View rightPanel = mViewHolder.mRightPanel; 53 if (mRightPanelWidth != 0 && mRightPanelHeight != 0) { 54 rightPanel.measure(MeasureSpec.makeMeasureSpec(mRightPanelWidth, MeasureSpec.EXACTLY), 55 MeasureSpec.makeMeasureSpec(mRightPanelHeight, MeasureSpec.EXACTLY)); 56 rightPanel.layout(width, rightPanel.getTop(), width + mRightPanelWidth, 57 rightPanel.getTop() + mRightPanelHeight); 58 } else { 59 rightPanel.offsetLeftAndRight(width - rightPanel.getLeft()); 60 } 61 } 62 63 void setSharedElementEnterTransition(Activity activity, String sharedElementName) { 64 if (activity == null && !TextUtils.isEmpty(sharedElementName) || 65 activity != null && TextUtils.isEmpty(sharedElementName)) { 66 throw new IllegalArgumentException(); 67 } 68 if (activity == mActivityToRunTransition && 69 TextUtils.equals(sharedElementName, mSharedElementName)) { 70 return; 71 } 72 if (mActivityToRunTransition != null) { 73 ActivityCompat.setEnterSharedElementListener(mActivityToRunTransition, null); 74 } 75 mActivityToRunTransition = activity; 76 mSharedElementName = sharedElementName; 77 if (mActivityToRunTransition != null) { 78 ActivityCompat.setEnterSharedElementListener(mActivityToRunTransition, this); 79 ActivityCompat.postponeEnterTransition(mActivityToRunTransition); 80 } 81 } 82 83 void onBindToDrawable(ViewHolder vh) { 84 // After we got a image drawable, we can determine size of right panel. 85 // We want right panel to have fixed size so that the right panel don't change size 86 // when the overview is layout as a small bounds in transition. 87 mViewHolder = vh; 88 mViewHolder.mRightPanel.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { 89 @Override 90 public void onLayoutChange(View v, int left, int top, int right, int bottom, 91 int oldLeft, int oldTop, int oldRight, int oldBottom) { 92 mViewHolder.mRightPanel.removeOnLayoutChangeListener(this); 93 mRightPanelWidth = mViewHolder.mRightPanel.getWidth(); 94 mRightPanelHeight = mViewHolder.mRightPanel.getHeight(); 95 } 96 }); 97 if (mActivityToRunTransition != null) { 98 mViewHolder.mRightPanel.postOnAnimation(new Runnable() { 99 @Override 100 public void run() { 101 ViewCompat.setTransitionName(mViewHolder.mOverviewView, mSharedElementName); 102 ActivityCompat.startPostponedEnterTransition(mActivityToRunTransition); 103 mActivityToRunTransition = null; 104 mSharedElementName = null; 105 } 106 }); 107 } 108 } 109} 110