18d65a7f992b346bc3228e646524e4522d665a74dTony Mantler/*
28d65a7f992b346bc3228e646524e4522d665a74dTony Mantler * Copyright (C) 2015 The Android Open Source Project
38d65a7f992b346bc3228e646524e4522d665a74dTony Mantler *
48d65a7f992b346bc3228e646524e4522d665a74dTony Mantler * Licensed under the Apache License, Version 2.0 (the "License");
58d65a7f992b346bc3228e646524e4522d665a74dTony Mantler * you may not use this file except in compliance with the License.
68d65a7f992b346bc3228e646524e4522d665a74dTony Mantler * You may obtain a copy of the License at
78d65a7f992b346bc3228e646524e4522d665a74dTony Mantler *
88d65a7f992b346bc3228e646524e4522d665a74dTony Mantler *      http://www.apache.org/licenses/LICENSE-2.0
98d65a7f992b346bc3228e646524e4522d665a74dTony Mantler *
108d65a7f992b346bc3228e646524e4522d665a74dTony Mantler * Unless required by applicable law or agreed to in writing, software
118d65a7f992b346bc3228e646524e4522d665a74dTony Mantler * distributed under the License is distributed on an "AS IS" BASIS,
128d65a7f992b346bc3228e646524e4522d665a74dTony Mantler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138d65a7f992b346bc3228e646524e4522d665a74dTony Mantler * See the License for the specific language governing permissions and
148d65a7f992b346bc3228e646524e4522d665a74dTony Mantler * limitations under the License
158d65a7f992b346bc3228e646524e4522d665a74dTony Mantler */
168d65a7f992b346bc3228e646524e4522d665a74dTony Mantler
178d65a7f992b346bc3228e646524e4522d665a74dTony Mantlerpackage com.android.tv.settings.system;
188d65a7f992b346bc3228e646524e4522d665a74dTony Mantler
198d65a7f992b346bc3228e646524e4522d665a74dTony Mantlerimport android.app.Activity;
208d65a7f992b346bc3228e646524e4522d665a74dTony Mantlerimport android.app.AlarmManager;
218d65a7f992b346bc3228e646524e4522d665a74dTony Mantlerimport android.content.BroadcastReceiver;
228d65a7f992b346bc3228e646524e4522d665a74dTony Mantlerimport android.content.Context;
238d65a7f992b346bc3228e646524e4522d665a74dTony Mantlerimport android.content.Intent;
248d65a7f992b346bc3228e646524e4522d665a74dTony Mantlerimport android.content.IntentFilter;
258d65a7f992b346bc3228e646524e4522d665a74dTony Mantlerimport android.os.Bundle;
268d65a7f992b346bc3228e646524e4522d665a74dTony Mantlerimport android.support.annotation.Keep;
278d65a7f992b346bc3228e646524e4522d665a74dTony Mantlerimport android.support.v17.preference.LeanbackPreferenceFragment;
288d65a7f992b346bc3228e646524e4522d665a74dTony Mantlerimport android.support.v7.preference.CheckBoxPreference;
298d65a7f992b346bc3228e646524e4522d665a74dTony Mantlerimport android.support.v7.preference.Preference;
308d65a7f992b346bc3228e646524e4522d665a74dTony Mantlerimport android.support.v7.preference.PreferenceScreen;
318d65a7f992b346bc3228e646524e4522d665a74dTony Mantlerimport android.text.TextUtils;
328d65a7f992b346bc3228e646524e4522d665a74dTony Mantler
338d65a7f992b346bc3228e646524e4522d665a74dTony Mantlerimport com.android.settingslib.datetime.ZoneGetter;
348d65a7f992b346bc3228e646524e4522d665a74dTony Mantlerimport com.android.tv.settings.R;
358d65a7f992b346bc3228e646524e4522d665a74dTony Mantler
368d65a7f992b346bc3228e646524e4522d665a74dTony Mantlerimport java.util.ArrayList;
378d65a7f992b346bc3228e646524e4522d665a74dTony Mantlerimport java.util.Collections;
388d65a7f992b346bc3228e646524e4522d665a74dTony Mantlerimport java.util.Comparator;
398d65a7f992b346bc3228e646524e4522d665a74dTony Mantlerimport java.util.List;
408d65a7f992b346bc3228e646524e4522d665a74dTony Mantlerimport java.util.Map;
418d65a7f992b346bc3228e646524e4522d665a74dTony Mantlerimport java.util.TimeZone;
428d65a7f992b346bc3228e646524e4522d665a74dTony Mantler
438d65a7f992b346bc3228e646524e4522d665a74dTony Mantler@Keep
448d65a7f992b346bc3228e646524e4522d665a74dTony Mantlerpublic class TimeZoneFragment extends LeanbackPreferenceFragment {
458d65a7f992b346bc3228e646524e4522d665a74dTony Mantler
468d65a7f992b346bc3228e646524e4522d665a74dTony Mantler    private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
478d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        @Override
488d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        public void onReceive(Context context, Intent intent) {
498d65a7f992b346bc3228e646524e4522d665a74dTony Mantler            final Activity activity = getActivity();
508d65a7f992b346bc3228e646524e4522d665a74dTony Mantler            if (activity != null) {
518d65a7f992b346bc3228e646524e4522d665a74dTony Mantler                updateZones();
528d65a7f992b346bc3228e646524e4522d665a74dTony Mantler            }
538d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        }
548d65a7f992b346bc3228e646524e4522d665a74dTony Mantler    };
558d65a7f992b346bc3228e646524e4522d665a74dTony Mantler
568d65a7f992b346bc3228e646524e4522d665a74dTony Mantler    @Override
578d65a7f992b346bc3228e646524e4522d665a74dTony Mantler    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
588d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        final Context themedContext = getPreferenceManager().getContext();
598d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        final PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(
608d65a7f992b346bc3228e646524e4522d665a74dTony Mantler                themedContext);
618d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        screen.setTitle(R.string.system_set_time_zone);
628d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        setPreferenceScreen(screen);
638d65a7f992b346bc3228e646524e4522d665a74dTony Mantler
648d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        final List<Map<String, Object>> zoneList = ZoneGetter.getZonesList(getActivity());
658d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        final List<ZonePreference> zonePrefs = new ArrayList<>(zoneList.size());
668d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        for (final Map<String, Object> zone : zoneList) {
678d65a7f992b346bc3228e646524e4522d665a74dTony Mantler            zonePrefs.add(new ZonePreference(themedContext, zone));
688d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        }
698d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        Collections.sort(zonePrefs, new ZonePrefComparator());
708d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        for (final Preference zonePref : zonePrefs) {
718d65a7f992b346bc3228e646524e4522d665a74dTony Mantler            screen.addPreference(zonePref);
728d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        }
738d65a7f992b346bc3228e646524e4522d665a74dTony Mantler    }
748d65a7f992b346bc3228e646524e4522d665a74dTony Mantler
758d65a7f992b346bc3228e646524e4522d665a74dTony Mantler    @Override
768d65a7f992b346bc3228e646524e4522d665a74dTony Mantler    public void onResume() {
778d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        super.onResume();
788d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        // Register for zone changes
798d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        IntentFilter filter = new IntentFilter();
808d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
818d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        getActivity().registerReceiver(mIntentReceiver, filter, null, null);
828d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        updateZones();
838d65a7f992b346bc3228e646524e4522d665a74dTony Mantler    }
848d65a7f992b346bc3228e646524e4522d665a74dTony Mantler
858d65a7f992b346bc3228e646524e4522d665a74dTony Mantler    @Override
868d65a7f992b346bc3228e646524e4522d665a74dTony Mantler    public void onPause() {
878d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        super.onPause();
888d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        getActivity().unregisterReceiver(mIntentReceiver);
898d65a7f992b346bc3228e646524e4522d665a74dTony Mantler    }
908d65a7f992b346bc3228e646524e4522d665a74dTony Mantler
918d65a7f992b346bc3228e646524e4522d665a74dTony Mantler    @Override
928d65a7f992b346bc3228e646524e4522d665a74dTony Mantler    public boolean onPreferenceTreeClick(Preference preference) {
938d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        if (preference instanceof ZonePreference) {
948d65a7f992b346bc3228e646524e4522d665a74dTony Mantler            // Update the system timezone value
958d65a7f992b346bc3228e646524e4522d665a74dTony Mantler            final AlarmManager alarm = (AlarmManager)
968d65a7f992b346bc3228e646524e4522d665a74dTony Mantler                    getActivity().getSystemService(Context.ALARM_SERVICE);
978d65a7f992b346bc3228e646524e4522d665a74dTony Mantler            alarm.setTimeZone(preference.getKey());
988d65a7f992b346bc3228e646524e4522d665a74dTony Mantler            if (!getFragmentManager().popBackStackImmediate()) {
998d65a7f992b346bc3228e646524e4522d665a74dTony Mantler                getActivity().finish();
1008d65a7f992b346bc3228e646524e4522d665a74dTony Mantler            }
1018d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        }
1028d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        return super.onPreferenceTreeClick(preference);
1038d65a7f992b346bc3228e646524e4522d665a74dTony Mantler    }
1048d65a7f992b346bc3228e646524e4522d665a74dTony Mantler
1058d65a7f992b346bc3228e646524e4522d665a74dTony Mantler    private void updateZones() {
1068d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        final String id = TimeZone.getDefault().getID();
1078d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        final PreferenceScreen screen = getPreferenceScreen();
1088d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        final int count = screen.getPreferenceCount();
1098d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        for (int i = 0; i < count; i++) {
1108d65a7f992b346bc3228e646524e4522d665a74dTony Mantler            final Preference pref = screen.getPreference(i);
1118d65a7f992b346bc3228e646524e4522d665a74dTony Mantler            if (!(pref instanceof ZonePreference)) {
1128d65a7f992b346bc3228e646524e4522d665a74dTony Mantler                continue;
1138d65a7f992b346bc3228e646524e4522d665a74dTony Mantler            }
1148d65a7f992b346bc3228e646524e4522d665a74dTony Mantler            final ZonePreference zonePref = (ZonePreference) pref;
1158d65a7f992b346bc3228e646524e4522d665a74dTony Mantler            zonePref.setChecked(TextUtils.equals(zonePref.getKey(), id));
1168d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        }
1178d65a7f992b346bc3228e646524e4522d665a74dTony Mantler    }
1188d65a7f992b346bc3228e646524e4522d665a74dTony Mantler
1198d65a7f992b346bc3228e646524e4522d665a74dTony Mantler    private static class ZonePreference extends CheckBoxPreference {
1208d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        Integer offset;
1218d65a7f992b346bc3228e646524e4522d665a74dTony Mantler
1228d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        public ZonePreference(Context context, Map<? extends String, ?> zone) {
1238d65a7f992b346bc3228e646524e4522d665a74dTony Mantler            super(context);
1248d65a7f992b346bc3228e646524e4522d665a74dTony Mantler            setWidgetLayoutResource(R.layout.radio_preference_widget);
1258d65a7f992b346bc3228e646524e4522d665a74dTony Mantler            setKey((String) zone.get(ZoneGetter.KEY_ID));
1268d65a7f992b346bc3228e646524e4522d665a74dTony Mantler            setPersistent(false);
1278d65a7f992b346bc3228e646524e4522d665a74dTony Mantler            setTitle((String) zone.get(ZoneGetter.KEY_DISPLAYNAME));
1288d65a7f992b346bc3228e646524e4522d665a74dTony Mantler            setSummary((String) zone.get(ZoneGetter.KEY_GMT));
1298d65a7f992b346bc3228e646524e4522d665a74dTony Mantler            offset = (Integer) zone.get(ZoneGetter.KEY_OFFSET);
1308d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        }
1318d65a7f992b346bc3228e646524e4522d665a74dTony Mantler    }
1328d65a7f992b346bc3228e646524e4522d665a74dTony Mantler
1338d65a7f992b346bc3228e646524e4522d665a74dTony Mantler    private static class ZonePrefComparator implements Comparator<ZonePreference> {
1348d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        public int compare(ZonePreference zone1, ZonePreference zone2) {
1358d65a7f992b346bc3228e646524e4522d665a74dTony Mantler            final int firstResult = zone1.offset.compareTo(zone2.offset);
1368d65a7f992b346bc3228e646524e4522d665a74dTony Mantler            if (firstResult != 0) {
1378d65a7f992b346bc3228e646524e4522d665a74dTony Mantler                return firstResult;
1388d65a7f992b346bc3228e646524e4522d665a74dTony Mantler            }
1398d65a7f992b346bc3228e646524e4522d665a74dTony Mantler            return zone1.getTitle().toString().compareTo(zone2.getTitle().toString());
1408d65a7f992b346bc3228e646524e4522d665a74dTony Mantler        }
1418d65a7f992b346bc3228e646524e4522d665a74dTony Mantler    }
1428d65a7f992b346bc3228e646524e4522d665a74dTony Mantler
1438d65a7f992b346bc3228e646524e4522d665a74dTony Mantler}
144