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