1990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount/*
2ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas * Copyright 2018 The Android Open Source Project
3990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount *
4990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * Licensed under the Apache License, Version 2.0 (the "License");
5990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * you may not use this file except in compliance with the License.
6990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * You may obtain a copy of the License at
7990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount *
8990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount *      http://www.apache.org/licenses/LICENSE-2.0
9990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount *
10990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * Unless required by applicable law or agreed to in writing, software
11990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * distributed under the License is distributed on an "AS IS" BASIS,
12990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * See the License for the specific language governing permissions and
14990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * limitations under the License.
15990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount */
16ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.fragment.app;
17990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
18990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport static org.mockito.Matchers.any;
19990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport static org.mockito.Mockito.mock;
20990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport static org.mockito.Mockito.never;
21990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport static org.mockito.Mockito.reset;
22990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport static org.mockito.Mockito.verify;
23990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
24990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport android.os.Bundle;
25990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport android.os.SystemClock;
26990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport android.transition.Transition;
27990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport android.view.LayoutInflater;
28990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport android.view.View;
29990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport android.view.ViewGroup;
30990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
31990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount/**
32990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * A fragment that has transitions that can be tracked.
33990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount */
34990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountpublic class TransitionFragment extends StrictViewFragment {
35990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public final TrackingVisibility enterTransition = new TrackingVisibility();
36990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public final TrackingVisibility reenterTransition = new TrackingVisibility();
37990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public final TrackingVisibility exitTransition = new TrackingVisibility();
38990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public final TrackingVisibility returnTransition = new TrackingVisibility();
39990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public final TrackingTransition sharedElementEnter = new TrackingTransition();
40990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public final TrackingTransition sharedElementReturn = new TrackingTransition();
41990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
42990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    private Transition.TransitionListener mListener = mock(Transition.TransitionListener.class);
43990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
44990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public TransitionFragment() {
45990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        setEnterTransition(enterTransition);
46990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        setReenterTransition(reenterTransition);
47990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        setExitTransition(exitTransition);
48990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        setReturnTransition(returnTransition);
49990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        setSharedElementEnterTransition(sharedElementEnter);
50990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        setSharedElementReturnTransition(sharedElementReturn);
51990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        enterTransition.addListener(mListener);
52116d033c8569becf78f6ac24caf37ebb368a1aaeGeorge Mount        sharedElementEnter.addListener(mListener);
53990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        reenterTransition.addListener(mListener);
54990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        exitTransition.addListener(mListener);
55990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        returnTransition.addListener(mListener);
56116d033c8569becf78f6ac24caf37ebb368a1aaeGeorge Mount        sharedElementReturn.addListener(mListener);
57990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
58990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
59990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Override
60990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public View onCreateView(LayoutInflater inflater, ViewGroup container,
61990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            Bundle savedInstanceState) {
62990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        checkGetActivity();
63990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        checkState("onCreateView", CREATED);
64990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        mOnCreateViewCalled = true;
65990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        return super.onCreateView(inflater, container, savedInstanceState);
66990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
67990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
68990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    void waitForTransition() throws InterruptedException {
69ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas        verify(mListener, CtsMockitoUtils.within(300)).onTransitionEnd((Transition) any());
70990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        reset(mListener);
71990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
72990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
73990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    void waitForNoTransition() throws InterruptedException {
74990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        SystemClock.sleep(250);
75990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        verify(mListener, never()).onTransitionStart((Transition) any());
76990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
77990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount}
78