summaryrefslogtreecommitdiffstats
path: root/src/com/android/providers/contacts
diff options
context:
space:
mode:
authorChiao Cheng <chiaocheng@google.com>2013-06-17 11:52:56 -0700
committerChiao Cheng <chiaocheng@google.com>2013-06-19 17:41:45 -0700
commite2663c31031acd574f590f845d3306ec847ecc91 (patch)
treef522bb0799eb8d73f4f753e711799feb241f221f /src/com/android/providers/contacts
parentd621a10ce45c1f9e4f6caddc7aef5b2370d595b8 (diff)
downloadandroid_packages_providers_ContactsProvider-e2663c31031acd574f590f845d3306ec847ecc91.tar.gz
android_packages_providers_ContactsProvider-e2663c31031acd574f590f845d3306ec847ecc91.tar.bz2
android_packages_providers_ContactsProvider-e2663c31031acd574f590f845d3306ec847ecc91.zip
Ensure database create broadcast fires after boot complete.
Contacts database is created before boot completes by the ContactsUpgradeReceiver. Any notifications fired before boot will not be received by applications. Bug: 9394450 Change-Id: I1c47308c7ec52b777f9f4ca8c19141634e4e0baa
Diffstat (limited to 'src/com/android/providers/contacts')
-rw-r--r--src/com/android/providers/contacts/BootCompletedReceiver.java84
-rw-r--r--src/com/android/providers/contacts/ContactsDatabaseHelper.java30
2 files changed, 100 insertions, 14 deletions
diff --git a/src/com/android/providers/contacts/BootCompletedReceiver.java b/src/com/android/providers/contacts/BootCompletedReceiver.java
new file mode 100644
index 00000000..a648fc67
--- /dev/null
+++ b/src/com/android/providers/contacts/BootCompletedReceiver.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2013 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.providers.contacts;/*
+ * Copyright (C) 2013 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
+ */
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.SystemClock;
+import android.preference.PreferenceManager;
+import android.provider.ContactsContract;
+import android.text.TextUtils;
+import android.util.Log;
+
+/**
+ * Receiver that handles boot completion broadcast.
+ */
+public class BootCompletedReceiver extends BroadcastReceiver {
+
+ private static final String TAG = BootCompletedReceiver.class.getSimpleName();
+ public static final String DATABASE_TIME_CREATED = "database_time_created";
+
+ public void onReceive(Context context, Intent intent) {
+ // This notification is sent here instead of ContactsDatabaseHelper.onCreate() because it
+ // needs to be sent after boot completes. onCreate() starts before boot complete happens
+ // and the notification would be dropped by the framework.
+
+ final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+ final String prefTime = prefs.getString(DATABASE_TIME_CREATED, "");
+
+ String dbTime = ContactsDatabaseHelper.getInstance(context).getProperty(
+ ContactsDatabaseHelper.DbProperties.DATABASE_TIME_CREATED, "");
+ int count = 0;
+
+ // db time should already exist because it's always created by the ContactsUpgradeReceiver
+ // pre boot. But in the event that it may be a bit slow, wait a bit.
+ while (TextUtils.isEmpty(dbTime) && count != 3) {
+ SystemClock.sleep(1000);
+ dbTime = ContactsDatabaseHelper.getInstance(context).getProperty(
+ ContactsDatabaseHelper.DbProperties.DATABASE_TIME_CREATED, "");
+ count++;
+ }
+
+ if (TextUtils.isEmpty(prefTime) || !prefTime.equals(dbTime)) {
+ Log.i(TAG, "Boot complete, newly created contact database detected. Pref Time: " +
+ prefTime + " DB Time: " + dbTime);
+
+ final Intent broadcast = new Intent(ContactsContract.Intents.CONTACTS_DATABASE_CREATED);
+ broadcast.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
+ context.sendBroadcast(broadcast, android.Manifest.permission.READ_CONTACTS);
+
+ prefs.edit().putString(DATABASE_TIME_CREATED, dbTime).commit();
+ }
+ }
+
+}
diff --git a/src/com/android/providers/contacts/ContactsDatabaseHelper.java b/src/com/android/providers/contacts/ContactsDatabaseHelper.java
index 7229f48c..4d6f4197 100644
--- a/src/com/android/providers/contacts/ContactsDatabaseHelper.java
+++ b/src/com/android/providers/contacts/ContactsDatabaseHelper.java
@@ -114,7 +114,7 @@ public class ContactsDatabaseHelper extends SQLiteOpenHelper {
* 800-899 Key Lime Pie
* </pre>
*/
- static final int DATABASE_VERSION = 800;
+ static final int DATABASE_VERSION = 801;
private static final String DATABASE_NAME = "contacts2.db";
private static final String DATABASE_PRESENCE = "presence_db";
@@ -718,6 +718,7 @@ public class ContactsDatabaseHelper extends SQLiteOpenHelper {
String KNOWN_ACCOUNTS = "known_accounts";
String ICU_VERSION = "icu_version";
String LOCALE = "locale";
+ String DATABASE_TIME_CREATED = "database_time_created";
}
/** In-memory cache of previously found MIME-type mappings */
@@ -949,6 +950,15 @@ public class ContactsDatabaseHelper extends SQLiteOpenHelper {
mSyncState.createDatabase(db);
+ // Create the properties table first so the create time is available as soon as possible.
+ // The create time is needed by BOOT_COMPLETE to send broadcasts.
+ db.execSQL("CREATE TABLE " + Tables.PROPERTIES + " (" +
+ PropertiesColumns.PROPERTY_KEY + " TEXT PRIMARY KEY, " +
+ PropertiesColumns.PROPERTY_VALUE + " TEXT " +
+ ");");
+ setProperty(db, DbProperties.DATABASE_TIME_CREATED, String.valueOf(
+ System.currentTimeMillis()));
+
db.execSQL("CREATE TABLE " + Tables.ACCOUNTS + " (" +
AccountsColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
AccountsColumns.ACCOUNT_NAME + " TEXT, " +
@@ -1301,11 +1311,6 @@ public class ContactsDatabaseHelper extends SQLiteOpenHelper {
StatusUpdates.STATUS_ICON + " INTEGER" +
");");
- db.execSQL("CREATE TABLE " + Tables.PROPERTIES + " (" +
- PropertiesColumns.PROPERTY_KEY + " TEXT PRIMARY KEY, " +
- PropertiesColumns.PROPERTY_VALUE + " TEXT " +
- ");");
-
createDirectoriesTable(db);
createSearchIndexTable(db, false /* we build stats table later */);
@@ -1347,14 +1352,6 @@ public class ContactsDatabaseHelper extends SQLiteOpenHelper {
ContentResolver.requestSync(null /* all accounts */,
ContactsContract.AUTHORITY, new Bundle());
-
- // Only send broadcasts for regular contacts db.
- if (dbForProfile() == 0) {
- final Intent dbCreatedIntent =
- new Intent(ContactsContract.Intents.CONTACTS_DATABASE_CREATED);
- dbCreatedIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
- mContext.sendBroadcast(dbCreatedIntent, android.Manifest.permission.READ_CONTACTS);
- }
}
protected void initializeAutoIncrementSequences(SQLiteDatabase db) {
@@ -2491,6 +2488,11 @@ public class ContactsDatabaseHelper extends SQLiteOpenHelper {
oldVersion = 800;
}
+ if (oldVersion < 801) {
+ setProperty(db, DbProperties.DATABASE_TIME_CREATED, String.valueOf(
+ System.currentTimeMillis()));
+ }
+
if (upgradeViewsAndTriggers) {
createContactsViews(db);
createGroupsView(db);