summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMakoto Onuki <omakoto@google.com>2010-09-22 15:35:20 -0700
committerMakoto Onuki <omakoto@google.com>2010-09-22 15:39:02 -0700
commite069246d48bf5f90dfe20dacd709d495173ebb47 (patch)
tree65ecc91a159fcbac64984dd1a9e11eb508f28db8
parent58843f0dc336983bde54307d7387dcfcfc461017 (diff)
downloadandroid_packages_apps_Email-e069246d48bf5f90dfe20dacd709d495173ebb47.tar.gz
android_packages_apps_Email-e069246d48bf5f90dfe20dacd709d495173ebb47.tar.bz2
android_packages_apps_Email-e069246d48bf5f90dfe20dacd709d495173ebb47.zip
Make sure callback is still registered when calling wrappee
This caused callback methods getting run after onDestroy() problem. Bug 2799534 Bug 3011802 Change-Id: Id505e328bbff096a9f7474c033443ff6663a5fdf
-rw-r--r--src/com/android/email/Controller.java12
-rw-r--r--src/com/android/email/ControllerResultUiThreadWrapper.java11
2 files changed, 23 insertions, 0 deletions
diff --git a/src/com/android/email/Controller.java b/src/com/android/email/Controller.java
index 81613204a..b200051b2 100644
--- a/src/com/android/email/Controller.java
+++ b/src/com/android/email/Controller.java
@@ -161,6 +161,7 @@ public class Controller {
*/
public void addResultCallback(Result listener) {
synchronized (mListeners) {
+ listener.setRegistered(true);
mListeners.add(listener);
}
}
@@ -174,6 +175,7 @@ public class Controller {
*/
public void removeResultCallback(Result listener) {
synchronized (mListeners) {
+ listener.setRegistered(false);
mListeners.remove(listener);
}
}
@@ -986,6 +988,16 @@ public class Controller {
* made from the UI thread, so you may need further handlers to safely make UI updates.
*/
public static abstract class Result {
+ private volatile boolean mRegistered;
+
+ private void setRegistered(boolean registered) {
+ mRegistered = registered;
+ }
+
+ protected final boolean isRegistered() {
+ return mRegistered;
+ }
+
/**
* Callback for updateMailboxList
*
diff --git a/src/com/android/email/ControllerResultUiThreadWrapper.java b/src/com/android/email/ControllerResultUiThreadWrapper.java
index d4e5fd9cc..f4f949204 100644
--- a/src/com/android/email/ControllerResultUiThreadWrapper.java
+++ b/src/com/android/email/ControllerResultUiThreadWrapper.java
@@ -54,6 +54,11 @@ public class ControllerResultUiThreadWrapper<T extends Result> extends Result {
final long attachmentId, final int progress) {
run(new Runnable() {
public void run() {
+ /* It's possible this callback is unregistered after this Runnable was posted and
+ * sitting in the handler queue, so we always need to check if it's still registered
+ * on the UI thread.
+ */
+ if (!isRegistered()) return;
mWrappee.loadAttachmentCallback(result, messageId, attachmentId, progress);
}
});
@@ -64,6 +69,7 @@ public class ControllerResultUiThreadWrapper<T extends Result> extends Result {
final long messageId, final int progress) {
run(new Runnable() {
public void run() {
+ if (!isRegistered()) return;
mWrappee.loadMessageForViewCallback(result, messageId, progress);
}
});
@@ -74,6 +80,7 @@ public class ControllerResultUiThreadWrapper<T extends Result> extends Result {
final long messageId, final int progress) {
run(new Runnable() {
public void run() {
+ if (!isRegistered()) return;
mWrappee.sendMailCallback(result, accountId, messageId, progress);
}
});
@@ -84,6 +91,7 @@ public class ControllerResultUiThreadWrapper<T extends Result> extends Result {
final long mailboxId, final int progress, final long tag) {
run(new Runnable() {
public void run() {
+ if (!isRegistered()) return;
mWrappee.serviceCheckMailCallback(result, accountId, mailboxId, progress, tag);
}
});
@@ -94,6 +102,7 @@ public class ControllerResultUiThreadWrapper<T extends Result> extends Result {
final long mailboxId, final int progress, final int numNewMessages) {
run(new Runnable() {
public void run() {
+ if (!isRegistered()) return;
mWrappee.updateMailboxCallback(result, accountId, mailboxId, progress,
numNewMessages);
}
@@ -105,6 +114,7 @@ public class ControllerResultUiThreadWrapper<T extends Result> extends Result {
final int progress) {
run(new Runnable() {
public void run() {
+ if (!isRegistered()) return;
mWrappee.updateMailboxListCallback(result, accountId, progress);
}
});
@@ -114,6 +124,7 @@ public class ControllerResultUiThreadWrapper<T extends Result> extends Result {
public void deleteAccountCallback(final long accountId) {
run(new Runnable() {
public void run() {
+ if (!isRegistered()) return;
mWrappee.deleteAccountCallback(accountId);
}
});