diff --git a/MLEM.Ui/Elements/Element.cs b/MLEM.Ui/Elements/Element.cs index f3dd110..54d77ba 100644 --- a/MLEM.Ui/Elements/Element.cs +++ b/MLEM.Ui/Elements/Element.cs @@ -102,7 +102,6 @@ namespace MLEM.Ui.Elements { } protected UiControls Controls => this.System.Controls; protected InputHandler Input => this.Controls.Input; - public Point MousePos => this.Input.MousePosition; public RootElement Root { get; internal set; } public float Scale => this.Root.ActualScale; public Element Parent { get; private set; } @@ -443,15 +442,15 @@ namespace MLEM.Ui.Elements { } } - public virtual Element GetMousedElement() { + public virtual Element GetElementUnderPos(Point position) { if (this.IsHidden) return null; for (var i = this.SortedChildren.Count - 1; i >= 0; i--) { - var element = this.SortedChildren[i].GetMousedElement(); + var element = this.SortedChildren[i].GetElementUnderPos(position); if (element != null) return element; } - return this.CanBeMoused && this.Area.Contains(this.MousePos) ? this : null; + return this.CanBeMoused && this.Area.Contains(position) ? this : null; } protected virtual void InitStyle(UiStyle style) { diff --git a/MLEM.Ui/Elements/Panel.cs b/MLEM.Ui/Elements/Panel.cs index ec38f81..be9c330 100644 --- a/MLEM.Ui/Elements/Panel.cs +++ b/MLEM.Ui/Elements/Panel.cs @@ -117,11 +117,11 @@ namespace MLEM.Ui.Elements { base.DrawEarly(time, batch, alpha, blendState, samplerState); } - public override Element GetMousedElement() { + public override Element GetElementUnderPos(Point position) { // if overflow is handled, don't propagate mouse checks to hidden children - if (this.scrollOverflow && !this.GetRenderTargetArea().Contains(this.MousePos)) + if (this.scrollOverflow && !this.GetRenderTargetArea().Contains(position)) return null; - return base.GetMousedElement(); + return base.GetElementUnderPos(position); } private Rectangle GetRenderTargetArea() { diff --git a/MLEM.Ui/Elements/ScrollBar.cs b/MLEM.Ui/Elements/ScrollBar.cs index 6569a61..e34eea6 100644 --- a/MLEM.Ui/Elements/ScrollBar.cs +++ b/MLEM.Ui/Elements/ScrollBar.cs @@ -56,11 +56,12 @@ namespace MLEM.Ui.Elements { } if (this.isMouseHeld) { + var mouse = this.Input.MousePosition; if (this.Horizontal) { - var internalX = this.MousePos.X - this.Area.X - this.ScrollerSize.X * this.Scale / 2; + var internalX = mouse.X - this.Area.X - this.ScrollerSize.X * this.Scale / 2; this.CurrentValue = internalX / (this.Area.Width - this.ScrollerSize.X * this.Scale) * this.MaxValue; } else { - var internalY = this.MousePos.Y - this.Area.Y - this.ScrollerSize.Y * this.Scale / 2; + var internalY = mouse.Y - this.Area.Y - this.ScrollerSize.Y * this.Scale / 2; this.CurrentValue = internalY / (this.Area.Height - this.ScrollerSize.Y * this.Scale) * this.MaxValue; } } diff --git a/MLEM.Ui/Elements/Tooltip.cs b/MLEM.Ui/Elements/Tooltip.cs index d6fd273..087df92 100644 --- a/MLEM.Ui/Elements/Tooltip.cs +++ b/MLEM.Ui/Elements/Tooltip.cs @@ -25,7 +25,7 @@ namespace MLEM.Ui.Elements { base.Update(time); var viewport = this.System.Viewport.Size; - var offset = this.MousePos.ToVector2() / this.Scale + this.MouseOffset; + var offset = this.Input.MousePosition.ToVector2() / this.Scale + this.MouseOffset; if (offset.X < 0) offset.X = 0; if (offset.Y < 0) diff --git a/MLEM.Ui/UiControls.cs b/MLEM.Ui/UiControls.cs index dc073a3..cd1bcce 100644 --- a/MLEM.Ui/UiControls.cs +++ b/MLEM.Ui/UiControls.cs @@ -2,6 +2,7 @@ using System; using System.Linq; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Input; +using Microsoft.Xna.Framework.Input.Touch; using MLEM.Input; using MLEM.Ui.Elements; @@ -20,14 +21,17 @@ namespace MLEM.Ui { this.system = system; this.Input = inputHandler ?? new InputHandler(); this.isInputOurs = inputHandler == null; + + // enable all required gestures + this.Input.EnableGestures(GestureType.Tap, GestureType.Hold); } public void Update() { if (this.isInputOurs) this.Input.Update(); - var mousedNow = this.GetMousedElement(); - // mouse new element + // MOUSE INPUT + var mousedNow = this.GetElementUnderPos(this.Input.MousePosition); if (mousedNow != this.MousedElement) { if (this.MousedElement != null) this.MousedElement.OnMouseExit?.Invoke(this.MousedElement); @@ -36,21 +40,19 @@ namespace MLEM.Ui { this.MousedElement = mousedNow; this.system.Propagate(e => e.OnMousedElementChanged?.Invoke(e, mousedNow)); } - + if (this.Input.IsMouseButtonPressed(MouseButton.Left)) { - // select element var selectedNow = mousedNow != null && mousedNow.CanBeSelected ? mousedNow : null; - if (this.SelectedElement != selectedNow) - this.SelectElement(selectedNow, true); - - // first action on element + this.SelectElement(selectedNow, true); if (mousedNow != null) mousedNow.OnPressed?.Invoke(mousedNow); } else if (this.Input.IsMouseButtonPressed(MouseButton.Right)) { - // secondary action on element if (mousedNow != null) mousedNow.OnSecondaryPressed?.Invoke(mousedNow); - } else if (this.Input.IsKeyPressed(Keys.Enter) || this.Input.IsKeyPressed(Keys.Space)) { + } + + // KEYBOARD INPUT + else if (this.Input.IsKeyPressed(Keys.Enter) || this.Input.IsKeyPressed(Keys.Space)) { if (this.SelectedElement != null) { if (this.Input.IsModifierKeyDown(ModifierKey.Shift)) { // secondary action on element using space or enter @@ -64,9 +66,25 @@ namespace MLEM.Ui { // tab or shift-tab to next or previous element this.SelectElement(this.GetNextElement(this.Input.IsModifierKeyDown(ModifierKey.Shift)), false); } + + // TOUCH INPUT + else if (this.Input.GetGesture(GestureType.Tap, out var tap)) { + var tapped = this.GetElementUnderPos(tap.Position.ToPoint()); + this.SelectElement(tapped, true); + if (tapped != null) + tapped.OnPressed?.Invoke(tapped); + } else if (this.Input.GetGesture(GestureType.Hold, out var hold)) { + var held = this.GetElementUnderPos(hold.Position.ToPoint()); + this.SelectElement(held, true); + if (held != null) + held.OnSecondaryPressed?.Invoke(held); + } } public void SelectElement(Element element, bool mouse) { + if (this.SelectedElement == element) + return; + if (this.SelectedElement != null) this.SelectedElement.OnDeselected?.Invoke(this.SelectedElement); if (element != null) @@ -76,9 +94,9 @@ namespace MLEM.Ui { this.system.Propagate(e => e.OnSelectedElementChanged?.Invoke(e, element)); } - public Element GetMousedElement() { + public Element GetElementUnderPos(Point position) { foreach (var root in this.system.GetRootElements()) { - var moused = root.Element.GetMousedElement(); + var moused = root.Element.GetElementUnderPos(position); if (moused != null) return moused; } diff --git a/MLEM.Ui/UiSystem.cs b/MLEM.Ui/UiSystem.cs index 1cd6ec7..c749bdf 100644 --- a/MLEM.Ui/UiSystem.cs +++ b/MLEM.Ui/UiSystem.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework.Input; using MLEM.Extensions; using MLEM.Font; using MLEM.Input; @@ -48,7 +49,7 @@ namespace MLEM.Ui { public SamplerState SamplerState = SamplerState.PointClamp; public UiControls Controls; public readonly bool SupportsTextInput; - + public UiSystem(GameWindow window, GraphicsDevice device, UiStyle style, InputHandler inputHandler = null) { this.Controls = new UiControls(this, inputHandler); this.GraphicsDevice = device; @@ -61,11 +62,12 @@ namespace MLEM.Ui { foreach (var root in this.rootElements) root.Element.ForceUpdateArea(); }; + try { - window.TextInput += (sender, args) => { + NativeTextInput.AddToTextInput(window, (key, character) => { foreach (var root in this.rootElements) - root.Element.Propagate(e => e.OnTextInput?.Invoke(e, args.Key, args.Character)); - }; + root.Element.Propagate(e => e.OnTextInput?.Invoke(e, key, character)); + }); this.SupportsTextInput = true; } catch (TypeLoadException) { this.SupportsTextInput = false; @@ -144,6 +146,14 @@ namespace MLEM.Ui { root.Element.Propagate(action); } + private static class NativeTextInput { + + internal static void AddToTextInput(GameWindow window, Action func) { + window.TextInput += (sender, args) => func(args.Key, args.Character); + } + + } + } public class RootElement { diff --git a/MLEM.sln b/MLEM.sln index 508a743..2079c78 100644 --- a/MLEM.sln +++ b/MLEM.sln @@ -10,6 +10,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Demos", "Demos\Demos.csproj EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MLEM.Ui", "MLEM.Ui\MLEM.Ui.csproj", "{6F00629A-8B87-4264-8896-19983285E32F}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AndroidTests", "Test\AndroidTests.csproj", "{410C0262-131C-4D0E-910D-D01B4F7143E0}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -36,5 +38,9 @@ Global {6F00629A-8B87-4264-8896-19983285E32F}.Debug|Any CPU.Build.0 = Debug|Any CPU {6F00629A-8B87-4264-8896-19983285E32F}.Release|Any CPU.ActiveCfg = Release|Any CPU {6F00629A-8B87-4264-8896-19983285E32F}.Release|Any CPU.Build.0 = Release|Any CPU + {410C0262-131C-4D0E-910D-D01B4F7143E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {410C0262-131C-4D0E-910D-D01B4F7143E0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {410C0262-131C-4D0E-910D-D01B4F7143E0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {410C0262-131C-4D0E-910D-D01B4F7143E0}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal diff --git a/MLEM/Input/InputHandler.cs b/MLEM/Input/InputHandler.cs index 05c0bf8..23b0d0f 100644 --- a/MLEM/Input/InputHandler.cs +++ b/MLEM/Input/InputHandler.cs @@ -176,12 +176,19 @@ namespace MLEM.Input { return this.WasGamepadButtonUp(button, index) && this.IsGamepadButtonDown(button, index); } - public GestureSample GetGesture(GestureType type) { + public void EnableGestures(params GestureType[] gestures) { + foreach (var gesture in gestures) + TouchPanel.EnabledGestures |= gesture; + } + + public bool GetGesture(GestureType type, out GestureSample sample) { foreach (var gesture in this.Gestures) { - if (gesture.GestureType == type) - return gesture; + if (gesture.GestureType == type) { + sample = gesture; + return true; + } } - return default; + return false; } public bool IsDown(object control, int index = -1) { diff --git a/Test/Activity1.cs b/Test/Activity1.cs new file mode 100644 index 0000000..cf60926 --- /dev/null +++ b/Test/Activity1.cs @@ -0,0 +1,25 @@ +using Android.App; +using Android.Content.PM; +using Android.OS; +using Android.Views; + +namespace AndroidTests { + [Activity(Label = "AndroidTests" + , MainLauncher = true + , Icon = "@drawable/icon" + , Theme = "@style/Theme.Splash" + , AlwaysRetainTaskState = true + , LaunchMode = LaunchMode.SingleInstance + , ScreenOrientation = ScreenOrientation.UserLandscape + , ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.Keyboard | ConfigChanges.KeyboardHidden | ConfigChanges.ScreenSize)] + public class Activity1 : Microsoft.Xna.Framework.AndroidGameActivity { + + protected override void OnCreate(Bundle bundle) { + base.OnCreate(bundle); + var g = new GameImpl(); + this.SetContentView((View) g.Services.GetService(typeof(View))); + g.Run(); + } + + } +} \ No newline at end of file diff --git a/Test/AndroidTests.csproj b/Test/AndroidTests.csproj new file mode 100644 index 0000000..8f0f434 --- /dev/null +++ b/Test/AndroidTests.csproj @@ -0,0 +1,114 @@ + + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {410C0262-131C-4D0E-910D-D01B4F7143E0} + {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Library + Properties + AndroidTests + AndroidTests + 512 + true + Resources\Resource.Designer.cs + Off + armeabi-v7a;x86 + .m4a + + v7.1 + Android + Properties\AndroidManifest.xml + True + + + true + full + false + bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\ + DEBUG;TRACE;ANDROID + prompt + 4 + True + None + + + pdbonly + true + bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\ + TRACE;ANDROID + prompt + 4 + False + SdkOnly + + + + ..\packages\Coroutine.1.0.1\lib\netstandard2.0\Coroutine.dll + True + + + + ..\packages\MonoGame.Extended.3.7.0\lib\netstandard2.0\MonoGame.Extended.dll + True + + + + ..\packages\Newtonsoft.Json.11.0.2\lib\netstandard2.0\Newtonsoft.Json.dll + True + + + + + + + $(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\Android\MonoGame.Framework.dll + + + + + + + + + + + + + + + + + + + + + + + + {232a6513-a28c-4d7f-ba5a-89281bfc1538} + MLEM.Extended + + + {997f4739-7bec-4621-b9ca-68deb2d74412} + MLEM.Startup + + + {6f00629a-8b87-4264-8896-19983285e32f} + MLEM.Ui + + + {1d6ab762-43c4-4775-8924-707c7ec3f142} + MLEM + + + + + + + + + \ No newline at end of file diff --git a/Test/Content/Content.mgcb b/Test/Content/Content.mgcb new file mode 100644 index 0000000..e25af4b --- /dev/null +++ b/Test/Content/Content.mgcb @@ -0,0 +1,34 @@ + +#----------------------------- Global Properties ----------------------------# + +/outputDir:bin/$(Platform) +/intermediateDir:obj/$(Platform) +/platform:Android +/config: +/profile:Reach +/compress:False + +#-------------------------------- References --------------------------------# + + +#---------------------------------- Content ---------------------------------# + +#begin Textures/Test.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:Textures/Test.png + +#begin Fonts/TestFont.spritefont +/importer:FontDescriptionImporter +/processor:FontDescriptionProcessor +/processorParam:PremultiplyAlpha=True +/processorParam:TextureFormat=Compressed +/build:Fonts/TestFont.spritefont + diff --git a/Test/Content/Fonts/TestFont.spritefont b/Test/Content/Fonts/TestFont.spritefont new file mode 100644 index 0000000..54ab9ac --- /dev/null +++ b/Test/Content/Fonts/TestFont.spritefont @@ -0,0 +1,60 @@ + + + + + + + Arial + + + 32 + + + 0 + + + true + + + + + + * + + + + + + ɏ + + + + diff --git a/Test/Content/Textures/Test.png b/Test/Content/Textures/Test.png new file mode 100644 index 0000000..7d88c33 Binary files /dev/null and b/Test/Content/Textures/Test.png differ diff --git a/Test/GameImpl.cs b/Test/GameImpl.cs new file mode 100644 index 0000000..fa24ba2 --- /dev/null +++ b/Test/GameImpl.cs @@ -0,0 +1,50 @@ +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using MLEM.Font; +using MLEM.Startup; +using MLEM.Textures; +using MLEM.Ui; +using MLEM.Ui.Elements; +using MLEM.Ui.Style; + +namespace AndroidTests { + public class GameImpl : MlemGame { + + protected override void LoadContent() { + base.LoadContent(); + var tex = LoadContent("Textures/Test"); + var style = new UntexturedStyle(this.SpriteBatch) { + Font = new GenericSpriteFont(LoadContent("Fonts/TestFont")), + TextScale = 0.1F, + PanelTexture = new NinePatch(new TextureRegion(tex, 0, 8, 24, 24), 8), + ButtonTexture = new NinePatch(new TextureRegion(tex, 24, 8, 16, 16), 4), + TextFieldTexture = new NinePatch(new TextureRegion(tex, 24, 8, 16, 16), 4), + ScrollBarBackground = new NinePatch(new TextureRegion(tex, 12, 0, 4, 8), 1, 1, 2, 2), + ScrollBarScrollerTexture = new NinePatch(new TextureRegion(tex, 8, 0, 4, 8), 1, 1, 2, 2), + CheckboxTexture = new NinePatch(new TextureRegion(tex, 24, 8, 16, 16), 4), + CheckboxCheckmark = new TextureRegion(tex, 24, 0, 8, 8), + RadioTexture = new NinePatch(new TextureRegion(tex, 16, 0, 8, 8), 3), + RadioCheckmark = new TextureRegion(tex, 32, 0, 8, 8) + }; + this.UiSystem.Style = style; + this.UiSystem.GlobalScale = 10; + this.UiSystem.AutoScaleWithScreen = true; + + var panel = new Panel(Anchor.Center, new Vector2(100, 0), Vector2.Zero, true); + this.UiSystem.Add("Panel", panel); + panel.AddChild(new Paragraph(Anchor.AutoLeft, 1, "I am Android")); + + var image = new Image(Anchor.AutoCenter, new Vector2(50, 50), new TextureRegion(tex, 0, 0, 8, 8)) {IsHidden = true}; + panel.AddChild(image); + panel.AddChild(new Button(Anchor.AutoCenter, new Vector2(0.5F, 10), "Toggle Image") { + OnPressed = element => image.IsHidden = !image.IsHidden + }); + } + + protected override void DoDraw(GameTime gameTime) { + this.GraphicsDevice.Clear(Color.CornflowerBlue); + base.DoDraw(gameTime); + } + + } +} \ No newline at end of file diff --git a/Test/Properties/AndroidManifest.xml b/Test/Properties/AndroidManifest.xml new file mode 100644 index 0000000..e775002 --- /dev/null +++ b/Test/Properties/AndroidManifest.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/Test/Properties/AssemblyInfo.cs b/Test/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..1224698 --- /dev/null +++ b/Test/Properties/AssemblyInfo.cs @@ -0,0 +1,41 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using Android.App; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("AndroidTests")] +[assembly: AssemblyProduct("AndroidTests")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyCopyright("Copyright © 2017")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("6f377592-2266-4c47-855e-6260ff75e1f4")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] + +// Add some common permissions, these can be removed if not needed +[assembly: UsesPermission(Android.Manifest.Permission.Internet)] +[assembly: UsesPermission(Android.Manifest.Permission.WriteExternalStorage)] \ No newline at end of file diff --git a/Test/Resources/Drawable/Icon.png b/Test/Resources/Drawable/Icon.png new file mode 100644 index 0000000..f6f4f41 Binary files /dev/null and b/Test/Resources/Drawable/Icon.png differ diff --git a/Test/Resources/Drawable/Splash.png b/Test/Resources/Drawable/Splash.png new file mode 100644 index 0000000..2f86107 Binary files /dev/null and b/Test/Resources/Drawable/Splash.png differ diff --git a/Test/Resources/Resource.Designer.cs b/Test/Resources/Resource.Designer.cs new file mode 100644 index 0000000..52ce691 --- /dev/null +++ b/Test/Resources/Resource.Designer.cs @@ -0,0 +1,99 @@ +#pragma warning disable 1591 +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::Android.Runtime.ResourceDesignerAttribute("AndroidTests.Resource", IsApplication=true)] + +namespace AndroidTests +{ + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "1.0.0.0")] + public partial class Resource + { + + static Resource() + { + global::Android.Runtime.ResourceIdManager.UpdateIdValues(); + } + + public static void UpdateIdValues() + { + } + + public partial class Attribute + { + + static Attribute() + { + global::Android.Runtime.ResourceIdManager.UpdateIdValues(); + } + + private Attribute() + { + } + } + + public partial class Drawable + { + + // aapt resource value: 0x7f020000 + public const int Icon = 2130837504; + + // aapt resource value: 0x7f020001 + public const int Splash = 2130837505; + + static Drawable() + { + global::Android.Runtime.ResourceIdManager.UpdateIdValues(); + } + + private Drawable() + { + } + } + + public partial class String + { + + // aapt resource value: 0x7f030001 + public const int ApplicationName = 2130903041; + + // aapt resource value: 0x7f030000 + public const int Hello = 2130903040; + + static String() + { + global::Android.Runtime.ResourceIdManager.UpdateIdValues(); + } + + private String() + { + } + } + + public partial class Style + { + + // aapt resource value: 0x7f040000 + public const int Theme_Splash = 2130968576; + + static Style() + { + global::Android.Runtime.ResourceIdManager.UpdateIdValues(); + } + + private Style() + { + } + } + } +} +#pragma warning restore 1591 diff --git a/Test/Resources/Values/Strings.xml b/Test/Resources/Values/Strings.xml new file mode 100644 index 0000000..7448bbf --- /dev/null +++ b/Test/Resources/Values/Strings.xml @@ -0,0 +1,5 @@ + + + Hello World, Click Me! + AndroidTests + diff --git a/Test/Resources/Values/Styles.xml b/Test/Resources/Values/Styles.xml new file mode 100644 index 0000000..5102134 --- /dev/null +++ b/Test/Resources/Values/Styles.xml @@ -0,0 +1,7 @@ + + + + diff --git a/Test/packages.config b/Test/packages.config new file mode 100644 index 0000000..003ddcd --- /dev/null +++ b/Test/packages.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file