Loading src/com/android/settings/datetime/DatePreferenceController.java +32 −17 Original line number Diff line number Diff line Loading @@ -18,15 +18,16 @@ package com.android.settings.datetime; import static android.app.time.Capabilities.CAPABILITY_POSSESSED; import android.app.Activity; import android.app.DatePickerDialog; import android.app.time.TimeCapabilities; import android.app.time.TimeManager; import android.app.timedetector.ManualTimeSuggestion; import android.app.timedetector.TimeDetector; import android.app.timedetector.TimeDetectorHelper; import android.content.Context; import android.text.TextUtils; import android.text.format.DateFormat; import android.util.Log; import android.widget.DatePicker; import androidx.annotation.VisibleForTesting; Loading @@ -47,6 +48,7 @@ public class DatePreferenceController extends AbstractPreferenceController public static final int DIALOG_DATEPICKER = 0; private static final String TAG = "DatePreferenceController"; private static final String KEY_DATE = "date"; private final DatePreferenceHost mHost; Loading Loading @@ -96,22 +98,32 @@ public class DatePreferenceController extends AbstractPreferenceController mHost.updateTimeAndDateDisplay(mContext); } public DatePickerDialog buildDatePicker(Activity activity) { /** * Builds a {@link DatePickerDialog} that can be used to request the current date from the user. */ public DatePickerDialog buildDatePicker( Context parentContext, TimeDetectorHelper timeDetectorHelper) { final Calendar calendar = Calendar.getInstance(); final DatePickerDialog d = new DatePickerDialog( activity, final DatePickerDialog dialog = new DatePickerDialog( parentContext, this, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH)); // The system clock can't represent dates outside this range. // Limit the dates the user can pick to a sensible range. DatePicker datePicker = dialog.getDatePicker(); calendar.clear(); calendar.set(2007, Calendar.JANUARY, 1); d.getDatePicker().setMinDate(calendar.getTimeInMillis()); int minYear = timeDetectorHelper.getManualDateSelectionYearMin(); calendar.set(minYear, Calendar.JANUARY, 1); datePicker.setMinDate(calendar.getTimeInMillis()); int maxYear = timeDetectorHelper.getManualDateSelectionYearMax(); calendar.clear(); calendar.set(2037, Calendar.DECEMBER, 31); d.getDatePicker().setMaxDate(calendar.getTimeInMillis()); return d; calendar.set(maxYear, Calendar.DECEMBER, 31); datePicker.setMaxDate(calendar.getTimeInMillis()); return dialog; } @VisibleForTesting Loading @@ -121,13 +133,16 @@ public class DatePreferenceController extends AbstractPreferenceController c.set(Calendar.YEAR, year); c.set(Calendar.MONTH, month); c.set(Calendar.DAY_OF_MONTH, day); long when = Math.max(c.getTimeInMillis(), DatePreferenceHost.MIN_DATE); long when = c.getTimeInMillis(); if (when / 1000 < Integer.MAX_VALUE) { TimeDetector timeDetector = mContext.getSystemService(TimeDetector.class); ManualTimeSuggestion manualTimeSuggestion = TimeDetector.createManualTimeSuggestion(when, "Settings: Set date"); timeDetector.suggestManualTime(manualTimeSuggestion); boolean success = timeDetector.suggestManualTime(manualTimeSuggestion); if (!success) { // This implies the system server is applying tighter bounds than the settings app or // the date/time cannot be set for other reasons, e.g. perhaps "auto time" is turned on. Log.w(TAG, "Unable to set date with suggestion=" + manualTimeSuggestion); } } Loading src/com/android/settings/datetime/DateTimeSettings.java +2 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.settings.datetime; import android.app.Activity; import android.app.Dialog; import android.app.settings.SettingsEnums; import android.app.timedetector.TimeDetectorHelper; import android.content.Context; import android.content.Intent; Loading Loading @@ -104,7 +105,7 @@ public class DateTimeSettings extends DashboardFragment implements switch (id) { case DatePreferenceController.DIALOG_DATEPICKER: return use(DatePreferenceController.class) .buildDatePicker(getActivity()); .buildDatePicker(getActivity(), TimeDetectorHelper.INSTANCE); case TimePreferenceController.DIALOG_TIMEPICKER: return use(TimePreferenceController.class) .buildTimePicker(getActivity()); Loading src/com/android/settings/datetime/TimePreferenceController.java +18 −11 Original line number Diff line number Diff line Loading @@ -16,13 +16,13 @@ package com.android.settings.datetime; import android.app.Activity; import android.app.TimePickerDialog; import android.app.timedetector.ManualTimeSuggestion; import android.app.timedetector.TimeDetector; import android.content.Context; import android.text.TextUtils; import android.text.format.DateFormat; import android.util.Log; import android.widget.TimePicker; import androidx.preference.Preference; Loading @@ -42,6 +42,7 @@ public class TimePreferenceController extends AbstractPreferenceController public static final int DIALOG_TIMEPICKER = 1; private static final String TAG = "TimePreferenceController"; private static final String KEY_TIME = "time"; private final DatePreferenceController mDatePreferenceController; Loading Loading @@ -99,14 +100,17 @@ public class TimePreferenceController extends AbstractPreferenceController // SystemClock time. } public TimePickerDialog buildTimePicker(Activity activity) { /** * Builds a {@link TimePickerDialog} that can be used to request the current time from the user. */ public TimePickerDialog buildTimePicker(Context parentContext) { final Calendar calendar = Calendar.getInstance(); return new TimePickerDialog( activity, parentContext, this, calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), DateFormat.is24HourFormat(activity)); DateFormat.is24HourFormat(parentContext)); } void setTime(int hourOfDay, int minute) { Loading @@ -116,13 +120,16 @@ public class TimePreferenceController extends AbstractPreferenceController c.set(Calendar.MINUTE, minute); c.set(Calendar.SECOND, 0); c.set(Calendar.MILLISECOND, 0); long when = Math.max(c.getTimeInMillis(), TimePreferenceHost.MIN_DATE); long when = c.getTimeInMillis(); if (when / 1000 < Integer.MAX_VALUE) { TimeDetector timeDetector = mContext.getSystemService(TimeDetector.class); ManualTimeSuggestion manualTimeSuggestion = TimeDetector.createManualTimeSuggestion(when, "Settings: Set time"); timeDetector.suggestManualTime(manualTimeSuggestion); boolean success = timeDetector.suggestManualTime(manualTimeSuggestion); if (!success) { // This implies the system server is applying tighter bounds than the settings app or // the date/time cannot be set for other reasons, e.g. perhaps "auto time" is turned on. Log.w(TAG, "Unable to set time with suggestion=" + manualTimeSuggestion); } } } src/com/android/settings/datetime/UpdateTimeAndDateCallback.java +0 −3 Original line number Diff line number Diff line Loading @@ -19,8 +19,5 @@ package com.android.settings.datetime; import android.content.Context; public interface UpdateTimeAndDateCallback { // Minimum time is Nov 5, 2007, 0:00. long MIN_DATE = 1194220800000L; void updateTimeAndDateDisplay(Context context); } tests/robotests/src/com/android/settings/datetime/DatePreferenceControllerTest.java +29 −2 Original line number Diff line number Diff line Loading @@ -18,15 +18,19 @@ package com.android.settings.datetime; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.DatePickerDialog; import android.app.time.Capabilities; import android.app.time.TimeCapabilities; import android.app.time.TimeCapabilitiesAndConfig; import android.app.time.TimeConfiguration; import android.app.time.TimeManager; import android.app.timedetector.TimeDetector; import android.app.timedetector.TimeDetectorHelper; import android.content.Context; import android.os.UserHandle; Loading @@ -40,17 +44,20 @@ import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import java.util.Calendar; import java.util.GregorianCalendar; @RunWith(RobolectricTestRunner.class) public class DatePreferenceControllerTest { @Mock private Context mContext; @Mock private TimeDetector mTimeDetector; private DatePreferenceController.DatePreferenceHost mHost; @Mock private TimeManager mTimeManager; @Mock private DatePreferenceController.DatePreferenceHost mHost; private TimeDetector mTimeDetector; private RestrictedPreference mPreference; private DatePreferenceController mController; Loading Loading @@ -114,6 +121,26 @@ public class DatePreferenceControllerTest { verify(mHost).showDatePicker(); } @Test public void testBuildDatePicker() { TimeDetectorHelper timeDetectorHelper = mock(TimeDetectorHelper.class); when(timeDetectorHelper.getManualDateSelectionYearMin()).thenReturn(2015); when(timeDetectorHelper.getManualDateSelectionYearMax()).thenReturn(2020); Context context = RuntimeEnvironment.application; DatePickerDialog dialog = mController.buildDatePicker(context, timeDetectorHelper); GregorianCalendar calendar = new GregorianCalendar(); long minDate = dialog.getDatePicker().getMinDate(); calendar.setTimeInMillis(minDate); assertEquals(2015, calendar.get(Calendar.YEAR)); long maxDate = dialog.getDatePicker().getMaxDate(); calendar.setTimeInMillis(maxDate); assertEquals(2020, calendar.get(Calendar.YEAR)); } private static TimeCapabilitiesAndConfig createCapabilitiesAndConfig( boolean suggestManualAllowed) { int suggestManualCapability = suggestManualAllowed ? Capabilities.CAPABILITY_POSSESSED Loading Loading
src/com/android/settings/datetime/DatePreferenceController.java +32 −17 Original line number Diff line number Diff line Loading @@ -18,15 +18,16 @@ package com.android.settings.datetime; import static android.app.time.Capabilities.CAPABILITY_POSSESSED; import android.app.Activity; import android.app.DatePickerDialog; import android.app.time.TimeCapabilities; import android.app.time.TimeManager; import android.app.timedetector.ManualTimeSuggestion; import android.app.timedetector.TimeDetector; import android.app.timedetector.TimeDetectorHelper; import android.content.Context; import android.text.TextUtils; import android.text.format.DateFormat; import android.util.Log; import android.widget.DatePicker; import androidx.annotation.VisibleForTesting; Loading @@ -47,6 +48,7 @@ public class DatePreferenceController extends AbstractPreferenceController public static final int DIALOG_DATEPICKER = 0; private static final String TAG = "DatePreferenceController"; private static final String KEY_DATE = "date"; private final DatePreferenceHost mHost; Loading Loading @@ -96,22 +98,32 @@ public class DatePreferenceController extends AbstractPreferenceController mHost.updateTimeAndDateDisplay(mContext); } public DatePickerDialog buildDatePicker(Activity activity) { /** * Builds a {@link DatePickerDialog} that can be used to request the current date from the user. */ public DatePickerDialog buildDatePicker( Context parentContext, TimeDetectorHelper timeDetectorHelper) { final Calendar calendar = Calendar.getInstance(); final DatePickerDialog d = new DatePickerDialog( activity, final DatePickerDialog dialog = new DatePickerDialog( parentContext, this, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH)); // The system clock can't represent dates outside this range. // Limit the dates the user can pick to a sensible range. DatePicker datePicker = dialog.getDatePicker(); calendar.clear(); calendar.set(2007, Calendar.JANUARY, 1); d.getDatePicker().setMinDate(calendar.getTimeInMillis()); int minYear = timeDetectorHelper.getManualDateSelectionYearMin(); calendar.set(minYear, Calendar.JANUARY, 1); datePicker.setMinDate(calendar.getTimeInMillis()); int maxYear = timeDetectorHelper.getManualDateSelectionYearMax(); calendar.clear(); calendar.set(2037, Calendar.DECEMBER, 31); d.getDatePicker().setMaxDate(calendar.getTimeInMillis()); return d; calendar.set(maxYear, Calendar.DECEMBER, 31); datePicker.setMaxDate(calendar.getTimeInMillis()); return dialog; } @VisibleForTesting Loading @@ -121,13 +133,16 @@ public class DatePreferenceController extends AbstractPreferenceController c.set(Calendar.YEAR, year); c.set(Calendar.MONTH, month); c.set(Calendar.DAY_OF_MONTH, day); long when = Math.max(c.getTimeInMillis(), DatePreferenceHost.MIN_DATE); long when = c.getTimeInMillis(); if (when / 1000 < Integer.MAX_VALUE) { TimeDetector timeDetector = mContext.getSystemService(TimeDetector.class); ManualTimeSuggestion manualTimeSuggestion = TimeDetector.createManualTimeSuggestion(when, "Settings: Set date"); timeDetector.suggestManualTime(manualTimeSuggestion); boolean success = timeDetector.suggestManualTime(manualTimeSuggestion); if (!success) { // This implies the system server is applying tighter bounds than the settings app or // the date/time cannot be set for other reasons, e.g. perhaps "auto time" is turned on. Log.w(TAG, "Unable to set date with suggestion=" + manualTimeSuggestion); } } Loading
src/com/android/settings/datetime/DateTimeSettings.java +2 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.settings.datetime; import android.app.Activity; import android.app.Dialog; import android.app.settings.SettingsEnums; import android.app.timedetector.TimeDetectorHelper; import android.content.Context; import android.content.Intent; Loading Loading @@ -104,7 +105,7 @@ public class DateTimeSettings extends DashboardFragment implements switch (id) { case DatePreferenceController.DIALOG_DATEPICKER: return use(DatePreferenceController.class) .buildDatePicker(getActivity()); .buildDatePicker(getActivity(), TimeDetectorHelper.INSTANCE); case TimePreferenceController.DIALOG_TIMEPICKER: return use(TimePreferenceController.class) .buildTimePicker(getActivity()); Loading
src/com/android/settings/datetime/TimePreferenceController.java +18 −11 Original line number Diff line number Diff line Loading @@ -16,13 +16,13 @@ package com.android.settings.datetime; import android.app.Activity; import android.app.TimePickerDialog; import android.app.timedetector.ManualTimeSuggestion; import android.app.timedetector.TimeDetector; import android.content.Context; import android.text.TextUtils; import android.text.format.DateFormat; import android.util.Log; import android.widget.TimePicker; import androidx.preference.Preference; Loading @@ -42,6 +42,7 @@ public class TimePreferenceController extends AbstractPreferenceController public static final int DIALOG_TIMEPICKER = 1; private static final String TAG = "TimePreferenceController"; private static final String KEY_TIME = "time"; private final DatePreferenceController mDatePreferenceController; Loading Loading @@ -99,14 +100,17 @@ public class TimePreferenceController extends AbstractPreferenceController // SystemClock time. } public TimePickerDialog buildTimePicker(Activity activity) { /** * Builds a {@link TimePickerDialog} that can be used to request the current time from the user. */ public TimePickerDialog buildTimePicker(Context parentContext) { final Calendar calendar = Calendar.getInstance(); return new TimePickerDialog( activity, parentContext, this, calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), DateFormat.is24HourFormat(activity)); DateFormat.is24HourFormat(parentContext)); } void setTime(int hourOfDay, int minute) { Loading @@ -116,13 +120,16 @@ public class TimePreferenceController extends AbstractPreferenceController c.set(Calendar.MINUTE, minute); c.set(Calendar.SECOND, 0); c.set(Calendar.MILLISECOND, 0); long when = Math.max(c.getTimeInMillis(), TimePreferenceHost.MIN_DATE); long when = c.getTimeInMillis(); if (when / 1000 < Integer.MAX_VALUE) { TimeDetector timeDetector = mContext.getSystemService(TimeDetector.class); ManualTimeSuggestion manualTimeSuggestion = TimeDetector.createManualTimeSuggestion(when, "Settings: Set time"); timeDetector.suggestManualTime(manualTimeSuggestion); boolean success = timeDetector.suggestManualTime(manualTimeSuggestion); if (!success) { // This implies the system server is applying tighter bounds than the settings app or // the date/time cannot be set for other reasons, e.g. perhaps "auto time" is turned on. Log.w(TAG, "Unable to set time with suggestion=" + manualTimeSuggestion); } } }
src/com/android/settings/datetime/UpdateTimeAndDateCallback.java +0 −3 Original line number Diff line number Diff line Loading @@ -19,8 +19,5 @@ package com.android.settings.datetime; import android.content.Context; public interface UpdateTimeAndDateCallback { // Minimum time is Nov 5, 2007, 0:00. long MIN_DATE = 1194220800000L; void updateTimeAndDateDisplay(Context context); }
tests/robotests/src/com/android/settings/datetime/DatePreferenceControllerTest.java +29 −2 Original line number Diff line number Diff line Loading @@ -18,15 +18,19 @@ package com.android.settings.datetime; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.DatePickerDialog; import android.app.time.Capabilities; import android.app.time.TimeCapabilities; import android.app.time.TimeCapabilitiesAndConfig; import android.app.time.TimeConfiguration; import android.app.time.TimeManager; import android.app.timedetector.TimeDetector; import android.app.timedetector.TimeDetectorHelper; import android.content.Context; import android.os.UserHandle; Loading @@ -40,17 +44,20 @@ import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import java.util.Calendar; import java.util.GregorianCalendar; @RunWith(RobolectricTestRunner.class) public class DatePreferenceControllerTest { @Mock private Context mContext; @Mock private TimeDetector mTimeDetector; private DatePreferenceController.DatePreferenceHost mHost; @Mock private TimeManager mTimeManager; @Mock private DatePreferenceController.DatePreferenceHost mHost; private TimeDetector mTimeDetector; private RestrictedPreference mPreference; private DatePreferenceController mController; Loading Loading @@ -114,6 +121,26 @@ public class DatePreferenceControllerTest { verify(mHost).showDatePicker(); } @Test public void testBuildDatePicker() { TimeDetectorHelper timeDetectorHelper = mock(TimeDetectorHelper.class); when(timeDetectorHelper.getManualDateSelectionYearMin()).thenReturn(2015); when(timeDetectorHelper.getManualDateSelectionYearMax()).thenReturn(2020); Context context = RuntimeEnvironment.application; DatePickerDialog dialog = mController.buildDatePicker(context, timeDetectorHelper); GregorianCalendar calendar = new GregorianCalendar(); long minDate = dialog.getDatePicker().getMinDate(); calendar.setTimeInMillis(minDate); assertEquals(2015, calendar.get(Calendar.YEAR)); long maxDate = dialog.getDatePicker().getMaxDate(); calendar.setTimeInMillis(maxDate); assertEquals(2020, calendar.get(Calendar.YEAR)); } private static TimeCapabilitiesAndConfig createCapabilitiesAndConfig( boolean suggestManualAllowed) { int suggestManualCapability = suggestManualAllowed ? Capabilities.CAPABILITY_POSSESSED Loading