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}