Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,16 +1,21 @@
using System.Collections.Generic;
using Android;
using Android;
using Android.OS;
using static Microsoft.Maui.ApplicationModel.Permissions;
using BrickController2.PlatformServices.Permission;

namespace BrickController2.Droid.PlatformServices.Permission
{
public class ReadWriteExternalStoragePermission : BasePlatformPermission, IReadWriteExternalStoragePermission
{
public override (string androidPermission, bool isRuntime)[] RequiredPermissions => new List<(string androidPermission, bool isRuntime)>
{
(Manifest.Permission.ReadExternalStorage, true),
(Manifest.Permission.WriteExternalStorage, true)
}.ToArray();
public override (string androidPermission, bool isRuntime)[] RequiredPermissions => (Build.VERSION.SdkInt <= BuildVersionCodes.SV2) ?
// Android API 32 and older - ask for permissions
new (string androidPermission, bool isRuntime)[]
{
(Manifest.Permission.ReadExternalStorage, true),
(Manifest.Permission.WriteExternalStorage, true)
} :
// Android API 33+ does not support permissions to external storage
// Let it be Granted (via empty permission list)
[];
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using BrickController2.Helpers;
using Android.OS;
using BrickController2.Helpers;
using BrickController2.PlatformServices.SharedFileStorage;
using System;
using System.IO;
Expand All @@ -25,18 +26,44 @@ public bool IsPermissionGranted
}
}

public string? SharedStorageDirectory
public string? SharedStorageBaseDirectory
{
get
{
try
{
#pragma warning disable CS0618 // Type or member is obsolete
var storageDirectory = Environment.ExternalStorageDirectory?.AbsolutePath;
var storageDirectory = (Build.VERSION.SdkInt <= BuildVersionCodes.SV2) ?
// Android API 32 and older - keep backward compatible: /storage/emulated/0/
Environment.ExternalStorageDirectory?.AbsolutePath :
// Android API 33+ - use /storage/emulated/0/Documents
Environment.GetExternalStoragePublicDirectory(Environment.DirectoryDocuments)?.AbsolutePath;
var storageState = Environment.ExternalStorageState;
#pragma warning restore CS0618 // Type or member is obsolete

if (storageDirectory is null || !Directory.Exists(storageDirectory) || !Environment.MediaMounted.Equals(storageState))
if (storageDirectory == null || !Directory.Exists(storageDirectory) || !Environment.MediaMounted.Equals(storageState))
{
return null;
}

return storageDirectory;
}
catch (Exception)
{
return null;
}
}
}

public string? SharedStorageDirectory
{
get
{
try
{
var storageDirectory = SharedStorageBaseDirectory;

if (storageDirectory == null)
{
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.TRANSMIT_IR" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<uses-feature android:name="android.hardware.bluetooth" android:required="true" />
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
<application android:label="BrickController2.Android" android:icon="@mipmap/ic_launcher"></application>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,9 @@ public bool IsPermissionGranted
}
}

public string? SharedStorageDirectory
public string? SharedStorageDirectory => SharedStorageBaseDirectory;

public string? SharedStorageBaseDirectory
{
get
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ public interface ISharedFileStorageService

bool IsPermissionGranted { get; set; }

string? SharedStorageBaseDirectory { get; }

string? SharedStorageDirectory { get; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ await _dialogService.ShowMessageBoxAsync(
_disappearingTokenSource?.Token.ThrowIfCancellationRequested();
}

if (SharedFileStorageService.SharedStorageDirectory != null)
if (SharedFileStorageService.SharedStorageBaseDirectory != null)
{
var storagePermissionStatus = await _readWriteExternalStoragePermission.CheckStatusAsync();
if (storagePermissionStatus != PermissionStatus.Granted && !_isStoragePermissionRequested)
Expand Down