DetailsOverviewSharedElementHelper.java revision 4121f22713bbed467a977ec0d867ef53989ff374
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 164121f22713bbed467a977ec0d867ef53989ff374Dake Guimport android.support.v4.app.ActivityCompat; 174121f22713bbed467a977ec0d867ef53989ff374Dake Guimport android.support.v4.app.SharedElementListener; 184121f22713bbed467a977ec0d867ef53989ff374Dake Guimport android.support.v4.view.ViewCompat; 194121f22713bbed467a977ec0d867ef53989ff374Dake Guimport android.support.v17.leanback.widget.DetailsOverviewRowPresenter.ViewHolder; 204121f22713bbed467a977ec0d867ef53989ff374Dake Gu 214121f22713bbed467a977ec0d867ef53989ff374Dake Guimport android.app.Activity; 224121f22713bbed467a977ec0d867ef53989ff374Dake Guimport android.text.TextUtils; 234121f22713bbed467a977ec0d867ef53989ff374Dake Guimport android.view.View; 244121f22713bbed467a977ec0d867ef53989ff374Dake Guimport android.view.View.MeasureSpec; 254121f22713bbed467a977ec0d867ef53989ff374Dake Gu 264121f22713bbed467a977ec0d867ef53989ff374Dake Guimport java.util.List; 274121f22713bbed467a977ec0d867ef53989ff374Dake Gu 284121f22713bbed467a977ec0d867ef53989ff374Dake Gufinal class DetailsOverviewSharedElementHelper extends SharedElementListener { 294121f22713bbed467a977ec0d867ef53989ff374Dake Gu 304121f22713bbed467a977ec0d867ef53989ff374Dake Gu private ViewHolder mViewHolder; 314121f22713bbed467a977ec0d867ef53989ff374Dake Gu private Activity mActivityToRunTransition; 324121f22713bbed467a977ec0d867ef53989ff374Dake Gu private String mSharedElementName; 334121f22713bbed467a977ec0d867ef53989ff374Dake Gu private int mRightPanelWidth; 344121f22713bbed467a977ec0d867ef53989ff374Dake Gu private int mRightPanelHeight; 354121f22713bbed467a977ec0d867ef53989ff374Dake Gu 364121f22713bbed467a977ec0d867ef53989ff374Dake Gu @Override 374121f22713bbed467a977ec0d867ef53989ff374Dake Gu public void setSharedElementStart(List<String> sharedElementNames, 384121f22713bbed467a977ec0d867ef53989ff374Dake Gu List<View> sharedElements, List<View> sharedElementSnapshots) { 394121f22713bbed467a977ec0d867ef53989ff374Dake Gu if (sharedElements.size() < 1) { 404121f22713bbed467a977ec0d867ef53989ff374Dake Gu return; 414121f22713bbed467a977ec0d867ef53989ff374Dake Gu } 424121f22713bbed467a977ec0d867ef53989ff374Dake Gu View overviewView = sharedElements.get(0); 434121f22713bbed467a977ec0d867ef53989ff374Dake Gu if (mViewHolder == null || mViewHolder.mOverviewView != overviewView) { 444121f22713bbed467a977ec0d867ef53989ff374Dake Gu return; 454121f22713bbed467a977ec0d867ef53989ff374Dake Gu } 464121f22713bbed467a977ec0d867ef53989ff374Dake Gu View imageView = mViewHolder.mImageView; 474121f22713bbed467a977ec0d867ef53989ff374Dake Gu final int width = overviewView.getWidth(); 484121f22713bbed467a977ec0d867ef53989ff374Dake Gu final int height = overviewView.getHeight(); 494121f22713bbed467a977ec0d867ef53989ff374Dake Gu imageView.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), 504121f22713bbed467a977ec0d867ef53989ff374Dake Gu MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)); 514121f22713bbed467a977ec0d867ef53989ff374Dake Gu imageView.layout(0, 0, width, height); 524121f22713bbed467a977ec0d867ef53989ff374Dake Gu View rightPanel = mViewHolder.mRightPanel; 534121f22713bbed467a977ec0d867ef53989ff374Dake Gu if (mRightPanelWidth != 0 && mRightPanelHeight != 0) { 544121f22713bbed467a977ec0d867ef53989ff374Dake Gu rightPanel.measure(MeasureSpec.makeMeasureSpec(mRightPanelWidth, MeasureSpec.EXACTLY), 554121f22713bbed467a977ec0d867ef53989ff374Dake Gu MeasureSpec.makeMeasureSpec(mRightPanelHeight, MeasureSpec.EXACTLY)); 564121f22713bbed467a977ec0d867ef53989ff374Dake Gu rightPanel.layout(width, rightPanel.getTop(), width + mRightPanelWidth, 574121f22713bbed467a977ec0d867ef53989ff374Dake Gu rightPanel.getTop() + mRightPanelHeight); 584121f22713bbed467a977ec0d867ef53989ff374Dake Gu } else { 594121f22713bbed467a977ec0d867ef53989ff374Dake Gu rightPanel.offsetLeftAndRight(width - rightPanel.getLeft()); 604121f22713bbed467a977ec0d867ef53989ff374Dake Gu } 614121f22713bbed467a977ec0d867ef53989ff374Dake Gu } 624121f22713bbed467a977ec0d867ef53989ff374Dake Gu 634121f22713bbed467a977ec0d867ef53989ff374Dake Gu void setSharedElementEnterTransition(Activity activity, String sharedElementName) { 644121f22713bbed467a977ec0d867ef53989ff374Dake Gu if (activity == null && !TextUtils.isEmpty(sharedElementName) || 654121f22713bbed467a977ec0d867ef53989ff374Dake Gu activity != null && TextUtils.isEmpty(sharedElementName)) { 664121f22713bbed467a977ec0d867ef53989ff374Dake Gu throw new IllegalArgumentException(); 674121f22713bbed467a977ec0d867ef53989ff374Dake Gu } 684121f22713bbed467a977ec0d867ef53989ff374Dake Gu if (activity == mActivityToRunTransition && 694121f22713bbed467a977ec0d867ef53989ff374Dake Gu TextUtils.equals(sharedElementName, mSharedElementName)) { 704121f22713bbed467a977ec0d867ef53989ff374Dake Gu return; 714121f22713bbed467a977ec0d867ef53989ff374Dake Gu } 724121f22713bbed467a977ec0d867ef53989ff374Dake Gu if (mActivityToRunTransition != null) { 734121f22713bbed467a977ec0d867ef53989ff374Dake Gu ActivityCompat.setEnterSharedElementListener(mActivityToRunTransition, null); 744121f22713bbed467a977ec0d867ef53989ff374Dake Gu } 754121f22713bbed467a977ec0d867ef53989ff374Dake Gu mActivityToRunTransition = activity; 764121f22713bbed467a977ec0d867ef53989ff374Dake Gu mSharedElementName = sharedElementName; 774121f22713bbed467a977ec0d867ef53989ff374Dake Gu if (mActivityToRunTransition != null) { 784121f22713bbed467a977ec0d867ef53989ff374Dake Gu ActivityCompat.setEnterSharedElementListener(mActivityToRunTransition, this); 794121f22713bbed467a977ec0d867ef53989ff374Dake Gu ActivityCompat.postponeEnterTransition(mActivityToRunTransition); 804121f22713bbed467a977ec0d867ef53989ff374Dake Gu } 814121f22713bbed467a977ec0d867ef53989ff374Dake Gu } 824121f22713bbed467a977ec0d867ef53989ff374Dake Gu 834121f22713bbed467a977ec0d867ef53989ff374Dake Gu void onBindToDrawable(ViewHolder vh) { 844121f22713bbed467a977ec0d867ef53989ff374Dake Gu // After we got a image drawable, we can determine size of right panel. 854121f22713bbed467a977ec0d867ef53989ff374Dake Gu // We want right panel to have fixed size so that the right panel don't change size 864121f22713bbed467a977ec0d867ef53989ff374Dake Gu // when the overview is layout as a small bounds in transition. 874121f22713bbed467a977ec0d867ef53989ff374Dake Gu mViewHolder = vh; 884121f22713bbed467a977ec0d867ef53989ff374Dake Gu mViewHolder.mRightPanel.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { 894121f22713bbed467a977ec0d867ef53989ff374Dake Gu @Override 904121f22713bbed467a977ec0d867ef53989ff374Dake Gu public void onLayoutChange(View v, int left, int top, int right, int bottom, 914121f22713bbed467a977ec0d867ef53989ff374Dake Gu int oldLeft, int oldTop, int oldRight, int oldBottom) { 924121f22713bbed467a977ec0d867ef53989ff374Dake Gu mViewHolder.mRightPanel.removeOnLayoutChangeListener(this); 934121f22713bbed467a977ec0d867ef53989ff374Dake Gu mRightPanelWidth = mViewHolder.mRightPanel.getWidth(); 944121f22713bbed467a977ec0d867ef53989ff374Dake Gu mRightPanelHeight = mViewHolder.mRightPanel.getHeight(); 954121f22713bbed467a977ec0d867ef53989ff374Dake Gu } 964121f22713bbed467a977ec0d867ef53989ff374Dake Gu }); 974121f22713bbed467a977ec0d867ef53989ff374Dake Gu if (mActivityToRunTransition != null) { 984121f22713bbed467a977ec0d867ef53989ff374Dake Gu mViewHolder.mRightPanel.postOnAnimation(new Runnable() { 994121f22713bbed467a977ec0d867ef53989ff374Dake Gu @Override 1004121f22713bbed467a977ec0d867ef53989ff374Dake Gu public void run() { 1014121f22713bbed467a977ec0d867ef53989ff374Dake Gu ViewCompat.setTransitionName(mViewHolder.mOverviewView, mSharedElementName); 1024121f22713bbed467a977ec0d867ef53989ff374Dake Gu ActivityCompat.startPostponedEnterTransition(mActivityToRunTransition); 1034121f22713bbed467a977ec0d867ef53989ff374Dake Gu mActivityToRunTransition = null; 1044121f22713bbed467a977ec0d867ef53989ff374Dake Gu mSharedElementName = null; 1054121f22713bbed467a977ec0d867ef53989ff374Dake Gu } 1064121f22713bbed467a977ec0d867ef53989ff374Dake Gu }); 1074121f22713bbed467a977ec0d867ef53989ff374Dake Gu } 1084121f22713bbed467a977ec0d867ef53989ff374Dake Gu } 1094121f22713bbed467a977ec0d867ef53989ff374Dake Gu} 110