From df65b3d0578183a2aa5e5a2de2ed32b8a3fc088b Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 27 Oct 2020 11:24:09 +0100 Subject: [PATCH] add some WhatsApp actions on clicking at contacts WhatsApp --- .../pro/activities/ViewContactActivity.kt | 20 +++++++++- .../pro/dialogs/ChooseSocialDialog.kt | 38 +++++++++++++++++++ .../contacts/pro/extensions/Context.kt | 36 +++++++++++++++--- .../contacts/pro/helpers/Constants.kt | 4 ++ .../contacts/pro/models/SocialAction.kt | 3 ++ .../main/res/layout/dialog_choose_social.xml | 6 +++ .../main/res/layout/item_choose_social.xml | 33 ++++++++++++++++ 7 files changed, 134 insertions(+), 6 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ChooseSocialDialog.kt create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/SocialAction.kt create mode 100644 app/src/main/res/layout/dialog_choose_social.xml create mode 100644 app/src/main/res/layout/item_choose_social.xml diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index 396dca28..3ae65659 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -1,5 +1,6 @@ package com.simplemobiletools.contacts.pro.activities +import android.content.ContentUris import android.content.Intent import android.graphics.Color import android.graphics.drawable.ColorDrawable @@ -16,6 +17,7 @@ import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS import com.simplemobiletools.commons.helpers.ensureBackgroundThread import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.dialogs.CallConfirmationDialog +import com.simplemobiletools.contacts.pro.dialogs.ChooseSocialDialog import com.simplemobiletools.contacts.pro.extensions.* import com.simplemobiletools.contacts.pro.helpers.* import com.simplemobiletools.contacts.pro.models.* @@ -539,7 +541,7 @@ class ViewContactActivity : ContactActivity() { contact_source_image.setImageResource(R.drawable.ic_logo_whatsapp) contact_source_image.beVisible() contact_source_image.setOnClickListener { - + showWhatsAppActions() } } } @@ -587,6 +589,22 @@ class ViewContactActivity : ContactActivity() { } } + private fun showWhatsAppActions() { + ensureBackgroundThread { + val actions = getWhatsAppActions(contact!!.id) + runOnUiThread { + ChooseSocialDialog(this@ViewContactActivity, actions) { action -> + Intent(Intent.ACTION_VIEW).apply { + val uri = ContentUris.withAppendedId(ContactsContract.Data.CONTENT_URI, action.dataId) + setDataAndType(uri, action.mimetype) + flags = Intent.FLAG_ACTIVITY_CLEAR_TASK + startActivity(this) + } + } + } + } + } + private fun getDuplicateContacts(callback: () -> Unit) { ContactsHelper(this).getDuplicatesOfContact(contact!!, false) { contacts -> ensureBackgroundThread { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ChooseSocialDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ChooseSocialDialog.kt new file mode 100644 index 00000000..51283e35 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ChooseSocialDialog.kt @@ -0,0 +1,38 @@ +package com.simplemobiletools.contacts.pro.dialogs + +import android.app.Activity +import android.view.ViewGroup +import android.widget.RadioGroup +import android.widget.RelativeLayout +import androidx.appcompat.app.AlertDialog +import com.simplemobiletools.commons.extensions.setupDialogStuff +import com.simplemobiletools.contacts.pro.R +import com.simplemobiletools.contacts.pro.models.SocialAction +import kotlinx.android.synthetic.main.dialog_choose_social.view.* +import kotlinx.android.synthetic.main.item_choose_social.view.* + +class ChooseSocialDialog(val activity: Activity, actions: ArrayList, val callback: (action: SocialAction) -> Unit) { + private lateinit var dialog: AlertDialog + + init { + val view = activity.layoutInflater.inflate(R.layout.dialog_choose_social, null) + actions.sortBy { it.type } + actions.forEach { action -> + val item = (activity.layoutInflater.inflate(R.layout.item_choose_social, null) as RelativeLayout).apply { + item_social_label.text = action.label + setOnClickListener { + callback(action) + dialog.dismiss() + } + } + + view.dialog_choose_social.addView(item, RadioGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)) + } + + val builder = AlertDialog.Builder(activity) + + dialog = builder.create().apply { + activity.setupDialogStuff(view, this) + } + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt index 659e317b..aade643a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt @@ -1,18 +1,14 @@ package com.simplemobiletools.contacts.pro.extensions import android.content.Context -import android.content.Context.AUDIO_SERVICE import android.content.Intent import android.database.Cursor -import android.media.AudioManager import android.net.Uri import android.os.Handler import android.os.Looper import android.provider.ContactsContract import androidx.core.content.FileProvider -import com.simplemobiletools.commons.extensions.getIntValue -import com.simplemobiletools.commons.extensions.hasPermission -import com.simplemobiletools.commons.extensions.toast +import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.* import com.simplemobiletools.contacts.pro.BuildConfig import com.simplemobiletools.contacts.pro.R @@ -25,6 +21,7 @@ import com.simplemobiletools.contacts.pro.interfaces.GroupsDao import com.simplemobiletools.contacts.pro.models.Contact import com.simplemobiletools.contacts.pro.models.ContactSource import com.simplemobiletools.contacts.pro.models.Organization +import com.simplemobiletools.contacts.pro.models.SocialAction import java.io.File val Context.config: Config get() = Config.newInstance(applicationContext) @@ -323,3 +320,32 @@ fun Context.getAllContactSources(): ArrayList { } fun Context.getPrivateContactSource() = ContactSource(SMT_PRIVATE, SMT_PRIVATE, getString(R.string.phone_storage_hidden)) + +fun Context.getWhatsAppActions(id: Int): ArrayList { + val uri = ContactsContract.Data.CONTENT_URI + val projection = arrayOf( + ContactsContract.Data._ID, + ContactsContract.Data.DATA3, + ContactsContract.Data.MIMETYPE + ) + + val socialActions = ArrayList() + var curActionId = 0 + val selection = "${ContactsContract.Data.RAW_CONTACT_ID} = ?" + val selectionArgs = arrayOf(id.toString()) + queryCursor(uri, projection, selection, selectionArgs, null, true) { cursor -> + val mimetype = cursor.getStringValue(ContactsContract.Data.MIMETYPE) + val type = when (mimetype) { + "vnd.android.cursor.item/vnd.com.whatsapp.profile" -> SOCIAL_MESSAGE + "vnd.android.cursor.item/vnd.com.whatsapp.voip.call" -> SOCIAL_VOICE_CALL + "vnd.android.cursor.item/vnd.com.whatsapp.video.call" -> SOCIAL_VIDEO_CALL + else -> return@queryCursor + } + + val label = cursor.getStringValue(ContactsContract.Data.DATA3) + val realID = cursor.getLongValue(ContactsContract.Data._ID) + val socialAction = SocialAction(curActionId++, type, label, mimetype, realID) + socialActions.add(socialAction) + } + return socialActions +} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt index a071b86d..174b5465 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt @@ -109,6 +109,10 @@ const val WHATSAPP_PACKAGE = "com.whatsapp" const val WHATSAPP = "whatsapp" +const val SOCIAL_VOICE_CALL = 0 +const val SOCIAL_VIDEO_CALL = 1 +const val SOCIAL_MESSAGE = 2 + fun getEmptyLocalContact() = LocalContact(0, "", "", "", "", "", "", null, "", ArrayList(), ArrayList(), ArrayList(), 0, ArrayList(), "", ArrayList(), "", "", ArrayList(), ArrayList()) fun getProperText(text: String, shouldNormalize: Boolean) = if (shouldNormalize) text.normalizeString() else text diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/SocialAction.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/SocialAction.kt new file mode 100644 index 00000000..6a5aedc9 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/SocialAction.kt @@ -0,0 +1,3 @@ +package com.simplemobiletools.contacts.pro.models + +data class SocialAction(var actionId: Int, var type: Int, var label: String, var mimetype: String, val dataId: Long) diff --git a/app/src/main/res/layout/dialog_choose_social.xml b/app/src/main/res/layout/dialog_choose_social.xml new file mode 100644 index 00000000..1d3e8840 --- /dev/null +++ b/app/src/main/res/layout/dialog_choose_social.xml @@ -0,0 +1,6 @@ + + diff --git a/app/src/main/res/layout/item_choose_social.xml b/app/src/main/res/layout/item_choose_social.xml new file mode 100644 index 00000000..a4c6a35b --- /dev/null +++ b/app/src/main/res/layout/item_choose_social.xml @@ -0,0 +1,33 @@ + + + + + + + +