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