From ed5e13b1ab7e01ab1e1575543677c190a4a2291d Mon Sep 17 00:00:00 2001 From: Danesh M Date: Sat, 4 Jun 2016 22:38:46 -0700 Subject: Messaging : Fix blacklist sync - Fix issues where adding a remote blacklist (via settings) didn't update the overflow option - Fix blacklist observer crash due to not overriding onPostExecute - Fix deletes in both the provider and sync service. - Ensure we notify of changes and observe them in the activity. CYNGNOS-2998 Change-Id: Icac5e290aa129e878e59496e6c2e690b0f504633 --- src/com/android/messaging/BugleApplication.java | 2 +- .../datamodel/BugleDatabaseOperations.java | 10 +++ .../datamodel/MessagingContentProvider.java | 2 +- .../conversationlist/ConversationListActivity.java | 16 +++++ .../android/messaging/util/BlacklistObserver.java | 82 +++++++++++++++------- src/com/android/messaging/util/BlacklistSync.java | 7 +- 6 files changed, 90 insertions(+), 29 deletions(-) (limited to 'src') diff --git a/src/com/android/messaging/BugleApplication.java b/src/com/android/messaging/BugleApplication.java index 3e9cef2..b5adab2 100644 --- a/src/com/android/messaging/BugleApplication.java +++ b/src/com/android/messaging/BugleApplication.java @@ -91,7 +91,7 @@ public class BugleApplication extends Application implements UncaughtExceptionHa LogUtil.e(TAG, "BugleApplication.onCreate: FactoryImpl.register skipped for test run"); } - BlacklistObserver observer = new BlacklistObserver(new Handler(), getContentResolver()); + BlacklistObserver observer = new BlacklistObserver(new Handler(), this); // TODO - need to extract URI from TelephonyProvider Uri CONTENT_URI = Uri.parse("content://blacklist"); getContentResolver().registerContentObserver(CONTENT_URI, true, observer); diff --git a/src/com/android/messaging/datamodel/BugleDatabaseOperations.java b/src/com/android/messaging/datamodel/BugleDatabaseOperations.java index f80abdf..b2d756f 100644 --- a/src/com/android/messaging/datamodel/BugleDatabaseOperations.java +++ b/src/com/android/messaging/datamodel/BugleDatabaseOperations.java @@ -1780,6 +1780,16 @@ public class BugleDatabaseOperations { } @DoesNotRunOnMainThread + public static void resetBlockedParticpants(DatabaseWrapper dbWrapper) { + Assert.isNotMainThread(); + final ContentValues values = new ContentValues(); + values.put(ParticipantColumns.BLOCKED, false); + dbWrapper.update(DatabaseHelper.PARTICIPANTS_TABLE, values, + ParticipantColumns.BLOCKED + "=?", + new String[] {"1"}); + } + + @DoesNotRunOnMainThread public static int updateDestination(final DatabaseWrapper dbWrapper, final String destination, final boolean blocked, final boolean frameworkDb) { Assert.isNotMainThread(); diff --git a/src/com/android/messaging/datamodel/MessagingContentProvider.java b/src/com/android/messaging/datamodel/MessagingContentProvider.java index 7688abd..4f97490 100644 --- a/src/com/android/messaging/datamodel/MessagingContentProvider.java +++ b/src/com/android/messaging/datamodel/MessagingContentProvider.java @@ -79,7 +79,7 @@ public class MessagingContentProvider extends ContentProvider { static final String CONVERSATION_ID = ConversationParticipantsColumns.CONVERSATION_ID; } - static final Uri CONVERSATION_PARTICIPANTS_URI = Uri.parse(CONTENT_AUTHORITY + + public static final Uri CONVERSATION_PARTICIPANTS_URI = Uri.parse(CONTENT_AUTHORITY + PARTICIPANTS_QUERY + "/conversation"); public static final Uri PARTICIPANTS_URI = Uri.parse(CONTENT_AUTHORITY + PARTICIPANTS_QUERY); diff --git a/src/com/android/messaging/ui/conversationlist/ConversationListActivity.java b/src/com/android/messaging/ui/conversationlist/ConversationListActivity.java index f8abe81..7bc6308 100644 --- a/src/com/android/messaging/ui/conversationlist/ConversationListActivity.java +++ b/src/com/android/messaging/ui/conversationlist/ConversationListActivity.java @@ -16,18 +16,30 @@ package com.android.messaging.ui.conversationlist; +import android.database.ContentObserver; import android.graphics.drawable.ColorDrawable; +import android.net.Uri; import android.os.Bundle; import android.support.v7.app.ActionBar; import android.view.Menu; import android.view.MenuItem; import com.android.messaging.R; +import com.android.messaging.datamodel.MessagingContentProvider; import com.android.messaging.ui.UIIntents; import com.android.messaging.util.DebugUtils; import com.android.messaging.util.Trace; public class ConversationListActivity extends AbstractConversationListActivity { + + private ContentObserver mBlacklistObserver = new ContentObserver(null) { + @Override + public void onChange(boolean selfChange, Uri uri) { + super.onChange(selfChange, uri); + invalidateOptionsMenu(); + } + }; + @Override protected void onCreate(final Bundle savedInstanceState) { Trace.beginSection("ConversationListActivity.onCreate"); @@ -35,6 +47,10 @@ public class ConversationListActivity extends AbstractConversationListActivity { setContentView(R.layout.conversation_list_activity); Trace.endSection(); invalidateActionBar(); + + getContentResolver().registerContentObserver( + MessagingContentProvider.CONVERSATION_PARTICIPANTS_URI, + true, mBlacklistObserver); } @Override diff --git a/src/com/android/messaging/util/BlacklistObserver.java b/src/com/android/messaging/util/BlacklistObserver.java index a7c341e..ae59a89 100644 --- a/src/com/android/messaging/util/BlacklistObserver.java +++ b/src/com/android/messaging/util/BlacklistObserver.java @@ -18,28 +18,29 @@ package com.android.messaging.util; import android.content.ContentResolver; import android.database.ContentObserver; +import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.os.Handler; import android.util.Log; -import com.android.messaging.BugleApplication; import com.android.messaging.datamodel.BugleDatabaseOperations; import com.android.messaging.datamodel.DataModel; import com.android.messaging.datamodel.DatabaseWrapper; import com.android.messaging.datamodel.MessagingContentProvider; import com.android.messaging.datamodel.action.UpdateConversationArchiveStatusAction; import com.android.messaging.datamodel.data.ParticipantData; -import com.android.messaging.util.LogUtil; // ContentObserver class to monitor changes to the Framework Blacklist DB public class BlacklistObserver extends ContentObserver { private static final String TAG = BlacklistObserver.class.getSimpleName(); + private final Context mContext; private ContentResolver mResolver; - public BlacklistObserver(Handler handler, ContentResolver resolver) { + public BlacklistObserver(Handler handler, Context context) { super(handler); - mResolver = resolver; + mResolver = context.getContentResolver(); + mContext = context; } @Override @@ -47,33 +48,53 @@ public class BlacklistObserver extends ContentObserver { // depending on the Thread in which the handler was created, this function // may or may not run on the UI thread, to be sure that it doesn't, launch // it via AsyncTask - new SafeAsyncTask() { - + SafeAsyncTask.executeOnThreadPool(new Runnable() { @Override - protected Void doInBackgroundTimed(Void... params) { + public void run() { if (LogUtil.isLoggable(TAG, LogUtil.VERBOSE)) { Log.i(TAG, "BlacklistObserver: onChange: Uri:" + uri.toString()); } + boolean requiresNotifyAllParticipants = false; + // we need to find the phone number being blacklisted and add/update it // in the bugle database Cursor cursor = null; try { cursor = mResolver.query(uri, null, null, null, null); + + DatabaseWrapper db = DataModel.get().getDatabase(); + + // Row was deleted + if (cursor.getCount() == 0) { + if (!uri.getPath().contains("bynumber")) { + // We don't have enough information, lets run a full sync + BlacklistSync blacklistSync = new BlacklistSync(mContext); + blacklistSync.execute(); + } else { + // We have the number that was deleted, lets update it locally + String number = uri.getLastPathSegment(); + BugleDatabaseOperations.updateDestination(db, number, + false, false); + String conversationId = updateArchiveStatusForConversation(false, number, db); + if (conversationId == null) { + requiresNotifyAllParticipants = true; + } else { + MessagingContentProvider.notifyParticipantsChanged(conversationId); + } + } + return; + } + int normalizedNumberIndex = cursor.getColumnIndex("normalized_number"); int blockedIndex = cursor.getColumnIndex("message"); int nonNormalizedNumberIndex = cursor.getColumnIndex("number"); int regexIndex = cursor.getColumnIndex("is_regex"); // if the column indices are not valid, don't perform the queries if (normalizedNumberIndex < 0 || blockedIndex < 0) { - if (cursor != null) { - cursor.close(); - } - return null; + return; } - DatabaseWrapper db = DataModel.get().getDatabase(); - while(cursor.moveToNext()) { String number = cursor.getString(normalizedNumberIndex); String blocked = cursor.getString(blockedIndex); @@ -95,17 +116,11 @@ public class BlacklistObserver extends ContentObserver { BugleDatabaseOperations.updateDestination(db, number, isBlocked, false); } - String conversationId = BugleDatabaseOperations - .getConversationFromOtherParticipantDestination(db, number); - if (conversationId != null) { - if (isBlocked) { - UpdateConversationArchiveStatusAction - .archiveConversation(conversationId); - } else { - UpdateConversationArchiveStatusAction - .unarchiveConversation(conversationId); - } + String conversationId = updateArchiveStatusForConversation(isBlocked, number, db); + if (!requiresNotifyAllParticipants && conversationId != null) { MessagingContentProvider.notifyParticipantsChanged(conversationId); + } else { + requiresNotifyAllParticipants = true; } } } catch (Exception e) { @@ -114,10 +129,27 @@ public class BlacklistObserver extends ContentObserver { if (cursor != null) { cursor.close(); } + if (requiresNotifyAllParticipants) { + MessagingContentProvider.notifyAllParticipantsChanged(); + } } - return null; } - }.executeOnThreadPool(); + }); } + + private String updateArchiveStatusForConversation(boolean isBlocked, String number, DatabaseWrapper db) { + String conversationId = BugleDatabaseOperations + .getConversationFromOtherParticipantDestination(db, number); + if (conversationId != null) { + if (isBlocked) { + UpdateConversationArchiveStatusAction + .archiveConversation(conversationId); + } else { + UpdateConversationArchiveStatusAction + .unarchiveConversation(conversationId); + } + } + return conversationId; + } } diff --git a/src/com/android/messaging/util/BlacklistSync.java b/src/com/android/messaging/util/BlacklistSync.java index 3ab14d8..50ec8f9 100644 --- a/src/com/android/messaging/util/BlacklistSync.java +++ b/src/com/android/messaging/util/BlacklistSync.java @@ -28,6 +28,7 @@ import android.util.Log; import com.android.messaging.datamodel.BugleDatabaseOperations; import com.android.messaging.datamodel.DataModel; import com.android.messaging.datamodel.DatabaseWrapper; +import com.android.messaging.datamodel.MessagingContentProvider; import com.android.messaging.datamodel.data.ParticipantData; import com.android.messaging.util.LogUtil; @@ -47,6 +48,9 @@ public class BlacklistSync extends AsyncTask { Uri CONTENT_URI = Uri.parse("content://blacklist"); Cursor cursor; + DatabaseWrapper db = DataModel.get().getDatabase(); + BugleDatabaseOperations.resetBlockedParticpants(db); + // need to update local blacklist database - we are simply overwriting the // local database with the framework database - the local database is used // as a WriteThrough Cache of the Framework Database @@ -62,8 +66,6 @@ public class BlacklistSync extends AsyncTask { return null; } - DatabaseWrapper db = DataModel.get().getDatabase(); - while(cursor.moveToNext()) { String number = cursor.getString(normalizedNumberIndex); String blocked = cursor.getString(blockedIndex); @@ -95,6 +97,7 @@ public class BlacklistSync extends AsyncTask { cursor.close(); } + MessagingContentProvider.notifyAllParticipantsChanged(); return null; } } -- cgit v1.1