1f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki/*
2f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki * Copyright (C) 2016 The Android Open Source Project
3f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki *
4f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki * Licensed under the Apache License, Version 2.0 (the "License");
5f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki * you may not use this file except in compliance with the License.
6f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki * You may obtain a copy of the License at
7f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki *
8f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki *      http://www.apache.org/licenses/LICENSE-2.0
9f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki *
10f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki * Unless required by applicable law or agreed to in writing, software
11f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki * distributed under the License is distributed on an "AS IS" BASIS,
12f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki * See the License for the specific language governing permissions and
14f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki * limitations under the License.
15f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki */
16f43e000b40282b9c270afb427a4e181526452f0aYuichi Arakipackage android.support.transition;
17f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki
18f43e000b40282b9c270afb427a4e181526452f0aYuichi Arakiimport android.support.annotation.NonNull;
19f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki
20f43e000b40282b9c270afb427a4e181526452f0aYuichi Arakiimport java.util.concurrent.CountDownLatch;
21f43e000b40282b9c270afb427a4e181526452f0aYuichi Arakiimport java.util.concurrent.TimeUnit;
22f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki
23f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki/**
24f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki * This {@link Transition.TransitionListener} synchronously waits for the specified callback.
25f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki */
26f43e000b40282b9c270afb427a4e181526452f0aYuichi Arakiclass SyncTransitionListener implements Transition.TransitionListener {
27f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki
28f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    static final int EVENT_START = 1;
29f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    static final int EVENT_END = 2;
30f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    static final int EVENT_CANCEL = 3;
31f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    static final int EVENT_PAUSE = 4;
32f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    static final int EVENT_RESUME = 5;
33f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki
34f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    private final int mTargetEvent;
35f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    private CountDownLatch mLatch = new CountDownLatch(1);
36f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki
37f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    SyncTransitionListener(int event) {
38f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        mTargetEvent = event;
39f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    }
40f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki
41f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    boolean await() {
42f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        try {
43f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki            return mLatch.await(3000, TimeUnit.MILLISECONDS);
44f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        } catch (InterruptedException e) {
45f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki            return false;
46f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        }
47f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    }
48f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki
49f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    void reset() {
50f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        mLatch = new CountDownLatch(1);
51f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    }
52f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki
53f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    @Override
54f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    public void onTransitionStart(@NonNull Transition transition) {
55f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        if (mTargetEvent == EVENT_START) {
56f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki            mLatch.countDown();
57f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        }
58f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    }
59f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki
60f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    @Override
61f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    public void onTransitionEnd(@NonNull Transition transition) {
62f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        if (mTargetEvent == EVENT_END) {
63f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki            mLatch.countDown();
64f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        }
65f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    }
66f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki
67f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    @Override
68f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    public void onTransitionCancel(@NonNull Transition transition) {
69f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        if (mTargetEvent == EVENT_CANCEL) {
70f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki            mLatch.countDown();
71f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        }
72f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    }
73f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki
74f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    @Override
75f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    public void onTransitionPause(@NonNull Transition transition) {
76f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        if (mTargetEvent == EVENT_PAUSE) {
77f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki            mLatch.countDown();
78f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        }
79f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    }
80f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki
81f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    @Override
82f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    public void onTransitionResume(@NonNull Transition transition) {
83f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        if (mTargetEvent == EVENT_RESUME) {
84f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki            mLatch.countDown();
85f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki        }
86f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki    }
87f43e000b40282b9c270afb427a4e181526452f0aYuichi Araki}
88