1 /*
2  * Copyright (C) 2011 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 
17 package com.android.email.provider;
18 
19 import android.content.ContentResolver;
20 import android.content.Context;
21 
22 /**
23  * Helper class to facilitate EmailProvider's account backup/restore facility.
24  *
25  * Account backup/restore was implemented entirely for the purpose of recovering from database
26  * corruption errors that were/are sporadic and of undetermined cause (though the prevailing wisdom
27  * is that this is due to some kind of memory issue).  Rather than have the offending database get
28  * deleted by SQLiteDatabase and forcing the user to recreate his accounts from scratch, it was
29  * decided to backup accounts when created/modified and then restore them if 1) there are no
30  * accounts in the database and 2) there are backup accounts.  This, at least, would cause user's
31  * email data for IMAP/EAS to be re-synced and prevent the worst outcomes from occurring.
32  *
33  * To accomplish backup/restore, we use the facility now built in to EmailProvider to store a
34  * backup version of the Account and HostAuth tables in a second database (EmailProviderBackup.db)
35  *
36  * TODO: We might look into having our own DatabaseErrorHandler that tries to be clever about
37  * determining whether or not a "corrupt" database is truly corrupt; the problem here is that it
38  * has proven impossible to reproduce the bug, and therefore any "solution" of this kind of utterly
39  * impossible to test in the wild.
40  */
41 public class AccountBackupRestore {
42     /**
43      * Backup user Account and HostAuth data into our backup database
44      *
45      * TODO Make EmailProvider do this automatically.
46      */
backup(Context context)47     public static void backup(Context context) {
48         ContentResolver resolver = context.getContentResolver();
49         resolver.update(EmailProvider.ACCOUNT_BACKUP_URI, null, null, null);
50     }
51 }
52