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