Skip to content

Commit

Permalink
Merge pull request #2448 from dimagi/memory-leak
Browse files Browse the repository at this point in the history
Handle receiver register/unregister calls in onResume and onPause only
  • Loading branch information
ShivamPokhriyal committed Mar 17, 2021
2 parents c590ebe + ea200c9 commit 2aacf89
Show file tree
Hide file tree
Showing 7 changed files with 28 additions and 28 deletions.
9 changes: 4 additions & 5 deletions app/src/org/commcare/CommCareApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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();
}
Expand Down Expand Up @@ -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));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -27,6 +27,7 @@ public void onCreateSessionSafe(Bundle savedInstanceState) {
@Override
protected void onResume() {
super.onResume();
SessionRegistrationHelper.registerSessionExpirationReceiver(this);
SessionAwareHelper.onResumeHelper(this, this, redirectedInOnCreate);
}

Expand All @@ -46,6 +47,6 @@ public void onActivityResultSessionSafe(int requestCode, int resultCode, Intent
@Override
protected void onPause() {
super.onPause();
SessionActivityRegistration.unregisterSessionExpirationReceiver(this);
SessionRegistrationHelper.unregisterSessionExpirationReceiver(this);
}
}
10 changes: 5 additions & 5 deletions app/src/org/commcare/activities/SessionAwareHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/**
Expand All @@ -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;
}
Expand All @@ -30,21 +30,21 @@ protected static boolean onCreateHelper(AppCompatActivity a, SessionAwareInterfa
protected static void onResumeHelper(AppCompatActivity a, SessionAwareInterface sessionAware,
boolean redirectedInOnCreate) {
boolean redirectedToLogin =
SessionActivityRegistration.handleOrListenForSessionExpiration(a) ||
SessionRegistrationHelper.handleSessionExpiration(a) ||
redirectedInOnCreate;
if (!redirectedToLogin) {
try {
sessionAware.onResumeSessionSafe();
} catch (SessionUnavailableException e) {
SessionActivityRegistration.redirectToLogin(a);
SessionRegistrationHelper.redirectToLogin(a);
}
}
}

protected static void onActivityResultHelper(AppCompatActivity a, SessionAwareInterface sessionAware,
int requestCode, int resultCode, Intent intent) {
boolean redirectedToLogin =
SessionActivityRegistration.handleOrListenForSessionExpiration(a);
SessionRegistrationHelper.handleSessionExpiration(a);
if (!redirectedToLogin) {
sessionAware.onActivityResultSessionSafe(requestCode, resultCode, intent);
}
Expand Down
6 changes: 3 additions & 3 deletions app/src/org/commcare/activities/SessionAwareListActivity.java
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -28,6 +27,7 @@ public void onCreateSessionSafe(Bundle savedInstanceState) {
@Override
protected void onResume() {
super.onResume();
SessionRegistrationHelper.registerSessionExpirationReceiver(this);
SessionAwareHelper.onResumeHelper(this, this, redirectedInOnCreate);
}

Expand All @@ -38,7 +38,7 @@ public void onResumeSessionSafe() {
@Override
protected void onPause() {
super.onPause();
SessionActivityRegistration.unregisterSessionExpirationReceiver(this);
SessionRegistrationHelper.unregisterSessionExpirationReceiver(this);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package org.commcare.activities;

import android.preference.PreferenceActivity;

import org.commcare.utils.SessionActivityRegistration;
import org.commcare.utils.SessionRegistrationHelper;

/**
* Manage redirection to login screen when session expiration occurs.
Expand All @@ -14,14 +12,14 @@ public class SessionAwarePreferenceActivity extends CommCarePreferenceActivity {
@Override
protected void onResume() {
super.onResume();

SessionActivityRegistration.handleOrListenForSessionExpiration(this);
SessionRegistrationHelper.registerSessionExpirationReceiver(this);
SessionRegistrationHelper.handleSessionExpiration(this);
}

@Override
protected void onPause() {
super.onPause();

SessionActivityRegistration.unregisterSessionExpirationReceiver(this);
SessionRegistrationHelper.unregisterSessionExpirationReceiver(this);
}
}
2 changes: 1 addition & 1 deletion app/src/org/commcare/utils/CommCareExceptionHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -40,9 +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) {
activity.registerReceiver(userSessionExpiredReceiver, expirationFilter);

public static boolean handleSessionExpiration(AppCompatActivity activity) {
synchronized (registrationLock) {
if (unredirectedSessionExpiration) {
unredirectedSessionExpiration = false;
Expand All @@ -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.
Expand Down

0 comments on commit 2aacf89

Please sign in to comment.