TestUtils.java revision 1f52c94781fdc0d8aefbaa697bb8b52e18badcd5
1b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets/*
2b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets * Copyright (C) 2016 The Android Open Source Project
3b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets *
4b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets * Licensed under the Apache License, Version 2.0 (the "License");
5b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets * you may not use this file except in compliance with the License.
6b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets * You may obtain a copy of the License at
7b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets *
8b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets *      http://www.apache.org/licenses/LICENSE-2.0
9b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets *
10b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets * Unless required by applicable law or agreed to in writing, software
11b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets * distributed under the License is distributed on an "AS IS" BASIS,
12b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets * See the License for the specific language governing permissions and
14b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets * limitations under the License.
15b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets */
16b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets
171f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinetspackage com.android.support.lifecycle;
18b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets
191f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinetsimport android.app.Activity;
20b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinetsimport android.app.Instrumentation;
21b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinetsimport android.app.Instrumentation.ActivityMonitor;
22b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinetsimport android.support.test.InstrumentationRegistry;
23b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinetsimport android.support.test.rule.UiThreadTestRule;
24b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets
25b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinetspublic class TestUtils {
26b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets
27b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets    private static final long TIMEOUT_MS = 2000;
28b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets
291f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets    @SuppressWarnings("unchecked")
301f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets    public static <T extends Activity> T recreateActivity(final T activity, UiThreadTestRule rule)
31b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets            throws Throwable {
32b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets        ActivityMonitor monitor = new ActivityMonitor(
331f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets                activity.getClass().getCanonicalName(), null, false);
34b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets        Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
35b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets        instrumentation.addMonitor(monitor);
361f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets        rule.runOnUiThread(activity::recreate);
371f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets        T result;
38ede4592947eadcab982f71b186dd9debd52e84ccSergey Vasilinets
39ede4592947eadcab982f71b186dd9debd52e84ccSergey Vasilinets        // this guarantee that we will reinstall monitor between notifications about onDestroy
40ede4592947eadcab982f71b186dd9debd52e84ccSergey Vasilinets        // and onCreate
411f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets        //noinspection SynchronizationOnLocalVariableOrMethodParameter
42ede4592947eadcab982f71b186dd9debd52e84ccSergey Vasilinets        synchronized (monitor) {
43ede4592947eadcab982f71b186dd9debd52e84ccSergey Vasilinets            do {
44ede4592947eadcab982f71b186dd9debd52e84ccSergey Vasilinets                // the documetation says "Block until an Activity is created
45ede4592947eadcab982f71b186dd9debd52e84ccSergey Vasilinets                // that matches this monitor." This statement is true, but there are some other
46ede4592947eadcab982f71b186dd9debd52e84ccSergey Vasilinets                // true statements like: "Block until an Activity is destoyed" or
47ede4592947eadcab982f71b186dd9debd52e84ccSergey Vasilinets                // "Block until an Activity is resumed"...
48ede4592947eadcab982f71b186dd9debd52e84ccSergey Vasilinets
49ede4592947eadcab982f71b186dd9debd52e84ccSergey Vasilinets                // this call will release synchronization monitor's monitor
501f52c94781fdc0d8aefbaa697bb8b52e18badcd5Sergey Vasilinets                result = (T) monitor.waitForActivityWithTimeout(TIMEOUT_MS);
51ede4592947eadcab982f71b186dd9debd52e84ccSergey Vasilinets                if (result == null) {
52ede4592947eadcab982f71b186dd9debd52e84ccSergey Vasilinets                    throw new RuntimeException("Timeout. Failed to recreate an activity");
53ede4592947eadcab982f71b186dd9debd52e84ccSergey Vasilinets                }
54ede4592947eadcab982f71b186dd9debd52e84ccSergey Vasilinets            } while (result == activity);
55b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets        }
56b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets        return result;
57b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets    }
58b085e34beddf631062d0e2503911ef4a33152c06Sergey Vasilinets}
59