Using ShortcutManagerCompat, got rid of Compatibility layer

This commit is contained in:
Sylvain Berfini 2022-05-16 15:25:47 +02:00
parent 4218c5b2a9
commit 363322485e
8 changed files with 41 additions and 69 deletions

View file

@ -64,6 +64,7 @@ import org.linphone.databinding.MainActivityBinding
import org.linphone.utils.AppUtils
import org.linphone.utils.Event
import org.linphone.utils.FileUtils
import org.linphone.utils.ShortcutsHelper
class MainActivity : GenericActivity(), SnackBarActivity, NavController.OnDestinationChangedListener {
private lateinit var binding: MainActivityBinding
@ -74,9 +75,9 @@ class MainActivity : GenericActivity(), SnackBarActivity, NavController.OnDestin
override fun onContactsUpdated() {
Log.i("[Main Activity] Contact(s) updated, update shortcuts")
if (corePreferences.contactsShortcuts) {
Compatibility.createShortcutsToContacts(this@MainActivity)
ShortcutsHelper.createShortcutsToContacts(this@MainActivity)
} else if (corePreferences.chatRoomShortcuts) {
Compatibility.createShortcutsToChatRooms(this@MainActivity)
ShortcutsHelper.createShortcutsToChatRooms(this@MainActivity)
}
}
}

View file

@ -29,10 +29,10 @@ import org.linphone.R
import org.linphone.activities.main.chat.viewmodels.ChatRoomsListViewModel
import org.linphone.activities.main.settings.viewmodels.ChatSettingsViewModel
import org.linphone.activities.navigateToEmptySetting
import org.linphone.compatibility.Compatibility
import org.linphone.databinding.SettingsChatFragmentBinding
import org.linphone.mediastream.Version
import org.linphone.utils.Event
import org.linphone.utils.ShortcutsHelper
class ChatSettingsFragment : GenericSettingFragment<SettingsChatFragmentBinding>() {
private lateinit var viewModel: ChatSettingsViewModel
@ -55,9 +55,9 @@ class ChatSettingsFragment : GenericSettingFragment<SettingsChatFragmentBinding>
) {
it.consume { newValue ->
if (newValue) {
Compatibility.createShortcutsToChatRooms(requireContext())
ShortcutsHelper.createShortcutsToChatRooms(requireContext())
} else {
Compatibility.removeShortcuts(requireContext())
ShortcutsHelper.removeShortcuts(requireContext())
}
}
}

View file

@ -30,11 +30,11 @@ import org.linphone.activities.main.settings.SettingListenerStub
import org.linphone.activities.main.settings.viewmodels.ContactsSettingsViewModel
import org.linphone.activities.navigateToEmptySetting
import org.linphone.activities.navigateToLdapSettings
import org.linphone.compatibility.Compatibility
import org.linphone.core.tools.Log
import org.linphone.databinding.SettingsContactsFragmentBinding
import org.linphone.utils.Event
import org.linphone.utils.PermissionHelper
import org.linphone.utils.ShortcutsHelper
class ContactsSettingsFragment : GenericSettingFragment<SettingsContactsFragmentBinding>() {
private lateinit var viewModel: ContactsSettingsViewModel
@ -57,11 +57,11 @@ class ContactsSettingsFragment : GenericSettingFragment<SettingsContactsFragment
) {
it.consume { newValue ->
if (newValue) {
Compatibility.createShortcutsToContacts(requireContext())
ShortcutsHelper.createShortcutsToContacts(requireContext())
} else {
Compatibility.removeShortcuts(requireContext())
ShortcutsHelper.removeShortcuts(requireContext())
if (corePreferences.chatRoomShortcuts) {
Compatibility.createShortcutsToChatRooms(requireContext())
ShortcutsHelper.createShortcutsToChatRooms(requireContext())
}
}
}

View file

@ -21,7 +21,6 @@ package org.linphone.compatibility
import android.Manifest
import android.annotation.SuppressLint
import android.annotation.TargetApi
import android.app.Activity
import android.app.Notification
import android.app.PendingIntent

View file

@ -25,7 +25,6 @@ import android.bluetooth.BluetoothAdapter
import android.content.Context
import android.os.Build
import android.provider.Settings
import org.linphone.utils.ShortcutsHelper
@TargetApi(25)
class Api25Compatibility {
@ -50,17 +49,5 @@ class Api25Compatibility {
}
return name
}
fun createShortcutsToContacts(context: Context) {
ShortcutsHelper.createShortcutsToContacts(context)
}
fun createShortcutsToChatRooms(context: Context) {
ShortcutsHelper.createShortcutsToChatRooms(context)
}
fun removeShortcuts(context: Context) {
ShortcutsHelper.removeShortcuts(context)
}
}
}

