1 /*
2  * Copyright (C) 2008 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.settings;
18 
19 import android.app.Activity;
20 import android.app.Dialog;
21 import android.content.Context;
22 import android.content.Intent;
23 import android.os.UserManager;
24 import android.provider.SearchIndexableResource;
25 
26 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
27 import com.android.settings.core.PreferenceController;
28 import com.android.settings.dashboard.DashboardFragment;
29 import com.android.settings.dashboard.SummaryLoader;
30 import com.android.settings.datetime.AutoTimePreferenceController;
31 import com.android.settings.datetime.AutoTimeZonePreferenceController;
32 import com.android.settings.datetime.DatePreferenceController;
33 import com.android.settings.datetime.TimeChangeListenerMixin;
34 import com.android.settings.datetime.TimeFormatPreferenceController;
35 import com.android.settings.datetime.TimePreferenceController;
36 import com.android.settings.datetime.TimeZonePreferenceController;
37 import com.android.settings.search.BaseSearchIndexProvider;
38 import com.android.settings.search.Indexable;
39 import com.android.settingslib.datetime.ZoneGetter;
40 
41 import java.util.ArrayList;
42 import java.util.Calendar;
43 import java.util.List;
44 
45 public class DateTimeSettings extends DashboardFragment implements
46         TimePreferenceController.TimePreferenceHost, DatePreferenceController.DatePreferenceHost {
47 
48     private static final String TAG = "DateTimeSettings";
49 
50     // have we been launched from the setup wizard?
51     protected static final String EXTRA_IS_FROM_SUW = "firstRun";
52 
53     @Override
getMetricsCategory()54     public int getMetricsCategory() {
55         return MetricsEvent.DATE_TIME;
56     }
57 
58     @Override
getLogTag()59     protected String getLogTag() {
60         return TAG;
61     }
62 
63     @Override
getPreferenceScreenResId()64     protected int getPreferenceScreenResId() {
65         return R.xml.date_time_prefs;
66     }
67 
68     @Override
onAttach(Context context)69     public void onAttach(Context context) {
70         super.onAttach(context);
71         getLifecycle().addObserver(new TimeChangeListenerMixin(context, this));
72     }
73 
74     @Override
getPreferenceControllers(Context context)75     protected List<PreferenceController> getPreferenceControllers(Context context) {
76         final List<PreferenceController> controllers = new ArrayList<>();
77         final Activity activity = getActivity();
78         final Intent intent = activity.getIntent();
79         final boolean isFromSUW = intent.getBooleanExtra(EXTRA_IS_FROM_SUW, false);
80 
81         final AutoTimeZonePreferenceController autoTimeZonePreferenceController =
82                 new AutoTimeZonePreferenceController(
83                         activity, this /* UpdateTimeAndDateCallback */, isFromSUW);
84         final AutoTimePreferenceController autoTimePreferenceController =
85                 new AutoTimePreferenceController(
86                         activity, this /* UpdateTimeAndDateCallback */);
87         controllers.add(autoTimeZonePreferenceController);
88         controllers.add(autoTimePreferenceController);
89 
90         controllers.add(new TimeFormatPreferenceController(
91                 activity, this /* UpdateTimeAndDateCallback */, isFromSUW));
92         controllers.add(new TimeZonePreferenceController(
93                 activity, autoTimeZonePreferenceController));
94         controllers.add(new TimePreferenceController(
95                 activity, this /* UpdateTimeAndDateCallback */, autoTimePreferenceController));
96         controllers.add(new DatePreferenceController(
97                 activity, this /* UpdateTimeAndDateCallback */, autoTimePreferenceController));
98         return controllers;
99     }
100 
101     @Override
updateTimeAndDateDisplay(Context context)102     public void updateTimeAndDateDisplay(Context context) {
103         updatePreferenceStates();
104     }
105 
106     @Override
onCreateDialog(int id)107     public Dialog onCreateDialog(int id) {
108         switch (id) {
109             case DatePreferenceController.DIALOG_DATEPICKER:
110                 return getPreferenceController(DatePreferenceController.class)
111                         .buildDatePicker(getActivity());
112             case TimePreferenceController.DIALOG_TIMEPICKER:
113                 return getPreferenceController(TimePreferenceController.class)
114                         .buildTimePicker(getActivity());
115             default:
116                 throw new IllegalArgumentException();
117         }
118     }
119 
120     @Override
getDialogMetricsCategory(int dialogId)121     public int getDialogMetricsCategory(int dialogId) {
122         switch (dialogId) {
123             case DatePreferenceController.DIALOG_DATEPICKER:
124                 return MetricsEvent.DIALOG_DATE_PICKER;
125             case TimePreferenceController.DIALOG_TIMEPICKER:
126                 return MetricsEvent.DIALOG_TIME_PICKER;
127             default:
128                 return 0;
129         }
130     }
131 
132     @Override
showTimePicker()133     public void showTimePicker() {
134         removeDialog(TimePreferenceController.DIALOG_TIMEPICKER);
135         showDialog(TimePreferenceController.DIALOG_TIMEPICKER);
136     }
137 
138     @Override
showDatePicker()139     public void showDatePicker() {
140         showDialog(DatePreferenceController.DIALOG_DATEPICKER);
141     }
142 
143     private static class SummaryProvider implements SummaryLoader.SummaryProvider {
144 
145         private final Context mContext;
146         private final SummaryLoader mSummaryLoader;
147 
SummaryProvider(Context context, SummaryLoader summaryLoader)148         public SummaryProvider(Context context, SummaryLoader summaryLoader) {
149             mContext = context;
150             mSummaryLoader = summaryLoader;
151         }
152 
153         @Override
setListening(boolean listening)154         public void setListening(boolean listening) {
155             if (listening) {
156                 final Calendar now = Calendar.getInstance();
157                 mSummaryLoader.setSummary(this, ZoneGetter.getTimeZoneOffsetAndName(mContext,
158                         now.getTimeZone(), now.getTime()));
159             }
160         }
161     }
162 
163     public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
164             = new SummaryLoader.SummaryProviderFactory() {
165         @Override
166         public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
167                 SummaryLoader summaryLoader) {
168             return new SummaryProvider(activity, summaryLoader);
169         }
170     };
171 
172 
173     public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
174             new DateTimeSearchIndexProvider();
175 
176     private static class DateTimeSearchIndexProvider extends BaseSearchIndexProvider {
177 
178         @Override
getXmlResourcesToIndex( Context context, boolean enabled)179         public List<SearchIndexableResource> getXmlResourcesToIndex(
180                 Context context, boolean enabled) {
181             List<SearchIndexableResource> result = new ArrayList<>();
182             // Remove data/time settings from search in demo mode
183             if (UserManager.isDeviceInDemoMode(context)) {
184                 return result;
185             }
186 
187             SearchIndexableResource sir = new SearchIndexableResource(context);
188             sir.xmlResId = R.xml.date_time_prefs;
189             result.add(sir);
190 
191             return result;
192         }
193     }
194 }
195