From 32b3f15901a7a767d3b1d7fae25f4582a1e77534 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Fri, 28 Feb 2020 10:56:54 -0600 Subject: [PATCH] Remove DatePickerActivity --- app/src/main/AndroidManifest.xml | 4 - .../activities/DateAndTimePickerActivity.java | 47 ++++------- .../tasks/activities/DatePickerActivity.java | 66 ---------------- .../org/tasks/dialogs/MyDatePickerDialog.java | 79 +++++++++++++++++-- .../tasks/injection/ActivityComponent.java | 3 - .../tasks/repeats/CustomRecurrenceDialog.java | 11 +-- .../java/org/tasks/ui/DeadlineControlSet.java | 11 +-- 7 files changed, 102 insertions(+), 119 deletions(-) delete mode 100644 app/src/main/java/org/tasks/activities/DatePickerActivity.java 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 {