1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/* 2afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * you may not use this file except in compliance with the License. 6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * You may obtain a copy of the License at 7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * See the License for the specific language governing permissions and 14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * limitations under the License. 15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 17afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpackage com.android.settings; 18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1929e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawaimport android.app.Activity; 20d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasaniimport android.app.Dialog; 21afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context; 22afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent; 23ca060e3e98c561cad5e28603200810ca70ae4869Fyodor Kupolovimport android.os.UserManager; 24ca060e3e98c561cad5e28603200810ca70ae4869Fyodor Kupolovimport android.provider.SearchIndexableResource; 2520374fd211962c20ab2e35ed09a269331135cf57Fan Zhang 26265d3c2a0c36251bf8a9f571d7239b6dd404d942Tamas Berghammerimport com.android.internal.logging.nano.MetricsProto.MetricsEvent; 27beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhangimport com.android.settings.dashboard.DashboardFragment; 289d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monkimport com.android.settings.dashboard.SummaryLoader; 2995beae00899f75763426742b7b36fbb93a7a6f03Joachim Sauerimport com.android.settings.datetime.AutoTimeFormatPreferenceController; 30beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhangimport com.android.settings.datetime.AutoTimePreferenceController; 31beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhangimport com.android.settings.datetime.AutoTimeZonePreferenceController; 32beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhangimport com.android.settings.datetime.DatePreferenceController; 33beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhangimport com.android.settings.datetime.TimeChangeListenerMixin; 343d2efae43b22aede902a093f7c2ae8630e2736b1Fan Zhangimport com.android.settings.datetime.TimeFormatPreferenceController; 35beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhangimport com.android.settings.datetime.TimePreferenceController; 36beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhangimport com.android.settings.datetime.TimeZonePreferenceController; 37ca060e3e98c561cad5e28603200810ca70ae4869Fyodor Kupolovimport com.android.settings.search.BaseSearchIndexProvider; 38ca060e3e98c561cad5e28603200810ca70ae4869Fyodor Kupolovimport com.android.settings.search.Indexable; 391d583e125faf3ae4c9cd82636d8f3ecf1cdec3aaTony Mantlerimport com.android.settingslib.core.AbstractPreferenceController; 40550015e47656dad997973c89a30cffe56db9cdbdTony Mantlerimport com.android.settingslib.datetime.ZoneGetter; 418a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren 42ca060e3e98c561cad5e28603200810ca70ae4869Fyodor Kupolovimport java.util.ArrayList; 43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Calendar; 44ca060e3e98c561cad5e28603200810ca70ae4869Fyodor Kupolovimport java.util.List; 45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 46beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhangpublic class DateTimeSettings extends DashboardFragment implements 47beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang TimePreferenceController.TimePreferenceHost, DatePreferenceController.DatePreferenceHost { 489c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka 49beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang private static final String TAG = "DateTimeSettings"; 501bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani 517f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng // have we been launched from the setup wizard? 523d2efae43b22aede902a093f7c2ae8630e2736b1Fan Zhang protected static final String EXTRA_IS_FROM_SUW = "firstRun"; 537f6f6e18c9f078323b15c8185a7e707194e7d155Freeman Ng 54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 556507613ebcd22e4691c2af92a5c161bd327db336Fan Zhang public int getMetricsCategory() { 569d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wren return MetricsEvent.DATE_TIME; 578a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren } 588a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren 598a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren @Override 60beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang protected String getLogTag() { 61beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang return TAG; 62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 641bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani @Override 65beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang protected int getPreferenceScreenResId() { 66beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang return R.xml.date_time_prefs; 67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 690f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa @Override 70beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang public void onAttach(Context context) { 71beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang super.onAttach(context); 72beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang getLifecycle().addObserver(new TimeChangeListenerMixin(context, this)); 73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 74afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 750f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa @Override 76f7843adabd4e8e1cc84a52721daabefa3a1410fdFan Zhang protected List<AbstractPreferenceController> createPreferenceControllers(Context context) { 771d583e125faf3ae4c9cd82636d8f3ecf1cdec3aaTony Mantler final List<AbstractPreferenceController> controllers = new ArrayList<>(); 7829e812f29915d9bd84d516e53931ba774f62d328Daisuke Miyakawa final Activity activity = getActivity(); 79beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang final Intent intent = activity.getIntent(); 80beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang final boolean isFromSUW = intent.getBooleanExtra(EXTRA_IS_FROM_SUW, false); 8171cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa 82beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang final AutoTimeZonePreferenceController autoTimeZonePreferenceController = 83beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang new AutoTimeZonePreferenceController( 84beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang activity, this /* UpdateTimeAndDateCallback */, isFromSUW); 85beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang final AutoTimePreferenceController autoTimePreferenceController = 86beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang new AutoTimePreferenceController( 87beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang activity, this /* UpdateTimeAndDateCallback */); 8895beae00899f75763426742b7b36fbb93a7a6f03Joachim Sauer final AutoTimeFormatPreferenceController autoTimeFormatPreferenceController = 8995beae00899f75763426742b7b36fbb93a7a6f03Joachim Sauer new AutoTimeFormatPreferenceController( 9095beae00899f75763426742b7b36fbb93a7a6f03Joachim Sauer activity, this /* UpdateTimeAndDateCallback */); 91beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang controllers.add(autoTimeZonePreferenceController); 92beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang controllers.add(autoTimePreferenceController); 9395beae00899f75763426742b7b36fbb93a7a6f03Joachim Sauer controllers.add(autoTimeFormatPreferenceController); 94beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang 95beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang controllers.add(new TimeFormatPreferenceController( 96beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang activity, this /* UpdateTimeAndDateCallback */, isFromSUW)); 97beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang controllers.add(new TimeZonePreferenceController( 98beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang activity, autoTimeZonePreferenceController)); 99beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang controllers.add(new TimePreferenceController( 100beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang activity, this /* UpdateTimeAndDateCallback */, autoTimePreferenceController)); 101beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang controllers.add(new DatePreferenceController( 102beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang activity, this /* UpdateTimeAndDateCallback */, autoTimePreferenceController)); 103beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang return controllers; 104afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 105afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1060f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa @Override 107beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang public void updateTimeAndDateDisplay(Context context) { 108beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang updatePreferenceStates(); 109afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 110afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 111afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 112afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public Dialog onCreateDialog(int id) { 113afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project switch (id) { 114beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang case DatePreferenceController.DIALOG_DATEPICKER: 115f7843adabd4e8e1cc84a52721daabefa3a1410fdFan Zhang return use(DatePreferenceController.class) 116beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang .buildDatePicker(getActivity()); 117beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang case TimePreferenceController.DIALOG_TIMEPICKER: 118f7843adabd4e8e1cc84a52721daabefa3a1410fdFan Zhang return use(TimePreferenceController.class) 119beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang .buildTimePicker(getActivity()); 1203d2efae43b22aede902a093f7c2ae8630e2736b1Fan Zhang default: 1213d2efae43b22aede902a093f7c2ae8630e2736b1Fan Zhang throw new IllegalArgumentException(); 122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 123b85d48fa43e5f7b98492c2ee313f51c072f5ddd8Elliott Hughes } 124afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 12520374fd211962c20ab2e35ed09a269331135cf57Fan Zhang @Override 12620374fd211962c20ab2e35ed09a269331135cf57Fan Zhang public int getDialogMetricsCategory(int dialogId) { 12720374fd211962c20ab2e35ed09a269331135cf57Fan Zhang switch (dialogId) { 128beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang case DatePreferenceController.DIALOG_DATEPICKER: 12920374fd211962c20ab2e35ed09a269331135cf57Fan Zhang return MetricsEvent.DIALOG_DATE_PICKER; 130beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang case TimePreferenceController.DIALOG_TIMEPICKER: 13120374fd211962c20ab2e35ed09a269331135cf57Fan Zhang return MetricsEvent.DIALOG_TIME_PICKER; 13220374fd211962c20ab2e35ed09a269331135cf57Fan Zhang default: 13320374fd211962c20ab2e35ed09a269331135cf57Fan Zhang return 0; 13420374fd211962c20ab2e35ed09a269331135cf57Fan Zhang } 13520374fd211962c20ab2e35ed09a269331135cf57Fan Zhang } 13620374fd211962c20ab2e35ed09a269331135cf57Fan Zhang 137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 138beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang public void showTimePicker() { 139beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang removeDialog(TimePreferenceController.DIALOG_TIMEPICKER); 140beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang showDialog(TimePreferenceController.DIALOG_TIMEPICKER); 141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1421bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani 143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 144beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang public void showDatePicker() { 145beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang showDialog(DatePreferenceController.DIALOG_DATEPICKER); 146afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1471bb6db526771fa594b2e5c0865dc89dce3cf351cAmith Yamasani 1489d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk private static class SummaryProvider implements SummaryLoader.SummaryProvider { 1499d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk 1509d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk private final Context mContext; 1519d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk private final SummaryLoader mSummaryLoader; 1529d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk 1539d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk public SummaryProvider(Context context, SummaryLoader summaryLoader) { 1549d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk mContext = context; 1559d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk mSummaryLoader = summaryLoader; 1569d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk } 1579d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk 1589d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk @Override 1599d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk public void setListening(boolean listening) { 1609d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk if (listening) { 1619d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk final Calendar now = Calendar.getInstance(); 162fbab059e1ccf2108524a2493f4335e556bcff80bjackqdyulei mSummaryLoader.setSummary(this, ZoneGetter.getTimeZoneOffsetAndName(mContext, 1639d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk now.getTimeZone(), now.getTime())); 1649d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk } 1659d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk } 1669d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk } 1679d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk 1689d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY 1699d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk = new SummaryLoader.SummaryProviderFactory() { 1709d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk @Override 1719d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity, 1723d2efae43b22aede902a093f7c2ae8630e2736b1Fan Zhang SummaryLoader summaryLoader) { 1739d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk return new SummaryProvider(activity, summaryLoader); 1749d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk } 1759d80eeabe7807b5ff0a60bd40d3a1a84f681ea37Jason Monk }; 176ca060e3e98c561cad5e28603200810ca70ae4869Fyodor Kupolov 177beddff82b08de6c9160392684be7b4d0eaae23aaFan Zhang 178ca060e3e98c561cad5e28603200810ca70ae4869Fyodor Kupolov public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = 179ca060e3e98c561cad5e28603200810ca70ae4869Fyodor Kupolov new DateTimeSearchIndexProvider(); 180ca060e3e98c561cad5e28603200810ca70ae4869Fyodor Kupolov 181ca060e3e98c561cad5e28603200810ca70ae4869Fyodor Kupolov private static class DateTimeSearchIndexProvider extends BaseSearchIndexProvider { 182ca060e3e98c561cad5e28603200810ca70ae4869Fyodor Kupolov 183ca060e3e98c561cad5e28603200810ca70ae4869Fyodor Kupolov @Override 184ca060e3e98c561cad5e28603200810ca70ae4869Fyodor Kupolov public List<SearchIndexableResource> getXmlResourcesToIndex( 185ca060e3e98c561cad5e28603200810ca70ae4869Fyodor Kupolov Context context, boolean enabled) { 186ca060e3e98c561cad5e28603200810ca70ae4869Fyodor Kupolov List<SearchIndexableResource> result = new ArrayList<>(); 187ca060e3e98c561cad5e28603200810ca70ae4869Fyodor Kupolov // Remove data/time settings from search in demo mode 188ca060e3e98c561cad5e28603200810ca70ae4869Fyodor Kupolov if (UserManager.isDeviceInDemoMode(context)) { 189ca060e3e98c561cad5e28603200810ca70ae4869Fyodor Kupolov return result; 190ca060e3e98c561cad5e28603200810ca70ae4869Fyodor Kupolov } 191ca060e3e98c561cad5e28603200810ca70ae4869Fyodor Kupolov 192ca060e3e98c561cad5e28603200810ca70ae4869Fyodor Kupolov SearchIndexableResource sir = new SearchIndexableResource(context); 193ca060e3e98c561cad5e28603200810ca70ae4869Fyodor Kupolov sir.xmlResId = R.xml.date_time_prefs; 194ca060e3e98c561cad5e28603200810ca70ae4869Fyodor Kupolov result.add(sir); 195ca060e3e98c561cad5e28603200810ca70ae4869Fyodor Kupolov 196ca060e3e98c561cad5e28603200810ca70ae4869Fyodor Kupolov return result; 197ca060e3e98c561cad5e28603200810ca70ae4869Fyodor Kupolov } 198ca060e3e98c561cad5e28603200810ca70ae4869Fyodor Kupolov } 199afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 200