package com.github.zawadz88.sample.test.util;

import android.app.Activity;
import android.os.Handler;
import android.os.Looper;
import android.support.annotation.NonNull;
import android.support.test.espresso.core.deps.guava.collect.Iterables;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.lifecycle.ActivityLifecycleMonitorRegistry;
import android.support.test.runner.lifecycle.Stage;

import static android.support.test.InstrumentationRegistry.getInstrumentation;

/**
 * Contains common Activity operations.
 *
 * @author Piotr Zawadzki
 */
public final class ActivityUtils {

    /**
     * Finishes all currently opened activities belonging to this process started by this instrumentation.
     */
    public static void finishOpenActivities() {
        new Handler(Looper.getMainLooper()).post(new ActivityFinisher());
    }

    /**
     * Gets an instance of the currently active (displayed) activity.
     * @param activityTestRule test rule
     * @param <T> activity class
     * @return activity instance
     */
    public static  <T extends Activity> T getCurrentActivity(@NonNull ActivityTestRule activityTestRule) {
        getInstrumentation().waitForIdleSync();
        final Activity[] activity = new Activity[1];
        try {
            activityTestRule.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    java.util.Collection<Activity> activites = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED);
                    activity[0] = Iterables.getOnlyElement(activites);
                }});
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        //noinspection unchecked
        return (T) activity[0];
    }
}