/* * 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> { @Override protected void onPreExecute() { super.onPreExecute(); setProgressBarIndeterminateVisibility(true); } @Override protected List doInBackground(Void... params) { List items = new ArrayList(); 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 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 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 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 result) { super.onPostExecute(result); setProgressBarIndeterminateVisibility(false); mAdapter.clear(); mAdapter.addAll(result); } } class GenerateValuesTask extends AsyncTask { @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 mItems = new ArrayList(); public BackupAdapter(Context context) { mLayoutInflater = (LayoutInflater) context.getSystemService(LAYOUT_INFLATER_SERVICE); } public void clear() { mItems.clear(); } public void addAll(List 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); } } }