blob: cccc1c2b6583c04e2cc46812e87ca4308e0f04c9 [file] [log] [blame]
/*
* Copyright (C) 2011 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.cts.verifier.backup;
import com.android.cts.verifier.PassFailButtons;
import com.android.cts.verifier.R;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.backup.BackupManager;
import android.app.backup.FileBackupHelper;
import android.app.backup.SharedPreferencesBackupHelper;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.BaseAdapter;
import android.widget.TextView;
import android.widget.Toast;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;
/**
* Test for checking whether the BackupManager is working properly. It lists the values of
* several preferences and contents of files that should get backed up and restored after
* running the backup manager and reinstalling the CTS verifier.
*/
public class BackupTestActivity extends PassFailButtons.ListActivity {
private static final String TAG = BackupTestActivity.class.getSimpleName();
private static final int INSTRUCTIONS_DIALOG_ID = 1;
private static final String TEST_PREFS_1 = "test-prefs-1";
private static final String INT_PREF = "int-pref";
private static final String BOOL_PREF = "bool-pref";
private static final String TEST_PREFS_2 = "test-prefs-2";
private static final String FLOAT_PREF = "float-pref";
private static final String LONG_PREF = "long-pref";
private static final String STRING_PREF = "string-pref";
private static final String TEST_FILE_1 = "test-file-1";
private static final String TEST_FILE_2 = "test-file-2";
private BackupAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.bu_main);
setPassFailButtonClickListeners();
setInfoResources(R.string.backup_test, R.string.backup_info, 0);
mAdapter = new BackupAdapter(this);
setListAdapter(mAdapter);
new LoadBackupItemsTask().execute();
findViewById(R.id.generate_button).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
new GenerateValuesTask().execute();
}
});
}
public static SharedPreferencesBackupHelper getSharedPreferencesBackupHelper(Context context) {
return new SharedPreferencesBackupHelper(context, TEST_PREFS_1, TEST_PREFS_2);
}
public static FileBackupHelper getFileBackupHelper(Context context) {
return new FileBackupHelper(context, TEST_FILE_1, TEST_FILE_2);
}
class LoadBackupItemsTask extends AsyncTask<Void, Void, List<BackupItem>> {
@Override
protected void onPreExecute() {
super.onPreExecute();
setProgressBarIndeterminateVisibility(true);
}
@Override
protected List<BackupItem> doInBackground(Void... params) {
List<BackupItem> items = new ArrayList<BackupItem>();
items.add(new CategoryBackupItem(R.string.bu_preferences));
loadPreferenceGroup1(items);
loadPreferenceGroup2(items);
items.add(new CategoryBackupItem(R.string.bu_files));
loadFile(TEST_FILE_1, items);
loadFile(TEST_FILE_2, items);
return items;
}
private void loadPreferenceGroup1(List<BackupItem> items) {
SharedPreferences prefs = getSharedPreferences(TEST_PREFS_1, MODE_PRIVATE);
int intValue = prefs.getInt(INT_PREF, 0);
items.add(new PreferenceBackupItem(TEST_PREFS_1, INT_PREF, "" + intValue));
boolean boolValue = prefs.getBoolean(BOOL_PREF, false);
items.add(new PreferenceBackupItem(TEST_PREFS_1, BOOL_PREF, "" + boolValue));
}
private void loadPreferenceGroup2(List<BackupItem> items) {
SharedPreferences prefs = getSharedPreferences(TEST_PREFS_2, MODE_PRIVATE);
float floatValue = prefs.getFloat(FLOAT_PREF, 0.0f);
items.add(new PreferenceBackupItem(TEST_PREFS_2, FLOAT_PREF, "" + floatValue));
long longValue = prefs.getLong(LONG_PREF, 0L);
items.add(new PreferenceBackupItem(TEST_PREFS_2, LONG_PREF, "" + longValue));
String stringValue = prefs.getString(STRING_PREF, null);
items.add(new PreferenceBackupItem(TEST_PREFS_2, STRING_PREF, stringValue));
}
private void loadFile(String fileName, List<BackupItem> items) {
StringBuilder contents = new StringBuilder();
Scanner scanner = null;
try {
scanner = new Scanner(new File(getFilesDir(), fileName));
while (scanner.hasNext()) {
contents.append(scanner.nextLine());
}
scanner.close();
} catch (FileNotFoundException e) {
Log.e(TAG, "Couldn't find test file but this may be fine...", e);
} finally {
if (scanner != null) {
scanner.close();
}
}
items.add(new FileBackupItem(fileName, contents.toString()));
}
@Override
protected void onPostExecute(List<BackupItem> result) {
super.onPostExecute(result);
setProgressBarIndeterminateVisibility(false);
mAdapter.clear();
mAdapter.addAll(result);
}
}
class GenerateValuesTask extends AsyncTask<Void, Void, Exception> {
@Override
protected Exception doInBackground(Void... params) {
Random random = new Random();
generatePreferenceGroup1(random);
generatePreferenceGroup2(random);
try {
generateTestFile(TEST_FILE_1, random);
generateTestFile(TEST_FILE_2, random);
} catch (FileNotFoundException e) {
return e;
}
return null;
}
private void generatePreferenceGroup1(Random random) {
SharedPreferences prefs = getSharedPreferences(TEST_PREFS_1, MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putInt(INT_PREF, (random.nextInt(100) + 1));
editor.putBoolean(BOOL_PREF, random.nextBoolean());
editor.commit();
}
private void generatePreferenceGroup2(Random random) {
SharedPreferences prefs = getSharedPreferences(TEST_PREFS_2, MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putFloat(FLOAT_PREF, random.nextFloat());
editor.putLong(LONG_PREF, random.nextLong());
editor.putString(STRING_PREF, "Random number: " + (random.nextInt(100) + 1));
editor.commit();
}
private void generateTestFile(String fileName, Random random)
throws FileNotFoundException {
File file = new File(getFilesDir(), fileName);
PrintWriter writer = new PrintWriter(file);
writer.write("Random number: " + (random.nextInt(100) + 1));
writer.close();
}
@Override
protected void onPostExecute(Exception exception) {
super.onPostExecute(exception);
if (exception != null) {
Log.e(TAG, "Couldn't generate test data...", exception);
Toast.makeText(BackupTestActivity.this, R.string.bu_generate_error,
Toast.LENGTH_LONG).show();
} else {
showDialog(INSTRUCTIONS_DIALOG_ID);
BackupManager backupManager = new BackupManager(BackupTestActivity.this);
backupManager.dataChanged();
new LoadBackupItemsTask().execute();
}
}
}
@Override
public Dialog onCreateDialog(int id, Bundle args) {
switch (id) {
case INSTRUCTIONS_DIALOG_ID:
return new AlertDialog.Builder(this)
.setIcon(android.R.drawable.ic_dialog_info)
.setTitle(R.string.backup_test)
.setMessage(R.string.bu_instructions)
.setPositiveButton(android.R.string.ok, null)
.setNeutralButton(R.string.bu_settings, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
startActivity(new Intent(Settings.ACTION_PRIVACY_SETTINGS));
}
})
.create();
default:
return super.onCreateDialog(id, args);
}
}
interface BackupItem {
int getViewType();
View getView(LayoutInflater inflater, int position, View convertView, ViewGroup parent);
}
static class CategoryBackupItem implements BackupItem {
private final int mTitleResId;
CategoryBackupItem(int titleResId) {
mTitleResId = titleResId;
}
@Override
public int getViewType() {
return 0;
}
@Override
public View getView(LayoutInflater inflater, int position, View convertView,
ViewGroup parent) {
TextView view = (TextView) convertView;
if (convertView == null) {
view = (TextView) inflater.inflate(R.layout.test_category_row, parent, false);
}
view.setText(mTitleResId);
return view;
}
}
static class PreferenceBackupItem implements BackupItem {
private final String mGroup;
private final String mName;
private final String mValue;
PreferenceBackupItem(String group, String name, String value) {
mGroup = group;
mName = name;
mValue = value;
}
@Override
public int getViewType() {
return 1;
}
@Override
public View getView(LayoutInflater inflater, int position, View convertView,
ViewGroup parent) {
TextView view = (TextView) convertView;
if (convertView == null) {
view = (TextView) inflater.inflate(R.layout.bu_preference_row, parent, false);
}
view.setText(mGroup + "/" + mName + " : " + mValue);
return view;
}
}
static class FileBackupItem implements BackupItem {
private final String mName;
private final String mContents;
FileBackupItem(String name, String contents) {
mName = name;
mContents = contents;
}
@Override
public int getViewType() {
return 2;
}
@Override
public View getView(LayoutInflater inflater, int position, View convertView,
ViewGroup parent) {
TextView view = (TextView) convertView;
if (convertView == null) {
view = (TextView) inflater.inflate(R.layout.bu_preference_row, parent, false);
}
view.setText(mName + " : " + mContents);
return view;
}
}
class BackupAdapter extends BaseAdapter {
private final LayoutInflater mLayoutInflater;
private final List<BackupItem> mItems = new ArrayList<BackupItem>();
public BackupAdapter(Context context) {
mLayoutInflater = (LayoutInflater) context.getSystemService(LAYOUT_INFLATER_SERVICE);
}
public void clear() {
mItems.clear();
}
public void addAll(List<BackupItem> items) {
mItems.addAll(items);
notifyDataSetChanged();
}
@Override
public int getCount() {
return mItems.size();
}
@Override
public BackupItem getItem(int position) {
return mItems.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public boolean isEnabled(int position) {
return false;
}
@Override
public int getViewTypeCount() {
return 3;
}
@Override
public int getItemViewType(int position) {
return getItem(position).getViewType();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return getItem(position).getView(mLayoutInflater, position, convertView, parent);
}
}
}