Skip to content

Commit f359e41

Browse files
committed
allow creating contact shortcuts
1 parent 703b374 commit f359e41

File tree

3 files changed

+93
-4
lines changed

3 files changed

+93
-4
lines changed

app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt

Lines changed: 76 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
package 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
37
import android.graphics.drawable.BitmapDrawable
8+
import android.graphics.drawable.Drawable
9+
import android.graphics.drawable.Icon
10+
import android.graphics.drawable.LayerDrawable
411
import android.util.TypedValue
512
import android.view.Menu
613
import android.view.View
@@ -15,16 +22,14 @@ import com.bumptech.glide.signature.ObjectKey
1522
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
1623
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
1724
import 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.*
2226
import com.simplemobiletools.commons.helpers.*
2327
import com.simplemobiletools.commons.models.RadioItem
2428
import com.simplemobiletools.commons.views.FastScroller
2529
import com.simplemobiletools.commons.views.MyRecyclerView
2630
import com.simplemobiletools.contacts.pro.R
2731
import com.simplemobiletools.contacts.pro.activities.SimpleActivity
32+
import com.simplemobiletools.contacts.pro.activities.ViewContactActivity
2833
import com.simplemobiletools.contacts.pro.dialogs.CreateNewGroupDialog
2934
import com.simplemobiletools.contacts.pro.extensions.*
3035
import 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) {
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
3+
<item android:id="@+id/shortcut_contact_background">
4+
<shape android:shape="oval">
5+
<solid android:color="@color/color_primary" />
6+
</shape>
7+
</item>
8+
9+
<item
10+
android:id="@+id/shortcut_contact_image"
11+
android:drawable="@drawable/ic_person_vector" />
12+
13+
</layer-list>

app/src/main/res/menu/cab.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@
3131
android:icon="@drawable/ic_email_vector"
3232
android:title="@string/send_email_to_contacts"
3333
app:showAsAction="ifRoom" />
34+
<item
35+
android:id="@+id/cab_create_shortcut"
36+
android:title="@string/create_shortcut"
37+
app:showAsAction="never" />
3438
<item
3539
android:id="@+id/cab_select_all"
3640
android:icon="@drawable/ic_select_all_vector"

0 commit comments

Comments
 (0)