Skip to content

Commit

Permalink
Always return Granted for Read-Write Storage permissions on Android (#…
Browse files Browse the repository at this point in the history
…23909)

* Always return Granted for Read-Write Storage

* Add test

* Apply suggestions from code review

* Update test

* Make test specific to Android
  • Loading branch information
jfversluis authored Sep 3, 2024
1 parent 60b9a69 commit 31ed71f
Show file tree
Hide file tree
Showing 3 changed files with 99 additions and 5 deletions.
69 changes: 65 additions & 4 deletions src/Essentials/src/Permissions/Permissions.android.cs
Original file line number Diff line number Diff line change
Expand Up @@ -521,14 +521,75 @@ public override (string androidPermission, bool isRuntime)[] RequiredPermissions

public partial class StorageRead : BasePlatformPermission
{
public override (string androidPermission, bool isRuntime)[] RequiredPermissions =>
new (string, bool)[] { (Manifest.Permission.ReadExternalStorage, true) };
public override (string androidPermission, bool isRuntime)[] RequiredPermissions
{
get
{
if (OperatingSystem.IsAndroidVersionAtLeast(33))
{
return [];
}

return new (string, bool)[] { (Manifest.Permission.ReadExternalStorage, true) };
}
}

public override Task<PermissionStatus> RequestAsync()
{
if (OperatingSystem.IsAndroidVersionAtLeast(33))
{
return Task.FromResult(PermissionStatus.Granted);
}

return base.RequestAsync();
}

public override Task<PermissionStatus> CheckStatusAsync()
{
if (OperatingSystem.IsAndroidVersionAtLeast(33))
{
return Task.FromResult(PermissionStatus.Granted);
}

return base.CheckStatusAsync();
}
}

public partial class StorageWrite : BasePlatformPermission
{
public override (string androidPermission, bool isRuntime)[] RequiredPermissions =>
new (string, bool)[] { (Manifest.Permission.WriteExternalStorage, true) };
public override (string androidPermission, bool isRuntime)[] RequiredPermissions
{

get
{
if (OperatingSystem.IsAndroidVersionAtLeast(33))
{
return [];
}

return new (string, bool)[] { (Manifest.Permission.WriteExternalStorage, true) };
}
}

public override Task<PermissionStatus> RequestAsync()
{
if (OperatingSystem.IsAndroidVersionAtLeast(33))
{
return Task.FromResult(PermissionStatus.Granted);
}

return base.RequestAsync();
}

public override Task<PermissionStatus> CheckStatusAsync()
{
if (OperatingSystem.IsAndroidVersionAtLeast(33))
{
return Task.FromResult(PermissionStatus.Granted);
}

return base.CheckStatusAsync();
}
}

public partial class Vibrate : BasePlatformPermission
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,4 +55,8 @@ static Microsoft.Maui.Devices.Sensors.Geolocation.StopListeningForeground() -> v
*REMOVED*Microsoft.Maui.Media.IMediaPicker.CapturePhotoAsync(Microsoft.Maui.Media.MediaPickerOptions? options = null) -> System.Threading.Tasks.Task<Microsoft.Maui.Storage.FileResult!>!
*REMOVED*Microsoft.Maui.Media.IMediaPicker.CaptureVideoAsync(Microsoft.Maui.Media.MediaPickerOptions? options = null) -> System.Threading.Tasks.Task<Microsoft.Maui.Storage.FileResult!>!
*REMOVED*Microsoft.Maui.Media.IMediaPicker.PickPhotoAsync(Microsoft.Maui.Media.MediaPickerOptions? options = null) -> System.Threading.Tasks.Task<Microsoft.Maui.Storage.FileResult!>!
*REMOVED*Microsoft.Maui.Media.IMediaPicker.PickVideoAsync(Microsoft.Maui.Media.MediaPickerOptions? options = null) -> System.Threading.Tasks.Task<Microsoft.Maui.Storage.FileResult!>!
*REMOVED*Microsoft.Maui.Media.IMediaPicker.PickVideoAsync(Microsoft.Maui.Media.MediaPickerOptions? options = null) -> System.Threading.Tasks.Task<Microsoft.Maui.Storage.FileResult!>!
~override Microsoft.Maui.ApplicationModel.Permissions.StorageRead.CheckStatusAsync() -> System.Threading.Tasks.Task<Microsoft.Maui.ApplicationModel.PermissionStatus>
~override Microsoft.Maui.ApplicationModel.Permissions.StorageRead.RequestAsync() -> System.Threading.Tasks.Task<Microsoft.Maui.ApplicationModel.PermissionStatus>
~override Microsoft.Maui.ApplicationModel.Permissions.StorageWrite.CheckStatusAsync() -> System.Threading.Tasks.Task<Microsoft.Maui.ApplicationModel.PermissionStatus>
~override Microsoft.Maui.ApplicationModel.Permissions.StorageWrite.RequestAsync() -> System.Threading.Tasks.Task<Microsoft.Maui.ApplicationModel.PermissionStatus>
29 changes: 29 additions & 0 deletions src/Essentials/test/DeviceTests/Tests/Permissions_Tests.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
using System;
using System.Threading.Tasks;
using Microsoft.Maui.ApplicationModel;
using Microsoft.Maui.Devices;
using Microsoft.Maui.Dispatching;
using Xunit;
using Xunit.Sdk;

namespace Microsoft.Maui.Essentials.DeviceTests
{
Expand Down Expand Up @@ -74,5 +78,30 @@ await Task.Run(async () =>
await Assert.ThrowsAsync<PermissionException>(async () => await Permissions.RequestAsync<Permissions.LocationWhenInUse>());
});
}

[Fact
#if !__ANDROID__
(Skip = "Test only applies to Android")
#endif
]
public async Task StorageAndroid13AlwaysGranted()
{
if (DeviceInfo.Platform == DevicePlatform.Android && OperatingSystem.IsAndroidVersionAtLeast(33))
{
var status = await Permissions.CheckStatusAsync<Permissions.StorageRead>();
Assert.Equal(PermissionStatus.Granted, status);

status = await Permissions.CheckStatusAsync<Permissions.StorageWrite>();
Assert.Equal(PermissionStatus.Granted, status);
}
else // Android < API 33, we didn't request these, so status denied
{
var status = await Permissions.CheckStatusAsync<Permissions.StorageRead>();
Assert.Equal(PermissionStatus.Denied, status);

status = await Permissions.CheckStatusAsync<Permissions.StorageWrite>();
Assert.Equal(PermissionStatus.Denied, status);
}
}
}
}

0 comments on commit 31ed71f

Please sign in to comment.