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 1971cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawaimport android.app.Activity; 202571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawaimport android.app.AlarmManager; 214412e88e83099323a49e63f9544abd3294091f03Freeman Ngimport android.app.Fragment; 224412e88e83099323a49e63f9544abd3294091f03Freeman Ngimport android.app.FragmentTransaction; 23a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawaimport android.content.BroadcastReceiver; 24f2d5e9536ac741b384e154abb5bdb6d5d295a391Daisuke Miyakawaimport android.content.Context; 25ce0a7b2df0d6ce3d5a9bf063cde2e23b92ec7002Daisuke Miyakawaimport android.content.Intent; 26a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawaimport android.content.IntentFilter; 27da40cc28d9156d89392dedd83d827967ff6ffb7fDaisuke Miyakawaimport android.content.pm.ActivityInfo; 2871cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawaimport android.content.res.Configuration; 29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 304412e88e83099323a49e63f9544abd3294091f03Freeman Ngimport android.preference.Preference; 314412e88e83099323a49e63f9544abd3294091f03Freeman Ngimport android.preference.PreferenceFragment; 3271cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawaimport android.provider.Settings; 3371cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawaimport android.provider.Settings.SettingNotFoundException; 342571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawaimport android.util.Log; 35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View; 36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View.OnClickListener; 3771cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawaimport android.view.Window; 38f2d5e9536ac741b384e154abb5bdb6d5d295a391Daisuke Miyakawaimport android.view.inputmethod.InputMethodManager; 392571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawaimport android.widget.AdapterView; 402571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawaimport android.widget.AdapterView.OnItemClickListener; 4171cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawaimport android.widget.Button; 4271cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawaimport android.widget.CompoundButton; 4371cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawaimport android.widget.CompoundButton.OnCheckedChangeListener; 4471cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawaimport android.widget.DatePicker; 454412e88e83099323a49e63f9544abd3294091f03Freeman Ngimport android.widget.LinearLayout; 462571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawaimport android.widget.ListPopupWindow; 472571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawaimport android.widget.SimpleAdapter; 48d4fa73f87799fc96b89bec81ab7b322e58de3159Daisuke Miyakawaimport android.widget.TextView; 4971cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawaimport android.widget.TimePicker; 5071cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa 5171cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawaimport java.util.Calendar; 5271cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawaimport java.util.TimeZone; 5371cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa 5471cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawapublic class DateTimeSettingsSetupWizard extends Activity 554412e88e83099323a49e63f9544abd3294091f03Freeman Ng implements OnClickListener, OnItemClickListener, OnCheckedChangeListener, 564412e88e83099323a49e63f9544abd3294091f03Freeman Ng PreferenceFragment.OnPreferenceStartFragmentCallback { 57fe3b6bea01de328cdf7d6cf414607304fcdeaed6Daisuke Miyakawa private static final String TAG = DateTimeSettingsSetupWizard.class.getSimpleName(); 5871cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa 59ce0a7b2df0d6ce3d5a9bf063cde2e23b92ec7002Daisuke Miyakawa // force the first status of auto datetime flag. 60ce0a7b2df0d6ce3d5a9bf063cde2e23b92ec7002Daisuke Miyakawa private static final String EXTRA_INITIAL_AUTO_DATETIME_VALUE = 61ffe621f03f2ce14883ada77e4f4a76c529275495Daisuke Miyakawa "extra_initial_auto_datetime_value"; 62ce0a7b2df0d6ce3d5a9bf063cde2e23b92ec7002Daisuke Miyakawa 634412e88e83099323a49e63f9544abd3294091f03Freeman Ng // If we have enough screen real estate, we use a radically different layout with 644412e88e83099323a49e63f9544abd3294091f03Freeman Ng // big date and time pickers right on the screen, which requires very different handling. 654412e88e83099323a49e63f9544abd3294091f03Freeman Ng // Otherwise, we use the standard date time settings fragment. 664412e88e83099323a49e63f9544abd3294091f03Freeman Ng private boolean mUsingXLargeLayout; 67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 6871cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa /* Available only in XL */ 694ad2f9b87047237538fdfbe4730b378b7aa3bbccDaisuke Miyakawa private CompoundButton mAutoDateTimeButton; 70ce0a7b2df0d6ce3d5a9bf063cde2e23b92ec7002Daisuke Miyakawa // private CompoundButton mAutoTimeZoneButton; 712571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa 722571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa private Button mTimeZoneButton; 732571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa private ListPopupWindow mTimeZonePopup; 742571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa private SimpleAdapter mTimeZoneAdapter; 752571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa private TimeZone mSelectedTimeZone; 762571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa 7771cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa private TimePicker mTimePicker; 7871cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa private DatePicker mDatePicker; 79f2d5e9536ac741b384e154abb5bdb6d5d295a391Daisuke Miyakawa private InputMethodManager mInputMethodManager; 800f4f2f3a81f2a6d7100b4cff0d8de062cb2bc8f6Daisuke Miyakawa 81afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 8271cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa protected void onCreate(Bundle savedInstanceState) { 83a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa requestWindowFeature(Window.FEATURE_NO_TITLE); 8471cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa super.onCreate(savedInstanceState); 85afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project setContentView(R.layout.date_time_settings_setupwizard); 864412e88e83099323a49e63f9544abd3294091f03Freeman Ng 874412e88e83099323a49e63f9544abd3294091f03Freeman Ng // we know we've loaded the special xlarge layout because it has controls 884412e88e83099323a49e63f9544abd3294091f03Freeman Ng // not present in the standard layout 894412e88e83099323a49e63f9544abd3294091f03Freeman Ng mUsingXLargeLayout = findViewById(R.id.time_zone_button) != null; 904412e88e83099323a49e63f9544abd3294091f03Freeman Ng if (mUsingXLargeLayout) { 9171cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa initUiForXl(); 9271cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa } else { 9371cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa findViewById(R.id.next_button).setOnClickListener(this); 9471cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa } 954412e88e83099323a49e63f9544abd3294091f03Freeman Ng mTimeZoneAdapter = ZonePicker.constructTimezoneAdapter(this, false, 964412e88e83099323a49e63f9544abd3294091f03Freeman Ng R.layout.date_time_setup_custom_list_item_2); 9771cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa 9803708e030a9c85e323ba2464e908e4c9c3fc3095Freeman Ng // For the normal view, disable Back since changes stick immediately 9903708e030a9c85e323ba2464e908e4c9c3fc3095Freeman Ng // and can't be canceled, and we already have a Next button. For xLarge, 10003708e030a9c85e323ba2464e908e4c9c3fc3095Freeman Ng // though, we save up our changes and set them upon Next, so Back can 10103708e030a9c85e323ba2464e908e4c9c3fc3095Freeman Ng // cancel. And also, in xlarge, we need the keyboard dismiss button 10203708e030a9c85e323ba2464e908e4c9c3fc3095Freeman Ng // to be available. 10303708e030a9c85e323ba2464e908e4c9c3fc3095Freeman Ng if (!mUsingXLargeLayout) { 10403708e030a9c85e323ba2464e908e4c9c3fc3095Freeman Ng final View layoutRoot = findViewById(R.id.layout_root); 10503708e030a9c85e323ba2464e908e4c9c3fc3095Freeman Ng layoutRoot.setSystemUiVisibility(View.STATUS_BAR_DISABLE_BACK); 10603708e030a9c85e323ba2464e908e4c9c3fc3095Freeman Ng } 1074412e88e83099323a49e63f9544abd3294091f03Freeman Ng } 10862fb701ea9781f4e1c05af6d730e91bb2cdcdae0Daisuke Miyakawa 1094412e88e83099323a49e63f9544abd3294091f03Freeman Ng public void initUiForXl() { 110ce0a7b2df0d6ce3d5a9bf063cde2e23b92ec7002Daisuke Miyakawa // Currently just comment out codes related to auto timezone. 111ce0a7b2df0d6ce3d5a9bf063cde2e23b92ec7002Daisuke Miyakawa // TODO: Remove them when we are sure they are unnecessary. 112ce0a7b2df0d6ce3d5a9bf063cde2e23b92ec7002Daisuke Miyakawa /* 1134ad2f9b87047237538fdfbe4730b378b7aa3bbccDaisuke Miyakawa final boolean autoTimeZoneEnabled = isAutoTimeZoneEnabled(); 1144ad2f9b87047237538fdfbe4730b378b7aa3bbccDaisuke Miyakawa mAutoTimeZoneButton = (CompoundButton)findViewById(R.id.time_zone_auto); 1154ad2f9b87047237538fdfbe4730b378b7aa3bbccDaisuke Miyakawa mAutoTimeZoneButton.setChecked(autoTimeZoneEnabled); 1164ad2f9b87047237538fdfbe4730b378b7aa3bbccDaisuke Miyakawa mAutoTimeZoneButton.setOnCheckedChangeListener(this); 1174ad2f9b87047237538fdfbe4730b378b7aa3bbccDaisuke Miyakawa mAutoTimeZoneButton.setText(autoTimeZoneEnabled ? R.string.zone_auto_summaryOn : 118ce0a7b2df0d6ce3d5a9bf063cde2e23b92ec7002Daisuke Miyakawa R.string.zone_auto_summaryOff);*/ 11971cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa 12071cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa final TimeZone tz = TimeZone.getDefault(); 1212571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa mSelectedTimeZone = tz; 1222571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa mTimeZoneButton = (Button)findViewById(R.id.time_zone_button); 1232571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa mTimeZoneButton.setText(tz.getDisplayName()); 1242571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa // mTimeZoneButton.setText(DateTimeSettings.getTimeZoneText(tz)); 1252571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa mTimeZoneButton.setOnClickListener(this); 126ce0a7b2df0d6ce3d5a9bf063cde2e23b92ec7002Daisuke Miyakawa 127ce0a7b2df0d6ce3d5a9bf063cde2e23b92ec7002Daisuke Miyakawa final boolean autoDateTimeEnabled; 128ce0a7b2df0d6ce3d5a9bf063cde2e23b92ec7002Daisuke Miyakawa final Intent intent = getIntent(); 129ce0a7b2df0d6ce3d5a9bf063cde2e23b92ec7002Daisuke Miyakawa if (intent.hasExtra(EXTRA_INITIAL_AUTO_DATETIME_VALUE)) { 130ce0a7b2df0d6ce3d5a9bf063cde2e23b92ec7002Daisuke Miyakawa autoDateTimeEnabled = intent.getBooleanExtra(EXTRA_INITIAL_AUTO_DATETIME_VALUE, false); 131ce0a7b2df0d6ce3d5a9bf063cde2e23b92ec7002Daisuke Miyakawa } else { 132ce0a7b2df0d6ce3d5a9bf063cde2e23b92ec7002Daisuke Miyakawa autoDateTimeEnabled = isAutoDateTimeEnabled(); 133ce0a7b2df0d6ce3d5a9bf063cde2e23b92ec7002Daisuke Miyakawa } 1344ad2f9b87047237538fdfbe4730b378b7aa3bbccDaisuke Miyakawa 1350688f251af533c09682c791ae20834ab7854d7d7Daisuke Miyakawa mAutoDateTimeButton = (CompoundButton)findViewById(R.id.date_time_auto_button); 1364ad2f9b87047237538fdfbe4730b378b7aa3bbccDaisuke Miyakawa mAutoDateTimeButton.setChecked(autoDateTimeEnabled); 1374ad2f9b87047237538fdfbe4730b378b7aa3bbccDaisuke Miyakawa mAutoDateTimeButton.setOnCheckedChangeListener(this); 13871cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa 13971cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa mTimePicker = (TimePicker)findViewById(R.id.time_picker); 14071cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa mTimePicker.setEnabled(!autoDateTimeEnabled); 14171cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa mDatePicker = (DatePicker)findViewById(R.id.date_picker); 14271cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa mDatePicker.setEnabled(!autoDateTimeEnabled); 1434af903742ba9e9df2880fb73cf6c638222e696eaDaisuke Miyakawa mDatePicker.setCalendarViewShown(false); 14471cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa 145f2d5e9536ac741b384e154abb5bdb6d5d295a391Daisuke Miyakawa mInputMethodManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 146f2d5e9536ac741b384e154abb5bdb6d5d295a391Daisuke Miyakawa 14771cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa ((Button)findViewById(R.id.next_button)).setOnClickListener(this); 148ffe621f03f2ce14883ada77e4f4a76c529275495Daisuke Miyakawa final Button skipButton = (Button)findViewById(R.id.skip_button); 149ffe621f03f2ce14883ada77e4f4a76c529275495Daisuke Miyakawa if (skipButton != null) { 150ffe621f03f2ce14883ada77e4f4a76c529275495Daisuke Miyakawa skipButton.setOnClickListener(this); 151ffe621f03f2ce14883ada77e4f4a76c529275495Daisuke Miyakawa } 15271cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa } 15371cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa 15471cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa @Override 155a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa public void onResume() { 156a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa super.onResume(); 157a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa IntentFilter filter = new IntentFilter(); 158a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa filter.addAction(Intent.ACTION_TIME_TICK); 159a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa filter.addAction(Intent.ACTION_TIME_CHANGED); 160a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); 161a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa registerReceiver(mIntentReceiver, filter, null, null); 162a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa } 163a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa 164a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa @Override 165a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa public void onPause() { 166a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa super.onPause(); 167a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa unregisterReceiver(mIntentReceiver); 168a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa } 169a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa 170a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa @Override 17171cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa public void onClick(View view) { 17271cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa switch (view.getId()) { 1732571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa case R.id.time_zone_button: { 1744412e88e83099323a49e63f9544abd3294091f03Freeman Ng showTimezonePicker(R.id.time_zone_button); 17571cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa break; 17671cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa } 17771cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa case R.id.next_button: { 1784412e88e83099323a49e63f9544abd3294091f03Freeman Ng if (mSelectedTimeZone != null) { 1792571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa final TimeZone systemTimeZone = TimeZone.getDefault(); 1802571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa if (!systemTimeZone.equals(mSelectedTimeZone)) { 1812571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa Log.i(TAG, "Another TimeZone is selected by a user. Changing system TimeZone."); 1822571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa final AlarmManager alarm = (AlarmManager) 1832571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa getSystemService(Context.ALARM_SERVICE); 1842571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa alarm.setTimeZone(mSelectedTimeZone.getID()); 1852571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa } 1864412e88e83099323a49e63f9544abd3294091f03Freeman Ng } 1874412e88e83099323a49e63f9544abd3294091f03Freeman Ng if (mAutoDateTimeButton != null) { 188f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate Settings.Global.putInt(getContentResolver(), Settings.Global.AUTO_TIME, 1894412e88e83099323a49e63f9544abd3294091f03Freeman Ng mAutoDateTimeButton.isChecked() ? 1 : 0); 190a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa if (!mAutoDateTimeButton.isChecked()) { 1915f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani DateTimeSettings.setDate(this, mDatePicker.getYear(), mDatePicker.getMonth(), 192a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa mDatePicker.getDayOfMonth()); 1935f050104386b96d8c99eb3ff0f5088814709348bAmith Yamasani DateTimeSettings.setTime(this, 194a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa mTimePicker.getCurrentHour(), mTimePicker.getCurrentMinute()); 195a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa } 19671cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa } 19771cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa } // $FALL-THROUGH$ 19871cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa case R.id.skip_button: { 19971cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa setResult(RESULT_OK); 20071cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa finish(); 20171cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa break; 20271cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa } 20371cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa } 20471cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa } 20571cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa 20671cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa @Override 20771cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 208e25b55c00b14c92f81b7ef28776fc6c4b7da3839Daisuke Miyakawa final boolean autoEnabled = isChecked; // just for readibility. 209ce0a7b2df0d6ce3d5a9bf063cde2e23b92ec7002Daisuke Miyakawa /*if (buttonView == mAutoTimeZoneButton) { 2104ad2f9b87047237538fdfbe4730b378b7aa3bbccDaisuke Miyakawa // In XL screen, we save all the state only when the next button is pressed. 2114412e88e83099323a49e63f9544abd3294091f03Freeman Ng if (!mUsingXLargeLayout) { 212f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate Settings.Global.putInt(getContentResolver(), 213f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate Settings.Global.AUTO_TIME_ZONE, 2144ad2f9b87047237538fdfbe4730b378b7aa3bbccDaisuke Miyakawa isChecked ? 1 : 0); 2154ad2f9b87047237538fdfbe4730b378b7aa3bbccDaisuke Miyakawa } 2164ad2f9b87047237538fdfbe4730b378b7aa3bbccDaisuke Miyakawa mTimeZone.setEnabled(!autoEnabled); 2174ad2f9b87047237538fdfbe4730b378b7aa3bbccDaisuke Miyakawa if (isChecked) { 2184ad2f9b87047237538fdfbe4730b378b7aa3bbccDaisuke Miyakawa findViewById(R.id.current_time_zone).setVisibility(View.VISIBLE); 2194ad2f9b87047237538fdfbe4730b378b7aa3bbccDaisuke Miyakawa findViewById(R.id.zone_picker).setVisibility(View.GONE); 2204ad2f9b87047237538fdfbe4730b378b7aa3bbccDaisuke Miyakawa } 221ce0a7b2df0d6ce3d5a9bf063cde2e23b92ec7002Daisuke Miyakawa } else */ 222ce0a7b2df0d6ce3d5a9bf063cde2e23b92ec7002Daisuke Miyakawa if (buttonView == mAutoDateTimeButton) { 223f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate Settings.Global.putInt(getContentResolver(), 224f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate Settings.Global.AUTO_TIME, 225a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa isChecked ? 1 : 0); 2264ad2f9b87047237538fdfbe4730b378b7aa3bbccDaisuke Miyakawa mTimePicker.setEnabled(!autoEnabled); 2274ad2f9b87047237538fdfbe4730b378b7aa3bbccDaisuke Miyakawa mDatePicker.setEnabled(!autoEnabled); 22871cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa } 229e25b55c00b14c92f81b7ef28776fc6c4b7da3839Daisuke Miyakawa if (autoEnabled) { 230f2d5e9536ac741b384e154abb5bdb6d5d295a391Daisuke Miyakawa final View focusedView = getCurrentFocus(); 231f2d5e9536ac741b384e154abb5bdb6d5d295a391Daisuke Miyakawa if (focusedView != null) { 232f2d5e9536ac741b384e154abb5bdb6d5d295a391Daisuke Miyakawa mInputMethodManager.hideSoftInputFromWindow(focusedView.getWindowToken(), 0); 233f2d5e9536ac741b384e154abb5bdb6d5d295a391Daisuke Miyakawa focusedView.clearFocus(); 234f2d5e9536ac741b384e154abb5bdb6d5d295a391Daisuke Miyakawa } 235e25b55c00b14c92f81b7ef28776fc6c4b7da3839Daisuke Miyakawa } 23671cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa } 23771cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa 23871cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa @Override 2392571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 2402571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa final TimeZone tz = ZonePicker.obtainTimeZoneFromItem(parent.getItemAtPosition(position)); 2414412e88e83099323a49e63f9544abd3294091f03Freeman Ng if (mUsingXLargeLayout) { 2424412e88e83099323a49e63f9544abd3294091f03Freeman Ng mSelectedTimeZone = tz; 2434412e88e83099323a49e63f9544abd3294091f03Freeman Ng final Calendar now = Calendar.getInstance(tz); 2444412e88e83099323a49e63f9544abd3294091f03Freeman Ng if (mTimeZoneButton != null) { 2454412e88e83099323a49e63f9544abd3294091f03Freeman Ng mTimeZoneButton.setText(tz.getDisplayName()); 2464412e88e83099323a49e63f9544abd3294091f03Freeman Ng } 2474412e88e83099323a49e63f9544abd3294091f03Freeman Ng // mTimeZoneButton.setText(DateTimeSettings.getTimeZoneText(tz)); 2484412e88e83099323a49e63f9544abd3294091f03Freeman Ng mDatePicker.updateDate(now.get(Calendar.YEAR), now.get(Calendar.MONTH), 2494412e88e83099323a49e63f9544abd3294091f03Freeman Ng now.get(Calendar.DAY_OF_MONTH)); 2504412e88e83099323a49e63f9544abd3294091f03Freeman Ng mTimePicker.setCurrentHour(now.get(Calendar.HOUR_OF_DAY)); 2514412e88e83099323a49e63f9544abd3294091f03Freeman Ng mTimePicker.setCurrentMinute(now.get(Calendar.MINUTE)); 2524412e88e83099323a49e63f9544abd3294091f03Freeman Ng } else { 2534412e88e83099323a49e63f9544abd3294091f03Freeman Ng // in prefs mode, we actually change the setting right now, as opposed to waiting 2544412e88e83099323a49e63f9544abd3294091f03Freeman Ng // until Next is pressed in xLarge mode 2554412e88e83099323a49e63f9544abd3294091f03Freeman Ng final AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 2564412e88e83099323a49e63f9544abd3294091f03Freeman Ng alarm.setTimeZone(tz.getID()); 2574412e88e83099323a49e63f9544abd3294091f03Freeman Ng DateTimeSettings settingsFragment = (DateTimeSettings) getFragmentManager(). 2584412e88e83099323a49e63f9544abd3294091f03Freeman Ng findFragmentById(R.id.date_time_settings_fragment); 2594412e88e83099323a49e63f9544abd3294091f03Freeman Ng settingsFragment.updateTimeAndDateDisplay(this); 2604412e88e83099323a49e63f9544abd3294091f03Freeman Ng } 2612571f0dcb1cc96b7220687aff6fcddc623b57c3cDaisuke Miyakawa mTimeZonePopup.dismiss(); 262afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 263afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 2644412e88e83099323a49e63f9544abd3294091f03Freeman Ng /** 2654412e88e83099323a49e63f9544abd3294091f03Freeman Ng * If this is called, that means we're in prefs style portrait mode for a large display 2664412e88e83099323a49e63f9544abd3294091f03Freeman Ng * and the user has tapped on the time zone preference. If we were a PreferenceActivity, 2674412e88e83099323a49e63f9544abd3294091f03Freeman Ng * we'd then launch the timezone fragment in a new activity, but we aren't, and here 2684412e88e83099323a49e63f9544abd3294091f03Freeman Ng * on a tablet display, we really want more of a popup picker look' like the one we use 2694412e88e83099323a49e63f9544abd3294091f03Freeman Ng * for the xlarge version of this activity. So we just take this opportunity to launch that. 2704412e88e83099323a49e63f9544abd3294091f03Freeman Ng * 2714412e88e83099323a49e63f9544abd3294091f03Freeman Ng * TODO: For phones, we might want to change this to do the "normal" opening 2724412e88e83099323a49e63f9544abd3294091f03Freeman Ng * of the zonepicker fragment in its own activity. Or we might end up just 2734412e88e83099323a49e63f9544abd3294091f03Freeman Ng * creating a separate DateTimeSettingsSetupWizardPhone activity that subclasses 2744412e88e83099323a49e63f9544abd3294091f03Freeman Ng * PreferenceActivity in the first place to handle all that automatically. 2754412e88e83099323a49e63f9544abd3294091f03Freeman Ng */ 2764412e88e83099323a49e63f9544abd3294091f03Freeman Ng @Override 2774412e88e83099323a49e63f9544abd3294091f03Freeman Ng public boolean onPreferenceStartFragment(PreferenceFragment caller, Preference pref) { 2784412e88e83099323a49e63f9544abd3294091f03Freeman Ng showTimezonePicker(R.id.timezone_dropdown_anchor); 2794412e88e83099323a49e63f9544abd3294091f03Freeman Ng return true; 2804412e88e83099323a49e63f9544abd3294091f03Freeman Ng } 2814412e88e83099323a49e63f9544abd3294091f03Freeman Ng 2824412e88e83099323a49e63f9544abd3294091f03Freeman Ng private void showTimezonePicker(int anchorViewId) { 2834412e88e83099323a49e63f9544abd3294091f03Freeman Ng View anchorView = findViewById(anchorViewId); 2844412e88e83099323a49e63f9544abd3294091f03Freeman Ng if (anchorView == null) { 2854412e88e83099323a49e63f9544abd3294091f03Freeman Ng Log.e(TAG, "Unable to find zone picker anchor view " + anchorViewId); 2864412e88e83099323a49e63f9544abd3294091f03Freeman Ng return; 2874412e88e83099323a49e63f9544abd3294091f03Freeman Ng } 2884412e88e83099323a49e63f9544abd3294091f03Freeman Ng mTimeZonePopup = new ListPopupWindow(this, null); 2894412e88e83099323a49e63f9544abd3294091f03Freeman Ng mTimeZonePopup.setWidth(anchorView.getWidth()); 2904412e88e83099323a49e63f9544abd3294091f03Freeman Ng mTimeZonePopup.setAnchorView(anchorView); 2914412e88e83099323a49e63f9544abd3294091f03Freeman Ng mTimeZonePopup.setAdapter(mTimeZoneAdapter); 2924412e88e83099323a49e63f9544abd3294091f03Freeman Ng mTimeZonePopup.setOnItemClickListener(this); 2934412e88e83099323a49e63f9544abd3294091f03Freeman Ng mTimeZonePopup.setModal(true); 2944412e88e83099323a49e63f9544abd3294091f03Freeman Ng mTimeZonePopup.show(); 2954412e88e83099323a49e63f9544abd3294091f03Freeman Ng } 2964412e88e83099323a49e63f9544abd3294091f03Freeman Ng 29771cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa private boolean isAutoDateTimeEnabled() { 29871cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa try { 299f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate return Settings.Global.getInt(getContentResolver(), Settings.Global.AUTO_TIME) > 0; 30071cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa } catch (SettingNotFoundException e) { 30171cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa return true; 30271cc548f7ee51ff77a2c1dfb5da7a3f7b6c55fd5Daisuke Miyakawa } 303afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 3044ad2f9b87047237538fdfbe4730b378b7aa3bbccDaisuke Miyakawa 305ce0a7b2df0d6ce3d5a9bf063cde2e23b92ec7002Daisuke Miyakawa /* 3064ad2f9b87047237538fdfbe4730b378b7aa3bbccDaisuke Miyakawa private boolean isAutoTimeZoneEnabled() { 3074ad2f9b87047237538fdfbe4730b378b7aa3bbccDaisuke Miyakawa try { 308f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate return Settings.Global.getInt(getContentResolver(), 309f1c085899dd3d9142392b9ab7841c0e9502526a3Christopher Tate Settings.Global.AUTO_TIME_ZONE) > 0; 3104ad2f9b87047237538fdfbe4730b378b7aa3bbccDaisuke Miyakawa } catch (SettingNotFoundException e) { 3114ad2f9b87047237538fdfbe4730b378b7aa3bbccDaisuke Miyakawa return true; 3124ad2f9b87047237538fdfbe4730b378b7aa3bbccDaisuke Miyakawa } 313ce0a7b2df0d6ce3d5a9bf063cde2e23b92ec7002Daisuke Miyakawa }*/ 314a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa 315a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa private void updateTimeAndDateDisplay() { 3164412e88e83099323a49e63f9544abd3294091f03Freeman Ng if (!mUsingXLargeLayout) { 3174412e88e83099323a49e63f9544abd3294091f03Freeman Ng return; 3184412e88e83099323a49e63f9544abd3294091f03Freeman Ng } 319a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa final Calendar now = Calendar.getInstance(); 320a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa mTimeZoneButton.setText(now.getTimeZone().getDisplayName()); 321a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa mDatePicker.updateDate(now.get(Calendar.YEAR), now.get(Calendar.MONTH), 322a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa now.get(Calendar.DAY_OF_MONTH)); 323a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa mTimePicker.setCurrentHour(now.get(Calendar.HOUR_OF_DAY)); 324a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa mTimePicker.setCurrentMinute(now.get(Calendar.MINUTE)); 325a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa } 326a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa 327a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { 328a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa @Override 329a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa public void onReceive(Context context, Intent intent) { 330a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa updateTimeAndDateDisplay(); 331a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa } 332a85bfd2552ea4ee73e4a98e85194a3eb42284940Daisuke Miyakawa }; 333afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 334