package org.acra.builder;
import android.app.Activity;
import android.app.Application;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import org.acra.ACRA;
import org.acra.dialog.BaseCrashReportDialog;
import java.lang.ref.WeakReference;
import static org.acra.ACRA.LOG_TAG;
/**
* Responsible for tracking the last Activity other than any CrashReport dialog that was created.
*
* @since 4.8.0
*/
public final class LastActivityManager {
@NonNull
private WeakReference<Activity> lastActivityCreated = new WeakReference<Activity>(null);
public LastActivityManager(@NonNull Application application) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
// ActivityLifecycleCallback only available for API14+
application.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(@NonNull Activity activity, Bundle savedInstanceState) {
if (ACRA.DEV_LOGGING) ACRA.log.d(LOG_TAG, "onActivityCreated " + activity.getClass());
if (!(activity instanceof BaseCrashReportDialog)) {
// Ignore CrashReportDialog because we want the last
// application Activity that was started so that we can explicitly kill it off.
lastActivityCreated = new WeakReference<Activity>(activity);
}
}
@Override
public void onActivityStarted(@NonNull Activity activity) {
if (ACRA.DEV_LOGGING) ACRA.log.d(LOG_TAG, "onActivityStarted " + activity.getClass());
}
@Override
public void onActivityResumed(@NonNull Activity activity) {
if (ACRA.DEV_LOGGING) ACRA.log.d(LOG_TAG, "onActivityResumed " + activity.getClass());
}
@Override
public void onActivityPaused(@NonNull Activity activity) {
if (ACRA.DEV_LOGGING) ACRA.log.d(LOG_TAG, "onActivityPaused " + activity.getClass());
}
@Override
public void onActivityStopped(@NonNull Activity activity) {
if (ACRA.DEV_LOGGING) ACRA.log.d(LOG_TAG, "onActivityStopped " + activity.getClass());
synchronized (this){
notify();
}
}
@Override
public void onActivitySaveInstanceState(@NonNull Activity activity, Bundle outState) {
if (ACRA.DEV_LOGGING) ACRA.log.d(LOG_TAG, "onActivitySaveInstanceState " + activity.getClass());
}
@Override
public void onActivityDestroyed(@NonNull Activity activity) {
if (ACRA.DEV_LOGGING) ACRA.log.d(LOG_TAG, "onActivityDestroyed " + activity.getClass());
}
});
}
}
@Nullable
public Activity getLastActivity() {
return lastActivityCreated.get();
}
public void clearLastActivity() {
lastActivityCreated.clear();
}
public void waitForActivityStop(int timeOutInMillis){
synchronized (this) {
try {
wait(timeOutInMillis);
} catch (InterruptedException ignored) {
}
}
}
}