194d4766e55c34790e9a0be3009f05205cd730776Yao Chen/* 294d4766e55c34790e9a0be3009f05205cd730776Yao Chen * Copyright (C) 2016 The Android Open Source Project 394d4766e55c34790e9a0be3009f05205cd730776Yao Chen * 494d4766e55c34790e9a0be3009f05205cd730776Yao Chen * Licensed under the Apache License, Version 2.0 (the "License"); 594d4766e55c34790e9a0be3009f05205cd730776Yao Chen * you may not use this file except in compliance with the License. 694d4766e55c34790e9a0be3009f05205cd730776Yao Chen * You may obtain a copy of the License at 794d4766e55c34790e9a0be3009f05205cd730776Yao Chen * 894d4766e55c34790e9a0be3009f05205cd730776Yao Chen * http://www.apache.org/licenses/LICENSE-2.0 994d4766e55c34790e9a0be3009f05205cd730776Yao Chen * 1094d4766e55c34790e9a0be3009f05205cd730776Yao Chen * Unless required by applicable law or agreed to in writing, software 1194d4766e55c34790e9a0be3009f05205cd730776Yao Chen * distributed under the License is distributed on an "AS IS" BASIS, 1294d4766e55c34790e9a0be3009f05205cd730776Yao Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1394d4766e55c34790e9a0be3009f05205cd730776Yao Chen * See the License for the specific language governing permissions and 1494d4766e55c34790e9a0be3009f05205cd730776Yao Chen * limitations under the License. 1594d4766e55c34790e9a0be3009f05205cd730776Yao Chen */ 1694d4766e55c34790e9a0be3009f05205cd730776Yao Chenpackage com.google.android.car.kitchensink.setting; 1794d4766e55c34790e9a0be3009f05205cd730776Yao Chen 1894d4766e55c34790e9a0be3009f05205cd730776Yao Chenimport android.app.TimePickerDialog; 1994d4766e55c34790e9a0be3009f05205cd730776Yao Chenimport android.car.CarApiUtil; 2094d4766e55c34790e9a0be3009f05205cd730776Yao Chenimport android.car.settings.GarageModeSettingsObserver; 2194d4766e55c34790e9a0be3009f05205cd730776Yao Chenimport android.net.Uri; 2294d4766e55c34790e9a0be3009f05205cd730776Yao Chenimport android.os.Bundle; 2394d4766e55c34790e9a0be3009f05205cd730776Yao Chenimport android.os.Handler; 2494d4766e55c34790e9a0be3009f05205cd730776Yao Chenimport android.preference.Preference; 2594d4766e55c34790e9a0be3009f05205cd730776Yao Chenimport android.preference.PreferenceFragment; 2694d4766e55c34790e9a0be3009f05205cd730776Yao Chenimport android.preference.PreferenceScreen; 2794d4766e55c34790e9a0be3009f05205cd730776Yao Chenimport android.provider.Settings; 2894d4766e55c34790e9a0be3009f05205cd730776Yao Chenimport android.text.format.DateFormat; 2994d4766e55c34790e9a0be3009f05205cd730776Yao Chenimport android.util.Log; 3094d4766e55c34790e9a0be3009f05205cd730776Yao Chenimport android.widget.TimePicker; 3194d4766e55c34790e9a0be3009f05205cd730776Yao Chen 3294d4766e55c34790e9a0be3009f05205cd730776Yao Chenimport com.google.android.car.kitchensink.R; 3394d4766e55c34790e9a0be3009f05205cd730776Yao Chen 3494d4766e55c34790e9a0be3009f05205cd730776Yao Chenimport java.sql.Time; 3594d4766e55c34790e9a0be3009f05205cd730776Yao Chen 3694d4766e55c34790e9a0be3009f05205cd730776Yao Chenimport static android.car.settings.CarSettings.Global.KEY_GARAGE_MODE_MAINTENANCE_WINDOW; 3794d4766e55c34790e9a0be3009f05205cd730776Yao Chenimport static android.car.settings.CarSettings.Global.KEY_GARAGE_MODE_ENABLED; 3894d4766e55c34790e9a0be3009f05205cd730776Yao Chenimport static android.car.settings.CarSettings.Global.KEY_GARAGE_MODE_WAKE_UP_TIME; 3994d4766e55c34790e9a0be3009f05205cd730776Yao Chenimport static android.car.settings.GarageModeSettingsObserver.GARAGE_MODE_ENABLED_URI; 4094d4766e55c34790e9a0be3009f05205cd730776Yao Chenimport static android.car.settings.GarageModeSettingsObserver.GARAGE_MODE_WAKE_UP_TIME_URI; 4194d4766e55c34790e9a0be3009f05205cd730776Yao Chenimport static android.car.settings.GarageModeSettingsObserver.GARAGE_MODE_MAINTENANCE_WINDOW_URI; 4294d4766e55c34790e9a0be3009f05205cd730776Yao Chen 4394d4766e55c34790e9a0be3009f05205cd730776Yao Chenpublic class GarageModeSettingsFragment extends PreferenceFragment implements 4494d4766e55c34790e9a0be3009f05205cd730776Yao Chen TimePickerDialog.OnTimeSetListener, Preference.OnPreferenceChangeListener { 4594d4766e55c34790e9a0be3009f05205cd730776Yao Chen 4694d4766e55c34790e9a0be3009f05205cd730776Yao Chen private static final String TAG = "GarageModeSettings"; 4794d4766e55c34790e9a0be3009f05205cd730776Yao Chen private Preference mTimePreference; 4894d4766e55c34790e9a0be3009f05205cd730776Yao Chen private Preference mGarageSwitchPreference; 4994d4766e55c34790e9a0be3009f05205cd730776Yao Chen private Preference mGarageLimitPreference; 5094d4766e55c34790e9a0be3009f05205cd730776Yao Chen 5194d4766e55c34790e9a0be3009f05205cd730776Yao Chen private int mGarageTimeHour; 5294d4766e55c34790e9a0be3009f05205cd730776Yao Chen private int mGarageTimeMin; 5394d4766e55c34790e9a0be3009f05205cd730776Yao Chen 5494d4766e55c34790e9a0be3009f05205cd730776Yao Chen private GarageModeSettingsObserver mContentObserver; 5594d4766e55c34790e9a0be3009f05205cd730776Yao Chen 5694d4766e55c34790e9a0be3009f05205cd730776Yao Chen @Override 5794d4766e55c34790e9a0be3009f05205cd730776Yao Chen public void onCreate(Bundle savedInstanceState) { 5894d4766e55c34790e9a0be3009f05205cd730776Yao Chen super.onCreate(savedInstanceState); 5994d4766e55c34790e9a0be3009f05205cd730776Yao Chen addPreferencesFromResource(R.xml.garage_mode_prefs); 6094d4766e55c34790e9a0be3009f05205cd730776Yao Chen mTimePreference = findPreference(KEY_GARAGE_MODE_WAKE_UP_TIME); 6194d4766e55c34790e9a0be3009f05205cd730776Yao Chen mTimePreference.setOnPreferenceChangeListener(this); 6294d4766e55c34790e9a0be3009f05205cd730776Yao Chen mGarageSwitchPreference = findPreference(KEY_GARAGE_MODE_ENABLED); 6394d4766e55c34790e9a0be3009f05205cd730776Yao Chen mGarageSwitchPreference.setOnPreferenceChangeListener(this); 6494d4766e55c34790e9a0be3009f05205cd730776Yao Chen mGarageLimitPreference = findPreference(KEY_GARAGE_MODE_MAINTENANCE_WINDOW); 6594d4766e55c34790e9a0be3009f05205cd730776Yao Chen mGarageLimitPreference.setOnPreferenceChangeListener(this); 6694d4766e55c34790e9a0be3009f05205cd730776Yao Chen refreshUI(KEY_GARAGE_MODE_ENABLED, KEY_GARAGE_MODE_WAKE_UP_TIME, KEY_GARAGE_MODE_MAINTENANCE_WINDOW); 6794d4766e55c34790e9a0be3009f05205cd730776Yao Chen mContentObserver = new GarageModeSettingsObserver(getContext(), new Handler()) { 6894d4766e55c34790e9a0be3009f05205cd730776Yao Chen @Override 6994d4766e55c34790e9a0be3009f05205cd730776Yao Chen public void onChange(boolean selfChange, Uri uri) { 7094d4766e55c34790e9a0be3009f05205cd730776Yao Chen onSettingsChangedInternal(uri); 7194d4766e55c34790e9a0be3009f05205cd730776Yao Chen } 7294d4766e55c34790e9a0be3009f05205cd730776Yao Chen }; 7394d4766e55c34790e9a0be3009f05205cd730776Yao Chen } 7494d4766e55c34790e9a0be3009f05205cd730776Yao Chen 7594d4766e55c34790e9a0be3009f05205cd730776Yao Chen @Override 7694d4766e55c34790e9a0be3009f05205cd730776Yao Chen public void onResume() { 7794d4766e55c34790e9a0be3009f05205cd730776Yao Chen super.onResume(); 7894d4766e55c34790e9a0be3009f05205cd730776Yao Chen mContentObserver.register(); 7994d4766e55c34790e9a0be3009f05205cd730776Yao Chen } 8094d4766e55c34790e9a0be3009f05205cd730776Yao Chen 8194d4766e55c34790e9a0be3009f05205cd730776Yao Chen @Override 8294d4766e55c34790e9a0be3009f05205cd730776Yao Chen public void onPause() { 8394d4766e55c34790e9a0be3009f05205cd730776Yao Chen super.onPause(); 8494d4766e55c34790e9a0be3009f05205cd730776Yao Chen mContentObserver.unregister(); 8594d4766e55c34790e9a0be3009f05205cd730776Yao Chen } 8694d4766e55c34790e9a0be3009f05205cd730776Yao Chen 8794d4766e55c34790e9a0be3009f05205cd730776Yao Chen private void refreshUI(String... keys) { 8894d4766e55c34790e9a0be3009f05205cd730776Yao Chen for (String key : keys) { 8994d4766e55c34790e9a0be3009f05205cd730776Yao Chen try { 9094d4766e55c34790e9a0be3009f05205cd730776Yao Chen switch (key) { 9194d4766e55c34790e9a0be3009f05205cd730776Yao Chen case KEY_GARAGE_MODE_ENABLED: 9294d4766e55c34790e9a0be3009f05205cd730776Yao Chen mGarageSwitchPreference.setDefaultValue( 9394d4766e55c34790e9a0be3009f05205cd730776Yao Chen Settings.Global.getInt(getContext().getContentResolver(), key) 9494d4766e55c34790e9a0be3009f05205cd730776Yao Chen == 1); 9594d4766e55c34790e9a0be3009f05205cd730776Yao Chen break; 9694d4766e55c34790e9a0be3009f05205cd730776Yao Chen case KEY_GARAGE_MODE_WAKE_UP_TIME: 9794d4766e55c34790e9a0be3009f05205cd730776Yao Chen int time[] = CarApiUtil.decodeGarageTimeSetting( 9894d4766e55c34790e9a0be3009f05205cd730776Yao Chen Settings.Global.getString(getContext().getContentResolver(), 9994d4766e55c34790e9a0be3009f05205cd730776Yao Chen KEY_GARAGE_MODE_WAKE_UP_TIME)); 10094d4766e55c34790e9a0be3009f05205cd730776Yao Chen mTimePreference.setSummary( 10194d4766e55c34790e9a0be3009f05205cd730776Yao Chen DateFormat.getTimeFormat(getContext()).format( 10294d4766e55c34790e9a0be3009f05205cd730776Yao Chen new Time(time[0], time[1], 0))); 10394d4766e55c34790e9a0be3009f05205cd730776Yao Chen mGarageTimeHour = time[0]; 10494d4766e55c34790e9a0be3009f05205cd730776Yao Chen mGarageTimeMin = time[1]; 10594d4766e55c34790e9a0be3009f05205cd730776Yao Chen break; 10694d4766e55c34790e9a0be3009f05205cd730776Yao Chen case KEY_GARAGE_MODE_MAINTENANCE_WINDOW: 10794d4766e55c34790e9a0be3009f05205cd730776Yao Chen int limitMinutes = Settings.Global.getInt(getContext().getContentResolver(), 10894d4766e55c34790e9a0be3009f05205cd730776Yao Chen key) / 60 / 1000; 10994d4766e55c34790e9a0be3009f05205cd730776Yao Chen mGarageLimitPreference.setSummary( 11094d4766e55c34790e9a0be3009f05205cd730776Yao Chen getString(R.string.garage_time_limit_summary, limitMinutes)); 11194d4766e55c34790e9a0be3009f05205cd730776Yao Chen break; 11294d4766e55c34790e9a0be3009f05205cd730776Yao Chen } 11394d4766e55c34790e9a0be3009f05205cd730776Yao Chen } catch (Settings.SettingNotFoundException e) { 11494d4766e55c34790e9a0be3009f05205cd730776Yao Chen Log.e(TAG, "Settings not found " + key); 11594d4766e55c34790e9a0be3009f05205cd730776Yao Chen } 11694d4766e55c34790e9a0be3009f05205cd730776Yao Chen } 11794d4766e55c34790e9a0be3009f05205cd730776Yao Chen } 11894d4766e55c34790e9a0be3009f05205cd730776Yao Chen 11994d4766e55c34790e9a0be3009f05205cd730776Yao Chen @Override 12094d4766e55c34790e9a0be3009f05205cd730776Yao Chen public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) { 12194d4766e55c34790e9a0be3009f05205cd730776Yao Chen if (preference == mTimePreference) { 12294d4766e55c34790e9a0be3009f05205cd730776Yao Chen TimePickerDialogFragment dialog = 12394d4766e55c34790e9a0be3009f05205cd730776Yao Chen TimePickerDialogFragment.newInstance(mGarageTimeHour, mGarageTimeMin); 12494d4766e55c34790e9a0be3009f05205cd730776Yao Chen dialog.setTimeSetListener(this); 12594d4766e55c34790e9a0be3009f05205cd730776Yao Chen dialog.show(getFragmentManager(), "time"); 12694d4766e55c34790e9a0be3009f05205cd730776Yao Chen return true; 12794d4766e55c34790e9a0be3009f05205cd730776Yao Chen } 12894d4766e55c34790e9a0be3009f05205cd730776Yao Chen return super.onPreferenceTreeClick(screen, preference); 12994d4766e55c34790e9a0be3009f05205cd730776Yao Chen } 13094d4766e55c34790e9a0be3009f05205cd730776Yao Chen 13194d4766e55c34790e9a0be3009f05205cd730776Yao Chen @Override 13294d4766e55c34790e9a0be3009f05205cd730776Yao Chen public boolean onPreferenceChange(Preference preference, Object newValue) { 13394d4766e55c34790e9a0be3009f05205cd730776Yao Chen if (preference == mGarageSwitchPreference) { 13494d4766e55c34790e9a0be3009f05205cd730776Yao Chen updateGarageSwitch((boolean) newValue); 13594d4766e55c34790e9a0be3009f05205cd730776Yao Chen refreshUI(KEY_GARAGE_MODE_ENABLED); 13694d4766e55c34790e9a0be3009f05205cd730776Yao Chen return true; 13794d4766e55c34790e9a0be3009f05205cd730776Yao Chen } else if (preference == mGarageLimitPreference) { 13894d4766e55c34790e9a0be3009f05205cd730776Yao Chen updateGarageTimeLimit(Integer.valueOf((String) newValue)); 13994d4766e55c34790e9a0be3009f05205cd730776Yao Chen refreshUI(KEY_GARAGE_MODE_MAINTENANCE_WINDOW); 14094d4766e55c34790e9a0be3009f05205cd730776Yao Chen return true; 14194d4766e55c34790e9a0be3009f05205cd730776Yao Chen } 14294d4766e55c34790e9a0be3009f05205cd730776Yao Chen 14394d4766e55c34790e9a0be3009f05205cd730776Yao Chen return false; 14494d4766e55c34790e9a0be3009f05205cd730776Yao Chen } 14594d4766e55c34790e9a0be3009f05205cd730776Yao Chen 14694d4766e55c34790e9a0be3009f05205cd730776Yao Chen private void updateGarageSwitch(boolean newValue) { 14794d4766e55c34790e9a0be3009f05205cd730776Yao Chen Settings.Global.putInt(getContext().getContentResolver(), 14894d4766e55c34790e9a0be3009f05205cd730776Yao Chen KEY_GARAGE_MODE_ENABLED, newValue ? 1 : 0); 14994d4766e55c34790e9a0be3009f05205cd730776Yao Chen } 15094d4766e55c34790e9a0be3009f05205cd730776Yao Chen 15194d4766e55c34790e9a0be3009f05205cd730776Yao Chen private void updateGarageTimeLimit(int newValue) { 15294d4766e55c34790e9a0be3009f05205cd730776Yao Chen Settings.Global.putInt(getContext().getContentResolver(), 15394d4766e55c34790e9a0be3009f05205cd730776Yao Chen KEY_GARAGE_MODE_MAINTENANCE_WINDOW, newValue * 60 * 1000); 15494d4766e55c34790e9a0be3009f05205cd730776Yao Chen } 15594d4766e55c34790e9a0be3009f05205cd730776Yao Chen 15694d4766e55c34790e9a0be3009f05205cd730776Yao Chen private void updateGarageTime(String time) { 15794d4766e55c34790e9a0be3009f05205cd730776Yao Chen Settings.Global.putString(getContext().getContentResolver(), 15894d4766e55c34790e9a0be3009f05205cd730776Yao Chen KEY_GARAGE_MODE_WAKE_UP_TIME, time); 15994d4766e55c34790e9a0be3009f05205cd730776Yao Chen } 16094d4766e55c34790e9a0be3009f05205cd730776Yao Chen 16194d4766e55c34790e9a0be3009f05205cd730776Yao Chen @Override 16294d4766e55c34790e9a0be3009f05205cd730776Yao Chen public void onTimeSet(TimePicker timePicker, int hour, int minute) { 16394d4766e55c34790e9a0be3009f05205cd730776Yao Chen updateGarageTime(CarApiUtil.encodeGarageTimeSetting(hour, minute)); 16494d4766e55c34790e9a0be3009f05205cd730776Yao Chen refreshUI(KEY_GARAGE_MODE_WAKE_UP_TIME); 16594d4766e55c34790e9a0be3009f05205cd730776Yao Chen } 16694d4766e55c34790e9a0be3009f05205cd730776Yao Chen 16794d4766e55c34790e9a0be3009f05205cd730776Yao Chen private void onSettingsChangedInternal(Uri uri) { 16894d4766e55c34790e9a0be3009f05205cd730776Yao Chen Log.d(TAG, "Content Observer onChange: " + uri); 16994d4766e55c34790e9a0be3009f05205cd730776Yao Chen if (uri.equals(GARAGE_MODE_ENABLED_URI)) { 17094d4766e55c34790e9a0be3009f05205cd730776Yao Chen refreshUI(KEY_GARAGE_MODE_ENABLED); 17194d4766e55c34790e9a0be3009f05205cd730776Yao Chen } else if (uri.equals(GARAGE_MODE_WAKE_UP_TIME_URI)) { 17294d4766e55c34790e9a0be3009f05205cd730776Yao Chen refreshUI(KEY_GARAGE_MODE_WAKE_UP_TIME); 17394d4766e55c34790e9a0be3009f05205cd730776Yao Chen } else if (uri.equals(GARAGE_MODE_MAINTENANCE_WINDOW_URI)) { 17494d4766e55c34790e9a0be3009f05205cd730776Yao Chen refreshUI(KEY_GARAGE_MODE_MAINTENANCE_WINDOW); 17594d4766e55c34790e9a0be3009f05205cd730776Yao Chen } 17694d4766e55c34790e9a0be3009f05205cd730776Yao Chen } 17794d4766e55c34790e9a0be3009f05205cd730776Yao Chen}