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)
}