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