Request Android 13 media permissions instead of read external storage

This commit is contained in:
Sylvain Berfini 2022-06-10 15:34:19 +02:00
parent dc155e7302
commit f428a170c5
8 changed files with 63 additions and 21 deletions

View file

@ -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

View file

@ -20,10 +20,14 @@
<!-- To vibrate when pressing DTMF keys on numpad & incoming calls -->
<uses-permission android:name="android.permission.VIBRATE" />
<!-- TODO: require new permissions instead: https://developer.android.com/about/versions/13/behavior-changes-13 -->
<!-- Needed to attach file(s) in chat room fragment -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32"/>
<!-- Starting Android 13 you need those 3 permissions instead (https://developer.android.com/about/versions/13/behavior-changes-13) -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<!-- Needed to shared downloaded files if setting is on -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="28" />

View file

@ -567,17 +567,11 @@ class DetailChatRoomFragment : MasterFragment<ChatRoomDetailFragmentBinding, Cha
}
binding.setAttachFileClickListener {
if (PermissionHelper.get().hasReadExternalStoragePermission() && PermissionHelper.get().hasCameraPermission()) {
if (PermissionHelper.get().hasReadExternalStoragePermission() || PermissionHelper.get().hasCameraPermission()) {
pickFile()
} else {
Log.i("[Chat Room] Asking for READ_EXTERNAL_STORAGE and CAMERA permissions")
requestPermissions(
arrayOf(
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.CAMERA
),
0
)
Compatibility.requestReadExternalStorageAndCameraPermissions(this, 0)
}
}

View file

@ -19,7 +19,6 @@
*/
package org.linphone.activities.voip.fragments
import android.Manifest
import android.app.Activity
import android.content.Intent
import android.content.pm.PackageManager
@ -41,6 +40,7 @@ import org.linphone.activities.main.chat.adapters.ChatMessagesListAdapter
import org.linphone.activities.main.chat.data.ChatMessageData
import org.linphone.activities.main.chat.viewmodels.*
import org.linphone.activities.main.viewmodels.ListTopBarViewModel
import org.linphone.compatibility.Compatibility
import org.linphone.core.ChatRoom
import org.linphone.core.Factory
import org.linphone.core.tools.Log
@ -83,17 +83,11 @@ class ChatFragment : GenericFragment<VoipChatFragmentBinding>() {
}
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)
}
}

View file

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

View file

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

View file

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

View file

@ -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 {