package com.apigee.sdk.apm.android; import java.util.Date; import java.util.UUID; import android.os.Handler; import android.os.Message; /** * @y.exclude */ public class SessionManager { private String sessionUUID; private Date sessionStartTime; private Date sessionLastActivityTime; private SessionTimeoutListener timeoutListener = null; private long sessionTimeoutMillis; private boolean isPaused; private Handler sessionTimeoutHandler = new Handler(){ public void handleMessage(Message msg) { } }; private Runnable sessionTimeoutCallback = new Runnable() { @Override public void run() { // session timed out handleTimedOutSession(); } }; public SessionManager(long sessionTimeoutMillis) { this.sessionTimeoutMillis = sessionTimeoutMillis; this.isPaused = false; } public SessionManager(long sessionTimeoutMillis,SessionTimeoutListener timeoutListener) { this.sessionTimeoutMillis = sessionTimeoutMillis; this.timeoutListener = timeoutListener; this.isPaused = false; } protected synchronized void handleTimedOutSession() { if( ! isPaused ) { if( timeoutListener != null ) { timeoutListener.onSessionTimeout(sessionUUID, sessionStartTime, sessionLastActivityTime); } closeSession(); } } public synchronized String getSessionUUID() { return sessionUUID; } public synchronized Date getSessionStartTime() { return sessionStartTime; } public synchronized Date getSessionLastActivityTime() { return sessionLastActivityTime; } public synchronized void resetSessionTimeoutTimer() { sessionTimeoutHandler.removeCallbacks(sessionTimeoutCallback); sessionTimeoutHandler.postDelayed(sessionTimeoutCallback,sessionTimeoutMillis); } public synchronized boolean isSessionValid() { return( sessionUUID != null ); } public synchronized boolean closeSession() { boolean closedASession = false; if( sessionUUID != null ) { closedASession = true; } sessionUUID = null; sessionStartTime = null; sessionLastActivityTime = null; return closedASession; } public synchronized String openSession() { sessionUUID = UUID.randomUUID().toString(); long currentTimeMillis = System.currentTimeMillis(); sessionStartTime = new Date(currentTimeMillis); sessionLastActivityTime = null; resetSessionTimeoutTimer(); return sessionUUID; } public synchronized void onUserInteraction() { if (this.isPaused) { this.isPaused = false; resetSessionTimeoutTimer(); } } public synchronized void pause() { if (!this.isPaused) { this.isPaused = true; } } public synchronized void resume() { this.isPaused = false; resetSessionTimeoutTimer(); } public synchronized boolean isPaused() { return this.isPaused; } }