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
17package com.android.tv.settings.system;
18
19import android.app.AlarmManager;
20import android.content.Context;
21import android.os.Bundle;
22import android.support.v17.leanback.widget.picker.DatePicker;
23import android.support.v17.leanback.widget.picker.TimePicker;
24import android.support.v17.preference.LeanbackPreferenceDialogFragment;
25import android.support.v7.preference.DialogPreference;
26import android.text.TextUtils;
27import android.view.LayoutInflater;
28import android.view.View;
29import android.view.ViewGroup;
30import android.widget.TextView;
31
32import com.android.tv.settings.R;
33
34import 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 */
42public 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 = (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