11package com.simplemobiletools.contacts.pro.adapters
22
3+ import android.annotation.SuppressLint
4+ import android.content.Intent
5+ import android.content.pm.ShortcutInfo
6+ import android.content.pm.ShortcutManager
37import android.graphics.drawable.BitmapDrawable
8+ import android.graphics.drawable.Drawable
9+ import android.graphics.drawable.Icon
10+ import android.graphics.drawable.LayerDrawable
411import android.util.TypedValue
512import android.view.Menu
613import android.view.View
@@ -15,16 +22,14 @@ import com.bumptech.glide.signature.ObjectKey
1522import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
1623import com.simplemobiletools.commons.dialogs.ConfirmationDialog
1724import com.simplemobiletools.commons.dialogs.RadioGroupDialog
18- import com.simplemobiletools.commons.extensions.beVisibleIf
19- import com.simplemobiletools.commons.extensions.getTextSize
20- import com.simplemobiletools.commons.extensions.highlightTextFromNumbers
21- import com.simplemobiletools.commons.extensions.highlightTextPart
25+ import com.simplemobiletools.commons.extensions.*
2226import com.simplemobiletools.commons.helpers.*
2327import com.simplemobiletools.commons.models.RadioItem
2428import com.simplemobiletools.commons.views.FastScroller
2529import com.simplemobiletools.commons.views.MyRecyclerView
2630import com.simplemobiletools.contacts.pro.R
2731import com.simplemobiletools.contacts.pro.activities.SimpleActivity
32+ import com.simplemobiletools.contacts.pro.activities.ViewContactActivity
2833import com.simplemobiletools.contacts.pro.dialogs.CreateNewGroupDialog
2934import com.simplemobiletools.contacts.pro.extensions.*
3035import com.simplemobiletools.contacts.pro.helpers.*
@@ -66,6 +71,7 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
6671 findItem(R .id.cab_delete).isVisible = location == LOCATION_CONTACTS_TAB || location == LOCATION_GROUP_CONTACTS
6772 findItem(R .id.cab_select_all).isVisible = location != LOCATION_DIALPAD
6873 findItem(R .id.cab_share).isVisible = location != LOCATION_DIALPAD
74+ findItem(R .id.cab_create_shortcut).isVisible = isOreoPlus() && isOneItemSelected() && (location == LOCATION_FAVORITES_TAB || location == LOCATION_CONTACTS_TAB )
6975
7076 if (location == LOCATION_GROUP_CONTACTS ) {
7177 findItem(R .id.cab_remove).title = activity.getString(R .string.remove_from_group)
@@ -86,6 +92,7 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
8692 R .id.cab_share -> shareContacts()
8793 R .id.cab_send_sms_to_contacts -> sendSMSToContacts()
8894 R .id.cab_send_email_to_contacts -> sendEmailToContacts()
95+ R .id.cab_create_shortcut -> createShortcut()
8996 R .id.cab_remove -> removeContacts()
9097 R .id.cab_delete -> askConfirmDelete()
9198 }
@@ -253,6 +260,71 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
253260 activity.sendEmailToContacts(getSelectedItems())
254261 }
255262
263+ @SuppressLint(" NewApi" )
264+ private fun createShortcut () {
265+ val manager = activity.getSystemService(ShortcutManager ::class .java)
266+ if (manager.isRequestPinShortcutSupported) {
267+ val contact = getSelectedItems().first()
268+ val drawable = resources.getDrawable(R .drawable.shortcut_contact).mutate()
269+ getShortcutImage(contact, drawable) {
270+ val intent = Intent (activity, ViewContactActivity ::class .java)
271+ intent.action = Intent .ACTION_VIEW
272+ intent.putExtra(CONTACT_ID , contact.id)
273+ intent.putExtra(IS_PRIVATE , contact.isPrivate())
274+ intent.flags = intent.flags or Intent .FLAG_ACTIVITY_NEW_TASK or Intent .FLAG_ACTIVITY_CLEAR_TASK or Intent .FLAG_ACTIVITY_NO_HISTORY
275+
276+ val shortcut = ShortcutInfo .Builder (activity, contact.hashCode().toString())
277+ .setShortLabel(contact.getNameToDisplay())
278+ .setIcon(Icon .createWithBitmap(drawable.convertToBitmap()))
279+ .setIntent(intent)
280+ .build()
281+
282+ manager.requestPinShortcut(shortcut, null )
283+ }
284+ }
285+ }
286+
287+ private fun getShortcutImage (contact : Contact , drawable : Drawable , callback : () -> Unit ) {
288+ val appIconColor = baseConfig.appIconColor
289+ (drawable as LayerDrawable ).findDrawableByLayerId(R .id.shortcut_contact_background).applyColorFilter(appIconColor)
290+ val placeholderImage = BitmapDrawable (resources, SimpleContactsHelper (activity).getContactLetterIcon(contact.getNameToDisplay()))
291+ if (contact.photoUri.isEmpty() && contact.photo == null ) {
292+ drawable.setDrawableByLayerId(R .id.shortcut_contact_image, placeholderImage)
293+ callback()
294+ } else {
295+ ensureBackgroundThread {
296+ val options = RequestOptions ()
297+ .signature(ObjectKey (contact.getSignatureKey()))
298+ .diskCacheStrategy(DiskCacheStrategy .RESOURCE )
299+ .error(placeholderImage)
300+
301+ val size = activity.resources.getDimension(R .dimen.shortcut_size).toInt()
302+ val itemToLoad: Any? = if (contact.photoUri.isNotEmpty()) {
303+ contact.photoUri
304+ } else {
305+ contact.photo
306+ }
307+
308+ val builder = Glide .with (activity)
309+ .asDrawable()
310+ .load(itemToLoad)
311+ .apply (options)
312+ .apply (RequestOptions .circleCropTransform())
313+ .into(size, size)
314+
315+ try {
316+ val bitmap = builder.get()
317+ drawable.setDrawableByLayerId(R .id.shortcut_contact_image, bitmap)
318+ } catch (e: Exception ) {
319+ }
320+
321+ activity.runOnUiThread {
322+ callback()
323+ }
324+ }
325+ }
326+ }
327+
256328 private fun getSelectedItems () = contactItems.filter { selectedKeys.contains(it.id) } as ArrayList <Contact >
257329
258330 override fun onViewRecycled (holder : ViewHolder ) {
0 commit comments