1d48710c2835d891b216914ef1fdd3740e6cfc101Tony/*
2d48710c2835d891b216914ef1fdd3740e6cfc101Tony * Copyright (C) 2017 The Android Open Source Project
3d48710c2835d891b216914ef1fdd3740e6cfc101Tony *
4d48710c2835d891b216914ef1fdd3740e6cfc101Tony * Licensed under the Apache License, Version 2.0 (the "License");
5d48710c2835d891b216914ef1fdd3740e6cfc101Tony * you may not use this file except in compliance with the License.
6d48710c2835d891b216914ef1fdd3740e6cfc101Tony * You may obtain a copy of the License at
7d48710c2835d891b216914ef1fdd3740e6cfc101Tony *
8d48710c2835d891b216914ef1fdd3740e6cfc101Tony *      http://www.apache.org/licenses/LICENSE-2.0
9d48710c2835d891b216914ef1fdd3740e6cfc101Tony *
10d48710c2835d891b216914ef1fdd3740e6cfc101Tony * Unless required by applicable law or agreed to in writing, software
11d48710c2835d891b216914ef1fdd3740e6cfc101Tony * distributed under the License is distributed on an "AS IS" BASIS,
12d48710c2835d891b216914ef1fdd3740e6cfc101Tony * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d48710c2835d891b216914ef1fdd3740e6cfc101Tony * See the License for the specific language governing permissions and
14d48710c2835d891b216914ef1fdd3740e6cfc101Tony * limitations under the License.
15d48710c2835d891b216914ef1fdd3740e6cfc101Tony */
16d48710c2835d891b216914ef1fdd3740e6cfc101Tony
17d48710c2835d891b216914ef1fdd3740e6cfc101Tonypackage com.android.launcher3.util;
18d48710c2835d891b216914ef1fdd3740e6cfc101Tony
19d48710c2835d891b216914ef1fdd3740e6cfc101Tonyimport android.content.ContentResolver;
20d48710c2835d891b216914ef1fdd3740e6cfc101Tonyimport android.database.ContentObserver;
21d48710c2835d891b216914ef1fdd3740e6cfc101Tonyimport android.os.Handler;
22d48710c2835d891b216914ef1fdd3740e6cfc101Tonyimport android.provider.Settings;
23d48710c2835d891b216914ef1fdd3740e6cfc101Tony
24d48710c2835d891b216914ef1fdd3740e6cfc101Tonypublic interface SettingsObserver {
25d48710c2835d891b216914ef1fdd3740e6cfc101Tony
26d48710c2835d891b216914ef1fdd3740e6cfc101Tony    /**
27d48710c2835d891b216914ef1fdd3740e6cfc101Tony     * Registers the content observer to call {@link #onSettingChanged(boolean)} when any of the
28d48710c2835d891b216914ef1fdd3740e6cfc101Tony     * passed settings change. The value passed to onSettingChanged() is based on the key setting.
29d48710c2835d891b216914ef1fdd3740e6cfc101Tony     */
30d48710c2835d891b216914ef1fdd3740e6cfc101Tony    void register(String keySetting, String ... dependentSettings);
31d48710c2835d891b216914ef1fdd3740e6cfc101Tony    void unregister();
32d48710c2835d891b216914ef1fdd3740e6cfc101Tony    void onSettingChanged(boolean keySettingEnabled);
33d48710c2835d891b216914ef1fdd3740e6cfc101Tony
34d48710c2835d891b216914ef1fdd3740e6cfc101Tony
35d48710c2835d891b216914ef1fdd3740e6cfc101Tony    abstract class Secure extends ContentObserver implements SettingsObserver {
36d48710c2835d891b216914ef1fdd3740e6cfc101Tony        private ContentResolver mResolver;
37d48710c2835d891b216914ef1fdd3740e6cfc101Tony        private String mKeySetting;
38d48710c2835d891b216914ef1fdd3740e6cfc101Tony
39d48710c2835d891b216914ef1fdd3740e6cfc101Tony        public Secure(ContentResolver resolver) {
40d48710c2835d891b216914ef1fdd3740e6cfc101Tony            super(new Handler());
41d48710c2835d891b216914ef1fdd3740e6cfc101Tony            mResolver = resolver;
42d48710c2835d891b216914ef1fdd3740e6cfc101Tony        }
43d48710c2835d891b216914ef1fdd3740e6cfc101Tony
44d48710c2835d891b216914ef1fdd3740e6cfc101Tony        @Override
45d48710c2835d891b216914ef1fdd3740e6cfc101Tony        public void register(String keySetting, String ... dependentSettings) {
46d48710c2835d891b216914ef1fdd3740e6cfc101Tony            mKeySetting = keySetting;
47d48710c2835d891b216914ef1fdd3740e6cfc101Tony            mResolver.registerContentObserver(
48d48710c2835d891b216914ef1fdd3740e6cfc101Tony                    Settings.Secure.getUriFor(mKeySetting), false, this);
49d48710c2835d891b216914ef1fdd3740e6cfc101Tony            for (String setting : dependentSettings) {
50d48710c2835d891b216914ef1fdd3740e6cfc101Tony                mResolver.registerContentObserver(
51d48710c2835d891b216914ef1fdd3740e6cfc101Tony                        Settings.Secure.getUriFor(setting), false, this);
52d48710c2835d891b216914ef1fdd3740e6cfc101Tony            }
53d48710c2835d891b216914ef1fdd3740e6cfc101Tony            onChange(true);
54d48710c2835d891b216914ef1fdd3740e6cfc101Tony        }
55d48710c2835d891b216914ef1fdd3740e6cfc101Tony
56d48710c2835d891b216914ef1fdd3740e6cfc101Tony        @Override
57d48710c2835d891b216914ef1fdd3740e6cfc101Tony        public void unregister() {
58d48710c2835d891b216914ef1fdd3740e6cfc101Tony            mResolver.unregisterContentObserver(this);
59d48710c2835d891b216914ef1fdd3740e6cfc101Tony        }
60d48710c2835d891b216914ef1fdd3740e6cfc101Tony
61d48710c2835d891b216914ef1fdd3740e6cfc101Tony        @Override
62d48710c2835d891b216914ef1fdd3740e6cfc101Tony        public void onChange(boolean selfChange) {
63d48710c2835d891b216914ef1fdd3740e6cfc101Tony            super.onChange(selfChange);
64d48710c2835d891b216914ef1fdd3740e6cfc101Tony            onSettingChanged(Settings.Secure.getInt(mResolver, mKeySetting, 1) == 1);
65d48710c2835d891b216914ef1fdd3740e6cfc101Tony        }
66d48710c2835d891b216914ef1fdd3740e6cfc101Tony    }
67d48710c2835d891b216914ef1fdd3740e6cfc101Tony
68d48710c2835d891b216914ef1fdd3740e6cfc101Tony    abstract class System extends ContentObserver implements SettingsObserver {
69d48710c2835d891b216914ef1fdd3740e6cfc101Tony        private ContentResolver mResolver;
70d48710c2835d891b216914ef1fdd3740e6cfc101Tony        private String mKeySetting;
71d48710c2835d891b216914ef1fdd3740e6cfc101Tony
72d48710c2835d891b216914ef1fdd3740e6cfc101Tony        public System(ContentResolver resolver) {
73d48710c2835d891b216914ef1fdd3740e6cfc101Tony            super(new Handler());
74d48710c2835d891b216914ef1fdd3740e6cfc101Tony            mResolver = resolver;
75d48710c2835d891b216914ef1fdd3740e6cfc101Tony        }
76d48710c2835d891b216914ef1fdd3740e6cfc101Tony
77d48710c2835d891b216914ef1fdd3740e6cfc101Tony        @Override
78d48710c2835d891b216914ef1fdd3740e6cfc101Tony        public void register(String keySetting, String ... dependentSettings) {
79d48710c2835d891b216914ef1fdd3740e6cfc101Tony            mKeySetting = keySetting;
80d48710c2835d891b216914ef1fdd3740e6cfc101Tony            mResolver.registerContentObserver(
81d48710c2835d891b216914ef1fdd3740e6cfc101Tony                    Settings.System.getUriFor(mKeySetting), false, this);
82d48710c2835d891b216914ef1fdd3740e6cfc101Tony            for (String setting : dependentSettings) {
83d48710c2835d891b216914ef1fdd3740e6cfc101Tony                mResolver.registerContentObserver(
84d48710c2835d891b216914ef1fdd3740e6cfc101Tony                        Settings.System.getUriFor(setting), false, this);
85d48710c2835d891b216914ef1fdd3740e6cfc101Tony            }
86d48710c2835d891b216914ef1fdd3740e6cfc101Tony            onChange(true);
87d48710c2835d891b216914ef1fdd3740e6cfc101Tony        }
88d48710c2835d891b216914ef1fdd3740e6cfc101Tony
89d48710c2835d891b216914ef1fdd3740e6cfc101Tony        @Override
90d48710c2835d891b216914ef1fdd3740e6cfc101Tony        public void unregister() {
91d48710c2835d891b216914ef1fdd3740e6cfc101Tony            mResolver.unregisterContentObserver(this);
92d48710c2835d891b216914ef1fdd3740e6cfc101Tony        }
93d48710c2835d891b216914ef1fdd3740e6cfc101Tony
94d48710c2835d891b216914ef1fdd3740e6cfc101Tony        @Override
95d48710c2835d891b216914ef1fdd3740e6cfc101Tony        public void onChange(boolean selfChange) {
96d48710c2835d891b216914ef1fdd3740e6cfc101Tony            super.onChange(selfChange);
97d48710c2835d891b216914ef1fdd3740e6cfc101Tony            onSettingChanged(Settings.System.getInt(mResolver, mKeySetting, 1) == 1);
98d48710c2835d891b216914ef1fdd3740e6cfc101Tony        }
99d48710c2835d891b216914ef1fdd3740e6cfc101Tony    }
100d48710c2835d891b216914ef1fdd3740e6cfc101Tony}
101