/*
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.facebook.common.activitylistener;
import java.lang.ref.WeakReference;
import android.app.Activity;
import android.content.Context;
import android.content.ContextWrapper;
import com.facebook.common.internal.Preconditions;
/**
* Registers ActivityListener with ActivityListener.
*
* <p> A WeakReference is used to wrap an ActivityVisibilityListener. When it is nullified
* ActivityListener is automatically removed from the listened ListenableActivity.
*/
public class ActivityListenerManager {
/**
* If given context is an instance of ListenableActivity then creates new instance of
* WeakReferenceActivityListenerAdapter and adds it to activity's listeners
*/
public static void register(
ActivityListener activityListener,
Context context) {
if (!(context instanceof ListenableActivity) && context instanceof ContextWrapper) {
context = ((ContextWrapper) context).getBaseContext();
}
if (context instanceof ListenableActivity) {
ListenableActivity listenableActivity = (ListenableActivity) context;
Listener listener = new Listener(activityListener);
listenableActivity.addActivityListener(listener);
}
}
private static class Listener extends BaseActivityListener {
private final WeakReference<ActivityListener> mActivityListenerRef;
public Listener(ActivityListener activityListener) {
mActivityListenerRef = new WeakReference<ActivityListener>(activityListener);
}
@Override
public void onActivityCreate(Activity activity) {
ActivityListener activityVisibilityListener = getListenerOrCleanUp(activity);
if (activityVisibilityListener != null) {
activityVisibilityListener.onActivityCreate(activity);
}
}
@Override
public void onDestroy(Activity activity) {
ActivityListener activityVisibilityListener = getListenerOrCleanUp(activity);
if (activityVisibilityListener != null) {
activityVisibilityListener.onDestroy(activity);
}
}
@Override
public void onStart(Activity activity) {
ActivityListener activityVisibilityListener = getListenerOrCleanUp(activity);
if (activityVisibilityListener != null) {
activityVisibilityListener.onStart(activity);
}
}
@Override
public void onStop(Activity activity) {
ActivityListener activityVisibilityListener = getListenerOrCleanUp(activity);
if (activityVisibilityListener != null) {
activityVisibilityListener.onStop(activity);
}
}
@Override
public void onResume(Activity activity) {
ActivityListener activityVisibilityListener = getListenerOrCleanUp(activity);
if (activityVisibilityListener != null) {
activityVisibilityListener.onResume(activity);
}
}
@Override
public void onPause(Activity activity) {
ActivityListener activityVisibilityListener = getListenerOrCleanUp(activity);
if (activityVisibilityListener != null) {
activityVisibilityListener.onPause(activity);
}
}
private ActivityListener getListenerOrCleanUp(Activity activity) {
ActivityListener activityVisibilityListener = mActivityListenerRef.get();
if (activityVisibilityListener == null) {
Preconditions.checkArgument(activity instanceof ListenableActivity);
ListenableActivity listenableActivity = (ListenableActivity) activity;
listenableActivity.removeActivityListener(this);
}
return activityVisibilityListener;
}
}
}