From 662d9c7c637cd9f8a7ed41791b87c1d7990e2caa Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Thu, 16 Jul 2020 12:49:37 +1000 Subject: [PATCH] Sync blocked contacts across devices --- .../securesms/database/RecipientDatabase.java | 5 ++-- .../securesms/jobs/PushDecryptJob.java | 1 + .../securesms/loki/activities/HomeActivity.kt | 22 ++++++++++++++++ .../loki/protocol/SyncMessagesProtocol.kt | 25 +++++++++++++++++++ 4 files changed, 50 insertions(+), 3 deletions(-) diff --git a/src/org/thoughtcrime/securesms/database/RecipientDatabase.java b/src/org/thoughtcrime/securesms/database/RecipientDatabase.java index 28c9611d6a..8553b2b73c 100644 --- a/src/org/thoughtcrime/securesms/database/RecipientDatabase.java +++ b/src/org/thoughtcrime/securesms/database/RecipientDatabase.java @@ -27,15 +27,14 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.function.Consumer; public class RecipientDatabase extends Database { private static final String TAG = RecipientDatabase.class.getSimpleName(); - static final String TABLE_NAME = "recipient_preferences"; + static final String TABLE_NAME = "recipient_preferences"; private static final String ID = "_id"; - static final String ADDRESS = "recipient_ids"; + public static final String ADDRESS = "recipient_ids"; private static final String BLOCK = "block"; private static final String NOTIFICATION = "notification"; private static final String VIBRATE = "vibrate"; diff --git a/src/org/thoughtcrime/securesms/jobs/PushDecryptJob.java b/src/org/thoughtcrime/securesms/jobs/PushDecryptJob.java index 4ceb4009f8..770c9d0ea9 100644 --- a/src/org/thoughtcrime/securesms/jobs/PushDecryptJob.java +++ b/src/org/thoughtcrime/securesms/jobs/PushDecryptJob.java @@ -315,6 +315,7 @@ public class PushDecryptJob extends BaseJob implements InjectableType { else if (syncMessage.getContacts().isPresent()) SyncMessagesProtocol.handleContactSyncMessage(context, content, syncMessage.getContacts().get()); else if (syncMessage.getGroups().isPresent()) SyncMessagesProtocol.handleClosedGroupSyncMessage(context, content, syncMessage.getGroups().get()); else if (syncMessage.getOpenGroups().isPresent()) SyncMessagesProtocol.handleOpenGroupSyncMessage(context, content, syncMessage.getOpenGroups().get()); + else if (syncMessage.getBlockedList().isPresent()) SyncMessagesProtocol.handleBlockedContactsSyncMessage(context, content, syncMessage.getBlockedList().get()); else Log.w(TAG, "Contains no known sync types..."); } else if (content.getCallMessage().isPresent()) { Log.i(TAG, "Got call message..."); diff --git a/src/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt b/src/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt index a3721f0a3d..cb9cae4fa4 100644 --- a/src/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt +++ b/src/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt @@ -2,13 +2,17 @@ package org.thoughtcrime.securesms.loki.activities import android.app.AlertDialog import android.arch.lifecycle.Observer +import android.content.BroadcastReceiver +import android.content.Context import android.content.Intent +import android.content.IntentFilter import android.database.Cursor import android.os.AsyncTask import android.os.Bundle import android.os.Handler import android.support.v4.app.LoaderManager import android.support.v4.content.Loader +import android.support.v4.content.LocalBroadcastManager import android.support.v7.widget.LinearLayoutManager import android.text.Spannable import android.text.SpannableString @@ -47,6 +51,7 @@ import org.whispersystems.signalservice.loki.protocol.syncmessages.SyncMessagesP class HomeActivity : PassphraseRequiredActionBarActivity, ConversationClickListener, SeedReminderViewDelegate, NewConversationButtonSetViewDelegate { private lateinit var glide: GlideRequests + private var broadcastReceiver: BroadcastReceiver? = null private val publicKey: String get() { @@ -166,6 +171,15 @@ class HomeActivity : PassphraseRequiredActionBarActivity, ConversationClickListe it.recipient.address.toPhoneString() }.toSet() FileServerAPI.shared.getDeviceLinks(publicKeys) + // Observe blocked contacts changed events + val broadcastReceiver = object : BroadcastReceiver() { + + override fun onReceive(context: Context, intent: Intent) { + recyclerView.adapter!!.notifyDataSetChanged() + } + } + this.broadcastReceiver = broadcastReceiver + LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, IntentFilter("blockedContactsChanged")) } override fun onResume() { @@ -198,6 +212,14 @@ class HomeActivity : PassphraseRequiredActionBarActivity, ConversationClickListe createNewPrivateChat() } } + + override fun onDestroy() { + val broadcastReceiver = this.broadcastReceiver + if (broadcastReceiver != null) { + LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver) + } + super.onDestroy() + } // endregion // region Updating diff --git a/src/org/thoughtcrime/securesms/loki/protocol/SyncMessagesProtocol.kt b/src/org/thoughtcrime/securesms/loki/protocol/SyncMessagesProtocol.kt index 16ec6aa8de..26b5bab8b2 100644 --- a/src/org/thoughtcrime/securesms/loki/protocol/SyncMessagesProtocol.kt +++ b/src/org/thoughtcrime/securesms/loki/protocol/SyncMessagesProtocol.kt @@ -7,6 +7,7 @@ import org.thoughtcrime.securesms.contacts.ContactAccessor.ContactData import org.thoughtcrime.securesms.contacts.ContactAccessor.NumberData import org.thoughtcrime.securesms.database.Address import org.thoughtcrime.securesms.database.DatabaseFactory +import org.thoughtcrime.securesms.database.RecipientDatabase import org.thoughtcrime.securesms.groups.GroupManager import org.thoughtcrime.securesms.groups.GroupMessageProcessor import org.thoughtcrime.securesms.jobs.MultiDeviceContactUpdateJob @@ -19,6 +20,7 @@ import org.whispersystems.signalservice.api.messages.SignalServiceAttachment import org.whispersystems.signalservice.api.messages.SignalServiceContent import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage import org.whispersystems.signalservice.api.messages.SignalServiceGroup +import org.whispersystems.signalservice.api.messages.multidevice.BlockedListMessage import org.whispersystems.signalservice.api.messages.multidevice.ContactsMessage import org.whispersystems.signalservice.api.messages.multidevice.DeviceContactsInputStream import org.whispersystems.signalservice.api.messages.multidevice.DeviceGroupsInputStream @@ -138,4 +140,27 @@ object SyncMessagesProtocol { OpenGroupUtilities.addGroup(context, url, channel) } } + + @JvmStatic + fun handleBlockedContactsSyncMessage(context: Context, content: SignalServiceContent, blockedContacts: BlockedListMessage) { + val recipientDB = DatabaseFactory.getRecipientDatabase(context) + val cursor = recipientDB.blocked + val blockedPublicKeys = blockedContacts.numbers.toSet() + val publicKeysToUnblock = mutableSetOf() + fun addToUnblockListIfNeeded() { + val publicKey = cursor.getString(cursor.getColumnIndex(RecipientDatabase.ADDRESS)) ?: return + if (blockedPublicKeys.contains(publicKey)) { return } + publicKeysToUnblock.add(publicKey) + } + while (cursor.moveToNext()) { + addToUnblockListIfNeeded() + } + publicKeysToUnblock.forEach { + recipientDB.setBlocked(recipient(context, it), false) + } + blockedPublicKeys.forEach { + recipientDB.setBlocked(recipient(context, it), true) + } + ApplicationContext.getInstance(context).broadcaster.broadcast("blockedContactsChanged") + } } \ No newline at end of file