From 93168ce3e1a91b60cf002480d71957016fec8780 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Thu, 30 Jul 2015 12:25:26 -0500 Subject: [PATCH] Handle onNewIntent in singleTop activities Closes #296 --- build.gradle | 4 +- .../tasks/reminders/MissedCallActivity.java | 19 +++++-- .../org/tasks/reminders/MissedCallDialog.java | 20 +++---- .../tasks/reminders/NotificationActivity.java | 57 ++++++++++++++++--- .../tasks/reminders/NotificationDialog.java | 52 +++++++---------- .../org/tasks/reminders/SnoozeActivity.java | 13 ++++- 6 files changed, 107 insertions(+), 58 deletions(-) diff --git a/build.gradle b/build.gradle index f45d80c6c..89bae415d 100644 --- a/build.gradle +++ b/build.gradle @@ -27,8 +27,8 @@ android { buildToolsVersion "22.0.1" defaultConfig { - versionCode 372 - versionName "4.7.16" + versionCode 373 + versionName "4.7.17" minSdkVersion 7 targetSdkVersion 22 } diff --git a/src/main/java/org/tasks/reminders/MissedCallActivity.java b/src/main/java/org/tasks/reminders/MissedCallActivity.java index e2e08cd2a..761eefbc3 100644 --- a/src/main/java/org/tasks/reminders/MissedCallActivity.java +++ b/src/main/java/org/tasks/reminders/MissedCallActivity.java @@ -1,6 +1,5 @@ package org.tasks.reminders; -import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Bundle; @@ -17,7 +16,7 @@ import org.tasks.notifications.NotificationManager; import javax.inject.Inject; -public class MissedCallActivity extends InjectingAppCompatActivity implements DialogInterface.OnDismissListener, MissedCallDialog.MissedCallHandler { +public class MissedCallActivity extends InjectingAppCompatActivity implements MissedCallDialog.MissedCallHandler { private static final String FRAG_TAG_MISSED_CALL_FRAGMENT = "frag_tag_missed_call_fragment"; @@ -37,8 +36,17 @@ public class MissedCallActivity extends InjectingAppCompatActivity implements Di protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - Intent intent = getIntent(); + setup(getIntent()); + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + + setup(intent); + } + private void setup(Intent intent) { name = intent.getStringExtra(EXTRA_NAME); number = intent.getStringExtra(EXTRA_NUMBER); @@ -51,15 +59,14 @@ public class MissedCallActivity extends InjectingAppCompatActivity implements Di MissedCallDialog fragment = (MissedCallDialog) supportFragmentManager.findFragmentByTag(FRAG_TAG_MISSED_CALL_FRAGMENT); if (fragment == null) { fragment = new MissedCallDialog(); - fragment.setTitle(intent.getStringExtra(EXTRA_TITLE)); fragment.show(supportFragmentManager, FRAG_TAG_MISSED_CALL_FRAGMENT); } - fragment.setOnDismissListener(this); + fragment.setTitle(intent.getStringExtra(EXTRA_TITLE)); } } @Override - public void onDismiss(DialogInterface dialog) { + public void dismiss() { finish(); } diff --git a/src/main/java/org/tasks/reminders/MissedCallDialog.java b/src/main/java/org/tasks/reminders/MissedCallDialog.java index 358fed12a..b977f926c 100644 --- a/src/main/java/org/tasks/reminders/MissedCallDialog.java +++ b/src/main/java/org/tasks/reminders/MissedCallDialog.java @@ -23,14 +23,13 @@ public class MissedCallDialog extends InjectingDialogFragment { void callLater(); void ignore(); + + void dismiss(); } @Inject DialogBuilder dialogBuilder; - - private DialogInterface.OnDismissListener onDismissListener; private String title; - - MissedCallHandler handler; + private MissedCallHandler handler; @NonNull @Override @@ -56,24 +55,23 @@ public class MissedCallDialog extends InjectingDialogFragment { break; default: handler.ignore(); + break; } } }) .show(); } - public void setOnDismissListener(DialogInterface.OnDismissListener onDismissListener) { - this.onDismissListener = onDismissListener; - } - @Override public void onDismiss(DialogInterface dialog) { - if (onDismissListener != null) { - onDismissListener.onDismiss(dialog); - } + handler.dismiss(); } public void setTitle(String title) { this.title = title; + Dialog dialog = getDialog(); + if (dialog != null) { + dialog.setTitle(title); + } } } diff --git a/src/main/java/org/tasks/reminders/NotificationActivity.java b/src/main/java/org/tasks/reminders/NotificationActivity.java index 8392ccf7f..b7e028fe1 100644 --- a/src/main/java/org/tasks/reminders/NotificationActivity.java +++ b/src/main/java/org/tasks/reminders/NotificationActivity.java @@ -1,37 +1,80 @@ package org.tasks.reminders; -import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.FragmentManager; +import org.tasks.Broadcaster; import org.tasks.injection.InjectingAppCompatActivity; +import org.tasks.intents.TaskIntents; +import org.tasks.notifications.NotificationManager; -public class NotificationActivity extends InjectingAppCompatActivity implements DialogInterface.OnDismissListener { +import javax.inject.Inject; + +public class NotificationActivity extends InjectingAppCompatActivity implements NotificationDialog.NotificationHandler { private static final String FRAG_TAG_NOTIFICATION_FRAGMENT = "frag_tag_notification_fragment"; public static final String EXTRA_TITLE = "extra_title"; public static final String EXTRA_TASK_ID = "extra_task_id"; + @Inject Broadcaster broadcaster; + @Inject NotificationManager notificationManager; + private long taskId; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + setup(getIntent()); + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + + setup(intent); + } + + private void setup(Intent intent) { + + taskId = intent.getLongExtra(EXTRA_TASK_ID, 0L); + FragmentManager supportFragmentManager = getSupportFragmentManager(); NotificationDialog fragment = (NotificationDialog) supportFragmentManager.findFragmentByTag(FRAG_TAG_NOTIFICATION_FRAGMENT); if (fragment == null) { - Intent intent = getIntent(); fragment = new NotificationDialog(); - fragment.setTitle(intent.getStringExtra(EXTRA_TITLE)); - fragment.setTaskId(intent.getLongExtra(EXTRA_TASK_ID, 0L)); fragment.show(supportFragmentManager, FRAG_TAG_NOTIFICATION_FRAGMENT); } - fragment.setOnDismissListener(this); + fragment.setTitle(intent.getStringExtra(EXTRA_TITLE)); + } + + @Override + public void dismiss() { + finish(); + } + + @Override + public void edit() { + TaskIntents + .getEditTaskStack(this, null, taskId) + .startActivities(); + notificationManager.cancel(taskId); + finish(); + } + + @Override + public void snooze() { + finish(); + startActivity(new Intent(this, SnoozeActivity.class) {{ + setFlags(FLAG_ACTIVITY_NEW_TASK); + putExtra(SnoozeActivity.EXTRA_TASK_ID, taskId); + }}); } @Override - public void onDismiss(DialogInterface dialog) { + public void complete() { + broadcaster.completeTask(taskId); finish(); } } diff --git a/src/main/java/org/tasks/reminders/NotificationDialog.java b/src/main/java/org/tasks/reminders/NotificationDialog.java index bc296d526..9012f3272 100644 --- a/src/main/java/org/tasks/reminders/NotificationDialog.java +++ b/src/main/java/org/tasks/reminders/NotificationDialog.java @@ -2,16 +2,12 @@ package org.tasks.reminders; import android.app.Dialog; import android.content.DialogInterface; -import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; -import org.tasks.Broadcaster; import org.tasks.R; import org.tasks.dialogs.DialogBuilder; import org.tasks.injection.InjectingDialogFragment; -import org.tasks.intents.TaskIntents; -import org.tasks.notifications.NotificationManager; import java.util.List; @@ -21,13 +17,20 @@ import static java.util.Arrays.asList; public class NotificationDialog extends InjectingDialogFragment { - @Inject NotificationManager notificationManager; - @Inject Broadcaster broadcaster; + public interface NotificationHandler { + void edit(); + + void snooze(); + + void complete(); + + void dismiss(); + } + @Inject DialogBuilder dialogBuilder; - private long taskId; private String title; - private DialogInterface.OnDismissListener onDismissListener; + private NotificationHandler handler; @NonNull @Override @@ -37,6 +40,8 @@ public class NotificationDialog extends InjectingDialogFragment { getString(R.string.rmd_NoA_snooze), getString(R.string.rmd_NoA_done)); + handler = (NotificationHandler) getActivity(); + return dialogBuilder.newDialog() .setTitle(title) .setItems(items.toArray(new String[items.size()]), new DialogInterface.OnClickListener() { @@ -44,22 +49,13 @@ public class NotificationDialog extends InjectingDialogFragment { public void onClick(DialogInterface dialog, int which) { switch (which) { case 0: - TaskIntents - .getEditTaskStack(getActivity(), null, taskId) - .startActivities(); - notificationManager.cancel(taskId); - dismiss(); + handler.edit(); break; case 1: - dismiss(); - startActivity(new Intent(getActivity(), SnoozeActivity.class) {{ - setFlags(FLAG_ACTIVITY_NEW_TASK); - putExtra(SnoozeActivity.EXTRA_TASK_ID, taskId); - }}); + handler.snooze(); break; case 2: - broadcaster.completeTask(taskId); - dismiss(); + handler.complete(); break; } } @@ -67,22 +63,16 @@ public class NotificationDialog extends InjectingDialogFragment { .show(); } - public void setOnDismissListener(DialogInterface.OnDismissListener onDismissListener) { - this.onDismissListener = onDismissListener; - } - @Override public void onDismiss(DialogInterface dialog) { - if (onDismissListener != null) { - onDismissListener.onDismiss(dialog); - } + handler.dismiss(); } public void setTitle(String title) { this.title = title; - } - - public void setTaskId(long taskId) { - this.taskId = taskId; + Dialog dialog = getDialog(); + if (dialog != null) { + dialog.setTitle(title); + } } } diff --git a/src/main/java/org/tasks/reminders/SnoozeActivity.java b/src/main/java/org/tasks/reminders/SnoozeActivity.java index 9cbd57c9f..acdb57f22 100644 --- a/src/main/java/org/tasks/reminders/SnoozeActivity.java +++ b/src/main/java/org/tasks/reminders/SnoozeActivity.java @@ -37,7 +37,18 @@ public class SnoozeActivity extends InjectingAppCompatActivity implements Snooze protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - taskId = getIntent().getLongExtra(EXTRA_TASK_ID, 0L); + setup(getIntent(), savedInstanceState); + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + + setup(intent, null); + } + + private void setup(Intent intent, Bundle savedInstanceState) { + taskId = intent.getLongExtra(EXTRA_TASK_ID, 0L); if (savedInstanceState != null) { pickingDateTime = savedInstanceState.getBoolean(EXTRA_PICKING_DATE_TIME, false);