17b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su/* 27b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su * Copyright (C) 2017 The Android Open Source Project 37b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su * 47b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su * Licensed under the Apache License, Version 2.0 (the "License"); 57b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su * you may not use this file except in compliance with the License. 67b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su * You may obtain a copy of the License at 77b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su * 87b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su * http://www.apache.org/licenses/LICENSE-2.0 97b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su * 107b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su * Unless required by applicable law or agreed to in writing, software 117b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su * distributed under the License is distributed on an "AS IS" BASIS, 127b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su * See the License for the specific language governing permissions and 147b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su * limitations under the License. 157b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su */ 167b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su 177b6831b2bf21c433882c98048b229a9d9ee4a64fChen Supackage com.android.documentsui.prefs; 187b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su 197b6831b2bf21c433882c98048b229a9d9ee4a64fChen Suimport android.app.backup.BackupManager; 207b6831b2bf21c433882c98048b229a9d9ee4a64fChen Suimport android.content.SharedPreferences; 216737577c70cb873fde70a53f25be6e15b630c037Steve McKayimport android.content.SharedPreferences.OnSharedPreferenceChangeListener; 226737577c70cb873fde70a53f25be6e15b630c037Steve McKay 236737577c70cb873fde70a53f25be6e15b630c037Steve McKayimport com.android.documentsui.base.ApplicationScope; 246737577c70cb873fde70a53f25be6e15b630c037Steve McKay 256737577c70cb873fde70a53f25be6e15b630c037Steve McKayimport java.util.function.Consumer; 267b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su 277b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su/** 287b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su * A class that monitors changes to the default shared preferences file. If a preference which 297b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su * should be backed up changed, schedule a backup. 306737577c70cb873fde70a53f25be6e15b630c037Steve McKay * 316737577c70cb873fde70a53f25be6e15b630c037Steve McKay * Also, notifies a callback when such changes are noticed. This is the key mechanism by which 326737577c70cb873fde70a53f25be6e15b630c037Steve McKay * we learn about preference changes in other instances of the app. 337b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su */ 346737577c70cb873fde70a53f25be6e15b630c037Steve McKaypublic final class PreferencesMonitor { 356737577c70cb873fde70a53f25be6e15b630c037Steve McKay 366737577c70cb873fde70a53f25be6e15b630c037Steve McKay private final String mPackageName; 376737577c70cb873fde70a53f25be6e15b630c037Steve McKay private final SharedPreferences mPrefs; 386737577c70cb873fde70a53f25be6e15b630c037Steve McKay private final OnSharedPreferenceChangeListener mListener = this::onSharedPreferenceChanged; 396737577c70cb873fde70a53f25be6e15b630c037Steve McKay private final Consumer<String> mChangeCallback; 407b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su 416737577c70cb873fde70a53f25be6e15b630c037Steve McKay public PreferencesMonitor( 426737577c70cb873fde70a53f25be6e15b630c037Steve McKay @ApplicationScope String packageName, 436737577c70cb873fde70a53f25be6e15b630c037Steve McKay SharedPreferences prefs, 446737577c70cb873fde70a53f25be6e15b630c037Steve McKay Consumer<String> listener) { 457b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su 466737577c70cb873fde70a53f25be6e15b630c037Steve McKay mPackageName = packageName; 476737577c70cb873fde70a53f25be6e15b630c037Steve McKay mPrefs = prefs; 486737577c70cb873fde70a53f25be6e15b630c037Steve McKay mChangeCallback = listener; 497b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su } 507b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su 517b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su public void start() { 526737577c70cb873fde70a53f25be6e15b630c037Steve McKay mPrefs.registerOnSharedPreferenceChangeListener(mListener); 537b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su } 547b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su 557b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su public void stop() { 566737577c70cb873fde70a53f25be6e15b630c037Steve McKay mPrefs.unregisterOnSharedPreferenceChangeListener(mListener); 577b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su } 587b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su 596737577c70cb873fde70a53f25be6e15b630c037Steve McKay // visible for use as a lambda, otherwise treat as a private. 606737577c70cb873fde70a53f25be6e15b630c037Steve McKay void onSharedPreferenceChanged(SharedPreferences prefs, String key) { 616737577c70cb873fde70a53f25be6e15b630c037Steve McKay if (Preferences.shouldBackup(key)) { 626737577c70cb873fde70a53f25be6e15b630c037Steve McKay mChangeCallback.accept(key); 636737577c70cb873fde70a53f25be6e15b630c037Steve McKay BackupManager.dataChanged(mPackageName); 647b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su } 657b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su } 667b6831b2bf21c433882c98048b229a9d9ee4a64fChen Su} 67