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