From e7ae08fe7a7ebc140c53a08b54b8acad3a373363 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Mon, 24 May 2021 10:27:31 +1000 Subject: [PATCH] Clean --- .../securesms/ApplicationContext.java | 6 -- .../securesms/components/QuoteView.java | 12 ++- .../conversation/ConversationActivity.java | 14 +--- .../securesms/database/DatabaseFactory.java | 10 --- .../securesms/database/Storage.kt | 4 - .../database/helpers/SQLCipherOpenHelper.java | 3 - .../securesms/loki/activities/HomeActivity.kt | 4 - .../loki/activities/SettingsActivity.kt | 2 +- .../loki/database/LokiAPIDatabase.kt | 83 ------------------- .../loki/database/LokiMessageDatabase.kt | 5 -- .../loki/dialogs/UserDetailsBottomSheet.kt | 12 ++- .../loki/protocol/SessionMetaProtocol.kt | 20 ----- .../loki/utilities/MentionManagerUtilities.kt | 4 +- .../loki/utilities/MentionUtilities.kt | 9 +- .../loki/utilities/NotificationUtilities.kt | 13 --- .../securesms/loki/views/ConversationView.kt | 11 ++- .../loki/views/ProfilePictureView.kt | 16 ++-- .../securesms/loki/views/UserView.kt | 14 +--- .../MultipleRecipientNotificationBuilder.java | 28 +++++-- .../SingleRecipientNotificationBuilder.java | 33 +++++--- .../libsession/database/StorageProtocol.kt | 1 - .../utilities/recipients/Recipient.java | 29 ++++--- 22 files changed, 112 insertions(+), 221 deletions(-) delete mode 100644 app/src/main/java/org/thoughtcrime/securesms/loki/utilities/NotificationUtilities.kt diff --git a/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java b/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java index d58916b71b..60879fcd83 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java +++ b/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java @@ -66,7 +66,6 @@ import org.thoughtcrime.securesms.loki.api.LokiPushNotificationManager; import org.thoughtcrime.securesms.loki.api.OpenGroupManager; import org.thoughtcrime.securesms.loki.database.LokiAPIDatabase; import org.thoughtcrime.securesms.loki.database.LokiThreadDatabase; -import org.thoughtcrime.securesms.loki.database.LokiUserDatabase; import org.thoughtcrime.securesms.loki.utilities.Broadcaster; import org.thoughtcrime.securesms.loki.utilities.FcmUtils; import org.thoughtcrime.securesms.loki.utilities.UiModeUtilities; @@ -160,16 +159,11 @@ public class ApplicationContext extends MultiDexApplication implements Dependenc broadcaster = new Broadcaster(this); threadNotificationHandler = new Handler(Looper.getMainLooper()); LokiAPIDatabase apiDB = DatabaseFactory.getLokiAPIDatabase(this); - LokiThreadDatabase threadDB = DatabaseFactory.getLokiThreadDatabase(this); - LokiUserDatabase userDB = DatabaseFactory.getLokiUserDatabase(this); String userPublicKey = TextSecurePreferences.getLocalNumber(this); MessagingModuleConfiguration.Companion.configure(this, DatabaseFactory.getStorage(this), DatabaseFactory.getAttachmentProvider(this)); SnodeModule.Companion.configure(apiDB, broadcaster); - if (userPublicKey != null) { - MentionsManager.Companion.configureIfNeeded(userPublicKey, userDB); - } resubmitProfilePictureIfNeeded(); if (userPublicKey != null) { registerForFCMIfNeeded(false); diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/QuoteView.java b/app/src/main/java/org/thoughtcrime/securesms/components/QuoteView.java index b556d20f55..85cf9332bf 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/QuoteView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/QuoteView.java @@ -18,8 +18,11 @@ import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.annimon.stream.Stream; import com.bumptech.glide.load.engine.DiskCacheStrategy; + +import org.session.libsession.messaging.contacts.Contact; import org.session.libsession.messaging.sending_receiving.attachments.Attachment; import org.thoughtcrime.securesms.database.DatabaseFactory; +import org.thoughtcrime.securesms.loki.database.SessionContactDatabase; import org.thoughtcrime.securesms.loki.utilities.UiModeUtilities; import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader.DecryptableUri; import org.thoughtcrime.securesms.mms.GlideRequests; @@ -197,7 +200,14 @@ public class QuoteView extends FrameLayout implements RecipientModifiedListener if (senderHexEncodedPublicKey.equalsIgnoreCase(TextSecurePreferences.getLocalNumber(getContext()))) { quoteeDisplayName = TextSecurePreferences.getProfileName(getContext()); } else { - quoteeDisplayName = DatabaseFactory.getLokiUserDatabase(getContext()).getDisplayName(senderHexEncodedPublicKey); + SessionContactDatabase contactDB = DatabaseFactory.getSessionContactDatabase(getContext()); + Contact contact = contactDB.getContactWithSessionID(senderHexEncodedPublicKey); + if (contact != null) { + Contact.ContactContext context = (this.conversationRecipient.isOpenGroupRecipient()) ? Contact.ContactContext.OPEN_GROUP : Contact.ContactContext.REGULAR; + quoteeDisplayName = contact.displayName(context); + } else { + quoteeDisplayName = senderHexEncodedPublicKey; + } } authorView.setText(isOwnNumber ? getContext().getString(R.string.QuoteView_you) : quoteeDisplayName); diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java index e9fddd1e03..862a9bd2df 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java @@ -62,7 +62,6 @@ import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; - import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -158,8 +157,6 @@ import org.thoughtcrime.securesms.loki.activities.EditClosedGroupActivity; import org.thoughtcrime.securesms.loki.activities.HomeActivity; import org.thoughtcrime.securesms.loki.activities.SelectContactsActivity; import org.thoughtcrime.securesms.loki.api.PublicChatInfoUpdateWorker; -import org.thoughtcrime.securesms.loki.database.LokiThreadDatabase; -import org.thoughtcrime.securesms.loki.database.LokiUserDatabase; import org.thoughtcrime.securesms.loki.protocol.SessionMetaProtocol; import org.thoughtcrime.securesms.loki.utilities.GeneralUtilitiesKt; import org.thoughtcrime.securesms.loki.utilities.MentionManagerUtilities; @@ -2179,11 +2176,8 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity if (lastCharacterIndex > 0) { secondToLastCharacter = text.charAt(lastCharacterIndex - 1); } - String userHexEncodedPublicKey = TextSecurePreferences.getLocalNumber(ConversationActivity.this); - LokiThreadDatabase threadDatabase = DatabaseFactory.getLokiThreadDatabase(ConversationActivity.this); - LokiUserDatabase userDatabase = DatabaseFactory.getLokiUserDatabase(ConversationActivity.this); if (lastCharacter == '@' && Character.isWhitespace(secondToLastCharacter)) { - List mentionCandidates = MentionsManager.shared.getMentionCandidates("", threadId); + List mentionCandidates = MentionsManager.INSTANCE.getMentionCandidates("", threadId, recipient.isOpenGroupRecipient()); currentMentionStartIndex = lastCharacterIndex; mentionCandidateSelectionViewContainer.setVisibility(View.VISIBLE); mentionCandidateSelectionView.show(mentionCandidates, threadId); @@ -2194,7 +2188,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity } else { if (currentMentionStartIndex != -1) { String query = text.substring(currentMentionStartIndex + 1); // + 1 to get rid of the @ - List mentionCandidates = MentionsManager.shared.getMentionCandidates(query, threadId); + List mentionCandidates = MentionsManager.INSTANCE.getMentionCandidates(query, threadId, recipient.isOpenGroupRecipient()); mentionCandidateSelectionViewContainer.setVisibility(View.VISIBLE); mentionCandidateSelectionView.show(mentionCandidates, threadId); } @@ -2339,8 +2333,8 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity } else if (recipient.getAddress().toString().toLowerCase().equals(userPublicKey)) { titleTextView.setText(getResources().getString(R.string.note_to_self)); } else { - String displayName = SSKEnvironment.shared.getProfileManager().getDisplayName(getApplicationContext(), recipient); - boolean hasName = displayName != null; + String displayName = recipient.getName(); // Uses the Contact API internally + boolean hasName = (displayName != null); titleTextView.setText(hasName ? displayName : recipient.getAddress().toString()); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseFactory.java b/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseFactory.java index 554a6470b0..d2682e7ac0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseFactory.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseFactory.java @@ -17,11 +17,8 @@ package org.thoughtcrime.securesms.database; import android.content.Context; - import androidx.annotation.NonNull; - import net.sqlcipher.database.SQLiteDatabase; - import org.thoughtcrime.securesms.attachments.DatabaseAttachmentProvider; import org.thoughtcrime.securesms.crypto.AttachmentSecret; import org.thoughtcrime.securesms.crypto.AttachmentSecretProvider; @@ -32,7 +29,6 @@ import org.thoughtcrime.securesms.loki.database.LokiAPIDatabase; import org.thoughtcrime.securesms.loki.database.LokiBackupFilesDatabase; import org.thoughtcrime.securesms.loki.database.LokiMessageDatabase; import org.thoughtcrime.securesms.loki.database.LokiThreadDatabase; -import org.thoughtcrime.securesms.loki.database.LokiUserDatabase; import org.thoughtcrime.securesms.loki.database.SessionJobDatabase; import org.thoughtcrime.securesms.loki.database.SessionContactDatabase; @@ -61,7 +57,6 @@ public class DatabaseFactory { private final LokiAPIDatabase lokiAPIDatabase; private final LokiMessageDatabase lokiMessageDatabase; private final LokiThreadDatabase lokiThreadDatabase; - private final LokiUserDatabase lokiUserDatabase; private final LokiBackupFilesDatabase lokiBackupFilesDatabase; private final SessionJobDatabase sessionJobDatabase; private final SessionContactDatabase sessionContactDatabase; @@ -148,10 +143,6 @@ public class DatabaseFactory { return getInstance(context).lokiThreadDatabase; } - public static LokiUserDatabase getLokiUserDatabase(Context context) { - return getInstance(context).lokiUserDatabase; - } - public static LokiBackupFilesDatabase getLokiBackupFilesDatabase(Context context) { return getInstance(context).lokiBackupFilesDatabase; } @@ -203,7 +194,6 @@ public class DatabaseFactory { this.lokiAPIDatabase = new LokiAPIDatabase(context, databaseHelper); this.lokiMessageDatabase = new LokiMessageDatabase(context, databaseHelper); this.lokiThreadDatabase = new LokiThreadDatabase(context, databaseHelper); - this.lokiUserDatabase = new LokiUserDatabase(context, databaseHelper); this.lokiBackupFilesDatabase = new LokiBackupFilesDatabase(context, databaseHelper); this.storage = new Storage(context, databaseHelper); this.attachmentProvider = new DatabaseAttachmentProvider(context, databaseHelper); diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt index 01ba805546..f57318cd5b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt @@ -491,10 +491,6 @@ class Storage(context: Context, helper: SQLCipherOpenHelper) : Database(context, return threadId } - override fun getProfilePictureURL(publicKey: String): String? { - return DatabaseFactory.getLokiUserDatabase(context).getProfilePictureURL(publicKey) - } - override fun getContactWithSessionID(sessionID: String): Contact? { return DatabaseFactory.getSessionContactDatabase(context).getContactWithSessionID(sessionID) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SQLCipherOpenHelper.java b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SQLCipherOpenHelper.java index 15a71c7ef0..c405283b81 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SQLCipherOpenHelper.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SQLCipherOpenHelper.java @@ -27,7 +27,6 @@ import org.thoughtcrime.securesms.loki.database.LokiAPIDatabase; import org.thoughtcrime.securesms.loki.database.LokiBackupFilesDatabase; import org.thoughtcrime.securesms.loki.database.LokiMessageDatabase; import org.thoughtcrime.securesms.loki.database.LokiThreadDatabase; -import org.thoughtcrime.securesms.loki.database.LokiUserDatabase; import org.thoughtcrime.securesms.loki.database.SessionContactDatabase; import org.thoughtcrime.securesms.loki.database.SessionJobDatabase; import org.thoughtcrime.securesms.loki.protocol.ClosedGroupsMigration; @@ -125,8 +124,6 @@ public class SQLCipherOpenHelper extends SQLiteOpenHelper { db.execSQL(LokiMessageDatabase.getCreateErrorMessageTableCommand()); db.execSQL(LokiThreadDatabase.getCreateSessionResetTableCommand()); db.execSQL(LokiThreadDatabase.getCreatePublicChatTableCommand()); - db.execSQL(LokiUserDatabase.getCreateDisplayNameTableCommand()); - db.execSQL(LokiUserDatabase.getCreateServerDisplayNameTableCommand()); db.execSQL(LokiBackupFilesDatabase.getCreateTableCommand()); db.execSQL(SessionJobDatabase.getCreateSessionJobTableCommand()); db.execSQL(LokiMessageDatabase.getUpdateMessageIDTableForType()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt index f8ed445146..84fd67da53 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt @@ -132,12 +132,8 @@ class HomeActivity : PassphraseRequiredActionBarActivity(), }) // Set up remaining components if needed val application = ApplicationContext.getInstance(this) - val apiDB = DatabaseFactory.getLokiAPIDatabase(this) - val threadDB = DatabaseFactory.getLokiThreadDatabase(this) - val userDB = DatabaseFactory.getLokiUserDatabase(this) val userPublicKey = TextSecurePreferences.getLocalNumber(this) if (userPublicKey != null) { - MentionsManager.configureIfNeeded(userPublicKey, userDB) OpenGroupManager.startPolling() JobQueue.shared.resumePendingJobs() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/SettingsActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/SettingsActivity.kt index c521c45c9e..ac342a707c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/SettingsActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/SettingsActivity.kt @@ -72,7 +72,7 @@ class SettingsActivity : PassphraseRequiredActionBarActivity() { override fun onCreate(savedInstanceState: Bundle?, isReady: Boolean) { super.onCreate(savedInstanceState, isReady) setContentView(R.layout.activity_settings) - val displayName = DatabaseFactory.getLokiUserDatabase(this).getDisplayName(hexEncodedPublicKey) + val displayName = TextSecurePreferences.getProfileName(this) ?: hexEncodedPublicKey glide = GlideApp.with(this) profilePictureView.glide = glide profilePictureView.publicKey = hexEncodedPublicKey diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/database/LokiAPIDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/database/LokiAPIDatabase.kt index 15e76ac0ec..91f04adef8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/database/LokiAPIDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/database/LokiAPIDatabase.kt @@ -278,14 +278,6 @@ class LokiAPIDatabase(context: Context, helper: SQLCipherOpenHelper) : Database( } } - override fun getLastMessageServerID(group: Long, server: String): Long? { - val database = databaseHelper.readableDatabase - val index = "$server.$group" - return database.get(lastMessageServerIDTable, "$lastMessageServerIDTableIndex = ?", wrap(index)) { cursor -> - cursor.getInt(lastMessageServerID) - }?.toLong() - } - override fun getLastMessageServerID(room: String, server: String): Long? { val database = databaseHelper.writableDatabase val index = "$server.$room" @@ -294,13 +286,6 @@ class LokiAPIDatabase(context: Context, helper: SQLCipherOpenHelper) : Database( }?.toLong() } - override fun setLastMessageServerID(group: Long, server: String, newValue: Long) { - val database = databaseHelper.writableDatabase - val index = "$server.$group" - val row = wrap(mapOf( lastMessageServerIDTableIndex to index, lastMessageServerID to newValue.toString() )) - database.insertOrUpdate(lastMessageServerIDTable, row, "$lastMessageServerIDTableIndex = ?", wrap(index)) - } - override fun setLastMessageServerID(room: String, server: String, newValue: Long) { val database = databaseHelper.writableDatabase val index = "$server.$room" @@ -308,26 +293,12 @@ class LokiAPIDatabase(context: Context, helper: SQLCipherOpenHelper) : Database( database.insertOrUpdate(lastMessageServerIDTable, row, "$lastMessageServerIDTableIndex = ?", wrap(index)) } - fun removeLastMessageServerID(group: Long, server: String) { - val database = databaseHelper.writableDatabase - val index = "$server.$group" - database.delete(lastMessageServerIDTable,"$lastMessageServerIDTableIndex = ?", wrap(index)) - } - fun removeLastMessageServerID(room: String, server:String) { val database = databaseHelper.writableDatabase val index = "$server.$room" database.delete(lastMessageServerIDTable, "$lastMessageServerIDTableIndex = ?", wrap(index)) } - override fun getLastDeletionServerID(group: Long, server: String): Long? { - val database = databaseHelper.readableDatabase - val index = "$server.$group" - return database.get(lastDeletionServerIDTable, "$lastDeletionServerIDTableIndex = ?", wrap(index)) { cursor -> - cursor.getInt(lastDeletionServerID) - }?.toLong() - } - override fun getLastDeletionServerID(room: String, server: String): Long? { val database = databaseHelper.readableDatabase val index = "$server.$room" @@ -336,13 +307,6 @@ class LokiAPIDatabase(context: Context, helper: SQLCipherOpenHelper) : Database( }?.toLong() } - override fun setLastDeletionServerID(group: Long, server: String, newValue: Long) { - val database = databaseHelper.writableDatabase - val index = "$server.$group" - val row = wrap(mapOf( lastDeletionServerIDTableIndex to index, lastDeletionServerID to newValue.toString() )) - database.insertOrUpdate(lastDeletionServerIDTable, row, "$lastDeletionServerIDTableIndex = ?", wrap(index)) - } - override fun setLastDeletionServerID(room: String, server: String, newValue: Long) { val database = databaseHelper.writableDatabase val index = "$server.$room" @@ -392,32 +356,6 @@ class LokiAPIDatabase(context: Context, helper: SQLCipherOpenHelper) : Database( database.insertOrUpdate(userCountTable, row, "$publicChatID = ?", wrap(index)) } - override fun getSessionRequestSentTimestamp(publicKey: String): Long? { - val database = databaseHelper.readableDatabase - return database.get(sessionRequestSentTimestampTable, "${LokiAPIDatabase.publicKey} = ?", wrap(publicKey)) { cursor -> - cursor.getLong(LokiAPIDatabase.timestamp) - }?.toLong() - } - - override fun setSessionRequestSentTimestamp(publicKey: String, newValue: Long) { - val database = databaseHelper.writableDatabase - val row = wrap(mapOf( LokiAPIDatabase.publicKey to publicKey, LokiAPIDatabase.timestamp to newValue.toString() )) - database.insertOrUpdate(sessionRequestSentTimestampTable, row, "${LokiAPIDatabase.publicKey} = ?", wrap(publicKey)) - } - - override fun getSessionRequestProcessedTimestamp(publicKey: String): Long? { - val database = databaseHelper.readableDatabase - return database.get(sessionRequestProcessedTimestampTable, "${LokiAPIDatabase.publicKey} = ?", wrap(publicKey)) { cursor -> - cursor.getInt(LokiAPIDatabase.timestamp) - }?.toLong() - } - - override fun setSessionRequestProcessedTimestamp(publicKey: String, newValue: Long) { - val database = databaseHelper.writableDatabase - val row = wrap(mapOf(LokiAPIDatabase.publicKey to publicKey, LokiAPIDatabase.timestamp to newValue.toString())) - database.insertOrUpdate(sessionRequestProcessedTimestampTable, row, "${LokiAPIDatabase.publicKey} = ?", wrap(publicKey)) - } - override fun getOpenGroupPublicKey(server: String): String? { val database = databaseHelper.readableDatabase return database.get(openGroupPublicKeyTable, "${LokiAPIDatabase.server} = ?", wrap(server)) { cursor -> @@ -431,27 +369,6 @@ class LokiAPIDatabase(context: Context, helper: SQLCipherOpenHelper) : Database( database.insertOrUpdate(openGroupPublicKeyTable, row, "${LokiAPIDatabase.server} = ?", wrap(server)) } - override fun getOpenGroupProfilePictureURL(group: Long, server: String): String? { - val database = databaseHelper.readableDatabase - val index = "$server.$group" - return database.get(openGroupProfilePictureTable, "$publicChatID = ?", wrap(index)) { cursor -> - cursor.getString(openGroupProfilePicture) - }?.toString() - } - - override fun setOpenGroupProfilePictureURL(group: Long, server: String, newValue: String) { - val database = databaseHelper.writableDatabase - val index = "$server.$group" - val row = wrap(mapOf(publicChatID to index, openGroupProfilePicture to newValue)) - database.insertOrUpdate(openGroupProfilePictureTable, row, "$publicChatID = ?", wrap(index)) - } - - fun clearOpenGroupProfilePictureURL(group: Long, server: String): Boolean { - val database = databaseHelper.writableDatabase - val index = "$server.$group" - return database.delete(openGroupProfilePictureTable, "$publicChatID = ?", arrayOf(index)) > 0 - } - override fun getLastSnodePoolRefreshDate(): Date? { val time = TextSecurePreferences.getLastSnodePoolRefreshDate(context) if (time <= 0) { return null } diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/database/LokiMessageDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/database/LokiMessageDatabase.kt index bc2d71f7c6..83e64f884c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/database/LokiMessageDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/database/LokiMessageDatabase.kt @@ -37,11 +37,6 @@ class LokiMessageDatabase(context: Context, helper: SQLCipherOpenHelper) : Datab } - override fun getQuoteServerID(quoteID: Long, quoteePublicKey: String): Long? { - val message = DatabaseFactory.getMmsSmsDatabase(context).getMessageFor(quoteID, quoteePublicKey) - return if (message != null) getServerID(message.getId(), !message.isMms) else null - } - fun getServerID(messageID: Long): Long? { val database = databaseHelper.readableDatabase return database.get(messageIDTable, "${Companion.messageID} = ?", arrayOf(messageID.toString())) { cursor -> diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/UserDetailsBottomSheet.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/UserDetailsBottomSheet.kt index db5bcc55ae..530e95585c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/UserDetailsBottomSheet.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/UserDetailsBottomSheet.kt @@ -14,9 +14,11 @@ import android.view.inputmethod.InputMethodManager import android.widget.Toast import kotlinx.android.synthetic.main.fragment_user_details_bottom_sheet.* import network.loki.messenger.R +import org.session.libsession.messaging.contacts.Contact import org.session.libsession.utilities.Address import org.session.libsession.utilities.recipients.Recipient import org.session.libsession.utilities.SSKEnvironment +import org.thoughtcrime.securesms.database.DatabaseFactory import org.thoughtcrime.securesms.mms.GlideApp class UserDetailsBottomSheet : BottomSheetDialogFragment() { @@ -59,7 +61,7 @@ class UserDetailsBottomSheet : BottomSheetDialogFragment() { else -> return@setOnEditorActionListener false } } - nameTextView.text = SSKEnvironment.shared.profileManager.getDisplayName(requireContext(), recipient) ?: "Anonymous" + nameTextView.text = recipient.name ?: publicKey // Uses the Contact API internally publicKeyTextView.text = publicKey copyButton.setOnClickListener { val clipboard = requireContext().getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager @@ -78,8 +80,12 @@ class UserDetailsBottomSheet : BottomSheetDialogFragment() { if (nameEditText.text.isNotEmpty()) { newNickName = nameEditText.text.toString() } - SSKEnvironment.shared.profileManager.setDisplayName(requireContext(), recipient, newNickName) - nameTextView.text = SSKEnvironment.shared.profileManager.getDisplayName(requireContext(), recipient) ?: "Anonymous" + val publicKey = recipient.address.serialize() + val contactDB = DatabaseFactory.getSessionContactDatabase(context) + val contact = contactDB.getContactWithSessionID(publicKey) ?: Contact(publicKey) + contact.nickname = newNickName + contactDB.setContact(contact) + nameTextView.text = recipient.name ?: publicKey // Uses the Contact API internally } @SuppressLint("ServiceCast") diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/SessionMetaProtocol.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/SessionMetaProtocol.kt index b270cdecf6..1f8bdca7ad 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/SessionMetaProtocol.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/SessionMetaProtocol.kt @@ -1,15 +1,8 @@ package org.thoughtcrime.securesms.loki.protocol -import android.content.Context -import org.thoughtcrime.securesms.ApplicationContext import org.session.libsession.utilities.Address -import org.thoughtcrime.securesms.database.DatabaseFactory -import org.thoughtcrime.securesms.jobs.RetrieveProfileAvatarJob import org.session.libsession.utilities.recipients.Recipient -import org.session.libsession.utilities.TextSecurePreferences -import org.session.libsignal.messages.SignalServiceContent import org.session.libsignal.messages.SignalServiceDataMessage -import java.security.MessageDigest object SessionMetaProtocol { @@ -39,19 +32,6 @@ object SessionMetaProtocol { return shouldIgnoreMessage } - @JvmStatic - fun handleProfileUpdateIfNeeded(context: Context, content: SignalServiceContent) { - val displayName = content.senderDisplayName.orNull() ?: return - if (displayName.isBlank()) { return } - val userPublicKey = TextSecurePreferences.getLocalNumber(context) - val sender = content.sender.toLowerCase() - if (userPublicKey == sender) { - // Update the user's local name if the message came from their master device - TextSecurePreferences.setProfileName(context, displayName) - } - DatabaseFactory.getLokiUserDatabase(context).setDisplayName(sender, displayName) - } - @JvmStatic fun canUserReplyToNotification(recipient: Recipient): Boolean { // TODO return !recipient.address.isRSSFeed diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/MentionManagerUtilities.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/MentionManagerUtilities.kt index faef8f0cc3..000b61db89 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/MentionManagerUtilities.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/MentionManagerUtilities.kt @@ -15,7 +15,7 @@ object MentionManagerUtilities { val members = DatabaseFactory.getGroupDatabase(context).getGroupMembers(recipient.address.toGroupString(), false).map { it.address.serialize() } result.addAll(members) } else { - if (MentionsManager.shared.userPublicKeyCache[threadID] != null) { return } + if (MentionsManager.userPublicKeyCache[threadID] != null) { return } val messageDatabase = DatabaseFactory.getMmsSmsDatabase(context) val reader = messageDatabase.readerFor(messageDatabase.getConversation(threadID)) var record: MessageRecord? = reader.next @@ -30,6 +30,6 @@ object MentionManagerUtilities { reader.close() result.add(TextSecurePreferences.getLocalNumber(context)!!) } - MentionsManager.shared.userPublicKeyCache[threadID] = result + MentionsManager.userPublicKeyCache[threadID] = result } } \ No newline at end of file diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/MentionUtilities.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/MentionUtilities.kt index 300d5466a0..45fda301d8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/MentionUtilities.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/MentionUtilities.kt @@ -9,6 +9,7 @@ import android.text.style.StyleSpan import android.util.Range import network.loki.messenger.R import nl.komponents.kovenant.combine.Tuple2 +import org.session.libsession.messaging.contacts.Contact import org.thoughtcrime.securesms.database.DatabaseFactory import org.session.libsession.utilities.TextSecurePreferences import java.util.regex.Pattern @@ -23,6 +24,8 @@ object MentionUtilities { @JvmStatic fun highlightMentions(text: CharSequence, isOutgoingMessage: Boolean, threadID: Long, context: Context): SpannableString { var text = text + val threadDB = DatabaseFactory.getThreadDatabase(context) + val isOpenGroup = threadDB.getRecipientForThreadId(threadID)?.isOpenGroupRecipient ?: false val pattern = Pattern.compile("@[0-9a-fA-F]*") var matcher = pattern.matcher(text) val mentions = mutableListOf, String>>() @@ -31,10 +34,12 @@ object MentionUtilities { if (matcher.find(startIndex)) { while (true) { val publicKey = text.subSequence(matcher.start() + 1, matcher.end()).toString() // +1 to get rid of the @ - val userDisplayName: String? = if (publicKey.toLowerCase() == userPublicKey.toLowerCase()) { + val userDisplayName: String? = if (publicKey.equals(userPublicKey, ignoreCase = true)) { TextSecurePreferences.getProfileName(context) } else { - DatabaseFactory.getLokiUserDatabase(context).getDisplayName(publicKey) + val contact = DatabaseFactory.getSessionContactDatabase(context).getContactWithSessionID(publicKey) + val context = if (isOpenGroup) Contact.ContactContext.OPEN_GROUP else Contact.ContactContext.REGULAR + contact?.displayName(context) } if (userDisplayName != null) { text = text.subSequence(0, matcher.start()).toString() + "@" + userDisplayName + text.subSequence(matcher.end(), text.length) diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/NotificationUtilities.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/NotificationUtilities.kt deleted file mode 100644 index ad3d35f809..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/NotificationUtilities.kt +++ /dev/null @@ -1,13 +0,0 @@ -@file:JvmName("NotificationUtilities") -package org.thoughtcrime.securesms.loki.utilities - -import android.content.Context -import org.thoughtcrime.securesms.database.DatabaseFactory -import org.session.libsession.utilities.recipients.Recipient - -fun getOpenGroupDisplayName(recipient: Recipient, threadRecipient: Recipient, context: Context): String { - val publicKey = recipient.address.toString() - val displayName = DatabaseFactory.getLokiUserDatabase(context).getDisplayName(publicKey) - // FIXME: Add short ID here? - return displayName ?: publicKey -} \ No newline at end of file diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/views/ConversationView.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/views/ConversationView.kt index 2fabee59f6..efbaa24dbd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/views/ConversationView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/views/ConversationView.kt @@ -8,8 +8,10 @@ import android.view.View import android.widget.LinearLayout import kotlinx.android.synthetic.main.view_conversation.view.* import network.loki.messenger.R +import org.session.libsession.messaging.contacts.Contact import org.session.libsession.utilities.recipients.Recipient import org.session.libsession.utilities.SSKEnvironment +import org.thoughtcrime.securesms.database.DatabaseFactory import org.thoughtcrime.securesms.database.model.ThreadRecord import org.thoughtcrime.securesms.loki.utilities.MentionManagerUtilities.populateUserPublicKeyCacheIfNeeded import org.thoughtcrime.securesms.loki.utilities.MentionUtilities.highlightMentions @@ -86,10 +88,11 @@ class ConversationView : LinearLayout { } private fun getUserDisplayName(recipient: Recipient): String? { - return if (recipient.isLocalNumber) - context.getString(R.string.note_to_self) - else - SSKEnvironment.shared.profileManager.getDisplayName(context, recipient) + if (recipient.isLocalNumber) { + return context.getString(R.string.note_to_self) + } else { + return recipient.name // Internally uses the Contact API + } } // endregion } \ No newline at end of file diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/views/ProfilePictureView.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/views/ProfilePictureView.kt index 2226e9ef8b..e2de25ca90 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/views/ProfilePictureView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/views/ProfilePictureView.kt @@ -11,6 +11,7 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy import kotlinx.android.synthetic.main.view_profile_picture.view.* import network.loki.messenger.R import org.session.libsession.avatars.ProfileContactPhoto +import org.session.libsession.messaging.contacts.Contact import org.session.libsession.messaging.mentions.MentionsManager import org.session.libsession.utilities.Address import org.session.libsession.utilities.recipients.Recipient @@ -57,19 +58,15 @@ class ProfilePictureView : RelativeLayout { // region Updating fun update(recipient: Recipient, threadID: Long) { - fun getUserDisplayName(publicKey: String?): String? { - if (publicKey == null || publicKey.isBlank()) { - return null - } else { - val result = DatabaseFactory.getLokiUserDatabase(context).getDisplayName(publicKey) - return result ?: publicKey - } + fun getUserDisplayName(publicKey: String): String { + val contact = DatabaseFactory.getSessionContactDatabase(context).getContactWithSessionID(publicKey) + return contact?.displayName(Contact.ContactContext.REGULAR) ?: publicKey } fun isOpenGroupWithProfilePicture(recipient: Recipient): Boolean { return recipient.isOpenGroupRecipient && recipient.groupAvatarId != null } if (recipient.isGroupRecipient && !isOpenGroupWithProfilePicture(recipient)) { - val users = MentionsManager.shared.userPublicKeyCache[threadID]?.toMutableList() ?: mutableListOf() + val users = MentionsManager.userPublicKeyCache[threadID]?.toMutableList() ?: mutableListOf() users.remove(TextSecurePreferences.getLocalNumber(context)) val randomUsers = users.sorted().toMutableList() // Sort to provide a level of stability if (users.count() == 1) { @@ -86,7 +83,8 @@ class ProfilePictureView : RelativeLayout { recipient.name == "Session Updates" || recipient.name == "Session Public Chat" } else { - publicKey = recipient.address.toString() + val publicKey = recipient.address.toString() + this.publicKey = publicKey displayName = getUserDisplayName(publicKey) additionalPublicKey = null isRSSFeed = false diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/views/UserView.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/views/UserView.kt index 7a6ced6d85..7dae953974 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/views/UserView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/views/UserView.kt @@ -49,17 +49,9 @@ class UserView : LinearLayout { // region Updating fun bind(user: Recipient, glide: GlideRequests, actionIndicator: ActionIndicator, isSelected: Boolean = false) { - fun getUserDisplayName(publicKey: String?): String? { - if (publicKey == null || publicKey.isBlank()) { - return null - } else { - val contact = DatabaseFactory.getSessionContactDatabase(context).getContactWithSessionID(publicKey) - contact?.let { - return it.displayName(Contact.ContactContext.REGULAR) - } - val result = DatabaseFactory.getLokiUserDatabase(context).getDisplayName(publicKey) - return result ?: publicKey - } + fun getUserDisplayName(publicKey: String): String { + val contact = DatabaseFactory.getSessionContactDatabase(context).getContactWithSessionID(publicKey) + return contact?.displayName(Contact.ContactContext.REGULAR) ?: publicKey } val threadID = DatabaseFactory.getThreadDatabase(context).getOrCreateThreadIdFor(user) MentionManagerUtilities.populateUserPublicKeyCacheIfNeeded(threadID, context) // FIXME: This is a bad place to do this diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/MultipleRecipientNotificationBuilder.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/MultipleRecipientNotificationBuilder.java index 9527282d39..f094cea12c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/MultipleRecipientNotificationBuilder.java +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/MultipleRecipientNotificationBuilder.java @@ -8,14 +8,14 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.app.NotificationCompat; import android.text.SpannableStringBuilder; - +import org.session.libsession.messaging.contacts.Contact; +import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.loki.activities.HomeActivity; -import org.thoughtcrime.securesms.loki.utilities.NotificationUtilities; +import org.thoughtcrime.securesms.loki.database.SessionContactDatabase; import org.session.libsession.utilities.NotificationPrivacyPreference; import org.session.libsession.utilities.recipients.Recipient; import org.session.libsession.utilities.TextSecurePreferences; import org.session.libsession.utilities.Util; - import java.util.LinkedList; import java.util.List; @@ -49,8 +49,15 @@ public class MultipleRecipientNotificationBuilder extends AbstractNotificationBu public void setMostRecentSender(Recipient recipient, Recipient threadRecipient) { String displayName = recipient.toShortString(); - if (threadRecipient.isGroupRecipient()) { - displayName = NotificationUtilities.getOpenGroupDisplayName(recipient, threadRecipient, context); + if (threadRecipient.isOpenGroupRecipient()) { + SessionContactDatabase contactDB = DatabaseFactory.getSessionContactDatabase(context); + String sessionID = recipient.getAddress().serialize(); + Contact contact = contactDB.getContactWithSessionID(sessionID); + if (contact != null) { + displayName = contact.displayName(Contact.ContactContext.OPEN_GROUP); + } else { + displayName = sessionID; + } } if (privacy.isDisplayContact()) { setContentText(context.getString(R.string.MessageNotifier_most_recent_from_s, displayName)); @@ -71,8 +78,15 @@ public class MultipleRecipientNotificationBuilder extends AbstractNotificationBu public void addMessageBody(@NonNull Recipient sender, Recipient threadRecipient, @Nullable CharSequence body) { String displayName = sender.toShortString(); - if (threadRecipient.isGroupRecipient()) { - displayName = NotificationUtilities.getOpenGroupDisplayName(sender, threadRecipient, context); + if (threadRecipient.isOpenGroupRecipient()) { + SessionContactDatabase contactDB = DatabaseFactory.getSessionContactDatabase(context); + String sessionID = sender.getAddress().serialize(); + Contact contact = contactDB.getContactWithSessionID(sessionID); + if (contact != null) { + displayName = contact.displayName(Contact.ContactContext.OPEN_GROUP); + } else { + displayName = sessionID; + } } if (privacy.isDisplayMessage()) { SpannableStringBuilder builder = new SpannableStringBuilder(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/SingleRecipientNotificationBuilder.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/SingleRecipientNotificationBuilder.java index 0ed628034f..008779301b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/SingleRecipientNotificationBuilder.java +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/SingleRecipientNotificationBuilder.java @@ -15,22 +15,21 @@ import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Build; import android.text.SpannableStringBuilder; - import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationCompat.Action; import androidx.core.app.RemoteInput; - import com.bumptech.glide.load.engine.DiskCacheStrategy; - import org.session.libsession.avatars.ContactColors; import org.session.libsession.avatars.ContactPhoto; import org.session.libsession.avatars.GeneratedContactPhoto; +import org.session.libsession.messaging.contacts.Contact; import org.session.libsignal.utilities.Log; +import org.thoughtcrime.securesms.database.DatabaseFactory; +import org.thoughtcrime.securesms.loki.database.SessionContactDatabase; import org.thoughtcrime.securesms.loki.utilities.AvatarPlaceholderGenerator; -import org.thoughtcrime.securesms.loki.utilities.NotificationUtilities; import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader; import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.mms.Slide; @@ -40,11 +39,9 @@ import org.session.libsession.utilities.recipients.Recipient; import org.thoughtcrime.securesms.util.BitmapUtil; import org.session.libsession.utilities.TextSecurePreferences; import org.session.libsession.utilities.Util; - import java.util.LinkedList; import java.util.List; import java.util.concurrent.ExecutionException; - import network.loki.messenger.R; public class SingleRecipientNotificationBuilder extends AbstractNotificationBuilder { @@ -121,8 +118,16 @@ public class SingleRecipientNotificationBuilder extends AbstractNotificationBuil { SpannableStringBuilder stringBuilder = new SpannableStringBuilder(); - if (privacy.isDisplayContact() && threadRecipients.isGroupRecipient()) { - String displayName = NotificationUtilities.getOpenGroupDisplayName(individualRecipient, threadRecipients, context); + if (privacy.isDisplayContact() && threadRecipients.isOpenGroupRecipient()) { + String displayName; + SessionContactDatabase contactDB = DatabaseFactory.getSessionContactDatabase(context); + String sessionID = individualRecipient.getAddress().serialize(); + Contact contact = contactDB.getContactWithSessionID(sessionID); + if (contact != null) { + displayName = contact.displayName(Contact.ContactContext.OPEN_GROUP); + } else { + displayName = sessionID; + } if (displayName != null) { stringBuilder.append(Util.getBoldedString(displayName + ": ")); } @@ -209,8 +214,16 @@ public class SingleRecipientNotificationBuilder extends AbstractNotificationBuil { SpannableStringBuilder stringBuilder = new SpannableStringBuilder(); - if (privacy.isDisplayContact() && threadRecipient.isGroupRecipient()) { - String displayName = NotificationUtilities.getOpenGroupDisplayName(individualRecipient, threadRecipient, context); + if (privacy.isDisplayContact() && threadRecipient.isOpenGroupRecipient()) { + String displayName; + SessionContactDatabase contactDB = DatabaseFactory.getSessionContactDatabase(context); + String sessionID = individualRecipient.getAddress().serialize(); + Contact contact = contactDB.getContactWithSessionID(sessionID); + if (contact != null) { + displayName = contact.displayName(Contact.ContactContext.OPEN_GROUP); + } else { + displayName = sessionID; + } if (displayName != null) { stringBuilder.append(Util.getBoldedString(displayName + ": ")); } diff --git a/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt b/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt index f9516b9604..56824fa1a2 100644 --- a/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt +++ b/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt @@ -130,7 +130,6 @@ interface StorageProtocol { fun getLastUpdated(threadID: Long): Long // Contacts - fun getProfilePictureURL(publicKey: String): String? fun getContactWithSessionID(sessionID: String): Contact? fun getAllContacts(): Set fun setContact(contact: Contact) diff --git a/libsession/src/main/java/org/session/libsession/utilities/recipients/Recipient.java b/libsession/src/main/java/org/session/libsession/utilities/recipients/Recipient.java index 5055237969..bc636b6f33 100644 --- a/libsession/src/main/java/org/session/libsession/utilities/recipients/Recipient.java +++ b/libsession/src/main/java/org/session/libsession/utilities/recipients/Recipient.java @@ -28,8 +28,10 @@ import androidx.annotation.Nullable; import com.annimon.stream.function.Consumer; import org.greenrobot.eventbus.EventBus; +import org.session.libsession.database.StorageProtocol; import org.session.libsession.messaging.MessagingModuleConfiguration; import org.session.libsession.avatars.TransparentContactPhoto; +import org.session.libsession.messaging.contacts.Contact; import org.session.libsession.utilities.Address; import org.session.libsession.utilities.GroupRecord; import org.session.libsession.utilities.recipients.RecipientProvider.RecipientDetails; @@ -286,20 +288,23 @@ public class Recipient implements RecipientModifiedListener { } public synchronized @Nullable String getName() { - String displayName = MessagingModuleConfiguration.shared.getStorage().getDisplayName(this.address.toString()); - if (displayName != null && !displayName.isEmpty()) { return displayName; } - - if (this.name == null && isGroupRecipient()) { - List names = new LinkedList<>(); - - for (Recipient recipient : participants) { - names.add(recipient.toShortString()); + StorageProtocol storage = MessagingModuleConfiguration.shared.getStorage(); + String sessionID = this.address.toString(); + if (isGroupRecipient()) { + if (this.name == null) { + List names = new LinkedList<>(); + for (Recipient recipient : participants) { + names.add(recipient.toShortString()); + } + return Util.join(names, ", "); + } else { + return this.name; } - - return Util.join(names, ", "); + } else { + Contact contact = storage.getContactWithSessionID(sessionID); + if (contact == null) { return sessionID; } + return contact.displayName(Contact.ContactContext.REGULAR); } - - return this.name; } public void setName(@Nullable String name) {