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