Home | History | Annotate | Download | only in system
      1 /*
      2  * Copyright (C) 2017 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.content.Context;
     21 import android.os.Bundle;
     22 import android.support.v17.leanback.widget.picker.DatePicker;
     23 import android.support.v17.leanback.widget.picker.TimePicker;
     24 import android.support.v17.preference.LeanbackPreferenceDialogFragment;
     25 import android.support.v7.preference.DialogPreference;
     26 import android.text.TextUtils;
     27 import android.view.LayoutInflater;
     28 import android.view.View;
     29 import android.view.ViewGroup;
     30 import android.widget.TextView;
     31 
     32 import com.android.tv.settings.R;
     33 
     34 import java.util.Calendar;
     35 
     36 /**
     37  * A DialogFragment started for either setting date or setting time purposes. The type of
     38  * fragment launched is controlled by the type of {@link LeanbackPickerDialogPreference}
     39  * that's clicked. Launching of these two fragments is done inside
     40  * {@link com.android.tv.settings.BaseSettingsFragment#onPreferenceDisplayDialog}.
     41  */
     42 public class LeanbackPickerDialogFragment extends LeanbackPreferenceDialogFragment {
     43 
     44     private static final String EXTRA_PICKER_TYPE = "LeanbackPickerDialogFragment.PickerType";
     45     private static final String TYPE_DATE = "date";
     46     private static final String TYPE_TIME = "time";
     47     private static final String SAVE_STATE_TITLE = "LeanbackPickerDialogFragment.title";
     48 
     49     private CharSequence mDialogTitle;
     50     private Calendar mCalendar;
     51 
     52     /**
     53      * Generated a new DialogFragment displaying a Leanback DatePicker widget.
     54      * @param key The preference key starting this DialogFragment.
     55      * @return The fragment to be started displaying a DatePicker widget for setting date.
     56      */
     57     public static LeanbackPickerDialogFragment newDatePickerInstance(String key) {
     58         final Bundle args = new Bundle(1);
     59         args.putString(ARG_KEY, key);
     60         args.putString(EXTRA_PICKER_TYPE, TYPE_DATE);
     61 
     62         final LeanbackPickerDialogFragment fragment = new LeanbackPickerDialogFragment();
     63         fragment.setArguments(args);
     64         return fragment;
     65     }
     66 
     67     /**
     68      * Generated a new DialogFragment displaying a Leanback TimePicker widget.
     69      * @param key The preference key starting this DialogFragment.
     70      * @return The fragment to be started displaying a TimePicker widget for setting time.
     71      */
     72     public static LeanbackPickerDialogFragment newTimePickerInstance(String key) {
     73         final Bundle args = new Bundle(1);
     74         args.putString(ARG_KEY, key);
     75         args.putString(EXTRA_PICKER_TYPE, TYPE_TIME);
     76 
     77         final LeanbackPickerDialogFragment fragment = new LeanbackPickerDialogFragment();
     78         fragment.setArguments(args);
     79         return fragment;
     80     }
     81 
     82     @Override
     83     public void onCreate(Bundle savedInstanceState) {
     84         super.onCreate(savedInstanceState);
     85 
     86         if (savedInstanceState == null) {
     87             final DialogPreference preference = getPreference();
     88             mDialogTitle = preference.getDialogTitle();
     89         } else {
     90             mDialogTitle = savedInstanceState.getCharSequence(SAVE_STATE_TITLE);
     91         }
     92         mCalendar = Calendar.getInstance();
     93     }
     94 
     95     @Override
     96     public void onSaveInstanceState(Bundle outState) {
     97         super.onSaveInstanceState(outState);
     98         outState.putCharSequence(SAVE_STATE_TITLE, mDialogTitle);
     99     }
    100 
    101     @Override
    102     public View onCreateView(LayoutInflater inflater, ViewGroup container,
    103                              Bundle savedInstanceState) {
    104         final String pickerType = getArguments().getString(EXTRA_PICKER_TYPE);
    105 
    106         final View view = inflater.inflate(R.layout.picker_dialog_fragment, container, false);
    107         ViewGroup pickerContainer = view.findViewById(R.id.picker_container);
    108         if (pickerType.equals(TYPE_DATE)) {
    109             inflater.inflate(R.layout.date_picker_widget, pickerContainer, true);
    110             DatePicker datePicker = pickerContainer.findViewById(R.id.date_picker);
    111             datePicker.setActivated(true);
    112             datePicker.setOnClickListener(v -> {
    113                 // Setting the new system date
    114                 ((AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE)).setTime(
    115                         datePicker.getDate()
    116                 );
    117                 // Finish the fragment/activity when clicked.
    118                 if (!getFragmentManager().popBackStackImmediate()) {
    119                     getActivity().finish();
    120                 }
    121             });
    122 
    123         } else {
    124             inflater.inflate(R.layout.time_picker_widget, pickerContainer, true);
    125             TimePicker timePicker = pickerContainer.findViewById(R.id.time_picker);
    126             timePicker.setActivated(true);
    127             timePicker.setOnClickListener(v -> {
    128                 // Setting the new system time
    129                 mCalendar.set(Calendar.HOUR_OF_DAY, timePicker.getHour());
    130                 mCalendar.set(Calendar.MINUTE, timePicker.getMinute());
    131                 mCalendar.set(Calendar.SECOND, 0);
    132                 mCalendar.set(Calendar.MILLISECOND, 0);
    133                 ((AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE)).setTime(
    134                         mCalendar.getTimeInMillis()
    135                 );
    136                 // Finish the fragment/activity when clicked.
    137                 if (!getFragmentManager().popBackStackImmediate()) {
    138                     getActivity().finish();
    139                 }
    140             });
    141         }
    142 
    143         final CharSequence title = mDialogTitle;
    144         if (!TextUtils.isEmpty(title)) {
    145             final TextView titleView = view.findViewById(R.id.decor_title);
    146             titleView.setText(title);
    147         }
    148         return view;
    149     }
    150 }
    151