diff --git a/AndroidBindableLibraries/Balloon/Additions/AboutAdditions.txt b/AndroidBindableLibraries/Balloon/Additions/AboutAdditions.txt
new file mode 100644
index 00000000..2775bd36
--- /dev/null
+++ b/AndroidBindableLibraries/Balloon/Additions/AboutAdditions.txt
@@ -0,0 +1,48 @@
+Additions allow you to add arbitrary C# to the generated classes
+before they are compiled. This can be helpful for providing convenience
+methods or adding pure C# classes.
+
+== Adding Methods to Generated Classes ==
+
+Let's say the library being bound has a Rectangle class with a constructor
+that takes an x and y position, and a width and length size. It will look like
+this:
+
+public partial class Rectangle
+{
+ public Rectangle (int x, int y, int width, int height)
+ {
+ // JNI bindings
+ }
+}
+
+Imagine we want to add a constructor to this class that takes a Point and
+Size structure instead of 4 ints. We can add a new file called Rectangle.cs
+with a partial class containing our new method:
+
+public partial class Rectangle
+{
+ public Rectangle (Point location, Size size) :
+ this (location.X, location.Y, size.Width, size.Height)
+ {
+ }
+}
+
+At compile time, the additions class will be added to the generated class
+and the final assembly will a Rectangle class with both constructors.
+
+
+== Adding C# Classes ==
+
+Another thing that can be done is adding fully C# managed classes to the
+generated library. In the above example, let's assume that there isn't a
+Point class available in Java or our library. The one we create doesn't need
+to interact with Java, so we'll create it like a normal class in C#.
+
+By adding a Point.cs file with this class, it will end up in the binding library:
+
+public class Point
+{
+ public int X { get; set; }
+ public int Y { get; set; }
+}
\ No newline at end of file
diff --git a/AndroidBindableLibraries/Balloon/Balloon.csproj b/AndroidBindableLibraries/Balloon/Balloon.csproj
new file mode 100644
index 00000000..b7a9814d
--- /dev/null
+++ b/AndroidBindableLibraries/Balloon/Balloon.csproj
@@ -0,0 +1,45 @@
+
+
+ 23
+ VladislavAntonyuk.$(AssemblyName)
+ 1.6.4
+ ReadMe.md
+ ..\..\LocalPackages\
+
+
+
+
+
+
+
+
+
+
+ 8.4.0
+
+
+ 2.7.0.2
+
+
+ 1.7.1.2
+
+
+ 1.9.23.1
+
+
+ 1.6.1.8
+
+
+ 1.13.1
+
+
+ 1.7.0
+
+
+
+
+ True
+ \
+
+
+
\ No newline at end of file
diff --git a/AndroidBindableLibraries/Balloon/BalloonLayoutBodyBinding.cs b/AndroidBindableLibraries/Balloon/BalloonLayoutBodyBinding.cs
new file mode 100644
index 00000000..a65c5001
--- /dev/null
+++ b/AndroidBindableLibraries/Balloon/BalloonLayoutBodyBinding.cs
@@ -0,0 +1,24 @@
+namespace Com.Skydoves.Balloon.Databinding;
+
+using Android.Runtime;
+
+public sealed partial class BalloonLayoutBodyBinding : global::Java.Lang.Object, global::AndroidX.ViewBinding.IViewBinding
+{
+ public unsafe global::Android.Views.View Root
+ {
+ // Metadata.xml XPath method reference: path="/api/package[@name='com.skydoves.balloon.databinding']/class[@name='BalloonLayoutOverlayBinding']/method[@name='getRoot' and count(parameter)=0]"
+ [Register("getRoot", "()Lcom/skydoves/balloon/overlay/BalloonAnchorOverlayView;", "")]
+ get
+ {
+ const string __id = "getRoot.()Lcom/skydoves/balloon/overlay/BalloonAnchorOverlayView;";
+ try
+ {
+ var __rm = _members.InstanceMethods.InvokeAbstractObjectMethod(__id, this, null);
+ return global::Java.Lang.Object.GetObject(__rm.Handle, JniHandleOwnership.TransferLocalRef)!;
+ }
+ finally
+ {
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/AndroidBindableLibraries/Balloon/BalloonLayoutOverlayBinding.cs b/AndroidBindableLibraries/Balloon/BalloonLayoutOverlayBinding.cs
new file mode 100644
index 00000000..2f87bf62
--- /dev/null
+++ b/AndroidBindableLibraries/Balloon/BalloonLayoutOverlayBinding.cs
@@ -0,0 +1,24 @@
+namespace Com.Skydoves.Balloon.Databinding;
+
+using Android.Runtime;
+
+public sealed partial class BalloonLayoutOverlayBinding : global::Java.Lang.Object, global::AndroidX.ViewBinding.IViewBinding
+{
+ public unsafe global::Android.Views.View Root
+ {
+ // Metadata.xml XPath method reference: path="/api/package[@name='com.skydoves.balloon.databinding']/class[@name='BalloonLayoutOverlayBinding']/method[@name='getRoot' and count(parameter)=0]"
+ [Register("getRoot", "()Lcom/skydoves/balloon/overlay/BalloonAnchorOverlayView;", "")]
+ get
+ {
+ const string __id = "getRoot.()Lcom/skydoves/balloon/overlay/BalloonAnchorOverlayView;";
+ try
+ {
+ var __rm = _members.InstanceMethods.InvokeAbstractObjectMethod(__id, this, null);
+ return global::Java.Lang.Object.GetObject(__rm.Handle, JniHandleOwnership.TransferLocalRef)!;
+ }
+ finally
+ {
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/AndroidBindableLibraries/Balloon/ReadMe.md b/AndroidBindableLibraries/Balloon/ReadMe.md
new file mode 100644
index 00000000..e8ba739f
--- /dev/null
+++ b/AndroidBindableLibraries/Balloon/ReadMe.md
@@ -0,0 +1,3 @@
+# Android Balloon
+
+Android Java Library Binding for [Balloon](https://github.com/skydoves/Balloon)
\ No newline at end of file
diff --git a/AndroidBindableLibraries/Balloon/Transforms/EnumFields.xml b/AndroidBindableLibraries/Balloon/Transforms/EnumFields.xml
new file mode 100644
index 00000000..22959957
--- /dev/null
+++ b/AndroidBindableLibraries/Balloon/Transforms/EnumFields.xml
@@ -0,0 +1,14 @@
+
+
+
\ No newline at end of file
diff --git a/AndroidBindableLibraries/Balloon/Transforms/EnumMethods.xml b/AndroidBindableLibraries/Balloon/Transforms/EnumMethods.xml
new file mode 100644
index 00000000..49216c61
--- /dev/null
+++ b/AndroidBindableLibraries/Balloon/Transforms/EnumMethods.xml
@@ -0,0 +1,13 @@
+
+
+
\ No newline at end of file
diff --git a/AndroidBindableLibraries/Balloon/Transforms/Metadata.xml b/AndroidBindableLibraries/Balloon/Transforms/Metadata.xml
new file mode 100644
index 00000000..e23cf28f
--- /dev/null
+++ b/AndroidBindableLibraries/Balloon/Transforms/Metadata.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/AndroidBindableLibraries/Sample/App.xaml b/AndroidBindableLibraries/Sample/App.xaml
new file mode 100644
index 00000000..44de3734
--- /dev/null
+++ b/AndroidBindableLibraries/Sample/App.xaml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/AndroidBindableLibraries/Sample/App.xaml.cs b/AndroidBindableLibraries/Sample/App.xaml.cs
new file mode 100644
index 00000000..0d0f7b65
--- /dev/null
+++ b/AndroidBindableLibraries/Sample/App.xaml.cs
@@ -0,0 +1,12 @@
+namespace Sample
+{
+ public partial class App : Application
+ {
+ public App()
+ {
+ InitializeComponent();
+
+ MainPage = new AppShell();
+ }
+ }
+}
diff --git a/AndroidBindableLibraries/Sample/AppShell.xaml b/AndroidBindableLibraries/Sample/AppShell.xaml
new file mode 100644
index 00000000..a2993df7
--- /dev/null
+++ b/AndroidBindableLibraries/Sample/AppShell.xaml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
diff --git a/AndroidBindableLibraries/Sample/AppShell.xaml.cs b/AndroidBindableLibraries/Sample/AppShell.xaml.cs
new file mode 100644
index 00000000..a3797080
--- /dev/null
+++ b/AndroidBindableLibraries/Sample/AppShell.xaml.cs
@@ -0,0 +1,10 @@
+namespace Sample
+{
+ public partial class AppShell : Shell
+ {
+ public AppShell()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/AndroidBindableLibraries/Sample/BallonContent.xaml b/AndroidBindableLibraries/Sample/BallonContent.xaml
new file mode 100644
index 00000000..c60ac9e4
--- /dev/null
+++ b/AndroidBindableLibraries/Sample/BallonContent.xaml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/AndroidBindableLibraries/Sample/BallonContent.xaml.cs b/AndroidBindableLibraries/Sample/BallonContent.xaml.cs
new file mode 100644
index 00000000..ae64cf9b
--- /dev/null
+++ b/AndroidBindableLibraries/Sample/BallonContent.xaml.cs
@@ -0,0 +1,16 @@
+namespace Sample;
+
+using Android.Widget;
+
+public partial class BallonContent : ContentView
+{
+ public BallonContent()
+ {
+ InitializeComponent();
+ }
+
+ private void Button_OnClicked(object? sender, EventArgs e)
+ {
+ Toast.MakeText(Platform.AppContext, "ButtonClicked", ToastLength.Long).Show();
+ }
+}
\ No newline at end of file
diff --git a/AndroidBindableLibraries/Sample/Calendar/CalendarMaterialHandler.cs b/AndroidBindableLibraries/Sample/Calendar/CalendarMaterialHandler.cs
new file mode 100644
index 00000000..3a72e6fa
--- /dev/null
+++ b/AndroidBindableLibraries/Sample/Calendar/CalendarMaterialHandler.cs
@@ -0,0 +1,100 @@
+namespace MauiBells.Calendar;
+
+using System.ComponentModel;
+using Android;
+using Com.Applandeo.Materialcalendarview;
+using Com.Applandeo.Materialcalendarview.Listeners;
+using Java.Lang;
+using Microsoft.Maui.Handlers;
+using Sample.Calendar;
+using Calendar = Com.Applandeo.Materialcalendarview.CalendarView;
+
+public class CalendarMaterialHandler(IPropertyMapper mapper, CommandMapper? commandMapper = null) : ViewHandler(mapper, commandMapper)
+{
+ public static IPropertyMapper PropertyMapper = new PropertyMapper(ViewMapper)
+ {
+ [nameof(ICalendarView.FirstDayOfWeek)] = MapFirstDayOfWeek,
+ [nameof(ICalendarView.MinDate)] = MapMinDate,
+ [nameof(ICalendarView.MaxDate)] = MapMaxDate,
+ [nameof(ICalendarView.SelectedDate)] = MapSelectedDate,
+ };
+
+ public static CommandMapper CommandMapper = new(ViewCommandMapper);
+
+ public CalendarMaterialHandler() : this(PropertyMapper, CommandMapper)
+ {
+ }
+
+ protected override Calendar CreatePlatformView()
+ {
+ return new Calendar(Context);
+ }
+
+ protected override void ConnectHandler(Calendar platformView)
+ {
+ base.ConnectHandler(platformView);
+ platformView.CalendarDayClick += PlatformView_SelectedDatesChanged;
+ }
+
+ private void PlatformView_SelectedDatesChanged(object? sender, CalendarDayClickEventArgs e)
+ {
+ var calendar = e.CalendarDay.Calendar;
+ var time = TimeSpan.FromMilliseconds(calendar.TimeInMillis);
+ var result = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
+ VirtualView.SelectedDate = new DateTimeOffset(result.Add(time).Add(TimeSpan.FromMilliseconds(calendar.TimeZone.RawOffset)));
+ VirtualView.OnSelectedDateChanged(VirtualView.SelectedDate);
+ }
+
+ protected override void DisconnectHandler(Calendar platformView)
+ {
+ platformView.CalendarDayClick -= PlatformView_SelectedDatesChanged;
+ base.DisconnectHandler(platformView);
+ }
+
+ private static void MapFirstDayOfWeek(CalendarMaterialHandler handler, ICalendarView virtualView)
+ {
+ var calendarWeekDate = virtualView.FirstDayOfWeek switch
+ {
+ DayOfWeek.Sunday => CalendarWeekDay.Sunday,
+ DayOfWeek.Monday => CalendarWeekDay.Monday,
+ DayOfWeek.Tuesday => CalendarWeekDay.Tuesday,
+ DayOfWeek.Wednesday => CalendarWeekDay.Wednesday,
+ DayOfWeek.Thursday => CalendarWeekDay.Thursday,
+ DayOfWeek.Friday => CalendarWeekDay.Friday,
+ DayOfWeek.Saturday => CalendarWeekDay.Saturday,
+ _ => throw new InvalidEnumArgumentException(),
+ };
+ ArgumentNullException.ThrowIfNull(calendarWeekDate);
+ handler.PlatformView.SetFirstDayOfWeek(calendarWeekDate);
+ }
+
+ private static void MapMinDate(CalendarMaterialHandler handler, ICalendarView virtualView)
+ {
+ var calendar = Java.Util.Calendar.Instance;
+ calendar.Set(virtualView.MinDate.Year, virtualView.MinDate.Month - 1, virtualView.MinDate.Day);
+ handler.PlatformView.SetMinimumDate(calendar);
+ }
+
+ private static void MapMaxDate(CalendarMaterialHandler handler, ICalendarView virtualView)
+ {
+ var calendar = Java.Util.Calendar.Instance;
+ calendar.Set(virtualView.MaxDate.Year, virtualView.MaxDate.Month - 1, virtualView.MaxDate.Day);
+ handler.PlatformView.SetMaximumDate(calendar);
+ }
+
+ private static void MapSelectedDate(CalendarMaterialHandler handler, ICalendarView virtualView)
+ {
+ if (virtualView.SelectedDate is null)
+ {
+ return;
+ }
+
+ var calendar = Java.Util.Calendar.Instance;
+ calendar.Set(virtualView.SelectedDate.Value.Year, virtualView.SelectedDate.Value.Month - 1, virtualView.SelectedDate.Value.Day);
+ List events = new();
+ var day = new CalendarDay(calendar);
+ day.BackgroundResource = Integer.ValueOf(Resource.Color.HoloRedDark);
+ events.Add(day);
+ handler.PlatformView.SetCalendarDays(events);
+ }
+}
\ No newline at end of file
diff --git a/AndroidBindableLibraries/Sample/Calendar/CalendarView.cs b/AndroidBindableLibraries/Sample/Calendar/CalendarView.cs
new file mode 100644
index 00000000..72c3179b
--- /dev/null
+++ b/AndroidBindableLibraries/Sample/Calendar/CalendarView.cs
@@ -0,0 +1,51 @@
+namespace Sample.Calendar;
+
+using System.ComponentModel;
+
+public class CalendarView : View, ICalendarView
+{
+ readonly WeakEventManager calendarViewEventManager = new();
+
+ public static readonly BindableProperty FirstDayOfWeekProperty = BindableProperty.Create(nameof(FirstDayOfWeek), typeof(DayOfWeek), typeof(CalendarView), default(DayOfWeek));
+ public static readonly BindableProperty MinDateProperty = BindableProperty.Create(nameof(MinDate), typeof(DateTimeOffset), typeof(CalendarView), DateTimeOffset.MinValue);
+ public static readonly BindableProperty MaxDateProperty = BindableProperty.Create(nameof(MaxDate), typeof(DateTimeOffset), typeof(CalendarView), DateTimeOffset.MaxValue);
+ public static readonly BindableProperty SelectedDateProperty = BindableProperty.Create(nameof(SelectedDate), typeof(DateTimeOffset?), typeof(CalendarView));
+
+ public DayOfWeek FirstDayOfWeek
+ {
+ get => (DayOfWeek)GetValue(FirstDayOfWeekProperty);
+ set => SetValue(FirstDayOfWeekProperty, value);
+ }
+
+ [TypeConverter(typeof(DateTimeOffsetStringConverter))]
+ public DateTimeOffset MinDate
+ {
+ get => (DateTimeOffset)GetValue(MinDateProperty);
+ set => SetValue(MinDateProperty, value);
+ }
+
+ [TypeConverter(typeof(DateTimeOffsetStringConverter))]
+ public DateTimeOffset MaxDate
+ {
+ get => (DateTimeOffset)GetValue(MaxDateProperty);
+ set => SetValue(MaxDateProperty, value);
+ }
+
+ [TypeConverter(typeof(DateTimeOffsetStringConverter))]
+ public DateTimeOffset? SelectedDate
+ {
+ get => (DateTimeOffset?)GetValue(SelectedDateProperty);
+ set => SetValue(SelectedDateProperty, value);
+ }
+
+ public event EventHandler SelectedDateChanged
+ {
+ add => calendarViewEventManager.AddEventHandler(value);
+ remove => calendarViewEventManager.RemoveEventHandler(value);
+ }
+
+ void ICalendarView.OnSelectedDateChanged(DateTimeOffset? selectedDate)
+ {
+ calendarViewEventManager.HandleEvent(this, new SelectedDateChangedEventArgs(selectedDate), nameof(SelectedDateChanged));
+ }
+}
\ No newline at end of file
diff --git a/AndroidBindableLibraries/Sample/Calendar/DateTimeOffsetStringConverter.cs b/AndroidBindableLibraries/Sample/Calendar/DateTimeOffsetStringConverter.cs
new file mode 100644
index 00000000..f064b9bc
--- /dev/null
+++ b/AndroidBindableLibraries/Sample/Calendar/DateTimeOffsetStringConverter.cs
@@ -0,0 +1,17 @@
+namespace Sample.Calendar;
+
+using System.ComponentModel;
+using System.Globalization;
+
+public class DateTimeOffsetStringConverter : TypeConverter
+{
+ public override object ConvertFrom(ITypeDescriptorContext? context, CultureInfo? culture, object value)
+ {
+ if (value is string valueString)
+ {
+ return DateTimeOffset.Parse(valueString);
+ }
+
+ return DateTimeOffset.MinValue;
+ }
+}
\ No newline at end of file
diff --git a/AndroidBindableLibraries/Sample/Calendar/ICalendarView.cs b/AndroidBindableLibraries/Sample/Calendar/ICalendarView.cs
new file mode 100644
index 00000000..94948235
--- /dev/null
+++ b/AndroidBindableLibraries/Sample/Calendar/ICalendarView.cs
@@ -0,0 +1,10 @@
+namespace Sample.Calendar;
+
+public interface ICalendarView : IView
+{
+ DayOfWeek FirstDayOfWeek { get; }
+ DateTimeOffset MinDate { get; }
+ DateTimeOffset MaxDate { get; }
+ DateTimeOffset? SelectedDate { get; set; }
+ void OnSelectedDateChanged(DateTimeOffset? selectedDate);
+}
\ No newline at end of file
diff --git a/AndroidBindableLibraries/Sample/Calendar/SelectedDateChangedEventArgs.cs b/AndroidBindableLibraries/Sample/Calendar/SelectedDateChangedEventArgs.cs
new file mode 100644
index 00000000..fa135451
--- /dev/null
+++ b/AndroidBindableLibraries/Sample/Calendar/SelectedDateChangedEventArgs.cs
@@ -0,0 +1,6 @@
+namespace Sample.Calendar;
+
+public class SelectedDateChangedEventArgs(DateTimeOffset? selectedDate) : EventArgs
+{
+ public DateTimeOffset? SelectedDate { get; } = selectedDate;
+}
\ No newline at end of file
diff --git a/AndroidBindableLibraries/Sample/MainPage.xaml b/AndroidBindableLibraries/Sample/MainPage.xaml
new file mode 100644
index 00000000..5098224a
--- /dev/null
+++ b/AndroidBindableLibraries/Sample/MainPage.xaml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/AndroidBindableLibraries/Sample/MainPage.xaml.cs b/AndroidBindableLibraries/Sample/MainPage.xaml.cs
new file mode 100644
index 00000000..8d63a8c5
--- /dev/null
+++ b/AndroidBindableLibraries/Sample/MainPage.xaml.cs
@@ -0,0 +1,52 @@
+namespace Sample
+{
+ using Android.Views;
+ using Com.Skydoves.Balloon;
+ using Microsoft.Maui.Platform;
+
+ public partial class MainPage : ContentPage
+ {
+ public MainPage()
+ {
+ InitializeComponent();
+ }
+
+ private void OnCounterClicked(object sender, EventArgs e)
+ {
+ var balloon = new Balloon.Builder(Platform.AppContext)
+ .SetText("Edit your profile here!")
+ .SetTextSize(15f)
+ .SetArrowPositionRules(ArrowPositionRules.AlignAnchor)
+ .SetArrowSize(10)
+ .SetArrowPosition(0.5f)
+ .SetPadding(12)
+ .SetCornerRadius(8f)
+ .SetBalloonAnimation(BalloonAnimation.Elastic)
+ .SetOnBalloonDismissListener(new BallonDismissListener(() =>
+ {
+ var balloon2 = new Balloon.Builder(Platform.AppContext)
+ .SetWidthRatio(1.0f)
+ .SetHeight(BalloonSizeSpec.Wrap)
+ .SetLayout(new BallonContent().ToPlatform(Handler.MauiContext))
+ .SetArrowPositionRules(ArrowPositionRules.AlignAnchor)
+ .SetArrowSize(10)
+ .SetArrowPosition(0.5f)
+ .SetPadding(12)
+ .SetCornerRadius(8f)
+ .SetBalloonAnimation(BalloonAnimation.Fade)
+ .Build();
+ balloon2.ShowAtCenter(MauiLabel.ToPlatform(MauiLabel.Handler.MauiContext));
+ }))
+ .Build();
+ balloon.ShowAtCenter(CounterBtn.ToPlatform(CounterBtn.Handler.MauiContext));
+ }
+ }
+
+ internal class BallonDismissListener(Action action) : Java.Lang.Object, IOnBalloonDismissListener
+ {
+ public void OnBalloonDismiss()
+ {
+ action();
+ }
+ }
+}
diff --git a/AndroidBindableLibraries/Sample/MauiProgram.cs b/AndroidBindableLibraries/Sample/MauiProgram.cs
new file mode 100644
index 00000000..651db428
--- /dev/null
+++ b/AndroidBindableLibraries/Sample/MauiProgram.cs
@@ -0,0 +1,26 @@
+namespace Sample
+{
+ using Calendar;
+ using MauiBells.Calendar;
+
+ public static class MauiProgram
+ {
+ public static MauiApp CreateMauiApp()
+ {
+ var builder = MauiApp.CreateBuilder();
+ builder
+ .UseMauiApp()
+ .ConfigureFonts(fonts =>
+ {
+ fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
+ fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
+ })
+ .ConfigureMauiHandlers(x =>
+ {
+ x.AddHandler();
+ });
+
+ return builder.Build();
+ }
+ }
+}
diff --git a/AndroidBindableLibraries/Sample/Platforms/Android/AndroidManifest.xml b/AndroidBindableLibraries/Sample/Platforms/Android/AndroidManifest.xml
new file mode 100644
index 00000000..e9937ad7
--- /dev/null
+++ b/AndroidBindableLibraries/Sample/Platforms/Android/AndroidManifest.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/AndroidBindableLibraries/Sample/Platforms/Android/MainActivity.cs b/AndroidBindableLibraries/Sample/Platforms/Android/MainActivity.cs
new file mode 100644
index 00000000..0873ecd5
--- /dev/null
+++ b/AndroidBindableLibraries/Sample/Platforms/Android/MainActivity.cs
@@ -0,0 +1,11 @@
+namespace Sample
+{
+ using Android.App;
+ using Android.Content.PM;
+ using Android.OS;
+
+ [Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, LaunchMode = LaunchMode.SingleTop, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]
+ public class MainActivity : MauiAppCompatActivity
+ {
+ }
+}
diff --git a/AndroidBindableLibraries/Sample/Platforms/Android/MainApplication.cs b/AndroidBindableLibraries/Sample/Platforms/Android/MainApplication.cs
new file mode 100644
index 00000000..0b3d7ab1
--- /dev/null
+++ b/AndroidBindableLibraries/Sample/Platforms/Android/MainApplication.cs
@@ -0,0 +1,16 @@
+namespace Sample
+{
+ using Android.App;
+ using Android.Runtime;
+
+ [Application]
+ public class MainApplication : MauiApplication
+ {
+ public MainApplication(IntPtr handle, JniHandleOwnership ownership)
+ : base(handle, ownership)
+ {
+ }
+
+ protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
+ }
+}
diff --git a/AndroidBindableLibraries/Sample/Platforms/Android/Resources/values/colors.xml b/AndroidBindableLibraries/Sample/Platforms/Android/Resources/values/colors.xml
new file mode 100644
index 00000000..c04d7492
--- /dev/null
+++ b/AndroidBindableLibraries/Sample/Platforms/Android/Resources/values/colors.xml
@@ -0,0 +1,6 @@
+
+
+ #512BD4
+ #2B0B98
+ #2B0B98
+
\ No newline at end of file
diff --git a/AndroidBindableLibraries/Sample/Properties/launchSettings.json b/AndroidBindableLibraries/Sample/Properties/launchSettings.json
new file mode 100644
index 00000000..edf8aadc
--- /dev/null
+++ b/AndroidBindableLibraries/Sample/Properties/launchSettings.json
@@ -0,0 +1,8 @@
+{
+ "profiles": {
+ "Windows Machine": {
+ "commandName": "MsixPackage",
+ "nativeDebugging": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/AndroidBindableLibraries/Sample/Resources/AppIcon/appicon.svg b/AndroidBindableLibraries/Sample/Resources/AppIcon/appicon.svg
new file mode 100644
index 00000000..9d63b651
--- /dev/null
+++ b/AndroidBindableLibraries/Sample/Resources/AppIcon/appicon.svg
@@ -0,0 +1,4 @@
+
+
\ No newline at end of file
diff --git a/AndroidBindableLibraries/Sample/Resources/AppIcon/appiconfg.svg b/AndroidBindableLibraries/Sample/Resources/AppIcon/appiconfg.svg
new file mode 100644
index 00000000..21dfb25f
--- /dev/null
+++ b/AndroidBindableLibraries/Sample/Resources/AppIcon/appiconfg.svg
@@ -0,0 +1,8 @@
+
+
+
\ No newline at end of file
diff --git a/AndroidBindableLibraries/Sample/Resources/Fonts/OpenSans-Regular.ttf b/AndroidBindableLibraries/Sample/Resources/Fonts/OpenSans-Regular.ttf
new file mode 100644
index 00000000..adae284d
Binary files /dev/null and b/AndroidBindableLibraries/Sample/Resources/Fonts/OpenSans-Regular.ttf differ
diff --git a/AndroidBindableLibraries/Sample/Resources/Fonts/OpenSans-Semibold.ttf b/AndroidBindableLibraries/Sample/Resources/Fonts/OpenSans-Semibold.ttf
new file mode 100644
index 00000000..1e29ca53
Binary files /dev/null and b/AndroidBindableLibraries/Sample/Resources/Fonts/OpenSans-Semibold.ttf differ
diff --git a/AndroidBindableLibraries/Sample/Resources/Images/dotnet_bot.png b/AndroidBindableLibraries/Sample/Resources/Images/dotnet_bot.png
new file mode 100644
index 00000000..f93ce025
Binary files /dev/null and b/AndroidBindableLibraries/Sample/Resources/Images/dotnet_bot.png differ
diff --git a/AndroidBindableLibraries/Sample/Resources/Raw/AboutAssets.txt b/AndroidBindableLibraries/Sample/Resources/Raw/AboutAssets.txt
new file mode 100644
index 00000000..89dc758d
--- /dev/null
+++ b/AndroidBindableLibraries/Sample/Resources/Raw/AboutAssets.txt
@@ -0,0 +1,15 @@
+Any raw assets you want to be deployed with your application can be placed in
+this directory (and child directories). Deployment of the asset to your application
+is automatically handled by the following `MauiAsset` Build Action within your `.csproj`.
+
+
+
+These files will be deployed with your package and will be accessible using Essentials:
+
+ async Task LoadMauiAsset()
+ {
+ using var stream = await FileSystem.OpenAppPackageFileAsync("AboutAssets.txt");
+ using var reader = new StreamReader(stream);
+
+ var contents = reader.ReadToEnd();
+ }
diff --git a/AndroidBindableLibraries/Sample/Resources/Splash/splash.svg b/AndroidBindableLibraries/Sample/Resources/Splash/splash.svg
new file mode 100644
index 00000000..21dfb25f
--- /dev/null
+++ b/AndroidBindableLibraries/Sample/Resources/Splash/splash.svg
@@ -0,0 +1,8 @@
+
+
+
\ No newline at end of file
diff --git a/AndroidBindableLibraries/Sample/Resources/Styles/Colors.xaml b/AndroidBindableLibraries/Sample/Resources/Styles/Colors.xaml
new file mode 100644
index 00000000..30307a5d
--- /dev/null
+++ b/AndroidBindableLibraries/Sample/Resources/Styles/Colors.xaml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+ #512BD4
+ #ac99ea
+ #242424
+ #DFD8F7
+ #9880e5
+ #2B0B98
+
+ White
+ Black
+ #D600AA
+ #190649
+ #1f1f1f
+
+ #E1E1E1
+ #C8C8C8
+ #ACACAC
+ #919191
+ #6E6E6E
+ #404040
+ #212121
+ #141414
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/AndroidBindableLibraries/Sample/Resources/Styles/Styles.xaml b/AndroidBindableLibraries/Sample/Resources/Styles/Styles.xaml
new file mode 100644
index 00000000..19ceac51
--- /dev/null
+++ b/AndroidBindableLibraries/Sample/Resources/Styles/Styles.xaml
@@ -0,0 +1,426 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/AndroidBindableLibraries/Sample/Sample.csproj b/AndroidBindableLibraries/Sample/Sample.csproj
new file mode 100644
index 00000000..4fdca70f
--- /dev/null
+++ b/AndroidBindableLibraries/Sample/Sample.csproj
@@ -0,0 +1,50 @@
+
+
+
+ Exe
+ Sample
+ true
+ true
+ enable
+ enable
+
+
+ Sample
+
+
+ com.companyname.sample
+
+
+ 1.0
+ 1
+
+ 23.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/LocalPackages/VladislavAntonyuk.Balloon.1.6.4.nupkg b/LocalPackages/VladislavAntonyuk.Balloon.1.6.4.nupkg
new file mode 100644
index 00000000..fe8501ea
Binary files /dev/null and b/LocalPackages/VladislavAntonyuk.Balloon.1.6.4.nupkg differ
diff --git a/MauiSamples.sln b/MauiSamples.sln
index 4343e5b6..9f4f4fb0 100644
--- a/MauiSamples.sln
+++ b/MauiSamples.sln
@@ -141,6 +141,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Client", "MauiTests\Client\
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MauiStaggeredCollectionView", "MauiStaggeredCollectionView\MauiStaggeredCollectionView.csproj", "{7139BF92-182F-4CA9-B2A0-DAF4110A8C12}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Balloon", "AndroidBindableLibraries\Balloon\Balloon.csproj", "{80BC6E88-5A41-426D-B625-B8EEE1453FF0}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample", "AndroidBindableLibraries\Sample\Sample.csproj", "{8782844B-0C34-42AE-8BF9-E2DB2CC95495}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -153,6 +157,16 @@ Global
{7139BF92-182F-4CA9-B2A0-DAF4110A8C12}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7139BF92-182F-4CA9-B2A0-DAF4110A8C12}.Release|Any CPU.Build.0 = Release|Any CPU
{7139BF92-182F-4CA9-B2A0-DAF4110A8C12}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ {80BC6E88-5A41-426D-B625-B8EEE1453FF0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {80BC6E88-5A41-426D-B625-B8EEE1453FF0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {80BC6E88-5A41-426D-B625-B8EEE1453FF0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {80BC6E88-5A41-426D-B625-B8EEE1453FF0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8782844B-0C34-42AE-8BF9-E2DB2CC95495}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8782844B-0C34-42AE-8BF9-E2DB2CC95495}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8782844B-0C34-42AE-8BF9-E2DB2CC95495}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {8782844B-0C34-42AE-8BF9-E2DB2CC95495}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8782844B-0C34-42AE-8BF9-E2DB2CC95495}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8782844B-0C34-42AE-8BF9-E2DB2CC95495}.Release|Any CPU.Deploy.0 = Release|Any CPU
{B91198E0-08DE-41B6-9056-95F90C3E0AD8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B91198E0-08DE-41B6-9056-95F90C3E0AD8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B91198E0-08DE-41B6-9056-95F90C3E0AD8}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
@@ -428,6 +442,8 @@ Global
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
+ {80BC6E88-5A41-426D-B625-B8EEE1453FF0} = {E08722A6-C1B6-4C83-983C-809BF721D6F1}
+ {8782844B-0C34-42AE-8BF9-E2DB2CC95495} = {E08722A6-C1B6-4C83-983C-809BF721D6F1}
{B91198E0-08DE-41B6-9056-95F90C3E0AD8} = {14D979DA-85FE-41DC-9C59-A49EE52EC9A5}
{43BACDC9-2889-476E-AF08-727E1B31D0B8} = {671C019C-7DCC-4B9E-AD7D-B9F6F35D044E}
{671C019C-7DCC-4B9E-AD7D-B9F6F35D044E} = {D3C704D0-FB95-42BA-BBF1-E7360491551F}
diff --git a/MauiStaggeredCollectionView/README.md b/MauiStaggeredCollectionView/README.md
index aae383f4..19eac5fc 100644
--- a/MauiStaggeredCollectionView/README.md
+++ b/MauiStaggeredCollectionView/README.md
@@ -6,6 +6,12 @@ Article: https://vladislavantonyuk.github.io/articles/.NET-MAUI-CollectionView-w
## Images
-![Android](https://ik.imagekit.io/VladislavAntonyuk/vladislavantonyuk/articles/54/54.png)
+![Android](https://ik.imagekit.io/VladislavAntonyuk/vladislavantonyuk/articles/54/android.png)
+
+![iOS](https://ik.imagekit.io/VladislavAntonyuk/vladislavantonyuk/articles/54/ios.png)
+
+![MacCatalyst](https://ik.imagekit.io/VladislavAntonyuk/vladislavantonyuk/articles/54/maccatalyst.png)
+
+![Windows](https://ik.imagekit.io/VladislavAntonyuk/vladislavantonyuk/articles/54/windows.png)
[![Stand With Ukraine](https://img.shields.io/badge/made_in-ukraine-ffd700.svg?labelColor=0057b7)](https://stand-with-ukraine.pp.ua)
\ No newline at end of file