diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml
index 58f584e51..4aef01eee 100644
--- a/src/main/AndroidManifest.xml
+++ b/src/main/AndroidManifest.xml
@@ -304,7 +304,10 @@
+ android:theme="@style/Tasks.Dialog"
+ android:taskAffinity=""
+ android:excludeFromRecents="true"
+ android:launchMode="singleTask"/>
diff --git a/src/main/java/com/todoroo/astrid/calls/MissedCallActivity.java b/src/main/java/com/todoroo/astrid/calls/MissedCallActivity.java
index 1952aa8f2..4684e61b9 100644
--- a/src/main/java/com/todoroo/astrid/calls/MissedCallActivity.java
+++ b/src/main/java/com/todoroo/astrid/calls/MissedCallActivity.java
@@ -13,7 +13,6 @@ import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
-import android.support.v7.app.AlertDialog;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
@@ -31,7 +30,7 @@ import com.todoroo.astrid.service.TaskService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.tasks.R;
-import org.tasks.injection.InjectingActivity;
+import org.tasks.injection.InjectingFragmentActivity;
import org.tasks.preferences.ActivityPreferences;
import org.tasks.preferences.BasicPreferences;
import org.tasks.preferences.ResourceResolver;
@@ -40,7 +39,7 @@ import java.io.InputStream;
import javax.inject.Inject;
-public class MissedCallActivity extends InjectingActivity {
+public class MissedCallActivity extends InjectingFragmentActivity {
private static final Logger log = LoggerFactory.getLogger(MissedCallActivity.class);
@@ -53,6 +52,7 @@ public class MissedCallActivity extends InjectingActivity {
// Prompt user to ignore all missed calls after this many ignore presses
private static final int IGNORE_PROMPT_COUNT = 3;
+ private static final String FRAG_TAG_SNOOZE_DIALOG = "frag_tag_snooze_dialog";
@Inject StartupService startupService;
@Inject TaskService taskService;
@@ -195,24 +195,25 @@ public class MissedCallActivity extends InjectingActivity {
taskTitle = getString(R.string.MCA_task_title_name, name, number);
dialogTitle = getString(R.string.MCA_schedule_dialog_title, name);
}
- SnoozeDialog sd = new SnoozeDialog(MissedCallActivity.this, new SnoozeCallback() {
+ SnoozeDialog snoozeDialog = new SnoozeDialog();
+ snoozeDialog.setTitle(dialogTitle);
+ snoozeDialog.setSnoozeCallback(new SnoozeCallback() {
@Override
public void snoozeForTime(long time) {
-
Task newTask = new Task();
newTask.setTitle(taskTitle);
newTask.setDueDate(time);
taskService.save(newTask);
-
finish();
}
});
- new AlertDialog.Builder(MissedCallActivity.this)
- .setTitle(dialogTitle)
- .setView(sd)
- .setPositiveButton(android.R.string.ok, sd)
- .setNegativeButton(android.R.string.cancel, null)
- .show().setOwnerActivity(MissedCallActivity.this);
+ snoozeDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
+ @Override
+ public void onDismiss(DialogInterface dialog) {
+ finish();
+ }
+ });
+ snoozeDialog.show(getSupportFragmentManager(), FRAG_TAG_SNOOZE_DIALOG);
}
});
}
diff --git a/src/main/java/com/todoroo/astrid/reminders/NotificationFragment.java b/src/main/java/com/todoroo/astrid/reminders/NotificationFragment.java
index a6bffd066..ab254d41f 100644
--- a/src/main/java/com/todoroo/astrid/reminders/NotificationFragment.java
+++ b/src/main/java/com/todoroo/astrid/reminders/NotificationFragment.java
@@ -60,7 +60,7 @@ public class NotificationFragment extends TaskListFragment {
public void onClick(View arg0) {
dismiss();
activity.startActivity(new Intent(activity, SnoozeActivity.class) {{
- putExtra(SnoozeActivity.TASK_ID, taskId);
+ putExtra(SnoozeActivity.EXTRA_TASK_ID, taskId);
}});
}
});
diff --git a/src/main/java/com/todoroo/astrid/reminders/ShowNotificationReceiver.java b/src/main/java/com/todoroo/astrid/reminders/ShowNotificationReceiver.java
index 50a242d16..6fb9de1f5 100644
--- a/src/main/java/com/todoroo/astrid/reminders/ShowNotificationReceiver.java
+++ b/src/main/java/com/todoroo/astrid/reminders/ShowNotificationReceiver.java
@@ -127,8 +127,8 @@ public class ShowNotificationReceiver extends InjectingBroadcastReceiver {
}}, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent snoozePendingIntent = PendingIntent.getActivity(context, notificationId, new Intent(context, SnoozeActivity.class) {{
- setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
- putExtra(SnoozeActivity.TASK_ID, taskId);
+ setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ putExtra(SnoozeActivity.EXTRA_TASK_ID, taskId);
}}, PendingIntent.FLAG_UPDATE_CURRENT);
builder.addAction(R.drawable.ic_action_tick_white, context.getResources().getString(R.string.rmd_NoA_done), completeIntent)
diff --git a/src/main/java/com/todoroo/astrid/reminders/SnoozeDialog.java b/src/main/java/com/todoroo/astrid/reminders/SnoozeDialog.java
index a8eec1cd0..807e258a5 100644
--- a/src/main/java/com/todoroo/astrid/reminders/SnoozeDialog.java
+++ b/src/main/java/com/todoroo/astrid/reminders/SnoozeDialog.java
@@ -1,12 +1,15 @@
package com.todoroo.astrid.reminders;
-import android.app.Activity;
+import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v4.app.DialogFragment;
+import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
-import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.Spinner;
@@ -17,61 +20,98 @@ import com.todoroo.astrid.ui.NumberPicker;
import org.tasks.R;
-public class SnoozeDialog extends FrameLayout implements DialogInterface.OnClickListener {
+import butterknife.ButterKnife;
+import butterknife.InjectView;
- LinearLayout snoozePicker;
- NumberPicker snoozeValue;
- Spinner snoozeUnits;
- SnoozeCallback snoozeCallback;
+public class SnoozeDialog extends DialogFragment {
- public SnoozeDialog(Activity activity, SnoozeCallback callback) {
- super(activity);
- this.snoozeCallback = callback;
+ @InjectView(R.id.snoozePicker) LinearLayout snoozePicker;
+ @InjectView(R.id.numberPicker) NumberPicker snoozeValue;
+ @InjectView(R.id.numberUnits) Spinner snoozeUnits;
- LayoutInflater mInflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- mInflater.inflate(R.layout.snooze_dialog, this, true);
+ private SnoozeCallback snoozeCallback;
+ private DialogInterface.OnDismissListener onDismissListener;
+ private String title;
- snoozePicker = (LinearLayout) findViewById(R.id.snoozePicker);
- snoozeValue = (NumberPicker) findViewById(R.id.numberPicker);
- snoozeUnits = (Spinner) findViewById(R.id.numberUnits);
+ @NonNull
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ LayoutInflater mInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ View layout = mInflater.inflate(R.layout.snooze_dialog, null);
+ ButterKnife.inject(this, layout);
snoozeValue.setIncrementBy(1);
snoozeValue.setRange(1, 99);
snoozeUnits.setSelection(RepeatControlSet.INTERVAL_HOURS);
- snoozeUnits.setOnTouchListener(new OnTouchListener() {
+ snoozeUnits.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
- AndroidUtilities.hideSoftInputForViews(getContext(), snoozePicker);
+ AndroidUtilities.hideSoftInputForViews(getActivity(), snoozePicker);
return false;
}
});
+
+ return new AlertDialog.Builder(getActivity(), R.style.Tasks_Dialog)
+ .setTitle(title)
+ .setView(layout)
+ .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ long time = DateUtilities.now();
+ int value = snoozeValue.getCurrent();
+ switch (snoozeUnits.getSelectedItemPosition()) {
+ case RepeatControlSet.INTERVAL_DAYS:
+ time += value * DateUtilities.ONE_DAY;
+ break;
+ case RepeatControlSet.INTERVAL_HOURS:
+ time += value * DateUtilities.ONE_HOUR;
+ break;
+ case RepeatControlSet.INTERVAL_MINUTES:
+ time += value * DateUtilities.ONE_MINUTE;
+ break;
+ case RepeatControlSet.INTERVAL_WEEKS:
+ time += value * 7 * DateUtilities.ONE_DAY;
+ break;
+ case RepeatControlSet.INTERVAL_MONTHS:
+ time = DateUtilities.addCalendarMonthsToUnixtime(time, 1);
+ break;
+ case RepeatControlSet.INTERVAL_YEARS:
+ time = DateUtilities.addCalendarMonthsToUnixtime(time, 12);
+ break;
+ }
+
+ snoozeCallback.snoozeForTime(time);
+ }
+ })
+ .setOnDismissListener(this)
+ .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+
+ }
+ })
+ .show();
+
}
@Override
- public void onClick(DialogInterface dialog, int which) {
- long time = DateUtilities.now();
- int value = snoozeValue.getCurrent();
- switch(snoozeUnits.getSelectedItemPosition()) {
- case RepeatControlSet.INTERVAL_DAYS:
- time += value * DateUtilities.ONE_DAY;
- break;
- case RepeatControlSet.INTERVAL_HOURS:
- time += value * DateUtilities.ONE_HOUR;
- break;
- case RepeatControlSet.INTERVAL_MINUTES:
- time += value * DateUtilities.ONE_MINUTE;
- break;
- case RepeatControlSet.INTERVAL_WEEKS:
- time += value * 7 * DateUtilities.ONE_DAY;
- break;
- case RepeatControlSet.INTERVAL_MONTHS:
- time = DateUtilities.addCalendarMonthsToUnixtime(time, 1);
- break;
- case RepeatControlSet.INTERVAL_YEARS:
- time = DateUtilities.addCalendarMonthsToUnixtime(time, 12);
- break;
+ public void onDismiss(DialogInterface dialog) {
+ super.onDismiss(dialog);
+
+ if (onDismissListener != null) {
+ onDismissListener.onDismiss(dialog);
}
+ }
+
+ public void setSnoozeCallback(SnoozeCallback snoozeCallback) {
+ this.snoozeCallback = snoozeCallback;
+ }
+
+ public void setOnDismissListener(DialogInterface.OnDismissListener onDismissListener) {
+ this.onDismissListener = onDismissListener;
+ }
- snoozeCallback.snoozeForTime(time);
+ public void setTitle(String title) {
+ this.title = title;
}
}
\ No newline at end of file
diff --git a/src/main/java/org/tasks/injection/InjectingFragmentActivity.java b/src/main/java/org/tasks/injection/InjectingFragmentActivity.java
new file mode 100644
index 000000000..c12e56cf6
--- /dev/null
+++ b/src/main/java/org/tasks/injection/InjectingFragmentActivity.java
@@ -0,0 +1,28 @@
+package org.tasks.injection;
+
+import android.os.Bundle;
+import android.support.v4.app.FragmentActivity;
+
+import dagger.ObjectGraph;
+
+public abstract class InjectingFragmentActivity extends FragmentActivity implements Injector {
+ private ObjectGraph objectGraph;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ objectGraph = ((Injector) getApplication()).getObjectGraph().plus(new ActivityModule(this));
+ inject(this);
+
+ super.onCreate(savedInstanceState);
+ }
+
+ @Override
+ public void inject(Object caller) {
+ objectGraph.inject(caller);
+ }
+
+ @Override
+ public ObjectGraph getObjectGraph() {
+ return objectGraph;
+ }
+}
diff --git a/src/main/java/org/tasks/reminders/SnoozeActivity.java b/src/main/java/org/tasks/reminders/SnoozeActivity.java
index 25710f95a..0907a0626 100644
--- a/src/main/java/org/tasks/reminders/SnoozeActivity.java
+++ b/src/main/java/org/tasks/reminders/SnoozeActivity.java
@@ -2,7 +2,7 @@ package org.tasks.reminders;
import android.content.DialogInterface;
import android.os.Bundle;
-import android.support.v7.app.AlertDialog;
+import android.support.v4.app.FragmentManager;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.reminders.SnoozeCallback;
@@ -11,55 +11,56 @@ import com.todoroo.astrid.service.StartupService;
import com.todoroo.astrid.service.TaskService;
import org.tasks.R;
-import org.tasks.injection.InjectingActivity;
+import org.tasks.injection.InjectingAppCompatActivity;
+import org.tasks.injection.InjectingFragmentActivity;
import org.tasks.notifications.NotificationManager;
-import org.tasks.preferences.ActivityPreferences;
import javax.inject.Inject;
-public class SnoozeActivity extends InjectingActivity {
+public class SnoozeActivity extends InjectingFragmentActivity implements SnoozeCallback, DialogInterface.OnDismissListener {
- public static final String TASK_ID = "id";
+ private static final String FRAG_TAG_SNOOZE_DIALOG = "frag_tag_snooze_dialog";
+
+ public static final String EXTRA_TASK_ID = "id";
@Inject StartupService startupService;
- @Inject ActivityPreferences preferences;
@Inject TaskService taskService;
@Inject NotificationManager notificationManager;
+ private long taskId;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- preferences.applyTranslucentDialogTheme();
+
startupService.onStartupApplication(this);
- long taskId = getIntent().getLongExtra(TASK_ID, 0L);
- snooze(taskId);
+
+ FragmentManager supportFragmentManager = getSupportFragmentManager();
+ SnoozeDialog fragmentByTag = (SnoozeDialog) supportFragmentManager.findFragmentByTag(FRAG_TAG_SNOOZE_DIALOG);
+ if (fragmentByTag == null) {
+ fragmentByTag = new SnoozeDialog();
+ fragmentByTag.show(supportFragmentManager, FRAG_TAG_SNOOZE_DIALOG);
+ }
+ taskId = getIntent().getLongExtra(EXTRA_TASK_ID, 0L);
+ fragmentByTag.setOnDismissListener(this);
+ fragmentByTag.setTitle(getString(R.string.rmd_NoA_snooze));
+ fragmentByTag.setSnoozeCallback(this);
}
- private void snooze(final long taskId) {
- SnoozeCallback callback = new SnoozeCallback() {
- @Override
- public void snoozeForTime(long time) {
- setResult(RESULT_OK);
- Task task = new Task();
- task.setId(taskId);
- task.setReminderSnooze(time);
- taskService.save(task);
- notificationManager.cancel(taskId);
- finish();
- }
- };
- SnoozeDialog sd = new SnoozeDialog(this, callback);
- new AlertDialog.Builder(this)
- .setTitle(R.string.rmd_NoA_snooze)
- .setView(sd)
- .setPositiveButton(android.R.string.ok, sd)
- .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- setResult(RESULT_CANCELED);
- finish();
- }
- })
- .show().setOwnerActivity(this);
+ @Override
+ public void snoozeForTime(long time) {
+ setResult(RESULT_OK);
+ Task task = new Task();
+ task.setId(taskId);
+ task.setReminderSnooze(time);
+ taskService.save(task);
+ notificationManager.cancel(taskId);
+ finish();
+ }
+
+ @Override
+ public void onDismiss(DialogInterface dialog) {
+ setResult(RESULT_CANCELED);
+ finish();
}
}
diff --git a/src/main/res/layout/snooze_dialog.xml b/src/main/res/layout/snooze_dialog.xml
index ed1aa3e95..b92cdf0a3 100644
--- a/src/main/res/layout/snooze_dialog.xml
+++ b/src/main/res/layout/snooze_dialog.xml
@@ -20,7 +20,7 @@
+ android:padding="16dp">
+ android:layout_height="wrap_content" />