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