Home | History | Annotate | Download | only in system
      1 /*
      2  * Copyright (C) 2014 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License
     15  */
     16 
     17 package com.android.tv.settings.system;
     18 
     19 import android.app.AlarmManager;
     20 import android.app.Fragment;
     21 import android.content.Context;
     22 import android.content.Intent;
     23 import android.os.Bundle;
     24 import android.support.annotation.Nullable;
     25 import android.text.format.DateFormat;
     26 
     27 import com.android.tv.settings.R;
     28 import com.android.tv.settings.dialog.old.ContentFragment;
     29 import com.android.tv.settings.dialog.old.DialogActivity;
     30 import com.android.tv.settings.widget.picker.DatePicker;
     31 import com.android.tv.settings.widget.picker.Picker;
     32 import com.android.tv.settings.widget.picker.PickerConstants;
     33 import com.android.tv.settings.widget.picker.TimePicker;
     34 
     35 import java.util.Calendar;
     36 import java.util.List;
     37 
     38 public class SetDateTimeActivity extends DialogActivity {
     39 
     40     private static final String EXTRA_PICKER_TYPE = "SetDateTimeActivity.pickerType";
     41     private static final String TYPE_DATE = "date";
     42     private static final String TYPE_TIME = "time";
     43 
     44     private static final int HOURS_IN_HALF_DAY = 12;
     45 
     46     private class DatePickerListener implements Picker.ResultListener {
     47         @Override
     48         public void onCommitResult(List<String> result) {
     49             String formatOrder = new String(
     50                     DateFormat.getDateFormatOrder(SetDateTimeActivity.this)).toUpperCase();
     51             int yIndex = formatOrder.indexOf('Y');
     52             int mIndex = formatOrder.indexOf('M');
     53             int dIndex = formatOrder.indexOf('D');
     54             if (yIndex < 0 || mIndex < 0 || dIndex < 0 ||
     55                     yIndex > 2 || mIndex > 2 || dIndex > 2) {
     56                 // Badly formatted input. Use default order.
     57                 mIndex = 0;
     58                 dIndex = 1;
     59                 yIndex = 2;
     60             }
     61             String month = result.get(mIndex);
     62             int day = Integer.parseInt(result.get(dIndex));
     63             int year = Integer.parseInt(result.get(yIndex));
     64             int monthInt = 0;
     65             String[] months = PickerConstants.getDateInstance(getResources()).months;
     66             int totalMonths = months.length;
     67             for (int i = 0; i < totalMonths; i++) {
     68                 if (months[i].equals(month)) {
     69                     monthInt = i;
     70                 }
     71             }
     72 
     73             setDate(SetDateTimeActivity.this, year, monthInt, day);
     74             finish();
     75         }
     76     }
     77 
     78     private class TimePickerListener implements Picker.ResultListener {
     79         @Override
     80         public void onCommitResult(List<String> result) {
     81             boolean is24hFormat = isTimeFormat24h(SetDateTimeActivity.this);
     82             final TimePicker.ColumnOrder columnOrder = new TimePicker.ColumnOrder(is24hFormat);
     83             int hour = Integer.parseInt(result.get(columnOrder.hours));
     84             int minute = Integer.parseInt(result.get(columnOrder.minutes));
     85             if (!is24hFormat) {
     86                 String ampm = result.get(columnOrder.amPm);
     87                 if (ampm.equals(getResources().getStringArray(R.array.ampm)[1])) {
     88                     // PM case, valid hours: 12-23
     89                     hour = (hour % HOURS_IN_HALF_DAY) + HOURS_IN_HALF_DAY;
     90                 } else {
     91                     // AM case, valid hours: 0-11
     92                     hour = hour % HOURS_IN_HALF_DAY;
     93                 }
     94             }
     95 
     96             setTime(SetDateTimeActivity.this, hour, minute);
     97             finish();
     98         }
     99     }
    100 
    101     public static Intent getSetDateIntent(Context context) {
    102         final Intent intent = new Intent(context, SetDateTimeActivity.class);
    103         intent.putExtra(EXTRA_PICKER_TYPE, TYPE_DATE);
    104         return intent;
    105     }
    106 
    107     public static Intent getSetTimeIntent(Context context) {
    108         final Intent intent = new Intent(context, SetDateTimeActivity.class);
    109         intent.putExtra(EXTRA_PICKER_TYPE, TYPE_TIME);
    110         return intent;
    111     }
    112 
    113     @Override
    114     protected void onCreate(@Nullable Bundle savedInstanceState) {
    115         super.onCreate(savedInstanceState);
    116 
    117         final String pickerType = getIntent().getStringExtra(EXTRA_PICKER_TYPE);
    118         final Picker.ResultListener resultListener;
    119         if (TYPE_DATE.equals(pickerType)) {
    120             resultListener = new DatePickerListener();
    121         } else if (TYPE_TIME.equals(pickerType)) {
    122             resultListener = new TimePickerListener();
    123         } else {
    124             throw new IllegalArgumentException("Must specify " + EXTRA_PICKER_TYPE + " in intent");
    125         }
    126 
    127         if (savedInstanceState == null) {
    128             final Fragment contentFragment;
    129             final Fragment actionFragment;
    130 
    131             if (TYPE_DATE.equals(pickerType)) {
    132                 contentFragment = ContentFragment.newInstance(getString(R.string.system_set_date),
    133                         getString(R.string.system_date), null, R.drawable.ic_access_time_132dp,
    134                         getColor(R.color.icon_background));
    135                 actionFragment = DatePicker
    136                         .newInstance(new String(DateFormat.getDateFormatOrder(this)));
    137             } else {
    138                 contentFragment = ContentFragment.newInstance(getString(R.string.system_set_time),
    139                         getString(R.string.system_time), null, R.drawable.ic_access_time_132dp,
    140                         getColor(R.color.icon_background));
    141                 actionFragment = TimePicker.newInstance(isTimeFormat24h(this), true);
    142             }
    143 
    144             setContentAndActionFragments(contentFragment, actionFragment);
    145         }
    146 
    147         getFragmentManager().executePendingTransactions();
    148 
    149         final Picker picker = (Picker) getActionFragment();
    150         picker.setResultListener(resultListener);
    151     }
    152 
    153     public static void setDate(Context context, int year, int month, int day) {
    154         Calendar c = Calendar.getInstance();
    155 
    156         c.set(Calendar.YEAR, year);
    157         c.set(Calendar.MONTH, month);
    158         c.set(Calendar.DAY_OF_MONTH, day);
    159         long when = c.getTimeInMillis();
    160 
    161         ((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)).setTime(when);
    162     }
    163 
    164     public static void setTime(Context context, int hourOfDay, int minute) {
    165         Calendar c = Calendar.getInstance();
    166 
    167         c.set(Calendar.HOUR_OF_DAY, hourOfDay);
    168         c.set(Calendar.MINUTE, minute);
    169         c.set(Calendar.SECOND, 0);
    170         c.set(Calendar.MILLISECOND, 0);
    171         long when = c.getTimeInMillis();
    172 
    173         ((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)).setTime(when);
    174     }
    175 
    176     private static boolean isTimeFormat24h(Context context) {
    177         return DateFormat.is24HourFormat(context);
    178     }
    179 }
    180