package org.commcare.utils; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.util.Log; import org.commcare.activities.DispatchActivity; /** * Manage redirection to login screen when session expiration occurs. * * @author Phillip Mates (pmates@dimagi.com) */ public class SessionActivityRegistration { private static final String TAG = SessionActivityRegistration.class.getSimpleName(); public static final String USER_SESSION_EXPIRED = "org.commcare.dalvik.application.user_session_expired"; private static final IntentFilter expirationFilter = new IntentFilter(SessionActivityRegistration.USER_SESSION_EXPIRED); private static boolean unredirectedSessionExpiration; private static final Object registrationLock = new Object(); private static final BroadcastReceiver userSessionExpiredReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { unredirectedSessionExpiration = false; redirectToLogin(context); } }; /** * Redirect to login if session expired, otherwise register activity to * listen for session expiration broadcasts. Call this method in onResume * methods of activities that are session sensitive. */ public static boolean handleOrListenForSessionExpiration(Activity activity) { activity.registerReceiver(userSessionExpiredReceiver, expirationFilter); synchronized (registrationLock) { if (unredirectedSessionExpiration) { unredirectedSessionExpiration = false; redirectToLogin(activity); return true; } return false; } } /** * Stop activity from listening for session expiration broadcasts. Call * this method in onPause methods of activities that are session sensitive. */ public static void unregisterSessionExpirationReceiver(Activity activity) { try { activity.unregisterReceiver(userSessionExpiredReceiver); } catch (IllegalArgumentException e) { Log.w(TAG, "Trying to unregister the session expiration receiver " + "that wasn't previously registerd."); } } /** * Register session expiration in case the app is in the background and * doesn't receive the broadcast. To be acted upon in onResume. */ public static void registerSessionExpiration() { synchronized (registrationLock) { unredirectedSessionExpiration = true; } } public static void unregisterSessionExpiration() { synchronized (registrationLock) { unredirectedSessionExpiration = false; } } /** * Launch the DispatchActivity, clearing the activity backstack down * to its first occurrence, which should be at the very bottom of the * stack. The backstack clearing is necessary for exiting out of the app * if the login activity is cancelled */ public static void redirectToLogin(Context context) { Intent i = new Intent(context.getApplicationContext(), DispatchActivity.class); i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); context.startActivity(i); } }