package com.evancharlton.mileage.tasks;
import com.evancharlton.mileage.R;
import com.evancharlton.mileage.io.DbImportActivity;
import com.evancharlton.mileage.provider.DatabaseUpgrader;
import com.evancharlton.mileage.provider.FillUpsProvider;
import com.evancharlton.mileage.provider.Settings;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.util.Log;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
public class DbImportTask extends AttachableAsyncTask<DbImportActivity, Void, String, Boolean> {
private static final String TAG = "DbImportTask";
private static final String TEMP_FILE = Settings.EXTERNAL_DIR + ".import.db";
private final String mInput;
public DbImportTask(String input) {
mInput = input;
}
@Override
protected void onPreExecute() {
getParent().setWorking(true);
}
@Override
protected Boolean doInBackground(Void... params) {
try {
publishProgress(getParent().getString(R.string.update_starting_import));
makeBackup();
publishProgress(getParent().getString(R.string.update_made_backup));
publishProgress(getParent().getString(R.string.update_upgrading_database));
upgradeDatabase();
publishProgress(getParent().getString(R.string.update_upgraded_database));
publishProgress(getParent().getString(R.string.update_cleaning_up));
cleanUp();
publishProgress(getParent().getString(R.string.update_finished_importing));
return true;
} catch (IOException e) {
publishProgress(e.getMessage());
}
return false;
}
@Override
protected void onProgressUpdate(String... updates) {
getParent().log(updates[0]);
}
@Override
protected void onPostExecute(Boolean result) {
getParent().setWorking(false);
}
private void makeBackup() throws IOException {
FileChannel input = new FileInputStream(Settings.EXTERNAL_DIR + mInput).getChannel();
FileChannel output = new FileOutputStream(TEMP_FILE).getChannel();
input.transferTo(0, input.size(), output);
input.close();
output.close();
}
private void upgradeDatabase() {
Log.d(TAG, "Upgrading " + TEMP_FILE);
SQLiteDatabase db =
SQLiteDatabase.openDatabase(TEMP_FILE, null, SQLiteDatabase.OPEN_READWRITE);
DatabaseUpgrader.upgradeDatabase(db);
db.close();
}
private void cleanUp() throws IOException {
File database = getParent().getDatabasePath(FillUpsProvider.DATABASE_NAME);
FileChannel input = new FileInputStream(TEMP_FILE).getChannel();
FileChannel output = new FileOutputStream(database).getChannel();
long bytes = input.transferTo(0, input.size(), output);
input.close();
output.close();
Log.d(TAG, "Wrote " + bytes + " bytes to " + database.getAbsolutePath() + " from "
+ TEMP_FILE);
File tempDatabase = new File(TEMP_FILE);
tempDatabase.delete();
getParent().getContentResolver().getType(
Uri.withAppendedPath(FillUpsProvider.BASE_URI, "reset"));
}
}