/* * Copyright (C) 2014 The CyanogenMod Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.settings.cyanogenmod; import android.content.ContentResolver; import android.content.Context; import android.database.ContentObserver; import android.net.Uri; import android.os.Handler; import android.provider.Settings; import android.widget.Switch; import com.android.settings.widget.SwitchBar; public class BaseSystemSettingSwitchBar implements SwitchBar.OnSwitchChangeListener { private Context mContext; private SwitchBar mSwitchBar; private SettingsObserver mSettingsObserver; private boolean mListeningToOnSwitchChange = false; private boolean mStateMachineEvent; private final String mSettingKey; private final int mDefaultState; private final SwitchBarChangeCallback mCallback; public interface SwitchBarChangeCallback { public void onEnablerChanged(boolean isEnabled); } public BaseSystemSettingSwitchBar(Context context, SwitchBar switchBar, String key, boolean defaultState, SwitchBarChangeCallback callback) { mContext = context; mSwitchBar = switchBar; mSettingKey = key; mDefaultState = defaultState ? 1 : 0; mCallback = callback; mSettingsObserver = new SettingsObserver(new Handler()); setupSwitchBar(); } public void setupSwitchBar() { setSwitchState(); if (!mListeningToOnSwitchChange) { mSwitchBar.addOnSwitchChangeListener(this); mListeningToOnSwitchChange = true; } mSwitchBar.show(); } public void teardownSwitchBar() { if (mListeningToOnSwitchChange) { mSwitchBar.removeOnSwitchChangeListener(this); mListeningToOnSwitchChange = false; } mSwitchBar.hide(); } public void resume(Context context) { mContext = context; if (!mListeningToOnSwitchChange) { mSwitchBar.addOnSwitchChangeListener(this); mSettingsObserver.observe(); mListeningToOnSwitchChange = true; } } public void pause() { if (mListeningToOnSwitchChange) { mSwitchBar.removeOnSwitchChangeListener(this); mSettingsObserver.unobserve(); mListeningToOnSwitchChange = false; } } private void setSwitchBarChecked(boolean checked) { mStateMachineEvent = true; mSwitchBar.setChecked(checked); mStateMachineEvent = false; if (mCallback != null) { mCallback.onEnablerChanged(checked); } } private void setSwitchState() { boolean enabled = Settings.System.getInt(mContext.getContentResolver(), mSettingKey, mDefaultState) == 1; mStateMachineEvent = true; setSwitchBarChecked(enabled); mStateMachineEvent = false; } @Override public void onSwitchChanged(Switch switchView, boolean isChecked) { //Do nothing if called as a result of a state machine event if (mStateMachineEvent) { return; } // Handle a switch change Settings.System.putInt(mContext.getContentResolver(), mSettingKey, isChecked ? 1 : 0); if (mCallback != null) { mCallback.onEnablerChanged(isChecked); } } class SettingsObserver extends ContentObserver { SettingsObserver(Handler handler) { super(handler); } void observe() { ContentResolver resolver = mContext.getContentResolver(); resolver.registerContentObserver(Settings.System.getUriFor( mSettingKey), false, this); update(); } void unobserve() { ContentResolver resolver = mContext.getContentResolver(); resolver.unregisterContentObserver(this); } @Override public void onChange(boolean selfChange) { update(); } @Override public void onChange(boolean selfChange, Uri uri) { update(); } public void update() { setSwitchState(); } } }