From c2724f3f2be60b85e7fcec1d8e6c9870fd9957af Mon Sep 17 00:00:00 2001 From: ShivamPokhriyal Date: Tue, 16 Mar 2021 15:53:02 +0530 Subject: [PATCH 1/3] Handle receiver register/unregister calls in onResume and onPause only onActivityResultHelper was also calling SessionActivityRegistration.handleOrListenForSessionExpiration which in turn was registering the receiver twice, causing a memory leak --- .../commcare/activities/SessionAwareCommCareActivity.java | 1 + .../org/commcare/activities/SessionAwareListActivity.java | 1 + .../commcare/activities/SessionAwarePreferenceActivity.java | 2 +- app/src/org/commcare/utils/SessionActivityRegistration.java | 6 ++++-- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/app/src/org/commcare/activities/SessionAwareCommCareActivity.java b/app/src/org/commcare/activities/SessionAwareCommCareActivity.java index c7b4f082e6..ab7086afe5 100755 --- a/app/src/org/commcare/activities/SessionAwareCommCareActivity.java +++ b/app/src/org/commcare/activities/SessionAwareCommCareActivity.java @@ -27,6 +27,7 @@ public void onCreateSessionSafe(Bundle savedInstanceState) { @Override protected void onResume() { super.onResume(); + SessionActivityRegistration.registerSessionExpirationReceiver(this); SessionAwareHelper.onResumeHelper(this, this, redirectedInOnCreate); } diff --git a/app/src/org/commcare/activities/SessionAwareListActivity.java b/app/src/org/commcare/activities/SessionAwareListActivity.java index 04156eda78..df478ea393 100644 --- a/app/src/org/commcare/activities/SessionAwareListActivity.java +++ b/app/src/org/commcare/activities/SessionAwareListActivity.java @@ -28,6 +28,7 @@ public void onCreateSessionSafe(Bundle savedInstanceState) { @Override protected void onResume() { super.onResume(); + SessionActivityRegistration.registerSessionExpirationReceiver(this); SessionAwareHelper.onResumeHelper(this, this, redirectedInOnCreate); } diff --git a/app/src/org/commcare/activities/SessionAwarePreferenceActivity.java b/app/src/org/commcare/activities/SessionAwarePreferenceActivity.java index 9449ab072e..f6d2777d74 100755 --- a/app/src/org/commcare/activities/SessionAwarePreferenceActivity.java +++ b/app/src/org/commcare/activities/SessionAwarePreferenceActivity.java @@ -14,7 +14,7 @@ public class SessionAwarePreferenceActivity extends CommCarePreferenceActivity { @Override protected void onResume() { super.onResume(); - + SessionActivityRegistration.registerSessionExpirationReceiver(this); SessionActivityRegistration.handleOrListenForSessionExpiration(this); } diff --git a/app/src/org/commcare/utils/SessionActivityRegistration.java b/app/src/org/commcare/utils/SessionActivityRegistration.java index 4363a7c9fd..fd5c631e04 100755 --- a/app/src/org/commcare/utils/SessionActivityRegistration.java +++ b/app/src/org/commcare/utils/SessionActivityRegistration.java @@ -41,8 +41,6 @@ public void onReceive(Context context, Intent intent) { * methods of activities that are session sensitive. */ public static boolean handleOrListenForSessionExpiration(AppCompatActivity activity) { - activity.registerReceiver(userSessionExpiredReceiver, expirationFilter); - synchronized (registrationLock) { if (unredirectedSessionExpiration) { unredirectedSessionExpiration = false; @@ -53,6 +51,10 @@ public static boolean handleOrListenForSessionExpiration(AppCompatActivity activ } } + public static void registerSessionExpirationReceiver(AppCompatActivity activity) { + activity.registerReceiver(userSessionExpiredReceiver, expirationFilter); + } + /** * Stop activity from listening for session expiration broadcasts. Call * this method in onPause methods of activities that are session sensitive. From b43addd598721a2ccb568522796d963573d11db2 Mon Sep 17 00:00:00 2001 From: ShivamPokhriyal Date: Tue, 16 Mar 2021 18:01:12 +0530 Subject: [PATCH 2/3] Rename method to handleSessionExpiration --- app/src/org/commcare/activities/SessionAwareHelper.java | 4 ++-- .../commcare/activities/SessionAwarePreferenceActivity.java | 4 +--- app/src/org/commcare/utils/SessionActivityRegistration.java | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/app/src/org/commcare/activities/SessionAwareHelper.java b/app/src/org/commcare/activities/SessionAwareHelper.java index 05ec43d772..f12c3b3551 100644 --- a/app/src/org/commcare/activities/SessionAwareHelper.java +++ b/app/src/org/commcare/activities/SessionAwareHelper.java @@ -30,7 +30,7 @@ protected static boolean onCreateHelper(AppCompatActivity a, SessionAwareInterfa protected static void onResumeHelper(AppCompatActivity a, SessionAwareInterface sessionAware, boolean redirectedInOnCreate) { boolean redirectedToLogin = - SessionActivityRegistration.handleOrListenForSessionExpiration(a) || + SessionActivityRegistration.handleSessionExpiration(a) || redirectedInOnCreate; if (!redirectedToLogin) { try { @@ -44,7 +44,7 @@ protected static void onResumeHelper(AppCompatActivity a, SessionAwareInterface protected static void onActivityResultHelper(AppCompatActivity a, SessionAwareInterface sessionAware, int requestCode, int resultCode, Intent intent) { boolean redirectedToLogin = - SessionActivityRegistration.handleOrListenForSessionExpiration(a); + SessionActivityRegistration.handleSessionExpiration(a); if (!redirectedToLogin) { sessionAware.onActivityResultSessionSafe(requestCode, resultCode, intent); } diff --git a/app/src/org/commcare/activities/SessionAwarePreferenceActivity.java b/app/src/org/commcare/activities/SessionAwarePreferenceActivity.java index f6d2777d74..acd2da0ce7 100755 --- a/app/src/org/commcare/activities/SessionAwarePreferenceActivity.java +++ b/app/src/org/commcare/activities/SessionAwarePreferenceActivity.java @@ -1,7 +1,5 @@ package org.commcare.activities; -import android.preference.PreferenceActivity; - import org.commcare.utils.SessionActivityRegistration; /** @@ -15,7 +13,7 @@ public class SessionAwarePreferenceActivity extends CommCarePreferenceActivity { protected void onResume() { super.onResume(); SessionActivityRegistration.registerSessionExpirationReceiver(this); - SessionActivityRegistration.handleOrListenForSessionExpiration(this); + SessionActivityRegistration.handleSessionExpiration(this); } @Override diff --git a/app/src/org/commcare/utils/SessionActivityRegistration.java b/app/src/org/commcare/utils/SessionActivityRegistration.java index fd5c631e04..0b9c7f1ba6 100755 --- a/app/src/org/commcare/utils/SessionActivityRegistration.java +++ b/app/src/org/commcare/utils/SessionActivityRegistration.java @@ -40,7 +40,7 @@ public void onReceive(Context context, Intent intent) { * listen for session expiration broadcasts. Call this method in onResume * methods of activities that are session sensitive. */ - public static boolean handleOrListenForSessionExpiration(AppCompatActivity activity) { + public static boolean handleSessionExpiration(AppCompatActivity activity) { synchronized (registrationLock) { if (unredirectedSessionExpiration) { unredirectedSessionExpiration = false; From ea200c9dff85b967b11ea835b3152b61ebb089b8 Mon Sep 17 00:00:00 2001 From: ShivamPokhriyal Date: Tue, 16 Mar 2021 20:47:19 +0530 Subject: [PATCH 3/3] Rename SessionActivityRegistration -> SessionRegistrationHelper --- app/src/org/commcare/CommCareApplication.java | 9 ++++----- .../activities/SessionAwareCommCareActivity.java | 6 +++--- .../org/commcare/activities/SessionAwareHelper.java | 10 +++++----- .../commcare/activities/SessionAwareListActivity.java | 7 +++---- .../activities/SessionAwarePreferenceActivity.java | 8 ++++---- .../org/commcare/utils/CommCareExceptionHandler.java | 2 +- ...egistration.java => SessionRegistrationHelper.java} | 6 +++--- 7 files changed, 23 insertions(+), 25 deletions(-) rename app/src/org/commcare/utils/{SessionActivityRegistration.java => SessionRegistrationHelper.java} (94%) diff --git a/app/src/org/commcare/CommCareApplication.java b/app/src/org/commcare/CommCareApplication.java index 45b77ed52f..7984ffafa6 100644 --- a/app/src/org/commcare/CommCareApplication.java +++ b/app/src/org/commcare/CommCareApplication.java @@ -36,7 +36,6 @@ import org.commcare.core.network.ModernHttpRequester; import org.commcare.core.services.CommCarePreferenceManagerFactory; import org.commcare.dalvik.BuildConfig; -import org.commcare.dalvik.R; import org.commcare.engine.references.ArchiveFileRoot; import org.commcare.engine.references.AssetFileRoot; import org.commcare.engine.references.JavaHttpRoot; @@ -95,7 +94,7 @@ import org.commcare.utils.MarkupUtil; import org.commcare.utils.MultipleAppsUtil; import org.commcare.utils.PendingCalcs; -import org.commcare.utils.SessionActivityRegistration; +import org.commcare.utils.SessionRegistrationHelper; import org.commcare.utils.SessionStateUninitException; import org.commcare.utils.SessionUnavailableException; import org.commcare.views.widgets.CleanRawMedia; @@ -347,7 +346,7 @@ public void startUserSession(byte[] symmetricKey, UserKeyRecord record, boolean synchronized (serviceLock) { // if we already have a connection established to // CommCareSessionService, close it and open a new one - SessionActivityRegistration.unregisterSessionExpiration(); + SessionRegistrationHelper.unregisterSessionExpiration(); if (this.sessionServiceIsBound) { releaseUserResourcesAndServices(); } @@ -389,8 +388,8 @@ protected void cancelWorkManagerTasks() { public void expireUserSession() { synchronized (serviceLock) { closeUserSession(); - SessionActivityRegistration.registerSessionExpiration(); - sendBroadcast(new Intent(SessionActivityRegistration.USER_SESSION_EXPIRED)); + SessionRegistrationHelper.registerSessionExpiration(); + sendBroadcast(new Intent(SessionRegistrationHelper.USER_SESSION_EXPIRED)); } } diff --git a/app/src/org/commcare/activities/SessionAwareCommCareActivity.java b/app/src/org/commcare/activities/SessionAwareCommCareActivity.java index ab7086afe5..0778f4dc9b 100755 --- a/app/src/org/commcare/activities/SessionAwareCommCareActivity.java +++ b/app/src/org/commcare/activities/SessionAwareCommCareActivity.java @@ -3,7 +3,7 @@ import android.content.Intent; import android.os.Bundle; -import org.commcare.utils.SessionActivityRegistration; +import org.commcare.utils.SessionRegistrationHelper; /** * Manage redirection to login screen when session expiration occurs. @@ -27,7 +27,7 @@ public void onCreateSessionSafe(Bundle savedInstanceState) { @Override protected void onResume() { super.onResume(); - SessionActivityRegistration.registerSessionExpirationReceiver(this); + SessionRegistrationHelper.registerSessionExpirationReceiver(this); SessionAwareHelper.onResumeHelper(this, this, redirectedInOnCreate); } @@ -47,6 +47,6 @@ public void onActivityResultSessionSafe(int requestCode, int resultCode, Intent @Override protected void onPause() { super.onPause(); - SessionActivityRegistration.unregisterSessionExpirationReceiver(this); + SessionRegistrationHelper.unregisterSessionExpirationReceiver(this); } } diff --git a/app/src/org/commcare/activities/SessionAwareHelper.java b/app/src/org/commcare/activities/SessionAwareHelper.java index f12c3b3551..01803db594 100644 --- a/app/src/org/commcare/activities/SessionAwareHelper.java +++ b/app/src/org/commcare/activities/SessionAwareHelper.java @@ -5,7 +5,7 @@ import androidx.appcompat.app.AppCompatActivity; import org.commcare.CommCareApplication; -import org.commcare.utils.SessionActivityRegistration; +import org.commcare.utils.SessionRegistrationHelper; import org.commcare.utils.SessionUnavailableException; /** @@ -21,7 +21,7 @@ protected static boolean onCreateHelper(AppCompatActivity a, SessionAwareInterfa sessionAware.onCreateSessionSafe(savedInstanceState); return false; } catch (SessionUnavailableException e) { - SessionActivityRegistration.redirectToLogin(a); + SessionRegistrationHelper.redirectToLogin(a); a.finish(); return true; } @@ -30,13 +30,13 @@ protected static boolean onCreateHelper(AppCompatActivity a, SessionAwareInterfa protected static void onResumeHelper(AppCompatActivity a, SessionAwareInterface sessionAware, boolean redirectedInOnCreate) { boolean redirectedToLogin = - SessionActivityRegistration.handleSessionExpiration(a) || + SessionRegistrationHelper.handleSessionExpiration(a) || redirectedInOnCreate; if (!redirectedToLogin) { try { sessionAware.onResumeSessionSafe(); } catch (SessionUnavailableException e) { - SessionActivityRegistration.redirectToLogin(a); + SessionRegistrationHelper.redirectToLogin(a); } } } @@ -44,7 +44,7 @@ protected static void onResumeHelper(AppCompatActivity a, SessionAwareInterface protected static void onActivityResultHelper(AppCompatActivity a, SessionAwareInterface sessionAware, int requestCode, int resultCode, Intent intent) { boolean redirectedToLogin = - SessionActivityRegistration.handleSessionExpiration(a); + SessionRegistrationHelper.handleSessionExpiration(a); if (!redirectedToLogin) { sessionAware.onActivityResultSessionSafe(requestCode, resultCode, intent); } diff --git a/app/src/org/commcare/activities/SessionAwareListActivity.java b/app/src/org/commcare/activities/SessionAwareListActivity.java index df478ea393..bd358e70cd 100644 --- a/app/src/org/commcare/activities/SessionAwareListActivity.java +++ b/app/src/org/commcare/activities/SessionAwareListActivity.java @@ -1,10 +1,9 @@ package org.commcare.activities; -import android.app.ListActivity; import android.content.Intent; import android.os.Bundle; -import org.commcare.utils.SessionActivityRegistration; +import org.commcare.utils.SessionRegistrationHelper; /** * Reproduction of SessionAwareCommCareActivity, but for an activity that must extend ListActivity @@ -28,7 +27,7 @@ public void onCreateSessionSafe(Bundle savedInstanceState) { @Override protected void onResume() { super.onResume(); - SessionActivityRegistration.registerSessionExpirationReceiver(this); + SessionRegistrationHelper.registerSessionExpirationReceiver(this); SessionAwareHelper.onResumeHelper(this, this, redirectedInOnCreate); } @@ -39,7 +38,7 @@ public void onResumeSessionSafe() { @Override protected void onPause() { super.onPause(); - SessionActivityRegistration.unregisterSessionExpirationReceiver(this); + SessionRegistrationHelper.unregisterSessionExpirationReceiver(this); } @Override diff --git a/app/src/org/commcare/activities/SessionAwarePreferenceActivity.java b/app/src/org/commcare/activities/SessionAwarePreferenceActivity.java index acd2da0ce7..4232dac714 100755 --- a/app/src/org/commcare/activities/SessionAwarePreferenceActivity.java +++ b/app/src/org/commcare/activities/SessionAwarePreferenceActivity.java @@ -1,6 +1,6 @@ package org.commcare.activities; -import org.commcare.utils.SessionActivityRegistration; +import org.commcare.utils.SessionRegistrationHelper; /** * Manage redirection to login screen when session expiration occurs. @@ -12,14 +12,14 @@ public class SessionAwarePreferenceActivity extends CommCarePreferenceActivity { @Override protected void onResume() { super.onResume(); - SessionActivityRegistration.registerSessionExpirationReceiver(this); - SessionActivityRegistration.handleSessionExpiration(this); + SessionRegistrationHelper.registerSessionExpirationReceiver(this); + SessionRegistrationHelper.handleSessionExpiration(this); } @Override protected void onPause() { super.onPause(); - SessionActivityRegistration.unregisterSessionExpirationReceiver(this); + SessionRegistrationHelper.unregisterSessionExpirationReceiver(this); } } diff --git a/app/src/org/commcare/utils/CommCareExceptionHandler.java b/app/src/org/commcare/utils/CommCareExceptionHandler.java index ed8e8297a5..061ba2a9cc 100644 --- a/app/src/org/commcare/utils/CommCareExceptionHandler.java +++ b/app/src/org/commcare/utils/CommCareExceptionHandler.java @@ -83,7 +83,7 @@ private boolean warnUserAndExit(Throwable ex) { Throwable sessionUnavailableException = getSessionUnavailableException(causes); if (sessionUnavailableException != null) { - SessionActivityRegistration.redirectToLogin(ctx); + SessionRegistrationHelper.redirectToLogin(ctx); return true; } return false; diff --git a/app/src/org/commcare/utils/SessionActivityRegistration.java b/app/src/org/commcare/utils/SessionRegistrationHelper.java similarity index 94% rename from app/src/org/commcare/utils/SessionActivityRegistration.java rename to app/src/org/commcare/utils/SessionRegistrationHelper.java index 0b9c7f1ba6..2603e795e1 100755 --- a/app/src/org/commcare/utils/SessionActivityRegistration.java +++ b/app/src/org/commcare/utils/SessionRegistrationHelper.java @@ -14,14 +14,14 @@ * * @author Phillip Mates (pmates@dimagi.com) */ -public class SessionActivityRegistration { - private static final String TAG = SessionActivityRegistration.class.getSimpleName(); +public class SessionRegistrationHelper { + private static final String TAG = SessionRegistrationHelper.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); + new IntentFilter(SessionRegistrationHelper.USER_SESSION_EXPIRED); private static boolean unredirectedSessionExpiration; private static final Object registrationLock = new Object();