diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 543f704be..aa8e91c1d 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -137,10 +137,6 @@
-
-
= 1 && firstDayOfWeek <= 7) {
- datePickerDialog.setFirstDayOfWeek(firstDayOfWeek);
- }
- datePickerDialog.show(fragmentManager, FRAG_TAG_DATE_PICKER);
+ if (fragmentManager.findFragmentByTag(FRAG_TAG_DATE_PICKER) == null) {
+ newDatePicker(null, 0, initial.getMillis())
+ .show(getSupportFragmentManager(), FRAG_TAG_DATE_PICKER);
}
- datePickerDialog.setOnCancelListener(this);
- datePickerDialog.setOnDateSetListener(this);
}
@Override
@@ -76,18 +63,18 @@ public class DateAndTimePickerActivity extends InjectingAppCompatActivity
}
@Override
- public void onDateSet(DatePickerDialog datePickerDialog, int year, int month, int day) {
- datePickerDialog.dismiss();
- dateSelected = true;
- final long timestamp =
- new DateTime(year, month + 1, day).withMillisOfDay(initial.getMillisOfDay()).getMillis();
- newTimePicker(null, 0, timestamp)
- .show(getSupportFragmentManager(), FRAG_TAG_TIME_PICKER);
- }
-
- @Override
- public void onCancel(DialogInterface dialog) {
- finish();
+ public void onDatePicked(DialogInterface dialog, long timestamp) {
+ if (timestamp == MyDatePickerDialog.NO_DATE) {
+ finish();
+ } else {
+ dialog.dismiss();
+ dateSelected = true;
+ newTimePicker(
+ null,
+ 0,
+ new DateTime(timestamp).withMillisOfDay(initial.getMillisOfDay()).getMillis())
+ .show(getSupportFragmentManager(), FRAG_TAG_TIME_PICKER);
+ }
}
@Override
diff --git a/app/src/main/java/org/tasks/activities/DatePickerActivity.java b/app/src/main/java/org/tasks/activities/DatePickerActivity.java
deleted file mode 100644
index 744357081..000000000
--- a/app/src/main/java/org/tasks/activities/DatePickerActivity.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package org.tasks.activities;
-
-import static org.tasks.time.DateTimeUtils.currentTimeMillis;
-
-import android.content.Intent;
-import android.os.Bundle;
-import androidx.fragment.app.FragmentManager;
-import com.wdullaer.materialdatetimepicker.date.DatePickerDialog;
-import javax.inject.Inject;
-import org.tasks.dialogs.MyDatePickerDialog;
-import org.tasks.injection.ActivityComponent;
-import org.tasks.injection.InjectingAppCompatActivity;
-import org.tasks.preferences.Preferences;
-import org.tasks.themes.ThemeAccent;
-import org.tasks.themes.ThemeBase;
-import org.tasks.time.DateTime;
-
-public class DatePickerActivity extends InjectingAppCompatActivity
- implements DatePickerDialog.OnDateSetListener {
-
- public static final String EXTRA_TIMESTAMP = "extra_timestamp";
- private static final String FRAG_TAG_DATE_PICKER = "frag_tag_date_picker";
- @Inject ThemeBase themeBase;
- @Inject ThemeAccent themeAccent;
- @Inject Preferences preferences;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- long timestamp = getIntent().getLongExtra(EXTRA_TIMESTAMP, currentTimeMillis());
- DateTime initial = (timestamp > 0 ? new DateTime(timestamp) : new DateTime()).startOfDay();
-
- FragmentManager fragmentManager = getSupportFragmentManager();
- MyDatePickerDialog dialog =
- (MyDatePickerDialog) fragmentManager.findFragmentByTag(FRAG_TAG_DATE_PICKER);
- if (dialog == null) {
- dialog = new MyDatePickerDialog();
- dialog.initialize(
- null, initial.getYear(), initial.getMonthOfYear() - 1, initial.getDayOfMonth());
- dialog.setVersion(DatePickerDialog.Version.VERSION_2);
- dialog.setThemeDark(themeBase.isDarkTheme(this));
- dialog.setAccentColor(themeAccent.getAccentColor());
- int firstDayOfWeek = preferences.getFirstDayOfWeek();
- if (firstDayOfWeek >= 1 && firstDayOfWeek <= 7) {
- dialog.setFirstDayOfWeek(firstDayOfWeek);
- }
- dialog.show(fragmentManager, FRAG_TAG_DATE_PICKER);
- }
- dialog.setOnCancelListener(dialogInterface -> finish());
- dialog.setOnDateSetListener(this);
- }
-
- @Override
- public void inject(ActivityComponent component) {
- component.inject(this);
- }
-
- @Override
- public void onDateSet(
- DatePickerDialog view, final int year, final int monthOfYear, final int dayOfMonth) {
- Intent data = new Intent();
- data.putExtra(EXTRA_TIMESTAMP, new DateTime(year, monthOfYear + 1, dayOfMonth).getMillis());
- setResult(RESULT_OK, data);
- finish();
- }
-}
diff --git a/app/src/main/java/org/tasks/dialogs/MyDatePickerDialog.java b/app/src/main/java/org/tasks/dialogs/MyDatePickerDialog.java
index a319ee8f4..90e2878c0 100644
--- a/app/src/main/java/org/tasks/dialogs/MyDatePickerDialog.java
+++ b/app/src/main/java/org/tasks/dialogs/MyDatePickerDialog.java
@@ -1,23 +1,90 @@
package org.tasks.dialogs;
+import static android.app.Activity.RESULT_OK;
+import static org.tasks.time.DateTimeUtils.currentTimeMillis;
+
+import android.content.Context;
import android.content.DialogInterface;
+import android.content.Intent;
+import android.os.Bundle;
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
import com.wdullaer.materialdatetimepicker.date.DatePickerDialog;
+import com.wdullaer.materialdatetimepicker.date.DatePickerDialog.OnDateSetListener;
+import org.tasks.R;
+import org.tasks.preferences.Preferences;
+import org.tasks.time.DateTime;
+
+public class MyDatePickerDialog extends DatePickerDialog implements OnDateSetListener {
+
+ public static final String EXTRA_TIMESTAMP = "extra_timestamp";
+ public static final int NO_DATE = -1;
+
+ public static MyDatePickerDialog newDatePicker(Fragment target, int rc, long initial) {
+ Bundle arguments = new Bundle();
+ arguments.putLong(EXTRA_TIMESTAMP, initial);
+ MyDatePickerDialog dialog = new MyDatePickerDialog();
+ dialog.setArguments(arguments);
+ dialog.setTargetFragment(target, rc);
+ return dialog;
+ }
+
+ public interface DatePickerCallback{ // TODO: remove this after removing DateAndTimePickerActivity
+ void onDatePicked(DialogInterface dialog, long timestamp);
+ }
+
+ private DatePickerCallback callback;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ if (savedInstanceState == null) {
+ long timestamp = getArguments().getLong(EXTRA_TIMESTAMP, currentTimeMillis());
+ DateTime initial = (timestamp > 0 ? new DateTime(timestamp) : new DateTime()).startOfDay();
+ initialize(
+ null,
+ initial.getYear(),
+ initial.getMonthOfYear() - 1,
+ initial.getDayOfMonth());
+ setVersion(DatePickerDialog.Version.VERSION_2);
+ int firstDayOfWeek = new Preferences(getContext()).getFirstDayOfWeek();
+ if (firstDayOfWeek >= 1 && firstDayOfWeek <= 7) {
+ setFirstDayOfWeek(firstDayOfWeek);
+ }
+ setThemeDark(getResources().getBoolean(R.bool.is_dark)); // TODO: remove this after removing DateAndTimePickerActivity
+ }
-public class MyDatePickerDialog extends DatePickerDialog {
+ setOnDateSetListener(this);
- private DialogInterface.OnCancelListener listener;
+ super.onCreate(savedInstanceState);
+ }
@Override
- public void setOnCancelListener(DialogInterface.OnCancelListener listener) {
- this.listener = listener;
+ public void onAttach(@NonNull Context context) {
+ super.onAttach(context);
+
+ if (context instanceof DatePickerCallback) {
+ callback = (DatePickerCallback) context;
+ }
}
@Override
public void onCancel(DialogInterface dialog) {
super.onCancel(dialog);
- if (listener != null) {
- listener.onCancel(dialog);
+ if (getTargetFragment() == null) {
+ callback.onDatePicked(dialog, NO_DATE);
+ }
+ }
+
+ @Override
+ public void onDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth) {
+ long result = new DateTime(year, monthOfYear + 1, dayOfMonth).getMillis();
+ if (getTargetFragment() == null) {
+ callback.onDatePicked(getDialog(), result);
+ } else {
+ Intent data = new Intent();
+ data.putExtra(EXTRA_TIMESTAMP, result);
+ getTargetFragment().onActivityResult(getTargetRequestCode(), RESULT_OK, data);
}
}
}
diff --git a/app/src/main/java/org/tasks/injection/ActivityComponent.java b/app/src/main/java/org/tasks/injection/ActivityComponent.java
index 2356b7af3..8ecad47bb 100644
--- a/app/src/main/java/org/tasks/injection/ActivityComponent.java
+++ b/app/src/main/java/org/tasks/injection/ActivityComponent.java
@@ -10,7 +10,6 @@ import com.todoroo.astrid.gtasks.auth.GtasksLoginActivity;
import dagger.Subcomponent;
import org.tasks.activities.CameraActivity;
import org.tasks.activities.DateAndTimePickerActivity;
-import org.tasks.activities.DatePickerActivity;
import org.tasks.activities.FilterSelectionActivity;
import org.tasks.activities.FilterSettingsActivity;
import org.tasks.activities.GoogleTaskListSettingsActivity;
@@ -85,8 +84,6 @@ public interface ActivityComponent {
void inject(DateAndTimePickerActivity dateAndTimePickerActivity);
- void inject(DatePickerActivity datePickerActivity);
-
void inject(CameraActivity cameraActivity);
void inject(VoiceCommandActivity voiceCommandActivity);
diff --git a/app/src/main/java/org/tasks/repeats/CustomRecurrenceDialog.java b/app/src/main/java/org/tasks/repeats/CustomRecurrenceDialog.java
index 68970342b..389b66183 100644
--- a/app/src/main/java/org/tasks/repeats/CustomRecurrenceDialog.java
+++ b/app/src/main/java/org/tasks/repeats/CustomRecurrenceDialog.java
@@ -10,6 +10,7 @@ import static com.google.ical.values.Frequency.WEEKLY;
import static com.google.ical.values.Frequency.YEARLY;
import static java.util.Arrays.asList;
import static org.tasks.date.DateTimeUtils.newDateTime;
+import static org.tasks.dialogs.MyDatePickerDialog.newDatePicker;
import static org.tasks.time.DateTimeUtils.currentTimeMillis;
import android.app.Activity;
@@ -59,8 +60,8 @@ import java.util.Collections;
import java.util.List;
import javax.inject.Inject;
import org.tasks.R;
-import org.tasks.activities.DatePickerActivity;
import org.tasks.dialogs.DialogBuilder;
+import org.tasks.dialogs.MyDatePickerDialog;
import org.tasks.injection.DialogFragmentComponent;
import org.tasks.injection.ForActivity;
import org.tasks.injection.InjectingDialogFragment;
@@ -75,6 +76,7 @@ public class CustomRecurrenceDialog extends InjectingDialogFragment {
asList(MINUTELY, HOURLY, DAILY, WEEKLY, MONTHLY, YEARLY);
private static final String EXTRA_RRULE = "extra_rrule";
private static final String EXTRA_DATE = "extra_date";
+ private static final String FRAG_TAG_DATE_PICKER = "frag_tag_date_picker";
private static final int REQUEST_PICK_DATE = 505;
private final List repeatUntilOptions = new ArrayList<>();
@Inject @ForActivity Context context;
@@ -517,10 +519,9 @@ public class CustomRecurrenceDialog extends InjectingDialogFragment {
}
private void repeatUntilClick() {
- Intent intent = new Intent(context, DatePickerActivity.class);
long repeatUntil = DateTime.from(rrule.getUntil()).getMillis();
- intent.putExtra(DatePickerActivity.EXTRA_TIMESTAMP, repeatUntil > 0 ? repeatUntil : 0L);
- startActivityForResult(intent, REQUEST_PICK_DATE);
+ newDatePicker(this, REQUEST_PICK_DATE, repeatUntil > 0 ? repeatUntil : 0L)
+ .show(getParentFragmentManager(), FRAG_TAG_DATE_PICKER);
}
private void updateRepeatUntilOptions() {
@@ -554,7 +555,7 @@ public class CustomRecurrenceDialog extends InjectingDialogFragment {
if (requestCode == REQUEST_PICK_DATE) {
if (resultCode == Activity.RESULT_OK) {
rrule.setUntil(
- new DateTime(data.getLongExtra(DatePickerActivity.EXTRA_TIMESTAMP, 0L)).toDateValue());
+ new DateTime(data.getLongExtra(MyDatePickerDialog.EXTRA_TIMESTAMP, 0L)).toDateValue());
rrule.setCount(0);
}
updateRepeatUntilOptions();
diff --git a/app/src/main/java/org/tasks/ui/DeadlineControlSet.java b/app/src/main/java/org/tasks/ui/DeadlineControlSet.java
index 74a65a06b..af36707d8 100644
--- a/app/src/main/java/org/tasks/ui/DeadlineControlSet.java
+++ b/app/src/main/java/org/tasks/ui/DeadlineControlSet.java
@@ -4,6 +4,7 @@ import static androidx.core.content.ContextCompat.getColor;
import static com.google.common.collect.Lists.newArrayList;
import static java.util.Arrays.asList;
import static org.tasks.date.DateTimeUtils.newDateTime;
+import static org.tasks.dialogs.MyDatePickerDialog.newDatePicker;
import static org.tasks.dialogs.MyTimePickerDialog.newTimePicker;
import android.app.Activity;
@@ -33,7 +34,7 @@ import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import org.tasks.R;
-import org.tasks.activities.DatePickerActivity;
+import org.tasks.dialogs.MyDatePickerDialog;
import org.tasks.dialogs.MyTimePickerDialog;
import org.tasks.injection.ForActivity;
import org.tasks.injection.FragmentComponent;
@@ -48,6 +49,7 @@ public class DeadlineControlSet extends TaskEditControlFragment {
private static final int REQUEST_TIME = 505;
private static final String EXTRA_DATE = "extra_date";
private static final String EXTRA_TIME = "extra_time";
+ private static final String FRAG_TAG_DATE_PICKER = "frag_tag_date_picker";
private static final String FRAG_TAG_TIME_PICKER = "frag_tag_time_picker";
@Inject Preferences preferences;
@@ -236,9 +238,8 @@ public class DeadlineControlSet extends TaskEditControlFragment {
setDate(today.plusWeeks(1).getMillis());
break;
case 4:
- Intent intent = new Intent(context, DatePickerActivity.class);
- intent.putExtra(DatePickerActivity.EXTRA_TIMESTAMP, date);
- startActivityForResult(intent, REQUEST_DATE);
+ newDatePicker(this, REQUEST_DATE, date)
+ .show(getParentFragmentManager(), FRAG_TAG_DATE_PICKER);
updateDueDateOptions();
break;
}
@@ -305,7 +306,7 @@ public class DeadlineControlSet extends TaskEditControlFragment {
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_DATE) {
if (resultCode == Activity.RESULT_OK) {
- long timestamp = data.getLongExtra(DatePickerActivity.EXTRA_TIMESTAMP, 0L);
+ long timestamp = data.getLongExtra(MyDatePickerDialog.EXTRA_TIMESTAMP, 0L);
DateTime dateTime = new DateTime(timestamp);
setDate(dateTime.getMillis());
} else {