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" />