17ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler/* 27ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler * Copyright (C) 2014 The Android Open Source Project 37ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler * 47ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler * Licensed under the Apache License, Version 2.0 (the "License"); 57ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler * you may not use this file except in compliance with the License. 67ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler * You may obtain a copy of the License at 77ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler * 87ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler * http://www.apache.org/licenses/LICENSE-2.0 97ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler * 107ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler * Unless required by applicable law or agreed to in writing, software 117ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler * distributed under the License is distributed on an "AS IS" BASIS, 127ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler * See the License for the specific language governing permissions and 147ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler * limitations under the License 157ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler */ 167ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler 177ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantlerpackage com.android.tv.settings.system; 187ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler 197ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantlerimport android.app.AlarmManager; 207ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantlerimport android.app.Fragment; 217ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantlerimport android.content.Context; 227ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantlerimport android.content.Intent; 237ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantlerimport android.os.Bundle; 248f38002bda894e4e9fd55fb87bff2818460c2304Tony Mantlerimport android.support.annotation.Nullable; 257ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantlerimport android.text.format.DateFormat; 267ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler 277ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantlerimport com.android.tv.settings.R; 287ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantlerimport com.android.tv.settings.dialog.old.ContentFragment; 297ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantlerimport com.android.tv.settings.dialog.old.DialogActivity; 307ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantlerimport com.android.tv.settings.widget.picker.DatePicker; 317ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantlerimport com.android.tv.settings.widget.picker.Picker; 327ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantlerimport com.android.tv.settings.widget.picker.PickerConstants; 337ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantlerimport com.android.tv.settings.widget.picker.TimePicker; 347ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler 357ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantlerimport java.util.Calendar; 367ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantlerimport java.util.List; 377ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler 387ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantlerpublic class SetDateTimeActivity extends DialogActivity { 397ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler 407ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler private static final String EXTRA_PICKER_TYPE = "SetDateTimeActivity.pickerType"; 417ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler private static final String TYPE_DATE = "date"; 427ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler private static final String TYPE_TIME = "time"; 437ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler 447ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler private static final int HOURS_IN_HALF_DAY = 12; 457ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler 467ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler private class DatePickerListener implements Picker.ResultListener { 477ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler @Override 487ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler public void onCommitResult(List<String> result) { 497ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler String formatOrder = new String( 507ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler DateFormat.getDateFormatOrder(SetDateTimeActivity.this)).toUpperCase(); 517ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler int yIndex = formatOrder.indexOf('Y'); 527ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler int mIndex = formatOrder.indexOf('M'); 537ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler int dIndex = formatOrder.indexOf('D'); 547ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler if (yIndex < 0 || mIndex < 0 || dIndex < 0 || 557ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler yIndex > 2 || mIndex > 2 || dIndex > 2) { 567ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler // Badly formatted input. Use default order. 577ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler mIndex = 0; 587ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler dIndex = 1; 597ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler yIndex = 2; 607ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler } 617ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler String month = result.get(mIndex); 627ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler int day = Integer.parseInt(result.get(dIndex)); 637ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler int year = Integer.parseInt(result.get(yIndex)); 647ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler int monthInt = 0; 657ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler String[] months = PickerConstants.getDateInstance(getResources()).months; 667ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler int totalMonths = months.length; 677ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler for (int i = 0; i < totalMonths; i++) { 687ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler if (months[i].equals(month)) { 697ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler monthInt = i; 707ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler } 717ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler } 727ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler 737ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler setDate(SetDateTimeActivity.this, year, monthInt, day); 747ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler finish(); 757ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler } 767ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler } 777ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler 787ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler private class TimePickerListener implements Picker.ResultListener { 797ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler @Override 807ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler public void onCommitResult(List<String> result) { 817ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler boolean is24hFormat = isTimeFormat24h(SetDateTimeActivity.this); 8237d034724b14f7ec5360ccb5123fdb6c88d2c79eTony Mantler final TimePicker.ColumnOrder columnOrder = new TimePicker.ColumnOrder(is24hFormat); 8337d034724b14f7ec5360ccb5123fdb6c88d2c79eTony Mantler int hour = Integer.parseInt(result.get(columnOrder.hours)); 8437d034724b14f7ec5360ccb5123fdb6c88d2c79eTony Mantler int minute = Integer.parseInt(result.get(columnOrder.minutes)); 857ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler if (!is24hFormat) { 8637d034724b14f7ec5360ccb5123fdb6c88d2c79eTony Mantler String ampm = result.get(columnOrder.amPm); 877ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler if (ampm.equals(getResources().getStringArray(R.array.ampm)[1])) { 887ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler // PM case, valid hours: 12-23 897ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler hour = (hour % HOURS_IN_HALF_DAY) + HOURS_IN_HALF_DAY; 907ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler } else { 917ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler // AM case, valid hours: 0-11 927ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler hour = hour % HOURS_IN_HALF_DAY; 937ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler } 947ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler } 957ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler 967ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler setTime(SetDateTimeActivity.this, hour, minute); 977ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler finish(); 987ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler } 997ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler } 1007ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler 1017ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler public static Intent getSetDateIntent(Context context) { 1027ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler final Intent intent = new Intent(context, SetDateTimeActivity.class); 1037ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler intent.putExtra(EXTRA_PICKER_TYPE, TYPE_DATE); 1047ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler return intent; 1057ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler } 1067ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler 1077ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler public static Intent getSetTimeIntent(Context context) { 1087ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler final Intent intent = new Intent(context, SetDateTimeActivity.class); 1097ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler intent.putExtra(EXTRA_PICKER_TYPE, TYPE_TIME); 1107ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler return intent; 1117ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler } 1127ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler 1137ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler @Override 1147ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler protected void onCreate(@Nullable Bundle savedInstanceState) { 1157ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler super.onCreate(savedInstanceState); 1167ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler 1177ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler final String pickerType = getIntent().getStringExtra(EXTRA_PICKER_TYPE); 1187ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler final Picker.ResultListener resultListener; 1197ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler if (TYPE_DATE.equals(pickerType)) { 1207ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler resultListener = new DatePickerListener(); 1217ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler } else if (TYPE_TIME.equals(pickerType)) { 1227ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler resultListener = new TimePickerListener(); 1237ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler } else { 1247ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler throw new IllegalArgumentException("Must specify " + EXTRA_PICKER_TYPE + " in intent"); 1257ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler } 1267ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler 1277ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler if (savedInstanceState == null) { 1287ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler final Fragment contentFragment; 1297ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler final Fragment actionFragment; 1307ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler 1317ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler if (TYPE_DATE.equals(pickerType)) { 1327ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler contentFragment = ContentFragment.newInstance(getString(R.string.system_set_date), 1338f472252a02517b065b5de166135a50e93d4b425Tony Mantler getString(R.string.system_date), null, R.drawable.ic_access_time_132dp, 13437d034724b14f7ec5360ccb5123fdb6c88d2c79eTony Mantler getColor(R.color.icon_background)); 1357ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler actionFragment = DatePicker 1367ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler .newInstance(new String(DateFormat.getDateFormatOrder(this))); 1377ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler } else { 1387ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler contentFragment = ContentFragment.newInstance(getString(R.string.system_set_time), 1398f472252a02517b065b5de166135a50e93d4b425Tony Mantler getString(R.string.system_time), null, R.drawable.ic_access_time_132dp, 14037d034724b14f7ec5360ccb5123fdb6c88d2c79eTony Mantler getColor(R.color.icon_background)); 1417ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler actionFragment = TimePicker.newInstance(isTimeFormat24h(this), true); 1427ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler } 1437ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler 1447ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler setContentAndActionFragments(contentFragment, actionFragment); 1457ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler } 1467ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler 1477ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler getFragmentManager().executePendingTransactions(); 1487ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler 1497ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler final Picker picker = (Picker) getActionFragment(); 1507ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler picker.setResultListener(resultListener); 1517ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler } 1527ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler 1537ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler public static void setDate(Context context, int year, int month, int day) { 1547ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler Calendar c = Calendar.getInstance(); 1557ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler 1567ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler c.set(Calendar.YEAR, year); 1577ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler c.set(Calendar.MONTH, month); 1587ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler c.set(Calendar.DAY_OF_MONTH, day); 1597ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler long when = c.getTimeInMillis(); 1607ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler 1617fe1e83e7984ff770c489c908803ae342a187523Tony Mantler ((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)).setTime(when); 1627ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler } 1637ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler 1647ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler public static void setTime(Context context, int hourOfDay, int minute) { 1657ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler Calendar c = Calendar.getInstance(); 1667ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler 1677ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler c.set(Calendar.HOUR_OF_DAY, hourOfDay); 1687ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler c.set(Calendar.MINUTE, minute); 1697ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler c.set(Calendar.SECOND, 0); 1707ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler c.set(Calendar.MILLISECOND, 0); 1717ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler long when = c.getTimeInMillis(); 1727ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler 1737fe1e83e7984ff770c489c908803ae342a187523Tony Mantler ((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)).setTime(when); 1747ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler } 1757ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler 1767ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler private static boolean isTimeFormat24h(Context context) { 1777ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler return DateFormat.is24HourFormat(context); 1787ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler } 1797ee57dbb3cc1e0f185a0b41f1d884aab46de02d3Tony Mantler} 180