| /* |
| * Copyright (C) 2010 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.example.android.backuprestore; |
| |
| import java.io.IOException; |
| |
| import android.app.backup.BackupAgentHelper; |
| import android.app.backup.BackupDataInput; |
| import android.app.backup.BackupDataOutput; |
| import android.app.backup.FileBackupHelper; |
| import android.os.ParcelFileDescriptor; |
| |
| /** |
| * This agent backs up the application's data using the BackupAgentHelper |
| * infrastructure. In this application's case, the backup data is merely |
| * a duplicate of the stored data file; that makes it a perfect candidate |
| * for backing up using the {@link android.app.backup.FileBackupHelper} class |
| * provided by the Android operating system. |
| * |
| * <p>"Backup helpers" are a general mechanism that an agent implementation |
| * uses by extending {@link BackupAgentHelper} rather than the basic |
| * {@link BackupAgent} class. |
| * |
| * <p>By itself, the FileBackupHelper is properly handling the backup and |
| * restore of the datafile that we've configured it with, but it does |
| * not know about the potential need to use locking around its access |
| * to it. However, it is straightforward to override |
| * {@link #onBackup()} and {@link #onRestore()} to supply the necessary locking |
| * around the helper's operation. |
| */ |
| public class FileHelperExampleAgent extends BackupAgentHelper { |
| /** |
| * The "key" string passed when adding a helper is a token used to |
| * disambiguate between entities supplied by multiple different helper |
| * objects. They only need to be unique among the helpers within this |
| * one agent class, not globally unique. |
| */ |
| static final String FILE_HELPER_KEY = "the_file"; |
| |
| /** |
| * The {@link android.app.backup.FileBackupHelper FileBackupHelper} class |
| * does nearly all of the work for our use case: backup and restore of a |
| * file stored within our application's getFilesDir() location. It will |
| * also handle files stored at any subpath within that location. All we |
| * need to do is a bit of one-time configuration: installing the helper |
| * when this agent object is created. |
| */ |
| @Override |
| public void onCreate() { |
| // All we need to do when working within the BackupAgentHelper mechanism |
| // is to install the helper that will process and back up the files we |
| // care about. In this case, it's just one file. |
| FileBackupHelper helper = new FileBackupHelper(this, BackupRestoreActivity.DATA_FILE_NAME); |
| addHelper(FILE_HELPER_KEY, helper); |
| } |
| |
| /** |
| * We want to ensure that the UI is not trying to rewrite the data file |
| * while we're reading it for backup, so we override this method to |
| * supply the necessary locking. |
| */ |
| @Override |
| public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data, |
| ParcelFileDescriptor newState) throws IOException { |
| // Hold the lock while the FileBackupHelper performs the backup operation |
| synchronized (BackupRestoreActivity.sDataLock) { |
| super.onBackup(oldState, data, newState); |
| } |
| } |
| |
| /** |
| * Adding locking around the file rewrite that happens during restore is |
| * similarly straightforward. |
| */ |
| @Override |
| public void onRestore(BackupDataInput data, int appVersionCode, |
| ParcelFileDescriptor newState) throws IOException { |
| // Hold the lock while the FileBackupHelper restores the file from |
| // the data provided here. |
| synchronized (BackupRestoreActivity.sDataLock) { |
| super.onRestore(data, appVersionCode, newState); |
| } |
| } |
| } |