allow creating home screen shortcuts of contacts for quick call

This commit is contained in:
tibbi 2020-05-13 21:02:10 +02:00
parent cadc587f6b
commit b38b4f1046
3 changed files with 93 additions and 4 deletions

View File

@ -1,5 +1,13 @@
package com.simplemobiletools.dialer.adapters
import android.annotation.SuppressLint
import android.content.Intent
import android.content.pm.ShortcutInfo
import android.content.pm.ShortcutManager
import android.graphics.Bitmap
import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.Icon
import android.net.Uri
import android.util.TypedValue
import android.view.Menu
import android.view.View
@ -8,14 +16,16 @@ import android.widget.FrameLayout
import android.widget.ImageView
import android.widget.TextView
import com.bumptech.glide.Glide
import com.bumptech.glide.load.DecodeFormat
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.request.RequestOptions
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.extensions.getAdjustedPrimaryColor
import com.simplemobiletools.commons.extensions.getTextSize
import com.simplemobiletools.commons.extensions.highlightTextFromNumbers
import com.simplemobiletools.commons.extensions.highlightTextPart
import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CONTACTS
import com.simplemobiletools.commons.helpers.SimpleContactsHelper
import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.SimpleContact
import com.simplemobiletools.commons.views.MyRecyclerView
import com.simplemobiletools.dialer.R
@ -33,9 +43,13 @@ class ContactsAdapter(activity: SimpleActivity, var contacts: ArrayList<SimpleCo
setupDragListener(true)
}
override fun getActionMenuId() = R.menu.cab_delete_only
override fun getActionMenuId() = R.menu.cab_contacts
override fun prepareActionMode(menu: Menu) {}
override fun prepareActionMode(menu: Menu) {
menu.apply {
findItem(R.id.cab_create_shortcut).isVisible = isOneItemSelected() && isOreoPlus()
}
}
override fun actionItemPressed(id: Int) {
if (selectedKeys.isEmpty()) {
@ -44,6 +58,7 @@ class ContactsAdapter(activity: SimpleActivity, var contacts: ArrayList<SimpleCo
when (id) {
R.id.cab_delete -> askConfirmDelete()
R.id.cab_create_shortcut -> createShortcut()
}
}
@ -126,6 +141,60 @@ class ContactsAdapter(activity: SimpleActivity, var contacts: ArrayList<SimpleCo
private fun getSelectedItems() = contacts.filter { selectedKeys.contains(it.rawId) } as ArrayList<SimpleContact>
@SuppressLint("NewApi")
private fun createShortcut() {
val contact = contacts.firstOrNull { selectedKeys.contains(it.rawId) } ?: return
val manager = activity.getSystemService(ShortcutManager::class.java)!!
if (manager.isRequestPinShortcutSupported) {
getShortcutImage(contact.photoUri, contact.name) { image ->
activity.handlePermission(PERMISSION_CALL_PHONE) { hasPermission ->
val action = if (hasPermission) Intent.ACTION_CALL else Intent.ACTION_DIAL
val intent = Intent(action).apply {
data = Uri.fromParts("tel", contact.phoneNumber, null)
}
val shortcut = ShortcutInfo.Builder(activity, contact.hashCode().toString())
.setShortLabel(contact.name)
.setIcon(Icon.createWithBitmap(image))
.setIntent(intent)
.build()
manager.requestPinShortcut(shortcut, null)
}
}
}
}
private fun getShortcutImage(path: String, placeholderName: String, callback: (image: Bitmap) -> Unit) {
ensureBackgroundThread {
val placeholder = BitmapDrawable(activity.resources, SimpleContactsHelper(activity).getContactLetterIcon(placeholderName))
try {
val options = RequestOptions()
.format(DecodeFormat.PREFER_ARGB_8888)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.error(placeholder)
.centerCrop()
val size = resources.getDimension(R.dimen.shortcut_size).toInt()
val bitmap = Glide.with(activity).asBitmap()
.load(path)
.placeholder(placeholder)
.apply(options)
.apply(RequestOptions.circleCropTransform())
.into(size, size)
.get()
activity.runOnUiThread {
callback(bitmap)
}
} catch (ignored: Exception) {
activity.runOnUiThread {
callback(placeholder.bitmap)
}
}
}
}
override fun onViewRecycled(holder: ViewHolder) {
super.onViewRecycled(holder)
if (!activity.isDestroyed && !activity.isFinishing) {

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/shortcut_image"
android:drawable="@mipmap/ic_launcher" />
</layer-list>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/cab_delete"
android:icon="@drawable/ic_delete_vector"
android:title="@string/delete"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/cab_create_shortcut"
android:title="@string/create_shortcut"
app:showAsAction="never" />
</menu>