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 */ newDatePickerInstance(String key)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 */ newTimePickerInstance(String key)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 onCreate(Bundle savedInstanceState)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 onSaveInstanceState(Bundle outState)96 public void onSaveInstanceState(Bundle outState) { 97 super.onSaveInstanceState(outState); 98 outState.putCharSequence(SAVE_STATE_TITLE, mDialogTitle); 99 } 100 101 @Override onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)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 = (ViewGroup) 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 = (DatePicker) pickerContainer.findViewById(R.id.date_picker); 111 datePicker.setActivated(true); 112 datePicker.setOnClickListener(new View.OnClickListener(){ 113 @Override 114 public void onClick(View v) { 115 // Setting the new system date 116 ((AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE)).setTime( 117 datePicker.getDate() 118 ); 119 // Finish the fragment/activity when clicked. 120 if (!getFragmentManager().popBackStackImmediate()) { 121 getActivity().finish(); 122 } 123 } 124 }); 125 126 } else { 127 inflater.inflate(R.layout.time_picker_widget, pickerContainer, true); 128 TimePicker timePicker = (TimePicker) pickerContainer.findViewById(R.id.time_picker); 129 timePicker.setActivated(true); 130 timePicker.setOnClickListener(new View.OnClickListener(){ 131 @Override 132 public void onClick(View v) { 133 // Setting the new system time 134 mCalendar.set(Calendar.HOUR_OF_DAY, timePicker.getHour()); 135 mCalendar.set(Calendar.MINUTE, timePicker.getMinute()); 136 mCalendar.set(Calendar.SECOND, 0); 137 mCalendar.set(Calendar.MILLISECOND, 0); 138 ((AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE)).setTime( 139 mCalendar.getTimeInMillis() 140 ); 141 // Finish the fragment/activity when clicked. 142 if (!getFragmentManager().popBackStackImmediate()) { 143 getActivity().finish(); 144 } 145 } 146 }); 147 } 148 149 final CharSequence title = mDialogTitle; 150 if (!TextUtils.isEmpty(title)) { 151 final TextView titleView = (TextView) view.findViewById(R.id.decor_title); 152 titleView.setText(title); 153 } 154 return view; 155 } 156 } 157