From 0be6cecc2f61be2a0fc0094ca2775a5a9b7e1a1c Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Thu, 2 Mar 2017 11:18:46 -0600 Subject: [PATCH] Handle rotation in native datetime pickers --- .../tasks/dialogs/NativeDatePickerDialog.java | 24 +++++++++++++----- .../tasks/dialogs/NativeTimePickerDialog.java | 25 ++++++++++++------- .../InjectingNativeDialogFragment.java | 11 ++++++++ 3 files changed, 45 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/tasks/dialogs/NativeDatePickerDialog.java b/src/main/java/org/tasks/dialogs/NativeDatePickerDialog.java index d1d3b9754..e5e6b97cb 100644 --- a/src/main/java/org/tasks/dialogs/NativeDatePickerDialog.java +++ b/src/main/java/org/tasks/dialogs/NativeDatePickerDialog.java @@ -16,9 +16,17 @@ import javax.inject.Inject; public class NativeDatePickerDialog extends InjectingNativeDialogFragment implements DatePickerDialog.OnDateSetListener { + private static final String EXTRA_YEAR = "extra_year"; + private static final String EXTRA_MONTH = "extra_month"; + private static final String EXTRA_DAY = "extra_day"; + public static NativeDatePickerDialog newNativeDatePickerDialog(DateTime initial) { NativeDatePickerDialog dialog = new NativeDatePickerDialog(); - dialog.initial = initial; + Bundle args = new Bundle(); + args.putInt(EXTRA_YEAR, initial.getYear()); + args.putInt(EXTRA_MONTH, initial.getMonthOfYear() - 1); + args.putInt(EXTRA_DAY, initial.getDayOfMonth()); + dialog.setArguments(args); return dialog; } @@ -31,14 +39,18 @@ public class NativeDatePickerDialog extends InjectingNativeDialogFragment implem @Inject Theme theme; private NativeDatePickerDialogCallback callback; - private DateTime initial; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setRetainInstance(true); + } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { - DatePickerDialog datePickerDialog = new DatePickerDialog(theme.wrap(getActivity()), this, 0, 0, 0); - if (initial != null) { - datePickerDialog.updateDate(initial.getYear(), initial.getMonthOfYear() - 1, initial.getDayOfMonth()); - } + Bundle args = getArguments(); + DatePickerDialog datePickerDialog = new DatePickerDialog(theme.wrap(getActivity()), this, args.getInt(EXTRA_YEAR), args.getInt(EXTRA_MONTH), args.getInt(EXTRA_DAY)); datePickerDialog.setTitle(""); return datePickerDialog; } diff --git a/src/main/java/org/tasks/dialogs/NativeTimePickerDialog.java b/src/main/java/org/tasks/dialogs/NativeTimePickerDialog.java index d91ef4e6c..cf524c875 100644 --- a/src/main/java/org/tasks/dialogs/NativeTimePickerDialog.java +++ b/src/main/java/org/tasks/dialogs/NativeTimePickerDialog.java @@ -19,9 +19,15 @@ import javax.inject.Inject; public class NativeTimePickerDialog extends InjectingNativeDialogFragment implements TimePickerDialog.OnTimeSetListener { + private static final String EXTRA_HOUR = "extra_hour"; + private static final String EXTRA_MINUTE = "extra_minute"; + public static NativeTimePickerDialog newNativeTimePickerDialog(DateTime initial) { NativeTimePickerDialog dialog = new NativeTimePickerDialog(); - dialog.initial = initial; + Bundle args = new Bundle(); + args.putInt(EXTRA_HOUR, initial.getHourOfDay()); + args.putInt(EXTRA_MINUTE, initial.getMinuteOfHour()); + dialog.setArguments(args); return dialog; } @@ -34,18 +40,19 @@ public class NativeTimePickerDialog extends InjectingNativeDialogFragment implem @Inject Theme theme; private NativeTimePickerDialogCallback callback; - private DateTime initial; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setRetainInstance(true); + } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { Context context = theme.wrap(getActivity()); - TimePickerDialog timePickerDialog = new TimePickerDialog(context, this, 0, 0, DateUtilities.is24HourFormat(context)); - timePickerDialog.setButton(DialogInterface.BUTTON_NEGATIVE, getString(android.R.string.cancel), (dialogInterface, i) -> { - callback.cancel(); - }); - if (initial != null) { - timePickerDialog.updateTime(initial.getHourOfDay(), initial.getMinuteOfHour()); - } + Bundle args = getArguments(); + TimePickerDialog timePickerDialog = new TimePickerDialog(context, this, args.getInt(EXTRA_HOUR), args.getInt(EXTRA_MINUTE), DateUtilities.is24HourFormat(context)); timePickerDialog.setTitle(""); return timePickerDialog; } diff --git a/src/main/java/org/tasks/injection/InjectingNativeDialogFragment.java b/src/main/java/org/tasks/injection/InjectingNativeDialogFragment.java index e6090f99a..51d8c7dbc 100644 --- a/src/main/java/org/tasks/injection/InjectingNativeDialogFragment.java +++ b/src/main/java/org/tasks/injection/InjectingNativeDialogFragment.java @@ -1,6 +1,7 @@ package org.tasks.injection; import android.app.Activity; +import android.app.Dialog; import android.app.DialogFragment; public abstract class InjectingNativeDialogFragment extends DialogFragment { @@ -18,5 +19,15 @@ public abstract class InjectingNativeDialogFragment extends DialogFragment { } } + @Override + public void onDestroyView() { + // https://code.google.com/p/android/issues/detail?id=17423 + Dialog dialog = getDialog(); + if (dialog != null && getRetainInstance()) { + dialog.setDismissMessage(null); + } + super.onDestroyView(); + } + protected abstract void inject(NativeDialogFragmentComponent component); }