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