/*
* Copyright (C) 2012 Niall 'Rivernile' Scott
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors or contributors be held liable for
* any damages arising from the use of this software.
*
* The aforementioned copyright holder(s) hereby grant you a
* non-transferrable right to use this software for any purpose (including
* commercial applications), and to modify it and redistribute it, subject to
* the following conditions:
*
* 1. This notice may not be removed or altered from any file it appears in.
*
* 2. Any modifications made to this software, except those defined in
* clause 3 of this agreement, must be released under this license, and
* the source code of any modifications must be made available on a
* publically accessible (and locateable) website, or sent to the
* original author of this software.
*
* 3. Software modifications that do not alter the functionality of the
* software but are simply adaptations to a specific environment are
* exempt from clause 2.
*/
package uk.org.rivernile.edinburghbustracker.android;
import android.annotation.TargetApi;
import android.app.backup.BackupAgentHelper;
import android.app.backup.BackupDataInput;
import android.app.backup.BackupDataOutput;
import android.app.backup.FileBackupHelper;
import android.app.backup.SharedPreferencesBackupHelper;
import android.os.ParcelFileDescriptor;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import org.json.JSONException;
/**
* This is the backup helper that will be called if the device implements the
* Google Backup agent. This stores the user's preferences and saved bus stops
* to the Google Backup service, for restoration at a later date.
*
* @author Niall Scott
*/
@TargetApi(8)
public class SettingsBackupAgent extends BackupAgentHelper {
private static final String PREFS_BACKUP_KEY = "prefs";
private static final String FAVS_BACKUP_KEY = "favs";
/**
* {@inheritDoc}
*/
@Override
public void onCreate() {
// We can use an inbuilt helper to deal with the SharedPreferences for
// us.
SharedPreferencesBackupHelper prefsHelper =
new SharedPreferencesBackupHelper(this,
PreferencesActivity.PREF_FILE);
addHelper(PREFS_BACKUP_KEY, prefsHelper);
// Use the FileBackupHelper to deal with the favourite stops.
FileBackupHelper favsHelper = new FileBackupHelper(this,
"settings.backup");
addHelper(FAVS_BACKUP_KEY, favsHelper);
}
/**
* Backup the SharedPreferences and favourite bus stops to the Google Backup
* service. We don't need to do anything special for the SharedPreferences
* here, but we need to write the favourite bus stops out to file first to
* back it up.
*
* @param oldState The previous backup state.
* @param data Where to write the data to.
* @param newState The new backup state.
* @throws IOException When the file could not be written to.
*/
@Override
public void onBackup(final ParcelFileDescriptor oldState,
final BackupDataOutput data, final ParcelFileDescriptor newState)
throws IOException {
final SettingsDatabase sd = SettingsDatabase.getInstance(
getApplicationContext());
// Write out favourite stops to a temporary file in JSON format.
final File out = new File(getFilesDir(), "settings.backup");
final PrintWriter pw = new PrintWriter(new FileWriter(out));
try {
pw.println(sd.backupDatabaseAsJSON().toString());
} catch(JSONException e) { }
pw.flush();
pw.close();
// Backup the file.
super.onBackup(oldState, data, newState);
// Delete the temporary file.
out.delete();
}
/**
* Restore the SharedPreferences and favourite bus stops from the Google
* Backup service. The SharedPreferences is handled automatically, but the
* favourite bus stops file must be handled in a special way.
*
* @param data The backup data to be restored.
* @param appVersionCode The version code of the app this data is for.
* @param newState A copy of the new state.
* @throws IOException When an IOException occurs.
*/
@Override
public void onRestore(final BackupDataInput data, final int appVersionCode,
final ParcelFileDescriptor newState) throws IOException {
// Restore normally first.
super.onRestore(data, appVersionCode, newState);
final SettingsDatabase sd = SettingsDatabase.getInstance(
getApplicationContext());
// Read the favourite stops file.
StringBuilder sb = new StringBuilder();
String str;
final File in = new File(getFilesDir(), "settings.backup");
final BufferedReader reader = new BufferedReader(new FileReader(in));
while((str = reader.readLine()) != null) {
sb.append(str);
}
reader.close();
// Restore the favourite stops.
try {
sd.restoreDatabaseFromJSON(sb.toString());
} catch(JSONException e) { }
// Delete the favourite stops file as it was temporary.
in.delete();
}
}