diff --git a/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems b/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems index a1801b9c04b921..9c032afffeac0d 100644 --- a/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems +++ b/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems @@ -2097,7 +2097,7 @@ - + @@ -2326,4 +2326,4 @@ - \ No newline at end of file + diff --git a/src/mono/System.Private.CoreLib/System.Private.CoreLib.csproj b/src/mono/System.Private.CoreLib/System.Private.CoreLib.csproj index 3e032e76483b2d..96911991c8d74c 100644 --- a/src/mono/System.Private.CoreLib/System.Private.CoreLib.csproj +++ b/src/mono/System.Private.CoreLib/System.Private.CoreLib.csproj @@ -272,6 +272,9 @@ Common\Interop\Unix\System.Native\Interop.GetEnviron.cs + + + diff --git a/src/mono/System.Private.CoreLib/src/System/Environment.Android.cs b/src/mono/System.Private.CoreLib/src/System/Environment.Android.cs new file mode 100644 index 00000000000000..44c8988532f367 --- /dev/null +++ b/src/mono/System.Private.CoreLib/src/System/Environment.Android.cs @@ -0,0 +1,97 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.IO; +using System.Threading; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Diagnostics; + +namespace System +{ + public static partial class Environment + { + private static Dictionary? s_specialFolders; + + private static string GetFolderPathCore(SpecialFolder folder, SpecialFolderOption option) + { + if (s_specialFolders == null) + { + Interlocked.CompareExchange(ref s_specialFolders, new Dictionary(), null); + } + + string? path; + lock (s_specialFolders) + { + if (!s_specialFolders.TryGetValue(folder, out path)) + { + path = GetSpecialFolder(folder) ?? string.Empty; + s_specialFolders[folder] = path; + } + } + return path; + } + + private static string? GetSpecialFolder(SpecialFolder folder) + { + string? home = null; + try + { + home = PersistedFiles.GetHomeDirectory(); + } + catch (Exception exc) + { + Debug.Fail($"Unable to get home directory: {exc}"); + } + + // Fall back to '/' when we can't determine the home directory. + // This location isn't writable by non-root users which provides some safeguard + // that the application doesn't write data which is meant to be private. + if (string.IsNullOrEmpty(home)) + { + home = "/"; + } + + switch (folder) + { + case SpecialFolder.Personal: + case SpecialFolder.LocalApplicationData: + return home; + + case SpecialFolder.ApplicationData: + return Path.Combine(home, ".config"); + + case SpecialFolder.Desktop: + case SpecialFolder.DesktopDirectory: + return Path.Combine(home, "Desktop"); + + case SpecialFolder.MyMusic: + return Path.Combine(home, "Music"); + + case SpecialFolder.MyPictures: + return Path.Combine(home, "Pictures"); + + case SpecialFolder.Templates: + return Path.Combine(home, "Templates"); + + case SpecialFolder.MyVideos: + return Path.Combine(home, "Videos"); + + case SpecialFolder.CommonTemplates: + return "/usr/share/templates"; + + case SpecialFolder.Fonts: + return Path.Combine(home, ".fonts"); + + case SpecialFolder.UserProfile: + return GetEnvironmentVariable("HOME"); + + case SpecialFolder.CommonApplicationData: + return "/usr/share"; + + default: + return string.Empty; + } + } + } +}