1af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock/* 2af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * Copyright (C) 2014 The Android Open Source Project 3af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * 4af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * Licensed under the Apache License, Version 2.0 (the "License"); 5af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * you may not use this file except in compliance with the License. 6af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * You may obtain a copy of the License at 7af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * 8af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * http://www.apache.org/licenses/LICENSE-2.0 9af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * 10af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * Unless required by applicable law or agreed to in writing, software 11af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * distributed under the License is distributed on an "AS IS" BASIS, 12af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * See the License for the specific language governing permissions and 14af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * limitations under the License. 15af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock */ 16af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 17af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockpackage com.android.systemui.qs; 18af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 1932d88e8ead4ccf6b698cac343461cfe12ef168b8Adrian Roosimport android.app.ActivityManager; 20af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.content.Context; 21af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.database.ContentObserver; 22af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.os.Handler; 23af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.provider.Settings.Secure; 24af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 25ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlockimport com.android.systemui.statusbar.policy.Listenable; 26af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 27af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock/** Helper for managing a secure setting. **/ 28ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlockpublic abstract class SecureSetting extends ContentObserver implements Listenable { 2918764bf55158ca668d94364fd07feb168497a0c2John Spurlock private static final int DEFAULT = 0; 3018764bf55158ca668d94364fd07feb168497a0c2John Spurlock 31af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock private final Context mContext; 32af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock private final String mSettingName; 33af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 3432d88e8ead4ccf6b698cac343461cfe12ef168b8Adrian Roos private boolean mListening; 3532d88e8ead4ccf6b698cac343461cfe12ef168b8Adrian Roos private int mUserId; 3618764bf55158ca668d94364fd07feb168497a0c2John Spurlock private int mObservedValue = DEFAULT; 3732d88e8ead4ccf6b698cac343461cfe12ef168b8Adrian Roos 3818764bf55158ca668d94364fd07feb168497a0c2John Spurlock protected abstract void handleValueChanged(int value, boolean observedChange); 39af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 40af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock public SecureSetting(Context context, Handler handler, String settingName) { 41af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock super(handler); 42af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock mContext = context; 43af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock mSettingName = settingName; 4432d88e8ead4ccf6b698cac343461cfe12ef168b8Adrian Roos mUserId = ActivityManager.getCurrentUser(); 45af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 46af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 47af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock public int getValue() { 4818764bf55158ca668d94364fd07feb168497a0c2John Spurlock return Secure.getIntForUser(mContext.getContentResolver(), mSettingName, DEFAULT, mUserId); 49af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 50af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 51af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock public void setValue(int value) { 5232d88e8ead4ccf6b698cac343461cfe12ef168b8Adrian Roos Secure.putIntForUser(mContext.getContentResolver(), mSettingName, value, mUserId); 53af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 54af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 55af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock @Override 56ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock public void setListening(boolean listening) { 5718764bf55158ca668d94364fd07feb168497a0c2John Spurlock if (listening == mListening) return; 5832d88e8ead4ccf6b698cac343461cfe12ef168b8Adrian Roos mListening = listening; 59ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock if (listening) { 6018764bf55158ca668d94364fd07feb168497a0c2John Spurlock mObservedValue = getValue(); 61ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock mContext.getContentResolver().registerContentObserver( 6232d88e8ead4ccf6b698cac343461cfe12ef168b8Adrian Roos Secure.getUriFor(mSettingName), false, this, mUserId); 63ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock } else { 64ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock mContext.getContentResolver().unregisterContentObserver(this); 6518764bf55158ca668d94364fd07feb168497a0c2John Spurlock mObservedValue = DEFAULT; 66ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock } 67af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 68af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 69af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock @Override 70af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock public void onChange(boolean selfChange) { 7118764bf55158ca668d94364fd07feb168497a0c2John Spurlock final int value = getValue(); 7218764bf55158ca668d94364fd07feb168497a0c2John Spurlock handleValueChanged(value, value != mObservedValue); 7318764bf55158ca668d94364fd07feb168497a0c2John Spurlock mObservedValue = value; 74af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 7532d88e8ead4ccf6b698cac343461cfe12ef168b8Adrian Roos 7632d88e8ead4ccf6b698cac343461cfe12ef168b8Adrian Roos public void setUserId(int userId) { 7732d88e8ead4ccf6b698cac343461cfe12ef168b8Adrian Roos mUserId = userId; 7832d88e8ead4ccf6b698cac343461cfe12ef168b8Adrian Roos if (mListening) { 7932d88e8ead4ccf6b698cac343461cfe12ef168b8Adrian Roos setListening(false); 8032d88e8ead4ccf6b698cac343461cfe12ef168b8Adrian Roos setListening(true); 8132d88e8ead4ccf6b698cac343461cfe12ef168b8Adrian Roos } 8232d88e8ead4ccf6b698cac343461cfe12ef168b8Adrian Roos } 83af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock} 84