diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4e6f2a244..c1b106232 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -46,11 +46,6 @@ - - - diff --git a/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatMessagesListAdapter.kt b/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatMessagesListAdapter.kt index d0ba5800c..f8274f8f7 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatMessagesListAdapter.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatMessagesListAdapter.kt @@ -217,11 +217,13 @@ class ChatMessagesListAdapter( previousList: MutableList, currentList: MutableList ) { + Log.i("[Chat Messages Adapter] List has changed, clearing previous first unread message position") // Need to wait for messages to be added before computing new first unread message position firstUnreadMessagePosition = -1 } override fun displayHeaderForPosition(position: Int): Boolean { + Log.i("[Chat Messages Adapter] Unread message count is [$unreadMessagesCount], first unread message position is [$firstUnreadMessagePosition]") if (unreadMessagesCount > 0 && firstUnreadMessagePosition == -1) { computeFirstUnreadMessagePosition() } @@ -248,18 +250,23 @@ class ChatMessagesListAdapter( } fun setUnreadMessageCount(count: Int, forceUpdate: Boolean) { + Log.i("[Chat Messages Adapter] [$count] unread message in chat room") // Once list has been filled once, don't show the unread message header // when new messages are added to the history whilst it is visible unreadMessagesCount = if (itemCount == 0 || forceUpdate) count else 0 firstUnreadMessagePosition = -1 + Log.i("[Chat Messages Adapter] Set [$unreadMessagesCount] unread message(s) for current chat room") } fun getFirstUnreadMessagePosition(): Int { + Log.i("[Chat Messages Adapter] First unread message position is [$firstUnreadMessagePosition]") return firstUnreadMessagePosition } private fun computeFirstUnreadMessagePosition() { + Log.i("[Chat Messages Adapter] [$unreadMessagesCount] unread message(s) for current chat room") if (unreadMessagesCount > 0) { + Log.i("[Chat Messages Adapter] Computing first unread message position") var messageCount = 0 for (position in itemCount - 1 downTo 0) { val eventLog = getItem(position) @@ -268,6 +275,7 @@ class ChatMessagesListAdapter( messageCount += 1 if (messageCount == unreadMessagesCount) { firstUnreadMessagePosition = position + Log.i("[Chat Messages Adapter] First unread message position found [$firstUnreadMessagePosition]") break } } diff --git a/app/src/main/java/org/linphone/activities/main/conference/fragments/ConferenceWaitingRoomFragment.kt b/app/src/main/java/org/linphone/activities/main/conference/fragments/ConferenceWaitingRoomFragment.kt index f282c96a7..1e7c25d7a 100644 --- a/app/src/main/java/org/linphone/activities/main/conference/fragments/ConferenceWaitingRoomFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/conference/fragments/ConferenceWaitingRoomFragment.kt @@ -29,10 +29,8 @@ import org.linphone.R import org.linphone.activities.GenericFragment import org.linphone.activities.main.MainActivity import org.linphone.activities.main.conference.viewmodels.ConferenceWaitingRoomViewModel -import org.linphone.compatibility.Compatibility import org.linphone.core.tools.Log import org.linphone.databinding.ConferenceWaitingRoomFragmentBinding -import org.linphone.mediastream.Version import org.linphone.utils.PermissionHelper class ConferenceWaitingRoomFragment : GenericFragment() { @@ -173,11 +171,6 @@ class ConferenceWaitingRoomFragment : GenericFragment(permissionsRequiredList.size) permissionsRequiredList.toArray(permissionsRequired) @@ -203,11 +196,6 @@ class ConferenceWaitingRoomFragment : GenericFragment if (grantResults[i] == PackageManager.PERMISSION_GRANTED) { - Log.i( - "[Conference Waiting Room] BLUETOOTH_CONNECT permission has been granted" - ) - } } } } diff --git a/app/src/main/java/org/linphone/activities/voip/CallActivity.kt b/app/src/main/java/org/linphone/activities/voip/CallActivity.kt index ddfc3bce4..089bf912f 100644 --- a/app/src/main/java/org/linphone/activities/voip/CallActivity.kt +++ b/app/src/main/java/org/linphone/activities/voip/CallActivity.kt @@ -284,11 +284,6 @@ class CallActivity : ProximitySensorActivity() { permissionsRequiredList.add(Manifest.permission.CAMERA) } - if (Version.sdkAboveOrEqual(Version.API31_ANDROID_12) && !PermissionHelper.get().hasBluetoothConnectPermission()) { - Log.i("[Call Activity] Asking for BLUETOOTH_CONNECT permission") - permissionsRequiredList.add(Compatibility.BLUETOOTH_CONNECT) - } - if (permissionsRequiredList.isNotEmpty()) { val permissionsRequired = arrayOfNulls(permissionsRequiredList.size) permissionsRequiredList.toArray(permissionsRequired) @@ -313,9 +308,6 @@ class CallActivity : ProximitySensorActivity() { coreContext.core.reloadVideoDevices() controlsViewModel.toggleVideo() } - Compatibility.BLUETOOTH_CONNECT -> if (grantResults[i] == PackageManager.PERMISSION_GRANTED) { - Log.i("[Call Activity] BLUETOOTH_CONNECT permission has been granted") - } Manifest.permission.WRITE_EXTERNAL_STORAGE -> if (grantResults[i] == PackageManager.PERMISSION_GRANTED) { Log.i( "[Call Activity] WRITE_EXTERNAL_STORAGE permission has been granted, taking snapshot" diff --git a/app/src/main/java/org/linphone/compatibility/Api31Compatibility.kt b/app/src/main/java/org/linphone/compatibility/Api31Compatibility.kt index 1afb8cfbf..e91b57f4c 100644 --- a/app/src/main/java/org/linphone/compatibility/Api31Compatibility.kt +++ b/app/src/main/java/org/linphone/compatibility/Api31Compatibility.kt @@ -19,7 +19,6 @@ */ package org.linphone.compatibility -import android.Manifest import android.annotation.TargetApi import android.app.* import android.content.Context @@ -302,9 +301,5 @@ class Api31Compatibility { } } } - - fun hasBluetoothConnectPermission(context: Context): Boolean { - return Compatibility.hasPermission(context, Manifest.permission.BLUETOOTH_CONNECT) - } } } diff --git a/app/src/main/java/org/linphone/compatibility/Compatibility.kt b/app/src/main/java/org/linphone/compatibility/Compatibility.kt index c1bd96a85..6598378ec 100644 --- a/app/src/main/java/org/linphone/compatibility/Compatibility.kt +++ b/app/src/main/java/org/linphone/compatibility/Compatibility.kt @@ -50,8 +50,6 @@ import org.linphone.telecom.NativeCallWrapper @Suppress("DEPRECATION") class Compatibility { companion object { - const val BLUETOOTH_CONNECT = "android.permission.BLUETOOTH_CONNECT" - fun hasPermission(context: Context, permission: String): Boolean { return Api23Compatibility.hasPermission(context, permission) } @@ -74,13 +72,6 @@ class Compatibility { } } - fun hasBluetoothConnectPermission(context: Context): Boolean { - if (Version.sdkAboveOrEqual(Version.API31_ANDROID_12)) { - return Api31Compatibility.hasBluetoothConnectPermission(context) - } - return true - } - // See https://developer.android.com/about/versions/11/privacy/permissions#phone-numbers fun hasTelecomManagerPermissions(context: Context): Boolean { return if (Version.sdkAboveOrEqual(Version.API30_ANDROID_11)) { diff --git a/app/src/main/java/org/linphone/core/CoreContext.kt b/app/src/main/java/org/linphone/core/CoreContext.kt index 0306baef6..b6dc6c77c 100644 --- a/app/src/main/java/org/linphone/core/CoreContext.kt +++ b/app/src/main/java/org/linphone/core/CoreContext.kt @@ -24,6 +24,9 @@ import android.content.Context import android.content.Intent import android.content.SharedPreferences import android.graphics.PixelFormat +import android.media.AudioDeviceCallback +import android.media.AudioDeviceInfo +import android.media.AudioManager import android.os.Handler import android.os.Looper import android.security.keystore.KeyGenParameterSpec @@ -348,6 +351,22 @@ class CoreContext( Log.i("[Context] Ready") } + private val audioDeviceCallback = object : AudioDeviceCallback() { + override fun onAudioDevicesAdded(addedDevices: Array?) { + if (!addedDevices.isNullOrEmpty()) { + Log.i("[Context] [${addedDevices.size}] new device(s) have been added") + core.reloadSoundDevices() + } + } + + override fun onAudioDevicesRemoved(removedDevices: Array?) { + if (!removedDevices.isNullOrEmpty()) { + Log.i("[Context] [${removedDevices.size}] existing device(s) have been removed") + core.reloadSoundDevices() + } + } + } + fun start() { Log.i("[Context] Starting") @@ -397,6 +416,9 @@ class CoreContext( } _lifecycleRegistry.currentState = Lifecycle.State.RESUMED + + val audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager + audioManager.registerAudioDeviceCallback(audioDeviceCallback, handler) Log.i("[Context] Started") } @@ -415,6 +437,9 @@ class CoreContext( TelecomHelper.destroy() } + val audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager + audioManager.unregisterAudioDeviceCallback(audioDeviceCallback) + core.stop() core.removeListener(listener) stopped = true diff --git a/app/src/main/java/org/linphone/utils/PermissionHelper.kt b/app/src/main/java/org/linphone/utils/PermissionHelper.kt index e8ab6599e..e50e7d04c 100644 --- a/app/src/main/java/org/linphone/utils/PermissionHelper.kt +++ b/app/src/main/java/org/linphone/utils/PermissionHelper.kt @@ -76,10 +76,6 @@ class PermissionHelper private constructor(private val context: Context) { return hasPermission(Manifest.permission.RECORD_AUDIO) } - fun hasBluetoothConnectPermission(): Boolean { - return Compatibility.hasBluetoothConnectPermission(context) - } - fun hasPostNotificationsPermission(): Boolean { return Compatibility.hasPostNotificationsPermission(context) }