/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.support.lifecycle.state;

import android.app.Instrumentation;
import android.app.Instrumentation.ActivityMonitor;
import android.support.test.InstrumentationRegistry;
import android.support.test.rule.UiThreadTestRule;
import android.support.v4.app.FragmentManager;

import com.android.support.lifecycle.testapp.MainActivity;

public class TestUtils {

    private static final long TIMEOUT_MS = 2000;

    static MainActivity recreateActivity(final MainActivity activity, UiThreadTestRule rule)
            throws Throwable {
        ActivityMonitor monitor = new ActivityMonitor(
                MainActivity.class.getCanonicalName(), null, false);
        Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
        instrumentation.addMonitor(monitor);
        rule.runOnUiThread(() -> activity.recreate());
        MainActivity result = (MainActivity) monitor.waitForActivityWithTimeout(TIMEOUT_MS);
        if (result == null) {
            throw new RuntimeException("Timeout. Failed to recreate an activity");
        }
        return result;
    }

    static void stopRetainingInstanceIn(FragmentManager fragmentManager) {
        fragmentManager.findFragmentByTag(StateProviders.HOLDER_TAG).setRetainInstance(false);
    }

}

@@ -1493,16 +1493,601 @@
 ctivity 
+result;%0A%0A        // this guarantee that we will reinstall monitor between notifications about onDestroy%0A        // and onCreate%0A        synchronized (monitor) %7B%0A            do %7B%0A                // the documetation says %22Block until an Activity is created%0A                // that matches this monitor.%22 This statement is true, but there are some other%0A                // true statements like: %22Block until an Activity is destoyed%22 or%0A                // %22Block until an Activity is resumed%22...%0A%0A                // this call will release synchronization monitor's monitor%0A                
 result =
@@ -2150,16 +2150,24 @@
 UT_MS);%0A
+        
         
@@ -2196,24 +2196,32 @@
             
+       
+ 
 throw new Ru
@@ -2279,16 +2279,76 @@
 vity%22);%0A
+                %7D%0A            %7D while (result == activity);%0A
         

Fix waiting for new activity