13f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki/*
23f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki * Copyright (C) 2017 The Android Open Source Project
33f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki *
43f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki * Licensed under the Apache License, Version 2.0 (the "License");
53f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki * you may not use this file except in compliance with the License.
63f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki * You may obtain a copy of the License at
73f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki *
83f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki *      http://www.apache.org/licenses/LICENSE-2.0
93f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki *
103f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki * Unless required by applicable law or agreed to in writing, software
113f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki * distributed under the License is distributed on an "AS IS" BASIS,
123f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki * See the License for the specific language governing permissions and
143f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki * limitations under the License.
153f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki */
163f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki
173f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Arakipackage com.example.android.support.transition.widget;
183f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki
193f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Arakiimport android.os.Bundle;
203f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Arakiimport android.support.annotation.Nullable;
213f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Arakiimport android.support.transition.AutoTransition;
223f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Arakiimport android.support.transition.Fade;
233f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Arakiimport android.support.transition.Transition;
243f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Arakiimport android.support.v4.app.Fragment;
253f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Arakiimport android.support.v4.app.FragmentManager;
263f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Arakiimport android.support.v4.view.ViewCompat;
273f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Arakiimport android.support.v4.view.animation.FastOutSlowInInterpolator;
283f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Arakiimport android.view.LayoutInflater;
293f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Arakiimport android.view.View;
303f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Arakiimport android.view.ViewGroup;
313f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki
323f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Arakiimport com.example.android.support.transition.R;
333f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki
343f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki/**
353f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki * Demonstrates usage of shared element Transition between Fragments.
363f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki */
373f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Arakipublic class FragmentTransitionUsage extends TransitionUsageBase {
383f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki
393f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    private static final String SHARED = "red";
403f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki
413f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    private static final Transition SHARED_TRANSITION = new AutoTransition();
423f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    private static final Transition NON_SHARED_TRANSITION = new Fade();
433f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki
443f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    static {
453f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki        SHARED_TRANSITION.setDuration(1000);
463f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki        SHARED_TRANSITION.setInterpolator(new FastOutSlowInInterpolator());
473f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki        NON_SHARED_TRANSITION.setDuration(1000);
483f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki        NON_SHARED_TRANSITION.setInterpolator(new FastOutSlowInInterpolator());
493f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    }
503f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki
513f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    private static final String FRAGMENT_FIRST = "first";
523f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    private static final String FRAGMENT_SECOND = "second";
533f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki
543f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    @Override
553f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    int getLayoutResId() {
563f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki        return R.layout.fragment_transition;
573f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    }
583f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki
593f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    @Override
603f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    protected void onCreate(Bundle savedInstanceState) {
613f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki        super.onCreate(savedInstanceState);
623f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki        if (savedInstanceState == null) {
633f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki            getSupportFragmentManager().beginTransaction()
643f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki                    .replace(R.id.container, new FirstFragment(), FRAGMENT_FIRST)
653f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki                    .setReorderingAllowed(true)
663f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki                    .commitNow();
673f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki        }
683f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    }
693f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki
703f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    void showSecond(View sharedElement) {
713f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki        FragmentManager fragmentManager = getSupportFragmentManager();
723f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki        final FirstFragment first =
733f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki                (FirstFragment) fragmentManager.findFragmentByTag(FRAGMENT_FIRST);
743f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki        if (first == null) {
753f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki            return;
763f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki        }
773f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki        final SecondFragment second = new SecondFragment();
783f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki
793f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki        fragmentManager.beginTransaction()
803f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki                .replace(R.id.container, second, FRAGMENT_SECOND)
813f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki                .addToBackStack(null)
823f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki                .setReorderingAllowed(true)
833f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki                .addSharedElement(sharedElement, SHARED)
843f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki                .commit();
853f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    }
863f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki
873f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    private abstract static class TransitionFragment extends Fragment {
883f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki
893f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki        @Override
903f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki        public void onActivityCreated(@Nullable Bundle savedInstanceState) {
913f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki            super.onActivityCreated(savedInstanceState);
923f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki            setSharedElementEnterTransition(SHARED_TRANSITION);
933f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki            setSharedElementReturnTransition(SHARED_TRANSITION);
943f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki            setExitTransition(NON_SHARED_TRANSITION);
953f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki            setEnterTransition(NON_SHARED_TRANSITION);
963f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki            setReenterTransition(NON_SHARED_TRANSITION);
973f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki            setReturnTransition(NON_SHARED_TRANSITION);
983f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki            setAllowEnterTransitionOverlap(true);
993f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki            setAllowReturnTransitionOverlap(true);
1003f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki        }
1013f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki
1023f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    }
1033f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki
1043f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    /**
1053f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki     * A {@link Fragment} with red and yellow squares.
1063f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki     */
1073f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    public static class FirstFragment extends TransitionFragment {
1083f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki
1093f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki        @Nullable
1103f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki        @Override
1113f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
1123f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki                @Nullable Bundle savedInstanceState) {
1133f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki            return inflater.inflate(R.layout.fragment_transition_first, container, false);
1143f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki        }
1153f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki
1163f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki        @Override
1173f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki        public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
1183f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki            final View red = view.findViewById(R.id.red);
1193f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki            ViewCompat.setTransitionName(red, SHARED);
1203f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki            view.findViewById(R.id.move).setOnClickListener(new View.OnClickListener() {
1213f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki                @Override
1223f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki                public void onClick(View v) {
1233f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki                    FragmentTransitionUsage activity = (FragmentTransitionUsage) getActivity();
1243f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki                    if (activity != null) {
1253f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki                        activity.showSecond(red);
1263f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki                    }
1273f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki                }
1283f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki            });
1293f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki        }
1303f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki
1313f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    }
1323f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki
1333f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    /**
1343f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki     * A {@link Fragment} with red and blue squares.
1353f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki     */
1363f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    public static class SecondFragment extends TransitionFragment {
1373f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki
1383f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki        @Nullable
1393f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki        @Override
1403f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
1413f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki                @Nullable Bundle savedInstanceState) {
1423f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki            return inflater.inflate(R.layout.fragment_transition_second, container, false);
1433f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki        }
1443f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki
1453f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki        @Override
1463f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki        public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
1473f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki            ViewCompat.setTransitionName(view.findViewById(R.id.red), SHARED);
1483f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki        }
1493f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki
1503f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki    }
1513f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki
1523f82583302c46d84017633ce93ef8c7b3278eb5eYuichi Araki}
153