View file

@ -273,28 +273,8 @@ class Compatibility {
}
}
/* Contacts */
fun createShortcutsToContacts(context: Context) {
if (Version.sdkAboveOrEqual(Version.API25_NOUGAT_71)) {
Api25Compatibility.createShortcutsToContacts(context)
}
}
fun removeShortcuts(context: Context) {
if (Version.sdkAboveOrEqual(Version.API25_NOUGAT_71)) {
Api25Compatibility.removeShortcuts(context)
}
}
/* Chat */
fun createShortcutsToChatRooms(context: Context) {
if (Version.sdkAboveOrEqual(Version.API25_NOUGAT_71)) {
Api25Compatibility.createShortcutsToChatRooms(context)
}
}
fun removeChatRoomShortcut(context: Context, chatRoom: ChatRoom) {
if (Version.sdkAboveOrEqual(Version.API30_ANDROID_11)) {
Api30Compatibility.removeChatRoomShortcut(context, chatRoom)

View file

@ -49,10 +49,7 @@ import org.linphone.contact.getPerson
import org.linphone.contact.getThumbnailUri
import org.linphone.core.*
import org.linphone.core.tools.Log
import org.linphone.utils.AppUtils
import org.linphone.utils.FileUtils
import org.linphone.utils.ImageUtils
import org.linphone.utils.LinphoneUtils
import org.linphone.utils.*
class Notifiable(val notificationId: Int) {
val messages: ArrayList<NotifiableMessage> = arrayListOf()
@ -163,8 +160,12 @@ class NotificationsManager(private val context: Context) {
}
if (corePreferences.chatRoomShortcuts) {
Log.i("[Notifications Manager] Ensure chat room shortcut exists for bubble notification")
Compatibility.createShortcutsToChatRooms(context)
if (ShortcutsHelper.isShortcutToChatRoomAlreadyCreated(context, room)) {
Log.i("[Notifications Manager] Chat room shortcut already exists")
} else {
Log.i("[Notifications Manager] Ensure chat room shortcut exists for bubble notification")
ShortcutsHelper.createShortcutsToChatRooms(context)
}
}
displayIncomingChatNotification(room, message)
}

View file

@ -23,12 +23,12 @@ import android.annotation.TargetApi
import android.content.Context
import android.content.Intent
import android.content.pm.ShortcutInfo
import android.content.pm.ShortcutManager
import android.os.Bundle
import androidx.collection.ArraySet
import androidx.core.app.Person
import androidx.core.content.LocusIdCompat
import androidx.core.content.pm.ShortcutInfoCompat
import androidx.core.content.pm.ShortcutManagerCompat
import androidx.core.graphics.drawable.IconCompat
import kotlin.math.min
import org.linphone.LinphoneApplication.Companion.coreContext
@ -45,14 +45,13 @@ import org.linphone.mediastream.Version
class ShortcutsHelper(val context: Context) {
companion object {
fun createShortcutsToContacts(context: Context) {
val shortcuts = ArrayList<ShortcutInfo>()
val shortcutManager = context.getSystemService(ShortcutManager::class.java)
if (shortcutManager.isRateLimitingActive) {
val shortcuts = ArrayList<ShortcutInfoCompat>()
if (ShortcutManagerCompat.isRateLimitingActive(context)) {
Log.e("[Shortcut Helper] Rate limiting is active, aborting")
return
}
val maxShortcuts = shortcutManager.maxShortcutCountPerActivity
val maxShortcuts = min(ShortcutManagerCompat.getMaxShortcutCountPerActivity(context), 5)
var count = 0
val processedAddresses = arrayListOf<String>()
for (room in coreContext.core.chatRooms) {
@ -82,7 +81,7 @@ class ShortcutsHelper(val context: Context) {
coreContext.contactsManager.findContactByAddress(address)
if (contact != null && contact.refKey != null) {
val shortcut: ShortcutInfo? = createContactShortcut(context, contact)
val shortcut: ShortcutInfoCompat? = createContactShortcut(context, contact)
if (shortcut != null) {
Log.i("[Shortcut Helper] Creating launcher shortcut for ${shortcut.shortLabel}")
shortcuts.add(shortcut)
@ -94,10 +93,10 @@ class ShortcutsHelper(val context: Context) {
}
}
}
shortcutManager.dynamicShortcuts = shortcuts
ShortcutManagerCompat.setDynamicShortcuts(context, shortcuts)
}
private fun createContactShortcut(context: Context, contact: Friend): ShortcutInfo? {
private fun createContactShortcut(context: Context, contact: Friend): ShortcutInfoCompat? {
try {
val categories: ArraySet<String> = ArraySet()
categories.add(ShortcutInfo.SHORTCUT_CATEGORY_CONVERSATION)
@ -116,7 +115,7 @@ class ShortcutsHelper(val context: Context) {
.setPerson(person)
.setCategories(categories)
.setIntent(intent)
.build().toShortcutInfo()
.build()
} catch (e: Exception) {
Log.e("[Shortcuts Helper] createContactShortcut for contact [${contact.name}] exception: $e")
}
@ -125,15 +124,13 @@ class ShortcutsHelper(val context: Context) {
}
fun createShortcutsToChatRooms(context: Context) {
val shortcuts = ArrayList<ShortcutInfo>()
val shortcutManager = context.getSystemService(ShortcutManager::class.java)
if (shortcutManager.isRateLimitingActive) {
val shortcuts = ArrayList<ShortcutInfoCompat>()
if (ShortcutManagerCompat.isRateLimitingActive(context)) {
Log.e("[Shortcut Helper] Rate limiting is active, aborting")
return
}
Log.i("[Shortcut Helper] Creating launcher shortcuts for chat rooms")
val maxShortcuts = min(shortcutManager.maxShortcutCountPerActivity, 5)
val maxShortcuts = min(ShortcutManagerCompat.getMaxShortcutCountPerActivity(context), 5)
var count = 0
for (room in coreContext.core.chatRooms) {
// Android can usually only have around 4-5 shortcuts at a time
@ -142,18 +139,18 @@ class ShortcutsHelper(val context: Context) {
break
}
val shortcut: ShortcutInfo? = createChatRoomShortcut(context, room)
val shortcut: ShortcutInfoCompat? = createChatRoomShortcut(context, room)
if (shortcut != null) {
Log.i("[Shortcut Helper] Created launcher shortcut for ${shortcut.shortLabel}")
shortcuts.add(shortcut)
count += 1
}
}
shortcutManager.dynamicShortcuts = shortcuts
ShortcutManagerCompat.setDynamicShortcuts(context, shortcuts)
Log.i("[Shortcut Helper] Created $count launcher shortcuts")
}
private fun createChatRoomShortcut(context: Context, chatRoom: ChatRoom): ShortcutInfo? {
private fun createChatRoomShortcut(context: Context, chatRoom: ChatRoom): ShortcutInfoCompat? {
val localAddress = chatRoom.localAddress.asStringUriOnly()
val peerAddress = chatRoom.peerAddress.asStringUriOnly()
val id = LinphoneUtils.getChatRoomId(chatRoom.localAddress, chatRoom.peerAddress)
@ -219,7 +216,7 @@ class ShortcutsHelper(val context: Context) {
.setIntent(intent)
.setLongLived(Version.sdkAboveOrEqual(Version.API30_ANDROID_11))
.setLocusId(LocusIdCompat(id))
.build().toShortcutInfo()
.build()
} catch (e: Exception) {
Log.e("[Shortcuts Helper] createChatRoomShortcut for id [$id] exception: $e")
}
@ -229,8 +226,15 @@ class ShortcutsHelper(val context: Context) {
fun removeShortcuts(context: Context) {
Log.w("[Shortcut Helper] Removing all contacts shortcuts")
val shortcutManager = context.getSystemService(ShortcutManager::class.java)
shortcutManager.removeAllDynamicShortcuts()
ShortcutManagerCompat.removeAllDynamicShortcuts(context)
}
fun isShortcutToChatRoomAlreadyCreated(context: Context, chatRoom: ChatRoom): Boolean {
val id = LinphoneUtils.getChatRoomId(chatRoom.localAddress, chatRoom.peerAddress)
val found = ShortcutManagerCompat.getDynamicShortcuts(context).find {
it.id == id
}
return found != null
}
}
}