Smack/smack-messenger-android/src/main/java/org/jivesoftware/smacks/messenger/android/AndroidCsiManager.java

72 lines
2.6 KiB
Java

package org.jivesoftware.smacks.messenger.android;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import org.jivesoftware.smacks.messenger.android.csi.util.AbstractActivityLifecycleCallbacks;
import org.jivesoftware.smackx.messenger.csi.ClientStateListener;
import android.app.Activity;
import android.app.Application;
/**
* Android Utility class that observes the current state of the application.
* If the application currently displays at least one active Activity, then registered
* {@link ClientStateListener ClientStateListeners} will be notified via {@link ClientStateListener#onClientInForeground()}.
* If the application goes into the background, {@link ClientStateListener#onClientInBackground()} will be fired.
*
* Setup: During application startup, call {@link android.app.Application#registerActivityLifecycleCallbacks(Application.ActivityLifecycleCallbacks)}
* and pass an instance of {@link AndroidCsiManager} as argument.
*
* Remember to also register a {@link ClientStateListener} implementation (eg. the Messenger class from smack-messenger).
*/
public final class AndroidCsiManager extends AbstractActivityLifecycleCallbacks {
private static AndroidCsiManager INSTANCE;
private AtomicInteger activityReferences = new AtomicInteger(0);
private AtomicBoolean isActivityChangingConfiguration = new AtomicBoolean(false);
private final List<ClientStateListener> listeners = new ArrayList<>();
private AndroidCsiManager() {
}
public AndroidCsiManager getInstance() {
if (INSTANCE == null) {
INSTANCE = new AndroidCsiManager();
}
return INSTANCE;
}
@Override
public void onActivityStarted(Activity activity) {
if (activityReferences.incrementAndGet() == 1 && !isActivityChangingConfiguration.get()) {
for (ClientStateListener listener : listeners) {
listener.onClientInForeground();
}
}
}
@Override
public void onActivityStopped(Activity activity) {
isActivityChangingConfiguration.set(activity.isChangingConfigurations());
if (activityReferences.decrementAndGet() == 0 && !isActivityChangingConfiguration.get()) {
for (ClientStateListener listener : listeners) {
listener.onClientInBackground();
}
}
}
public void addClientStateListener(ClientStateListener listener) {
this.listeners.add(listener);
}
public void removeClientStateListener(ClientStateListener listener) {
this.listeners.remove(listener);
}
}