diff --git a/CHANGELOG.md b/CHANGELOG.md
index baed65906..63d2480c3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -18,6 +18,7 @@ Group changes to describe their impact on the project, as follows:
- Chat rooms can be individually muted (no notification when receiving a chat message)
- Image & Video in-app viewers allow for full-screen display
- Display name can be set during assistant when creating / logging in a sip.linphone.org account
+- Android 13 support, using new post notifications & media permissions
### Changed
- In-call views have been re-designed
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 339352e72..e1063725e 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -20,10 +20,14 @@
-
+
+
+
+
+
diff --git a/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt b/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt
index 6e23ce50c..7d562ab8b 100644
--- a/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt
+++ b/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt
@@ -567,17 +567,11 @@ class DetailChatRoomFragment : MasterFragment() {
}
binding.setAttachFileClickListener {
- if (PermissionHelper.get().hasReadExternalStoragePermission() && PermissionHelper.get().hasCameraPermission()) {
+ if (PermissionHelper.get().hasReadExternalStoragePermission() || PermissionHelper.get().hasCameraPermission()) {
pickFile()
} else {
Log.i("[Chat] Asking for READ_EXTERNAL_STORAGE and CAMERA permissions")
- requestPermissions(
- arrayOf(
- Manifest.permission.READ_EXTERNAL_STORAGE,
- Manifest.permission.CAMERA
- ),
- 0
- )
+ Compatibility.requestReadExternalStorageAndCameraPermissions(this, 0)
}
}
diff --git a/app/src/main/java/org/linphone/compatibility/Api23Compatibility.kt b/app/src/main/java/org/linphone/compatibility/Api23Compatibility.kt
index 79a5727d9..77b46fbdd 100644
--- a/app/src/main/java/org/linphone/compatibility/Api23Compatibility.kt
+++ b/app/src/main/java/org/linphone/compatibility/Api23Compatibility.kt
@@ -281,5 +281,19 @@ class Api23Compatibility {
}
return ""
}
+
+ fun requestReadExternalStorageAndCameraPermissions(fragment: Fragment, code: Int) {
+ fragment.requestPermissions(
+ arrayOf(
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.CAMERA
+ ),
+ code
+ )
+ }
+
+ fun hasReadExternalStoragePermission(context: Context): Boolean {
+ return Compatibility.hasPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE)
+ }
}
}
diff --git a/app/src/main/java/org/linphone/compatibility/Api33Compatibility.kt b/app/src/main/java/org/linphone/compatibility/Api33Compatibility.kt
index 5bbb6e9f0..633661414 100644
--- a/app/src/main/java/org/linphone/compatibility/Api33Compatibility.kt
+++ b/app/src/main/java/org/linphone/compatibility/Api33Compatibility.kt
@@ -19,6 +19,7 @@
*/
package org.linphone.compatibility
+import android.Manifest
import android.annotation.TargetApi
import android.content.Context
import androidx.fragment.app.Fragment
@@ -29,14 +30,32 @@ class Api33Compatibility {
fun requestPostNotificationsPermission(fragment: Fragment, code: Int) {
fragment.requestPermissions(
arrayOf(
- "android.permission.POST_NOTIFICATIONS"
+ Manifest.permission.POST_NOTIFICATIONS
),
code
)
}
fun hasPostNotificationsPermission(context: Context): Boolean {
- return Compatibility.hasPermission(context, "android.permission.POST_NOTIFICATIONS")
+ return Compatibility.hasPermission(context, Manifest.permission.POST_NOTIFICATIONS)
+ }
+
+ fun requestReadMediaAndCameraPermissions(fragment: Fragment, code: Int) {
+ fragment.requestPermissions(
+ arrayOf(
+ Manifest.permission.READ_MEDIA_IMAGES,
+ Manifest.permission.READ_MEDIA_VIDEO,
+ Manifest.permission.READ_MEDIA_AUDIO,
+ Manifest.permission.CAMERA
+ ),
+ code
+ )
+ }
+
+ fun hasReadExternalStoragePermission(context: Context): Boolean {
+ return Compatibility.hasPermission(context, Manifest.permission.READ_MEDIA_IMAGES) ||
+ Compatibility.hasPermission(context, Manifest.permission.READ_MEDIA_VIDEO) ||
+ Compatibility.hasPermission(context, Manifest.permission.READ_MEDIA_AUDIO)
}
}
}
diff --git a/app/src/main/java/org/linphone/compatibility/Compatibility.kt b/app/src/main/java/org/linphone/compatibility/Compatibility.kt
index 20458fa88..106b0999f 100644
--- a/app/src/main/java/org/linphone/compatibility/Compatibility.kt
+++ b/app/src/main/java/org/linphone/compatibility/Compatibility.kt
@@ -107,6 +107,22 @@ class Compatibility {
} else true
}
+ fun requestReadExternalStorageAndCameraPermissions(fragment: Fragment, code: Int) {
+ if (Version.sdkAboveOrEqual(Version.API33_ANDROID_13_TIRAMISU)) {
+ Api33Compatibility.requestReadMediaAndCameraPermissions(fragment, code)
+ } else {
+ Api23Compatibility.requestReadExternalStorageAndCameraPermissions(fragment, code)
+ }
+ }
+
+ fun hasReadExternalStoragePermission(context: Context): Boolean {
+ return if (Version.sdkAboveOrEqual(Version.API33_ANDROID_13_TIRAMISU)) {
+ Api33Compatibility.hasReadExternalStoragePermission(context)
+ } else {
+ Api23Compatibility.hasReadExternalStoragePermission(context)
+ }
+ }
+
fun getDeviceName(context: Context): String {
return when (Version.sdkAboveOrEqual(Version.API25_NOUGAT_71)) {
true -> Api25Compatibility.getDeviceName(context)
diff --git a/app/src/main/java/org/linphone/utils/PermissionHelper.kt b/app/src/main/java/org/linphone/utils/PermissionHelper.kt
index c52a3c31f..e8ab6599e 100644
--- a/app/src/main/java/org/linphone/utils/PermissionHelper.kt
+++ b/app/src/main/java/org/linphone/utils/PermissionHelper.kt
@@ -60,7 +60,7 @@ class PermissionHelper private constructor(private val context: Context) {
}
fun hasReadExternalStoragePermission(): Boolean {
- return hasPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
+ return Compatibility.hasReadExternalStoragePermission(context)
}
fun hasWriteExternalStoragePermission(): Boolean {