From ae50f3896afd696c1dc227aa7b94a9c9fba1b46f Mon Sep 17 00:00:00 2001 From: serdar-sahin Date: Mon, 8 Dec 2025 18:35:33 +0300 Subject: [PATCH] add android project --- XamlPlayground.sln | 20 ++++- src/XamlPlayground.Android/Icon.png | Bin 0 -> 11731 bytes src/XamlPlayground.Android/MainActivity.cs | 21 ++++++ .../Properties/AndroidManifest.xml | 5 ++ .../Resources/AboutResources.txt | 44 +++++++++++ .../drawable-night-v31/avalonia_anim.xml | 66 ++++++++++++++++ .../Resources/drawable-v31/avalonia_anim.xml | 71 ++++++++++++++++++ .../Resources/drawable/splash_screen.xml | 13 ++++ .../Resources/values-night/colors.xml | 4 + .../Resources/values-v31/styles.xml | 21 ++++++ .../Resources/values/colors.xml | 4 + .../Resources/values/styles.xml | 12 +++ .../XamlPlayground.Android.csproj | 28 +++++++ .../XamlPlayground.Web.csproj | 3 +- .../Services/CompilerService.cs | 3 +- .../ViewModels/MainViewModel.cs | 21 +++--- 16 files changed, 323 insertions(+), 13 deletions(-) create mode 100644 src/XamlPlayground.Android/Icon.png create mode 100644 src/XamlPlayground.Android/MainActivity.cs create mode 100644 src/XamlPlayground.Android/Properties/AndroidManifest.xml create mode 100644 src/XamlPlayground.Android/Resources/AboutResources.txt create mode 100644 src/XamlPlayground.Android/Resources/drawable-night-v31/avalonia_anim.xml create mode 100644 src/XamlPlayground.Android/Resources/drawable-v31/avalonia_anim.xml create mode 100644 src/XamlPlayground.Android/Resources/drawable/splash_screen.xml create mode 100644 src/XamlPlayground.Android/Resources/values-night/colors.xml create mode 100644 src/XamlPlayground.Android/Resources/values-v31/styles.xml create mode 100644 src/XamlPlayground.Android/Resources/values/colors.xml create mode 100644 src/XamlPlayground.Android/Resources/values/styles.xml create mode 100644 src/XamlPlayground.Android/XamlPlayground.Android.csproj diff --git a/XamlPlayground.sln b/XamlPlayground.sln index a699e6a..dc1cbae 100644 --- a/XamlPlayground.sln +++ b/XamlPlayground.sln @@ -1,5 +1,8 @@  Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.14.36717.8 d17.14 +MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XamlPlayground", "src\XamlPlayground\XamlPlayground.csproj", "{4E84133A-4280-41FC-A4E1-34463403CA8A}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XamlPlayground.NetCore", "src\XamlPlayground.NetCore\XamlPlayground.NetCore.csproj", "{5B0621D6-B7D4-49EF-8C24-FD81823D56AF}" @@ -9,9 +12,9 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{2629EA9C-FEFD-4604-BD92-C23DBB54316A}" ProjectSection(SolutionItems) = preProject .editorconfig = .editorconfig - Directory.Build.props = Directory.Build.props .github\workflows\azure-swa.yml = .github\workflows\azure-swa.yml .github\workflows\build.yml = .github\workflows\build.yml + Directory.Build.props = Directory.Build.props .github\workflows\pages.yml = .github\workflows\pages.yml EndProjectSection EndProject @@ -23,6 +26,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{D38F82B0-7 README.md = README.md EndProjectSection EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XamlPlayground.Android", "src\XamlPlayground.Android\XamlPlayground.Android.csproj", "{1ABE8F08-18BF-8AF7-71F8-B2DD081FA757}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -41,10 +46,23 @@ Global {00E8340C-7F10-446C-A1B4-48C68D8F1612}.Debug|Any CPU.Build.0 = Debug|Any CPU {00E8340C-7F10-446C-A1B4-48C68D8F1612}.Release|Any CPU.ActiveCfg = Release|Any CPU {00E8340C-7F10-446C-A1B4-48C68D8F1612}.Release|Any CPU.Build.0 = Release|Any CPU + {1ABE8F08-18BF-8AF7-71F8-B2DD081FA757}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1ABE8F08-18BF-8AF7-71F8-B2DD081FA757}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1ABE8F08-18BF-8AF7-71F8-B2DD081FA757}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {1ABE8F08-18BF-8AF7-71F8-B2DD081FA757}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1ABE8F08-18BF-8AF7-71F8-B2DD081FA757}.Release|Any CPU.Build.0 = Release|Any CPU + {1ABE8F08-18BF-8AF7-71F8-B2DD081FA757}.Release|Any CPU.Deploy.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {4E84133A-4280-41FC-A4E1-34463403CA8A} = {9CF0A712-DEA1-42BC-AB3A-ED8E6DAE523C} {5B0621D6-B7D4-49EF-8C24-FD81823D56AF} = {9CF0A712-DEA1-42BC-AB3A-ED8E6DAE523C} {00E8340C-7F10-446C-A1B4-48C68D8F1612} = {9CF0A712-DEA1-42BC-AB3A-ED8E6DAE523C} + {1ABE8F08-18BF-8AF7-71F8-B2DD081FA757} = {9CF0A712-DEA1-42BC-AB3A-ED8E6DAE523C} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {467552CC-5E9E-4CAB-9C3C-69AC5343B019} EndGlobalSection EndGlobal diff --git a/src/XamlPlayground.Android/Icon.png b/src/XamlPlayground.Android/Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3c39845930eae5a98e094bdada0da2d6646bf9ce GIT binary patch literal 11731 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 literal 0 HcmV?d00001 diff --git a/src/XamlPlayground.Android/MainActivity.cs b/src/XamlPlayground.Android/MainActivity.cs new file mode 100644 index 0000000..ea2f5db --- /dev/null +++ b/src/XamlPlayground.Android/MainActivity.cs @@ -0,0 +1,21 @@ +using Android.App; +using Android.Content.PM; +using Avalonia; +using Avalonia.Android; + +namespace XamlPlayground.Android; + +[Activity( + Label = "XamlPlayground.Android", + Theme = "@style/MyTheme.NoActionBar", + Icon = "@drawable/icon", + MainLauncher = true, + ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.ScreenSize | ConfigChanges.UiMode)] +public class MainActivity : AvaloniaMainActivity +{ + protected override AppBuilder CustomizeAppBuilder(AppBuilder builder) + { + return base.CustomizeAppBuilder(builder) + .WithInterFont(); + } +} diff --git a/src/XamlPlayground.Android/Properties/AndroidManifest.xml b/src/XamlPlayground.Android/Properties/AndroidManifest.xml new file mode 100644 index 0000000..cfdd14e --- /dev/null +++ b/src/XamlPlayground.Android/Properties/AndroidManifest.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/src/XamlPlayground.Android/Resources/AboutResources.txt b/src/XamlPlayground.Android/Resources/AboutResources.txt new file mode 100644 index 0000000..c2bca97 --- /dev/null +++ b/src/XamlPlayground.Android/Resources/AboutResources.txt @@ -0,0 +1,44 @@ +Images, layout descriptions, binary blobs and string dictionaries can be included +in your application as resource files. Various Android APIs are designed to +operate on the resource IDs instead of dealing with images, strings or binary blobs +directly. + +For example, a sample Android app that contains a user interface layout (main.axml), +an internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png) +would keep its resources in the "Resources" directory of the application: + +Resources/ + drawable/ + icon.png + + layout/ + main.axml + + values/ + strings.xml + +In order to get the build system to recognize Android resources, set the build action to +"AndroidResource". The native Android APIs do not operate directly with filenames, but +instead operate on resource IDs. When you compile an Android application that uses resources, +the build system will package the resources for distribution and generate a class called "R" +(this is an Android convention) that contains the tokens for each one of the resources +included. For example, for the above Resources layout, this is what the R class would expose: + +public class R { + public class drawable { + public const int icon = 0x123; + } + + public class layout { + public const int main = 0x456; + } + + public class strings { + public const int first_string = 0xabc; + public const int second_string = 0xbcd; + } +} + +You would then use R.drawable.icon to reference the drawable/icon.png file, or R.layout.main +to reference the layout/main.axml file, or R.strings.first_string to reference the first +string in the dictionary file values/strings.xml. \ No newline at end of file diff --git a/src/XamlPlayground.Android/Resources/drawable-night-v31/avalonia_anim.xml b/src/XamlPlayground.Android/Resources/drawable-night-v31/avalonia_anim.xml new file mode 100644 index 0000000..dde4b5a --- /dev/null +++ b/src/XamlPlayground.Android/Resources/drawable-night-v31/avalonia_anim.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/XamlPlayground.Android/Resources/drawable-v31/avalonia_anim.xml b/src/XamlPlayground.Android/Resources/drawable-v31/avalonia_anim.xml new file mode 100644 index 0000000..94f27d9 --- /dev/null +++ b/src/XamlPlayground.Android/Resources/drawable-v31/avalonia_anim.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/XamlPlayground.Android/Resources/drawable/splash_screen.xml b/src/XamlPlayground.Android/Resources/drawable/splash_screen.xml new file mode 100644 index 0000000..2e920b4 --- /dev/null +++ b/src/XamlPlayground.Android/Resources/drawable/splash_screen.xml @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/src/XamlPlayground.Android/Resources/values-night/colors.xml b/src/XamlPlayground.Android/Resources/values-night/colors.xml new file mode 100644 index 0000000..3d47b6f --- /dev/null +++ b/src/XamlPlayground.Android/Resources/values-night/colors.xml @@ -0,0 +1,4 @@ + + + #212121 + diff --git a/src/XamlPlayground.Android/Resources/values-v31/styles.xml b/src/XamlPlayground.Android/Resources/values-v31/styles.xml new file mode 100644 index 0000000..d5ecec4 --- /dev/null +++ b/src/XamlPlayground.Android/Resources/values-v31/styles.xml @@ -0,0 +1,21 @@ + + + + + + + + diff --git a/src/XamlPlayground.Android/Resources/values/colors.xml b/src/XamlPlayground.Android/Resources/values/colors.xml new file mode 100644 index 0000000..59279d5 --- /dev/null +++ b/src/XamlPlayground.Android/Resources/values/colors.xml @@ -0,0 +1,4 @@ + + + #FFFFFF + diff --git a/src/XamlPlayground.Android/Resources/values/styles.xml b/src/XamlPlayground.Android/Resources/values/styles.xml new file mode 100644 index 0000000..6e534de --- /dev/null +++ b/src/XamlPlayground.Android/Resources/values/styles.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/src/XamlPlayground.Android/XamlPlayground.Android.csproj b/src/XamlPlayground.Android/XamlPlayground.Android.csproj new file mode 100644 index 0000000..afc6f4b --- /dev/null +++ b/src/XamlPlayground.Android/XamlPlayground.Android.csproj @@ -0,0 +1,28 @@ + + + Exe + net10.0-android36.0 + 21.0 + enable + com.CompanyName.XamlPlayground + 1 + 1.0 + apk + false + + + + + Resources\drawable\Icon.png + + + + + + + + + + + + diff --git a/src/XamlPlayground.Web/XamlPlayground.Web.csproj b/src/XamlPlayground.Web/XamlPlayground.Web.csproj index c75350c..368c9b2 100644 --- a/src/XamlPlayground.Web/XamlPlayground.Web.csproj +++ b/src/XamlPlayground.Web/XamlPlayground.Web.csproj @@ -1,7 +1,7 @@  - net7.0 + net10.0 true XamlPlayground.Web @@ -23,7 +23,6 @@ - diff --git a/src/XamlPlayground/Services/CompilerService.cs b/src/XamlPlayground/Services/CompilerService.cs index 36542d4..bc87d59 100644 --- a/src/XamlPlayground/Services/CompilerService.cs +++ b/src/XamlPlayground/Services/CompilerService.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.IO; using System.Linq; @@ -70,7 +71,7 @@ public static (Assembly? Assembly, AssemblyLoadContext? Context) GetScriptAssemb { foreach (var error in errors) { - Console.WriteLine(error); + Debug.WriteLine(error); } return (null, null); diff --git a/src/XamlPlayground/ViewModels/MainViewModel.cs b/src/XamlPlayground/ViewModels/MainViewModel.cs index 85f103d..507186c 100644 --- a/src/XamlPlayground/ViewModels/MainViewModel.cs +++ b/src/XamlPlayground/ViewModels/MainViewModel.cs @@ -17,6 +17,7 @@ using System.Diagnostics.CodeAnalysis; using XamlPlayground.Services; using Avalonia.Threading; +using System.Diagnostics; namespace XamlPlayground.ViewModels; @@ -43,7 +44,7 @@ public MainViewModel(string? initialGist) { _editorFontSize = 12; _samples = GetSamples(".xml"); - _enableAutoRun = true; + _enableAutoRun = false; OpenXamlFileCommand = new AsyncRelayCommand(async () => await OpenXamlFile()); SaveXamlFileCommand = new AsyncRelayCommand(async () => await SaveXamlFile()); @@ -116,7 +117,7 @@ public async Task Gist(string? id) } catch (Exception exception) { - Console.WriteLine(exception); + Debug.WriteLine(exception); } } @@ -148,6 +149,8 @@ private ObservableCollection GetSamples(string sampleExtension) foreach (var resourceName in resourceNames) { + Debug.WriteLine(resourceName); + if (!resourceName.EndsWith(sampleExtension, StringComparison.OrdinalIgnoreCase)) { continue; @@ -247,7 +250,7 @@ private async Task RunInternal(string? xaml, string? code) if (_previous?.Assembly is { }) { scriptAssembly = _previous?.Assembly; - Console.WriteLine($"Compiled assembly: {scriptAssembly?.GetName().Name}"); + Debug.WriteLine($"Compiled assembly: {scriptAssembly?.GetName().Name}"); } else { @@ -257,7 +260,7 @@ private async Task RunInternal(string? xaml, string? code) catch (Exception exception) { LastErrorMessage = exception.Message; - Console.WriteLine(exception); + Debug.WriteLine(exception); return; } } @@ -291,7 +294,7 @@ private async Task RunInternal(string? xaml, string? code) catch (Exception exception) { LastErrorMessage = exception.Message; - Console.WriteLine(exception); + Debug.WriteLine(exception); } finally { @@ -332,7 +335,7 @@ private async Task OpenXamlFile() } catch (Exception exception) { - Console.WriteLine(exception); + Debug.WriteLine(exception); } } } @@ -371,7 +374,7 @@ private async Task SaveXamlFile() } catch (Exception exception) { - Console.WriteLine(exception); + Debug.WriteLine(exception); } } } @@ -416,7 +419,7 @@ private async Task OpenCodeFile() } catch (Exception exception) { - Console.WriteLine(exception); + Debug.WriteLine(exception); } } } @@ -455,7 +458,7 @@ private async Task SaveCodeFile() } catch (Exception exception) { - Console.WriteLine(exception); + Debug.WriteLine(exception); } } }