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