/* * Copyright (C) 2016 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.documentsui.prefs; import android.app.backup.BackupAgentHelper; import android.app.backup.BackupDataInput; import android.app.backup.BackupDataOutput; import android.app.backup.SharedPreferencesBackupHelper; import android.content.SharedPreferences; import android.os.ParcelFileDescriptor; import androidx.annotation.VisibleForTesting; import java.io.IOException; /** * Provides glue between backup infrastructure and PrefsBackupHelper (which contains the core logic * for retrieving and restoring settings). * * When doing backup & restore, we create and add a {@link SharedPreferencesBackupHelper} for our * backup preferences file in {@link #onCreate}, and populate the backup preferences file in * {@link #onBackup} and {@link #onRestore}. Then {@link BackupAgentHelper#onBackup} and * {@link BackupAgentHelper#onRestore} will take care of the rest of the work. See external * documentation below. * * https://developer.android.com/guide/topics/data/keyvaluebackup.html#BackupAgentHelper */ public class BackupAgent extends BackupAgentHelper { /** * Name of the shared preferences file used by BackupAgent. Should only be used in * this class. * * @see #onBackup(ParcelFileDescriptor, BackupDataOutput, ParcelFileDescriptor) * @see #onRestore(BackupDataInput, int, ParcelFileDescriptor) */ private static final String BACKUP_PREFS = "documentsui_backup_prefs"; /** * An arbitrary string used by the BackupHelper. * * BackupAgentHelper works with BackupHelper. When adding a BackupHelper in #onCreate, * it requires a "key". This string is that "key". * * https://developer.android.com/guide/topics/data/keyvaluebackup.html#BackupAgentHelper * See "Backing up SharedPreference" for the purpose of this string. * * @see #onCreate() */ private static final String BACKUP_HELPER_KEY = "DOCUMENTSUI_BACKUP_HELPER_KEY"; private PrefsBackupHelper mPrefsBackupHelper; private SharedPreferences mBackupPreferences; @Override public void onCreate() { addHelper(BACKUP_HELPER_KEY, new SharedPreferencesBackupHelper(this, BACKUP_PREFS)); mPrefsBackupHelper = new PrefsBackupHelper(this); mBackupPreferences = getSharedPreferences(BACKUP_PREFS, MODE_PRIVATE); } @Override public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data, ParcelFileDescriptor newState) throws IOException { mPrefsBackupHelper.getBackupPreferences(mBackupPreferences); super.onBackup(oldState, data, newState); mBackupPreferences.edit().clear().apply(); } @Override public void onRestore(BackupDataInput data, int appVersionCode, ParcelFileDescriptor newState) throws IOException { // TODO: refresh the UI after restore finished. Currently the restore for system apps only // happens during SUW, at which time user haven't open the app. However the restore time may // change in ODR. Once it happens, we may need to refresh the UI after restore finished. super.onRestore(data, appVersionCode, newState); mPrefsBackupHelper.putBackupPreferences(mBackupPreferences); mBackupPreferences.edit().clear().apply(); } }