From 757c0fd2ea3aaa967fc8e40daac493c06f00811a Mon Sep 17 00:00:00 2001 From: Ehren Kret Date: Wed, 15 May 2024 09:21:59 -0500 Subject: [PATCH] create video call mimetype for raw contacts links --- app/src/main/AndroidManifest.xml | 8 ++++- .../jobs/SyncSystemContactLinksJob.kt | 29 ++++++++++--------- .../securesms/webrtc/VoiceCallShare.java | 8 ++++- app/src/main/res/values/strings.xml | 3 +- app/src/main/res/xml/contactsformat.xml | 5 ++++ .../contacts/ContactLinkConfiguration.kt | 2 ++ .../contacts/SystemContactsRepository.kt | 10 +++++++ 7 files changed, 49 insertions(+), 16 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a74e94c4d5..745ce113b3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -947,12 +947,18 @@ android:launchMode="singleTask" android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"> - + + + + + + + context.getString(R.string.ContactsDatabase_message_s, e164) }, - callPrompt = { e164 -> context.getString(R.string.ContactsDatabase_signal_call_s, e164) }, - e164Formatter = { number -> PhoneNumberFormatter.get(context).format(number) }, - messageMimetype = MESSAGE_MIMETYPE, - callMimetype = CALL_MIMETYPE, - syncTag = CONTACT_TAG - ) - } - class Factory : Job.Factory { override fun create(parameters: Parameters, serializedData: ByteArray?) = SyncSystemContactLinksJob(parameters) } @@ -110,6 +97,22 @@ class SyncSystemContactLinksJob private constructor(parameters: Parameters) : Ba private const val MESSAGE_MIMETYPE = "vnd.android.cursor.item/vnd.org.thoughtcrime.securesms.contact" private const val CALL_MIMETYPE = "vnd.android.cursor.item/vnd.org.thoughtcrime.securesms.call" + private const val VIDEO_CALL_MIMETYPE = "vnd.android.cursor.item/vnd.org.thoughtcrime.securesms.videocall" private const val CONTACT_TAG = "__TS" + + fun buildContactLinkConfiguration(context: Context, account: Account): ContactLinkConfiguration { + return ContactLinkConfiguration( + account = account, + appName = context.getString(R.string.app_name), + messagePrompt = { e164 -> context.getString(R.string.ContactsDatabase_message_s, e164) }, + callPrompt = { e164 -> context.getString(R.string.ContactsDatabase_signal_call_s, e164) }, + videoCallPrompt = { e164 -> context.getString(R.string.ContactsDatabase_signal_video_call_s, e164) }, + e164Formatter = { number -> PhoneNumberFormatter.get(context).format(number) }, + messageMimetype = MESSAGE_MIMETYPE, + callMimetype = CALL_MIMETYPE, + videoCallMimetype = VIDEO_CALL_MIMETYPE, + syncTag = CONTACT_TAG + ) + } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/webrtc/VoiceCallShare.java b/app/src/main/java/org/thoughtcrime/securesms/webrtc/VoiceCallShare.java index e54e8c1b84..50adc4f5c5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/webrtc/VoiceCallShare.java +++ b/app/src/main/java/org/thoughtcrime/securesms/webrtc/VoiceCallShare.java @@ -16,6 +16,8 @@ import org.signal.core.util.concurrent.SimpleTask; public class VoiceCallShare extends Activity { private static final String TAG = Log.tag(VoiceCallShare.class); + + private static final String VIDEO_CALL_MIME_TYPE = "vnd.android.cursor.item/vnd.org.thoughtcrime.securesms.videocall"; @Override public void onCreate(Bundle icicle) { @@ -32,7 +34,11 @@ public class VoiceCallShare extends Activity { SimpleTask.run(() -> Recipient.external(this, destination), recipient -> { if (!TextUtils.isEmpty(destination)) { - ApplicationDependencies.getSignalCallManager().startOutgoingAudioCall(recipient); + if (VIDEO_CALL_MIME_TYPE.equals(getIntent().getType())) { + ApplicationDependencies.getSignalCallManager().startOutgoingVideoCall(recipient); + } else { + ApplicationDependencies.getSignalCallManager().startOutgoingAudioCall(recipient); + } Intent activityIntent = new Intent(this, WebRtcCallActivity.class); activityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c63f4687e2..96d1187385 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -327,7 +327,8 @@ Message %s - Signal Call %s + Signal Voice Call %s + Signal Video Call %s diff --git a/app/src/main/res/xml/contactsformat.xml b/app/src/main/res/xml/contactsformat.xml index f22102f76b..f0eaefa58c 100644 --- a/app/src/main/res/xml/contactsformat.xml +++ b/app/src/main/res/xml/contactsformat.xml @@ -11,4 +11,9 @@ android:mimeType="vnd.android.cursor.item/vnd.org.thoughtcrime.securesms.call" android:summaryColumn="data2" android:detailColumn="data3"/> + diff --git a/contacts/lib/src/main/java/org/signal/contacts/ContactLinkConfiguration.kt b/contacts/lib/src/main/java/org/signal/contacts/ContactLinkConfiguration.kt index 3d32e63e7d..18d1752efc 100644 --- a/contacts/lib/src/main/java/org/signal/contacts/ContactLinkConfiguration.kt +++ b/contacts/lib/src/main/java/org/signal/contacts/ContactLinkConfiguration.kt @@ -17,8 +17,10 @@ class ContactLinkConfiguration( val appName: String, val messagePrompt: (String) -> String, val callPrompt: (String) -> String, + val videoCallPrompt: (String) -> String, val e164Formatter: (String) -> String, val messageMimetype: String, val callMimetype: String, + val videoCallMimetype: String, val syncTag: String ) diff --git a/contacts/lib/src/main/java/org/signal/contacts/SystemContactsRepository.kt b/contacts/lib/src/main/java/org/signal/contacts/SystemContactsRepository.kt index 645d54ba33..43a1092367 100644 --- a/contacts/lib/src/main/java/org/signal/contacts/SystemContactsRepository.kt +++ b/contacts/lib/src/main/java/org/signal/contacts/SystemContactsRepository.kt @@ -526,6 +526,16 @@ object SystemContactsRepository { .withYieldAllowed(true) .build(), + // Data entry for making a video call + ContentProviderOperation.newInsert(dataUri) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, operationIndex) + .withValue(ContactsContract.Data.MIMETYPE, linkConfig.videoCallMimetype) + .withValue(ContactsContract.Data.DATA1, systemContactInfo.displayPhone) + .withValue(ContactsContract.Data.DATA2, linkConfig.appName) + .withValue(ContactsContract.Data.DATA3, linkConfig.videoCallPrompt(systemContactInfo.displayPhone)) + .withYieldAllowed(true) + .build(), + // Ensures that this RawContact entry is shown next to another RawContact entry we found for this contact ContentProviderOperation.newUpdate(ContactsContract.AggregationExceptions.CONTENT_URI) .withValue(ContactsContract.AggregationExceptions.RAW_CONTACT_ID1, systemContactInfo.siblingRawContactId)