| /* |
| * Copyright (C) 2022 The Android Open Source 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.accessibility; |
| |
| import android.content.ContentResolver; |
| import android.database.ContentObserver; |
| import android.net.Uri; |
| import android.os.Handler; |
| import android.provider.Settings; |
| import android.util.Log; |
| |
| import java.util.Collections; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| |
| class AccessibilitySettingsContentObserver extends ContentObserver { |
| |
| private static final String TAG = "AccessibilitySettingsContentObserver"; |
| |
| public interface ContentObserverCallback { |
| void onChange(String key); |
| } |
| |
| // Key: Preference key's uri, Value: Preference key |
| private final Map<Uri, String> mUriToKey = new HashMap<>(2); |
| |
| // Key: Collection of preference keys, Value: onChange callback for keys |
| private final Map<List<String>, ContentObserverCallback> mUrisToCallback = new HashMap<>(); |
| |
| AccessibilitySettingsContentObserver(Handler handler) { |
| super(handler); |
| |
| // default key to be observed |
| addDefaultKeysToMap(); |
| } |
| |
| public void register(ContentResolver contentResolver) { |
| for (Uri uri : mUriToKey.keySet()) { |
| contentResolver.registerContentObserver(uri, false, this); |
| } |
| } |
| |
| public void unregister(ContentResolver contentResolver) { |
| contentResolver.unregisterContentObserver(this); |
| } |
| |
| private void addDefaultKeysToMap() { |
| addKeyToMap(Settings.Secure.ACCESSIBILITY_ENABLED); |
| addKeyToMap(Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES); |
| } |
| |
| private boolean isDefaultKey(String key) { |
| return Settings.Secure.ACCESSIBILITY_ENABLED.equals(key) |
| || Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES.equals(key); |
| } |
| |
| private void addKeyToMap(String key) { |
| mUriToKey.put(Settings.Secure.getUriFor(key), key); |
| } |
| |
| /** |
| * {@link ContentObserverCallback} is added to {@link ContentObserver} to handle the |
| * onChange event triggered by the key collection of {@code keysToObserve} and the default |
| * keys. |
| * |
| * Note: The following key are default to be observed. |
| * {@link Settings.Secure.ACCESSIBILITY_ENABLED} |
| * {@link Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES} |
| * |
| * @param keysToObserve A collection of keys which are going to be observed. |
| * @param observerCallback A callback which is used to handle the onChange event triggered |
| * by the key collection of {@code keysToObserve}. |
| */ |
| public void registerKeysToObserverCallback(List<String> keysToObserve, |
| ContentObserverCallback observerCallback) { |
| |
| for (String key: keysToObserve) { |
| addKeyToMap(key); |
| } |
| |
| mUrisToCallback.put(keysToObserve, observerCallback); |
| } |
| |
| /** |
| * {@link ContentObserverCallback} is added to {@link ContentObserver} to handle the |
| * onChange event triggered by the default keys. |
| * |
| * Note: The following key are default to be observed. |
| * {@link Settings.Secure.ACCESSIBILITY_ENABLED} |
| * {@link Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES} |
| * |
| * @param observerCallback A callback which is used to handle the onChange event triggered |
| * * by the key collection of {@code keysToObserve}. |
| */ |
| public void registerObserverCallback(ContentObserverCallback observerCallback) { |
| mUrisToCallback.put(Collections.emptyList(), observerCallback); |
| } |
| |
| @Override |
| public final void onChange(boolean selfChange, Uri uri) { |
| |
| final String key = mUriToKey.get(uri); |
| |
| if (key == null) { |
| Log.w(TAG, "AccessibilitySettingsContentObserver can not find the key for " |
| + "uri: " + uri); |
| return; |
| } |
| |
| for (List<String> keys : mUrisToCallback.keySet()) { |
| final boolean isDefaultKey = isDefaultKey(key); |
| if (isDefaultKey || keys.contains(key)) { |
| mUrisToCallback.get(keys).onChange(key); |
| } |
| } |
| } |
| } |