diff --git a/CHANGELOG.md b/CHANGELOG.md
index 88b0dc2bc..854159ab9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,7 @@ All notable changes to this project will be documented in this file.
- Info: edit location by copying from other item
- Info: edit tags with dynamic placeholders for country / place
- Widget: option to open collection on tap
+- optional MANAGE_MEDIA permission to modify media without asking
### Changed
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 5e4b6da99..a17675bce 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -24,9 +24,14 @@ This change eventually prevents building the app with Flutter v3.3.3.
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="29"
tools:ignore="ScopedStorage" />
+
+
+
+
-
diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DeviceHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DeviceHandler.kt
index eda3f1d32..f9ca4d742 100644
--- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DeviceHandler.kt
+++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DeviceHandler.kt
@@ -3,7 +3,10 @@ package deckers.thibault.aves.channel.calls
import android.content.Context
import android.content.Intent
import android.content.res.Resources
+import android.net.Uri
import android.os.Build
+import android.provider.MediaStore
+import android.provider.Settings
import androidx.core.content.pm.ShortcutManagerCompat
import deckers.thibault.aves.channel.calls.Coresult.Companion.safe
import deckers.thibault.aves.model.FieldMap
@@ -15,15 +18,21 @@ import java.util.*
class DeviceHandler(private val context: Context) : MethodCallHandler {
override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
when (call.method) {
+ "canManageMedia" -> safe(call, result, ::canManageMedia)
"getCapabilities" -> safe(call, result, ::getCapabilities)
"getDefaultTimeZone" -> safe(call, result, ::getDefaultTimeZone)
"getLocales" -> safe(call, result, ::getLocales)
"getPerformanceClass" -> safe(call, result, ::getPerformanceClass)
"isSystemFilePickerEnabled" -> safe(call, result, ::isSystemFilePickerEnabled)
+ "requestMediaManagePermission" -> safe(call, result, ::requestMediaManagePermission)
else -> result.notImplemented()
}
}
+ private fun canManageMedia(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) {
+ result.success(if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) MediaStore.canManageMedia(context) else false)
+ }
+
private fun getCapabilities(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) {
val sdkInt = Build.VERSION.SDK_INT
result.success(
@@ -32,6 +41,7 @@ class DeviceHandler(private val context: Context) : MethodCallHandler {
"canPinShortcut" to ShortcutManagerCompat.isRequestPinShortcutSupported(context),
"canPrint" to (sdkInt >= Build.VERSION_CODES.KITKAT),
"canRenderFlagEmojis" to (sdkInt >= Build.VERSION_CODES.LOLLIPOP),
+ "canRequestManageMedia" to (sdkInt >= Build.VERSION_CODES.S),
"canSetLockScreenWallpaper" to (sdkInt >= Build.VERSION_CODES.N),
"isDynamicColorAvailable" to (sdkInt >= Build.VERSION_CODES.S),
"showPinShortcutFeedback" to (sdkInt >= Build.VERSION_CODES.O),
@@ -90,6 +100,17 @@ class DeviceHandler(private val context: Context) : MethodCallHandler {
result.success(enabled)
}
+ private fun requestMediaManagePermission(@Suppress("unused_parameter") call: MethodCall, result: MethodChannel.Result) {
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
+ result.error("requestMediaManagePermission-unsupported", "media management permission is not available before Android 12", null)
+ return
+ }
+
+ val intent = Intent(Settings.ACTION_REQUEST_MANAGE_MEDIA, Uri.parse("package:${context.packageName}"))
+ context.startActivity(intent)
+ result.success(true)
+ }
+
companion object {
const val CHANNEL = "deckers.thibault/aves/device"
}
diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb
index 47e0028f8..9c0bd807b 100644
--- a/lib/l10n/app_en.arb
+++ b/lib/l10n/app_en.arb
@@ -760,6 +760,7 @@
"settingsSaveSearchHistory": "Save search history",
"settingsEnableBin": "Use recycle bin",
"settingsEnableBinSubtitle": "Keep deleted items for 30 days",
+ "settingsAllowMediaManagement": "Allow media management",
"settingsHiddenItemsTile": "Hidden items",
"settingsHiddenItemsPageTitle": "Hidden Items",
diff --git a/lib/model/device.dart b/lib/model/device.dart
index c94b0adf2..d599ab64f 100644
--- a/lib/model/device.dart
+++ b/lib/model/device.dart
@@ -5,7 +5,7 @@ final Device device = Device._private();
class Device {
late final String _userAgent;
- late final bool _canGrantDirectoryAccess, _canPinShortcut, _canPrint, _canRenderFlagEmojis, _canSetLockScreenWallpaper;
+ late final bool _canGrantDirectoryAccess, _canPinShortcut, _canPrint, _canRenderFlagEmojis, _canRequestManageMedia, _canSetLockScreenWallpaper;
late final bool _isDynamicColorAvailable, _showPinShortcutFeedback, _supportEdgeToEdgeUIMode;
String get userAgent => _userAgent;
@@ -18,6 +18,8 @@ class Device {
bool get canRenderFlagEmojis => _canRenderFlagEmojis;
+ bool get canRequestManageMedia => _canRequestManageMedia;
+
bool get canSetLockScreenWallpaper => _canSetLockScreenWallpaper;
bool get isDynamicColorAvailable => _isDynamicColorAvailable;
@@ -37,6 +39,7 @@ class Device {
_canPinShortcut = capabilities['canPinShortcut'] ?? false;
_canPrint = capabilities['canPrint'] ?? false;
_canRenderFlagEmojis = capabilities['canRenderFlagEmojis'] ?? false;
+ _canRequestManageMedia = capabilities['canRequestManageMedia'] ?? false;
_canSetLockScreenWallpaper = capabilities['canSetLockScreenWallpaper'] ?? false;
_isDynamicColorAvailable = capabilities['isDynamicColorAvailable'] ?? false;
_showPinShortcutFeedback = capabilities['showPinShortcutFeedback'] ?? false;
diff --git a/lib/services/device_service.dart b/lib/services/device_service.dart
index 5bafe40f7..b6d0612cb 100644
--- a/lib/services/device_service.dart
+++ b/lib/services/device_service.dart
@@ -4,6 +4,8 @@ import 'package:aves/services/common/services.dart';
import 'package:flutter/services.dart';
abstract class DeviceService {
+ Future canManageMedia();
+
Future