1/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.backuptest;
18
19import android.app.ListActivity;
20import android.app.backup.BackupHelperDispatcher;
21import android.app.backup.BackupDataInput;
22import android.app.backup.BackupDataOutput;
23import android.app.backup.BackupManager;
24import android.app.backup.FileBackupHelper;
25import android.content.Intent;
26import android.content.SharedPreferences;
27import android.os.Bundle;
28import android.os.Handler;
29import android.os.ParcelFileDescriptor;
30import android.util.Log;
31import android.view.View;
32import android.widget.ArrayAdapter;
33import android.widget.ListView;
34import android.widget.Toast;
35
36import java.io.BufferedReader;
37import java.io.File;
38import java.io.FileOutputStream;
39import java.io.FileInputStream;
40import java.io.FileNotFoundException;
41import java.io.InputStreamReader;
42import java.io.IOException;
43import java.io.PrintStream;
44import java.text.DateFormat;
45import java.util.Date;
46
47public class BackupTestActivity extends ListActivity
48{
49    static final String TAG = "BackupTestActivity";
50
51    static final String PREF_GROUP_SETTINGS = "settings";
52    static final String PREF_KEY = "pref";
53    static final String FILE_NAME = "file.txt";
54
55    BackupManager sBm = new BackupManager(this);
56
57    Test[] mTests = new Test[] {
58        new Test("Show File") {
59            void run() {
60                StringBuffer str = new StringBuffer();
61                str.append("Text is:");
62                BufferedReader reader = null;
63                try {
64                    reader = new BufferedReader(new InputStreamReader(openFileInput(FILE_NAME)));
65                    while (reader.ready()) {
66                        str.append("\n");
67                        str.append(reader.readLine());
68                    }
69                } catch (IOException ex) {
70                    str.append("ERROR: ");
71                    str.append(ex.toString());
72                }
73                Log.d(TAG, str.toString());
74                Toast.makeText(BackupTestActivity.this, str, Toast.LENGTH_SHORT).show();
75            }
76        },
77        new Test("Append to File") {
78            void run() {
79                PrintStream output = null;
80                try {
81                    output = new PrintStream(openFileOutput(FILE_NAME, MODE_APPEND));
82                    DateFormat formatter = DateFormat.getDateTimeInstance();
83                    output.println(formatter.format(new Date()));
84                    output.close();
85                } catch (IOException ex) {
86                    if (output != null) {
87                        output.close();
88                    }
89                }
90                sBm.dataChanged();
91            }
92        },
93        new Test("Clear File") {
94            void run() {
95                PrintStream output = null;
96                try {
97                    output = new PrintStream(openFileOutput(FILE_NAME, MODE_PRIVATE));
98                    output.close();
99                } catch (IOException ex) {
100                    if (output != null) {
101                        output.close();
102                    }
103                }
104                sBm.dataChanged();
105            }
106        },
107        new Test("Poke") {
108            void run() {
109                sBm.dataChanged();
110            }
111        },
112        new Test("Show Shared Pref") {
113            void run() {
114                SharedPreferences prefs = getSharedPreferences(PREF_GROUP_SETTINGS, MODE_PRIVATE);
115                int val = prefs.getInt(PREF_KEY, 0);
116                String str = "'" + PREF_KEY + "' is " + val;
117                Log.d(TAG, str);
118                Toast.makeText(BackupTestActivity.this, str, Toast.LENGTH_SHORT).show();
119            }
120        },
121        new Test("Increment Shared Pref") {
122            void run() {
123                SharedPreferences prefs = getSharedPreferences(PREF_GROUP_SETTINGS, MODE_PRIVATE);
124                int val = prefs.getInt(PREF_KEY, 0);
125                SharedPreferences.Editor editor = prefs.edit();
126                editor.putInt(PREF_KEY, val+1);
127                editor.commit();
128                sBm.dataChanged();
129            }
130        },
131        new Test("Backup Helpers") {
132            void run() {
133                try {
134                    writeFile("a", "a\naa", MODE_PRIVATE);
135                    writeFile("empty", "", MODE_PRIVATE);
136
137                    ParcelFileDescriptor state = ParcelFileDescriptor.open(
138                            new File(getFilesDir(), "state"),
139                            ParcelFileDescriptor.MODE_READ_WRITE|ParcelFileDescriptor.MODE_CREATE|
140                            ParcelFileDescriptor.MODE_TRUNCATE);
141                    FileBackupHelper h = new FileBackupHelper(BackupTestActivity.this,
142                            new String[] { "a", "empty" });
143                    FileOutputStream dataFile = openFileOutput("backup_test", MODE_WORLD_READABLE);
144                    BackupDataOutput data = new BackupDataOutput(dataFile.getFD());
145                    h.performBackup(null, data, state);
146                    dataFile.close();
147                    state.close();
148                } catch (IOException ex) {
149                    throw new RuntimeException(ex);
150                }
151            }
152        },
153        new Test("Restore Helpers") {
154            void run() {
155                try {
156                    BackupHelperDispatcher dispatch = new BackupHelperDispatcher();
157                    dispatch.addHelper("", new FileBackupHelper(BackupTestActivity.this,
158                            new String[] { "a", "empty" }));
159                    FileInputStream dataFile = openFileInput("backup_test");
160                    BackupDataInput data = new BackupDataInput(dataFile.getFD());
161                    ParcelFileDescriptor state = ParcelFileDescriptor.open(
162                            new File(getFilesDir(), "restore_state"),
163                            ParcelFileDescriptor.MODE_READ_WRITE|ParcelFileDescriptor.MODE_CREATE|
164                            ParcelFileDescriptor.MODE_TRUNCATE);
165                    // TODO: a more plausable synthetic stored-data version number
166                    dispatch.performRestore(data, 0, state);
167                    dataFile.close();
168                    state.close();
169                } catch (IOException ex) {
170                    throw new RuntimeException(ex);
171                }
172            }
173        }
174    };
175
176    abstract class Test {
177        String name;
178        Test(String n) {
179            name = n;
180        }
181        abstract void run();
182    }
183
184    @Override
185    public void onCreate(Bundle icicle) {
186        super.onCreate(icicle);
187
188        String[] labels = new String[mTests.length];
189        for (int i=0; i<mTests.length; i++) {
190            labels[i] = mTests[i].name;
191        }
192
193        setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, labels));
194    }
195
196    @Override
197    public void onListItemClick(ListView l, View v, int position, long id)
198    {
199        Test t = mTests[position];
200        Log.d(TAG, "Test: " + t.name);
201        t.run();
202    }
203
204    void writeFile(String name, String contents, int mode) {
205        try {
206            PrintStream out = new PrintStream(openFileOutput(name, mode));
207            out.print(contents);
208            out.close();
209        } catch (FileNotFoundException ex) {
210            throw new RuntimeException(ex);
211        }
212    }
213}
214
215