diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 000000000..1ff0c4230
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,63 @@
+###############################################################################
+# Set default behavior to automatically normalize line endings.
+###############################################################################
+* text=auto
+
+###############################################################################
+# Set default behavior for command prompt diff.
+#
+# This is need for earlier builds of msysgit that does not have it on by
+# default for csharp files.
+# Note: This is only used by command line
+###############################################################################
+#*.cs diff=csharp
+
+###############################################################################
+# Set the merge driver for project and solution files
+#
+# Merging from the command prompt will add diff markers to the files if there
+# are conflicts (Merging from VS is not affected by the settings below, in VS
+# the diff markers are never inserted). Diff markers may cause the following
+# file extensions to fail to load in VS. An alternative would be to treat
+# these files as binary and thus will always conflict and require user
+# intervention with every merge. To do so, just uncomment the entries below
+###############################################################################
+#*.sln merge=binary
+#*.csproj merge=binary
+#*.vbproj merge=binary
+#*.vcxproj merge=binary
+#*.vcproj merge=binary
+#*.dbproj merge=binary
+#*.fsproj merge=binary
+#*.lsproj merge=binary
+#*.wixproj merge=binary
+#*.modelproj merge=binary
+#*.sqlproj merge=binary
+#*.wwaproj merge=binary
+
+###############################################################################
+# behavior for image files
+#
+# image files are treated as binary by default.
+###############################################################################
+#*.jpg binary
+#*.png binary
+#*.gif binary
+
+###############################################################################
+# diff behavior for common document formats
+#
+# Convert binary document formats to text before diffing them. This feature
+# is only available from the command line. Turn it on by uncommenting the
+# entries below.
+###############################################################################
+#*.doc diff=astextplain
+#*.DOC diff=astextplain
+#*.docx diff=astextplain
+#*.DOCX diff=astextplain
+#*.dot diff=astextplain
+#*.DOT diff=astextplain
+#*.pdf diff=astextplain
+#*.PDF diff=astextplain
+#*.rtf diff=astextplain
+#*.RTF diff=astextplain
diff --git a/.gitignore b/.gitignore
index 2377b3337..5cc538a62 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,79 +1,90 @@
-*.pidb
-*.userprefs
-*.swp
-*.DS_Store
-*.nib
-*.suo
-*.user
-*.pfx
-*/bin/*
-*/obj/*
-*/*/bin/*
-*/*/obj/*
-*/*/*/bin/*
-*/*/*/obj/*
-*_ReSharper.*/
-*/*/*/Resource.Designer.cs
-MWC/MWC.Core/Bin/*
-MWC/MWC.Droid/Bin/*
-MWC/MWC.Droid/Resources/Resource.Designer.cs
-MWC/MWC.WP7/Bin/*
-MWC/MWC.Core.WP7/Bin/Debug/**.db
-/TaskyPro/.bundle/
-/TaskyPro/.idea/
-/TaskyPro/.irb-history
-RazorTodo/*/Components
-/TaskyPro-Calabash/.irb-history
-/TaskyPro-Calabash/.idea/
-/TaskyPro-Calabash/.bundle/
-/TaskyPro-Calabash/test_servers/881cf2ba5a1f5085e65ee49f9c92e00c_0.4.21.apk
-/TaskyPro-Calabash/test_servers/
-/TaskyPro-Calabash/rake_env
-TaskyPro-Calabash/screenshot*.png
-/HelloTestCloudWorld/packages/
-/HelloTestCloudWorld/rake_env
-/HelloTestCloudWorld/HelloWorld.Android/mono.samples.helloworld.apk
-/HelloTestCloudWorld/.irb-history
-/HelloTestCloudWorld/.idea/
-/HelloTestCloudWorld/test_servers/
-CreditCardValidation/CreditCardValidation-Calabash/.idea
-CreditCardValidation/CreditCardValidation-UITest/packages/Xamarin.UITest.*
-CreditCardValidation/.idea
-CreditCardValidation/UITest/packages/Xamarin.UITest.0.5.0
-TaskyPro/packages/Xamarin.UITest.0.5.0
-TaskyPro/packages/Castle.Core.3.3.1
-TaskyPro/packages/Ninject.3.2.2.0
-TaskyPro/packages/Ninject.Extensions.Factory.3.2.1.0
-TaskyPro/packages/Portable.Ninject.3.3
-TaskyPro/packages/NUnit.2.6.3
-TaskyPro/packages/FluentAssertions.3.2.1
-.idea
-TaskyPro/test_servers
-TaskyPro/Components
-TaskyPro/packages/Xamarin.UITest.0.5.1
-TaskyPro-Calabash/Components/calabash-10.1.1.png
-TaskyPro-Calabash/Components/calabash-10.1.1.info
-TaskyPro-Calabash/Components/calabash-10.1.1
-CreditCardValidation/UITest/packages/Xamarin.UITest.0.6.1
-CreditCardValidation/UITest/packages/NUnit.2.6.3
-CreditCardValidation/UITest/packages/Xamarin.UITest.0.6.4
-TestCloud/CreditCardValidation/CreditCardValidation-UITest/packages/NUnit.2.6.3
-TestCloud/CreditCardValidation/CreditCardValidation-UITest/packages/Xamarin.UITest.0.6.5
-TestCloud/CreditCardValidation/CreditCardValidation-UITest/Components
-TestCloud/CreditCardValidation/CreditCardValidation-UITest/CreditCardValidation.Common/bin
-TestCloud/CreditCardValidation/CreditCardValidation-UITest/CreditCardValidation.Common/obj
-TestCloud/CreditCardValidation/CreditCardValidation-UITest/CreditCardValidation.Droid/obj
-TestCloud/CreditCardValidation/CreditCardValidation-UITest/CreditCardValidation.iOS/bin
-TestCloud/CreditCardValidation/CreditCardValidation-UITest/CreditCardValidation.Droid/bin
-TestCloud/CreditCardValidation/CreditCardValidation-UITest/CreditCardValidation.iOS/obj
-TestCloud/CreditCardValidation/CreditCardValidation-UITest/CreditCardValidation.Tests/obj
-TestCloud/CreditCardValidation/CreditCardValidation-UITest/CreditCardValidation.Tests/bin
-TestCloud/CreditCardValidation/CreditCardValidation-Calabash/calabash.framework
-TestCloud/CreditCardValidation/CreditCardValidation-Start/CreditCardValidation.iOS/obj
-TestCloud/CreditCardValidation/CreditCardValidation-Start/CreditCardValidation.Droid/obj
-TestCloud/CreditCardValidation/CreditCardValidation-Start/CreditCardValidation.Common/obj
-TestCloud/CreditCardValidation/CreditCardValidation-Start/CreditCardValidation.Common/bin
-TestCloud/CreditCardValidation/CreditCardValidation-Start/CreditCardValidation.Droid/bin
-TestCloud/CreditCardValidation/CreditCardValidation-Start/CreditCardValidation.iOS/bin
-TestCloud/CreditCardValidation/CreditCardValidation-UITest/packages/Xamarin.UITest.0.6.6
-TestCloud/CreditCardValidation/CreditCardValidation-UITest/CreditCardValidation.Tests/xtc-apikey
\ No newline at end of file
+Components
+packages
+bin
+obj
+
+*.pidb
+*.userprefs
+*.swp
+*.DS_Store
+*.nib
+*.suo
+*.user
+*.pfx
+*.lock.json
+*.nuget.props
+*.nuget.targets
+.vs
+
+# ignore Xamarin.Android Resource.Designer.cs files
+**/*.Droid/**/[Rr]esource.[Dd]esigner.cs
+**/*.Android/**/[Rr]esource.[Dd]esigner.cs
+**/Android/**/[Rr]esource.[Dd]esigner.cs
+
+*/bin/*
+*/obj/*
+*/*/bin/*
+*/*/obj/*
+*/*/*/bin/*
+*/*/*/obj/*
+*_ReSharper.*/
+
+MWC/MWC.Core/Bin/*
+MWC/MWC.Droid/Bin/*
+MWC/MWC.WP7/Bin/*
+MWC/MWC.Core.WP7/Bin/Debug/**.db
+
+RazorTodo/*/Components
+
+/TaskyPro/.bundle/
+/TaskyPro/.idea/
+/TaskyPro/.irb-history
+/TaskyPro-Calabash/.irb-history
+/TaskyPro-Calabash/.idea/
+/TaskyPro-Calabash/.bundle/
+/TaskyPro-Calabash/test_servers/881cf2ba5a1f5085e65ee49f9c92e00c_0.4.21.apk
+/TaskyPro-Calabash/test_servers/
+/TaskyPro-Calabash/rake_env
+
+/HelloTestCloudWorld/rake_env
+/HelloTestCloudWorld/HelloWorld.Android/mono.samples.helloworld.apk
+/HelloTestCloudWorld/.irb-history
+/HelloTestCloudWorld/.idea/
+/HelloTestCloudWorld/test_servers/
+
+CreditCardValidation/CreditCardValidation-Calabash/.idea
+CreditCardValidation/CreditCardValidation-UITest/packages/Xamarin.UITest.*
+CreditCardValidation/.idea
+CreditCardValidation/UITest/packages/Xamarin.UITest.0.5.0
+
+.idea
+
+TaskyPro/test_servers
+TaskyPro-Calabash/screenshot*.png
+
+TestCloud/CreditCardValidation/CreditCardValidation-UITest/CreditCardValidation.Common/bin
+TestCloud/CreditCardValidation/CreditCardValidation-UITest/CreditCardValidation.Common/obj
+TestCloud/CreditCardValidation/CreditCardValidation-UITest/CreditCardValidation.Droid/obj
+TestCloud/CreditCardValidation/CreditCardValidation-UITest/CreditCardValidation.iOS/bin
+TestCloud/CreditCardValidation/CreditCardValidation-UITest/CreditCardValidation.Droid/bin
+TestCloud/CreditCardValidation/CreditCardValidation-UITest/CreditCardValidation.iOS/obj
+TestCloud/CreditCardValidation/CreditCardValidation-UITest/CreditCardValidation.Tests/obj
+TestCloud/CreditCardValidation/CreditCardValidation-UITest/CreditCardValidation.Tests/bin
+TestCloud/CreditCardValidation/CreditCardValidation-Calabash/calabash.framework
+TestCloud/CreditCardValidation/CreditCardValidation-Start/CreditCardValidation.iOS/obj
+TestCloud/CreditCardValidation/CreditCardValidation-Start/CreditCardValidation.Droid/obj
+TestCloud/CreditCardValidation/CreditCardValidation-Start/CreditCardValidation.Common/obj
+TestCloud/CreditCardValidation/CreditCardValidation-Start/CreditCardValidation.Common/bin
+TestCloud/CreditCardValidation/CreditCardValidation-Start/CreditCardValidation.Droid/bin
+TestCloud/CreditCardValidation/CreditCardValidation-Start/CreditCardValidation.iOS/bin
+TestCloud/CreditCardValidation/CreditCardValidation-UITest/CreditCardValidation.Tests/xtc-apikey
+
+CoinTime/CoinTime/Assets/Content/animations/coinanimations.aeproperties
+CoinTime/CoinTime/Assets/Content/animations/dooranimations.aeproperties
+CoinTime/CoinTime/Assets/Content/animations/playeranimations.aeproperties
+CoinTime/CoinTime/Assets/Content/animations/propanimations.aeproperties
+
+CCDrawNode/Screenshots/Thumbs.db
+FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/AndroidObj/
+FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/iOSObj/
+.vscode/settings.json
diff --git a/AnalogClock/AnalogClock.Android/AnalogClock.Android.csproj b/AnalogClock/AnalogClock.Android/AnalogClock.Android.csproj
index e4eb83e1d..40f1a2be4 100644
--- a/AnalogClock/AnalogClock.Android/AnalogClock.Android.csproj
+++ b/AnalogClock/AnalogClock.Android/AnalogClock.Android.csproj
@@ -14,12 +14,11 @@
Resource
Resources
Assets
- true
+ false
AnalogClock.Android
-
-
+ v8.1
Properties\AndroidManifest.xml
- armeabi,armeabi-v7a,x86
+ armeabi-v7a,x86
@@ -57,9 +56,6 @@
-
- ClockModel.cs
-
@@ -70,7 +66,8 @@
-
+
+
diff --git a/AnalogClock/AnalogClock.Android/Properties/AndroidManifest.xml b/AnalogClock/AnalogClock.Android/Properties/AndroidManifest.xml
index e5f819dd5..d31b6e89a 100644
--- a/AnalogClock/AnalogClock.Android/Properties/AndroidManifest.xml
+++ b/AnalogClock/AnalogClock.Android/Properties/AndroidManifest.xml
@@ -1,5 +1,5 @@
-
+
\ No newline at end of file
diff --git a/AnalogClock/AnalogClock.Common/AnalogClock.Common.csproj b/AnalogClock/AnalogClock.Common/AnalogClock.Common.csproj
deleted file mode 100644
index e57971bef..000000000
--- a/AnalogClock/AnalogClock.Common/AnalogClock.Common.csproj
+++ /dev/null
@@ -1,52 +0,0 @@
-
-
-
-
- Debug
- AnyCPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}
- Library
- Properties
- AnalogClock.Common
- AnalogClock.Common
- v4.5.1
- 512
-
-
- true
- full
- false
- bin\Debug\
- DEBUG;TRACE
- prompt
- 4
-
-
- pdbonly
- true
- bin\Release\
- TRACE
- prompt
- 4
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/AnalogClock/AnalogClock.Common/AnalogClock.Common.projitems b/AnalogClock/AnalogClock.Common/AnalogClock.Common.projitems
new file mode 100644
index 000000000..0f53e5207
--- /dev/null
+++ b/AnalogClock/AnalogClock.Common/AnalogClock.Common.projitems
@@ -0,0 +1,14 @@
+
+
+
+ $(MSBuildAllProjects);$(MSBuildThisFileFullPath)
+ true
+ {29808547-B68A-420A-801A-B1B2A7375B8F}
+
+
+ AnalogClock.Common
+
+
+
+
+
\ No newline at end of file
diff --git a/AnalogClock/AnalogClock.Common/AnalogClock.Common.shproj b/AnalogClock/AnalogClock.Common/AnalogClock.Common.shproj
new file mode 100644
index 000000000..4463ee1b8
--- /dev/null
+++ b/AnalogClock/AnalogClock.Common/AnalogClock.Common.shproj
@@ -0,0 +1,11 @@
+
+
+
+ {29808547-B68A-420A-801A-B1B2A7375B8F}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/AnalogClock/AnalogClock.Common/Properties/AssemblyInfo.cs b/AnalogClock/AnalogClock.Common/Properties/AssemblyInfo.cs
deleted file mode 100644
index 6ca4b7751..000000000
--- a/AnalogClock/AnalogClock.Common/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// 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("AnalogClock.Common")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("AnalogClock.Common")]
-[assembly: AssemblyCopyright("Copyright © 2014")]
-[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("4b9c2a0e-26a1-46c0-b544-9329f30ffe78")]
-
-// 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")]
diff --git a/AnalogClock/AnalogClock.WindowsPhone/AnalogClock.WindowsPhone.csproj b/AnalogClock/AnalogClock.WindowsPhone/AnalogClock.WindowsPhone.csproj
deleted file mode 100644
index f5fe3fb6e..000000000
--- a/AnalogClock/AnalogClock.WindowsPhone/AnalogClock.WindowsPhone.csproj
+++ /dev/null
@@ -1,161 +0,0 @@
-
-
-
- Debug
- AnyCPU
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}
- {C089C8C0-30E0-4E22-80C0-CE093F111A43};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}
- Library
- Properties
- AnalogClock.WindowsPhone
- AnalogClock.WindowsPhone
- WindowsPhone
- v8.0
- $(TargetFrameworkVersion)
- true
-
-
- true
- true
- AnalogClock.WindowsPhone_$(Configuration)_$(Platform).xap
- Properties\AppManifest.xml
- AnalogClock.WindowsPhone.App
- true
- 11.0
- true
-
-
- true
- full
- false
- Bin\Debug
- DEBUG;TRACE;SILVERLIGHT;WINDOWS_PHONE
- true
- true
- prompt
- 4
-
-
- pdbonly
- true
- Bin\Release
- TRACE;SILVERLIGHT;WINDOWS_PHONE
- true
- true
- prompt
- 4
-
-
- true
- full
- false
- Bin\x86\Debug
- DEBUG;TRACE;SILVERLIGHT;WINDOWS_PHONE
- true
- true
- prompt
- 4
-
-
- pdbonly
- true
- Bin\x86\Release
- TRACE;SILVERLIGHT;WINDOWS_PHONE
- true
- true
- prompt
- 4
-
-
- true
- full
- false
- Bin\ARM\Debug
- DEBUG;TRACE;SILVERLIGHT;WINDOWS_PHONE
- true
- true
- prompt
- 4
-
-
- pdbonly
- true
- Bin\ARM\Release
- TRACE;SILVERLIGHT;WINDOWS_PHONE
- true
- true
- prompt
- 4
-
-
-
- ClockModel.cs
-
-
- App.xaml
-
-
-
- MainPage.xaml
-
-
-
- True
- True
- AppResources.resx
-
-
-
-
- Designer
- MSBuild:Compile
-
-
- Designer
- MSBuild:Compile
-
-
-
-
-
- Designer
-
-
-
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
-
-
- PublicResXFileCodeGenerator
- AppResources.Designer.cs
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/AnalogClock/AnalogClock.WindowsPhone/App.xaml b/AnalogClock/AnalogClock.WindowsPhone/App.xaml
deleted file mode 100644
index 2c19745ba..000000000
--- a/AnalogClock/AnalogClock.WindowsPhone/App.xaml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/AnalogClock/AnalogClock.WindowsPhone/App.xaml.cs b/AnalogClock/AnalogClock.WindowsPhone/App.xaml.cs
deleted file mode 100644
index 0e9c089f3..000000000
--- a/AnalogClock/AnalogClock.WindowsPhone/App.xaml.cs
+++ /dev/null
@@ -1,223 +0,0 @@
-using System;
-using System.Diagnostics;
-using System.Resources;
-using System.Windows;
-using System.Windows.Markup;
-using System.Windows.Navigation;
-using Microsoft.Phone.Controls;
-using Microsoft.Phone.Shell;
-using AnalogClock.WindowsPhone.Resources;
-
-namespace AnalogClock.WindowsPhone
-{
- public partial class App : Application
- {
- ///
- /// Provides easy access to the root frame of the Phone Application.
- ///
- /// The root frame of the Phone Application.
- public static PhoneApplicationFrame RootFrame { get; private set; }
-
- ///
- /// Constructor for the Application object.
- ///
- public App()
- {
- // Global handler for uncaught exceptions.
- UnhandledException += Application_UnhandledException;
-
- // Standard XAML initialization
- InitializeComponent();
-
- // Phone-specific initialization
- InitializePhoneApplication();
-
- // Language display initialization
- InitializeLanguage();
-
- // Show graphics profiling information while debugging.
- if (Debugger.IsAttached)
- {
- // Display the current frame rate counters.
- Application.Current.Host.Settings.EnableFrameRateCounter = true;
-
- // Show the areas of the app that are being redrawn in each frame.
- //Application.Current.Host.Settings.EnableRedrawRegions = true;
-
- // Enable non-production analysis visualization mode,
- // which shows areas of a page that are handed off to GPU with a colored overlay.
- //Application.Current.Host.Settings.EnableCacheVisualization = true;
-
- // Prevent the screen from turning off while under the debugger by disabling
- // the application's idle detection.
- // Caution:- Use this under debug mode only. Application that disables user idle detection will continue to run
- // and consume battery power when the user is not using the phone.
- PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled;
- }
-
- }
-
- // Code to execute when the application is launching (eg, from Start)
- // This code will not execute when the application is reactivated
- private void Application_Launching(object sender, LaunchingEventArgs e)
- {
- }
-
- // Code to execute when the application is activated (brought to foreground)
- // This code will not execute when the application is first launched
- private void Application_Activated(object sender, ActivatedEventArgs e)
- {
- }
-
- // Code to execute when the application is deactivated (sent to background)
- // This code will not execute when the application is closing
- private void Application_Deactivated(object sender, DeactivatedEventArgs e)
- {
- }
-
- // Code to execute when the application is closing (eg, user hit Back)
- // This code will not execute when the application is deactivated
- private void Application_Closing(object sender, ClosingEventArgs e)
- {
- }
-
- // Code to execute if a navigation fails
- private void RootFrame_NavigationFailed(object sender, NavigationFailedEventArgs e)
- {
- if (Debugger.IsAttached)
- {
- // A navigation has failed; break into the debugger
- Debugger.Break();
- }
- }
-
- // Code to execute on Unhandled Exceptions
- private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
- {
- if (Debugger.IsAttached)
- {
- // An unhandled exception has occurred; break into the debugger
- Debugger.Break();
- }
- }
-
- #region Phone application initialization
-
- // Avoid double-initialization
- private bool phoneApplicationInitialized = false;
-
- // Do not add any additional code to this method
- private void InitializePhoneApplication()
- {
- if (phoneApplicationInitialized)
- return;
-
- // Create the frame but don't set it as RootVisual yet; this allows the splash
- // screen to remain active until the application is ready to render.
- RootFrame = new PhoneApplicationFrame();
- RootFrame.Navigated += CompleteInitializePhoneApplication;
-
- // Handle navigation failures
- RootFrame.NavigationFailed += RootFrame_NavigationFailed;
-
- // Handle reset requests for clearing the backstack
- RootFrame.Navigated += CheckForResetNavigation;
-
- // Ensure we don't initialize again
- phoneApplicationInitialized = true;
- }
-
- // Do not add any additional code to this method
- private void CompleteInitializePhoneApplication(object sender, NavigationEventArgs e)
- {
- // Set the root visual to allow the application to render
- if (RootVisual != RootFrame)
- RootVisual = RootFrame;
-
- // Remove this handler since it is no longer needed
- RootFrame.Navigated -= CompleteInitializePhoneApplication;
- }
-
- private void CheckForResetNavigation(object sender, NavigationEventArgs e)
- {
- // If the app has received a 'reset' navigation, then we need to check
- // on the next navigation to see if the page stack should be reset
- if (e.NavigationMode == NavigationMode.Reset)
- RootFrame.Navigated += ClearBackStackAfterReset;
- }
-
- private void ClearBackStackAfterReset(object sender, NavigationEventArgs e)
- {
- // Unregister the event so it doesn't get called again
- RootFrame.Navigated -= ClearBackStackAfterReset;
-
- // Only clear the stack for 'new' (forward) and 'refresh' navigations
- if (e.NavigationMode != NavigationMode.New && e.NavigationMode != NavigationMode.Refresh)
- return;
-
- // For UI consistency, clear the entire page stack
- while (RootFrame.RemoveBackEntry() != null)
- {
- ; // do nothing
- }
- }
-
- #endregion
-
- // Initialize the app's font and flow direction as defined in its localized resource strings.
- //
- // To ensure that the font of your application is aligned with its supported languages and that the
- // FlowDirection for each of those languages follows its traditional direction, ResourceLanguage
- // and ResourceFlowDirection should be initialized in each resx file to match these values with that
- // file's culture. For example:
- //
- // AppResources.es-ES.resx
- // ResourceLanguage's value should be "es-ES"
- // ResourceFlowDirection's value should be "LeftToRight"
- //
- // AppResources.ar-SA.resx
- // ResourceLanguage's value should be "ar-SA"
- // ResourceFlowDirection's value should be "RightToLeft"
- //
- // For more info on localizing Windows Phone apps see http://go.microsoft.com/fwlink/?LinkId=262072.
- //
- private void InitializeLanguage()
- {
- try
- {
- // Set the font to match the display language defined by the
- // ResourceLanguage resource string for each supported language.
- //
- // Fall back to the font of the neutral language if the Display
- // language of the phone is not supported.
- //
- // If a compiler error is hit then ResourceLanguage is missing from
- // the resource file.
- RootFrame.Language = XmlLanguage.GetLanguage(AppResources.ResourceLanguage);
-
- // Set the FlowDirection of all elements under the root frame based
- // on the ResourceFlowDirection resource string for each
- // supported language.
- //
- // If a compiler error is hit then ResourceFlowDirection is missing from
- // the resource file.
- FlowDirection flow = (FlowDirection)Enum.Parse(typeof(FlowDirection), AppResources.ResourceFlowDirection);
- RootFrame.FlowDirection = flow;
- }
- catch
- {
- // If an exception is caught here it is most likely due to either
- // ResourceLangauge not being correctly set to a supported language
- // code or ResourceFlowDirection is set to a value other than LeftToRight
- // or RightToLeft.
-
- if (Debugger.IsAttached)
- {
- Debugger.Break();
- }
-
- throw;
- }
- }
- }
-}
\ No newline at end of file
diff --git a/AnalogClock/AnalogClock.WindowsPhone/Assets/AlignmentGrid.png b/AnalogClock/AnalogClock.WindowsPhone/Assets/AlignmentGrid.png
deleted file mode 100644
index f7d2e9780..000000000
Binary files a/AnalogClock/AnalogClock.WindowsPhone/Assets/AlignmentGrid.png and /dev/null differ
diff --git a/AnalogClock/AnalogClock.WindowsPhone/Assets/ApplicationIcon.png b/AnalogClock/AnalogClock.WindowsPhone/Assets/ApplicationIcon.png
deleted file mode 100644
index 7d95d4e08..000000000
Binary files a/AnalogClock/AnalogClock.WindowsPhone/Assets/ApplicationIcon.png and /dev/null differ
diff --git a/AnalogClock/AnalogClock.WindowsPhone/Assets/Tiles/FlipCycleTileLarge.png b/AnalogClock/AnalogClock.WindowsPhone/Assets/Tiles/FlipCycleTileLarge.png
deleted file mode 100644
index e0c59ac01..000000000
Binary files a/AnalogClock/AnalogClock.WindowsPhone/Assets/Tiles/FlipCycleTileLarge.png and /dev/null differ
diff --git a/AnalogClock/AnalogClock.WindowsPhone/Assets/Tiles/FlipCycleTileMedium.png b/AnalogClock/AnalogClock.WindowsPhone/Assets/Tiles/FlipCycleTileMedium.png
deleted file mode 100644
index e93b89d60..000000000
Binary files a/AnalogClock/AnalogClock.WindowsPhone/Assets/Tiles/FlipCycleTileMedium.png and /dev/null differ
diff --git a/AnalogClock/AnalogClock.WindowsPhone/Assets/Tiles/FlipCycleTileSmall.png b/AnalogClock/AnalogClock.WindowsPhone/Assets/Tiles/FlipCycleTileSmall.png
deleted file mode 100644
index 550b1b5e8..000000000
Binary files a/AnalogClock/AnalogClock.WindowsPhone/Assets/Tiles/FlipCycleTileSmall.png and /dev/null differ
diff --git a/AnalogClock/AnalogClock.WindowsPhone/Assets/Tiles/IconicTileMediumLarge.png b/AnalogClock/AnalogClock.WindowsPhone/Assets/Tiles/IconicTileMediumLarge.png
deleted file mode 100644
index 686e6b53f..000000000
Binary files a/AnalogClock/AnalogClock.WindowsPhone/Assets/Tiles/IconicTileMediumLarge.png and /dev/null differ
diff --git a/AnalogClock/AnalogClock.WindowsPhone/Assets/Tiles/IconicTileSmall.png b/AnalogClock/AnalogClock.WindowsPhone/Assets/Tiles/IconicTileSmall.png
deleted file mode 100644
index d4b5ede1b..000000000
Binary files a/AnalogClock/AnalogClock.WindowsPhone/Assets/Tiles/IconicTileSmall.png and /dev/null differ
diff --git a/AnalogClock/AnalogClock.WindowsPhone/LocalizedStrings.cs b/AnalogClock/AnalogClock.WindowsPhone/LocalizedStrings.cs
deleted file mode 100644
index 3c8abf36e..000000000
--- a/AnalogClock/AnalogClock.WindowsPhone/LocalizedStrings.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-using AnalogClock.WindowsPhone.Resources;
-
-namespace AnalogClock.WindowsPhone
-{
- ///
- /// Provides access to string resources.
- ///
- public class LocalizedStrings
- {
- private static AppResources _localizedResources = new AppResources();
-
- public AppResources LocalizedResources { get { return _localizedResources; } }
- }
-}
\ No newline at end of file
diff --git a/AnalogClock/AnalogClock.WindowsPhone/MainPage.xaml b/AnalogClock/AnalogClock.WindowsPhone/MainPage.xaml
deleted file mode 100644
index c526ad1e4..000000000
--- a/AnalogClock/AnalogClock.WindowsPhone/MainPage.xaml
+++ /dev/null
@@ -1,101 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/AnalogClock/AnalogClock.WindowsPhone/MainPage.xaml.cs b/AnalogClock/AnalogClock.WindowsPhone/MainPage.xaml.cs
deleted file mode 100644
index b36d5fb77..000000000
--- a/AnalogClock/AnalogClock.WindowsPhone/MainPage.xaml.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Net;
-using System.Windows;
-using System.Windows.Controls;
-using System.Windows.Navigation;
-using Microsoft.Phone.Controls;
-using Microsoft.Phone.Shell;
-using AnalogClock.WindowsPhone.Resources;
-
-namespace AnalogClock.WindowsPhone
-{
- public partial class MainPage : PhoneApplicationPage
- {
- // Constructor
- public MainPage()
- {
- InitializeComponent();
-
- // Sample code to localize the ApplicationBar
- //BuildLocalizedApplicationBar();
- }
-
- // Sample code for building a localized ApplicationBar
- //private void BuildLocalizedApplicationBar()
- //{
- // // Set the page's ApplicationBar to a new instance of ApplicationBar.
- // ApplicationBar = new ApplicationBar();
-
- // // Create a new button and set the text value to the localized string from AppResources.
- // ApplicationBarIconButton appBarButton = new ApplicationBarIconButton(new Uri("/Assets/AppBar/appbar.add.rest.png", UriKind.Relative));
- // appBarButton.Text = AppResources.AppBarButtonText;
- // ApplicationBar.Buttons.Add(appBarButton);
-
- // // Create a new menu item with the localized string from AppResources.
- // ApplicationBarMenuItem appBarMenuItem = new ApplicationBarMenuItem(AppResources.AppBarMenuItemText);
- // ApplicationBar.MenuItems.Add(appBarMenuItem);
- //}
- }
-}
\ No newline at end of file
diff --git a/AnalogClock/AnalogClock.WindowsPhone/Properties/AppManifest.xml b/AnalogClock/AnalogClock.WindowsPhone/Properties/AppManifest.xml
deleted file mode 100644
index 6712a1178..000000000
--- a/AnalogClock/AnalogClock.WindowsPhone/Properties/AppManifest.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
diff --git a/AnalogClock/AnalogClock.WindowsPhone/Properties/AssemblyInfo.cs b/AnalogClock/AnalogClock.WindowsPhone/Properties/AssemblyInfo.cs
deleted file mode 100644
index 9a6ab7c39..000000000
--- a/AnalogClock/AnalogClock.WindowsPhone/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-using System.Resources;
-
-// 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("AnalogClock.WindowsPhone")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("AnalogClock.WindowsPhone")]
-[assembly: AssemblyCopyright("Copyright © 2014")]
-[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("4840441f-5a92-4556-8d65-fff029892702")]
-
-// 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 Revision and Build Numbers
-// by using the '*' as shown below:
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
-[assembly: NeutralResourcesLanguageAttribute("en-US")]
diff --git a/AnalogClock/AnalogClock.WindowsPhone/Properties/WMAppManifest.xml b/AnalogClock/AnalogClock.WindowsPhone/Properties/WMAppManifest.xml
deleted file mode 100644
index 7da47b96d..000000000
--- a/AnalogClock/AnalogClock.WindowsPhone/Properties/WMAppManifest.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
-
- Assets\ApplicationIcon.png
-
-
-
-
-
-
-
-
-
-
-
-
-
- Assets\Tiles\FlipCycleTileSmall.png
- 0
- Assets\Tiles\FlipCycleTileMedium.png
- AnalogClock.WindowsPhone
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/AnalogClock/AnalogClock.WindowsPhone/Resources/AppResources.Designer.cs b/AnalogClock/AnalogClock.WindowsPhone/Resources/AppResources.Designer.cs
deleted file mode 100644
index 64b318420..000000000
--- a/AnalogClock/AnalogClock.WindowsPhone/Resources/AppResources.Designer.cs
+++ /dev/null
@@ -1,127 +0,0 @@
-//------------------------------------------------------------------------------
-//
-// This code was generated by a tool.
-// Runtime Version:4.0.30319.17626
-//
-// Changes to this file may cause incorrect behavior and will be lost if
-// the code is regenerated.
-//
-//------------------------------------------------------------------------------
-
-namespace AnalogClock.WindowsPhone.Resources
-{
- using System;
-
-
- ///
- /// A strongly-typed resource class, for looking up localized strings, etc.
- ///
- // This class was auto-generated by the StronglyTypedResourceBuilder
- // class via a tool like ResGen or Visual Studio.
- // To add or remove a member, edit your .ResX file then rerun ResGen
- // with the /str option, or rebuild your VS project.
- [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
- public class AppResources
- {
-
- private static global::System.Resources.ResourceManager resourceMan;
-
- private static global::System.Globalization.CultureInfo resourceCulture;
-
- [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
- internal AppResources()
- {
- }
-
- ///
- /// Returns the cached ResourceManager instance used by this class.
- ///
- [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
- public static global::System.Resources.ResourceManager ResourceManager
- {
- get
- {
- if (object.ReferenceEquals(resourceMan, null))
- {
- global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AnalogClock.WindowsPhone.Resources.AppResources", typeof(AppResources).Assembly);
- resourceMan = temp;
- }
- return resourceMan;
- }
- }
-
- ///
- /// Overrides the current thread's CurrentUICulture property for all
- /// resource lookups using this strongly typed resource class.
- ///
- [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
- public static global::System.Globalization.CultureInfo Culture
- {
- get
- {
- return resourceCulture;
- }
- set
- {
- resourceCulture = value;
- }
- }
-
- ///
- /// Looks up a localized string similar to LeftToRight.
- ///
- public static string ResourceFlowDirection
- {
- get
- {
- return ResourceManager.GetString("ResourceFlowDirection", resourceCulture);
- }
- }
-
- ///
- /// Looks up a localized string similar to us-EN.
- ///
- public static string ResourceLanguage
- {
- get
- {
- return ResourceManager.GetString("ResourceLanguage", resourceCulture);
- }
- }
-
- ///
- /// Looks up a localized string similar to MY APPLICATION.
- ///
- public static string ApplicationTitle
- {
- get
- {
- return ResourceManager.GetString("ApplicationTitle", resourceCulture);
- }
- }
-
- ///
- /// Looks up a localized string similar to button.
- ///
- public static string AppBarButtonText
- {
- get
- {
- return ResourceManager.GetString("AppBarButtonText", resourceCulture);
- }
- }
-
- ///
- /// Looks up a localized string similar to menu item.
- ///
- public static string AppBarMenuItemText
- {
- get
- {
- return ResourceManager.GetString("AppBarMenuItemText", resourceCulture);
- }
- }
- }
-}
diff --git a/AnalogClock/AnalogClock.WindowsPhone/Resources/AppResources.resx b/AnalogClock/AnalogClock.WindowsPhone/Resources/AppResources.resx
deleted file mode 100644
index 529a19431..000000000
--- a/AnalogClock/AnalogClock.WindowsPhone/Resources/AppResources.resx
+++ /dev/null
@@ -1,137 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- LeftToRight
- Controls the FlowDirection for all elements in the RootFrame. Set to the traditional direction of this resource file's language
-
-
- en-US
- Controls the Language and ensures that the font for all elements in the RootFrame aligns with the app's language. Set to the language code of this resource file's language.
-
-
- MY APPLICATION
-
-
- add
-
-
- Menu Item
-
-
\ No newline at end of file
diff --git a/AnalogClock/AnalogClock.iOS/AnalogClock.iOS.csproj b/AnalogClock/AnalogClock.iOS/AnalogClock.iOS.csproj
index cd2eb5c3a..7b60a6e85 100644
--- a/AnalogClock/AnalogClock.iOS/AnalogClock.iOS.csproj
+++ b/AnalogClock/AnalogClock.iOS/AnalogClock.iOS.csproj
@@ -26,7 +26,8 @@
None
Entitlements.plist
true
- i386
+ i386, x86_64
+ NSUrlSessionHandler
full
@@ -38,7 +39,8 @@
None
false
Entitlements.plist
- i386
+ i386, x86_64
+ NSUrlSessionHandler
true
@@ -52,7 +54,8 @@
Entitlements.plist
true
iPhone Developer
- ARMv7
+ ARMv7, ARM64
+ NSUrlSessionHandler
full
@@ -65,6 +68,7 @@
false
iPhone Developer
ARMv7, ARM64
+ NSUrlSessionHandler
full
@@ -79,6 +83,7 @@
Automatic:AdHoc
iPhone Distribution
ARMv7, ARM64
+ NSUrlSessionHandler
full
@@ -92,6 +97,7 @@
Automatic:AppStore
iPhone Distribution
ARMv7, ARM64
+ NSUrlSessionHandler
@@ -99,9 +105,6 @@
-
-
-
@@ -111,9 +114,26 @@
-
- ClockModel.cs
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Contents.json b/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 000000000..df3f4a695
--- /dev/null
+++ b/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,220 @@
+{
+ "images": [
+ {
+ "filename": "Icon40x40.png",
+ "size": "20x20",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "filename": "Icon60x60.png",
+ "size": "20x20",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "filename": "Icon58x58.png",
+ "size": "29x29",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "filename": "Icon87x87.png",
+ "size": "29x29",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "filename": "Icon80x80.png",
+ "size": "40x40",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "filename": "Icon120x120.png",
+ "size": "40x40",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "filename": "Icon120x120.png",
+ "size": "60x60",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "filename": "Icon180x180.png",
+ "size": "60x60",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "filename": "Icon20x20.png",
+ "size": "20x20",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "filename": "Icon40x40.png",
+ "size": "20x20",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "filename": "Icon29x29.png",
+ "size": "29x29",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "filename": "Icon58x58.png",
+ "size": "29x29",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "filename": "Icon40x40.png",
+ "size": "40x40",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "filename": "Icon80x80.png",
+ "size": "40x40",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "filename": "Icon167x167.png",
+ "size": "83.5x83.5",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "filename": "Icon76x76.png",
+ "size": "76x76",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "filename": "Icon152x152.png",
+ "size": "76x76",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "filename": "Icon1024x1024.png",
+ "size": "1024x1024",
+ "scale": "1x",
+ "idiom": "ios-marketing"
+ },
+ {
+ "role": "notificationCenter",
+ "size": "24x24",
+ "subtype": "38mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "notificationCenter",
+ "size": "27.5x27.5",
+ "subtype": "42mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "companionSettings",
+ "size": "29x29",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "companionSettings",
+ "size": "29x29",
+ "scale": "3x",
+ "idiom": "watch"
+ },
+ {
+ "role": "appLauncher",
+ "size": "40x40",
+ "subtype": "38mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "longLook",
+ "size": "44x44",
+ "subtype": "42mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "quickLook",
+ "size": "86x86",
+ "subtype": "38mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "quickLook",
+ "size": "98x98",
+ "subtype": "42mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "size": "16x16",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "16x16",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "size": "32x32",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "32x32",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "size": "128x128",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "128x128",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "size": "256x256",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "256x256",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "size": "512x512",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "512x512",
+ "scale": "2x",
+ "idiom": "mac"
+ }
+ ],
+ "info": {
+ "version": 1,
+ "author": "xcode"
+ }
+}
\ No newline at end of file
diff --git a/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon1024x1024.png b/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon1024x1024.png
new file mode 100644
index 000000000..830b23933
Binary files /dev/null and b/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon1024x1024.png differ
diff --git a/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon120x120.png b/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon120x120.png
new file mode 100644
index 000000000..a91bfc568
Binary files /dev/null and b/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon120x120.png differ
diff --git a/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon152x152.png b/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon152x152.png
new file mode 100644
index 000000000..a2882210f
Binary files /dev/null and b/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon152x152.png differ
diff --git a/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon167x167.png b/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon167x167.png
new file mode 100644
index 000000000..2badfaa18
Binary files /dev/null and b/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon167x167.png differ
diff --git a/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon180x180.png b/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon180x180.png
new file mode 100644
index 000000000..c2f79a690
Binary files /dev/null and b/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon180x180.png differ
diff --git a/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon20x20.png b/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon20x20.png
new file mode 100644
index 000000000..2af5ac48d
Binary files /dev/null and b/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon20x20.png differ
diff --git a/TaskyPortable/TaskyiOS/Resources/Icon-Small.png b/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon29x29.png
similarity index 100%
rename from TaskyPortable/TaskyiOS/Resources/Icon-Small.png
rename to AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon29x29.png
diff --git a/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon40x40.png b/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon40x40.png
new file mode 100644
index 000000000..ad7e66171
Binary files /dev/null and b/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon40x40.png differ
diff --git a/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon58x58.png b/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon58x58.png
new file mode 100644
index 000000000..39c9c087a
Binary files /dev/null and b/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon58x58.png differ
diff --git a/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon60x60.png b/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon60x60.png
new file mode 100644
index 000000000..70584f903
Binary files /dev/null and b/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon60x60.png differ
diff --git a/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon76x76.png b/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon76x76.png
new file mode 100644
index 000000000..f8ef4696c
Binary files /dev/null and b/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon76x76.png differ
diff --git a/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon80x80.png b/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon80x80.png
new file mode 100644
index 000000000..cc63bbf90
Binary files /dev/null and b/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon80x80.png differ
diff --git a/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon87x87.png b/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon87x87.png
new file mode 100644
index 000000000..ee697547a
Binary files /dev/null and b/AnalogClock/AnalogClock.iOS/Assets.xcassets/AppIcon.appiconset/Icon87x87.png differ
diff --git a/AnalogClock/AnalogClock.iOS/Info.plist b/AnalogClock/AnalogClock.iOS/Info.plist
index a046d5f70..162ab2e1a 100644
--- a/AnalogClock/AnalogClock.iOS/Info.plist
+++ b/AnalogClock/AnalogClock.iOS/Info.plist
@@ -1,4 +1,4 @@
-
+
@@ -13,7 +13,7 @@
LSRequiresIPhoneOS
MinimumOSVersion
- 7.0
+ 9.0
UIDeviceFamily
1
@@ -28,5 +28,9 @@
UIInterfaceOrientationLandscapeLeft
UIInterfaceOrientationLandscapeRight
+ CFBundleName
+ AnalogClock.iOS
+ XSAppIconAssets
+ Assets.xcassets/AppIcon.appiconset
diff --git a/AnalogClock/AnalogClock.sln b/AnalogClock/AnalogClock.sln
index 41c4d319c..b69e76761 100644
--- a/AnalogClock/AnalogClock.sln
+++ b/AnalogClock/AnalogClock.sln
@@ -1,13 +1,11 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2012
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AnalogClock.WindowsPhone", "AnalogClock.WindowsPhone\AnalogClock.WindowsPhone.csproj", "{B5049529-ADAE-489C-8C78-C2D18B2C4E00}"
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AnalogClock.iOS", "AnalogClock.iOS\AnalogClock.iOS.csproj", "{69DC2865-6BFF-4172-857F-64DA4787A033}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AnalogClock.Android", "AnalogClock.Android\AnalogClock.Android.csproj", "{992B695F-39B4-4D20-A4B4-DA619B9893C6}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AnalogClock.Common", "AnalogClock.Common\AnalogClock.Common.csproj", "{3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}"
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "AnalogClock.Common", "AnalogClock.Common\AnalogClock.Common.shproj", "{29808547-B68A-420A-801A-B1B2A7375B8F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -43,76 +41,6 @@ Global
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Ad-Hoc|Any CPU.Deploy.0 = Release|Any CPU
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Ad-Hoc|ARM.ActiveCfg = Release|ARM
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Ad-Hoc|ARM.Build.0 = Release|ARM
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Ad-Hoc|ARM.Deploy.0 = Release|ARM
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|x86
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Ad-Hoc|Mixed Platforms.Build.0 = Release|x86
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Ad-Hoc|Mixed Platforms.Deploy.0 = Release|x86
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Ad-Hoc|x86.ActiveCfg = Release|x86
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Ad-Hoc|x86.Build.0 = Release|x86
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Ad-Hoc|x86.Deploy.0 = Release|x86
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.AppStore|Any CPU.Build.0 = Release|Any CPU
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.AppStore|Any CPU.Deploy.0 = Release|Any CPU
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.AppStore|ARM.ActiveCfg = Release|ARM
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.AppStore|ARM.Build.0 = Release|ARM
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.AppStore|ARM.Deploy.0 = Release|ARM
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.AppStore|iPhone.ActiveCfg = Release|Any CPU
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.AppStore|Mixed Platforms.ActiveCfg = Release|x86
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.AppStore|Mixed Platforms.Build.0 = Release|x86
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.AppStore|Mixed Platforms.Deploy.0 = Release|x86
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.AppStore|x86.ActiveCfg = Release|x86
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.AppStore|x86.Build.0 = Release|x86
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.AppStore|x86.Deploy.0 = Release|x86
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Debug|ARM.ActiveCfg = Debug|ARM
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Debug|ARM.Build.0 = Debug|ARM
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Debug|ARM.Deploy.0 = Debug|ARM
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Debug|iPhone.ActiveCfg = Debug|Any CPU
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Debug|Mixed Platforms.Build.0 = Debug|x86
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Debug|Mixed Platforms.Deploy.0 = Debug|x86
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Debug|x86.ActiveCfg = Debug|x86
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Debug|x86.Build.0 = Debug|x86
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Debug|x86.Deploy.0 = Debug|x86
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Default|Any CPU.ActiveCfg = Debug|Any CPU
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Default|Any CPU.Build.0 = Debug|Any CPU
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Default|Any CPU.Deploy.0 = Debug|Any CPU
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Default|ARM.ActiveCfg = Debug|ARM
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Default|ARM.Build.0 = Debug|ARM
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Default|ARM.Deploy.0 = Debug|ARM
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Default|iPhone.ActiveCfg = Debug|Any CPU
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Default|iPhoneSimulator.ActiveCfg = Debug|Any CPU
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Default|Mixed Platforms.ActiveCfg = Debug|x86
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Default|Mixed Platforms.Build.0 = Debug|x86
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Default|Mixed Platforms.Deploy.0 = Debug|x86
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Default|x86.ActiveCfg = Debug|x86
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Default|x86.Build.0 = Debug|x86
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Default|x86.Deploy.0 = Debug|x86
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Release|Any CPU.Build.0 = Release|Any CPU
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Release|Any CPU.Deploy.0 = Release|Any CPU
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Release|ARM.ActiveCfg = Release|ARM
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Release|ARM.Build.0 = Release|ARM
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Release|ARM.Deploy.0 = Release|ARM
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Release|iPhone.ActiveCfg = Release|Any CPU
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Release|Mixed Platforms.ActiveCfg = Release|x86
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Release|Mixed Platforms.Build.0 = Release|x86
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Release|Mixed Platforms.Deploy.0 = Release|x86
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Release|x86.ActiveCfg = Release|x86
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Release|x86.Build.0 = Release|x86
- {B5049529-ADAE-489C-8C78-C2D18B2C4E00}.Release|x86.Deploy.0 = Release|x86
{69DC2865-6BFF-4172-857F-64DA4787A033}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|iPhone
{69DC2865-6BFF-4172-857F-64DA4787A033}.Ad-Hoc|Any CPU.Build.0 = Ad-Hoc|iPhone
{69DC2865-6BFF-4172-857F-64DA4787A033}.Ad-Hoc|ARM.ActiveCfg = Ad-Hoc|iPhone
@@ -231,46 +159,6 @@ Global
{992B695F-39B4-4D20-A4B4-DA619B9893C6}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{992B695F-39B4-4D20-A4B4-DA619B9893C6}.Release|x86.ActiveCfg = Release|Any CPU
{992B695F-39B4-4D20-A4B4-DA619B9893C6}.Release|x86.Build.0 = Release|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.Ad-Hoc|Mixed Platforms.Build.0 = Release|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.AppStore|Any CPU.Build.0 = Release|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.AppStore|ARM.ActiveCfg = Release|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.AppStore|iPhone.ActiveCfg = Release|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.AppStore|Mixed Platforms.ActiveCfg = Release|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.AppStore|Mixed Platforms.Build.0 = Release|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.AppStore|x86.ActiveCfg = Release|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.Debug|ARM.ActiveCfg = Debug|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.Debug|iPhone.ActiveCfg = Debug|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.Debug|x86.ActiveCfg = Debug|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.Default|Any CPU.ActiveCfg = Debug|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.Default|Any CPU.Build.0 = Debug|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.Default|ARM.ActiveCfg = Debug|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.Default|iPhone.ActiveCfg = Debug|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.Default|iPhoneSimulator.ActiveCfg = Debug|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.Default|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.Default|Mixed Platforms.Build.0 = Debug|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.Default|x86.ActiveCfg = Debug|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.Release|Any CPU.Build.0 = Release|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.Release|ARM.ActiveCfg = Release|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.Release|iPhone.ActiveCfg = Release|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {3A80358F-CDE0-41AB-BC10-D1BBAACCBF0D}.Release|x86.ActiveCfg = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/AnalogClock/Metadata.xml b/AnalogClock/Metadata.xml
index b2fc20605..7fa3c070e 100644
--- a/AnalogClock/Metadata.xml
+++ b/AnalogClock/Metadata.xml
@@ -6,6 +6,6 @@
Graphics, Async
Android, iOS, Windows
Indie
- AnalogClock is a cross platform example displaying a classic clock containing hour, minute, and second hands.
+ AnalogClock is a cross platform app displaying a classic clock.
true
diff --git a/AsyncAwait/Droid/Droid.csproj b/AsyncAwait/Droid/Droid.csproj
index 587b76a78..5edc733dc 100644
--- a/AsyncAwait/Droid/Droid.csproj
+++ b/AsyncAwait/Droid/Droid.csproj
@@ -3,7 +3,7 @@
Debug
AnyCPU
- 10.0.0
+ 8.0.30703
2.0
{9F8656FD-07A4-44F7-864E-A94E7C27F529}
{EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
@@ -16,6 +16,8 @@
Assets
Droid
Properties\AndroidManifest.xml
+ True
+ v6.0
true
@@ -60,5 +62,5 @@
-
+
\ No newline at end of file
diff --git a/AsyncAwait/Droid/MainActivity.cs b/AsyncAwait/Droid/MainActivity.cs
index 29749188f..270f3354c 100644
--- a/AsyncAwait/Droid/MainActivity.cs
+++ b/AsyncAwait/Droid/MainActivity.cs
@@ -59,7 +59,7 @@ public async Task DownloadHomepageAsync()
{
var httpClient = new HttpClient(); // Xamarin supports HttpClient!
- Task contentsTask = httpClient.GetStringAsync("http://xamarin.com/"); // async method!
+ Task contentsTask = httpClient.GetStringAsync("https://xamarin.com/"); // async method!
// await! control returns to the caller and the task continues to run on another thread
@@ -74,7 +74,7 @@ public async Task DownloadHomepageAsync()
- byte[] imageBytes = await httpClient.GetByteArrayAsync("http://xamarin.com/images/about/team.jpg"); // async method!
+ byte[] imageBytes = await httpClient.GetByteArrayAsync("https://xamarin.com/content/images/pages/about/team-h.jpg"); // async method!
string documentsPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
string localFilename = "team.jpg";
diff --git a/AsyncAwait/Droid/Properties/AndroidManifest.xml b/AsyncAwait/Droid/Properties/AndroidManifest.xml
index 480614548..3010405cf 100644
--- a/AsyncAwait/Droid/Properties/AndroidManifest.xml
+++ b/AsyncAwait/Droid/Properties/AndroidManifest.xml
@@ -1,7 +1,6 @@
-
-
-
+
+
\ No newline at end of file
diff --git a/AsyncAwait/Metadata.xml b/AsyncAwait/Metadata.xml
index fd9631254..7738182d5 100644
--- a/AsyncAwait/Metadata.xml
+++ b/AsyncAwait/Metadata.xml
@@ -1,11 +1,11 @@
-
+
6b59dff2-faca-4bbb-85a7-167e6eb27eb2
false
Beginner
-
+
Android, iOS
Starter
- Cross platform samples for iOS and Android showing image downloads using C# 5's async and await syntax
+ Cross platform sample for iOS and Android showing image downloads using C# 5's async and await syntax.
true
diff --git a/AsyncAwait/README.md b/AsyncAwait/README.md
index 9399c25fd..7a4ec9d96 100644
--- a/AsyncAwait/README.md
+++ b/AsyncAwait/README.md
@@ -1,5 +1,14 @@
-AsyncAwait
-==========
+---
+name: Xamarin - async/await
+description: "Using async/await with Xamarin"
+page_type: sample
+languages:
+- csharp
+products:
+- xamarin
+urlFragment: asyncawait
+---
+# async/await
This sample was first presented in the Xamarin Introduction to C# 5 Async webinar on August 15th, 2013. Re-live the excitement with these links to the video, slides and Xamarin docs.
@@ -7,11 +16,11 @@ This sample was first presented in the Xamarin Introduction to C# 5 Async webina
[Miguel's slides](http://www.slideshare.net/Xamarin/xamarin-asyncwebinar-2013) [Craig's slides](http://www.slideshare.net/Xamarin/c-async-on-ios-and-android-craig-dunn-developer-evangelist-at-xamarin)
-[Xamarin's Introduction to Async article](http://docs.xamarin.com/guides/cross-platform/advanced/async_support_overview)
+[Xamarin's Async support overview](https://docs.microsoft.com/xamarin/cross-platform/platform/async)
The sample apps (for iOS and Android) has two examples:
-* a simple text & image download using the new C# 5 `async` and `await` syntax.
-* another example that shows how to download multiple files in the background and report download progress using `IProgress`/`Progress`. It also demonstrates how to cancel the background downloads using a `CancellationTokenSource`.
+- a simple text & image download using the new C# 5 `async` and `await` syntax.
+- another example that shows how to download multiple files in the background and report download progress using `IProgress`/`Progress`. It also demonstrates how to cancel the background downloads using a `CancellationTokenSource`.
Also check out [Miguel's blog post on the subject](http://tirania.org/blog/archive/2013/Aug-15.html).
diff --git a/AsyncAwait/Screenshots/01-iOS.png b/AsyncAwait/Screenshots/01-iOS.png
index 96ceb4628..b1a885668 100644
Binary files a/AsyncAwait/Screenshots/01-iOS.png and b/AsyncAwait/Screenshots/01-iOS.png differ
diff --git a/AsyncAwait/Screenshots/02-Android-html.png b/AsyncAwait/Screenshots/02-Android-html.png
new file mode 100644
index 000000000..cee8e9979
Binary files /dev/null and b/AsyncAwait/Screenshots/02-Android-html.png differ
diff --git a/AsyncAwait/Screenshots/02-Android.png b/AsyncAwait/Screenshots/02-Android.png
index cee8e9979..0e65b1cb5 100644
Binary files a/AsyncAwait/Screenshots/02-Android.png and b/AsyncAwait/Screenshots/02-Android.png differ
diff --git a/AsyncAwait/iOS/AsyncExtrasController.cs b/AsyncAwait/iOS/AsyncExtrasController.cs
index 445d97431..59fb18e73 100644
--- a/AsyncAwait/iOS/AsyncExtrasController.cs
+++ b/AsyncAwait/iOS/AsyncExtrasController.cs
@@ -31,16 +31,10 @@ public partial class AsyncExtrasController : UIViewController
{
static readonly string[] ListOfImages = new string[]
{
- "http://xamarin.com/images/tour/amazing-ide.png",
- "http://xamarin.com/images/how-it-works/chalkboard2.jpg",
- "http://xamarin.com/images/about/team.jpg",
- "http://xamarin.com/images/prebuilt/rich-feature-set.jpg",
- "http://cdn1.xamarin.com/webimages/images/features/shared-code-2.pngXXX",
- "http://xamarin.com/images/tour/4platforms12.jpg",
- "http://xamarin.com/images/tour/amazing-ide.png",
- "http://xamarin.com/images/enterprise/multiple_platforms.png",
- "http://blog.xamarin.com/wp-content/uploads/2013/07/monkey_cowboy.jpg",
- "http://docs.xamarin.com/guides/cross-platform/getting_started/introducing_xamarin_studio/Images/19.png"
+ "https://developer.xamarin.com/guides/cross-platform/advanced/async_support_overview/Images/AsyncAwait.png",
+ "https://xamarin.com/content/images/pages/about/team-h.jpg",
+ "https://blog.xamarin.com/wp-content/uploads/2013/07/monkey_cowboy.jpg",
+ "https://developer.xamarin.com/guides/cross-platform/getting_started/introducing_xamarin_studio/Images/19.png"
};
diff --git a/AsyncAwait/iOS/Info.plist b/AsyncAwait/iOS/Info.plist
index 6159dbf8f..e62293208 100644
--- a/AsyncAwait/iOS/Info.plist
+++ b/AsyncAwait/iOS/Info.plist
@@ -13,7 +13,9 @@
UIMainStoryboardFile
MainStoryboard
MinimumOSVersion
- 6.0
+ 8.0
+ CFBundleIdentifier
+ com.xamarin.asyncawait
CFBundleDisplayName
AsyncAwait
CFBundleVersion
diff --git a/AsyncAwait/iOS/Resources/Default-568h@2x.png b/AsyncAwait/iOS/Resources/Default-568h@2x.png
new file mode 100644
index 000000000..0891b7aab
Binary files /dev/null and b/AsyncAwait/iOS/Resources/Default-568h@2x.png differ
diff --git a/AsyncAwait/iOS/iOS.csproj b/AsyncAwait/iOS/iOS.csproj
index d0b88e749..01ca5878f 100644
--- a/AsyncAwait/iOS/iOS.csproj
+++ b/AsyncAwait/iOS/iOS.csproj
@@ -3,7 +3,7 @@
Debug
iPhoneSimulator
- 10.0.0
+ 8.0.30703
2.0
{2D418EAB-3808-448E-AEAB-E394507BA98C}
{FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
@@ -26,6 +26,7 @@
false
true
i386
+ NSUrlSessionHandler
full
@@ -36,6 +37,7 @@
None
false
i386
+ NSUrlSessionHandler
true
@@ -49,6 +51,7 @@
false
iPhone Developer
ARMv7
+ NSUrlSessionHandler
full
@@ -59,6 +62,7 @@
iPhone Developer
false
ARMv7, ARM64
+ NSUrlSessionHandler
full
@@ -71,6 +75,7 @@
false
Automatic:AdHoc
ARMv7, ARM64
+ NSUrlSessionHandler
full
@@ -82,6 +87,7 @@
false
Automatic:AppStore
ARMv7, ARM64
+ NSUrlSessionHandler
@@ -116,4 +122,7 @@
+
+
+
\ No newline at end of file
diff --git a/AsyncAwait/iOS/iOSViewController.cs b/AsyncAwait/iOS/iOSViewController.cs
index 629658483..ed3e0b229 100644
--- a/AsyncAwait/iOS/iOSViewController.cs
+++ b/AsyncAwait/iOS/iOSViewController.cs
@@ -76,7 +76,7 @@ public async Task DownloadHomepageAsync()
//
// download HTML string
- Task contentsTask = httpClient.GetStringAsync("http://xamarin.com/"); // async method!
+ Task contentsTask = httpClient.GetStringAsync("https://xamarin.com/"); // async method!
ResultTextView.Text += "DownloadHomepage method continues after Async() call, until await is used\n";
@@ -91,7 +91,7 @@ public async Task DownloadHomepageAsync()
// download image bytes
ResultTextView.Text += "Start downloading image.\n";
- byte[] imageBytes = await httpClient.GetByteArrayAsync("http://xamarin.com/images/about/team.jpg"); // async method!
+ byte[] imageBytes = await httpClient.GetByteArrayAsync("https://xamarin.com/content/images/pages/about/team-h.jpg"); // async method!
ResultTextView.Text += "Downloaded the image.\n";
await SaveBytesToFileAsync(imageBytes, "team.jpg");
ResultTextView.Text += "Save the image to a file." + Environment.NewLine;
@@ -107,10 +107,11 @@ public async Task DownloadHomepageAsync()
//
// download multiple images
// http://blogs.msdn.com/b/pfxteam/archive/2012/08/02/processing-tasks-as-they-complete.aspx
- Task task1 = httpClient.GetByteArrayAsync("http://xamarin.com/images/tour/amazing-ide.png"); // async method!
- Task task2 = httpClient.GetByteArrayAsync("http://xamarin.com/images/how-it-works/chalkboard2.jpg"); // async method!
- Task task3 = httpClient.GetByteArrayAsync("http://cdn1.xamarin.com/webimages/images/features/shared-code-2.pngXXX"); // ERROR async method!
+ Task task1 = httpClient.GetByteArrayAsync("https://developer.xamarin.com/guides/cross-platform/advanced/async_support_overview/Images/AsyncAwait.png"); // async method!
+ Task task2 = httpClient.GetByteArrayAsync("https://blog.xamarin.com/wp-content/uploads/2013/07/monkey_cowboy.jpg"); // async method!
+ Task task3 = httpClient.GetByteArrayAsync("https://developer.xamarin.com/image-doesn't-exist.pngXXX"); // ERROR async method!
+
List> tasks = new List>();
tasks.Add(task1);
tasks.Add(task2);
diff --git a/Azure/GetStartedWithData/Android/XamarinTodoQuickStart.Android.sln b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart.Android.sln
new file mode 100644
index 000000000..207f1fe34
--- /dev/null
+++ b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart.Android.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XamarinTodoQuickStart.Android", "XamarinTodoQuickStart\XamarinTodoQuickStart.Android.csproj", "{8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(MonoDevelopProperties) = preSolution
+ StartupItem = XamarinTodoQuickStart\XamarinTodoQuickStart.Android.csproj
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Camera/Camera.Droid/Assets/AboutAssets.txt b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Assets/AboutAssets.txt
similarity index 100%
rename from Camera/Camera.Droid/Assets/AboutAssets.txt
rename to Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Assets/AboutAssets.txt
diff --git a/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Constants.cs b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Constants.cs
new file mode 100644
index 000000000..69e63762a
--- /dev/null
+++ b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Constants.cs
@@ -0,0 +1,16 @@
+using System;
+
+namespace XamarinTodoQuickStart
+{
+ public static class Constants
+ {
+ // TODO: Configure the MobileServiceClient to communicate with your mobile service by
+ // uncommenting the following code and replacing AppUrl with values from
+ // your mobile service, which are obtained from the Windows Azure Management Portal.
+ // Do this after you add a reference to the Mobile Services client to your project.
+
+ // Azure app specific URL and key
+ public const string ApplicationURL = @"https://your_app_name.azurewebsites.net/";
+ }
+}
+
diff --git a/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Properties/AndroidManifest.xml b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Properties/AndroidManifest.xml
new file mode 100644
index 000000000..3d22b16f0
--- /dev/null
+++ b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Properties/AndroidManifest.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Properties/AssemblyInfo.cs b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..2bc8c83f4
--- /dev/null
+++ b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Properties/AssemblyInfo.cs
@@ -0,0 +1,28 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using Android.App;
+
+// Information about this assembly is defined by the following attributes.
+// Change them to the values specific to your project.
+
+[assembly: AssemblyTitle("XamarinTodoQuickStart")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("Xamarin")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
+// The form "{Major}.{Minor}.*" will automatically update the build and revision,
+// and "{Major}.{Minor}.{Build}.*" will update just the revision.
+
+[assembly: AssemblyVersion("1.0.0")]
+
+// The following attributes are used to specify the signing key for the assembly,
+// if desired. See the Mono documentation for more information about signing.
+
+//[assembly: AssemblyDelaySign(false)]
+//[assembly: AssemblyKeyFile("")]
+
diff --git a/Camera/Camera.Droid/Resources/AboutResources.txt b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/AboutResources.txt
similarity index 100%
rename from Camera/Camera.Droid/Resources/AboutResources.txt
rename to Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/AboutResources.txt
diff --git a/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/Resource.designer.cs b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/Resource.designer.cs
new file mode 100644
index 000000000..3ad7a6304
--- /dev/null
+++ b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/Resource.designer.cs
@@ -0,0 +1,230 @@
+#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("XamarinTodoQuickStart.Resource", IsApplication=true)]
+
+namespace XamarinTodoQuickStart
+{
+
+
+ [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()
+ {
+ global::Xamarin.Auth._MobileServices.Resource.Animation.slide_in_right = global::XamarinTodoQuickStart.Resource.Animation.slide_in_right;
+ global::Xamarin.Auth._MobileServices.Resource.Animation.slide_out_left = global::XamarinTodoQuickStart.Resource.Animation.slide_out_left;
+ global::Xamarin.Auth._MobileServices.Resource.Drawable.ic_arrow_back = global::XamarinTodoQuickStart.Resource.Drawable.ic_arrow_back;
+ global::Xamarin.Auth._MobileServices.Resource.Id.webview = global::XamarinTodoQuickStart.Resource.Id.webview;
+ global::Xamarin.Auth._MobileServices.Resource.Layout.activity_webview = global::XamarinTodoQuickStart.Resource.Layout.activity_webview;
+ global::Xamarin.Auth._MobileServices.Resource.String.ApplicationName = global::XamarinTodoQuickStart.Resource.String.ApplicationName;
+ global::Xamarin.Auth._MobileServices.Resource.String.Hello = global::XamarinTodoQuickStart.Resource.String.Hello;
+ global::Xamarin.Auth._MobileServices.Resource.String.title_activity_webview = global::XamarinTodoQuickStart.Resource.String.title_activity_webview;
+ global::PCLCrypto.Resource.String.ApplicationName = global::XamarinTodoQuickStart.Resource.String.ApplicationName;
+ global::PCLCrypto.Resource.String.Hello = global::XamarinTodoQuickStart.Resource.String.Hello;
+ }
+
+ public partial class Animation
+ {
+
+ // aapt resource value: 0x7f040000
+ public const int slide_in_right = 2130968576;
+
+ // aapt resource value: 0x7f040001
+ public const int slide_out_left = 2130968577;
+
+ static Animation()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Animation()
+ {
+ }
+ }
+
+ public partial class Attribute
+ {
+
+ static Attribute()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Attribute()
+ {
+ }
+ }
+
+ public partial class Drawable
+ {
+
+ // aapt resource value: 0x7f020000
+ public const int ic_arrow_back = 2130837504;
+
+ // aapt resource value: 0x7f020001
+ public const int ic_launcher = 2130837505;
+
+ static Drawable()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Drawable()
+ {
+ }
+ }
+
+ public partial class Id
+ {
+
+ // aapt resource value: 0x7f080000
+ public const int LinearLayout1 = 2131230720;
+
+ // aapt resource value: 0x7f080004
+ public const int buttonAddTodo = 2131230724;
+
+ // aapt resource value: 0x7f080007
+ public const int checkTodoItem = 2131230727;
+
+ // aapt resource value: 0x7f080005
+ public const int listViewTodo = 2131230725;
+
+ // aapt resource value: 0x7f080002
+ public const int loadingProgressBar = 2131230722;
+
+ // aapt resource value: 0x7f080008
+ public const int menu_refresh = 2131230728;
+
+ // aapt resource value: 0x7f080003
+ public const int textNewTodo = 2131230723;
+
+ // aapt resource value: 0x7f080001
+ public const int textViewTitle = 2131230721;
+
+ // aapt resource value: 0x7f080006
+ public const int webview = 2131230726;
+
+ static Id()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Id()
+ {
+ }
+ }
+
+ public partial class Layout
+ {
+
+ // aapt resource value: 0x7f030000
+ public const int Activity_To_Do = 2130903040;
+
+ // aapt resource value: 0x7f030001
+ public const int activity_webview = 2130903041;
+
+ // aapt resource value: 0x7f030002
+ public const int Row_List_To_Do = 2130903042;
+
+ static Layout()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Layout()
+ {
+ }
+ }
+
+ public partial class Menu
+ {
+
+ // aapt resource value: 0x7f070000
+ public const int activity_main = 2131165184;
+
+ static Menu()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Menu()
+ {
+ }
+ }
+
+ public partial class String
+ {
+
+ // aapt resource value: 0x7f050001
+ public const int ApplicationName = 2131034113;
+
+ // aapt resource value: 0x7f050000
+ public const int Hello = 2131034112;
+
+ // aapt resource value: 0x7f050005
+ public const int add_button_text = 2131034117;
+
+ // aapt resource value: 0x7f050004
+ public const int add_textbox_hint = 2131034116;
+
+ // aapt resource value: 0x7f050003
+ public const int app_name = 2131034115;
+
+ // aapt resource value: 0x7f050008
+ public const int checkbox_text = 2131034120;
+
+ // aapt resource value: 0x7f050007
+ public const int menu_refresh = 2131034119;
+
+ // aapt resource value: 0x7f050006
+ public const int mobile_services = 2131034118;
+
+ // aapt resource value: 0x7f050002
+ public const int title_activity_webview = 2131034114;
+
+ static String()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private String()
+ {
+ }
+ }
+
+ public partial class Style
+ {
+
+ // aapt resource value: 0x7f060000
+ public const int AppBaseTheme = 2131099648;
+
+ // aapt resource value: 0x7f060001
+ public const int AppTheme = 2131099649;
+
+ static Style()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Style()
+ {
+ }
+ }
+ }
+}
+#pragma warning restore 1591
diff --git a/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/drawable-hdpi/ic_launcher.png b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/drawable-hdpi/ic_launcher.png
new file mode 100644
index 000000000..b2f7c2b5f
Binary files /dev/null and b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/drawable-hdpi/ic_launcher.png differ
diff --git a/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/drawable-ldpi/ic_launcher.png b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/drawable-ldpi/ic_launcher.png
new file mode 100644
index 000000000..c2219b558
Binary files /dev/null and b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/drawable-ldpi/ic_launcher.png differ
diff --git a/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/drawable-mdpi/ic_launcher.png b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/drawable-mdpi/ic_launcher.png
new file mode 100644
index 000000000..b2c79b7ed
Binary files /dev/null and b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/drawable-mdpi/ic_launcher.png differ
diff --git a/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/drawable-xhdpi/ic_launcher.png b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 000000000..fc4b43087
Binary files /dev/null and b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/drawable-xhdpi/ic_launcher.png differ
diff --git a/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/layout/Activity_To_Do.axml b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/layout/Activity_To_Do.axml
new file mode 100644
index 000000000..2e8775ee8
--- /dev/null
+++ b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/layout/Activity_To_Do.axml
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/layout/Row_List_To_Do.axml b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/layout/Row_List_To_Do.axml
new file mode 100644
index 000000000..bc3facc8d
--- /dev/null
+++ b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/layout/Row_List_To_Do.axml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/menu/activity_main.xml b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/menu/activity_main.xml
new file mode 100644
index 000000000..2ca5582b0
--- /dev/null
+++ b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/menu/activity_main.xml
@@ -0,0 +1,5 @@
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/values-v11/styles.xml b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/values-v11/styles.xml
new file mode 100644
index 000000000..541752f6e
--- /dev/null
+++ b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/values-v11/styles.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/values-v14/styles.xml b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/values-v14/styles.xml
new file mode 100644
index 000000000..f20e01501
--- /dev/null
+++ b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/values-v14/styles.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/values/Strings.xml b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/values/Strings.xml
new file mode 100644
index 000000000..634eeecdf
--- /dev/null
+++ b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/values/Strings.xml
@@ -0,0 +1,9 @@
+
+
+ XamarinTodoQuickStart
+ Add a Todo item
+ Add
+ Mobile App
+ Refresh
+ Item Text
+
diff --git a/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/values/styles.xml b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/values/styles.xml
new file mode 100644
index 000000000..4a10ca492
--- /dev/null
+++ b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/Resources/values/styles.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/TodoActivity.cs b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/TodoActivity.cs
new file mode 100644
index 000000000..cbda68ecf
--- /dev/null
+++ b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/TodoActivity.cs
@@ -0,0 +1,253 @@
+using System;
+using Android.OS;
+using Android.App;
+using Android.Views;
+using Android.Widget;
+using System.Net.Http;
+using System.Threading.Tasks;
+using System.Collections.Generic;
+
+// TODO:: Add the following using statement
+using Microsoft.WindowsAzure.MobileServices;
+
+/*
+This sample can be run with a local-only in-memory list
+OR it can use a remote Azure App Service Mobile App back-end.
+
+You must comment/uncomment lines below to switch between the local and Azure storage.
+
+By default the Azure Mobile App code is used - which also requires a valid URL
+be entered in the Constants.cs file.
+*/
+namespace XamarinTodoQuickStart
+{
+ [Activity (MainLauncher = true,
+ Icon="@drawable/ic_launcher", Label="@string/app_name",
+ Theme="@style/AppTheme")]
+ public class TodoActivity : Activity
+ {
+ // TODO:: Uncomment the following two lines of code to use Mobile Services
+ private MobileServiceClient client; // Mobile Service Client reference
+ private IMobileServiceTable todoTable; // Mobile Service Table used to access data
+
+ // TODO:: Comment out this line to remove the in-memory list
+ //public List todoItemList = new List();
+
+ private TodoItemAdapter adapter; // Adapter to sync the items list with the view
+ private EditText textNewTodo; // EditText containing the "New Todo" text
+ private ProgressBar progressBar; // Progress spinner to use for table operations
+
+ // Called when the activity initially gets created
+ protected override async void OnCreate(Bundle bundle)
+ {
+ base.OnCreate(bundle);
+
+ // Set our view from the "main" layout resource
+ SetContentView(Resource.Layout.Activity_To_Do);
+
+ // Initialize the progress bar
+ progressBar = FindViewById(Resource.Id.loadingProgressBar);
+ progressBar.Visibility = ViewStates.Gone;
+
+ // TODO:: Uncomment the following code when using a mobile service
+
+ // Create ProgressFilter to handle busy state
+ var progressHandler = new ProgressHandler ();
+ progressHandler.BusyStateChange += (busy) => {
+ if (progressBar != null)
+ progressBar.Visibility = busy ? ViewStates.Visible : ViewStates.Gone;
+ };
+
+
+ try
+ {
+ // TODO:: Uncomment the following code to create the mobile services client
+
+ CurrentPlatform.Init ();
+ // Create the Mobile Service Client instance, using the provided
+ // Mobile Service URL and key
+ client = new MobileServiceClient(
+ Constants.ApplicationURL,
+ progressHandler);
+
+ // Get the Mobile Service Table instance to use
+ todoTable = client.GetTable();
+
+ textNewTodo = FindViewById(Resource.Id.textNewTodo);
+
+ // Create an adapter to bind the items with the view
+ adapter = new TodoItemAdapter(this, Resource.Layout.Row_List_To_Do);
+ var listViewTodo = FindViewById(Resource.Id.listViewTodo);
+ listViewTodo.Adapter = adapter;
+
+ // Load the items from the Mobile Service
+ await RefreshItemsFromTableAsync();
+
+ }
+ catch (Java.Net.MalformedURLException)
+ {
+ CreateAndShowDialog(new Exception ("There was an error creating the Mobile Service. Verify the URL"), "Error");
+ }
+ catch (Exception e)
+ {
+ CreateAndShowDialog(e, "Error");
+ }
+ }
+
+ // Initializes the activity menu
+ public override bool OnCreateOptionsMenu(IMenu menu)
+ {
+ MenuInflater.Inflate(Resource.Menu.activity_main, menu);
+ return true;
+ }
+
+ // Select an option from the menu
+ public override bool OnOptionsItemSelected(IMenuItem item)
+ {
+ if (item.ItemId == Resource.Id.menu_refresh) {
+ OnRefreshItemsSelected();
+ }
+ return true;
+ }
+
+ // Called when the refresh menu opion is selected
+ async void OnRefreshItemsSelected()
+ {
+ await RefreshItemsFromTableAsync();
+ }
+
+ // Refresh the list with the items in the Mobile Service Table
+ async Task RefreshItemsFromTableAsync()
+ {
+ // TODO:: Uncomment the following code when using a mobile service
+
+ try
+ {
+ // Get the items that weren't marked as completed and add them in the adapter
+ var list = await todoTable.Where(item => item.Complete == false).ToListAsync ();
+
+ adapter.Clear();
+
+ foreach (TodoItem current in list)
+ adapter.Add(current);
+ }
+ catch (Exception e)
+ {
+ CreateAndShowDialog(e, "Error");
+ }
+
+
+ // TODO:: Comment out these lines to remove the in-memory list
+ //adapter.Clear();
+ //foreach (var item in todoItemList)
+ //{
+ // if (!item.Complete)
+ // adapter.Add(item);
+ //}
+ // NOTE:: End of lines to comment out
+ }
+
+ public async Task CheckItem(TodoItem item)
+ {
+ // Set the item as completed and update it in the table
+ item.Complete = true;
+
+ // TODO:: Uncomment the following code when using a mobile service
+
+ try
+ {
+ await todoTable.UpdateAsync(item);
+ if (item.Complete)
+ adapter.Remove(item);
+ }
+ catch (Exception e)
+ {
+ CreateAndShowDialog(e, "Error");
+ }
+
+
+ // TODO:: Comment out these lines to remove the in-memory list
+ //todoItemList.Add(item);
+ //if (item.Complete)
+ //adapter.Remove(item);
+ // NOTE:: End of lines to comment out
+ }
+
+ [Java.Interop.Export()]
+ public async void AddItem(View view)
+ {
+ // Create a new item
+ var item = new TodoItem() {
+ Text = textNewTodo.Text,
+ Complete = false
+ };
+
+ // TODO:: Uncomment the following code when using a mobile service
+
+ try
+ {
+ // Insert the new item
+ await todoTable.InsertAsync(item);
+
+ if (!item.Complete)
+ adapter.Add(item);
+ }
+ catch (Exception e)
+ {
+ CreateAndShowDialog(e, "Error");
+ }
+
+
+ // TODO:: Comment out these lines to remove the in-memory list
+ //todoItemList.Add(item);
+ //adapter.Add(item);
+ // NOTE:: End of lines to comment out
+
+ textNewTodo.Text = "";
+ }
+
+ void CreateAndShowDialog(Exception exception, String title)
+ {
+ CreateAndShowDialog(exception.Message, title);
+ }
+
+ void CreateAndShowDialog(string message, string title)
+ {
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+
+ builder.SetMessage(message);
+ builder.SetTitle(title);
+ builder.Create().Show();
+ }
+
+ // TODO:: Uncomment the following code when using a mobile service
+
+ class ProgressHandler : DelegatingHandler
+ {
+ int busyCount = 0;
+
+ public event Action BusyStateChange;
+
+ #region implemented abstract members of HttpMessageHandler
+
+ protected override async Task SendAsync (HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
+ {
+ //assumes always executes on UI thread
+ if (busyCount++ == 0 && BusyStateChange != null)
+ BusyStateChange (true);
+
+ var response = await base.SendAsync (request, cancellationToken);
+
+ // assumes always executes on UI thread
+ if (--busyCount == 0 && BusyStateChange != null)
+ BusyStateChange (false);
+
+ return response;
+ }
+
+ #endregion
+
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/TodoItem.cs b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/TodoItem.cs
new file mode 100644
index 000000000..5de32610d
--- /dev/null
+++ b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/TodoItem.cs
@@ -0,0 +1,28 @@
+using System;
+using Newtonsoft.Json;
+
+namespace XamarinTodoQuickStart
+{
+ public class TodoItem
+ {
+ // Tables created prior to November 2013 should use 'int' type. Check your configuration.
+ public string Id { get; set; }
+
+ [JsonProperty(PropertyName = "text")]
+ public string Text { get; set; }
+
+ [JsonProperty(PropertyName = "complete")]
+ public bool Complete { get; set; }
+ }
+
+ public class TodoItemWrapper : Java.Lang.Object
+ {
+ public TodoItem TodoItem { get; private set; }
+
+ public TodoItemWrapper(TodoItem item)
+ {
+ this.TodoItem = item;
+ }
+ }
+}
+
diff --git a/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/TodoItemAdapter.cs b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/TodoItemAdapter.cs
new file mode 100644
index 000000000..7014ce79a
--- /dev/null
+++ b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/TodoItemAdapter.cs
@@ -0,0 +1,100 @@
+using System;
+using Android.App;
+using Android.Views;
+using Android.Widget;
+using System.Collections.Generic;
+using XamarinTodoQuickStart;
+
+namespace XamarinTodoQuickStart
+{
+ public class TodoItemAdapter : BaseAdapter
+ {
+ // Private Variables
+ private Activity activity;
+ private int layoutResourceId;
+ private List items = new List();
+
+ // Constructor
+ public TodoItemAdapter(Activity activity, int layoutResourceId)
+ {
+ this.activity = activity;
+ this.layoutResourceId = layoutResourceId;
+ }
+
+ // Returns the view for a specific item on the list
+ public override View GetView(int position, Android.Views.View convertView, Android.Views.ViewGroup parent)
+ {
+ var row = convertView;
+ var currentItem = this[position];
+ CheckBox checkBox;
+
+ if (row == null)
+ {
+ var inflater = activity.LayoutInflater;
+ row = inflater.Inflate(layoutResourceId, parent, false);
+
+ checkBox = row.FindViewById(Resource.Id.checkTodoItem);
+
+ checkBox.CheckedChange += async (sender, e) => {
+ var cbSender = sender as CheckBox;
+ if (cbSender != null && cbSender.Tag is TodoItemWrapper && cbSender.Checked)
+ {
+ cbSender.Enabled = false;
+
+ if (activity is TodoActivity)
+ await ((TodoActivity)activity).CheckItem((cbSender.Tag as TodoItemWrapper).TodoItem);
+ }
+ };
+ }
+ else
+ {
+ checkBox = row.FindViewById(Resource.Id.checkTodoItem);
+ }
+
+ checkBox.Text = currentItem.Text;
+ checkBox.Checked = false;
+ checkBox.Enabled = true;
+ checkBox.Tag = new TodoItemWrapper(currentItem);
+
+ return row;
+ }
+
+ public void Add(TodoItem item)
+ {
+ items.Add(item);
+ NotifyDataSetChanged();
+ }
+
+ public void Clear()
+ {
+ items.Clear();
+ NotifyDataSetChanged();
+ }
+
+ public void Remove(TodoItem item)
+ {
+ items.Remove(item);
+ NotifyDataSetChanged();
+ }
+
+ #region implemented abstract members of BaseAdapter
+
+ public override long GetItemId(int position)
+ {
+ return position;
+ }
+
+ public override int Count
+ {
+ get { return items.Count; }
+ }
+
+ public override TodoItem this[int position]
+ {
+ get { return items[position]; }
+ }
+
+ #endregion
+ }
+}
+
diff --git a/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/XamarinTodoQuickStart.Android.csproj b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/XamarinTodoQuickStart.Android.csproj
new file mode 100644
index 000000000..dee8505d7
--- /dev/null
+++ b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/XamarinTodoQuickStart.Android.csproj
@@ -0,0 +1,114 @@
+
+
+
+ Debug
+ AnyCPU
+ 10.0.0
+ 2.0
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}
+ {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ Library
+ XamarinTodoQuickStart
+ True
+ Resources\Resource.designer.cs
+ Resource
+ Resources
+ Assets
+ ZUMOAPPNAME
+ Properties\AndroidManifest.xml
+ v8.1
+ true
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ None
+ false
+ Xamarin.Android.Net.AndroidClientHandler
+
+
+ full
+ true
+ bin\Release
+ prompt
+ 4
+ false
+ false
+
+
+
+
+
+
+
+
+
+
+ ..\packages\Newtonsoft.Json.9.0.1\lib\portable-net45+wp80+win8+wpa81\Newtonsoft.Json.dll
+ False
+
+
+ ..\packages\PInvoke.Windows.Core.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Windows.Core.dll
+
+
+ ..\packages\PInvoke.Kernel32.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Kernel32.dll
+
+
+ ..\packages\PInvoke.BCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.BCrypt.dll
+
+
+ ..\packages\PInvoke.NCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.NCrypt.dll
+
+
+ ..\packages\Validation.2.2.8\lib\dotnet\Validation.dll
+
+
+ ..\packages\PCLCrypto.2.0.147\lib\MonoAndroid23\PCLCrypto.dll
+
+
+ ..\packages\Xamarin.Android.Support.v4.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v4.dll
+
+
+ ..\packages\Xamarin.Android.Support.CustomTabs.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.CustomTabs.dll
+
+
+ ..\packages\Microsoft.Azure.Mobile.Client.4.0.2\lib\monoandroid70\Microsoft.Azure.Mobile.Client.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/packages.config b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/packages.config
new file mode 100644
index 000000000..b65885357
--- /dev/null
+++ b/Azure/GetStartedWithData/Android/XamarinTodoQuickStart/packages.config
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithData/Metadata.xml b/Azure/GetStartedWithData/Metadata.xml
new file mode 100644
index 000000000..dcbe83789
--- /dev/null
+++ b/Azure/GetStartedWithData/Metadata.xml
@@ -0,0 +1,11 @@
+
+
+ 8484f696-788c-4828-a344-39b263b4ea14
+ false
+ Beginner
+ Cloud
+ Android, iOS
+ Indie
+ Microsoft Azure sample GetStartedWithData
+ false
+
diff --git a/Azure/GetStartedWithData/Screenshots/Android.png b/Azure/GetStartedWithData/Screenshots/Android.png
new file mode 100644
index 000000000..b7a77c28b
Binary files /dev/null and b/Azure/GetStartedWithData/Screenshots/Android.png differ
diff --git a/Azure/GetStartedWithData/Screenshots/iOS.png b/Azure/GetStartedWithData/Screenshots/iOS.png
new file mode 100644
index 000000000..71f5ada42
Binary files /dev/null and b/Azure/GetStartedWithData/Screenshots/iOS.png differ
diff --git a/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart.iOS.sln b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart.iOS.sln
new file mode 100644
index 000000000..85d684411
--- /dev/null
+++ b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart.iOS.sln
@@ -0,0 +1,43 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XamarinTodoQuickStart.iOS", "XamarinTodoQuickStart\XamarinTodoQuickStart.iOS.csproj", "{07F1CD1B-626F-4BE5-9840-97B44CBB94C9}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Ad-Hoc|iPhone = Ad-Hoc|iPhone
+ Ad-Hoc|iPhoneSimulator = Ad-Hoc|iPhoneSimulator
+ AppStore|iPhone = AppStore|iPhone
+ AppStore|iPhoneSimulator = AppStore|iPhoneSimulator
+ Debug|iPhone = Debug|iPhone
+ Debug|iPhoneSimulator = Debug|iPhoneSimulator
+ Release|iPhone = Release|iPhone
+ Release|iPhoneSimulator = Release|iPhoneSimulator
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Ad-Hoc|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.AppStore|iPhone.ActiveCfg = AppStore|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.AppStore|iPhone.Build.0 = AppStore|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.AppStore|iPhoneSimulator.Deploy.0 = AppStore|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Debug|iPhone.ActiveCfg = Debug|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Debug|iPhone.Build.0 = Debug|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Release|iPhone.ActiveCfg = Release|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Release|iPhone.Build.0 = Release|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
+ EndGlobalSection
+ GlobalSection(MonoDevelopProperties) = preSolution
+ StartupItem = XamarinTodoQuickStart\XamarinTodoQuickStart.iOS.csproj
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/AppDelegate.cs b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/AppDelegate.cs
new file mode 100644
index 000000000..523f1e347
--- /dev/null
+++ b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/AppDelegate.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Foundation;
+using UIKit;
+
+namespace XamarinTodoQuickStart
+{
+ // The UIApplicationDelegate for the application. This class is responsible for launching the
+ // User Interface of the application, as well as listening (and optionally responding) to
+ // application events from iOS.
+ [Register ("AppDelegate")]
+ public partial class AppDelegate : UIApplicationDelegate
+ {
+ // class-level declarations
+ public override UIWindow Window {get; set;}
+ }
+}
+
diff --git a/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Contents.json b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 000000000..d77296819
--- /dev/null
+++ b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,205 @@
+{
+ "images": [
+ {
+ "size": "20x20",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "20x20",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "filename": "Icon_58.png",
+ "size": "29x29",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "29x29",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "40x40",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "40x40",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "filename": "Icon_120.png",
+ "size": "60x60",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "60x60",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "20x20",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "20x20",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "29x29",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "29x29",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "40x40",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "40x40",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "83.5x83.5",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "filename": "Icon_76.png",
+ "size": "76x76",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "76x76",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "1024x1024",
+ "scale": "1x",
+ "idiom": "ios-marketing"
+ },
+ {
+ "role": "notificationCenter",
+ "size": "24x24",
+ "subtype": "38mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "notificationCenter",
+ "size": "27.5x27.5",
+ "subtype": "42mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "companionSettings",
+ "size": "29x29",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "companionSettings",
+ "size": "29x29",
+ "scale": "3x",
+ "idiom": "watch"
+ },
+ {
+ "role": "appLauncher",
+ "size": "40x40",
+ "subtype": "38mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "longLook",
+ "size": "44x44",
+ "subtype": "42mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "quickLook",
+ "size": "86x86",
+ "subtype": "38mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "quickLook",
+ "size": "98x98",
+ "subtype": "42mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "size": "16x16",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "16x16",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "size": "32x32",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "32x32",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "size": "128x128",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "128x128",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "size": "256x256",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "256x256",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "size": "512x512",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "512x512",
+ "scale": "2x",
+ "idiom": "mac"
+ }
+ ],
+ "info": {
+ "version": 1,
+ "author": "xcode"
+ }
+}
\ No newline at end of file
diff --git a/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon.png b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon.png
new file mode 100755
index 000000000..652acddf5
Binary files /dev/null and b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon.png differ
diff --git a/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon@2x.png b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon@2x.png
new file mode 100755
index 000000000..116eeabd2
Binary files /dev/null and b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon@2x.png differ
diff --git a/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_120.png b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_120.png
new file mode 100755
index 000000000..6a06e6ff8
Binary files /dev/null and b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_120.png differ
diff --git a/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_58.png b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_58.png
new file mode 100755
index 000000000..a69958c06
Binary files /dev/null and b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_58.png differ
diff --git a/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_76.png b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_76.png
new file mode 100755
index 000000000..09898ad19
Binary files /dev/null and b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_76.png differ
diff --git a/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Constants.cs b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Constants.cs
new file mode 100644
index 000000000..7c0987bd9
--- /dev/null
+++ b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Constants.cs
@@ -0,0 +1,16 @@
+using System;
+
+namespace XamarinTodoQuickStart
+{
+ public static class Constants
+ {
+ // TODO: Configure the MobileServiceClient to communicate with your mobile service by
+ // uncommenting the following code and replacing AppUrl with values from
+ // your mobile service, which are obtained from the Windows Azure Management Portal.
+ // Do this after you add a reference to the Mobile Services client to your project.
+
+ // Azure app specific URL and key
+ public const string ApplicationURL = @"https://your_app_name.azurewebsites.net/"; // YOUR_APP_NAME
+ }
+}
+
diff --git a/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Info.plist b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Info.plist
new file mode 100644
index 000000000..e05626b18
--- /dev/null
+++ b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Info.plist
@@ -0,0 +1,42 @@
+
+
+
+
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UIMainStoryboardFile
+ MainStoryboard_iPhone
+ UIMainStoryboardFile~ipad
+ MainStoryboard_iPad
+ MinimumOSVersion
+ 11.0
+ CFBundleName
+ Xamarin+Azure
+ CFBundleIdentifier
+ com.xamarintest.azurequickstart.data
+ CFBundleShortVersionString
+ 1
+ CFBundleVersion
+ 1
+ XSAppIconAssets
+ Assets.xcassets/AppIcon.appiconset
+ UILaunchStoryboardName
+ LaunchScreen
+
+
diff --git a/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Main.cs b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Main.cs
new file mode 100644
index 000000000..0ac4457b6
--- /dev/null
+++ b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Main.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Foundation;
+using UIKit;
+
+namespace XamarinTodoQuickStart
+{
+ public class Application
+ {
+ // This is the main entry point of the application.
+ static void Main(string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main(args, null, "AppDelegate");
+ }
+ }
+}
diff --git a/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/MainStoryboard_iPad.storyboard b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/MainStoryboard_iPad.storyboard
new file mode 100755
index 000000000..0c4b73cf4
--- /dev/null
+++ b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/MainStoryboard_iPad.storyboard
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/MainStoryboard_iPhone.storyboard b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/MainStoryboard_iPhone.storyboard
new file mode 100755
index 000000000..401fbec66
--- /dev/null
+++ b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/MainStoryboard_iPhone.storyboard
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Resources/Default.png b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Resources/Default.png
new file mode 100755
index 000000000..4c8ca6f69
Binary files /dev/null and b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Resources/Default.png differ
diff --git a/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Resources/Default@2x.png b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Resources/Default@2x.png
new file mode 100755
index 000000000..35b84cffe
Binary files /dev/null and b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Resources/Default@2x.png differ
diff --git a/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Resources/LaunchScreen.xib b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Resources/LaunchScreen.xib
new file mode 100644
index 000000000..9ca3deadd
--- /dev/null
+++ b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/Resources/LaunchScreen.xib
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/TodoItem.cs b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/TodoItem.cs
new file mode 100644
index 000000000..ab294b6f5
--- /dev/null
+++ b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/TodoItem.cs
@@ -0,0 +1,18 @@
+using System;
+using Newtonsoft.Json;
+
+namespace XamarinTodoQuickStart
+{
+ public class TodoItem
+ {
+ // Tables created prior to November 2013 should use 'int' type. Check your configuration.
+ public string Id { get; set; }
+
+ [JsonProperty(PropertyName = "text")]
+ public string Text { get; set; }
+
+ [JsonProperty(PropertyName = "complete")]
+ public bool Complete { get; set; }
+ }
+}
+
diff --git a/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/TodoListViewController.cs b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/TodoListViewController.cs
new file mode 100644
index 000000000..970c7a9bf
--- /dev/null
+++ b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/TodoListViewController.cs
@@ -0,0 +1,171 @@
+// This file has been autogenerated from parsing an Objective-C header file added in Xcode.
+using System;
+using Foundation;
+using UIKit;
+using System.Threading.Tasks;
+
+namespace XamarinTodoQuickStart
+{
+ public partial class TodoListViewController : UITableViewController
+ {
+ // Private Variables
+ private TodoService todoService;
+ private bool useRefreshControl = false;
+
+ // Constructor
+ public TodoListViewController(IntPtr handle) : base(handle)
+ {
+ }
+
+ public override async void ViewDidLoad()
+ {
+ base.ViewDidLoad();
+
+ todoService = TodoService.DefaultService;
+
+ todoService.BusyUpdate += (bool busy) => {
+ if (busy)
+ activityIndicator.StartAnimating();
+ else
+ activityIndicator.StopAnimating();
+ };
+
+ AddRefreshControl();
+
+ await RefreshAsync();
+ }
+
+ async Task RefreshAsync()
+ {
+ // only activate the refresh control if the feature is available
+ if (useRefreshControl)
+ RefreshControl.BeginRefreshing();
+
+ await todoService.RefreshDataAsync();
+
+ if (useRefreshControl)
+ RefreshControl.EndRefreshing();
+
+ TableView.ReloadData();
+ }
+
+ #region UITableView methods
+ public override nint RowsInSection(UITableView tableview, nint section)
+ {
+ if (todoService == null || todoService.Items == null)
+ return 0;
+
+ return todoService.Items.Count;
+ }
+
+ public override nint NumberOfSections(UITableView tableView)
+ {
+ return 1;
+ }
+
+ public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
+ {
+ const string CellIdentifier = @"Cell";
+ var cell = tableView.DequeueReusableCell(CellIdentifier);
+ if (cell == null) {
+ cell = new UITableViewCell(UITableViewCellStyle.Default, CellIdentifier);
+ }
+
+ // Set the label on the cell and make sure the label color is black (in case this cell
+ // has been reused and was previously greyed out
+ var label = (UILabel)cell.ViewWithTag(1);
+ label.TextColor = UIColor.Black;
+ label.Text = todoService.Items [indexPath.Row].Text;
+
+ return cell;
+ }
+
+ public override string TitleForDeleteConfirmation(UITableView tableView, NSIndexPath indexPath)
+ {
+ // Customize the Delete button to say "complete"
+ return @"complete";
+ }
+
+ public override UITableViewCellEditingStyle EditingStyleForRow(UITableView tableView, NSIndexPath indexPath)
+ {
+ // Find the item that is about to be edited
+ var item = todoService.Items[indexPath.Row];
+
+ // If the item is complete, then this is just pending upload. Editing is not allowed
+ if (item.Complete)
+ return UITableViewCellEditingStyle.None;
+
+ // Otherwise, allow the delete button to appear
+ return UITableViewCellEditingStyle.Delete;
+ }
+
+ public async override void CommitEditingStyle(UITableView tableView, UITableViewCellEditingStyle editingStyle, NSIndexPath indexPath)
+ {
+ // Find item that was commited for editing (completed)
+ var item = todoService.Items[indexPath.Row];
+
+ // Change the appearance to look greyed out until we remove the item
+ var label = (UILabel)TableView.CellAt(indexPath).ViewWithTag(1);
+ label.TextColor = UIColor.Gray;
+
+ // Ask the todoService to set the item's complete value to YES, and remove the row if successful
+ await todoService.CompleteItemAsync(item);
+
+ // Remove the row from the UITableView
+ tableView.DeleteRows(new [] { indexPath }, UITableViewRowAnimation.Top);
+ }
+
+ #endregion
+
+ #region UI Actions
+
+ async partial void OnAdd(NSObject sender)
+ {
+ if (string.IsNullOrWhiteSpace(itemText.Text))
+ return;
+
+ var newItem = new TodoItem() {
+ Text = itemText.Text,
+ Complete = false
+ };
+
+ int index = await todoService.InsertTodoItemAsync(newItem);
+
+ TableView.InsertRows(new [] { NSIndexPath.FromItemSection(index, 0) },
+ UITableViewRowAnimation.Top);
+
+ itemText.Text = "";
+ }
+
+ #endregion
+
+ #region UITextFieldDelegate methods
+
+ [Export ("textFieldShouldReturn:")]
+ public virtual bool ShouldReturn(UITextField textField)
+ {
+ textField.ResignFirstResponder();
+ return true;
+ }
+
+ #endregion
+
+ #region * iOS Specific Code
+
+ // This method will add the UIRefreshControl to the table view if
+ // it is available, ie, we are running on iOS 6+
+ private void AddRefreshControl()
+ {
+ if (UIDevice.CurrentDevice.CheckSystemVersion(6, 0)) {
+ // the refresh control is available, let's add it
+ RefreshControl = new UIRefreshControl();
+ RefreshControl.ValueChanged += async (sender, e) => {
+ await RefreshAsync();
+ };
+ useRefreshControl = true;
+ }
+ }
+
+ #endregion
+ }
+}
diff --git a/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/TodoListViewController.designer.cs b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/TodoListViewController.designer.cs
new file mode 100644
index 000000000..8c7c47d97
--- /dev/null
+++ b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/TodoListViewController.designer.cs
@@ -0,0 +1,36 @@
+// WARNING
+//
+// This file has been generated automatically by Xamarin Studio to store outlets and
+// actions made in the Xcode designer. If it is removed, they will be lost.
+// Manual changes to this file may not be handled correctly.
+//
+using Foundation;
+
+namespace XamarinTodoQuickStart
+{
+ [Register ("TodoListViewController")]
+ partial class TodoListViewController
+ {
+ [Outlet]
+ UIKit.UIActivityIndicatorView activityIndicator { get; set; }
+
+ [Outlet]
+ UIKit.UITextField itemText { get; set; }
+
+ [Action ("OnAdd:")]
+ partial void OnAdd (Foundation.NSObject sender);
+
+ void ReleaseDesignerOutlets ()
+ {
+ if (itemText != null) {
+ itemText.Dispose ();
+ itemText = null;
+ }
+
+ if (activityIndicator != null) {
+ activityIndicator.Dispose ();
+ activityIndicator = null;
+ }
+ }
+ }
+}
diff --git a/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/TodoService.cs b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/TodoService.cs
new file mode 100644
index 000000000..e9f525599
--- /dev/null
+++ b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/TodoService.cs
@@ -0,0 +1,130 @@
+using System;
+using System.Collections.Generic;
+using Foundation;
+using System.Threading.Tasks;
+using UIKit;
+using System.Net.Http;
+
+// TODO:: Add the following using statement
+ using Microsoft.WindowsAzure.MobileServices;
+
+namespace XamarinTodoQuickStart
+{
+ // TODO:: inherit from DelegatingHandler
+ public class TodoService : DelegatingHandler
+ {
+ private static TodoService todoServiceInstance = new TodoService();
+ public static TodoService DefaultService { get { return todoServiceInstance; } }
+
+ // TODO:: Uncomment these lines to use Mobile Services
+ private MobileServiceClient client;
+ private IMobileServiceTable todoTable;
+
+ public List Items { get; private set;}
+ private int busyCount = 0;
+
+ // Public events
+ public event Action BusyUpdate;
+
+ // Constructor
+ protected TodoService()
+ {
+ CurrentPlatform.Init ();
+
+ Items = new List();
+
+ // TODO:: Uncomment these lines to use Mobile Services
+ client = new MobileServiceClient(Constants.ApplicationURL);
+ todoTable = client.GetTable(); // Create an MSTable instance to allow us to work with the TodoItem table
+ }
+
+ async public Task> RefreshDataAsync()
+ {
+ // TODO:: Uncomment these lines to use Mobile Services
+
+ try
+ {
+ // This code refreshes the entries in the list view by querying the TodoItems table.
+ // The query excludes completed TodoItems
+ Items = await todoTable
+ .Where (todoItem => todoItem.Complete == false).ToListAsync();
+
+ }
+ catch (MobileServiceInvalidOperationException e)
+ {
+ Console.Error.WriteLine (@"ERROR {0}", e.Message);
+ return null;
+ }
+
+
+ return Items;
+ }
+
+ public async Task InsertTodoItemAsync(TodoItem todoItem)
+ {
+ try
+ {
+ // TODO:: Uncomment this line out to use Mobile Services
+ await todoTable.InsertAsync(todoItem);
+
+ Items.Add(todoItem);
+
+ return Items.IndexOf(todoItem);
+ }
+ catch (Exception e) // TODO:: Optional - catch MobileServiceInvalidOperationException instead of generic Exception
+ {
+ Console.Error.WriteLine(@"ERROR {0}", e.Message);
+ return 0;
+ }
+ }
+
+ public async Task CompleteItemAsync(TodoItem item)
+ {
+ try
+ {
+ item.Complete = true;
+
+ // This code takes a freshly completed TodoItem and updates the database. When the MobileService
+ // responds, the item is removed from the list
+ // TODO:: Uncomment this line to use Mobile Services
+ await todoTable.UpdateAsync(item);
+
+ Items.Remove(item);
+
+ }
+ catch (Exception e) // TODO:: Optional - catch MobileServiceInvalidOperationException instead of generic Exception
+ {
+ Console.Error.WriteLine (@"ERROR {0}", e.Message);
+ }
+ }
+
+ void Busy(bool busy)
+ {
+ // assumes always executes on UI thread
+ if (busy)
+ {
+ if (busyCount++ == 0 && BusyUpdate != null)
+ BusyUpdate(true);
+ }
+ else
+ {
+ if (--busyCount == 0 && BusyUpdate != null)
+ BusyUpdate(false);
+ }
+ }
+
+ // TODO:: Uncomment this code when using Mobile Services and inheriting from IServiceFilter
+ #region implemented abstract members of HttpMessageHandler
+
+ protected override async Task SendAsync (System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
+ {
+ Busy (true);
+ var response = await base.SendAsync (request, cancellationToken);
+
+ Busy (false);
+ return response;
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/XamarinTodoQuickStart.iOS.csproj b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/XamarinTodoQuickStart.iOS.csproj
new file mode 100644
index 000000000..4c815a888
--- /dev/null
+++ b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/XamarinTodoQuickStart.iOS.csproj
@@ -0,0 +1,170 @@
+
+
+
+ Debug
+ iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}
+ {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ Exe
+ XamarinTodoQuickStart
+ Resources
+ XamarinTodoQuickStart
+ Xamarin.iOS
+ v1.0
+
+
+ true
+ full
+ false
+ bin\iPhoneSimulator\Debug
+ DEBUG;
+ prompt
+ 4
+ SdkOnly
+ false
+ true
+
+ x86_64
+ NSUrlSessionHandler
+ iPhone Developer
+
+
+ full
+ true
+ bin\iPhoneSimulator\Release
+ prompt
+ 4
+ None
+ x86_64
+ false
+ NSUrlSessionHandler
+
+
+ true
+ full
+ false
+ bin\iPhone\Debug
+ DEBUG;
+ prompt
+ 4
+ true
+ false
+ iPhone Developer
+
+ None
+
+ ARM64
+ NSUrlSessionHandler
+
+
+ full
+ true
+ bin\iPhone\Release
+ prompt
+ 4
+ iPhone Developer
+ false
+ ARM64
+ NSUrlSessionHandler
+
+
+ full
+ true
+ bin\iPhone\Ad-Hoc
+ prompt
+ 4
+ iPhone Distribution
+ true
+ false
+ Automatic:AdHoc
+
+ ARM64
+ NSUrlSessionHandler
+
+
+ full
+ true
+ bin\iPhone\AppStore
+ prompt
+ 4
+ iPhone Distribution
+ false
+ Automatic:AppStore
+ ARM64
+ NSUrlSessionHandler
+
+
+
+
+
+
+
+
+
+ ..\packages\Newtonsoft.Json.9.0.1\lib\portable-net45+wp80+win8+wpa81\Newtonsoft.Json.dll
+
+
+ ..\packages\PInvoke.Windows.Core.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Windows.Core.dll
+
+
+ ..\packages\PInvoke.Kernel32.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Kernel32.dll
+
+
+ ..\packages\PInvoke.BCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.BCrypt.dll
+
+
+ ..\packages\PInvoke.NCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.NCrypt.dll
+
+
+ ..\packages\Validation.2.2.8\lib\dotnet\Validation.dll
+
+
+ ..\packages\PCLCrypto.2.0.147\lib\xamarinios10\PCLCrypto.dll
+
+
+ ..\packages\Microsoft.Azure.Mobile.Client.4.0.2\lib\xamarinios10\Microsoft.Azure.Mobile.Client.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TodoListViewController.cs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.3.1
+ False
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/packages.config b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/packages.config
new file mode 100644
index 000000000..06847c21c
--- /dev/null
+++ b/Azure/GetStartedWithData/iOS/XamarinTodoQuickStart/packages.config
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithData/readme.md b/Azure/GetStartedWithData/readme.md
new file mode 100644
index 000000000..42bf1ff1c
--- /dev/null
+++ b/Azure/GetStartedWithData/readme.md
@@ -0,0 +1,4 @@
+Get Started with Data
+=====================
+
+Using Windows Azure and Xamarin
diff --git a/Azure/GetStartedWithPush/Android/AzureCloudCode/insert.js b/Azure/GetStartedWithPush/Android/AzureCloudCode/insert.js
new file mode 100644
index 000000000..e71bfbdd3
--- /dev/null
+++ b/Azure/GetStartedWithPush/Android/AzureCloudCode/insert.js
@@ -0,0 +1,54 @@
+function insert(item, user, request)
+{
+ console.log('todoitem.Insert() fired');
+
+ if (item.text.length > 10) {
+ request.respond(statusCodes.BAD_REQUEST, 'Text length must be 10 characters or less.');
+ }
+ else {
+ // item.createdAt = new Date();
+ // item.userId = user.userId;
+ // request.execute();
+
+ // ANDROID -
+ if (item.channel) {
+ console.log('todoitem.Insert() - channel found on item');
+ request.execute({
+ success: function() {
+ console.log('todoitem.Insert() - request returned success');
+ // Write to the response and then send the notification in the background
+ request.respond();
+ push.gcm.send(item.channel, item.text, {
+ success: function(response) {
+ console.log('Push notification sent: ', response);
+ }, error: function(error) {
+ console.log('Error sending push notification: ', error);
+ }
+ });
+ },
+ error: function(response) {
+ console.log('todoitem.Insert() - error response');
+ console.log('Request failed with response code ' + response.status + '.' +
+ 'Raw response: ' + response.text);
+ request.respond();
+ }
+ });
+ }
+
+ // iOS -
+ if (item.deviceToken) {
+ request.execute();
+ // Set timeout to delay the notification, to provide time for the
+ // app to be closed on the device to demonstrate toast notifications
+ setTimeout(function() {
+ push.apns.send(item.deviceToken, {
+ alert: "Toast: " + item.text,
+ payload: {
+ inAppMessage: "Hey, a new item arrived: '" + item.text + "'"
+ }
+ });
+ }, 2500);
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/Azure/GetStartedWithPush/Android/AzureCloudCode/read.js b/Azure/GetStartedWithPush/Android/AzureCloudCode/read.js
new file mode 100644
index 000000000..b7ff50ce6
--- /dev/null
+++ b/Azure/GetStartedWithPush/Android/AzureCloudCode/read.js
@@ -0,0 +1,4 @@
+function read(query, user, request) {
+ // query.where({ userId: user.userId });
+ request.execute();
+}
\ No newline at end of file
diff --git a/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart.Android.sln b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart.Android.sln
new file mode 100644
index 000000000..207f1fe34
--- /dev/null
+++ b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart.Android.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XamarinTodoQuickStart.Android", "XamarinTodoQuickStart\XamarinTodoQuickStart.Android.csproj", "{8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(MonoDevelopProperties) = preSolution
+ StartupItem = XamarinTodoQuickStart\XamarinTodoQuickStart.Android.csproj
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/SoMA/Android/Assets/AboutAssets.txt b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Assets/AboutAssets.txt
similarity index 100%
rename from SoMA/Android/Assets/AboutAssets.txt
rename to Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Assets/AboutAssets.txt
diff --git a/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Constants.cs b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Constants.cs
new file mode 100644
index 000000000..7eb210c21
--- /dev/null
+++ b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Constants.cs
@@ -0,0 +1,13 @@
+using System;
+
+namespace XamarinTodoQuickStart
+{
+ public static class Constants
+ {
+ // Azure app specific URL and key
+ public const string ApplicationURL = @"https://your_app_name.azurewebsites.net/";
+
+ public const string SenderID = "YOUR_API_PROJ_NUMBER"; // Google API Project Number
+ }
+}
+
diff --git a/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Properties/AndroidManifest.xml b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Properties/AndroidManifest.xml
new file mode 100644
index 000000000..9a7d53ce4
--- /dev/null
+++ b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Properties/AndroidManifest.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Properties/AssemblyInfo.cs b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..2bc8c83f4
--- /dev/null
+++ b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Properties/AssemblyInfo.cs
@@ -0,0 +1,28 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using Android.App;
+
+// Information about this assembly is defined by the following attributes.
+// Change them to the values specific to your project.
+
+[assembly: AssemblyTitle("XamarinTodoQuickStart")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("Xamarin")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
+// The form "{Major}.{Minor}.*" will automatically update the build and revision,
+// and "{Major}.{Minor}.{Build}.*" will update just the revision.
+
+[assembly: AssemblyVersion("1.0.0")]
+
+// The following attributes are used to specify the signing key for the assembly,
+// if desired. See the Mono documentation for more information about signing.
+
+//[assembly: AssemblyDelaySign(false)]
+//[assembly: AssemblyKeyFile("")]
+
diff --git a/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/PushService.cs b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/PushService.cs
new file mode 100644
index 000000000..ae2f0ff48
--- /dev/null
+++ b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/PushService.cs
@@ -0,0 +1,129 @@
+using System.Text;
+using Android.App;
+using Android.Content;
+using Android.Util;
+using PushSharp.Client;
+
+//VERY VERY VERY IMPORTANT NOTE!!!!
+// Your package name MUST NOT start with an uppercase letter.
+// Android does not allow permissions to start with an upper case letter
+// If it does you will get a very cryptic error in logcat and it will not be obvious why you are crying!
+// So please, for the love of all that is kind on this earth, use a LOWERCASE first letter in your Package Name!!!!
+[assembly: Permission(Name = "@PACKAGE_NAME@.permission.C2D_MESSAGE")] //, ProtectionLevel = Android.Content.PM.Protection.Signature)]
+[assembly: UsesPermission(Name = "@PACKAGE_NAME@.permission.C2D_MESSAGE")]
+[assembly: UsesPermission(Name = "com.google.android.c2dm.permission.RECEIVE")]
+
+//GET_ACCOUNTS is only needed for android versions 4.0.3 and below
+[assembly: UsesPermission(Name = "android.permission.GET_ACCOUNTS")]
+[assembly: UsesPermission(Name = "android.permission.INTERNET")]
+[assembly: UsesPermission(Name = "android.permission.WAKE_LOCK")]
+
+namespace XamarinTodoQuickStart
+{
+ //You must subclass this!
+ [BroadcastReceiver(Permission=GCMConstants.PERMISSION_GCM_INTENTS)]
+ [IntentFilter(new string[] { GCMConstants.INTENT_FROM_GCM_MESSAGE }, Categories = new string[] { "@PACKAGE_NAME@" })]
+ [IntentFilter(new string[] { GCMConstants.INTENT_FROM_GCM_REGISTRATION_CALLBACK }, Categories = new string[] { "@PACKAGE_NAME@" })]
+ [IntentFilter(new string[] { GCMConstants.INTENT_FROM_GCM_LIBRARY_RETRY }, Categories = new string[] { "@PACKAGE_NAME@" })]
+ public class PushHandlerBroadcastReceiver : PushHandlerBroadcastReceiverBase
+ {
+ //IMPORTANT: Change this to your own Sender ID!
+ //The SENDER_ID is your Google API Console App Project ID.
+ // Be sure to get the right Project ID from your Google APIs Console. It's not the named project ID that appears in the Overview,
+ // but instead the numeric project id in the url: eg: https://code.google.com/apis/console/?pli=1#project:785671162406:overview
+ // where 785671162406 is the project id, which is the SENDER_ID to use!
+ public static string[] SENDER_IDS = new string[] { Constants.SenderID };
+
+ public const string TAG = "PushSharp-GCM";
+ }
+
+ [Service] //Must use the service tag
+ public class PushHandlerService : PushHandlerServiceBase
+ {
+ public static string RegistrationID { get; private set; }
+
+ public PushHandlerService() : base(PushHandlerBroadcastReceiver.SENDER_IDS)
+ {
+ Log.Info(PushHandlerBroadcastReceiver.TAG, "PushHandlerService() constructor");
+ }
+
+ protected override void OnRegistered (Context context, string registrationId)
+ {
+ Log.Verbose(PushHandlerBroadcastReceiver.TAG, "GCM Registered: " + registrationId);
+ RegistrationID = registrationId;
+
+ createNotification("PushSharp-GCM Registered...", "The device has been Registered, Tap to View!");
+ }
+
+ protected override void OnUnRegistered (Context context, string registrationId)
+ {
+ Log.Verbose(PushHandlerBroadcastReceiver.TAG, "GCM Unregistered: " + registrationId);
+ //Remove from the web service
+ // var wc = new WebClient();
+ // var result = wc.UploadString("http://your.server.com/api/unregister/", "POST",
+ // "{ 'registrationId' : '" + lastRegistrationId + "' }");
+
+ createNotification("PushSharp-GCM Unregistered...", "The device has been unregistered, Tap to View!");
+ }
+
+ protected override void OnMessage (Context context, Intent intent)
+ {
+ Log.Info(PushHandlerBroadcastReceiver.TAG, "GCM Message Received!");
+
+ var msg = new StringBuilder();
+
+ if (intent != null && intent.Extras != null)
+ {
+ foreach (var key in intent.Extras.KeySet())
+ msg.AppendLine(key + "=" + intent.Extras.Get(key).ToString());
+ }
+
+ //Store the message
+ var prefs = GetSharedPreferences(context.PackageName, FileCreationMode.Private);
+ var edit = prefs.Edit();
+ edit.PutString("last_msg", msg.ToString());
+ edit.Commit();
+
+ string message = intent.Extras.GetString("message");
+
+ // createNotification("PushSharp-GCM Msg Rec'd", "Message Received for C2DM-Sharp... Tap to View!");
+ createNotification("New todo item!", "Todo item: " + message);
+ }
+
+ protected override bool OnRecoverableError (Context context, string errorId)
+ {
+ Log.Warn(PushHandlerBroadcastReceiver.TAG, "Recoverable Error: " + errorId);
+
+ return base.OnRecoverableError (context, errorId);
+ }
+
+ protected override void OnError (Context context, string errorId)
+ {
+ Log.Error(PushHandlerBroadcastReceiver.TAG, "GCM Error: " + errorId);
+ }
+
+ void createNotification(string title, string desc)
+ {
+ //Create notification
+ var notificationManager = GetSystemService(Context.NotificationService) as NotificationManager;
+
+ //Create an intent to show ui
+ var uiIntent = new Intent(this, typeof(TodoActivity));
+
+ //Create the notification
+ var notification = new Notification(Android.Resource.Drawable.SymActionEmail, title);
+
+ //Auto cancel will remove the notification once the user touches it
+ notification.Flags = NotificationFlags.AutoCancel;
+
+ //Set the notification info
+ //we use the pending intent, passing our ui intent over which will get called
+ //when the notification is tapped.
+ notification.SetLatestEventInfo(this, title, desc, PendingIntent.GetActivity(this, 0, uiIntent, 0));
+
+ //Show the notification
+ notificationManager.Notify(1, notification);
+ }
+ }
+}
+
diff --git a/Camera/Components/xamarin.mobile-0.6.3/samples/Xamarin.Mobile.Android.Samples/GeolocationSample/Resources/AboutResources.txt b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/AboutResources.txt
similarity index 100%
rename from Camera/Components/xamarin.mobile-0.6.3/samples/Xamarin.Mobile.Android.Samples/GeolocationSample/Resources/AboutResources.txt
rename to Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/AboutResources.txt
diff --git a/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/Resource.designer.cs b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/Resource.designer.cs
new file mode 100644
index 000000000..3ad7a6304
--- /dev/null
+++ b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/Resource.designer.cs
@@ -0,0 +1,230 @@
+#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("XamarinTodoQuickStart.Resource", IsApplication=true)]
+
+namespace XamarinTodoQuickStart
+{
+
+
+ [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()
+ {
+ global::Xamarin.Auth._MobileServices.Resource.Animation.slide_in_right = global::XamarinTodoQuickStart.Resource.Animation.slide_in_right;
+ global::Xamarin.Auth._MobileServices.Resource.Animation.slide_out_left = global::XamarinTodoQuickStart.Resource.Animation.slide_out_left;
+ global::Xamarin.Auth._MobileServices.Resource.Drawable.ic_arrow_back = global::XamarinTodoQuickStart.Resource.Drawable.ic_arrow_back;
+ global::Xamarin.Auth._MobileServices.Resource.Id.webview = global::XamarinTodoQuickStart.Resource.Id.webview;
+ global::Xamarin.Auth._MobileServices.Resource.Layout.activity_webview = global::XamarinTodoQuickStart.Resource.Layout.activity_webview;
+ global::Xamarin.Auth._MobileServices.Resource.String.ApplicationName = global::XamarinTodoQuickStart.Resource.String.ApplicationName;
+ global::Xamarin.Auth._MobileServices.Resource.String.Hello = global::XamarinTodoQuickStart.Resource.String.Hello;
+ global::Xamarin.Auth._MobileServices.Resource.String.title_activity_webview = global::XamarinTodoQuickStart.Resource.String.title_activity_webview;
+ global::PCLCrypto.Resource.String.ApplicationName = global::XamarinTodoQuickStart.Resource.String.ApplicationName;
+ global::PCLCrypto.Resource.String.Hello = global::XamarinTodoQuickStart.Resource.String.Hello;
+ }
+
+ public partial class Animation
+ {
+
+ // aapt resource value: 0x7f040000
+ public const int slide_in_right = 2130968576;
+
+ // aapt resource value: 0x7f040001
+ public const int slide_out_left = 2130968577;
+
+ static Animation()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Animation()
+ {
+ }
+ }
+
+ public partial class Attribute
+ {
+
+ static Attribute()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Attribute()
+ {
+ }
+ }
+
+ public partial class Drawable
+ {
+
+ // aapt resource value: 0x7f020000
+ public const int ic_arrow_back = 2130837504;
+
+ // aapt resource value: 0x7f020001
+ public const int ic_launcher = 2130837505;
+
+ static Drawable()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Drawable()
+ {
+ }
+ }
+
+ public partial class Id
+ {
+
+ // aapt resource value: 0x7f080000
+ public const int LinearLayout1 = 2131230720;
+
+ // aapt resource value: 0x7f080004
+ public const int buttonAddTodo = 2131230724;
+
+ // aapt resource value: 0x7f080007
+ public const int checkTodoItem = 2131230727;
+
+ // aapt resource value: 0x7f080005
+ public const int listViewTodo = 2131230725;
+
+ // aapt resource value: 0x7f080002
+ public const int loadingProgressBar = 2131230722;
+
+ // aapt resource value: 0x7f080008
+ public const int menu_refresh = 2131230728;
+
+ // aapt resource value: 0x7f080003
+ public const int textNewTodo = 2131230723;
+
+ // aapt resource value: 0x7f080001
+ public const int textViewTitle = 2131230721;
+
+ // aapt resource value: 0x7f080006
+ public const int webview = 2131230726;
+
+ static Id()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Id()
+ {
+ }
+ }
+
+ public partial class Layout
+ {
+
+ // aapt resource value: 0x7f030000
+ public const int Activity_To_Do = 2130903040;
+
+ // aapt resource value: 0x7f030001
+ public const int activity_webview = 2130903041;
+
+ // aapt resource value: 0x7f030002
+ public const int Row_List_To_Do = 2130903042;
+
+ static Layout()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Layout()
+ {
+ }
+ }
+
+ public partial class Menu
+ {
+
+ // aapt resource value: 0x7f070000
+ public const int activity_main = 2131165184;
+
+ static Menu()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Menu()
+ {
+ }
+ }
+
+ public partial class String
+ {
+
+ // aapt resource value: 0x7f050001
+ public const int ApplicationName = 2131034113;
+
+ // aapt resource value: 0x7f050000
+ public const int Hello = 2131034112;
+
+ // aapt resource value: 0x7f050005
+ public const int add_button_text = 2131034117;
+
+ // aapt resource value: 0x7f050004
+ public const int add_textbox_hint = 2131034116;
+
+ // aapt resource value: 0x7f050003
+ public const int app_name = 2131034115;
+
+ // aapt resource value: 0x7f050008
+ public const int checkbox_text = 2131034120;
+
+ // aapt resource value: 0x7f050007
+ public const int menu_refresh = 2131034119;
+
+ // aapt resource value: 0x7f050006
+ public const int mobile_services = 2131034118;
+
+ // aapt resource value: 0x7f050002
+ public const int title_activity_webview = 2131034114;
+
+ static String()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private String()
+ {
+ }
+ }
+
+ public partial class Style
+ {
+
+ // aapt resource value: 0x7f060000
+ public const int AppBaseTheme = 2131099648;
+
+ // aapt resource value: 0x7f060001
+ public const int AppTheme = 2131099649;
+
+ static Style()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Style()
+ {
+ }
+ }
+ }
+}
+#pragma warning restore 1591
diff --git a/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/drawable-hdpi/ic_launcher.png b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/drawable-hdpi/ic_launcher.png
new file mode 100644
index 000000000..b2f7c2b5f
Binary files /dev/null and b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/drawable-hdpi/ic_launcher.png differ
diff --git a/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/drawable-ldpi/ic_launcher.png b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/drawable-ldpi/ic_launcher.png
new file mode 100644
index 000000000..c2219b558
Binary files /dev/null and b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/drawable-ldpi/ic_launcher.png differ
diff --git a/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/drawable-mdpi/ic_launcher.png b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/drawable-mdpi/ic_launcher.png
new file mode 100644
index 000000000..b2c79b7ed
Binary files /dev/null and b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/drawable-mdpi/ic_launcher.png differ
diff --git a/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/drawable-xhdpi/ic_launcher.png b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 000000000..fc4b43087
Binary files /dev/null and b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/drawable-xhdpi/ic_launcher.png differ
diff --git a/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/layout/Activity_To_Do.axml b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/layout/Activity_To_Do.axml
new file mode 100644
index 000000000..2e8775ee8
--- /dev/null
+++ b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/layout/Activity_To_Do.axml
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/layout/Row_List_To_Do.axml b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/layout/Row_List_To_Do.axml
new file mode 100644
index 000000000..bc3facc8d
--- /dev/null
+++ b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/layout/Row_List_To_Do.axml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/menu/activity_main.xml b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/menu/activity_main.xml
new file mode 100644
index 000000000..2ca5582b0
--- /dev/null
+++ b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/menu/activity_main.xml
@@ -0,0 +1,5 @@
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/values-v11/styles.xml b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/values-v11/styles.xml
new file mode 100644
index 000000000..541752f6e
--- /dev/null
+++ b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/values-v11/styles.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/values-v14/styles.xml b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/values-v14/styles.xml
new file mode 100644
index 000000000..f20e01501
--- /dev/null
+++ b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/values-v14/styles.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/values/Strings.xml b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/values/Strings.xml
new file mode 100644
index 000000000..634eeecdf
--- /dev/null
+++ b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/values/Strings.xml
@@ -0,0 +1,9 @@
+
+
+ XamarinTodoQuickStart
+ Add a Todo item
+ Add
+ Mobile App
+ Refresh
+ Item Text
+
diff --git a/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/values/styles.xml b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/values/styles.xml
new file mode 100644
index 000000000..4a10ca492
--- /dev/null
+++ b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/Resources/values/styles.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/TodoActivity.cs b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/TodoActivity.cs
new file mode 100644
index 000000000..88ad3010a
--- /dev/null
+++ b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/TodoActivity.cs
@@ -0,0 +1,214 @@
+using System;
+using Android.OS;
+using Android.App;
+using Android.Views;
+using Android.Widget;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using Microsoft.WindowsAzure.MobileServices;
+using PushSharp.Client;
+using System.Net.Http;
+
+namespace XamarinTodoQuickStart
+{
+ [Activity (MainLauncher = true,
+ Icon="@drawable/ic_launcher", Label="@string/app_name",
+ Theme="@style/AppTheme")]
+ public class TodoActivity : Activity
+ {
+ private MobileServiceClient client; // Mobile Service Client reference
+ private IMobileServiceTable todoTable; // Mobile Service Table used to access data
+
+ private TodoItemAdapter adapter; // Adapter to sync the items list with the view
+ private EditText textNewTodo; // EditText containing the "New Todo" text
+ private ProgressBar progressBar; // Progress spinner to use for table operations
+
+ // Called when the activity initially gets created
+ protected override async void OnCreate(Bundle bundle)
+ {
+ base.OnCreate(bundle);
+
+ // Set our view from the "main" layout resource
+ SetContentView(Resource.Layout.Activity_To_Do);
+
+ // Initialize the progress bar
+ progressBar = FindViewById(Resource.Id.loadingProgressBar);
+ progressBar.Visibility = ViewStates.Gone;
+
+ // Create ProgressFilter to handle busy state
+ // Create ProgressFilter to handle busy state
+ var progressHandler = new ProgressHandler ();
+ progressHandler.BusyStateChange += (busy) => {
+ if (progressBar != null)
+ progressBar.Visibility = busy ? ViewStates.Visible : ViewStates.Gone;
+ };
+
+ try
+ {
+ // Check to ensure everything's setup right
+ PushClient.CheckDevice(this);
+ PushClient.CheckManifest(this);
+
+ // Register for push notifications
+ System.Diagnostics.Debug.WriteLine("Registering...");
+ PushClient.Register(this, PushHandlerBroadcastReceiver.SENDER_IDS);
+
+ CurrentPlatform.Init ();
+ // Create the Mobile Service Client instance, using the provided
+ // Mobile Service URL and key
+ client = new MobileServiceClient(
+ Constants.ApplicationURL,
+ progressHandler);
+
+ // Get the Mobile Service Table instance to use
+ todoTable = client.GetTable();
+
+ textNewTodo = FindViewById(Resource.Id.textNewTodo);
+
+ // Create an adapter to bind the items with the view
+ adapter = new TodoItemAdapter(this, Resource.Layout.Row_List_To_Do);
+ var listViewTodo = FindViewById(Resource.Id.listViewTodo);
+ listViewTodo.Adapter = adapter;
+
+ // Load the items from the Mobile Service
+ await RefreshItemsFromTableAsync();
+
+ }
+ catch (Java.Net.MalformedURLException)
+ {
+ CreateAndShowDialog(new Exception ("There was an error creating the Mobile Service. Verify the URL"), "Error");
+ }
+ catch (Exception e)
+ {
+ CreateAndShowDialog(e, "Error");
+ }
+ }
+
+ // Initializes the activity menu
+ public override bool OnCreateOptionsMenu(IMenu menu)
+ {
+ MenuInflater.Inflate(Resource.Menu.activity_main, menu);
+ return true;
+ }
+
+ // Select an option from the menu
+ public override bool OnOptionsItemSelected(IMenuItem item)
+ {
+ if (item.ItemId == Resource.Id.menu_refresh) {
+ OnRefreshItemsSelected();
+ }
+ return true;
+ }
+
+ // Called when the refresh menu opion is selected
+ async void OnRefreshItemsSelected()
+ {
+ await RefreshItemsFromTableAsync();
+ }
+
+ // Refresh the list with the items in the Mobile Service Table
+ async Task RefreshItemsFromTableAsync()
+ {
+ try {
+ // Get the items that weren't marked as completed and add them in the adapter
+ var list = await todoTable.Where(item => item.Complete == false).ToListAsync ();
+
+ adapter.Clear ();
+
+ foreach (TodoItem current in list)
+ adapter.Add(current);
+
+ }
+ catch (Exception e)
+ {
+ CreateAndShowDialog(e, "Error");
+ }
+ }
+
+ public async Task CheckItem(TodoItem item)
+ {
+ if (client == null)
+ return;
+
+ // Set the item as completed and update it in the table
+ item.Complete = true;
+ try {
+ await todoTable.UpdateAsync(item);
+ if (item.Complete)
+ adapter.Remove(item);
+
+ } catch (Exception e) {
+ CreateAndShowDialog(e, "Error");
+ }
+ }
+
+ [Java.Interop.Export()]
+ public async void AddItem(View view)
+ {
+ if (client == null || string.IsNullOrWhiteSpace(textNewTodo.Text)) {
+ return;
+ }
+
+ // Create a new item
+ var item = new TodoItem() {
+ Text = textNewTodo.Text,
+ Complete = false,
+ RegistrationId = PushHandlerService.RegistrationID
+ };
+
+ try {
+ // Insert the new item
+ await todoTable.InsertAsync(item);
+
+ if (!item.Complete) {
+ adapter.Add(item);
+ }
+ } catch (Exception e) {
+ CreateAndShowDialog(e, "Error");
+ }
+
+ textNewTodo.Text = "";
+ }
+
+ void CreateAndShowDialog(Exception exception, String title)
+ {
+ CreateAndShowDialog(exception.Message, title);
+ }
+
+ void CreateAndShowDialog(string message, string title)
+ {
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+
+ builder.SetMessage(message);
+ builder.SetTitle(title);
+ builder.Create().Show();
+ }
+
+ class ProgressHandler : DelegatingHandler
+ {
+ int busyCount = 0;
+
+ public event Action BusyStateChange;
+
+ #region implemented abstract members of HttpMessageHandler
+
+ protected override async Task SendAsync (HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
+ {
+ //assumes always executes on UI thread
+ if (busyCount++ == 0 && BusyStateChange != null)
+ BusyStateChange (true);
+
+ var response = await base.SendAsync (request, cancellationToken);
+
+ // assumes always executes on UI thread
+ if (--busyCount == 0 && BusyStateChange != null)
+ BusyStateChange (false);
+
+ return response;
+ }
+
+ #endregion
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/TodoItem.cs b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/TodoItem.cs
new file mode 100644
index 000000000..92617bf60
--- /dev/null
+++ b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/TodoItem.cs
@@ -0,0 +1,31 @@
+using System;
+using Newtonsoft.Json;
+
+namespace XamarinTodoQuickStart
+{
+ public class TodoItem
+ {
+ // Tables created prior to November 2013 should use 'int' type. Check your configuration.
+ public string Id { get; set; }
+
+ [JsonProperty(PropertyName = "channel")]
+ public string RegistrationId { get; set; }
+
+ [JsonProperty(PropertyName = "text")]
+ public string Text { get; set; }
+
+ [JsonProperty(PropertyName = "complete")]
+ public bool Complete { get; set; }
+ }
+
+ public class TodoItemWrapper : Java.Lang.Object
+ {
+ public TodoItem TodoItem { get; private set; }
+
+ public TodoItemWrapper(TodoItem item)
+ {
+ this.TodoItem = item;
+ }
+ }
+}
+
diff --git a/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/TodoItemAdapter.cs b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/TodoItemAdapter.cs
new file mode 100644
index 000000000..ac8127aa6
--- /dev/null
+++ b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/TodoItemAdapter.cs
@@ -0,0 +1,100 @@
+using System;
+using Android.App;
+using Android.Views;
+using Android.Widget;
+using System.Collections.Generic;
+using XamarinTodoQuickStart;
+
+namespace XamarinTodoQuickStart
+{
+ public class TodoItemAdapter : BaseAdapter
+ {
+ // Private Variables
+ private Activity activity;
+ private int layoutResourceId;
+ private List items = new List();
+
+ // Constructor
+ public TodoItemAdapter(Activity activity, int layoutResourceId)
+ {
+ this.activity = activity;
+ this.layoutResourceId = layoutResourceId;
+ }
+
+ // Returns the view for a specific item on the list
+ public override View GetView(int position, Android.Views.View convertView, Android.Views.ViewGroup parent)
+ {
+ var row = convertView;
+ var currentItem = this[position];
+ CheckBox checkBox;
+
+ if (row == null)
+ {
+ var inflater = activity.LayoutInflater;
+ row = inflater.Inflate(layoutResourceId, parent, false);
+
+ checkBox = row.FindViewById(Resource.Id.checkTodoItem);
+
+ checkBox.CheckedChange += async (sender, e) => {
+ var cbSender = sender as CheckBox;
+ if (cbSender != null && cbSender.Tag is TodoItemWrapper && cbSender.Checked)
+ {
+ cbSender.Enabled = false;
+
+ if (activity is TodoActivity)
+ await ((TodoActivity)activity).CheckItem((cbSender.Tag as TodoItemWrapper).TodoItem);
+ }
+ };
+ }
+ else
+ {
+ checkBox = row.FindViewById(Resource.Id.checkTodoItem);
+ }
+
+ checkBox.Text = currentItem.Text;
+ checkBox.Checked = false;
+ checkBox.Enabled = true;
+ checkBox.Tag = new TodoItemWrapper(currentItem);
+
+ return row;
+ }
+
+ public void Add(TodoItem item)
+ {
+ items.Add(item);
+ NotifyDataSetChanged();
+ }
+
+ public void Clear()
+ {
+ items.Clear();
+ NotifyDataSetChanged();
+ }
+
+ public void Remove(TodoItem item)
+ {
+ items.Remove(item);
+ NotifyDataSetChanged();
+ }
+
+ #region implemented abstract members of BaseAdapter
+
+ public override long GetItemId(int position)
+ {
+ return position; // HACK:
+ }
+
+ public override int Count
+ {
+ get { return items.Count; }
+ }
+
+ public override TodoItem this[int position]
+ {
+ get { return items[position]; }
+ }
+
+ #endregion
+ }
+}
+
diff --git a/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/XamarinTodoQuickStart.Android.csproj b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/XamarinTodoQuickStart.Android.csproj
new file mode 100644
index 000000000..924c3e4b1
--- /dev/null
+++ b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/XamarinTodoQuickStart.Android.csproj
@@ -0,0 +1,118 @@
+
+
+
+ Debug
+ AnyCPU
+ 10.0.0
+ 2.0
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}
+ {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ Library
+ XamarinTodoQuickStart
+ True
+ Resources\Resource.designer.cs
+ Resource
+ Resources
+ Assets
+ ZUMOAPPNAME
+ Properties\AndroidManifest.xml
+ v8.1
+ true
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ None
+ false
+ Xamarin.Android.Net.AndroidClientHandler
+ btls
+
+
+ full
+ true
+ bin\Release
+ prompt
+ 4
+ false
+ false
+
+
+
+
+
+
+
+
+
+ ..\_external\PushSharp.Client.MonoForAndroid.dll
+
+
+
+ ..\packages\Newtonsoft.Json.9.0.1\lib\portable-net45+wp80+win8+wpa81\Newtonsoft.Json.dll
+
+
+ ..\packages\PInvoke.Windows.Core.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Windows.Core.dll
+
+
+ ..\packages\PInvoke.Kernel32.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Kernel32.dll
+
+
+ ..\packages\PInvoke.BCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.BCrypt.dll
+
+
+ ..\packages\PInvoke.NCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.NCrypt.dll
+
+
+ ..\packages\Validation.2.2.8\lib\dotnet\Validation.dll
+
+
+ ..\packages\PCLCrypto.2.0.147\lib\MonoAndroid23\PCLCrypto.dll
+
+
+ ..\packages\Xamarin.Android.Support.v4.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v4.dll
+
+
+ ..\packages\Xamarin.Android.Support.CustomTabs.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.CustomTabs.dll
+
+
+ ..\packages\Microsoft.Azure.Mobile.Client.4.0.2\lib\monoandroid70\Microsoft.Azure.Mobile.Client.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/packages.config b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/packages.config
new file mode 100644
index 000000000..b65885357
--- /dev/null
+++ b/Azure/GetStartedWithPush/Android/XamarinTodoQuickStart/packages.config
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithPush/Android/_external/PushSharp.Client.MonoForAndroid.dll b/Azure/GetStartedWithPush/Android/_external/PushSharp.Client.MonoForAndroid.dll
new file mode 100755
index 000000000..7d44d9da9
Binary files /dev/null and b/Azure/GetStartedWithPush/Android/_external/PushSharp.Client.MonoForAndroid.dll differ
diff --git a/Azure/GetStartedWithPush/Metadata.xml b/Azure/GetStartedWithPush/Metadata.xml
new file mode 100644
index 000000000..850bd6e68
--- /dev/null
+++ b/Azure/GetStartedWithPush/Metadata.xml
@@ -0,0 +1,11 @@
+
+
+ 2E5CD083-F336-4A90-9911-1733EB6F5305
+ false
+ Beginner
+ Cloud
+ Android, iOS
+ Indie
+ Microsoft Azure sample GetStartedWithPush
+ false
+
diff --git a/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart.iOS.sln b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart.iOS.sln
new file mode 100644
index 000000000..85d684411
--- /dev/null
+++ b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart.iOS.sln
@@ -0,0 +1,43 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XamarinTodoQuickStart.iOS", "XamarinTodoQuickStart\XamarinTodoQuickStart.iOS.csproj", "{07F1CD1B-626F-4BE5-9840-97B44CBB94C9}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Ad-Hoc|iPhone = Ad-Hoc|iPhone
+ Ad-Hoc|iPhoneSimulator = Ad-Hoc|iPhoneSimulator
+ AppStore|iPhone = AppStore|iPhone
+ AppStore|iPhoneSimulator = AppStore|iPhoneSimulator
+ Debug|iPhone = Debug|iPhone
+ Debug|iPhoneSimulator = Debug|iPhoneSimulator
+ Release|iPhone = Release|iPhone
+ Release|iPhoneSimulator = Release|iPhoneSimulator
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Ad-Hoc|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.AppStore|iPhone.ActiveCfg = AppStore|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.AppStore|iPhone.Build.0 = AppStore|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.AppStore|iPhoneSimulator.Deploy.0 = AppStore|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Debug|iPhone.ActiveCfg = Debug|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Debug|iPhone.Build.0 = Debug|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Release|iPhone.ActiveCfg = Release|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Release|iPhone.Build.0 = Release|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
+ EndGlobalSection
+ GlobalSection(MonoDevelopProperties) = preSolution
+ StartupItem = XamarinTodoQuickStart\XamarinTodoQuickStart.iOS.csproj
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/AppDelegate.cs b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/AppDelegate.cs
new file mode 100644
index 000000000..beaabe7e1
--- /dev/null
+++ b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/AppDelegate.cs
@@ -0,0 +1,75 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Foundation;
+using UIKit;
+using System.Diagnostics;
+
+namespace XamarinTodoQuickStart
+{
+ // The UIApplicationDelegate for the application. This class is responsible for launching the
+ // User Interface of the application, as well as listening (and optionally responding) to
+ // application events from iOS.
+ [Register ("AppDelegate")]
+ public partial class AppDelegate : UIApplicationDelegate
+ {
+ // class-level declarations
+ public override UIWindow Window {get; set;}
+ public string DeviceToken { get; set; }
+
+ public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
+ {
+ // NOTE: Don't call the base implementation on a Model class
+ // see https://docs.microsoft.com/xamarin/ios/app-fundamentals/delegates-protocols-and-events
+
+ UIRemoteNotificationType notificationTypes = UIRemoteNotificationType.Alert |
+ UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound;
+ UIApplication.SharedApplication.RegisterForRemoteNotificationTypes(notificationTypes);
+
+ return true;
+ }
+
+ public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken)
+ {
+ // NOTE: Don't call the base implementation on a Model class
+ // see https://docs.microsoft.com/xamarin/ios/app-fundamentals/delegates-protocols-and-events
+
+ string trimmedDeviceToken = deviceToken.Description;
+ if (!string.IsNullOrWhiteSpace(trimmedDeviceToken))
+ {
+ trimmedDeviceToken = trimmedDeviceToken.Trim('<');
+ trimmedDeviceToken = trimmedDeviceToken.Trim('>');
+ }
+ DeviceToken = trimmedDeviceToken;
+ }
+
+ public override void FailedToRegisterForRemoteNotifications(UIApplication application, NSError error)
+ {
+ // NOTE: Don't call the base implementation on a Model class
+ // see https://docs.microsoft.com/xamarin/ios/app-fundamentals/delegates-protocols-and-events
+
+ // TODO:: error handling for failed registration (ex: no internet connection)
+ var alert = new UIAlertView("Error registering push notifications", error.LocalizedDescription, null, "OK", null);
+ alert.Show();
+
+ DeviceToken = string.Empty;
+ }
+
+ public override void ReceivedRemoteNotification(UIApplication application, NSDictionary userInfo)
+ {
+ // NOTE: Don't call the base implementation on a Model class
+ // see https://docs.microsoft.com/xamarin/ios/app-fundamentals/delegates-protocols-and-events
+
+ Debug.WriteLine(userInfo.ToString());
+ NSObject inAppMessage;
+
+ bool success = userInfo.TryGetValue(new NSString("inAppMessage"), out inAppMessage);
+
+ if (success)
+ {
+ var alert = new UIAlertView("Got push notification", inAppMessage.ToString(), null, "OK", null);
+ alert.Show();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Contents.json b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 000000000..d77296819
--- /dev/null
+++ b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,205 @@
+{
+ "images": [
+ {
+ "size": "20x20",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "20x20",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "filename": "Icon_58.png",
+ "size": "29x29",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "29x29",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "40x40",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "40x40",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "filename": "Icon_120.png",
+ "size": "60x60",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "60x60",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "20x20",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "20x20",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "29x29",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "29x29",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "40x40",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "40x40",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "83.5x83.5",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "filename": "Icon_76.png",
+ "size": "76x76",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "76x76",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "1024x1024",
+ "scale": "1x",
+ "idiom": "ios-marketing"
+ },
+ {
+ "role": "notificationCenter",
+ "size": "24x24",
+ "subtype": "38mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "notificationCenter",
+ "size": "27.5x27.5",
+ "subtype": "42mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "companionSettings",
+ "size": "29x29",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "companionSettings",
+ "size": "29x29",
+ "scale": "3x",
+ "idiom": "watch"
+ },
+ {
+ "role": "appLauncher",
+ "size": "40x40",
+ "subtype": "38mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "longLook",
+ "size": "44x44",
+ "subtype": "42mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "quickLook",
+ "size": "86x86",
+ "subtype": "38mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "quickLook",
+ "size": "98x98",
+ "subtype": "42mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "size": "16x16",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "16x16",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "size": "32x32",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "32x32",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "size": "128x128",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "128x128",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "size": "256x256",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "256x256",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "size": "512x512",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "512x512",
+ "scale": "2x",
+ "idiom": "mac"
+ }
+ ],
+ "info": {
+ "version": 1,
+ "author": "xcode"
+ }
+}
\ No newline at end of file
diff --git a/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon.png b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon.png
new file mode 100755
index 000000000..652acddf5
Binary files /dev/null and b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon.png differ
diff --git a/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon@2x.png b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon@2x.png
new file mode 100755
index 000000000..116eeabd2
Binary files /dev/null and b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon@2x.png differ
diff --git a/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_120.png b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_120.png
new file mode 100755
index 000000000..6a06e6ff8
Binary files /dev/null and b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_120.png differ
diff --git a/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_58.png b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_58.png
new file mode 100755
index 000000000..a69958c06
Binary files /dev/null and b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_58.png differ
diff --git a/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_76.png b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_76.png
new file mode 100755
index 000000000..09898ad19
Binary files /dev/null and b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_76.png differ
diff --git a/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Constants.cs b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Constants.cs
new file mode 100644
index 000000000..05facfbca
--- /dev/null
+++ b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Constants.cs
@@ -0,0 +1,12 @@
+using System;
+
+namespace XamarinTodoQuickStart
+{
+ public static class Constants
+ {
+ // Azure app specific URL and key
+ public const string ApplicationURL = @"https://your_app_name.azurewebsites.net/";
+
+ }
+}
+
diff --git a/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Entitlements.plist b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Entitlements.plist
new file mode 100644
index 000000000..903def2af
--- /dev/null
+++ b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Entitlements.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ aps-environment
+ development
+
+
diff --git a/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Info.plist b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Info.plist
new file mode 100644
index 000000000..7a3eda28c
--- /dev/null
+++ b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Info.plist
@@ -0,0 +1,44 @@
+
+
+
+
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UIMainStoryboardFile
+ MainStoryboard_iPhone
+ UIMainStoryboardFile~ipad
+ MainStoryboard_iPad
+ MinimumOSVersion
+ 11.0
+ CFBundleDisplayName
+ XamarinTodoQuickStart
+ CFBundleIdentifier
+ com.xamarin.azuremobileservices.quickstart
+ CFBundleName
+ XamarinTodoQuickStart
+ CFBundleVersion
+ 1
+ CFBundleShortVersionString
+ 1
+ UILaunchStoryboardName
+ LaunchScreen
+ XSAppIconAssets
+ Assets.xcassets/AppIcon.appiconset
+
+
diff --git a/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Main.cs b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Main.cs
new file mode 100644
index 000000000..0ac4457b6
--- /dev/null
+++ b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Main.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Foundation;
+using UIKit;
+
+namespace XamarinTodoQuickStart
+{
+ public class Application
+ {
+ // This is the main entry point of the application.
+ static void Main(string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main(args, null, "AppDelegate");
+ }
+ }
+}
diff --git a/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/MainStoryboard_iPad.storyboard b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/MainStoryboard_iPad.storyboard
new file mode 100755
index 000000000..411b4eecb
--- /dev/null
+++ b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/MainStoryboard_iPad.storyboard
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/MainStoryboard_iPhone.storyboard b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/MainStoryboard_iPhone.storyboard
new file mode 100755
index 000000000..5894b2a4e
--- /dev/null
+++ b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/MainStoryboard_iPhone.storyboard
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Resources/Default.png b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Resources/Default.png
new file mode 100755
index 000000000..4c8ca6f69
Binary files /dev/null and b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Resources/Default.png differ
diff --git a/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Resources/Default@2x.png b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Resources/Default@2x.png
new file mode 100755
index 000000000..35b84cffe
Binary files /dev/null and b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Resources/Default@2x.png differ
diff --git a/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Resources/LaunchScreen.xib b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Resources/LaunchScreen.xib
new file mode 100644
index 000000000..9ca3deadd
--- /dev/null
+++ b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/Resources/LaunchScreen.xib
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/TodoItem.cs b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/TodoItem.cs
new file mode 100644
index 000000000..50d8678fa
--- /dev/null
+++ b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/TodoItem.cs
@@ -0,0 +1,21 @@
+using System;
+using Newtonsoft.Json;
+
+namespace XamarinTodoQuickStart
+{
+ public class TodoItem
+ {
+ // Tables created prior to November 2013 should use 'int' type. Check your configuration.
+ public string Id { get; set; }
+
+ [JsonProperty(PropertyName = "text")]
+ public string Text { get; set; }
+
+ [JsonProperty(PropertyName = "complete")]
+ public bool Complete { get; set; }
+
+ [JsonProperty(PropertyName = "deviceToken")]
+ public string DeviceToken { get; set; }
+ }
+}
+
diff --git a/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/TodoListViewController.cs b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/TodoListViewController.cs
new file mode 100644
index 000000000..5e9d4305a
--- /dev/null
+++ b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/TodoListViewController.cs
@@ -0,0 +1,175 @@
+// This file has been autogenerated from parsing an Objective-C header file added in Xcode.
+using System;
+using Foundation;
+using UIKit;
+using System.Threading.Tasks;
+
+namespace XamarinTodoQuickStart
+{
+ public partial class TodoListViewController : UITableViewController
+ {
+ // Private Variables
+ private TodoService todoService;
+ private bool useRefreshControl = false;
+
+ // Constructor
+ public TodoListViewController(IntPtr handle) : base(handle)
+ {
+ }
+
+ public override async void ViewDidLoad()
+ {
+ base.ViewDidLoad();
+
+ todoService = TodoService.DefaultService;
+
+ todoService.BusyUpdate += (bool busy) => {
+ if (busy)
+ activityIndicator.StartAnimating();
+ else
+ activityIndicator.StopAnimating();
+ };
+
+ AddRefreshControl();
+
+ await RefreshAsync();
+ }
+
+ async Task RefreshAsync()
+ {
+ // only activate the refresh control if the feature is available
+ if (useRefreshControl)
+ RefreshControl.BeginRefreshing();
+
+ await todoService.RefreshDataAsync();
+
+ if (useRefreshControl)
+ RefreshControl.EndRefreshing();
+
+ TableView.ReloadData();
+ }
+
+ #region UITableView methods
+ public override nint RowsInSection(UITableView tableview, nint section)
+ {
+ if (todoService == null || todoService.Items == null)
+ return 0;
+
+ return todoService.Items.Count;
+ }
+
+ public override nint NumberOfSections(UITableView tableView)
+ {
+ return 1;
+ }
+
+ public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
+ {
+ const string CellIdentifier = @"Cell";
+ var cell = tableView.DequeueReusableCell(CellIdentifier);
+ if (cell == null) {
+ cell = new UITableViewCell(UITableViewCellStyle.Default, CellIdentifier);
+ }
+
+ // Set the label on the cell and make sure the label color is black (in case this cell
+ // has been reused and was previously greyed out
+ var label = (UILabel)cell.ViewWithTag(1);
+ label.TextColor = UIColor.Black;
+ label.Text = todoService.Items [indexPath.Row].Text;
+
+ return cell;
+ }
+
+ public override string TitleForDeleteConfirmation(UITableView tableView, NSIndexPath indexPath)
+ {
+ // Customize the Delete button to say "complete"
+ return @"complete";
+ }
+
+ public override UITableViewCellEditingStyle EditingStyleForRow(UITableView tableView, NSIndexPath indexPath)
+ {
+ // Find the item that is about to be edited
+ var item = todoService.Items[indexPath.Row];
+
+ // If the item is complete, then this is just pending upload. Editing is not allowed
+ if (item.Complete)
+ return UITableViewCellEditingStyle.None;
+
+ // Otherwise, allow the delete button to appear
+ return UITableViewCellEditingStyle.Delete;
+ }
+
+ public async override void CommitEditingStyle(UITableView tableView, UITableViewCellEditingStyle editingStyle, NSIndexPath indexPath)
+ {
+ // Find item that was commited for editing (completed)
+ var item = todoService.Items[indexPath.Row];
+
+ // Change the appearance to look greyed out until we remove the item
+ var label = (UILabel)TableView.CellAt(indexPath).ViewWithTag(1);
+ label.TextColor = UIColor.Gray;
+
+ // Ask the todoService to set the item's complete value to YES, and remove the row if successful
+ await todoService.CompleteItemAsync(item);
+
+ // Remove the row from the UITableView
+ tableView.DeleteRows(new [] { indexPath }, UITableViewRowAnimation.Top);
+ }
+
+ #endregion
+
+ #region UI Actions
+
+ async partial void OnAdd(NSObject sender)
+ {
+ if (string.IsNullOrWhiteSpace(itemText.Text))
+ return;
+
+ string deviceToken = ((AppDelegate)UIApplication.SharedApplication.Delegate).DeviceToken;
+
+ var newItem = new TodoItem()
+ {
+ Text = itemText.Text,
+ Complete = false,
+ DeviceToken = deviceToken
+ };
+
+ int index = await todoService.InsertTodoItemAsync(newItem);
+
+ TableView.InsertRows(new [] { NSIndexPath.FromRowSection(index, 0) },
+ UITableViewRowAnimation.Top);
+
+ itemText.Text = "";
+ }
+
+ #endregion
+
+ #region UITextFieldDelegate methods
+
+ [Export ("textFieldShouldReturn:")]
+ public virtual bool ShouldReturn(UITextField textField)
+ {
+ textField.ResignFirstResponder();
+ return true;
+ }
+
+ #endregion
+
+ #region * iOS Specific Code
+
+ // This method will add the UIRefreshControl to the table view if
+ // it is available, ie, we are running on iOS 6+
+ private void AddRefreshControl()
+ {
+ if (UIDevice.CurrentDevice.CheckSystemVersion(6, 0)) {
+ // the refresh control is available, let's add it
+ RefreshControl = new UIRefreshControl();
+ RefreshControl.ValueChanged += async (sender, e) => {
+ await RefreshAsync();
+ };
+ useRefreshControl = true;
+ }
+ }
+
+ #endregion
+ }
+}
diff --git a/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/TodoListViewController.designer.cs b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/TodoListViewController.designer.cs
new file mode 100644
index 000000000..8c7c47d97
--- /dev/null
+++ b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/TodoListViewController.designer.cs
@@ -0,0 +1,36 @@
+// WARNING
+//
+// This file has been generated automatically by Xamarin Studio to store outlets and
+// actions made in the Xcode designer. If it is removed, they will be lost.
+// Manual changes to this file may not be handled correctly.
+//
+using Foundation;
+
+namespace XamarinTodoQuickStart
+{
+ [Register ("TodoListViewController")]
+ partial class TodoListViewController
+ {
+ [Outlet]
+ UIKit.UIActivityIndicatorView activityIndicator { get; set; }
+
+ [Outlet]
+ UIKit.UITextField itemText { get; set; }
+
+ [Action ("OnAdd:")]
+ partial void OnAdd (Foundation.NSObject sender);
+
+ void ReleaseDesignerOutlets ()
+ {
+ if (itemText != null) {
+ itemText.Dispose ();
+ itemText = null;
+ }
+
+ if (activityIndicator != null) {
+ activityIndicator.Dispose ();
+ activityIndicator = null;
+ }
+ }
+ }
+}
diff --git a/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/TodoService.cs b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/TodoService.cs
new file mode 100644
index 000000000..9321ccbc7
--- /dev/null
+++ b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/TodoService.cs
@@ -0,0 +1,121 @@
+using System;
+using System.Collections.Generic;
+using Foundation;
+using System.Threading.Tasks;
+using Microsoft.WindowsAzure.MobileServices;
+using System.Net.Http;
+
+namespace XamarinTodoQuickStart
+{
+ public class TodoService : DelegatingHandler
+ {
+ private static TodoService todoServiceInstance = new TodoService();
+ public static TodoService DefaultService { get { return todoServiceInstance; } }
+
+ private MobileServiceClient client;
+ private IMobileServiceTable todoTable;
+
+ public List Items { get; private set;}
+ private int busyCount = 0;
+
+ // Public events
+ public event Action BusyUpdate;
+
+ // Constructor
+ protected TodoService()
+ {
+ Items = new List();
+
+ CurrentPlatform.Init ();
+ // Initialize the Mobile Service client with your URL and key
+ client = new MobileServiceClient(Constants.ApplicationURL, this);
+
+ // Create an MSTable instance to allow us to work with the TodoItem table
+ todoTable = client.GetTable ();
+ }
+
+ async public Task> RefreshDataAsync()
+ {
+ try
+ {
+ // This code refreshes the entries in the list view by querying the TodoItems table.
+ // The query excludes completed TodoItems
+ Items = await todoTable
+ .Where (todoItem => todoItem.Complete == false).ToListAsync();
+
+ }
+ catch (MobileServiceInvalidOperationException e)
+ {
+ Console.Error.WriteLine (@"ERROR {0}", e.Message);
+ return null;
+ }
+
+ return Items;
+ }
+
+ public async Task InsertTodoItemAsync(TodoItem todoItem)
+ {
+ try
+ {
+ // This code inserts a new TodoItem into the database. When the operation completes
+ // and Mobile Services has assigned an Id, the item is added to the CollectionView
+ await todoTable.InsertAsync(todoItem);
+
+ Items.Add(todoItem);
+
+ return Items.IndexOf(todoItem);
+
+ }
+ catch (MobileServiceInvalidOperationException e)
+ {
+ Console.Error.WriteLine(@"ERROR {0}", e.Message);
+ return 0;
+ }
+ }
+
+ public async Task CompleteItemAsync(TodoItem item)
+ {
+ try
+ {
+ // This code takes a freshly completed TodoItem and updates the database. When the MobileService
+ // responds, the item is removed from the list
+ item.Complete = true;
+ await todoTable.UpdateAsync(item);
+ Items.Remove(item);
+
+ }
+ catch (MobileServiceInvalidOperationException e)
+ {
+ Console.Error.WriteLine (@"ERROR {0}", e.Message);
+ }
+ }
+
+ void Busy(bool busy)
+ {
+ // assumes always executes on UI thread
+ if (busy)
+ {
+ if (busyCount++ == 0 && BusyUpdate != null)
+ BusyUpdate(true);
+ }
+ else
+ {
+ if (--busyCount == 0 && BusyUpdate != null)
+ BusyUpdate(false);
+ }
+ }
+
+ #region implemented abstract members of HttpMessageHandler
+
+ protected override async Task SendAsync (System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
+ {
+ Busy (true);
+ var response = await base.SendAsync (request, cancellationToken);
+
+ Busy (false);
+ return response;
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/XamarinTodoQuickStart.iOS.csproj b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/XamarinTodoQuickStart.iOS.csproj
new file mode 100644
index 000000000..8cc16b346
--- /dev/null
+++ b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/XamarinTodoQuickStart.iOS.csproj
@@ -0,0 +1,167 @@
+
+
+
+ Debug
+ iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}
+ {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ Exe
+ XamarinTodoQuickStart
+ Resources
+ XamarinTodoQuickStart
+ Xamarin.iOS
+ v1.0
+
+
+ true
+ full
+ false
+ bin\iPhoneSimulator\Debug
+ DEBUG;
+ prompt
+ 4
+ SdkOnly
+ false
+ true
+
+ x86_64
+ NSUrlSessionHandler
+ iPhone Developer
+
+
+ full
+ true
+ bin\iPhoneSimulator\Release
+ prompt
+ 4
+ SdkOnly
+ false
+ NSUrlSessionHandler
+ x86_64
+
+
+ true
+ full
+ false
+ bin\iPhone\Debug
+ DEBUG;
+ prompt
+ 4
+ true
+ false
+ iPhone Developer
+
+
+ ARM64
+ Entitlements.plist
+ NSUrlSessionHandler
+
+
+ full
+ true
+ bin\iPhone\Release
+ prompt
+ 4
+ iPhone Developer
+ false
+ Entitlements.plist
+ ARM64
+ NSUrlSessionHandler
+
+
+ full
+ true
+ bin\iPhone\Ad-Hoc
+ prompt
+ 4
+ iPhone Distribution
+ true
+ false
+ Automatic:AdHoc
+ Entitlements.plist
+ ARM64
+ NSUrlSessionHandler
+
+
+ full
+ true
+ bin\iPhone\AppStore
+ prompt
+ 4
+ iPhone Distribution
+ false
+ Automatic:AppStore
+ Entitlements.plist
+ ARMv7, ARM64
+ NSUrlSessionHandler
+
+
+
+
+
+
+
+
+
+ ..\packages\Newtonsoft.Json.9.0.1\lib\portable-net45+wp80+win8+wpa81\Newtonsoft.Json.dll
+
+
+ ..\packages\PInvoke.Windows.Core.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Windows.Core.dll
+
+
+ ..\packages\PInvoke.Kernel32.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Kernel32.dll
+
+
+ ..\packages\PInvoke.BCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.BCrypt.dll
+
+
+ ..\packages\PInvoke.NCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.NCrypt.dll
+
+
+ ..\packages\Validation.2.2.8\lib\dotnet\Validation.dll
+
+
+ ..\packages\PCLCrypto.2.0.147\lib\xamarinios10\PCLCrypto.dll
+
+
+ ..\packages\Microsoft.Azure.Mobile.Client.4.0.2\lib\xamarinios10\Microsoft.Azure.Mobile.Client.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TodoListViewController.cs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/packages.config b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/packages.config
new file mode 100644
index 000000000..06847c21c
--- /dev/null
+++ b/Azure/GetStartedWithPush/iOS/XamarinTodoQuickStart/packages.config
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithPush/readme.md b/Azure/GetStartedWithPush/readme.md
new file mode 100644
index 000000000..4d2e131c6
--- /dev/null
+++ b/Azure/GetStartedWithPush/readme.md
@@ -0,0 +1,14 @@
+Get Started with Push Notifications
+=====================
+
+using Microsoft Azure and Xamarin
+-------------------------------
+
+### Android
+
+**NOTE:** Google Cloud Messaging is now deprecated and replaced by Firebase.
+
+- NuGet: https://www.nuget.org/packages/Xamarin.Firebase.Messaging/
+- Sample: https://github.com/xamarin/GooglePlayServicesComponents/tree/master/firebase-messaging/samples
+
+This sample is no longer the current way to do notifications with Android.
\ No newline at end of file
diff --git a/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart.Android.sln b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart.Android.sln
new file mode 100644
index 000000000..207f1fe34
--- /dev/null
+++ b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart.Android.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XamarinTodoQuickStart.Android", "XamarinTodoQuickStart\XamarinTodoQuickStart.Android.csproj", "{8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(MonoDevelopProperties) = preSolution
+ StartupItem = XamarinTodoQuickStart\XamarinTodoQuickStart.Android.csproj
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Assets/AboutAssets.txt b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Assets/AboutAssets.txt
new file mode 100644
index 000000000..a9b0638eb
--- /dev/null
+++ b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Assets/AboutAssets.txt
@@ -0,0 +1,19 @@
+Any raw assets you want to be deployed with your application can be placed in
+this directory (and child directories) and given a Build Action of "AndroidAsset".
+
+These files will be deployed with your package and will be accessible using Android's
+AssetManager, like this:
+
+public class ReadAsset : Activity
+{
+ protected override void OnCreate (Bundle bundle)
+ {
+ base.OnCreate (bundle);
+
+ InputStream input = Assets.Open ("my_asset.txt");
+ }
+}
+
+Additionally, some Android functions will automatically load asset files:
+
+Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf");
diff --git a/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Constants.cs b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Constants.cs
new file mode 100644
index 000000000..bb32e1eed
--- /dev/null
+++ b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Constants.cs
@@ -0,0 +1,28 @@
+using System;
+
+namespace XamarinTodoQuickStart
+{
+ public static class Constants
+ {
+ // Azure app specific URL and key
+ public const string ApplicationURL = @"https://your_app_id.azurewebsites.net/";
+
+ // Scheme used to send web response to this app
+ public const string AuthScheme = @"SCHEME_FROM_AUTH_PROVIDER"; // ALSO ENTER IN AndroidManifest.xml
+ }
+}
+
+/*
+EXAMPLE OF ANDROIDMANIFEST.XML ENTRY (for Microsoft authentication)
+
+
+
+
+
+
+
+
+
+
+*/
\ No newline at end of file
diff --git a/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Properties/AndroidManifest.xml b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Properties/AndroidManifest.xml
new file mode 100644
index 000000000..1f019f998
--- /dev/null
+++ b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Properties/AndroidManifest.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Properties/AssemblyInfo.cs b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..2bc8c83f4
--- /dev/null
+++ b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Properties/AssemblyInfo.cs
@@ -0,0 +1,28 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using Android.App;
+
+// Information about this assembly is defined by the following attributes.
+// Change them to the values specific to your project.
+
+[assembly: AssemblyTitle("XamarinTodoQuickStart")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("Xamarin")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
+// The form "{Major}.{Minor}.*" will automatically update the build and revision,
+// and "{Major}.{Minor}.{Build}.*" will update just the revision.
+
+[assembly: AssemblyVersion("1.0.0")]
+
+// The following attributes are used to specify the signing key for the assembly,
+// if desired. See the Mono documentation for more information about signing.
+
+//[assembly: AssemblyDelaySign(false)]
+//[assembly: AssemblyKeyFile("")]
+
diff --git a/Camera/Components/xamarin.mobile-0.7.4/samples/Xamarin.Mobile.Android.Samples/GeolocationSample/Resources/AboutResources.txt b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/AboutResources.txt
similarity index 100%
rename from Camera/Components/xamarin.mobile-0.7.4/samples/Xamarin.Mobile.Android.Samples/GeolocationSample/Resources/AboutResources.txt
rename to Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/AboutResources.txt
diff --git a/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/Resource.designer.cs b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/Resource.designer.cs
new file mode 100644
index 000000000..a20a67e67
--- /dev/null
+++ b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/Resource.designer.cs
@@ -0,0 +1,193 @@
+#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("XamarinTodoQuickStart.Resource", IsApplication=true)]
+
+namespace XamarinTodoQuickStart
+{
+
+
+ [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()
+ {
+ global::Xamarin.Auth._MobileServices.Resource.String.ApplicationName = global::XamarinTodoQuickStart.Resource.String.ApplicationName;
+ global::Xamarin.Auth._MobileServices.Resource.String.Hello = global::XamarinTodoQuickStart.Resource.String.Hello;
+ global::PCLCrypto.Resource.String.ApplicationName = global::XamarinTodoQuickStart.Resource.String.ApplicationName;
+ global::PCLCrypto.Resource.String.Hello = global::XamarinTodoQuickStart.Resource.String.Hello;
+ }
+
+ public partial class Attribute
+ {
+
+ static Attribute()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Attribute()
+ {
+ }
+ }
+
+ public partial class Drawable
+ {
+
+ // aapt resource value: 0x7f020000
+ public const int ic_launcher = 2130837504;
+
+ static Drawable()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Drawable()
+ {
+ }
+ }
+
+ public partial class Id
+ {
+
+ // aapt resource value: 0x7f070000
+ public const int LinearLayout1 = 2131165184;
+
+ // aapt resource value: 0x7f070004
+ public const int buttonAddTodo = 2131165188;
+
+ // aapt resource value: 0x7f070006
+ public const int checkTodoItem = 2131165190;
+
+ // aapt resource value: 0x7f070005
+ public const int listViewTodo = 2131165189;
+
+ // aapt resource value: 0x7f070002
+ public const int loadingProgressBar = 2131165186;
+
+ // aapt resource value: 0x7f070007
+ public const int menu_refresh = 2131165191;
+
+ // aapt resource value: 0x7f070003
+ public const int textNewTodo = 2131165187;
+
+ // aapt resource value: 0x7f070001
+ public const int textViewTitle = 2131165185;
+
+ static Id()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Id()
+ {
+ }
+ }
+
+ public partial class Layout
+ {
+
+ // aapt resource value: 0x7f030000
+ public const int Activity_To_Do = 2130903040;
+
+ // aapt resource value: 0x7f030001
+ public const int Row_List_To_Do = 2130903041;
+
+ static Layout()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Layout()
+ {
+ }
+ }
+
+ public partial class Menu
+ {
+
+ // aapt resource value: 0x7f060000
+ public const int activity_main = 2131099648;
+
+ static Menu()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Menu()
+ {
+ }
+ }
+
+ public partial class String
+ {
+
+ // aapt resource value: 0x7f040001
+ public const int ApplicationName = 2130968577;
+
+ // aapt resource value: 0x7f040000
+ public const int Hello = 2130968576;
+
+ // aapt resource value: 0x7f040004
+ public const int add_button_text = 2130968580;
+
+ // aapt resource value: 0x7f040003
+ public const int add_textbox_hint = 2130968579;
+
+ // aapt resource value: 0x7f040002
+ public const int app_name = 2130968578;
+
+ // aapt resource value: 0x7f040007
+ public const int checkbox_text = 2130968583;
+
+ // aapt resource value: 0x7f040006
+ public const int menu_refresh = 2130968582;
+
+ // aapt resource value: 0x7f040005
+ public const int mobile_services = 2130968581;
+
+ static String()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private String()
+ {
+ }
+ }
+
+ public partial class Style
+ {
+
+ // aapt resource value: 0x7f050000
+ public const int AppBaseTheme = 2131034112;
+
+ // aapt resource value: 0x7f050001
+ public const int AppTheme = 2131034113;
+
+ static Style()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Style()
+ {
+ }
+ }
+ }
+}
+#pragma warning restore 1591
diff --git a/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/drawable-hdpi/ic_launcher.png b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/drawable-hdpi/ic_launcher.png
new file mode 100644
index 000000000..b2f7c2b5f
Binary files /dev/null and b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/drawable-hdpi/ic_launcher.png differ
diff --git a/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/drawable-ldpi/ic_launcher.png b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/drawable-ldpi/ic_launcher.png
new file mode 100644
index 000000000..c2219b558
Binary files /dev/null and b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/drawable-ldpi/ic_launcher.png differ
diff --git a/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/drawable-mdpi/ic_launcher.png b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/drawable-mdpi/ic_launcher.png
new file mode 100644
index 000000000..b2c79b7ed
Binary files /dev/null and b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/drawable-mdpi/ic_launcher.png differ
diff --git a/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/drawable-xhdpi/ic_launcher.png b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 000000000..fc4b43087
Binary files /dev/null and b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/drawable-xhdpi/ic_launcher.png differ
diff --git a/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/layout/Activity_To_Do.axml b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/layout/Activity_To_Do.axml
new file mode 100644
index 000000000..2e8775ee8
--- /dev/null
+++ b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/layout/Activity_To_Do.axml
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/layout/Row_List_To_Do.axml b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/layout/Row_List_To_Do.axml
new file mode 100644
index 000000000..bc3facc8d
--- /dev/null
+++ b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/layout/Row_List_To_Do.axml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/menu/activity_main.xml b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/menu/activity_main.xml
new file mode 100644
index 000000000..2ca5582b0
--- /dev/null
+++ b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/menu/activity_main.xml
@@ -0,0 +1,5 @@
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/values-v11/styles.xml b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/values-v11/styles.xml
new file mode 100644
index 000000000..541752f6e
--- /dev/null
+++ b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/values-v11/styles.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/values-v14/styles.xml b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/values-v14/styles.xml
new file mode 100644
index 000000000..f20e01501
--- /dev/null
+++ b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/values-v14/styles.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/values/Strings.xml b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/values/Strings.xml
new file mode 100644
index 000000000..df1e39446
--- /dev/null
+++ b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/values/Strings.xml
@@ -0,0 +1,9 @@
+
+
+ XamarinTodoQuickStart
+ Add a Todo item
+ Add
+ Mobile Services
+ Refresh
+ Item Text
+
diff --git a/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/values/styles.xml b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/values/styles.xml
new file mode 100644
index 000000000..4a10ca492
--- /dev/null
+++ b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/Resources/values/styles.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/TodoActivity.cs b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/TodoActivity.cs
new file mode 100644
index 000000000..5731b9293
--- /dev/null
+++ b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/TodoActivity.cs
@@ -0,0 +1,231 @@
+using System;
+using Android.OS;
+using Android.App;
+using Android.Views;
+using Android.Widget;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using Microsoft.WindowsAzure.MobileServices;
+using System.Net.Http;
+
+namespace XamarinTodoQuickStart
+{
+ [Activity (MainLauncher = true,
+ Icon="@drawable/ic_launcher", Label="@string/app_name",
+ Theme="@style/AppTheme")]
+ public class TodoActivity : Activity
+ {
+ private MobileServiceClient client; // Mobile Service Client reference
+ private MobileServiceUser user; // Mobile Service logged in user
+ private IMobileServiceTable todoTable; // Mobile Service Table used to access data
+
+ private TodoItemAdapter adapter; // Adapter to sync the items list with the view
+ private EditText textNewTodo; // EditText containing the "New Todo" text
+ private ProgressBar progressBar; // Progress spinner to use for table operations
+
+ // Called when the activity initially gets created
+ protected override async void OnCreate(Bundle bundle)
+ {
+ base.OnCreate(bundle);
+
+ // Set our view from the "main" layout resource
+ SetContentView(Resource.Layout.Activity_To_Do);
+
+ // Initialize the progress bar
+ progressBar = FindViewById(Resource.Id.loadingProgressBar);
+ progressBar.Visibility = ViewStates.Gone;
+
+ // Create ProgressFilter to handle busy state
+ var progressHandler = new ProgressHandler ();
+ progressHandler.BusyStateChange += (busy) => {
+ if (progressBar != null)
+ progressBar.Visibility = busy ? ViewStates.Visible : ViewStates.Gone;
+ };
+
+ try
+ {
+ CurrentPlatform.Init ();
+ // Create the Mobile Service Client instance, using the provided
+ // Mobile Service URL and key
+ client = new MobileServiceClient(
+ Constants.ApplicationURL,
+ progressHandler);
+
+ await Authenticate();
+ await CreateTable();
+ }
+ catch (Java.Net.MalformedURLException)
+ {
+ CreateAndShowDialog(new Exception ("There was an error creating the Mobile Service. Verify the URL"), "Error");
+ }
+ catch (Exception e)
+ {
+ CreateAndShowDialog(e, "Error");
+ }
+ }
+
+ // Initializes the activity menu
+ public override bool OnCreateOptionsMenu(IMenu menu)
+ {
+ MenuInflater.Inflate(Resource.Menu.activity_main, menu);
+ return true;
+ }
+
+ // Select an option from the menu
+ public override bool OnOptionsItemSelected(IMenuItem item)
+ {
+ if (item.ItemId == Resource.Id.menu_refresh) {
+ OnRefreshItemsSelected();
+ }
+ return true;
+ }
+
+ private async Task Authenticate()
+ {
+ var success = false;
+ try
+ {
+ // Sign in with Microsoft login using a server-managed flow.
+ user = await client.LoginAsync(this,
+ MobileServiceAuthenticationProvider.MicrosoftAccount, Constants.AuthScheme);
+
+ // Just for demo purposes
+ CreateAndShowDialog(string.Format("you are now logged in - {0}",
+ user.UserId), "Logged in!");
+
+ success = true;
+ }
+ catch (Exception ex)
+ {
+ CreateAndShowDialog(ex, "Authentication failed");
+ }
+ return success;
+ }
+
+ private async Task CreateTable()
+ {
+ // Get the Mobile Service Table instance to use
+ todoTable = client.GetTable();
+
+ textNewTodo = FindViewById(Resource.Id.textNewTodo);
+
+ // Create an adapter to bind the items with the view
+ adapter = new TodoItemAdapter(this, Resource.Layout.Row_List_To_Do);
+ var listViewTodo = FindViewById(Resource.Id.listViewTodo);
+ listViewTodo.Adapter = adapter;
+
+ // Load the items from the Mobile Service
+ await RefreshItemsFromTableAsync();
+ }
+
+ // Called when the refresh menu opion is selected
+ async void OnRefreshItemsSelected()
+ {
+ await RefreshItemsFromTableAsync();
+ }
+
+ // Refresh the list with the items in the Mobile Service Table
+ async Task RefreshItemsFromTableAsync()
+ {
+ try {
+ // Get the items that weren't marked as completed and add them in the adapter
+ var list = await todoTable.Where(item => item.Complete == false).ToListAsync ();
+
+ adapter.Clear ();
+
+ foreach (TodoItem current in list)
+ adapter.Add(current);
+
+ }
+ catch (Exception e)
+ {
+ CreateAndShowDialog(e, "Error");
+ }
+ }
+
+ public async Task CheckItem(TodoItem item)
+ {
+ if (client == null)
+ return;
+
+ // Set the item as completed and update it in the table
+ item.Complete = true;
+ try {
+ await todoTable.UpdateAsync(item);
+ if (item.Complete)
+ adapter.Remove(item);
+
+ } catch (Exception e) {
+ CreateAndShowDialog(e, "Error");
+ }
+ }
+
+ [Java.Interop.Export()]
+ public async void AddItem(View view)
+ {
+ if (client == null || string.IsNullOrWhiteSpace(textNewTodo.Text)) {
+ return;
+ }
+
+ // Create a new item
+ var item = new TodoItem() {
+ Text = textNewTodo.Text,
+ Complete = false
+ };
+
+ try {
+ // Insert the new item
+ await todoTable.InsertAsync(item);
+
+ if (!item.Complete) {
+ adapter.Add(item);
+ }
+ } catch (Exception e) {
+ CreateAndShowDialog(e, "Error");
+ }
+
+ textNewTodo.Text = "";
+ }
+
+ void CreateAndShowDialog(Exception exception, String title)
+ {
+ CreateAndShowDialog(exception.Message, title);
+ }
+
+ void CreateAndShowDialog(string message, string title)
+ {
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+
+ builder.SetMessage(message);
+ builder.SetTitle(title);
+ builder.Create().Show();
+ }
+
+ class ProgressHandler : DelegatingHandler
+ {
+ int busyCount = 0;
+
+ public event Action BusyStateChange;
+
+ #region implemented abstract members of HttpMessageHandler
+
+ protected override async Task SendAsync (HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
+ {
+ //assumes always executes on UI thread
+ if (busyCount++ == 0 && BusyStateChange != null)
+ BusyStateChange (true);
+
+ var response = await base.SendAsync (request, cancellationToken);
+
+ // assumes always executes on UI thread
+ if (--busyCount == 0 && BusyStateChange != null)
+ BusyStateChange (false);
+
+ return response;
+ }
+
+ #endregion
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/TodoItem.cs b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/TodoItem.cs
new file mode 100644
index 000000000..5de32610d
--- /dev/null
+++ b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/TodoItem.cs
@@ -0,0 +1,28 @@
+using System;
+using Newtonsoft.Json;
+
+namespace XamarinTodoQuickStart
+{
+ public class TodoItem
+ {
+ // Tables created prior to November 2013 should use 'int' type. Check your configuration.
+ public string Id { get; set; }
+
+ [JsonProperty(PropertyName = "text")]
+ public string Text { get; set; }
+
+ [JsonProperty(PropertyName = "complete")]
+ public bool Complete { get; set; }
+ }
+
+ public class TodoItemWrapper : Java.Lang.Object
+ {
+ public TodoItem TodoItem { get; private set; }
+
+ public TodoItemWrapper(TodoItem item)
+ {
+ this.TodoItem = item;
+ }
+ }
+}
+
diff --git a/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/TodoItemAdapter.cs b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/TodoItemAdapter.cs
new file mode 100644
index 000000000..7014ce79a
--- /dev/null
+++ b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/TodoItemAdapter.cs
@@ -0,0 +1,100 @@
+using System;
+using Android.App;
+using Android.Views;
+using Android.Widget;
+using System.Collections.Generic;
+using XamarinTodoQuickStart;
+
+namespace XamarinTodoQuickStart
+{
+ public class TodoItemAdapter : BaseAdapter
+ {
+ // Private Variables
+ private Activity activity;
+ private int layoutResourceId;
+ private List items = new List();
+
+ // Constructor
+ public TodoItemAdapter(Activity activity, int layoutResourceId)
+ {
+ this.activity = activity;
+ this.layoutResourceId = layoutResourceId;
+ }
+
+ // Returns the view for a specific item on the list
+ public override View GetView(int position, Android.Views.View convertView, Android.Views.ViewGroup parent)
+ {
+ var row = convertView;
+ var currentItem = this[position];
+ CheckBox checkBox;
+
+ if (row == null)
+ {
+ var inflater = activity.LayoutInflater;
+ row = inflater.Inflate(layoutResourceId, parent, false);
+
+ checkBox = row.FindViewById(Resource.Id.checkTodoItem);
+
+ checkBox.CheckedChange += async (sender, e) => {
+ var cbSender = sender as CheckBox;
+ if (cbSender != null && cbSender.Tag is TodoItemWrapper && cbSender.Checked)
+ {
+ cbSender.Enabled = false;
+
+ if (activity is TodoActivity)
+ await ((TodoActivity)activity).CheckItem((cbSender.Tag as TodoItemWrapper).TodoItem);
+ }
+ };
+ }
+ else
+ {
+ checkBox = row.FindViewById(Resource.Id.checkTodoItem);
+ }
+
+ checkBox.Text = currentItem.Text;
+ checkBox.Checked = false;
+ checkBox.Enabled = true;
+ checkBox.Tag = new TodoItemWrapper(currentItem);
+
+ return row;
+ }
+
+ public void Add(TodoItem item)
+ {
+ items.Add(item);
+ NotifyDataSetChanged();
+ }
+
+ public void Clear()
+ {
+ items.Clear();
+ NotifyDataSetChanged();
+ }
+
+ public void Remove(TodoItem item)
+ {
+ items.Remove(item);
+ NotifyDataSetChanged();
+ }
+
+ #region implemented abstract members of BaseAdapter
+
+ public override long GetItemId(int position)
+ {
+ return position;
+ }
+
+ public override int Count
+ {
+ get { return items.Count; }
+ }
+
+ public override TodoItem this[int position]
+ {
+ get { return items[position]; }
+ }
+
+ #endregion
+ }
+}
+
diff --git a/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/XamarinTodoQuickStart.Android.csproj b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/XamarinTodoQuickStart.Android.csproj
new file mode 100644
index 000000000..9dee8dc25
--- /dev/null
+++ b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/XamarinTodoQuickStart.Android.csproj
@@ -0,0 +1,115 @@
+
+
+
+ Debug
+ AnyCPU
+ 10.0.0
+ 2.0
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}
+ {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ Library
+ XamarinTodoQuickStart
+ True
+ Resources\Resource.designer.cs
+ Resource
+ Resources
+ Assets
+ ZUMOAPPNAME
+ Properties\AndroidManifest.xml
+ v8.1
+ true
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ None
+ false
+ Xamarin.Android.Net.AndroidClientHandler
+ btls
+
+
+ full
+ true
+ bin\Release
+ prompt
+ 4
+ false
+ false
+
+
+
+
+
+
+
+
+
+
+
+ ..\packages\Newtonsoft.Json.9.0.1\lib\portable-net45+wp80+win8+wpa81\Newtonsoft.Json.dll
+
+
+ ..\packages\PInvoke.Windows.Core.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Windows.Core.dll
+
+
+ ..\packages\PInvoke.Kernel32.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Kernel32.dll
+
+
+ ..\packages\PInvoke.BCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.BCrypt.dll
+
+
+ ..\packages\PInvoke.NCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.NCrypt.dll
+
+
+ ..\packages\Validation.2.2.8\lib\dotnet\Validation.dll
+
+
+ ..\packages\PCLCrypto.2.0.147\lib\MonoAndroid23\PCLCrypto.dll
+
+
+ ..\packages\Xamarin.Android.Support.v4.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v4.dll
+
+
+ ..\packages\Xamarin.Android.Support.CustomTabs.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.CustomTabs.dll
+
+
+ ..\packages\Microsoft.Azure.Mobile.Client.4.0.2\lib\monoandroid70\Microsoft.Azure.Mobile.Client.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/packages.config b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/packages.config
new file mode 100644
index 000000000..b65885357
--- /dev/null
+++ b/Azure/GetStartedWithUsers/Android/XamarinTodoQuickStart/packages.config
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithUsers/Metadata.xml b/Azure/GetStartedWithUsers/Metadata.xml
new file mode 100644
index 000000000..c32871f95
--- /dev/null
+++ b/Azure/GetStartedWithUsers/Metadata.xml
@@ -0,0 +1,11 @@
+
+
+ 63f72dfb-c126-4a81-a6f5-a8024523173f
+ false
+ Beginner
+ Cloud
+ Android, iOS
+ Indie
+ Microsoft Azure sample GetStartedWithUsers
+ false
+
diff --git a/Azure/GetStartedWithUsers/Screenshots/Android-1.png b/Azure/GetStartedWithUsers/Screenshots/Android-1.png
new file mode 100644
index 000000000..2eab5abde
Binary files /dev/null and b/Azure/GetStartedWithUsers/Screenshots/Android-1.png differ
diff --git a/Azure/GetStartedWithUsers/Screenshots/Android-2.png b/Azure/GetStartedWithUsers/Screenshots/Android-2.png
new file mode 100644
index 000000000..0d7e611a6
Binary files /dev/null and b/Azure/GetStartedWithUsers/Screenshots/Android-2.png differ
diff --git a/Azure/GetStartedWithUsers/Screenshots/Android-3.png b/Azure/GetStartedWithUsers/Screenshots/Android-3.png
new file mode 100644
index 000000000..6dfec2ad0
Binary files /dev/null and b/Azure/GetStartedWithUsers/Screenshots/Android-3.png differ
diff --git a/Azure/GetStartedWithUsers/Screenshots/iOS-1.png b/Azure/GetStartedWithUsers/Screenshots/iOS-1.png
new file mode 100644
index 000000000..c9c334f1e
Binary files /dev/null and b/Azure/GetStartedWithUsers/Screenshots/iOS-1.png differ
diff --git a/Azure/GetStartedWithUsers/Screenshots/iOS-2.png b/Azure/GetStartedWithUsers/Screenshots/iOS-2.png
new file mode 100644
index 000000000..2d1d8497e
Binary files /dev/null and b/Azure/GetStartedWithUsers/Screenshots/iOS-2.png differ
diff --git a/Azure/GetStartedWithUsers/Screenshots/iOS-3.png b/Azure/GetStartedWithUsers/Screenshots/iOS-3.png
new file mode 100644
index 000000000..29acdc68d
Binary files /dev/null and b/Azure/GetStartedWithUsers/Screenshots/iOS-3.png differ
diff --git a/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart.iOS.sln b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart.iOS.sln
new file mode 100644
index 000000000..85d684411
--- /dev/null
+++ b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart.iOS.sln
@@ -0,0 +1,43 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XamarinTodoQuickStart.iOS", "XamarinTodoQuickStart\XamarinTodoQuickStart.iOS.csproj", "{07F1CD1B-626F-4BE5-9840-97B44CBB94C9}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Ad-Hoc|iPhone = Ad-Hoc|iPhone
+ Ad-Hoc|iPhoneSimulator = Ad-Hoc|iPhoneSimulator
+ AppStore|iPhone = AppStore|iPhone
+ AppStore|iPhoneSimulator = AppStore|iPhoneSimulator
+ Debug|iPhone = Debug|iPhone
+ Debug|iPhoneSimulator = Debug|iPhoneSimulator
+ Release|iPhone = Release|iPhone
+ Release|iPhoneSimulator = Release|iPhoneSimulator
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Ad-Hoc|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.AppStore|iPhone.ActiveCfg = AppStore|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.AppStore|iPhone.Build.0 = AppStore|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.AppStore|iPhoneSimulator.Deploy.0 = AppStore|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Debug|iPhone.ActiveCfg = Debug|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Debug|iPhone.Build.0 = Debug|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Release|iPhone.ActiveCfg = Release|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Release|iPhone.Build.0 = Release|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
+ EndGlobalSection
+ GlobalSection(MonoDevelopProperties) = preSolution
+ StartupItem = XamarinTodoQuickStart\XamarinTodoQuickStart.iOS.csproj
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/AppDelegate.cs b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/AppDelegate.cs
new file mode 100644
index 000000000..a233c3155
--- /dev/null
+++ b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/AppDelegate.cs
@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Foundation;
+using UIKit;
+using Microsoft.WindowsAzure.MobileServices;
+
+namespace XamarinTodoQuickStart
+{
+ // The UIApplicationDelegate for the application. This class is responsible for launching the
+ // User Interface of the application, as well as listening (and optionally responding) to
+ // application events from iOS.
+ [Register ("AppDelegate")]
+ public partial class AppDelegate : UIApplicationDelegate
+ {
+ // class-level declarations
+ public override UIWindow Window {get; set;}
+
+ public static Func ResumeWithURL;
+
+ public override bool OpenUrl(UIApplication app, NSUrl url, NSDictionary options)
+ {
+ return ResumeWithURL != null && ResumeWithURL(url);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Contents.json b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 000000000..d77296819
--- /dev/null
+++ b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,205 @@
+{
+ "images": [
+ {
+ "size": "20x20",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "20x20",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "filename": "Icon_58.png",
+ "size": "29x29",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "29x29",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "40x40",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "40x40",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "filename": "Icon_120.png",
+ "size": "60x60",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "60x60",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "20x20",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "20x20",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "29x29",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "29x29",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "40x40",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "40x40",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "83.5x83.5",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "filename": "Icon_76.png",
+ "size": "76x76",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "76x76",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "1024x1024",
+ "scale": "1x",
+ "idiom": "ios-marketing"
+ },
+ {
+ "role": "notificationCenter",
+ "size": "24x24",
+ "subtype": "38mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "notificationCenter",
+ "size": "27.5x27.5",
+ "subtype": "42mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "companionSettings",
+ "size": "29x29",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "companionSettings",
+ "size": "29x29",
+ "scale": "3x",
+ "idiom": "watch"
+ },
+ {
+ "role": "appLauncher",
+ "size": "40x40",
+ "subtype": "38mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "longLook",
+ "size": "44x44",
+ "subtype": "42mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "quickLook",
+ "size": "86x86",
+ "subtype": "38mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "quickLook",
+ "size": "98x98",
+ "subtype": "42mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "size": "16x16",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "16x16",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "size": "32x32",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "32x32",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "size": "128x128",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "128x128",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "size": "256x256",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "256x256",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "size": "512x512",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "512x512",
+ "scale": "2x",
+ "idiom": "mac"
+ }
+ ],
+ "info": {
+ "version": 1,
+ "author": "xcode"
+ }
+}
\ No newline at end of file
diff --git a/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon.png b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon.png
new file mode 100755
index 000000000..652acddf5
Binary files /dev/null and b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon.png differ
diff --git a/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon@2x.png b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon@2x.png
new file mode 100755
index 000000000..116eeabd2
Binary files /dev/null and b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon@2x.png differ
diff --git a/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_120.png b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_120.png
new file mode 100755
index 000000000..6a06e6ff8
Binary files /dev/null and b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_120.png differ
diff --git a/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_58.png b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_58.png
new file mode 100755
index 000000000..a69958c06
Binary files /dev/null and b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_58.png differ
diff --git a/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_76.png b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_76.png
new file mode 100755
index 000000000..09898ad19
Binary files /dev/null and b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_76.png differ
diff --git a/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Constants.cs b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Constants.cs
new file mode 100644
index 000000000..a7b987625
--- /dev/null
+++ b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Constants.cs
@@ -0,0 +1,32 @@
+using System;
+
+namespace XamarinTodoQuickStart
+{
+ public static class Constants
+ {
+ // Azure app specific URL and key
+ public const string ApplicationURL = @"https://your_app_id.azurewebsites.net/";
+
+ // Scheme used to send web response to this app
+ public const string AuthScheme = @"SCHEME_FROM_AUTH_PROVIDER"; // ALSO ENTER IN INFO.PLIST
+
+ }
+}
+
+
+/*
+EXAMPLE OF INFO.PLIST ENTRY (for Microsoft authentication)
+
+
+
+ CFBundleTypeRole
+ Editor
+ CFBundleURLName
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleURLSchemes
+
+ msalGUIDFF-FFFF-FFFF-FFFF-0123456789ABCDEF
+
+
+
+*/
\ No newline at end of file
diff --git a/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Info.plist b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Info.plist
new file mode 100644
index 000000000..a5c3f1b9b
--- /dev/null
+++ b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Info.plist
@@ -0,0 +1,55 @@
+
+
+
+
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UIMainStoryboardFile
+ MainStoryboard_iPhone
+ UIMainStoryboardFile~ipad
+ MainStoryboard_iPad
+ MinimumOSVersion
+ 11.0
+ CFBundleName
+ Xamarin Users
+ CFBundleIdentifier
+ com.xamarintest.azurequickstart.users
+ CFBundleShortVersionString
+ 1
+ CFBundleVersion
+ 1
+ XSAppIconAssets
+ Assets.xcassets/AppIcon.appiconset
+ UILaunchStoryboardName
+ LaunchScreen
+ CFBundleURLTypes
+
+
+ CFBundleTypeRole
+ Editor
+ CFBundleURLName
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleURLSchemes
+
+ msalGUIDFF-FFFF-FFFF-FFFF-0123456789ABCDEF
+
+
+
+
+
diff --git a/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Main.cs b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Main.cs
new file mode 100644
index 000000000..0ac4457b6
--- /dev/null
+++ b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Main.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Foundation;
+using UIKit;
+
+namespace XamarinTodoQuickStart
+{
+ public class Application
+ {
+ // This is the main entry point of the application.
+ static void Main(string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main(args, null, "AppDelegate");
+ }
+ }
+}
diff --git a/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/MainStoryboard_iPad.storyboard b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/MainStoryboard_iPad.storyboard
new file mode 100755
index 000000000..411b4eecb
--- /dev/null
+++ b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/MainStoryboard_iPad.storyboard
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/MainStoryboard_iPhone.storyboard b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/MainStoryboard_iPhone.storyboard
new file mode 100755
index 000000000..5894b2a4e
--- /dev/null
+++ b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/MainStoryboard_iPhone.storyboard
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Resources/Default.png b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Resources/Default.png
new file mode 100755
index 000000000..4c8ca6f69
Binary files /dev/null and b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Resources/Default.png differ
diff --git a/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Resources/Default@2x.png b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Resources/Default@2x.png
new file mode 100755
index 000000000..35b84cffe
Binary files /dev/null and b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Resources/Default@2x.png differ
diff --git a/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Resources/LaunchScreen.xib b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Resources/LaunchScreen.xib
new file mode 100644
index 000000000..9ca3deadd
--- /dev/null
+++ b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/Resources/LaunchScreen.xib
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/TodoItem.cs b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/TodoItem.cs
new file mode 100644
index 000000000..ab294b6f5
--- /dev/null
+++ b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/TodoItem.cs
@@ -0,0 +1,18 @@
+using System;
+using Newtonsoft.Json;
+
+namespace XamarinTodoQuickStart
+{
+ public class TodoItem
+ {
+ // Tables created prior to November 2013 should use 'int' type. Check your configuration.
+ public string Id { get; set; }
+
+ [JsonProperty(PropertyName = "text")]
+ public string Text { get; set; }
+
+ [JsonProperty(PropertyName = "complete")]
+ public bool Complete { get; set; }
+ }
+}
+
diff --git a/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/TodoListViewController.cs b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/TodoListViewController.cs
new file mode 100644
index 000000000..116b462dd
--- /dev/null
+++ b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/TodoListViewController.cs
@@ -0,0 +1,187 @@
+// This file has been autogenerated from parsing an Objective-C header file added in Xcode.
+using System;
+using Foundation;
+using UIKit;
+using System.Threading.Tasks;
+
+namespace XamarinTodoQuickStart
+{
+ public partial class TodoListViewController : UITableViewController
+ {
+ // Private Variables
+ private TodoService todoService;
+ private bool useRefreshControl = false;
+
+ // Constructor
+ public TodoListViewController(IntPtr handle) : base(handle)
+ {
+ }
+
+ public override void ViewDidLoad()
+ {
+ base.ViewDidLoad();
+
+ todoService = TodoService.DefaultService;
+
+ todoService.BusyUpdate += (bool busy) => {
+ if (busy)
+ activityIndicator.StartAnimating();
+ else
+ activityIndicator.StopAnimating();
+ };
+
+ AddRefreshControl();
+ }
+
+ public override async void ViewDidAppear(bool animated)
+ {
+ base.ViewDidAppear(animated);
+
+ if (TodoService.DefaultService.User == null)
+ {
+ await TodoService.DefaultService.LoginAndGetData(this);
+ }
+
+ if (TodoService.DefaultService.User == null)
+ {
+ // TODO:: show error
+ return;
+ }
+
+ await RefreshAsync();
+ }
+
+ async Task RefreshAsync()
+ {
+ // only activate the refresh control if the feature is available
+ if (useRefreshControl)
+ RefreshControl.BeginRefreshing();
+
+ await todoService.RefreshDataAsync();
+
+ if (useRefreshControl)
+ RefreshControl.EndRefreshing();
+
+ TableView.ReloadData();
+ }
+
+ #region UITableView methods
+ public override nint RowsInSection(UITableView tableview, nint section)
+ {
+ if (todoService == null || todoService.Items == null)
+ return 0;
+
+ return todoService.Items.Count;
+ }
+
+ public override nint NumberOfSections(UITableView tableView)
+ {
+ return 1;
+ }
+
+ public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
+ {
+ const string CellIdentifier = @"Cell";
+ var cell = tableView.DequeueReusableCell(CellIdentifier);
+ if (cell == null) {
+ cell = new UITableViewCell(UITableViewCellStyle.Default, CellIdentifier);
+ }
+
+ // Set the label on the cell and make sure the label color is black (in case this cell
+ // has been reused and was previously greyed out
+ var label = (UILabel)cell.ViewWithTag(1);
+ label.TextColor = UIColor.Black;
+ label.Text = todoService.Items [indexPath.Row].Text;
+
+ return cell;
+ }
+
+ public override string TitleForDeleteConfirmation(UITableView tableView, NSIndexPath indexPath)
+ {
+ // Customize the Delete button to say "complete"
+ return @"complete";
+ }
+
+ public override UITableViewCellEditingStyle EditingStyleForRow(UITableView tableView, NSIndexPath indexPath)
+ {
+ // Find the item that is about to be edited
+ var item = todoService.Items[indexPath.Row];
+
+ // If the item is complete, then this is just pending upload. Editing is not allowed
+ if (item.Complete)
+ return UITableViewCellEditingStyle.None;
+
+ // Otherwise, allow the delete button to appear
+ return UITableViewCellEditingStyle.Delete;
+ }
+
+ public async override void CommitEditingStyle(UITableView tableView, UITableViewCellEditingStyle editingStyle, NSIndexPath indexPath)
+ {
+ // Find item that was commited for editing (completed)
+ var item = todoService.Items[indexPath.Row];
+
+ // Change the appearance to look greyed out until we remove the item
+ var label = (UILabel)TableView.CellAt(indexPath).ViewWithTag(1);
+ label.TextColor = UIColor.Gray;
+
+ // Ask the todoService to set the item's complete value to YES, and remove the row if successful
+ await todoService.CompleteItemAsync(item);
+
+ // Remove the row from the UITableView
+ tableView.DeleteRows(new [] { indexPath }, UITableViewRowAnimation.Top);
+ }
+
+ #endregion
+
+ #region UI Actions
+
+ async partial void OnAdd(NSObject sender)
+ {
+ if (string.IsNullOrWhiteSpace(itemText.Text))
+ return;
+
+ var newItem = new TodoItem() {
+ Text = itemText.Text,
+ Complete = false
+ };
+
+ int index = await todoService.InsertTodoItemAsync(newItem);
+
+ TableView.InsertRows(new [] { NSIndexPath.FromItemSection(index, 0) },
+ UITableViewRowAnimation.Top);
+
+ itemText.Text = "";
+ }
+
+ #endregion
+
+ #region UITextFieldDelegate methods
+
+ [Export ("textFieldShouldReturn:")]
+ public virtual bool ShouldReturn(UITextField textField)
+ {
+ textField.ResignFirstResponder();
+ return true;
+ }
+
+ #endregion
+
+ #region * iOS Specific Code
+
+ // This method will add the UIRefreshControl to the table view if
+ // it is available, ie, we are running on iOS 6+
+ private void AddRefreshControl()
+ {
+ if (UIDevice.CurrentDevice.CheckSystemVersion(6, 0)) {
+ // the refresh control is available, let's add it
+ RefreshControl = new UIRefreshControl();
+ RefreshControl.ValueChanged += async (sender, e) => {
+ await RefreshAsync();
+ };
+ useRefreshControl = true;
+ }
+ }
+
+ #endregion
+ }
+}
diff --git a/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/TodoListViewController.designer.cs b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/TodoListViewController.designer.cs
new file mode 100644
index 000000000..8c7c47d97
--- /dev/null
+++ b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/TodoListViewController.designer.cs
@@ -0,0 +1,36 @@
+// WARNING
+//
+// This file has been generated automatically by Xamarin Studio to store outlets and
+// actions made in the Xcode designer. If it is removed, they will be lost.
+// Manual changes to this file may not be handled correctly.
+//
+using Foundation;
+
+namespace XamarinTodoQuickStart
+{
+ [Register ("TodoListViewController")]
+ partial class TodoListViewController
+ {
+ [Outlet]
+ UIKit.UIActivityIndicatorView activityIndicator { get; set; }
+
+ [Outlet]
+ UIKit.UITextField itemText { get; set; }
+
+ [Action ("OnAdd:")]
+ partial void OnAdd (Foundation.NSObject sender);
+
+ void ReleaseDesignerOutlets ()
+ {
+ if (itemText != null) {
+ itemText.Dispose ();
+ itemText = null;
+ }
+
+ if (activityIndicator != null) {
+ activityIndicator.Dispose ();
+ activityIndicator = null;
+ }
+ }
+ }
+}
diff --git a/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/TodoService.cs b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/TodoService.cs
new file mode 100644
index 000000000..a0f416c84
--- /dev/null
+++ b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/TodoService.cs
@@ -0,0 +1,151 @@
+using System;
+using System.Collections.Generic;
+using Foundation;
+using System.Threading.Tasks;
+using Microsoft.WindowsAzure.MobileServices;
+using UIKit;
+using System.Net.Http;
+/*
+
+https://docs.microsoft.com/en-us/azure/app-service/app-service-mobile-how-to-configure-microsoft-authentication
+
+http://go.microsoft.com/fwlink/p/?LinkId=262039
+*/
+namespace XamarinTodoQuickStart
+{
+ public class TodoService : DelegatingHandler
+ {
+ private static TodoService todoServiceInstance = new TodoService();
+ public static TodoService DefaultService { get { return todoServiceInstance; } }
+
+ private MobileServiceClient client; // Mobile Service Client reference
+ private MobileServiceUser user; // Mobile Service logged in user
+ private IMobileServiceTable todoTable;
+
+ public MobileServiceUser User { get { return user; } }
+ public List Items { get; private set;}
+ private int busyCount = 0;
+
+ // Public events
+ public event Action BusyUpdate;
+
+ // Constructor
+ protected TodoService()
+ {
+ Items = new List();
+
+ CurrentPlatform.Init ();
+ // Initialize the Mobile Service client with your URL and key
+ client = new MobileServiceClient(Constants.ApplicationURL, this);
+ }
+
+ public async Task LoginAndGetData(UIViewController view)
+ {
+ await Authenticate(view);
+ await CreateTable();
+ }
+
+ public async Task Authenticate(UIViewController view)
+ {
+ try
+ {
+ AppDelegate.ResumeWithURL = url => url.Scheme == Constants.AuthScheme && client.ResumeWithURL(url);
+ user = await client.LoginAsync(view, MobileServiceAuthenticationProvider.MicrosoftAccount, Constants.AuthScheme);
+ }
+ catch (Exception ex)
+ {
+ Console.Error.WriteLine(@"ERROR - AUTHENTICATION FAILED {0}", ex.Message);
+ }
+ }
+
+ private async Task CreateTable()
+ {
+ // Create an MSTable instance to allow us to work with the TodoItem table
+ todoTable = client.GetTable();
+ }
+
+ async public Task> RefreshDataAsync()
+ {
+ try
+ {
+ // This code refreshes the entries in the list view by querying the TodoItems table.
+ // The query excludes completed TodoItems
+ Items = await todoTable
+ .Where (todoItem => todoItem.Complete == false).ToListAsync();
+
+ }
+ catch (MobileServiceInvalidOperationException e)
+ {
+ Console.Error.WriteLine (@"ERROR {0}", e.Message);
+ return null;
+ }
+
+ return Items;
+ }
+
+ public async Task InsertTodoItemAsync(TodoItem todoItem)
+ {
+ try
+ {
+ // This code inserts a new TodoItem into the database. When the operation completes
+ // and Mobile Services has assigned an Id, the item is added to the CollectionView
+ await todoTable.InsertAsync(todoItem);
+
+ Items.Add(todoItem);
+
+ return Items.IndexOf(todoItem);
+
+ }
+ catch (MobileServiceInvalidOperationException e)
+ {
+ Console.Error.WriteLine(@"ERROR {0}", e.Message);
+ return 0;
+ }
+ }
+
+ public async Task CompleteItemAsync(TodoItem item)
+ {
+ try
+ {
+ // This code takes a freshly completed TodoItem and updates the database. When the MobileService
+ // responds, the item is removed from the list
+ item.Complete = true;
+ await todoTable.UpdateAsync(item);
+ Items.Remove(item);
+
+ }
+ catch (MobileServiceInvalidOperationException e)
+ {
+ Console.Error.WriteLine (@"ERROR {0}", e.Message);
+ }
+ }
+
+ void Busy(bool busy)
+ {
+ // assumes always executes on UI thread
+ if (busy)
+ {
+ if (busyCount++ == 0 && BusyUpdate != null)
+ BusyUpdate(true);
+ }
+ else
+ {
+ if (--busyCount == 0 && BusyUpdate != null)
+ BusyUpdate(false);
+ }
+ }
+
+ #region implemented abstract members of HttpMessageHandler
+
+ protected override async Task SendAsync (System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
+ {
+ Busy (true);
+ var response = await base.SendAsync (request, cancellationToken);
+
+ Busy (false);
+ return response;
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/XamarinTodoQuickStart.iOS.csproj b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/XamarinTodoQuickStart.iOS.csproj
new file mode 100644
index 000000000..4d0b3aed1
--- /dev/null
+++ b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/XamarinTodoQuickStart.iOS.csproj
@@ -0,0 +1,166 @@
+
+
+
+ Debug
+ iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}
+ {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ Exe
+ XamarinTodoQuickStart
+ Resources
+ XamarinTodoQuickStart
+ Xamarin.iOS
+ v1.0
+
+
+ true
+ full
+ false
+ bin\iPhoneSimulator\Debug
+ DEBUG;
+ prompt
+ 4
+ SdkOnly
+ false
+ true
+ x86_64
+ NSUrlSessionHandler
+ iPhone Developer
+
+
+ full
+ true
+ bin\iPhoneSimulator\Release
+ prompt
+ 4
+ None
+ x86_64
+ false
+ NSUrlSessionHandler
+
+
+ true
+ full
+ false
+ bin\iPhone\Debug
+ DEBUG;
+ prompt
+ 4
+ true
+ false
+ iPhone Developer
+
+ ARM64
+ NSUrlSessionHandler
+
+
+ full
+ true
+ bin\iPhone\Release
+ prompt
+ 4
+ iPhone Developer
+ false
+ ARM64
+ NSUrlSessionHandler
+
+
+ full
+ true
+ bin\iPhone\Ad-Hoc
+ prompt
+ 4
+ iPhone Distribution
+ true
+ false
+ Automatic:AdHoc
+ ARM64
+ NSUrlSessionHandler
+
+
+ full
+ true
+ bin\iPhone\AppStore
+ prompt
+ 4
+ iPhone Distribution
+ false
+ Automatic:AppStore
+ ARM64
+ NSUrlSessionHandler
+
+
+
+
+
+
+
+
+
+ ..\packages\Newtonsoft.Json.9.0.1\lib\portable-net45+wp80+win8+wpa81\Newtonsoft.Json.dll
+
+
+ ..\packages\PInvoke.Windows.Core.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Windows.Core.dll
+
+
+ ..\packages\PInvoke.Kernel32.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Kernel32.dll
+
+
+ ..\packages\PInvoke.BCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.BCrypt.dll
+
+
+ ..\packages\PInvoke.NCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.NCrypt.dll
+
+
+ ..\packages\Validation.2.2.8\lib\dotnet\Validation.dll
+
+
+ ..\packages\PCLCrypto.2.0.147\lib\xamarinios10\PCLCrypto.dll
+
+
+ ..\packages\Microsoft.Azure.Mobile.Client.4.0.2\lib\xamarinios10\Microsoft.Azure.Mobile.Client.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TodoListViewController.cs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.3.1
+ False
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/packages.config b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/packages.config
new file mode 100644
index 000000000..06847c21c
--- /dev/null
+++ b/Azure/GetStartedWithUsers/iOS/XamarinTodoQuickStart/packages.config
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GetStartedWithUsers/readme.md b/Azure/GetStartedWithUsers/readme.md
new file mode 100644
index 000000000..fbac11140
--- /dev/null
+++ b/Azure/GetStartedWithUsers/readme.md
@@ -0,0 +1,5 @@
+Get Started with User Authentication
+=====================
+
+using Windows Azure and Xamarin
+-------------------------------
diff --git a/Azure/GettingStarted/Android/XamarinTodoQuickStart.Android.sln b/Azure/GettingStarted/Android/XamarinTodoQuickStart.Android.sln
new file mode 100644
index 000000000..207f1fe34
--- /dev/null
+++ b/Azure/GettingStarted/Android/XamarinTodoQuickStart.Android.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XamarinTodoQuickStart.Android", "XamarinTodoQuickStart\XamarinTodoQuickStart.Android.csproj", "{8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(MonoDevelopProperties) = preSolution
+ StartupItem = XamarinTodoQuickStart\XamarinTodoQuickStart.Android.csproj
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Azure/GettingStarted/Android/XamarinTodoQuickStart/Assets/AboutAssets.txt b/Azure/GettingStarted/Android/XamarinTodoQuickStart/Assets/AboutAssets.txt
new file mode 100644
index 000000000..a9b0638eb
--- /dev/null
+++ b/Azure/GettingStarted/Android/XamarinTodoQuickStart/Assets/AboutAssets.txt
@@ -0,0 +1,19 @@
+Any raw assets you want to be deployed with your application can be placed in
+this directory (and child directories) and given a Build Action of "AndroidAsset".
+
+These files will be deployed with your package and will be accessible using Android's
+AssetManager, like this:
+
+public class ReadAsset : Activity
+{
+ protected override void OnCreate (Bundle bundle)
+ {
+ base.OnCreate (bundle);
+
+ InputStream input = Assets.Open ("my_asset.txt");
+ }
+}
+
+Additionally, some Android functions will automatically load asset files:
+
+Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf");
diff --git a/Azure/GettingStarted/Android/XamarinTodoQuickStart/Constants.cs b/Azure/GettingStarted/Android/XamarinTodoQuickStart/Constants.cs
new file mode 100644
index 000000000..121ab922e
--- /dev/null
+++ b/Azure/GettingStarted/Android/XamarinTodoQuickStart/Constants.cs
@@ -0,0 +1,11 @@
+using System;
+
+namespace XamarinTodoQuickStart
+{
+ public static class Constants
+ {
+ // Azure app specific URL and key
+ public const string ApplicationURL = @"https://your_app_name.azurewebsites.net/";
+ }
+}
+
diff --git a/Azure/GettingStarted/Android/XamarinTodoQuickStart/Properties/AndroidManifest.xml b/Azure/GettingStarted/Android/XamarinTodoQuickStart/Properties/AndroidManifest.xml
new file mode 100644
index 000000000..3d22b16f0
--- /dev/null
+++ b/Azure/GettingStarted/Android/XamarinTodoQuickStart/Properties/AndroidManifest.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GettingStarted/Android/XamarinTodoQuickStart/Properties/AssemblyInfo.cs b/Azure/GettingStarted/Android/XamarinTodoQuickStart/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..2bc8c83f4
--- /dev/null
+++ b/Azure/GettingStarted/Android/XamarinTodoQuickStart/Properties/AssemblyInfo.cs
@@ -0,0 +1,28 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using Android.App;
+
+// Information about this assembly is defined by the following attributes.
+// Change them to the values specific to your project.
+
+[assembly: AssemblyTitle("XamarinTodoQuickStart")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("Xamarin")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
+// The form "{Major}.{Minor}.*" will automatically update the build and revision,
+// and "{Major}.{Minor}.{Build}.*" will update just the revision.
+
+[assembly: AssemblyVersion("1.0.0")]
+
+// The following attributes are used to specify the signing key for the assembly,
+// if desired. See the Mono documentation for more information about signing.
+
+//[assembly: AssemblyDelaySign(false)]
+//[assembly: AssemblyKeyFile("")]
+
diff --git a/SoMA/Android/Resources/AboutResources.txt b/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/AboutResources.txt
similarity index 100%
rename from SoMA/Android/Resources/AboutResources.txt
rename to Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/AboutResources.txt
diff --git a/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/Resource.designer.cs b/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/Resource.designer.cs
new file mode 100644
index 000000000..3ad7a6304
--- /dev/null
+++ b/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/Resource.designer.cs
@@ -0,0 +1,230 @@
+#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("XamarinTodoQuickStart.Resource", IsApplication=true)]
+
+namespace XamarinTodoQuickStart
+{
+
+
+ [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()
+ {
+ global::Xamarin.Auth._MobileServices.Resource.Animation.slide_in_right = global::XamarinTodoQuickStart.Resource.Animation.slide_in_right;
+ global::Xamarin.Auth._MobileServices.Resource.Animation.slide_out_left = global::XamarinTodoQuickStart.Resource.Animation.slide_out_left;
+ global::Xamarin.Auth._MobileServices.Resource.Drawable.ic_arrow_back = global::XamarinTodoQuickStart.Resource.Drawable.ic_arrow_back;
+ global::Xamarin.Auth._MobileServices.Resource.Id.webview = global::XamarinTodoQuickStart.Resource.Id.webview;
+ global::Xamarin.Auth._MobileServices.Resource.Layout.activity_webview = global::XamarinTodoQuickStart.Resource.Layout.activity_webview;
+ global::Xamarin.Auth._MobileServices.Resource.String.ApplicationName = global::XamarinTodoQuickStart.Resource.String.ApplicationName;
+ global::Xamarin.Auth._MobileServices.Resource.String.Hello = global::XamarinTodoQuickStart.Resource.String.Hello;
+ global::Xamarin.Auth._MobileServices.Resource.String.title_activity_webview = global::XamarinTodoQuickStart.Resource.String.title_activity_webview;
+ global::PCLCrypto.Resource.String.ApplicationName = global::XamarinTodoQuickStart.Resource.String.ApplicationName;
+ global::PCLCrypto.Resource.String.Hello = global::XamarinTodoQuickStart.Resource.String.Hello;
+ }
+
+ public partial class Animation
+ {
+
+ // aapt resource value: 0x7f040000
+ public const int slide_in_right = 2130968576;
+
+ // aapt resource value: 0x7f040001
+ public const int slide_out_left = 2130968577;
+
+ static Animation()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Animation()
+ {
+ }
+ }
+
+ public partial class Attribute
+ {
+
+ static Attribute()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Attribute()
+ {
+ }
+ }
+
+ public partial class Drawable
+ {
+
+ // aapt resource value: 0x7f020000
+ public const int ic_arrow_back = 2130837504;
+
+ // aapt resource value: 0x7f020001
+ public const int ic_launcher = 2130837505;
+
+ static Drawable()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Drawable()
+ {
+ }
+ }
+
+ public partial class Id
+ {
+
+ // aapt resource value: 0x7f080000
+ public const int LinearLayout1 = 2131230720;
+
+ // aapt resource value: 0x7f080004
+ public const int buttonAddTodo = 2131230724;
+
+ // aapt resource value: 0x7f080007
+ public const int checkTodoItem = 2131230727;
+
+ // aapt resource value: 0x7f080005
+ public const int listViewTodo = 2131230725;
+
+ // aapt resource value: 0x7f080002
+ public const int loadingProgressBar = 2131230722;
+
+ // aapt resource value: 0x7f080008
+ public const int menu_refresh = 2131230728;
+
+ // aapt resource value: 0x7f080003
+ public const int textNewTodo = 2131230723;
+
+ // aapt resource value: 0x7f080001
+ public const int textViewTitle = 2131230721;
+
+ // aapt resource value: 0x7f080006
+ public const int webview = 2131230726;
+
+ static Id()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Id()
+ {
+ }
+ }
+
+ public partial class Layout
+ {
+
+ // aapt resource value: 0x7f030000
+ public const int Activity_To_Do = 2130903040;
+
+ // aapt resource value: 0x7f030001
+ public const int activity_webview = 2130903041;
+
+ // aapt resource value: 0x7f030002
+ public const int Row_List_To_Do = 2130903042;
+
+ static Layout()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Layout()
+ {
+ }
+ }
+
+ public partial class Menu
+ {
+
+ // aapt resource value: 0x7f070000
+ public const int activity_main = 2131165184;
+
+ static Menu()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Menu()
+ {
+ }
+ }
+
+ public partial class String
+ {
+
+ // aapt resource value: 0x7f050001
+ public const int ApplicationName = 2131034113;
+
+ // aapt resource value: 0x7f050000
+ public const int Hello = 2131034112;
+
+ // aapt resource value: 0x7f050005
+ public const int add_button_text = 2131034117;
+
+ // aapt resource value: 0x7f050004
+ public const int add_textbox_hint = 2131034116;
+
+ // aapt resource value: 0x7f050003
+ public const int app_name = 2131034115;
+
+ // aapt resource value: 0x7f050008
+ public const int checkbox_text = 2131034120;
+
+ // aapt resource value: 0x7f050007
+ public const int menu_refresh = 2131034119;
+
+ // aapt resource value: 0x7f050006
+ public const int mobile_services = 2131034118;
+
+ // aapt resource value: 0x7f050002
+ public const int title_activity_webview = 2131034114;
+
+ static String()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private String()
+ {
+ }
+ }
+
+ public partial class Style
+ {
+
+ // aapt resource value: 0x7f060000
+ public const int AppBaseTheme = 2131099648;
+
+ // aapt resource value: 0x7f060001
+ public const int AppTheme = 2131099649;
+
+ static Style()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Style()
+ {
+ }
+ }
+ }
+}
+#pragma warning restore 1591
diff --git a/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/drawable-hdpi/ic_launcher.png b/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/drawable-hdpi/ic_launcher.png
new file mode 100644
index 000000000..b2f7c2b5f
Binary files /dev/null and b/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/drawable-hdpi/ic_launcher.png differ
diff --git a/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/drawable-ldpi/ic_launcher.png b/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/drawable-ldpi/ic_launcher.png
new file mode 100644
index 000000000..c2219b558
Binary files /dev/null and b/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/drawable-ldpi/ic_launcher.png differ
diff --git a/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/drawable-mdpi/ic_launcher.png b/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/drawable-mdpi/ic_launcher.png
new file mode 100644
index 000000000..b2c79b7ed
Binary files /dev/null and b/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/drawable-mdpi/ic_launcher.png differ
diff --git a/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/drawable-xhdpi/ic_launcher.png b/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 000000000..fc4b43087
Binary files /dev/null and b/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/drawable-xhdpi/ic_launcher.png differ
diff --git a/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/layout/Activity_To_Do.axml b/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/layout/Activity_To_Do.axml
new file mode 100644
index 000000000..2e8775ee8
--- /dev/null
+++ b/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/layout/Activity_To_Do.axml
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/layout/Row_List_To_Do.axml b/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/layout/Row_List_To_Do.axml
new file mode 100644
index 000000000..bc3facc8d
--- /dev/null
+++ b/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/layout/Row_List_To_Do.axml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/menu/activity_main.xml b/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/menu/activity_main.xml
new file mode 100644
index 000000000..2ca5582b0
--- /dev/null
+++ b/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/menu/activity_main.xml
@@ -0,0 +1,5 @@
+
\ No newline at end of file
diff --git a/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/values-v11/styles.xml b/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/values-v11/styles.xml
new file mode 100644
index 000000000..541752f6e
--- /dev/null
+++ b/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/values-v11/styles.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/values-v14/styles.xml b/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/values-v14/styles.xml
new file mode 100644
index 000000000..f20e01501
--- /dev/null
+++ b/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/values-v14/styles.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/values/Strings.xml b/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/values/Strings.xml
new file mode 100644
index 000000000..634eeecdf
--- /dev/null
+++ b/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/values/Strings.xml
@@ -0,0 +1,9 @@
+
+
+ XamarinTodoQuickStart
+ Add a Todo item
+ Add
+ Mobile App
+ Refresh
+ Item Text
+
diff --git a/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/values/styles.xml b/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/values/styles.xml
new file mode 100644
index 000000000..4a10ca492
--- /dev/null
+++ b/Azure/GettingStarted/Android/XamarinTodoQuickStart/Resources/values/styles.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GettingStarted/Android/XamarinTodoQuickStart/TodoActivity.cs b/Azure/GettingStarted/Android/XamarinTodoQuickStart/TodoActivity.cs
new file mode 100644
index 000000000..47a7b2c58
--- /dev/null
+++ b/Azure/GettingStarted/Android/XamarinTodoQuickStart/TodoActivity.cs
@@ -0,0 +1,203 @@
+using System;
+using Android.OS;
+using Android.App;
+using Android.Views;
+using Android.Widget;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using Microsoft.WindowsAzure.MobileServices;
+using System.Net.Http;
+
+namespace XamarinTodoQuickStart
+{
+ [Activity (MainLauncher = true,
+ Icon="@drawable/ic_launcher", Label="@string/app_name",
+ Theme="@style/AppTheme")]
+ public class TodoActivity : Activity
+ {
+ private MobileServiceClient client; // Mobile Service Client reference
+ private IMobileServiceTable todoTable; // Mobile Service Table used to access data
+
+ private TodoItemAdapter adapter; // Adapter to sync the items list with the view
+ private EditText textNewTodo; // EditText containing the "New Todo" text
+ private ProgressBar progressBar; // Progress spinner to use for table operations
+
+ // Called when the activity initially gets created
+ protected override async void OnCreate(Bundle bundle)
+ {
+ base.OnCreate(bundle);
+
+ // Set our view from the "main" layout resource
+ SetContentView(Resource.Layout.Activity_To_Do);
+
+ // Initialize the progress bar
+ progressBar = FindViewById(Resource.Id.loadingProgressBar);
+ progressBar.Visibility = ViewStates.Gone;
+
+ // Create ProgressFilter to handle busy state
+ var progressHandler = new ProgressHandler ();
+ progressHandler.BusyStateChange += (busy) => {
+ if (progressBar != null)
+ progressBar.Visibility = busy ? ViewStates.Visible : ViewStates.Gone;
+ };
+
+ try
+ {
+ CurrentPlatform.Init ();
+ // Create the Mobile Service Client instance, using the provided
+ // Mobile Service URL and key
+ client = new MobileServiceClient(
+ Constants.ApplicationURL,
+ progressHandler);
+
+ // Get the Mobile Service Table instance to use
+ todoTable = client.GetTable();
+
+ textNewTodo = FindViewById(Resource.Id.textNewTodo);
+
+ // Create an adapter to bind the items with the view
+ adapter = new TodoItemAdapter(this, Resource.Layout.Row_List_To_Do);
+ var listViewTodo = FindViewById(Resource.Id.listViewTodo);
+ listViewTodo.Adapter = adapter;
+
+ // Load the items from the Mobile Service
+ await RefreshItemsFromTableAsync();
+
+ }
+ catch (Java.Net.MalformedURLException)
+ {
+ CreateAndShowDialog(new Exception ("There was an error creating the Mobile Service. Verify the URL"), "Error");
+ }
+ catch (Exception e)
+ {
+ CreateAndShowDialog(e, "Error");
+ }
+ }
+
+ // Initializes the activity menu
+ public override bool OnCreateOptionsMenu(IMenu menu)
+ {
+ MenuInflater.Inflate(Resource.Menu.activity_main, menu);
+ return true;
+ }
+
+ // Select an option from the menu
+ public override bool OnOptionsItemSelected(IMenuItem item)
+ {
+ if (item.ItemId == Resource.Id.menu_refresh) {
+ OnRefreshItemsSelected();
+ }
+ return true;
+ }
+
+ // Called when the refresh menu opion is selected
+ async void OnRefreshItemsSelected()
+ {
+ await RefreshItemsFromTableAsync();
+ }
+
+ // Refresh the list with the items in the Mobile Service Table
+ async Task RefreshItemsFromTableAsync()
+ {
+ try {
+ // Get the items that weren't marked as completed and add them in the adapter
+ var list = await todoTable.Where(item => item.Complete == false).ToListAsync ();
+
+ adapter.Clear ();
+
+ foreach (TodoItem current in list)
+ adapter.Add(current);
+
+ }
+ catch (Exception e)
+ {
+ CreateAndShowDialog(e, "Error");
+ }
+ }
+
+ public async Task CheckItem(TodoItem item)
+ {
+ if (client == null)
+ return;
+
+ // Set the item as completed and update it in the table
+ item.Complete = true;
+ try {
+ await todoTable.UpdateAsync(item);
+ if (item.Complete)
+ adapter.Remove(item);
+
+ } catch (Exception e) {
+ CreateAndShowDialog(e, "Error");
+ }
+ }
+
+ [Java.Interop.Export()]
+ public async void AddItem(View view)
+ {
+ if (client == null || string.IsNullOrWhiteSpace(textNewTodo.Text)) {
+ return;
+ }
+
+ // Create a new item
+ var item = new TodoItem() {
+ Text = textNewTodo.Text,
+ Complete = false
+ };
+
+ try {
+ // Insert the new item
+ await todoTable.InsertAsync(item);
+
+ if (!item.Complete) {
+ adapter.Add(item);
+ }
+ } catch (Exception e) {
+ CreateAndShowDialog(e, "Error");
+ }
+
+ textNewTodo.Text = "";
+ }
+
+ void CreateAndShowDialog(Exception exception, String title)
+ {
+ CreateAndShowDialog(exception.Message, title);
+ }
+
+ void CreateAndShowDialog(string message, string title)
+ {
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+
+ builder.SetMessage(message);
+ builder.SetTitle(title);
+ builder.Create().Show();
+ }
+
+ class ProgressHandler : DelegatingHandler
+ {
+ int busyCount = 0;
+
+ public event Action BusyStateChange;
+
+ #region implemented abstract members of HttpMessageHandler
+
+ protected override async Task SendAsync (HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
+ {
+ //assumes always executes on UI thread
+ if (busyCount++ == 0 && BusyStateChange != null)
+ BusyStateChange (true);
+
+ var response = await base.SendAsync (request, cancellationToken);
+
+ // assumes always executes on UI thread
+ if (--busyCount == 0 && BusyStateChange != null)
+ BusyStateChange (false);
+
+ return response;
+ }
+
+ #endregion
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/Azure/GettingStarted/Android/XamarinTodoQuickStart/TodoItem.cs b/Azure/GettingStarted/Android/XamarinTodoQuickStart/TodoItem.cs
new file mode 100644
index 000000000..5de32610d
--- /dev/null
+++ b/Azure/GettingStarted/Android/XamarinTodoQuickStart/TodoItem.cs
@@ -0,0 +1,28 @@
+using System;
+using Newtonsoft.Json;
+
+namespace XamarinTodoQuickStart
+{
+ public class TodoItem
+ {
+ // Tables created prior to November 2013 should use 'int' type. Check your configuration.
+ public string Id { get; set; }
+
+ [JsonProperty(PropertyName = "text")]
+ public string Text { get; set; }
+
+ [JsonProperty(PropertyName = "complete")]
+ public bool Complete { get; set; }
+ }
+
+ public class TodoItemWrapper : Java.Lang.Object
+ {
+ public TodoItem TodoItem { get; private set; }
+
+ public TodoItemWrapper(TodoItem item)
+ {
+ this.TodoItem = item;
+ }
+ }
+}
+
diff --git a/Azure/GettingStarted/Android/XamarinTodoQuickStart/TodoItemAdapter.cs b/Azure/GettingStarted/Android/XamarinTodoQuickStart/TodoItemAdapter.cs
new file mode 100644
index 000000000..7014ce79a
--- /dev/null
+++ b/Azure/GettingStarted/Android/XamarinTodoQuickStart/TodoItemAdapter.cs
@@ -0,0 +1,100 @@
+using System;
+using Android.App;
+using Android.Views;
+using Android.Widget;
+using System.Collections.Generic;
+using XamarinTodoQuickStart;
+
+namespace XamarinTodoQuickStart
+{
+ public class TodoItemAdapter : BaseAdapter
+ {
+ // Private Variables
+ private Activity activity;
+ private int layoutResourceId;
+ private List items = new List();
+
+ // Constructor
+ public TodoItemAdapter(Activity activity, int layoutResourceId)
+ {
+ this.activity = activity;
+ this.layoutResourceId = layoutResourceId;
+ }
+
+ // Returns the view for a specific item on the list
+ public override View GetView(int position, Android.Views.View convertView, Android.Views.ViewGroup parent)
+ {
+ var row = convertView;
+ var currentItem = this[position];
+ CheckBox checkBox;
+
+ if (row == null)
+ {
+ var inflater = activity.LayoutInflater;
+ row = inflater.Inflate(layoutResourceId, parent, false);
+
+ checkBox = row.FindViewById(Resource.Id.checkTodoItem);
+
+ checkBox.CheckedChange += async (sender, e) => {
+ var cbSender = sender as CheckBox;
+ if (cbSender != null && cbSender.Tag is TodoItemWrapper && cbSender.Checked)
+ {
+ cbSender.Enabled = false;
+
+ if (activity is TodoActivity)
+ await ((TodoActivity)activity).CheckItem((cbSender.Tag as TodoItemWrapper).TodoItem);
+ }
+ };
+ }
+ else
+ {
+ checkBox = row.FindViewById(Resource.Id.checkTodoItem);
+ }
+
+ checkBox.Text = currentItem.Text;
+ checkBox.Checked = false;
+ checkBox.Enabled = true;
+ checkBox.Tag = new TodoItemWrapper(currentItem);
+
+ return row;
+ }
+
+ public void Add(TodoItem item)
+ {
+ items.Add(item);
+ NotifyDataSetChanged();
+ }
+
+ public void Clear()
+ {
+ items.Clear();
+ NotifyDataSetChanged();
+ }
+
+ public void Remove(TodoItem item)
+ {
+ items.Remove(item);
+ NotifyDataSetChanged();
+ }
+
+ #region implemented abstract members of BaseAdapter
+
+ public override long GetItemId(int position)
+ {
+ return position;
+ }
+
+ public override int Count
+ {
+ get { return items.Count; }
+ }
+
+ public override TodoItem this[int position]
+ {
+ get { return items[position]; }
+ }
+
+ #endregion
+ }
+}
+
diff --git a/Azure/GettingStarted/Android/XamarinTodoQuickStart/XamarinTodoQuickStart.Android.csproj b/Azure/GettingStarted/Android/XamarinTodoQuickStart/XamarinTodoQuickStart.Android.csproj
new file mode 100644
index 000000000..56b216fd4
--- /dev/null
+++ b/Azure/GettingStarted/Android/XamarinTodoQuickStart/XamarinTodoQuickStart.Android.csproj
@@ -0,0 +1,115 @@
+
+
+
+ Debug
+ AnyCPU
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}
+ {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ Library
+ XamarinTodoQuickStart
+ True
+ Resources\Resource.designer.cs
+ Resource
+ Resources
+ Assets
+ ZUMOAPPNAME
+ Properties\AndroidManifest.xml
+ v8.1
+ true
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ None
+ false
+ Xamarin.Android.Net.AndroidClientHandler
+
+
+ full
+ true
+ bin\Release
+ prompt
+ 4
+ false
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+ ..\packages\Newtonsoft.Json.9.0.1\lib\portable-net45+wp80+win8+wpa81\Newtonsoft.Json.dll
+
+
+ ..\packages\PInvoke.Windows.Core.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Windows.Core.dll
+
+
+ ..\packages\PInvoke.Kernel32.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Kernel32.dll
+
+
+ ..\packages\PInvoke.BCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.BCrypt.dll
+
+
+ ..\packages\PInvoke.NCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.NCrypt.dll
+
+
+ ..\packages\Validation.2.2.8\lib\dotnet\Validation.dll
+
+
+ ..\packages\PCLCrypto.2.0.147\lib\MonoAndroid23\PCLCrypto.dll
+
+
+ ..\packages\Xamarin.Android.Support.v4.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v4.dll
+
+
+ ..\packages\Xamarin.Android.Support.CustomTabs.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.CustomTabs.dll
+
+
+ ..\packages\Microsoft.Azure.Mobile.Client.4.0.2\lib\monoandroid70\Microsoft.Azure.Mobile.Client.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GettingStarted/Android/XamarinTodoQuickStart/packages.config b/Azure/GettingStarted/Android/XamarinTodoQuickStart/packages.config
new file mode 100644
index 000000000..b65885357
--- /dev/null
+++ b/Azure/GettingStarted/Android/XamarinTodoQuickStart/packages.config
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GettingStarted/Metadata.xml b/Azure/GettingStarted/Metadata.xml
new file mode 100644
index 000000000..b3d4d3c3f
--- /dev/null
+++ b/Azure/GettingStarted/Metadata.xml
@@ -0,0 +1,11 @@
+
+
+ 4ffba1a6-02cc-4b43-9e34-ab6a085fe0cb
+ false
+ Beginner
+ Cloud
+ Android, iOS
+ Indie
+ Microsoft Azure sample GettingStarted
+ false
+
diff --git a/Azure/GettingStarted/Screenshots/Android.png b/Azure/GettingStarted/Screenshots/Android.png
new file mode 100644
index 000000000..d5af16b09
Binary files /dev/null and b/Azure/GettingStarted/Screenshots/Android.png differ
diff --git a/Azure/GettingStarted/Screenshots/iOS.png b/Azure/GettingStarted/Screenshots/iOS.png
new file mode 100644
index 000000000..f5d48d8d8
Binary files /dev/null and b/Azure/GettingStarted/Screenshots/iOS.png differ
diff --git a/Azure/GettingStarted/iOS/XamarinTodoQuickStart.iOS.sln b/Azure/GettingStarted/iOS/XamarinTodoQuickStart.iOS.sln
new file mode 100644
index 000000000..85d684411
--- /dev/null
+++ b/Azure/GettingStarted/iOS/XamarinTodoQuickStart.iOS.sln
@@ -0,0 +1,43 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XamarinTodoQuickStart.iOS", "XamarinTodoQuickStart\XamarinTodoQuickStart.iOS.csproj", "{07F1CD1B-626F-4BE5-9840-97B44CBB94C9}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Ad-Hoc|iPhone = Ad-Hoc|iPhone
+ Ad-Hoc|iPhoneSimulator = Ad-Hoc|iPhoneSimulator
+ AppStore|iPhone = AppStore|iPhone
+ AppStore|iPhoneSimulator = AppStore|iPhoneSimulator
+ Debug|iPhone = Debug|iPhone
+ Debug|iPhoneSimulator = Debug|iPhoneSimulator
+ Release|iPhone = Release|iPhone
+ Release|iPhoneSimulator = Release|iPhoneSimulator
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Ad-Hoc|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.AppStore|iPhone.ActiveCfg = AppStore|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.AppStore|iPhone.Build.0 = AppStore|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.AppStore|iPhoneSimulator.Deploy.0 = AppStore|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Debug|iPhone.ActiveCfg = Debug|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Debug|iPhone.Build.0 = Debug|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Release|iPhone.ActiveCfg = Release|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Release|iPhone.Build.0 = Release|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
+ EndGlobalSection
+ GlobalSection(MonoDevelopProperties) = preSolution
+ StartupItem = XamarinTodoQuickStart\XamarinTodoQuickStart.iOS.csproj
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Azure/GettingStarted/iOS/XamarinTodoQuickStart/AppDelegate.cs b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/AppDelegate.cs
new file mode 100644
index 000000000..523f1e347
--- /dev/null
+++ b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/AppDelegate.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Foundation;
+using UIKit;
+
+namespace XamarinTodoQuickStart
+{
+ // The UIApplicationDelegate for the application. This class is responsible for launching the
+ // User Interface of the application, as well as listening (and optionally responding) to
+ // application events from iOS.
+ [Register ("AppDelegate")]
+ public partial class AppDelegate : UIApplicationDelegate
+ {
+ // class-level declarations
+ public override UIWindow Window {get; set;}
+ }
+}
+
diff --git a/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Contents.json b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 000000000..d77296819
--- /dev/null
+++ b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,205 @@
+{
+ "images": [
+ {
+ "size": "20x20",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "20x20",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "filename": "Icon_58.png",
+ "size": "29x29",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "29x29",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "40x40",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "40x40",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "filename": "Icon_120.png",
+ "size": "60x60",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "60x60",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "20x20",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "20x20",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "29x29",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "29x29",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "40x40",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "40x40",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "83.5x83.5",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "filename": "Icon_76.png",
+ "size": "76x76",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "76x76",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "1024x1024",
+ "scale": "1x",
+ "idiom": "ios-marketing"
+ },
+ {
+ "role": "notificationCenter",
+ "size": "24x24",
+ "subtype": "38mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "notificationCenter",
+ "size": "27.5x27.5",
+ "subtype": "42mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "companionSettings",
+ "size": "29x29",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "companionSettings",
+ "size": "29x29",
+ "scale": "3x",
+ "idiom": "watch"
+ },
+ {
+ "role": "appLauncher",
+ "size": "40x40",
+ "subtype": "38mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "longLook",
+ "size": "44x44",
+ "subtype": "42mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "quickLook",
+ "size": "86x86",
+ "subtype": "38mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "quickLook",
+ "size": "98x98",
+ "subtype": "42mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "size": "16x16",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "16x16",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "size": "32x32",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "32x32",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "size": "128x128",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "128x128",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "size": "256x256",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "256x256",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "size": "512x512",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "512x512",
+ "scale": "2x",
+ "idiom": "mac"
+ }
+ ],
+ "info": {
+ "version": 1,
+ "author": "xcode"
+ }
+}
\ No newline at end of file
diff --git a/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon.png b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon.png
new file mode 100755
index 000000000..652acddf5
Binary files /dev/null and b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon.png differ
diff --git a/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon@2x.png b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon@2x.png
new file mode 100755
index 000000000..116eeabd2
Binary files /dev/null and b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon@2x.png differ
diff --git a/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_120.png b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_120.png
new file mode 100755
index 000000000..6a06e6ff8
Binary files /dev/null and b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_120.png differ
diff --git a/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_58.png b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_58.png
new file mode 100755
index 000000000..a69958c06
Binary files /dev/null and b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_58.png differ
diff --git a/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_76.png b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_76.png
new file mode 100755
index 000000000..09898ad19
Binary files /dev/null and b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_76.png differ
diff --git a/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Constants.cs b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Constants.cs
new file mode 100644
index 000000000..07170e482
--- /dev/null
+++ b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Constants.cs
@@ -0,0 +1,11 @@
+using System;
+
+namespace XamarinTodoQuickStart
+{
+ public static class Constants
+ {
+ // Azure app specific URL
+ public const string ApplicationURL = @"https://your_app_name.azurewebsites.net/";
+ }
+}
+
diff --git a/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Info.plist b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Info.plist
new file mode 100644
index 000000000..66e8feecc
--- /dev/null
+++ b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Info.plist
@@ -0,0 +1,42 @@
+
+
+
+
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UIMainStoryboardFile
+ MainStoryboard_iPhone
+ UIMainStoryboardFile~ipad
+ MainStoryboard_iPad
+ MinimumOSVersion
+ 11.0
+ CFBundleVersion
+ 1
+ CFBundleShortVersionString
+ 1
+ CFBundleIdentifier
+ com.xamarintest.azurequickstart
+ CFBundleName
+ Xamarin+Azure
+ UILaunchStoryboardName
+ LaunchScreen
+ XSAppIconAssets
+ Assets.xcassets/AppIcon.appiconset
+
+
diff --git a/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Main.cs b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Main.cs
new file mode 100644
index 000000000..0ac4457b6
--- /dev/null
+++ b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Main.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Foundation;
+using UIKit;
+
+namespace XamarinTodoQuickStart
+{
+ public class Application
+ {
+ // This is the main entry point of the application.
+ static void Main(string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main(args, null, "AppDelegate");
+ }
+ }
+}
diff --git a/Azure/GettingStarted/iOS/XamarinTodoQuickStart/MainStoryboard_iPad.storyboard b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/MainStoryboard_iPad.storyboard
new file mode 100755
index 000000000..411b4eecb
--- /dev/null
+++ b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/MainStoryboard_iPad.storyboard
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GettingStarted/iOS/XamarinTodoQuickStart/MainStoryboard_iPhone.storyboard b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/MainStoryboard_iPhone.storyboard
new file mode 100755
index 000000000..87a5f0ec5
--- /dev/null
+++ b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/MainStoryboard_iPhone.storyboard
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Resources/Default.png b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Resources/Default.png
new file mode 100755
index 000000000..4c8ca6f69
Binary files /dev/null and b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Resources/Default.png differ
diff --git a/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Resources/Default@2x.png b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Resources/Default@2x.png
new file mode 100755
index 000000000..35b84cffe
Binary files /dev/null and b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Resources/Default@2x.png differ
diff --git a/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Resources/LaunchScreen.xib b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Resources/LaunchScreen.xib
new file mode 100644
index 000000000..9ca3deadd
--- /dev/null
+++ b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/Resources/LaunchScreen.xib
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GettingStarted/iOS/XamarinTodoQuickStart/TodoItem.cs b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/TodoItem.cs
new file mode 100644
index 000000000..ab294b6f5
--- /dev/null
+++ b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/TodoItem.cs
@@ -0,0 +1,18 @@
+using System;
+using Newtonsoft.Json;
+
+namespace XamarinTodoQuickStart
+{
+ public class TodoItem
+ {
+ // Tables created prior to November 2013 should use 'int' type. Check your configuration.
+ public string Id { get; set; }
+
+ [JsonProperty(PropertyName = "text")]
+ public string Text { get; set; }
+
+ [JsonProperty(PropertyName = "complete")]
+ public bool Complete { get; set; }
+ }
+}
+
diff --git a/Azure/GettingStarted/iOS/XamarinTodoQuickStart/TodoListViewController.cs b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/TodoListViewController.cs
new file mode 100644
index 000000000..970c7a9bf
--- /dev/null
+++ b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/TodoListViewController.cs
@@ -0,0 +1,171 @@
+// This file has been autogenerated from parsing an Objective-C header file added in Xcode.
+using System;
+using Foundation;
+using UIKit;
+using System.Threading.Tasks;
+
+namespace XamarinTodoQuickStart
+{
+ public partial class TodoListViewController : UITableViewController
+ {
+ // Private Variables
+ private TodoService todoService;
+ private bool useRefreshControl = false;
+
+ // Constructor
+ public TodoListViewController(IntPtr handle) : base(handle)
+ {
+ }
+
+ public override async void ViewDidLoad()
+ {
+ base.ViewDidLoad();
+
+ todoService = TodoService.DefaultService;
+
+ todoService.BusyUpdate += (bool busy) => {
+ if (busy)
+ activityIndicator.StartAnimating();
+ else
+ activityIndicator.StopAnimating();
+ };
+
+ AddRefreshControl();
+
+ await RefreshAsync();
+ }
+
+ async Task RefreshAsync()
+ {
+ // only activate the refresh control if the feature is available
+ if (useRefreshControl)
+ RefreshControl.BeginRefreshing();
+
+ await todoService.RefreshDataAsync();
+
+ if (useRefreshControl)
+ RefreshControl.EndRefreshing();
+
+ TableView.ReloadData();
+ }
+
+ #region UITableView methods
+ public override nint RowsInSection(UITableView tableview, nint section)
+ {
+ if (todoService == null || todoService.Items == null)
+ return 0;
+
+ return todoService.Items.Count;
+ }
+
+ public override nint NumberOfSections(UITableView tableView)
+ {
+ return 1;
+ }
+
+ public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
+ {
+ const string CellIdentifier = @"Cell";
+ var cell = tableView.DequeueReusableCell(CellIdentifier);
+ if (cell == null) {
+ cell = new UITableViewCell(UITableViewCellStyle.Default, CellIdentifier);
+ }
+
+ // Set the label on the cell and make sure the label color is black (in case this cell
+ // has been reused and was previously greyed out
+ var label = (UILabel)cell.ViewWithTag(1);
+ label.TextColor = UIColor.Black;
+ label.Text = todoService.Items [indexPath.Row].Text;
+
+ return cell;
+ }
+
+ public override string TitleForDeleteConfirmation(UITableView tableView, NSIndexPath indexPath)
+ {
+ // Customize the Delete button to say "complete"
+ return @"complete";
+ }
+
+ public override UITableViewCellEditingStyle EditingStyleForRow(UITableView tableView, NSIndexPath indexPath)
+ {
+ // Find the item that is about to be edited
+ var item = todoService.Items[indexPath.Row];
+
+ // If the item is complete, then this is just pending upload. Editing is not allowed
+ if (item.Complete)
+ return UITableViewCellEditingStyle.None;
+
+ // Otherwise, allow the delete button to appear
+ return UITableViewCellEditingStyle.Delete;
+ }
+
+ public async override void CommitEditingStyle(UITableView tableView, UITableViewCellEditingStyle editingStyle, NSIndexPath indexPath)
+ {
+ // Find item that was commited for editing (completed)
+ var item = todoService.Items[indexPath.Row];
+
+ // Change the appearance to look greyed out until we remove the item
+ var label = (UILabel)TableView.CellAt(indexPath).ViewWithTag(1);
+ label.TextColor = UIColor.Gray;
+
+ // Ask the todoService to set the item's complete value to YES, and remove the row if successful
+ await todoService.CompleteItemAsync(item);
+
+ // Remove the row from the UITableView
+ tableView.DeleteRows(new [] { indexPath }, UITableViewRowAnimation.Top);
+ }
+
+ #endregion
+
+ #region UI Actions
+
+ async partial void OnAdd(NSObject sender)
+ {
+ if (string.IsNullOrWhiteSpace(itemText.Text))
+ return;
+
+ var newItem = new TodoItem() {
+ Text = itemText.Text,
+ Complete = false
+ };
+
+ int index = await todoService.InsertTodoItemAsync(newItem);
+
+ TableView.InsertRows(new [] { NSIndexPath.FromItemSection(index, 0) },
+ UITableViewRowAnimation.Top);
+
+ itemText.Text = "";
+ }
+
+ #endregion
+
+ #region UITextFieldDelegate methods
+
+ [Export ("textFieldShouldReturn:")]
+ public virtual bool ShouldReturn(UITextField textField)
+ {
+ textField.ResignFirstResponder();
+ return true;
+ }
+
+ #endregion
+
+ #region * iOS Specific Code
+
+ // This method will add the UIRefreshControl to the table view if
+ // it is available, ie, we are running on iOS 6+
+ private void AddRefreshControl()
+ {
+ if (UIDevice.CurrentDevice.CheckSystemVersion(6, 0)) {
+ // the refresh control is available, let's add it
+ RefreshControl = new UIRefreshControl();
+ RefreshControl.ValueChanged += async (sender, e) => {
+ await RefreshAsync();
+ };
+ useRefreshControl = true;
+ }
+ }
+
+ #endregion
+ }
+}
diff --git a/Azure/GettingStarted/iOS/XamarinTodoQuickStart/TodoListViewController.designer.cs b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/TodoListViewController.designer.cs
new file mode 100644
index 000000000..12f0e5151
--- /dev/null
+++ b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/TodoListViewController.designer.cs
@@ -0,0 +1,40 @@
+// WARNING
+//
+// This file has been generated automatically by Visual Studio from the outlets and
+// actions declared in your storyboard file.
+// Manual changes to this file will not be maintained.
+//
+using Foundation;
+using System;
+using System.CodeDom.Compiler;
+
+namespace XamarinTodoQuickStart
+{
+ [Register ("TodoListViewController")]
+ partial class TodoListViewController
+ {
+ [Outlet]
+ UIKit.UIActivityIndicatorView activityIndicator { get; set; }
+
+
+ [Outlet]
+ UIKit.UITextField itemText { get; set; }
+
+
+ [Action ("OnAdd:")]
+ partial void OnAdd (Foundation.NSObject sender);
+
+ void ReleaseDesignerOutlets ()
+ {
+ if (activityIndicator != null) {
+ activityIndicator.Dispose ();
+ activityIndicator = null;
+ }
+
+ if (itemText != null) {
+ itemText.Dispose ();
+ itemText = null;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Azure/GettingStarted/iOS/XamarinTodoQuickStart/TodoService.cs b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/TodoService.cs
new file mode 100644
index 000000000..d0109364e
--- /dev/null
+++ b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/TodoService.cs
@@ -0,0 +1,121 @@
+using System;
+using System.Net.Http;
+using System.Threading.Tasks;
+using System.Collections.Generic;
+using Microsoft.WindowsAzure.MobileServices;
+
+namespace XamarinTodoQuickStart
+{
+ public class TodoService : DelegatingHandler
+ {
+ private static TodoService todoServiceInstance = new TodoService();
+ public static TodoService DefaultService { get { return todoServiceInstance; } }
+
+ private MobileServiceClient client;
+ private IMobileServiceTable todoTable;
+
+ public List Items { get; private set;}
+ private int busyCount = 0;
+
+ // Public events
+ public event Action BusyUpdate;
+
+ // Constructor
+ protected TodoService()
+ {
+
+ Items = new List();
+
+ CurrentPlatform.Init ();
+ // Initialize the Mobile Service client with your URL and key
+ client = new MobileServiceClient (Constants.ApplicationURL);
+
+ // Create an MSTable instance to allow us to work with the TodoItem table
+ todoTable = client.GetTable ();
+ }
+
+ async public Task> RefreshDataAsync()
+ {
+ try
+ {
+ // This code refreshes the entries in the list view by querying the TodoItems table.
+ // The query excludes completed TodoItems
+ Items = await todoTable
+ .Where (todoItem => todoItem.Complete == false).ToListAsync();
+
+ }
+ catch (MobileServiceInvalidOperationException e)
+ {
+ Console.Error.WriteLine (@"ERROR {0}", e.Message);
+ return null;
+ }
+
+ return Items;
+ }
+
+ public async Task InsertTodoItemAsync(TodoItem todoItem)
+ {
+ try
+ {
+ // This code inserts a new TodoItem into the database. When the operation completes
+ // and Mobile Services has assigned an Id, the item is added to the CollectionView
+ await todoTable.InsertAsync(todoItem);
+
+ Items.Add(todoItem);
+
+ return Items.IndexOf(todoItem);
+
+ }
+ catch (MobileServiceInvalidOperationException e)
+ {
+ Console.Error.WriteLine(@"ERROR {0}", e.Message);
+ return 0;
+ }
+ }
+
+ public async Task CompleteItemAsync(TodoItem item)
+ {
+ try
+ {
+ // This code takes a freshly completed TodoItem and updates the database. When the MobileService
+ // responds, the item is removed from the list
+ item.Complete = true;
+ await todoTable.UpdateAsync(item);
+ Items.Remove(item);
+
+ }
+ catch (MobileServiceInvalidOperationException e)
+ {
+ Console.Error.WriteLine (@"ERROR {0}", e.Message);
+ }
+ }
+
+ void Busy(bool busy)
+ {
+ // assumes always executes on UI thread
+ if (busy)
+ {
+ if (busyCount++ == 0 && BusyUpdate != null)
+ BusyUpdate(true);
+ }
+ else
+ {
+ if (--busyCount == 0 && BusyUpdate != null)
+ BusyUpdate(false);
+ }
+ }
+
+ #region implemented abstract members of HttpMessageHandler
+
+ protected override async Task SendAsync (System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
+ {
+ Busy (true);
+ var response = await base.SendAsync (request, cancellationToken);
+
+ Busy (false);
+ return response;
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/Azure/GettingStarted/iOS/XamarinTodoQuickStart/XamarinTodoQuickStart.iOS.csproj b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/XamarinTodoQuickStart.iOS.csproj
new file mode 100644
index 000000000..cbce0c1ca
--- /dev/null
+++ b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/XamarinTodoQuickStart.iOS.csproj
@@ -0,0 +1,168 @@
+
+
+
+ Debug
+ iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}
+ {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ Exe
+ XamarinTodoQuickStart
+ Resources
+ XamarinTodoQuickStart
+ Xamarin.iOS
+ v1.0
+
+
+ true
+ full
+ false
+ bin\iPhoneSimulator\Debug
+ DEBUG;
+ prompt
+ 4
+ SdkOnly
+ false
+ true
+
+ x86_64
+ NSUrlSessionHandler
+ iPhone Developer
+
+
+ full
+ true
+ bin\iPhoneSimulator\Release
+ prompt
+ 4
+ None
+ x86_64
+ false
+ NSUrlSessionHandler
+
+
+ true
+ full
+ false
+ bin\iPhone\Debug
+ DEBUG;
+ prompt
+ 4
+ true
+ false
+ iPhone Developer
+
+ ARM64
+ NSUrlSessionHandler
+
+
+ full
+ true
+ bin\iPhone\Release
+ prompt
+ 4
+ iPhone Developer
+ false
+ ARM64
+ NSUrlSessionHandler
+
+
+ full
+ true
+ bin\iPhone\Ad-Hoc
+ prompt
+ 4
+ iPhone Distribution
+ true
+ false
+ Automatic:AdHoc
+
+ ARM64
+ NSUrlSessionHandler
+
+
+ full
+ true
+ bin\iPhone\AppStore
+ prompt
+ 4
+ iPhone Distribution
+ false
+ Automatic:AppStore
+ ARM64
+ NSUrlSessionHandler
+
+
+
+
+
+
+
+
+
+ ..\packages\Newtonsoft.Json.9.0.1\lib\portable-net45+wp80+win8+wpa81\Newtonsoft.Json.dll
+
+
+ ..\packages\PInvoke.Windows.Core.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Windows.Core.dll
+
+
+ ..\packages\PInvoke.Kernel32.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Kernel32.dll
+
+
+ ..\packages\PInvoke.BCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.BCrypt.dll
+
+
+ ..\packages\PInvoke.NCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.NCrypt.dll
+
+
+ ..\packages\Validation.2.2.8\lib\dotnet\Validation.dll
+
+
+ ..\packages\PCLCrypto.2.0.147\lib\xamarinios10\PCLCrypto.dll
+
+
+ ..\packages\Microsoft.Azure.Mobile.Client.4.0.2\lib\xamarinios10\Microsoft.Azure.Mobile.Client.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TodoListViewController.cs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.3.1
+ False
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GettingStarted/iOS/XamarinTodoQuickStart/packages.config b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/packages.config
new file mode 100644
index 000000000..06847c21c
--- /dev/null
+++ b/Azure/GettingStarted/iOS/XamarinTodoQuickStart/packages.config
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/GettingStarted/readme.md b/Azure/GettingStarted/readme.md
new file mode 100644
index 000000000..42df182ca
--- /dev/null
+++ b/Azure/GettingStarted/readme.md
@@ -0,0 +1,8 @@
+Getting Started
+=====================
+
+In order to successfully run this application, you'll need to update the fields in
+`Constants.cs` with your own generated credentials.
+
+Additional information for using Windows Azure and Xamarin can be found here:
+https://azure.microsoft.com/en-us/develop/mobile/xamarin/
\ No newline at end of file
diff --git a/Azure/NotificationHubs/Android/AzureCloudCode/insert.js b/Azure/NotificationHubs/Android/AzureCloudCode/insert.js
new file mode 100644
index 000000000..e71bfbdd3
--- /dev/null
+++ b/Azure/NotificationHubs/Android/AzureCloudCode/insert.js
@@ -0,0 +1,54 @@
+function insert(item, user, request)
+{
+ console.log('todoitem.Insert() fired');
+
+ if (item.text.length > 10) {
+ request.respond(statusCodes.BAD_REQUEST, 'Text length must be 10 characters or less.');
+ }
+ else {
+ // item.createdAt = new Date();
+ // item.userId = user.userId;
+ // request.execute();
+
+ // ANDROID -
+ if (item.channel) {
+ console.log('todoitem.Insert() - channel found on item');
+ request.execute({
+ success: function() {
+ console.log('todoitem.Insert() - request returned success');
+ // Write to the response and then send the notification in the background
+ request.respond();
+ push.gcm.send(item.channel, item.text, {
+ success: function(response) {
+ console.log('Push notification sent: ', response);
+ }, error: function(error) {
+ console.log('Error sending push notification: ', error);
+ }
+ });
+ },
+ error: function(response) {
+ console.log('todoitem.Insert() - error response');
+ console.log('Request failed with response code ' + response.status + '.' +
+ 'Raw response: ' + response.text);
+ request.respond();
+ }
+ });
+ }
+
+ // iOS -
+ if (item.deviceToken) {
+ request.execute();
+ // Set timeout to delay the notification, to provide time for the
+ // app to be closed on the device to demonstrate toast notifications
+ setTimeout(function() {
+ push.apns.send(item.deviceToken, {
+ alert: "Toast: " + item.text,
+ payload: {
+ inAppMessage: "Hey, a new item arrived: '" + item.text + "'"
+ }
+ });
+ }, 2500);
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/Azure/NotificationHubs/Android/AzureCloudCode/read.js b/Azure/NotificationHubs/Android/AzureCloudCode/read.js
new file mode 100644
index 000000000..b7ff50ce6
--- /dev/null
+++ b/Azure/NotificationHubs/Android/AzureCloudCode/read.js
@@ -0,0 +1,4 @@
+function read(query, user, request) {
+ // query.where({ userId: user.userId });
+ request.execute();
+}
\ No newline at end of file
diff --git a/Azure/NotificationHubs/Android/XamarinTodoQuickStart.Android.sln b/Azure/NotificationHubs/Android/XamarinTodoQuickStart.Android.sln
new file mode 100644
index 000000000..207f1fe34
--- /dev/null
+++ b/Azure/NotificationHubs/Android/XamarinTodoQuickStart.Android.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XamarinTodoQuickStart.Android", "XamarinTodoQuickStart\XamarinTodoQuickStart.Android.csproj", "{8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(MonoDevelopProperties) = preSolution
+ StartupItem = XamarinTodoQuickStart\XamarinTodoQuickStart.Android.csproj
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Assets/AboutAssets.txt b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Assets/AboutAssets.txt
new file mode 100644
index 000000000..a9b0638eb
--- /dev/null
+++ b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Assets/AboutAssets.txt
@@ -0,0 +1,19 @@
+Any raw assets you want to be deployed with your application can be placed in
+this directory (and child directories) and given a Build Action of "AndroidAsset".
+
+These files will be deployed with your package and will be accessible using Android's
+AssetManager, like this:
+
+public class ReadAsset : Activity
+{
+ protected override void OnCreate (Bundle bundle)
+ {
+ base.OnCreate (bundle);
+
+ InputStream input = Assets.Open ("my_asset.txt");
+ }
+}
+
+Additionally, some Android functions will automatically load asset files:
+
+Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf");
diff --git a/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Constants.cs b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Constants.cs
new file mode 100644
index 000000000..0db187ebb
--- /dev/null
+++ b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Constants.cs
@@ -0,0 +1,17 @@
+using System;
+
+namespace XamarinTodoQuickStart
+{
+ public static class Constants
+ {
+ // Azure app specific URL and key
+ public const string ApplicationURL = @"https://your_app_name.azure-mobile.net/";
+ public const string ApplicationKey = @"YOUR_APP_KEY";
+ public const string SenderID = "YOUR_API_PROJ_NUMBER"; // Google API Project Number
+
+ // Azure app specific connection string and hub path
+ public const string ConnectionString = "Endpoint=sb://quickstarthub-ns.servicebus.windows.net/;SharedAccessKeyName=DefaultFullSharedAccessSignature;SharedAccessKey=YOUR_ACCESS_KEY";
+ public const string NotificationHubPath = "QUICKSTARTHUB";
+ }
+}
+
diff --git a/Azure/NotificationHubs/Android/XamarinTodoQuickStart/GcmService.cs b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/GcmService.cs
new file mode 100644
index 000000000..362bac8df
--- /dev/null
+++ b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/GcmService.cs
@@ -0,0 +1,161 @@
+using System.Text;
+using Android.App;
+using Android.Content;
+using Android.Util;
+using Gcm.Client;
+using WindowsAzure.Messaging;
+using System.Diagnostics;
+using System.Collections.Generic;
+using System;
+
+
+//VERY VERY VERY IMPORTANT NOTE!!!!
+// Your package name MUST NOT start with an uppercase letter.
+// Android does not allow permissions to start with an upper case letter
+// If it does you will get a very cryptic error in logcat and it will not be obvious why you are crying!
+// So please, for the love of all that is kind on this earth, use a LOWERCASE first letter in your Package Name!!!!
+
+
+
+[assembly: Permission(Name = "@PACKAGE_NAME@.permission.C2D_MESSAGE")]
+[assembly: UsesPermission(Name = "@PACKAGE_NAME@.permission.C2D_MESSAGE")]
+[assembly: UsesPermission(Name = "com.google.android.c2dm.permission.RECEIVE")]
+
+//GET_ACCOUNTS is only needed for android versions 4.0.3 and below
+[assembly: UsesPermission(Name = "android.permission.GET_ACCOUNTS")]
+[assembly: UsesPermission(Name = "android.permission.INTERNET")]
+[assembly: UsesPermission(Name = "android.permission.WAKE_LOCK")]
+
+namespace XamarinTodoQuickStart
+{
+ //You must subclass this!
+ [BroadcastReceiver(Permission= Gcm.Client.Constants.PERMISSION_GCM_INTENTS)]
+ [IntentFilter(new string[] { Gcm.Client.Constants.INTENT_FROM_GCM_MESSAGE }, Categories = new string[] { "@PACKAGE_NAME@" })]
+ [IntentFilter(new string[] { Gcm.Client.Constants.INTENT_FROM_GCM_REGISTRATION_CALLBACK }, Categories = new string[] { "@PACKAGE_NAME@" })]
+ [IntentFilter(new string[] { Gcm.Client.Constants.INTENT_FROM_GCM_LIBRARY_RETRY }, Categories = new string[] { "@PACKAGE_NAME@" })]
+ public class PushHandlerBroadcastReceiver : GcmBroadcastReceiverBase
+ {
+ //IMPORTANT: Change this to your own Sender ID!
+ //The SENDER_ID is your Google API Console App Project ID.
+ // Be sure to get the right Project ID from your Google APIs Console. It's not the named project ID that appears in the Overview,
+ // but instead the numeric project id in the url: eg: https://code.google.com/apis/console/?pli=1#project:785671162406:overview
+ // where 785671162406 is the project id, which is the SENDER_ID to use!
+ public static string[] SENDER_IDS = new string[] { Constants.SenderID };
+
+ public const string TAG = "GoogleCloudMessaging";
+ }
+
+ [Service] //Must use the service tag
+ public class GcmService : GcmServiceBase
+ {
+ public static string RegistrationID { get; private set; }
+ static NotificationHub Hub { get; set; }
+
+ public GcmService() : base(PushHandlerBroadcastReceiver.SENDER_IDS)
+ {
+ Log.Info(PushHandlerBroadcastReceiver.TAG, "GcmService() constructor");
+ }
+
+ // called from
+ public static void Initialize(Context context)
+ {
+ Hub = new NotificationHub (Constants.NotificationHubPath, Constants.ConnectionString, context);
+ }
+ public static void Register(Context Context)
+ {
+ // Makes this easier to call from our Activity
+ GcmClient.Register (Context, PushHandlerBroadcastReceiver.SENDER_IDS);
+ }
+
+ protected override void OnRegistered (Context context, string registrationId)
+ {
+ Log.Verbose(PushHandlerBroadcastReceiver.TAG, "GCM Registered: " + registrationId);
+ RegistrationID = registrationId;
+
+ if (Hub != null)
+ Hub.Register (registrationId, "TEST");
+ }
+
+ protected override void OnUnRegistered (Context context, string registrationId)
+ {
+ if (Hub != null)
+ Hub.Unregister ();
+
+ Log.Verbose(PushHandlerBroadcastReceiver.TAG, "GCM Unregistered: " + registrationId);
+
+ createNotification("GcmService Unregistered...", "The device has been unregistered, Tap to View!");
+ }
+
+ protected override void OnMessage (Context context, Intent intent)
+ {
+ Log.Info(PushHandlerBroadcastReceiver.TAG, "GCM Message Received!");
+
+ var msg = new StringBuilder();
+
+ if (intent != null && intent.Extras != null)
+ {
+ foreach (var key in intent.Extras.KeySet())
+ msg.AppendLine(key + "=" + intent.Extras.Get(key).ToString());
+ }
+
+ //Store the message
+ var prefs = GetSharedPreferences(context.PackageName, FileCreationMode.Private);
+ var edit = prefs.Edit();
+ edit.PutString("last_msg", msg.ToString());
+ edit.Commit();
+
+ string message = intent.Extras.GetString("message");
+ if (!string.IsNullOrEmpty(message))
+ {
+ createNotification("New todo item!", "Todo item: " + message);
+ return;
+ }
+
+ string msg2 = intent.Extras.GetString("msg");
+ if (!string.IsNullOrEmpty(msg2))
+ {
+ createNotification("New hub message!", msg2);
+ return;
+ }
+
+ // createNotification("PushSharp-GCM Msg Rec'd", "Message Received for C2DM-Sharp... Tap to View!");
+ createNotification("Unknown message details", msg.ToString());
+ }
+
+ protected override bool OnRecoverableError (Context context, string errorId)
+ {
+ Log.Warn(PushHandlerBroadcastReceiver.TAG, "Recoverable Error: " + errorId);
+
+ return base.OnRecoverableError (context, errorId);
+ }
+
+ protected override void OnError (Context context, string errorId)
+ {
+ Log.Error(PushHandlerBroadcastReceiver.TAG, "GCM Error: " + errorId);
+ }
+
+ void createNotification(string title, string desc)
+ {
+ //Create notification
+ var notificationManager = GetSystemService(Context.NotificationService) as NotificationManager;
+
+ //Create an intent to show ui
+ var uiIntent = new Intent(this, typeof(TodoActivity));
+
+ //Create the notification
+ var notification = new Notification(Android.Resource.Drawable.SymActionEmail, title);
+
+ //Auto cancel will remove the notification once the user touches it
+ notification.Flags = NotificationFlags.AutoCancel;
+
+ //Set the notification info
+ //we use the pending intent, passing our ui intent over which will get called
+ //when the notification is tapped.
+ notification.SetLatestEventInfo(this, title, desc, PendingIntent.GetActivity(this, 0, uiIntent, 0));
+
+ //Show the notification
+ notificationManager.Notify(1, notification);
+ }
+ }
+}
+
diff --git a/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Properties/AndroidManifest.xml b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Properties/AndroidManifest.xml
new file mode 100644
index 000000000..9a7d53ce4
--- /dev/null
+++ b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Properties/AndroidManifest.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Properties/AssemblyInfo.cs b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..2bc8c83f4
--- /dev/null
+++ b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Properties/AssemblyInfo.cs
@@ -0,0 +1,28 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using Android.App;
+
+// Information about this assembly is defined by the following attributes.
+// Change them to the values specific to your project.
+
+[assembly: AssemblyTitle("XamarinTodoQuickStart")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("Xamarin")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
+// The form "{Major}.{Minor}.*" will automatically update the build and revision,
+// and "{Major}.{Minor}.{Build}.*" will update just the revision.
+
+[assembly: AssemblyVersion("1.0.0")]
+
+// The following attributes are used to specify the signing key for the assembly,
+// if desired. See the Mono documentation for more information about signing.
+
+//[assembly: AssemblyDelaySign(false)]
+//[assembly: AssemblyKeyFile("")]
+
diff --git a/SoMA/Components/xamarin.mobile-0.6.2.1/samples/Xamarin.Mobile.Android.Samples/GeolocationSample/Resources/AboutResources.txt b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/AboutResources.txt
similarity index 100%
rename from SoMA/Components/xamarin.mobile-0.6.2.1/samples/Xamarin.Mobile.Android.Samples/GeolocationSample/Resources/AboutResources.txt
rename to Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/AboutResources.txt
diff --git a/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/Resource.designer.cs b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/Resource.designer.cs
new file mode 100644
index 000000000..9ced019cb
--- /dev/null
+++ b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/Resource.designer.cs
@@ -0,0 +1,234 @@
+#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("XamarinTodoQuickStart.Resource", IsApplication=true)]
+
+namespace XamarinTodoQuickStart
+{
+
+
+ [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()
+ {
+ global::Gcm.Client.Resource.String.library_name = global::XamarinTodoQuickStart.Resource.String.library_name;
+ global::Xamarin.Auth._MobileServices.Resource.Animation.slide_in_right = global::XamarinTodoQuickStart.Resource.Animation.slide_in_right;
+ global::Xamarin.Auth._MobileServices.Resource.Animation.slide_out_left = global::XamarinTodoQuickStart.Resource.Animation.slide_out_left;
+ global::Xamarin.Auth._MobileServices.Resource.Drawable.ic_arrow_back = global::XamarinTodoQuickStart.Resource.Drawable.ic_arrow_back;
+ global::Xamarin.Auth._MobileServices.Resource.Id.webview = global::XamarinTodoQuickStart.Resource.Id.webview;
+ global::Xamarin.Auth._MobileServices.Resource.Layout.activity_webview = global::XamarinTodoQuickStart.Resource.Layout.activity_webview;
+ global::Xamarin.Auth._MobileServices.Resource.String.ApplicationName = global::XamarinTodoQuickStart.Resource.String.ApplicationName;
+ global::Xamarin.Auth._MobileServices.Resource.String.Hello = global::XamarinTodoQuickStart.Resource.String.Hello;
+ global::Xamarin.Auth._MobileServices.Resource.String.title_activity_webview = global::XamarinTodoQuickStart.Resource.String.title_activity_webview;
+ global::PCLCrypto.Resource.String.ApplicationName = global::XamarinTodoQuickStart.Resource.String.ApplicationName;
+ global::PCLCrypto.Resource.String.Hello = global::XamarinTodoQuickStart.Resource.String.Hello;
+ }
+
+ public partial class Animation
+ {
+
+ // aapt resource value: 0x7f040000
+ public const int slide_in_right = 2130968576;
+
+ // aapt resource value: 0x7f040001
+ public const int slide_out_left = 2130968577;
+
+ static Animation()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Animation()
+ {
+ }
+ }
+
+ public partial class Attribute
+ {
+
+ static Attribute()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Attribute()
+ {
+ }
+ }
+
+ public partial class Drawable
+ {
+
+ // aapt resource value: 0x7f020000
+ public const int ic_arrow_back = 2130837504;
+
+ // aapt resource value: 0x7f020001
+ public const int ic_launcher = 2130837505;
+
+ static Drawable()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Drawable()
+ {
+ }
+ }
+
+ public partial class Id
+ {
+
+ // aapt resource value: 0x7f080000
+ public const int LinearLayout1 = 2131230720;
+
+ // aapt resource value: 0x7f080004
+ public const int buttonAddTodo = 2131230724;
+
+ // aapt resource value: 0x7f080007
+ public const int checkTodoItem = 2131230727;
+
+ // aapt resource value: 0x7f080005
+ public const int listViewTodo = 2131230725;
+
+ // aapt resource value: 0x7f080002
+ public const int loadingProgressBar = 2131230722;
+
+ // aapt resource value: 0x7f080008
+ public const int menu_refresh = 2131230728;
+
+ // aapt resource value: 0x7f080003
+ public const int textNewTodo = 2131230723;
+
+ // aapt resource value: 0x7f080001
+ public const int textViewTitle = 2131230721;
+
+ // aapt resource value: 0x7f080006
+ public const int webview = 2131230726;
+
+ static Id()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Id()
+ {
+ }
+ }
+
+ public partial class Layout
+ {
+
+ // aapt resource value: 0x7f030000
+ public const int Activity_To_Do = 2130903040;
+
+ // aapt resource value: 0x7f030001
+ public const int activity_webview = 2130903041;
+
+ // aapt resource value: 0x7f030002
+ public const int Row_List_To_Do = 2130903042;
+
+ static Layout()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Layout()
+ {
+ }
+ }
+
+ public partial class Menu
+ {
+
+ // aapt resource value: 0x7f070000
+ public const int activity_main = 2131165184;
+
+ static Menu()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Menu()
+ {
+ }
+ }
+
+ public partial class String
+ {
+
+ // aapt resource value: 0x7f050002
+ public const int ApplicationName = 2131034114;
+
+ // aapt resource value: 0x7f050001
+ public const int Hello = 2131034113;
+
+ // aapt resource value: 0x7f050006
+ public const int add_button_text = 2131034118;
+
+ // aapt resource value: 0x7f050005
+ public const int add_textbox_hint = 2131034117;
+
+ // aapt resource value: 0x7f050000
+ public const int app_name = 2131034112;
+
+ // aapt resource value: 0x7f050009
+ public const int checkbox_text = 2131034121;
+
+ // aapt resource value: 0x7f050004
+ public const int library_name = 2131034116;
+
+ // aapt resource value: 0x7f050008
+ public const int menu_refresh = 2131034120;
+
+ // aapt resource value: 0x7f050007
+ public const int mobile_services = 2131034119;
+
+ // aapt resource value: 0x7f050003
+ public const int title_activity_webview = 2131034115;
+
+ static String()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private String()
+ {
+ }
+ }
+
+ public partial class Style
+ {
+
+ // aapt resource value: 0x7f060000
+ public const int AppBaseTheme = 2131099648;
+
+ // aapt resource value: 0x7f060001
+ public const int AppTheme = 2131099649;
+
+ static Style()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Style()
+ {
+ }
+ }
+ }
+}
+#pragma warning restore 1591
diff --git a/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/drawable-hdpi/ic_launcher.png b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/drawable-hdpi/ic_launcher.png
new file mode 100644
index 000000000..b2f7c2b5f
Binary files /dev/null and b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/drawable-hdpi/ic_launcher.png differ
diff --git a/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/drawable-ldpi/ic_launcher.png b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/drawable-ldpi/ic_launcher.png
new file mode 100644
index 000000000..c2219b558
Binary files /dev/null and b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/drawable-ldpi/ic_launcher.png differ
diff --git a/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/drawable-mdpi/ic_launcher.png b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/drawable-mdpi/ic_launcher.png
new file mode 100644
index 000000000..b2c79b7ed
Binary files /dev/null and b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/drawable-mdpi/ic_launcher.png differ
diff --git a/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/drawable-xhdpi/ic_launcher.png b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 000000000..fc4b43087
Binary files /dev/null and b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/drawable-xhdpi/ic_launcher.png differ
diff --git a/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/layout/Activity_To_Do.axml b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/layout/Activity_To_Do.axml
new file mode 100644
index 000000000..2e8775ee8
--- /dev/null
+++ b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/layout/Activity_To_Do.axml
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/layout/Row_List_To_Do.axml b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/layout/Row_List_To_Do.axml
new file mode 100644
index 000000000..bc3facc8d
--- /dev/null
+++ b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/layout/Row_List_To_Do.axml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/menu/activity_main.xml b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/menu/activity_main.xml
new file mode 100644
index 000000000..2ca5582b0
--- /dev/null
+++ b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/menu/activity_main.xml
@@ -0,0 +1,5 @@
+
\ No newline at end of file
diff --git a/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/values-v11/styles.xml b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/values-v11/styles.xml
new file mode 100644
index 000000000..541752f6e
--- /dev/null
+++ b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/values-v11/styles.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/values-v14/styles.xml b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/values-v14/styles.xml
new file mode 100644
index 000000000..f20e01501
--- /dev/null
+++ b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/values-v14/styles.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/values/Strings.xml b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/values/Strings.xml
new file mode 100644
index 000000000..634eeecdf
--- /dev/null
+++ b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/values/Strings.xml
@@ -0,0 +1,9 @@
+
+
+ XamarinTodoQuickStart
+ Add a Todo item
+ Add
+ Mobile App
+ Refresh
+ Item Text
+
diff --git a/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/values/styles.xml b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/values/styles.xml
new file mode 100644
index 000000000..4a10ca492
--- /dev/null
+++ b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/Resources/values/styles.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/NotificationHubs/Android/XamarinTodoQuickStart/TodoActivity.cs b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/TodoActivity.cs
new file mode 100644
index 000000000..b607a31cb
--- /dev/null
+++ b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/TodoActivity.cs
@@ -0,0 +1,214 @@
+using System;
+using Android.OS;
+using Android.App;
+using Android.Views;
+using Android.Widget;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using Microsoft.WindowsAzure.MobileServices;
+using Gcm.Client;
+using System.Net.Http;
+
+namespace XamarinTodoQuickStart
+{
+ [Activity (MainLauncher = true,
+ Icon="@drawable/ic_launcher", Label="@string/app_name",
+ Theme="@style/AppTheme")]
+ public class TodoActivity : Activity
+ {
+ private MobileServiceClient client; // Mobile Service Client reference
+ private IMobileServiceTable todoTable; // Mobile Service Table used to access data
+
+ private TodoItemAdapter adapter; // Adapter to sync the items list with the view
+ private EditText textNewTodo; // EditText containing the "New Todo" text
+ private ProgressBar progressBar; // Progress spinner to use for table operations
+
+ // Called when the activity initially gets created
+ protected override async void OnCreate(Bundle bundle)
+ {
+ base.OnCreate(bundle);
+
+ // Set our view from the "main" layout resource
+ SetContentView(Resource.Layout.Activity_To_Do);
+
+ // Initialize the progress bar
+ progressBar = FindViewById(Resource.Id.loadingProgressBar);
+ progressBar.Visibility = ViewStates.Gone;
+
+ // Create ProgressFilter to handle busy state
+ var progressHandler = new ProgressHandler ();
+ progressHandler.BusyStateChange += (busy) => {
+ if (progressBar != null)
+ progressBar.Visibility = busy ? ViewStates.Visible : ViewStates.Gone;
+ };
+
+ try
+ {
+ // PUSH NOTIFICATIONS: Register for push notifications
+ System.Diagnostics.Debug.WriteLine("Registering...");
+ // Initialize our Gcm Service Hub
+ GcmService.Initialize(this);
+ GcmService.Register(this);
+
+
+ // MOBILE SERVICES: Setup azure mobile services - this is separate from push notifications
+ CurrentPlatform.Init ();
+ // Create the Mobile Service Client instance, using the provided
+ // Mobile Service URL and key
+ client = new MobileServiceClient(
+ Constants.ApplicationURL,
+ progressHandler);
+
+ // Get the Mobile Service Table instance to use
+ todoTable = client.GetTable();
+
+
+ // USER INTERFACE: setup the Android UI
+ textNewTodo = FindViewById(Resource.Id.textNewTodo);
+
+ // Create an adapter to bind the items with the view
+ adapter = new TodoItemAdapter(this, Resource.Layout.Row_List_To_Do);
+ var listViewTodo = FindViewById(Resource.Id.listViewTodo);
+ listViewTodo.Adapter = adapter;
+
+ // Load the items from the Mobile Service
+ await RefreshItemsFromTableAsync();
+ }
+ catch (Java.Net.MalformedURLException)
+ {
+ CreateAndShowDialog(new Exception ("There was an error creating the Mobile Service. Verify the URL"), "Error");
+ }
+ catch (Exception e)
+ {
+ CreateAndShowDialog(e, "Error");
+ }
+ }
+
+ // Initializes the activity menu
+ public override bool OnCreateOptionsMenu(IMenu menu)
+ {
+ MenuInflater.Inflate(Resource.Menu.activity_main, menu);
+ return true;
+ }
+
+ // Select an option from the menu
+ public override bool OnOptionsItemSelected(IMenuItem item)
+ {
+ if (item.ItemId == Resource.Id.menu_refresh) {
+ OnRefreshItemsSelected();
+ }
+ return true;
+ }
+
+ // Called when the refresh menu opion is selected
+ async void OnRefreshItemsSelected()
+ {
+ await RefreshItemsFromTableAsync();
+ }
+
+ // Refresh the list with the items in the Mobile Service Table
+ async Task RefreshItemsFromTableAsync()
+ {
+ try {
+ // Get the items that weren't marked as completed and add them in the adapter
+ var list = await todoTable.Where(item => item.Complete == false).ToListAsync ();
+
+ adapter.Clear ();
+
+ foreach (TodoItem current in list)
+ adapter.Add(current);
+
+ }
+ catch (Exception e)
+ {
+ CreateAndShowDialog(e, "Error");
+ }
+ }
+
+ public async Task CheckItem(TodoItem item)
+ {
+ if (client == null)
+ return;
+
+ // Set the item as completed and update it in the table
+ item.Complete = true;
+ try {
+ await todoTable.UpdateAsync(item);
+ if (item.Complete)
+ adapter.Remove(item);
+
+ } catch (Exception e) {
+ CreateAndShowDialog(e, "Error");
+ }
+ }
+
+ [Java.Interop.Export()]
+ public async void AddItem(View view)
+ {
+ if (client == null || string.IsNullOrWhiteSpace(textNewTodo.Text)) {
+ return;
+ }
+
+ // Create a new item
+ var item = new TodoItem() {
+ Text = textNewTodo.Text,
+ Complete = false,
+ RegistrationId = GcmService.RegistrationID
+ };
+
+ try {
+ // Insert the new item
+ await todoTable.InsertAsync(item);
+
+ if (!item.Complete) {
+ adapter.Add(item);
+ }
+ } catch (Exception e) {
+ CreateAndShowDialog(e, "Error");
+ }
+
+ textNewTodo.Text = "";
+ }
+
+ void CreateAndShowDialog(Exception exception, String title)
+ {
+ CreateAndShowDialog(exception.Message, title);
+ }
+
+ void CreateAndShowDialog(string message, string title)
+ {
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+
+ builder.SetMessage(message);
+ builder.SetTitle(title);
+ builder.Create().Show();
+ }
+
+ class ProgressHandler : DelegatingHandler
+ {
+ int busyCount = 0;
+
+ public event Action BusyStateChange;
+
+ #region implemented abstract members of HttpMessageHandler
+
+ protected override async Task SendAsync (HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
+ {
+ //assumes always executes on UI thread
+ if (busyCount++ == 0 && BusyStateChange != null)
+ BusyStateChange (true);
+
+ var response = await base.SendAsync (request, cancellationToken);
+
+ // assumes always executes on UI thread
+ if (--busyCount == 0 && BusyStateChange != null)
+ BusyStateChange (false);
+
+ return response;
+ }
+
+ #endregion
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/Azure/NotificationHubs/Android/XamarinTodoQuickStart/TodoItem.cs b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/TodoItem.cs
new file mode 100644
index 000000000..92617bf60
--- /dev/null
+++ b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/TodoItem.cs
@@ -0,0 +1,31 @@
+using System;
+using Newtonsoft.Json;
+
+namespace XamarinTodoQuickStart
+{
+ public class TodoItem
+ {
+ // Tables created prior to November 2013 should use 'int' type. Check your configuration.
+ public string Id { get; set; }
+
+ [JsonProperty(PropertyName = "channel")]
+ public string RegistrationId { get; set; }
+
+ [JsonProperty(PropertyName = "text")]
+ public string Text { get; set; }
+
+ [JsonProperty(PropertyName = "complete")]
+ public bool Complete { get; set; }
+ }
+
+ public class TodoItemWrapper : Java.Lang.Object
+ {
+ public TodoItem TodoItem { get; private set; }
+
+ public TodoItemWrapper(TodoItem item)
+ {
+ this.TodoItem = item;
+ }
+ }
+}
+
diff --git a/Azure/NotificationHubs/Android/XamarinTodoQuickStart/TodoItemAdapter.cs b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/TodoItemAdapter.cs
new file mode 100644
index 000000000..e692594e2
--- /dev/null
+++ b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/TodoItemAdapter.cs
@@ -0,0 +1,100 @@
+using System;
+using Android.App;
+using Android.Views;
+using Android.Widget;
+using System.Collections.Generic;
+using XamarinTodoQuickStart;
+
+namespace XamarinTodoQuickStart
+{
+ public class TodoItemAdapter : BaseAdapter
+ {
+ // Private Variables
+ private Activity activity;
+ private int layoutResourceId;
+ private List items = new List();
+
+ // Constructor
+ public TodoItemAdapter(Activity activity, int layoutResourceId)
+ {
+ this.activity = activity;
+ this.layoutResourceId = layoutResourceId;
+ }
+
+ // Returns the view for a specific item on the list
+ public override View GetView(int position, Android.Views.View convertView, Android.Views.ViewGroup parent)
+ {
+ var row = convertView;
+ var currentItem = this[position];
+ CheckBox checkBox;
+
+ if (row == null)
+ {
+ var inflater = activity.LayoutInflater;
+ row = inflater.Inflate(layoutResourceId, parent, false);
+
+ checkBox = row.FindViewById(Resource.Id.checkTodoItem);
+
+ checkBox.CheckedChange += async (sender, e) => {
+ var cbSender = sender as CheckBox;
+ if (cbSender != null && cbSender.Tag is TodoItemWrapper && cbSender.Checked)
+ {
+ cbSender.Enabled = false;
+
+ if (activity is TodoActivity)
+ await ((TodoActivity)activity).CheckItem((cbSender.Tag as TodoItemWrapper).TodoItem);
+ }
+ };
+ }
+ else
+ {
+ checkBox = row.FindViewById(Resource.Id.checkTodoItem);
+ }
+
+ checkBox.Text = currentItem.Text;
+ checkBox.Checked = false;
+ checkBox.Enabled = true;
+ checkBox.Tag = new TodoItemWrapper(currentItem);
+
+ return row;
+ }
+
+ public void Add(TodoItem item)
+ {
+ items.Add(item);
+ NotifyDataSetChanged();
+ }
+
+ public void Clear()
+ {
+ items.Clear();
+ NotifyDataSetChanged();
+ }
+
+ public void Remove(TodoItem item)
+ {
+ items.Remove(item);
+ NotifyDataSetChanged();
+ }
+
+ #region implemented abstract members of BaseAdapter
+
+ public override long GetItemId(int position)
+ {
+ return position; // PK changed to GUID
+ }
+
+ public override int Count
+ {
+ get { return items.Count; }
+ }
+
+ public override TodoItem this[int position]
+ {
+ get { return items[position]; }
+ }
+
+ #endregion
+ }
+}
+
diff --git a/Azure/NotificationHubs/Android/XamarinTodoQuickStart/XamarinTodoQuickStart.Android.csproj b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/XamarinTodoQuickStart.Android.csproj
new file mode 100644
index 000000000..0807b1f86
--- /dev/null
+++ b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/XamarinTodoQuickStart.Android.csproj
@@ -0,0 +1,119 @@
+
+
+
+ Debug
+ AnyCPU
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}
+ {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ Library
+ XamarinTodoQuickStart
+ True
+ Resources\Resource.designer.cs
+ Resource
+ Resources
+ Assets
+ ZUMOAPPNAME
+ Properties\AndroidManifest.xml
+ v8.1
+ true
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ None
+ false
+ Xamarin.Android.Net.AndroidClientHandler
+ btls
+
+
+ full
+ true
+ bin\Release
+ prompt
+ 4
+ false
+ false
+
+
+
+
+
+
+
+
+
+
+ ..\packages\Xamarin.Azure.NotificationHubs.Android.0.4.0\lib\MonoAndroid403\Xamarin.Azure.NotificationHubs.Android.dll
+
+
+ ..\packages\Newtonsoft.Json.11.0.2\lib\netstandard2.0\Newtonsoft.Json.dll
+
+
+ ..\packages\Xamarin.Android.GCMClient.1.0.0\lib\MonoAndroid\GCM.Client.dll
+
+
+ ..\packages\PInvoke.Windows.Core.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Windows.Core.dll
+
+
+ ..\packages\PInvoke.Kernel32.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Kernel32.dll
+
+
+ ..\packages\PInvoke.BCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.BCrypt.dll
+
+
+ ..\packages\PInvoke.NCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.NCrypt.dll
+
+
+ ..\packages\Validation.2.2.8\lib\dotnet\Validation.dll
+
+
+ ..\packages\PCLCrypto.2.0.147\lib\MonoAndroid23\PCLCrypto.dll
+
+
+ ..\packages\Xamarin.Android.Support.v4.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v4.dll
+
+
+ ..\packages\Xamarin.Android.Support.CustomTabs.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.CustomTabs.dll
+
+
+ ..\packages\Microsoft.Azure.Mobile.Client.4.0.2\lib\monoandroid70\Microsoft.Azure.Mobile.Client.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/NotificationHubs/Android/XamarinTodoQuickStart/packages.config b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/packages.config
new file mode 100644
index 000000000..4813bbb4b
--- /dev/null
+++ b/Azure/NotificationHubs/Android/XamarinTodoQuickStart/packages.config
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/NotificationHubs/Metadata.xml b/Azure/NotificationHubs/Metadata.xml
new file mode 100644
index 000000000..2f04e9d9d
--- /dev/null
+++ b/Azure/NotificationHubs/Metadata.xml
@@ -0,0 +1,11 @@
+
+
+ dd3d64af-657e-4bbd-bd76-7d9fbfa4ebca
+ false
+ Beginner
+ Cloud
+ Android, iOS
+ Indie
+ Microsoft Azure sample NotificationHubs
+ false
+
diff --git a/Azure/NotificationHubs/iOS/NotificationHubQuickStart.sln b/Azure/NotificationHubs/iOS/NotificationHubQuickStart.sln
new file mode 100644
index 000000000..f9f3da57a
--- /dev/null
+++ b/Azure/NotificationHubs/iOS/NotificationHubQuickStart.sln
@@ -0,0 +1,32 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NotificationHubQuickStart", "NotificationHubQuickStart\NotificationHubQuickStart.csproj", "{25B40672-487A-4A77-BBD1-509770E3205C}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|iPhoneSimulator = Debug|iPhoneSimulator
+ Release|iPhoneSimulator = Release|iPhoneSimulator
+ Debug|iPhone = Debug|iPhone
+ Release|iPhone = Release|iPhone
+ Ad-Hoc|iPhone = Ad-Hoc|iPhone
+ AppStore|iPhone = AppStore|iPhone
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {25B40672-487A-4A77-BBD1-509770E3205C}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone
+ {25B40672-487A-4A77-BBD1-509770E3205C}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone
+ {25B40672-487A-4A77-BBD1-509770E3205C}.AppStore|iPhone.ActiveCfg = AppStore|iPhone
+ {25B40672-487A-4A77-BBD1-509770E3205C}.AppStore|iPhone.Build.0 = AppStore|iPhone
+ {25B40672-487A-4A77-BBD1-509770E3205C}.Debug|iPhone.ActiveCfg = Debug|iPhone
+ {25B40672-487A-4A77-BBD1-509770E3205C}.Debug|iPhone.Build.0 = Debug|iPhone
+ {25B40672-487A-4A77-BBD1-509770E3205C}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
+ {25B40672-487A-4A77-BBD1-509770E3205C}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
+ {25B40672-487A-4A77-BBD1-509770E3205C}.Release|iPhone.ActiveCfg = Release|iPhone
+ {25B40672-487A-4A77-BBD1-509770E3205C}.Release|iPhone.Build.0 = Release|iPhone
+ {25B40672-487A-4A77-BBD1-509770E3205C}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
+ {25B40672-487A-4A77-BBD1-509770E3205C}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
+ EndGlobalSection
+ GlobalSection(MonoDevelopProperties) = preSolution
+ StartupItem = NotificationHubQuickStart\NotificationHubQuickStart.csproj
+ EndGlobalSection
+EndGlobal
diff --git a/Azure/NotificationHubs/iOS/NotificationHubQuickStart/AppDelegate.cs b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/AppDelegate.cs
new file mode 100644
index 000000000..5919f8528
--- /dev/null
+++ b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/AppDelegate.cs
@@ -0,0 +1,131 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Foundation;
+using UIKit;
+using WindowsAzure.Messaging;
+
+
+namespace NotificationHubQuickStart
+{
+ // The UIApplicationDelegate for the application. This class is responsible for launching the
+ // User Interface of the application, as well as listening (and optionally responding) to
+ // application events from iOS.
+ [Register("AppDelegate")]
+ public partial class AppDelegate : UIApplicationDelegate
+ {
+ private SBNotificationHub Hub { get; set; }
+
+ // class-level declarations
+ public override UIWindow Window
+ {
+ get;
+ set;
+ }
+ // This method is invoked when the application is about to move from active to inactive state.
+ // OpenGL applications should use this method to pause.
+ public override void OnResignActivation(UIApplication application)
+ {
+ }
+ // This method should be used to release shared resources and it should store the application state.
+ // If your application supports background exection this method is called instead of WillTerminate
+ // when the user quits.
+ public override void DidEnterBackground(UIApplication application)
+ {
+ }
+
+ /// This method is called as part of the transiton from background to active state.
+ public override void WillEnterForeground(UIApplication application)
+ {
+ }
+
+ /// This method is called when the application is about to terminate. Save data, if needed.
+ public override void WillTerminate(UIApplication application)
+ {
+ }
+
+ public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
+ {
+ // NOTE: Don't call the base implementation on a Model class
+ // see https://docs.microsoft.com/xamarin/ios/app-fundamentals/delegates-protocols-and-events
+
+ UIRemoteNotificationType notificationTypes = UIRemoteNotificationType.Alert |
+ UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound;
+ UIApplication.SharedApplication.RegisterForRemoteNotificationTypes(notificationTypes);
+
+ return true;
+ }
+
+ public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken)
+ {
+ // NOTE: Don't call the base implementation on a Model class
+ // see https://docs.microsoft.com/xamarin/ios/app-fundamentals/delegates-protocols-and-events
+
+ Hub = new SBNotificationHub(Constants.ConnectionString, Constants.NotificationHubPath);
+
+ Hub.UnregisterAllAsync (deviceToken, (error) => {
+ if (error != null)
+ {
+ Console.WriteLine("Error calling Unregister: {0}", error.ToString());
+ return;
+ }
+
+ NSSet tags = null; // create tags if you want
+ Hub.RegisterNativeAsync(deviceToken, tags, (errorCallback) => {
+ if (errorCallback != null)
+ Console.WriteLine("RegisterNativeAsync error: " + errorCallback.ToString());
+ });
+ });
+ }
+
+ public override void FailedToRegisterForRemoteNotifications(UIApplication application, NSError error)
+ {
+ // NOTE: Don't call the base implementation on a Model class
+ // see https://docs.microsoft.com/xamarin/ios/app-fundamentals/delegates-protocols-and-events
+
+ /*
+ // TODO:: error handling for failed registration (ex: no internet connection)
+ var alert = new UIAlertView("Error registering push notifications", error.LocalizedDescription, null, "OK", null);
+ alert.Show();
+ */
+ Console.WriteLine("Failed to register for remote notifications");
+ }
+
+ public override void ReceivedRemoteNotification(UIApplication application, NSDictionary userInfo)
+ {
+ ProcessNotification(userInfo, false);
+ }
+
+ void ProcessNotification(NSDictionary options, bool fromFinishedLaunching)
+ {
+ // Check to see if the dictionary has the aps key. This is the notification payload you would have sent
+ if (null != options && options.ContainsKey(new NSString("aps")))
+ {
+ //Get the aps dictionary
+ NSDictionary aps = options.ObjectForKey(new NSString("aps")) as NSDictionary;
+
+ string alert = string.Empty;
+
+ //Extract the alert text
+ //NOTE: If you're using the simple alert by just specifying " aps:{alert:"alert msg here"} "
+ // this will work fine. But if you're using a complex alert with Localization keys, etc., your "alert" object from the aps dictionary
+ // will be another NSDictionary... Basically the json gets dumped right into a NSDictionary, so keep that in mind
+ if (aps.ContainsKey(new NSString("alert")))
+ alert = (aps [new NSString("alert")] as NSString).ToString();
+
+ //If this came from the ReceivedRemoteNotification while the app was running,
+ // we of course need to manually process things like the sound, badge, and alert.
+ if (!fromFinishedLaunching)
+ {
+ //Manually show an alert
+ if (!string.IsNullOrEmpty(alert))
+ {
+ UIAlertView avAlert = new UIAlertView("Notification", alert, null, "OK", null);
+ avAlert.Show();
+ }
+ }
+ }
+ }
+ }
+}
+
diff --git a/Azure/NotificationHubs/iOS/NotificationHubQuickStart/Assets.xcassets/AppIcon.appiconset/Contents.json b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 000000000..d77296819
--- /dev/null
+++ b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,205 @@
+{
+ "images": [
+ {
+ "size": "20x20",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "20x20",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "filename": "Icon_58.png",
+ "size": "29x29",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "29x29",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "40x40",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "40x40",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "filename": "Icon_120.png",
+ "size": "60x60",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "60x60",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "20x20",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "20x20",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "29x29",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "29x29",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "40x40",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "40x40",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "83.5x83.5",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "filename": "Icon_76.png",
+ "size": "76x76",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "76x76",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "1024x1024",
+ "scale": "1x",
+ "idiom": "ios-marketing"
+ },
+ {
+ "role": "notificationCenter",
+ "size": "24x24",
+ "subtype": "38mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "notificationCenter",
+ "size": "27.5x27.5",
+ "subtype": "42mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "companionSettings",
+ "size": "29x29",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "companionSettings",
+ "size": "29x29",
+ "scale": "3x",
+ "idiom": "watch"
+ },
+ {
+ "role": "appLauncher",
+ "size": "40x40",
+ "subtype": "38mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "longLook",
+ "size": "44x44",
+ "subtype": "42mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "quickLook",
+ "size": "86x86",
+ "subtype": "38mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "quickLook",
+ "size": "98x98",
+ "subtype": "42mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "size": "16x16",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "16x16",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "size": "32x32",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "32x32",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "size": "128x128",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "128x128",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "size": "256x256",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "256x256",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "size": "512x512",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "512x512",
+ "scale": "2x",
+ "idiom": "mac"
+ }
+ ],
+ "info": {
+ "version": 1,
+ "author": "xcode"
+ }
+}
\ No newline at end of file
diff --git a/Azure/NotificationHubs/iOS/NotificationHubQuickStart/Assets.xcassets/AppIcon.appiconset/Icon.png b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/Assets.xcassets/AppIcon.appiconset/Icon.png
new file mode 100755
index 000000000..652acddf5
Binary files /dev/null and b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/Assets.xcassets/AppIcon.appiconset/Icon.png differ
diff --git a/Azure/NotificationHubs/iOS/NotificationHubQuickStart/Assets.xcassets/AppIcon.appiconset/Icon@2x.png b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/Assets.xcassets/AppIcon.appiconset/Icon@2x.png
new file mode 100755
index 000000000..116eeabd2
Binary files /dev/null and b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/Assets.xcassets/AppIcon.appiconset/Icon@2x.png differ
diff --git a/Azure/NotificationHubs/iOS/NotificationHubQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_120.png b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_120.png
new file mode 100755
index 000000000..6a06e6ff8
Binary files /dev/null and b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_120.png differ
diff --git a/Azure/NotificationHubs/iOS/NotificationHubQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_58.png b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_58.png
new file mode 100755
index 000000000..a69958c06
Binary files /dev/null and b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_58.png differ
diff --git a/Azure/NotificationHubs/iOS/NotificationHubQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_76.png b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_76.png
new file mode 100755
index 000000000..09898ad19
Binary files /dev/null and b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_76.png differ
diff --git a/Azure/NotificationHubs/iOS/NotificationHubQuickStart/Constants.cs b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/Constants.cs
new file mode 100644
index 000000000..0ef978890
--- /dev/null
+++ b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/Constants.cs
@@ -0,0 +1,12 @@
+using System;
+
+namespace NotificationHubQuickStart
+{
+ public static class Constants
+ {
+ // Azure app specific connection string and hub path
+ public const string ConnectionString = "Endpoint=sb://quickstarthub-ns.servicebus.windows.net/;SharedAccessKeyName=DefaultListenSharedAccessSignature;SharedAccessKey=YOUR_ACCESS_KEY";
+ public const string NotificationHubPath = "QUICKSTARTHUB";
+ }
+}
+
diff --git a/Azure/NotificationHubs/iOS/NotificationHubQuickStart/Entitlements.plist b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/Entitlements.plist
new file mode 100644
index 000000000..903def2af
--- /dev/null
+++ b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/Entitlements.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ aps-environment
+ development
+
+
diff --git a/Azure/NotificationHubs/iOS/NotificationHubQuickStart/Info.plist b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/Info.plist
new file mode 100644
index 000000000..39f785b1a
--- /dev/null
+++ b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/Info.plist
@@ -0,0 +1,44 @@
+
+
+
+
+ CFBundleDisplayName
+ NotificationHubQuickStart
+ CFBundleIdentifier
+ co.conceptdev.NotificationHubQuickStart
+ MinimumOSVersion
+ 11.0
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UIMainStoryboardFile
+ MainStoryboard_iPhone
+ UIMainStoryboardFile~ipad
+ MainStoryboard_iPad
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ CFBundleName
+ NotificationHubQuickStart
+ CFBundleShortVersionString
+ 1
+ CFBundleVersion
+ 1
+ UILaunchStoryboardName
+ LaunchScreen
+ XSAppIconAssets
+ Assets.xcassets/AppIcon.appiconset
+
+
diff --git a/Azure/NotificationHubs/iOS/NotificationHubQuickStart/Main.cs b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/Main.cs
new file mode 100644
index 000000000..33ee855e0
--- /dev/null
+++ b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/Main.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Foundation;
+using UIKit;
+
+namespace NotificationHubQuickStart
+{
+ public class Application
+ {
+ // This is the main entry point of the application.
+ static void Main(string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main(args, null, "AppDelegate");
+ }
+ }
+}
diff --git a/Azure/NotificationHubs/iOS/NotificationHubQuickStart/MainStoryboard_iPad.storyboard b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/MainStoryboard_iPad.storyboard
new file mode 100644
index 000000000..25582546c
--- /dev/null
+++ b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/MainStoryboard_iPad.storyboard
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Azure/NotificationHubs/iOS/NotificationHubQuickStart/MainStoryboard_iPhone.storyboard b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/MainStoryboard_iPhone.storyboard
new file mode 100644
index 000000000..1dc5e178c
--- /dev/null
+++ b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/MainStoryboard_iPhone.storyboard
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Azure/NotificationHubs/iOS/NotificationHubQuickStart/NotificationHubQuickStart.csproj b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/NotificationHubQuickStart.csproj
new file mode 100644
index 000000000..3859b6926
--- /dev/null
+++ b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/NotificationHubQuickStart.csproj
@@ -0,0 +1,139 @@
+
+
+
+ Debug
+ iPhoneSimulator
+ 8.0.30703
+ 2.0
+ {25B40672-487A-4A77-BBD1-509770E3205C}
+ {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ Exe
+ NotificationHubQuickStart
+ Resources
+ NotificationHubQuickStart
+ Xamarin.iOS
+ v1.0
+
+
+ true
+ full
+ false
+ bin\iPhoneSimulator\Debug
+ DEBUG;
+ prompt
+ 4
+ false
+ SdkOnly
+ Entitlements.plist
+ true
+ NSUrlSessionHandler
+ iPhone Developer
+ x86_64
+
+
+ full
+ true
+ bin\iPhoneSimulator\Release
+ prompt
+ 4
+ SdkOnly
+ false
+ Entitlements.plist
+ NSUrlSessionHandler
+ x86_64
+
+
+ true
+ full
+ false
+ bin\iPhone\Debug
+ DEBUG;
+ prompt
+ 4
+ false
+ Entitlements.plist
+ true
+ iPhone Developer
+
+
+ ARM64
+ NSUrlSessionHandler
+
+
+ full
+ true
+ bin\iPhone\Release
+ prompt
+ 4
+ Entitlements.plist
+ false
+ iPhone Developer
+ ARM64
+ NSUrlSessionHandler
+
+
+ full
+ true
+ bin\iPhone\Ad-Hoc
+ prompt
+ 4
+ false
+ Entitlements.plist
+ true
+ Automatic:AdHoc
+ iPhone Distribution
+ ARMv7, ARM64
+ NSUrlSessionHandler
+
+
+ full
+ true
+ bin\iPhone\AppStore
+ prompt
+ 4
+ iPhone Distribution
+ Entitlements.plist
+ false
+ Automatic:AppStore
+ ARMv7, ARM64
+ NSUrlSessionHandler
+
+
+
+
+
+
+
+ ..\packages\Newtonsoft.Json.9.0.1\lib\portable-net45+wp80+win8+wpa81\Newtonsoft.Json.dll
+
+
+ ..\packages\Xamarin.Azure.NotificationHubs.iOS.1.2.5.2\lib\Xamarin.iOS10\Xamarin.Azure.NotificationHubs.iOS.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ NotificationHubQuickStartViewController.cs
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/NotificationHubs/iOS/NotificationHubQuickStart/NotificationHubQuickStartViewController.cs b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/NotificationHubQuickStartViewController.cs
new file mode 100644
index 000000000..f52d9b30d
--- /dev/null
+++ b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/NotificationHubQuickStartViewController.cs
@@ -0,0 +1,71 @@
+using System;
+using CoreGraphics;
+using Foundation;
+using UIKit;
+
+namespace NotificationHubQuickStart
+{
+ public partial class NotificationHubQuickStartViewController : UIViewController
+ {
+ static bool UserInterfaceIdiomIsPhone
+ {
+ get { return UIDevice.CurrentDevice.UserInterfaceIdiom == UIUserInterfaceIdiom.Phone; }
+ }
+
+ public NotificationHubQuickStartViewController(IntPtr handle) : base (handle)
+ {
+ }
+
+ public override void DidReceiveMemoryWarning()
+ {
+ // Releases the view if it doesn't have a superview.
+ base.DidReceiveMemoryWarning();
+
+ // Release any cached data, images, etc that aren't in use.
+ }
+
+ #region View lifecycle
+
+ public override void ViewDidLoad()
+ {
+ base.ViewDidLoad();
+
+ // Perform any additional setup after loading the view, typically from a nib.
+ }
+
+ public override void ViewWillAppear(bool animated)
+ {
+ base.ViewWillAppear(animated);
+ }
+
+ public override void ViewDidAppear(bool animated)
+ {
+ base.ViewDidAppear(animated);
+ }
+
+ public override void ViewWillDisappear(bool animated)
+ {
+ base.ViewWillDisappear(animated);
+ }
+
+ public override void ViewDidDisappear(bool animated)
+ {
+ base.ViewDidDisappear(animated);
+ }
+
+ #endregion
+
+ public override bool ShouldAutorotateToInterfaceOrientation(UIInterfaceOrientation toInterfaceOrientation)
+ {
+ // Return true for supported orientations
+ if (UserInterfaceIdiomIsPhone)
+ {
+ return (toInterfaceOrientation != UIInterfaceOrientation.PortraitUpsideDown);
+ } else
+ {
+ return true;
+ }
+ }
+ }
+}
+
diff --git a/Azure/NotificationHubs/iOS/NotificationHubQuickStart/NotificationHubQuickStartViewController.designer.cs b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/NotificationHubQuickStartViewController.designer.cs
new file mode 100644
index 000000000..3da9ca4d5
--- /dev/null
+++ b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/NotificationHubQuickStartViewController.designer.cs
@@ -0,0 +1,20 @@
+// WARNING
+//
+// This file has been generated automatically by Visual Studio from the outlets and
+// actions declared in your storyboard file.
+// Manual changes to this file will not be maintained.
+//
+using Foundation;
+using System;
+using System.CodeDom.Compiler;
+
+namespace NotificationHubQuickStart
+{
+ [Register ("NotificationHubQuickStartViewController")]
+ partial class NotificationHubQuickStartViewController
+ {
+ void ReleaseDesignerOutlets ()
+ {
+ }
+ }
+}
\ No newline at end of file
diff --git a/Azure/NotificationHubs/iOS/NotificationHubQuickStart/Resources/LaunchScreen.xib b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/Resources/LaunchScreen.xib
new file mode 100644
index 000000000..9ca3deadd
--- /dev/null
+++ b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/Resources/LaunchScreen.xib
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/NotificationHubs/iOS/NotificationHubQuickStart/packages.config b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/packages.config
new file mode 100644
index 000000000..85e259e57
--- /dev/null
+++ b/Azure/NotificationHubs/iOS/NotificationHubQuickStart/packages.config
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/NotificationHubs/readme.md b/Azure/NotificationHubs/readme.md
new file mode 100644
index 000000000..b5cb94d06
--- /dev/null
+++ b/Azure/NotificationHubs/readme.md
@@ -0,0 +1,14 @@
+Notification Hubs
+=====================
+
+using Microsoft Azure and Xamarin
+-------------------------------
+
+### Android
+
+**NOTE:** Google Cloud Messaging is now deprecated and replaced by Firebase.
+
+- NuGet: https://www.nuget.org/packages/Xamarin.Firebase.Messaging/
+- Sample: https://github.com/xamarin/GooglePlayServicesComponents/tree/master/firebase-messaging/samples
+
+This sample is no longer the current way to do notifications with Android.
\ No newline at end of file
diff --git a/Azure/README.md b/Azure/README.md
new file mode 100644
index 000000000..1df310dd6
--- /dev/null
+++ b/Azure/README.md
@@ -0,0 +1,17 @@
+Azure samples using Xamarin
+===========================
+
+Sample code associated with the [Xamarin-Microsoft Azure docs](http://developer.xamarin.com/guides/cross-platform/azure/mobile-services/):
+
+* Getting Started
+* Getting Started with Data
+* Validate, Modify, and Augment Data in Scripts
+* Get Started with Users
+* Get Started with Notification Hubs
+
+Also referenced on the [Azure Xamarin Developer Center](http://azure.microsoft.com/en-us/develop/mobile/xamarin/) for [iOS](http://azure.microsoft.com/en-us/documentation/articles/partner-xamarin-mobile-services-how-to-use-client-library/) and [Android](http://azure.microsoft.com/en-us/documentation/articles/partner-xamarin-mobile-services-how-to-use-client-library/).
+
+
+Author
+------
+Craig Dunn
\ No newline at end of file
diff --git a/Azure/ValidateModifyData/Android/XamarinTodoQuickStart.Android.sln b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart.Android.sln
new file mode 100644
index 000000000..207f1fe34
--- /dev/null
+++ b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart.Android.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XamarinTodoQuickStart.Android", "XamarinTodoQuickStart\XamarinTodoQuickStart.Android.csproj", "{8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(MonoDevelopProperties) = preSolution
+ StartupItem = XamarinTodoQuickStart\XamarinTodoQuickStart.Android.csproj
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Assets/AboutAssets.txt b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Assets/AboutAssets.txt
new file mode 100644
index 000000000..a9b0638eb
--- /dev/null
+++ b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Assets/AboutAssets.txt
@@ -0,0 +1,19 @@
+Any raw assets you want to be deployed with your application can be placed in
+this directory (and child directories) and given a Build Action of "AndroidAsset".
+
+These files will be deployed with your package and will be accessible using Android's
+AssetManager, like this:
+
+public class ReadAsset : Activity
+{
+ protected override void OnCreate (Bundle bundle)
+ {
+ base.OnCreate (bundle);
+
+ InputStream input = Assets.Open ("my_asset.txt");
+ }
+}
+
+Additionally, some Android functions will automatically load asset files:
+
+Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf");
diff --git a/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Constants.cs b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Constants.cs
new file mode 100644
index 000000000..46b722e7f
--- /dev/null
+++ b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Constants.cs
@@ -0,0 +1,11 @@
+using System;
+
+namespace XamarinTodoQuickStart
+{
+ public static class Constants
+ {
+ // Azure app specific URL and key
+ public const string ApplicationURL = @"https://your_app_name.azurewebsites.net/";
+ }
+}
+
diff --git a/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Properties/AndroidManifest.xml b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Properties/AndroidManifest.xml
new file mode 100644
index 000000000..3d22b16f0
--- /dev/null
+++ b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Properties/AndroidManifest.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Properties/AssemblyInfo.cs b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..2bc8c83f4
--- /dev/null
+++ b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Properties/AssemblyInfo.cs
@@ -0,0 +1,28 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using Android.App;
+
+// Information about this assembly is defined by the following attributes.
+// Change them to the values specific to your project.
+
+[assembly: AssemblyTitle("XamarinTodoQuickStart")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("Xamarin")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
+// The form "{Major}.{Minor}.*" will automatically update the build and revision,
+// and "{Major}.{Minor}.{Build}.*" will update just the revision.
+
+[assembly: AssemblyVersion("1.0.0")]
+
+// The following attributes are used to specify the signing key for the assembly,
+// if desired. See the Mono documentation for more information about signing.
+
+//[assembly: AssemblyDelaySign(false)]
+//[assembly: AssemblyKeyFile("")]
+
diff --git a/SoMA/Components/xamarin.mobile-0.7.1/samples/Xamarin.Mobile.Android.Samples/GeolocationSample/Resources/AboutResources.txt b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/AboutResources.txt
similarity index 100%
rename from SoMA/Components/xamarin.mobile-0.7.1/samples/Xamarin.Mobile.Android.Samples/GeolocationSample/Resources/AboutResources.txt
rename to Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/AboutResources.txt
diff --git a/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/Resource.designer.cs b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/Resource.designer.cs
new file mode 100644
index 000000000..3ad7a6304
--- /dev/null
+++ b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/Resource.designer.cs
@@ -0,0 +1,230 @@
+#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("XamarinTodoQuickStart.Resource", IsApplication=true)]
+
+namespace XamarinTodoQuickStart
+{
+
+
+ [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()
+ {
+ global::Xamarin.Auth._MobileServices.Resource.Animation.slide_in_right = global::XamarinTodoQuickStart.Resource.Animation.slide_in_right;
+ global::Xamarin.Auth._MobileServices.Resource.Animation.slide_out_left = global::XamarinTodoQuickStart.Resource.Animation.slide_out_left;
+ global::Xamarin.Auth._MobileServices.Resource.Drawable.ic_arrow_back = global::XamarinTodoQuickStart.Resource.Drawable.ic_arrow_back;
+ global::Xamarin.Auth._MobileServices.Resource.Id.webview = global::XamarinTodoQuickStart.Resource.Id.webview;
+ global::Xamarin.Auth._MobileServices.Resource.Layout.activity_webview = global::XamarinTodoQuickStart.Resource.Layout.activity_webview;
+ global::Xamarin.Auth._MobileServices.Resource.String.ApplicationName = global::XamarinTodoQuickStart.Resource.String.ApplicationName;
+ global::Xamarin.Auth._MobileServices.Resource.String.Hello = global::XamarinTodoQuickStart.Resource.String.Hello;
+ global::Xamarin.Auth._MobileServices.Resource.String.title_activity_webview = global::XamarinTodoQuickStart.Resource.String.title_activity_webview;
+ global::PCLCrypto.Resource.String.ApplicationName = global::XamarinTodoQuickStart.Resource.String.ApplicationName;
+ global::PCLCrypto.Resource.String.Hello = global::XamarinTodoQuickStart.Resource.String.Hello;
+ }
+
+ public partial class Animation
+ {
+
+ // aapt resource value: 0x7f040000
+ public const int slide_in_right = 2130968576;
+
+ // aapt resource value: 0x7f040001
+ public const int slide_out_left = 2130968577;
+
+ static Animation()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Animation()
+ {
+ }
+ }
+
+ public partial class Attribute
+ {
+
+ static Attribute()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Attribute()
+ {
+ }
+ }
+
+ public partial class Drawable
+ {
+
+ // aapt resource value: 0x7f020000
+ public const int ic_arrow_back = 2130837504;
+
+ // aapt resource value: 0x7f020001
+ public const int ic_launcher = 2130837505;
+
+ static Drawable()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Drawable()
+ {
+ }
+ }
+
+ public partial class Id
+ {
+
+ // aapt resource value: 0x7f080000
+ public const int LinearLayout1 = 2131230720;
+
+ // aapt resource value: 0x7f080004
+ public const int buttonAddTodo = 2131230724;
+
+ // aapt resource value: 0x7f080007
+ public const int checkTodoItem = 2131230727;
+
+ // aapt resource value: 0x7f080005
+ public const int listViewTodo = 2131230725;
+
+ // aapt resource value: 0x7f080002
+ public const int loadingProgressBar = 2131230722;
+
+ // aapt resource value: 0x7f080008
+ public const int menu_refresh = 2131230728;
+
+ // aapt resource value: 0x7f080003
+ public const int textNewTodo = 2131230723;
+
+ // aapt resource value: 0x7f080001
+ public const int textViewTitle = 2131230721;
+
+ // aapt resource value: 0x7f080006
+ public const int webview = 2131230726;
+
+ static Id()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Id()
+ {
+ }
+ }
+
+ public partial class Layout
+ {
+
+ // aapt resource value: 0x7f030000
+ public const int Activity_To_Do = 2130903040;
+
+ // aapt resource value: 0x7f030001
+ public const int activity_webview = 2130903041;
+
+ // aapt resource value: 0x7f030002
+ public const int Row_List_To_Do = 2130903042;
+
+ static Layout()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Layout()
+ {
+ }
+ }
+
+ public partial class Menu
+ {
+
+ // aapt resource value: 0x7f070000
+ public const int activity_main = 2131165184;
+
+ static Menu()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Menu()
+ {
+ }
+ }
+
+ public partial class String
+ {
+
+ // aapt resource value: 0x7f050001
+ public const int ApplicationName = 2131034113;
+
+ // aapt resource value: 0x7f050000
+ public const int Hello = 2131034112;
+
+ // aapt resource value: 0x7f050005
+ public const int add_button_text = 2131034117;
+
+ // aapt resource value: 0x7f050004
+ public const int add_textbox_hint = 2131034116;
+
+ // aapt resource value: 0x7f050003
+ public const int app_name = 2131034115;
+
+ // aapt resource value: 0x7f050008
+ public const int checkbox_text = 2131034120;
+
+ // aapt resource value: 0x7f050007
+ public const int menu_refresh = 2131034119;
+
+ // aapt resource value: 0x7f050006
+ public const int mobile_services = 2131034118;
+
+ // aapt resource value: 0x7f050002
+ public const int title_activity_webview = 2131034114;
+
+ static String()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private String()
+ {
+ }
+ }
+
+ public partial class Style
+ {
+
+ // aapt resource value: 0x7f060000
+ public const int AppBaseTheme = 2131099648;
+
+ // aapt resource value: 0x7f060001
+ public const int AppTheme = 2131099649;
+
+ static Style()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Style()
+ {
+ }
+ }
+ }
+}
+#pragma warning restore 1591
diff --git a/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/drawable-hdpi/ic_launcher.png b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/drawable-hdpi/ic_launcher.png
new file mode 100644
index 000000000..b2f7c2b5f
Binary files /dev/null and b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/drawable-hdpi/ic_launcher.png differ
diff --git a/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/drawable-ldpi/ic_launcher.png b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/drawable-ldpi/ic_launcher.png
new file mode 100644
index 000000000..c2219b558
Binary files /dev/null and b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/drawable-ldpi/ic_launcher.png differ
diff --git a/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/drawable-mdpi/ic_launcher.png b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/drawable-mdpi/ic_launcher.png
new file mode 100644
index 000000000..b2c79b7ed
Binary files /dev/null and b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/drawable-mdpi/ic_launcher.png differ
diff --git a/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/drawable-xhdpi/ic_launcher.png b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 000000000..fc4b43087
Binary files /dev/null and b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/drawable-xhdpi/ic_launcher.png differ
diff --git a/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/layout/Activity_To_Do.axml b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/layout/Activity_To_Do.axml
new file mode 100644
index 000000000..2e8775ee8
--- /dev/null
+++ b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/layout/Activity_To_Do.axml
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/layout/Row_List_To_Do.axml b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/layout/Row_List_To_Do.axml
new file mode 100644
index 000000000..bc3facc8d
--- /dev/null
+++ b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/layout/Row_List_To_Do.axml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/menu/activity_main.xml b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/menu/activity_main.xml
new file mode 100644
index 000000000..2ca5582b0
--- /dev/null
+++ b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/menu/activity_main.xml
@@ -0,0 +1,5 @@
+
\ No newline at end of file
diff --git a/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/values-v11/styles.xml b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/values-v11/styles.xml
new file mode 100644
index 000000000..541752f6e
--- /dev/null
+++ b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/values-v11/styles.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/values-v14/styles.xml b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/values-v14/styles.xml
new file mode 100644
index 000000000..f20e01501
--- /dev/null
+++ b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/values-v14/styles.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/values/Strings.xml b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/values/Strings.xml
new file mode 100644
index 000000000..df1e39446
--- /dev/null
+++ b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/values/Strings.xml
@@ -0,0 +1,9 @@
+
+
+ XamarinTodoQuickStart
+ Add a Todo item
+ Add
+ Mobile Services
+ Refresh
+ Item Text
+
diff --git a/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/values/styles.xml b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/values/styles.xml
new file mode 100644
index 000000000..4a10ca492
--- /dev/null
+++ b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/Resources/values/styles.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/TodoActivity.cs b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/TodoActivity.cs
new file mode 100644
index 000000000..b57e1b1f3
--- /dev/null
+++ b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/TodoActivity.cs
@@ -0,0 +1,211 @@
+using System;
+using Android.OS;
+using Android.App;
+using Android.Views;
+using Android.Widget;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using Microsoft.WindowsAzure.MobileServices;
+using System.Net.Http;
+
+namespace XamarinTodoQuickStart
+{
+ [Activity (MainLauncher = true,
+ Icon="@drawable/ic_launcher", Label="@string/app_name",
+ Theme="@style/AppTheme")]
+ public class TodoActivity : Activity
+ {
+ private MobileServiceClient client; // Mobile Service Client reference
+ private IMobileServiceTable todoTable; // Mobile Service Table used to access data
+
+ private TodoItemAdapter adapter; // Adapter to sync the items list with the view
+ private EditText textNewTodo; // EditText containing the "New Todo" text
+ private ProgressBar progressBar; // Progress spinner to use for table operations
+
+ // Called when the activity initially gets created
+ protected override async void OnCreate(Bundle bundle)
+ {
+ base.OnCreate(bundle);
+
+ // Set our view from the "main" layout resource
+ SetContentView(Resource.Layout.Activity_To_Do);
+
+ // Initialize the progress bar
+ progressBar = FindViewById(Resource.Id.loadingProgressBar);
+ progressBar.Visibility = ViewStates.Gone;
+
+ // Create ProgressFilter to handle busy state
+ var progressHandler = new ProgressHandler ();
+ progressHandler.BusyStateChange += (busy) => {
+ if (progressBar != null)
+ progressBar.Visibility = busy ? ViewStates.Visible : ViewStates.Gone;
+ };
+
+ try
+ {
+ CurrentPlatform.Init ();
+ // Create the Mobile Service Client instance, using the provided
+ // Mobile Service URL and key
+ client = new MobileServiceClient(
+ Constants.ApplicationURL,
+ progressHandler);
+
+ // Get the Mobile Service Table instance to use
+ todoTable = client.GetTable();
+
+ textNewTodo = FindViewById(Resource.Id.textNewTodo);
+
+ // Create an adapter to bind the items with the view
+ adapter = new TodoItemAdapter(this, Resource.Layout.Row_List_To_Do);
+ var listViewTodo = FindViewById(Resource.Id.listViewTodo);
+ listViewTodo.Adapter = adapter;
+
+ // Load the items from the Mobile Service
+ await RefreshItemsFromTableAsync();
+
+ }
+ catch (Java.Net.MalformedURLException)
+ {
+ CreateAndShowDialog(new Exception ("There was an error creating the Mobile Service. Verify the URL"), "Error");
+ }
+ catch (Exception e)
+ {
+ CreateAndShowDialog(e, "Error");
+ }
+ }
+
+ // Initializes the activity menu
+ public override bool OnCreateOptionsMenu(IMenu menu)
+ {
+ MenuInflater.Inflate(Resource.Menu.activity_main, menu);
+ return true;
+ }
+
+ // Select an option from the menu
+ public override bool OnOptionsItemSelected(IMenuItem item)
+ {
+ if (item.ItemId == Resource.Id.menu_refresh) {
+ OnRefreshItemsSelected();
+ }
+ return true;
+ }
+
+ // Called when the refresh menu opion is selected
+ async void OnRefreshItemsSelected()
+ {
+ await RefreshItemsFromTableAsync();
+ }
+
+ // Refresh the list with the items in the Mobile Service Table
+ async Task RefreshItemsFromTableAsync()
+ {
+ try {
+ // Get the items that weren't marked as completed and add them in the adapter
+ var list = await todoTable.Where(item => item.Complete == false
+ && item.CreatedAt != null).ToListAsync();
+
+ adapter.Clear ();
+
+ foreach (TodoItem current in list)
+ adapter.Add(current);
+
+ }
+ catch (Exception e)
+ {
+ CreateAndShowDialog(e, "Error");
+ }
+ }
+
+ public async Task CheckItem(TodoItem item)
+ {
+ if (client == null)
+ return;
+
+ // Set the item as completed and update it in the table
+ item.Complete = true;
+ try {
+ await todoTable.UpdateAsync(item);
+ if (item.Complete)
+ adapter.Remove(item);
+
+ } catch (Exception e) {
+ CreateAndShowDialog(e, "Error");
+ }
+ }
+
+ [Java.Interop.Export()]
+ public async void AddItem(View view)
+ {
+ if (client == null || string.IsNullOrWhiteSpace(textNewTodo.Text)) {
+ return;
+ }
+
+ // Create a new item
+ var item = new TodoItem() {
+ Text = textNewTodo.Text,
+ Complete = false
+ };
+
+ try {
+ // Insert the new item
+ await todoTable.InsertAsync(item);
+
+ if (!item.Complete) {
+ adapter.Add(item);
+ }
+ }
+ /* TODO:: NOTE:: does not match WP8 example exactly, use exception handling below */
+ catch (MobileServiceInvalidOperationException e) {
+ CreateAndShowDialog(e.Response.Content.ToString(), "Error");
+ }
+ catch (Exception ex)
+ {
+ var exDetail = (ex.InnerException.InnerException as MobileServiceInvalidOperationException);
+ CreateAndShowDialog(exDetail, "Error");
+ }
+
+ textNewTodo.Text = "";
+ }
+
+ void CreateAndShowDialog(Exception exception, String title)
+ {
+ CreateAndShowDialog(exception.Message, title);
+ }
+
+ void CreateAndShowDialog(string message, string title)
+ {
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+
+ builder.SetMessage(message);
+ builder.SetTitle(title);
+ builder.Create().Show();
+ }
+
+ class ProgressHandler : DelegatingHandler
+ {
+ int busyCount = 0;
+
+ public event Action BusyStateChange;
+
+ #region implemented abstract members of HttpMessageHandler
+
+ protected override async Task SendAsync (HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
+ {
+ //assumes always executes on UI thread
+ if (busyCount++ == 0 && BusyStateChange != null)
+ BusyStateChange (true);
+
+ var response = await base.SendAsync (request, cancellationToken);
+
+ // assumes always executes on UI thread
+ if (--busyCount == 0 && BusyStateChange != null)
+ BusyStateChange (false);
+
+ return response;
+ }
+
+ #endregion
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/TodoItem.cs b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/TodoItem.cs
new file mode 100644
index 000000000..f2d753adf
--- /dev/null
+++ b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/TodoItem.cs
@@ -0,0 +1,31 @@
+using System;
+using Newtonsoft.Json;
+
+namespace XamarinTodoQuickStart
+{
+ public class TodoItem
+ {
+ // Tables created prior to November 2013 should use 'int' type. Check your configuration.
+ public string Id { get; set; }
+
+ [JsonProperty(PropertyName = "text")]
+ public string Text { get; set; }
+
+ [JsonProperty(PropertyName = "complete")]
+ public bool Complete { get; set; }
+
+ [JsonProperty(PropertyName = "createdAt")]
+ public DateTime? CreatedAt { get; set; }
+ }
+
+ public class TodoItemWrapper : Java.Lang.Object
+ {
+ public TodoItem TodoItem { get; private set; }
+
+ public TodoItemWrapper(TodoItem item)
+ {
+ this.TodoItem = item;
+ }
+ }
+}
+
diff --git a/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/TodoItemAdapter.cs b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/TodoItemAdapter.cs
new file mode 100644
index 000000000..ed9efa5f6
--- /dev/null
+++ b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/TodoItemAdapter.cs
@@ -0,0 +1,105 @@
+using System;
+using Android.App;
+using Android.Views;
+using Android.Widget;
+using System.Collections.Generic;
+using XamarinTodoQuickStart;
+
+namespace XamarinTodoQuickStart
+{
+ public class TodoItemAdapter : BaseAdapter
+ {
+ // Private Variables
+ private Activity activity;
+ private int layoutResourceId;
+ private List items = new List();
+
+ // Constructor
+ public TodoItemAdapter(Activity activity, int layoutResourceId)
+ {
+ this.activity = activity;
+ this.layoutResourceId = layoutResourceId;
+ }
+
+ // Returns the view for a specific item on the list
+ public override View GetView(int position, Android.Views.View convertView, Android.Views.ViewGroup parent)
+ {
+ var row = convertView;
+ var currentItem = this[position];
+ CheckBox checkBox;
+
+ if (row == null)
+ {
+ var inflater = activity.LayoutInflater;
+ row = inflater.Inflate(layoutResourceId, parent, false);
+
+ checkBox = row.FindViewById(Resource.Id.checkTodoItem);
+
+ checkBox.CheckedChange += async (sender, e) => {
+ var cbSender = sender as CheckBox;
+ if (cbSender != null && cbSender.Tag is TodoItemWrapper && cbSender.Checked)
+ {
+ cbSender.Enabled = false;
+
+ if (activity is TodoActivity)
+ await ((TodoActivity)activity).CheckItem((cbSender.Tag as TodoItemWrapper).TodoItem);
+ }
+ };
+ }
+ else
+ {
+ checkBox = row.FindViewById(Resource.Id.checkTodoItem);
+ }
+
+ string displayDate = "missing";
+ if (currentItem.CreatedAt.HasValue)
+ displayDate = currentItem.CreatedAt.Value.ToShortTimeString();
+
+ // Time created is added to the row/cell
+ checkBox.Text = string.Format("{0} - {1}", currentItem.Text, displayDate);
+ checkBox.Checked = false;
+ checkBox.Enabled = true;
+ checkBox.Tag = new TodoItemWrapper(currentItem);
+
+ return row;
+ }
+
+ public void Add(TodoItem item)
+ {
+ items.Add(item);
+ NotifyDataSetChanged();
+ }
+
+ public void Clear()
+ {
+ items.Clear();
+ NotifyDataSetChanged();
+ }
+
+ public void Remove(TodoItem item)
+ {
+ items.Remove(item);
+ NotifyDataSetChanged();
+ }
+
+ #region implemented abstract members of BaseAdapter
+
+ public override long GetItemId(int position)
+ {
+ return position;
+ }
+
+ public override int Count
+ {
+ get { return items.Count; }
+ }
+
+ public override TodoItem this[int position]
+ {
+ get { return items[position]; }
+ }
+
+ #endregion
+ }
+}
+
diff --git a/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/XamarinTodoQuickStart.Android.csproj b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/XamarinTodoQuickStart.Android.csproj
new file mode 100644
index 000000000..306e32c38
--- /dev/null
+++ b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/XamarinTodoQuickStart.Android.csproj
@@ -0,0 +1,114 @@
+
+
+
+ Debug
+ AnyCPU
+ 10.0.0
+ 2.0
+ {8E1FCCF4-1FA7-4C23-86B0-19C78B155AA3}
+ {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ Library
+ XamarinTodoQuickStart
+ True
+ Resources\Resource.designer.cs
+ Resource
+ Resources
+ Assets
+ ZUMOAPPNAME
+ Properties\AndroidManifest.xml
+ v8.1
+ true
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ None
+ false
+ Xamarin.Android.Net.AndroidClientHandler
+ btls
+
+
+ full
+ true
+ bin\Release
+ prompt
+ 4
+ false
+ false
+
+
+
+
+
+
+
+
+
+
+ ..\packages\Newtonsoft.Json.9.0.1\lib\portable-net45+wp80+win8+wpa81\Newtonsoft.Json.dll
+
+
+ ..\packages\PInvoke.Windows.Core.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Windows.Core.dll
+
+
+ ..\packages\PInvoke.Kernel32.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Kernel32.dll
+
+
+ ..\packages\PInvoke.BCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.BCrypt.dll
+
+
+ ..\packages\PInvoke.NCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.NCrypt.dll
+
+
+ ..\packages\Validation.2.2.8\lib\dotnet\Validation.dll
+
+
+ ..\packages\PCLCrypto.2.0.147\lib\MonoAndroid23\PCLCrypto.dll
+
+
+ ..\packages\Xamarin.Android.Support.v4.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v4.dll
+
+
+ ..\packages\Xamarin.Android.Support.CustomTabs.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.CustomTabs.dll
+
+
+ ..\packages\Microsoft.Azure.Mobile.Client.4.0.2\lib\monoandroid70\Microsoft.Azure.Mobile.Client.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/packages.config b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/packages.config
new file mode 100644
index 000000000..b65885357
--- /dev/null
+++ b/Azure/ValidateModifyData/Android/XamarinTodoQuickStart/packages.config
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/ValidateModifyData/Metadata.xml b/Azure/ValidateModifyData/Metadata.xml
new file mode 100644
index 000000000..2fd2bde8a
--- /dev/null
+++ b/Azure/ValidateModifyData/Metadata.xml
@@ -0,0 +1,11 @@
+
+
+ c7af241d-41a8-48a5-b83f-2a51738a07f4
+ false
+ Beginner
+ Cloud
+ Android, iOS
+ Indie
+ Microsoft Azure sample ValidateModifyData
+ false
+
diff --git a/Azure/ValidateModifyData/Screenshots/Android.png b/Azure/ValidateModifyData/Screenshots/Android.png
new file mode 100644
index 000000000..714464fc2
Binary files /dev/null and b/Azure/ValidateModifyData/Screenshots/Android.png differ
diff --git a/Azure/ValidateModifyData/Screenshots/iOS.png b/Azure/ValidateModifyData/Screenshots/iOS.png
new file mode 100644
index 000000000..8d7002a53
Binary files /dev/null and b/Azure/ValidateModifyData/Screenshots/iOS.png differ
diff --git a/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart.iOS.sln b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart.iOS.sln
new file mode 100644
index 000000000..85d684411
--- /dev/null
+++ b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart.iOS.sln
@@ -0,0 +1,43 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XamarinTodoQuickStart.iOS", "XamarinTodoQuickStart\XamarinTodoQuickStart.iOS.csproj", "{07F1CD1B-626F-4BE5-9840-97B44CBB94C9}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Ad-Hoc|iPhone = Ad-Hoc|iPhone
+ Ad-Hoc|iPhoneSimulator = Ad-Hoc|iPhoneSimulator
+ AppStore|iPhone = AppStore|iPhone
+ AppStore|iPhoneSimulator = AppStore|iPhoneSimulator
+ Debug|iPhone = Debug|iPhone
+ Debug|iPhoneSimulator = Debug|iPhoneSimulator
+ Release|iPhone = Release|iPhone
+ Release|iPhoneSimulator = Release|iPhoneSimulator
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Ad-Hoc|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.AppStore|iPhone.ActiveCfg = AppStore|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.AppStore|iPhone.Build.0 = AppStore|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.AppStore|iPhoneSimulator.Deploy.0 = AppStore|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Debug|iPhone.ActiveCfg = Debug|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Debug|iPhone.Build.0 = Debug|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Release|iPhone.ActiveCfg = Release|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Release|iPhone.Build.0 = Release|iPhone
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
+ EndGlobalSection
+ GlobalSection(MonoDevelopProperties) = preSolution
+ StartupItem = XamarinTodoQuickStart\XamarinTodoQuickStart.iOS.csproj
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/AppDelegate.cs b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/AppDelegate.cs
new file mode 100644
index 000000000..523f1e347
--- /dev/null
+++ b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/AppDelegate.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Foundation;
+using UIKit;
+
+namespace XamarinTodoQuickStart
+{
+ // The UIApplicationDelegate for the application. This class is responsible for launching the
+ // User Interface of the application, as well as listening (and optionally responding) to
+ // application events from iOS.
+ [Register ("AppDelegate")]
+ public partial class AppDelegate : UIApplicationDelegate
+ {
+ // class-level declarations
+ public override UIWindow Window {get; set;}
+ }
+}
+
diff --git a/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Contents.json b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 000000000..d77296819
--- /dev/null
+++ b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,205 @@
+{
+ "images": [
+ {
+ "size": "20x20",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "20x20",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "filename": "Icon_58.png",
+ "size": "29x29",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "29x29",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "40x40",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "40x40",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "filename": "Icon_120.png",
+ "size": "60x60",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "60x60",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "20x20",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "20x20",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "29x29",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "29x29",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "40x40",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "40x40",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "83.5x83.5",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "filename": "Icon_76.png",
+ "size": "76x76",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "76x76",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "1024x1024",
+ "scale": "1x",
+ "idiom": "ios-marketing"
+ },
+ {
+ "role": "notificationCenter",
+ "size": "24x24",
+ "subtype": "38mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "notificationCenter",
+ "size": "27.5x27.5",
+ "subtype": "42mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "companionSettings",
+ "size": "29x29",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "companionSettings",
+ "size": "29x29",
+ "scale": "3x",
+ "idiom": "watch"
+ },
+ {
+ "role": "appLauncher",
+ "size": "40x40",
+ "subtype": "38mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "longLook",
+ "size": "44x44",
+ "subtype": "42mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "quickLook",
+ "size": "86x86",
+ "subtype": "38mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "quickLook",
+ "size": "98x98",
+ "subtype": "42mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "size": "16x16",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "16x16",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "size": "32x32",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "32x32",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "size": "128x128",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "128x128",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "size": "256x256",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "256x256",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "size": "512x512",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "512x512",
+ "scale": "2x",
+ "idiom": "mac"
+ }
+ ],
+ "info": {
+ "version": 1,
+ "author": "xcode"
+ }
+}
\ No newline at end of file
diff --git a/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon.png b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon.png
new file mode 100755
index 000000000..652acddf5
Binary files /dev/null and b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon.png differ
diff --git a/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon@2x.png b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon@2x.png
new file mode 100755
index 000000000..116eeabd2
Binary files /dev/null and b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon@2x.png differ
diff --git a/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_120.png b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_120.png
new file mode 100755
index 000000000..6a06e6ff8
Binary files /dev/null and b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_120.png differ
diff --git a/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_58.png b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_58.png
new file mode 100755
index 000000000..a69958c06
Binary files /dev/null and b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_58.png differ
diff --git a/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_76.png b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_76.png
new file mode 100755
index 000000000..09898ad19
Binary files /dev/null and b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Assets.xcassets/AppIcon.appiconset/Icon_76.png differ
diff --git a/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Assets.xcassets/Icon_120.png b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Assets.xcassets/Icon_120.png
new file mode 100755
index 000000000..6a06e6ff8
Binary files /dev/null and b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Assets.xcassets/Icon_120.png differ
diff --git a/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Assets.xcassets/Icon_58.png b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Assets.xcassets/Icon_58.png
new file mode 100755
index 000000000..a69958c06
Binary files /dev/null and b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Assets.xcassets/Icon_58.png differ
diff --git a/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Assets.xcassets/Icon_76.png b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Assets.xcassets/Icon_76.png
new file mode 100755
index 000000000..09898ad19
Binary files /dev/null and b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Assets.xcassets/Icon_76.png differ
diff --git a/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Constants.cs b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Constants.cs
new file mode 100644
index 000000000..121ab922e
--- /dev/null
+++ b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Constants.cs
@@ -0,0 +1,11 @@
+using System;
+
+namespace XamarinTodoQuickStart
+{
+ public static class Constants
+ {
+ // Azure app specific URL and key
+ public const string ApplicationURL = @"https://your_app_name.azurewebsites.net/";
+ }
+}
+
diff --git a/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Info.plist b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Info.plist
new file mode 100644
index 000000000..dbef975f8
--- /dev/null
+++ b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Info.plist
@@ -0,0 +1,42 @@
+
+
+
+
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UIMainStoryboardFile
+ MainStoryboard_iPhone
+ UIMainStoryboardFile~ipad
+ MainStoryboard_iPad
+ MinimumOSVersion
+ 11.0
+ CFBundleName
+ ValidateModify
+ CFBundleIdentifier
+ com.xamarintest.azurequickstart.validate
+ CFBundleShortVersionString
+ 1
+ CFBundleVersion
+ 1
+ UILaunchStoryboardName
+ LaunchScreen
+ XSAppIconAssets
+ Assets.xcassets/AppIcon.appiconset
+
+
diff --git a/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Main.cs b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Main.cs
new file mode 100644
index 000000000..0ac4457b6
--- /dev/null
+++ b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Main.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Foundation;
+using UIKit;
+
+namespace XamarinTodoQuickStart
+{
+ public class Application
+ {
+ // This is the main entry point of the application.
+ static void Main(string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main(args, null, "AppDelegate");
+ }
+ }
+}
diff --git a/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/MainStoryboard_iPad.storyboard b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/MainStoryboard_iPad.storyboard
new file mode 100755
index 000000000..411b4eecb
--- /dev/null
+++ b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/MainStoryboard_iPad.storyboard
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/MainStoryboard_iPhone.storyboard b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/MainStoryboard_iPhone.storyboard
new file mode 100755
index 000000000..5894b2a4e
--- /dev/null
+++ b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/MainStoryboard_iPhone.storyboard
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Resources/Default.png b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Resources/Default.png
new file mode 100755
index 000000000..4c8ca6f69
Binary files /dev/null and b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Resources/Default.png differ
diff --git a/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Resources/Default@2x.png b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Resources/Default@2x.png
new file mode 100755
index 000000000..35b84cffe
Binary files /dev/null and b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Resources/Default@2x.png differ
diff --git a/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Resources/LaunchScreen.xib b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Resources/LaunchScreen.xib
new file mode 100644
index 000000000..9ca3deadd
--- /dev/null
+++ b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/Resources/LaunchScreen.xib
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/TodoItem.cs b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/TodoItem.cs
new file mode 100644
index 000000000..44869a5df
--- /dev/null
+++ b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/TodoItem.cs
@@ -0,0 +1,17 @@
+using System;
+using Newtonsoft.Json;
+
+namespace XamarinTodoQuickStart
+{
+ public class TodoItem
+ {
+ // Tables created prior to November 2013 should use 'int' type. Check your configuration.
+ public string Id { get; set; }
+
+ [JsonProperty(PropertyName = "text")]
+ public string Text { get; set; }
+
+ [JsonProperty(PropertyName = "complete")]
+ public bool Complete { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/TodoListViewController.cs b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/TodoListViewController.cs
new file mode 100644
index 000000000..a1bfda013
--- /dev/null
+++ b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/TodoListViewController.cs
@@ -0,0 +1,173 @@
+// This file has been autogenerated from parsing an Objective-C header file added in Xcode.
+using System;
+using Foundation;
+using UIKit;
+using System.Threading.Tasks;
+
+namespace XamarinTodoQuickStart
+{
+ public partial class TodoListViewController : UITableViewController
+ {
+ // Private Variables
+ private TodoService todoService;
+ private bool useRefreshControl = false;
+
+ // Constructor
+ public TodoListViewController(IntPtr handle) : base(handle)
+ {
+ }
+
+ public override async void ViewDidLoad()
+ {
+ base.ViewDidLoad();
+
+ todoService = TodoService.DefaultService;
+
+ todoService.BusyUpdate += (bool busy) => {
+ if (busy)
+ activityIndicator.StartAnimating();
+ else
+ activityIndicator.StopAnimating();
+ };
+
+ AddRefreshControl();
+
+ await RefreshAsync();
+ }
+
+ async Task RefreshAsync()
+ {
+ // only activate the refresh control if the feature is available
+ if (useRefreshControl)
+ RefreshControl.BeginRefreshing();
+
+ await todoService.RefreshDataAsync();
+
+ if (useRefreshControl)
+ RefreshControl.EndRefreshing();
+
+ TableView.ReloadData();
+ }
+
+ #region UITableView methods
+ public override nint RowsInSection(UITableView tableview, nint section)
+ {
+ if (todoService == null || todoService.Items == null)
+ return 0;
+
+ return todoService.Items.Count;
+ }
+
+ public override nint NumberOfSections(UITableView tableView)
+ {
+ return 1;
+ }
+
+ public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
+ {
+ const string CellIdentifier = @"Cell";
+ var cell = tableView.DequeueReusableCell(CellIdentifier);
+ if (cell == null) {
+ cell = new UITableViewCell(UITableViewCellStyle.Default, CellIdentifier);
+ }
+
+ // Set the label on the cell and make sure the label color is black (in case this cell
+ // has been reused and was previously greyed out
+ var label = (UILabel)cell.ViewWithTag(1);
+ label.TextColor = UIColor.Black;
+ label.Text = todoService.Items [indexPath.Row].Text;
+
+ return cell;
+ }
+
+ public override string TitleForDeleteConfirmation(UITableView tableView, NSIndexPath indexPath)
+ {
+ // Customize the Delete button to say "complete"
+ return @"complete";
+ }
+
+ public override UITableViewCellEditingStyle EditingStyleForRow(UITableView tableView, NSIndexPath indexPath)
+ {
+ // Find the item that is about to be edited
+ var item = todoService.Items[indexPath.Row];
+
+ // If the item is complete, then this is just pending upload. Editing is not allowed
+ if (item.Complete)
+ return UITableViewCellEditingStyle.None;
+
+ // Otherwise, allow the delete button to appear
+ return UITableViewCellEditingStyle.Delete;
+ }
+
+ public async override void CommitEditingStyle(UITableView tableView, UITableViewCellEditingStyle editingStyle, NSIndexPath indexPath)
+ {
+ // Find item that was commited for editing (completed)
+ var item = todoService.Items[indexPath.Row];
+
+ // Change the appearance to look greyed out until we remove the item
+ var label = (UILabel)TableView.CellAt(indexPath).ViewWithTag(1);
+ label.TextColor = UIColor.Gray;
+
+ // Ask the todoService to set the item's complete value to YES, and remove the row if successful
+ await todoService.CompleteItemAsync(item);
+
+ // Remove the row from the UITableView
+ tableView.DeleteRows(new [] { indexPath }, UITableViewRowAnimation.Top);
+ }
+
+ #endregion
+
+ #region UI Actions
+
+ async partial void OnAdd(NSObject sender)
+ {
+ if (string.IsNullOrWhiteSpace(itemText.Text))
+ return;
+
+ var newItem = new TodoItem() {
+ Text = itemText.Text,
+ Complete = false
+ };
+
+ int index = await todoService.InsertTodoItemAsync(newItem);
+ if (index != -1)
+ {
+ TableView.InsertRows(new [] { NSIndexPath.FromItemSection(index, 0) },
+ UITableViewRowAnimation.Top);
+
+ itemText.Text = "";
+ }
+ }
+
+ #endregion
+
+ #region UITextFieldDelegate methods
+
+ [Export ("textFieldShouldReturn:")]
+ public virtual bool ShouldReturn(UITextField textField)
+ {
+ textField.ResignFirstResponder();
+ return true;
+ }
+
+ #endregion
+
+ #region * iOS Specific Code
+
+ // This method will add the UIRefreshControl to the table view if
+ // it is available, ie, we are running on iOS 6+
+ private void AddRefreshControl()
+ {
+ if (UIDevice.CurrentDevice.CheckSystemVersion(6, 0)) {
+ // the refresh control is available, let's add it
+ RefreshControl = new UIRefreshControl();
+ RefreshControl.ValueChanged += async (sender, e) => {
+ await RefreshAsync();
+ };
+ useRefreshControl = true;
+ }
+ }
+
+ #endregion
+ }
+}
diff --git a/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/TodoListViewController.designer.cs b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/TodoListViewController.designer.cs
new file mode 100644
index 000000000..8c7c47d97
--- /dev/null
+++ b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/TodoListViewController.designer.cs
@@ -0,0 +1,36 @@
+// WARNING
+//
+// This file has been generated automatically by Xamarin Studio to store outlets and
+// actions made in the Xcode designer. If it is removed, they will be lost.
+// Manual changes to this file may not be handled correctly.
+//
+using Foundation;
+
+namespace XamarinTodoQuickStart
+{
+ [Register ("TodoListViewController")]
+ partial class TodoListViewController
+ {
+ [Outlet]
+ UIKit.UIActivityIndicatorView activityIndicator { get; set; }
+
+ [Outlet]
+ UIKit.UITextField itemText { get; set; }
+
+ [Action ("OnAdd:")]
+ partial void OnAdd (Foundation.NSObject sender);
+
+ void ReleaseDesignerOutlets ()
+ {
+ if (itemText != null) {
+ itemText.Dispose ();
+ itemText = null;
+ }
+
+ if (activityIndicator != null) {
+ activityIndicator.Dispose ();
+ activityIndicator = null;
+ }
+ }
+ }
+}
diff --git a/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/TodoService.cs b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/TodoService.cs
new file mode 100644
index 000000000..d3c23e519
--- /dev/null
+++ b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/TodoService.cs
@@ -0,0 +1,147 @@
+using System;
+using System.Net.Http;
+using System.Threading.Tasks;
+using System.Collections.Generic;
+using Microsoft.WindowsAzure.MobileServices;
+using UIKit;
+
+namespace XamarinTodoQuickStart
+{
+ public class TodoService : DelegatingHandler
+ {
+ private static TodoService todoServiceInstance = new TodoService();
+ public static TodoService DefaultService { get { return todoServiceInstance; } }
+
+ private MobileServiceClient client;
+ private IMobileServiceTable todoTable;
+
+ public List Items { get; private set;}
+ private int busyCount = 0;
+
+ // Public events
+ public event Action BusyUpdate;
+
+ // Constructor
+ protected TodoService()
+ {
+ Items = new List();
+
+ CurrentPlatform.Init ();
+ // Initialize the Mobile Service client with your URL and key
+ client = new MobileServiceClient(Constants.ApplicationURL);
+
+ // Create an MSTable instance to allow us to work with the TodoItem table
+ todoTable = client.GetTable ();
+ }
+
+ async public Task> RefreshDataAsync()
+ {
+ try
+ {
+ // This code refreshes the entries in the list view by querying the TodoItems table.
+ // The query excludes completed TodoItems
+ Items = await todoTable
+ .Where (todoItem => todoItem.Complete == false).ToListAsync();
+
+ }
+ catch (MobileServiceInvalidOperationException e)
+ {
+ Console.Error.WriteLine (@"ERROR {0}", e.Message);
+ return null;
+ }
+
+ return Items;
+ }
+
+ public async Task InsertTodoItemAsync(TodoItem todoItem)
+ {
+ try
+ {
+ // This code inserts a new TodoItem into the database. When the operation completes
+ // and Mobile Services has assigned an Id, the item is added to the CollectionView
+ await todoTable.InsertAsync(todoItem);
+
+ Items.Add(todoItem);
+
+ return Items.IndexOf(todoItem);
+
+ }
+ catch (MobileServiceInvalidOperationException e)
+ {
+ // In a previous version of Azure Mobile Services this exception was wrapped
+ // in an Exception. This is why I've duplicated the code for handling it,
+ // but probably for newer versions of Azure Mobile services you could
+ // have simpler exception handling.
+ Console.Error.WriteLine(@"ERROR {0}", e.Message);
+
+ UIAlertView alert = new UIAlertView() {
+ Title = "Error",
+ Message = e.Message
+ } ;
+ alert.AddButton("Ok");
+ alert.Show();
+
+ return -1;
+ }
+ catch (Exception ex)
+ {
+ var exDetail = (ex.InnerException.InnerException as MobileServiceInvalidOperationException);
+ Console.WriteLine(exDetail.Message);
+
+ UIAlertView alert = new UIAlertView() {
+ Title = "Error",
+ Message = exDetail.Message
+ } ;
+ alert.AddButton("Ok");
+ alert.Show();
+
+ return -1;
+ }
+ }
+
+ public async Task CompleteItemAsync(TodoItem item)
+ {
+ try
+ {
+ // This code takes a freshly completed TodoItem and updates the database. When the MobileService
+ // responds, the item is removed from the list
+ item.Complete = true;
+ await todoTable.UpdateAsync(item);
+ Items.Remove(item);
+
+ }
+ catch (MobileServiceInvalidOperationException e)
+ {
+ Console.Error.WriteLine (@"ERROR {0}", e.Message);
+ }
+ }
+
+ void Busy(bool busy)
+ {
+ // assumes always executes on UI thread
+ if (busy)
+ {
+ if (busyCount++ == 0 && BusyUpdate != null)
+ BusyUpdate(true);
+ }
+ else
+ {
+ if (--busyCount == 0 && BusyUpdate != null)
+ BusyUpdate(false);
+ }
+ }
+
+ #region implemented abstract members of HttpMessageHandler
+
+ protected override async Task SendAsync (System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
+ {
+ Busy (true);
+ var response = await base.SendAsync (request, cancellationToken);
+
+ Busy (false);
+ return response;
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/XamarinTodoQuickStart.iOS.csproj b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/XamarinTodoQuickStart.iOS.csproj
new file mode 100644
index 000000000..476a51cef
--- /dev/null
+++ b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/XamarinTodoQuickStart.iOS.csproj
@@ -0,0 +1,167 @@
+
+
+
+ Debug
+ iPhoneSimulator
+ {07F1CD1B-626F-4BE5-9840-97B44CBB94C9}
+ {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ Exe
+ XamarinTodoQuickStart
+ Resources
+ XamarinTodoQuickStart
+ Xamarin.iOS
+ v1.0
+
+
+ true
+ full
+ false
+ bin\iPhoneSimulator\Debug
+ DEBUG;
+ prompt
+ 4
+ SdkOnly
+ false
+ true
+
+ x86_64
+ NSUrlSessionHandler
+
+
+ full
+ true
+ bin\iPhoneSimulator\Release
+ prompt
+ 4
+ None
+ x86_64
+ false
+ NSUrlSessionHandler
+
+
+ true
+ full
+ false
+ bin\iPhone\Debug
+ DEBUG;
+ prompt
+ 4
+ true
+ false
+ iPhone Developer
+
+ ARM64
+ NSUrlSessionHandler
+
+
+ full
+ true
+ bin\iPhone\Release
+ prompt
+ 4
+ iPhone Developer
+ false
+ ARM64
+ NSUrlSessionHandler
+
+
+ full
+ true
+ bin\iPhone\Ad-Hoc
+ prompt
+ 4
+ iPhone Distribution
+ true
+ false
+ Automatic:AdHoc
+
+ ARM64
+ NSUrlSessionHandler
+
+
+ full
+ true
+ bin\iPhone\AppStore
+ prompt
+ 4
+ iPhone Distribution
+ false
+ Automatic:AppStore
+ ARM64
+ NSUrlSessionHandler
+
+
+
+
+
+
+
+
+
+ ..\packages\Newtonsoft.Json.9.0.1\lib\portable-net45+wp80+win8+wpa81\Newtonsoft.Json.dll
+
+
+ ..\packages\PInvoke.Windows.Core.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Windows.Core.dll
+
+
+ ..\packages\PInvoke.Kernel32.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Kernel32.dll
+
+
+ ..\packages\PInvoke.BCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.BCrypt.dll
+
+
+ ..\packages\PInvoke.NCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.NCrypt.dll
+
+
+ ..\packages\Validation.2.2.8\lib\dotnet\Validation.dll
+
+
+ ..\packages\PCLCrypto.2.0.147\lib\xamarinios10\PCLCrypto.dll
+
+
+ ..\packages\Microsoft.Azure.Mobile.Client.4.0.2\lib\xamarinios10\Microsoft.Azure.Mobile.Client.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TodoListViewController.cs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.3.1
+ False
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/packages.config b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/packages.config
new file mode 100644
index 000000000..06847c21c
--- /dev/null
+++ b/Azure/ValidateModifyData/iOS/XamarinTodoQuickStart/packages.config
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Azure/ValidateModifyData/readme.md b/Azure/ValidateModifyData/readme.md
new file mode 100644
index 000000000..708c7a2b4
--- /dev/null
+++ b/Azure/ValidateModifyData/readme.md
@@ -0,0 +1,5 @@
+Validate and Modify Data
+=====================
+
+using Windows Azure and Xamarin
+-------------------------------
diff --git a/BackgroundLocationDemo/BackgroundLocationDemo.sln b/BackgroundLocationDemo/BackgroundLocationDemo.sln
index 2efad049f..db456d94a 100644
--- a/BackgroundLocationDemo/BackgroundLocationDemo.sln
+++ b/BackgroundLocationDemo/BackgroundLocationDemo.sln
@@ -1,42 +1,38 @@
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.27703.2042
+MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Location.iOS", "Location.iOS\Location.iOS.csproj", "{D2D08A68-F3B6-4730-96F9-9053CD76B2A5}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Location.Droid", "Location.Android\Location.Droid.csproj", "{89E83FD6-327A-4976-B720-E28B0970F516}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Ad-Hoc|Any CPU = Ad-Hoc|Any CPU
+ Ad-Hoc|iPhone = Ad-Hoc|iPhone
+ Ad-Hoc|iPhoneSimulator = Ad-Hoc|iPhoneSimulator
+ AppStore|Any CPU = AppStore|Any CPU
+ AppStore|iPhone = AppStore|iPhone
+ AppStore|iPhoneSimulator = AppStore|iPhoneSimulator
Debug|Any CPU = Debug|Any CPU
- Release|Any CPU = Release|Any CPU
- Debug|iPhoneSimulator = Debug|iPhoneSimulator
- Release|iPhoneSimulator = Release|iPhoneSimulator
Debug|iPhone = Debug|iPhone
+ Debug|iPhoneSimulator = Debug|iPhoneSimulator
+ Release|Any CPU = Release|Any CPU
Release|iPhone = Release|iPhone
- Ad-Hoc|iPhone = Ad-Hoc|iPhone
- AppStore|iPhone = AppStore|iPhone
+ Release|iPhoneSimulator = Release|iPhoneSimulator
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {89E83FD6-327A-4976-B720-E28B0970F516}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
- {89E83FD6-327A-4976-B720-E28B0970F516}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
- {89E83FD6-327A-4976-B720-E28B0970F516}.AppStore|iPhone.ActiveCfg = Release|Any CPU
- {89E83FD6-327A-4976-B720-E28B0970F516}.AppStore|iPhone.Build.0 = Release|Any CPU
- {89E83FD6-327A-4976-B720-E28B0970F516}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {89E83FD6-327A-4976-B720-E28B0970F516}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {89E83FD6-327A-4976-B720-E28B0970F516}.Debug|iPhone.ActiveCfg = Debug|Any CPU
- {89E83FD6-327A-4976-B720-E28B0970F516}.Debug|iPhone.Build.0 = Debug|Any CPU
- {89E83FD6-327A-4976-B720-E28B0970F516}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
- {89E83FD6-327A-4976-B720-E28B0970F516}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
- {89E83FD6-327A-4976-B720-E28B0970F516}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {89E83FD6-327A-4976-B720-E28B0970F516}.Release|Any CPU.Build.0 = Release|Any CPU
- {89E83FD6-327A-4976-B720-E28B0970F516}.Release|iPhone.ActiveCfg = Release|Any CPU
- {89E83FD6-327A-4976-B720-E28B0970F516}.Release|iPhone.Build.0 = Release|Any CPU
- {89E83FD6-327A-4976-B720-E28B0970F516}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
- {89E83FD6-327A-4976-B720-E28B0970F516}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {D2D08A68-F3B6-4730-96F9-9053CD76B2A5}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|iPhoneSimulator
{D2D08A68-F3B6-4730-96F9-9053CD76B2A5}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone
{D2D08A68-F3B6-4730-96F9-9053CD76B2A5}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone
+ {D2D08A68-F3B6-4730-96F9-9053CD76B2A5}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator
+ {D2D08A68-F3B6-4730-96F9-9053CD76B2A5}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator
+ {D2D08A68-F3B6-4730-96F9-9053CD76B2A5}.AppStore|Any CPU.ActiveCfg = AppStore|iPhoneSimulator
{D2D08A68-F3B6-4730-96F9-9053CD76B2A5}.AppStore|iPhone.ActiveCfg = AppStore|iPhone
{D2D08A68-F3B6-4730-96F9-9053CD76B2A5}.AppStore|iPhone.Build.0 = AppStore|iPhone
+ {D2D08A68-F3B6-4730-96F9-9053CD76B2A5}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator
+ {D2D08A68-F3B6-4730-96F9-9053CD76B2A5}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator
{D2D08A68-F3B6-4730-96F9-9053CD76B2A5}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator
{D2D08A68-F3B6-4730-96F9-9053CD76B2A5}.Debug|Any CPU.Build.0 = Debug|iPhoneSimulator
{D2D08A68-F3B6-4730-96F9-9053CD76B2A5}.Debug|iPhone.ActiveCfg = Debug|iPhone
@@ -49,6 +45,41 @@ Global
{D2D08A68-F3B6-4730-96F9-9053CD76B2A5}.Release|iPhone.Build.0 = Release|iPhone
{D2D08A68-F3B6-4730-96F9-9053CD76B2A5}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
{D2D08A68-F3B6-4730-96F9-9053CD76B2A5}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
+ {89E83FD6-327A-4976-B720-E28B0970F516}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
+ {89E83FD6-327A-4976-B720-E28B0970F516}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
+ {89E83FD6-327A-4976-B720-E28B0970F516}.Ad-Hoc|Any CPU.Deploy.0 = Debug|Any CPU
+ {89E83FD6-327A-4976-B720-E28B0970F516}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
+ {89E83FD6-327A-4976-B720-E28B0970F516}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
+ {89E83FD6-327A-4976-B720-E28B0970F516}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {89E83FD6-327A-4976-B720-E28B0970F516}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {89E83FD6-327A-4976-B720-E28B0970F516}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Debug|Any CPU
+ {89E83FD6-327A-4976-B720-E28B0970F516}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
+ {89E83FD6-327A-4976-B720-E28B0970F516}.AppStore|Any CPU.Build.0 = Debug|Any CPU
+ {89E83FD6-327A-4976-B720-E28B0970F516}.AppStore|Any CPU.Deploy.0 = Debug|Any CPU
+ {89E83FD6-327A-4976-B720-E28B0970F516}.AppStore|iPhone.ActiveCfg = Release|Any CPU
+ {89E83FD6-327A-4976-B720-E28B0970F516}.AppStore|iPhone.Build.0 = Release|Any CPU
+ {89E83FD6-327A-4976-B720-E28B0970F516}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {89E83FD6-327A-4976-B720-E28B0970F516}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {89E83FD6-327A-4976-B720-E28B0970F516}.AppStore|iPhoneSimulator.Deploy.0 = Debug|Any CPU
+ {89E83FD6-327A-4976-B720-E28B0970F516}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {89E83FD6-327A-4976-B720-E28B0970F516}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {89E83FD6-327A-4976-B720-E28B0970F516}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {89E83FD6-327A-4976-B720-E28B0970F516}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {89E83FD6-327A-4976-B720-E28B0970F516}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {89E83FD6-327A-4976-B720-E28B0970F516}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {89E83FD6-327A-4976-B720-E28B0970F516}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {89E83FD6-327A-4976-B720-E28B0970F516}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {89E83FD6-327A-4976-B720-E28B0970F516}.Release|Any CPU.Build.0 = Release|Any CPU
+ {89E83FD6-327A-4976-B720-E28B0970F516}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {89E83FD6-327A-4976-B720-E28B0970F516}.Release|iPhone.Build.0 = Release|Any CPU
+ {89E83FD6-327A-4976-B720-E28B0970F516}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {89E83FD6-327A-4976-B720-E28B0970F516}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {F4624114-C8F8-4D9B-B634-5315C81F91D7}
EndGlobalSection
GlobalSection(MonoDevelopProperties) = preSolution
StartupItem = Location.iOS\Location.iOS.csproj
diff --git a/BackgroundLocationDemo/location.Android/App.cs b/BackgroundLocationDemo/location.Android/App.cs
index ce5f94bdb..a76d1f77d 100644
--- a/BackgroundLocationDemo/location.Android/App.cs
+++ b/BackgroundLocationDemo/location.Android/App.cs
@@ -1,87 +1,111 @@
using System;
-using System.Threading;
using System.Threading.Tasks;
+using Android.App;
using Android.Content;
+using Android.OS;
using Android.Util;
using Location.Droid.Services;
-///
-/// Singleton class for Application wide objects.
-///
namespace Location.Droid
{
- public class App
- {
- // events
- public event EventHandler LocationServiceConnected = delegate {};
-
- // declarations
- protected readonly string logTag = "App";
- protected LocationServiceConnection locationServiceConnection;
-
- // properties
-
- public static App Current
- {
- get { return current; }
- } private static App current;
-
- public LocationService LocationService
- {
- get {
- if (this.locationServiceConnection.Binder == null)
- throw new Exception ("Service not bound yet");
- // note that we use the ServiceConnection to get the Binder, and the Binder to get the Service here
- return this.locationServiceConnection.Binder.Service;
- }
- }
-
- #region Application context
-
- static App ()
- {
- current = new App();
- }
- protected App ()
- {
- // starting a service like this is blocking, so we want to do it on a background thread
- new Task ( () => {
-
- // start our main service
- Log.Debug (logTag, "Calling StartService");
- Android.App.Application.Context.StartService (new Intent (Android.App.Application.Context, typeof(LocationService)));
-
- // create a new service connection so we can get a binder to the service
- this.locationServiceConnection = new LocationServiceConnection (null);
-
- // this event will fire when the Service connectin in the OnServiceConnected call
- this.locationServiceConnection.ServiceConnected += (object sender, ServiceConnectedEventArgs e) => {
-
- Log.Debug (logTag, "Service Connected");
- // we will use this event to notify MainActivity when to start updating the UI
- this.LocationServiceConnected ( this, e );
-
- };
-
- // bind our service (Android goes and finds the running service by type, and puts a reference
- // on the binder to that service)
- // The Intent tells the OS where to find our Service (the Context) and the Type of Service
- // we're looking for (LocationService)
- Intent locationServiceIntent = new Intent (Android.App.Application.Context, typeof(LocationService));
- Log.Debug (logTag, "Calling service binding");
-
- // Finally, we can bind to the Service using our Intent and the ServiceConnection we
- // created in a previous step.
- Android.App.Application.Context.BindService (locationServiceIntent, locationServiceConnection, Bind.AutoCreate);
-
- } ).Start ();
- }
-
- #endregion
-
- }
-}
+ public class App
+ {
+ protected static LocationServiceConnection locationServiceConnection;
+
+ // declarations
+ protected readonly string logTag = "App";
+
+ static App()
+ {
+ Current = new App();
+ }
+
+ protected App()
+ {
+ // create a new service connection so we can get a binder to the service
+ locationServiceConnection = new LocationServiceConnection(null);
+
+ // this event will fire when the Service connectin in the OnServiceConnected call
+ locationServiceConnection.ServiceConnected += (sender, e) =>
+ {
+ Log.Debug(logTag, "Service Connected");
+ // we will use this event to notify MainActivity when to start updating the UI
+ LocationServiceConnected(this, e);
+ };
+ }
+
+ // properties
+
+ public static App Current { get; }
+
+ public LocationService LocationService
+ {
+ get
+ {
+ if (locationServiceConnection.Binder == null)
+ {
+ throw new Exception("Service not bound yet");
+ }
+ // note that we use the ServiceConnection to get the Binder, and the Binder to get the Service here
+ return locationServiceConnection.Binder.Service;
+ }
+ }
+ // events
+ public event EventHandler LocationServiceConnected = delegate { };
+
+ public static void StartLocationService()
+ {
+ // Starting a service like this is blocking, so we want to do it on a background thread
+ new Task(() =>
+ {
+ // Start our main service
+ Log.Debug("App", "Calling StartService");
+
+ // Check if device is running Android 8.0 or higher and if so, use the newer StartForegroundService() method
+ if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
+ {
+ Application.Context.StartForegroundService(new Intent(Application.Context, typeof(LocationService)));
+ }
+ else // For older versions, use the traditional StartService() method
+ {
+ Application.Context.StartService(new Intent(Application.Context, typeof(LocationService)));
+ }
+
+ // bind our service (Android goes and finds the running service by type, and puts a reference
+ // on the binder to that service)
+ // The Intent tells the OS where to find our Service (the Context) and the Type of Service
+ // we're looking for (LocationService)
+ var locationServiceIntent = new Intent(Application.Context, typeof(LocationService));
+ Log.Debug("App", "Calling service binding");
+
+ // Finally, we can bind to the Service using our Intent and the ServiceConnection we
+ // created in a previous step.
+ Application.Context.BindService(locationServiceIntent, locationServiceConnection, Bind.AutoCreate);
+ }).Start();
+ }
+
+ public static void StopLocationService()
+ {
+ // Check for nulls in case StartLocationService task has not yet completed.
+ Log.Debug("App", "StopLocationService");
+
+ // Unbind from the LocationService; otherwise, StopSelf (below) will not work:
+ if (locationServiceConnection != null)
+ {
+ Log.Debug("App", "Unbinding from LocationService");
+ Application.Context.UnbindService(locationServiceConnection);
+ }
+
+ // Stop the LocationService:
+ if (Current.LocationService != null)
+ {
+ Log.Debug("App", "Stopping the LocationService");
+ Current.LocationService.StopSelf();
+ }
+ }
+ }
+}
diff --git a/BackgroundLocationDemo/location.Android/Location.Droid.csproj b/BackgroundLocationDemo/location.Android/Location.Droid.csproj
index dee7a4451..9ce7177ca 100644
--- a/BackgroundLocationDemo/location.Android/Location.Droid.csproj
+++ b/BackgroundLocationDemo/location.Android/Location.Droid.csproj
@@ -1,4 +1,4 @@
-
+
Debug
@@ -16,6 +16,8 @@
Resources\Resource.designer.cs
Resource
location.Androidd
+ v8.1
+ false
True
@@ -75,9 +77,21 @@
-
-
-
+
+ 27.0.2.1
+
+
+ 27.0.2.1
+
+
+ 27.0.2.1
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BackgroundLocationDemo/location.Android/MainActivity.cs b/BackgroundLocationDemo/location.Android/MainActivity.cs
index 06ad3e29e..2d4be3b18 100644
--- a/BackgroundLocationDemo/location.Android/MainActivity.cs
+++ b/BackgroundLocationDemo/location.Android/MainActivity.cs
@@ -1,117 +1,181 @@
using System;
+
+using Android;
using Android.App;
-using Android.Widget;
+using Android.Content.PM;
+using Android.Locations;
using Android.OS;
+using Android.Support.Design.Widget;
+using Android.Support.V4.App;
+using Android.Support.V4.Content;
+using Android.Support.V7.App;
using Android.Util;
-using Android.Locations;
-using Location.Droid.Services;
+using Android.Views;
+using Android.Widget;
namespace Location.Droid
{
- [Activity (Label = "AndroidLocationService", MainLauncher = true)]
- public class MainActivity : Activity
- {
- readonly string logTag = "MainActivity";
-
- // make our labels
- TextView latText;
- TextView longText;
- TextView altText;
- TextView speedText;
- TextView bearText;
- TextView accText;
-
- #region Lifecycle
-
- //Lifecycle stages
- protected override void OnCreate (Bundle bundle)
- {
- base.OnCreate (bundle);
-
- SetContentView (Resource.Layout.Main);
-
- // This event fires when the ServiceConnection lets the client (our App class) know that
- // the Service is connected. We use this event to start updating the UI with location
- // updates from the Service
- App.Current.LocationServiceConnected += (object sender, ServiceConnectedEventArgs e) => {
- Log.Debug (logTag, "ServiceConnected Event Raised");
- // notifies us of location changes from the system
- App.Current.LocationService.LocationChanged += HandleLocationChanged;
- //notifies us of user changes to the location provider (ie the user disables or enables GPS)
- App.Current.LocationService.ProviderDisabled += HandleProviderDisabled;
- App.Current.LocationService.ProviderEnabled += HandleProviderEnabled;
- // notifies us of the changing status of a provider (ie GPS no longer available)
- App.Current.LocationService.StatusChanged += HandleStatusChanged;
- };
-
- latText = FindViewById (Resource.Id.lat);
- longText = FindViewById (Resource.Id.longx);
- altText = FindViewById (Resource.Id.alt);
- speedText = FindViewById (Resource.Id.speed);
- bearText = FindViewById (Resource.Id.bear);
- accText = FindViewById (Resource.Id.acc);
- }
-
- protected override void OnPause()
- {
- Log.Debug (logTag, "Location app is moving to background");
- base.OnPause();
- }
-
- protected override void OnResume()
- {
- Log.Debug (logTag, "Location app is moving into foreground");
- base.OnPause();
- }
-
- protected override void OnDestroy ()
- {
- Log.Debug (logTag, "Location app is becoming inactive");
- base.OnDestroy ();
- }
-
- #endregion
-
- #region Android Location Service methods
-
- ///
- /// Updates UI with location data
- ///
- public void HandleLocationChanged(object sender, LocationChangedEventArgs e)
- {
- Android.Locations.Location location = e.Location;
- Log.Debug (logTag, "Foreground updating");
-
- // these events are on a background thread, need to update on the UI thread
- RunOnUiThread (() => {
- latText.Text = String.Format ("Latitude: {0}", location.Latitude);
- longText.Text = String.Format ("Longitude: {0}", location.Longitude);
- altText.Text = String.Format ("Altitude: {0}", location.Altitude);
- speedText.Text = String.Format ("Speed: {0}", location.Speed);
- accText.Text = String.Format ("Accuracy: {0}", location.Accuracy);
- bearText.Text = String.Format ("Bearing: {0}", location.Bearing);
- });
-
- }
-
- public void HandleProviderDisabled(object sender, ProviderDisabledEventArgs e)
- {
- Log.Debug (logTag, "Location provider disabled event raised");
- }
-
- public void HandleProviderEnabled(object sender, ProviderEnabledEventArgs e)
- {
- Log.Debug (logTag, "Location provider enabled event raised");
- }
-
- public void HandleStatusChanged(object sender, StatusChangedEventArgs e)
- {
- Log.Debug (logTag, "Location status changed, event raised");
- }
-
- #endregion
-
- }
+ [Activity(Label = "LocationDroid", MainLauncher = true,
+ ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.ScreenLayout)]
+ public class MainActivity : AppCompatActivity
+ {
+ static readonly int RC_REQUEST_LOCATION_PERMISSION = 1000;
+ static readonly string TAG = "MainActivity";
+ static readonly string[] REQUIRED_PERMISSIONS = {Manifest.Permission.AccessFineLocation};
+ TextView accText;
+ TextView altText;
+ TextView bearText;
+
+ // make our labels
+ TextView latText;
+ TextView longText;
+ TextView speedText;
+
+ //Lifecycle stages
+ protected override void OnCreate(Bundle bundle)
+ {
+ base.OnCreate(bundle);
+ Log.Debug(TAG, "OnCreate: Location app is coming to life.");
+
+ SetContentView(Resource.Layout.Main);
+
+ // This event fires when the ServiceConnection lets the client (our App class) know that
+ // the Service is connected. We use this event to start updating the UI with location
+ // updates from the Service
+ App.Current.LocationServiceConnected += (sender, e) =>
+ {
+ Log.Debug(TAG, "ServiceConnected Event Raised");
+ // notifies us of location changes from the system
+ App.Current.LocationService.LocationChanged += HandleLocationChanged;
+ //notifies us of user changes to the location provider (ie the user disables or enables GPS)
+ App.Current.LocationService.ProviderDisabled += HandleProviderDisabled;
+ App.Current.LocationService.ProviderEnabled += HandleProviderEnabled;
+ // notifies us of the changing status of a provider (ie GPS no longer available)
+ App.Current.LocationService.StatusChanged += HandleStatusChanged;
+ };
+
+
+ latText = FindViewById(Resource.Id.lat);
+ longText = FindViewById(Resource.Id.longx);
+ altText = FindViewById(Resource.Id.alt);
+ speedText = FindViewById(Resource.Id.speed);
+ bearText = FindViewById(Resource.Id.bear);
+ accText = FindViewById(Resource.Id.acc);
+
+ altText.Text = "altitude";
+ speedText.Text = "speed";
+ bearText.Text = "bearing";
+ accText.Text = "accuracy";
+
+ // Start the location service:
+ if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.AccessFineLocation) == (int) Permission.Granted)
+ {
+ Log.Debug(TAG, "User already has granted permission.");
+ App.StartLocationService();
+ }
+ else
+ {
+ Log.Debug(TAG, "Have to request permission from the user. ");
+ RequestLocationPermission();
+ }
+ }
+
+ protected override void OnResume()
+ {
+ Log.Debug(TAG, "OnResume: Location app is moving into foreground");
+ base.OnResume();
+ }
+
+ protected override void OnPause()
+ {
+ Log.Debug(TAG, "OnPause: Location app is moving to background");
+ base.OnPause();
+ }
+
+ protected override void OnDestroy()
+ {
+ Log.Debug(TAG, "OnDestroy: Location app is becoming inactive");
+ base.OnDestroy();
+
+ // Stop the location service:
+ App.StopLocationService();
+ }
+
+ public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults)
+ {
+ if (requestCode == RC_REQUEST_LOCATION_PERMISSION)
+ {
+ if (grantResults.Length == 1 && grantResults[0] == Permission.Granted)
+ {
+ Log.Debug(TAG, "User granted permission for location.");
+ App.StartLocationService();
+ }
+ else
+ {
+ Log.Warn(TAG, "User did not grant permission for the location.");
+ }
+ }
+ else
+ {
+ base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
+ }
+ }
+
+ void RequestLocationPermission()
+ {
+ if (ActivityCompat.ShouldShowRequestPermissionRationale(this, Manifest.Permission.AccessFineLocation))
+ {
+ var layout = FindViewById(Android.Resource.Id.Content);
+ Snackbar.Make(layout,
+ Resource.String.permission_location_rationale,
+ Snackbar.LengthIndefinite)
+ .SetAction(Resource.String.ok,
+ new Action(delegate
+ {
+ ActivityCompat.RequestPermissions(this, REQUIRED_PERMISSIONS,
+ RC_REQUEST_LOCATION_PERMISSION);
+ })
+ ).Show();
+ }
+ else
+ {
+ ActivityCompat.RequestPermissions(this, REQUIRED_PERMISSIONS, RC_REQUEST_LOCATION_PERMISSION);
+ }
+ }
+
+ ///
+ /// Updates UI with location data
+ ///
+ public void HandleLocationChanged(object sender, LocationChangedEventArgs e)
+ {
+ var location = e.Location;
+ Log.Debug(TAG, "Foreground updating");
+
+ // these events are on a background thread, need to update on the UI thread
+ RunOnUiThread(() =>
+ {
+ latText.Text = $"Latitude: {location.Latitude}";
+ longText.Text = $"Longitude: {location.Longitude}";
+ altText.Text = $"Altitude: {location.Altitude}";
+ speedText.Text = $"Speed: {location.Speed}";
+ accText.Text = $"Accuracy: {location.Accuracy}";
+ bearText.Text = $"Bearing: {location.Bearing}";
+ });
+ }
+
+ public void HandleProviderDisabled(object sender, ProviderDisabledEventArgs e)
+ {
+ Log.Debug(TAG, "Location provider disabled event raised");
+ }
+
+ public void HandleProviderEnabled(object sender, ProviderEnabledEventArgs e)
+ {
+ Log.Debug(TAG, "Location provider enabled event raised");
+ }
+
+ public void HandleStatusChanged(object sender, StatusChangedEventArgs e)
+ {
+ Log.Debug(TAG, "Location status changed, event raised");
+ }
+ }
}
-
-
diff --git a/BackgroundLocationDemo/location.Android/Properties/AndroidManifest.xml b/BackgroundLocationDemo/location.Android/Properties/AndroidManifest.xml
index b0bf69e53..baba745b1 100644
--- a/BackgroundLocationDemo/location.Android/Properties/AndroidManifest.xml
+++ b/BackgroundLocationDemo/location.Android/Properties/AndroidManifest.xml
@@ -1,8 +1,6 @@
-
-
-
-
-
+
+
+
\ No newline at end of file
diff --git a/BackgroundLocationDemo/location.Android/Resources/layout/Main.axml b/BackgroundLocationDemo/location.Android/Resources/layout/Main.axml
index cd2330e3e..f5435ba43 100644
--- a/BackgroundLocationDemo/location.Android/Resources/layout/Main.axml
+++ b/BackgroundLocationDemo/location.Android/Resources/layout/Main.axml
@@ -10,6 +10,7 @@
android:layout_height="wrap_content"
android:id="@+id/textView1" />
- Hello World, Click Me!
- Location.Droidd
+ Location.Droid
+ OK
+ This app is running in the background
+ This app requires access to the device location in order to work.
diff --git a/BackgroundLocationDemo/location.Android/Resources/values/colours.xml b/BackgroundLocationDemo/location.Android/Resources/values/colours.xml
new file mode 100644
index 000000000..95c11a1ad
--- /dev/null
+++ b/BackgroundLocationDemo/location.Android/Resources/values/colours.xml
@@ -0,0 +1,6 @@
+
+
+ #3F51B5
+ #303F9F
+ #FF4081
+
\ No newline at end of file
diff --git a/BackgroundLocationDemo/location.Android/Resources/values/styles.xml b/BackgroundLocationDemo/location.Android/Resources/values/styles.xml
new file mode 100644
index 000000000..2ecbd4b2c
--- /dev/null
+++ b/BackgroundLocationDemo/location.Android/Resources/values/styles.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
diff --git a/BackgroundLocationDemo/location.Android/Services/LocationService.cs b/BackgroundLocationDemo/location.Android/Services/LocationService.cs
index 1fbdee1bc..23dc89dba 100644
--- a/BackgroundLocationDemo/location.Android/Services/LocationService.cs
+++ b/BackgroundLocationDemo/location.Android/Services/LocationService.cs
@@ -1,117 +1,136 @@
using System;
using Android.App;
-using Android.Util;
using Android.Content;
-using Android.OS;
using Android.Locations;
+using Android.OS;
+using Android.Support.V4.App;
+using Android.Util;
namespace Location.Droid.Services
{
- [Service]
- public class LocationService : Service, ILocationListener
- {
- public event EventHandler LocationChanged = delegate { };
- public event EventHandler ProviderDisabled = delegate { };
- public event EventHandler ProviderEnabled = delegate { };
- public event EventHandler StatusChanged = delegate { };
-
- public LocationService()
- {
- }
-
- // Set our location manager as the system location service
- protected LocationManager LocMgr = Android.App.Application.Context.GetSystemService ("location") as LocationManager;
-
- readonly string logTag = "LocationService";
- IBinder binder;
-
- public override void OnCreate ()
- {
- base.OnCreate ();
- Log.Debug (logTag, "OnCreate called in the Location Service");
- }
-
- // This gets called when StartService is called in our App class
- public override StartCommandResult OnStartCommand (Intent intent, StartCommandFlags flags, int startId)
- {
- Log.Debug (logTag, "LocationService started");
-
- return StartCommandResult.Sticky;
- }
-
- // This gets called once, the first time any client bind to the Service
- // and returns an instance of the LocationServiceBinder. All future clients will
- // reuse the same instance of the binder
- public override IBinder OnBind (Intent intent)
- {
- Log.Debug (logTag, "Client now bound to service");
-
- binder = new LocationServiceBinder (this);
- return binder;
- }
-
- // Handle location updates from the location manager
- public void StartLocationUpdates ()
- {
- //we can set different location criteria based on requirements for our app -
- //for example, we might want to preserve power, or get extreme accuracy
- var locationCriteria = new Criteria();
-
- locationCriteria.Accuracy = Accuracy.NoRequirement;
- locationCriteria.PowerRequirement = Power.NoRequirement;
-
- // get provider: GPS, Network, etc.
- var locationProvider = LocMgr.GetBestProvider(locationCriteria, true);
- Log.Debug (logTag, string.Format ("You are about to get location updates via {0}", locationProvider));
-
- // Get an initial fix on location
- LocMgr.RequestLocationUpdates(locationProvider, 2000, 0, this);
-
- Log.Debug (logTag, "Now sending location updates");
- }
-
- public override void OnDestroy ()
- {
- base.OnDestroy ();
- Log.Debug (logTag, "Service has been terminated");
- }
-
- #region ILocationListener implementation
- // ILocationListener is a way for the Service to subscribe for updates
- // from the System location Service
-
- public void OnLocationChanged (Android.Locations.Location location)
- {
- this.LocationChanged (this, new LocationChangedEventArgs (location));
-
- // This should be updating every time we request new location updates
- // both when teh app is in the background, and in the foreground
- Log.Debug (logTag, String.Format ("Latitude is {0}", location.Latitude));
- Log.Debug (logTag, String.Format ("Longitude is {0}", location.Longitude));
- Log.Debug (logTag, String.Format ("Altitude is {0}", location.Altitude));
- Log.Debug (logTag, String.Format ("Speed is {0}", location.Speed));
- Log.Debug (logTag, String.Format ("Accuracy is {0}", location.Accuracy));
- Log.Debug (logTag, String.Format ("Bearing is {0}", location.Bearing));
- }
-
- public void OnProviderDisabled (string provider)
- {
- this.ProviderDisabled (this, new ProviderDisabledEventArgs (provider));
- }
-
- public void OnProviderEnabled (string provider)
- {
- this.ProviderEnabled (this, new ProviderEnabledEventArgs (provider));
- }
-
- public void OnStatusChanged (string provider, Availability status, Bundle extras)
- {
- this.StatusChanged (this, new StatusChangedEventArgs (provider, status, extras));
- }
-
- #endregion
-
- }
+ [Service]
+ public class LocationService : Service, ILocationListener
+ {
+ const int SERVICE_RUNNING_NOTIFICATION_ID = 123;
+ const string NOTIFICATION_CHANNEL_ID = "com.company.app.channel";
+
+ readonly string logTag = "LocationService";
+ IBinder binder;
+
+ // Set our location manager as the system location service
+ protected LocationManager LocMgr = Application.Context.GetSystemService("location") as LocationManager;
+
+ // ILocationListener is a way for the Service to subscribe for updates
+ // from the System location Service
+
+ public void OnLocationChanged(Android.Locations.Location location)
+ {
+ LocationChanged(this, new LocationChangedEventArgs(location));
+
+ // This should be updating every time we request new location updates
+ // both when teh app is in the background, and in the foreground
+ Log.Debug(logTag, $"Latitude is {location.Latitude}");
+ Log.Debug(logTag, $"Longitude is {location.Longitude}");
+ Log.Debug(logTag, $"Altitude is {location.Altitude}");
+ Log.Debug(logTag, $"Speed is {location.Speed}");
+ Log.Debug(logTag, $"Accuracy is {location.Accuracy}");
+ Log.Debug(logTag, $"Bearing is {location.Bearing}");
+ }
+
+ public void OnProviderDisabled(string provider)
+ {
+ ProviderDisabled(this, new ProviderDisabledEventArgs(provider));
+ }
+
+ public void OnProviderEnabled(string provider)
+ {
+ ProviderEnabled(this, new ProviderEnabledEventArgs(provider));
+ }
+
+ public void OnStatusChanged(string provider, Availability status, Bundle extras)
+ {
+ StatusChanged(this, new StatusChangedEventArgs(provider, status, extras));
+ }
+
+ public event EventHandler LocationChanged = delegate { };
+ public event EventHandler ProviderDisabled = delegate { };
+ public event EventHandler ProviderEnabled = delegate { };
+ public event EventHandler StatusChanged = delegate { };
+
+ public override void OnCreate()
+ {
+ base.OnCreate();
+ Log.Debug(logTag, "OnCreate called in the Location Service");
+ }
+
+ // This gets called when StartService is called in our App class
+ [Obsolete("deprecated in base class")]
+ public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
+ {
+ Log.Debug(logTag, "LocationService started");
+
+ // Check if device is running Android 8.0 or higher and call StartForeground() if so
+ if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
+ {
+ var notification = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID)
+ .SetContentTitle(Resources.GetString(Resource.String.app_name))
+ .SetContentText(Resources.GetString(Resource.String.notification_text))
+ .SetSmallIcon(Resource.Drawable.notification_icon_background)
+ .SetOngoing(true)
+ .Build();
+
+ var notificationManager =
+ GetSystemService(NotificationService) as NotificationManager;
+
+ var chan = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "On-going Notification", NotificationImportance.Min);
+
+ notificationManager.CreateNotificationChannel(chan);
+
+ StartForeground(SERVICE_RUNNING_NOTIFICATION_ID, notification);
+ }
+
+ return StartCommandResult.Sticky;
+ }
+
+ // This gets called once, the first time any client bind to the Service
+ // and returns an instance of the LocationServiceBinder. All future clients will
+ // reuse the same instance of the binder
+ public override IBinder OnBind(Intent intent)
+ {
+ Log.Debug(logTag, "Client now bound to service");
+
+ binder = new LocationServiceBinder(this);
+ return binder;
+ }
+
+ // Handle location updates from the location manager
+ public void StartLocationUpdates()
+ {
+ //we can set different location criteria based on requirements for our app -
+ //for example, we might want to preserve power, or get extreme accuracy
+ var locationCriteria = new Criteria();
+
+ locationCriteria.Accuracy = Accuracy.NoRequirement;
+ locationCriteria.PowerRequirement = Power.NoRequirement;
+
+ // get provider: GPS, Network, etc.
+ var locationProvider = LocMgr.GetBestProvider(locationCriteria, true);
+ Log.Debug(logTag, string.Format("You are about to get location updates via {0}", locationProvider));
+
+ // Get an initial fix on location
+ LocMgr.RequestLocationUpdates(locationProvider, 2000, 0, this);
+
+ Log.Debug(logTag, "Now sending location updates");
+ }
+
+ public override void OnDestroy()
+ {
+ base.OnDestroy();
+ Log.Debug(logTag, "Service has been terminated");
+
+ // Stop getting updates from the location manager:
+ LocMgr.RemoveUpdates(this);
+ }
+ }
}
-
diff --git a/BackgroundLocationDemo/location.Android/Services/LocationServiceBinder.cs b/BackgroundLocationDemo/location.Android/Services/LocationServiceBinder.cs
index 11aed72b3..d0ed8ce07 100644
--- a/BackgroundLocationDemo/location.Android/Services/LocationServiceBinder.cs
+++ b/BackgroundLocationDemo/location.Android/Services/LocationServiceBinder.cs
@@ -1,23 +1,22 @@
using System;
+
using Android.OS;
namespace Location.Droid.Services
{
- //This is our Binder subclass, the LocationServiceBinder
- public class LocationServiceBinder : Binder
- {
- public LocationService Service
- {
- get { return this.service; }
- } protected LocationService service;
+ //This is our Binder subclass, the LocationServiceBinder
+ public class LocationServiceBinder : Binder
+ {
+ protected LocationService service;
- public bool IsBound { get; set; }
-
- // constructor
- public LocationServiceBinder (LocationService service)
- {
- this.service = service;
- }
- }
-}
+ // constructor
+ public LocationServiceBinder(LocationService service)
+ {
+ this.service = service;
+ }
+ public LocationService Service => service;
+
+ public bool IsBound { get; set; }
+ }
+}
diff --git a/BackgroundLocationDemo/location.Android/Services/LocationServiceConnection.cs b/BackgroundLocationDemo/location.Android/Services/LocationServiceConnection.cs
index 06b8d1ec0..8b023830a 100644
--- a/BackgroundLocationDemo/location.Android/Services/LocationServiceConnection.cs
+++ b/BackgroundLocationDemo/location.Android/Services/LocationServiceConnection.cs
@@ -4,51 +4,54 @@
using Android.OS;
using Android.Util;
+using Object = Java.Lang.Object;
+
namespace Location.Droid.Services
{
- public class LocationServiceConnection : Java.Lang.Object, IServiceConnection
- {
- public event EventHandler ServiceConnected = delegate {};
-
- public LocationServiceBinder Binder
- {
- get { return this.binder; }
- set { this.binder = value; }
- }
- protected LocationServiceBinder binder;
-
- public LocationServiceConnection (LocationServiceBinder binder)
- {
- if (binder != null) {
- this.binder = binder;
- }
- }
-
- // This gets called when a client tries to bind to the Service with an Intent and an
- // instance of the ServiceConnection. The system will locate a binder associated with the
- // running Service
- public void OnServiceConnected (ComponentName name, IBinder service)
- {
- // cast the binder located by the OS as our local binder subclass
- LocationServiceBinder serviceBinder = service as LocationServiceBinder;
- if (serviceBinder != null) {
- this.binder = serviceBinder;
- this.binder.IsBound = true;
- Log.Debug ( "ServiceConnection", "OnServiceConnected Called" );
- // raise the service connected event
- this.ServiceConnected(this, new ServiceConnectedEventArgs () { Binder = service } );
-
- // now that the Service is bound, we can start gathering some location data
- serviceBinder.Service.StartLocationUpdates();
- }
- }
-
- // This will be called when the Service unbinds, or when the app crashes
- public void OnServiceDisconnected (ComponentName name)
- {
- this.binder.IsBound = false;
- Log.Debug ( "ServiceConnection", "Service unbound" );
- }
- }
-}
+ public class LocationServiceConnection : Object, IServiceConnection
+ {
+ protected LocationServiceBinder binder;
+
+ public LocationServiceConnection(LocationServiceBinder binder)
+ {
+ if (binder != null)
+ {
+ this.binder = binder;
+ }
+ }
+
+ public LocationServiceBinder Binder
+ {
+ get => binder;
+ set => binder = value;
+ }
+ // This gets called when a client tries to bind to the Service with an Intent and an
+ // instance of the ServiceConnection. The system will locate a binder associated with the
+ // running Service
+ public void OnServiceConnected(ComponentName name, IBinder service)
+ {
+ // cast the binder located by the OS as our local binder subclass
+ if (service is LocationServiceBinder serviceBinder)
+ {
+ binder = serviceBinder;
+ binder.IsBound = true;
+ Log.Debug("ServiceConnection", "OnServiceConnected Called");
+ // raise the service connected event
+ ServiceConnected(this, new ServiceConnectedEventArgs {Binder = service});
+
+ // now that the Service is bound, we can start gathering some location data
+ serviceBinder.Service.StartLocationUpdates();
+ }
+ }
+
+ // This will be called when the Service unbinds, or when the app crashes
+ public void OnServiceDisconnected(ComponentName name)
+ {
+ binder.IsBound = false;
+ Log.Debug("ServiceConnection", "Service unbound");
+ }
+
+ public event EventHandler ServiceConnected = delegate { };
+ }
+}
diff --git a/BackgroundLocationDemo/location.Android/Services/ServiceConnectedEventArgs.cs b/BackgroundLocationDemo/location.Android/Services/ServiceConnectedEventArgs.cs
index 76fe8b7dc..6ebbbdc8c 100644
--- a/BackgroundLocationDemo/location.Android/Services/ServiceConnectedEventArgs.cs
+++ b/BackgroundLocationDemo/location.Android/Services/ServiceConnectedEventArgs.cs
@@ -1,10 +1,11 @@
using System;
+
using Android.OS;
namespace Location.Droid.Services
{
- public class ServiceConnectedEventArgs : EventArgs
- {
- public IBinder Binder { get; set; }
- }
-}
\ No newline at end of file
+ public class ServiceConnectedEventArgs : EventArgs
+ {
+ public IBinder Binder { get; set; }
+ }
+}
diff --git a/BackgroundLocationDemo/location.iOS/Info.plist b/BackgroundLocationDemo/location.iOS/Info.plist
index 4eddb7184..e3928fae5 100644
--- a/BackgroundLocationDemo/location.iOS/Info.plist
+++ b/BackgroundLocationDemo/location.iOS/Info.plist
@@ -21,7 +21,7 @@
UIInterfaceOrientationLandscapeRight
MinimumOSVersion
- 6.1
+ 8.0
CFBundleIconFiles
icon-57
@@ -39,5 +39,7 @@
location
+ CFBundleIdentifier
+ com.xamarin.backgroundlocation
diff --git a/BackgroundLocationDemo/location.iOS/Location.iOS.csproj b/BackgroundLocationDemo/location.iOS/Location.iOS.csproj
index aad5a0587..6176e03de 100644
--- a/BackgroundLocationDemo/location.iOS/Location.iOS.csproj
+++ b/BackgroundLocationDemo/location.iOS/Location.iOS.csproj
@@ -1,4 +1,4 @@
-
+
Debug
@@ -25,9 +25,9 @@
False
None
True
-
-
+
i386
+ NSUrlSessionHandler
none
@@ -38,6 +38,7 @@
False
None
i386
+ NSUrlSessionHandler
True
@@ -50,9 +51,9 @@
False
True
iPhone Developer
-
-
+
ARMv7
+ NSUrlSessionHandler
none
@@ -63,6 +64,7 @@
False
iPhone Developer
ARMv7, ARM64
+ NSUrlSessionHandler
none
@@ -75,6 +77,7 @@
Automatic:AdHoc
iPhone Distribution
ARMv7, ARM64
+ NSUrlSessionHandler
none
@@ -86,6 +89,7 @@
iPhone Distribution
Automatic:AppStore
ARMv7, ARM64
+ NSUrlSessionHandler
diff --git a/BackgroundLocationDemo/location.iOS/LocationManager.cs b/BackgroundLocationDemo/location.iOS/LocationManager.cs
index 96551e17b..49f68e6f8 100644
--- a/BackgroundLocationDemo/location.iOS/LocationManager.cs
+++ b/BackgroundLocationDemo/location.iOS/LocationManager.cs
@@ -8,23 +8,33 @@ namespace Location.iOS
{
public class LocationManager
{
-
+ protected CLLocationManager locMgr;
// event for the location changing
public event EventHandler LocationUpdated = delegate { };
public LocationManager ()
{
- this.locMgr = new CLLocationManager();
+ this.locMgr = new CLLocationManager ();
+
+ this.locMgr.PausesLocationUpdatesAutomatically = false;
+
+ // iOS 8 has additional permissions requirements
+ if (UIDevice.CurrentDevice.CheckSystemVersion (8, 0)) {
+ locMgr.RequestAlwaysAuthorization (); // works in background
+ //locMgr.RequestWhenInUseAuthorization (); // only in foreground
+ }
+
+ if (UIDevice.CurrentDevice.CheckSystemVersion (9, 0)) {
+ locMgr.AllowsBackgroundLocationUpdates = true;
+ }
LocationUpdated += PrintLocation;
}
// create a location manager to get system location updates to the application
- public CLLocationManager LocMgr
- {
- get {
- return this.locMgr;
- }
- } protected CLLocationManager locMgr;
+ public CLLocationManager LocMgr {
+ get { return this.locMgr; }
+ }
+
public void StartLocationUpdates ()
{
@@ -70,7 +80,7 @@ public void StartLocationUpdates ()
}
//This will keep going in the background and the foreground
- public void PrintLocation (object sender, LocationUpdatedEventArgs e)
+ public void PrintLocation (object sender, LocationUpdatedEventArgs e)
{
CLLocation location = e.Location;
diff --git a/BackgroundLocationDemo/location.iOS/MainScreen/MainViewController_iPad.xib b/BackgroundLocationDemo/location.iOS/MainScreen/MainViewController_iPad.xib
index 9c552c2c4..3898d56b1 100644
--- a/BackgroundLocationDemo/location.iOS/MainScreen/MainViewController_iPad.xib
+++ b/BackgroundLocationDemo/location.iOS/MainScreen/MainViewController_iPad.xib
@@ -1,593 +1,105 @@
-
-
- 768
- 12C3012
- 3084
- 1187.34
- 625.00
-
-
-
-
-
-
-
- YES
-
-
- view
-
-
-
- 7
-
-
-
- lblAltitude
-
-
-
- 24
-
-
-
- lblCourse
-
-
-
- 25
-
-
-
- lblLatitude
-
-
-
- 26
-
-
-
- lblLongitude
-
-
-
- 27
-
-
-
- lblSpeed
-
-
-
- 29
-
-
-
-
- YES
-
- 0
-
- YES
-
-
-
-
-
- 1
-
-
- YES
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -1
-
-
- File's Owner
-
-
- -2
-
-
-
-
- 8
-
-
-
-
- 9
-
-
-
-
- 10
-
-
-
-
- 11
-
-
-
-
- 12
-
-
-
-
- 13
-
-
-
-
- 14
-
-
-
-
- 15
-
-
-
-
- 16
-
-
-
-
- 17
-
-
-
-
- 22
-
-
-
-
-
-
- YES
-
- YES
- -1.CustomClassName
- -1.IBPluginDependency
- -2.CustomClassName
- -2.IBPluginDependency
- 1.IBLastUsedUIStatusBarStylesToTargetRuntimesMap
- 1.IBPluginDependency
- 10.IBPluginDependency
- 11.IBPluginDependency
- 12.IBPluginDependency
- 13.IBPluginDependency
- 14.IBPluginDependency
- 15.IBPluginDependency
- 16.IBPluginDependency
- 17.IBPluginDependency
- 22.IBPluginDependency
- 8.IBPluginDependency
- 9.IBPluginDependency
-
-
- YES
- MainViewController_iPad
- com.apple.InterfaceBuilder.IBCocoaTouchPlugin
- UIResponder
- com.apple.InterfaceBuilder.IBCocoaTouchPlugin
-
- IBCocoaTouchFramework
-
-
- com.apple.InterfaceBuilder.IBCocoaTouchPlugin
- com.apple.InterfaceBuilder.IBCocoaTouchPlugin
- com.apple.InterfaceBuilder.IBCocoaTouchPlugin
- com.apple.InterfaceBuilder.IBCocoaTouchPlugin
- com.apple.InterfaceBuilder.IBCocoaTouchPlugin
- com.apple.InterfaceBuilder.IBCocoaTouchPlugin
- com.apple.InterfaceBuilder.IBCocoaTouchPlugin
- com.apple.InterfaceBuilder.IBCocoaTouchPlugin
- com.apple.InterfaceBuilder.IBCocoaTouchPlugin
- com.apple.InterfaceBuilder.IBCocoaTouchPlugin
- com.apple.InterfaceBuilder.IBCocoaTouchPlugin
- com.apple.InterfaceBuilder.IBCocoaTouchPlugin
-
-
-
- YES
-
-
-
-
-
- YES
-
-
-
-
- 34
-
-
-
- YES
-
- MainViewController_iPad
- UIViewController
-
- YES
-
- YES
- lblAltitude
- lblCourse
- lblDistanceToParis
- lblLatitude
- lblLongitude
- lblMagneticHeading
- lblSpeed
- lblTrueHeading
-
-
- YES
- UILabel
- UILabel
- UILabel
- UILabel
- UILabel
- UILabel
- UILabel
- UILabel
-
-
-
- YES
-
- YES
- lblAltitude
- lblCourse
- lblDistanceToParis
- lblLatitude
- lblLongitude
- lblMagneticHeading
- lblSpeed
- lblTrueHeading
-
-
- YES
-
- lblAltitude
- UILabel
-
-
- lblCourse
- UILabel
-
-
- lblDistanceToParis
- UILabel
-
-
- lblLatitude
- UILabel
-
-
- lblLongitude
- UILabel
-
-
- lblMagneticHeading
- UILabel
-
-
- lblSpeed
- UILabel
-
-
- lblTrueHeading
- UILabel
-
-
-
-
- IBProjectSource
- ./Classes/MainViewController_iPad.h
-
-
-
-
- 0
- IBIPadFramework
-
- com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS
-
-
-
- com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3
-
-
- YES
- 3
- 2083
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BackgroundLocationDemo/location.iOS/MainScreen/MainViewController_iPhone.xib b/BackgroundLocationDemo/location.iOS/MainScreen/MainViewController_iPhone.xib
index bbf32b435..39eb81e1e 100644
--- a/BackgroundLocationDemo/location.iOS/MainScreen/MainViewController_iPhone.xib
+++ b/BackgroundLocationDemo/location.iOS/MainScreen/MainViewController_iPhone.xib
@@ -1,94 +1,18 @@
-
-
- 768
- 13F34
- 6250
- 1265.21
- 698.00
-
- com.apple.InterfaceBuilder.IBCocoaTouchPlugin
- 6244
-
-
- IBProxyObject
-
-
- com.apple.InterfaceBuilder.IBCocoaTouchPlugin
-
-
- PluginDependencyRecalculationVersion
-
-
-
-
- IBFilesOwner
- IBCocoaTouchFramework
-
-
- IBFirstResponder
- IBCocoaTouchFramework
-
-
-
-
-
-
-
- 0
-
-
-
-
-
- -1
-
-
- File's Owner
-
-
- -2
-
-
-
-
-
-
- MainViewController_iPhone
- com.apple.InterfaceBuilder.IBCocoaTouchPlugin
- UIResponder
- com.apple.InterfaceBuilder.IBCocoaTouchPlugin
-
-
-
-
-
- 35
-
-
-
-
- UIResponder
- NSObject
-
- IBFrameworkSource
- UIKit.framework/Headers/UIResponder.h
-
-
-
-
- 0
- IBCocoaTouchFramework
- NO
-
- com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS
-
-
-
- com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3
-
-
- YES
- 3
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BluetoothLEExplorer/BluetoothLEExplorer.Droid/BluetoothLEExplorer.Droid.csproj b/BluetoothLEExplorer/BluetoothLEExplorer.Droid/BluetoothLEExplorer.Droid.csproj
index d3d458da3..9778c1a89 100644
--- a/BluetoothLEExplorer/BluetoothLEExplorer.Droid/BluetoothLEExplorer.Droid.csproj
+++ b/BluetoothLEExplorer/BluetoothLEExplorer.Droid/BluetoothLEExplorer.Droid.csproj
@@ -17,7 +17,7 @@
False
Xamarin.Robotics.BluetoothLEExplorer.Droid
Properties\AndroidManifest.xml
- v4.3
+ v4.4
true
diff --git a/BluetoothLEExplorer/BluetoothLEExplorer.Droid/Properties/AndroidManifest.xml b/BluetoothLEExplorer/BluetoothLEExplorer.Droid/Properties/AndroidManifest.xml
index 670b29094..785e3d63b 100644
--- a/BluetoothLEExplorer/BluetoothLEExplorer.Droid/Properties/AndroidManifest.xml
+++ b/BluetoothLEExplorer/BluetoothLEExplorer.Droid/Properties/AndroidManifest.xml
@@ -1,6 +1,6 @@
-
+
diff --git a/BluetoothLEExplorer/BluetoothLEExplorer.iOS/BluetoothLEExplorer.iOS.csproj b/BluetoothLEExplorer/BluetoothLEExplorer.iOS/BluetoothLEExplorer.iOS.csproj
index 0f87fe7f6..9299a2782 100644
--- a/BluetoothLEExplorer/BluetoothLEExplorer.iOS/BluetoothLEExplorer.iOS.csproj
+++ b/BluetoothLEExplorer/BluetoothLEExplorer.iOS/BluetoothLEExplorer.iOS.csproj
@@ -27,6 +27,7 @@
true
i386
BluetoothLEExploreriOS
+ NSUrlSessionHandler
full
@@ -39,6 +40,7 @@
Entitlements.plist
i386
BluetoothLEExploreriOS
+ NSUrlSessionHandler
true
@@ -52,12 +54,11 @@
Entitlements.plist
true
iPhone Developer
-
-
+
ARMv7
-
-
+
XamarinRoboticsBluetoothLEExploreriOS
+ NSUrlSessionHandler
full
@@ -70,6 +71,7 @@
iPhone Developer
ARMv7, ARM64
XamarinRoboticsBluetoothLEExploreriOS
+ NSUrlSessionHandler
full
@@ -84,6 +86,7 @@
iPhone Distribution
ARMv7, ARM64
XamarinRoboticsBluetoothLEExploreriOS
+ NSUrlSessionHandler
full
@@ -97,6 +100,7 @@
Automatic:AppStore
ARMv7, ARM64
XamarinRoboticsBluetoothLEExploreriOS
+ NSUrlSessionHandler
@@ -104,7 +108,7 @@
- ..\Components\mbprogresshud-0.9.0\lib\ios-unified\MBProgressHUD.dll
+ ..\packages\mbprogresshud.0.9.2.0\lib\Xamarin.iOS\MBProgressHUD.dll
@@ -115,6 +119,7 @@
+
@@ -180,10 +185,4 @@
-
-
- 0.9.0
- False
-
-
\ No newline at end of file
diff --git a/BluetoothLEExplorer/BluetoothLEExplorer.iOS/Info.plist b/BluetoothLEExplorer/BluetoothLEExplorer.iOS/Info.plist
index 801d9daf2..2e39d87f6 100644
--- a/BluetoothLEExplorer/BluetoothLEExplorer.iOS/Info.plist
+++ b/BluetoothLEExplorer/BluetoothLEExplorer.iOS/Info.plist
@@ -15,7 +15,7 @@
UIInterfaceOrientationLandscapeRight
MinimumOSVersion
- 6.0
+ 8.0
CFBundleIconFiles
Icon
diff --git a/BluetoothLEExplorer/BluetoothLEExplorer.iOS/packages.config b/BluetoothLEExplorer/BluetoothLEExplorer.iOS/packages.config
new file mode 100644
index 000000000..8a7ad1010
--- /dev/null
+++ b/BluetoothLEExplorer/BluetoothLEExplorer.iOS/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.8.info b/BluetoothLEExplorer/Components/mbprogresshud-0.8.info
deleted file mode 100644
index 31e9b1821..000000000
--- a/BluetoothLEExplorer/Components/mbprogresshud-0.8.info
+++ /dev/null
@@ -1 +0,0 @@
-{"Name":"Progress HUD","Id":413,"Alias":"mbprogresshud","Description":"Progress HUD (a.k.a. MBProgressHUD) is a translucent, HUD-style dialog\nthat shows a progress indicator and a status label. It\u0027s the perfect\ncontrol for giving the user feedback when work is being done in a\nbackground thread.\n\nHere\u0027s an example:\n\n```csharp\nusing MBProgressHUD;\n...\n\npublic override void ViewDidLoad ()\n{\n\tbase.ViewDidLoad ();\n\n\tvar hud = new MTMBProgressHUD (View) {\n\t\tLabelText = \"Waiting...\",\n\t\tRemoveFromSuperViewOnHide = true\n\t};\n\n\tView.AddSubview (hud);\n\t\t\n\thud.Show (animated: true);\n\thud.Hide (animated: true, delay: 5);\n}\n```\n\n*Some component screenshots assembled with [PlaceIt](http://placeit.breezi.com/).*\n","Version":"0.8","Summary":"A translucent, HUD-style dialog that shows a progress indicator and a status label.","QuickStart":"Progress HUD (a.k.a. MBProgressHUD) is a translucent, HUD-style dialog\nthat shows a progress indicator and a status label. It\u0027s the perfect\ncontrol for giving the user feedback when work is being done in a\nbackground thread.\n\nHere\u0027s an example:\n\n```csharp\nusing MBProgressHUD;\n...\n\npublic override void ViewDidLoad ()\n{\n\tbase.ViewDidLoad ();\n\t\n\tvar hud = new MTMBProgressHUD (View) {\n\t\tLabelText = \"Waiting...\",\n\t\tRemoveFromSuperViewOnHide = true\n\t};\n\n\tView.AddSubview (hud);\n\t\t\n\thud.Show (animated: true);\n\thud.Hide (animated: true, delay: 5);\n}\n```\n\n## Details\n\nThe main guideline you need to follow when dealing with MBProgressHUD while running long-running\ntasks is keeping the main thread work-free, so the UI can be updated promptly. This is accomplished\nby using MBProgressHUD on the main thread to show progress, while running heavy tasks on a\nbackground thread.\n","Hash":"ce432959547bc90ee2ce15b8ead273d5","TargetPlatforms":["ios"],"TrialHash":null}
\ No newline at end of file
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.8.png b/BluetoothLEExplorer/Components/mbprogresshud-0.8.png
deleted file mode 100644
index 8b90c637c..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.8.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.8/component/Details.md b/BluetoothLEExplorer/Components/mbprogresshud-0.8/component/Details.md
deleted file mode 100644
index 06deaa684..000000000
--- a/BluetoothLEExplorer/Components/mbprogresshud-0.8/component/Details.md
+++ /dev/null
@@ -1,28 +0,0 @@
-Progress HUD (a.k.a. MBProgressHUD) is a translucent, HUD-style dialog
-that shows a progress indicator and a status label. It's the perfect
-control for giving the user feedback when work is being done in a
-background thread.
-
-Here's an example:
-
-```csharp
-using MBProgressHUD;
-...
-
-public override void ViewDidLoad ()
-{
- base.ViewDidLoad ();
-
- var hud = new MTMBProgressHUD (View) {
- LabelText = "Waiting...",
- RemoveFromSuperViewOnHide = true
- };
-
- View.AddSubview (hud);
-
- hud.Show (animated: true);
- hud.Hide (animated: true, delay: 5);
-}
-```
-
-*Some component screenshots assembled with [PlaceIt](http://placeit.breezi.com/).*
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.8/component/GettingStarted.md b/BluetoothLEExplorer/Components/mbprogresshud-0.8/component/GettingStarted.md
deleted file mode 100644
index a15cd8c83..000000000
--- a/BluetoothLEExplorer/Components/mbprogresshud-0.8/component/GettingStarted.md
+++ /dev/null
@@ -1,33 +0,0 @@
-Progress HUD (a.k.a. MBProgressHUD) is a translucent, HUD-style dialog
-that shows a progress indicator and a status label. It's the perfect
-control for giving the user feedback when work is being done in a
-background thread.
-
-Here's an example:
-
-```csharp
-using MBProgressHUD;
-...
-
-public override void ViewDidLoad ()
-{
- base.ViewDidLoad ();
-
- var hud = new MTMBProgressHUD (View) {
- LabelText = "Waiting...",
- RemoveFromSuperViewOnHide = true
- };
-
- View.AddSubview (hud);
-
- hud.Show (animated: true);
- hud.Hide (animated: true, delay: 5);
-}
-```
-
-## Details
-
-The main guideline you need to follow when dealing with MBProgressHUD while running long-running
-tasks is keeping the main thread work-free, so the UI can be updated promptly. This is accomplished
-by using MBProgressHUD on the main thread to show progress, while running heavy tasks on a
-background thread.
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.8/component/License.md b/BluetoothLEExplorer/Components/mbprogresshud-0.8/component/License.md
deleted file mode 100644
index 44ad9854c..000000000
--- a/BluetoothLEExplorer/Components/mbprogresshud-0.8/component/License.md
+++ /dev/null
@@ -1,8 +0,0 @@
-The MIT License (MIT)
-Copyright (c) 2013 Jonathan George
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.8/component/Manifest.xml b/BluetoothLEExplorer/Components/mbprogresshud-0.8/component/Manifest.xml
deleted file mode 100644
index dc814f813..000000000
--- a/BluetoothLEExplorer/Components/mbprogresshud-0.8/component/Manifest.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
- Progress HUD
- Jonathan George
- https://github.com/jdg/MBProgressHUD
- 0.8
- A translucent, HUD-style dialog that shows a progress indicator and a status label.
-
-
-
-
-
- iOS Sample
- iOS Sample
-
-
-
\ No newline at end of file
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.8/component/icons/mbprogresshud_128x128.png b/BluetoothLEExplorer/Components/mbprogresshud-0.8/component/icons/mbprogresshud_128x128.png
deleted file mode 100644
index 8b90c637c..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.8/component/icons/mbprogresshud_128x128.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.8/component/icons/mbprogresshud_512x512.png b/BluetoothLEExplorer/Components/mbprogresshud-0.8/component/icons/mbprogresshud_512x512.png
deleted file mode 100644
index f490b0677..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.8/component/icons/mbprogresshud_512x512.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.8/component/screenshots/screenshot1.png b/BluetoothLEExplorer/Components/mbprogresshud-0.8/component/screenshots/screenshot1.png
deleted file mode 100644
index eaad3281b..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.8/component/screenshots/screenshot1.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.8/lib/ios/MBProgressHUD.dll b/BluetoothLEExplorer/Components/mbprogresshud-0.8/lib/ios/MBProgressHUD.dll
deleted file mode 100644
index 3a251d761..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.8/lib/ios/MBProgressHUD.dll and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo.sln b/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo.sln
deleted file mode 100644
index c45864901..000000000
--- a/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo.sln
+++ /dev/null
@@ -1,32 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MBProgressHUDDemo", "MBProgressHUDDemo\MBProgressHUDDemo.csproj", "{9B7943D5-29E1-4F04-B9F5-0D640BB05D06}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|iPhoneSimulator = Debug|iPhoneSimulator
- Release|iPhoneSimulator = Release|iPhoneSimulator
- Debug|iPhone = Debug|iPhone
- Release|iPhone = Release|iPhone
- Ad-Hoc|iPhone = Ad-Hoc|iPhone
- AppStore|iPhone = AppStore|iPhone
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {9B7943D5-29E1-4F04-B9F5-0D640BB05D06}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone
- {9B7943D5-29E1-4F04-B9F5-0D640BB05D06}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone
- {9B7943D5-29E1-4F04-B9F5-0D640BB05D06}.AppStore|iPhone.ActiveCfg = AppStore|iPhone
- {9B7943D5-29E1-4F04-B9F5-0D640BB05D06}.AppStore|iPhone.Build.0 = AppStore|iPhone
- {9B7943D5-29E1-4F04-B9F5-0D640BB05D06}.Debug|iPhone.ActiveCfg = Debug|iPhone
- {9B7943D5-29E1-4F04-B9F5-0D640BB05D06}.Debug|iPhone.Build.0 = Debug|iPhone
- {9B7943D5-29E1-4F04-B9F5-0D640BB05D06}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
- {9B7943D5-29E1-4F04-B9F5-0D640BB05D06}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
- {9B7943D5-29E1-4F04-B9F5-0D640BB05D06}.Release|iPhone.ActiveCfg = Release|iPhone
- {9B7943D5-29E1-4F04-B9F5-0D640BB05D06}.Release|iPhone.Build.0 = Release|iPhone
- {9B7943D5-29E1-4F04-B9F5-0D640BB05D06}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
- {9B7943D5-29E1-4F04-B9F5-0D640BB05D06}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
- EndGlobalSection
- GlobalSection(MonoDevelopProperties) = preSolution
- StartupItem = MBProgressHUDDemo\MBProgressHUDDemo.csproj
- EndGlobalSection
-EndGlobal
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo/AppDelegate.cs b/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo/AppDelegate.cs
deleted file mode 100644
index 55465affa..000000000
--- a/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo/AppDelegate.cs
+++ /dev/null
@@ -1,420 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-
-using MonoTouch.Foundation;
-using MonoTouch.UIKit;
-
-using MBProgressHUD;
-using MonoTouch.Dialog;
-
-namespace MBProgressHUDDemo
-{
- // The UIApplicationDelegate for the application. This class is responsible for launching the
- // User Interface of the application, as well as listening (and optionally responding) to
- // application events from iOS.
- [Register ("AppDelegate")]
- public partial class AppDelegate : UIApplicationDelegate
- {
- // class-level declarations
- UIWindow window;
- UINavigationController navController;
- DialogViewController dvcDialog;
- MTMBProgressHUD hud;
-
- // vars for managing NSUrlConnection Demo
- public long expectedLength;
- public long currentLength;
-
- //
- // This method is invoked when the application has loaded and is ready to run. In this
- // method you should instantiate the window, load the UI into it and then make the window
- // visible.
- //
- // You have 17 seconds to return from this method, or iOS will terminate your application.
- //
- public override bool FinishedLaunching (UIApplication app, NSDictionary options)
- {
- window = new UIWindow (UIScreen.MainScreen.Bounds);
-
- var root = new RootElement("MBProgressHUD")
- {
- new Section ("Samples")
- {
- new StringElement ("Simple indeterminate progress", ShowSimple),
- new StringElement ("With label", ShowWithLabel),
- new StringElement ("With details label", ShowWithDetailsLabel),
- new StringElement ("Determinate mode", ShowWithLabelDeterminate),
- new StringElement ("Annular determinate mode", ShowWithLabelAnnularDeterminate),
- new StringElement ("Horizontal determinate mode", ShowWithLabelDeterminateHorizontalBar),
- new StringElement ("Custom view", ShowWithCustomView),
- new StringElement ("Mode switching", ShowWithLabelMixed),
- new StringElement ("Using handlers", ShowUsingHandlers),
- new StringElement ("On Window", ShowOnWindow),
- new StringElement ("NSURLConnection", ShowUrl),
- new StringElement ("Dim background", ShowWithGradient),
- new StringElement ("Text only", ShowTextOnly),
- new StringElement ("Colored", ShowWithColor),
- }
- };
-
-
- dvcDialog = new DialogViewController(UITableViewStyle.Grouped, root, false);
- navController = new UINavigationController(dvcDialog);
-
- window.RootViewController = navController;
- window.MakeKeyAndVisible ();
-
- return true;
- }
-
- #region Button Actions
- void ShowSimple ()
- {
- // The hud will dispable all input on the view (use the higest view possible in the view hierarchy)
- hud = new MTMBProgressHUD (navController.View);
- navController.View.AddSubview (hud);
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- // Show the HUD while the provided method executes in a new thread
- hud.Show (new MonoTouch.ObjCRuntime.Selector("MyTask"), this, null, true);
- }
-
- void ShowWithLabel ()
- {
- // The hud will dispable all input on the view (use the higest view possible in the view hierarchy)
- hud = new MTMBProgressHUD (navController.View);
- navController.View.AddSubview (hud);
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- // Add information to your HUD
- hud.LabelText = "Loading";
-
- // Show the HUD while the provided method executes in a new thread
- hud.Show (new MonoTouch.ObjCRuntime.Selector ("MyTask"), this, null, true);
- }
-
- void ShowWithDetailsLabel ()
- {
- // The hud will dispable all input on the view (use the higest view possible in the view hierarchy)
- hud = new MTMBProgressHUD (navController.View);
- navController.View.AddSubview (hud);
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- // Add information to your HUD
- hud.LabelText = "Loading";
- hud.DetailsLabelText = "updating data";
- hud.Square = true;
-
- // Show the HUD while the provided method executes in a new thread
- hud.Show (new MonoTouch.ObjCRuntime.Selector ("MyTask"), this, null, true);
- }
-
- void ShowWithLabelDeterminate ()
- {
- // The hud will dispable all input on the view (use the higest view possible in the view hierarchy)
- hud = new MTMBProgressHUD (navController.View);
- navController.View.AddSubview (hud);
-
- // Set determinate mode
- hud.Mode = MBProgressHUDMode.Determinate;
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- // Add information to your HUD
- hud.LabelText = "Loading";
-
- // Show the HUD while the provided method executes in a new thread
- hud.Show (new MonoTouch.ObjCRuntime.Selector ("MyProgressTask"), this, null, true);
- }
-
- void ShowWithLabelAnnularDeterminate ()
- {
- // The hud will dispable all input on the view (use the higest view possible in the view hierarchy)
- hud = new MTMBProgressHUD (navController.View);
- navController.View.AddSubview(hud);
-
- // Set determinate mode
- hud.Mode = MBProgressHUDMode.AnnularDeterminate;
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- // Add information to your HUD
- hud.LabelText = "Loading";
-
- // Show the HUD while the provided method executes in a new thread
- hud.Show (new MonoTouch.ObjCRuntime.Selector ("MyProgressTask"), this, null, true);
- }
-
- void ShowWithLabelDeterminateHorizontalBar ()
- {
- // The hud will dispable all input on the view (use the higest view possible in the view hierarchy)
- hud = new MTMBProgressHUD (navController.View);
- navController.View.AddSubview(hud);
-
- // Set determinate mode
- hud.Mode = MBProgressHUDMode.DeterminateHorizontalBar;
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- // Add information to your HUD
- hud.LabelText = "Loading";
-
- // Show the HUD while the provided method executes in a new thread
- hud.Show (new MonoTouch.ObjCRuntime.Selector ("MyProgressTask"), this, null, true);
- }
-
- void ShowWithCustomView ()
- {
- // The hud will dispable all input on the view (use the higest view possible in the view hierarchy)
- hud = new MTMBProgressHUD (navController.View);
- navController.View.AddSubview (hud);
-
- // Set custom view mode
- hud.Mode = MBProgressHUDMode.CustomView;
-
- // The sample image is based on the work by http://www.pixelpressicons.com, http://creativecommons.org/licenses/by/2.5/ca/
- // Make the customViews 37 by 37 pixels for best results (those are the bounds of the build-in progress indicators)
- hud.CustomView = new UIImageView (UIImage.FromBundle ("37x-Checkmark.png"));
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- // Add information to your HUD
- hud.LabelText = "Completed";
-
- // Show the HUD
- hud.Show(true);
-
- // Hide the HUD after 3 seconds
- hud.Hide (true, 3);
- }
-
- void ShowWithLabelMixed ()
- {
- // The hud will dispable all input on the view (use the higest view possible in the view hierarchy)
- hud = new MTMBProgressHUD (navController.View);
- navController.View.AddSubview (hud);
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- // Add information to your HUD
- hud.LabelText = "Connecting";
- hud.MinSize = new System.Drawing.SizeF (135f, 135f);
-
- // Show the HUD while the provided method executes in a new thread
- hud.Show (new MonoTouch.ObjCRuntime.Selector ("MyMixedTask"), this, null, true);
- }
-
- void ShowUsingHandlers ()
- {
- // The hud will dispable all input on the view (use the higest view possible in the view hierarchy)
- hud = new MTMBProgressHUD (navController.View);
- navController.View.AddSubview (hud);
-
- // Add information to your HUD
- hud.LabelText = "With a handler";
-
- // We show the hud while executing MyTask, and then we clean up
- hud.Show (true, () => {
- MyTask();
- }, () => {
- hud.RemoveFromSuperview();
- hud = null;
- });
- }
-
- void ShowOnWindow ()
- {
- // The hud will dispable all input on the window
- hud = new MTMBProgressHUD (window);
- this.window.AddSubview (hud);
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- // Add information to your HUD
- hud.LabelText = "Loading";
-
- // Show the HUD while the provided method executes in a new thread
- hud.Show (new MonoTouch.ObjCRuntime.Selector ("MyTask"), this, null, true);
- }
-
- void ShowUrl ()
- {
- // Show the hud on top most view
- hud = MTMBProgressHUD.ShowHUD (this.navController.View, true);
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- NSUrl url = new NSUrl ("https://github.com/matej/MBProgressHUD/zipball/master");
- NSUrlRequest request = new NSUrlRequest (url);
-
- NSUrlConnection connection = new NSUrlConnection (request, new MyNSUrlConnectionDelegete (this, hud));
- connection.Start();
- }
-
- void ShowWithGradient ()
- {
- // The hud will dispable all input on the view (use the higest view possible in the view hierarchy)
- hud = new MTMBProgressHUD (navController.View);
- navController.View.AddSubview (hud);
-
- // Set HUD to dim Background
- hud.DimBackground = true;
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- // Show the HUD while the provided method executes in a new thread
- hud.Show(new MonoTouch.ObjCRuntime.Selector ("MyTask"), this, null, true);
- }
-
- void ShowTextOnly ()
- {
- // Show the hud on top most view
- hud = MTMBProgressHUD.ShowHUD (this.navController.View, true);
-
- // Configure for text only and offset down
- hud.Mode = MBProgressHUDMode.Text;
- hud.LabelText = "Some message...";
- hud.Margin = 10f;
- hud.YOffset = 150f;
- hud.RemoveFromSuperViewOnHide = true;
-
- hud.Hide (true, 3);
- }
-
- void ShowWithColor ()
- {
- // The hud will dispable all input on the view (use the higest view possible in the view hierarchy)
- hud = new MTMBProgressHUD (navController.View);
- navController.View.AddSubview (hud);
-
- // Set the hud to display with a color
- hud.Color = new UIColor (0.23f, 0.5f, 0.82f, 0.90f);
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- // Show the HUD while the provided method executes in a new thread
- hud.Show(new MonoTouch.ObjCRuntime.Selector ("MyTask"), this, null, true);
- }
-
- #endregion
-
- #region fake tasks and Hide Handler
-
- [Export ("MyTask")]
- void MyTask ()
- {
- System.Threading.Thread.Sleep(3000);
- }
-
- [Export ("MyProgressTask")]
- void MyProgressTask ()
- {
- float progress = 0.0f;
-
- while (progress < 1.0f) {
- progress += 0.01f;
- hud.Progress = progress;
- System.Threading.Thread.Sleep(50);
- }
- }
-
- [Export ("MyMixedTask")]
- void MyMixedTask ()
- {
- // Indeterminate mode
- System.Threading.Thread.Sleep(2000);
-
- // Switch to determinate mode
- hud.Mode = MBProgressHUDMode.Determinate;
- hud.LabelText = "Progress";
- float progress = 0.0f;
- while (progress < 1.0f)
- {
- progress += 0.01f;
- hud.Progress = progress;
- System.Threading.Thread.Sleep(50);
- }
-
- // Back to indeterminate mode
- hud.Mode = MBProgressHUDMode.Indeterminate;
- hud.LabelText = "Cleaning up";
- System.Threading.Thread.Sleep(2000);
-
- // The sample image is based on the work by www.pixelpressicons.com, http://creativecommons.org/licenses/by/2.5/ca/
- // Make the customViews 37 by 37 pixels for best results (those are the bounds of the build-in progress indicators)
- // Since HUD is already on screen, we must set It's custom vien on Main Thread
- BeginInvokeOnMainThread ( ()=> {
- hud.CustomView = new UIImageView (UIImage.FromBundle ("37x-Checkmark.png"));
- });
-
- hud.Mode = MBProgressHUDMode.CustomView;
- hud.LabelText = "Completed";
- System.Threading.Thread.Sleep (2000);
- }
-
- void HandleDidHide (object sender, EventArgs e)
- {
- hud.RemoveFromSuperview();
- hud = null;
- }
-
- #endregion
- }
-
- // Custom NSUrlConnectionDelegate that handles NSUrlConnection Events
- public class MyNSUrlConnectionDelegete : MonoTouch.Foundation.NSUrlConnectionDelegate
- {
- AppDelegate del;
- MTMBProgressHUD hud;
-
- public MyNSUrlConnectionDelegete (AppDelegate del, MTMBProgressHUD hud)
- {
- this.del = del;
- this.hud = hud;
- }
-
- public override void ReceivedResponse (NSUrlConnection connection, NSUrlResponse response)
- {
- del.expectedLength = response.ExpectedContentLength;
- del.currentLength = 0;
- hud.Mode = MBProgressHUDMode.Determinate;
- }
-
- public override void ReceivedData (NSUrlConnection connection, NSData data)
- {
- del.currentLength += data.Length;
- hud.Progress = (del.currentLength / (float) del.expectedLength);
- }
-
- public override void FinishedLoading (NSUrlConnection connection)
- {
- BeginInvokeOnMainThread ( ()=> {
- hud.CustomView = new UIImageView (UIImage.FromBundle ("37x-Checkmark.png"));
- });
- hud.Mode = MBProgressHUDMode.CustomView;
- hud.Hide(true, 2);
- }
-
- public override void FailedWithError (NSUrlConnection connection, NSError error)
- {
- hud.Hide(true);
- }
- }
-}
-
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo/Info.plist b/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo/Info.plist
deleted file mode 100644
index 213aa8747..000000000
--- a/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo/Info.plist
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
- CFBundleIconFiles
-
- Icon.png
- Icon@2x.png
-
- UIDeviceFamily
-
- 1
-
- UISupportedInterfaceOrientations
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
-
-
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo/MBProgressHUDDemo.csproj b/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo/MBProgressHUDDemo.csproj
deleted file mode 100644
index 654f1b8c9..000000000
--- a/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo/MBProgressHUDDemo.csproj
+++ /dev/null
@@ -1,109 +0,0 @@
-
-
-
- Debug
- iPhoneSimulator
- 10.0.0
- 2.0
- {9B7943D5-29E1-4F04-B9F5-0D640BB05D06}
- {6BC8ED88-2882-458C-8E55-DFD12B67127B};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
- Exe
- MBProgressHUDDemo
- Resources
- MBProgressHUDDemo
-
-
- True
- full
- False
- bin\iPhoneSimulator\Debug
- DEBUG;
- prompt
- 4
- False
- True
- True
- None
-
-
- none
- True
- bin\iPhoneSimulator\Release
- prompt
- 4
- False
- None
-
-
- True
- full
- False
- bin\iPhone\Debug
- DEBUG;
- prompt
- 4
- False
- iPhone Developer
- True
- True
-
-
- none
- True
- bin\iPhone\Release
- prompt
- 4
- False
- iPhone Developer
-
-
- none
- True
- bin\iPhone\Ad-Hoc
- prompt
- 4
- True
- False
- Automatic:AdHoc
- iPhone Distribution
-
-
- none
- True
- bin\iPhone\AppStore
- prompt
- 4
- False
- iPhone Distribution
- Automatic:AppStore
-
-
-
-
-
-
-
-
- ../../../lib\/ios/MBProgressHUD.dll
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo/Main.cs b/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo/Main.cs
deleted file mode 100644
index 5b8ff936d..000000000
--- a/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo/Main.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-
-using MonoTouch.Foundation;
-using MonoTouch.UIKit;
-
-namespace MBProgressHUDDemo
-{
- public class Application
- {
- // This is the main entry point of the application.
- static void Main (string[] args)
- {
- // if you want to use a different Application Delegate class from "AppDelegate"
- // you can specify it here.
- UIApplication.Main (args, null, "AppDelegate");
- }
- }
-}
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/37x-Checkmark.png b/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/37x-Checkmark.png
deleted file mode 100644
index 89c31d3c2..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/37x-Checkmark.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/37x-Checkmark@2x.png b/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/37x-Checkmark@2x.png
deleted file mode 100644
index 5ac8c212d..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/37x-Checkmark@2x.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Default-568h@2x.png b/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Default-568h@2x.png
deleted file mode 100644
index e9ab88709..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Default-568h@2x.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Default.png b/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Default.png
deleted file mode 100644
index d744bd7ca..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Default.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Default@2x.png b/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Default@2x.png
deleted file mode 100644
index 79ad3dad0..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Default@2x.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Icon.png b/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Icon.png
deleted file mode 100644
index 430cb6c27..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Icon.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Icon@2x.png b/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Icon@2x.png
deleted file mode 100644
index 68d2e0bef..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.8/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Icon@2x.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0.info b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0.info
deleted file mode 100644
index 175a7bf33..000000000
--- a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0.info
+++ /dev/null
@@ -1 +0,0 @@
-{"Name":"Progress HUD","Id":1111,"Alias":"mbprogresshud","Description":"Progress HUD (a.k.a. MBProgressHUD) is a translucent, HUD-style dialog\nthat shows a progress indicator and a status label. It\u0027s the perfect\ncontrol for giving the user feedback when work is being done in a\nbackground thread.\n\nHere\u0027s an example:\n\n```csharp\nusing MBProgressHUD;\n...\n\npublic override void ViewDidLoad ()\n{\n\tbase.ViewDidLoad ();\n\n\tvar hud = new MTMBProgressHUD (View) {\n\t\tLabelText = \"Waiting...\",\n\t\tRemoveFromSuperViewOnHide = true\n\t};\n\n\tView.AddSubview (hud);\n\t\t\n\thud.Show (animated: true);\n\thud.Hide (animated: true, delay: 5);\n}\n```\n\n*Some component screenshots assembled with [PlaceIt](http://placeit.breezi.com/).*\n","Version":"0.9.0","Summary":"A translucent, HUD-style dialog that shows a progress indicator and a status label.","QuickStart":"Progress HUD (a.k.a. MBProgressHUD) is a translucent, HUD-style dialog\nthat shows a progress indicator and a status label. It\u0027s the perfect\ncontrol for giving the user feedback when work is being done in a\nbackground thread.\n\nHere\u0027s an example:\n\n```csharp\nusing MBProgressHUD;\n...\n\npublic override void ViewDidLoad ()\n{\n\tbase.ViewDidLoad ();\n\t\n\tvar hud = new MTMBProgressHUD (View) {\n\t\tLabelText = \"Waiting...\",\n\t\tRemoveFromSuperViewOnHide = true\n\t};\n\n\tView.AddSubview (hud);\n\t\t\n\thud.Show (animated: true);\n\thud.Hide (animated: true, delay: 5);\n}\n```\n\n## Details\n\nThe main guideline you need to follow when dealing with MBProgressHUD while running long-running\ntasks is keeping the main thread work-free, so the UI can be updated promptly. This is accomplished\nby using MBProgressHUD on the main thread to show progress, while running heavy tasks on a\nbackground thread.\n","Hash":"9e8d921cad414729a5b04a1179f6fcda","TargetPlatforms":["ios"],"TrialHash":null}
\ No newline at end of file
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0.png b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0.png
deleted file mode 100644
index 8b90c637c..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/component/Details.md b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/component/Details.md
deleted file mode 100644
index 06deaa684..000000000
--- a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/component/Details.md
+++ /dev/null
@@ -1,28 +0,0 @@
-Progress HUD (a.k.a. MBProgressHUD) is a translucent, HUD-style dialog
-that shows a progress indicator and a status label. It's the perfect
-control for giving the user feedback when work is being done in a
-background thread.
-
-Here's an example:
-
-```csharp
-using MBProgressHUD;
-...
-
-public override void ViewDidLoad ()
-{
- base.ViewDidLoad ();
-
- var hud = new MTMBProgressHUD (View) {
- LabelText = "Waiting...",
- RemoveFromSuperViewOnHide = true
- };
-
- View.AddSubview (hud);
-
- hud.Show (animated: true);
- hud.Hide (animated: true, delay: 5);
-}
-```
-
-*Some component screenshots assembled with [PlaceIt](http://placeit.breezi.com/).*
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/component/GettingStarted.md b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/component/GettingStarted.md
deleted file mode 100644
index a15cd8c83..000000000
--- a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/component/GettingStarted.md
+++ /dev/null
@@ -1,33 +0,0 @@
-Progress HUD (a.k.a. MBProgressHUD) is a translucent, HUD-style dialog
-that shows a progress indicator and a status label. It's the perfect
-control for giving the user feedback when work is being done in a
-background thread.
-
-Here's an example:
-
-```csharp
-using MBProgressHUD;
-...
-
-public override void ViewDidLoad ()
-{
- base.ViewDidLoad ();
-
- var hud = new MTMBProgressHUD (View) {
- LabelText = "Waiting...",
- RemoveFromSuperViewOnHide = true
- };
-
- View.AddSubview (hud);
-
- hud.Show (animated: true);
- hud.Hide (animated: true, delay: 5);
-}
-```
-
-## Details
-
-The main guideline you need to follow when dealing with MBProgressHUD while running long-running
-tasks is keeping the main thread work-free, so the UI can be updated promptly. This is accomplished
-by using MBProgressHUD on the main thread to show progress, while running heavy tasks on a
-background thread.
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/component/License.md b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/component/License.md
deleted file mode 100644
index 44ad9854c..000000000
--- a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/component/License.md
+++ /dev/null
@@ -1,8 +0,0 @@
-The MIT License (MIT)
-Copyright (c) 2013 Jonathan George
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/component/Manifest.xml b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/component/Manifest.xml
deleted file mode 100644
index 8153d2f48..000000000
--- a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/component/Manifest.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
- Progress HUD
- Xamarin Inc
- http://xamarin.com/
- https://github.com/jdg/MBProgressHUD
- 0.9.0
- A translucent, HUD-style dialog that shows a progress indicator and a status label.
-
-
-
-
-
- iOS Unified Sample
- iOS Unified Sample
-
-
- iOS Classic Sample
- iOS Classic Sample
-
-
-
\ No newline at end of file
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/component/icons/mbprogresshud_128x128.png b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/component/icons/mbprogresshud_128x128.png
deleted file mode 100644
index 8b90c637c..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/component/icons/mbprogresshud_128x128.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/component/icons/mbprogresshud_512x512.png b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/component/icons/mbprogresshud_512x512.png
deleted file mode 100644
index f490b0677..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/component/icons/mbprogresshud_512x512.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/component/screenshots/screenshot1.png b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/component/screenshots/screenshot1.png
deleted file mode 100644
index eaad3281b..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/component/screenshots/screenshot1.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/lib/ios-unified/MBProgressHUD.dll b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/lib/ios-unified/MBProgressHUD.dll
deleted file mode 100644
index b4546a404..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/lib/ios-unified/MBProgressHUD.dll and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/lib/ios/MBProgressHUD.dll b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/lib/ios/MBProgressHUD.dll
deleted file mode 100644
index ae9e01737..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/lib/ios/MBProgressHUD.dll and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo-classic.sln b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo-classic.sln
deleted file mode 100644
index e5772e134..000000000
--- a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo-classic.sln
+++ /dev/null
@@ -1,26 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MBProgressHUDDemo-classic", "MBProgressHUDDemo\MBProgressHUDDemo-classic.csproj", "{9B7943D5-29E1-4F04-B9F5-0D640BB05D06}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|iPhoneSimulator = Debug|iPhoneSimulator
- Release|iPhoneSimulator = Release|iPhoneSimulator
- Debug|iPhone = Debug|iPhone
- Release|iPhone = Release|iPhone
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {9B7943D5-29E1-4F04-B9F5-0D640BB05D06}.Debug|iPhone.ActiveCfg = Debug|iPhone
- {9B7943D5-29E1-4F04-B9F5-0D640BB05D06}.Debug|iPhone.Build.0 = Debug|iPhone
- {9B7943D5-29E1-4F04-B9F5-0D640BB05D06}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
- {9B7943D5-29E1-4F04-B9F5-0D640BB05D06}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
- {9B7943D5-29E1-4F04-B9F5-0D640BB05D06}.Release|iPhone.ActiveCfg = Release|iPhone
- {9B7943D5-29E1-4F04-B9F5-0D640BB05D06}.Release|iPhone.Build.0 = Release|iPhone
- {9B7943D5-29E1-4F04-B9F5-0D640BB05D06}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
- {9B7943D5-29E1-4F04-B9F5-0D640BB05D06}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
- EndGlobalSection
- GlobalSection(MonoDevelopProperties) = preSolution
- StartupItem = MBProgressHUDDemo\MBProgressHUDDemo-classic.csproj
- EndGlobalSection
-EndGlobal
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/AppDelegate.cs b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/AppDelegate.cs
deleted file mode 100644
index c9f524abf..000000000
--- a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/AppDelegate.cs
+++ /dev/null
@@ -1,428 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-
-#if __UNIFIED__
-using Foundation;
-using UIKit;
-using ObjCRuntime;
-#else
-using MonoTouch.Foundation;
-using MonoTouch.UIKit;
-using MonoTouch.ObjCRuntime;
-using nuint = global::System.UInt32;
-#endif
-
-using MBProgressHUD;
-using MonoTouch.Dialog;
-
-namespace MBProgressHUDDemo
-{
- // The UIApplicationDelegate for the application. This class is responsible for launching the
- // User Interface of the application, as well as listening (and optionally responding) to
- // application events from iOS.
- [Register ("AppDelegate")]
- public partial class AppDelegate : UIApplicationDelegate
- {
- // class-level declarations
- UIWindow window;
- UINavigationController navController;
- DialogViewController dvcDialog;
- MTMBProgressHUD hud;
-
- // vars for managing NSUrlConnection Demo
- public long expectedLength;
- public nuint currentLength;
-
- //
- // This method is invoked when the application has loaded and is ready to run. In this
- // method you should instantiate the window, load the UI into it and then make the window
- // visible.
- //
- // You have 17 seconds to return from this method, or iOS will terminate your application.
- //
- public override bool FinishedLaunching (UIApplication app, NSDictionary options)
- {
- window = new UIWindow (UIScreen.MainScreen.Bounds);
-
- var root = new RootElement("MBProgressHUD")
- {
- new Section ("Samples")
- {
- new StringElement ("Simple indeterminate progress", ShowSimple),
- new StringElement ("With label", ShowWithLabel),
- new StringElement ("With details label", ShowWithDetailsLabel),
- new StringElement ("Determinate mode", ShowWithLabelDeterminate),
- new StringElement ("Annular determinate mode", ShowWithLabelAnnularDeterminate),
- new StringElement ("Horizontal determinate mode", ShowWithLabelDeterminateHorizontalBar),
- new StringElement ("Custom view", ShowWithCustomView),
- new StringElement ("Mode switching", ShowWithLabelMixed),
- new StringElement ("Using handlers", ShowUsingHandlers),
- new StringElement ("On Window", ShowOnWindow),
- new StringElement ("NSURLConnection", ShowUrl),
- new StringElement ("Dim background", ShowWithGradient),
- new StringElement ("Text only", ShowTextOnly),
- new StringElement ("Colored", ShowWithColor),
- }
- };
-
-
- dvcDialog = new DialogViewController(UITableViewStyle.Grouped, root, false);
- navController = new UINavigationController(dvcDialog);
-
- window.RootViewController = navController;
- window.MakeKeyAndVisible ();
-
- return true;
- }
-
- #region Button Actions
- void ShowSimple ()
- {
- // The hud will dispable all input on the view (use the higest view possible in the view hierarchy)
- hud = new MTMBProgressHUD (navController.View);
- navController.View.AddSubview (hud);
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- // Show the HUD while the provided method executes in a new thread
- hud.Show (new Selector("MyTask"), this, null, true);
- }
-
- void ShowWithLabel ()
- {
- // The hud will dispable all input on the view (use the higest view possible in the view hierarchy)
- hud = new MTMBProgressHUD (navController.View);
- navController.View.AddSubview (hud);
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- // Add information to your HUD
- hud.LabelText = "Loading";
-
- // Show the HUD while the provided method executes in a new thread
- hud.Show (new Selector ("MyTask"), this, null, true);
- }
-
- void ShowWithDetailsLabel ()
- {
- // The hud will dispable all input on the view (use the higest view possible in the view hierarchy)
- hud = new MTMBProgressHUD (navController.View);
- navController.View.AddSubview (hud);
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- // Add information to your HUD
- hud.LabelText = "Loading";
- hud.DetailsLabelText = "updating data";
- hud.Square = true;
-
- // Show the HUD while the provided method executes in a new thread
- hud.Show (new Selector ("MyTask"), this, null, true);
- }
-
- void ShowWithLabelDeterminate ()
- {
- // The hud will dispable all input on the view (use the higest view possible in the view hierarchy)
- hud = new MTMBProgressHUD (navController.View);
- navController.View.AddSubview (hud);
-
- // Set determinate mode
- hud.Mode = MBProgressHUDMode.Determinate;
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- // Add information to your HUD
- hud.LabelText = "Loading";
-
- // Show the HUD while the provided method executes in a new thread
- hud.Show (new Selector ("MyProgressTask"), this, null, true);
- }
-
- void ShowWithLabelAnnularDeterminate ()
- {
- // The hud will dispable all input on the view (use the higest view possible in the view hierarchy)
- hud = new MTMBProgressHUD (navController.View);
- navController.View.AddSubview(hud);
-
- // Set determinate mode
- hud.Mode = MBProgressHUDMode.AnnularDeterminate;
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- // Add information to your HUD
- hud.LabelText = "Loading";
-
- // Show the HUD while the provided method executes in a new thread
- hud.Show (new Selector ("MyProgressTask"), this, null, true);
- }
-
- void ShowWithLabelDeterminateHorizontalBar ()
- {
- // The hud will dispable all input on the view (use the higest view possible in the view hierarchy)
- hud = new MTMBProgressHUD (navController.View);
- navController.View.AddSubview(hud);
-
- // Set determinate mode
- hud.Mode = MBProgressHUDMode.DeterminateHorizontalBar;
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- // Add information to your HUD
- hud.LabelText = "Loading";
-
- // Show the HUD while the provided method executes in a new thread
- hud.Show (new Selector ("MyProgressTask"), this, null, true);
- }
-
- void ShowWithCustomView ()
- {
- // The hud will dispable all input on the view (use the higest view possible in the view hierarchy)
- hud = new MTMBProgressHUD (navController.View);
- navController.View.AddSubview (hud);
-
- // Set custom view mode
- hud.Mode = MBProgressHUDMode.CustomView;
-
- // The sample image is based on the work by http://www.pixelpressicons.com, http://creativecommons.org/licenses/by/2.5/ca/
- // Make the customViews 37 by 37 pixels for best results (those are the bounds of the build-in progress indicators)
- hud.CustomView = new UIImageView (UIImage.FromBundle ("37x-Checkmark.png"));
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- // Add information to your HUD
- hud.LabelText = "Completed";
-
- // Show the HUD
- hud.Show(true);
-
- // Hide the HUD after 3 seconds
- hud.Hide (true, 3);
- }
-
- void ShowWithLabelMixed ()
- {
- // The hud will dispable all input on the view (use the higest view possible in the view hierarchy)
- hud = new MTMBProgressHUD (navController.View);
- navController.View.AddSubview (hud);
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- // Add information to your HUD
- hud.LabelText = "Connecting";
- hud.MinSize = new System.Drawing.SizeF (135f, 135f);
-
- // Show the HUD while the provided method executes in a new thread
- hud.Show (new Selector ("MyMixedTask"), this, null, true);
- }
-
- void ShowUsingHandlers ()
- {
- // The hud will dispable all input on the view (use the higest view possible in the view hierarchy)
- hud = new MTMBProgressHUD (navController.View);
- navController.View.AddSubview (hud);
-
- // Add information to your HUD
- hud.LabelText = "With a handler";
-
- // We show the hud while executing MyTask, and then we clean up
- hud.Show (true, () => {
- MyTask();
- }, () => {
- hud.RemoveFromSuperview();
- hud = null;
- });
- }
-
- void ShowOnWindow ()
- {
- // The hud will dispable all input on the window
- hud = new MTMBProgressHUD (window);
- this.window.AddSubview (hud);
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- // Add information to your HUD
- hud.LabelText = "Loading";
-
- // Show the HUD while the provided method executes in a new thread
- hud.Show (new Selector ("MyTask"), this, null, true);
- }
-
- void ShowUrl ()
- {
- // Show the hud on top most view
- hud = MTMBProgressHUD.ShowHUD (this.navController.View, true);
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- NSUrl url = new NSUrl ("https://github.com/matej/MBProgressHUD/zipball/master");
- NSUrlRequest request = new NSUrlRequest (url);
-
- NSUrlConnection connection = new NSUrlConnection (request, new MyNSUrlConnectionDelegete (this, hud));
- connection.Start();
- }
-
- void ShowWithGradient ()
- {
- // The hud will dispable all input on the view (use the higest view possible in the view hierarchy)
- hud = new MTMBProgressHUD (navController.View);
- navController.View.AddSubview (hud);
-
- // Set HUD to dim Background
- hud.DimBackground = true;
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- // Show the HUD while the provided method executes in a new thread
- hud.Show(new Selector ("MyTask"), this, null, true);
- }
-
- void ShowTextOnly ()
- {
- // Show the hud on top most view
- hud = MTMBProgressHUD.ShowHUD (this.navController.View, true);
-
- // Configure for text only and offset down
- hud.Mode = MBProgressHUDMode.Text;
- hud.LabelText = "Some message...";
- hud.Margin = 10f;
- hud.YOffset = 150f;
- hud.RemoveFromSuperViewOnHide = true;
-
- hud.Hide (true, 3);
- }
-
- void ShowWithColor ()
- {
- // The hud will dispable all input on the view (use the higest view possible in the view hierarchy)
- hud = new MTMBProgressHUD (navController.View);
- navController.View.AddSubview (hud);
-
- // Set the hud to display with a color
- hud.Color = new UIColor (0.23f, 0.5f, 0.82f, 0.90f);
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- // Show the HUD while the provided method executes in a new thread
- hud.Show(new Selector ("MyTask"), this, null, true);
- }
-
- #endregion
-
- #region fake tasks and Hide Handler
-
- [Export ("MyTask")]
- void MyTask ()
- {
- System.Threading.Thread.Sleep(3000);
- }
-
- [Export ("MyProgressTask")]
- void MyProgressTask ()
- {
- float progress = 0.0f;
-
- while (progress < 1.0f) {
- progress += 0.01f;
- hud.Progress = progress;
- System.Threading.Thread.Sleep(50);
- }
- }
-
- [Export ("MyMixedTask")]
- void MyMixedTask ()
- {
- // Indeterminate mode
- System.Threading.Thread.Sleep(2000);
-
- // Switch to determinate mode
- hud.Mode = MBProgressHUDMode.Determinate;
- hud.LabelText = "Progress";
- float progress = 0.0f;
- while (progress < 1.0f)
- {
- progress += 0.01f;
- hud.Progress = progress;
- System.Threading.Thread.Sleep(50);
- }
-
- // Back to indeterminate mode
- hud.Mode = MBProgressHUDMode.Indeterminate;
- hud.LabelText = "Cleaning up";
- System.Threading.Thread.Sleep(2000);
-
- // The sample image is based on the work by www.pixelpressicons.com, http://creativecommons.org/licenses/by/2.5/ca/
- // Make the customViews 37 by 37 pixels for best results (those are the bounds of the build-in progress indicators)
- // Since HUD is already on screen, we must set It's custom vien on Main Thread
- BeginInvokeOnMainThread ( ()=> {
- hud.CustomView = new UIImageView (UIImage.FromBundle ("37x-Checkmark.png"));
- });
-
- hud.Mode = MBProgressHUDMode.CustomView;
- hud.LabelText = "Completed";
- System.Threading.Thread.Sleep (2000);
- }
-
- void HandleDidHide (object sender, EventArgs e)
- {
- hud.RemoveFromSuperview();
- hud = null;
- }
-
- #endregion
- }
-
- // Custom NSUrlConnectionDelegate that handles NSUrlConnection Events
- public class MyNSUrlConnectionDelegete : NSUrlConnectionDelegate
- {
- AppDelegate del;
- MTMBProgressHUD hud;
-
- public MyNSUrlConnectionDelegete (AppDelegate del, MTMBProgressHUD hud)
- {
- this.del = del;
- this.hud = hud;
- }
-
- public override void ReceivedResponse (NSUrlConnection connection, NSUrlResponse response)
- {
- del.expectedLength = response.ExpectedContentLength;
- del.currentLength = 0;
- hud.Mode = MBProgressHUDMode.Determinate;
- }
-
- public override void ReceivedData (NSUrlConnection connection, NSData data)
- {
- del.currentLength += data.Length;
- hud.Progress = (del.currentLength / (float) del.expectedLength);
- }
-
- public override void FinishedLoading (NSUrlConnection connection)
- {
- BeginInvokeOnMainThread ( ()=> {
- hud.CustomView = new UIImageView (UIImage.FromBundle ("37x-Checkmark.png"));
- });
- hud.Mode = MBProgressHUDMode.CustomView;
- hud.Hide(true, 2);
- }
-
- public override void FailedWithError (NSUrlConnection connection, NSError error)
- {
- hud.Hide(true);
- }
- }
-}
-
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Info.plist b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Info.plist
deleted file mode 100644
index f917428fc..000000000
--- a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
- UIDeviceFamily
-
- 1
- 2
-
- UISupportedInterfaceOrientations
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationPortraitUpsideDown
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
- MinimumOSVersion
- 7.0
- XSAppIconAssets
- Resources/Images.xcassets/AppIcons.appiconset
- XSLaunchImageAssets
- Resources/Images.xcassets/LaunchImage.launchimage
-
-
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/MBProgressHUDDemo-classic.csproj b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/MBProgressHUDDemo-classic.csproj
deleted file mode 100644
index 3c3c8647a..000000000
--- a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/MBProgressHUDDemo-classic.csproj
+++ /dev/null
@@ -1,111 +0,0 @@
-
-
-
- Debug
- iPhoneSimulator
- 8.0.30703
- 2.0
- {9B7943D5-29E1-4F04-B9F5-0D640BB05D06}
- {6BC8ED88-2882-458C-8E55-DFD12B67127B};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
- Exe
- MBProgressHUDDemo
- Resources
- MBProgressHUDDemo
-
-
- True
- full
- False
- bin\classic\iPhoneSimulator\Debug
- obj\classic\iPhoneSimulator\Debug
- DEBUG;
- prompt
- 4
- False
- True
- None
-
-
- i386
-
-
- none
- True
- bin\classic\iPhoneSimulator\Release
- obj\classic\iPhoneSimulator\Release
- prompt
- 4
- False
- None
-
-
- i386
-
-
- True
- full
- False
- bin\classic\iPhone\Debug
- obj\classic\iPhone\Debug
- DEBUG;
- prompt
- 4
- False
- iPhone Developer
- True
-
-
- ARMv7, ARMv7s
-
-
- none
- True
- bin\classic\iPhone\Release
- obj\classic\iPhone\Release
- prompt
- 4
- False
- iPhone Developer
-
-
- ARMv7, ARMv7s
-
-
-
-
-
-
-
-
- ../../../lib\/ios/MBProgressHUD.dll
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Main.cs b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Main.cs
deleted file mode 100644
index 902aba186..000000000
--- a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Main.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-
-#if __UNIFIED__
-using Foundation;
-using UIKit;
-#else
-using MonoTouch.Foundation;
-using MonoTouch.UIKit;
-#endif
-
-namespace MBProgressHUDDemo
-{
- public class Application
- {
- // This is the main entry point of the application.
- static void Main (string[] args)
- {
- // if you want to use a different Application Delegate class from "AppDelegate"
- // you can specify it here.
- UIApplication.Main (args, null, "AppDelegate");
- }
- }
-}
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/37x-Checkmark.png b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/37x-Checkmark.png
deleted file mode 100644
index 89c31d3c2..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/37x-Checkmark.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/37x-Checkmark@2x.png b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/37x-Checkmark@2x.png
deleted file mode 100644
index 5ac8c212d..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/37x-Checkmark@2x.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/Images.xcassets/AppIcons.appiconset/Contents.json b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/Images.xcassets/AppIcons.appiconset/Contents.json
deleted file mode 100644
index 66ecbc8d3..000000000
--- a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/Images.xcassets/AppIcons.appiconset/Contents.json
+++ /dev/null
@@ -1 +0,0 @@
-{"images":[{"idiom":"iphone","filename":"Icon.png","size":"57x57","scale":"1x"},{"idiom":"iphone","filename":"Icon@2x.png","size":"57x57","scale":"2x"}],"info":{"version":1,"author":"xcode"}}
\ No newline at end of file
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/Images.xcassets/AppIcons.appiconset/Icon.png b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/Images.xcassets/AppIcons.appiconset/Icon.png
deleted file mode 100644
index 430cb6c27..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/Images.xcassets/AppIcons.appiconset/Icon.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/Images.xcassets/AppIcons.appiconset/Icon@2x.png b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/Images.xcassets/AppIcons.appiconset/Icon@2x.png
deleted file mode 100644
index 68d2e0bef..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/Images.xcassets/AppIcons.appiconset/Icon@2x.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Contents.json b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Contents.json
deleted file mode 100644
index 8e0a67799..000000000
--- a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Contents.json
+++ /dev/null
@@ -1,65 +0,0 @@
-{
- "images": [
- {
- "orientation": "portrait",
- "idiom": "iphone",
- "extent": "full-screen",
- "filename": "Default.png",
- "size": "320x480",
- "scale": "1x"
- },
- {
- "orientation": "portrait",
- "idiom": "iphone",
- "extent": "full-screen",
- "filename": "Default@2x.png",
- "size": "320x480",
- "scale": "2x"
- },
- {
- "orientation": "portrait",
- "idiom": "iphone",
- "extent": "full-screen",
- "filename": "Default-568h@2x.png",
- "size": "320x568",
- "subtype": "retina4",
- "scale": "2x"
- },
- {
- "orientation": "portrait",
- "idiom": "ipad",
- "extent": "to-status-bar",
- "filename": "Default-Portrait~ipad.png",
- "size": "768x1004",
- "scale": "1x"
- },
- {
- "orientation": "landscape",
- "idiom": "ipad",
- "extent": "to-status-bar",
- "filename": "Default-Landscape~ipad.png",
- "size": "1024x748",
- "scale": "1x"
- },
- {
- "orientation": "portrait",
- "idiom": "ipad",
- "extent": "to-status-bar",
- "filename": "Default-Portrait@2x~ipad.png",
- "size": "768x1004",
- "scale": "2x"
- },
- {
- "orientation": "landscape",
- "idiom": "ipad",
- "extent": "to-status-bar",
- "filename": "Default-Landscape@2x~ipad.png",
- "size": "1024x748",
- "scale": "2x"
- }
- ],
- "info": {
- "version": 1,
- "author": "xcode"
- }
-}
\ No newline at end of file
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default-568h@2x.png b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default-568h@2x.png
deleted file mode 100644
index 3a34926de..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default-568h@2x.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default-Landscape@2x~ipad.png b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default-Landscape@2x~ipad.png
deleted file mode 100644
index 083108d43..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default-Landscape@2x~ipad.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default-Landscape~ipad.png b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default-Landscape~ipad.png
deleted file mode 100644
index fa60c33fc..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default-Landscape~ipad.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default-Portrait@2x~ipad.png b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default-Portrait@2x~ipad.png
deleted file mode 100644
index a918de883..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default-Portrait@2x~ipad.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default-Portrait~ipad.png b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default-Portrait~ipad.png
deleted file mode 100644
index 9f687505f..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default-Portrait~ipad.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default.png b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default.png
deleted file mode 100644
index 4b9b9f146..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default@2x.png b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default@2x.png
deleted file mode 100644
index a7349599a..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo-classic/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default@2x.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo.sln b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo.sln
deleted file mode 100644
index e19cf48aa..000000000
--- a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo.sln
+++ /dev/null
@@ -1,26 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MBProgressHUDDemo", "MBProgressHUDDemo\MBProgressHUDDemo.csproj", "{9B7943D5-29E1-4F04-B9F5-0D640BB05D06}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|iPhoneSimulator = Debug|iPhoneSimulator
- Release|iPhoneSimulator = Release|iPhoneSimulator
- Debug|iPhone = Debug|iPhone
- Release|iPhone = Release|iPhone
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {9B7943D5-29E1-4F04-B9F5-0D640BB05D06}.Debug|iPhone.ActiveCfg = Debug|iPhone
- {9B7943D5-29E1-4F04-B9F5-0D640BB05D06}.Debug|iPhone.Build.0 = Debug|iPhone
- {9B7943D5-29E1-4F04-B9F5-0D640BB05D06}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
- {9B7943D5-29E1-4F04-B9F5-0D640BB05D06}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
- {9B7943D5-29E1-4F04-B9F5-0D640BB05D06}.Release|iPhone.ActiveCfg = Release|iPhone
- {9B7943D5-29E1-4F04-B9F5-0D640BB05D06}.Release|iPhone.Build.0 = Release|iPhone
- {9B7943D5-29E1-4F04-B9F5-0D640BB05D06}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
- {9B7943D5-29E1-4F04-B9F5-0D640BB05D06}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
- EndGlobalSection
- GlobalSection(MonoDevelopProperties) = preSolution
- StartupItem = MBProgressHUDDemo\MBProgressHUDDemo.csproj
- EndGlobalSection
-EndGlobal
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/AppDelegate.cs b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/AppDelegate.cs
deleted file mode 100644
index c9f524abf..000000000
--- a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/AppDelegate.cs
+++ /dev/null
@@ -1,428 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-
-#if __UNIFIED__
-using Foundation;
-using UIKit;
-using ObjCRuntime;
-#else
-using MonoTouch.Foundation;
-using MonoTouch.UIKit;
-using MonoTouch.ObjCRuntime;
-using nuint = global::System.UInt32;
-#endif
-
-using MBProgressHUD;
-using MonoTouch.Dialog;
-
-namespace MBProgressHUDDemo
-{
- // The UIApplicationDelegate for the application. This class is responsible for launching the
- // User Interface of the application, as well as listening (and optionally responding) to
- // application events from iOS.
- [Register ("AppDelegate")]
- public partial class AppDelegate : UIApplicationDelegate
- {
- // class-level declarations
- UIWindow window;
- UINavigationController navController;
- DialogViewController dvcDialog;
- MTMBProgressHUD hud;
-
- // vars for managing NSUrlConnection Demo
- public long expectedLength;
- public nuint currentLength;
-
- //
- // This method is invoked when the application has loaded and is ready to run. In this
- // method you should instantiate the window, load the UI into it and then make the window
- // visible.
- //
- // You have 17 seconds to return from this method, or iOS will terminate your application.
- //
- public override bool FinishedLaunching (UIApplication app, NSDictionary options)
- {
- window = new UIWindow (UIScreen.MainScreen.Bounds);
-
- var root = new RootElement("MBProgressHUD")
- {
- new Section ("Samples")
- {
- new StringElement ("Simple indeterminate progress", ShowSimple),
- new StringElement ("With label", ShowWithLabel),
- new StringElement ("With details label", ShowWithDetailsLabel),
- new StringElement ("Determinate mode", ShowWithLabelDeterminate),
- new StringElement ("Annular determinate mode", ShowWithLabelAnnularDeterminate),
- new StringElement ("Horizontal determinate mode", ShowWithLabelDeterminateHorizontalBar),
- new StringElement ("Custom view", ShowWithCustomView),
- new StringElement ("Mode switching", ShowWithLabelMixed),
- new StringElement ("Using handlers", ShowUsingHandlers),
- new StringElement ("On Window", ShowOnWindow),
- new StringElement ("NSURLConnection", ShowUrl),
- new StringElement ("Dim background", ShowWithGradient),
- new StringElement ("Text only", ShowTextOnly),
- new StringElement ("Colored", ShowWithColor),
- }
- };
-
-
- dvcDialog = new DialogViewController(UITableViewStyle.Grouped, root, false);
- navController = new UINavigationController(dvcDialog);
-
- window.RootViewController = navController;
- window.MakeKeyAndVisible ();
-
- return true;
- }
-
- #region Button Actions
- void ShowSimple ()
- {
- // The hud will dispable all input on the view (use the higest view possible in the view hierarchy)
- hud = new MTMBProgressHUD (navController.View);
- navController.View.AddSubview (hud);
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- // Show the HUD while the provided method executes in a new thread
- hud.Show (new Selector("MyTask"), this, null, true);
- }
-
- void ShowWithLabel ()
- {
- // The hud will dispable all input on the view (use the higest view possible in the view hierarchy)
- hud = new MTMBProgressHUD (navController.View);
- navController.View.AddSubview (hud);
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- // Add information to your HUD
- hud.LabelText = "Loading";
-
- // Show the HUD while the provided method executes in a new thread
- hud.Show (new Selector ("MyTask"), this, null, true);
- }
-
- void ShowWithDetailsLabel ()
- {
- // The hud will dispable all input on the view (use the higest view possible in the view hierarchy)
- hud = new MTMBProgressHUD (navController.View);
- navController.View.AddSubview (hud);
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- // Add information to your HUD
- hud.LabelText = "Loading";
- hud.DetailsLabelText = "updating data";
- hud.Square = true;
-
- // Show the HUD while the provided method executes in a new thread
- hud.Show (new Selector ("MyTask"), this, null, true);
- }
-
- void ShowWithLabelDeterminate ()
- {
- // The hud will dispable all input on the view (use the higest view possible in the view hierarchy)
- hud = new MTMBProgressHUD (navController.View);
- navController.View.AddSubview (hud);
-
- // Set determinate mode
- hud.Mode = MBProgressHUDMode.Determinate;
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- // Add information to your HUD
- hud.LabelText = "Loading";
-
- // Show the HUD while the provided method executes in a new thread
- hud.Show (new Selector ("MyProgressTask"), this, null, true);
- }
-
- void ShowWithLabelAnnularDeterminate ()
- {
- // The hud will dispable all input on the view (use the higest view possible in the view hierarchy)
- hud = new MTMBProgressHUD (navController.View);
- navController.View.AddSubview(hud);
-
- // Set determinate mode
- hud.Mode = MBProgressHUDMode.AnnularDeterminate;
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- // Add information to your HUD
- hud.LabelText = "Loading";
-
- // Show the HUD while the provided method executes in a new thread
- hud.Show (new Selector ("MyProgressTask"), this, null, true);
- }
-
- void ShowWithLabelDeterminateHorizontalBar ()
- {
- // The hud will dispable all input on the view (use the higest view possible in the view hierarchy)
- hud = new MTMBProgressHUD (navController.View);
- navController.View.AddSubview(hud);
-
- // Set determinate mode
- hud.Mode = MBProgressHUDMode.DeterminateHorizontalBar;
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- // Add information to your HUD
- hud.LabelText = "Loading";
-
- // Show the HUD while the provided method executes in a new thread
- hud.Show (new Selector ("MyProgressTask"), this, null, true);
- }
-
- void ShowWithCustomView ()
- {
- // The hud will dispable all input on the view (use the higest view possible in the view hierarchy)
- hud = new MTMBProgressHUD (navController.View);
- navController.View.AddSubview (hud);
-
- // Set custom view mode
- hud.Mode = MBProgressHUDMode.CustomView;
-
- // The sample image is based on the work by http://www.pixelpressicons.com, http://creativecommons.org/licenses/by/2.5/ca/
- // Make the customViews 37 by 37 pixels for best results (those are the bounds of the build-in progress indicators)
- hud.CustomView = new UIImageView (UIImage.FromBundle ("37x-Checkmark.png"));
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- // Add information to your HUD
- hud.LabelText = "Completed";
-
- // Show the HUD
- hud.Show(true);
-
- // Hide the HUD after 3 seconds
- hud.Hide (true, 3);
- }
-
- void ShowWithLabelMixed ()
- {
- // The hud will dispable all input on the view (use the higest view possible in the view hierarchy)
- hud = new MTMBProgressHUD (navController.View);
- navController.View.AddSubview (hud);
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- // Add information to your HUD
- hud.LabelText = "Connecting";
- hud.MinSize = new System.Drawing.SizeF (135f, 135f);
-
- // Show the HUD while the provided method executes in a new thread
- hud.Show (new Selector ("MyMixedTask"), this, null, true);
- }
-
- void ShowUsingHandlers ()
- {
- // The hud will dispable all input on the view (use the higest view possible in the view hierarchy)
- hud = new MTMBProgressHUD (navController.View);
- navController.View.AddSubview (hud);
-
- // Add information to your HUD
- hud.LabelText = "With a handler";
-
- // We show the hud while executing MyTask, and then we clean up
- hud.Show (true, () => {
- MyTask();
- }, () => {
- hud.RemoveFromSuperview();
- hud = null;
- });
- }
-
- void ShowOnWindow ()
- {
- // The hud will dispable all input on the window
- hud = new MTMBProgressHUD (window);
- this.window.AddSubview (hud);
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- // Add information to your HUD
- hud.LabelText = "Loading";
-
- // Show the HUD while the provided method executes in a new thread
- hud.Show (new Selector ("MyTask"), this, null, true);
- }
-
- void ShowUrl ()
- {
- // Show the hud on top most view
- hud = MTMBProgressHUD.ShowHUD (this.navController.View, true);
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- NSUrl url = new NSUrl ("https://github.com/matej/MBProgressHUD/zipball/master");
- NSUrlRequest request = new NSUrlRequest (url);
-
- NSUrlConnection connection = new NSUrlConnection (request, new MyNSUrlConnectionDelegete (this, hud));
- connection.Start();
- }
-
- void ShowWithGradient ()
- {
- // The hud will dispable all input on the view (use the higest view possible in the view hierarchy)
- hud = new MTMBProgressHUD (navController.View);
- navController.View.AddSubview (hud);
-
- // Set HUD to dim Background
- hud.DimBackground = true;
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- // Show the HUD while the provided method executes in a new thread
- hud.Show(new Selector ("MyTask"), this, null, true);
- }
-
- void ShowTextOnly ()
- {
- // Show the hud on top most view
- hud = MTMBProgressHUD.ShowHUD (this.navController.View, true);
-
- // Configure for text only and offset down
- hud.Mode = MBProgressHUDMode.Text;
- hud.LabelText = "Some message...";
- hud.Margin = 10f;
- hud.YOffset = 150f;
- hud.RemoveFromSuperViewOnHide = true;
-
- hud.Hide (true, 3);
- }
-
- void ShowWithColor ()
- {
- // The hud will dispable all input on the view (use the higest view possible in the view hierarchy)
- hud = new MTMBProgressHUD (navController.View);
- navController.View.AddSubview (hud);
-
- // Set the hud to display with a color
- hud.Color = new UIColor (0.23f, 0.5f, 0.82f, 0.90f);
-
- // Regiser for DidHide Event so we can remove it from the window at the right time
- hud.DidHide += HandleDidHide;
-
- // Show the HUD while the provided method executes in a new thread
- hud.Show(new Selector ("MyTask"), this, null, true);
- }
-
- #endregion
-
- #region fake tasks and Hide Handler
-
- [Export ("MyTask")]
- void MyTask ()
- {
- System.Threading.Thread.Sleep(3000);
- }
-
- [Export ("MyProgressTask")]
- void MyProgressTask ()
- {
- float progress = 0.0f;
-
- while (progress < 1.0f) {
- progress += 0.01f;
- hud.Progress = progress;
- System.Threading.Thread.Sleep(50);
- }
- }
-
- [Export ("MyMixedTask")]
- void MyMixedTask ()
- {
- // Indeterminate mode
- System.Threading.Thread.Sleep(2000);
-
- // Switch to determinate mode
- hud.Mode = MBProgressHUDMode.Determinate;
- hud.LabelText = "Progress";
- float progress = 0.0f;
- while (progress < 1.0f)
- {
- progress += 0.01f;
- hud.Progress = progress;
- System.Threading.Thread.Sleep(50);
- }
-
- // Back to indeterminate mode
- hud.Mode = MBProgressHUDMode.Indeterminate;
- hud.LabelText = "Cleaning up";
- System.Threading.Thread.Sleep(2000);
-
- // The sample image is based on the work by www.pixelpressicons.com, http://creativecommons.org/licenses/by/2.5/ca/
- // Make the customViews 37 by 37 pixels for best results (those are the bounds of the build-in progress indicators)
- // Since HUD is already on screen, we must set It's custom vien on Main Thread
- BeginInvokeOnMainThread ( ()=> {
- hud.CustomView = new UIImageView (UIImage.FromBundle ("37x-Checkmark.png"));
- });
-
- hud.Mode = MBProgressHUDMode.CustomView;
- hud.LabelText = "Completed";
- System.Threading.Thread.Sleep (2000);
- }
-
- void HandleDidHide (object sender, EventArgs e)
- {
- hud.RemoveFromSuperview();
- hud = null;
- }
-
- #endregion
- }
-
- // Custom NSUrlConnectionDelegate that handles NSUrlConnection Events
- public class MyNSUrlConnectionDelegete : NSUrlConnectionDelegate
- {
- AppDelegate del;
- MTMBProgressHUD hud;
-
- public MyNSUrlConnectionDelegete (AppDelegate del, MTMBProgressHUD hud)
- {
- this.del = del;
- this.hud = hud;
- }
-
- public override void ReceivedResponse (NSUrlConnection connection, NSUrlResponse response)
- {
- del.expectedLength = response.ExpectedContentLength;
- del.currentLength = 0;
- hud.Mode = MBProgressHUDMode.Determinate;
- }
-
- public override void ReceivedData (NSUrlConnection connection, NSData data)
- {
- del.currentLength += data.Length;
- hud.Progress = (del.currentLength / (float) del.expectedLength);
- }
-
- public override void FinishedLoading (NSUrlConnection connection)
- {
- BeginInvokeOnMainThread ( ()=> {
- hud.CustomView = new UIImageView (UIImage.FromBundle ("37x-Checkmark.png"));
- });
- hud.Mode = MBProgressHUDMode.CustomView;
- hud.Hide(true, 2);
- }
-
- public override void FailedWithError (NSUrlConnection connection, NSError error)
- {
- hud.Hide(true);
- }
- }
-}
-
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Info.plist b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Info.plist
deleted file mode 100644
index f917428fc..000000000
--- a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
- UIDeviceFamily
-
- 1
- 2
-
- UISupportedInterfaceOrientations
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationPortraitUpsideDown
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
- MinimumOSVersion
- 7.0
- XSAppIconAssets
- Resources/Images.xcassets/AppIcons.appiconset
- XSLaunchImageAssets
- Resources/Images.xcassets/LaunchImage.launchimage
-
-
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/MBProgressHUDDemo.csproj b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/MBProgressHUDDemo.csproj
deleted file mode 100644
index 5e0bfc888..000000000
--- a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/MBProgressHUDDemo.csproj
+++ /dev/null
@@ -1,113 +0,0 @@
-
-
-
- Debug
- iPhoneSimulator
- 8.0.30703
- 2.0
- {9B7943D5-29E1-4F04-B9F5-0D640BB05D06}
- {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
- Exe
- MBProgressHUDDemo
- Resources
- MBProgressHUDDemo
-
-
- True
- full
- False
- bin\unified\iPhoneSimulator\Debug
- obj\unified\iPhoneSimulator\Debug
- DEBUG;__UNIFIED__
- prompt
- 4
- False
- True
- None
-
-
- i386, x86_64
-
-
- none
- True
- bin\unified\iPhoneSimulator\Release
- obj\unified\iPhoneSimulator\Release
- __UNIFIED__
- prompt
- 4
- False
- None
-
-
- i386, x86_64
-
-
- True
- full
- False
- bin\unified\iPhone\Debug
- obj\unified\iPhone\Debug
- DEBUG;__UNIFIED__
- prompt
- 4
- False
- iPhone Developer
- True
-
-
- ARMv7, ARMv7s, ARM64
-
-
- none
- True
- bin\unified\iPhone\Release
- obj\unified\iPhone\Release
- __UNIFIED__
- prompt
- 4
- False
- iPhone Developer
-
-
- ARMv7, ARMv7s, ARM64
-
-
-
-
-
-
-
-
- ../../../lib\/ios-unified/MBProgressHUD.dll
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Main.cs b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Main.cs
deleted file mode 100644
index 902aba186..000000000
--- a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Main.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-
-#if __UNIFIED__
-using Foundation;
-using UIKit;
-#else
-using MonoTouch.Foundation;
-using MonoTouch.UIKit;
-#endif
-
-namespace MBProgressHUDDemo
-{
- public class Application
- {
- // This is the main entry point of the application.
- static void Main (string[] args)
- {
- // if you want to use a different Application Delegate class from "AppDelegate"
- // you can specify it here.
- UIApplication.Main (args, null, "AppDelegate");
- }
- }
-}
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/37x-Checkmark.png b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/37x-Checkmark.png
deleted file mode 100644
index 89c31d3c2..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/37x-Checkmark.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/37x-Checkmark@2x.png b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/37x-Checkmark@2x.png
deleted file mode 100644
index 5ac8c212d..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/37x-Checkmark@2x.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Images.xcassets/AppIcons.appiconset/Contents.json b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Images.xcassets/AppIcons.appiconset/Contents.json
deleted file mode 100644
index 66ecbc8d3..000000000
--- a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Images.xcassets/AppIcons.appiconset/Contents.json
+++ /dev/null
@@ -1 +0,0 @@
-{"images":[{"idiom":"iphone","filename":"Icon.png","size":"57x57","scale":"1x"},{"idiom":"iphone","filename":"Icon@2x.png","size":"57x57","scale":"2x"}],"info":{"version":1,"author":"xcode"}}
\ No newline at end of file
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Images.xcassets/AppIcons.appiconset/Icon.png b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Images.xcassets/AppIcons.appiconset/Icon.png
deleted file mode 100644
index 430cb6c27..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Images.xcassets/AppIcons.appiconset/Icon.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Images.xcassets/AppIcons.appiconset/Icon@2x.png b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Images.xcassets/AppIcons.appiconset/Icon@2x.png
deleted file mode 100644
index 68d2e0bef..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Images.xcassets/AppIcons.appiconset/Icon@2x.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Contents.json b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Contents.json
deleted file mode 100644
index 8e0a67799..000000000
--- a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Contents.json
+++ /dev/null
@@ -1,65 +0,0 @@
-{
- "images": [
- {
- "orientation": "portrait",
- "idiom": "iphone",
- "extent": "full-screen",
- "filename": "Default.png",
- "size": "320x480",
- "scale": "1x"
- },
- {
- "orientation": "portrait",
- "idiom": "iphone",
- "extent": "full-screen",
- "filename": "Default@2x.png",
- "size": "320x480",
- "scale": "2x"
- },
- {
- "orientation": "portrait",
- "idiom": "iphone",
- "extent": "full-screen",
- "filename": "Default-568h@2x.png",
- "size": "320x568",
- "subtype": "retina4",
- "scale": "2x"
- },
- {
- "orientation": "portrait",
- "idiom": "ipad",
- "extent": "to-status-bar",
- "filename": "Default-Portrait~ipad.png",
- "size": "768x1004",
- "scale": "1x"
- },
- {
- "orientation": "landscape",
- "idiom": "ipad",
- "extent": "to-status-bar",
- "filename": "Default-Landscape~ipad.png",
- "size": "1024x748",
- "scale": "1x"
- },
- {
- "orientation": "portrait",
- "idiom": "ipad",
- "extent": "to-status-bar",
- "filename": "Default-Portrait@2x~ipad.png",
- "size": "768x1004",
- "scale": "2x"
- },
- {
- "orientation": "landscape",
- "idiom": "ipad",
- "extent": "to-status-bar",
- "filename": "Default-Landscape@2x~ipad.png",
- "size": "1024x748",
- "scale": "2x"
- }
- ],
- "info": {
- "version": 1,
- "author": "xcode"
- }
-}
\ No newline at end of file
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default-568h@2x.png b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default-568h@2x.png
deleted file mode 100644
index 3a34926de..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default-568h@2x.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default-Landscape@2x~ipad.png b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default-Landscape@2x~ipad.png
deleted file mode 100644
index 083108d43..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default-Landscape@2x~ipad.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default-Landscape~ipad.png b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default-Landscape~ipad.png
deleted file mode 100644
index fa60c33fc..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default-Landscape~ipad.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default-Portrait@2x~ipad.png b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default-Portrait@2x~ipad.png
deleted file mode 100644
index a918de883..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default-Portrait@2x~ipad.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default-Portrait~ipad.png b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default-Portrait~ipad.png
deleted file mode 100644
index 9f687505f..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default-Portrait~ipad.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default.png b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default.png
deleted file mode 100644
index 4b9b9f146..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default@2x.png b/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default@2x.png
deleted file mode 100644
index a7349599a..000000000
Binary files a/BluetoothLEExplorer/Components/mbprogresshud-0.9.0/samples/MBProgressHUDDemo/MBProgressHUDDemo/Resources/Images.xcassets/LaunchImage.launchimage/Default@2x.png and /dev/null differ
diff --git a/BluetoothLEExplorer/Metadata.xml b/BluetoothLEExplorer/Metadata.xml
index e836f4cf0..b8558ce1c 100644
--- a/BluetoothLEExplorer/Metadata.xml
+++ b/BluetoothLEExplorer/Metadata.xml
@@ -6,8 +6,6 @@
Device Features
Android, iOS
Starter
- This is a cross-platform app that lets you scan for nearby
-Bluetooth Low Energy devices, connect to them, enumerate their services, and
-then enumerate those service characteristics
+ This is a cross-platform app that demonstrates how to explore Bluetooth LE devices
true
diff --git a/BouncingGame/BouncingGame.sln b/BouncingGame/BouncingGame.sln
new file mode 100644
index 000000000..f060f1424
--- /dev/null
+++ b/BouncingGame/BouncingGame.sln
@@ -0,0 +1,57 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BouncingGame.iOS", "BouncingGame\BouncingGame.iOS\BouncingGame.iOS.csproj", "{F573202E-DBA2-4D5C-8DB1-A8D956DB8643}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BouncingGame.Android", "BouncingGame\BouncingGame.Android\BouncingGame.Android.csproj", "{F86E12A1-1689-43F6-9D03-8C98DFE84E42}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BouncingGame.Common", "BouncingGame\BouncingGame.Common\BouncingGame.Common.csproj", "{CFFC49D8-33C7-4944-A9A7-A6D2AEDD7F0E}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|iPhoneSimulator = Debug|iPhoneSimulator
+ Release|iPhone = Release|iPhone
+ Release|iPhoneSimulator = Release|iPhoneSimulator
+ Debug|iPhone = Debug|iPhone
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {CFFC49D8-33C7-4944-A9A7-A6D2AEDD7F0E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {CFFC49D8-33C7-4944-A9A7-A6D2AEDD7F0E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CFFC49D8-33C7-4944-A9A7-A6D2AEDD7F0E}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {CFFC49D8-33C7-4944-A9A7-A6D2AEDD7F0E}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {CFFC49D8-33C7-4944-A9A7-A6D2AEDD7F0E}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {CFFC49D8-33C7-4944-A9A7-A6D2AEDD7F0E}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {CFFC49D8-33C7-4944-A9A7-A6D2AEDD7F0E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {CFFC49D8-33C7-4944-A9A7-A6D2AEDD7F0E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CFFC49D8-33C7-4944-A9A7-A6D2AEDD7F0E}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {CFFC49D8-33C7-4944-A9A7-A6D2AEDD7F0E}.Release|iPhone.Build.0 = Release|Any CPU
+ {CFFC49D8-33C7-4944-A9A7-A6D2AEDD7F0E}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {CFFC49D8-33C7-4944-A9A7-A6D2AEDD7F0E}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {F573202E-DBA2-4D5C-8DB1-A8D956DB8643}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator
+ {F573202E-DBA2-4D5C-8DB1-A8D956DB8643}.Debug|Any CPU.Build.0 = Debug|iPhoneSimulator
+ {F573202E-DBA2-4D5C-8DB1-A8D956DB8643}.Debug|iPhone.ActiveCfg = Debug|iPhone
+ {F573202E-DBA2-4D5C-8DB1-A8D956DB8643}.Debug|iPhone.Build.0 = Debug|iPhone
+ {F573202E-DBA2-4D5C-8DB1-A8D956DB8643}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
+ {F573202E-DBA2-4D5C-8DB1-A8D956DB8643}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
+ {F573202E-DBA2-4D5C-8DB1-A8D956DB8643}.Release|Any CPU.ActiveCfg = Release|iPhone
+ {F573202E-DBA2-4D5C-8DB1-A8D956DB8643}.Release|Any CPU.Build.0 = Release|iPhone
+ {F573202E-DBA2-4D5C-8DB1-A8D956DB8643}.Release|iPhone.ActiveCfg = Release|iPhone
+ {F573202E-DBA2-4D5C-8DB1-A8D956DB8643}.Release|iPhone.Build.0 = Release|iPhone
+ {F573202E-DBA2-4D5C-8DB1-A8D956DB8643}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
+ {F573202E-DBA2-4D5C-8DB1-A8D956DB8643}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
+ {F86E12A1-1689-43F6-9D03-8C98DFE84E42}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F86E12A1-1689-43F6-9D03-8C98DFE84E42}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F86E12A1-1689-43F6-9D03-8C98DFE84E42}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {F86E12A1-1689-43F6-9D03-8C98DFE84E42}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {F86E12A1-1689-43F6-9D03-8C98DFE84E42}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {F86E12A1-1689-43F6-9D03-8C98DFE84E42}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {F86E12A1-1689-43F6-9D03-8C98DFE84E42}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F86E12A1-1689-43F6-9D03-8C98DFE84E42}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F86E12A1-1689-43F6-9D03-8C98DFE84E42}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {F86E12A1-1689-43F6-9D03-8C98DFE84E42}.Release|iPhone.Build.0 = Release|Any CPU
+ {F86E12A1-1689-43F6-9D03-8C98DFE84E42}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {F86E12A1-1689-43F6-9D03-8C98DFE84E42}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ EndGlobalSection
+EndGlobal
diff --git a/BouncingGame/BouncingGame/BouncingGame.Android/Assets/AboutAssets.txt b/BouncingGame/BouncingGame/BouncingGame.Android/Assets/AboutAssets.txt
new file mode 100644
index 000000000..a9b0638eb
--- /dev/null
+++ b/BouncingGame/BouncingGame/BouncingGame.Android/Assets/AboutAssets.txt
@@ -0,0 +1,19 @@
+Any raw assets you want to be deployed with your application can be placed in
+this directory (and child directories) and given a Build Action of "AndroidAsset".
+
+These files will be deployed with your package and will be accessible using Android's
+AssetManager, like this:
+
+public class ReadAsset : Activity
+{
+ protected override void OnCreate (Bundle bundle)
+ {
+ base.OnCreate (bundle);
+
+ InputStream input = Assets.Open ("my_asset.txt");
+ }
+}
+
+Additionally, some Android functions will automatically load asset files:
+
+Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf");
diff --git a/BouncingGame/BouncingGame/BouncingGame.Android/BouncingGame.Android.csproj b/BouncingGame/BouncingGame/BouncingGame.Android/BouncingGame.Android.csproj
new file mode 100644
index 000000000..f5a7a37e0
--- /dev/null
+++ b/BouncingGame/BouncingGame/BouncingGame.Android/BouncingGame.Android.csproj
@@ -0,0 +1,97 @@
+
+
+
+ Debug
+ AnyCPU
+ {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ {F86E12A1-1689-43F6-9D03-8C98DFE84E42}
+ Library
+ BouncingGame.Android
+ Assets
+ Resources
+ Resource
+ Resources\Resource.designer.cs
+ True
+ False
+ BouncingGame.Android
+ v4.4
+ Properties\AndroidManifest.xml
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ None
+ false
+
+
+ full
+ true
+ bin\Release
+ prompt
+ 4
+ false
+ false
+
+
+
+
+
+
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\MonoAndroid10\CocosSharp.dll
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\MonoAndroid10\Lidgren.Network.dll
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\MonoAndroid10\MonoGame.Framework.dll
+
+
+
+
+ {CFFC49D8-33C7-4944-A9A7-A6D2AEDD7F0E}
+ BouncingGame.Common
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Assets\Content\paddle.png
+
+
+ Assets\Content\ball.png
+
+
+
\ No newline at end of file
diff --git a/BouncingGame/BouncingGame/BouncingGame.Android/MainActivity.cs b/BouncingGame/BouncingGame/BouncingGame.Android/MainActivity.cs
new file mode 100644
index 000000000..445db7041
--- /dev/null
+++ b/BouncingGame/BouncingGame/BouncingGame.Android/MainActivity.cs
@@ -0,0 +1,78 @@
+using System;
+using System.Collections.Generic;
+
+using Android.App;
+using Android.Content;
+using Android.Content.PM;
+using Android.Runtime;
+using Android.Views;
+using Android.Widget;
+using Android.OS;
+
+using CocosSharp;
+
+namespace BouncingGame.Android
+{
+ [Activity (Label = "BouncingGame.Android",
+ MainLauncher = true,
+ Icon = "@drawable/icon",
+ AlwaysRetainTaskState = true,
+ ScreenOrientation = ScreenOrientation.Portrait,
+ LaunchMode = LaunchMode.SingleInstance,
+ ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.ScreenSize | ConfigChanges.Keyboard | ConfigChanges.KeyboardHidden)]
+ public class MainActivity : Activity
+ {
+ protected override void OnCreate (Bundle bundle)
+ {
+ base.OnCreate (bundle);
+
+ // Set our view from the "main" layout resource
+ SetContentView (Resource.Layout.Main);
+
+ // Get our game view from the layout resource,
+ // and attach the view created event to it
+ CCGameView gameView = (CCGameView)FindViewById (Resource.Id.GameView);
+ gameView.ViewCreated += LoadGame;
+ }
+
+ void LoadGame (object sender, EventArgs e)
+ {
+ CCGameView gameView = sender as CCGameView;
+ if (gameView != null)
+ {
+ var contentSearchPaths = new List () { "Fonts", "Sounds" };
+ CCSizeI viewSize = gameView.ViewSize;
+
+ int width = 768;
+ int height = 1027;
+
+ // Set world dimensions
+ gameView.DesignResolution = new CCSizeI (width, height);
+
+ // Determine whether to use the high or low def versions of our images
+ // Make sure the default texel to content size ratio is set correctly
+ // Of course you're free to have a finer set of image resolutions e.g (ld, hd, super-hd)
+ if (width < viewSize.Width)
+ {
+ contentSearchPaths.Add ("Images/Hd");
+ CCSprite.DefaultTexelToContentSizeRatio = 2.0f;
+ }
+ else
+ {
+ contentSearchPaths.Add ("Images/Ld");
+ CCSprite.DefaultTexelToContentSizeRatio = 1.0f;
+ }
+
+ gameView.ContentManager.SearchPaths = contentSearchPaths;
+
+ CCScene gameScene = new CCScene (gameView);
+
+ gameScene.AddLayer (new GameLayer ());
+ gameView.RunWithScene (gameScene);
+ }
+
+ }
+ }
+}
+
+
diff --git a/BouncingGame/BouncingGame/BouncingGame.Android/Properties/AndroidManifest.xml b/BouncingGame/BouncingGame/BouncingGame.Android/Properties/AndroidManifest.xml
new file mode 100644
index 000000000..88509c54d
--- /dev/null
+++ b/BouncingGame/BouncingGame/BouncingGame.Android/Properties/AndroidManifest.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/BouncingGame/BouncingGame/BouncingGame.Android/Properties/AssemblyInfo.cs b/BouncingGame/BouncingGame/BouncingGame.Android/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..258bd3647
--- /dev/null
+++ b/BouncingGame/BouncingGame/BouncingGame.Android/Properties/AssemblyInfo.cs
@@ -0,0 +1,28 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using Android.App;
+
+// Information about this assembly is defined by the following attributes.
+// Change them to the values specific to your project.
+
+[assembly: AssemblyTitle ("BouncingGame.Android")]
+[assembly: AssemblyDescription ("")]
+[assembly: AssemblyConfiguration ("")]
+[assembly: AssemblyCompany ("")]
+[assembly: AssemblyProduct ("")]
+[assembly: AssemblyCopyright ("vchelaru")]
+[assembly: AssemblyTrademark ("")]
+[assembly: AssemblyCulture ("")]
+
+// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
+// The form "{Major}.{Minor}.*" will automatically update the build and revision,
+// and "{Major}.{Minor}.{Build}.*" will update just the revision.
+
+[assembly: AssemblyVersion ("1.0.0")]
+
+// The following attributes are used to specify the signing key for the assembly,
+// if desired. See the Mono documentation for more information about signing.
+
+//[assembly: AssemblyDelaySign(false)]
+//[assembly: AssemblyKeyFile("")]
+
diff --git a/SoMA/Components/xamarin.mobile-0.7.4/samples/Xamarin.Mobile.Android.Samples/GeolocationSample/Resources/AboutResources.txt b/BouncingGame/BouncingGame/BouncingGame.Android/Resources/AboutResources.txt
similarity index 100%
rename from SoMA/Components/xamarin.mobile-0.7.4/samples/Xamarin.Mobile.Android.Samples/GeolocationSample/Resources/AboutResources.txt
rename to BouncingGame/BouncingGame/BouncingGame.Android/Resources/AboutResources.txt
diff --git a/BouncingGame/BouncingGame/BouncingGame.Android/Resources/Resource.designer.cs b/BouncingGame/BouncingGame/BouncingGame.Android/Resources/Resource.designer.cs
new file mode 100644
index 000000000..ec1a48e2d
--- /dev/null
+++ b/BouncingGame/BouncingGame/BouncingGame.Android/Resources/Resource.designer.cs
@@ -0,0 +1,109 @@
+#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("BouncingGame.Android.Resource", IsApplication=true)]
+
+namespace BouncingGame.Android
+{
+
+
+ [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;
+
+ static Drawable()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Drawable()
+ {
+ }
+ }
+
+ public partial class Id
+ {
+
+ // aapt resource value: 0x7f050000
+ public const int GameView = 2131034112;
+
+ static Id()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Id()
+ {
+ }
+ }
+
+ public partial class Layout
+ {
+
+ // aapt resource value: 0x7f030000
+ public const int Main = 2130903040;
+
+ static Layout()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Layout()
+ {
+ }
+ }
+
+ public partial class String
+ {
+
+ // aapt resource value: 0x7f040000
+ public const int app_name = 2130968576;
+
+ static String()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private String()
+ {
+ }
+ }
+ }
+}
+#pragma warning restore 1591
diff --git a/BouncingGame/BouncingGame/BouncingGame.Android/Resources/drawable-hdpi/Icon.png b/BouncingGame/BouncingGame/BouncingGame.Android/Resources/drawable-hdpi/Icon.png
new file mode 100644
index 000000000..f4c804644
Binary files /dev/null and b/BouncingGame/BouncingGame/BouncingGame.Android/Resources/drawable-hdpi/Icon.png differ
diff --git a/BouncingGame/BouncingGame/BouncingGame.Android/Resources/drawable-mdpi/Icon.png b/BouncingGame/BouncingGame/BouncingGame.Android/Resources/drawable-mdpi/Icon.png
new file mode 100644
index 000000000..ef1e1ee7d
Binary files /dev/null and b/BouncingGame/BouncingGame/BouncingGame.Android/Resources/drawable-mdpi/Icon.png differ
diff --git a/BouncingGame/BouncingGame/BouncingGame.Android/Resources/drawable-xhdpi/Icon.png b/BouncingGame/BouncingGame/BouncingGame.Android/Resources/drawable-xhdpi/Icon.png
new file mode 100644
index 000000000..b7e2e57aa
Binary files /dev/null and b/BouncingGame/BouncingGame/BouncingGame.Android/Resources/drawable-xhdpi/Icon.png differ
diff --git a/BouncingGame/BouncingGame/BouncingGame.Android/Resources/drawable-xxhdpi/Icon.png b/BouncingGame/BouncingGame/BouncingGame.Android/Resources/drawable-xxhdpi/Icon.png
new file mode 100644
index 000000000..8d20a38d1
Binary files /dev/null and b/BouncingGame/BouncingGame/BouncingGame.Android/Resources/drawable-xxhdpi/Icon.png differ
diff --git a/BouncingGame/BouncingGame/BouncingGame.Android/Resources/drawable-xxxhdpi/Icon.png b/BouncingGame/BouncingGame/BouncingGame.Android/Resources/drawable-xxxhdpi/Icon.png
new file mode 100644
index 000000000..6d9919c41
Binary files /dev/null and b/BouncingGame/BouncingGame/BouncingGame.Android/Resources/drawable-xxxhdpi/Icon.png differ
diff --git a/BouncingGame/BouncingGame/BouncingGame.Android/Resources/layout/Main.axml b/BouncingGame/BouncingGame/BouncingGame.Android/Resources/layout/Main.axml
new file mode 100644
index 000000000..77959ac22
--- /dev/null
+++ b/BouncingGame/BouncingGame/BouncingGame.Android/Resources/layout/Main.axml
@@ -0,0 +1,11 @@
+
+
+
+
+
diff --git a/BouncingGame/BouncingGame/BouncingGame.Android/Resources/values/Strings.xml b/BouncingGame/BouncingGame/BouncingGame.Android/Resources/values/Strings.xml
new file mode 100644
index 000000000..f95d5bda4
--- /dev/null
+++ b/BouncingGame/BouncingGame/BouncingGame.Android/Resources/values/Strings.xml
@@ -0,0 +1,4 @@
+
+
+ BouncingGame.Android
+
diff --git a/BouncingGame/BouncingGame/BouncingGame.Android/packages.config b/BouncingGame/BouncingGame/BouncingGame.Android/packages.config
new file mode 100644
index 000000000..4354d62ef
--- /dev/null
+++ b/BouncingGame/BouncingGame/BouncingGame.Android/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/BouncingGame/BouncingGame/BouncingGame.Common/BouncingGame.Common.csproj b/BouncingGame/BouncingGame/BouncingGame.Common/BouncingGame.Common.csproj
new file mode 100644
index 000000000..f92bf5974
--- /dev/null
+++ b/BouncingGame/BouncingGame/BouncingGame.Common/BouncingGame.Common.csproj
@@ -0,0 +1,50 @@
+
+
+
+ Debug
+ AnyCPU
+ {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ {CFFC49D8-33C7-4944-A9A7-A6D2AEDD7F0E}
+ Library
+ BouncingGame.Common
+ BouncingGame.Common
+ v4.5
+ Profile111
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ false
+
+
+ full
+ true
+ bin\Release
+ prompt
+ 4
+ false
+
+
+
+
+
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\portable-net45+win+wpa81+wp81\box2d.dll
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\portable-net45+win+wpa81+wp81\CocosSharp.dll
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\portable-net45+win+wpa81+wp81\MonoGame.Framework.dll
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BouncingGame/BouncingGame/BouncingGame.Common/GameLayer.cs b/BouncingGame/BouncingGame/BouncingGame.Common/GameLayer.cs
new file mode 100644
index 000000000..6d97066cb
--- /dev/null
+++ b/BouncingGame/BouncingGame/BouncingGame.Common/GameLayer.cs
@@ -0,0 +1,114 @@
+using System;
+using System.Collections.Generic;
+using CocosSharp;
+
+namespace BouncingGame
+{
+ public class GameLayer : CCLayerColor
+ {
+ CCSprite paddleSprite;
+ CCSprite ballSprite;
+ CCLabel scoreLabel;
+
+ float ballXVelocity;
+ float ballYVelocity;
+
+ // How much to modify the ball's y velocity per second:
+ const float gravity = 140;
+
+ int score;
+
+ public GameLayer () : base (CCColor4B.Black)
+ {
+ // "paddle" refers to the paddle.png image
+ paddleSprite = new CCSprite ("paddle");
+ paddleSprite.PositionX = 100;
+ paddleSprite.PositionY = 100;
+ AddChild (paddleSprite);
+
+ ballSprite = new CCSprite ("ball");
+ ballSprite.PositionX = 320;
+ ballSprite.PositionY = 600;
+ AddChild (ballSprite);
+
+ scoreLabel = new CCLabel ("Score: 0", "Arial", 20, CCLabelFormat.SystemFont);
+ scoreLabel.PositionX = 50;
+ scoreLabel.PositionY = 1000;
+ scoreLabel.AnchorPoint = CCPoint.AnchorUpperLeft;
+ AddChild (scoreLabel);
+
+ Schedule (RunGameLogic);
+ }
+
+ void RunGameLogic(float frameTimeInSeconds)
+ {
+ // This is a linear approximation, so not 100% accurate
+ ballYVelocity += frameTimeInSeconds * -gravity;
+ ballSprite.PositionX += ballXVelocity * frameTimeInSeconds;
+ ballSprite.PositionY += ballYVelocity * frameTimeInSeconds;
+ // New Code:
+ // Check if the two CCSprites overlap...
+ bool doesBallOverlapPaddle = ballSprite.BoundingBoxTransformedToParent.IntersectsRect(
+ paddleSprite.BoundingBoxTransformedToParent);
+ // ... and if the ball is moving downward.
+ bool isMovingDownward = ballYVelocity < 0;
+ if (doesBallOverlapPaddle && isMovingDownward)
+ {
+ // First let's invert the velocity:
+ ballYVelocity *= -1;
+ // Then let's assign a random to the ball's x velocity:
+ const float minXVelocity = -300;
+ const float maxXVelocity = 300;
+ ballXVelocity = CCRandom.GetRandomFloat (minXVelocity, maxXVelocity);
+ // New code:
+ score++;
+ scoreLabel.Text = "Score: " + score;
+ }
+ // First let’s get the ball position:
+ float ballRight = ballSprite.BoundingBoxTransformedToParent.MaxX;
+ float ballLeft = ballSprite.BoundingBoxTransformedToParent.MinX;
+ // Then let’s get the screen edges
+ float screenRight = VisibleBoundsWorldspace.MaxX;
+ float screenLeft = VisibleBoundsWorldspace.MinX;
+
+ // Check if the ball is either too far to the right or left:
+ bool shouldReflectXVelocity =
+ (ballRight > screenRight && ballXVelocity > 0) ||
+ (ballLeft < screenLeft && ballXVelocity < 0);
+
+ if (shouldReflectXVelocity)
+ {
+ ballXVelocity *= -1;
+ }
+ }
+
+ protected override void AddedToScene ()
+ {
+ base.AddedToScene ();
+
+ // Use the bounds to layout the positioning of our drawable assets
+ CCRect bounds = VisibleBoundsWorldspace;
+
+ // Register for touch events
+ var touchListener = new CCEventListenerTouchAllAtOnce ();
+ touchListener.OnTouchesEnded = OnTouchesEnded;
+ touchListener.OnTouchesMoved = HandleTouchesMoved;
+ AddEventListener (touchListener, this);
+ }
+
+ void OnTouchesEnded (List touches, CCEvent touchEvent)
+ {
+ if (touches.Count > 0)
+ {
+ // Perform touch handling here
+ }
+ }
+
+ void HandleTouchesMoved (System.Collections.Generic.List touches, CCEvent touchEvent)
+ {
+ // we only care about the first touch:
+ var locationOnScreen = touches [0].Location;
+ paddleSprite.PositionX = locationOnScreen.X;
+ }
+ }
+}
diff --git a/BouncingGame/BouncingGame/BouncingGame.Common/packages.config b/BouncingGame/BouncingGame/BouncingGame.Common/packages.config
new file mode 100644
index 000000000..ad4b976d2
--- /dev/null
+++ b/BouncingGame/BouncingGame/BouncingGame.Common/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/BouncingGame/BouncingGame/BouncingGame.iOS/AppDelegate.cs b/BouncingGame/BouncingGame/BouncingGame.iOS/AppDelegate.cs
new file mode 100644
index 000000000..4520f23a3
--- /dev/null
+++ b/BouncingGame/BouncingGame/BouncingGame.iOS/AppDelegate.cs
@@ -0,0 +1,60 @@
+using Foundation;
+using UIKit;
+
+namespace BouncingGame.iOS
+{
+ // The UIApplicationDelegate for the application. This class is responsible for launching the
+ // User Interface of the application, as well as listening (and optionally responding) to application events from iOS.
+ [Register ("AppDelegate")]
+ public class AppDelegate : UIApplicationDelegate
+ {
+ // class-level declarations
+
+ public override UIWindow Window
+ {
+ get;
+ set;
+ }
+
+ public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
+ {
+ // Override point for customization after application launch.
+ // If not required for your application you can safely delete this method
+
+ return true;
+ }
+
+ public override void OnResignActivation (UIApplication application)
+ {
+ // Invoked when the application is about to move from active to inactive state.
+ // This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message)
+ // or when the user quits the application and it begins the transition to the background state.
+ // Games should use this method to pause the game.
+ }
+
+ public override void DidEnterBackground (UIApplication application)
+ {
+ // Use this method to release shared resources, save user data, invalidate timers and store the application state.
+ // If your application supports background exection this method is called instead of WillTerminate when the user quits.
+ }
+
+ public override void WillEnterForeground (UIApplication application)
+ {
+ // Called as part of the transiton from background to active state.
+ // Here you can undo many of the changes made on entering the background.
+ }
+
+ public override void OnActivated (UIApplication application)
+ {
+ // Restart any tasks that were paused (or not yet started) while the application was inactive.
+ // If the application was previously in the background, optionally refresh the user interface.
+ }
+
+ public override void WillTerminate (UIApplication application)
+ {
+ // Called when the application is about to terminate. Save data, if needed. See also DidEnterBackground.
+ }
+ }
+}
+
+
diff --git a/BouncingGame/BouncingGame/BouncingGame.iOS/BouncingGame.iOS.csproj b/BouncingGame/BouncingGame/BouncingGame.iOS/BouncingGame.iOS.csproj
new file mode 100644
index 000000000..d7586e12e
--- /dev/null
+++ b/BouncingGame/BouncingGame/BouncingGame.iOS/BouncingGame.iOS.csproj
@@ -0,0 +1,146 @@
+
+
+
+ Debug
+ iPhoneSimulator
+ {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ {F573202E-DBA2-4D5C-8DB1-A8D956DB8643}
+ Exe
+ BouncingGame.iOS
+ Resources
+ BouncingGame.iOS
+
+
+ true
+ full
+ false
+ bin\iPhoneSimulator\Debug
+ DEBUG;
+ prompt
+ 4
+ false
+ i386, x86_64
+ None
+ true
+ true
+ iPhone Developer
+ true
+ NSUrlSessionHandler
+
+
+ full
+ true
+ bin\iPhone\Release
+ prompt
+ 4
+ false
+ ARMv7, ARM64
+ Entitlements.plist
+ true
+ iPhone Developer
+ NSUrlSessionHandler
+
+
+ full
+ true
+ bin\iPhoneSimulator\Release
+ prompt
+ 4
+ false
+ i386
+ None
+ iPhone Developer
+ NSUrlSessionHandler
+
+
+ true
+ full
+ false
+ bin\iPhone\Debug
+ DEBUG;
+ prompt
+ 4
+ false
+ ARMv7, ARM64
+ Entitlements.plist
+ true
+ iPhone Developer
+ true
+ true
+ true
+ NSUrlSessionHandler
+
+
+
+
+
+
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\Xamarin.iOS10\box2d.dll
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\Xamarin.iOS10\CocosSharp.dll
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\Xamarin.iOS10\Lidgren.Network.dll
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\Xamarin.iOS10\MonoGame.Framework.dll
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\Xamarin.iOS10\MonoGame.Framework.Net.dll
+
+
+
+
+ {CFFC49D8-33C7-4944-A9A7-A6D2AEDD7F0E}
+ BouncingGame.Common
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ViewController.cs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BouncingGame/BouncingGame/BouncingGame.iOS/Content/ball.png b/BouncingGame/BouncingGame/BouncingGame.iOS/Content/ball.png
new file mode 100755
index 000000000..676636a46
Binary files /dev/null and b/BouncingGame/BouncingGame/BouncingGame.iOS/Content/ball.png differ
diff --git a/BouncingGame/BouncingGame/BouncingGame.iOS/Content/paddle.png b/BouncingGame/BouncingGame/BouncingGame.iOS/Content/paddle.png
new file mode 100755
index 000000000..7e01a345e
Binary files /dev/null and b/BouncingGame/BouncingGame/BouncingGame.iOS/Content/paddle.png differ
diff --git a/BouncingGame/BouncingGame/BouncingGame.iOS/Entitlements.plist b/BouncingGame/BouncingGame/BouncingGame.iOS/Entitlements.plist
new file mode 100644
index 000000000..9ae599370
--- /dev/null
+++ b/BouncingGame/BouncingGame/BouncingGame.iOS/Entitlements.plist
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/BouncingGame/BouncingGame/BouncingGame.iOS/Info.plist b/BouncingGame/BouncingGame/BouncingGame.iOS/Info.plist
new file mode 100644
index 000000000..ab47d0b9a
--- /dev/null
+++ b/BouncingGame/BouncingGame/BouncingGame.iOS/Info.plist
@@ -0,0 +1,45 @@
+
+
+
+
+ CFBundleDisplayName
+ BouncingGame
+ CFBundleShortVersionString
+ 1.0
+ CFBundleVersion
+ 1.0
+ LSRequiresIPhoneOS
+
+ MinimumOSVersion
+ 8.0
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIMainStoryboardFile
+ Main
+ UIMainStoryboardFile~ipad
+ Main
+ UIRequiredDeviceCapabilities
+
+ armv7
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+
+ CFBundleName
+ BouncingGame
+ CFBundleIdentifier
+ com.xamarin.bouncinggame
+ XSAppIconAssets
+ Resources/Images.xcassets/AppIcon.appiconset
+
+
diff --git a/BouncingGame/BouncingGame/BouncingGame.iOS/Main.cs b/BouncingGame/BouncingGame/BouncingGame.iOS/Main.cs
new file mode 100644
index 000000000..6f6dddef8
--- /dev/null
+++ b/BouncingGame/BouncingGame/BouncingGame.iOS/Main.cs
@@ -0,0 +1,15 @@
+using UIKit;
+
+namespace BouncingGame.iOS
+{
+ public class Application
+ {
+ // This is the main entry point of the application.
+ static void Main (string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main (args, null, "AppDelegate");
+ }
+ }
+}
diff --git a/BouncingGame/BouncingGame/BouncingGame.iOS/Main.storyboard b/BouncingGame/BouncingGame/BouncingGame.iOS/Main.storyboard
new file mode 100644
index 000000000..d4464bb8d
--- /dev/null
+++ b/BouncingGame/BouncingGame/BouncingGame.iOS/Main.storyboard
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Contents.json b/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 000000000..df3f4a695
--- /dev/null
+++ b/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,220 @@
+{
+ "images": [
+ {
+ "filename": "Icon40x40.png",
+ "size": "20x20",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "filename": "Icon60x60.png",
+ "size": "20x20",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "filename": "Icon58x58.png",
+ "size": "29x29",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "filename": "Icon87x87.png",
+ "size": "29x29",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "filename": "Icon80x80.png",
+ "size": "40x40",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "filename": "Icon120x120.png",
+ "size": "40x40",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "filename": "Icon120x120.png",
+ "size": "60x60",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "filename": "Icon180x180.png",
+ "size": "60x60",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "filename": "Icon20x20.png",
+ "size": "20x20",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "filename": "Icon40x40.png",
+ "size": "20x20",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "filename": "Icon29x29.png",
+ "size": "29x29",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "filename": "Icon58x58.png",
+ "size": "29x29",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "filename": "Icon40x40.png",
+ "size": "40x40",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "filename": "Icon80x80.png",
+ "size": "40x40",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "filename": "Icon167x167.png",
+ "size": "83.5x83.5",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "filename": "Icon76x76.png",
+ "size": "76x76",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "filename": "Icon152x152.png",
+ "size": "76x76",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "filename": "Icon1024x1024.png",
+ "size": "1024x1024",
+ "scale": "1x",
+ "idiom": "ios-marketing"
+ },
+ {
+ "role": "notificationCenter",
+ "size": "24x24",
+ "subtype": "38mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "notificationCenter",
+ "size": "27.5x27.5",
+ "subtype": "42mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "companionSettings",
+ "size": "29x29",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "companionSettings",
+ "size": "29x29",
+ "scale": "3x",
+ "idiom": "watch"
+ },
+ {
+ "role": "appLauncher",
+ "size": "40x40",
+ "subtype": "38mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "longLook",
+ "size": "44x44",
+ "subtype": "42mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "quickLook",
+ "size": "86x86",
+ "subtype": "38mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "role": "quickLook",
+ "size": "98x98",
+ "subtype": "42mm",
+ "scale": "2x",
+ "idiom": "watch"
+ },
+ {
+ "size": "16x16",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "16x16",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "size": "32x32",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "32x32",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "size": "128x128",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "128x128",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "size": "256x256",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "256x256",
+ "scale": "2x",
+ "idiom": "mac"
+ },
+ {
+ "size": "512x512",
+ "scale": "1x",
+ "idiom": "mac"
+ },
+ {
+ "size": "512x512",
+ "scale": "2x",
+ "idiom": "mac"
+ }
+ ],
+ "info": {
+ "version": 1,
+ "author": "xcode"
+ }
+}
\ No newline at end of file
diff --git a/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon1024x1024.png b/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon1024x1024.png
new file mode 100644
index 000000000..830b23933
Binary files /dev/null and b/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon1024x1024.png differ
diff --git a/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon120x120.png b/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon120x120.png
new file mode 100644
index 000000000..a91bfc568
Binary files /dev/null and b/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon120x120.png differ
diff --git a/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon152x152.png b/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon152x152.png
new file mode 100644
index 000000000..a2882210f
Binary files /dev/null and b/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon152x152.png differ
diff --git a/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon167x167.png b/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon167x167.png
new file mode 100644
index 000000000..2badfaa18
Binary files /dev/null and b/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon167x167.png differ
diff --git a/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon180x180.png b/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon180x180.png
new file mode 100644
index 000000000..c2f79a690
Binary files /dev/null and b/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon180x180.png differ
diff --git a/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon20x20.png b/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon20x20.png
new file mode 100644
index 000000000..2af5ac48d
Binary files /dev/null and b/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon20x20.png differ
diff --git a/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon29x29.png b/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon29x29.png
new file mode 100644
index 000000000..f145292e2
Binary files /dev/null and b/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon29x29.png differ
diff --git a/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon40x40.png b/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon40x40.png
new file mode 100644
index 000000000..ad7e66171
Binary files /dev/null and b/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon40x40.png differ
diff --git a/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon58x58.png b/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon58x58.png
new file mode 100644
index 000000000..39c9c087a
Binary files /dev/null and b/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon58x58.png differ
diff --git a/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon60x60.png b/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon60x60.png
new file mode 100644
index 000000000..70584f903
Binary files /dev/null and b/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon60x60.png differ
diff --git a/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon76x76.png b/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon76x76.png
new file mode 100644
index 000000000..f8ef4696c
Binary files /dev/null and b/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon76x76.png differ
diff --git a/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon80x80.png b/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon80x80.png
new file mode 100644
index 000000000..cc63bbf90
Binary files /dev/null and b/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon80x80.png differ
diff --git a/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon87x87.png b/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon87x87.png
new file mode 100644
index 000000000..ee697547a
Binary files /dev/null and b/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/AppIcon.appiconset/Icon87x87.png differ
diff --git a/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/Contents.json b/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/Contents.json
new file mode 100644
index 000000000..4caf392f9
--- /dev/null
+++ b/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/Images.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/LaunchScreen.xib b/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/LaunchScreen.xib
new file mode 100644
index 000000000..c069a9807
--- /dev/null
+++ b/BouncingGame/BouncingGame/BouncingGame.iOS/Resources/LaunchScreen.xib
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BouncingGame/BouncingGame/BouncingGame.iOS/ViewController.cs b/BouncingGame/BouncingGame/BouncingGame.iOS/ViewController.cs
new file mode 100644
index 000000000..a8508fc87
--- /dev/null
+++ b/BouncingGame/BouncingGame/BouncingGame.iOS/ViewController.cs
@@ -0,0 +1,86 @@
+using System;
+using System.Collections.Generic;
+using UIKit;
+using CocosSharp;
+
+namespace BouncingGame.iOS
+{
+ public partial class ViewController : UIViewController
+ {
+ public ViewController (IntPtr handle) : base (handle)
+ {
+ }
+
+ public override void ViewDidLoad ()
+ {
+ base.ViewDidLoad ();
+
+ if (GameView != null)
+ {
+ // Set loading event to be called once game view is fully initialised
+ GameView.ViewCreated += LoadGame;
+ }
+ }
+
+ public override void ViewWillDisappear (bool animated)
+ {
+ base.ViewWillDisappear (animated);
+
+
+ if (GameView != null)
+ GameView.Paused = true;
+ }
+
+ public override void ViewDidAppear (bool animated)
+ {
+ base.ViewDidAppear (animated);
+
+ if (GameView != null)
+ GameView.Paused = false;
+ }
+
+ public override void DidReceiveMemoryWarning ()
+ {
+ base.DidReceiveMemoryWarning ();
+ // Release any cached data, images, etc that aren't in use.
+ }
+
+ void LoadGame (object sender, EventArgs e)
+ {
+ CCGameView gameView = sender as CCGameView;
+
+ if (gameView != null)
+ {
+ var contentSearchPaths = new List () { "Fonts", "Sounds" };
+ CCSizeI viewSize = gameView.ViewSize;
+
+ int width = 768;
+ int height = 1027;
+
+ // Set world dimensions
+ gameView.DesignResolution = new CCSizeI (width, height);
+
+ // Determine whether to use the high or low def versions of our images
+ // Make sure the default texel to content size ratio is set correctly
+ // Of course you're free to have a finer set of image resolutions e.g (ld, hd, super-hd)
+ if (width < viewSize.Width)
+ {
+ contentSearchPaths.Add ("Images/Hd");
+ CCSprite.DefaultTexelToContentSizeRatio = 2.0f;
+ }
+ else
+ {
+ contentSearchPaths.Add ("Images/Ld");
+ CCSprite.DefaultTexelToContentSizeRatio = 1.0f;
+ }
+
+ gameView.ContentManager.SearchPaths = contentSearchPaths;
+
+ CCScene gameScene = new CCScene (gameView);
+ gameScene.AddLayer (new GameLayer ());
+ gameView.RunWithScene (gameScene);
+ }
+ }
+ }
+}
+
diff --git a/BouncingGame/BouncingGame/BouncingGame.iOS/ViewController.designer.cs b/BouncingGame/BouncingGame/BouncingGame.iOS/ViewController.designer.cs
new file mode 100644
index 000000000..69eea7f2a
--- /dev/null
+++ b/BouncingGame/BouncingGame/BouncingGame.iOS/ViewController.designer.cs
@@ -0,0 +1,27 @@
+// WARNING
+//
+// This file has been generated automatically by Visual Studio from the outlets and
+// actions declared in your storyboard file.
+// Manual changes to this file will not be maintained.
+//
+using Foundation;
+using System;
+using System.CodeDom.Compiler;
+
+namespace BouncingGame.iOS
+{
+ [Register ("ViewController")]
+ partial class ViewController
+ {
+ [Outlet]
+ CocosSharp.CCGameView GameView { get; set; }
+
+ void ReleaseDesignerOutlets ()
+ {
+ if (GameView != null) {
+ GameView.Dispose ();
+ GameView = null;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/BouncingGame/BouncingGame/BouncingGame.iOS/packages.config b/BouncingGame/BouncingGame/BouncingGame.iOS/packages.config
new file mode 100644
index 000000000..f9d024b44
--- /dev/null
+++ b/BouncingGame/BouncingGame/BouncingGame.iOS/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/BouncingGame/Metadata.xml b/BouncingGame/Metadata.xml
new file mode 100644
index 000000000..d80c61eeb
--- /dev/null
+++ b/BouncingGame/Metadata.xml
@@ -0,0 +1,9 @@
+
+
+ 1ce06130-52a7-4541-af7f-8a1ccf4586aa
+ false
+ Beginner
+ Indie
+ Getting Started, Games
+ true
+
diff --git a/BouncingGame/README.md b/BouncingGame/README.md
new file mode 100644
index 000000000..b5b307555
--- /dev/null
+++ b/BouncingGame/README.md
@@ -0,0 +1,13 @@
+CocosSharp BouncingGame Project for iOS and Android
+====================================
+
+This is a small, complete game using CocosSharp for iOS and Android. It is the result of working through the the entire Introduction to CocosSharp walkthrough.
+
+This game is built against CocosSharp 1.7.1.0.
+
+The game can be played by touching the screen to move the paddle at the bottom of the screen horizontally. The goal is to keep the ball from falling off-screen. Each bounce awards the player one point.
+
+Author
+------
+
+Victor Chelaru
\ No newline at end of file
diff --git a/BouncingGame/Resources/Content.zip b/BouncingGame/Resources/Content.zip
new file mode 100644
index 000000000..b79e397b9
Binary files /dev/null and b/BouncingGame/Resources/Content.zip differ
diff --git a/BouncingGame/Resources/Entities.zip b/BouncingGame/Resources/Entities.zip
new file mode 100644
index 000000000..ca76dde33
Binary files /dev/null and b/BouncingGame/Resources/Entities.zip differ
diff --git a/BouncingGame/Resources/Tiled.zip b/BouncingGame/Resources/Tiled.zip
new file mode 100644
index 000000000..c26d8183b
Binary files /dev/null and b/BouncingGame/Resources/Tiled.zip differ
diff --git a/BouncingGame/Resources/ball.png b/BouncingGame/Resources/ball.png
new file mode 100644
index 000000000..676636a46
Binary files /dev/null and b/BouncingGame/Resources/ball.png differ
diff --git a/BouncingGame/Screenshots/FinalBouncingGameScreen.png b/BouncingGame/Screenshots/FinalBouncingGameScreen.png
new file mode 100644
index 000000000..751c62dc3
Binary files /dev/null and b/BouncingGame/Screenshots/FinalBouncingGameScreen.png differ
diff --git a/CCAction/ActionProject.sln b/CCAction/ActionProject.sln
new file mode 100644
index 000000000..f594070b4
--- /dev/null
+++ b/CCAction/ActionProject.sln
@@ -0,0 +1,57 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ActionProject.iOS", "ActionProject\ActionProject.iOS\ActionProject.iOS.csproj", "{A6D1486F-3126-4F53-954E-B0BBB792AF98}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ActionProject.Android", "ActionProject\ActionProject.Android\ActionProject.Android.csproj", "{5529C07C-5F1E-4186-85F1-DB119F2CF6AA}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ActionProject.Common", "ActionProject\ActionProject.Common\ActionProject.Common.csproj", "{211A2950-C246-4449-BF8E-FDE25B6D1EE8}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|iPhoneSimulator = Debug|iPhoneSimulator
+ Release|iPhone = Release|iPhone
+ Release|iPhoneSimulator = Release|iPhoneSimulator
+ Debug|iPhone = Debug|iPhone
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {211A2950-C246-4449-BF8E-FDE25B6D1EE8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {211A2950-C246-4449-BF8E-FDE25B6D1EE8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {211A2950-C246-4449-BF8E-FDE25B6D1EE8}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {211A2950-C246-4449-BF8E-FDE25B6D1EE8}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {211A2950-C246-4449-BF8E-FDE25B6D1EE8}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {211A2950-C246-4449-BF8E-FDE25B6D1EE8}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {211A2950-C246-4449-BF8E-FDE25B6D1EE8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {211A2950-C246-4449-BF8E-FDE25B6D1EE8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {211A2950-C246-4449-BF8E-FDE25B6D1EE8}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {211A2950-C246-4449-BF8E-FDE25B6D1EE8}.Release|iPhone.Build.0 = Release|Any CPU
+ {211A2950-C246-4449-BF8E-FDE25B6D1EE8}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {211A2950-C246-4449-BF8E-FDE25B6D1EE8}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {5529C07C-5F1E-4186-85F1-DB119F2CF6AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5529C07C-5F1E-4186-85F1-DB119F2CF6AA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5529C07C-5F1E-4186-85F1-DB119F2CF6AA}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {5529C07C-5F1E-4186-85F1-DB119F2CF6AA}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {5529C07C-5F1E-4186-85F1-DB119F2CF6AA}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {5529C07C-5F1E-4186-85F1-DB119F2CF6AA}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {5529C07C-5F1E-4186-85F1-DB119F2CF6AA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5529C07C-5F1E-4186-85F1-DB119F2CF6AA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5529C07C-5F1E-4186-85F1-DB119F2CF6AA}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {5529C07C-5F1E-4186-85F1-DB119F2CF6AA}.Release|iPhone.Build.0 = Release|Any CPU
+ {5529C07C-5F1E-4186-85F1-DB119F2CF6AA}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {5529C07C-5F1E-4186-85F1-DB119F2CF6AA}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {A6D1486F-3126-4F53-954E-B0BBB792AF98}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator
+ {A6D1486F-3126-4F53-954E-B0BBB792AF98}.Debug|Any CPU.Build.0 = Debug|iPhoneSimulator
+ {A6D1486F-3126-4F53-954E-B0BBB792AF98}.Debug|iPhone.ActiveCfg = Debug|iPhone
+ {A6D1486F-3126-4F53-954E-B0BBB792AF98}.Debug|iPhone.Build.0 = Debug|iPhone
+ {A6D1486F-3126-4F53-954E-B0BBB792AF98}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
+ {A6D1486F-3126-4F53-954E-B0BBB792AF98}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
+ {A6D1486F-3126-4F53-954E-B0BBB792AF98}.Release|Any CPU.ActiveCfg = Release|iPhone
+ {A6D1486F-3126-4F53-954E-B0BBB792AF98}.Release|Any CPU.Build.0 = Release|iPhone
+ {A6D1486F-3126-4F53-954E-B0BBB792AF98}.Release|iPhone.ActiveCfg = Release|iPhone
+ {A6D1486F-3126-4F53-954E-B0BBB792AF98}.Release|iPhone.Build.0 = Release|iPhone
+ {A6D1486F-3126-4F53-954E-B0BBB792AF98}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
+ {A6D1486F-3126-4F53-954E-B0BBB792AF98}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
+ EndGlobalSection
+EndGlobal
diff --git a/CCAction/ActionProject/ActionProject.Android/ActionProject.Android.csproj b/CCAction/ActionProject/ActionProject.Android/ActionProject.Android.csproj
new file mode 100644
index 000000000..8e1c1a4d5
--- /dev/null
+++ b/CCAction/ActionProject/ActionProject.Android/ActionProject.Android.csproj
@@ -0,0 +1,90 @@
+
+
+
+ Debug
+ AnyCPU
+ {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ {5529C07C-5F1E-4186-85F1-DB119F2CF6AA}
+ Library
+ ActionProject.Android
+ Assets
+ Resources
+ Resource
+ Resources\Resource.designer.cs
+ True
+ False
+ ActionProject.Android
+ v5.0
+ Properties\AndroidManifest.xml
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ None
+ false
+
+
+ full
+ true
+ bin\Release
+ prompt
+ 4
+ false
+ false
+
+
+
+
+
+
+
+ ..\..\packages\CocosSharp.PCL.Shared.1.6.2.0\lib\MonoAndroid10\box2d.dll
+
+
+ ..\..\packages\CocosSharp.PCL.Shared.1.6.2.0\lib\MonoAndroid10\CocosSharp.dll
+
+
+ ..\..\packages\CocosSharp.PCL.Shared.1.6.2.0\lib\MonoAndroid10\Lidgren.Network.dll
+
+
+ ..\..\packages\CocosSharp.PCL.Shared.1.6.2.0\lib\MonoAndroid10\MonoGame.Framework.dll
+
+
+ ..\..\packages\CocosSharp.PCL.Shared.1.6.2.0\lib\MonoAndroid10\MonoGame.Framework.Net.dll
+
+
+
+
+ {211A2950-C246-4449-BF8E-FDE25B6D1EE8}
+ ActionProject.Common
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CCAction/ActionProject/ActionProject.Android/Assets/AboutAssets.txt b/CCAction/ActionProject/ActionProject.Android/Assets/AboutAssets.txt
new file mode 100644
index 000000000..a9b0638eb
--- /dev/null
+++ b/CCAction/ActionProject/ActionProject.Android/Assets/AboutAssets.txt
@@ -0,0 +1,19 @@
+Any raw assets you want to be deployed with your application can be placed in
+this directory (and child directories) and given a Build Action of "AndroidAsset".
+
+These files will be deployed with your package and will be accessible using Android's
+AssetManager, like this:
+
+public class ReadAsset : Activity
+{
+ protected override void OnCreate (Bundle bundle)
+ {
+ base.OnCreate (bundle);
+
+ InputStream input = Assets.Open ("my_asset.txt");
+ }
+}
+
+Additionally, some Android functions will automatically load asset files:
+
+Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf");
diff --git a/CCAction/ActionProject/ActionProject.Android/MainActivity.cs b/CCAction/ActionProject/ActionProject.Android/MainActivity.cs
new file mode 100644
index 000000000..801c54bda
--- /dev/null
+++ b/CCAction/ActionProject/ActionProject.Android/MainActivity.cs
@@ -0,0 +1,38 @@
+using System;
+using Android.App;
+using Android.Content;
+using Android.Content.PM;
+using Android.OS;
+using Android.Runtime;
+using Android.Views;
+using Microsoft.Xna.Framework;
+
+using CocosSharp;
+
+namespace ActionProject
+{
+ [Activity (
+ Label = "ActionProject.Android",
+ AlwaysRetainTaskState = true,
+ Icon = "@drawable/icon",
+ Theme = "@android:style/Theme.NoTitleBar",
+ ScreenOrientation = ScreenOrientation.Landscape | ScreenOrientation.ReverseLandscape,
+ LaunchMode = LaunchMode.SingleInstance,
+ MainLauncher = true,
+ ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.ScreenSize | ConfigChanges.Keyboard | ConfigChanges.KeyboardHidden)
+ ]
+ public class MainActivity : AndroidGameActivity
+ {
+ protected override void OnCreate (Bundle bundle)
+ {
+ base.OnCreate (bundle);
+
+ var application = new CCApplication ();
+ application.ApplicationDelegate = new GameAppDelegate ();
+ SetContentView (application.AndroidContentView);
+ application.StartGame ();
+ }
+ }
+}
+
+
diff --git a/CCAction/ActionProject/ActionProject.Android/Properties/AndroidManifest.xml b/CCAction/ActionProject/ActionProject.Android/Properties/AndroidManifest.xml
new file mode 100644
index 000000000..725ee5add
--- /dev/null
+++ b/CCAction/ActionProject/ActionProject.Android/Properties/AndroidManifest.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CCAction/ActionProject/ActionProject.Android/Properties/AssemblyInfo.cs b/CCAction/ActionProject/ActionProject.Android/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..d2372c94c
--- /dev/null
+++ b/CCAction/ActionProject/ActionProject.Android/Properties/AssemblyInfo.cs
@@ -0,0 +1,28 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using Android.App;
+
+// Information about this assembly is defined by the following attributes.
+// Change them to the values specific to your project.
+
+[assembly: AssemblyTitle ("ActionProject.Android")]
+[assembly: AssemblyDescription ("")]
+[assembly: AssemblyConfiguration ("")]
+[assembly: AssemblyCompany ("")]
+[assembly: AssemblyProduct ("")]
+[assembly: AssemblyCopyright ("vchelaru")]
+[assembly: AssemblyTrademark ("")]
+[assembly: AssemblyCulture ("")]
+
+// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
+// The form "{Major}.{Minor}.*" will automatically update the build and revision,
+// and "{Major}.{Minor}.{Build}.*" will update just the revision.
+
+[assembly: AssemblyVersion ("1.0.0")]
+
+// The following attributes are used to specify the signing key for the assembly,
+// if desired. See the Mono documentation for more information about signing.
+
+//[assembly: AssemblyDelaySign(false)]
+//[assembly: AssemblyKeyFile("")]
+
diff --git a/SoMA/Components/xamarin.social-1.0.1/samples/Xamarin.Social.Sample.Android/Components/xamarin.mobile-0.6.2/samples/Xamarin.Mobile.Android.Samples/GeolocationSample/Resources/AboutResources.txt b/CCAction/ActionProject/ActionProject.Android/Resources/AboutResources.txt
similarity index 100%
rename from SoMA/Components/xamarin.social-1.0.1/samples/Xamarin.Social.Sample.Android/Components/xamarin.mobile-0.6.2/samples/Xamarin.Mobile.Android.Samples/GeolocationSample/Resources/AboutResources.txt
rename to CCAction/ActionProject/ActionProject.Android/Resources/AboutResources.txt
diff --git a/CCAction/ActionProject/ActionProject.Android/Resources/Resource.designer.cs b/CCAction/ActionProject/ActionProject.Android/Resources/Resource.designer.cs
new file mode 100644
index 000000000..9d446712d
--- /dev/null
+++ b/CCAction/ActionProject/ActionProject.Android/Resources/Resource.designer.cs
@@ -0,0 +1,77 @@
+#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("ActionProject.Android.Resource", IsApplication=true)]
+
+namespace ActionProject.Android
+{
+
+
+ [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;
+
+ static Drawable()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Drawable()
+ {
+ }
+ }
+
+ public partial class String
+ {
+
+ // aapt resource value: 0x7f030000
+ public const int app_name = 2130903040;
+
+ static String()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private String()
+ {
+ }
+ }
+ }
+}
+#pragma warning restore 1591
diff --git a/Camera/Components/xamarin.mobile-0.6.3/samples/Xamarin.Mobile.Android.Samples/GeolocationSample/Resources/drawable/Icon.png b/CCAction/ActionProject/ActionProject.Android/Resources/drawable/Icon.png
similarity index 100%
rename from Camera/Components/xamarin.mobile-0.6.3/samples/Xamarin.Mobile.Android.Samples/GeolocationSample/Resources/drawable/Icon.png
rename to CCAction/ActionProject/ActionProject.Android/Resources/drawable/Icon.png
diff --git a/CCAction/ActionProject/ActionProject.Android/Resources/values/Strings.xml b/CCAction/ActionProject/ActionProject.Android/Resources/values/Strings.xml
new file mode 100644
index 000000000..58f9e7b0d
--- /dev/null
+++ b/CCAction/ActionProject/ActionProject.Android/Resources/values/Strings.xml
@@ -0,0 +1,4 @@
+
+
+ ActionProject.Android
+
diff --git a/CCAction/ActionProject/ActionProject.Android/packages.config b/CCAction/ActionProject/ActionProject.Android/packages.config
new file mode 100644
index 000000000..48075819d
--- /dev/null
+++ b/CCAction/ActionProject/ActionProject.Android/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/CCAction/ActionProject/ActionProject.Common/ActionProject.Common.csproj b/CCAction/ActionProject/ActionProject.Common/ActionProject.Common.csproj
new file mode 100644
index 000000000..9fffacaf0
--- /dev/null
+++ b/CCAction/ActionProject/ActionProject.Common/ActionProject.Common.csproj
@@ -0,0 +1,53 @@
+
+
+
+ Debug
+ AnyCPU
+ {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ {211A2950-C246-4449-BF8E-FDE25B6D1EE8}
+ Library
+ ActionProject.Common
+ ActionProject.Common
+ v4.5
+ Profile111
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ false
+
+
+ full
+ true
+ bin\Release
+ prompt
+ 4
+ false
+
+
+
+
+
+
+
+
+
+
+ ..\..\packages\CocosSharp.PCL.Shared.1.6.2.0\lib\portable-net45+win+wpa81+wp81\box2d.dll
+
+
+ ..\..\packages\CocosSharp.PCL.Shared.1.6.2.0\lib\portable-net45+win+wpa81+wp81\CocosSharp.dll
+
+
+ ..\..\packages\CocosSharp.PCL.Shared.1.6.2.0\lib\portable-net45+win+wpa81+wp81\MonoGame.Framework.dll
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CCAction/ActionProject/ActionProject.Common/GameAppDelegate.cs b/CCAction/ActionProject/ActionProject.Common/GameAppDelegate.cs
new file mode 100644
index 000000000..5cc2a659d
--- /dev/null
+++ b/CCAction/ActionProject/ActionProject.Common/GameAppDelegate.cs
@@ -0,0 +1,53 @@
+using CocosSharp;
+
+namespace ActionProject
+{
+ public class GameAppDelegate : CCApplicationDelegate
+ {
+ public override void ApplicationDidFinishLaunching (CCApplication application, CCWindow mainWindow)
+ {
+ application.PreferMultiSampling = false;
+ application.ContentRootDirectory = "Content";
+ application.ContentSearchPaths.Add ("animations");
+ application.ContentSearchPaths.Add ("fonts");
+ application.ContentSearchPaths.Add ("sounds");
+
+ CCSize windowSize = mainWindow.WindowSizeInPixels;
+
+ float desiredWidth = 1024.0f;
+ float desiredHeight = 768.0f;
+
+ // This will set the world bounds to be (0,0, w, h)
+ // CCSceneResolutionPolicy.ShowAll will ensure that the aspect ratio is preserved
+ CCScene.SetDefaultDesignResolution (desiredWidth, desiredHeight, CCSceneResolutionPolicy.ShowAll);
+
+ // Determine whether to use the high or low def versions of our images
+ // Make sure the default texel to content size ratio is set correctly
+ // Of course you're free to have a finer set of image resolutions e.g (ld, hd, super-hd)
+ if (desiredWidth < windowSize.Width) {
+ application.ContentSearchPaths.Add ("images/hd");
+ CCSprite.DefaultTexelToContentSizeRatio = 2.0f;
+ } else {
+ application.ContentSearchPaths.Add ("images/ld");
+ CCSprite.DefaultTexelToContentSizeRatio = 1.0f;
+ }
+
+ var scene = new CCScene (mainWindow);
+ var gameLayer = new GameLayer ();
+
+ scene.AddChild (gameLayer);
+
+ mainWindow.RunWithScene (scene);
+ }
+
+ public override void ApplicationDidEnterBackground (CCApplication application)
+ {
+ application.Paused = true;
+ }
+
+ public override void ApplicationWillEnterForeground (CCApplication application)
+ {
+ application.Paused = false;
+ }
+ }
+}
diff --git a/CCAction/ActionProject/ActionProject.Common/GameLayer.cs b/CCAction/ActionProject/ActionProject.Common/GameLayer.cs
new file mode 100644
index 000000000..01513256f
--- /dev/null
+++ b/CCAction/ActionProject/ActionProject.Common/GameLayer.cs
@@ -0,0 +1,231 @@
+using System;
+using System.Collections.Generic;
+using CocosSharp;
+using ActionProject.Common;
+
+namespace ActionProject
+{
+ public class GameLayer : CCLayer
+ {
+ readonly List VariableOptions = new List {
+ "Position",
+ "Scale",
+ "Rotation",
+ "LineWidth"
+ };
+ readonly List EasingOptions = new List {
+ "",
+ "CCEaseBack",
+ "CCEaseBounce",
+ "CCEaseElastic",
+ "CCEaseExponential",
+ "CCEaseSine"
+ };
+
+ List OutInOptions = new List {
+ "Out",
+ "In",
+ "Both"
+ };
+
+ int currentVariableIndex;
+ int currentEasingIndex;
+ int currentInOutIndex;
+
+ readonly CCNode drawNodeRoot;
+ readonly LineNode lineNode;
+
+ CCLabel variableLabel;
+ CCLabel easingLabel;
+ CCLabel inOutLabel;
+
+ const float DefaultCircleRadius = 40f;
+
+ public GameLayer ()
+ {
+
+ drawNodeRoot = new CCNode {
+ PositionX = 500f,
+ PositionY = 350f
+ };
+
+ AddChild (drawNodeRoot);
+
+ CCDrawNode circle;
+ circle = new CCDrawNode ();
+ circle.DrawSolidCircle (CCPoint.Zero, DefaultCircleRadius, CCColor4B.Red);
+ drawNodeRoot.AddChild (circle);
+
+ lineNode = new LineNode ();
+ drawNodeRoot.AddChild (lineNode);
+
+ variableLabel = new CCLabel ("Hello", "Arial", 46f, CCLabelFormat.SystemFont);
+ variableLabel.HorizontalAlignment = CCTextAlignment.Left;
+ variableLabel.AnchorPoint = new CCPoint (0f, 0f);
+ variableLabel.PositionX = 48f;
+ variableLabel.PositionY = 390f;
+ AddChild (variableLabel);
+
+ easingLabel = new CCLabel ("Hello", "Arial", 46f, CCLabelFormat.SystemFont);
+ easingLabel.HorizontalAlignment = CCTextAlignment.Left;
+ easingLabel.AnchorPoint = new CCPoint (0f, 0f);
+ easingLabel.PositionX = 48f;
+ easingLabel.PositionY = 330f;
+ AddChild (easingLabel);
+
+ inOutLabel = new CCLabel ("Hello", "Arial", 46f, CCLabelFormat.SystemFont);
+ inOutLabel.HorizontalAlignment = CCTextAlignment.Left;
+ inOutLabel.AnchorPoint = new CCPoint (0, 0);
+ inOutLabel.PositionX = 48f;
+ inOutLabel.PositionY = 270f;
+ AddChild (inOutLabel);
+
+ UpdateLabels ();
+ }
+
+ protected override void AddedToScene ()
+ {
+ base.AddedToScene ();
+
+ var touchListener = new CCEventListenerTouchAllAtOnce ();
+ touchListener.OnTouchesEnded = OnTouchesEnded;
+ AddEventListener (touchListener, this);
+ }
+
+ void OnTouchesEnded (List touches, CCEvent touchEvent)
+ {
+ if (touches.Count > 0) {
+ var touch = touches [0];
+
+ if (easingLabel.BoundingBoxTransformedToWorld.ContainsPoint (touch.Location)) {
+ HandleEasingLabelTouched ();
+ } else if (inOutLabel.BoundingBoxTransformedToWorld.ContainsPoint (touch.Location)) {
+ HandleInOutLabelTouched ();
+ } else if (variableLabel.BoundingBoxTransformedToWorld.ContainsPoint (touch.Location)) {
+ HandleVariableLabelTouched ();
+ } else {
+ HandleMoveCircle (touch);
+ }
+ }
+ }
+
+ void HandleVariableLabelTouched ()
+ {
+ currentVariableIndex++;
+ currentVariableIndex = currentVariableIndex % VariableOptions.Count;
+
+ UpdateLabels ();
+ }
+
+ void HandleEasingLabelTouched ()
+ {
+ currentEasingIndex++;
+ currentEasingIndex = currentEasingIndex % EasingOptions.Count;
+
+ UpdateLabels ();
+ }
+
+ void HandleInOutLabelTouched ()
+ {
+ currentInOutIndex++;
+ currentInOutIndex = currentInOutIndex % OutInOptions.Count;
+
+ UpdateLabels ();
+ }
+
+ void UpdateLabels ()
+ {
+ variableLabel.Text = VariableOptions [currentVariableIndex];
+ easingLabel.Text = EasingOptions [currentEasingIndex];
+ inOutLabel.Text = OutInOptions [currentInOutIndex];
+ }
+
+ void HandleMoveCircle (CCTouch touch)
+ {
+ const float timeToTake = 1.5f; // in seconds
+ CCFiniteTimeAction coreAction = null;
+
+ // By default all actions will be added directly to the
+ // root node - it has values for Position, Scale, and Rotation.
+ CCNode nodeToAddTo = drawNodeRoot;
+
+ switch (VariableOptions [currentVariableIndex]) {
+ case "Position":
+ coreAction = new CCMoveTo(timeToTake, touch.Location);
+ break;
+ case "Scale":
+ var distance = CCPoint.Distance (touch.Location, drawNodeRoot.Position);
+ var desiredScale = distance / DefaultCircleRadius;
+ coreAction = new CCScaleTo (timeToTake, desiredScale);
+ break;
+ case "Rotation":
+ float differenceY = touch.Location.Y - drawNodeRoot.PositionY;
+ float differenceX = touch.Location.X - drawNodeRoot.PositionX;
+
+ float angleInDegrees = -1 * CCMathHelper.ToDegrees (
+ (float)Math.Atan2 (differenceY, differenceX));
+
+ coreAction = new CCRotateTo (timeToTake, angleInDegrees);
+
+ break;
+ case "LineWidth":
+ coreAction = new LineWidthAction (timeToTake, touch.Location.X / 40f);
+ // The LineWidthAction is a special action designed to work only on
+ // LineNode instances, so we have to set the nodeToAddTo to the lineNode:
+ nodeToAddTo = lineNode;
+ break;
+ }
+
+ CCAction easing = null;
+ switch (EasingOptions [currentEasingIndex]) {
+ case "CCEaseBack":
+ if (currentInOutIndex == 0)
+ easing = new CCEaseBackOut (coreAction);
+ else if (currentInOutIndex == 1)
+ easing = new CCEaseBackIn (coreAction);
+ else
+ easing = new CCEaseBackInOut (coreAction);
+
+ break;
+ case "CCEaseBounce":
+ if (currentInOutIndex == 0)
+ easing = new CCEaseBounceOut (coreAction);
+ else if (currentInOutIndex == 1)
+ easing = new CCEaseBounceIn (coreAction);
+ else
+ easing = new CCEaseBounceInOut (coreAction);
+
+ break;
+ case "CCEaseElastic":
+ if (currentInOutIndex == 0)
+ easing = new CCEaseElasticOut (coreAction);
+ else if (currentInOutIndex == 1)
+ easing = new CCEaseElasticIn (coreAction);
+ else
+ easing = new CCEaseElasticInOut (coreAction);
+
+ break;
+ case "CCEaseExponential":
+ if (currentInOutIndex == 0)
+ easing = new CCEaseExponentialOut (coreAction);
+ else if (currentInOutIndex == 1)
+ easing = new CCEaseExponentialIn (coreAction);
+ else
+ easing = new CCEaseExponentialInOut (coreAction);
+
+ break;
+ case "CCEaseSine":
+ if (currentInOutIndex == 0)
+ easing = new CCEaseSineOut (coreAction);
+ else if (currentInOutIndex == 1)
+ easing = new CCEaseSineIn (coreAction);
+ else
+ easing = new CCEaseSineInOut (coreAction);
+
+ break;
+ }
+
+ nodeToAddTo.AddAction (easing ?? coreAction);
+ }
+ }
+}
diff --git a/CCAction/ActionProject/ActionProject.Common/LineNode.cs b/CCAction/ActionProject/ActionProject.Common/LineNode.cs
new file mode 100644
index 000000000..fe7c4882d
--- /dev/null
+++ b/CCAction/ActionProject/ActionProject.Common/LineNode.cs
@@ -0,0 +1,38 @@
+using System;
+using CocosSharp;
+
+namespace ActionProject
+{
+ public class LineNode : CCNode
+ {
+ readonly CCDrawNode line;
+ float width;
+
+ public float Width {
+ get {
+ return width;
+ }
+ set {
+ width = value;
+
+ UpdateLine ();
+ }
+ }
+
+ public LineNode ()
+ {
+ line = new CCDrawNode ();
+ Width = 10;
+ AddChild (line);
+ }
+
+ void UpdateLine ()
+ {
+ line.Clear ();
+
+ var effectiveWidth = Math.Max (0, width);
+ line.DrawLine (CCPoint.Zero, new CCPoint (40, 0), effectiveWidth / 2, new CCColor4F (1, 1, 0, 1));
+ }
+ }
+}
+
diff --git a/CCAction/ActionProject/ActionProject.Common/LineWidthAction.cs b/CCAction/ActionProject/ActionProject.Common/LineWidthAction.cs
new file mode 100644
index 000000000..e8eb11d10
--- /dev/null
+++ b/CCAction/ActionProject/ActionProject.Common/LineWidthAction.cs
@@ -0,0 +1,50 @@
+using System;
+using CocosSharp;
+
+namespace ActionProject.Common
+{
+ public class LineWidthAction : CCFiniteTimeAction
+ {
+ readonly float endWidth;
+
+ public LineWidthAction (float duration, float width) : base (duration)
+ {
+ endWidth = width;
+ }
+
+ public override CCFiniteTimeAction Reverse ()
+ {
+ throw new NotImplementedException ();
+ }
+
+ protected override CCActionState StartAction (CCNode target)
+ {
+ return new LineWidthState (this, target, endWidth);
+ }
+ }
+
+ public class LineWidthState : CCFiniteTimeActionState
+ {
+ readonly float deltaWidth;
+ readonly float startWidth;
+ readonly LineNode castedTarget;
+
+ public LineWidthState (LineWidthAction action, CCNode target, float endWidth) : base (action, target)
+ {
+ castedTarget = target as LineNode;
+
+ if (castedTarget == null) {
+ throw new InvalidOperationException ("The argument target must be a LineNode");
+ }
+
+ startWidth = castedTarget.Width;
+ deltaWidth = endWidth - startWidth;
+ }
+
+ public override void Update (float time)
+ {
+ castedTarget.Width = startWidth + deltaWidth * time;
+ }
+ }
+}
+
diff --git a/CCAction/ActionProject/ActionProject.Common/packages.config b/CCAction/ActionProject/ActionProject.Common/packages.config
new file mode 100644
index 000000000..867fc5985
--- /dev/null
+++ b/CCAction/ActionProject/ActionProject.Common/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/CCAction/ActionProject/ActionProject.iOS/ActionProject.iOS.csproj b/CCAction/ActionProject/ActionProject.iOS/ActionProject.iOS.csproj
new file mode 100644
index 000000000..8a21de076
--- /dev/null
+++ b/CCAction/ActionProject/ActionProject.iOS/ActionProject.iOS.csproj
@@ -0,0 +1,106 @@
+
+
+
+ Debug
+ iPhoneSimulator
+ {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ {A6D1486F-3126-4F53-954E-B0BBB792AF98}
+ Exe
+ ActionProject.iOS
+ Resources
+ ActionProject.iOS
+
+
+ true
+ full
+ false
+ bin\iPhoneSimulator\Debug
+ DEBUG;
+ prompt
+ 4
+ false
+ i386
+ None
+ true
+ true
+ NSUrlSessionHandler
+
+
+ full
+ true
+ bin\iPhone\Release
+ prompt
+ 4
+ Entitlements.plist
+ ARMv7, ARM64
+ false
+ iPhone Developer
+ NSUrlSessionHandler
+
+
+ full
+ true
+ bin\iPhoneSimulator\Release
+ prompt
+ 4
+ i386
+ false
+ None
+ NSUrlSessionHandler
+
+
+ true
+ full
+ false
+ bin\iPhone\Debug
+ DEBUG;
+ prompt
+ 4
+ false
+ ARMv7, ARM64
+ Entitlements.plist
+ true
+ iPhone Developer
+ true
+ NSUrlSessionHandler
+
+
+
+
+
+
+
+ ..\..\packages\CocosSharp.PCL.Shared.1.6.2.0\lib\Xamarin.iOS10\box2d.dll
+
+
+ ..\..\packages\CocosSharp.PCL.Shared.1.6.2.0\lib\Xamarin.iOS10\CocosSharp.dll
+
+
+ ..\..\packages\CocosSharp.PCL.Shared.1.6.2.0\lib\Xamarin.iOS10\Lidgren.Network.dll
+
+
+ ..\..\packages\CocosSharp.PCL.Shared.1.6.2.0\lib\Xamarin.iOS10\MonoGame.Framework.dll
+
+
+ ..\..\packages\CocosSharp.PCL.Shared.1.6.2.0\lib\Xamarin.iOS10\MonoGame.Framework.Net.dll
+
+
+
+
+ {211A2950-C246-4449-BF8E-FDE25B6D1EE8}
+ ActionProject.Common
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CCAction/ActionProject/ActionProject.iOS/AppDelegate.cs b/CCAction/ActionProject/ActionProject.iOS/AppDelegate.cs
new file mode 100644
index 000000000..3c3efff27
--- /dev/null
+++ b/CCAction/ActionProject/ActionProject.iOS/AppDelegate.cs
@@ -0,0 +1,26 @@
+using Foundation;
+using UIKit;
+using CocosSharp;
+
+namespace ActionProject
+{
+ [Register ("AppDelegate")]
+ public class AppDelegate : UIApplicationDelegate
+ {
+ public override void FinishedLaunching (UIApplication application)
+ {
+ var ccApp = new CCApplication {
+ ApplicationDelegate = new GameAppDelegate ()
+ };
+
+ ccApp.StartGame ();
+ }
+
+ static void Main (string[] args)
+ {
+ UIApplication.Main (args, null, "AppDelegate");
+ }
+ }
+}
+
+
diff --git a/CCAction/ActionProject/ActionProject.iOS/Entitlements.plist b/CCAction/ActionProject/ActionProject.iOS/Entitlements.plist
new file mode 100644
index 000000000..e9a3005f7
--- /dev/null
+++ b/CCAction/ActionProject/ActionProject.iOS/Entitlements.plist
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/CCAction/ActionProject/ActionProject.iOS/Info.plist b/CCAction/ActionProject/ActionProject.iOS/Info.plist
new file mode 100644
index 000000000..aecae95c2
--- /dev/null
+++ b/CCAction/ActionProject/ActionProject.iOS/Info.plist
@@ -0,0 +1,37 @@
+
+
+
+
+ CFBundleDisplayName
+ ActionProject.iOS
+ CFBundleIdentifier
+ com.your-company.ActionProject.iOS
+ CFBundleShortVersionString
+ 1.0
+ CFBundleVersion
+ 1.0
+ LSRequiresIPhoneOS
+
+ MinimumOSVersion
+ 7.0
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UIRequiredDeviceCapabilities
+
+ armv7
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+
+
diff --git a/AnalogClock/AnalogClock.iOS/Resources/Default-568h@2x.png b/CCAction/ActionProject/ActionProject.iOS/Resources/Default-568h@2x.png
similarity index 100%
rename from AnalogClock/AnalogClock.iOS/Resources/Default-568h@2x.png
rename to CCAction/ActionProject/ActionProject.iOS/Resources/Default-568h@2x.png
diff --git a/CCAction/ActionProject/ActionProject.iOS/packages.config b/CCAction/ActionProject/ActionProject.iOS/packages.config
new file mode 100644
index 000000000..5a4e71219
--- /dev/null
+++ b/CCAction/ActionProject/ActionProject.iOS/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/CCAction/Metadata.xml b/CCAction/Metadata.xml
new file mode 100644
index 000000000..65578c015
--- /dev/null
+++ b/CCAction/Metadata.xml
@@ -0,0 +1,11 @@
+
+
+ e292572f-2b2b-4d78-afa3-a35b27f8151f
+ false
+ Intermediate
+ Games
+ Android, iOS
+ Indie
+ A simple project showing common and custom CCAction implementations.
+ true
+
diff --git a/CCAction/README.md b/CCAction/README.md
new file mode 100644
index 000000000..70680ed33
--- /dev/null
+++ b/CCAction/README.md
@@ -0,0 +1,10 @@
+CCAction Demo
+================
+
+This solution contains an iOS and Android CocosSharp project which shows how to work with the CCAction object. It includes usage for common implementations such as CCMove as well as many easing CCAction implementations. It also includes a custom CCAction implementation for changing the visual object’s line width.
+
+This demo is built against CocosSharp 1.5.0.1.
+
+Authors
+-------
+Victor Chelaru
\ No newline at end of file
diff --git a/CCAction/Screenshots/CCActionGif.gif b/CCAction/Screenshots/CCActionGif.gif
new file mode 100644
index 000000000..8490fcb25
Binary files /dev/null and b/CCAction/Screenshots/CCActionGif.gif differ
diff --git a/CCAudioEngine/CCAudioEngineSample.sln b/CCAudioEngine/CCAudioEngineSample.sln
new file mode 100644
index 000000000..eebdf0f56
--- /dev/null
+++ b/CCAudioEngine/CCAudioEngineSample.sln
@@ -0,0 +1,29 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 14
+VisualStudioVersion = 14.0.24720.0
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CCAudioEngineSample.Android", "CCAudioEngineSample\CCAudioEngineSample.Android\CCAudioEngineSample.Android.csproj", "{F1AE6514-2F0E-4285-98C9-5A1CA3D68E4D}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CCAudioEngineSample.Common", "CCAudioEngineSample\CCAudioEngineSample.Common\CCAudioEngineSample.Common.csproj", "{3CD04199-5BFD-4860-95B7-4E685BB3B9EA}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {F1AE6514-2F0E-4285-98C9-5A1CA3D68E4D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F1AE6514-2F0E-4285-98C9-5A1CA3D68E4D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F1AE6514-2F0E-4285-98C9-5A1CA3D68E4D}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {F1AE6514-2F0E-4285-98C9-5A1CA3D68E4D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F1AE6514-2F0E-4285-98C9-5A1CA3D68E4D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3CD04199-5BFD-4860-95B7-4E685BB3B9EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3CD04199-5BFD-4860-95B7-4E685BB3B9EA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3CD04199-5BFD-4860-95B7-4E685BB3B9EA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3CD04199-5BFD-4860-95B7-4E685BB3B9EA}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Assets/AboutAssets.txt b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Assets/AboutAssets.txt
new file mode 100644
index 000000000..a9b0638eb
--- /dev/null
+++ b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Assets/AboutAssets.txt
@@ -0,0 +1,19 @@
+Any raw assets you want to be deployed with your application can be placed in
+this directory (and child directories) and given a Build Action of "AndroidAsset".
+
+These files will be deployed with your package and will be accessible using Android's
+AssetManager, like this:
+
+public class ReadAsset : Activity
+{
+ protected override void OnCreate (Bundle bundle)
+ {
+ base.OnCreate (bundle);
+
+ InputStream input = Assets.Open ("my_asset.txt");
+ }
+}
+
+Additionally, some Android functions will automatically load asset files:
+
+Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf");
diff --git a/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Assets/Content/ContentProject.mgcb b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Assets/Content/ContentProject.mgcb
new file mode 100644
index 000000000..c7ae67f08
--- /dev/null
+++ b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Assets/Content/ContentProject.mgcb
@@ -0,0 +1,27 @@
+
+#----------------------------- Global Properties ----------------------------#
+
+/outputDir:.\
+/intermediateDir:obj
+/platform:Android
+/config:
+/profile:Reach
+/compress:False
+
+#-------------------------------- References --------------------------------#
+
+
+#---------------------------------- Content ---------------------------------#
+
+#begin FruityFalls.mp3
+/importer:Mp3Importer
+/processor:SongProcessor
+/processorParam:Quality=Best
+/build:FruityFalls.mp3
+
+#begin Electricity.wav
+/importer:WavImporter
+/processor:SoundEffectProcessor
+/processorParam:Quality=Best
+/build:Electricity.wav
+
diff --git a/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Assets/Content/Electricity.wav b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Assets/Content/Electricity.wav
new file mode 100644
index 000000000..3638f1d39
Binary files /dev/null and b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Assets/Content/Electricity.wav differ
diff --git a/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Assets/Content/Electricity.xnb b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Assets/Content/Electricity.xnb
new file mode 100644
index 000000000..0126380f0
Binary files /dev/null and b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Assets/Content/Electricity.xnb differ
diff --git a/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Assets/Content/FruityFalls.m4a b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Assets/Content/FruityFalls.m4a
new file mode 100644
index 000000000..935e39533
Binary files /dev/null and b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Assets/Content/FruityFalls.m4a differ
diff --git a/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Assets/Content/FruityFalls.mp3 b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Assets/Content/FruityFalls.mp3
new file mode 100644
index 000000000..152e350e6
Binary files /dev/null and b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Assets/Content/FruityFalls.mp3 differ
diff --git a/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Assets/Content/FruityFalls.xnb b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Assets/Content/FruityFalls.xnb
new file mode 100644
index 000000000..2077cfb8e
Binary files /dev/null and b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Assets/Content/FruityFalls.xnb differ
diff --git a/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/CCAudioEngineSample.Android.csproj b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/CCAudioEngineSample.Android.csproj
new file mode 100644
index 000000000..87d5595fd
--- /dev/null
+++ b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/CCAudioEngineSample.Android.csproj
@@ -0,0 +1,89 @@
+
+
+
+ Debug
+ AnyCPU
+ {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ {F1AE6514-2F0E-4285-98C9-5A1CA3D68E4D}
+ Library
+ CCAudioEngineSample.Android
+ True
+ Resources\Resource.designer.cs
+ Resource
+ Resources
+ Assets
+ True
+ CCAudioEngineSample.Android
+ v6.0
+ Properties\AndroidManifest.xml
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ false
+ None
+
+
+ full
+ true
+ bin\Release
+ prompt
+ 4
+ false
+ false
+
+
+
+
+
+
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\MonoAndroid10\CocosSharp.dll
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\MonoAndroid10\Lidgren.Network.dll
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\MonoAndroid10\MonoGame.Framework.dll
+
+
+
+
+ {3CD04199-5BFD-4860-95B7-4E685BB3B9EA}
+ CCAudioEngineSample.Common
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/MainActivity.cs b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/MainActivity.cs
new file mode 100644
index 000000000..bc2fbb7d0
--- /dev/null
+++ b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/MainActivity.cs
@@ -0,0 +1,70 @@
+using System;
+using System.Collections.Generic;
+
+using Android.App;
+using Android.Content;
+using Android.Content.PM;
+using Android.Runtime;
+using Android.Views;
+using Android.Widget;
+using Android.OS;
+
+using CocosSharp;
+
+namespace CCAudioEngineSample.Android
+{
+ [Activity (Label = "CCAudioEngineSample.Android", MainLauncher = true, Icon = "@drawable/icon",
+ AlwaysRetainTaskState = true,
+ LaunchMode = LaunchMode.SingleInstance,
+ ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.ScreenSize | ConfigChanges.Keyboard | ConfigChanges.KeyboardHidden)]
+ public class MainActivity : Activity
+ {
+ protected override void OnCreate (Bundle bundle)
+ {
+ base.OnCreate (bundle);
+
+ // Set our view from the "main" layout resource
+ SetContentView (Resource.Layout.Main);
+
+ // Get our game view from the layout resource,
+ // and attach the view created event to it
+ CCGameView gameView = (CCGameView)FindViewById (Resource.Id.GameView);
+ gameView.ViewCreated += LoadGame;
+ }
+
+ void LoadGame (object sender, EventArgs e)
+ {
+ CCGameView gameView = sender as CCGameView;
+
+ if (gameView != null) {
+ var contentSearchPaths = new List () { "Fonts", "Sounds" };
+ CCSizeI viewSize = gameView.ViewSize;
+
+ int height = 1024;
+ int width = 768;
+
+ // Set world dimensions
+ gameView.DesignResolution = new CCSizeI (width, height);
+
+ // Determine whether to use the high or low def versions of our images
+ // Make sure the default texel to content size ratio is set correctly
+ // Of course you're free to have a finer set of image resolutions e.g (ld, hd, super-hd)
+ if (width < viewSize.Width) {
+ contentSearchPaths.Add ("Images/Hd");
+ CCSprite.DefaultTexelToContentSizeRatio = 2.0f;
+ } else {
+ contentSearchPaths.Add ("Images/Ld");
+ CCSprite.DefaultTexelToContentSizeRatio = 1.0f;
+ }
+
+ gameView.ContentManager.SearchPaths = contentSearchPaths;
+
+ CCScene gameScene = new CCScene (gameView);
+ gameScene.AddLayer (new GameLayer ());
+ gameView.RunWithScene (gameScene);
+ }
+ }
+ }
+}
+
+
diff --git a/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Properties/AndroidManifest.xml b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Properties/AndroidManifest.xml
new file mode 100644
index 000000000..b62f9a2fa
--- /dev/null
+++ b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Properties/AndroidManifest.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Properties/AssemblyInfo.cs b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..26f7779ba
--- /dev/null
+++ b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Properties/AssemblyInfo.cs
@@ -0,0 +1,28 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using Android.App;
+
+// Information about this assembly is defined by the following attributes.
+// Change them to the values specific to your project.
+
+[assembly: AssemblyTitle ("CCAudioEngineSample.Android")]
+[assembly: AssemblyDescription ("")]
+[assembly: AssemblyConfiguration ("")]
+[assembly: AssemblyCompany ("")]
+[assembly: AssemblyProduct ("")]
+[assembly: AssemblyCopyright ("vchel")]
+[assembly: AssemblyTrademark ("")]
+[assembly: AssemblyCulture ("")]
+
+// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
+// The form "{Major}.{Minor}.*" will automatically update the build and revision,
+// and "{Major}.{Minor}.{Build}.*" will update just the revision.
+
+[assembly: AssemblyVersion ("1.0.0")]
+
+// The following attributes are used to specify the signing key for the assembly,
+// if desired. See the Mono documentation for more information about signing.
+
+//[assembly: AssemblyDelaySign(false)]
+//[assembly: AssemblyKeyFile("")]
+
diff --git a/SoMA/Components/xamarin.social-1.0.1/samples/Xamarin.Social.Sample.iOS/Components/xamarin.mobile-0.6.2/samples/Xamarin.Mobile.Android.Samples/GeolocationSample/Resources/AboutResources.txt b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Resources/AboutResources.txt
similarity index 100%
rename from SoMA/Components/xamarin.social-1.0.1/samples/Xamarin.Social.Sample.iOS/Components/xamarin.mobile-0.6.2/samples/Xamarin.Mobile.Android.Samples/GeolocationSample/Resources/AboutResources.txt
rename to CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Resources/AboutResources.txt
diff --git a/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Resources/drawable-hdpi/Icon.png b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Resources/drawable-hdpi/Icon.png
new file mode 100644
index 000000000..f4c804644
Binary files /dev/null and b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Resources/drawable-hdpi/Icon.png differ
diff --git a/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Resources/drawable-mdpi/Icon.png b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Resources/drawable-mdpi/Icon.png
new file mode 100644
index 000000000..ef1e1ee7d
Binary files /dev/null and b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Resources/drawable-mdpi/Icon.png differ
diff --git a/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Resources/drawable-xhdpi/Icon.png b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Resources/drawable-xhdpi/Icon.png
new file mode 100644
index 000000000..b7e2e57aa
Binary files /dev/null and b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Resources/drawable-xhdpi/Icon.png differ
diff --git a/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Resources/drawable-xxhdpi/Icon.png b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Resources/drawable-xxhdpi/Icon.png
new file mode 100644
index 000000000..8d20a38d1
Binary files /dev/null and b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Resources/drawable-xxhdpi/Icon.png differ
diff --git a/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Resources/drawable-xxxhdpi/Icon.png b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Resources/drawable-xxxhdpi/Icon.png
new file mode 100644
index 000000000..6d9919c41
Binary files /dev/null and b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Resources/drawable-xxxhdpi/Icon.png differ
diff --git a/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Resources/layout/Main.axml b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Resources/layout/Main.axml
new file mode 100644
index 000000000..77959ac22
--- /dev/null
+++ b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Resources/layout/Main.axml
@@ -0,0 +1,11 @@
+
+
+
+
+
diff --git a/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Resources/values/Strings.xml b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Resources/values/Strings.xml
new file mode 100644
index 000000000..207f070ad
--- /dev/null
+++ b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/Resources/values/Strings.xml
@@ -0,0 +1,4 @@
+
+
+ CCAudioEngineSample.Android
+
diff --git a/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/packages.config b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/packages.config
new file mode 100644
index 000000000..4354d62ef
--- /dev/null
+++ b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Android/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Common/CCAudioEngineSample.Common.csproj b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Common/CCAudioEngineSample.Common.csproj
new file mode 100644
index 000000000..bebc15f3a
--- /dev/null
+++ b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Common/CCAudioEngineSample.Common.csproj
@@ -0,0 +1,50 @@
+
+
+
+ Debug
+ AnyCPU
+ {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ {3CD04199-5BFD-4860-95B7-4E685BB3B9EA}
+ Library
+ CCAudioEngineSample.Common
+ CCAudioEngineSample.Common
+ v4.5
+ Profile111
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ false
+
+
+ full
+ true
+ bin\Release
+ prompt
+ 4
+ false
+
+
+
+
+
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\portable-net45+win+wpa81+wp81\box2d.dll
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\portable-net45+win+wpa81+wp81\CocosSharp.dll
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\portable-net45+win+wpa81+wp81\MonoGame.Framework.dll
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Common/GameLayer.cs b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Common/GameLayer.cs
new file mode 100644
index 000000000..b3d9b119e
--- /dev/null
+++ b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Common/GameLayer.cs
@@ -0,0 +1,254 @@
+using System;
+using System.Collections.Generic;
+using CocosSharp;
+
+namespace CCAudioEngineSample
+{
+ public class GameLayer : CCLayerColor
+ {
+ CCLabel musicLabel;
+ CCDrawNode musicPlayButton;
+
+ CCLabel sfxLabel;
+ CCDrawNode sfxPlayButton;
+
+ CCLabel sfxVolumeLabel;
+ CCLabel musicVolumeLabel;
+
+ CCDrawNode sfxVolumeUp;
+ CCDrawNode sfxVolumeDown;
+
+ CCDrawNode musicVolumeUp;
+ CCDrawNode musicVolumeDown;
+
+ public GameLayer () : base (new CCColor4B(20, 20, 20))
+ {
+ // Load and instantate your assets here
+
+ // Make any renderable node objects (e.g. sprites) children of this layer
+ }
+
+ protected override void AddedToScene ()
+ {
+ base.AddedToScene ();
+
+ // Use the bounds to layout the positioning of our drawable assets
+ CCRect bounds = VisibleBoundsWorldspace;
+
+ // Register for touch events
+ var touchListener = new CCEventListenerTouchAllAtOnce ();
+ touchListener.OnTouchesEnded = OnTouchesEnded;
+ AddEventListener (touchListener, this);
+
+
+ CreateMusicLabel();
+ CreateMusicPlayButton();
+
+ CreateSfxLabel();
+ CreateSfxPlayButton();
+
+ CreateMusicVolumeControls();
+ CreateSfxVolumeControls();
+
+ }
+ private void CreateMusicLabel()
+ {
+ musicLabel = new CCLabel("Music", "Arial", 24, CCLabelFormat.SystemFont);
+ musicLabel.PositionX = 80;
+ musicLabel.PositionY = this.ContentSize.Height - 40;
+
+ this.AddChild(musicLabel);
+ }
+
+ private void CreateMusicPlayButton()
+ {
+ musicPlayButton = new CCDrawNode();
+
+ MakePlayGraphic(musicPlayButton);
+
+ musicPlayButton.PositionX = musicLabel.PositionX + musicLabel.BoundingBox.Size.Width;
+ musicPlayButton.PositionY = musicLabel.PositionY - 18;
+
+ this.AddChild(musicPlayButton);
+ }
+
+ private void CreateSfxLabel()
+ {
+ sfxLabel = new CCLabel("Sound", "Arial", 24, CCLabelFormat.SystemFont);
+ sfxLabel.PositionX = 500;
+ sfxLabel.PositionY = this.ContentSize.Height - 40;
+
+ this.AddChild(sfxLabel);
+ }
+
+
+ private void CreateSfxPlayButton()
+ {
+ sfxPlayButton = new CCDrawNode();
+
+ MakePlayGraphic(sfxPlayButton);
+
+ sfxPlayButton.PositionX = sfxLabel.PositionX + sfxLabel.BoundingBox.Size.Width;
+ sfxPlayButton.PositionY = sfxLabel.PositionY - 18;
+
+ this.AddChild(sfxPlayButton);
+ }
+
+
+ private void CreateMusicVolumeControls()
+ {
+ const float x = 100;
+
+ float y = this.ContentSize.Height - 120;
+
+ musicVolumeUp = new CCDrawNode();
+ MakeUpArrowGraphic(musicVolumeUp);
+ musicVolumeUp.PositionX = x;
+ musicVolumeUp.PositionY = y;
+ this.AddChild(musicVolumeUp);
+
+ y -= 30;
+
+ musicVolumeLabel = new CCLabel("", "Arial", 24, CCLabelFormat.SystemFont);
+ musicVolumeLabel.HorizontalAlignment = CCTextAlignment.Center;
+ musicVolumeLabel.PositionX = x;
+ musicVolumeLabel.PositionY = y;
+ UpdateMusicVolumeDisplay();
+ this.AddChild(musicVolumeLabel);
+
+ y -= 60;
+
+ musicVolumeDown = new CCDrawNode();
+ MakeDownArrowGraphic(musicVolumeDown);
+ musicVolumeDown.PositionX = x;
+ musicVolumeDown.PositionY = y;
+ this.AddChild(musicVolumeDown);
+
+ }
+
+ private void CreateSfxVolumeControls()
+ {
+ const float x = 500;
+
+ float y = this.ContentSize.Height - 120;
+
+ sfxVolumeUp = new CCDrawNode();
+ MakeUpArrowGraphic(sfxVolumeUp);
+ sfxVolumeUp.PositionX = x;
+ sfxVolumeUp.PositionY = y;
+ this.AddChild(sfxVolumeUp);
+
+ y -= 30;
+
+ sfxVolumeLabel = new CCLabel("", "Arial", 24, CCLabelFormat.SystemFont);
+ sfxVolumeLabel.HorizontalAlignment = CCTextAlignment.Center;
+ sfxVolumeLabel.PositionX = x;
+ sfxVolumeLabel.PositionY = y;
+ UpdateSfxVolumeDisplay();
+ this.AddChild(sfxVolumeLabel);
+
+ y -= 60;
+
+ sfxVolumeDown = new CCDrawNode();
+ MakeDownArrowGraphic(sfxVolumeDown);
+ sfxVolumeDown.PositionX = x;
+ sfxVolumeDown.PositionY = y;
+ this.AddChild(sfxVolumeDown);
+ }
+
+ private void UpdateSfxVolumeDisplay()
+ {
+ this.sfxVolumeLabel.Text = $"Volume: {CCAudioEngine.SharedEngine.EffectsVolume}";
+ }
+
+ void OnTouchesEnded (List touches, CCEvent touchEvent)
+ {
+ if (touches.Count > 0)
+ {
+ var firstTouch = touches[0];
+
+ if(musicPlayButton.BoundingBoxTransformedToWorld.ContainsPoint(firstTouch.Location))
+ {
+ string fileName = "FruityFalls";
+
+ CCAudioEngine.SharedEngine.PlayBackgroundMusic (
+ fileName, loop:false);
+
+ }
+ else if (sfxPlayButton.BoundingBoxTransformedToWorld.ContainsPoint(firstTouch.Location))
+ {
+ string fileName = "Electricity";
+
+ CCAudioEngine.SharedEngine.PlayEffect (fileName);
+ }
+ else if(musicVolumeUp.BoundingBoxTransformedToWorld.ContainsPoint(firstTouch.Location))
+ {
+ CCAudioEngine.SharedEngine.BackgroundMusicVolume += .25f;
+ UpdateMusicVolumeDisplay();
+ }
+ else if (musicVolumeDown.BoundingBoxTransformedToWorld.ContainsPoint(firstTouch.Location))
+ {
+ CCAudioEngine.SharedEngine.BackgroundMusicVolume -= .25f;
+ UpdateMusicVolumeDisplay();
+ }
+ else if (sfxVolumeUp.BoundingBoxTransformedToWorld.ContainsPoint(firstTouch.Location))
+ {
+ CCAudioEngine.SharedEngine.EffectsVolume += .25f;
+ UpdateSfxVolumeDisplay();
+ }
+ else if (sfxVolumeDown.BoundingBoxTransformedToWorld.ContainsPoint(firstTouch.Location))
+ {
+ CCAudioEngine.SharedEngine.EffectsVolume -= .25f;
+ UpdateSfxVolumeDisplay();
+ }
+ }
+ }
+
+ private void UpdateMusicVolumeDisplay()
+ {
+ this.musicVolumeLabel.Text = $"Volume: {CCAudioEngine.SharedEngine.BackgroundMusicVolume}";
+ }
+
+ public void MakePlayGraphic(CCDrawNode drawNode)
+ {
+ drawNode.Clear();
+
+ const float playButtonHeight = 40;
+ var verts = new CCPoint[]
+ {
+ new CCPoint(0,0),
+ new CCPoint(0, playButtonHeight),
+ new CCPoint(22, playButtonHeight/2.0f)
+ };
+
+ drawNode.DrawPolygon(verts, 3, CCColor4B.Green, 1, CCColor4B.White);
+ }
+
+
+
+ void MakeUpArrowGraphic(CCDrawNode drawNode)
+ {
+ var verts = new CCPoint[]
+ {
+ new CCPoint(0,0),
+ new CCPoint(20, 22),
+ new CCPoint(40, 0)
+ };
+
+ drawNode.DrawPolygon(verts, 3, CCColor4B.Gray, 1, CCColor4B.White);
+
+ }
+
+ void MakeDownArrowGraphic(CCDrawNode drawNode)
+ {
+ var verts = new CCPoint[]
+ {
+ new CCPoint(0,22),
+ new CCPoint(20, 0),
+ new CCPoint(40, 22)
+ };
+
+ drawNode.DrawPolygon(verts, 3, CCColor4B.Gray, 1, CCColor4B.White);
+ }
+ }
+}
diff --git a/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Common/packages.config b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Common/packages.config
new file mode 100644
index 000000000..6379e9b28
--- /dev/null
+++ b/CCAudioEngine/CCAudioEngineSample/CCAudioEngineSample.Common/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/CCAudioEngine/Metadata.xml b/CCAudioEngine/Metadata.xml
new file mode 100644
index 000000000..d95a60459
--- /dev/null
+++ b/CCAudioEngine/Metadata.xml
@@ -0,0 +1,11 @@
+
+
+ a96b00b2-7870-470f-9429-8e3f28f3b527
+ false
+ Intermediate
+ Games
+ Android
+ Indie
+ A project demonstrating the CCAudioEngine class.
+ true
+
diff --git a/CCAudioEngine/README.md b/CCAudioEngine/README.md
new file mode 100644
index 000000000..732443b5b
--- /dev/null
+++ b/CCAudioEngine/README.md
@@ -0,0 +1,10 @@
+CCAudioEngine Example Project
+================
+
+This solution contains an Android CocosSharp project which shows how to work with the CCAudioEngine object. It displays UI for playing music, sound, and adjusting volume.
+
+This demo is built using CocosSharp 1.7.1.
+
+Authors
+-------
+Victor Chelaru
\ No newline at end of file
diff --git a/CCAudioEngine/Screenshots/Screen1.png b/CCAudioEngine/Screenshots/Screen1.png
new file mode 100644
index 000000000..48d63381a
Binary files /dev/null and b/CCAudioEngine/Screenshots/Screen1.png differ
diff --git a/CCDrawNode/CustomRendering.sln b/CCDrawNode/CustomRendering.sln
new file mode 100644
index 000000000..fb8739cec
--- /dev/null
+++ b/CCDrawNode/CustomRendering.sln
@@ -0,0 +1,23 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CustomRendering.Android", "CustomRendering\CustomRendering.Android\CustomRendering.Android.csproj", "{5B451C57-6D3C-4541-94BA-1D6E0182AB3A}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CustomRendering.Common", "CustomRendering\CustomRendering.Common\CustomRendering.Common.csproj", "{A3421C76-5664-47E6-AB2E-CC0D25A19E94}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {5B451C57-6D3C-4541-94BA-1D6E0182AB3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5B451C57-6D3C-4541-94BA-1D6E0182AB3A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5B451C57-6D3C-4541-94BA-1D6E0182AB3A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5B451C57-6D3C-4541-94BA-1D6E0182AB3A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A3421C76-5664-47E6-AB2E-CC0D25A19E94}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A3421C76-5664-47E6-AB2E-CC0D25A19E94}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A3421C76-5664-47E6-AB2E-CC0D25A19E94}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A3421C76-5664-47E6-AB2E-CC0D25A19E94}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+EndGlobal
diff --git a/CCDrawNode/CustomRendering/CustomRendering.Android/Assets/AboutAssets.txt b/CCDrawNode/CustomRendering/CustomRendering.Android/Assets/AboutAssets.txt
new file mode 100644
index 000000000..a9b0638eb
--- /dev/null
+++ b/CCDrawNode/CustomRendering/CustomRendering.Android/Assets/AboutAssets.txt
@@ -0,0 +1,19 @@
+Any raw assets you want to be deployed with your application can be placed in
+this directory (and child directories) and given a Build Action of "AndroidAsset".
+
+These files will be deployed with your package and will be accessible using Android's
+AssetManager, like this:
+
+public class ReadAsset : Activity
+{
+ protected override void OnCreate (Bundle bundle)
+ {
+ base.OnCreate (bundle);
+
+ InputStream input = Assets.Open ("my_asset.txt");
+ }
+}
+
+Additionally, some Android functions will automatically load asset files:
+
+Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf");
diff --git a/CCDrawNode/CustomRendering/CustomRendering.Android/CustomRendering.Android.csproj b/CCDrawNode/CustomRendering/CustomRendering.Android/CustomRendering.Android.csproj
new file mode 100644
index 000000000..a87a2141f
--- /dev/null
+++ b/CCDrawNode/CustomRendering/CustomRendering.Android/CustomRendering.Android.csproj
@@ -0,0 +1,87 @@
+
+
+
+ Debug
+ AnyCPU
+ {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ {5B451C57-6D3C-4541-94BA-1D6E0182AB3A}
+ Library
+ CustomRendering.Android
+ True
+ Resources\Resource.designer.cs
+ Resource
+ Resources
+ Assets
+ False
+ CustomRendering.Android
+ v5.0
+ Properties\AndroidManifest.xml
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ false
+ None
+
+
+ full
+ true
+ bin\Release
+ prompt
+ 4
+ false
+ false
+
+
+
+
+
+
+
+ ..\..\packages\CocosSharp.PCL.Shared.1.5.0.1\lib\MonoAndroid10\box2d.dll
+
+
+ ..\..\packages\CocosSharp.PCL.Shared.1.5.0.1\lib\MonoAndroid10\CocosSharp.dll
+
+
+ ..\..\packages\CocosSharp.PCL.Shared.1.5.0.1\lib\MonoAndroid10\Lidgren.Network.dll
+
+
+ ..\..\packages\CocosSharp.PCL.Shared.1.5.0.1\lib\MonoAndroid10\MonoGame.Framework.dll
+
+
+
+
+ {A3421C76-5664-47E6-AB2E-CC0D25A19E94}
+ CustomRendering.Common
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CCDrawNode/CustomRendering/CustomRendering.Android/MainActivity.cs b/CCDrawNode/CustomRendering/CustomRendering.Android/MainActivity.cs
new file mode 100644
index 000000000..51dd3fa66
--- /dev/null
+++ b/CCDrawNode/CustomRendering/CustomRendering.Android/MainActivity.cs
@@ -0,0 +1,38 @@
+using System;
+using Android.App;
+using Android.Content;
+using Android.Content.PM;
+using Android.OS;
+using Android.Runtime;
+using Android.Views;
+using Microsoft.Xna.Framework;
+
+using CocosSharp;
+
+namespace CustomRendering
+{
+ [Activity (
+ Label = "CustomRendering.Android",
+ AlwaysRetainTaskState = true,
+ Icon = "@drawable/icon",
+ Theme = "@android:style/Theme.NoTitleBar",
+ ScreenOrientation = ScreenOrientation.Landscape | ScreenOrientation.ReverseLandscape,
+ LaunchMode = LaunchMode.SingleInstance,
+ MainLauncher = true,
+ ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.ScreenSize | ConfigChanges.Keyboard | ConfigChanges.KeyboardHidden)
+ ]
+ public class MainActivity : AndroidGameActivity
+ {
+ protected override void OnCreate (Bundle bundle)
+ {
+ base.OnCreate (bundle);
+
+ var application = new CCApplication ();
+ application.ApplicationDelegate = new GameAppDelegate ();
+ SetContentView (application.AndroidContentView);
+ application.StartGame ();
+ }
+ }
+}
+
+
diff --git a/CCDrawNode/CustomRendering/CustomRendering.Android/Properties/AndroidManifest.xml b/CCDrawNode/CustomRendering/CustomRendering.Android/Properties/AndroidManifest.xml
new file mode 100644
index 000000000..cf6b6de32
--- /dev/null
+++ b/CCDrawNode/CustomRendering/CustomRendering.Android/Properties/AndroidManifest.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/CCDrawNode/CustomRendering/CustomRendering.Android/Properties/AssemblyInfo.cs b/CCDrawNode/CustomRendering/CustomRendering.Android/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..7ee1ae449
--- /dev/null
+++ b/CCDrawNode/CustomRendering/CustomRendering.Android/Properties/AssemblyInfo.cs
@@ -0,0 +1,28 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using Android.App;
+
+// Information about this assembly is defined by the following attributes.
+// Change them to the values specific to your project.
+
+[assembly: AssemblyTitle ("CustomRendering.Android")]
+[assembly: AssemblyDescription ("")]
+[assembly: AssemblyConfiguration ("")]
+[assembly: AssemblyCompany ("")]
+[assembly: AssemblyProduct ("")]
+[assembly: AssemblyCopyright ("Victor")]
+[assembly: AssemblyTrademark ("")]
+[assembly: AssemblyCulture ("")]
+
+// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
+// The form "{Major}.{Minor}.*" will automatically update the build and revision,
+// and "{Major}.{Minor}.{Build}.*" will update just the revision.
+
+[assembly: AssemblyVersion ("1.0.0")]
+
+// The following attributes are used to specify the signing key for the assembly,
+// if desired. See the Mono documentation for more information about signing.
+
+//[assembly: AssemblyDelaySign(false)]
+//[assembly: AssemblyKeyFile("")]
+
diff --git a/SoMA/iOS/Components/xamarin.mobile-0.6.2.1/samples/Xamarin.Mobile.Android.Samples/GeolocationSample/Resources/AboutResources.txt b/CCDrawNode/CustomRendering/CustomRendering.Android/Resources/AboutResources.txt
similarity index 100%
rename from SoMA/iOS/Components/xamarin.mobile-0.6.2.1/samples/Xamarin.Mobile.Android.Samples/GeolocationSample/Resources/AboutResources.txt
rename to CCDrawNode/CustomRendering/CustomRendering.Android/Resources/AboutResources.txt
diff --git a/CCDrawNode/CustomRendering/CustomRendering.Android/Resources/Resource.designer.cs b/CCDrawNode/CustomRendering/CustomRendering.Android/Resources/Resource.designer.cs
new file mode 100644
index 000000000..65b9ae6ae
--- /dev/null
+++ b/CCDrawNode/CustomRendering/CustomRendering.Android/Resources/Resource.designer.cs
@@ -0,0 +1,77 @@
+#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("CustomRendering.Android.Resource", IsApplication=true)]
+
+namespace CustomRendering.Android
+{
+
+
+ [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;
+
+ static Drawable()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Drawable()
+ {
+ }
+ }
+
+ public partial class String
+ {
+
+ // aapt resource value: 0x7f030000
+ public const int app_name = 2130903040;
+
+ static String()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private String()
+ {
+ }
+ }
+ }
+}
+#pragma warning restore 1591
diff --git a/Camera/Components/xamarin.mobile-0.7.4/samples/Xamarin.Mobile.Android.Samples/GeolocationSample/Resources/drawable/Icon.png b/CCDrawNode/CustomRendering/CustomRendering.Android/Resources/drawable/Icon.png
similarity index 100%
rename from Camera/Components/xamarin.mobile-0.7.4/samples/Xamarin.Mobile.Android.Samples/GeolocationSample/Resources/drawable/Icon.png
rename to CCDrawNode/CustomRendering/CustomRendering.Android/Resources/drawable/Icon.png
diff --git a/CCDrawNode/CustomRendering/CustomRendering.Android/Resources/values/Strings.xml b/CCDrawNode/CustomRendering/CustomRendering.Android/Resources/values/Strings.xml
new file mode 100644
index 000000000..601066c84
--- /dev/null
+++ b/CCDrawNode/CustomRendering/CustomRendering.Android/Resources/values/Strings.xml
@@ -0,0 +1,4 @@
+
+
+ CustomRendering.Android
+
diff --git a/CCDrawNode/CustomRendering/CustomRendering.Android/packages.config b/CCDrawNode/CustomRendering/CustomRendering.Android/packages.config
new file mode 100644
index 000000000..dd8f57bbb
--- /dev/null
+++ b/CCDrawNode/CustomRendering/CustomRendering.Android/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/CCDrawNode/CustomRendering/CustomRendering.Common/CustomRendering.Common.csproj b/CCDrawNode/CustomRendering/CustomRendering.Common/CustomRendering.Common.csproj
new file mode 100644
index 000000000..b45cb8d2c
--- /dev/null
+++ b/CCDrawNode/CustomRendering/CustomRendering.Common/CustomRendering.Common.csproj
@@ -0,0 +1,51 @@
+
+
+
+ Debug
+ AnyCPU
+ {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ {A3421C76-5664-47E6-AB2E-CC0D25A19E94}
+ Library
+ CustomRendering.Common
+ CustomRendering.Common
+ v4.5
+ Profile78
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ false
+
+
+ full
+ true
+ bin\Release
+ prompt
+ 4
+ false
+
+
+
+
+
+
+
+
+ ..\..\packages\CocosSharp.PCL.Shared.1.5.0.1\lib\portable-net45+win+wpa81+wp80\box2d.dll
+
+
+ ..\..\packages\CocosSharp.PCL.Shared.1.5.0.1\lib\portable-net45+win+wpa81+wp80\CocosSharp.dll
+
+
+ ..\..\packages\CocosSharp.PCL.Shared.1.5.0.1\lib\portable-net45+win+wpa81+wp80\MonoGame.Framework.dll
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CCDrawNode/CustomRendering/CustomRendering.Common/GameAppDelegate.cs b/CCDrawNode/CustomRendering/CustomRendering.Common/GameAppDelegate.cs
new file mode 100644
index 000000000..d1a21ff3e
--- /dev/null
+++ b/CCDrawNode/CustomRendering/CustomRendering.Common/GameAppDelegate.cs
@@ -0,0 +1,58 @@
+using System;
+using CocosSharp;
+
+
+namespace CustomRendering
+{
+ public class GameAppDelegate : CCApplicationDelegate
+ {
+ public override void ApplicationDidFinishLaunching (CCApplication application, CCWindow mainWindow)
+ {
+ application.PreferMultiSampling = false;
+ application.ContentRootDirectory = "Content";
+ application.ContentSearchPaths.Add ("animations");
+ application.ContentSearchPaths.Add ("fonts");
+ application.ContentSearchPaths.Add ("sounds");
+
+ CCSize windowSize = mainWindow.WindowSizeInPixels;
+
+ float desiredWidth = 1024.0f;
+ float desiredHeight = 768.0f;
+
+ // This will set the world bounds to be (0,0, w, h)
+ // CCSceneResolutionPolicy.ShowAll will ensure that the aspect ratio is preserved
+ CCScene.SetDefaultDesignResolution (desiredWidth, desiredHeight, CCSceneResolutionPolicy.ShowAll);
+
+ // Determine whether to use the high or low def versions of our images
+ // Make sure the default texel to content size ratio is set correctly
+ // Of course you're free to have a finer set of image resolutions e.g (ld, hd, super-hd)
+ if (desiredWidth < windowSize.Width)
+ {
+ application.ContentSearchPaths.Add ("images/hd");
+ CCSprite.DefaultTexelToContentSizeRatio = 2.0f;
+ }
+ else
+ {
+ application.ContentSearchPaths.Add ("images/ld");
+ CCSprite.DefaultTexelToContentSizeRatio = 1.0f;
+ }
+
+ CCScene scene = new CCScene (mainWindow);
+ GameLayer gameLayer = new GameLayer ();
+
+ scene.AddChild (gameLayer);
+
+ mainWindow.RunWithScene (scene);
+ }
+
+ public override void ApplicationDidEnterBackground (CCApplication application)
+ {
+ application.Paused = true;
+ }
+
+ public override void ApplicationWillEnterForeground (CCApplication application)
+ {
+ application.Paused = false;
+ }
+ }
+}
diff --git a/CCDrawNode/CustomRendering/CustomRendering.Common/GameLayer.cs b/CCDrawNode/CustomRendering/CustomRendering.Common/GameLayer.cs
new file mode 100644
index 000000000..50cf390d2
--- /dev/null
+++ b/CCDrawNode/CustomRendering/CustomRendering.Common/GameLayer.cs
@@ -0,0 +1,220 @@
+using System;
+using System.Collections.Generic;
+using CocosSharp;
+
+namespace CustomRendering
+{
+ public class GameLayer : CCLayer
+ {
+ CCDrawNode drawNode;
+
+ public GameLayer ()
+ {
+ drawNode = new CCDrawNode ();
+ this.AddChild (drawNode);
+
+ drawNode.PositionX = 100;
+ drawNode.PositionY = 100;
+
+ // Uncomment one of the following to see
+ // an example of a given Draw call:
+
+ CardinalSpline ();
+
+// CatmullRom ();
+
+// Circle ();
+
+// CubicBezier ();
+
+// Ellipse ();
+
+// Line ();
+
+// LineList ();
+
+// Polygon ();
+
+// QuadBezier ();
+
+// Rect ();
+
+// Segment ();
+
+// SolidArc ();
+
+// SolidCircle ();
+
+// TriangleList ();
+ }
+
+
+
+
+ void CardinalSpline ()
+ {
+ var splinePoints = new List ();
+ splinePoints.Add (new CCPoint (0, 0));
+ splinePoints.Add (new CCPoint (50, 70));
+ splinePoints.Add (new CCPoint (0, 140));
+ splinePoints.Add (new CCPoint (100, 210));
+ drawNode.DrawCardinalSpline (
+ config: splinePoints,
+ tension: 0,
+ segments: 64,
+ color: CCColor4B.Red);
+ }
+
+ void CatmullRom ()
+ {
+ var splinePoints = new List ();
+ splinePoints.Add (new CCPoint (0, 0));
+ splinePoints.Add (new CCPoint (80, 90));
+ splinePoints.Add (new CCPoint (100, 0));
+ splinePoints.Add (new CCPoint (0, 130));
+
+ drawNode.DrawCatmullRom (
+ points: splinePoints,
+ segments: 64,
+ color: CCColor4B.Green);
+
+ }
+
+ void Circle ()
+ {
+ drawNode.DrawCircle (
+ center: new CCPoint (0, 0),
+ radius: 20,
+ color: CCColor4B.Yellow);
+ }
+
+ void CubicBezier ()
+ {
+// fantastic vid:
+// https://vimeo.com/106757336
+ drawNode.DrawCubicBezier (
+ origin: new CCPoint (0, 0),
+ control1: new CCPoint (50, 150),
+ control2: new CCPoint (250, 150),
+ destination: new CCPoint (170, 0),
+ segments: 64,
+ lineWidth: 1,
+ color: CCColor4B.Green);
+ }
+
+ void Ellipse ()
+ {
+ drawNode.DrawEllipse (
+ rect: new CCRect (0, 0, 130, 90),
+ lineWidth: 2,
+ color: CCColor4B.Gray);
+ }
+
+ void Line ()
+ {
+ drawNode.DrawLine (
+ from: new CCPoint (0, 0),
+ to: new CCPoint (150, 30),
+ lineWidth: 5,
+ color: CCColor4B.Orange);
+ }
+
+ void LineList ()
+ {
+ CCV3F_C4B[] verts = new CCV3F_C4B[] {
+ // First line:
+ new CCV3F_C4B (new CCPoint (0, 0), CCColor4B.White),
+ new CCV3F_C4B (new CCPoint (30, 60), CCColor4B.White),
+ // second line, will blend from white to red:
+ new CCV3F_C4B (new CCPoint (60, 0), CCColor4B.White),
+ new CCV3F_C4B (new CCPoint (120, 120), CCColor4B.Red)
+ };
+
+ drawNode.DrawLineList (verts);
+ }
+
+ void Polygon ()
+ {
+ CCPoint[] verts = new CCPoint[] {
+ new CCPoint (0, 0),
+ new CCPoint (0, 100),
+ new CCPoint (50, 150),
+ new CCPoint (100, 100),
+ new CCPoint (100, 0)
+ };
+
+ drawNode.DrawPolygon (verts,
+ count: verts.Length,
+ fillColor: CCColor4B.White,
+ borderWidth: 5,
+ borderColor: CCColor4B.Red,
+ closePolygon: true);
+
+ }
+
+ void QuadBezier ()
+ {
+ drawNode.DrawQuadBezier (
+ origin: new CCPoint (0, 0),
+ control: new CCPoint (200, 0),
+ destination: new CCPoint (0, 300),
+ segments: 64,
+ lineWidth: 1,
+ color: CCColor4B.White);
+ }
+
+ void Rect ()
+ {
+ var shape = new CCRect (
+ 0, 0, 100, 200);
+ drawNode.DrawRect (shape,
+ fillColor: CCColor4B.Blue,
+ borderWidth: 4,
+ borderColor: CCColor4B.White);
+ }
+
+ void Segment ()
+ {
+ drawNode.DrawSegment (from: new CCPoint (0, 0),
+ to: new CCPoint (100, 200),
+ radius: 5,
+ color: new CCColor4F (1, 1, 1, 1));
+ }
+
+ void SolidArc ()
+ {
+ drawNode.DrawSolidArc (
+ pos: new CCPoint (100, 100),
+ radius: 200,
+ startAngle: 0,
+ sweepAngle: CCMathHelper.Pi / 2, // this is in radians, clockwise
+ color: CCColor4B.White);
+ }
+
+ void SolidCircle ()
+ {
+ drawNode.DrawSolidCircle (
+ pos: new CCPoint (100, 100),
+ radius: 50,
+ color: CCColor4B.Yellow);
+ }
+
+ void TriangleList ()
+ {
+ CCV3F_C4B[] verts = new CCV3F_C4B[] {
+ // First triangle:
+ new CCV3F_C4B (new CCPoint (0, 0), CCColor4B.White),
+ new CCV3F_C4B (new CCPoint (30, 60), CCColor4B.White),
+ new CCV3F_C4B (new CCPoint (60, 0), CCColor4B.White),
+ // second triangle, each point has different colors:
+ new CCV3F_C4B (new CCPoint (90, 0), CCColor4B.Yellow),
+ new CCV3F_C4B (new CCPoint (120, 60), CCColor4B.Red),
+ new CCV3F_C4B (new CCPoint (150, 0), CCColor4B.Blue)
+ };
+
+ drawNode.DrawTriangleList (verts);
+
+ }
+
+ }
+}
diff --git a/CCDrawNode/CustomRendering/CustomRendering.Common/packages.config b/CCDrawNode/CustomRendering/CustomRendering.Common/packages.config
new file mode 100644
index 000000000..261e4ab11
--- /dev/null
+++ b/CCDrawNode/CustomRendering/CustomRendering.Common/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/CCDrawNode/Metadata.xml b/CCDrawNode/Metadata.xml
new file mode 100644
index 000000000..d699cc129
--- /dev/null
+++ b/CCDrawNode/Metadata.xml
@@ -0,0 +1,11 @@
+
+
+ d27a4f19-7a94-497e-8e26-deeb1ec37e7e
+ false
+ Intermediate
+ Games
+ Android
+ Indie
+ A simple project showing all draw methods in CCDrawNode.
+ true
+
diff --git a/CCDrawNode/README.md b/CCDrawNode/README.md
new file mode 100644
index 000000000..61a255e41
--- /dev/null
+++ b/CCDrawNode/README.md
@@ -0,0 +1,12 @@
+CCDrawNode Gallery
+================
+
+This solution contains an iOS and Android CocosSharp project which shows how to work with the CCDrawNode object. It includes one method for each draw function in the CCDrawNode class.
+
+To see each draw function, open the project and navigate to the constructor in GameLayer.cs. Once there, uncomment one of the methods and run the app. The given object will be drawn to the screen.
+
+This demo is built against CocosSharp 1.5.0.1.
+
+Authors
+-------
+Victor Chelaru
\ No newline at end of file
diff --git a/CCDrawNode/Screenshots/CardinalSpline.PNG b/CCDrawNode/Screenshots/CardinalSpline.PNG
new file mode 100644
index 000000000..5f033c315
Binary files /dev/null and b/CCDrawNode/Screenshots/CardinalSpline.PNG differ
diff --git a/CCDrawNode/Screenshots/Polygon.PNG b/CCDrawNode/Screenshots/Polygon.PNG
new file mode 100644
index 000000000..51deb7aa7
Binary files /dev/null and b/CCDrawNode/Screenshots/Polygon.PNG differ
diff --git a/CCDrawNode/Screenshots/Rect.PNG b/CCDrawNode/Screenshots/Rect.PNG
new file mode 100644
index 000000000..4101b14e1
Binary files /dev/null and b/CCDrawNode/Screenshots/Rect.PNG differ
diff --git a/CCDrawNode/Screenshots/SolidArc.PNG b/CCDrawNode/Screenshots/SolidArc.PNG
new file mode 100644
index 000000000..030e2309b
Binary files /dev/null and b/CCDrawNode/Screenshots/SolidArc.PNG differ
diff --git a/CCDrawNode/Screenshots/TriangleList.PNG b/CCDrawNode/Screenshots/TriangleList.PNG
new file mode 100644
index 000000000..6ebece4e6
Binary files /dev/null and b/CCDrawNode/Screenshots/TriangleList.PNG differ
diff --git a/CCRenderTexture/Metadata.xml b/CCRenderTexture/Metadata.xml
new file mode 100644
index 000000000..f7664a6bd
--- /dev/null
+++ b/CCRenderTexture/Metadata.xml
@@ -0,0 +1,11 @@
+
+
+ b2e9d707-abe4-4a47-85ca-9e4c098edc56
+ false
+ Intermediate
+ Games
+ Android, iOS
+ Indie
+ A project showing the performance and visual benefits provided by CCRenderTexture.
+ true
+
diff --git a/CCRenderTexture/README.md b/CCRenderTexture/README.md
new file mode 100644
index 000000000..dcb867ed8
--- /dev/null
+++ b/CCRenderTexture/README.md
@@ -0,0 +1,12 @@
+CCRenderTexture Example Project
+================
+
+This solution contains an iOS and Android CocosSharp project which shows how to work with the CCRenderTexture object. This app highlights the performance benefits of using CCRenderTexture in certain situations. It also shows how CCRenderTexture can be used to apply transparency to an entire entity.
+
+The `useRenderTarget` and `opacity` variables can be modified to see the impact of CCRenderTexture.
+
+This demo is built using CocosSharp 1.7.1.
+
+Authors
+-------
+Victor Chelaru
\ No newline at end of file
diff --git a/CCRenderTexture/RenderTextureExample.sln b/CCRenderTexture/RenderTextureExample.sln
new file mode 100644
index 000000000..1f5f0c251
--- /dev/null
+++ b/CCRenderTexture/RenderTextureExample.sln
@@ -0,0 +1,63 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 14
+VisualStudioVersion = 14.0.24720.0
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RenderTextureExample.iOS", "RenderTextureExample\RenderTextureExample.iOS\RenderTextureExample.iOS.csproj", "{D557E8E0-062B-4FE2-8B45-E22024ECBB41}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RenderTextureExample.Android", "RenderTextureExample\RenderTextureExample.Android\RenderTextureExample.Android.csproj", "{E69DEE00-D6D6-49E8-81AF-672B398937A9}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RenderTextureExample.Common", "RenderTextureExample\RenderTextureExample.Common\RenderTextureExample.Common.csproj", "{1715905D-1CF2-4A76-9DB6-F2740D5D5EBC}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Debug|iPhone = Debug|iPhone
+ Debug|iPhoneSimulator = Debug|iPhoneSimulator
+ Release|Any CPU = Release|Any CPU
+ Release|iPhone = Release|iPhone
+ Release|iPhoneSimulator = Release|iPhoneSimulator
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {D557E8E0-062B-4FE2-8B45-E22024ECBB41}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator
+ {D557E8E0-062B-4FE2-8B45-E22024ECBB41}.Debug|Any CPU.Build.0 = Debug|iPhoneSimulator
+ {D557E8E0-062B-4FE2-8B45-E22024ECBB41}.Debug|iPhone.ActiveCfg = Debug|iPhone
+ {D557E8E0-062B-4FE2-8B45-E22024ECBB41}.Debug|iPhone.Build.0 = Debug|iPhone
+ {D557E8E0-062B-4FE2-8B45-E22024ECBB41}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
+ {D557E8E0-062B-4FE2-8B45-E22024ECBB41}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
+ {D557E8E0-062B-4FE2-8B45-E22024ECBB41}.Release|Any CPU.ActiveCfg = Release|iPhone
+ {D557E8E0-062B-4FE2-8B45-E22024ECBB41}.Release|Any CPU.Build.0 = Release|iPhone
+ {D557E8E0-062B-4FE2-8B45-E22024ECBB41}.Release|iPhone.ActiveCfg = Release|iPhone
+ {D557E8E0-062B-4FE2-8B45-E22024ECBB41}.Release|iPhone.Build.0 = Release|iPhone
+ {D557E8E0-062B-4FE2-8B45-E22024ECBB41}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
+ {D557E8E0-062B-4FE2-8B45-E22024ECBB41}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
+ {E69DEE00-D6D6-49E8-81AF-672B398937A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E69DEE00-D6D6-49E8-81AF-672B398937A9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E69DEE00-D6D6-49E8-81AF-672B398937A9}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {E69DEE00-D6D6-49E8-81AF-672B398937A9}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {E69DEE00-D6D6-49E8-81AF-672B398937A9}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {E69DEE00-D6D6-49E8-81AF-672B398937A9}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {E69DEE00-D6D6-49E8-81AF-672B398937A9}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {E69DEE00-D6D6-49E8-81AF-672B398937A9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E69DEE00-D6D6-49E8-81AF-672B398937A9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E69DEE00-D6D6-49E8-81AF-672B398937A9}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {E69DEE00-D6D6-49E8-81AF-672B398937A9}.Release|iPhone.Build.0 = Release|Any CPU
+ {E69DEE00-D6D6-49E8-81AF-672B398937A9}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {E69DEE00-D6D6-49E8-81AF-672B398937A9}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {1715905D-1CF2-4A76-9DB6-F2740D5D5EBC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1715905D-1CF2-4A76-9DB6-F2740D5D5EBC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1715905D-1CF2-4A76-9DB6-F2740D5D5EBC}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {1715905D-1CF2-4A76-9DB6-F2740D5D5EBC}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {1715905D-1CF2-4A76-9DB6-F2740D5D5EBC}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {1715905D-1CF2-4A76-9DB6-F2740D5D5EBC}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {1715905D-1CF2-4A76-9DB6-F2740D5D5EBC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1715905D-1CF2-4A76-9DB6-F2740D5D5EBC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1715905D-1CF2-4A76-9DB6-F2740D5D5EBC}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {1715905D-1CF2-4A76-9DB6-F2740D5D5EBC}.Release|iPhone.Build.0 = Release|Any CPU
+ {1715905D-1CF2-4A76-9DB6-F2740D5D5EBC}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {1715905D-1CF2-4A76-9DB6-F2740D5D5EBC}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Assets/AboutAssets.txt b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Assets/AboutAssets.txt
new file mode 100644
index 000000000..a9b0638eb
--- /dev/null
+++ b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Assets/AboutAssets.txt
@@ -0,0 +1,19 @@
+Any raw assets you want to be deployed with your application can be placed in
+this directory (and child directories) and given a Build Action of "AndroidAsset".
+
+These files will be deployed with your package and will be accessible using Android's
+AssetManager, like this:
+
+public class ReadAsset : Activity
+{
+ protected override void OnCreate (Bundle bundle)
+ {
+ base.OnCreate (bundle);
+
+ InputStream input = Assets.Open ("my_asset.txt");
+ }
+}
+
+Additionally, some Android functions will automatically load asset files:
+
+Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf");
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Assets/Content/Images/BlueGuy.png b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Assets/Content/Images/BlueGuy.png
new file mode 100644
index 000000000..dfdee6a45
Binary files /dev/null and b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Assets/Content/Images/BlueGuy.png differ
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Assets/Content/Images/BlueIcon.png b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Assets/Content/Images/BlueIcon.png
new file mode 100644
index 000000000..29a6d97a8
Binary files /dev/null and b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Assets/Content/Images/BlueIcon.png differ
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Assets/Content/Images/CardBackground.png b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Assets/Content/Images/CardBackground.png
new file mode 100644
index 000000000..13b586cf4
Binary files /dev/null and b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Assets/Content/Images/CardBackground.png differ
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Assets/Content/Images/GreenGuy.png b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Assets/Content/Images/GreenGuy.png
new file mode 100644
index 000000000..de6457a6d
Binary files /dev/null and b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Assets/Content/Images/GreenGuy.png differ
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Assets/Content/Images/GreenIcon.png b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Assets/Content/Images/GreenIcon.png
new file mode 100644
index 000000000..28c95255b
Binary files /dev/null and b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Assets/Content/Images/GreenIcon.png differ
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Assets/Content/Images/OrangeGuy.png b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Assets/Content/Images/OrangeGuy.png
new file mode 100644
index 000000000..56265547d
Binary files /dev/null and b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Assets/Content/Images/OrangeGuy.png differ
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Assets/Content/Images/OrangeIcon.png b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Assets/Content/Images/OrangeIcon.png
new file mode 100644
index 000000000..2cffe5691
Binary files /dev/null and b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Assets/Content/Images/OrangeIcon.png differ
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Assets/Content/Images/Thumbs.db b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Assets/Content/Images/Thumbs.db
new file mode 100644
index 000000000..8c8e5e9a0
Binary files /dev/null and b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Assets/Content/Images/Thumbs.db differ
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/MainActivity.cs b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/MainActivity.cs
new file mode 100644
index 000000000..d73439a96
--- /dev/null
+++ b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/MainActivity.cs
@@ -0,0 +1,59 @@
+using System;
+using System.Collections.Generic;
+
+using Android.App;
+using Android.Content;
+using Android.Content.PM;
+using Android.Runtime;
+using Android.Views;
+using Android.Widget;
+using Android.OS;
+
+using CocosSharp;
+
+namespace RenderTextureExample.Android
+{
+ [Activity (Label = "RenderTextureExample.Android", MainLauncher = true, Icon = "@drawable/icon",
+ AlwaysRetainTaskState = true,
+ LaunchMode = LaunchMode.SingleInstance,
+ ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.ScreenSize | ConfigChanges.Keyboard | ConfigChanges.KeyboardHidden)]
+ public class MainActivity : Activity
+ {
+ protected override void OnCreate (Bundle bundle)
+ {
+ base.OnCreate (bundle);
+
+ // Set our view from the "main" layout resource
+ SetContentView (Resource.Layout.Main);
+
+ // Get our game view from the layout resource,
+ // and attach the view created event to it
+ CCGameView gameView = (CCGameView)FindViewById (Resource.Id.GameView);
+ gameView.ViewCreated += LoadGame;
+ }
+
+ void LoadGame (object sender, EventArgs e)
+ {
+ CCGameView gameView = sender as CCGameView;
+
+ if (gameView != null)
+ {
+ var contentSearchPaths = new List() { "Fonts", "Sounds", "Images" };
+
+ int width = 512;
+ int height = 384;
+
+ // Set world dimensions
+ gameView.DesignResolution = new CCSizeI(width, height);
+
+ gameView.ContentManager.SearchPaths = contentSearchPaths;
+
+ CCScene gameScene = new CCScene(gameView);
+ gameScene.AddLayer(new GameLayer());
+ gameView.RunWithScene(gameScene);
+ }
+ }
+ }
+}
+
+
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Properties/AndroidManifest.xml b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Properties/AndroidManifest.xml
new file mode 100644
index 000000000..fc01f352a
--- /dev/null
+++ b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Properties/AndroidManifest.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Properties/AssemblyInfo.cs b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..b1edce8b6
--- /dev/null
+++ b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Properties/AssemblyInfo.cs
@@ -0,0 +1,28 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using Android.App;
+
+// Information about this assembly is defined by the following attributes.
+// Change them to the values specific to your project.
+
+[assembly: AssemblyTitle ("RenderTextureExample.Android")]
+[assembly: AssemblyDescription ("")]
+[assembly: AssemblyConfiguration ("")]
+[assembly: AssemblyCompany ("")]
+[assembly: AssemblyProduct ("")]
+[assembly: AssemblyCopyright ("vchelaru")]
+[assembly: AssemblyTrademark ("")]
+[assembly: AssemblyCulture ("")]
+
+// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
+// The form "{Major}.{Minor}.*" will automatically update the build and revision,
+// and "{Major}.{Minor}.{Build}.*" will update just the revision.
+
+[assembly: AssemblyVersion ("1.0.0")]
+
+// The following attributes are used to specify the signing key for the assembly,
+// if desired. See the Mono documentation for more information about signing.
+
+//[assembly: AssemblyDelaySign(false)]
+//[assembly: AssemblyKeyFile("")]
+
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/RenderTextureExample.Android.csproj b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/RenderTextureExample.Android.csproj
new file mode 100644
index 000000000..803feb641
--- /dev/null
+++ b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/RenderTextureExample.Android.csproj
@@ -0,0 +1,110 @@
+
+
+
+ Debug
+ AnyCPU
+ {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ {E69DEE00-D6D6-49E8-81AF-672B398937A9}
+ Library
+ RenderTextureExample.Android
+ Assets
+ Resources
+ Resource
+ Resources\Resource.designer.cs
+ True
+ True
+ RenderTextureExample.Android
+ v6.0
+ Properties\AndroidManifest.xml
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ None
+ false
+
+
+ full
+ true
+ bin\Release
+ prompt
+ 4
+ false
+ false
+
+
+
+
+
+
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\MonoAndroid10\CocosSharp.dll
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\MonoAndroid10\Lidgren.Network.dll
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\MonoAndroid10\MonoGame.Framework.dll
+
+
+
+
+ {1715905D-1CF2-4A76-9DB6-F2740D5D5EBC}
+ RenderTextureExample.Common
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/RenderTextureExample.Android.csproj.bak b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/RenderTextureExample.Android.csproj.bak
new file mode 100644
index 000000000..cebaedd08
--- /dev/null
+++ b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/RenderTextureExample.Android.csproj.bak
@@ -0,0 +1,89 @@
+
+
+
+ Debug
+ AnyCPU
+ {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ {E69DEE00-D6D6-49E8-81AF-672B398937A9}
+ Library
+ RenderTextureExample.Android
+ Assets
+ Resources
+ Resource
+ Resources\Resource.designer.cs
+ True
+ True
+ RenderTextureExample.Android
+ v5.0
+ Properties\AndroidManifest.xml
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ None
+ false
+
+
+ full
+ true
+ bin\Release
+ prompt
+ 4
+ false
+ false
+
+
+
+
+
+
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\MonoAndroid10\CocosSharp.dll
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\MonoAndroid10\Lidgren.Network.dll
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\MonoAndroid10\MonoGame.Framework.dll
+
+
+
+
+ {1715905D-1CF2-4A76-9DB6-F2740D5D5EBC}
+ RenderTextureExample.Common
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Tasky/Components/xamarin.mobile-0.7.4/samples/Xamarin.Mobile.Android.Samples/GeolocationSample/Resources/AboutResources.txt b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Resources/AboutResources.txt
similarity index 100%
rename from Tasky/Components/xamarin.mobile-0.7.4/samples/Xamarin.Mobile.Android.Samples/GeolocationSample/Resources/AboutResources.txt
rename to CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Resources/AboutResources.txt
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Resources/drawable-hdpi/Icon.png b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Resources/drawable-hdpi/Icon.png
new file mode 100644
index 000000000..f4c804644
Binary files /dev/null and b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Resources/drawable-hdpi/Icon.png differ
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Resources/drawable-mdpi/Icon.png b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Resources/drawable-mdpi/Icon.png
new file mode 100644
index 000000000..ef1e1ee7d
Binary files /dev/null and b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Resources/drawable-mdpi/Icon.png differ
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Resources/drawable-xhdpi/Icon.png b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Resources/drawable-xhdpi/Icon.png
new file mode 100644
index 000000000..b7e2e57aa
Binary files /dev/null and b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Resources/drawable-xhdpi/Icon.png differ
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Resources/drawable-xxhdpi/Icon.png b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Resources/drawable-xxhdpi/Icon.png
new file mode 100644
index 000000000..8d20a38d1
Binary files /dev/null and b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Resources/drawable-xxhdpi/Icon.png differ
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Resources/drawable-xxxhdpi/Icon.png b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Resources/drawable-xxxhdpi/Icon.png
new file mode 100644
index 000000000..6d9919c41
Binary files /dev/null and b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Resources/drawable-xxxhdpi/Icon.png differ
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Resources/layout/Main.axml b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Resources/layout/Main.axml
new file mode 100644
index 000000000..77959ac22
--- /dev/null
+++ b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Resources/layout/Main.axml
@@ -0,0 +1,11 @@
+
+
+
+
+
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Resources/values/Strings.xml b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Resources/values/Strings.xml
new file mode 100644
index 000000000..b5dc13fd7
--- /dev/null
+++ b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/Resources/values/Strings.xml
@@ -0,0 +1,4 @@
+
+
+ RenderTextureExample.Android
+
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/packages.config b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/packages.config
new file mode 100644
index 000000000..4edced82f
--- /dev/null
+++ b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Android/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.Common/Card.cs b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Common/Card.cs
new file mode 100644
index 000000000..d2f7db239
--- /dev/null
+++ b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Common/Card.cs
@@ -0,0 +1,315 @@
+using CocosSharp;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace RenderTextureExample
+{
+ class Card : CCNode
+ {
+ bool usesRenderTexture;
+
+ List visualComponents = new List();
+
+ CCSprite background;
+ CCSprite colorIcon;
+ CCSprite monsterSprite;
+ CCLabel monsterNameDisplay;
+ CCLabel hpDisplay;
+ CCLabel descriptionDisplay;
+
+ CCRenderTexture renderTexture;
+
+ public string MonsterName
+ {
+ get
+ {
+ return monsterNameDisplay.Text;
+ }
+ set
+ {
+ monsterNameDisplay.Text = value;
+ }
+ }
+
+ public string HpText
+ {
+ get
+ {
+ return hpDisplay.Text;
+ }
+ set
+ {
+ hpDisplay.Text = value;
+ }
+ }
+
+ public string DescriptionText
+ {
+ get
+ {
+ return descriptionDisplay.Text;
+ }
+ set
+ {
+ descriptionDisplay.Text = value;
+ }
+ }
+
+ public CCTexture2D ColorIconTexture
+ {
+ get
+ {
+ return colorIcon.Texture;
+ }
+ set
+ {
+ colorIcon.Texture = value;
+ colorIcon.IsAntialiased = false;
+
+ }
+ }
+
+ public CCTexture2D MonsterTexture
+ {
+ get
+ {
+ return monsterSprite.Texture;
+ }
+ set
+ {
+ monsterSprite.Texture = value;
+ ReactToMonsterSpriteTextureSet();
+ }
+ }
+
+ public bool UsesRenderTexture
+ {
+ get
+ {
+ return usesRenderTexture;
+ }
+ set
+ {
+ usesRenderTexture = value;
+ if (usesRenderTexture)
+ {
+ SwitchToRenderTexture();
+ }
+ else
+ {
+ SwitchToRenderingComponents();
+ }
+ }
+ }
+
+ public override byte Opacity
+ {
+ get
+ {
+ return base.Opacity;
+ }
+
+ set
+ {
+ base.Opacity = value;
+
+ if (usesRenderTexture)
+ {
+ this.renderTexture.Sprite.Opacity = value;
+ }
+ else
+ {
+ foreach (var component in visualComponents)
+ {
+ component.Opacity = value;
+ }
+ }
+ }
+ }
+
+ public Card()
+ {
+ CreateBackground();
+
+ CreateColorIcon();
+
+ CreateMonsterSprite();
+
+ CreateMonsterNameDisplay();
+
+ CreateHpDisplay();
+
+ CreateDescriptionDisplay();
+
+ AddComponentsToList();
+ }
+
+ private void CreateBackground()
+ {
+ background = new CCSprite("CardBackground.png");
+ background.IsAntialiased = false;
+ // The background serves as the largest sprite so it essentially defines the
+ // card size and anchor point. Which is bottom left.
+ background.AnchorPoint = CCPoint.Zero;
+ }
+
+ private void CreateColorIcon()
+ {
+ colorIcon = new CCSprite("GreenIcon.png");
+
+ colorIcon.AnchorPoint = CCPoint.Zero;
+ colorIcon.PositionX = 97;
+ colorIcon.PositionY = 72;
+ colorIcon.IsAntialiased = false;
+ }
+
+ private void CreateMonsterSprite()
+ {
+ monsterSprite = new CCSprite("GreenGuy.png");
+ monsterSprite.PositionX = background.ContentSize.Center.X;
+ monsterSprite.PositionY = 135;
+ ReactToMonsterSpriteTextureSet();
+ }
+
+ private void ReactToMonsterSpriteTextureSet()
+ {
+ monsterSprite.IsAntialiased = false;
+ // The TextureRectInPixels gets automatically set when the CCSprite is first
+ // created, but the value does not adjust automatically when the texture is changed:
+ monsterSprite.TextureRectInPixels = new CCRect(0, 0,
+ monsterSprite.Texture.PixelsWide, monsterSprite.Texture.PixelsHigh);
+ monsterSprite.Scale = 5;
+ }
+
+ private void CreateMonsterNameDisplay()
+ {
+ monsterNameDisplay = CreateLabel("Monster Name");
+ monsterNameDisplay.HorizontalAlignment = CCTextAlignment.Center;
+ monsterNameDisplay.PositionX = background.ContentSize.Center.X;
+ monsterNameDisplay.PositionY = background.ContentSize.Height - 10;
+ }
+
+ private void CreateHpDisplay()
+ {
+ hpDisplay = CreateLabel("HP: 10/10");
+ hpDisplay.AnchorPoint = new CCPoint(0, .5f);
+ hpDisplay.PositionY = 80;
+ hpDisplay.PositionX = 10;
+ }
+
+ private void CreateDescriptionDisplay()
+ {
+ descriptionDisplay = CreateLabel("Monster Description that wraps to multiple lines", 22);
+ descriptionDisplay.Color = CCColor3B.Black;
+ descriptionDisplay.PositionX = 15;
+ descriptionDisplay.PositionY = 70;
+ descriptionDisplay.LineHeight = 75;
+ descriptionDisplay.Dimensions = new CCSize(180, 400);
+ descriptionDisplay.LineBreak = CCLabelLineBreak.Word;
+ descriptionDisplay.AnchorPoint = new CCPoint(0, 1);
+ }
+
+ private void AddComponentsToList()
+ {
+ visualComponents.Add(background);
+ visualComponents.Add(colorIcon);
+ visualComponents.Add(monsterSprite);
+ visualComponents.Add(monsterNameDisplay);
+ visualComponents.Add(hpDisplay);
+ visualComponents.Add(descriptionDisplay);
+ }
+
+ private void SwitchToRenderingComponents()
+ {
+ if (renderTexture != null && this.Children.Contains(renderTexture.Sprite))
+ {
+ this.RemoveChild(renderTexture.Sprite);
+ }
+
+ bool areVisualComponentsAlreadyAdded = this.Children != null && this.Children.Contains(visualComponents[0]);
+
+ if (!areVisualComponentsAlreadyAdded)
+ {
+ foreach (var component in visualComponents)
+ {
+ this.AddChild(component);
+ }
+ }
+
+ }
+
+ private void SwitchToRenderTexture()
+ {
+ // The card needs to be moved to the origin (0,0) so it's rendered on the render target.
+ // After it's rendered to the CCRenderTexture, it will be moved back to its old position
+ var oldPosition = this.Position;
+
+ // Make sure visuals are part of the card so they get rendered
+ bool areVisualComponentsAlreadyAdded = this.Children != null && this.Children.Contains(visualComponents[0]);
+ if (!areVisualComponentsAlreadyAdded)
+ {
+ // Temporarily add them so we can render the object:
+ foreach (var component in visualComponents)
+ {
+ this.AddChild(component);
+ }
+ }
+
+ // Create the render texture if it hasn't yet been made:
+ if (renderTexture == null)
+ {
+ // Even though the game is zoomed in to create a pixellated look, we are using
+ // high-resolution textures. Therefore, we want to have our canvas be 2x as big as
+ // the background so fonts don't appear pixellated
+ var unitResolution = background.ContentSize;
+ var pixelResolution = background.ContentSize * 2;
+ renderTexture = new CCRenderTexture(unitResolution, pixelResolution);
+ }
+
+ // We don't want the render target to be a child of the card
+ // when we call Visit
+ if (this.Children != null && this.Children.Contains(renderTexture.Sprite))
+ {
+ this.RemoveChild(renderTexture.Sprite);
+ }
+
+ // Move this instance back to the origin so it is rendered inside the render target:
+ this.Position = CCPoint.Zero;
+
+ // Clears the CCRenderTexture
+ renderTexture.BeginWithClear(CCColor4B.Transparent);
+
+ // Visit renders this object and all of its children
+ this.Visit();
+
+ // Ends the rendering, which means the CCRenderTexture's Sprite can be used
+ renderTexture.End();
+
+ // We no longer want the individual components to be drawn, so remove them:
+ foreach (var component in visualComponents)
+ {
+ this.RemoveChild(component);
+ }
+
+ // add the render target sprite to this:
+ this.AddChild(renderTexture.Sprite);
+
+ renderTexture.Sprite.AnchorPoint = CCPoint.Zero;
+
+ // Move this back to its original position:
+ this.Position = oldPosition;
+
+ }
+
+ private CCLabel CreateLabel(string text, int fontSize = 28)
+ {
+ var toReturn = new CCLabel(text, "Arial", fontSize, CCLabelFormat.SystemFont);
+ toReturn.Scale = .5f;
+
+ return toReturn;
+ }
+ }
+}
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.Common/GameLayer.cs b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Common/GameLayer.cs
new file mode 100644
index 000000000..48586dec9
--- /dev/null
+++ b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Common/GameLayer.cs
@@ -0,0 +1,60 @@
+using System;
+using System.Collections.Generic;
+using CocosSharp;
+
+namespace RenderTextureExample
+{
+ public class GameLayer : CCLayerColor
+ {
+ public GameLayer () : base (CCColor4B.Black)
+ {
+
+ }
+
+ protected override void AddedToScene ()
+ {
+ base.AddedToScene();
+
+ GameView.Stats.Enabled = true;
+
+ const bool useRenderTextures = true;
+ const byte opacity = 255;
+
+ const float positionIncrement = 140;
+
+ Card card = new Card();
+ card.ColorIconTexture = CCTextureCache.SharedTextureCache.AddImage("GreenIcon.png");
+ card.MonsterTexture = CCTextureCache.SharedTextureCache.AddImage("GreenGuy.png");
+ card.DescriptionText = "Does extra damage to water units";
+ card.MonsterName = "Grobot";
+ card.PositionX = 20;
+ card.PositionY = 100;
+ card.UsesRenderTexture = useRenderTextures;
+ card.Opacity = opacity;
+ this.AddChild(card);
+
+ card = new Card();
+ card.ColorIconTexture = CCTextureCache.SharedTextureCache.AddImage("BlueIcon.png");
+ card.MonsterTexture = CCTextureCache.SharedTextureCache.AddImage("BlueGuy.png");
+ card.DescriptionText = "Takes reduced damage from earth attacks";
+ card.MonsterName = "Bluchirp";
+ card.PositionX = 20 + positionIncrement;
+ card.PositionY = 100;
+ card.UsesRenderTexture = useRenderTextures;
+ card.Opacity = opacity;
+ this.AddChild(card);
+
+ card = new Card();
+ card.ColorIconTexture = CCTextureCache.SharedTextureCache.AddImage("OrangeIcon.png");
+ card.MonsterTexture = CCTextureCache.SharedTextureCache.AddImage("OrangeGuy.png");
+ card.DescriptionText = "High chance of preemptive attack";
+ card.MonsterName = "Orange-U-Glad";
+ card.PositionX = 20 + positionIncrement * 2;
+ card.PositionY = 100;
+ card.UsesRenderTexture = useRenderTextures;
+ card.Opacity = opacity;
+ this.AddChild(card);
+
+ }
+ }
+}
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.Common/RenderTextureExample.Common.csproj b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Common/RenderTextureExample.Common.csproj
new file mode 100644
index 000000000..9efadeed4
--- /dev/null
+++ b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Common/RenderTextureExample.Common.csproj
@@ -0,0 +1,51 @@
+
+
+
+ Debug
+ AnyCPU
+ {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ {1715905D-1CF2-4A76-9DB6-F2740D5D5EBC}
+ Library
+ RenderTextureExample.Common
+ RenderTextureExample.Common
+ v4.5
+ Profile111
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ false
+
+
+ full
+ true
+ bin\Release
+ prompt
+ 4
+ false
+
+
+
+
+
+
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\portable-net45+win+wpa81+wp81\box2d.dll
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\portable-net45+win+wpa81+wp81\CocosSharp.dll
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\portable-net45+win+wpa81+wp81\MonoGame.Framework.dll
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.Common/packages.config b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Common/packages.config
new file mode 100644
index 000000000..ad4b976d2
--- /dev/null
+++ b/CCRenderTexture/RenderTextureExample/RenderTextureExample.Common/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/AppDelegate.cs b/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/AppDelegate.cs
new file mode 100644
index 000000000..acd35d3ac
--- /dev/null
+++ b/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/AppDelegate.cs
@@ -0,0 +1,60 @@
+using Foundation;
+using UIKit;
+
+namespace RenderTextureExample.iOS
+{
+ // The UIApplicationDelegate for the application. This class is responsible for launching the
+ // User Interface of the application, as well as listening (and optionally responding) to application events from iOS.
+ [Register ("AppDelegate")]
+ public class AppDelegate : UIApplicationDelegate
+ {
+ // class-level declarations
+
+ public override UIWindow Window
+ {
+ get;
+ set;
+ }
+
+ public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
+ {
+ // Override point for customization after application launch.
+ // If not required for your application you can safely delete this method
+
+ return true;
+ }
+
+ public override void OnResignActivation (UIApplication application)
+ {
+ // Invoked when the application is about to move from active to inactive state.
+ // This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message)
+ // or when the user quits the application and it begins the transition to the background state.
+ // Games should use this method to pause the game.
+ }
+
+ public override void DidEnterBackground (UIApplication application)
+ {
+ // Use this method to release shared resources, save user data, invalidate timers and store the application state.
+ // If your application supports background exection this method is called instead of WillTerminate when the user quits.
+ }
+
+ public override void WillEnterForeground (UIApplication application)
+ {
+ // Called as part of the transiton from background to active state.
+ // Here you can undo many of the changes made on entering the background.
+ }
+
+ public override void OnActivated (UIApplication application)
+ {
+ // Restart any tasks that were paused (or not yet started) while the application was inactive.
+ // If the application was previously in the background, optionally refresh the user interface.
+ }
+
+ public override void WillTerminate (UIApplication application)
+ {
+ // Called when the application is about to terminate. Save data, if needed. See also DidEnterBackground.
+ }
+ }
+}
+
+
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/Entitlements.plist b/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/Entitlements.plist
new file mode 100644
index 000000000..9ae599370
--- /dev/null
+++ b/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/Entitlements.plist
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/Info.plist b/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/Info.plist
new file mode 100644
index 000000000..d00fa0eb0
--- /dev/null
+++ b/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/Info.plist
@@ -0,0 +1,47 @@
+
+
+
+
+ CFBundleDisplayName
+ ${AppName}
+ CFBundleIdentifier
+ ${AppIdentifier}
+ CFBundleShortVersionString
+ 1.0
+ CFBundleVersion
+ 1.0
+ LSRequiresIPhoneOS
+
+ MinimumOSVersion
+ 8.0
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIMainStoryboardFile
+ Main
+ UIMainStoryboardFile~ipad
+ Main
+ UIRequiredDeviceCapabilities
+
+ armv7
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ XSAppIconAssets
+ Resources/Images.xcassets/AppIcons.appiconset
+
+
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/Main.cs b/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/Main.cs
new file mode 100644
index 000000000..39de2626d
--- /dev/null
+++ b/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/Main.cs
@@ -0,0 +1,15 @@
+using UIKit;
+
+namespace RenderTextureExample.iOS
+{
+ public class Application
+ {
+ // This is the main entry point of the application.
+ static void Main (string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main (args, null, "AppDelegate");
+ }
+ }
+}
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/Main.storyboard b/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/Main.storyboard
new file mode 100644
index 000000000..760aea9c2
--- /dev/null
+++ b/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/Main.storyboard
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/RenderTextureExample.iOS.csproj b/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/RenderTextureExample.iOS.csproj
new file mode 100644
index 000000000..8ec94d341
--- /dev/null
+++ b/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/RenderTextureExample.iOS.csproj
@@ -0,0 +1,173 @@
+
+
+
+ Debug
+ iPhoneSimulator
+ {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ {D557E8E0-062B-4FE2-8B45-E22024ECBB41}
+ Exe
+ RenderTextureExample.iOS
+ Resources
+ RenderTextureExampleiOS
+
+
+ true
+ full
+ false
+ bin\iPhoneSimulator\Debug
+ DEBUG;
+ prompt
+ 4
+ false
+ i386
+ None
+ true
+ true
+ true
+ true
+ iPhone Developer
+ true
+ NSUrlSessionHandler
+
+
+ full
+ true
+ bin\iPhone\Release
+ prompt
+ 4
+ false
+ ARMv7, ARM64
+ Entitlements.plist
+ true
+ true
+ iPhone Developer
+ true
+ NSUrlSessionHandler
+
+
+ full
+ true
+ bin\iPhoneSimulator\Release
+ prompt
+ 4
+ false
+ i386
+ None
+ true
+ iPhone Developer
+ true
+ NSUrlSessionHandler
+
+
+ true
+ full
+ false
+ bin\iPhone\Debug
+ DEBUG;
+ prompt
+ 4
+ false
+ ARMv7, ARM64
+ Entitlements.plist
+ true
+ iPhone Developer
+ true
+ true
+ true
+ true
+ true
+ NSUrlSessionHandler
+
+
+
+
+
+
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\Xamarin.iOS10\box2d.dll
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\Xamarin.iOS10\CocosSharp.dll
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\Xamarin.iOS10\Lidgren.Network.dll
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\Xamarin.iOS10\MonoGame.Framework.dll
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\Xamarin.iOS10\MonoGame.Framework.Net.dll
+
+
+
+
+ {1715905D-1CF2-4A76-9DB6-F2740D5D5EBC}
+ RenderTextureExample.Common
+
+
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ViewController.cs
+
+
+
+
+ Content\Images\BlueGuy.png
+
+
+
+
+ Content\Images\BlueIcon.png
+
+
+
+
+ Content\Images\CardBackground.png
+
+
+
+
+ Content\Images\GreenGuy.png
+
+
+
+
+ Content\Images\GreenIcon.png
+
+
+
+
+ Content\Images\OrangeGuy.png
+
+
+
+
+ Content\Images\OrangeIcon.png
+
+
+
+
\ No newline at end of file
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/RenderTextureExample.iOS.csproj.bak b/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/RenderTextureExample.iOS.csproj.bak
new file mode 100644
index 000000000..b36c1120e
--- /dev/null
+++ b/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/RenderTextureExample.iOS.csproj.bak
@@ -0,0 +1,132 @@
+
+
+
+ Debug
+ iPhoneSimulator
+ {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ {D557E8E0-062B-4FE2-8B45-E22024ECBB41}
+ Exe
+ RenderTextureExample.iOS
+ Resources
+ RenderTextureExample.iOS
+
+
+ true
+ full
+ false
+ bin\iPhoneSimulator\Debug
+ DEBUG;
+ prompt
+ 4
+ false
+ i386
+ None
+ true
+ true
+ true
+ true
+ iPhone Developer
+ true
+
+
+ full
+ true
+ bin\iPhone\Release
+ prompt
+ 4
+ false
+ ARMv7, ARM64
+ Entitlements.plist
+ true
+ true
+ iPhone Developer
+ true
+
+
+ full
+ true
+ bin\iPhoneSimulator\Release
+ prompt
+ 4
+ false
+ i386
+ None
+ true
+ iPhone Developer
+ true
+
+
+ true
+ full
+ false
+ bin\iPhone\Debug
+ DEBUG;
+ prompt
+ 4
+ false
+ ARMv7, ARM64
+ Entitlements.plist
+ true
+ iPhone Developer
+ true
+ true
+ true
+ true
+ true
+
+
+
+
+
+
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\Xamarin.iOS10\box2d.dll
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\Xamarin.iOS10\CocosSharp.dll
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\Xamarin.iOS10\Lidgren.Network.dll
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\Xamarin.iOS10\MonoGame.Framework.dll
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\Xamarin.iOS10\MonoGame.Framework.Net.dll
+
+
+
+
+ {1715905D-1CF2-4A76-9DB6-F2740D5D5EBC}
+ RenderTextureExample.Common
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ViewController.cs
+
+
+
+
\ No newline at end of file
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/Resources/Images.xcassets/AppIcons.appiconset/Contents.json b/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/Resources/Images.xcassets/AppIcons.appiconset/Contents.json
new file mode 100644
index 000000000..24f997458
--- /dev/null
+++ b/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/Resources/Images.xcassets/AppIcons.appiconset/Contents.json
@@ -0,0 +1,108 @@
+{
+ "images": [
+ {
+ "size": "29x29",
+ "scale": "1x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "29x29",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "29x29",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "40x40",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "40x40",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "57x57",
+ "scale": "1x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "57x57",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "60x60",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "60x60",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "29x29",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "29x29",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "40x40",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "40x40",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "50x50",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "50x50",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "72x72",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "72x72",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "76x76",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "76x76",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "120x120",
+ "scale": "1x",
+ "idiom": "car"
+ }
+ ],
+ "info": {
+ "version": 1,
+ "author": "xcode"
+ }
+}
\ No newline at end of file
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/Resources/LaunchScreen.xib b/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/Resources/LaunchScreen.xib
new file mode 100644
index 000000000..69c5ee8d8
--- /dev/null
+++ b/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/Resources/LaunchScreen.xib
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/ViewController.cs b/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/ViewController.cs
new file mode 100644
index 000000000..0b0c82775
--- /dev/null
+++ b/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/ViewController.cs
@@ -0,0 +1,70 @@
+using System;
+using System.Collections.Generic;
+using UIKit;
+using CocosSharp;
+
+namespace RenderTextureExample.iOS
+{
+ public partial class ViewController : UIViewController
+ {
+ public ViewController (IntPtr handle) : base (handle)
+ {
+ }
+
+ public override void ViewDidLoad ()
+ {
+ base.ViewDidLoad ();
+
+ if (GameView != null)
+ {
+ // Set loading event to be called once game view is fully initialised
+ GameView.ViewCreated += LoadGame;
+ }
+ }
+
+ public override void ViewWillDisappear (bool animated)
+ {
+ base.ViewWillDisappear (animated);
+
+ if (GameView != null)
+ GameView.Paused = true;
+ }
+
+ public override void ViewDidAppear (bool animated)
+ {
+ base.ViewDidAppear (animated);
+
+ if (GameView != null)
+ GameView.Paused = false;
+ }
+
+ public override void DidReceiveMemoryWarning ()
+ {
+ base.DidReceiveMemoryWarning ();
+ // Release any cached data, images, etc that aren't in use.
+ }
+
+ void LoadGame (object sender, EventArgs e)
+ {
+ CCGameView gameView = sender as CCGameView;
+
+ if (gameView != null)
+ {
+ var contentSearchPaths = new List() { "Fonts", "Sounds", "Images" };
+
+ int width = 512;
+ int height = 384;
+
+ // Set world dimensions
+ gameView.DesignResolution = new CCSizeI(width, height);
+
+ gameView.ContentManager.SearchPaths = contentSearchPaths;
+
+ CCScene gameScene = new CCScene(gameView);
+ gameScene.AddLayer(new GameLayer());
+ gameView.RunWithScene(gameScene);
+ }
+ }
+ }
+}
+
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/ViewController.designer.cs b/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/ViewController.designer.cs
new file mode 100644
index 000000000..dc8b60a97
--- /dev/null
+++ b/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/ViewController.designer.cs
@@ -0,0 +1,26 @@
+//
+// This file has been generated automatically by MonoDevelop to store outlets and
+// actions made in the Xcode designer. If it is removed, they will be lost.
+// Manual changes to this file may not be handled correctly.
+//
+using Foundation;
+using System.CodeDom.Compiler;
+
+namespace RenderTextureExample.iOS
+{
+ [Register ("ViewController")]
+ partial class ViewController
+ {
+ [Outlet]
+ CocosSharp.CCGameView GameView { get; set; }
+
+ void ReleaseDesignerOutlets ()
+ {
+ if (GameView != null)
+ {
+ GameView.Dispose ();
+ GameView = null;
+ }
+ }
+ }
+}
diff --git a/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/packages.config b/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/packages.config
new file mode 100644
index 000000000..f9d024b44
--- /dev/null
+++ b/CCRenderTexture/RenderTextureExample/RenderTextureExample.iOS/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/CCRenderTexture/Screenshots/1FullOpacity.PNG b/CCRenderTexture/Screenshots/1FullOpacity.PNG
new file mode 100644
index 000000000..b7e7a585b
Binary files /dev/null and b/CCRenderTexture/Screenshots/1FullOpacity.PNG differ
diff --git a/CCRenderTexture/Screenshots/DrawCallReduction.PNG b/CCRenderTexture/Screenshots/DrawCallReduction.PNG
new file mode 100644
index 000000000..b7e5eea93
Binary files /dev/null and b/CCRenderTexture/Screenshots/DrawCallReduction.PNG differ
diff --git a/CCRenderTexture/Screenshots/Transparent.PNG b/CCRenderTexture/Screenshots/Transparent.PNG
new file mode 100644
index 000000000..d5cf58574
Binary files /dev/null and b/CCRenderTexture/Screenshots/Transparent.PNG differ
diff --git a/Camera/Camera.Droid/Camera.Droid.csproj b/Camera/Camera.Droid/Camera.Droid.csproj
deleted file mode 100644
index 3fa0b37c2..000000000
--- a/Camera/Camera.Droid/Camera.Droid.csproj
+++ /dev/null
@@ -1,91 +0,0 @@
-
-
-
- Debug
- AnyCPU
- 8.0.30703
- 2.0
- {E6113F86-0FF9-4917-B934-BF690A6229A8}
- {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
- Library
- Camera.Droid
- True
- Resources\Resource.designer.cs
- Resource
- Resources
- Assets
- Camera.Droid
- Properties\AndroidManifest.xml
-
-
- true
- full
- false
- bin\Debug
- DEBUG;
- prompt
- 4
- None
- false
-
-
- full
- true
- bin\Release
- prompt
- 4
- false
- false
- x86
-
-
-
-
-
-
-
- ..\Components\xamarin.mobile-0.6.3\lib\android\Xamarin.Mobile.dll
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0.6.3
- False
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Camera/Camera.Droid/MainActivity.cs b/Camera/Camera.Droid/MainActivity.cs
deleted file mode 100644
index fe19a15ff..000000000
--- a/Camera/Camera.Droid/MainActivity.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-using System;
-using System.Threading.Tasks;
-
-using Android.App;
-using Android.Content;
-using Android.Runtime;
-using Android.Views;
-using Android.Widget;
-using Android.OS;
-
-using Xamarin.Media;
-
-namespace Camera.Droid
-{
- [Activity (Label = "Camera.Droid", MainLauncher = true)]
- public class MainActivity : Activity
- {
-
- protected override void OnCreate (Bundle bundle)
- {
- base.OnCreate (bundle);
-
- // Set our view from the "main" layout resource
- SetContentView (Resource.Layout.Main);
-
- // Get our button from the layout resource,
- // and attach an event to it
- Button button = FindViewById
+ CFBundleIdentifier
+ com.xamarin.ContentCtrls
+ MinimumOSVersion
+ 8.0
+ NSAppTransportSecurity
+
+ NSAllowsArbitraryLoads
+
+
UIDeviceFamily
1
UISupportedInterfaceOrientations
- MinimumOSVersion
- 5.1.1
diff --git a/ContentControls/iOSContentControls/Screens/iPhone/Browsers/BrowsersHome.xib b/ContentControls/iOSContentControls/Screens/iPhone/Browsers/BrowsersHome.xib
index 971f4744d..d328d4a73 100644
--- a/ContentControls/iOSContentControls/Screens/iPhone/Browsers/BrowsersHome.xib
+++ b/ContentControls/iOSContentControls/Screens/iPhone/Browsers/BrowsersHome.xib
@@ -1,8 +1,11 @@
-
-
+
+
+
+
+
-
-
+
+
@@ -24,7 +27,7 @@
-
+
@@ -33,7 +36,7 @@
-
+
@@ -42,13 +45,18 @@
-
+
-
-
+
+
-
\ No newline at end of file
+
+
+
+
+
+
diff --git a/ContentControls/iOSContentControls/Screens/iPhone/Browsers/InteractiveBrowser.xib b/ContentControls/iOSContentControls/Screens/iPhone/Browsers/InteractiveBrowser.xib
index 9e62324a2..21307f519 100644
--- a/ContentControls/iOSContentControls/Screens/iPhone/Browsers/InteractiveBrowser.xib
+++ b/ContentControls/iOSContentControls/Screens/iPhone/Browsers/InteractiveBrowser.xib
@@ -1,8 +1,11 @@
-
-
+
+
+
+
+
-
-
+
+
@@ -20,7 +23,7 @@
-
+
@@ -29,14 +32,19 @@
-
+
-
-
+
+
-
\ No newline at end of file
+
+
+
+
+
+
diff --git a/ContentControls/iOSContentControls/Screens/iPhone/Browsers/LocalBrowser.xib b/ContentControls/iOSContentControls/Screens/iPhone/Browsers/LocalBrowser.xib
index de6efb31f..201f6daf3 100644
--- a/ContentControls/iOSContentControls/Screens/iPhone/Browsers/LocalBrowser.xib
+++ b/ContentControls/iOSContentControls/Screens/iPhone/Browsers/LocalBrowser.xib
@@ -1,8 +1,11 @@
-
-
+
+
+
+
+
-
-
+
+
@@ -19,12 +22,17 @@
-
+
-
-
+
+
-
\ No newline at end of file
+
+
+
+
+
+
diff --git a/ContentControls/iOSContentControls/Screens/iPhone/Browsers/WebBrowser.xib b/ContentControls/iOSContentControls/Screens/iPhone/Browsers/WebBrowser.xib
index 8c62b90ec..aa5946e1f 100644
--- a/ContentControls/iOSContentControls/Screens/iPhone/Browsers/WebBrowser.xib
+++ b/ContentControls/iOSContentControls/Screens/iPhone/Browsers/WebBrowser.xib
@@ -1,8 +1,11 @@
-
-
+
+
+
+
+
-
-
+
+
@@ -28,7 +31,7 @@
-
+
@@ -37,7 +40,7 @@
-
+
@@ -45,14 +48,14 @@
-
-
+
+
-
+
@@ -61,7 +64,7 @@
-
+
@@ -77,9 +80,14 @@
-
-
+
+
-
\ No newline at end of file
+
+
+
+
+
+
diff --git a/ContentControls/iOSContentControls/Screens/iPhone/Browsers/WebBrowser.xib.cs b/ContentControls/iOSContentControls/Screens/iPhone/Browsers/WebBrowser.xib.cs
index 0d42a4e8a..9767ecbf5 100644
--- a/ContentControls/iOSContentControls/Screens/iPhone/Browsers/WebBrowser.xib.cs
+++ b/ContentControls/iOSContentControls/Screens/iPhone/Browsers/WebBrowser.xib.cs
@@ -108,11 +108,17 @@ public void LoadError (object sender, UIWebErrorArgs e)
imgBusy.StopAnimating ();
btnStop.Enabled = false;
SetBackAndForwardEnable ();
- // show the error
- UIAlertView alert = new UIAlertView ("Browse Error",
- "Web page failed to load: " + e.Error.ToString (),
- null, "OK", null);
- alert.Show ();
+ var msg = e.Error.ToString ();
+ if (msg.Contains ("NSURLErrorDomain error -999")) {
+ https://bugzilla.xamarin.com/show_bug.cgi?id=3480
+ Console.WriteLine ("### unexpected error occured: " + e.Error);
+ } else {
+ // show the error
+ UIAlertView alert = new UIAlertView ("Browse Error",
+ "Web page failed to load: " + e.Error.ToString (),
+ null, "OK", null);
+ alert.Show ();
+ }
}
#endregion
diff --git a/ContentControls/iOSContentControls/Screens/iPhone/CustomizingNavBar/CustomizingNavBarScreen.xib b/ContentControls/iOSContentControls/Screens/iPhone/CustomizingNavBar/CustomizingNavBarScreen.xib
index 63dff947a..ac45133bf 100644
--- a/ContentControls/iOSContentControls/Screens/iPhone/CustomizingNavBar/CustomizingNavBarScreen.xib
+++ b/ContentControls/iOSContentControls/Screens/iPhone/CustomizingNavBar/CustomizingNavBarScreen.xib
@@ -1,8 +1,11 @@
-
-
+
+
+
+
+
-
-
+
+
@@ -26,7 +29,7 @@
-
+
@@ -35,7 +38,7 @@
-
+
@@ -44,7 +47,7 @@
-
+
@@ -53,7 +56,7 @@
-
+
-
\ No newline at end of file
+
+
+
+
+
+
diff --git a/ContentControls/iOSContentControls/Screens/iPhone/Extra Screens/CustomizableTabScreen.xib b/ContentControls/iOSContentControls/Screens/iPhone/Extra Screens/CustomizableTabScreen.xib
index 6f8823541..b1157fb3c 100644
--- a/ContentControls/iOSContentControls/Screens/iPhone/Extra Screens/CustomizableTabScreen.xib
+++ b/ContentControls/iOSContentControls/Screens/iPhone/Extra Screens/CustomizableTabScreen.xib
@@ -1,8 +1,11 @@
-
-
+
+
+
+
+
-
-
+
+
@@ -21,13 +24,18 @@
-
+
-
-
+
+
-
\ No newline at end of file
+
+
+
+
+
+
diff --git a/ContentControls/iOSContentControls/Screens/iPhone/Maps/AnnotatedMapScreen.xib b/ContentControls/iOSContentControls/Screens/iPhone/Maps/AnnotatedMapScreen.xib
index af8505868..081462d22 100644
--- a/ContentControls/iOSContentControls/Screens/iPhone/Maps/AnnotatedMapScreen.xib
+++ b/ContentControls/iOSContentControls/Screens/iPhone/Maps/AnnotatedMapScreen.xib
@@ -1,8 +1,11 @@
-
-
+
+
+
+
+
-
-
+
+
@@ -22,10 +25,15 @@
-
-
+
+
-
\ No newline at end of file
+
+
+
+
+
+
diff --git a/ContentControls/iOSContentControls/Screens/iPhone/Maps/BasicMapScreen.xib b/ContentControls/iOSContentControls/Screens/iPhone/Maps/BasicMapScreen.xib
index 338ac8a6e..bcbbb571b 100644
--- a/ContentControls/iOSContentControls/Screens/iPhone/Maps/BasicMapScreen.xib
+++ b/ContentControls/iOSContentControls/Screens/iPhone/Maps/BasicMapScreen.xib
@@ -1,8 +1,11 @@
-
-
+
+
+
+
+
-
-
+
+
@@ -33,10 +36,15 @@
-
-
+
+
-
\ No newline at end of file
+
+
+
+
+
+
diff --git a/ContentControls/iOSContentControls/Screens/iPhone/Maps/MapWithOverlayScreen.xib b/ContentControls/iOSContentControls/Screens/iPhone/Maps/MapWithOverlayScreen.xib
index 4c4a0faa0..895477bc6 100644
--- a/ContentControls/iOSContentControls/Screens/iPhone/Maps/MapWithOverlayScreen.xib
+++ b/ContentControls/iOSContentControls/Screens/iPhone/Maps/MapWithOverlayScreen.xib
@@ -1,8 +1,11 @@
-
-
+
+
+
+
+
-
-
+
+
@@ -22,10 +25,15 @@
-
-
+
+
-
\ No newline at end of file
+
+
+
+
+
+
diff --git a/ContentControls/iOSContentControls/Screens/iPhone/Maps/MapsHome.xib b/ContentControls/iOSContentControls/Screens/iPhone/Maps/MapsHome.xib
index 326f88b03..14021ff69 100644
--- a/ContentControls/iOSContentControls/Screens/iPhone/Maps/MapsHome.xib
+++ b/ContentControls/iOSContentControls/Screens/iPhone/Maps/MapsHome.xib
@@ -1,8 +1,11 @@
-
-
+
+
+
+
+
-
-
+
+
@@ -24,7 +27,7 @@
-
+
@@ -33,7 +36,7 @@
-
+
@@ -42,14 +45,19 @@
-
+
-
-
+
+
-
\ No newline at end of file
+
+
+
+
+
+
diff --git a/ContentControls/iOSContentControls/Screens/iPhone/Search/SearchScreen.xib b/ContentControls/iOSContentControls/Screens/iPhone/Search/SearchScreen.xib
index 95b933a0a..ee20fb7cb 100644
--- a/ContentControls/iOSContentControls/Screens/iPhone/Search/SearchScreen.xib
+++ b/ContentControls/iOSContentControls/Screens/iPhone/Search/SearchScreen.xib
@@ -1,8 +1,11 @@
-
-
+
+
+
+
+
-
-
+
+
@@ -20,7 +23,7 @@
-
+
@@ -30,9 +33,14 @@
-
-
+
+
-
\ No newline at end of file
+
+
+
+
+
+
diff --git a/ContentControls/iOSContentControls/iOSContentControls.csproj b/ContentControls/iOSContentControls/iOSContentControls.csproj
index 0806f089b..95090b9d4 100644
--- a/ContentControls/iOSContentControls/iOSContentControls.csproj
+++ b/ContentControls/iOSContentControls/iOSContentControls.csproj
@@ -1,4 +1,4 @@
-
+
Debug
@@ -24,10 +24,10 @@
True
False
Full
-
-
+
false
i386
+ NSUrlSessionHandler
none
@@ -37,10 +37,10 @@
4
False
None
-
-
+
false
i386
+ NSUrlSessionHandler
True
@@ -53,12 +53,11 @@
True
False
iPhone Developer
-
-
+
false
-
-
+
ARMv7
+ NSUrlSessionHandler
none
@@ -68,10 +67,10 @@
4
False
iPhone Developer
-
-
+
false
ARMv7, ARM64
+ NSUrlSessionHandler
diff --git a/DataAccess/Advanced/Android/Adapters/StockListAdapter.cs b/DataAccess/Advanced/Android/Adapters/StockListAdapter.cs
new file mode 100644
index 000000000..6915f8a5d
--- /dev/null
+++ b/DataAccess/Advanced/Android/Adapters/StockListAdapter.cs
@@ -0,0 +1,53 @@
+using System;
+using System.Collections.Generic;
+using Android.Widget;
+using Android.App;
+using Android;
+
+namespace DataAccess {
+ public class StockListAdapter : BaseAdapter {
+ Activity context = null;
+ IList stocks = new List();
+
+ public StockListAdapter (Activity context, IList stocks) : base ()
+ {
+ this.context = context;
+ this.stocks = stocks;
+ }
+
+ public override Stock this[int position]
+ {
+ get { return stocks[position]; }
+ }
+
+ public override long GetItemId (int position)
+ {
+ return position;
+ }
+
+ public override int Count
+ {
+ get { return stocks.Count; }
+ }
+
+ public override Android.Views.View GetView (int position, Android.Views.View convertView, Android.Views.ViewGroup parent)
+ {
+ // Get our object for position
+ var item = stocks[position];
+
+ //Try to reuse convertView if it's not null, otherwise inflate it from our item layout
+ // gives us some performance gains by not always inflating a new view
+ // will sound familiar to MonoTouch developers with UITableViewCell.DequeueReusableCell()
+ var view = (convertView ??
+ context.LayoutInflater.Inflate(
+ Android.Resource.Layout.SimpleListItem1,
+ parent,
+ false)) as TextView;
+
+ view.SetText (item.Name==""?"":item.Name, TextView.BufferType.Normal);
+
+ //Finally return the view
+ return view;
+ }
+ }
+}
\ No newline at end of file
diff --git a/DataAccess/Advanced/Android/Android.csproj b/DataAccess/Advanced/Android/Android.csproj
new file mode 100644
index 000000000..e86f1b978
--- /dev/null
+++ b/DataAccess/Advanced/Android/Android.csproj
@@ -0,0 +1,99 @@
+
+
+
+ Debug
+ AnyCPU
+ 8.0.30703
+ 2.0
+ {EA729FE3-7050-4F2F-A9E8-A950E898AEB9}
+ {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ Library
+ Properties
+ DataAccess
+ Tasky.Android
+ 512
+ true
+ Resources\Resource.Designer.cs
+ Off
+ armeabi-v7a%3bx86
+
+
+ Properties\AndroidManifest.xml
+ False
+ false
+ v6.0
+
+
+ True
+ full
+ False
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+ None
+ True
+
+
+ pdbonly
+ True
+ bin\Release\
+ TRACE
+ prompt
+ 4
+ SdkOnly
+
+
+
+
+
+
+
+
+
+ ..\packages\sqlite-net-pcl.1.1.1\lib\portable-net45+wp8+wpa81+win8+MonoAndroid10+MonoTouch10+Xamarin.iOS10\SQLite-net.dll
+
+
+
+
+
+
+
+
+
+ Orm\Stock.cs
+
+
+ Orm\StockDatabase.cs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/DataAccess/Advanced/Android/Orm/StockRepository.cs b/DataAccess/Advanced/Android/Orm/StockRepository.cs
new file mode 100644
index 000000000..cdf9440f3
--- /dev/null
+++ b/DataAccess/Advanced/Android/Orm/StockRepository.cs
@@ -0,0 +1,40 @@
+using System;
+using System.Collections.Generic;
+
+namespace DataAccess
+{
+ public class StockRepository
+ {
+ StockDatabase db = null;
+ protected static StockRepository me;
+ static StockRepository ()
+ {
+ me = new StockRepository();
+ }
+ protected StockRepository()
+ {
+ db = new StockDatabase(StockDatabase.DatabaseFilePath);
+ }
+
+ public static Stock GetStock(int id)
+ {
+ return me.db.GetStock(id);
+ }
+
+ public static IEnumerable GetStocks ()
+ {
+ return me.db.GetStocks();
+ }
+
+ public static int SaveStock (Stock item)
+ {
+ return me.db.SaveStock(item);
+ }
+
+ public static int DeleteStock(Stock item)
+ {
+ return me.db.DeleteStock(item);
+ }
+ }
+}
+
diff --git a/DataAccess/Advanced/Android/Properties/AndroidManifest.xml b/DataAccess/Advanced/Android/Properties/AndroidManifest.xml
new file mode 100644
index 000000000..54430d80b
--- /dev/null
+++ b/DataAccess/Advanced/Android/Properties/AndroidManifest.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/DataAccess/Advanced/Android/Properties/AssemblyInfo.cs b/DataAccess/Advanced/Android/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..fc5ac8457
--- /dev/null
+++ b/DataAccess/Advanced/Android/Properties/AssemblyInfo.cs
@@ -0,0 +1,30 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using Android.App;
+
+// Information about this assembly is defined by the following attributes.
+// Change them to the values specific to your project.
+
+[assembly: AssemblyTitle("Stocks")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("Xamarin")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
+// The form "{Major}.{Minor}.*" will automatically update the build and revision,
+// and "{Major}.{Minor}.{Build}.*" will update just the revision.
+
+[assembly: AssemblyVersion("1.0.*")]
+
+// The following attributes are used to specify the signing key for the assembly,
+// if desired. See the Mono documentation for more information about signing.
+
+//[assembly: AssemblyDelaySign(false)]
+//[assembly: AssemblyKeyFile("")]
+
+// This app uses the internet, this can be removed if not needed
+[assembly: UsesPermission("android.permission.INTERNET")]
diff --git a/DataAccess/Advanced/Android/Resources/Layout/HomeScreen.axml b/DataAccess/Advanced/Android/Resources/Layout/HomeScreen.axml
new file mode 100644
index 000000000..5b0976252
--- /dev/null
+++ b/DataAccess/Advanced/Android/Resources/Layout/HomeScreen.axml
@@ -0,0 +1,15 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/DataAccess/Advanced/Android/Resources/Layout/TaskDetails.axml b/DataAccess/Advanced/Android/Resources/Layout/TaskDetails.axml
new file mode 100644
index 000000000..abe57891a
--- /dev/null
+++ b/DataAccess/Advanced/Android/Resources/Layout/TaskDetails.axml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/DataAccess/Advanced/Android/Resources/Resource.Designer.cs b/DataAccess/Advanced/Android/Resources/Resource.Designer.cs
new file mode 100644
index 000000000..95c1a1dfa
--- /dev/null
+++ b/DataAccess/Advanced/Android/Resources/Resource.Designer.cs
@@ -0,0 +1,136 @@
+#pragma warning disable 1591
+// ------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Mono Runtime Version: 4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+// ------------------------------------------------------------------------------
+
+[assembly: Android.Runtime.ResourceDesignerAttribute("DataAccess.Resource", IsApplication=true)]
+
+namespace DataAccess
+{
+
+
+ [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;
+
+ static Drawable()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Drawable()
+ {
+ }
+ }
+
+ public partial class Id
+ {
+
+ // aapt resource value: 0x7f050002
+ public const int NameLabel = 2131034114;
+
+ // aapt resource value: 0x7f050005
+ public const int NotesLabel = 2131034117;
+
+ // aapt resource value: 0x7f050003
+ public const int TaskDetailsHeader = 2131034115;
+
+ // aapt resource value: 0x7f050000
+ public const int btnAddTask = 2131034112;
+
+ // aapt resource value: 0x7f050007
+ public const int btnCancelDelete = 2131034119;
+
+ // aapt resource value: 0x7f050008
+ public const int btnSave = 2131034120;
+
+ // aapt resource value: 0x7f050001
+ public const int lstTasks = 2131034113;
+
+ // aapt resource value: 0x7f050004
+ public const int txtName = 2131034116;
+
+ // aapt resource value: 0x7f050006
+ public const int txtNotes = 2131034118;
+
+ static Id()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Id()
+ {
+ }
+ }
+
+ public partial class Layout
+ {
+
+ // aapt resource value: 0x7f030000
+ public const int HomeScreen = 2130903040;
+
+ // aapt resource value: 0x7f030001
+ public const int TaskDetails = 2130903041;
+
+ static Layout()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Layout()
+ {
+ }
+ }
+
+ public partial class String
+ {
+
+ // aapt resource value: 0x7f040000
+ public const int app_name = 2130968576;
+
+ static String()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private String()
+ {
+ }
+ }
+ }
+}
+#pragma warning restore 1591
diff --git a/DataAccess/Advanced/Android/Resources/Values/Strings.xml b/DataAccess/Advanced/Android/Resources/Values/Strings.xml
new file mode 100644
index 000000000..aa985d301
--- /dev/null
+++ b/DataAccess/Advanced/Android/Resources/Values/Strings.xml
@@ -0,0 +1,4 @@
+
+
+ Stocks
+
diff --git a/Camera/Camera.Droid/Resources/drawable-hdpi/Icon.png b/DataAccess/Advanced/Android/Resources/drawable/Icon.png
similarity index 100%
rename from Camera/Camera.Droid/Resources/drawable-hdpi/Icon.png
rename to DataAccess/Advanced/Android/Resources/drawable/Icon.png
diff --git a/DataAccess/Advanced/Android/Screens/HomeScreen.cs b/DataAccess/Advanced/Android/Screens/HomeScreen.cs
new file mode 100644
index 000000000..e94107c17
--- /dev/null
+++ b/DataAccess/Advanced/Android/Screens/HomeScreen.cs
@@ -0,0 +1,70 @@
+using System.Collections.Generic;
+using Android.App;
+using Android.Content;
+using Android.OS;
+using Android.Widget;
+using Android.Graphics;
+using Android.Views;
+using System.Linq;
+
+namespace DataAccess {
+ [Activity (Label = "Stocks", MainLauncher = true, Icon="@drawable/icon")]
+ public class HomeScreen : Activity {
+ protected StockListAdapter taskList;
+ protected IList tasks;
+ protected Button addTaskButton = null;
+ protected ListView taskListView = null;
+
+ protected override void OnCreate (Bundle bundle)
+ {
+ base.OnCreate (bundle);
+
+
+ View titleView = Window.FindViewById(Android.Resource.Id.Title);
+ if (titleView != null) {
+ IViewParent parent = titleView.Parent;
+ if (parent != null && (parent is View)) {
+ View parentView = (View)parent;
+ parentView.SetBackgroundColor(Color.Rgb(0x26, 0x75 ,0xFF)); //38, 117 ,255
+ }
+ }
+
+
+ // set our layout to be the home screen
+ SetContentView(Resource.Layout.HomeScreen);
+
+ //Find our controls
+ taskListView = FindViewById (Resource.Id.lstTasks);
+ addTaskButton = FindViewById (Resource.Id.btnAddTask);
+
+ // wire up add task button handler
+ if(addTaskButton != null) {
+ addTaskButton.Click += (sender, e) => {
+ StartActivity(typeof(StockDetailsScreen));
+ };
+ }
+
+ // wire up task click handler
+ if(taskListView != null) {
+ taskListView.ItemClick += (object sender, AdapterView.ItemClickEventArgs e) => {
+ var taskDetails = new Intent (this, typeof (StockDetailsScreen));
+ taskDetails.PutExtra ("StockId", tasks[e.Position].Id);
+ StartActivity (taskDetails);
+ };
+ }
+ }
+
+ protected override void OnResume ()
+ {
+ base.OnResume ();
+
+ tasks = StockRepository.GetStocks().ToList();
+
+ // create our adapter
+ taskList = new StockListAdapter(this, tasks);
+
+ //Hook up our adapter to our ListView
+ taskListView.Adapter = taskList;
+ }
+ }
+}
\ No newline at end of file
diff --git a/DataAccess/Advanced/Android/Screens/StockDetailsScreen.cs b/DataAccess/Advanced/Android/Screens/StockDetailsScreen.cs
new file mode 100644
index 000000000..8fddadac2
--- /dev/null
+++ b/DataAccess/Advanced/Android/Screens/StockDetailsScreen.cs
@@ -0,0 +1,86 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using Android.App;
+using Android.Content;
+using Android.OS;
+using Android.Runtime;
+using Android.Widget;
+using Android.Graphics;
+using Android.Views;
+
+
+namespace DataAccess {
+
+ [Activity (Label = "Stock")]
+ public class StockDetailsScreen : Activity {
+ protected Stock task = new Stock();
+ protected Button cancelDeleteButton = null;
+ protected EditText notesTextEdit = null;
+ protected EditText nameTextEdit = null;
+ protected Button saveButton = null;
+
+ protected override void OnCreate (Bundle bundle)
+ {
+ base.OnCreate (bundle);
+
+ View titleView = Window.FindViewById(Android.Resource.Id.Title);
+ if (titleView != null) {
+ IViewParent parent = titleView.Parent;
+ if (parent != null && (parent is View)) {
+ View parentView = (View)parent;
+ parentView.SetBackgroundColor(Color.Rgb(0x26, 0x75 ,0xFF)); //38, 117 ,255
+ }
+ }
+
+ int stockId = Intent.GetIntExtra("StockId", 0);
+ if (stockId > 0) {
+ task = StockRepository.GetStock(stockId);
+ }
+
+ // set our layout to be the home screen
+ SetContentView(Resource.Layout.TaskDetails);
+ nameTextEdit = FindViewById(Resource.Id.txtName);
+ notesTextEdit = FindViewById(Resource.Id.txtNotes);
+ saveButton = FindViewById(Resource.Id.btnSave);
+
+
+ // find all our controls
+ cancelDeleteButton = FindViewById(Resource.Id.btnCancelDelete);
+
+
+ // set the cancel delete based on whether or not it's an existing task
+ if(cancelDeleteButton != null)
+ { cancelDeleteButton.Text = (task.Id == 0 ? "Cancel" : "Delete"); }
+
+ // name
+ if(nameTextEdit != null) { nameTextEdit.Text = task.Name; }
+
+ // notes
+ if(notesTextEdit != null) { notesTextEdit.Text = task.Symbol; }
+
+ // button clicks
+ cancelDeleteButton.Click += (sender, e) => { CancelDelete(); };
+ saveButton.Click += (sender, e) => { Save(); };
+ }
+
+ protected void Save()
+ {
+ task.Name = nameTextEdit.Text;
+ task.Symbol = notesTextEdit.Text;
+
+ StockRepository.SaveStock(task);
+ Finish();
+ }
+
+ protected void CancelDelete()
+ {
+ if(task.Id != 0) {
+ StockRepository.DeleteStock(task);
+ }
+ Finish();
+ }
+ }
+}
\ No newline at end of file
diff --git a/DataAccess/Advanced/Android/packages.config b/DataAccess/Advanced/Android/packages.config
new file mode 100644
index 000000000..2ba5a2be3
--- /dev/null
+++ b/DataAccess/Advanced/Android/packages.config
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/DataAccess/Advanced/DataAccess_Adv.sln b/DataAccess/Advanced/DataAccess_Adv.sln
new file mode 100644
index 000000000..7be4df896
--- /dev/null
+++ b/DataAccess/Advanced/DataAccess_Adv.sln
@@ -0,0 +1,70 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Android", "Android\Android.csproj", "{EA729FE3-7050-4F2F-A9E8-A950E898AEB9}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "iOS", "iOS\iOS.csproj", "{08A1E777-C427-42A1-9DB4-F7C9105E389B}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Debug|iPhone = Debug|iPhone
+ Debug|iPhoneSimulator = Debug|iPhoneSimulator
+ Debug|Mixed Platforms = Debug|Mixed Platforms
+ Release|Any CPU = Release|Any CPU
+ Release|iPhone = Release|iPhone
+ Release|iPhoneSimulator = Release|iPhoneSimulator
+ Release|Mixed Platforms = Release|Mixed Platforms
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {08A1E777-C427-42A1-9DB4-F7C9105E389B}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator
+ {08A1E777-C427-42A1-9DB4-F7C9105E389B}.Debug|Any CPU.Build.0 = Debug|iPhoneSimulator
+ {08A1E777-C427-42A1-9DB4-F7C9105E389B}.Debug|iPhone.ActiveCfg = Debug|iPhone
+ {08A1E777-C427-42A1-9DB4-F7C9105E389B}.Debug|iPhone.Build.0 = Debug|iPhone
+ {08A1E777-C427-42A1-9DB4-F7C9105E389B}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
+ {08A1E777-C427-42A1-9DB4-F7C9105E389B}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
+ {08A1E777-C427-42A1-9DB4-F7C9105E389B}.Debug|Mixed Platforms.ActiveCfg = Debug|iPhoneSimulator
+ {08A1E777-C427-42A1-9DB4-F7C9105E389B}.Debug|Mixed Platforms.Build.0 = Debug|iPhoneSimulator
+ {08A1E777-C427-42A1-9DB4-F7C9105E389B}.Release|Any CPU.ActiveCfg = Release|iPhoneSimulator
+ {08A1E777-C427-42A1-9DB4-F7C9105E389B}.Release|Any CPU.Build.0 = Release|iPhoneSimulator
+ {08A1E777-C427-42A1-9DB4-F7C9105E389B}.Release|iPhone.ActiveCfg = Release|iPhone
+ {08A1E777-C427-42A1-9DB4-F7C9105E389B}.Release|iPhone.Build.0 = Release|iPhone
+ {08A1E777-C427-42A1-9DB4-F7C9105E389B}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
+ {08A1E777-C427-42A1-9DB4-F7C9105E389B}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
+ {08A1E777-C427-42A1-9DB4-F7C9105E389B}.Release|Mixed Platforms.ActiveCfg = Release|iPhoneSimulator
+ {08A1E777-C427-42A1-9DB4-F7C9105E389B}.Release|Mixed Platforms.Build.0 = Release|iPhoneSimulator
+ {EA729FE3-7050-4F2F-A9E8-A950E898AEB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {EA729FE3-7050-4F2F-A9E8-A950E898AEB9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {EA729FE3-7050-4F2F-A9E8-A950E898AEB9}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {EA729FE3-7050-4F2F-A9E8-A950E898AEB9}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {EA729FE3-7050-4F2F-A9E8-A950E898AEB9}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {EA729FE3-7050-4F2F-A9E8-A950E898AEB9}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {EA729FE3-7050-4F2F-A9E8-A950E898AEB9}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {EA729FE3-7050-4F2F-A9E8-A950E898AEB9}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {EA729FE3-7050-4F2F-A9E8-A950E898AEB9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {EA729FE3-7050-4F2F-A9E8-A950E898AEB9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {EA729FE3-7050-4F2F-A9E8-A950E898AEB9}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {EA729FE3-7050-4F2F-A9E8-A950E898AEB9}.Release|iPhone.Build.0 = Release|Any CPU
+ {EA729FE3-7050-4F2F-A9E8-A950E898AEB9}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {EA729FE3-7050-4F2F-A9E8-A950E898AEB9}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {EA729FE3-7050-4F2F-A9E8-A950E898AEB9}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {EA729FE3-7050-4F2F-A9E8-A950E898AEB9}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {EA729FE3-7050-4F2F-A9E8-A950E898AEB9}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {EA729FE3-7050-4F2F-A9E8-A950E898AEB9}.Debug|Mixed Platforms.Deploy.0 = Debug|Any CPU
+ {EA729FE3-7050-4F2F-A9E8-A950E898AEB9}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ {EA729FE3-7050-4F2F-A9E8-A950E898AEB9}.Release|Mixed Platforms.Deploy.0 = Release|Any CPU
+ {2B22933F-2B20-49D8-B908-B87B90ADFA7B}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {2B22933F-2B20-49D8-B908-B87B90ADFA7B}.Debug|Mixed Platforms.Deploy.0 = Debug|Any CPU
+ {2B22933F-2B20-49D8-B908-B87B90ADFA7B}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ {2B22933F-2B20-49D8-B908-B87B90ADFA7B}.Release|Mixed Platforms.Deploy.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(MonoDevelopProperties) = preSolution
+ StartupItem = iOS\iOS.csproj
+ EndGlobalSection
+ GlobalSection(TestCaseManagementSettings) = postSolution
+ CategoryFile = TaskyVS.vsmdi
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/DataAccess/Advanced/Metadata.xml b/DataAccess/Advanced/Metadata.xml
new file mode 100644
index 000000000..1bcb2a20e
--- /dev/null
+++ b/DataAccess/Advanced/Metadata.xml
@@ -0,0 +1,11 @@
+
+
+ 4b278d6a-3cd4-4f92-9ed9-1eb1d949689b
+ false
+ Beginner
+ Data
+ Android, iOS
+ Indie
+ Advanced cross-platform data access
+ false
+
diff --git a/DataAccess/Advanced/iOS/AppDelegate.cs b/DataAccess/Advanced/iOS/AppDelegate.cs
new file mode 100644
index 000000000..83be64ef7
--- /dev/null
+++ b/DataAccess/Advanced/iOS/AppDelegate.cs
@@ -0,0 +1,69 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using Foundation;
+using UIKit;
+
+namespace DataAccess
+{
+ public class Application
+ {
+ // This is the main entry point of the application.
+ static void Main (string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main (args, null, "AppDelegate");
+ }
+ }
+
+ // The UIApplicationDelegate for the application. This class is responsible for launching the
+ // User Interface of the application, as well as listening (and optionally responding) to
+ // application events from iOS.
+ [Register ("AppDelegate")]
+ public partial class AppDelegate : UIApplicationDelegate
+ {
+ // class-level declarations
+
+ public override UIWindow Window {
+ get;
+ set;
+ }
+
+ public static StockDatabase Database;
+
+ public override void FinishedLaunching (UIApplication application)
+ {
+ // Ensure the database is 'created'
+ Database = new StockDatabase(StockDatabase.DatabaseFilePath);
+ }
+
+ //
+ // This method is invoked when the application is about to move from active to inactive state.
+ //
+ // OpenGL applications should use this method to pause.
+ //
+ public override void OnResignActivation (UIApplication application)
+ {
+ }
+
+ // This method should be used to release shared resources and it should store the application state.
+ // If your application supports background exection this method is called instead of WillTerminate
+ // when the user quits.
+ public override void DidEnterBackground (UIApplication application)
+ {
+ }
+
+ // This method is called as part of the transiton from background to active state.
+ public override void WillEnterForeground (UIApplication application)
+ {
+ }
+
+ // This method is called when the application is about to terminate. Save data, if needed.
+ public override void WillTerminate (UIApplication application)
+ {
+ }
+ }
+}
+
diff --git a/DataAccess/Advanced/iOS/Info.plist b/DataAccess/Advanced/iOS/Info.plist
new file mode 100644
index 000000000..a30429ae0
--- /dev/null
+++ b/DataAccess/Advanced/iOS/Info.plist
@@ -0,0 +1,28 @@
+
+
+
+
+ CFBundleDisplayName
+ Stocks
+ CFBundleIdentifier
+ com.xamarin.samples.dataaccessadv
+ CFBundleVersion
+ 1
+ MinimumOSVersion
+ 9.0
+ UIDeviceFamily
+
+ 1
+
+ UIMainStoryboardFile
+ MainStoryboard
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+
+ CFBundleName
+ Stocks
+ UILaunchStoryboardName
+ LaunchScreen
+
+
diff --git a/DataAccess/Advanced/iOS/MainStoryboard.storyboard b/DataAccess/Advanced/iOS/MainStoryboard.storyboard
new file mode 100644
index 000000000..09135f646
--- /dev/null
+++ b/DataAccess/Advanced/iOS/MainStoryboard.storyboard
@@ -0,0 +1,209 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/DataAccess/Advanced/iOS/Orm/Stock.cs b/DataAccess/Advanced/iOS/Orm/Stock.cs
new file mode 100644
index 000000000..5d6326b86
--- /dev/null
+++ b/DataAccess/Advanced/iOS/Orm/Stock.cs
@@ -0,0 +1,16 @@
+using System;
+using SQLite;
+
+namespace DataAccess {
+
+ public class Stock {
+ [PrimaryKey, AutoIncrement, Column("_id")]
+ public int Id { get; set; }
+
+ [MaxLength(8)]
+ public string Symbol { get; set; }
+
+ public string Name { get; set; }
+ }
+}
+
diff --git a/DataAccess/Advanced/iOS/Orm/StockDatabase.cs b/DataAccess/Advanced/iOS/Orm/StockDatabase.cs
new file mode 100644
index 000000000..189ee144c
--- /dev/null
+++ b/DataAccess/Advanced/iOS/Orm/StockDatabase.cs
@@ -0,0 +1,88 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using SQLite;
+
+namespace DataAccess
+{
+ public class StockDatabase : SQLiteConnection
+ {
+ static object locker = new object ();
+
+ public static string DatabaseFilePath {
+ get {
+ var sqliteFilename = "StockDB.db3";
+
+#if NETFX_CORE
+ var path = Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, sqliteFilename);
+#else
+
+#if SILVERLIGHT
+ // Windows Phone expects a local path, not absolute
+ var path = sqliteFilename;
+#else
+
+#if __ANDROID__
+ // Just use whatever directory SpecialFolder.Personal returns
+ string libraryPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); ;
+#else
+ // we need to put in /Library/ on iOS5.1 to meet Apple's iCloud terms
+ // (they don't want non-user-generated data in Documents)
+ string documentsPath = Environment.GetFolderPath (Environment.SpecialFolder.Personal); // Documents folder
+ string libraryPath = Path.Combine (documentsPath, "../Library/"); // Library folder
+#endif
+ var path = Path.Combine (libraryPath, sqliteFilename);
+#endif
+
+#endif
+ return path;
+ }
+ }
+
+ public StockDatabase (string path) : base (path)
+ {
+ // create the tables
+ CreateTable ();
+ }
+
+ public IEnumerable GetStocks ()
+ {
+ lock (locker) {
+ return (from i in Table () select i).ToList ();
+ }
+ }
+
+ public Stock GetStock (int id)
+ {
+ lock (locker) {
+ return Table().FirstOrDefault(x => x.Id == id);
+ }
+ }
+
+ public int SaveStock (Stock item)
+ {
+ lock (locker) {
+ if (item.Id != 0) {
+ Update (item);
+ return item.Id;
+ } else {
+ return Insert (item);
+ }
+ }
+ }
+
+// public int DeleteStock(int id)
+// {
+// lock (locker) {
+// return Delete (new Stock () { Id = id });
+// }
+// }
+ public int DeleteStock(Stock stock)
+ {
+ lock (locker) {
+ return Delete (stock.Id);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Camera/Camera.iOS/Resources/Default-568h@2x.png b/DataAccess/Advanced/iOS/Resources/Default-568h@2x.png
similarity index 100%
rename from Camera/Camera.iOS/Resources/Default-568h@2x.png
rename to DataAccess/Advanced/iOS/Resources/Default-568h@2x.png
diff --git a/DataAccess/Advanced/iOS/Resources/Default-Landscape@2x~ipad.png b/DataAccess/Advanced/iOS/Resources/Default-Landscape@2x~ipad.png
new file mode 100644
index 000000000..13cd433d9
Binary files /dev/null and b/DataAccess/Advanced/iOS/Resources/Default-Landscape@2x~ipad.png differ
diff --git a/DataAccess/Advanced/iOS/Resources/Default-Landscape~ipad.png b/DataAccess/Advanced/iOS/Resources/Default-Landscape~ipad.png
new file mode 100644
index 000000000..18532e3b9
Binary files /dev/null and b/DataAccess/Advanced/iOS/Resources/Default-Landscape~ipad.png differ
diff --git a/DataAccess/Advanced/iOS/Resources/Default-Portrait@2x~ipad.png b/DataAccess/Advanced/iOS/Resources/Default-Portrait@2x~ipad.png
new file mode 100644
index 000000000..becc2fe1c
Binary files /dev/null and b/DataAccess/Advanced/iOS/Resources/Default-Portrait@2x~ipad.png differ
diff --git a/DataAccess/Advanced/iOS/Resources/Default-Portrait~ipad.png b/DataAccess/Advanced/iOS/Resources/Default-Portrait~ipad.png
new file mode 100644
index 000000000..1bc6fa7f3
Binary files /dev/null and b/DataAccess/Advanced/iOS/Resources/Default-Portrait~ipad.png differ
diff --git a/Camera/Camera.iOS/Resources/Default.png b/DataAccess/Advanced/iOS/Resources/Default.png
similarity index 100%
rename from Camera/Camera.iOS/Resources/Default.png
rename to DataAccess/Advanced/iOS/Resources/Default.png
diff --git a/Camera/Camera.iOS/Resources/Default@2x.png b/DataAccess/Advanced/iOS/Resources/Default@2x.png
similarity index 100%
rename from Camera/Camera.iOS/Resources/Default@2x.png
rename to DataAccess/Advanced/iOS/Resources/Default@2x.png
diff --git a/DataAccess/Advanced/iOS/Resources/LaunchScreen.storyboard b/DataAccess/Advanced/iOS/Resources/LaunchScreen.storyboard
new file mode 100644
index 000000000..f0187e7a7
--- /dev/null
+++ b/DataAccess/Advanced/iOS/Resources/LaunchScreen.storyboard
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Camera/Camera.iOS/iTunesArtwork b/DataAccess/Advanced/iOS/Resources/iTunesArtwork.png
similarity index 100%
rename from Camera/Camera.iOS/iTunesArtwork
rename to DataAccess/Advanced/iOS/Resources/iTunesArtwork.png
diff --git a/Camera/Camera.iOS/iTunesArtwork@2x b/DataAccess/Advanced/iOS/Resources/iTunesArtwork@2x.png
similarity index 100%
rename from Camera/Camera.iOS/iTunesArtwork@2x
rename to DataAccess/Advanced/iOS/Resources/iTunesArtwork@2x.png
diff --git a/SoMA/iOS/Resources/icon-100.png b/DataAccess/Advanced/iOS/Resources/icon-100.png
similarity index 100%
rename from SoMA/iOS/Resources/icon-100.png
rename to DataAccess/Advanced/iOS/Resources/icon-100.png
diff --git a/Tasky/TaskyiOS/Resources/icon-114.png b/DataAccess/Advanced/iOS/Resources/icon-114.png
similarity index 100%
rename from Tasky/TaskyiOS/Resources/icon-114.png
rename to DataAccess/Advanced/iOS/Resources/icon-114.png
diff --git a/DataAccess/Advanced/iOS/Resources/icon-144.png b/DataAccess/Advanced/iOS/Resources/icon-144.png
new file mode 100644
index 000000000..0e17a295d
Binary files /dev/null and b/DataAccess/Advanced/iOS/Resources/icon-144.png differ
diff --git a/SoMA/iOS/Resources/icon-29.png b/DataAccess/Advanced/iOS/Resources/icon-29.png
similarity index 100%
rename from SoMA/iOS/Resources/icon-29.png
rename to DataAccess/Advanced/iOS/Resources/icon-29.png
diff --git a/SoMA/iOS/Resources/icon-50.png b/DataAccess/Advanced/iOS/Resources/icon-50.png
similarity index 100%
rename from SoMA/iOS/Resources/icon-50.png
rename to DataAccess/Advanced/iOS/Resources/icon-50.png
diff --git a/SoMA/iOS/Resources/icon-57.png b/DataAccess/Advanced/iOS/Resources/icon-57.png
similarity index 100%
rename from SoMA/iOS/Resources/icon-57.png
rename to DataAccess/Advanced/iOS/Resources/icon-57.png
diff --git a/SoMA/iOS/Resources/icon-58.png b/DataAccess/Advanced/iOS/Resources/icon-58.png
similarity index 100%
rename from SoMA/iOS/Resources/icon-58.png
rename to DataAccess/Advanced/iOS/Resources/icon-58.png
diff --git a/Camera/Camera.iOS/Resources/Icon-72.png b/DataAccess/Advanced/iOS/Resources/icon-72.png
similarity index 100%
rename from Camera/Camera.iOS/Resources/Icon-72.png
rename to DataAccess/Advanced/iOS/Resources/icon-72.png
diff --git a/DataAccess/Advanced/iOS/RootTableSource.cs b/DataAccess/Advanced/iOS/RootTableSource.cs
new file mode 100644
index 000000000..a6f47b48c
--- /dev/null
+++ b/DataAccess/Advanced/iOS/RootTableSource.cs
@@ -0,0 +1,37 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using Foundation;
+using UIKit;
+
+namespace DataAccess {
+ public class RootTableSource : UITableViewSource {
+
+ IList tableItems;
+ string cellIdentifier = "stockcell"; // in Storyboard
+
+ public RootTableSource (IEnumerable items)
+ {
+ tableItems = items.ToList();
+ }
+
+ public override nint RowsInSection (UITableView tableview, nint section)
+ {
+ return tableItems.Count;
+ }
+ public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)
+ {
+ Console.WriteLine (" Id:" + tableItems[indexPath.Row].Id + " " + tableItems[indexPath.Row].Name);
+ // in a Storyboard, Dequeue will ALWAYS return a cell,
+ UITableViewCell cell = tableView.DequeueReusableCell (cellIdentifier);
+ cell.TextLabel.Text = tableItems[indexPath.Row].Name;
+ cell.DetailTextLabel.Text = tableItems[indexPath.Row].Symbol;
+ return cell;
+ }
+
+ public Stock GetItem(int id) {
+ return tableItems[id];
+ }
+ }
+}
\ No newline at end of file
diff --git a/DataAccess/Advanced/iOS/RootViewController.cs b/DataAccess/Advanced/iOS/RootViewController.cs
new file mode 100644
index 000000000..66711aecf
--- /dev/null
+++ b/DataAccess/Advanced/iOS/RootViewController.cs
@@ -0,0 +1,74 @@
+using System;
+using System.Collections.Generic;
+using Foundation;
+using UIKit;
+
+namespace DataAccess
+{
+ public partial class RootViewController : UITableViewController
+ {
+ public RootViewController (IntPtr handle) : base (handle)
+ {
+ }
+
+ IEnumerable stocks;
+
+ public override void ViewDidLoad ()
+ {
+ base.ViewDidLoad ();
+ // Wire up the Add [+] button
+ AddButton.Clicked += (sender, e) => {
+ EditStock ();
+ };
+ }
+
+ public override void ViewWillAppear (bool animated)
+ {
+ base.ViewWillAppear (animated);
+ stocks = AppDelegate.Database.GetStocks ();
+ TableView.Source = new RootTableSource(stocks);
+ TableView.ReloadData ();
+ }
+
+ ///
+ /// Prepares for segue.
+ ///
+ ///
+ /// The prepareForSegue method is invoked whenever a segue is about to take place.
+ /// The new view controller has been loaded from the storyboard at this point but
+ /// it’s not visible yet, and we can use this opportunity to send data to it.
+ ///
+ public override void PrepareForSegue (UIStoryboardSegue segue, NSObject sender)
+ {
+ if (segue.Identifier == "StockSegue") { // set in Storyboard
+ var navctlr = segue.DestinationViewController as StockDetailViewController;
+ if (navctlr != null) {
+ var source = TableView.Source as RootTableSource;
+ var rowPath = TableView.IndexPathForSelectedRow;
+ var item = source.GetItem(rowPath.Row);
+ navctlr.SetStock(this, item);
+ }
+ }
+ }
+
+ public void EditStock () {
+ // then open the detail view to edit it
+ var detail = Storyboard.InstantiateViewController("detail") as StockDetailViewController;
+ detail.Delegate = this;
+ NavigationController.PushViewController (detail, true);
+
+ // Could to this instead of the above, but need to create 'new Stock()' in PrepareForSegue()
+ //this.PerformSegue ("StockSegue", this);
+ }
+ public void SaveStock (Stock stock) {
+ Console.WriteLine("Save "+stock.Name);
+ AppDelegate.Database.SaveStock (stock);
+ NavigationController.PopViewController(true);
+ }
+ public void DeleteStock (Stock stock) {
+ Console.WriteLine("Delete "+stock.Name);
+ AppDelegate.Database.DeleteStock (stock);
+ NavigationController.PopViewController(true);
+ }
+ }
+}
\ No newline at end of file
diff --git a/DataAccess/Advanced/iOS/RootViewController.designer.cs b/DataAccess/Advanced/iOS/RootViewController.designer.cs
new file mode 100644
index 000000000..59a2428bc
--- /dev/null
+++ b/DataAccess/Advanced/iOS/RootViewController.designer.cs
@@ -0,0 +1,28 @@
+// WARNING
+//
+// This file has been generated automatically by Xamarin Studio from the outlets and
+// actions declared in your storyboard file.
+// Manual changes to this file will not be maintained.
+//
+using Foundation;
+using System;
+using System.CodeDom.Compiler;
+using UIKit;
+
+namespace DataAccess
+{
+ [Register ("RootViewController")]
+ partial class RootViewController
+ {
+ [Outlet]
+ UIKit.UIBarButtonItem AddButton { get; set; }
+
+ void ReleaseDesignerOutlets ()
+ {
+ if (AddButton != null) {
+ AddButton.Dispose ();
+ AddButton = null;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/DataAccess/Advanced/iOS/StockDetailViewController.cs b/DataAccess/Advanced/iOS/StockDetailViewController.cs
new file mode 100644
index 000000000..ba899d03d
--- /dev/null
+++ b/DataAccess/Advanced/iOS/StockDetailViewController.cs
@@ -0,0 +1,49 @@
+// This file has been autogenerated from parsing an Objective-C header file added in Xcode.
+
+using System;
+
+using Foundation;
+using UIKit;
+
+namespace DataAccess
+{
+ public partial class StockDetailViewController : UITableViewController
+ {
+ public StockDetailViewController (IntPtr handle) : base (handle)
+ {
+ }
+
+ Stock currentStock { get; set; }
+
+ public RootViewController Delegate {get;set;}
+
+ public override void ViewDidLoad ()
+ {
+ base.ViewDidLoad ();
+ SaveButton.TouchUpInside += (sender, e) => {
+ currentStock.Name = Name.Text;
+ currentStock.Symbol = Code.Text;
+
+ Delegate.SaveStock(currentStock);
+ };
+ DeleteButton.TouchUpInside += (sender, e) => {
+ if (currentStock == null) return;
+ Delegate.DeleteStock(currentStock);
+ };
+ }
+
+ // this will be called before the view is displayed
+ public void SetStock (RootViewController d, Stock Stock) {
+ Delegate = d;
+ currentStock = Stock;
+ }
+ // when displaying, set-up the properties
+ public override void ViewWillAppear (bool animated)
+ {
+ base.ViewWillAppear (animated);
+ if (currentStock == null) currentStock = new Stock();;
+ Name.Text = currentStock.Name;
+ Code.Text = currentStock.Symbol;
+ }
+ }
+}
diff --git a/DataAccess/Advanced/iOS/StockDetailViewController.designer.cs b/DataAccess/Advanced/iOS/StockDetailViewController.designer.cs
new file mode 100644
index 000000000..c3f209fc2
--- /dev/null
+++ b/DataAccess/Advanced/iOS/StockDetailViewController.designer.cs
@@ -0,0 +1,55 @@
+// WARNING
+//
+// This file has been generated automatically by Xamarin Studio from the outlets and
+// actions declared in your storyboard file.
+// Manual changes to this file will not be maintained.
+//
+using Foundation;
+using System;
+using System.CodeDom.Compiler;
+using UIKit;
+
+namespace DataAccess
+{
+ [Register ("StockDetailViewController")]
+ partial class StockDetailViewController
+ {
+ [Outlet]
+ UIKit.UIButton SaveButton { get; set; }
+
+
+ [Outlet]
+ UIKit.UIButton DeleteButton { get; set; }
+
+
+ [Outlet]
+ UIKit.UITextField Code { get; set; }
+
+
+ [Outlet]
+ UIKit.UITextField Name { get; set; }
+
+ void ReleaseDesignerOutlets ()
+ {
+ if (Code != null) {
+ Code.Dispose ();
+ Code = null;
+ }
+
+ if (DeleteButton != null) {
+ DeleteButton.Dispose ();
+ DeleteButton = null;
+ }
+
+ if (Name != null) {
+ Name.Dispose ();
+ Name = null;
+ }
+
+ if (SaveButton != null) {
+ SaveButton.Dispose ();
+ SaveButton = null;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/DataAccess/Advanced/iOS/iOS.csproj b/DataAccess/Advanced/iOS/iOS.csproj
new file mode 100644
index 000000000..332c00283
--- /dev/null
+++ b/DataAccess/Advanced/iOS/iOS.csproj
@@ -0,0 +1,127 @@
+
+
+
+ Debug
+ iPhoneSimulator
+ 10.0.0
+ 2.0
+ {08A1E777-C427-42A1-9DB4-F7C9105E389B}
+ {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ Exe
+ DataAccess
+ Xamarin.iOS
+ v1.0
+
+
+ True
+ full
+ False
+ bin\iPhoneSimulator\Debug
+ DEBUG;
+ prompt
+ 4
+ False
+ True
+ True
+ None
+ DataAccess
+
+ i386
+ NSUrlSessionHandler
+
+
+ none
+ False
+ bin\iPhoneSimulator\Release
+ prompt
+ 4
+ False
+ None
+ DataAccess
+ NSUrlSessionHandler
+
+
+ True
+ full
+ False
+ bin\iPhone\Debug
+ DEBUG;
+ prompt
+ 4
+ False
+ iPhone Developer
+ True
+ True
+ StoryboardTables
+
+ ARMv7
+ NSUrlSessionHandler
+
+
+ none
+ False
+ bin\iPhone\Release
+ prompt
+ 4
+ False
+ iPhone Developer
+ StoryboardTables
+ ARMv7, ARM64
+ NSUrlSessionHandler
+
+
+
+
+
+
+
+ ..\packages\sqlite-net-pcl.1.1.1\lib\portable-net45+wp8+wpa81+win8+MonoAndroid10+MonoTouch10+Xamarin.iOS10\SQLite-net.dll
+
+
+
+
+
+
+
+
+
+
+ RootViewController.cs
+
+
+
+
+
+ StockDetailViewController.cs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/DataAccess/Advanced/iOS/packages.config b/DataAccess/Advanced/iOS/packages.config
new file mode 100644
index 000000000..bcdf89f57
--- /dev/null
+++ b/DataAccess/Advanced/iOS/packages.config
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/DataAccess/Basic/Android/Android.csproj b/DataAccess/Basic/Android/Android.csproj
new file mode 100644
index 000000000..3b1c2bfa4
--- /dev/null
+++ b/DataAccess/Basic/Android/Android.csproj
@@ -0,0 +1,89 @@
+
+
+
+ Debug
+ AnyCPU
+ 8.0.30703
+ 2.0
+ {BEBF76AF-22F3-43F4-965F-ED02A27631C7}
+ {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ Library
+ Properties
+ com.xamarin.sample.dataaccess
+ xamarindataaccess
+ 512
+ true
+ Resources\Resource.Designer.cs
+ Off
+ armeabi-v7a%3bx86
+
+
+ Properties\AndroidManifest.xml
+ False
+ SdkOnly
+ true
+ v6.0
+
+
+ True
+ full
+ False
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+ True
+ armeabi-v7a
+
+
+ pdbonly
+ True
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+
+
+
+
+
+ ..\packages\sqlite-net-pcl.1.1.1\lib\portable-net45+wp8+wpa81+win8+MonoAndroid10+MonoTouch10+Xamarin.iOS10\SQLite-net.dll
+
+
+
+
+
+
+
+ Ado\AdoExample.cs
+
+
+ Orm\OrmExample.cs
+
+
+
+
+ Designer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/DataAccess/Basic/Android/MainActivity.cs b/DataAccess/Basic/Android/MainActivity.cs
new file mode 100755
index 000000000..1d1f2267e
--- /dev/null
+++ b/DataAccess/Basic/Android/MainActivity.cs
@@ -0,0 +1,33 @@
+using Android.App;
+using Android.OS;
+using Android.Views;
+using Android.Widget;
+using DataAccess;
+
+namespace com.xamarin.sample.dataaccess
+{
+ [Activity(Label = "DataAccess", MainLauncher = true, Icon = "@drawable/icon")]
+ public class MainActivity : Activity
+ {
+ EditText outputText;
+ Button adoButton, ormButton;
+
+ protected override void OnCreate (Bundle bundle)
+ {
+ base.OnCreate (bundle);
+ SetContentView (Resource.Layout.MainActivity);
+
+ adoButton = FindViewById(Resource.Id.adoButton);
+ ormButton = FindViewById(Resource.Id.ormButton);
+ outputText = FindViewById(Resource.Id.outputText);
+
+ adoButton.Click += (sender, e) => {
+ outputText.Text = AdoExample.DoSomeDataAccess ();
+ };
+
+ ormButton.Click += (sender, e) => {
+ outputText.Text = OrmExample.DoSomeDataAccess ();
+ };
+ }
+ }
+}
\ No newline at end of file
diff --git a/DataAccess/Basic/Android/Properties/AndroidManifest.xml b/DataAccess/Basic/Android/Properties/AndroidManifest.xml
new file mode 100644
index 000000000..1845ca612
--- /dev/null
+++ b/DataAccess/Basic/Android/Properties/AndroidManifest.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/DataAccess/Basic/Android/Properties/AssemblyInfo.cs b/DataAccess/Basic/Android/Properties/AssemblyInfo.cs
new file mode 100755
index 000000000..90a9f94d0
--- /dev/null
+++ b/DataAccess/Basic/Android/Properties/AssemblyInfo.cs
@@ -0,0 +1,37 @@
+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("DataAccess")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("DataAccess")]
+[assembly: AssemblyCopyright("Copyright © 2013")]
+[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("a557ce8c-9dbe-4b93-8fc4-95ffc126cf14")]
+
+// 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")]
\ No newline at end of file
diff --git a/DataAccess/Basic/Android/ReadMe.txt b/DataAccess/Basic/Android/ReadMe.txt
new file mode 100755
index 000000000..7b641aa9a
--- /dev/null
+++ b/DataAccess/Basic/Android/ReadMe.txt
@@ -0,0 +1,5 @@
+There are two projects included with this solution.
+
+Honeycomb is the project that shows fragments on devices running Android 3.1 or higher.
+
+AllAndroid is the project that shows fragments on devices running Android 1.6 or higher.
\ No newline at end of file
diff --git a/DataAccess/Basic/Android/Resources/Drawable/icon.png b/DataAccess/Basic/Android/Resources/Drawable/icon.png
new file mode 100755
index 000000000..f784e5c79
Binary files /dev/null and b/DataAccess/Basic/Android/Resources/Drawable/icon.png differ
diff --git a/DataAccess/Basic/Android/Resources/Layout/MainActivity.axml b/DataAccess/Basic/Android/Resources/Layout/MainActivity.axml
new file mode 100755
index 000000000..f25c31618
--- /dev/null
+++ b/DataAccess/Basic/Android/Resources/Layout/MainActivity.axml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/DataAccess/Basic/Android/Resources/Resource.Designer.cs b/DataAccess/Basic/Android/Resources/Resource.Designer.cs
new file mode 100755
index 000000000..7d1ccc097
--- /dev/null
+++ b/DataAccess/Basic/Android/Resources/Resource.Designer.cs
@@ -0,0 +1,118 @@
+#pragma warning disable 1591
+// ------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Mono Runtime Version: 4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+// ------------------------------------------------------------------------------
+
+[assembly: Android.Runtime.ResourceDesignerAttribute("com.xamarin.sample.dataaccess.Resource", IsApplication=true)]
+
+namespace com.xamarin.sample.dataaccess
+{
+
+
+ [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;
+
+ static Drawable()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Drawable()
+ {
+ }
+ }
+
+ public partial class Id
+ {
+
+ // aapt resource value: 0x7f050001
+ public const int adoButton = 2131034113;
+
+ // aapt resource value: 0x7f050000
+ public const int linearLayout1 = 2131034112;
+
+ // aapt resource value: 0x7f050002
+ public const int ormButton = 2131034114;
+
+ // aapt resource value: 0x7f050003
+ public const int outputText = 2131034115;
+
+ static Id()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Id()
+ {
+ }
+ }
+
+ public partial class Layout
+ {
+
+ // aapt resource value: 0x7f030000
+ public const int MainActivity = 2130903040;
+
+ static Layout()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Layout()
+ {
+ }
+ }
+
+ public partial class String
+ {
+
+ // aapt resource value: 0x7f040000
+ public const int ApplicationName = 2130968576;
+
+ static String()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private String()
+ {
+ }
+ }
+ }
+}
+#pragma warning restore 1591
diff --git a/DataAccess/Basic/Android/Resources/Values/Strings.xml b/DataAccess/Basic/Android/Resources/Values/Strings.xml
new file mode 100755
index 000000000..368458bca
--- /dev/null
+++ b/DataAccess/Basic/Android/Resources/Values/Strings.xml
@@ -0,0 +1,4 @@
+
+
+ DataAccess
+
diff --git a/DataAccess/Basic/Android/packages.config b/DataAccess/Basic/Android/packages.config
new file mode 100644
index 000000000..2ba5a2be3
--- /dev/null
+++ b/DataAccess/Basic/Android/packages.config
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/DataAccess/Basic/DataAccess_Basic.sln b/DataAccess/Basic/DataAccess_Basic.sln
new file mode 100644
index 000000000..c60a55546
--- /dev/null
+++ b/DataAccess/Basic/DataAccess_Basic.sln
@@ -0,0 +1,46 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "iOS", "iOS\iOS.csproj", "{9F81A4C3-5C16-4C4C-9DB5-7D7E18FA3F13}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Android", "Android\Android.csproj", "{BEBF76AF-22F3-43F4-965F-ED02A27631C7}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|iPhoneSimulator = Debug|iPhoneSimulator
+ Release|iPhoneSimulator = Release|iPhoneSimulator
+ Debug|iPhone = Debug|iPhone
+ Release|iPhone = Release|iPhone
+ Ad-Hoc|iPhone = Ad-Hoc|iPhone
+ AppStore|iPhone = AppStore|iPhone
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {9F81A4C3-5C16-4C4C-9DB5-7D7E18FA3F13}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone
+ {9F81A4C3-5C16-4C4C-9DB5-7D7E18FA3F13}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone
+ {9F81A4C3-5C16-4C4C-9DB5-7D7E18FA3F13}.AppStore|iPhone.ActiveCfg = AppStore|iPhone
+ {9F81A4C3-5C16-4C4C-9DB5-7D7E18FA3F13}.AppStore|iPhone.Build.0 = AppStore|iPhone
+ {9F81A4C3-5C16-4C4C-9DB5-7D7E18FA3F13}.Debug|iPhone.ActiveCfg = Debug|iPhone
+ {9F81A4C3-5C16-4C4C-9DB5-7D7E18FA3F13}.Debug|iPhone.Build.0 = Debug|iPhone
+ {9F81A4C3-5C16-4C4C-9DB5-7D7E18FA3F13}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
+ {9F81A4C3-5C16-4C4C-9DB5-7D7E18FA3F13}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
+ {9F81A4C3-5C16-4C4C-9DB5-7D7E18FA3F13}.Release|iPhone.ActiveCfg = Release|iPhone
+ {9F81A4C3-5C16-4C4C-9DB5-7D7E18FA3F13}.Release|iPhone.Build.0 = Release|iPhone
+ {9F81A4C3-5C16-4C4C-9DB5-7D7E18FA3F13}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
+ {9F81A4C3-5C16-4C4C-9DB5-7D7E18FA3F13}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
+ {BEBF76AF-22F3-43F4-965F-ED02A27631C7}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
+ {BEBF76AF-22F3-43F4-965F-ED02A27631C7}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
+ {BEBF76AF-22F3-43F4-965F-ED02A27631C7}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
+ {BEBF76AF-22F3-43F4-965F-ED02A27631C7}.AppStore|iPhone.Build.0 = Debug|Any CPU
+ {BEBF76AF-22F3-43F4-965F-ED02A27631C7}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {BEBF76AF-22F3-43F4-965F-ED02A27631C7}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {BEBF76AF-22F3-43F4-965F-ED02A27631C7}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {BEBF76AF-22F3-43F4-965F-ED02A27631C7}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {BEBF76AF-22F3-43F4-965F-ED02A27631C7}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {BEBF76AF-22F3-43F4-965F-ED02A27631C7}.Release|iPhone.Build.0 = Release|Any CPU
+ {BEBF76AF-22F3-43F4-965F-ED02A27631C7}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {BEBF76AF-22F3-43F4-965F-ED02A27631C7}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(MonoDevelopProperties) = preSolution
+ StartupItem = iOS.csproj
+ EndGlobalSection
+EndGlobal
diff --git a/DataAccess/Basic/Metadata.xml b/DataAccess/Basic/Metadata.xml
new file mode 100644
index 000000000..c512580d8
--- /dev/null
+++ b/DataAccess/Basic/Metadata.xml
@@ -0,0 +1,11 @@
+
+
+ 7b04d518-008c-427d-8a91-d21c14d62da0
+ false
+ Beginner
+ Data
+ Android, iOS
+ Indie
+ Basic cross-platform data access
+ false
+
diff --git a/DataAccess/Basic/iOS/Ado/AdoExample.cs b/DataAccess/Basic/iOS/Ado/AdoExample.cs
new file mode 100644
index 000000000..f73f6c75a
--- /dev/null
+++ b/DataAccess/Basic/iOS/Ado/AdoExample.cs
@@ -0,0 +1,106 @@
+using System;
+using System.IO;
+using Mono.Data.Sqlite;
+
+namespace DataAccess
+{
+ public static class AdoExample
+ {
+ public static SqliteConnection connection;
+ public static string DoSomeDataAccess ()
+ {
+ var output = "";
+
+ string dbPath = Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.Personal), "adodemo.db3");
+
+ bool exists = File.Exists (dbPath);
+
+ if (!exists) {
+ output += "Creating database";
+ // Need to create the database and seed it with some data.
+ Mono.Data.Sqlite.SqliteConnection.CreateFile (dbPath);
+ connection = new SqliteConnection ("Data Source=" + dbPath);
+
+ connection.Open ();
+ var commands = new[] {
+ "CREATE TABLE [Items] (_id ntext, Symbol ntext);"
+ ,
+ "INSERT INTO [Items] ([_id], [Symbol]) VALUES ('1', 'AAPL')"
+ ,
+ "INSERT INTO [Items] ([_id], [Symbol]) VALUES ('2', 'GOOG')"
+ ,
+ "INSERT INTO [Items] ([_id], [Symbol]) VALUES ('3', 'MSFT')"
+ };
+ foreach (var command in commands) {
+ using (var c = connection.CreateCommand ()) {
+ c.CommandText = command;
+ var i = c.ExecuteNonQuery ();
+ output += "\n\tExecuted " + command + " (rows:" + i +")";
+ }
+ }
+ } else {
+ output += "Database already exists";
+ connection = new SqliteConnection ("Data Source=" + dbPath);
+ connection.Open ();
+ }
+
+ // query the database to prove data was inserted!
+ using (var contents = connection.CreateCommand ()) {
+ contents.CommandText = "SELECT [_id], [Symbol] from [Items]";
+ var r = contents.ExecuteReader ();
+ output += "\n=== Reading data;";
+ while (r.Read ())
+ output += String.Format ("\n\tKey={0}; Value={1}",
+ r ["_id"].ToString (),
+ r ["Symbol"].ToString ());
+ }
+ connection.Close ();
+
+ return output;
+ }
+
+ public static string MoreComplexQuery ()
+ {
+ var output = "";
+ output += "\n=== Complex query example: ";
+ string dbPath = Path.Combine (
+ Environment.GetFolderPath (Environment.SpecialFolder.Personal), "adodemo.db3");
+
+ connection = new SqliteConnection ("Data Source=" + dbPath);
+ connection.Open ();
+ using (var contents = connection.CreateCommand ()) {
+ contents.CommandText = "SELECT * FROM [Items] WHERE Symbol = 'MSFT'";
+ var r = contents.ExecuteReader ();
+ output += "\nReading data";
+ while (r.Read ())
+ output += String.Format ("\n\tKey={0}; Value={1}",
+ r ["_id"].ToString (),
+ r ["Symbol"].ToString ());
+ }
+ connection.Close ();
+
+ return output;
+ }
+
+ public static string ScalarQuery ()
+ {
+ var output = "";
+ output += "\n=== Scalar query example: ";
+ string dbPath = Path.Combine (
+ Environment.GetFolderPath (Environment.SpecialFolder.Personal), "adodemo.db3");
+
+ connection = new SqliteConnection ("Data Source=" + dbPath);
+ connection.Open ();
+ using (var contents = connection.CreateCommand ()) {
+ contents.CommandText = "SELECT COUNT(*) FROM [Items] WHERE Symbol <> 'MSFT'";
+ var i = contents.ExecuteScalar ();
+ output += "\nExecuting a scalar query";
+ output += "\n\tResult=" + i;
+ }
+ connection.Close ();
+
+ return output;
+ }
+ }
+}
+
diff --git a/DataAccess/Basic/iOS/AppDelegate.cs b/DataAccess/Basic/iOS/AppDelegate.cs
new file mode 100644
index 000000000..720465895
--- /dev/null
+++ b/DataAccess/Basic/iOS/AppDelegate.cs
@@ -0,0 +1,50 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.IO;
+using Mono.Data.Sqlite;
+using Foundation;
+using UIKit;
+
+namespace DataAccess
+{
+ public class Application
+ {
+ // This is the main entry point of the application.
+ static void Main (string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main (args, null, "AppDelegate");
+ }
+ }
+
+ // The UIApplicationDelegate for the application. This class is responsible for launching the
+ // User Interface of the application, as well as listening (and optionally responding) to
+ // application events from iOS.
+ [Register ("AppDelegate")]
+ public partial class AppDelegate : UIApplicationDelegate
+ {
+ // class-level declarations
+ UIWindow window;
+ DataAccessViewController viewController;
+
+ //
+ // This method is invoked when the application has loaded and is ready to run. In this
+ // method you should instantiate the window, load the UI into it and then make the window
+ // visible.
+ //
+ // You have 17 seconds to return from this method, or iOS will terminate your application.
+ //
+ public override bool FinishedLaunching (UIApplication app, NSDictionary options)
+ {
+ window = new UIWindow (UIScreen.MainScreen.Bounds);
+
+ viewController = new DataAccessViewController ();
+ window.RootViewController = viewController;
+ window.MakeKeyAndVisible ();
+
+ return true;
+ }
+ }
+}
\ No newline at end of file
diff --git a/DataAccess/Basic/iOS/DataAccessViewController.cs b/DataAccess/Basic/iOS/DataAccessViewController.cs
new file mode 100644
index 000000000..cd03cd42c
--- /dev/null
+++ b/DataAccess/Basic/iOS/DataAccessViewController.cs
@@ -0,0 +1,67 @@
+using System;
+using CoreGraphics;
+
+using Foundation;
+using UIKit;
+
+namespace DataAccess
+{
+ public partial class DataAccessViewController : UIViewController
+ {
+ public DataAccessViewController () : base ("DataAccessViewController", null)
+ {
+ }
+
+
+ public override void ViewDidLoad ()
+ {
+ base.ViewDidLoad ();
+
+ // Perform any additional setup after loading the view, typically from a nib.
+ OrmExampleButton.TouchUpInside += (sender, e) => {
+ OutputText.Text = OrmExample.DoSomeDataAccess ();
+
+ OutputText.Text += OrmExample.MoreComplexQuery ();
+
+ OutputText.Text += OrmExample.ScalarQuery ();
+
+ OutputText.Text += OrmExample.Get ();
+
+ OutputText.Text += OrmExample.Delete ();
+ };
+
+ AdoExampleButton.TouchUpInside += (sender, e) => {
+ OutputText.Text = AdoExample.DoSomeDataAccess ();
+
+ OutputText.Text += AdoExample.MoreComplexQuery ();
+
+ OutputText.Text += AdoExample.ScalarQuery ();
+ };
+ }
+
+ public override void DidReceiveMemoryWarning ()
+ {
+ // Releases the view if it doesn't have a superview.
+ base.DidReceiveMemoryWarning ();
+ }
+
+ public override void ViewDidUnload ()
+ {
+ base.ViewDidUnload ();
+
+ // Clear any references to subviews of the main view in order to
+ // allow the Garbage Collector to collect them sooner.
+ //
+ // e.g. myOutlet.Dispose (); myOutlet = null;
+
+ ReleaseDesignerOutlets ();
+ }
+
+ public override bool ShouldAutorotateToInterfaceOrientation (UIInterfaceOrientation toInterfaceOrientation)
+ {
+ // Return true for supported orientations
+ return (toInterfaceOrientation != UIInterfaceOrientation.PortraitUpsideDown);
+ }
+ }
+}
+
diff --git a/DataAccess/Basic/iOS/DataAccessViewController.designer.cs b/DataAccess/Basic/iOS/DataAccessViewController.designer.cs
new file mode 100644
index 000000000..b0bf7ef05
--- /dev/null
+++ b/DataAccess/Basic/iOS/DataAccessViewController.designer.cs
@@ -0,0 +1,46 @@
+// WARNING
+//
+// This file has been generated automatically by Xamarin Studio from the outlets and
+// actions declared in your storyboard file.
+// Manual changes to this file will not be maintained.
+//
+using Foundation;
+using System;
+using System.CodeDom.Compiler;
+using UIKit;
+
+namespace DataAccess
+{
+ [Register ("DataAccessViewController")]
+ partial class DataAccessViewController
+ {
+ [Outlet]
+ UIKit.UIButton AdoExampleButton { get; set; }
+
+
+ [Outlet]
+ UIKit.UIButton OrmExampleButton { get; set; }
+
+
+ [Outlet]
+ UIKit.UITextView OutputText { get; set; }
+
+ void ReleaseDesignerOutlets ()
+ {
+ if (AdoExampleButton != null) {
+ AdoExampleButton.Dispose ();
+ AdoExampleButton = null;
+ }
+
+ if (OrmExampleButton != null) {
+ OrmExampleButton.Dispose ();
+ OrmExampleButton = null;
+ }
+
+ if (OutputText != null) {
+ OutputText.Dispose ();
+ OutputText = null;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/DataAccess/Basic/iOS/DataAccessViewController.xib b/DataAccess/Basic/iOS/DataAccessViewController.xib
new file mode 100644
index 000000000..34b097f36
--- /dev/null
+++ b/DataAccess/Basic/iOS/DataAccessViewController.xib
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/DataAccess/Basic/iOS/Info.plist b/DataAccess/Basic/iOS/Info.plist
new file mode 100644
index 000000000..8c8ae7d12
--- /dev/null
+++ b/DataAccess/Basic/iOS/Info.plist
@@ -0,0 +1,24 @@
+
+
+
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ MinimumOSVersion
+ 9.0
+ CFBundleName
+ DataAccess
+ UILaunchStoryboardName
+ LaunchScreen
+ CFBundleIdentifier
+ com.xamarin.basic-data-access
+ CFBundleShortVersionString
+ 1.0
+ CFBundleVersion
+ 1.0
+
+
diff --git a/DataAccess/Basic/iOS/Orm/OrmExample.cs b/DataAccess/Basic/iOS/Orm/OrmExample.cs
new file mode 100644
index 000000000..befad76fe
--- /dev/null
+++ b/DataAccess/Basic/iOS/Orm/OrmExample.cs
@@ -0,0 +1,118 @@
+using System;
+using System.Data;
+using System.IO;
+using SQLite;
+
+namespace DataAccess {
+
+ [Table("Items")]
+ public class Stock {
+ [PrimaryKey, AutoIncrement, Column("_id")]
+ public int Id { get; set; }
+
+ [MaxLength(8)]
+ public string Symbol { get; set; }
+ }
+
+ public static class OrmExample {
+
+ ///
+ /// Output of test query
+ ///
+ public static string DoSomeDataAccess ()
+ {
+ var output = "";
+ output += "\nCreating database, if it doesn't already exist";
+ string dbPath = Path.Combine (
+ Environment.GetFolderPath (Environment.SpecialFolder.Personal), "ormdemo.db3");
+
+ var db = new SQLiteConnection (dbPath);
+ db.CreateTable ();
+
+ if (db.Table ().Count() == 0) {
+ // only insert the data if it doesn't already exist
+ var newStock = new Stock ();
+ newStock.Symbol = "AAPL";
+ db.Insert (newStock);
+
+ newStock = new Stock ();
+ newStock.Symbol = "GOOG";
+ db.Insert (newStock);
+
+ newStock = new Stock ();
+ newStock.Symbol = "MSFT";
+ db.Insert (newStock);
+ }
+
+ output += "\nReading data using Orm";
+ var table = db.Table ();
+ foreach (var s in table) {
+ output += "\n" + s.Id + " " + s.Symbol;
+ }
+
+ return output;
+ }
+
+ public static string MoreComplexQuery ()
+ {
+ var output = "";
+ output += "\nComplex query example: ";
+ string dbPath = Path.Combine (
+ Environment.GetFolderPath (Environment.SpecialFolder.Personal), "ormdemo.db3");
+
+ var db = new SQLiteConnection (dbPath);
+
+ var query = db.Query ("SELECT * FROM [Items] WHERE Symbol = ?", "MSFT");
+ foreach (var s in query) {
+ output += "\n" + s.Id + " " + s.Symbol;
+ }
+
+ return output;
+ }
+
+ public static string Get ()
+ {
+ var output = "";
+ output += "\nGet query example: ";
+ string dbPath = Path.Combine (
+ Environment.GetFolderPath (Environment.SpecialFolder.Personal), "ormdemo.db3");
+
+ var db = new SQLiteConnection (dbPath);
+
+ var returned = db.Get(2);
+
+ return output;
+ }
+
+ public static string Delete ()
+ {
+ var output = "";
+ output += "\nDelete query example: ";
+ string dbPath = Path.Combine (
+ Environment.GetFolderPath (Environment.SpecialFolder.Personal), "ormdemo.db3");
+
+ var db = new SQLiteConnection (dbPath);
+
+ var rowcount = db.Delete(new Stock(){Id=3});
+
+ return output;
+ }
+
+ public static string ScalarQuery ()
+ {
+ var output = "";
+ output += "\nScalar query example: ";
+ string dbPath = Path.Combine (
+ Environment.GetFolderPath (Environment.SpecialFolder.Personal), "ormdemo.db3");
+
+ var db = new SQLiteConnection (dbPath);
+
+ var rowcount = db.ExecuteScalar ("SELECT COUNT(*) FROM [Items] WHERE Symbol <> ?", "MSFT");
+
+ output += "\nNumber of rows : " + rowcount;
+
+ return output;
+ }
+ }
+}
+
diff --git a/DataAccess/Basic/iOS/Orm/SqliteNet.cs b/DataAccess/Basic/iOS/Orm/SqliteNet.cs
new file mode 100644
index 000000000..70e34195c
--- /dev/null
+++ b/DataAccess/Basic/iOS/Orm/SqliteNet.cs
@@ -0,0 +1,2898 @@
+//
+// Copyright (c) 2009-2012 Krueger Systems, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+#if WINDOWS_PHONE
+#define USE_CSHARP_SQLITE
+#endif
+
+using System;
+using System.Diagnostics;
+using System.Runtime.InteropServices;
+using System.Collections.Generic;
+using System.Reflection;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Threading;
+
+#if USE_CSHARP_SQLITE
+using Community.CsharpSqlite;
+using Sqlite3DatabaseHandle = Community.CsharpSqlite.Sqlite3.sqlite3;
+using Sqlite3Statement = Community.CsharpSqlite.Sqlite3.Vdbe;
+#else
+using Sqlite3DatabaseHandle = System.IntPtr;
+using Sqlite3Statement = System.IntPtr;
+#endif
+
+namespace SQLite
+{
+ public class SQLiteException : System.Exception
+ {
+ public SQLite3.Result Result { get; private set; }
+
+ protected SQLiteException (SQLite3.Result r,string message) : base(message)
+ {
+ Result = r;
+ }
+
+ public static SQLiteException New (SQLite3.Result r, string message)
+ {
+ return new SQLiteException (r, message);
+ }
+ }
+
+ [Flags]
+ public enum SQLiteOpenFlags {
+ ReadOnly = 1, ReadWrite = 2, Create = 4,
+ NoMutex = 0x8000, FullMutex = 0x10000,
+ SharedCache = 0x20000, PrivateCache = 0x40000,
+ ProtectionComplete = 0x00100000,
+ ProtectionCompleteUnlessOpen = 0x00200000,
+ ProtectionCompleteUntilFirstUserAuthentication = 0x00300000,
+ ProtectionNone = 0x00400000
+ }
+
+ ///
+ /// Represents an open connection to a SQLite database.
+ ///
+ public partial class SQLiteConnection : IDisposable
+ {
+ private bool _open;
+ private TimeSpan _busyTimeout;
+ private Dictionary _mappings = null;
+ private Dictionary _tables = null;
+ private System.Diagnostics.Stopwatch _sw;
+ private long _elapsedMilliseconds = 0;
+
+ private int _trasactionDepth = 0;
+ private Random _rand = new Random ();
+
+ public Sqlite3DatabaseHandle Handle { get; private set; }
+#if USE_CSHARP_SQLITE
+ internal static readonly Sqlite3DatabaseHandle NullHandle = null;
+#else
+ internal static readonly Sqlite3DatabaseHandle NullHandle = IntPtr.Zero;
+#endif
+
+ public string DatabasePath { get; private set; }
+
+ public bool TimeExecution { get; set; }
+
+ public bool Trace { get; set; }
+
+ public bool StoreDateTimeAsTicks { get; private set; }
+
+ ///
+ /// Constructs a new SQLiteConnection and opens a SQLite database specified by databasePath.
+ ///
+ ///
+ /// Specifies the path to the database file.
+ ///
+ ///
+ /// Specifies whether to store DateTime properties as ticks (true) or strings (false). You
+ /// absolutely do want to store them as Ticks in all new projects. The default of false is
+ /// only here for backwards compatibility. There is a *significant* speed advantage, with no
+ /// down sides, when setting storeDateTimeAsTicks = true.
+ ///
+ public SQLiteConnection (string databasePath, bool storeDateTimeAsTicks = false)
+ : this (databasePath, SQLiteOpenFlags.ReadWrite | SQLiteOpenFlags.Create, storeDateTimeAsTicks)
+ {
+ }
+
+ ///
+ /// Constructs a new SQLiteConnection and opens a SQLite database specified by databasePath.
+ ///
+ ///
+ /// Specifies the path to the database file.
+ ///
+ ///
+ /// Specifies whether to store DateTime properties as ticks (true) or strings (false). You
+ /// absolutely do want to store them as Ticks in all new projects. The default of false is
+ /// only here for backwards compatibility. There is a *significant* speed advantage, with no
+ /// down sides, when setting storeDateTimeAsTicks = true.
+ ///
+ public SQLiteConnection (string databasePath, SQLiteOpenFlags openFlags, bool storeDateTimeAsTicks = false)
+ {
+ DatabasePath = databasePath;
+
+#if NETFX_CORE
+ SQLite3.SetDirectory(/*temp directory type*/2, Windows.Storage.ApplicationData.Current.TemporaryFolder.Path);
+#endif
+
+ Sqlite3DatabaseHandle handle;
+
+#if SILVERLIGHT
+ var r = SQLite3.Open (databasePath, out handle, (int)openFlags, IntPtr.Zero);
+#else
+ // open using the byte[]
+ // in the case where the path may include Unicode
+ // force open to using UTF-8 using sqlite3_open_v2
+ var databasePathAsBytes = GetNullTerminatedUtf8 (DatabasePath);
+ var r = SQLite3.Open (databasePathAsBytes, out handle, (int) openFlags, IntPtr.Zero);
+#endif
+
+ Handle = handle;
+ if (r != SQLite3.Result.OK) {
+ throw SQLiteException.New (r, String.Format ("Could not open database file: {0} ({1})", DatabasePath, r));
+ }
+ _open = true;
+
+ StoreDateTimeAsTicks = storeDateTimeAsTicks;
+
+ BusyTimeout = TimeSpan.FromSeconds (0.1);
+ }
+
+ static SQLiteConnection ()
+ {
+ if (_preserveDuringLinkMagic) {
+ var ti = new ColumnInfo ();
+ ti.Name = "magic";
+ }
+ }
+
+ static byte[] GetNullTerminatedUtf8 (string s)
+ {
+ var utf8Length = System.Text.Encoding.UTF8.GetByteCount (s);
+ var bytes = new byte [utf8Length + 1];
+ utf8Length = System.Text.Encoding.UTF8.GetBytes(s, 0, s.Length, bytes, 0);
+ return bytes;
+ }
+
+ ///
+ /// Used to list some code that we want the MonoTouch linker
+ /// to see, but that we never want to actually execute.
+ ///
+ static bool _preserveDuringLinkMagic = false;
+
+ ///
+ /// Sets a busy handler to sleep the specified amount of time when a table is locked.
+ /// The handler will sleep multiple times until a total time of has accumulated.
+ ///
+ public TimeSpan BusyTimeout {
+ get { return _busyTimeout; }
+ set {
+ _busyTimeout = value;
+ if (Handle != NullHandle) {
+ SQLite3.BusyTimeout (Handle, (int)_busyTimeout.TotalMilliseconds);
+ }
+ }
+ }
+
+ ///
+ /// Returns the mappings from types to tables that the connection
+ /// currently understands.
+ ///
+ public IEnumerable TableMappings {
+ get {
+ if (_tables == null) {
+ return Enumerable.Empty ();
+ } else {
+ return _tables.Values;
+ }
+ }
+ }
+
+ ///
+ /// Retrieves the mapping that is automatically generated for the given type.
+ ///
+ ///
+ /// The type whose mapping to the database is returned.
+ ///
+ ///
+ /// The mapping represents the schema of the columns of the database and contains
+ /// methods to set and get properties of objects.
+ ///
+ public TableMapping GetMapping (Type type)
+ {
+ if (_mappings == null) {
+ _mappings = new Dictionary ();
+ }
+ TableMapping map;
+ if (!_mappings.TryGetValue (type.FullName, out map)) {
+ map = new TableMapping (type);
+ _mappings [type.FullName] = map;
+ }
+ return map;
+ }
+
+ ///
+ /// Retrieves the mapping that is automatically generated for the given type.
+ ///
+ ///
+ /// The mapping represents the schema of the columns of the database and contains
+ /// methods to set and get properties of objects.
+ ///
+ public TableMapping GetMapping ()
+ {
+ return GetMapping (typeof (T));
+ }
+
+ private struct IndexedColumn
+ {
+ public int Order;
+ public string ColumnName;
+ }
+
+ private struct IndexInfo
+ {
+ public string IndexName;
+ public string TableName;
+ public bool Unique;
+ public List Columns;
+ }
+
+ ///
+ /// Executes a "drop table" on the database. This is non-recoverable.
+ ///
+ public int DropTable()
+ {
+ var map = GetMapping (typeof (T));
+
+ var query = string.Format("drop table if exists \"{0}\"", map.TableName);
+
+ return Execute (query);
+ }
+
+ ///
+ /// Executes a "create table if not exists" on the database. It also
+ /// creates any specified indexes on the columns of the table. It uses
+ /// a schema automatically generated from the specified type. You can
+ /// later access this schema by calling GetMapping.
+ ///
+ ///
+ /// The number of entries added to the database schema.
+ ///
+ public int CreateTable()
+ {
+ return CreateTable(typeof (T));
+ }
+
+ ///
+ /// Executes a "create table if not exists" on the database. It also
+ /// creates any specified indexes on the columns of the table. It uses
+ /// a schema automatically generated from the specified type. You can
+ /// later access this schema by calling GetMapping.
+ ///
+ /// Type to reflect to a database table.
+ ///
+ /// The number of entries added to the database schema.
+ ///
+ public int CreateTable(Type ty)
+ {
+ if (_tables == null) {
+ _tables = new Dictionary ();
+ }
+ TableMapping map;
+ if (!_tables.TryGetValue (ty.FullName, out map)) {
+ map = GetMapping (ty);
+ _tables.Add (ty.FullName, map);
+ }
+ var query = "create table if not exists \"" + map.TableName + "\"(\n";
+
+ var decls = map.Columns.Select (p => Orm.SqlDecl (p, StoreDateTimeAsTicks));
+ var decl = string.Join (",\n", decls.ToArray ());
+ query += decl;
+ query += ")";
+
+ var count = Execute (query);
+
+ if (count == 0) { //Possible bug: This always seems to return 0?
+ // Table already exists, migrate it
+ MigrateTable (map);
+ }
+
+ var indexes = new Dictionary ();
+ foreach (var c in map.Columns) {
+ foreach (var i in c.Indices) {
+ var iname = i.Name ?? map.TableName + "_" + c.Name;
+ IndexInfo iinfo;
+ if (!indexes.TryGetValue (iname, out iinfo)) {
+ iinfo = new IndexInfo {
+ IndexName = iname,
+ TableName = map.TableName,
+ Unique = i.Unique,
+ Columns = new List ()
+ };
+ indexes.Add (iname, iinfo);
+ }
+
+ if (i.Unique != iinfo.Unique)
+ throw new Exception ("All the columns in an index must have the same value for their Unique property");
+
+ iinfo.Columns.Add (new IndexedColumn {
+ Order = i.Order,
+ ColumnName = c.Name
+ });
+ }
+ }
+
+ foreach (var indexName in indexes.Keys) {
+ var index = indexes[indexName];
+ const string sqlFormat = "create {3} index if not exists \"{0}\" on \"{1}\"(\"{2}\")";
+ var columns = String.Join("\",\"", index.Columns.OrderBy(i => i.Order).Select(i => i.ColumnName).ToArray());
+ var sql = String.Format (sqlFormat, indexName, index.TableName, columns, index.Unique ? "unique" : "");
+ count += Execute(sql);
+ }
+
+ return count;
+ }
+
+ public class ColumnInfo
+ {
+ // public int cid { get; set; }
+
+ [Column ("name")]
+ public string Name { get; set; }
+
+ // [Column ("type")]
+ // public string ColumnType { get; set; }
+
+ // public int notnull { get; set; }
+
+ // public string dflt_value { get; set; }
+
+ // public int pk { get; set; }
+
+ public override string ToString ()
+ {
+ return Name;
+ }
+ }
+
+ public IEnumerable GetTableInfo (string tableName)
+ {
+ var query = "pragma table_info(\"" + tableName + "\")";
+ return Query (query);
+ }
+
+ void MigrateTable (TableMapping map)
+ {
+ var existingCols = GetTableInfo (map.TableName);
+
+ var toBeAdded = new List ();
+
+ foreach (var p in map.Columns) {
+ var found = false;
+ foreach (var c in existingCols) {
+ found = (string.Compare (p.Name, c.Name, StringComparison.InvariantCultureIgnoreCase) == 0);
+ if (found)
+ break;
+ }
+ if (!found) {
+ toBeAdded.Add (p);
+ }
+ }
+
+ foreach (var p in toBeAdded) {
+ var addCol = "alter table \"" + map.TableName + "\" add column " + Orm.SqlDecl (p, StoreDateTimeAsTicks);
+ Execute (addCol);
+ }
+ }
+
+ ///
+ /// Creates a new SQLiteCommand. Can be overridden to provide a sub-class.
+ ///
+ ///
+ protected virtual SQLiteCommand NewCommand ()
+ {
+ return new SQLiteCommand (this);
+ }
+
+ ///
+ /// Creates a new SQLiteCommand given the command text with arguments. Place a '?'
+ /// in the command text for each of the arguments.
+ ///
+ ///
+ /// The fully escaped SQL.
+ ///
+ ///
+ /// Arguments to substitute for the occurences of '?' in the command text.
+ ///
+ ///
+ /// A
+ ///
+ public SQLiteCommand CreateCommand (string cmdText, params object[] ps)
+ {
+ if (!_open) {
+ throw SQLiteException.New (SQLite3.Result.Error, "Cannot create commands from unopened database");
+ } else {
+ var cmd = NewCommand ();
+ cmd.CommandText = cmdText;
+ foreach (var o in ps) {
+ cmd.Bind (o);
+ }
+ return cmd;
+ }
+ }
+
+ ///
+ /// Creates a SQLiteCommand given the command text (SQL) with arguments. Place a '?'
+ /// in the command text for each of the arguments and then executes that command.
+ /// Use this method instead of Query when you don't expect rows back. Such cases include
+ /// INSERTs, UPDATEs, and DELETEs.
+ /// You can set the Trace or TimeExecution properties of the connection
+ /// to profile execution.
+ ///
+ ///
+ /// The fully escaped SQL.
+ ///
+ ///
+ /// Arguments to substitute for the occurences of '?' in the query.
+ ///
+ ///
+ /// The number of rows modified in the database as a result of this execution.
+ ///
+ public int Execute (string query, params object[] args)
+ {
+ var cmd = CreateCommand (query, args);
+
+ if (TimeExecution) {
+ if (_sw == null) {
+ _sw = new System.Diagnostics.Stopwatch ();
+ }
+ _sw.Reset ();
+ _sw.Start ();
+ }
+
+ var r = cmd.ExecuteNonQuery ();
+
+ if (TimeExecution) {
+ _sw.Stop ();
+ _elapsedMilliseconds += _sw.ElapsedMilliseconds;
+ Debug.WriteLine (string.Format ("Finished in {0} ms ({1:0.0} s total)", _sw.ElapsedMilliseconds, _elapsedMilliseconds / 1000.0));
+ }
+
+ return r;
+ }
+
+ public T ExecuteScalar (string query, params object[] args)
+ {
+ var cmd = CreateCommand (query, args);
+
+ if (TimeExecution) {
+ if (_sw == null) {
+ _sw = new System.Diagnostics.Stopwatch ();
+ }
+ _sw.Reset ();
+ _sw.Start ();
+ }
+
+ var r = cmd.ExecuteScalar ();
+
+ if (TimeExecution) {
+ _sw.Stop ();
+ _elapsedMilliseconds += _sw.ElapsedMilliseconds;
+ Debug.WriteLine (string.Format ("Finished in {0} ms ({1:0.0} s total)", _sw.ElapsedMilliseconds, _elapsedMilliseconds / 1000.0));
+ }
+
+ return r;
+ }
+
+ ///
+ /// Creates a SQLiteCommand given the command text (SQL) with arguments. Place a '?'
+ /// in the command text for each of the arguments and then executes that command.
+ /// It returns each row of the result using the mapping automatically generated for
+ /// the given type.
+ ///
+ ///
+ /// The fully escaped SQL.
+ ///
+ ///
+ /// Arguments to substitute for the occurences of '?' in the query.
+ ///
+ ///
+ /// An enumerable with one result for each row returned by the query.
+ ///
+ public List Query (string query, params object[] args) where T : new()
+ {
+ var cmd = CreateCommand (query, args);
+ return cmd.ExecuteQuery ();
+ }
+
+ ///
+ /// Creates a SQLiteCommand given the command text (SQL) with arguments. Place a '?'
+ /// in the command text for each of the arguments and then executes that command.
+ /// It returns each row of the result using the mapping automatically generated for
+ /// the given type.
+ ///
+ ///
+ /// The fully escaped SQL.
+ ///
+ ///
+ /// Arguments to substitute for the occurences of '?' in the query.
+ ///
+ ///
+ /// An enumerable with one result for each row returned by the query.
+ /// The enumerator will call sqlite3_step on each call to MoveNext, so the database
+ /// connection must remain open for the lifetime of the enumerator.
+ ///
+ public IEnumerable DeferredQuery(string query, params object[] args) where T : new()
+ {
+ var cmd = CreateCommand(query, args);
+ return cmd.ExecuteDeferredQuery();
+ }
+
+ ///
+ /// Creates a SQLiteCommand given the command text (SQL) with arguments. Place a '?'
+ /// in the command text for each of the arguments and then executes that command.
+ /// It returns each row of the result using the specified mapping. This function is
+ /// only used by libraries in order to query the database via introspection. It is
+ /// normally not used.
+ ///
+ ///
+ /// A to use to convert the resulting rows
+ /// into objects.
+ ///
+ ///
+ /// The fully escaped SQL.
+ ///
+ ///
+ /// Arguments to substitute for the occurences of '?' in the query.
+ ///
+ ///
+ /// An enumerable with one result for each row returned by the query.
+ ///
+ public List Query (TableMapping map, string query, params object[] args)
+ {
+ var cmd = CreateCommand (query, args);
+ return cmd.ExecuteQuery (map);
+ }
+
+ ///
+ /// Creates a SQLiteCommand given the command text (SQL) with arguments. Place a '?'
+ /// in the command text for each of the arguments and then executes that command.
+ /// It returns each row of the result using the specified mapping. This function is
+ /// only used by libraries in order to query the database via introspection. It is
+ /// normally not used.
+ ///
+ ///
+ /// A to use to convert the resulting rows
+ /// into objects.
+ ///
+ ///
+ /// The fully escaped SQL.
+ ///
+ ///
+ /// Arguments to substitute for the occurences of '?' in the query.
+ ///
+ ///
+ /// An enumerable with one result for each row returned by the query.
+ /// The enumerator will call sqlite3_step on each call to MoveNext, so the database
+ /// connection must remain open for the lifetime of the enumerator.
+ ///
+ public IEnumerable DeferredQuery(TableMapping map, string query, params object[] args)
+ {
+ var cmd = CreateCommand(query, args);
+ return cmd.ExecuteDeferredQuery(map);
+ }
+
+ ///
+ /// Returns a queryable interface to the table represented by the given type.
+ ///
+ ///
+ /// A queryable object that is able to translate Where, OrderBy, and Take
+ /// queries into native SQL.
+ ///
+ public TableQuery Table () where T : new()
+ {
+ return new TableQuery (this);
+ }
+
+ ///
+ /// Attempts to retrieve an object with the given primary key from the table
+ /// associated with the specified type. Use of this method requires that
+ /// the given type have a designated PrimaryKey (using the PrimaryKeyAttribute).
+ ///
+ ///
+ /// The primary key.
+ ///
+ ///
+ /// The object with the given primary key. Throws a not found exception
+ /// if the object is not found.
+ ///
+ public T Get (object pk) where T : new()
+ {
+ var map = GetMapping (typeof(T));
+ return Query (map.GetByPrimaryKeySql, pk).First ();
+ }
+
+ ///
+ /// Attempts to retrieve the first object that matches the predicate from the table
+ /// associated with the specified type.
+ ///
+ ///
+ /// A predicate for which object to find.
+ ///
+ ///
+ /// The object that matches the given predicate. Throws a not found exception
+ /// if the object is not found.
+ ///
+ public T Get (Expression> predicate) where T : new()
+ {
+ return Table ().Where (predicate).First ();
+ }
+
+ ///
+ /// Attempts to retrieve an object with the given primary key from the table
+ /// associated with the specified type. Use of this method requires that
+ /// the given type have a designated PrimaryKey (using the PrimaryKeyAttribute).
+ ///
+ ///
+ /// The primary key.
+ ///
+ ///
+ /// The object with the given primary key or null
+ /// if the object is not found.
+ ///
+ public T Find (object pk) where T : new ()
+ {
+ var map = GetMapping (typeof (T));
+ return Query (map.GetByPrimaryKeySql, pk).FirstOrDefault ();
+ }
+
+ ///
+ /// Attempts to retrieve an object with the given primary key from the table
+ /// associated with the specified type. Use of this method requires that
+ /// the given type have a designated PrimaryKey (using the PrimaryKeyAttribute).
+ ///
+ ///
+ /// The primary key.
+ ///
+ ///
+ /// The TableMapping used to identify the object type.
+ ///
+ ///
+ /// The object with the given primary key or null
+ /// if the object is not found.
+ ///
+ public object Find (object pk, TableMapping map)
+ {
+ return Query (map, map.GetByPrimaryKeySql, pk).FirstOrDefault ();
+ }
+
+ ///
+ /// Attempts to retrieve the first object that matches the predicate from the table
+ /// associated with the specified type.
+ ///
+ ///
+ /// A predicate for which object to find.
+ ///
+ ///
+ /// The object that matches the given predicate or null
+ /// if the object is not found.
+ ///
+ public T Find (Expression> predicate) where T : new()
+ {
+ return Table ().Where (predicate).FirstOrDefault ();
+ }
+
+ ///
+ /// Whether has been called and the database is waiting for a .
+ ///
+ public bool IsInTransaction {
+ get { return _trasactionDepth > 0; }
+ }
+
+ ///
+ /// Begins a new transaction. Call to end the transaction.
+ ///
+ /// Throws if a transaction has already begun.
+ public void BeginTransaction ()
+ {
+ // The BEGIN command only works if the transaction stack is empty,
+ // or in other words if there are no pending transactions.
+ // If the transaction stack is not empty when the BEGIN command is invoked,
+ // then the command fails with an error.
+ // Rather than crash with an error, we will just ignore calls to BeginTransaction
+ // that would result in an error.
+ if (Interlocked.CompareExchange (ref _trasactionDepth, 1, 0) == 0) {
+ try {
+ Execute ("begin transaction");
+ } catch (Exception ex) {
+ var sqlExp = ex as SQLiteException;
+ if (sqlExp != null) {
+ // It is recommended that applications respond to the errors listed below
+ // by explicitly issuing a ROLLBACK command.
+ // TODO: This rollback failsafe should be localized to all throw sites.
+ switch (sqlExp.Result) {
+ case SQLite3.Result.IOError:
+ case SQLite3.Result.Full:
+ case SQLite3.Result.Busy:
+ case SQLite3.Result.NoMem:
+ case SQLite3.Result.Interrupt:
+ RollbackTo (null, true);
+ break;
+ }
+ } else {
+ // Call decrement and not VolatileWrite in case we've already
+ // created a transaction point in SaveTransactionPoint since the catch.
+ Interlocked.Decrement (ref _trasactionDepth);
+ }
+
+ throw;
+ }
+ } else {
+ // Calling BeginTransaction on an already open transaction is invalid
+ throw new System.InvalidOperationException ("Cannot begin a transaction while already in a transaction.");
+ }
+ }
+
+ ///
+ /// Creates a savepoint in the database at the current point in the transaction timeline.
+ /// Begins a new transaction if one is not in progress.
+ ///
+ /// Call to undo transactions since the returned savepoint.
+ /// Call to commit transactions after the savepoint returned here.
+ /// Call to end the transaction, committing all changes.
+ ///
+ /// A string naming the savepoint.
+ public string SaveTransactionPoint ()
+ {
+ int depth = Interlocked.Increment (ref _trasactionDepth) - 1;
+ string retVal = "S" + (short)_rand.Next (short.MaxValue) + "D" + depth;
+
+ try {
+ Execute ("savepoint " + retVal);
+ } catch (Exception ex) {
+ var sqlExp = ex as SQLiteException;
+ if (sqlExp != null) {
+ // It is recommended that applications respond to the errors listed below
+ // by explicitly issuing a ROLLBACK command.
+ // TODO: This rollback failsafe should be localized to all throw sites.
+ switch (sqlExp.Result) {
+ case SQLite3.Result.IOError:
+ case SQLite3.Result.Full:
+ case SQLite3.Result.Busy:
+ case SQLite3.Result.NoMem:
+ case SQLite3.Result.Interrupt:
+ RollbackTo (null, true);
+ break;
+ }
+ } else {
+ Interlocked.Decrement (ref _trasactionDepth);
+ }
+
+ throw;
+ }
+
+ return retVal;
+ }
+
+ ///
+ /// Rolls back the transaction that was begun by or .
+ ///
+ public void Rollback ()
+ {
+ RollbackTo (null, false);
+ }
+
+ ///
+ /// Rolls back the savepoint created by or SaveTransactionPoint.
+ ///
+ /// The name of the savepoint to roll back to, as returned by . If savepoint is null or empty, this method is equivalent to a call to
+ public void RollbackTo (string savepoint)
+ {
+ RollbackTo (savepoint, false);
+ }
+
+ ///
+ /// Rolls back the transaction that was begun by .
+ ///
+ /// true to avoid throwing exceptions, false otherwise
+ private void RollbackTo (string savepoint, bool noThrow)
+ {
+ // Rolling back without a TO clause rolls backs all transactions
+ // and leaves the transaction stack empty.
+ try {
+ if (String.IsNullOrEmpty (savepoint)) {
+ if (Interlocked.Exchange (ref _trasactionDepth, 0) > 0) {
+ Execute ("rollback");
+ }
+ } else {
+ DoSavePointExecute (savepoint, "rollback to ");
+ }
+ } catch (SQLiteException) {
+ if (!noThrow)
+ throw;
+
+ }
+ // No need to rollback if there are no transactions open.
+ }
+
+ ///
+ /// Releases a savepoint returned from . Releasing a savepoint
+ /// makes changes since that savepoint permanent if the savepoint began the transaction,
+ /// or otherwise the changes are permanent pending a call to .
+ ///
+ /// The RELEASE command is like a COMMIT for a SAVEPOINT.
+ ///
+ /// The name of the savepoint to release. The string should be the result of a call to
+ public void Release (string savepoint)
+ {
+ DoSavePointExecute (savepoint, "release ");
+ }
+
+ private void DoSavePointExecute (string savepoint, string cmd)
+ {
+ // Validate the savepoint
+ int firstLen = savepoint.IndexOf ('D');
+ if (firstLen >= 2 && savepoint.Length > firstLen + 1) {
+ int depth;
+ if (Int32.TryParse (savepoint.Substring (firstLen + 1), out depth)) {
+ // TODO: Mild race here, but inescapable without locking almost everywhere.
+ if (0 <= depth && depth < _trasactionDepth) {
+#if NETFX_CORE
+ Volatile.Write (ref _trasactionDepth, depth);
+#elif SILVERLIGHT
+ _trasactionDepth = depth;
+#else
+ Thread.VolatileWrite (ref _trasactionDepth, depth);
+#endif
+ Execute (cmd + savepoint);
+ return;
+ }
+ }
+ }
+
+ throw new ArgumentException ("savePoint", "savePoint is not valid, and should be the result of a call to SaveTransactionPoint.");
+ }
+
+ ///
+ /// Commits the transaction that was begun by .
+ ///
+ public void Commit ()
+ {
+ if (Interlocked.Exchange (ref _trasactionDepth, 0) != 0) {
+ Execute ("commit");
+ }
+ // Do nothing on a commit with no open transaction
+ }
+
+ ///
+ /// Executes within a (possibly nested) transaction by wrapping it in a SAVEPOINT. If an
+ /// exception occurs the whole transaction is rolled back, not just the current savepoint. The exception
+ /// is rethrown.
+ ///
+ ///
+ /// The to perform within a transaction. can contain any number
+ /// of operations on the connection but should never call or
+ /// .
+ ///
+ public void RunInTransaction (Action action)
+ {
+ try {
+ var savePoint = SaveTransactionPoint ();
+ action ();
+ Release (savePoint);
+ } catch (Exception) {
+ Rollback ();
+ throw;
+ }
+ }
+
+ ///
+ /// Inserts all specified objects.
+ ///
+ ///
+ /// An of the objects to insert.
+ ///
+ ///
+ /// The number of rows added to the table.
+ ///
+ public int InsertAll (System.Collections.IEnumerable objects)
+ {
+ var c = 0;
+ RunInTransaction(() => {
+ foreach (var r in objects) {
+ c += Insert (r);
+ }
+ });
+ return c;
+ }
+
+ ///
+ /// Inserts all specified objects.
+ ///
+ ///
+ /// An of the objects to insert.
+ ///
+ ///
+ /// Literal SQL code that gets placed into the command. INSERT {extra} INTO ...
+ ///
+ ///
+ /// The number of rows added to the table.
+ ///
+ public int InsertAll (System.Collections.IEnumerable objects, string extra)
+ {
+ var c = 0;
+ RunInTransaction (() => {
+ foreach (var r in objects) {
+ c += Insert (r, extra);
+ }
+ });
+ return c;
+ }
+
+ ///
+ /// Inserts all specified objects.
+ ///
+ ///
+ /// An of the objects to insert.
+ ///
+ ///
+ /// The type of object to insert.
+ ///
+ ///
+ /// The number of rows added to the table.
+ ///
+ public int InsertAll (System.Collections.IEnumerable objects, Type objType)
+ {
+ var c = 0;
+ RunInTransaction (() => {
+ foreach (var r in objects) {
+ c += Insert (r, objType);
+ }
+ });
+ return c;
+ }
+
+ ///
+ /// Inserts the given object and retrieves its
+ /// auto incremented primary key if it has one.
+ ///
+ ///
+ /// The object to insert.
+ ///
+ ///
+ /// The number of rows added to the table.
+ ///
+ public int Insert (object obj)
+ {
+ if (obj == null) {
+ return 0;
+ }
+ return Insert (obj, "", obj.GetType ());
+ }
+
+ ///
+ /// Inserts the given object and retrieves its
+ /// auto incremented primary key if it has one.
+ /// If a UNIQUE constraint violation occurs with
+ /// some pre-existing object, this function deletes
+ /// the old object.
+ ///
+ ///
+ /// The object to insert.
+ ///
+ ///
+ /// The number of rows modified.
+ ///
+ public int InsertOrReplace (object obj)
+ {
+ if (obj == null) {
+ return 0;
+ }
+ return Insert (obj, "OR REPLACE", obj.GetType ());
+ }
+
+ ///
+ /// Inserts the given object and retrieves its
+ /// auto incremented primary key if it has one.
+ ///
+ ///
+ /// The object to insert.
+ ///
+ ///
+ /// The type of object to insert.
+ ///
+ ///
+ /// The number of rows added to the table.
+ ///
+ public int Insert (object obj, Type objType)
+ {
+ return Insert (obj, "", objType);
+ }
+
+ ///
+ /// Inserts the given object and retrieves its
+ /// auto incremented primary key if it has one.
+ /// If a UNIQUE constraint violation occurs with
+ /// some pre-existing object, this function deletes
+ /// the old object.
+ ///
+ ///
+ /// The object to insert.
+ ///
+ ///
+ /// The type of object to insert.
+ ///
+ ///
+ /// The number of rows modified.
+ ///
+ public int InsertOrReplace (object obj, Type objType)
+ {
+ return Insert (obj, "OR REPLACE", objType);
+ }
+
+ ///
+ /// Inserts the given object and retrieves its
+ /// auto incremented primary key if it has one.
+ ///
+ ///
+ /// The object to insert.
+ ///
+ ///
+ /// Literal SQL code that gets placed into the command. INSERT {extra} INTO ...
+ ///
+ ///
+ /// The number of rows added to the table.
+ ///
+ public int Insert (object obj, string extra)
+ {
+ if (obj == null) {
+ return 0;
+ }
+ return Insert (obj, extra, obj.GetType ());
+ }
+
+ ///
+ /// Inserts the given object and retrieves its
+ /// auto incremented primary key if it has one.
+ ///
+ ///
+ /// The object to insert.
+ ///
+ ///
+ /// Literal SQL code that gets placed into the command. INSERT {extra} INTO ...
+ ///
+ ///
+ /// The type of object to insert.
+ ///
+ ///
+ /// The number of rows added to the table.
+ ///
+ public int Insert (object obj, string extra, Type objType)
+ {
+ if (obj == null || objType == null) {
+ return 0;
+ }
+
+ var map = GetMapping (objType);
+
+ var replacing = string.Compare (extra, "OR REPLACE", StringComparison.InvariantCultureIgnoreCase) == 0;
+
+ var cols = replacing ? map.InsertOrReplaceColumns : map.InsertColumns;
+ var vals = new object[cols.Length];
+ for (var i = 0; i < vals.Length; i++) {
+ vals [i] = cols [i].GetValue (obj);
+ }
+
+ var insertCmd = map.GetInsertCommand (this, extra);
+ var count = insertCmd.ExecuteNonQuery (vals);
+
+ if (map.HasAutoIncPK) {
+ var id = SQLite3.LastInsertRowid (Handle);
+ map.SetAutoIncPK (obj, id);
+ }
+
+ return count;
+ }
+
+ ///
+ /// Updates all of the columns of a table using the specified object
+ /// except for its primary key.
+ /// The object is required to have a primary key.
+ ///
+ ///
+ /// The object to update. It must have a primary key designated using the PrimaryKeyAttribute.
+ ///
+ ///
+ /// The number of rows updated.
+ ///
+ public int Update (object obj)
+ {
+ if (obj == null) {
+ return 0;
+ }
+ return Update (obj, obj.GetType ());
+ }
+
+ ///
+ /// Updates all of the columns of a table using the specified object
+ /// except for its primary key.
+ /// The object is required to have a primary key.
+ ///
+ ///
+ /// The object to update. It must have a primary key designated using the PrimaryKeyAttribute.
+ ///
+ ///
+ /// The type of object to insert.
+ ///
+ ///
+ /// The number of rows updated.
+ ///
+ public int Update (object obj, Type objType)
+ {
+ if (obj == null || objType == null) {
+ return 0;
+ }
+
+ var map = GetMapping (objType);
+
+ var pk = map.PK;
+
+ if (pk == null) {
+ throw new NotSupportedException ("Cannot update " + map.TableName + ": it has no PK");
+ }
+
+ var cols = from p in map.Columns
+ where p != pk
+ select p;
+ var vals = from c in cols
+ select c.GetValue (obj);
+ var ps = new List (vals);
+ ps.Add (pk.GetValue (obj));
+ var q = string.Format ("update \"{0}\" set {1} where {2} = ? ", map.TableName, string.Join (",", (from c in cols
+ select "\"" + c.Name + "\" = ? ").ToArray ()), pk.Name);
+ return Execute (q, ps.ToArray ());
+ }
+
+ ///
+ /// Updates all specified objects.
+ ///
+ ///
+ /// An of the objects to insert.
+ ///
+ ///
+ /// The number of rows modified.
+ ///
+ public int UpdateAll (System.Collections.IEnumerable objects)
+ {
+ var c = 0;
+ RunInTransaction (() => {
+ foreach (var r in objects) {
+ c += Update (r);
+ }
+ });
+ return c;
+ }
+
+ ///
+ /// Deletes the given object from the database using its primary key.
+ ///
+ ///
+ /// The object to delete. It must have a primary key designated using the PrimaryKeyAttribute.
+ ///
+ ///
+ /// The number of rows deleted.
+ ///
+ public int Delete (object objectToDelete)
+ {
+ var map = GetMapping (objectToDelete.GetType ());
+ var pk = map.PK;
+ if (pk == null) {
+ throw new NotSupportedException ("Cannot delete " + map.TableName + ": it has no PK");
+ }
+ var q = string.Format ("delete from \"{0}\" where \"{1}\" = ?", map.TableName, pk.Name);
+ return Execute (q, pk.GetValue (objectToDelete));
+ }
+
+ ///
+ /// Deletes the object with the specified primary key.
+ ///
+ ///
+ /// The primary key of the object to delete.
+ ///
+ ///
+ /// The number of objects deleted.
+ ///
+ ///
+ /// The type of object.
+ ///
+ public int Delete (object primaryKey)
+ {
+ var map = GetMapping (typeof (T));
+ var pk = map.PK;
+ if (pk == null) {
+ throw new NotSupportedException ("Cannot delete " + map.TableName + ": it has no PK");
+ }
+ var q = string.Format ("delete from \"{0}\" where \"{1}\" = ?", map.TableName, pk.Name);
+ return Execute (q, primaryKey);
+ }
+
+ ///
+ /// Deletes all the objects from the specified table.
+ /// WARNING WARNING: Let me repeat. It deletes ALL the objects from the
+ /// specified table. Do you really want to do that?
+ ///
+ ///
+ /// The number of objects deleted.
+ ///
+ ///
+ /// The type of objects to delete.
+ ///
+ public int DeleteAll ()
+ {
+ var map = GetMapping (typeof (T));
+ var query = string.Format("delete from \"{0}\"", map.TableName);
+ return Execute (query);
+ }
+
+ ~SQLiteConnection ()
+ {
+ Dispose (false);
+ }
+
+ public void Dispose ()
+ {
+ Dispose (true);
+ GC.SuppressFinalize (this);
+ }
+
+ protected virtual void Dispose (bool disposing)
+ {
+ Close ();
+ }
+
+ public void Close ()
+ {
+ if (_open && Handle != NullHandle) {
+ try {
+ if (_mappings != null) {
+ foreach (var sqlInsertCommand in _mappings.Values) {
+ sqlInsertCommand.Dispose();
+ }
+ }
+ var r = SQLite3.Close (Handle);
+ if (r != SQLite3.Result.OK) {
+ string msg = SQLite3.GetErrmsg (Handle);
+ throw SQLiteException.New (r, msg);
+ }
+ }
+ finally {
+ Handle = NullHandle;
+ _open = false;
+ }
+ }
+ }
+ }
+
+ ///
+ /// Represents a parsed connection string.
+ ///
+ class SQLiteConnectionString
+ {
+ public string ConnectionString { get; private set; }
+ public string DatabasePath { get; private set; }
+ public bool StoreDateTimeAsTicks { get; private set; }
+
+#if NETFX_CORE
+ static readonly string MetroStyleDataPath = Windows.Storage.ApplicationData.Current.LocalFolder.Path;
+#endif
+
+ public SQLiteConnectionString (string databasePath, bool storeDateTimeAsTicks)
+ {
+ ConnectionString = databasePath;
+ StoreDateTimeAsTicks = storeDateTimeAsTicks;
+
+#if NETFX_CORE
+ DatabasePath = System.IO.Path.Combine (MetroStyleDataPath, databasePath);
+#else
+ DatabasePath = databasePath;
+#endif
+ }
+ }
+
+ [AttributeUsage (AttributeTargets.Class)]
+ public class TableAttribute : Attribute
+ {
+ public string Name { get; set; }
+
+ public TableAttribute (string name)
+ {
+ Name = name;
+ }
+ }
+
+ [AttributeUsage (AttributeTargets.Property)]
+ public class ColumnAttribute : Attribute
+ {
+ public string Name { get; set; }
+
+ public ColumnAttribute (string name)
+ {
+ Name = name;
+ }
+ }
+
+ [AttributeUsage (AttributeTargets.Property)]
+ public class PrimaryKeyAttribute : Attribute
+ {
+ }
+
+ [AttributeUsage (AttributeTargets.Property)]
+ public class AutoIncrementAttribute : Attribute
+ {
+ }
+
+ [AttributeUsage (AttributeTargets.Property)]
+ public class IndexedAttribute : Attribute
+ {
+ public string Name { get; set; }
+ public int Order { get; set; }
+ public virtual bool Unique { get; set; }
+
+ public IndexedAttribute()
+ {
+ }
+
+ public IndexedAttribute(string name, int order)
+ {
+ Name = name;
+ Order = order;
+ }
+ }
+
+ [AttributeUsage (AttributeTargets.Property)]
+ public class IgnoreAttribute : Attribute
+ {
+ }
+
+ [AttributeUsage (AttributeTargets.Property)]
+ public class UniqueAttribute : IndexedAttribute
+ {
+ public override bool Unique {
+ get { return true; }
+ set { /* throw? */ }
+ }
+ }
+
+ [AttributeUsage (AttributeTargets.Property)]
+ public class MaxLengthAttribute : Attribute
+ {
+ public int Value { get; private set; }
+
+ public MaxLengthAttribute (int length)
+ {
+ Value = length;
+ }
+ }
+
+ [AttributeUsage (AttributeTargets.Property)]
+ public class CollationAttribute: Attribute
+ {
+ public string Value { get; private set; }
+
+ public CollationAttribute (string collation)
+ {
+ Value = collation;
+ }
+ }
+
+ public class TableMapping
+ {
+ public Type MappedType { get; private set; }
+
+ public string TableName { get; private set; }
+
+ public Column[] Columns { get; private set; }
+
+ public Column PK { get; private set; }
+
+ public string GetByPrimaryKeySql { get; private set; }
+
+ Column _autoPk = null;
+ Column[] _insertColumns = null;
+ Column[] _insertOrReplaceColumns = null;
+
+ public TableMapping (Type type)
+ {
+ MappedType = type;
+
+#if NETFX_CORE
+ var tableAttr = (TableAttribute)System.Reflection.CustomAttributeExtensions
+ .GetCustomAttribute(type.GetTypeInfo(), typeof(TableAttribute), true);
+#else
+ var tableAttr = (TableAttribute)type.GetCustomAttributes (typeof (TableAttribute), true).FirstOrDefault ();
+#endif
+
+ TableName = tableAttr != null ? tableAttr.Name : MappedType.Name;
+
+#if !NETFX_CORE
+ var props = MappedType.GetProperties (BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty);
+#else
+ var props = from p in MappedType.GetRuntimeProperties()
+ where ((p.GetMethod != null && p.GetMethod.IsPublic) || (p.SetMethod != null && p.SetMethod.IsPublic) || (p.GetMethod != null && p.GetMethod.IsStatic) || (p.SetMethod != null && p.SetMethod.IsStatic))
+ select p;
+#endif
+ var cols = new List ();
+ foreach (var p in props) {
+#if !NETFX_CORE
+ var ignore = p.GetCustomAttributes (typeof(IgnoreAttribute), true).Length > 0;
+#else
+ var ignore = p.GetCustomAttributes (typeof(IgnoreAttribute), true).Count() > 0;
+#endif
+ if (p.CanWrite && !ignore) {
+ cols.Add (new Column (p));
+ }
+ }
+ Columns = cols.ToArray ();
+ foreach (var c in Columns) {
+ if (c.IsAutoInc && c.IsPK) {
+ _autoPk = c;
+ }
+ if (c.IsPK) {
+ PK = c;
+ }
+ }
+
+ HasAutoIncPK = _autoPk != null;
+
+ if (PK != null) {
+ GetByPrimaryKeySql = string.Format ("select * from \"{0}\" where \"{1}\" = ?", TableName, PK.Name);
+ }
+ else {
+ // People should not be calling Get/Find without a PK
+ GetByPrimaryKeySql = string.Format ("select * from \"{0}\" limit 1", TableName);
+ }
+ }
+
+ public bool HasAutoIncPK { get; private set; }
+
+ public void SetAutoIncPK (object obj, long id)
+ {
+ if (_autoPk != null) {
+ _autoPk.SetValue (obj, Convert.ChangeType (id, _autoPk.ColumnType, null));
+ }
+ }
+
+ public Column[] InsertColumns {
+ get {
+ if (_insertColumns == null) {
+ _insertColumns = Columns.Where (c => !c.IsAutoInc).ToArray ();
+ }
+ return _insertColumns;
+ }
+ }
+
+ public Column[] InsertOrReplaceColumns {
+ get {
+ if (_insertOrReplaceColumns == null) {
+ _insertOrReplaceColumns = Columns.ToArray ();
+ }
+ return _insertOrReplaceColumns;
+ }
+ }
+
+ public Column FindColumnWithPropertyName (string propertyName)
+ {
+ var exact = Columns.Where (c => c.PropertyName == propertyName).FirstOrDefault ();
+ return exact;
+ }
+
+ public Column FindColumn (string columnName)
+ {
+ var exact = Columns.Where (c => c.Name == columnName).FirstOrDefault ();
+ return exact;
+ }
+
+ PreparedSqlLiteInsertCommand _insertCommand;
+ string _insertCommandExtra = null;
+
+ public PreparedSqlLiteInsertCommand GetInsertCommand(SQLiteConnection conn, string extra)
+ {
+ if (_insertCommand == null) {
+ _insertCommand = CreateInsertCommand(conn, extra);
+ _insertCommandExtra = extra;
+ }
+ else if (_insertCommandExtra != extra) {
+ _insertCommand.Dispose();
+ _insertCommand = CreateInsertCommand(conn, extra);
+ _insertCommandExtra = extra;
+ }
+ return _insertCommand;
+ }
+
+ private PreparedSqlLiteInsertCommand CreateInsertCommand(SQLiteConnection conn, string extra)
+ {
+ var cols = InsertColumns;
+ string insertSql;
+ if (!cols.Any() && Columns.Count() == 1 && Columns[0].IsAutoInc)
+ {
+ insertSql = string.Format("insert {1} into \"{0}\" default values", TableName, extra);
+ }
+ else
+ {
+ var replacing = string.Compare (extra, "OR REPLACE", StringComparison.InvariantCultureIgnoreCase) == 0;
+
+ if (replacing) {
+ cols = InsertOrReplaceColumns;
+ }
+
+ insertSql = string.Format("insert {3} into \"{0}\"({1}) values ({2})", TableName,
+ string.Join(",", (from c in cols
+ select "\"" + c.Name + "\"").ToArray()),
+ string.Join(",", (from c in cols
+ select "?").ToArray()), extra);
+
+ }
+
+ var insertCommand = new PreparedSqlLiteInsertCommand(conn);
+ insertCommand.CommandText = insertSql;
+ return insertCommand;
+ }
+
+ protected internal void Dispose()
+ {
+ if (_insertCommand != null) {
+ _insertCommand.Dispose();
+ _insertCommand = null;
+ }
+ }
+
+ public class Column
+ {
+ PropertyInfo _prop;
+
+ public string Name { get; private set; }
+
+ public string PropertyName { get { return _prop.Name; } }
+
+ public Type ColumnType { get; private set; }
+
+ public string Collation { get; private set; }
+
+ public bool IsAutoInc { get; private set; }
+
+ public bool IsPK { get; private set; }
+
+ public IEnumerable Indices { get; set; }
+
+ public bool IsNullable { get; private set; }
+
+ public int MaxStringLength { get; private set; }
+
+ public Column (PropertyInfo prop)
+ {
+ var colAttr = (ColumnAttribute)prop.GetCustomAttributes (typeof(ColumnAttribute), true).FirstOrDefault ();
+
+ _prop = prop;
+ Name = colAttr == null ? prop.Name : colAttr.Name;
+ //If this type is Nullable then Nullable.GetUnderlyingType returns the T, otherwise it returns null, so get the the actual type instead
+ ColumnType = Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType;
+ Collation = Orm.Collation (prop);
+ IsAutoInc = Orm.IsAutoInc (prop);
+ IsPK = Orm.IsPK (prop);
+ Indices = Orm.GetIndices(prop);
+ IsNullable = !IsPK;
+ MaxStringLength = Orm.MaxStringLength (prop);
+ }
+
+ public void SetValue (object obj, object val)
+ {
+ _prop.SetValue (obj, val, null);
+ }
+
+ public object GetValue (object obj)
+ {
+ return _prop.GetValue (obj, null);
+ }
+ }
+ }
+
+ public static class Orm
+ {
+ public const int DefaultMaxStringLength = 140;
+
+ public static string SqlDecl (TableMapping.Column p, bool storeDateTimeAsTicks)
+ {
+ string decl = "\"" + p.Name + "\" " + SqlType (p, storeDateTimeAsTicks) + " ";
+
+ if (p.IsPK) {
+ decl += "primary key ";
+ }
+ if (p.IsAutoInc) {
+ decl += "autoincrement ";
+ }
+ if (!p.IsNullable) {
+ decl += "not null ";
+ }
+ if (!string.IsNullOrEmpty (p.Collation)) {
+ decl += "collate " + p.Collation + " ";
+ }
+
+ return decl;
+ }
+
+ public static string SqlType (TableMapping.Column p, bool storeDateTimeAsTicks)
+ {
+ var clrType = p.ColumnType;
+ if (clrType == typeof(Boolean) || clrType == typeof(Byte) || clrType == typeof(UInt16) || clrType == typeof(SByte) || clrType == typeof(Int16) || clrType == typeof(Int32)) {
+ return "integer";
+ } else if (clrType == typeof(UInt32) || clrType == typeof(Int64)) {
+ return "bigint";
+ } else if (clrType == typeof(Single) || clrType == typeof(Double) || clrType == typeof(Decimal)) {
+ return "float";
+ } else if (clrType == typeof(String)) {
+ int len = p.MaxStringLength;
+ return "varchar(" + len + ")";
+ } else if (clrType == typeof(DateTime)) {
+ return storeDateTimeAsTicks ? "bigint" : "datetime";
+#if !NETFX_CORE
+ } else if (clrType.IsEnum) {
+#else
+ } else if (clrType.GetTypeInfo().IsEnum) {
+#endif
+ return "integer";
+ } else if (clrType == typeof(byte[])) {
+ return "blob";
+#if SQLITE_SUPPORT_GUID
+ } else if (clrType == typeof(Guid)) {
+ return "varchar(36)";
+#endif
+ } else {
+ throw new NotSupportedException ("Don't know about " + clrType);
+ }
+ }
+
+ public static bool IsPK (MemberInfo p)
+ {
+ var attrs = p.GetCustomAttributes (typeof(PrimaryKeyAttribute), true);
+#if !NETFX_CORE
+ return attrs.Length > 0;
+#else
+ return attrs.Count() > 0;
+#endif
+ }
+
+ public static string Collation (MemberInfo p)
+ {
+ var attrs = p.GetCustomAttributes (typeof(CollationAttribute), true);
+#if !NETFX_CORE
+ if (attrs.Length > 0) {
+ return ((CollationAttribute)attrs [0]).Value;
+#else
+ if (attrs.Count() > 0) {
+ return ((CollationAttribute)attrs.First()).Value;
+#endif
+ } else {
+ return string.Empty;
+ }
+ }
+
+ public static bool IsAutoInc (MemberInfo p)
+ {
+ var attrs = p.GetCustomAttributes (typeof(AutoIncrementAttribute), true);
+#if !NETFX_CORE
+ return attrs.Length > 0;
+#else
+ return attrs.Count() > 0;
+#endif
+ }
+
+ public static IEnumerable GetIndices(MemberInfo p)
+ {
+ var attrs = p.GetCustomAttributes(typeof(IndexedAttribute), true);
+ return attrs.Cast();
+ }
+
+ public static int MaxStringLength(PropertyInfo p)
+ {
+ var attrs = p.GetCustomAttributes (typeof(MaxLengthAttribute), true);
+#if !NETFX_CORE
+ if (attrs.Length > 0) {
+ return ((MaxLengthAttribute)attrs [0]).Value;
+#else
+ if (attrs.Count() > 0) {
+ return ((MaxLengthAttribute)attrs.First()).Value;
+#endif
+ } else {
+ return DefaultMaxStringLength;
+ }
+ }
+ }
+
+ public partial class SQLiteCommand
+ {
+ SQLiteConnection _conn;
+ private List _bindings;
+
+ public string CommandText { get; set; }
+
+ internal SQLiteCommand (SQLiteConnection conn)
+ {
+ _conn = conn;
+ _bindings = new List ();
+ CommandText = "";
+ }
+
+ public int ExecuteNonQuery ()
+ {
+ if (_conn.Trace) {
+ Debug.WriteLine ("Executing: " + this);
+ }
+
+ var r = SQLite3.Result.OK;
+ var stmt = Prepare ();
+ r = SQLite3.Step (stmt);
+ Finalize (stmt);
+ if (r == SQLite3.Result.Done) {
+ int rowsAffected = SQLite3.Changes (_conn.Handle);
+ return rowsAffected;
+ } else if (r == SQLite3.Result.Error) {
+ string msg = SQLite3.GetErrmsg (_conn.Handle);
+ throw SQLiteException.New (r, msg);
+ } else {
+ throw SQLiteException.New (r, r.ToString ());
+ }
+ }
+
+ public IEnumerable ExecuteDeferredQuery ()
+ {
+ return ExecuteDeferredQuery(_conn.GetMapping(typeof(T)));
+ }
+
+ public List ExecuteQuery ()
+ {
+ return ExecuteDeferredQuery(_conn.GetMapping(typeof(T))).ToList();
+ }
+
+ public List ExecuteQuery (TableMapping map)
+ {
+ return ExecuteDeferredQuery(map).ToList();
+ }
+
+ ///
+ /// Invoked every time an instance is loaded from the database.
+ ///
+ ///
+ /// The newly created object.
+ ///
+ ///
+ /// This can be overridden in combination with the
+ /// method to hook into the life-cycle of objects.
+ ///
+ /// Type safety is not possible because MonoTouch does not support virtual generic methods.
+ ///
+ protected virtual void OnInstanceCreated (object obj)
+ {
+ // Can be overridden.
+ }
+
+ public IEnumerable ExecuteDeferredQuery (TableMapping map)
+ {
+ if (_conn.Trace) {
+ Debug.WriteLine ("Executing Query: " + this);
+ }
+
+ var stmt = Prepare ();
+ try
+ {
+ var cols = new TableMapping.Column[SQLite3.ColumnCount (stmt)];
+
+ for (int i = 0; i < cols.Length; i++) {
+ var name = SQLite3.ColumnName16 (stmt, i);
+ cols [i] = map.FindColumn (name);
+ }
+
+ while (SQLite3.Step (stmt) == SQLite3.Result.Row) {
+ var obj = Activator.CreateInstance(map.MappedType);
+ for (int i = 0; i < cols.Length; i++) {
+ if (cols [i] == null)
+ continue;
+ var colType = SQLite3.ColumnType (stmt, i);
+ var val = ReadCol (stmt, i, colType, cols [i].ColumnType);
+ cols [i].SetValue (obj, val);
+ }
+ OnInstanceCreated (obj);
+ yield return (T)obj;
+ }
+ }
+ finally
+ {
+ SQLite3.Finalize(stmt);
+ }
+ }
+
+ public T ExecuteScalar ()
+ {
+ if (_conn.Trace) {
+ Debug.WriteLine ("Executing Query: " + this);
+ }
+
+ T val = default(T);
+
+ var stmt = Prepare ();
+ if (SQLite3.Step (stmt) == SQLite3.Result.Row) {
+ var colType = SQLite3.ColumnType (stmt, 0);
+ val = (T)ReadCol (stmt, 0, colType, typeof(T));
+ }
+ Finalize (stmt);
+
+ return val;
+ }
+
+ public void Bind (string name, object val)
+ {
+ _bindings.Add (new Binding {
+ Name = name,
+ Value = val
+ });
+ }
+
+ public void Bind (object val)
+ {
+ Bind (null, val);
+ }
+
+ public override string ToString ()
+ {
+ var parts = new string[1 + _bindings.Count];
+ parts [0] = CommandText;
+ var i = 1;
+ foreach (var b in _bindings) {
+ parts [i] = string.Format (" {0}: {1}", i - 1, b.Value);
+ i++;
+ }
+ return string.Join (Environment.NewLine, parts);
+ }
+
+ Sqlite3Statement Prepare()
+ {
+ var stmt = SQLite3.Prepare2 (_conn.Handle, CommandText);
+ BindAll (stmt);
+ return stmt;
+ }
+
+ void Finalize (Sqlite3Statement stmt)
+ {
+ SQLite3.Finalize (stmt);
+ }
+
+ void BindAll (Sqlite3Statement stmt)
+ {
+ int nextIdx = 1;
+ foreach (var b in _bindings) {
+ if (b.Name != null) {
+ b.Index = SQLite3.BindParameterIndex (stmt, b.Name);
+ } else {
+ b.Index = nextIdx++;
+ }
+
+ BindParameter (stmt, b.Index, b.Value, _conn.StoreDateTimeAsTicks);
+ }
+ }
+
+ internal static IntPtr NegativePointer = new IntPtr (-1);
+
+ internal static void BindParameter (Sqlite3Statement stmt, int index, object value, bool storeDateTimeAsTicks)
+ {
+ if (value == null) {
+ SQLite3.BindNull (stmt, index);
+ } else {
+ if (value is Int32) {
+ SQLite3.BindInt (stmt, index, (int)value);
+ } else if (value is String) {
+ SQLite3.BindText (stmt, index, (string)value, -1, NegativePointer);
+ } else if (value is Byte || value is UInt16 || value is SByte || value is Int16) {
+ SQLite3.BindInt (stmt, index, Convert.ToInt32 (value));
+ } else if (value is Boolean) {
+ SQLite3.BindInt (stmt, index, (bool)value ? 1 : 0);
+ } else if (value is UInt32 || value is Int64) {
+ SQLite3.BindInt64 (stmt, index, Convert.ToInt64 (value));
+ } else if (value is Single || value is Double || value is Decimal) {
+ SQLite3.BindDouble (stmt, index, Convert.ToDouble (value));
+ } else if (value is DateTime) {
+ if (storeDateTimeAsTicks) {
+ SQLite3.BindInt64 (stmt, index, ((DateTime)value).Ticks);
+ }
+ else {
+ SQLite3.BindText (stmt, index, ((DateTime)value).ToString ("yyyy-MM-dd HH:mm:ss"), -1, NegativePointer);
+ }
+#if !NETFX_CORE
+ } else if (value.GetType().IsEnum) {
+#else
+ } else if (value.GetType().GetTypeInfo().IsEnum) {
+#endif
+ SQLite3.BindInt (stmt, index, Convert.ToInt32 (value));
+ } else if (value is byte[]){
+ SQLite3.BindBlob(stmt, index, (byte[]) value, ((byte[]) value).Length, NegativePointer);
+#if SQLITE_SUPPORT_GUID
+ } else if (value is Guid) {
+ SQLite3.BindText(stmt, index, ((Guid)value).ToString(), 72, NegativePointer);
+#endif
+ } else {
+ throw new NotSupportedException("Cannot store type: " + value.GetType());
+ }
+ }
+ }
+
+ class Binding
+ {
+ public string Name { get; set; }
+
+ public object Value { get; set; }
+
+ public int Index { get; set; }
+ }
+
+ object ReadCol (Sqlite3Statement stmt, int index, SQLite3.ColType type, Type clrType)
+ {
+ if (type == SQLite3.ColType.Null) {
+ return null;
+ } else {
+ if (clrType == typeof(String)) {
+ return SQLite3.ColumnString (stmt, index);
+ } else if (clrType == typeof(Int32)) {
+ return (int)SQLite3.ColumnInt (stmt, index);
+ } else if (clrType == typeof(Boolean)) {
+ return SQLite3.ColumnInt (stmt, index) == 1;
+ } else if (clrType == typeof(double)) {
+ return SQLite3.ColumnDouble (stmt, index);
+ } else if (clrType == typeof(float)) {
+ return (float)SQLite3.ColumnDouble (stmt, index);
+ } else if (clrType == typeof(DateTime)) {
+ if (_conn.StoreDateTimeAsTicks) {
+ return new DateTime (SQLite3.ColumnInt64 (stmt, index));
+ }
+ else {
+ var text = SQLite3.ColumnString (stmt, index);
+ return DateTime.Parse (text);
+ }
+#if !NETFX_CORE
+ } else if (clrType.IsEnum) {
+#else
+ } else if (clrType.GetTypeInfo().IsEnum) {
+#endif
+ return SQLite3.ColumnInt (stmt, index);
+ } else if (clrType == typeof(Int64)) {
+ return SQLite3.ColumnInt64 (stmt, index);
+ } else if (clrType == typeof(UInt32)) {
+ return (uint)SQLite3.ColumnInt64 (stmt, index);
+ } else if (clrType == typeof(decimal)) {
+ return (decimal)SQLite3.ColumnDouble (stmt, index);
+ } else if (clrType == typeof(Byte)) {
+ return (byte)SQLite3.ColumnInt (stmt, index);
+ } else if (clrType == typeof(UInt16)) {
+ return (ushort)SQLite3.ColumnInt (stmt, index);
+ } else if (clrType == typeof(Int16)) {
+ return (short)SQLite3.ColumnInt (stmt, index);
+ } else if (clrType == typeof(sbyte)) {
+ return (sbyte)SQLite3.ColumnInt (stmt, index);
+ } else if (clrType == typeof(byte[])) {
+ return SQLite3.ColumnByteArray (stmt, index);
+#if SQLITE_SUPPORT_GUID
+ } else if (clrType == typeof(Guid)) {
+ var text = SQLite3.ColumnString(stmt, index);
+ return new Guid(text);
+#endif
+ } else{
+ throw new NotSupportedException ("Don't know how to read " + clrType);
+ }
+ }
+ }
+ }
+
+ ///
+ /// Since the insert never changed, we only need to prepare once.
+ ///
+ public class PreparedSqlLiteInsertCommand : IDisposable
+ {
+ public bool Initialized { get; set; }
+
+ protected SQLiteConnection Connection { get; set; }
+
+ public string CommandText { get; set; }
+
+ protected Sqlite3Statement Statement { get; set; }
+#if USE_CSHARP_SQLITE
+ internal static readonly Sqlite3Statement NullStatement = null;
+#else
+ internal static readonly Sqlite3Statement NullStatement = IntPtr.Zero;
+#endif
+
+ internal PreparedSqlLiteInsertCommand (SQLiteConnection conn)
+ {
+ Connection = conn;
+ }
+
+ public int ExecuteNonQuery (object[] source)
+ {
+ if (Connection.Trace) {
+ Debug.WriteLine ("Executing: " + CommandText);
+ }
+
+ var r = SQLite3.Result.OK;
+
+ if (!Initialized) {
+ Statement = Prepare ();
+ Initialized = true;
+ }
+
+ //bind the values.
+ if (source != null) {
+ for (int i = 0; i < source.Length; i++) {
+ SQLiteCommand.BindParameter (Statement, i + 1, source [i], Connection.StoreDateTimeAsTicks);
+ }
+ }
+ r = SQLite3.Step (Statement);
+
+ if (r == SQLite3.Result.Done) {
+ int rowsAffected = SQLite3.Changes (Connection.Handle);
+ SQLite3.Reset (Statement);
+ return rowsAffected;
+ } else if (r == SQLite3.Result.Error) {
+ string msg = SQLite3.GetErrmsg (Connection.Handle);
+ SQLite3.Reset (Statement);
+ throw SQLiteException.New (r, msg);
+ } else {
+ SQLite3.Reset (Statement);
+ throw SQLiteException.New (r, r.ToString ());
+ }
+ }
+
+ protected virtual Sqlite3Statement Prepare ()
+ {
+ var stmt = SQLite3.Prepare2 (Connection.Handle, CommandText);
+ return stmt;
+ }
+
+ public void Dispose ()
+ {
+ Dispose (true);
+ GC.SuppressFinalize (this);
+ }
+
+ private void Dispose (bool disposing)
+ {
+ if (Statement != NullStatement) {
+ try {
+ SQLite3.Finalize (Statement);
+ } finally {
+ Statement = NullStatement;
+ Connection = null;
+ }
+ }
+ }
+
+ ~PreparedSqlLiteInsertCommand ()
+ {
+ Dispose (false);
+ }
+ }
+
+ public abstract class BaseTableQuery
+ {
+ protected class Ordering
+ {
+ public string ColumnName { get; set; }
+ public bool Ascending { get; set; }
+ }
+ }
+
+ public class TableQuery : BaseTableQuery, IEnumerable
+ {
+ public SQLiteConnection Connection { get; private set; }
+
+ public TableMapping Table { get; private set; }
+
+ Expression _where;
+ List _orderBys;
+ int? _limit;
+ int? _offset;
+
+ BaseTableQuery _joinInner;
+ Expression _joinInnerKeySelector;
+ BaseTableQuery _joinOuter;
+ Expression _joinOuterKeySelector;
+ Expression _joinSelector;
+
+ Expression _selector;
+
+ TableQuery (SQLiteConnection conn, TableMapping table)
+ {
+ Connection = conn;
+ Table = table;
+ }
+
+ public TableQuery (SQLiteConnection conn)
+ {
+ Connection = conn;
+ Table = Connection.GetMapping (typeof(T));
+ }
+
+ public TableQuery Clone ()
+ {
+ var q = new TableQuery (Connection, Table);
+ q._where = _where;
+ q._deferred = _deferred;
+ if (_orderBys != null) {
+ q._orderBys = new List (_orderBys);
+ }
+ q._limit = _limit;
+ q._offset = _offset;
+ q._joinInner = _joinInner;
+ q._joinInnerKeySelector = _joinInnerKeySelector;
+ q._joinOuter = _joinOuter;
+ q._joinOuterKeySelector = _joinOuterKeySelector;
+ q._joinSelector = _joinSelector;
+ q._selector = _selector;
+ return q;
+ }
+
+ public TableQuery Where (Expression> predExpr)
+ {
+ if (predExpr.NodeType == ExpressionType.Lambda) {
+ var lambda = (LambdaExpression)predExpr;
+ var pred = lambda.Body;
+ var q = Clone ();
+ q.AddWhere (pred);
+ return q;
+ } else {
+ throw new NotSupportedException ("Must be a predicate");
+ }
+ }
+
+ public TableQuery Take (int n)
+ {
+ var q = Clone ();
+ q._limit = n;
+ return q;
+ }
+
+ public TableQuery Skip (int n)
+ {
+ var q = Clone ();
+ q._offset = n;
+ return q;
+ }
+
+ public T ElementAt (int index)
+ {
+ return Skip (index).Take (1).First ();
+ }
+
+ bool _deferred = false;
+ public TableQuery Deferred ()
+ {
+ var q = Clone ();
+ q._deferred = true;
+ return q;
+ }
+
+ public TableQuery OrderBy (Expression> orderExpr)
+ {
+ return AddOrderBy (orderExpr, true);
+ }
+
+ public TableQuery OrderByDescending (Expression> orderExpr)
+ {
+ return AddOrderBy (orderExpr, false);
+ }
+
+ private TableQuery AddOrderBy (Expression> orderExpr, bool asc)
+ {
+ if (orderExpr.NodeType == ExpressionType.Lambda) {
+ var lambda = (LambdaExpression)orderExpr;
+
+ MemberExpression mem = null;
+
+ var unary = lambda.Body as UnaryExpression;
+ if (unary != null && unary.NodeType == ExpressionType.Convert) {
+ mem = unary.Operand as MemberExpression;
+ }
+ else {
+ mem = lambda.Body as MemberExpression;
+ }
+
+ if (mem != null && (mem.Expression.NodeType == ExpressionType.Parameter)) {
+ var q = Clone ();
+ if (q._orderBys == null) {
+ q._orderBys = new List ();
+ }
+ q._orderBys.Add (new Ordering {
+ ColumnName = Table.FindColumnWithPropertyName(mem.Member.Name).Name,
+ Ascending = asc
+ });
+ return q;
+ } else {
+ throw new NotSupportedException ("Order By does not support: " + orderExpr);
+ }
+ } else {
+ throw new NotSupportedException ("Must be a predicate");
+ }
+ }
+
+ private void AddWhere (Expression pred)
+ {
+ if (_where == null) {
+ _where = pred;
+ } else {
+ _where = Expression.AndAlso (_where, pred);
+ }
+ }
+
+ public TableQuery Join (
+ TableQuery inner,
+ Expression> outerKeySelector,
+ Expression> innerKeySelector,
+ Expression> resultSelector)
+ {
+ var q = new TableQuery (Connection, Connection.GetMapping (typeof (TResult))) {
+ _joinOuter = this,
+ _joinOuterKeySelector = outerKeySelector,
+ _joinInner = inner,
+ _joinInnerKeySelector = innerKeySelector,
+ _joinSelector = resultSelector,
+ };
+ return q;
+ }
+
+ public TableQuery Select (Expression> selector)
+ {
+ var q = Clone ();
+ q._selector = selector;
+ return q;
+ }
+
+ private SQLiteCommand GenerateCommand (string selectionList)
+ {
+ if (_joinInner != null && _joinOuter != null) {
+ throw new NotSupportedException ("Joins are not supported.");
+ }
+ else {
+ var cmdText = "select " + selectionList + " from \"" + Table.TableName + "\"";
+ var args = new List ();
+ if (_where != null) {
+ var w = CompileExpr (_where, args);
+ cmdText += " where " + w.CommandText;
+ }
+ if ((_orderBys != null) && (_orderBys.Count > 0)) {
+ var t = string.Join (", ", _orderBys.Select (o => "\"" + o.ColumnName + "\"" + (o.Ascending ? "" : " desc")).ToArray ());
+ cmdText += " order by " + t;
+ }
+ if (_limit.HasValue) {
+ cmdText += " limit " + _limit.Value;
+ }
+ if (_offset.HasValue) {
+ if (!_limit.HasValue) {
+ cmdText += " limit -1 ";
+ }
+ cmdText += " offset " + _offset.Value;
+ }
+ return Connection.CreateCommand (cmdText, args.ToArray ());
+ }
+ }
+
+ class CompileResult
+ {
+ public string CommandText { get; set; }
+
+ public object Value { get; set; }
+ }
+
+ private CompileResult CompileExpr (Expression expr, List queryArgs)
+ {
+ if (expr == null) {
+ throw new NotSupportedException ("Expression is NULL");
+ } else if (expr is BinaryExpression) {
+ var bin = (BinaryExpression)expr;
+
+ var leftr = CompileExpr (bin.Left, queryArgs);
+ var rightr = CompileExpr (bin.Right, queryArgs);
+
+ //If either side is a parameter and is null, then handle the other side specially (for "is null"/"is not null")
+ string text;
+ if (leftr.CommandText == "?" && leftr.Value == null)
+ text = CompileNullBinaryExpression(bin, rightr);
+ else if (rightr.CommandText == "?" && rightr.Value == null)
+ text = CompileNullBinaryExpression(bin, leftr);
+ else
+ text = "(" + leftr.CommandText + " " + GetSqlName(bin) + " " + rightr.CommandText + ")";
+ return new CompileResult { CommandText = text };
+ } else if (expr.NodeType == ExpressionType.Call) {
+
+ var call = (MethodCallExpression)expr;
+ var args = new CompileResult[call.Arguments.Count];
+ var obj = call.Object != null ? CompileExpr (call.Object, queryArgs) : null;
+
+ for (var i = 0; i < args.Length; i++) {
+ args [i] = CompileExpr (call.Arguments [i], queryArgs);
+ }
+
+ var sqlCall = "";
+
+ if (call.Method.Name == "Like" && args.Length == 2) {
+ sqlCall = "(" + args [0].CommandText + " like " + args [1].CommandText + ")";
+ }
+ else if (call.Method.Name == "Contains" && args.Length == 2) {
+ sqlCall = "(" + args [1].CommandText + " in " + args [0].CommandText + ")";
+ }
+ else if (call.Method.Name == "Contains" && args.Length == 1) {
+ if (call.Object != null && call.Object.Type == typeof(string)) {
+ sqlCall = "(" + obj.CommandText + " like ('%' || " + args [0].CommandText + " || '%'))";
+ }
+ else {
+ sqlCall = "(" + args [0].CommandText + " in " + obj.CommandText + ")";
+ }
+ }
+ else if (call.Method.Name == "StartsWith" && args.Length == 1) {
+ sqlCall = "(" + obj.CommandText + " like (" + args [0].CommandText + " || '%'))";
+ }
+ else if (call.Method.Name == "EndsWith" && args.Length == 1) {
+ sqlCall = "(" + obj.CommandText + " like ('%' || " + args [0].CommandText + "))";
+ }
+ else {
+ sqlCall = call.Method.Name.ToLower () + "(" + string.Join (",", args.Select (a => a.CommandText).ToArray ()) + ")";
+ }
+ return new CompileResult { CommandText = sqlCall };
+
+ } else if (expr.NodeType == ExpressionType.Constant) {
+ var c = (ConstantExpression)expr;
+ queryArgs.Add (c.Value);
+ return new CompileResult {
+ CommandText = "?",
+ Value = c.Value
+ };
+ } else if (expr.NodeType == ExpressionType.Convert) {
+ var u = (UnaryExpression)expr;
+ var ty = u.Type;
+ var valr = CompileExpr (u.Operand, queryArgs);
+ return new CompileResult {
+ CommandText = valr.CommandText,
+ Value = valr.Value != null ? ConvertTo (valr.Value, ty) : null
+ };
+ } else if (expr.NodeType == ExpressionType.MemberAccess) {
+ var mem = (MemberExpression)expr;
+
+ if (mem.Expression.NodeType == ExpressionType.Parameter) {
+ //
+ // This is a column of our table, output just the column name
+ // Need to translate it if that column name is mapped
+ //
+ var columnName = Table.FindColumnWithPropertyName (mem.Member.Name).Name;
+ return new CompileResult { CommandText = "\"" + columnName + "\"" };
+ } else {
+ object obj = null;
+ if (mem.Expression != null) {
+ var r = CompileExpr (mem.Expression, queryArgs);
+ if (r.Value == null) {
+ throw new NotSupportedException ("Member access failed to compile expression");
+ }
+ if (r.CommandText == "?") {
+ queryArgs.RemoveAt (queryArgs.Count - 1);
+ }
+ obj = r.Value;
+ }
+
+ //
+ // Get the member value
+ //
+ object val = null;
+
+#if !NETFX_CORE
+ if (mem.Member.MemberType == MemberTypes.Property) {
+#else
+ if (mem.Member is PropertyInfo) {
+#endif
+ var m = (PropertyInfo)mem.Member;
+ val = m.GetValue (obj, null);
+#if !NETFX_CORE
+ } else if (mem.Member.MemberType == MemberTypes.Field) {
+#else
+ } else if (mem.Member is FieldInfo) {
+#endif
+#if SILVERLIGHT
+ val = Expression.Lambda (expr).Compile ().DynamicInvoke ();
+#else
+ var m = (FieldInfo)mem.Member;
+ val = m.GetValue (obj);
+#endif
+ } else {
+#if !NETFX_CORE
+ throw new NotSupportedException ("MemberExpr: " + mem.Member.MemberType.ToString ());
+#else
+ throw new NotSupportedException ("MemberExpr: " + mem.Member.DeclaringType.ToString ());
+#endif
+ }
+
+ //
+ // Work special magic for enumerables
+ //
+ if (val != null && val is System.Collections.IEnumerable && !(val is string)) {
+ var sb = new System.Text.StringBuilder();
+ sb.Append("(");
+ var head = "";
+ foreach (var a in (System.Collections.IEnumerable)val) {
+ queryArgs.Add(a);
+ sb.Append(head);
+ sb.Append("?");
+ head = ",";
+ }
+ sb.Append(")");
+ return new CompileResult {
+ CommandText = sb.ToString(),
+ Value = val
+ };
+ }
+ else {
+ queryArgs.Add (val);
+ return new CompileResult {
+ CommandText = "?",
+ Value = val
+ };
+ }
+ }
+ }
+ throw new NotSupportedException ("Cannot compile: " + expr.NodeType.ToString ());
+ }
+
+ static object ConvertTo (object obj, Type t)
+ {
+ Type nut = Nullable.GetUnderlyingType(t);
+
+ if (nut != null) {
+ if (obj == null) return null;
+ return Convert.ChangeType (obj, nut);
+ } else {
+ return Convert.ChangeType (obj, t);
+ }
+ }
+
+ ///
+ /// Compiles a BinaryExpression where one of the parameters is null.
+ ///
+ /// The non-null parameter
+ private string CompileNullBinaryExpression(BinaryExpression expression, CompileResult parameter)
+ {
+ if (expression.NodeType == ExpressionType.Equal)
+ return "(" + parameter.CommandText + " is ?)";
+ else if (expression.NodeType == ExpressionType.NotEqual)
+ return "(" + parameter.CommandText + " is not ?)";
+ else
+ throw new NotSupportedException("Cannot compile Null-BinaryExpression with type " + expression.NodeType.ToString());
+ }
+
+ string GetSqlName (Expression expr)
+ {
+ var n = expr.NodeType;
+ if (n == ExpressionType.GreaterThan)
+ return ">"; else if (n == ExpressionType.GreaterThanOrEqual) {
+ return ">=";
+ } else if (n == ExpressionType.LessThan) {
+ return "<";
+ } else if (n == ExpressionType.LessThanOrEqual) {
+ return "<=";
+ } else if (n == ExpressionType.And) {
+ return "&";
+ } else if (n == ExpressionType.AndAlso) {
+ return "and";
+ } else if (n == ExpressionType.Or) {
+ return "|";
+ } else if (n == ExpressionType.OrElse) {
+ return "or";
+ } else if (n == ExpressionType.Equal) {
+ return "=";
+ } else if (n == ExpressionType.NotEqual) {
+ return "!=";
+ } else {
+ throw new System.NotSupportedException ("Cannot get SQL for: " + n.ToString ());
+ }
+ }
+
+ public int Count ()
+ {
+ return GenerateCommand("count(*)").ExecuteScalar ();
+ }
+
+ public IEnumerator GetEnumerator ()
+ {
+ if (!_deferred)
+ return GenerateCommand("*").ExecuteQuery().GetEnumerator();
+
+ return GenerateCommand("*").ExecuteDeferredQuery().GetEnumerator();
+ }
+
+ System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator ()
+ {
+ return GetEnumerator ();
+ }
+
+ public T First ()
+ {
+ var query = Take (1);
+ return query.ToList().First ();
+ }
+
+ public T FirstOrDefault ()
+ {
+ var query = this.Take (1);
+ return query.ToList().FirstOrDefault ();
+ }
+ }
+
+ public static class SQLite3
+ {
+ public enum Result : int
+ {
+ OK = 0,
+ Error = 1,
+ Internal = 2,
+ Perm = 3,
+ Abort = 4,
+ Busy = 5,
+ Locked = 6,
+ NoMem = 7,
+ ReadOnly = 8,
+ Interrupt = 9,
+ IOError = 10,
+ Corrupt = 11,
+ NotFound = 12,
+ Full = 13,
+ CannotOpen = 14,
+ LockErr = 15,
+ Empty = 16,
+ SchemaChngd = 17,
+ TooBig = 18,
+ Constraint = 19,
+ Mismatch = 20,
+ Misuse = 21,
+ NotImplementedLFS = 22,
+ AccessDenied = 23,
+ Format = 24,
+ Range = 25,
+ NonDBFile = 26,
+ Row = 100,
+ Done = 101
+ }
+
+ public enum ConfigOption : int
+ {
+ SingleThread = 1,
+ MultiThread = 2,
+ Serialized = 3
+ }
+
+#if !USE_CSHARP_SQLITE
+ [DllImport("sqlite3", EntryPoint = "sqlite3_open", CallingConvention=CallingConvention.Cdecl)]
+ public static extern Result Open ([MarshalAs(UnmanagedType.LPStr)] string filename, out IntPtr db);
+
+ [DllImport("sqlite3", EntryPoint = "sqlite3_open_v2", CallingConvention=CallingConvention.Cdecl)]
+ public static extern Result Open ([MarshalAs(UnmanagedType.LPStr)] string filename, out IntPtr db, int flags, IntPtr zvfs);
+
+ [DllImport("sqlite3", EntryPoint = "sqlite3_open_v2", CallingConvention = CallingConvention.Cdecl)]
+ public static extern Result Open(byte[] filename, out IntPtr db, int flags, IntPtr zvfs);
+
+ [DllImport("sqlite3", EntryPoint = "sqlite3_open16", CallingConvention = CallingConvention.Cdecl)]
+ public static extern Result Open16([MarshalAs(UnmanagedType.LPWStr)] string filename, out IntPtr db);
+
+ [DllImport("sqlite3", EntryPoint = "sqlite3_close", CallingConvention=CallingConvention.Cdecl)]
+ public static extern Result Close (IntPtr db);
+
+ [DllImport("sqlite3", EntryPoint = "sqlite3_config", CallingConvention=CallingConvention.Cdecl)]
+ public static extern Result Config (ConfigOption option);
+
+ [DllImport("sqlite3", EntryPoint = "sqlite3_win32_set_directory", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Unicode)]
+ public static extern int SetDirectory (uint directoryType, string directoryPath);
+
+ [DllImport("sqlite3", EntryPoint = "sqlite3_busy_timeout", CallingConvention=CallingConvention.Cdecl)]
+ public static extern Result BusyTimeout (IntPtr db, int milliseconds);
+
+ [DllImport("sqlite3", EntryPoint = "sqlite3_changes", CallingConvention=CallingConvention.Cdecl)]
+ public static extern int Changes (IntPtr db);
+
+ [DllImport("sqlite3", EntryPoint = "sqlite3_prepare_v2", CallingConvention=CallingConvention.Cdecl)]
+ public static extern Result Prepare2 (IntPtr db, [MarshalAs(UnmanagedType.LPStr)] string sql, int numBytes, out IntPtr stmt, IntPtr pzTail);
+
+ public static IntPtr Prepare2 (IntPtr db, string query)
+ {
+ IntPtr stmt;
+ var r = Prepare2 (db, query, query.Length, out stmt, IntPtr.Zero);
+ if (r != Result.OK) {
+ throw SQLiteException.New (r, GetErrmsg (db));
+ }
+ return stmt;
+ }
+
+ [DllImport("sqlite3", EntryPoint = "sqlite3_step", CallingConvention=CallingConvention.Cdecl)]
+ public static extern Result Step (IntPtr stmt);
+
+ [DllImport("sqlite3", EntryPoint = "sqlite3_reset", CallingConvention=CallingConvention.Cdecl)]
+ public static extern Result Reset (IntPtr stmt);
+
+ [DllImport("sqlite3", EntryPoint = "sqlite3_finalize", CallingConvention=CallingConvention.Cdecl)]
+ public static extern Result Finalize (IntPtr stmt);
+
+ [DllImport("sqlite3", EntryPoint = "sqlite3_last_insert_rowid", CallingConvention=CallingConvention.Cdecl)]
+ public static extern long LastInsertRowid (IntPtr db);
+
+ [DllImport("sqlite3", EntryPoint = "sqlite3_errmsg16", CallingConvention=CallingConvention.Cdecl)]
+ public static extern IntPtr Errmsg (IntPtr db);
+
+ public static string GetErrmsg (IntPtr db)
+ {
+ return Marshal.PtrToStringUni (Errmsg (db));
+ }
+
+ [DllImport("sqlite3", EntryPoint = "sqlite3_bind_parameter_index", CallingConvention=CallingConvention.Cdecl)]
+ public static extern int BindParameterIndex (IntPtr stmt, [MarshalAs(UnmanagedType.LPStr)] string name);
+
+ [DllImport("sqlite3", EntryPoint = "sqlite3_bind_null", CallingConvention=CallingConvention.Cdecl)]
+ public static extern int BindNull (IntPtr stmt, int index);
+
+ [DllImport("sqlite3", EntryPoint = "sqlite3_bind_int", CallingConvention=CallingConvention.Cdecl)]
+ public static extern int BindInt (IntPtr stmt, int index, int val);
+
+ [DllImport("sqlite3", EntryPoint = "sqlite3_bind_int64", CallingConvention=CallingConvention.Cdecl)]
+ public static extern int BindInt64 (IntPtr stmt, int index, long val);
+
+ [DllImport("sqlite3", EntryPoint = "sqlite3_bind_double", CallingConvention=CallingConvention.Cdecl)]
+ public static extern int BindDouble (IntPtr stmt, int index, double val);
+
+ [DllImport("sqlite3", EntryPoint = "sqlite3_bind_text16", CallingConvention=CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
+ public static extern int BindText (IntPtr stmt, int index, [MarshalAs(UnmanagedType.LPWStr)] string val, int n, IntPtr free);
+
+ [DllImport("sqlite3", EntryPoint = "sqlite3_bind_blob", CallingConvention=CallingConvention.Cdecl)]
+ public static extern int BindBlob (IntPtr stmt, int index, byte[] val, int n, IntPtr free);
+
+ [DllImport("sqlite3", EntryPoint = "sqlite3_column_count", CallingConvention=CallingConvention.Cdecl)]
+ public static extern int ColumnCount (IntPtr stmt);
+
+ [DllImport("sqlite3", EntryPoint = "sqlite3_column_name", CallingConvention=CallingConvention.Cdecl)]
+ public static extern IntPtr ColumnName (IntPtr stmt, int index);
+
+ [DllImport("sqlite3", EntryPoint = "sqlite3_column_name16", CallingConvention=CallingConvention.Cdecl)]
+ private static extern IntPtr ColumnName16Internal (IntPtr stmt, int index);
+ public static string ColumnName16(IntPtr stmt, int index)
+ {
+ return Marshal.PtrToStringUni(ColumnName16Internal(stmt, index));
+ }
+
+ [DllImport("sqlite3", EntryPoint = "sqlite3_column_type", CallingConvention=CallingConvention.Cdecl)]
+ public static extern ColType ColumnType (IntPtr stmt, int index);
+
+ [DllImport("sqlite3", EntryPoint = "sqlite3_column_int", CallingConvention=CallingConvention.Cdecl)]
+ public static extern int ColumnInt (IntPtr stmt, int index);
+
+ [DllImport("sqlite3", EntryPoint = "sqlite3_column_int64", CallingConvention=CallingConvention.Cdecl)]
+ public static extern long ColumnInt64 (IntPtr stmt, int index);
+
+ [DllImport("sqlite3", EntryPoint = "sqlite3_column_double", CallingConvention=CallingConvention.Cdecl)]
+ public static extern double ColumnDouble (IntPtr stmt, int index);
+
+ [DllImport("sqlite3", EntryPoint = "sqlite3_column_text", CallingConvention=CallingConvention.Cdecl)]
+ public static extern IntPtr ColumnText (IntPtr stmt, int index);
+
+ [DllImport("sqlite3", EntryPoint = "sqlite3_column_text16", CallingConvention=CallingConvention.Cdecl)]
+ public static extern IntPtr ColumnText16 (IntPtr stmt, int index);
+
+ [DllImport("sqlite3", EntryPoint = "sqlite3_column_blob", CallingConvention=CallingConvention.Cdecl)]
+ public static extern IntPtr ColumnBlob (IntPtr stmt, int index);
+
+ [DllImport("sqlite3", EntryPoint = "sqlite3_column_bytes", CallingConvention=CallingConvention.Cdecl)]
+ public static extern int ColumnBytes (IntPtr stmt, int index);
+
+ public static string ColumnString (IntPtr stmt, int index)
+ {
+ return Marshal.PtrToStringUni (SQLite3.ColumnText16 (stmt, index));
+ }
+
+ public static byte[] ColumnByteArray (IntPtr stmt, int index)
+ {
+ int length = ColumnBytes (stmt, index);
+ byte[] result = new byte[length];
+ if (length > 0)
+ Marshal.Copy (ColumnBlob (stmt, index), result, 0, length);
+ return result;
+ }
+#else
+
+ public static Result Open(string filename, out Sqlite3.sqlite3 db)
+ {
+ return (Result) Sqlite3.sqlite3_open(filename, out db);
+ }
+
+ public static Result Open(string filename, out Sqlite3.sqlite3 db, int flags, IntPtr zVfs)
+ {
+ return (Result)Sqlite3.sqlite3_open_v2(filename, out db, flags, null);
+ }
+
+ public static Result Close(Sqlite3.sqlite3 db)
+ {
+ return (Result)Sqlite3.sqlite3_close(db);
+ }
+
+ public static Result BusyTimeout(Sqlite3.sqlite3 db, int milliseconds)
+ {
+ return (Result)Sqlite3.sqlite3_busy_timeout(db, milliseconds);
+ }
+
+ public static int Changes(Sqlite3.sqlite3 db)
+ {
+ return Sqlite3.sqlite3_changes(db);
+ }
+
+ public static Sqlite3.Vdbe Prepare2(Sqlite3.sqlite3 db, string query)
+ {
+ Sqlite3.Vdbe stmt = new Sqlite3.Vdbe();
+ var r = Sqlite3.sqlite3_prepare_v2(db, query, System.Text.UTF8Encoding.UTF8.GetByteCount(query), ref stmt, 0);
+ if (r != 0)
+ {
+ throw SQLiteException.New((Result)r, GetErrmsg(db));
+ }
+ return stmt;
+ }
+
+ public static Result Step(Sqlite3.Vdbe stmt)
+ {
+ return (Result)Sqlite3.sqlite3_step(stmt);
+ }
+
+ public static Result Reset(Sqlite3.Vdbe stmt)
+ {
+ return (Result)Sqlite3.sqlite3_reset(stmt);
+ }
+
+ public static Result Finalize(Sqlite3.Vdbe stmt)
+ {
+ return (Result)Sqlite3.sqlite3_finalize(stmt);
+ }
+
+ public static long LastInsertRowid(Sqlite3.sqlite3 db)
+ {
+ return Sqlite3.sqlite3_last_insert_rowid(db);
+ }
+
+ public static string GetErrmsg(Sqlite3.sqlite3 db)
+ {
+ return Sqlite3.sqlite3_errmsg(db);
+ }
+
+ public static int BindParameterIndex(Sqlite3.Vdbe stmt, string name)
+ {
+ return Sqlite3.sqlite3_bind_parameter_index(stmt, name);
+ }
+
+ public static int BindNull(Sqlite3.Vdbe stmt, int index)
+ {
+ return Sqlite3.sqlite3_bind_null(stmt, index);
+ }
+
+ public static int BindInt(Sqlite3.Vdbe stmt, int index, int val)
+ {
+ return Sqlite3.sqlite3_bind_int(stmt, index, val);
+ }
+
+ public static int BindInt64(Sqlite3.Vdbe stmt, int index, long val)
+ {
+ return Sqlite3.sqlite3_bind_int64(stmt, index, val);
+ }
+
+ public static int BindDouble(Sqlite3.Vdbe stmt, int index, double val)
+ {
+ return Sqlite3.sqlite3_bind_double(stmt, index, val);
+ }
+
+ public static int BindText(Sqlite3.Vdbe stmt, int index, string val, int n, IntPtr free)
+ {
+ return Sqlite3.sqlite3_bind_text(stmt, index, val, n, null);
+ }
+
+ public static int BindBlob(Sqlite3.Vdbe stmt, int index, byte[] val, int n, IntPtr free)
+ {
+ return Sqlite3.sqlite3_bind_blob(stmt, index, val, n, null);
+ }
+
+ public static int ColumnCount(Sqlite3.Vdbe stmt)
+ {
+ return Sqlite3.sqlite3_column_count(stmt);
+ }
+
+ public static string ColumnName(Sqlite3.Vdbe stmt, int index)
+ {
+ return Sqlite3.sqlite3_column_name(stmt, index);
+ }
+
+ public static string ColumnName16(Sqlite3.Vdbe stmt, int index)
+ {
+ return Sqlite3.sqlite3_column_name(stmt, index);
+ }
+
+ public static ColType ColumnType(Sqlite3.Vdbe stmt, int index)
+ {
+ return (ColType)Sqlite3.sqlite3_column_type(stmt, index);
+ }
+
+ public static int ColumnInt(Sqlite3.Vdbe stmt, int index)
+ {
+ return Sqlite3.sqlite3_column_int(stmt, index);
+ }
+
+ public static long ColumnInt64(Sqlite3.Vdbe stmt, int index)
+ {
+ return Sqlite3.sqlite3_column_int64(stmt, index);
+ }
+
+ public static double ColumnDouble(Sqlite3.Vdbe stmt, int index)
+ {
+ return Sqlite3.sqlite3_column_double(stmt, index);
+ }
+
+ public static string ColumnText(Sqlite3.Vdbe stmt, int index)
+ {
+ return Sqlite3.sqlite3_column_text(stmt, index);
+ }
+
+ public static string ColumnText16(Sqlite3.Vdbe stmt, int index)
+ {
+ return Sqlite3.sqlite3_column_text(stmt, index);
+ }
+
+ public static byte[] ColumnBlob(Sqlite3.Vdbe stmt, int index)
+ {
+ return Sqlite3.sqlite3_column_blob(stmt, index);
+ }
+
+ public static int ColumnBytes(Sqlite3.Vdbe stmt, int index)
+ {
+ return Sqlite3.sqlite3_column_bytes(stmt, index);
+ }
+
+ public static string ColumnString(Sqlite3.Vdbe stmt, int index)
+ {
+ return Sqlite3.sqlite3_column_text(stmt, index);
+ }
+
+ public static byte[] ColumnByteArray(Sqlite3.Vdbe stmt, int index)
+ {
+ return ColumnBlob(stmt, index);
+ }
+#endif
+
+ public enum ColType : int
+ {
+ Integer = 1,
+ Float = 2,
+ Text = 3,
+ Blob = 4,
+ Null = 5
+ }
+ }
+ }
\ No newline at end of file
diff --git a/DataAccess/Basic/iOS/Resources/LaunchScreen.storyboard b/DataAccess/Basic/iOS/Resources/LaunchScreen.storyboard
new file mode 100644
index 000000000..247a13cb9
--- /dev/null
+++ b/DataAccess/Basic/iOS/Resources/LaunchScreen.storyboard
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/DataAccess/Basic/iOS/iOS.csproj b/DataAccess/Basic/iOS/iOS.csproj
new file mode 100644
index 000000000..423075dc9
--- /dev/null
+++ b/DataAccess/Basic/iOS/iOS.csproj
@@ -0,0 +1,129 @@
+
+
+
+ Debug
+ iPhoneSimulator
+ 10.0.0
+ 2.0
+ {9F81A4C3-5C16-4C4C-9DB5-7D7E18FA3F13}
+ {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ Exe
+ DataAccess
+ Resources
+ DataAccess
+ Xamarin.iOS
+ v1.0
+
+
+ True
+ full
+ False
+ bin\iPhoneSimulator\Debug
+ DEBUG;
+ prompt
+ 4
+ False
+ True
+ True
+ None
+ NSUrlSessionHandler
+ i386, x86_64
+
+
+ none
+ True
+ bin\iPhoneSimulator\Release
+ prompt
+ 4
+ False
+ None
+ NSUrlSessionHandler
+ i386, x86_64
+
+
+ True
+ full
+ False
+ bin\iPhone\Debug
+ DEBUG;
+ prompt
+ 4
+ False
+ iPhone Developer
+ True
+ True
+ ARMv7, ARM64
+ NSUrlSessionHandler
+
+
+ none
+ True
+ bin\iPhone\Release
+ prompt
+ 4
+ False
+ iPhone Developer
+ ARMv7, ARM64
+ NSUrlSessionHandler
+
+
+ none
+ True
+ bin\iPhone\Ad-Hoc
+ prompt
+ 4
+ True
+ False
+ Automatic:AdHoc
+ iPhone Distribution
+ ARMv7, ARM64
+ NSUrlSessionHandler
+
+
+ none
+ True
+ bin\iPhone\AppStore
+ prompt
+ 4
+ False
+ iPhone Distribution
+ Automatic:AppStore
+ ARMv7, ARM64
+ NSUrlSessionHandler
+
+
+
+
+
+
+
+
+
+ ..\packages\sqlite-net-pcl.1.1.1\lib\portable-net45+wp8+wpa81+win8+MonoAndroid10+MonoTouch10+Xamarin.iOS10\SQLite-net.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DataAccessViewController.cs
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/DataAccess/Basic/iOS/packages.config b/DataAccess/Basic/iOS/packages.config
new file mode 100644
index 000000000..bcdf89f57
--- /dev/null
+++ b/DataAccess/Basic/iOS/packages.config
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/DataAccess/Metadata.xml b/DataAccess/Metadata.xml
new file mode 100644
index 000000000..a9d66233a
--- /dev/null
+++ b/DataAccess/Metadata.xml
@@ -0,0 +1,11 @@
+
+
+ 598ac0ff-68c7-4050-af24-f35688d10003
+ false
+ Beginner
+ Data
+ Android, iOS
+ Indie
+ Basic cross-platform data access
+ false
+
diff --git a/DataAccess/README.md b/DataAccess/README.md
new file mode 100644
index 000000000..b15b4d87f
--- /dev/null
+++ b/DataAccess/README.md
@@ -0,0 +1,13 @@
+Data Access Samples
+===========================
+
+Sample code associated with the [Data Access docs](http://developer.xamarin.com/guides/cross-platform/application_fundamentals/data/):
+
+* Basic
+* Advanced
+
+ 
+
+Author
+------
+Craig Dunn
\ No newline at end of file
diff --git a/DataAccess/Screenshots/android.png b/DataAccess/Screenshots/android.png
new file mode 100755
index 000000000..f202aed0c
Binary files /dev/null and b/DataAccess/Screenshots/android.png differ
diff --git a/DataAccess/Screenshots/ios.png b/DataAccess/Screenshots/ios.png
new file mode 100644
index 000000000..6482972ab
Binary files /dev/null and b/DataAccess/Screenshots/ios.png differ
diff --git a/EmbeddedResources/EmbeddedResources.Droid/EmbeddedResources.Droid.csproj b/EmbeddedResources/EmbeddedResources.Droid/EmbeddedResources.Droid.csproj
index debc5c77c..bbe2763d1 100644
--- a/EmbeddedResources/EmbeddedResources.Droid/EmbeddedResources.Droid.csproj
+++ b/EmbeddedResources/EmbeddedResources.Droid/EmbeddedResources.Droid.csproj
@@ -16,7 +16,7 @@
Assets
True
EmbeddedResources.Droid
- v4.3
+ v9.0
Properties\AndroidManifest.xml
@@ -67,7 +67,7 @@
-
+
{0E172788-6F8F-4D63-81FA-B7F5A11E7531}
diff --git a/EmbeddedResources/EmbeddedResources.Droid/Properties/AndroidManifest.xml b/EmbeddedResources/EmbeddedResources.Droid/Properties/AndroidManifest.xml
index 6e6c67a5d..4fad6b132 100644
--- a/EmbeddedResources/EmbeddedResources.Droid/Properties/AndroidManifest.xml
+++ b/EmbeddedResources/EmbeddedResources.Droid/Properties/AndroidManifest.xml
@@ -1,6 +1,5 @@
-
-
-
+
+
\ No newline at end of file
diff --git a/EmbeddedResources/EmbeddedResources/Assets.xcassets/AppIcon.appiconset/Contents.json b/EmbeddedResources/EmbeddedResources/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 000000000..d16c4c44b
--- /dev/null
+++ b/EmbeddedResources/EmbeddedResources/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1 @@
+{"images":[{"idiom":"iphone","filename":"Icon.png","size":"57x57","scale":"1x"},{"idiom":"iphone","filename":"Icon@2x.png","size":"57x57","scale":"2x"},{"idiom":"iphone","filename":"Icon-60@2x.png","size":"60x60","scale":"2x"},{"idiom":"iphone","filename":"Icon-Small.png","size":"29x29","scale":"1x"},{"idiom":"iphone","filename":"Icon-Small@2x.png","size":"29x29","scale":"2x"},{"idiom":"iphone","filename":"Icon-Small-40@2x.png","size":"40x40","scale":"2x"}],"info":{"version":1,"author":"xcode"}}
\ No newline at end of file
diff --git a/EmbeddedResources/EmbeddedResources/Resources/Icon-60@2x.png b/EmbeddedResources/EmbeddedResources/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png
similarity index 100%
rename from EmbeddedResources/EmbeddedResources/Resources/Icon-60@2x.png
rename to EmbeddedResources/EmbeddedResources/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png
diff --git a/EmbeddedResources/EmbeddedResources/Resources/Icon-Small-40@2x.png b/EmbeddedResources/EmbeddedResources/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png
similarity index 100%
rename from EmbeddedResources/EmbeddedResources/Resources/Icon-Small-40@2x.png
rename to EmbeddedResources/EmbeddedResources/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png
diff --git a/Camera/Camera.iOS/Resources/Icon-Small.png b/EmbeddedResources/EmbeddedResources/Assets.xcassets/AppIcon.appiconset/Icon-Small.png
similarity index 100%
rename from Camera/Camera.iOS/Resources/Icon-Small.png
rename to EmbeddedResources/EmbeddedResources/Assets.xcassets/AppIcon.appiconset/Icon-Small.png
diff --git a/Camera/Camera.iOS/Resources/Icon-Small@2x.png b/EmbeddedResources/EmbeddedResources/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png
similarity index 100%
rename from Camera/Camera.iOS/Resources/Icon-Small@2x.png
rename to EmbeddedResources/EmbeddedResources/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png
diff --git a/Camera/Camera.iOS/Resources/Icon.png b/EmbeddedResources/EmbeddedResources/Assets.xcassets/AppIcon.appiconset/Icon.png
similarity index 100%
rename from Camera/Camera.iOS/Resources/Icon.png
rename to EmbeddedResources/EmbeddedResources/Assets.xcassets/AppIcon.appiconset/Icon.png
diff --git a/Camera/Camera.iOS/Resources/Icon@2x.png b/EmbeddedResources/EmbeddedResources/Assets.xcassets/AppIcon.appiconset/Icon@2x.png
similarity index 100%
rename from Camera/Camera.iOS/Resources/Icon@2x.png
rename to EmbeddedResources/EmbeddedResources/Assets.xcassets/AppIcon.appiconset/Icon@2x.png
diff --git a/EmbeddedResources/EmbeddedResources/EmbeddedResources.iOS.csproj b/EmbeddedResources/EmbeddedResources/EmbeddedResources.iOS.csproj
index 52aa918e1..005c60f1e 100644
--- a/EmbeddedResources/EmbeddedResources/EmbeddedResources.iOS.csproj
+++ b/EmbeddedResources/EmbeddedResources/EmbeddedResources.iOS.csproj
@@ -1,4 +1,4 @@
-
+
Debug
@@ -23,10 +23,11 @@
prompt
4
false
- None
+ SdkOnly
Entitlements.plist
true
- i386
+ x86_64
+ NSUrlSessionHandler
full
@@ -38,7 +39,9 @@
None
false
Entitlements.plist
- i386
+ x86_64
+ NSUrlSessionHandler
+ iPhone Developer
true
@@ -52,7 +55,8 @@
Entitlements.plist
true
iPhone Developer
- ARMv7
+ ARM64
+ NSUrlSessionHandler
full
@@ -64,7 +68,8 @@
Entitlements.plist
false
iPhone Developer
- ARMv7, ARM64
+ ARM64
+ NSUrlSessionHandler
full
@@ -79,6 +84,7 @@
Automatic:AdHoc
iPhone Distribution
ARMv7, ARM64
+ NSUrlSessionHandler
full
@@ -92,6 +98,7 @@
Automatic:AppStore
iPhone Distribution
ARMv7, ARM64
+ NSUrlSessionHandler
@@ -99,17 +106,6 @@
-
-
-
-
-
-
-
-
-
-
-
@@ -124,6 +120,7 @@
+
@@ -135,5 +132,14 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/EmbeddedResources/EmbeddedResources/HomeScreen.designer.cs b/EmbeddedResources/EmbeddedResources/HomeScreen.designer.cs
index 8c5aaa66c..6cddb63ca 100644
--- a/EmbeddedResources/EmbeddedResources/HomeScreen.designer.cs
+++ b/EmbeddedResources/EmbeddedResources/HomeScreen.designer.cs
@@ -1,27 +1,28 @@
// WARNING
//
-// This file has been generated automatically by Xamarin Studio to store outlets and
-// actions made in the UI designer. If it is removed, they will be lost.
-// Manual changes to this file may not be handled correctly.
+// This file has been generated automatically by Visual Studio from the outlets and
+// actions declared in your storyboard file.
+// Manual changes to this file will not be maintained.
//
using Foundation;
+using System;
using System.CodeDom.Compiler;
namespace EmbeddedResources
{
- [Register ("HomeScreen")]
- partial class HomeScreen
- {
- [Outlet]
- [GeneratedCodeAttribute ("iOS Designer", "1.0")]
- UIKit.UITextView HaikuTextView { get; set; }
-
- void ReleaseDesignerOutlets ()
- {
- if (HaikuTextView != null) {
- HaikuTextView.Dispose ();
- HaikuTextView = null;
- }
- }
- }
-}
+ [Register ("HomeScreen")]
+ partial class HomeScreen
+ {
+ [Outlet]
+ [GeneratedCode ("iOS Designer", "1.0")]
+ UIKit.UITextView HaikuTextView { get; set; }
+
+ void ReleaseDesignerOutlets ()
+ {
+ if (HaikuTextView != null) {
+ HaikuTextView.Dispose ();
+ HaikuTextView = null;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/EmbeddedResources/EmbeddedResources/Info.plist b/EmbeddedResources/EmbeddedResources/Info.plist
index 2628db4ef..735c3164a 100644
--- a/EmbeddedResources/EmbeddedResources/Info.plist
+++ b/EmbeddedResources/EmbeddedResources/Info.plist
@@ -13,7 +13,7 @@
LSRequiresIPhoneOS
MinimumOSVersion
- 7.0
+ 11.0
UIDeviceFamily
1
@@ -28,14 +28,11 @@
UIInterfaceOrientationLandscapeLeft
UIInterfaceOrientationLandscapeRight
- CFBundleIconFiles
-
- Icon
- Icon@2x
- Icon-60@2x
- Icon-Small
- Icon-Small@2x
- Icon-Small-40@2x
-
+ CFBundleName
+ EmbeddedResources
+ XSAppIconAssets
+ Assets.xcassets/AppIcon.appiconset
+ UILaunchStoryboardName
+ LaunchScreen
diff --git a/EmbeddedResources/EmbeddedResources/Resources/Default-568h@2x.png b/EmbeddedResources/EmbeddedResources/Resources/Default-568h@2x.png
deleted file mode 100644
index b3f66780c..000000000
Binary files a/EmbeddedResources/EmbeddedResources/Resources/Default-568h@2x.png and /dev/null differ
diff --git a/EmbeddedResources/EmbeddedResources/Resources/Default.png b/EmbeddedResources/EmbeddedResources/Resources/Default.png
deleted file mode 100644
index 7ad63b043..000000000
Binary files a/EmbeddedResources/EmbeddedResources/Resources/Default.png and /dev/null differ
diff --git a/EmbeddedResources/EmbeddedResources/Resources/Default@2x.png b/EmbeddedResources/EmbeddedResources/Resources/Default@2x.png
deleted file mode 100644
index 8d59426f3..000000000
Binary files a/EmbeddedResources/EmbeddedResources/Resources/Default@2x.png and /dev/null differ
diff --git a/EmbeddedResources/EmbeddedResources/Resources/LaunchScreen.storyboard b/EmbeddedResources/EmbeddedResources/Resources/LaunchScreen.storyboard
new file mode 100644
index 000000000..e82f06763
--- /dev/null
+++ b/EmbeddedResources/EmbeddedResources/Resources/LaunchScreen.storyboard
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/EmbeddedResources/Metadata.xml b/EmbeddedResources/Metadata.xml
index 39adf30cc..bd15867f5 100644
--- a/EmbeddedResources/Metadata.xml
+++ b/EmbeddedResources/Metadata.xml
@@ -1,4 +1,4 @@
-
+
e675a86d-3297-4d7d-8bb5-dfb138734645
false
@@ -6,6 +6,6 @@
Data
iOS, Android
Starter
- This sample illustrates how to load a resource that has been built into the assembly by setting its build type to EmbeddedResource.
+ Demonstrates how to load a resource that has been built into the assembly.
true
diff --git a/EmbeddedResources/README.md b/EmbeddedResources/README.md
index 87c44876f..8ebd411a9 100644
--- a/EmbeddedResources/README.md
+++ b/EmbeddedResources/README.md
@@ -11,4 +11,4 @@ it.
Authors
-------
-Bryan Costanich, Rasmus Kromann-Larsen
+Bryan Costanich, Rasmus Kromann-Larsen, additional contribution by [swkidd](https://github.com/swkidd)
diff --git a/EmbeddedResources/Screenshots/Android/01.png b/EmbeddedResources/Screenshots/Android/01.png
index aefca199f..8c88c1ca5 100644
Binary files a/EmbeddedResources/Screenshots/Android/01.png and b/EmbeddedResources/Screenshots/Android/01.png differ
diff --git a/EmbeddedResources/Screenshots/iOS/01.png b/EmbeddedResources/Screenshots/iOS/01.png
index cc8f3fead..77b4be014 100644
Binary files a/EmbeddedResources/Screenshots/iOS/01.png and b/EmbeddedResources/Screenshots/iOS/01.png differ
diff --git a/EmbeddedResources/SharedLib/ALittleStory.txt b/EmbeddedResources/SharedLib/ALittleStory.txt
index 9943c299d..b65b7678b 100644
--- a/EmbeddedResources/SharedLib/ALittleStory.txt
+++ b/EmbeddedResources/SharedLib/ALittleStory.txt
@@ -1,5 +1,5 @@
-I like soup.
-I used to not like soup.
-But Now I do.
+I like to eat soup
+I did not used to like soup
+but now I like soup
Haiku - by bryan costanich.
\ No newline at end of file
diff --git a/FruityFalls/FruityFalls.sln b/FruityFalls/FruityFalls.sln
new file mode 100644
index 000000000..eb05a4e57
--- /dev/null
+++ b/FruityFalls/FruityFalls.sln
@@ -0,0 +1,69 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 14
+VisualStudioVersion = 14.0.23107.0
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FruityFalls.iOS", "FruityFalls\FruityFalls.iOS\FruityFalls.iOS.csproj", "{05B07081-896C-4350-9745-6F5FB87ECB41}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FruityFalls.Android", "FruityFalls\FruityFalls.Android\FruityFalls.Android.csproj", "{30F29853-DC0C-421C-838A-C43CF4F159E4}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FruityFalls.Common", "FruityFalls\FruityFalls.Common\FruityFalls.Common.csproj", "{3A23A1BC-DEFB-4627-987F-70055FC3589D}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Debug|iPhone = Debug|iPhone
+ Debug|iPhoneSimulator = Debug|iPhoneSimulator
+ Release|Any CPU = Release|Any CPU
+ Release|iPhone = Release|iPhone
+ Release|iPhoneSimulator = Release|iPhoneSimulator
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {05B07081-896C-4350-9745-6F5FB87ECB41}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator
+ {05B07081-896C-4350-9745-6F5FB87ECB41}.Debug|Any CPU.Build.0 = Debug|iPhoneSimulator
+ {05B07081-896C-4350-9745-6F5FB87ECB41}.Debug|iPhone.ActiveCfg = Debug|iPhone
+ {05B07081-896C-4350-9745-6F5FB87ECB41}.Debug|iPhone.Build.0 = Debug|iPhone
+ {05B07081-896C-4350-9745-6F5FB87ECB41}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
+ {05B07081-896C-4350-9745-6F5FB87ECB41}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
+ {05B07081-896C-4350-9745-6F5FB87ECB41}.Release|Any CPU.ActiveCfg = Release|iPhone
+ {05B07081-896C-4350-9745-6F5FB87ECB41}.Release|Any CPU.Build.0 = Release|iPhone
+ {05B07081-896C-4350-9745-6F5FB87ECB41}.Release|iPhone.ActiveCfg = Release|iPhone
+ {05B07081-896C-4350-9745-6F5FB87ECB41}.Release|iPhone.Build.0 = Release|iPhone
+ {05B07081-896C-4350-9745-6F5FB87ECB41}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
+ {05B07081-896C-4350-9745-6F5FB87ECB41}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
+ {30F29853-DC0C-421C-838A-C43CF4F159E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {30F29853-DC0C-421C-838A-C43CF4F159E4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {30F29853-DC0C-421C-838A-C43CF4F159E4}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {30F29853-DC0C-421C-838A-C43CF4F159E4}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {30F29853-DC0C-421C-838A-C43CF4F159E4}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {30F29853-DC0C-421C-838A-C43CF4F159E4}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {30F29853-DC0C-421C-838A-C43CF4F159E4}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {30F29853-DC0C-421C-838A-C43CF4F159E4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {30F29853-DC0C-421C-838A-C43CF4F159E4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {30F29853-DC0C-421C-838A-C43CF4F159E4}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {30F29853-DC0C-421C-838A-C43CF4F159E4}.Release|iPhone.Build.0 = Release|Any CPU
+ {30F29853-DC0C-421C-838A-C43CF4F159E4}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {30F29853-DC0C-421C-838A-C43CF4F159E4}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {3A23A1BC-DEFB-4627-987F-70055FC3589D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3A23A1BC-DEFB-4627-987F-70055FC3589D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3A23A1BC-DEFB-4627-987F-70055FC3589D}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {3A23A1BC-DEFB-4627-987F-70055FC3589D}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {3A23A1BC-DEFB-4627-987F-70055FC3589D}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {3A23A1BC-DEFB-4627-987F-70055FC3589D}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {3A23A1BC-DEFB-4627-987F-70055FC3589D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3A23A1BC-DEFB-4627-987F-70055FC3589D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3A23A1BC-DEFB-4627-987F-70055FC3589D}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {3A23A1BC-DEFB-4627-987F-70055FC3589D}.Release|iPhone.Build.0 = Release|Any CPU
+ {3A23A1BC-DEFB-4627-987F-70055FC3589D}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {3A23A1BC-DEFB-4627-987F-70055FC3589D}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(MonoDevelopProperties) = preSolution
+ Policies = $0
+ $0.DotNetNamingPolicy = $1
+ $1.DirectoryNamespaceAssociation = PrefixedHierarchical
+ $1.ResourceNamePolicy = FileFormatDefault
+ EndGlobalSection
+EndGlobal
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/Assets/AboutAssets.txt b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/AboutAssets.txt
new file mode 100644
index 000000000..a9b0638eb
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/AboutAssets.txt
@@ -0,0 +1,19 @@
+Any raw assets you want to be deployed with your application can be placed in
+this directory (and child directories) and given a Build Action of "AndroidAsset".
+
+These files will be deployed with your package and will be accessible using Android's
+AssetManager, like this:
+
+public class ReadAsset : Activity
+{
+ protected override void OnCreate (Bundle bundle)
+ {
+ base.OnCreate (bundle);
+
+ InputStream input = Assets.Open ("my_asset.txt");
+ }
+}
+
+Additionally, some Android functions will automatically load asset files:
+
+Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf");
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Images/background.png b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Images/background.png
new file mode 100644
index 000000000..4b9fbc114
Binary files /dev/null and b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Images/background.png differ
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Images/cherry.png b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Images/cherry.png
new file mode 100644
index 000000000..b7c78f7a8
Binary files /dev/null and b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Images/cherry.png differ
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Images/foreground.png b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Images/foreground.png
new file mode 100644
index 000000000..605a2094d
Binary files /dev/null and b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Images/foreground.png differ
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Images/lemon.png b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Images/lemon.png
new file mode 100644
index 000000000..1a21023bb
Binary files /dev/null and b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Images/lemon.png differ
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Images/monkey.png b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Images/monkey.png
new file mode 100644
index 000000000..f5025e13f
Binary files /dev/null and b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Images/monkey.png differ
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Images/vine.png b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Images/vine.png
new file mode 100644
index 000000000..3c215ec50
Binary files /dev/null and b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Images/vine.png differ
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/Android/FruitEdgeBounce.xnb b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/Android/FruitEdgeBounce.xnb
new file mode 100644
index 000000000..215c500cf
Binary files /dev/null and b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/Android/FruitEdgeBounce.xnb differ
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/Android/FruitInBin.xnb b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/Android/FruitInBin.xnb
new file mode 100644
index 000000000..ab66e0d4c
Binary files /dev/null and b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/Android/FruitInBin.xnb differ
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/Android/FruitPaddleBounce.xnb b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/Android/FruitPaddleBounce.xnb
new file mode 100644
index 000000000..1955e2488
Binary files /dev/null and b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/Android/FruitPaddleBounce.xnb differ
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/Android/GameOver.xnb b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/Android/GameOver.xnb
new file mode 100644
index 000000000..7f059a30b
Binary files /dev/null and b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/Android/GameOver.xnb differ
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/AndroidContentProject.mgcb b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/AndroidContentProject.mgcb
new file mode 100644
index 000000000..4c49da937
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/AndroidContentProject.mgcb
@@ -0,0 +1,39 @@
+
+#----------------------------- Global Properties ----------------------------#
+
+/outputDir:Android
+/intermediateDir:AndroidObj
+/platform:Android
+/config:
+/profile:Reach
+/compress:False
+
+#-------------------------------- References --------------------------------#
+
+
+#---------------------------------- Content ---------------------------------#
+
+#begin FruitEdgeBounce.wav
+/importer:WavImporter
+/processor:SoundEffectProcessor
+/processorParam:Quality=Best
+/build:FruitEdgeBounce.wav
+
+#begin FruitInBin.wav
+/importer:WavImporter
+/processor:SoundEffectProcessor
+/processorParam:Quality=Best
+/build:FruitInBin.wav
+
+#begin FruitPaddleBounce.wav
+/importer:WavImporter
+/processor:SoundEffectProcessor
+/processorParam:Quality=Best
+/build:FruitPaddleBounce.wav
+
+#begin GameOver.wav
+/importer:WavImporter
+/processor:SoundEffectProcessor
+/processorParam:Quality=Best
+/build:GameOver.wav
+
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/FruitEdgeBounce.wav b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/FruitEdgeBounce.wav
new file mode 100644
index 000000000..05b21a698
Binary files /dev/null and b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/FruitEdgeBounce.wav differ
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/FruitInBin.wav b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/FruitInBin.wav
new file mode 100644
index 000000000..cb5f124bb
Binary files /dev/null and b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/FruitInBin.wav differ
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/FruitPaddleBounce.wav b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/FruitPaddleBounce.wav
new file mode 100644
index 000000000..7dfe1a3c6
Binary files /dev/null and b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/FruitPaddleBounce.wav differ
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/FruityFallsSong.mp3 b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/FruityFallsSong.mp3
new file mode 100644
index 000000000..152e350e6
Binary files /dev/null and b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/FruityFallsSong.mp3 differ
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/GameOver.wav b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/GameOver.wav
new file mode 100644
index 000000000..eaca7d58d
Binary files /dev/null and b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/GameOver.wav differ
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/iOS/FruitEdgeBounce.xnb b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/iOS/FruitEdgeBounce.xnb
new file mode 100644
index 000000000..5bd8e8e36
Binary files /dev/null and b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/iOS/FruitEdgeBounce.xnb differ
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/iOS/FruitInBin.xnb b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/iOS/FruitInBin.xnb
new file mode 100644
index 000000000..ea9350064
Binary files /dev/null and b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/iOS/FruitInBin.xnb differ
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/iOS/FruitPaddleBounce.xnb b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/iOS/FruitPaddleBounce.xnb
new file mode 100644
index 000000000..56f85fc8c
Binary files /dev/null and b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/iOS/FruitPaddleBounce.xnb differ
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/iOS/GameOver.xnb b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/iOS/GameOver.xnb
new file mode 100644
index 000000000..c9a568ad9
Binary files /dev/null and b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/iOS/GameOver.xnb differ
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/iOSContentProject.mgcb b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/iOSContentProject.mgcb
new file mode 100644
index 000000000..f1f20659f
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.Android/Assets/Content/Sounds/iOSContentProject.mgcb
@@ -0,0 +1,39 @@
+
+#----------------------------- Global Properties ----------------------------#
+
+/outputDir:iOS
+/intermediateDir:iOSObj
+/platform:iOS
+/config:
+/profile:Reach
+/compress:False
+
+#-------------------------------- References --------------------------------#
+
+
+#---------------------------------- Content ---------------------------------#
+
+#begin FruitEdgeBounce.wav
+/importer:WavImporter
+/processor:SoundEffectProcessor
+/processorParam:Quality=Best
+/build:FruitEdgeBounce.wav
+
+#begin FruitInBin.wav
+/importer:WavImporter
+/processor:SoundEffectProcessor
+/processorParam:Quality=Best
+/build:FruitInBin.wav
+
+#begin FruitPaddleBounce.wav
+/importer:WavImporter
+/processor:SoundEffectProcessor
+/processorParam:Quality=Best
+/build:FruitPaddleBounce.wav
+
+#begin GameOver.wav
+/importer:WavImporter
+/processor:SoundEffectProcessor
+/processorParam:Quality=Best
+/build:GameOver.wav
+
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/FruityFalls.Android.csproj b/FruityFalls/FruityFalls/FruityFalls.Android/FruityFalls.Android.csproj
new file mode 100644
index 000000000..97793bb7c
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.Android/FruityFalls.Android.csproj
@@ -0,0 +1,103 @@
+
+
+
+ Debug
+ AnyCPU
+ {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ {30F29853-DC0C-421C-838A-C43CF4F159E4}
+ Library
+ FruityFalls.Android
+ Assets
+ Resources
+ Resource
+ Resources\Resource.designer.cs
+ True
+ False
+ FruityFalls.Android
+ v5.0
+ Properties\AndroidManifest.xml
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ None
+ false
+
+
+ full
+ true
+ bin\Release
+ prompt
+ 4
+ false
+ false
+
+
+
+
+
+
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\MonoAndroid10\CocosSharp.dll
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\MonoAndroid10\Lidgren.Network.dll
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\MonoAndroid10\MonoGame.Framework.dll
+
+
+
+
+ {3A23A1BC-DEFB-4627-987F-70055FC3589D}
+ FruityFalls.Common
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/MainActivity.cs b/FruityFalls/FruityFalls/FruityFalls.Android/MainActivity.cs
new file mode 100644
index 000000000..dba37fc48
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.Android/MainActivity.cs
@@ -0,0 +1,52 @@
+using System;
+using System.Collections.Generic;
+
+using Android.App;
+using Android.Content;
+using Android.Content.PM;
+using Android.Runtime;
+using Android.Views;
+using Android.Widget;
+using Android.OS;
+
+using CocosSharp;
+using FruityFalls.Scenes;
+
+namespace FruityFalls.Android
+{
+ [Activity (
+ Label = "FruityFalls.Android",
+ MainLauncher = true, Icon = "@drawable/icon",
+ AlwaysRetainTaskState = true,
+ Theme = "@android:style/Theme.NoTitleBar",
+ LaunchMode = LaunchMode.SingleInstance,
+ ScreenOrientation = ScreenOrientation.Portrait,
+ ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.ScreenSize | ConfigChanges.Keyboard | ConfigChanges.KeyboardHidden)]
+ public class MainActivity : Activity
+ {
+ protected override void OnCreate (Bundle bundle)
+ {
+ base.OnCreate (bundle);
+
+ // Set our view from the "main" layout resource
+ SetContentView (Resource.Layout.Main);
+
+ // Get our game view from the layout resource,
+ // and attach the view created event to it
+ CCGameView gameView = (CCGameView)FindViewById (Resource.Id.GameView);
+ gameView.ViewCreated += LoadGame;
+ }
+
+ void LoadGame (object sender, EventArgs e)
+ {
+ CCGameView gameView = sender as CCGameView;
+
+ if (gameView != null)
+ {
+ GameController.Initialize (gameView);
+ }
+ }
+ }
+}
+
+
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/Properties/AndroidManifest.xml b/FruityFalls/FruityFalls/FruityFalls.Android/Properties/AndroidManifest.xml
new file mode 100644
index 000000000..ad4c87667
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.Android/Properties/AndroidManifest.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/Properties/AssemblyInfo.cs b/FruityFalls/FruityFalls/FruityFalls.Android/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..740550d27
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.Android/Properties/AssemblyInfo.cs
@@ -0,0 +1,28 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using Android.App;
+
+// Information about this assembly is defined by the following attributes.
+// Change them to the values specific to your project.
+
+[assembly: AssemblyTitle ("FruityFalls.Android")]
+[assembly: AssemblyDescription ("")]
+[assembly: AssemblyConfiguration ("")]
+[assembly: AssemblyCompany ("")]
+[assembly: AssemblyProduct ("")]
+[assembly: AssemblyCopyright ("vchelaru")]
+[assembly: AssemblyTrademark ("")]
+[assembly: AssemblyCulture ("")]
+
+// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
+// The form "{Major}.{Minor}.*" will automatically update the build and revision,
+// and "{Major}.{Minor}.{Build}.*" will update just the revision.
+
+[assembly: AssemblyVersion ("1.0.0")]
+
+// The following attributes are used to specify the signing key for the assembly,
+// if desired. See the Mono documentation for more information about signing.
+
+//[assembly: AssemblyDelaySign(false)]
+//[assembly: AssemblyKeyFile("")]
+
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/Resources/AboutResources.txt b/FruityFalls/FruityFalls/FruityFalls.Android/Resources/AboutResources.txt
new file mode 100644
index 000000000..10f52d460
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.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.
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/Resources/drawable-hdpi/Icon.png b/FruityFalls/FruityFalls/FruityFalls.Android/Resources/drawable-hdpi/Icon.png
new file mode 100644
index 000000000..f4c804644
Binary files /dev/null and b/FruityFalls/FruityFalls/FruityFalls.Android/Resources/drawable-hdpi/Icon.png differ
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/Resources/drawable-mdpi/Icon.png b/FruityFalls/FruityFalls/FruityFalls.Android/Resources/drawable-mdpi/Icon.png
new file mode 100644
index 000000000..ef1e1ee7d
Binary files /dev/null and b/FruityFalls/FruityFalls/FruityFalls.Android/Resources/drawable-mdpi/Icon.png differ
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/Resources/drawable-xhdpi/Icon.png b/FruityFalls/FruityFalls/FruityFalls.Android/Resources/drawable-xhdpi/Icon.png
new file mode 100644
index 000000000..b7e2e57aa
Binary files /dev/null and b/FruityFalls/FruityFalls/FruityFalls.Android/Resources/drawable-xhdpi/Icon.png differ
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/Resources/drawable-xxhdpi/Icon.png b/FruityFalls/FruityFalls/FruityFalls.Android/Resources/drawable-xxhdpi/Icon.png
new file mode 100644
index 000000000..8d20a38d1
Binary files /dev/null and b/FruityFalls/FruityFalls/FruityFalls.Android/Resources/drawable-xxhdpi/Icon.png differ
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/Resources/drawable-xxxhdpi/Icon.png b/FruityFalls/FruityFalls/FruityFalls.Android/Resources/drawable-xxxhdpi/Icon.png
new file mode 100644
index 000000000..6d9919c41
Binary files /dev/null and b/FruityFalls/FruityFalls/FruityFalls.Android/Resources/drawable-xxxhdpi/Icon.png differ
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/Resources/layout/Main.axml b/FruityFalls/FruityFalls/FruityFalls.Android/Resources/layout/Main.axml
new file mode 100644
index 000000000..77959ac22
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.Android/Resources/layout/Main.axml
@@ -0,0 +1,11 @@
+
+
+
+
+
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/Resources/values/Strings.xml b/FruityFalls/FruityFalls/FruityFalls.Android/Resources/values/Strings.xml
new file mode 100644
index 000000000..819e25596
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.Android/Resources/values/Strings.xml
@@ -0,0 +1,4 @@
+
+
+ FruityFalls.Android
+
diff --git a/FruityFalls/FruityFalls/FruityFalls.Android/packages.config b/FruityFalls/FruityFalls/FruityFalls.Android/packages.config
new file mode 100644
index 000000000..4edced82f
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.Android/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/FruityFalls/FruityFalls/FruityFalls.Common/Entities/Fruit.cs b/FruityFalls/FruityFalls/FruityFalls.Common/Entities/Fruit.cs
new file mode 100644
index 000000000..35524545e
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.Common/Entities/Fruit.cs
@@ -0,0 +1,167 @@
+using System;
+using CocosSharp;
+using FruityFalls.Geometry;
+
+namespace FruityFalls.Entities
+{
+ public class Fruit : CCNode
+ {
+ CCSprite graphic;
+ CCDrawNode debugGrahic;
+ CCLabel extraPointsLabel;
+
+ public CCPoint Velocity;
+ public CCPoint Acceleration;
+
+ // This prevents the user from holding the
+ // paddle under a fruit, earning extra points every frame
+ float timeUntilExtraPointsCanBeAdded;
+
+ int extraPointValueButPleaseUseProperty;
+ public int ExtraPointValue
+ {
+ get
+ {
+ return extraPointValueButPleaseUseProperty;
+ }
+ private set
+ {
+ extraPointValueButPleaseUseProperty = value;
+ timeUntilExtraPointsCanBeAdded = GameCoefficients.MinPointAwardingFrequency;
+ extraPointsLabel.Text = "+" + (extraPointValueButPleaseUseProperty + 1);
+ }
+ }
+
+ // Putting this here just for convenience
+ public float Radius
+ {
+ get
+ {
+ return GameCoefficients.FruitRadius;
+ }
+ }
+
+ public Circle Collision
+ {
+ get;
+ private set;
+ }
+
+ FruitColor fruitColor;
+ public FruitColor FruitColor
+ {
+ get
+ {
+ return fruitColor;
+ }
+ set
+ {
+ fruitColor = value;
+ UpdateGraphics();
+ }
+ }
+
+ public Fruit ()
+ {
+ CreateFruitGraphic ();
+
+ if (GameCoefficients.ShowCollisionAreas)
+ {
+ CreateDebugGraphic ();
+ }
+
+ CreateCollision ();
+
+ CreateExtraPointsLabel ();
+
+ Acceleration.Y = GameCoefficients.FruitGravity;
+ }
+
+ private void CreateFruitGraphic()
+ {
+ graphic = new CCSprite ("cherry.png");
+ graphic.IsAntialiased = false;
+ this.AddChild (graphic);
+ }
+
+ private void CreateDebugGraphic()
+ {
+ debugGrahic = new CCDrawNode ();
+ this.AddChild (debugGrahic);
+ }
+
+ private void CreateCollision()
+ {
+ Collision = new Circle ();
+ Collision.Radius = GameCoefficients.FruitRadius;
+ this.AddChild (Collision);
+ }
+
+ private void CreateExtraPointsLabel()
+ {
+ extraPointsLabel = new CCLabel("", "Arial", 12, CCLabelFormat.SystemFont);
+ extraPointsLabel.IsAntialiased = false;
+ extraPointsLabel.Color = CCColor3B.Black;
+ this.AddChild(extraPointsLabel);
+ }
+
+ private void UpdateGraphics()
+ {
+ if (GameCoefficients.ShowCollisionAreas)
+ {
+ debugGrahic.Clear ();
+ const float borderWidth = 4;
+ debugGrahic.DrawSolidCircle (
+ CCPoint.Zero,
+ GameCoefficients.FruitRadius,
+ CCColor4B.Black);
+ debugGrahic.DrawSolidCircle (
+ CCPoint.Zero,
+ GameCoefficients.FruitRadius - borderWidth,
+ fruitColor.ToCCColor ());
+ }
+ if (this.FruitColor == FruitColor.Yellow)
+ {
+ graphic.Texture = CCTextureCache.SharedTextureCache.AddImage ("lemon.png");
+ extraPointsLabel.Color = CCColor3B.Black;
+ extraPointsLabel.PositionY = 0;
+
+ }
+ else
+ {
+ graphic.Texture = CCTextureCache.SharedTextureCache.AddImage ("cherry.png");
+ extraPointsLabel.Color = CCColor3B.White;
+ extraPointsLabel.PositionY = -8;
+ }
+ }
+
+ public void Activity(float frameTimeInSeconds)
+ {
+ timeUntilExtraPointsCanBeAdded -= frameTimeInSeconds;
+
+ // linear approximation:
+ this.Velocity += Acceleration * frameTimeInSeconds;
+
+ // This is a linera approximation to drag. It's used to
+ // keep the object from falling too fast, and eventually
+ // to slow its horizontal movement. This makes the game easier
+ this.Velocity -= Velocity * GameCoefficients.FruitDrag * frameTimeInSeconds;
+
+ this.Position += Velocity * frameTimeInSeconds;
+
+ }
+
+ public bool TryAddExtraPointValue()
+ {
+ bool didAddPoint = false;
+ if(timeUntilExtraPointsCanBeAdded <= 0)
+ {
+ ExtraPointValue++;
+ didAddPoint = true;
+ }
+
+ return didAddPoint;
+ }
+ }
+}
+
diff --git a/FruityFalls/FruityFalls/FruityFalls.Common/Entities/FruitBin.cs b/FruityFalls/FruityFalls/FruityFalls.Common/Entities/FruitBin.cs
new file mode 100644
index 000000000..2d1192c1d
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.Common/Entities/FruitBin.cs
@@ -0,0 +1,97 @@
+using System;
+using CocosSharp;
+using FruityFalls.Geometry;
+
+namespace FruityFalls.Entities
+{
+ public enum FruitColor
+ {
+ Yellow,
+ Red
+ }
+
+ public static class FruitColorExtensions
+ {
+
+
+ public static CCColor4B ToCCColor(this FruitColor color)
+ {
+ switch(color)
+ {
+ case FruitColor.Yellow:
+ return new CCColor4B(150, 150, 0, 150);
+ case FruitColor.Red:
+ return new CCColor4B(150,0,0,150);
+ }
+ throw new ArgumentException("Unknown color " + color);
+ }
+
+ }
+
+ public class FruitBin : CCNode
+ {
+ float width = 200;
+ const float collisionHeight = 100;
+ CCDrawNode graphic;
+
+ FruitColor fruitColor;
+ public FruitColor FruitColor
+ {
+ get
+ {
+ return fruitColor;
+ }
+ set
+ {
+ fruitColor = value;
+ UpdateGraphics ();
+ }
+ }
+
+ public Polygon Polygon
+ {
+ get;
+ private set;
+ }
+
+ public float Width
+ {
+ get
+ {
+ return width;
+ }
+ set
+ {
+ width = value;
+ UpdateGraphics ();
+
+ // being lazy here:
+ RemoveChild(Polygon);
+ Polygon = Polygon.CreateRectangle(width, collisionHeight);
+ // bin graphics are bottom-left aligned, so let's do the same with the polygon.
+ Polygon.PositionX = width / 2.0f;
+ Polygon.PositionY = GameCoefficients.BinHeight - (collisionHeight/2.0f);
+ AddChild(Polygon);
+ }
+ }
+
+ public FruitBin ()
+ {
+ graphic = new CCDrawNode ();
+ this.AddChild (graphic);
+ }
+
+ private void UpdateGraphics()
+ {
+ if(GameCoefficients.ShowCollisionAreas)
+ {
+ graphic.Clear ();
+
+ graphic.DrawRect (
+ new CCRect (0, GameCoefficients.BinHeight - collisionHeight, width, collisionHeight),
+ fillColor: fruitColor.ToCCColor());
+ }
+ }
+ }
+}
+
diff --git a/FruityFalls/FruityFalls/FruityFalls.Common/Entities/FruitSpawner.cs b/FruityFalls/FruityFalls/FruityFalls.Common/Entities/FruitSpawner.cs
new file mode 100644
index 000000000..5aeaa5ea3
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.Common/Entities/FruitSpawner.cs
@@ -0,0 +1,120 @@
+using CocosSharp;
+using System;
+using System.Collections.Generic;
+
+namespace FruityFalls.Entities
+{
+ public class FruitSpawner
+ {
+ float timeSinceLastSpawn;
+ public float TimeInbetweenSpawns
+ {
+ get;
+ set;
+ }
+
+ public string DebugInfo
+ {
+ get
+ {
+ string toReturn =
+ "Fruit per second: " + (1 / TimeInbetweenSpawns);
+
+ return toReturn;
+ }
+ }
+
+ public CCLayer Layer
+ {
+ get;
+ set;
+ }
+
+ public Action FruitSpawned;
+
+ public bool IsSpawning
+ {
+ get;
+ set;
+ }
+
+ public FruitSpawner ()
+ {
+ IsSpawning = true;
+ TimeInbetweenSpawns = 1 / GameCoefficients.StartingFruitPerSecond;
+ // So that spawning starts immediately:
+ timeSinceLastSpawn = TimeInbetweenSpawns;
+ }
+
+ public void Activity(float frameTime)
+ {
+ if (IsSpawning)
+ {
+ SpawningActivity(frameTime);
+
+ SpawnReductionTimeActivity(frameTime);
+ }
+ }
+
+ private void SpawningActivity(float frameTime)
+ {
+ timeSinceLastSpawn += frameTime;
+
+ if (timeSinceLastSpawn > TimeInbetweenSpawns)
+ {
+ timeSinceLastSpawn -= TimeInbetweenSpawns;
+
+ Spawn();
+ }
+ }
+
+ private void SpawnReductionTimeActivity(float frameTime)
+ {
+ // This logic should increase how frequently fruit appear, but it should do so
+ // such that the # of fruit/minute increases at a decreasing rate, otherwise the
+ // game becomes impossibly difficult very quickly.
+ var currentFruitPerSecond = 1 / TimeInbetweenSpawns;
+
+ var amountToAdd = frameTime / GameCoefficients.TimeForExtraFruitPerSecond;
+
+ var newFruitPerSecond = currentFruitPerSecond + amountToAdd;
+
+ TimeInbetweenSpawns = 1 / newFruitPerSecond;
+
+ }
+
+ // made public for debugging, may make it private later:
+ private void Spawn()
+ {
+ var fruit = new Fruit ();
+
+ if(Layer == null)
+ {
+ throw new InvalidOperationException("Need to set Layer before spawning");
+ }
+
+ fruit.PositionX = CCRandom.GetRandomFloat(0 + fruit.Radius, Layer.ContentSize.Width - fruit.Radius);
+ fruit.PositionY = Layer.ContentSize.Height + fruit.Radius;
+
+ if(CCRandom.Float_0_1() > .5f)
+ {
+ fruit.FruitColor = FruitColor.Red;
+ }
+ else
+ {
+ fruit.FruitColor = FruitColor.Yellow;
+ }
+
+
+ if(FruitSpawned != null)
+ {
+ FruitSpawned(fruit);
+ }
+
+ }
+
+
+
+ }
+}
+
diff --git a/FruityFalls/FruityFalls/FruityFalls.Common/Entities/Paddle.cs b/FruityFalls/FruityFalls/FruityFalls.Common/Entities/Paddle.cs
new file mode 100644
index 000000000..159df008e
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.Common/Entities/Paddle.cs
@@ -0,0 +1,143 @@
+using System;
+using CocosSharp;
+using FruityFalls.Geometry;
+
+namespace FruityFalls.Entities
+{
+ public class Paddle : CCNode
+ {
+ const float width = 59;
+ const float height = 9;
+ const float speedAtMaxRotation = 200;
+ const float maxRotation = 50; // in degrees
+
+ CCPoint desiredLocation;
+ public CCPoint Velocity;
+
+ CCSprite graphic;
+
+ CCDrawNode debugGraphic;
+
+
+ public Polygon Polygon
+ {
+ get;
+ private set;
+ }
+
+ float rotation;
+ public new float Rotation
+ {
+ get
+ {
+ return rotation;
+ }
+ set
+ {
+ rotation = value;
+ Polygon.Rotation = rotation;
+ base.Rotation = rotation;
+ }
+ }
+
+ Vine leftVine;
+ Vine rightVine;
+
+ public Paddle ()
+ {
+
+ CreateVines ();
+
+ CreateSpriteGraphic ();
+
+ if (GameCoefficients.ShowCollisionAreas)
+ {
+ CreateDebugGraphic ();
+ }
+
+
+ CreateCollision ();
+ }
+
+ private void CreateSpriteGraphic ()
+ {
+ graphic = new CCSprite ("monkey.png");
+ graphic.IsAntialiased = false;
+ // offset it so the monkey's paddle lines up with the collision:
+ graphic.PositionY = -24;
+ this.AddChild (graphic);
+ }
+
+ private void CreateDebugGraphic()
+ {
+ debugGraphic = new CCDrawNode ();
+
+ debugGraphic.DrawRect (
+ new CCRect (-width/2, -height/2, width, height),
+ fillColor: new CCColor4B(180, 180, 180, 180));
+
+ this.AddChild (debugGraphic);
+ }
+
+ private void CreateCollision()
+ {
+ Polygon = Polygon.CreateRectangle(width, height);
+ this.AddChild (Polygon);
+ }
+
+ private void CreateVines()
+ {
+ // Increasing this value moves the vines closer to the
+ // center of the paddle.
+ const int vineDistanceFromEdge = 4;
+
+ leftVine = new Vine ();
+ var leftEdge = -width / 2.0f;
+ leftVine.PositionX = leftEdge + vineDistanceFromEdge;
+ this.AddChild (leftVine);
+
+ rightVine = new Vine ();
+ var rightEdge = width / 2.0f;
+ rightVine.PositionX = rightEdge - vineDistanceFromEdge;
+ this.AddChild (rightVine);
+ }
+
+ public void HandleInput(CCPoint touchPoint)
+ {
+ desiredLocation = touchPoint;
+ }
+
+ public void Activity(float frameTimeInSeconds)
+ {
+ // This code will cause the cursor to lag behind the touch point.
+ // Increasing this value reduces how far the paddle lags
+ // behind the player's finger.
+ const float velocityCoefficient = 4;
+
+ // Get the velocity from current location and touch location
+ Velocity = (desiredLocation - this.Position) * velocityCoefficient;
+
+ this.Position += Velocity * frameTimeInSeconds;
+
+ float ratio = Velocity.X / speedAtMaxRotation;
+ if (ratio > 1) ratio = 1;
+ if (ratio < -1) ratio = -1;
+
+ this.Rotation = ratio * maxRotation;
+
+ // This value adds a slight amount of rotation
+ // to the vine. Having a small amount of tilt looks nice.
+ float vineAngle = this.Velocity.X / 100.0f;
+
+ leftVine.Rotation = -this.Rotation + vineAngle;
+ rightVine.Rotation = -this.Rotation + vineAngle;
+ }
+
+ internal void SetDesiredPositionToCurrentPosition()
+ {
+ desiredLocation.X = this.PositionX;
+ desiredLocation.Y = this.PositionY;
+ }
+ }
+}
+
diff --git a/FruityFalls/FruityFalls/FruityFalls.Common/Entities/ScoreIncreaseText.cs b/FruityFalls/FruityFalls/FruityFalls.Common/Entities/ScoreIncreaseText.cs
new file mode 100644
index 000000000..c8dc4dbe8
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.Common/Entities/ScoreIncreaseText.cs
@@ -0,0 +1,18 @@
+using System;
+using CocosSharp;
+
+namespace FruityFalls.Entities
+{
+ public class ScoreIncreaseText : CCNode
+ {
+ CCLabel label;
+
+ public ScoreIncreaseText ()
+ {
+ label = new CCLabel ("+1", "Arial", 20, CCLabelFormat.SystemFont);
+
+ this.AddChild (label);
+ }
+ }
+}
+
diff --git a/FruityFalls/FruityFalls/FruityFalls.Common/Entities/ScoreText.cs b/FruityFalls/FruityFalls/FruityFalls.Common/Entities/ScoreText.cs
new file mode 100644
index 000000000..de13a1219
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.Common/Entities/ScoreText.cs
@@ -0,0 +1,40 @@
+using System;
+using CocosSharp;
+
+namespace FruityFalls.Entities
+{
+ public class ScoreText : CCNode
+ {
+ CCLabel label;
+
+ CCDrawNode background;
+
+ public int Score
+ {
+ set
+ {
+ label.Text = "Score: " + value;
+ }
+ }
+
+ public ScoreText ()
+ {
+ background = new CCDrawNode ();
+
+ const int width = 115;
+ const int height = 27;
+
+ background.DrawRect (new CCRect (-5, -height ,
+ width, height),
+ new CCColor4B (100, 100, 100));
+
+ this.AddChild (background);
+
+
+ label = new CCLabel ("Score: 9999", "Arial", 20, CCLabelFormat.SystemFont);
+ label.AnchorPoint = new CCPoint(0, 1);
+ this.AddChild (label);
+ }
+ }
+}
+
diff --git a/FruityFalls/FruityFalls/FruityFalls.Common/Entities/SolidRectangle.cs b/FruityFalls/FruityFalls/FruityFalls.Common/Entities/SolidRectangle.cs
new file mode 100644
index 000000000..676d2d9c4
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.Common/Entities/SolidRectangle.cs
@@ -0,0 +1,35 @@
+using CocosSharp;
+using FruityFalls.Geometry;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FruityFalls.Entities
+{
+ public class SolidRectangle : CCNode
+ {
+ public Polygon Polygon
+ {
+ get;
+ private set;
+ }
+
+
+ public SolidRectangle(float width, float height)
+ {
+ Polygon = Polygon.CreateRectangle(width, height);
+
+ var graphic = new CCDrawNode();
+
+ graphic.DrawRect(
+ new CCRect(-width / 2, -height / 2, width, height),
+ fillColor: CCColor4B.Blue);
+
+ this.AddChild(graphic);
+
+ this.AddChild(Polygon);
+ }
+ }
+}
diff --git a/FruityFalls/FruityFalls/FruityFalls.Common/Entities/Vine.cs b/FruityFalls/FruityFalls/FruityFalls.Common/Entities/Vine.cs
new file mode 100644
index 000000000..1013c44db
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.Common/Entities/Vine.cs
@@ -0,0 +1,22 @@
+using System;
+using CocosSharp;
+
+namespace FruityFalls.Entities
+{
+ public class Vine : CCNode
+ {
+ public Vine ()
+ {
+ const int numberOfVinesToAdd = 20;
+
+ for (int i = 0; i < numberOfVinesToAdd; i++)
+ {
+ var graphic = new CCSprite ("vine.png");
+ graphic.AnchorPoint = new CCPoint(.5f, 0);
+ graphic.PositionY = i * graphic.ContentSize.Height;
+ this.AddChild (graphic);
+ }
+ }
+ }
+}
+
diff --git a/FruityFalls/FruityFalls/FruityFalls.Common/FruityFalls.Common.csproj b/FruityFalls/FruityFalls/FruityFalls.Common/FruityFalls.Common.csproj
new file mode 100644
index 000000000..fb183b72e
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.Common/FruityFalls.Common.csproj
@@ -0,0 +1,66 @@
+
+
+
+ Debug
+ AnyCPU
+ {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ {3A23A1BC-DEFB-4627-987F-70055FC3589D}
+ Library
+ FruityFalls
+ FruityFalls.Common
+ v4.5
+ Profile111
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ false
+
+
+ full
+ true
+ bin\Release
+ prompt
+ 4
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\portable-net45+win+wpa81+wp81\box2d.dll
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\portable-net45+win+wpa81+wp81\CocosSharp.dll
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\portable-net45+win+wpa81+wp81\MonoGame.Framework.dll
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FruityFalls/FruityFalls/FruityFalls.Common/GameCoefficients.cs b/FruityFalls/FruityFalls/FruityFalls.Common/GameCoefficients.cs
new file mode 100644
index 000000000..33fb953a2
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.Common/GameCoefficients.cs
@@ -0,0 +1,56 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FruityFalls
+{
+ public static class GameCoefficients
+ {
+ // The height of the bins - the smaller this is, the further down the fruit
+ // has to go before its color is checked
+ public const float BinHeight = 5;
+
+ // The height of the splitter inbetween the bins
+ public const float SplitterHeight = 60;
+
+ // The strength of the gravity. Making this a
+ // smaller (bigger negative) number will make the
+ // fruit fall faster. A larger (smaller negative) number
+ // will make the fruit more floaty.
+ public const float FruitGravity = -60;
+
+ // The impact of "air drag" on the fruit, which gives
+ // the fruit terminal velocity (max falling speed) and slows
+ // the fruit's horizontal movement (makes the game easier)
+ public const float FruitDrag = .1f;
+
+ // Controls fruit collision bouncyness. A value of 1
+ // means no momentum is lost. A value of 0 means all
+ // momentum is lost. Values greater than 1 create a spring-like effect
+ public const float FruitCollisionElasticity = .5f;
+
+ public const float FruitRadius = 16;
+
+ public const float StartingFruitPerSecond = .1f;
+
+ // This variable controls how many seconds must pass
+ // before another fruit-per-second is added. For example,
+ // if the game initially spawns one fruit per 5 seconds, then
+ // the spawn rate is .2 fruit per second. If this value is 60, that
+ // means that after 1 minute, the spawn rate will be 1.2 fruit per second.
+ // Initial playtesting suggest that this value should be fairly large like 3+
+ // minutes (180 seconds) or else the game gets hard
+ public const float TimeForExtraFruitPerSecond = 6 * 60;
+
+ // This controls whether debug information is displayed on screen.
+ public const bool ShowDebugInfo = false;
+
+ public const bool ShowCollisionAreas = false;
+
+ // The amount of time which must pass between bonus point awarding.
+ // Without this, the user can earn bonus points every frame
+ public const float MinPointAwardingFrequency = .6f;
+ }
+}
diff --git a/FruityFalls/FruityFalls/FruityFalls.Common/GameController.cs b/FruityFalls/FruityFalls/FruityFalls.Common/GameController.cs
new file mode 100644
index 000000000..cd62bc0d0
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.Common/GameController.cs
@@ -0,0 +1,56 @@
+using System;
+using CocosSharp;
+using System.Collections.Generic;
+using FruityFalls.Scenes;
+
+namespace FruityFalls
+{
+ public static class GameController
+ {
+ public static CCGameView GameView
+ {
+ get;
+ private set;
+ }
+
+ public static void Initialize (CCGameView gameView)
+ {
+ GameView = gameView;
+
+ var contentSearchPaths = new List () { "Fonts", "Sounds" };
+
+#if __IOS__
+ contentSearchPaths.Add("Sounds/iOS/");
+
+#else // android
+ contentSearchPaths.Add("Sounds/Android/");
+
+
+#endif
+
+ contentSearchPaths.Add("Images");
+ GameView.ContentManager.SearchPaths = contentSearchPaths;
+
+ // We use a lower-resolution display to get a pixellated appearance
+ int width = 384;
+ int height = 512;
+ GameView.DesignResolution = new CCSizeI (width, height);
+
+ InitializeAudio();
+
+ var scene = new TitleScene (GameView);
+ GameView.RunWithScene (scene);
+ }
+
+ private static void InitializeAudio()
+ {
+ CCAudioEngine.SharedEngine.PlayBackgroundMusic("FruityFallsSong");
+ }
+
+ public static void GoToScene(CCScene scene)
+ {
+ GameView.Director.ReplaceScene(scene);
+ }
+ }
+}
+
diff --git a/FruityFalls/FruityFalls/FruityFalls.Common/Geometry/Circle.cs b/FruityFalls/FruityFalls/FruityFalls.Common/Geometry/Circle.cs
new file mode 100644
index 000000000..58ff95786
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.Common/Geometry/Circle.cs
@@ -0,0 +1,28 @@
+using System;
+using CocosSharp;
+
+namespace FruityFalls.Geometry
+{
+ public class Circle : CCNode
+ {
+ public float Radius
+ {
+ get;
+ set;
+ }
+
+ public Circle ()
+ {
+ }
+
+ public bool IsPointInside(CCPoint point)
+ {
+ var absolutePosition = this.PositionWorldspace;
+
+ return (point.X - absolutePosition.X) * (point.X - absolutePosition.X) +
+ (point.Y - absolutePosition.Y) * (point.Y - absolutePosition.Y) <
+ Radius * Radius;
+ }
+ }
+}
+
diff --git a/FruityFalls/FruityFalls/FruityFalls.Common/Geometry/CollisionResponse.cs b/FruityFalls/FruityFalls/FruityFalls.Common/Geometry/CollisionResponse.cs
new file mode 100644
index 000000000..e07fc020e
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.Common/Geometry/CollisionResponse.cs
@@ -0,0 +1,72 @@
+using CocosSharp;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FruityFalls.Geometry
+{
+ public static class CollisionResponse
+ {
+ public static CCPoint GetSeparationVector(Circle circle, Polygon polygon)
+ {
+ bool isCircleCenterInPolygon = polygon.IsPointInside(
+ circle.PositionWorldspace.X, circle.PositionWorldspace.Y);
+
+ float distance;
+ var normal = polygon.GetNormalClosestTo(circle.PositionWorldspace, out distance);
+
+ if (isCircleCenterInPolygon)
+ {
+ distance += circle.Radius;
+ }
+ else
+ {
+ distance = circle.Radius - distance;
+ }
+
+ // increase the distance by a small amount to make sure that the objects do separate:
+ distance += .5f;
+
+ var separation = normal * distance;
+
+ return separation;
+ }
+
+ public static CCPoint ApplyBounce(CCPoint object1Velocity, CCPoint object2Velocity, CCPoint normal, float elasticity)
+ {
+ CCPoint vectorAsVelocity = new CCPoint(
+ object1Velocity.X - object2Velocity.X,
+ object1Velocity.Y - object2Velocity.Y);
+
+ float projected = CCPoint.Dot(vectorAsVelocity, normal);
+
+ if (projected < 0)
+ {
+ CCPoint velocityComponentPerpendicularToTangent =
+ normal * projected;
+
+ object1Velocity.X -= (1 + elasticity) * velocityComponentPerpendicularToTangent.X;
+ object1Velocity.Y -= (1 + elasticity) * velocityComponentPerpendicularToTangent.Y;
+
+ }
+
+ return object1Velocity;
+ }
+
+
+
+ private static CCPoint Reflect(CCPoint vectorToReflect, CCPoint surfaceToReflectOn)
+ {
+ surfaceToReflectOn.Normalize();
+
+
+ CCPoint projected = surfaceToReflectOn * CCPoint.Dot(vectorToReflect, surfaceToReflectOn);
+
+ return -(vectorToReflect - projected) + projected;
+
+ }
+
+ }
+}
diff --git a/FruityFalls/FruityFalls/FruityFalls.Common/Geometry/Polygon.cs b/FruityFalls/FruityFalls/FruityFalls.Common/Geometry/Polygon.cs
new file mode 100644
index 000000000..a7aa36d8e
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.Common/Geometry/Polygon.cs
@@ -0,0 +1,274 @@
+using System;
+using CocosSharp;
+
+namespace FruityFalls.Geometry
+{
+ public class Polygon : CCNode
+ {
+ CCPoint[] points;
+ CCPoint[] absolutePoints;
+ public CCPoint LastCollisionPoint;
+ float boundingRadius;
+
+
+ float rotation;
+ // We have to "new" it because the base class has no support for this. Yuck...
+ public new float Rotation
+ {
+ get
+ {
+ return rotation;
+ }
+ set
+ {
+ rotation = value;
+ base.Rotation = rotation;
+ }
+ }
+
+ public CCPoint[] Points
+ {
+ get
+ {
+ return points;
+ }
+ set
+ {
+ points = value;
+ absolutePoints = new CCPoint[points.Length];
+ ReactToPointsSet ();
+ }
+ }
+
+ public Polygon ()
+ {
+ }
+
+ public static Polygon CreateRectangle(float width, float height)
+ {
+ var polygon = new Polygon();
+
+ var points = new CCPoint[] {
+ new CCPoint(-width/2, -height/2),
+ new CCPoint(-width/2, height/2),
+ new CCPoint(width/2, height/2),
+ new CCPoint(width/2, -height/2),
+ new CCPoint(-width/2, -height/2)
+ };
+
+ polygon.Points = points;
+
+ return polygon;
+ }
+
+ public bool CollideAgainst(Circle circle)
+ {
+ UpdateAbsolutePoints ();
+
+ // This method will test the following things:
+ // * Is the circle's center inside the polygon?
+ // * Are any of the polygon's points inside the circle?
+ // * Is the circle within Radius distance from any of the polygon's edges?
+ // Of course none of this is done if the radius check fails
+
+ if ((circle.Radius + boundingRadius) * (circle.Radius + boundingRadius) >
+
+ (circle.PositionX - PositionX) * (circle.Position.X - Position.X) +
+ (circle.PositionY - PositionY) * (circle.Position.Y - Position.Y))
+ {
+ // First see if the circle is inside the polygon.
+ if (IsPointInside(circle.PositionWorldspace.X, circle.PositionWorldspace.Y))
+ {
+ LastCollisionPoint.X = circle.Position.X;
+ LastCollisionPoint.Y = circle.Position.Y;
+ return true;
+ }
+
+ int i;
+ // Next see if any of the Polygon's points are inside the circle
+ for (i = 0; i < absolutePoints.Length; i++)
+ {
+ if (circle.IsPointInside(absolutePoints[i]))
+ {
+ LastCollisionPoint.X = absolutePoints[i].X;
+ LastCollisionPoint.Y = absolutePoints[i].Y;
+ return true;
+ }
+ }
+ int k;
+
+ Segment s1 = new Segment();
+ Segment s2 = new Segment();
+
+ // Next check if the circle is within Radius units of any segment.
+ for (i = 0; i < absolutePoints.Length; i++)
+ {
+ k = i + 1 < absolutePoints.Length ? i + 1 : 0;
+ s1.Point1 = absolutePoints [i];
+ s1.Point2 = absolutePoints[k];
+
+ var position = circle.PositionWorldspace;
+
+ var segmentDistance = s1.DistanceTo (ref position, out s2);
+
+ if (segmentDistance < circle.Radius)
+ {
+ LastCollisionPoint.X = s2.Point2.X;
+ LastCollisionPoint.Y = s2.Point2.Y;
+
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ private void ReactToPointsSet()
+ {
+ // calculate the boundingRadius which is used in collisions.
+ float boundingRadiusSquared = 0;
+ for (int i = 0; i < points.Length; i++)
+ {
+ var p = points[i];
+ boundingRadiusSquared =
+ System.Math.Max(boundingRadiusSquared, (float)(p.X * p.X + p.Y * p.Y));
+ }
+
+ boundingRadius = (float)System.Math.Sqrt(boundingRadiusSquared);
+ }
+
+ void UpdateAbsolutePoints()
+ {
+ var absolutePosition = this.PositionWorldspace;
+
+ var rotationInClockwiseRadians = CCMathHelper.ToRadians (this.Rotation);
+
+ // In this context, CocosSharp uses clockwise rotation, the opposite of mathematical rotation
+ // So let's invert it so we get rotation in counterclockwise units:
+ var rotationInRadians = -rotationInClockwiseRadians;
+
+ CCPoint rotatedXAxis = new CCPoint((float) System.Math.Cos (rotationInRadians), (float) System.Math.Sin (rotationInRadians));
+ CCPoint rotatedYAxis = new CCPoint (-rotatedXAxis.Y, rotatedXAxis.X);
+
+ for (int i = 0; i < points.Length; i++)
+ {
+
+ absolutePoints [i] =
+ absolutePosition +
+ (rotatedXAxis * points [i].X) +
+ (rotatedYAxis * points [i].Y);
+
+
+ }
+ }
+
+ public bool IsPointInside(float x, float y)
+ {
+ bool b = false;
+
+ for (int i = 0, j = absolutePoints.Length - 1; i < absolutePoints.Length; j = i++)
+ {
+ if ((((absolutePoints[i].Y <= y) && (y < absolutePoints[j].Y)) || ((absolutePoints[j].Y <= y) && (y < absolutePoints[i].Y))) &&
+ (x < (absolutePoints[j].X - absolutePoints[i].X) * (y - absolutePoints[i].Y) / (absolutePoints[j].Y - absolutePoints[i].Y) + absolutePoints[i].X)) b = !b;
+ }
+
+ return b;
+ }
+
+ public CCPoint GetNormalClosestTo(CCPoint point, out float distance)
+ {
+ // We need the point before to potentially calculate the normal
+ int pointBefore;
+
+ var fromCircleToThis = VectorFrom(point.X, point.Y, absolutePoints, out pointBefore);
+
+ // The fromCircleToThis will be less than circle.Radius units in length.
+ // However much less it is is how far the objects should be moved.
+
+ distance = fromCircleToThis.Length;
+
+ double amountToMoveOnX;
+ double amountToMoveOnY;
+
+ // If length is equal to 0,
+ // that means that the circle
+ // falls directly on the polygon's
+ // edge. When this occurrs, the direction
+ // to move is unknown. So we need to find the
+ // normal of the surface to know the direction to
+ // move. To get the normal we'll first look at the
+ // point before on the polygon, and figure out the normal
+ // from that
+ if (distance == 0)
+ {
+ var direction = absolutePoints[pointBefore + 1] - absolutePoints[pointBefore];
+
+ // now rotate it 90 degrees:
+ direction = new CCPoint(-direction.Y, direction.X);
+
+ // We need to move the point along the normal a little bit to see if the normal
+ // is pointing inside or out.
+ if (!IsPointInside(point.X + direction.X * .01f, point.Y + direction.Y * .01f))
+ {
+ direction.X = -direction.X;
+ direction.Y = -direction.Y;
+ }
+
+ direction.Normalize();
+
+
+ fromCircleToThis.X = direction.X;
+ fromCircleToThis.Y = direction.Y;
+ }
+ else
+ {
+ // normalize and invert:
+ fromCircleToThis /= -fromCircleToThis.Length ;
+
+ fromCircleToThis.Normalize ();
+ }
+
+ return fromCircleToThis;
+
+ }
+
+ public static CCPoint VectorFrom(float x, float y, CCPoint[] vertices, out int pointIndexBefore)
+ {
+ pointIndexBefore = -1;
+
+ double minDistance = double.PositiveInfinity;
+ double tempMinDistance;
+ CCPoint vectorToReturn = new CCPoint();
+
+ if (vertices.Length == 1)
+ {
+ return new CCPoint(
+ vertices[0].X - x,
+ vertices[0].Y - y);
+ }
+
+ Segment connectingSegment = new Segment();
+ Segment segment = new Segment();
+
+ for (int i = 0; i < vertices.Length - 1; i++)
+ {
+ int afterI = i + 1;
+ segment.Point1 = new CCPoint(vertices[i].X, vertices[i].Y);
+ segment.Point2 = new CCPoint(vertices[afterI].X, vertices[afterI].Y);
+
+ var point = new CCPoint (x, y);
+ tempMinDistance = segment.DistanceTo(ref point, out connectingSegment);
+ if (tempMinDistance < minDistance)
+ {
+ pointIndexBefore = i;
+ minDistance = tempMinDistance;
+ vectorToReturn = new CCPoint(
+ connectingSegment.Point2.X - connectingSegment.Point1.X,
+ connectingSegment.Point2.Y - connectingSegment.Point1.Y);
+ }
+ }
+ return vectorToReturn;
+ }
+ }
+}
+
diff --git a/FruityFalls/FruityFalls/FruityFalls.Common/Geometry/Segment.cs b/FruityFalls/FruityFalls/FruityFalls.Common/Geometry/Segment.cs
new file mode 100644
index 000000000..7e5b1833e
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.Common/Geometry/Segment.cs
@@ -0,0 +1,57 @@
+using System;
+using CocosSharp;
+
+namespace FruityFalls.Geometry
+{
+ public class Segment
+ {
+ public CCPoint Point1;
+ public CCPoint Point2;
+
+ public Segment ()
+ {
+ }
+
+ public float DistanceTo(ref CCPoint vector, out Segment connectingSegment)
+ {
+ float segmentLength = (float)this.GetLength();
+
+ CCPoint normalizedLine = new CCPoint(
+ (float)(Point2.X - Point1.X) / segmentLength,
+ (float)(Point2.Y - Point1.Y) / segmentLength);
+
+ CCPoint pointVector = new CCPoint((float)(vector.X - Point1.X), (float)(vector.Y - Point1.Y));
+
+ float length = CCPoint.Dot(pointVector, normalizedLine);
+ connectingSegment = new Segment ();
+ if (length < 0)
+ {
+ connectingSegment.Point1 = vector;
+ connectingSegment.Point2 = Point1;
+
+ return (float) connectingSegment.GetLength();
+ }
+ else if (length > segmentLength)
+ {
+ connectingSegment.Point1 = vector;
+ connectingSegment.Point2 = Point2;
+
+ return (float) connectingSegment.GetLength();
+ }
+ else
+ {
+ connectingSegment.Point1 = vector;
+ connectingSegment.Point2 = new CCPoint(Point1.X + length * normalizedLine.X,
+ Point1.Y + length * normalizedLine.Y);
+
+ return (float)connectingSegment.GetLength();
+ }
+ }
+
+ public double GetLength()
+ {
+ return System.Math.Sqrt((Point2.X - Point1.X) * (Point2.X - Point1.X) + (Point2.Y - Point1.Y) * (Point2.Y - Point1.Y));
+ }
+ }
+}
+
diff --git a/FruityFalls/FruityFalls/FruityFalls.Common/Scenes/GameScene.cs b/FruityFalls/FruityFalls/FruityFalls.Common/Scenes/GameScene.cs
new file mode 100644
index 000000000..d0a9bf549
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.Common/Scenes/GameScene.cs
@@ -0,0 +1,361 @@
+using System;
+using CocosSharp;
+using FruityFalls.Entities;
+using System.Collections.Generic;
+using FruityFalls.Geometry;
+
+namespace FruityFalls.Scenes
+{
+ public class GameScene : CCScene
+ {
+ CCLayer backgroundLayer;
+ CCLayer gameplayLayer;
+ CCLayer foregroundLayer;
+ CCLayer hudLayer;
+
+ int score = 0;
+ ScoreText scoreText;
+
+ Paddle paddle;
+ List fruitList;
+
+ Polygon binSplitter;
+
+ FruitSpawner spawner;
+
+ SolidRectangle splitter;
+
+ List fruitBins;
+ private bool hasGameEnded;
+
+ CCLabel debugLabel;
+
+ public GameScene(CCGameView gameView) : base(gameView)
+ {
+ CreateLayers();
+
+ fruitList = new List();
+
+ CreateBackground();
+
+ CreatePaddle();
+
+ CreateBins();
+
+ CreateForeground();
+
+ CreateTouchListener();
+
+ CreateHud();
+
+ CreateSpawner();
+
+ CreateDebugLabel();
+
+ Schedule(Activity);
+
+ }
+
+ private void CreateForeground()
+ {
+ var foreground = new CCSprite("foreground.png");
+ foreground.IsAntialiased = false;
+ foreground.AnchorPoint = new CCPoint(0, 0);
+ foregroundLayer.AddChild(foreground);
+
+ if(GameCoefficients.ShowCollisionAreas)
+ {
+ // Make it transparent so collision areas are easier to see:
+ foreground.Opacity = 100;
+ }
+ }
+
+ private void CreateDebugLabel()
+ {
+ debugLabel = new CCLabel("DebugLabel", "Arial", 20, CCLabelFormat.SystemFont);
+ debugLabel.PositionX = hudLayer.ContentSize.Width/2.0f;
+ debugLabel.PositionY = 650;
+ debugLabel.HorizontalAlignment = CCTextAlignment.Left;
+ if (GameCoefficients.ShowDebugInfo)
+ {
+ hudLayer.AddChild(debugLabel);
+ }
+ }
+
+ private void CreateBackground()
+ {
+ var background = new CCSprite("background.png");
+ background.AnchorPoint = new CCPoint(0, 0);
+ background.IsAntialiased = false;
+ backgroundLayer.AddChild(background);
+ }
+
+ private void CreateLayers()
+ {
+ backgroundLayer = new CCLayer();
+ this.AddLayer(backgroundLayer);
+
+ gameplayLayer = new CCLayer();
+ this.AddLayer(gameplayLayer);
+
+ foregroundLayer = new CCLayer();
+ this.AddLayer(foregroundLayer);
+
+ hudLayer = new CCLayer();
+ this.AddLayer(hudLayer);
+ }
+
+ private void CreateSpawner()
+ {
+ spawner = new FruitSpawner();
+ spawner.FruitSpawned += HandleFruitAdded;
+ spawner.Layer = gameplayLayer;
+ }
+
+ private void CreateHud()
+ {
+ scoreText = new ScoreText();
+ scoreText.PositionX = 10;
+ scoreText.PositionY = hudLayer.ContentSize.Height - 30;
+ scoreText.Score = 0;
+ hudLayer.AddChild(scoreText);
+ }
+
+ private void CreatePaddle()
+ {
+ paddle = new Paddle();
+ paddle.PositionX = gameplayLayer.ContentSize.Width / 2.0f;
+ paddle.PositionY = gameplayLayer.ContentSize.Height / 2.0f;
+
+ paddle.SetDesiredPositionToCurrentPosition();
+
+ gameplayLayer.AddChild(paddle);
+ }
+
+ private void HandleFruitAdded(Fruit fruit)
+ {
+ fruitList.Add (fruit);
+ gameplayLayer.AddChild (fruit);
+ }
+
+ private void CreateBins()
+ {
+ CCGeometryNode node;
+
+ var gameView = base.GameView;
+
+ fruitBins = new List();
+
+ // make 2 bins for now:
+ var bin = new FruitBin ();
+ bin.FruitColor = FruitColor.Red;
+ bin.Width = gameView.DesignResolution.Width / 2;
+ fruitBins.Add (bin);
+ gameplayLayer.AddChild(bin);
+
+ bin = new FruitBin ();
+ bin.FruitColor = FruitColor.Yellow;
+ // todo: use the screen width to assign this:
+ bin.PositionX = gameView.DesignResolution.Width / 2;
+ bin.Width = gameView.DesignResolution.Width / 2;
+ fruitBins.Add (bin);
+ gameplayLayer.AddChild(bin);
+
+ splitter = new SolidRectangle(20, GameCoefficients.SplitterHeight);
+ splitter.PositionX = gameplayLayer.ContentSize.Width / 2.0f;
+ splitter.PositionY = GameCoefficients.SplitterHeight/2.0f;
+ splitter.Visible = GameCoefficients.ShowCollisionAreas;
+ gameplayLayer.AddChild(splitter);
+ }
+
+ private void CreateTouchListener()
+ {
+ var touchListener = new CCEventListenerTouchAllAtOnce ();
+ touchListener.OnTouchesMoved = HandleTouchesMoved;
+ touchListener.OnTouchesBegan = HandleTouchesBegan;
+ gameplayLayer.AddEventListener (touchListener);
+ }
+
+ private void HandleTouchesBegan(List arg1, CCEvent arg2)
+ {
+ if(hasGameEnded)
+ {
+ var newScene = new TitleScene(GameController.GameView);
+ GameController.GoToScene(newScene);
+ }
+ }
+
+ void HandleTouchesMoved (System.Collections.Generic.List touches, CCEvent touchEvent)
+ {
+ // we only care about the first touch:
+ var locationOnScreen = touches [0].Location;
+
+ paddle.HandleInput (locationOnScreen);
+ }
+
+ private void Activity(float frameTimeInSeconds)
+ {
+ if (hasGameEnded == false)
+ {
+ paddle.Activity(frameTimeInSeconds);
+
+ foreach (var fruit in fruitList)
+ {
+ fruit.Activity(frameTimeInSeconds);
+ }
+
+ spawner.Activity(frameTimeInSeconds);
+
+ DebugActivity();
+
+ PerformCollision();
+ }
+ }
+
+ private void DebugActivity()
+ {
+ if(GameCoefficients.ShowDebugInfo)
+ {
+ debugLabel.Text = spawner.DebugInfo;
+ }
+ }
+
+ private void PerformCollision()
+ {
+ // reverse for loop since fruit may be destroyed:
+ for(int i = fruitList.Count - 1; i > -1; i--)
+ {
+ var fruit = fruitList[i];
+
+ FruitVsPaddle(fruit);
+
+ if(FruitPolygonCollision(fruit, splitter.Polygon, CCPoint.Zero))
+ {
+ CCAudioEngine.SharedEngine.PlayEffect("FruitEdgeBounce");
+ }
+
+ FruitVsBorders(fruit);
+
+ FruitVsBins(fruit);
+ }
+ }
+
+ private void FruitVsPaddle(Fruit fruit)
+ {
+ bool didCollideWithPaddle = FruitPolygonCollision(fruit, paddle.Polygon, paddle.Velocity);
+ if (didCollideWithPaddle)
+ {
+ bool didAddPoint = fruit.TryAddExtraPointValue();
+ if(didAddPoint)
+ {
+ CCAudioEngine.SharedEngine.PlayEffect("FruitPaddleBounce");
+ }
+
+ }
+ }
+
+ private void FruitVsBins(Fruit fruit)
+ {
+ foreach(var bin in fruitBins)
+ {
+ if(bin.Polygon.CollideAgainst(fruit.Collision))
+ {
+ if(bin.FruitColor == fruit.FruitColor)
+ {
+ // award points:
+ score += 1 + fruit.ExtraPointValue;
+ scoreText.Score = score;
+ Destroy(fruit);
+ CCAudioEngine.SharedEngine.PlayEffect("FruitInBin");
+ }
+ else
+ {
+ EndGame();
+ CCAudioEngine.SharedEngine.PlayEffect("GameOver");
+ }
+
+ break;
+ }
+ }
+ }
+
+ private void EndGame()
+ {
+ hasGameEnded = true;
+ spawner.IsSpawning = false;
+ paddle.Visible = false;
+
+
+ // dim the background:
+ var drawNode = new CCDrawNode();
+ drawNode.DrawRect(
+ new CCRect (0,0, 2000, 2000),
+ new CCColor4B(0,0,0,160));
+ hudLayer.Children.Add(drawNode);
+
+
+ var endGameLabel = new CCLabel("Game Over\nFinal Score:" + score,
+ "Arial", 40, CCLabelFormat.SystemFont);
+ endGameLabel.HorizontalAlignment = CCTextAlignment.Center;
+ endGameLabel.Color = CCColor3B.White;
+ endGameLabel.VerticalAlignment = CCVerticalTextAlignment.Center;
+ endGameLabel.PositionX = hudLayer.ContentSize.Width / 2.0f;
+ endGameLabel.PositionY = hudLayer.ContentSize.Height / 2.0f;
+ hudLayer.Children.Add(endGameLabel);
+
+ }
+
+ private void Destroy(Fruit fruit)
+ {
+ fruit.RemoveFromParent();
+ fruitList.Remove(fruit);
+ }
+
+ private static bool FruitPolygonCollision(Fruit fruit, Polygon polygon, CCPoint polygonVelocity)
+ {
+ // Test whether the fruit collides
+ bool didCollide = polygon.CollideAgainst(fruit.Collision);
+
+ if (didCollide)
+ {
+ var circle = fruit.Collision;
+
+ // Get the separation vector to reposition the fruit so it doesn't overlap the polygon
+ var separation = CollisionResponse.GetSeparationVector(circle, polygon);
+ fruit.Position += separation;
+
+ // Adjust the fruit's Velocity to make it bounce:
+ var normal = separation;
+ normal.Normalize();
+ fruit.Velocity = CollisionResponse.ApplyBounce(
+ fruit.Velocity,
+ polygonVelocity,
+ normal,
+ GameCoefficients.FruitCollisionElasticity);
+
+ }
+ return didCollide;
+ }
+
+ private void FruitVsBorders(Fruit fruit)
+ {
+ if(fruit.PositionX - fruit.Radius < 0 && fruit.Velocity.X < 0)
+ {
+ fruit.Velocity.X *= -1 * GameCoefficients.FruitCollisionElasticity;
+ CCAudioEngine.SharedEngine.PlayEffect("FruitEdgeBounce");
+ }
+ if(fruit.PositionX + fruit.Radius > gameplayLayer.ContentSize.Width && fruit.Velocity.X > 0)
+ {
+ fruit.Velocity.X *= -1 * GameCoefficients.FruitCollisionElasticity;
+ CCAudioEngine.SharedEngine.PlayEffect("FruitEdgeBounce");
+
+ }
+ if (fruit.PositionY + fruit.Radius > gameplayLayer.ContentSize.Height && fruit.Velocity.Y > 0)
+ {
+ fruit.Velocity.Y *= -1 * GameCoefficients.FruitCollisionElasticity;
+ CCAudioEngine.SharedEngine.PlayEffect("FruitEdgeBounce");
+ }
+ }
+ }
+}
+
diff --git a/FruityFalls/FruityFalls/FruityFalls.Common/Scenes/TitleScene.cs b/FruityFalls/FruityFalls/FruityFalls.Common/Scenes/TitleScene.cs
new file mode 100644
index 000000000..dde52bfe2
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.Common/Scenes/TitleScene.cs
@@ -0,0 +1,48 @@
+using CocosSharp;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FruityFalls.Scenes
+{
+ public class TitleScene : CCScene
+ {
+ CCLayer layer;
+
+ public TitleScene(CCGameView gameView) : base(gameView)
+ {
+ layer = new CCLayer();
+ this.AddLayer(layer);
+
+ CreateText();
+
+ CreateTouchListener();
+
+ }
+
+ private void CreateText()
+ {
+ var label = new CCLabel("Tap to begin", "Arial", 30, CCLabelFormat.SystemFont);
+ label.PositionX = layer.ContentSize.Width / 2.0f;
+ label.PositionY = layer.ContentSize.Height / 2.0f;
+ label.Color = CCColor3B.Black;
+
+ layer.AddChild(label);
+ }
+
+ private void CreateTouchListener()
+ {
+ var touchListener = new CCEventListenerTouchAllAtOnce();
+ touchListener.OnTouchesBegan = HandleTouchesBegan;
+ layer.AddEventListener(touchListener);
+ }
+
+ private void HandleTouchesBegan(List arg1, CCEvent arg2)
+ {
+ var newScene = new GameScene(GameController.GameView);
+ GameController.GoToScene(newScene);
+ }
+ }
+}
diff --git a/FruityFalls/FruityFalls/FruityFalls.Common/packages.config b/FruityFalls/FruityFalls/FruityFalls.Common/packages.config
new file mode 100644
index 000000000..ad4b976d2
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.Common/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/FruityFalls/FruityFalls/FruityFalls.iOS/AppDelegate.cs b/FruityFalls/FruityFalls/FruityFalls.iOS/AppDelegate.cs
new file mode 100644
index 000000000..41a929504
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.iOS/AppDelegate.cs
@@ -0,0 +1,60 @@
+using Foundation;
+using UIKit;
+
+namespace FruityFalls.iOS
+{
+ // The UIApplicationDelegate for the application. This class is responsible for launching the
+ // User Interface of the application, as well as listening (and optionally responding) to application events from iOS.
+ [Register ("AppDelegate")]
+ public class AppDelegate : UIApplicationDelegate
+ {
+ // class-level declarations
+
+ public override UIWindow Window
+ {
+ get;
+ set;
+ }
+
+ public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
+ {
+ // Override point for customization after application launch.
+ // If not required for your application you can safely delete this method
+
+ return true;
+ }
+
+ public override void OnResignActivation (UIApplication application)
+ {
+ // Invoked when the application is about to move from active to inactive state.
+ // This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message)
+ // or when the user quits the application and it begins the transition to the background state.
+ // Games should use this method to pause the game.
+ }
+
+ public override void DidEnterBackground (UIApplication application)
+ {
+ // Use this method to release shared resources, save user data, invalidate timers and store the application state.
+ // If your application supports background exection this method is called instead of WillTerminate when the user quits.
+ }
+
+ public override void WillEnterForeground (UIApplication application)
+ {
+ // Called as part of the transiton from background to active state.
+ // Here you can undo many of the changes made on entering the background.
+ }
+
+ public override void OnActivated (UIApplication application)
+ {
+ // Restart any tasks that were paused (or not yet started) while the application was inactive.
+ // If the application was previously in the background, optionally refresh the user interface.
+ }
+
+ public override void WillTerminate (UIApplication application)
+ {
+ // Called when the application is about to terminate. Save data, if needed. See also DidEnterBackground.
+ }
+ }
+}
+
+
diff --git a/FruityFalls/FruityFalls/FruityFalls.iOS/Entitlements.plist b/FruityFalls/FruityFalls/FruityFalls.iOS/Entitlements.plist
new file mode 100644
index 000000000..9ae599370
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.iOS/Entitlements.plist
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/FruityFalls/FruityFalls/FruityFalls.iOS/FruityFalls.iOS.csproj b/FruityFalls/FruityFalls/FruityFalls.iOS/FruityFalls.iOS.csproj
new file mode 100644
index 000000000..5e9cd335b
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.iOS/FruityFalls.iOS.csproj
@@ -0,0 +1,171 @@
+
+
+
+ Debug
+ iPhoneSimulator
+ {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ {05B07081-896C-4350-9745-6F5FB87ECB41}
+ Exe
+ FruityFalls.iOS
+ Resources
+ FruityFallsiOS
+
+
+ true
+ full
+ false
+ bin\iPhoneSimulator\Debug
+ DEBUG;
+ prompt
+ 4
+ false
+ i386
+ None
+ true
+ true
+ true
+ true
+ iPhone Developer
+ true
+ NSUrlSessionHandler
+
+
+ full
+ true
+ bin\iPhone\Release
+ prompt
+ 4
+ false
+ ARMv7, ARM64
+ Entitlements.plist
+ true
+ true
+ iPhone Developer
+ true
+ NSUrlSessionHandler
+
+
+ full
+ true
+ bin\iPhoneSimulator\Release
+ prompt
+ 4
+ false
+ i386
+ None
+ true
+ iPhone Developer
+ true
+ NSUrlSessionHandler
+
+
+ true
+ full
+ false
+ bin\iPhone\Debug
+ DEBUG;
+ prompt
+ 4
+ false
+ ARMv7, ARM64
+ Entitlements.plist
+ true
+ iPhone Developer
+ true
+ true
+ true
+ true
+ true
+ NSUrlSessionHandler
+
+
+
+
+
+
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\Xamarin.iOS10\box2d.dll
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\Xamarin.iOS10\CocosSharp.dll
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\Xamarin.iOS10\Lidgren.Network.dll
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\Xamarin.iOS10\MonoGame.Framework.dll
+
+
+ ..\..\packages\CocosSharp.1.7.1.0\lib\Xamarin.iOS10\MonoGame.Framework.Net.dll
+
+
+
+
+ {3A23A1BC-DEFB-4627-987F-70055FC3589D}
+ FruityFalls.Common
+
+
+
+
+ false
+
+
+
+
+
+
+
+
+ Content\Sounds\iOS\FruitEdgeBounce.xnb
+
+
+ Content\Sounds\iOS\FruitInBin.xnb
+
+
+ Content\Sounds\iOS\FruitPaddleBounce.xnb
+
+
+ Content\Sounds\iOS\GameOver.xnb
+
+
+
+
+
+ Content\Images\monkey.png
+
+
+ Content\Images\vine.png
+
+
+ Content\Images\lemon.png
+
+
+ Content\Images\cherry.png
+
+
+
+
+
+
+
+ ViewController.cs
+
+
+
+
+ Content\Images\background.png
+
+
+
+
+ Content\Images\foreground.png
+
+
+
+
+ Content\Sounds\FruityFallsSong.mp3
+
+
+
+
\ No newline at end of file
diff --git a/FruityFalls/FruityFalls/FruityFalls.iOS/Info.plist b/FruityFalls/FruityFalls/FruityFalls.iOS/Info.plist
new file mode 100644
index 000000000..d00fa0eb0
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.iOS/Info.plist
@@ -0,0 +1,47 @@
+
+
+
+
+ CFBundleDisplayName
+ ${AppName}
+ CFBundleIdentifier
+ ${AppIdentifier}
+ CFBundleShortVersionString
+ 1.0
+ CFBundleVersion
+ 1.0
+ LSRequiresIPhoneOS
+
+ MinimumOSVersion
+ 8.0
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIMainStoryboardFile
+ Main
+ UIMainStoryboardFile~ipad
+ Main
+ UIRequiredDeviceCapabilities
+
+ armv7
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ XSAppIconAssets
+ Resources/Images.xcassets/AppIcons.appiconset
+
+
diff --git a/FruityFalls/FruityFalls/FruityFalls.iOS/Main.cs b/FruityFalls/FruityFalls/FruityFalls.iOS/Main.cs
new file mode 100644
index 000000000..6bce27ae0
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.iOS/Main.cs
@@ -0,0 +1,15 @@
+using UIKit;
+
+namespace FruityFalls.iOS
+{
+ public class Application
+ {
+ // This is the main entry point of the application.
+ static void Main (string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main (args, null, "AppDelegate");
+ }
+ }
+}
diff --git a/FruityFalls/FruityFalls/FruityFalls.iOS/Main.storyboard b/FruityFalls/FruityFalls/FruityFalls.iOS/Main.storyboard
new file mode 100644
index 000000000..760aea9c2
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.iOS/Main.storyboard
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/FruityFalls/FruityFalls/FruityFalls.iOS/Resources/Images.xcassets/AppIcons.appiconset/Contents.json b/FruityFalls/FruityFalls/FruityFalls.iOS/Resources/Images.xcassets/AppIcons.appiconset/Contents.json
new file mode 100644
index 000000000..24f997458
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.iOS/Resources/Images.xcassets/AppIcons.appiconset/Contents.json
@@ -0,0 +1,108 @@
+{
+ "images": [
+ {
+ "size": "29x29",
+ "scale": "1x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "29x29",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "29x29",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "40x40",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "40x40",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "57x57",
+ "scale": "1x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "57x57",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "60x60",
+ "scale": "2x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "60x60",
+ "scale": "3x",
+ "idiom": "iphone"
+ },
+ {
+ "size": "29x29",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "29x29",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "40x40",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "40x40",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "50x50",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "50x50",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "72x72",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "72x72",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "76x76",
+ "scale": "1x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "76x76",
+ "scale": "2x",
+ "idiom": "ipad"
+ },
+ {
+ "size": "120x120",
+ "scale": "1x",
+ "idiom": "car"
+ }
+ ],
+ "info": {
+ "version": 1,
+ "author": "xcode"
+ }
+}
\ No newline at end of file
diff --git a/FruityFalls/FruityFalls/FruityFalls.iOS/Resources/LaunchScreen.xib b/FruityFalls/FruityFalls/FruityFalls.iOS/Resources/LaunchScreen.xib
new file mode 100644
index 000000000..666301090
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.iOS/Resources/LaunchScreen.xib
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/FruityFalls/FruityFalls/FruityFalls.iOS/ViewController.cs b/FruityFalls/FruityFalls/FruityFalls.iOS/ViewController.cs
new file mode 100644
index 000000000..67288e2d4
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.iOS/ViewController.cs
@@ -0,0 +1,58 @@
+using System;
+using System.Collections.Generic;
+using UIKit;
+using CocosSharp;
+
+namespace FruityFalls.iOS
+{
+ public partial class ViewController : UIViewController
+ {
+ public ViewController (IntPtr handle) : base (handle)
+ {
+ }
+
+ public override void ViewDidLoad ()
+ {
+ base.ViewDidLoad ();
+
+ if (GameView != null)
+ {
+ // Set loading event to be called once game view is fully initialised
+ GameView.ViewCreated += LoadGame;
+ }
+ }
+
+ public override void ViewWillDisappear (bool animated)
+ {
+ base.ViewWillDisappear (animated);
+
+ if (GameView != null)
+ GameView.Paused = true;
+ }
+
+ public override void ViewDidAppear (bool animated)
+ {
+ base.ViewDidAppear (animated);
+
+ if (GameView != null)
+ GameView.Paused = false;
+ }
+
+ public override void DidReceiveMemoryWarning ()
+ {
+ base.DidReceiveMemoryWarning ();
+ // Release any cached data, images, etc that aren't in use.
+ }
+
+ void LoadGame (object sender, EventArgs e)
+ {
+ CCGameView gameView = sender as CCGameView;
+
+ if (gameView != null)
+ {
+ GameController.Initialize (gameView);
+ }
+ }
+ }
+}
+
diff --git a/FruityFalls/FruityFalls/FruityFalls.iOS/ViewController.designer.cs b/FruityFalls/FruityFalls/FruityFalls.iOS/ViewController.designer.cs
new file mode 100644
index 000000000..3c37eb6fd
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.iOS/ViewController.designer.cs
@@ -0,0 +1,26 @@
+//
+// This file has been generated automatically by MonoDevelop to store outlets and
+// actions made in the Xcode designer. If it is removed, they will be lost.
+// Manual changes to this file may not be handled correctly.
+//
+using Foundation;
+using System.CodeDom.Compiler;
+
+namespace FruityFalls.iOS
+{
+ [Register ("ViewController")]
+ partial class ViewController
+ {
+ [Outlet]
+ CocosSharp.CCGameView GameView { get; set; }
+
+ void ReleaseDesignerOutlets ()
+ {
+ if (GameView != null)
+ {
+ GameView.Dispose ();
+ GameView = null;
+ }
+ }
+ }
+}
diff --git a/FruityFalls/FruityFalls/FruityFalls.iOS/packages.config b/FruityFalls/FruityFalls/FruityFalls.iOS/packages.config
new file mode 100644
index 000000000..f9d024b44
--- /dev/null
+++ b/FruityFalls/FruityFalls/FruityFalls.iOS/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/FruityFalls/Metadata.xml b/FruityFalls/Metadata.xml
new file mode 100644
index 000000000..d14be5b2a
--- /dev/null
+++ b/FruityFalls/Metadata.xml
@@ -0,0 +1,11 @@
+
+
+ e1fc6019-42e0-43cf-95c6-c1ec3a901a1f
+ true
+ Intermediate
+ Games
+ Android, iOS
+ Indie
+ A full Android and iOS physics-based game built on CocosSharp.
+ true
+
diff --git a/FruityFalls/README.md b/FruityFalls/README.md
new file mode 100644
index 000000000..9f76e105f
--- /dev/null
+++ b/FruityFalls/README.md
@@ -0,0 +1,10 @@
+Fruity Falls
+================
+
+Fruity Falls is a full game built with CocosSharp for iOS and Android. It is a physics-based game where the player must bounce and collect fruit to earn a high score. Bouncing the fruit increases its value, and letting the fruit fall into the correctly-colored bin awards the player the points. If a piece of fruit lands in the wrong bin, then the game is over.
+
+This game is built against CocosSharp 1.7.0.
+
+Authors
+-------
+Victor Chelaru
\ No newline at end of file
diff --git a/FruityFalls/Screenshots/optimized.gif b/FruityFalls/Screenshots/optimized.gif
new file mode 100644
index 000000000..e3553278f
Binary files /dev/null and b/FruityFalls/Screenshots/optimized.gif differ
diff --git a/GLKeysES30/Android/Android.csproj b/GLKeysES30/Android/Android.csproj
index a358c8937..e5627bee5 100644
--- a/GLKeysES30/Android/Android.csproj
+++ b/GLKeysES30/Android/Android.csproj
@@ -16,7 +16,7 @@
Assets
False
GLKeysES30
- v4.3
+ v4.4
Properties\AndroidManifest.xml
@@ -30,7 +30,7 @@
None
false
False
- armeabi;armeabi-v7a;x86
+ armeabi-v7a;x86
full
@@ -50,9 +50,9 @@
-
+
diff --git a/GLKeysES30/Android/GLKeysView.cs b/GLKeysES30/Android/GLKeysView.cs
new file mode 100644
index 000000000..f9023e0f1
--- /dev/null
+++ b/GLKeysES30/Android/GLKeysView.cs
@@ -0,0 +1,169 @@
+using System;
+using OpenTK;
+using OpenTK.Graphics;
+using OpenTK.Graphics.ES30;
+using OpenTK.Platform.Android;
+using Android.Graphics;
+using Android.Content;
+using Android.Util;
+using Android.Views;
+using Android.Widget;
+
+namespace GLKeysES30
+{
+ class GLKeysView : AndroidGameView
+ {
+ ES30Keys keys;
+ bool setViewport = true;
+
+ public GLKeysView (Context context, IAttributeSet attrs) :
+ base (context, attrs)
+ {
+ Initialize ();
+ }
+
+ public GLKeysView (IntPtr handle, Android.Runtime.JniHandleOwnership transfer)
+ : base (handle, transfer)
+ {
+ Initialize ();
+ }
+
+ void Initialize ()
+ {
+ keys = new ES30Keys ();
+ AutoSetContextOnRenderFrame = false;
+ RenderOnUIThread = false;
+ }
+
+ protected override void OnContextSet (EventArgs e)
+ {
+ base.OnContextSet (e);
+ Console.WriteLine ("OpenGL version: {0} GLSL version: {1}", GL.GetString (StringName.Version), GL.GetString (StringName.ShadingLanguageVersion));
+ keys.LoadShaders ();
+ keys.CreateTextTextures (CreateBitmapData);
+ keys.InitModel ();
+ keys.Start ();
+ }
+
+ protected override void OnRenderThreadExited (EventArgs e)
+ {
+ base.OnRenderThreadExited (e);
+
+ global::Android.App.Application.SynchronizationContext.Send (_ => {
+ Console.WriteLine ("render thread exited\nexception:\n{0}", RenderThreadException);
+ TextView view = ((LinearLayout) Parent).FindViewById (Resource.Id.TextNotSupported) as TextView;
+ view.LayoutParameters = new LinearLayout.LayoutParams (LinearLayout.LayoutParams.MatchParent, LinearLayout.LayoutParams.MatchParent);
+ view.Visibility = ViewStates.Visible;
+ Parent.RequestLayout ();
+ }, null);
+ }
+
+ protected override void OnLoad (EventArgs e)
+ {
+ // Run the render loop
+ Run (60);
+ }
+
+ protected override void OnResize (EventArgs e)
+ {
+ base.OnResize (e);
+ SetupProjection ();
+ setViewport = true;
+ }
+
+ void CreateBitmapData (string str, out byte[] bitmapData, out int width, out int height)
+ {
+ Paint paint = new Paint ();
+ paint.TextSize = 128;
+ paint.TextAlign = Paint.Align.Left;
+ paint.SetTypeface (Typeface.Default);
+ width = height = 256;
+ float textWidth = paint.MeasureText (str);
+
+ using (Bitmap bitmap = Bitmap.CreateBitmap (width, height, Bitmap.Config.Argb8888)) {
+ Canvas canvas = new Canvas (bitmap);
+ paint.Color = str != " " ? Color.White : Color.LightGray;
+ canvas.DrawRect (new Rect (0, 0, width, height), paint);
+ paint.Color = Color.Black;
+ canvas.DrawText (str, (256 - textWidth) / 2f, (256 - paint.Descent () - paint.Ascent ()) / 2f, paint);
+ bitmapData = new byte [width * height * 4];
+ Java.Nio.ByteBuffer buffer = Java.Nio.ByteBuffer.Allocate (bitmapData.Length);
+ bitmap.CopyPixelsToBuffer (buffer);
+ buffer.Rewind ();
+ buffer.Get (bitmapData, 0, bitmapData.Length);
+ }
+ }
+
+ // This method is called everytime the context needs
+ // to be recreated. Use it to set any egl-specific settings
+ // prior to context creation
+ //
+ // In this particular case, we demonstrate how to set
+ // the graphics mode and fallback in case the device doesn't
+ // support the defaults
+ protected override void CreateFrameBuffer ()
+ {
+ ContextRenderingApi = GLVersion.ES3;
+ // the default GraphicsMode that is set consists of (16, 16, 0, 0, 2, false)
+ try {
+ Log.Verbose ("GLCube", "Loading with default settings");
+
+ // use multisample if possible
+ GraphicsMode = new AndroidGraphicsMode (new ColorFormat (32), 16, 0, 4, 2, false);
+ // if you don't call this, the context won't be created
+ base.CreateFrameBuffer ();
+ } catch (Exception ex) {
+ Log.Verbose ("GLCube", "{0}", ex);
+ // this is a graphics setting that sets everything to the lowest mode possible so
+ // the device returns a reliable graphics setting.
+ try {
+ Log.Verbose ("GLCube", "Loading with custom Android settings (low mode)");
+ GraphicsMode = new AndroidGraphicsMode (0, 0, 0, 0, 0, false);
+
+ // if you don't call this, the context won't be created
+ base.CreateFrameBuffer ();
+ } catch (Exception ex1) {
+ Log.Verbose ("GLCube", "{0}", ex1);
+ throw new Exception ("Can't load egl, aborting");
+ }
+ }
+
+ SetupProjection ();
+ }
+
+ // This gets called on each frame render
+ protected override void OnRenderFrame (FrameEventArgs e)
+ {
+ // you only need to call this if you have delegates
+ // registered that you want to have called
+ base.OnRenderFrame (e);
+ if (setViewport) {
+ setViewport = false;
+ GL.Viewport (0, 0, Width, Height);
+ }
+ keys.RenderFrame ();
+ SwapBuffers ();
+ }
+
+ internal void SetupProjection ()
+ {
+ if (Width <= 0 || Height <= 0)
+ return;
+
+ float aspect = (float)Width / Height;
+ keys.view = Matrix4.LookAt (0, -20, 22.0f, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
+ if (aspect > 1) {
+ Matrix4 scale = Matrix4.Scale (aspect);
+ keys.view = Matrix4.Mult (scale, keys.view);
+ keys.textProjection = Matrix4.Mult (Matrix4.CreateTranslation (1, -1, 0), Matrix4.Scale (.5f, -.5f, 1));
+ } else {
+ keys.textProjection = Matrix4.Mult (Matrix4.CreateTranslation (1, -1, 0), Matrix4.Scale (.5f, -.5f, 1));
+ }
+ keys.projection = Matrix4.CreatePerspectiveFieldOfView (OpenTK.MathHelper.DegreesToRadians (42.0f), aspect, 1.0f, 70.0f);
+ keys.projection = Matrix4.Mult (keys.view, keys.projection);
+ keys.normalMatrix = Matrix4.Invert (keys.view);
+ keys.normalMatrix.Transpose ();
+ }
+ }
+}
+
diff --git a/GLKeysES30/Android/GLView1.cs b/GLKeysES30/Android/GLView1.cs
deleted file mode 100644
index a3dc75d8e..000000000
--- a/GLKeysES30/Android/GLView1.cs
+++ /dev/null
@@ -1,137 +0,0 @@
-using System;
-using OpenTK;
-using OpenTK.Graphics;
-using OpenTK.Graphics.ES30;
-using OpenTK.Platform.Android;
-using Android.Graphics;
-using Android.Content;
-using Android.Util;
-
-namespace GLKeysES30
-{
- class GLView1 : AndroidGameView
- {
- ES30Keys keys;
-
- public GLView1 (Context context) : base (context)
- {
- keys = new ES30Keys ();
- }
- // This gets called when the drawing surface is ready
- protected override void OnLoad (EventArgs e)
- {
- base.OnLoad (e);
-
- MakeCurrent ();
-
- keys.CreateTextTextures (CreateBitmapData);
- keys.InitModel ();
- keys.Start ();
-
- // Run the render loop
- Run ();
- }
-
- protected override void OnResize (EventArgs e)
- {
- base.OnResize (e);
- MakeCurrent ();
- SetupProjection ();
- keys.RenderFrame ();
- }
-
- void CreateBitmapData (string str, out byte[] bitmapData, out int width, out int height)
- {
- Paint paint = new Paint ();
- paint.TextSize = 128;
- paint.TextAlign = Paint.Align.Left;
- paint.SetTypeface (Typeface.Default);
- width = height = 256;
- float textWidth = paint.MeasureText (str);
-
- using (Bitmap bitmap = Bitmap.CreateBitmap (width, height, Bitmap.Config.Argb8888)) {
- Canvas canvas = new Canvas (bitmap);
- paint.Color = str != " " ? Color.White : Color.LightGray;
- canvas.DrawRect (new Rect (0, 0, width, height), paint);
- paint.Color = Color.Black;
- canvas.DrawText (str, (256 - textWidth) / 2f, (256 - paint.Descent () - paint.Ascent ()) / 2f, paint);
- bitmapData = new byte [width * height * 4];
- Java.Nio.ByteBuffer buffer = Java.Nio.ByteBuffer.Allocate (bitmapData.Length);
- bitmap.CopyPixelsToBuffer (buffer);
- buffer.Rewind ();
- buffer.Get (bitmapData, 0, bitmapData.Length);
- }
- }
-
- // This method is called everytime the context needs
- // to be recreated. Use it to set any egl-specific settings
- // prior to context creation
- //
- // In this particular case, we demonstrate how to set
- // the graphics mode and fallback in case the device doesn't
- // support the defaults
- protected override void CreateFrameBuffer ()
- {
- ContextRenderingApi = GLVersion.ES3;
- // the default GraphicsMode that is set consists of (16, 16, 0, 0, 2, false)
- try {
- Log.Verbose ("GLCube", "Loading with default settings");
-
- // use multisample if possible
- GraphicsMode = new AndroidGraphicsMode (new ColorFormat (32), 16, 0, 4, 2, false);
- // if you don't call this, the context won't be created
- base.CreateFrameBuffer ();
- } catch (Exception ex) {
- Log.Verbose ("GLCube", "{0}", ex);
- // this is a graphics setting that sets everything to the lowest mode possible so
- // the device returns a reliable graphics setting.
- try {
- Log.Verbose ("GLCube", "Loading with custom Android settings (low mode)");
- GraphicsMode = new AndroidGraphicsMode (0, 0, 0, 0, 0, false);
-
- // if you don't call this, the context won't be created
- base.CreateFrameBuffer ();
- } catch (Exception ex1) {
- Log.Verbose ("GLCube", "{0}", ex1);
- throw new Exception ("Can't load egl, aborting");
- }
- }
-
- Console.WriteLine ("OpenGL version: {0} GLSL version: {1}", GL.GetString (StringName.Version), GL.GetString (StringName.ShadingLanguageVersion));
- keys.LoadShaders ();
- SetupProjection ();
- }
-
- // This gets called on each frame render
- protected override void OnRenderFrame (FrameEventArgs e)
- {
- // you only need to call this if you have delegates
- // registered that you want to have called
- base.OnRenderFrame (e);
- keys.RenderFrame ();
- SwapBuffers ();
- }
-
- internal void SetupProjection ()
- {
- if (Width <= 0 || Height <= 0)
- return;
-
- float aspect = (float)Width / Height;
- keys.view = Matrix4.LookAt (0, -20, 22.0f, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
- GL.Viewport (0, 0, Width, Height);
- if (aspect > 1) {
- Matrix4 scale = Matrix4.Scale (aspect);
- keys.view = Matrix4.Mult (scale, keys.view);
- keys.textProjection = Matrix4.Mult (Matrix4.CreateTranslation (1, -1, 0), Matrix4.Scale (.5f, -.5f, 1));
- } else {
- keys.textProjection = Matrix4.Mult (Matrix4.CreateTranslation (1, -1, 0), Matrix4.Scale (.5f, -.5f, 1));
- }
- keys.projection = Matrix4.CreatePerspectiveFieldOfView (OpenTK.MathHelper.DegreesToRadians (42.0f), aspect, 1.0f, 70.0f);
- keys.projection = Matrix4.Mult (keys.view, keys.projection);
- keys.normalMatrix = Matrix4.Invert (keys.view);
- keys.normalMatrix.Transpose ();
- }
- }
-}
-
diff --git a/GLKeysES30/Android/MainActivity.cs b/GLKeysES30/Android/MainActivity.cs
index 83c550dc4..70c4b1773 100644
--- a/GLKeysES30/Android/MainActivity.cs
+++ b/GLKeysES30/Android/MainActivity.cs
@@ -18,31 +18,12 @@ namespace GLKeysES30
Theme = "@android:style/Theme.Black.NoTitleBar.Fullscreen")]
public class MainActivity : Activity
{
- GLView1 view;
-
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
- // Create our OpenGL view, and display it
- view = new GLView1 (this);
- SetContentView (view);
- }
-
- protected override void OnPause ()
- {
- // never forget to do this!
- base.OnPause ();
- view.Pause ();
- }
-
- protected override void OnResume ()
- {
- // never forget to do this!
- base.OnResume ();
- view.Resume ();
+ // Inflate our UI from its XML layout description
+ SetContentView (Resource.Layout.Main);
}
}
}
-
-
diff --git a/GLKeysES30/Android/Resources/layout/Main.axml b/GLKeysES30/Android/Resources/layout/Main.axml
index 0da95fc50..975a8928c 100644
--- a/GLKeysES30/Android/Resources/layout/Main.axml
+++ b/GLKeysES30/Android/Resources/layout/Main.axml
@@ -3,6 +3,24 @@
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
- >
-
-
+ android:id="@+id/linearLayout2"
+ android:minWidth="25px"
+ android:minHeight="25px">
+
+
+
\ No newline at end of file
diff --git a/GLKeysES30/iOS/Info.plist b/GLKeysES30/iOS/Info.plist
index 255641741..5f6606355 100644
--- a/GLKeysES30/iOS/Info.plist
+++ b/GLKeysES30/iOS/Info.plist
@@ -25,6 +25,6 @@
UIInterfaceOrientationLandscapeRight
MinimumOSVersion
- 6.0
+ 8.0
diff --git a/GLKeysES30/iOS/iOS.csproj b/GLKeysES30/iOS/iOS.csproj
index 481944fec..0c9206c05 100644
--- a/GLKeysES30/iOS/iOS.csproj
+++ b/GLKeysES30/iOS/iOS.csproj
@@ -1,4 +1,4 @@
-
+
Debug
@@ -27,6 +27,7 @@
true
GLKeysES30
i386
+ NSUrlSessionHandler
full
@@ -39,6 +40,7 @@
Entitlements.plist
GLKeysES30
i386
+ NSUrlSessionHandler
true
@@ -52,12 +54,11 @@
Entitlements.plist
true
iPhone Developer
-
-
-
-
+
+
ARMv7
MonotouchGLKeysES30
+ NSUrlSessionHandler
full
@@ -70,6 +71,7 @@
iPhone Developer
MonotouchGLKeysES30
ARMv7, ARM64
+ NSUrlSessionHandler
full
@@ -84,6 +86,7 @@
iPhone Distribution
MonotouchGLKeysES30
ARMv7, ARM64
+ NSUrlSessionHandler
full
@@ -97,6 +100,7 @@
Automatic:AppStore
MonotouchGLKeysES30
ARMv7, ARM64
+ NSUrlSessionHandler
diff --git a/GoneBananas/README.md b/GoneBananas/README.md
index 9f9a90798..75eee4d89 100644
--- a/GoneBananas/README.md
+++ b/GoneBananas/README.md
@@ -1,4 +1,4 @@
Gone Bananas
============
-Sample moved to cocos-sharp-samples repository
\ No newline at end of file
+Sample moved to [cocos-sharp-samples repository](https://github.com/mono/cocos-sharp-samples/tree/master/GoneBananas).
\ No newline at end of file
diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md
new file mode 100644
index 000000000..9bd97c4f2
--- /dev/null
+++ b/ISSUE_TEMPLATE.md
@@ -0,0 +1,28 @@
+### Sample
+
+
+
+### Description
+
+
+
+### Steps to Reproduce
+
+1.
+2.
+3.
+
+### Expected Behavior
+
+
+### Actual Behavior
+
+
+### Information
+
+- IDE and IDE version:
+- Platform with the issue:
+ - iOS:
+ - Android:
+ - UWP:
+- Device or simulator/emulator:
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 000000000..cc1baa77a
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,13 @@
+ Copyright 2011 Xamarin Inc
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/LivePlayer/BasicCalculator/Calculator.Droid/Assets/AboutAssets.txt b/LivePlayer/BasicCalculator/Calculator.Droid/Assets/AboutAssets.txt
new file mode 100755
index 000000000..5ddf08729
--- /dev/null
+++ b/LivePlayer/BasicCalculator/Calculator.Droid/Assets/AboutAssets.txt
@@ -0,0 +1,19 @@
+Any raw assets you want to be deployed with your application can be placed in
+this directory (and child directories) and given a Build Action of "AndroidAsset".
+
+These files will be deployed with you package and will be accessible using Android's
+AssetManager, like this:
+
+public class ReadAsset : Activity
+{
+ protected override void OnCreate (Bundle bundle)
+ {
+ base.OnCreate (bundle);
+
+ InputStream input = Assets.Open ("my_asset.txt");
+ }
+}
+
+Additionally, some Android functions will automatically load asset files:
+
+Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf");
diff --git a/LivePlayer/BasicCalculator/Calculator.Droid/Calculator.Droid.csproj b/LivePlayer/BasicCalculator/Calculator.Droid/Calculator.Droid.csproj
new file mode 100644
index 000000000..67595f06b
--- /dev/null
+++ b/LivePlayer/BasicCalculator/Calculator.Droid/Calculator.Droid.csproj
@@ -0,0 +1,189 @@
+
+
+
+ Debug
+ AnyCPU
+ {5F01C20B-7694-46E2-AA2F-95F611A89EA5}
+ {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ Library
+ Properties
+ Calculator.Droid
+ Calculator.Droid
+ 512
+ true
+ Resources\Resource.Designer.cs
+ Off
+ Properties\AndroidManifest.xml
+ True
+ armeabi-v7a,x86
+
+
+
+
+
+
+
+ v7.1
+
+
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+ None
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+ False
+
+
+
+
+
+
+
+
+
+ ..\packages\Xamarin.Forms.2.3.4.231\lib\MonoAndroid10\FormsViewGroup.dll
+
+
+ ..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Animated.Vector.Drawable.dll
+
+
+ ..\packages\Xamarin.Android.Support.Annotations.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Annotations.dll
+
+
+ ..\packages\Xamarin.Android.Support.Compat.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Compat.dll
+
+
+ ..\packages\Xamarin.Android.Support.Core.UI.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Core.UI.dll
+
+
+ ..\packages\Xamarin.Android.Support.Core.Utils.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Core.Utils.dll
+
+
+ ..\packages\Xamarin.Android.Support.Design.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Design.dll
+
+
+ ..\packages\Xamarin.Android.Support.Fragment.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Fragment.dll
+
+
+ ..\packages\Xamarin.Android.Support.Media.Compat.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Media.Compat.dll
+
+
+ ..\packages\Xamarin.Android.Support.Transition.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Transition.dll
+
+
+ ..\packages\Xamarin.Android.Support.v4.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v4.dll
+
+
+ ..\packages\Xamarin.Android.Support.v7.AppCompat.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v7.AppCompat.dll
+
+
+ ..\packages\Xamarin.Android.Support.v7.CardView.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v7.CardView.dll
+
+
+ ..\packages\Xamarin.Android.Support.v7.MediaRouter.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v7.MediaRouter.dll
+
+
+ ..\packages\Xamarin.Android.Support.v7.Palette.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v7.Palette.dll
+
+
+ ..\packages\Xamarin.Android.Support.v7.RecyclerView.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v7.RecyclerView.dll
+
+
+ ..\packages\Xamarin.Android.Support.Vector.Drawable.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Vector.Drawable.dll
+
+
+ ..\packages\Xamarin.Forms.2.3.4.231\lib\MonoAndroid10\Xamarin.Forms.Core.dll
+
+
+ ..\packages\Xamarin.Forms.2.3.4.231\lib\MonoAndroid10\Xamarin.Forms.Platform.Android.dll
+
+
+ ..\packages\Xamarin.Forms.2.3.4.231\lib\MonoAndroid10\Xamarin.Forms.Platform.dll
+
+
+ ..\packages\Xamarin.Forms.2.3.4.231\lib\MonoAndroid10\Xamarin.Forms.Xaml.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {19ADA269-ACAE-49A2-8485-5ABBAAE026DC}
+ Calculator
+
+
+
+
+
+
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/BasicCalculator/Calculator.Droid/MainActivity.cs b/LivePlayer/BasicCalculator/Calculator.Droid/MainActivity.cs
new file mode 100755
index 000000000..004829831
--- /dev/null
+++ b/LivePlayer/BasicCalculator/Calculator.Droid/MainActivity.cs
@@ -0,0 +1,24 @@
+using System;
+
+using Android.App;
+using Android.Content.PM;
+using Android.Runtime;
+using Android.Views;
+using Android.Widget;
+using Android.OS;
+
+namespace Calculator.Droid
+{
+ [Activity(Label = "Calculator", Icon = "@drawable/icon", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
+ public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity
+ {
+ protected override void OnCreate(Bundle bundle)
+ {
+ base.OnCreate(bundle);
+
+ global::Xamarin.Forms.Forms.Init(this, bundle);
+ LoadApplication(new App());
+ }
+ }
+}
+
diff --git a/LivePlayer/BasicCalculator/Calculator.Droid/Properties/AndroidManifest.xml b/LivePlayer/BasicCalculator/Calculator.Droid/Properties/AndroidManifest.xml
new file mode 100755
index 000000000..8bf0a5edd
--- /dev/null
+++ b/LivePlayer/BasicCalculator/Calculator.Droid/Properties/AndroidManifest.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/BasicCalculator/Calculator.Droid/Properties/AssemblyInfo.cs b/LivePlayer/BasicCalculator/Calculator.Droid/Properties/AssemblyInfo.cs
new file mode 100755
index 000000000..16b81cbbf
--- /dev/null
+++ b/LivePlayer/BasicCalculator/Calculator.Droid/Properties/AssemblyInfo.cs
@@ -0,0 +1,34 @@
+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("Calculator.Droid")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Calculator.Droid")]
+[assembly: AssemblyCopyright("Copyright © 2014")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+[assembly: ComVisible(false)]
+
+// 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)]
diff --git a/LivePlayer/BasicCalculator/Calculator.Droid/Resources/AboutResources.txt b/LivePlayer/BasicCalculator/Calculator.Droid/Resources/AboutResources.txt
new file mode 100755
index 000000000..cb30f20b1
--- /dev/null
+++ b/LivePlayer/BasicCalculator/Calculator.Droid/Resources/AboutResources.txt
@@ -0,0 +1,50 @@
+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.xml),
+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-hdpi/
+ icon.png
+
+ drawable-ldpi/
+ icon.png
+
+ drawable-mdpi/
+ icon.png
+
+ layout/
+ main.xml
+
+ 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
+"Resource" that contains the tokens for each one of the resources included. For example,
+for the above Resources layout, this is what the Resource class would expose:
+
+public class Resource {
+ 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 Resource.layout.main
+to reference the layout/main.xml file, or Resource.strings.first_string to reference the first
+string in the dictionary file values/strings.xml.
diff --git a/LivePlayer/BasicCalculator/Calculator.Droid/Resources/drawable-hdpi/icon.png b/LivePlayer/BasicCalculator/Calculator.Droid/Resources/drawable-hdpi/icon.png
new file mode 100755
index 000000000..964f110ab
Binary files /dev/null and b/LivePlayer/BasicCalculator/Calculator.Droid/Resources/drawable-hdpi/icon.png differ
diff --git a/LivePlayer/BasicCalculator/Calculator.Droid/Resources/drawable-xhdpi/icon.png b/LivePlayer/BasicCalculator/Calculator.Droid/Resources/drawable-xhdpi/icon.png
new file mode 100755
index 000000000..3c01e60ce
Binary files /dev/null and b/LivePlayer/BasicCalculator/Calculator.Droid/Resources/drawable-xhdpi/icon.png differ
diff --git a/LivePlayer/BasicCalculator/Calculator.Droid/Resources/drawable-xxhdpi/icon.png b/LivePlayer/BasicCalculator/Calculator.Droid/Resources/drawable-xxhdpi/icon.png
new file mode 100755
index 000000000..0d8c1c57d
Binary files /dev/null and b/LivePlayer/BasicCalculator/Calculator.Droid/Resources/drawable-xxhdpi/icon.png differ
diff --git a/LivePlayer/BasicCalculator/Calculator.Droid/Resources/drawable/icon.png b/LivePlayer/BasicCalculator/Calculator.Droid/Resources/drawable/icon.png
new file mode 100755
index 000000000..b0ba7150f
Binary files /dev/null and b/LivePlayer/BasicCalculator/Calculator.Droid/Resources/drawable/icon.png differ
diff --git a/LivePlayer/BasicCalculator/Calculator.Droid/packages.config b/LivePlayer/BasicCalculator/Calculator.Droid/packages.config
new file mode 100644
index 000000000..5c8346024
--- /dev/null
+++ b/LivePlayer/BasicCalculator/Calculator.Droid/packages.config
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/BasicCalculator/Calculator.iOS/AppDelegate.cs b/LivePlayer/BasicCalculator/Calculator.iOS/AppDelegate.cs
new file mode 100755
index 000000000..c6c60e046
--- /dev/null
+++ b/LivePlayer/BasicCalculator/Calculator.iOS/AppDelegate.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using Foundation;
+using UIKit;
+
+namespace Calculator.iOS
+{
+ // The UIApplicationDelegate for the application. This class is responsible for launching the
+ // User Interface of the application, as well as listening (and optionally responding) to
+ // application events from iOS.
+ [Register("AppDelegate")]
+ public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
+ {
+ //
+ // This method is invoked when the application has loaded and is ready to run. In this
+ // method you should instantiate the window, load the UI into it and then make the window
+ // visible.
+ //
+ // You have 17 seconds to return from this method, or iOS will terminate your application.
+ //
+ public override bool FinishedLaunching(UIApplication app, NSDictionary options)
+ {
+ global::Xamarin.Forms.Forms.Init();
+ LoadApplication(new App());
+
+ return base.FinishedLaunching(app, options);
+ }
+ }
+}
diff --git a/LivePlayer/BasicCalculator/Calculator.iOS/Calculator.iOS.csproj b/LivePlayer/BasicCalculator/Calculator.iOS/Calculator.iOS.csproj
new file mode 100644
index 000000000..59dd95210
--- /dev/null
+++ b/LivePlayer/BasicCalculator/Calculator.iOS/Calculator.iOS.csproj
@@ -0,0 +1,147 @@
+
+
+
+ Debug
+ iPhoneSimulator
+ {0CCA8DAB-5E7F-4217-9AC2-F2A82BE069C2}
+ {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ Exe
+ Calculator.iOS
+ Resources
+ CalculatoriOS
+
+
+
+ true
+ full
+ false
+ bin\iPhoneSimulator\Debug
+ DEBUG;ENABLE_TEST_CLOUD;
+ prompt
+ 4
+ false
+ i386, x86_64
+ None
+ true
+ true
+ NSUrlSessionHandler
+
+
+ full
+ true
+ bin\iPhoneSimulator\Release
+ prompt
+ 4
+ i386, x86_64
+ false
+ None
+ NSUrlSessionHandler
+
+
+ true
+ full
+ false
+ bin\iPhone\Debug
+ DEBUG;ENABLE_TEST_CLOUD;
+ prompt
+ 4
+ false
+ ARMv7, ARM64
+ Entitlements.plist
+ true
+ iPhone Developer
+ true
+ NSUrlSessionHandler
+
+
+ full
+ true
+ bin\iPhone\Release
+ prompt
+ 4
+ Entitlements.plist
+ ARMv7, ARM64
+ false
+ iPhone Developer
+ NSUrlSessionHandler
+
+
+ none
+ True
+ bin\iPhone\Ad-Hoc
+ prompt
+ 4
+ False
+ ARMv7, ARM64
+ True
+ Automatic:AdHoc
+ iPhone Developer
+ NSUrlSessionHandler
+
+
+ none
+ True
+ bin\iPhone\AppStore
+ prompt
+ 4
+ False
+ ARMv7, ARM64
+ Automatic:AppStore
+ iPhone Distribution
+ NSUrlSessionHandler
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ..\packages\Xamarin.Forms.2.3.4.231\lib\Xamarin.iOS10\Xamarin.Forms.Core.dll
+
+
+ ..\packages\Xamarin.Forms.2.3.4.231\lib\Xamarin.iOS10\Xamarin.Forms.Platform.dll
+
+
+ ..\packages\Xamarin.Forms.2.3.4.231\lib\Xamarin.iOS10\Xamarin.Forms.Platform.iOS.dll
+
+
+ ..\packages\Xamarin.Forms.2.3.4.231\lib\Xamarin.iOS10\Xamarin.Forms.Xaml.dll
+
+
+
+
+
+ {19ADA269-ACAE-49A2-8485-5ABBAAE026DC}
+ Calculator
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/BasicCalculator/Calculator.iOS/Entitlements.plist b/LivePlayer/BasicCalculator/Calculator.iOS/Entitlements.plist
new file mode 100755
index 000000000..5ea1ec76e
--- /dev/null
+++ b/LivePlayer/BasicCalculator/Calculator.iOS/Entitlements.plist
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/LivePlayer/BasicCalculator/Calculator.iOS/Info.plist b/LivePlayer/BasicCalculator/Calculator.iOS/Info.plist
new file mode 100755
index 000000000..df17aba92
--- /dev/null
+++ b/LivePlayer/BasicCalculator/Calculator.iOS/Info.plist
@@ -0,0 +1,54 @@
+
+
+
+
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ MinimumOSVersion
+ 9.0
+ CFBundleDisplayName
+ Calculator
+ CFBundleIdentifier
+ com.yourcompany.Calculator
+ CFBundleVersion
+ 1.0
+ CFBundleIconFiles
+
+ Icon-60@2x
+ Icon-60@3x
+ Icon-76
+ Icon-76@2x
+ Default
+ Default@2x
+ Default-568h@2x
+ Default-Portrait
+ Default-Portrait@2x
+ Icon-Small-40
+ Icon-Small-40@2x
+ Icon-Small-40@3x
+ Icon-Small
+ Icon-Small@2x
+ Icon-Small@3x
+
+ UILaunchStoryboardName
+ LaunchScreen
+ CFBundleName
+ Calculator
+
+
diff --git a/LivePlayer/BasicCalculator/Calculator.iOS/Main.cs b/LivePlayer/BasicCalculator/Calculator.iOS/Main.cs
new file mode 100755
index 000000000..077f6c7cb
--- /dev/null
+++ b/LivePlayer/BasicCalculator/Calculator.iOS/Main.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using Foundation;
+using UIKit;
+
+namespace Calculator.iOS
+{
+ public class Application
+ {
+ // This is the main entry point of the application.
+ static void Main(string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main(args, null, "AppDelegate");
+ }
+ }
+}
diff --git a/LivePlayer/BasicCalculator/Calculator.iOS/Properties/AssemblyInfo.cs b/LivePlayer/BasicCalculator/Calculator.iOS/Properties/AssemblyInfo.cs
new file mode 100755
index 000000000..13c4e933a
--- /dev/null
+++ b/LivePlayer/BasicCalculator/Calculator.iOS/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 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("Calculator.iOS")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Calculator.iOS")]
+[assembly: AssemblyCopyright("Copyright © 2014")]
+[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("72bdc44f-c588-44f3-b6df-9aace7daafdd")]
+
+// 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")]
diff --git a/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Default-568h@2x.png b/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Default-568h@2x.png
new file mode 100755
index 000000000..26c6461e5
Binary files /dev/null and b/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Default-568h@2x.png differ
diff --git a/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Default-Portrait.png b/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Default-Portrait.png
new file mode 100755
index 000000000..5d0d1ab4c
Binary files /dev/null and b/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Default-Portrait.png differ
diff --git a/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Default-Portrait@2x.png b/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Default-Portrait@2x.png
new file mode 100755
index 000000000..0ee2688e8
Binary files /dev/null and b/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Default-Portrait@2x.png differ
diff --git a/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Default.png b/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Default.png
new file mode 100755
index 000000000..b74643c0a
Binary files /dev/null and b/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Default.png differ
diff --git a/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Default@2x.png b/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Default@2x.png
new file mode 100755
index 000000000..dbd6bd3e8
Binary files /dev/null and b/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Default@2x.png differ
diff --git a/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Icon-60@2x.png b/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Icon-60@2x.png
new file mode 100755
index 000000000..4b03c4270
Binary files /dev/null and b/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Icon-60@2x.png differ
diff --git a/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Icon-60@3x.png b/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Icon-60@3x.png
new file mode 100755
index 000000000..b03ca1bbc
Binary files /dev/null and b/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Icon-60@3x.png differ
diff --git a/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Icon-76.png b/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Icon-76.png
new file mode 100755
index 000000000..587982e2a
Binary files /dev/null and b/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Icon-76.png differ
diff --git a/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Icon-76@2x.png b/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Icon-76@2x.png
new file mode 100755
index 000000000..cd4e2c8fe
Binary files /dev/null and b/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Icon-76@2x.png differ
diff --git a/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Icon-Small-40.png b/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Icon-Small-40.png
new file mode 100755
index 000000000..6acff9441
Binary files /dev/null and b/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Icon-Small-40.png differ
diff --git a/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Icon-Small-40@2x.png b/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Icon-Small-40@2x.png
new file mode 100755
index 000000000..b833aac26
Binary files /dev/null and b/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Icon-Small-40@2x.png differ
diff --git a/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Icon-Small-40@3x.png b/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Icon-Small-40@3x.png
new file mode 100755
index 000000000..ab8654e49
Binary files /dev/null and b/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Icon-Small-40@3x.png differ
diff --git a/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Icon-Small.png b/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Icon-Small.png
new file mode 100755
index 000000000..33db7e714
Binary files /dev/null and b/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Icon-Small.png differ
diff --git a/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Icon-Small@2x.png b/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Icon-Small@2x.png
new file mode 100755
index 000000000..bf45e2592
Binary files /dev/null and b/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Icon-Small@2x.png differ
diff --git a/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Icon-Small@3x.png b/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Icon-Small@3x.png
new file mode 100755
index 000000000..7ad3891b9
Binary files /dev/null and b/LivePlayer/BasicCalculator/Calculator.iOS/Resources/Icon-Small@3x.png differ
diff --git a/LivePlayer/BasicCalculator/Calculator.iOS/Resources/LaunchScreen.storyboard b/LivePlayer/BasicCalculator/Calculator.iOS/Resources/LaunchScreen.storyboard
new file mode 100644
index 000000000..e7fb4aac8
--- /dev/null
+++ b/LivePlayer/BasicCalculator/Calculator.iOS/Resources/LaunchScreen.storyboard
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/BasicCalculator/Calculator.iOS/iTunesArtwork b/LivePlayer/BasicCalculator/Calculator.iOS/iTunesArtwork
new file mode 100755
index 000000000..94c8ebd6b
Binary files /dev/null and b/LivePlayer/BasicCalculator/Calculator.iOS/iTunesArtwork differ
diff --git a/LivePlayer/BasicCalculator/Calculator.iOS/iTunesArtwork@2x b/LivePlayer/BasicCalculator/Calculator.iOS/iTunesArtwork@2x
new file mode 100755
index 000000000..fa2ebf72d
Binary files /dev/null and b/LivePlayer/BasicCalculator/Calculator.iOS/iTunesArtwork@2x differ
diff --git a/LivePlayer/BasicCalculator/Calculator.iOS/packages.config b/LivePlayer/BasicCalculator/Calculator.iOS/packages.config
new file mode 100644
index 000000000..dfb0a0c48
--- /dev/null
+++ b/LivePlayer/BasicCalculator/Calculator.iOS/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/BasicCalculator/Calculator.sln b/LivePlayer/BasicCalculator/Calculator.sln
new file mode 100755
index 000000000..a28d458ad
--- /dev/null
+++ b/LivePlayer/BasicCalculator/Calculator.sln
@@ -0,0 +1,136 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.26228.9
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Calculator", "Calculator\Calculator.csproj", "{19ADA269-ACAE-49A2-8485-5ABBAAE026DC}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Calculator.iOS", "Calculator.iOS\Calculator.iOS.csproj", "{0CCA8DAB-5E7F-4217-9AC2-F2A82BE069C2}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Calculator.Droid", "Calculator.Droid\Calculator.Droid.csproj", "{5F01C20B-7694-46E2-AA2F-95F611A89EA5}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Ad-Hoc|Any CPU = Ad-Hoc|Any CPU
+ Ad-Hoc|ARM = Ad-Hoc|ARM
+ Ad-Hoc|iPhone = Ad-Hoc|iPhone
+ Ad-Hoc|iPhoneSimulator = Ad-Hoc|iPhoneSimulator
+ Ad-Hoc|x86 = Ad-Hoc|x86
+ AppStore|Any CPU = AppStore|Any CPU
+ AppStore|ARM = AppStore|ARM
+ AppStore|iPhone = AppStore|iPhone
+ AppStore|iPhoneSimulator = AppStore|iPhoneSimulator
+ AppStore|x86 = AppStore|x86
+ Debug|Any CPU = Debug|Any CPU
+ Debug|ARM = Debug|ARM
+ Debug|iPhone = Debug|iPhone
+ Debug|iPhoneSimulator = Debug|iPhoneSimulator
+ Debug|x86 = Debug|x86
+ Release|Any CPU = Release|Any CPU
+ Release|ARM = Release|ARM
+ Release|iPhone = Release|iPhone
+ Release|iPhoneSimulator = Release|iPhoneSimulator
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {19ADA269-ACAE-49A2-8485-5ABBAAE026DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {19ADA269-ACAE-49A2-8485-5ABBAAE026DC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {19ADA269-ACAE-49A2-8485-5ABBAAE026DC}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {19ADA269-ACAE-49A2-8485-5ABBAAE026DC}.Debug|ARM.Build.0 = Debug|Any CPU
+ {19ADA269-ACAE-49A2-8485-5ABBAAE026DC}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {19ADA269-ACAE-49A2-8485-5ABBAAE026DC}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {19ADA269-ACAE-49A2-8485-5ABBAAE026DC}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {19ADA269-ACAE-49A2-8485-5ABBAAE026DC}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {19ADA269-ACAE-49A2-8485-5ABBAAE026DC}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {19ADA269-ACAE-49A2-8485-5ABBAAE026DC}.Debug|x86.Build.0 = Debug|Any CPU
+ {19ADA269-ACAE-49A2-8485-5ABBAAE026DC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {19ADA269-ACAE-49A2-8485-5ABBAAE026DC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {19ADA269-ACAE-49A2-8485-5ABBAAE026DC}.Release|ARM.ActiveCfg = Release|Any CPU
+ {19ADA269-ACAE-49A2-8485-5ABBAAE026DC}.Release|ARM.Build.0 = Release|Any CPU
+ {19ADA269-ACAE-49A2-8485-5ABBAAE026DC}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {19ADA269-ACAE-49A2-8485-5ABBAAE026DC}.Release|iPhone.Build.0 = Release|Any CPU
+ {19ADA269-ACAE-49A2-8485-5ABBAAE026DC}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {19ADA269-ACAE-49A2-8485-5ABBAAE026DC}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {19ADA269-ACAE-49A2-8485-5ABBAAE026DC}.Release|x86.ActiveCfg = Release|Any CPU
+ {19ADA269-ACAE-49A2-8485-5ABBAAE026DC}.Release|x86.Build.0 = Release|Any CPU
+ {0CCA8DAB-5E7F-4217-9AC2-F2A82BE069C2}.Debug|Any CPU.ActiveCfg = Debug|iPhone
+ {0CCA8DAB-5E7F-4217-9AC2-F2A82BE069C2}.Debug|Any CPU.Build.0 = Debug|iPhone
+ {0CCA8DAB-5E7F-4217-9AC2-F2A82BE069C2}.Debug|ARM.ActiveCfg = Debug|iPhone
+ {0CCA8DAB-5E7F-4217-9AC2-F2A82BE069C2}.Debug|iPhone.ActiveCfg = Debug|iPhone
+ {0CCA8DAB-5E7F-4217-9AC2-F2A82BE069C2}.Debug|iPhone.Build.0 = Debug|iPhone
+ {0CCA8DAB-5E7F-4217-9AC2-F2A82BE069C2}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
+ {0CCA8DAB-5E7F-4217-9AC2-F2A82BE069C2}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
+ {0CCA8DAB-5E7F-4217-9AC2-F2A82BE069C2}.Debug|x86.ActiveCfg = Debug|iPhone
+ {0CCA8DAB-5E7F-4217-9AC2-F2A82BE069C2}.Release|Any CPU.ActiveCfg = Release|iPhone
+ {0CCA8DAB-5E7F-4217-9AC2-F2A82BE069C2}.Release|Any CPU.Build.0 = Release|iPhone
+ {0CCA8DAB-5E7F-4217-9AC2-F2A82BE069C2}.Release|ARM.ActiveCfg = Release|iPhone
+ {0CCA8DAB-5E7F-4217-9AC2-F2A82BE069C2}.Release|iPhone.ActiveCfg = Release|iPhone
+ {0CCA8DAB-5E7F-4217-9AC2-F2A82BE069C2}.Release|iPhone.Build.0 = Release|iPhone
+ {0CCA8DAB-5E7F-4217-9AC2-F2A82BE069C2}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
+ {0CCA8DAB-5E7F-4217-9AC2-F2A82BE069C2}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
+ {0CCA8DAB-5E7F-4217-9AC2-F2A82BE069C2}.Release|x86.ActiveCfg = Release|iPhone
+ {5F01C20B-7694-46E2-AA2F-95F611A89EA5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5F01C20B-7694-46E2-AA2F-95F611A89EA5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5F01C20B-7694-46E2-AA2F-95F611A89EA5}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {5F01C20B-7694-46E2-AA2F-95F611A89EA5}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {5F01C20B-7694-46E2-AA2F-95F611A89EA5}.Debug|ARM.Build.0 = Debug|Any CPU
+ {5F01C20B-7694-46E2-AA2F-95F611A89EA5}.Debug|ARM.Deploy.0 = Debug|Any CPU
+ {5F01C20B-7694-46E2-AA2F-95F611A89EA5}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {5F01C20B-7694-46E2-AA2F-95F611A89EA5}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {5F01C20B-7694-46E2-AA2F-95F611A89EA5}.Debug|iPhone.Deploy.0 = Debug|Any CPU
+ {5F01C20B-7694-46E2-AA2F-95F611A89EA5}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {5F01C20B-7694-46E2-AA2F-95F611A89EA5}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {5F01C20B-7694-46E2-AA2F-95F611A89EA5}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU
+ {5F01C20B-7694-46E2-AA2F-95F611A89EA5}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {5F01C20B-7694-46E2-AA2F-95F611A89EA5}.Debug|x86.Build.0 = Debug|Any CPU
+ {5F01C20B-7694-46E2-AA2F-95F611A89EA5}.Debug|x86.Deploy.0 = Debug|Any CPU
+ {5F01C20B-7694-46E2-AA2F-95F611A89EA5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5F01C20B-7694-46E2-AA2F-95F611A89EA5}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5F01C20B-7694-46E2-AA2F-95F611A89EA5}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ {5F01C20B-7694-46E2-AA2F-95F611A89EA5}.Release|ARM.ActiveCfg = Release|Any CPU
+ {5F01C20B-7694-46E2-AA2F-95F611A89EA5}.Release|ARM.Build.0 = Release|Any CPU
+ {5F01C20B-7694-46E2-AA2F-95F611A89EA5}.Release|ARM.Deploy.0 = Release|Any CPU
+ {5F01C20B-7694-46E2-AA2F-95F611A89EA5}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {5F01C20B-7694-46E2-AA2F-95F611A89EA5}.Release|iPhone.Build.0 = Release|Any CPU
+ {5F01C20B-7694-46E2-AA2F-95F611A89EA5}.Release|iPhone.Deploy.0 = Release|Any CPU
+ {5F01C20B-7694-46E2-AA2F-95F611A89EA5}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {5F01C20B-7694-46E2-AA2F-95F611A89EA5}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {5F01C20B-7694-46E2-AA2F-95F611A89EA5}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU
+ {5F01C20B-7694-46E2-AA2F-95F611A89EA5}.Release|x86.ActiveCfg = Release|Any CPU
+ {5F01C20B-7694-46E2-AA2F-95F611A89EA5}.Release|x86.Build.0 = Release|Any CPU
+ {5F01C20B-7694-46E2-AA2F-95F611A89EA5}.Release|x86.Deploy.0 = Release|Any CPU
+ {4FA132D5-68B4-4BD7-99FA-76AFBB19E9FE}.Debug|Any CPU.ActiveCfg = Debug|x86
+ {4FA132D5-68B4-4BD7-99FA-76AFBB19E9FE}.Debug|Any CPU.Build.0 = Debug|x86
+ {4FA132D5-68B4-4BD7-99FA-76AFBB19E9FE}.Debug|Any CPU.Deploy.0 = Debug|x86
+ {4FA132D5-68B4-4BD7-99FA-76AFBB19E9FE}.Debug|ARM.ActiveCfg = Debug|ARM
+ {4FA132D5-68B4-4BD7-99FA-76AFBB19E9FE}.Debug|ARM.Build.0 = Debug|ARM
+ {4FA132D5-68B4-4BD7-99FA-76AFBB19E9FE}.Debug|ARM.Deploy.0 = Debug|ARM
+ {4FA132D5-68B4-4BD7-99FA-76AFBB19E9FE}.Debug|iPhone.ActiveCfg = Debug|x86
+ {4FA132D5-68B4-4BD7-99FA-76AFBB19E9FE}.Debug|iPhone.Build.0 = Debug|x86
+ {4FA132D5-68B4-4BD7-99FA-76AFBB19E9FE}.Debug|iPhone.Deploy.0 = Debug|x86
+ {4FA132D5-68B4-4BD7-99FA-76AFBB19E9FE}.Debug|iPhoneSimulator.ActiveCfg = Debug|x86
+ {4FA132D5-68B4-4BD7-99FA-76AFBB19E9FE}.Debug|iPhoneSimulator.Build.0 = Debug|x86
+ {4FA132D5-68B4-4BD7-99FA-76AFBB19E9FE}.Debug|iPhoneSimulator.Deploy.0 = Debug|x86
+ {4FA132D5-68B4-4BD7-99FA-76AFBB19E9FE}.Debug|x86.ActiveCfg = Debug|x86
+ {4FA132D5-68B4-4BD7-99FA-76AFBB19E9FE}.Debug|x86.Build.0 = Debug|x86
+ {4FA132D5-68B4-4BD7-99FA-76AFBB19E9FE}.Debug|x86.Deploy.0 = Debug|x86
+ {4FA132D5-68B4-4BD7-99FA-76AFBB19E9FE}.Release|Any CPU.ActiveCfg = Release|x86
+ {4FA132D5-68B4-4BD7-99FA-76AFBB19E9FE}.Release|Any CPU.Build.0 = Release|x86
+ {4FA132D5-68B4-4BD7-99FA-76AFBB19E9FE}.Release|Any CPU.Deploy.0 = Release|x86
+ {4FA132D5-68B4-4BD7-99FA-76AFBB19E9FE}.Release|ARM.ActiveCfg = Release|ARM
+ {4FA132D5-68B4-4BD7-99FA-76AFBB19E9FE}.Release|ARM.Build.0 = Release|ARM
+ {4FA132D5-68B4-4BD7-99FA-76AFBB19E9FE}.Release|ARM.Deploy.0 = Release|ARM
+ {4FA132D5-68B4-4BD7-99FA-76AFBB19E9FE}.Release|iPhone.ActiveCfg = Release|x86
+ {4FA132D5-68B4-4BD7-99FA-76AFBB19E9FE}.Release|iPhone.Build.0 = Release|x86
+ {4FA132D5-68B4-4BD7-99FA-76AFBB19E9FE}.Release|iPhone.Deploy.0 = Release|x86
+ {4FA132D5-68B4-4BD7-99FA-76AFBB19E9FE}.Release|iPhoneSimulator.ActiveCfg = Release|x86
+ {4FA132D5-68B4-4BD7-99FA-76AFBB19E9FE}.Release|iPhoneSimulator.Build.0 = Release|x86
+ {4FA132D5-68B4-4BD7-99FA-76AFBB19E9FE}.Release|iPhoneSimulator.Deploy.0 = Release|x86
+ {4FA132D5-68B4-4BD7-99FA-76AFBB19E9FE}.Release|x86.ActiveCfg = Release|x86
+ {4FA132D5-68B4-4BD7-99FA-76AFBB19E9FE}.Release|x86.Build.0 = Release|x86
+ {4FA132D5-68B4-4BD7-99FA-76AFBB19E9FE}.Release|x86.Deploy.0 = Release|x86
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/LivePlayer/BasicCalculator/Calculator/App.cs b/LivePlayer/BasicCalculator/Calculator/App.cs
new file mode 100755
index 000000000..326aab947
--- /dev/null
+++ b/LivePlayer/BasicCalculator/Calculator/App.cs
@@ -0,0 +1,36 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using Xamarin.Forms;
+using Xamarin.Forms.Xaml;
+
+[assembly: XamlCompilation(XamlCompilationOptions.Compile)]
+
+namespace Calculator
+{
+ public class App : Application
+ {
+ public App()
+ {
+ // The root page of your application
+ MainPage = new MainPage();
+ }
+
+ protected override void OnStart()
+ {
+ // Handle when your app starts
+ }
+
+ protected override void OnSleep()
+ {
+ // Handle when your app sleeps
+ }
+
+ protected override void OnResume()
+ {
+ // Handle when your app resumes
+ }
+ }
+}
diff --git a/LivePlayer/BasicCalculator/Calculator/Calculator.csproj b/LivePlayer/BasicCalculator/Calculator/Calculator.csproj
new file mode 100644
index 000000000..55058b676
--- /dev/null
+++ b/LivePlayer/BasicCalculator/Calculator/Calculator.csproj
@@ -0,0 +1,68 @@
+
+
+
+
+ 10.0
+ Debug
+ AnyCPU
+ {19ADA269-ACAE-49A2-8485-5ABBAAE026DC}
+ Library
+ Properties
+ Calculator
+ Calculator
+ v4.5
+ Profile259
+ 512
+ {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+
+
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+
+
+
+ MainPage.xaml
+
+
+
+
+
+ MSBuild:UpdateDesignTimeXaml
+
+
+
+
+ ..\packages\Xamarin.Forms.2.3.4.231\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.Core.dll
+
+
+ ..\packages\Xamarin.Forms.2.3.4.231\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.Platform.dll
+
+
+ ..\packages\Xamarin.Forms.2.3.4.231\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.Xaml.dll
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/BasicCalculator/Calculator/MainPage.xaml b/LivePlayer/BasicCalculator/Calculator/MainPage.xaml
new file mode 100644
index 000000000..82e9f7b6c
--- /dev/null
+++ b/LivePlayer/BasicCalculator/Calculator/MainPage.xaml
@@ -0,0 +1,90 @@
+
+
+
+
+
+ 0,20,0,0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/LivePlayer/BasicCalculator/Calculator/MainPage.xaml.cs b/LivePlayer/BasicCalculator/Calculator/MainPage.xaml.cs
new file mode 100755
index 000000000..335fd9827
--- /dev/null
+++ b/LivePlayer/BasicCalculator/Calculator/MainPage.xaml.cs
@@ -0,0 +1,71 @@
+using System;
+using System.Collections.Generic;
+using Xamarin.Forms;
+
+namespace Calculator
+{
+ public partial class MainPage : ContentPage
+ {
+ int currentState = 1;
+ string mathOperator;
+ double firstNumber, secondNumber;
+
+ public MainPage ()
+ {
+ InitializeComponent ();
+ OnClear(this, null);
+ }
+
+ void OnSelectNumber(object sender, EventArgs e)
+ {
+ Button button = (Button)sender;
+ string pressed = button.Text;
+
+ if (this.resultText.Text == "0" || currentState < 0) {
+ this.resultText.Text = "";
+ if (currentState < 0)
+ currentState *= -1;
+ }
+
+ this.resultText.Text += pressed;
+
+ double number;
+ if (double.TryParse(this.resultText.Text, out number)) {
+ this.resultText.Text = number.ToString("N0");
+ if (currentState == 1) {
+ firstNumber = number;
+ } else {
+ secondNumber = number;
+ }
+ }
+ }
+
+ void OnSelectOperator(object sender, EventArgs e)
+ {
+ currentState = -2;
+ Button button = (Button)sender;
+ string pressed = button.Text;
+ mathOperator = pressed;
+ }
+
+ void OnClear(object sender, EventArgs e)
+ {
+ firstNumber = 0;
+ secondNumber = 0;
+ currentState = 1;
+ this.resultText.Text = "0";
+ }
+
+ void OnCalculate(object sender, EventArgs e)
+ {
+ if (currentState == 2)
+ {
+ var result = SimpleCalculator.Calculate(firstNumber, secondNumber, mathOperator);
+
+ this.resultText.Text = result.ToString();
+ firstNumber = result;
+ currentState = -1;
+ }
+ }
+ }
+}
diff --git a/LivePlayer/BasicCalculator/Calculator/OldMainPage.cs b/LivePlayer/BasicCalculator/Calculator/OldMainPage.cs
new file mode 100755
index 000000000..4030f4cd6
--- /dev/null
+++ b/LivePlayer/BasicCalculator/Calculator/OldMainPage.cs
@@ -0,0 +1,179 @@
+using System;
+using Xamarin.Forms;
+
+namespace Calculator
+{
+ public class OldMainPage : ContentPage
+ {
+ Label resultText;
+ int currentState = 1;
+ string mathOperator;
+ double firstNumber, secondNumber;
+
+ public OldMainPage()
+ {
+ Grid layout = new Grid {
+ Padding = new Thickness(5,0),
+ RowSpacing = 1,
+ ColumnSpacing = 1,
+ BackgroundColor = Color.Black,
+ };
+
+ // Setup the grid 4x6
+ layout.RowDefinitions.Add(new RowDefinition { Height = new GridLength(2, GridUnitType.Star) });
+ layout.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });
+ layout.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });
+ layout.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });
+ layout.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });
+ layout.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });
+
+ layout.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
+ layout.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
+ layout.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
+ layout.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
+
+ this.resultText = new Label {
+ FontSize = 48,
+ FontAttributes = FontAttributes.Bold,
+ BackgroundColor = Color.Black,
+ TextColor = Color.White,
+ HorizontalTextAlignment = TextAlignment.End,
+ VerticalTextAlignment = TextAlignment.Center,
+ LineBreakMode = LineBreakMode.NoWrap,
+ };
+ Grid.SetColumnSpan(this.resultText, 4);
+ layout.Children.Add(this.resultText);
+
+ // Create the numbers.
+ layout.Children.Add(CreateNumberButton("7", 1, 0));
+ layout.Children.Add(CreateNumberButton("8", 1, 1));
+ layout.Children.Add(CreateNumberButton("9", 1, 2));
+ layout.Children.Add(CreateNumberButton("4", 2, 0));
+ layout.Children.Add(CreateNumberButton("5", 2, 1));
+ layout.Children.Add(CreateNumberButton("6", 2, 2));
+ layout.Children.Add(CreateNumberButton("1", 3, 0));
+ layout.Children.Add(CreateNumberButton("2", 3, 1));
+ layout.Children.Add(CreateNumberButton("3", 3, 2));
+ Button zero = CreateNumberButton("0", 4, 0);
+ Grid.SetColumnSpan(zero, 3);
+ layout.Children.Add(zero);
+
+ // Create the operators
+ layout.Children.Add(CreateOperatorButton("/", 1));
+ layout.Children.Add(CreateOperatorButton("X", 2));
+ layout.Children.Add(CreateOperatorButton("-", 3));
+ layout.Children.Add(CreateOperatorButton("+", 4));
+
+ // Create the clear button.
+ Button clear = new Button() {
+ Text = "C",
+ BackgroundColor = Color.FromRgb(0x80, 0x80, 0x80),
+ TextColor = Color.White,
+ Font = Font.SystemFontOfSize(36),
+ BorderRadius = 0,
+ };
+ Grid.SetRow(clear, 5);
+ clear.Clicked += OnClear;
+ layout.Children.Add(clear);
+
+ // And the equals.
+ Button equals = new Button() {
+ Text = "=",
+ BackgroundColor = Color.FromHex("#FFA500"),
+ TextColor = Color.White,
+ Font = Font.SystemFontOfSize(36),
+ BorderRadius = 0,
+ };
+ Grid.SetRow(equals, 5);
+ Grid.SetColumn(equals, 1);
+ Grid.SetColumnSpan(equals, 3);
+ equals.Clicked += OnCalculate;
+ layout.Children.Add(equals);
+
+ OnClear(null, EventArgs.Empty);
+ Content = layout;
+ }
+
+ Button CreateOperatorButton(string str, int row)
+ {
+ Button button = new Button() {
+ Text = str,
+ BackgroundColor = Color.FromHex("#FFA500"),
+ TextColor = Color.White,
+ Font = Font.SystemFontOfSize(36),
+ BorderRadius = 0,
+ };
+ Grid.SetRow(button, row);
+ Grid.SetColumn(button, 3);
+ button.Clicked += OnSelectOperator;
+ return button;
+ }
+
+ Button CreateNumberButton(string str, int row, int col)
+ {
+ Button button = new Button() {
+ Text = str,
+ BackgroundColor = Color.White,
+ TextColor = Color.Black,
+ Font = Font.SystemFontOfSize(36),
+ BorderRadius = 0,
+ };
+ Grid.SetRow(button, row);
+ Grid.SetColumn(button, col);
+ button.Clicked += OnSelectNumber;
+ return button;
+ }
+
+ void OnSelectNumber(object sender, EventArgs e)
+ {
+ Button button = (Button)sender;
+ string pressed = button.Text;
+
+ if (this.resultText.Text == "0" || currentState < 0) {
+ this.resultText.Text = "";
+ if (currentState < 0)
+ currentState *= -1;
+ }
+
+ this.resultText.Text += pressed;
+
+ double number;
+ if (double.TryParse(this.resultText.Text, out number)) {
+ this.resultText.Text = number.ToString("N0");
+ if (currentState == 1) {
+ firstNumber = number;
+ } else {
+ secondNumber = number;
+ }
+ }
+ }
+
+ void OnSelectOperator(object sender, EventArgs e)
+ {
+ currentState = -2;
+ Button button = (Button)sender;
+ string pressed = button.Text;
+ mathOperator = pressed;
+ }
+
+ void OnClear(object sender, EventArgs e)
+ {
+ firstNumber = 0;
+ secondNumber = 0;
+ currentState = 1;
+ this.resultText.Text = "0";
+ }
+
+ void OnCalculate(object sender, EventArgs e)
+ {
+ if (currentState == 2)
+ {
+ var result = SimpleCalculator.Calculate(firstNumber, secondNumber, mathOperator);
+
+ this.resultText.Text = result.ToString("N0");
+ firstNumber = result;
+ currentState = -1;
+ }
+ }
+ }
+}
diff --git a/LivePlayer/BasicCalculator/Calculator/Properties/AssemblyInfo.cs b/LivePlayer/BasicCalculator/Calculator/Properties/AssemblyInfo.cs
new file mode 100755
index 000000000..5dda295f4
--- /dev/null
+++ b/LivePlayer/BasicCalculator/Calculator/Properties/AssemblyInfo.cs
@@ -0,0 +1,30 @@
+using System.Resources;
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 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("Calculator")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Calculator")]
+[assembly: AssemblyCopyright("Copyright © 2014")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+[assembly: NeutralResourcesLanguage("en")]
+
+// 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")]
diff --git a/LivePlayer/BasicCalculator/Calculator/SharedResources.cs b/LivePlayer/BasicCalculator/Calculator/SharedResources.cs
new file mode 100755
index 000000000..ae14d8d1d
--- /dev/null
+++ b/LivePlayer/BasicCalculator/Calculator/SharedResources.cs
@@ -0,0 +1,17 @@
+using System;
+using Xamarin.Forms;
+
+namespace Calculator
+{
+ public static class SharedResources
+ {
+ public static Color OpButtonBkColor
+ {
+ get {
+ //return Color.White;
+ return Color.FromRgb(0xff, 0xa5, 0);
+ }
+ }
+ }
+}
+
diff --git a/LivePlayer/BasicCalculator/Calculator/SimpleCalculator.cs b/LivePlayer/BasicCalculator/Calculator/SimpleCalculator.cs
new file mode 100755
index 000000000..37d231c00
--- /dev/null
+++ b/LivePlayer/BasicCalculator/Calculator/SimpleCalculator.cs
@@ -0,0 +1,34 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Calculator
+{
+ public static class SimpleCalculator
+ {
+ public static double Calculate(double value1, double value2, string mathOperator)
+ {
+ double result = 0;
+
+ switch (mathOperator)
+ {
+ case "÷":
+ result = value1 / value2;
+ break;
+ case "×":
+ result = value1 * value2;
+ break;
+ case "+":
+ result = value1 + value2;
+ break;
+ case "-":
+ result = value1 - value2;
+ break;
+ }
+
+ return result;
+ }
+ }
+}
diff --git a/LivePlayer/BasicCalculator/Calculator/packages.config b/LivePlayer/BasicCalculator/Calculator/packages.config
new file mode 100644
index 000000000..33c48456f
--- /dev/null
+++ b/LivePlayer/BasicCalculator/Calculator/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/BasicCalculator/Metadata.xml b/LivePlayer/BasicCalculator/Metadata.xml
new file mode 100644
index 000000000..2de8ee6bc
--- /dev/null
+++ b/LivePlayer/BasicCalculator/Metadata.xml
@@ -0,0 +1,11 @@
+
+
+ DC499AFC-DBEE-46F1-ABC6-4EC871AABFB1
+ true
+ Beginner
+
+ Android, iOS
+ Community
+ Basic calculator built with Xamarin.Forms.
+ true
+
diff --git a/LivePlayer/BasicCalculator/Screenshots/basic-calculator-sml.png b/LivePlayer/BasicCalculator/Screenshots/basic-calculator-sml.png
new file mode 100644
index 000000000..ea62373f6
Binary files /dev/null and b/LivePlayer/BasicCalculator/Screenshots/basic-calculator-sml.png differ
diff --git a/LivePlayer/BasicCalculator/readme.md b/LivePlayer/BasicCalculator/readme.md
new file mode 100644
index 000000000..b3c8a9bc4
--- /dev/null
+++ b/LivePlayer/BasicCalculator/readme.md
@@ -0,0 +1,15 @@
+---
+name: Xamarin.Forms - Basic Calculator
+description: "A basic calculator app for Android and iOS using Xamarin.Forms"
+page_type: sample
+languages:
+- csharp
+products:
+- xamarin
+urlFragment: liveplayer-basiccalculator
+---
+# Xamarin.Forms - Basic Calculator
+
+This Xamarin.Forms app provides a simple calculator you can use on your Android or iOS device:
+
+
diff --git a/LivePlayer/BugSweeperLP/BugSweeper.sln b/LivePlayer/BugSweeperLP/BugSweeper.sln
new file mode 100644
index 000000000..ca4db2aa9
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper.sln
@@ -0,0 +1,219 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.27004.2002
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "BugSweeper", "BugSweeper\BugSweeper\BugSweeper.shproj", "{7D98ECDE-712D-4B4A-A82D-BCFEB28EB9B9}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BugSweeper.Android", "BugSweeper\BugSweeper.Android\BugSweeper.Android.csproj", "{D14653D6-F84F-4833-87AE-D2630437B77A}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BugSweeper.iOS", "BugSweeper\BugSweeper.iOS\BugSweeper.iOS.csproj", "{5A67E426-F01B-4477-93D7-AFABB756FA8F}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BugSweeper.UWP", "BugSweeper\BugSweeper.UWP\BugSweeper.UWP.csproj", "{9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}"
+EndProject
+Global
+ GlobalSection(SharedMSBuildProjectFiles) = preSolution
+ BugSweeper\BugSweeper\BugSweeper.projitems*{5a67e426-f01b-4477-93d7-afabb756fa8f}*SharedItemsImports = 4
+ BugSweeper\BugSweeper\BugSweeper.projitems*{7d98ecde-712d-4b4a-a82d-bcfeb28eb9b9}*SharedItemsImports = 13
+ BugSweeper\BugSweeper\BugSweeper.projitems*{9a994230-91ab-4f4d-bd1a-1b94d8c2e28d}*SharedItemsImports = 4
+ BugSweeper\BugSweeper\BugSweeper.projitems*{d14653d6-f84f-4833-87ae-d2630437b77a}*SharedItemsImports = 4
+ EndGlobalSection
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Ad-Hoc|Any CPU = Ad-Hoc|Any CPU
+ Ad-Hoc|ARM = Ad-Hoc|ARM
+ Ad-Hoc|iPhone = Ad-Hoc|iPhone
+ Ad-Hoc|iPhoneSimulator = Ad-Hoc|iPhoneSimulator
+ Ad-Hoc|x64 = Ad-Hoc|x64
+ Ad-Hoc|x86 = Ad-Hoc|x86
+ AppStore|Any CPU = AppStore|Any CPU
+ AppStore|ARM = AppStore|ARM
+ AppStore|iPhone = AppStore|iPhone
+ AppStore|iPhoneSimulator = AppStore|iPhoneSimulator
+ AppStore|x64 = AppStore|x64
+ AppStore|x86 = AppStore|x86
+ Debug|Any CPU = Debug|Any CPU
+ Debug|ARM = Debug|ARM
+ Debug|iPhone = Debug|iPhone
+ Debug|iPhoneSimulator = Debug|iPhoneSimulator
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release|Any CPU = Release|Any CPU
+ Release|ARM = Release|ARM
+ Release|iPhone = Release|iPhone
+ Release|iPhoneSimulator = Release|iPhoneSimulator
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Ad-Hoc|Any CPU.Deploy.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Ad-Hoc|ARM.Build.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Ad-Hoc|ARM.Deploy.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Ad-Hoc|iPhone.Deploy.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Ad-Hoc|x64.Build.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Ad-Hoc|x64.Deploy.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Ad-Hoc|x86.Build.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Ad-Hoc|x86.Deploy.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.AppStore|Any CPU.Build.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.AppStore|Any CPU.Deploy.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.AppStore|ARM.ActiveCfg = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.AppStore|ARM.Build.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.AppStore|ARM.Deploy.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.AppStore|iPhone.ActiveCfg = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.AppStore|iPhone.Build.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.AppStore|iPhone.Deploy.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.AppStore|iPhoneSimulator.Deploy.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.AppStore|x64.ActiveCfg = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.AppStore|x64.Build.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.AppStore|x64.Deploy.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.AppStore|x86.ActiveCfg = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.AppStore|x86.Build.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.AppStore|x86.Deploy.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Debug|ARM.Build.0 = Debug|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Debug|ARM.Deploy.0 = Debug|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Debug|iPhone.Deploy.0 = Debug|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Debug|x64.Build.0 = Debug|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Debug|x64.Deploy.0 = Debug|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Debug|x86.Build.0 = Debug|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Debug|x86.Deploy.0 = Debug|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Release|ARM.ActiveCfg = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Release|ARM.Build.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Release|ARM.Deploy.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Release|iPhone.Build.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Release|iPhone.Deploy.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Release|x64.ActiveCfg = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Release|x64.Build.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Release|x64.Deploy.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Release|x86.ActiveCfg = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Release|x86.Build.0 = Release|Any CPU
+ {D14653D6-F84F-4833-87AE-D2630437B77A}.Release|x86.Deploy.0 = Release|Any CPU
+ {5A67E426-F01B-4477-93D7-AFABB756FA8F}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|iPhoneSimulator
+ {5A67E426-F01B-4477-93D7-AFABB756FA8F}.Ad-Hoc|ARM.ActiveCfg = Ad-Hoc|iPhone
+ {5A67E426-F01B-4477-93D7-AFABB756FA8F}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone
+ {5A67E426-F01B-4477-93D7-AFABB756FA8F}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone
+ {5A67E426-F01B-4477-93D7-AFABB756FA8F}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator
+ {5A67E426-F01B-4477-93D7-AFABB756FA8F}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator
+ {5A67E426-F01B-4477-93D7-AFABB756FA8F}.Ad-Hoc|x64.ActiveCfg = Ad-Hoc|iPhone
+ {5A67E426-F01B-4477-93D7-AFABB756FA8F}.Ad-Hoc|x86.ActiveCfg = Ad-Hoc|iPhone
+ {5A67E426-F01B-4477-93D7-AFABB756FA8F}.AppStore|Any CPU.ActiveCfg = AppStore|iPhoneSimulator
+ {5A67E426-F01B-4477-93D7-AFABB756FA8F}.AppStore|ARM.ActiveCfg = AppStore|iPhone
+ {5A67E426-F01B-4477-93D7-AFABB756FA8F}.AppStore|iPhone.ActiveCfg = AppStore|iPhone
+ {5A67E426-F01B-4477-93D7-AFABB756FA8F}.AppStore|iPhone.Build.0 = AppStore|iPhone
+ {5A67E426-F01B-4477-93D7-AFABB756FA8F}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator
+ {5A67E426-F01B-4477-93D7-AFABB756FA8F}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator
+ {5A67E426-F01B-4477-93D7-AFABB756FA8F}.AppStore|x64.ActiveCfg = AppStore|iPhone
+ {5A67E426-F01B-4477-93D7-AFABB756FA8F}.AppStore|x86.ActiveCfg = AppStore|iPhone
+ {5A67E426-F01B-4477-93D7-AFABB756FA8F}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator
+ {5A67E426-F01B-4477-93D7-AFABB756FA8F}.Debug|ARM.ActiveCfg = Debug|iPhone
+ {5A67E426-F01B-4477-93D7-AFABB756FA8F}.Debug|iPhone.ActiveCfg = Debug|iPhone
+ {5A67E426-F01B-4477-93D7-AFABB756FA8F}.Debug|iPhone.Build.0 = Debug|iPhone
+ {5A67E426-F01B-4477-93D7-AFABB756FA8F}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
+ {5A67E426-F01B-4477-93D7-AFABB756FA8F}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
+ {5A67E426-F01B-4477-93D7-AFABB756FA8F}.Debug|x64.ActiveCfg = Debug|iPhone
+ {5A67E426-F01B-4477-93D7-AFABB756FA8F}.Debug|x86.ActiveCfg = Debug|iPhone
+ {5A67E426-F01B-4477-93D7-AFABB756FA8F}.Release|Any CPU.ActiveCfg = Release|iPhoneSimulator
+ {5A67E426-F01B-4477-93D7-AFABB756FA8F}.Release|ARM.ActiveCfg = Release|iPhone
+ {5A67E426-F01B-4477-93D7-AFABB756FA8F}.Release|iPhone.ActiveCfg = Release|iPhone
+ {5A67E426-F01B-4477-93D7-AFABB756FA8F}.Release|iPhone.Build.0 = Release|iPhone
+ {5A67E426-F01B-4477-93D7-AFABB756FA8F}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
+ {5A67E426-F01B-4477-93D7-AFABB756FA8F}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
+ {5A67E426-F01B-4477-93D7-AFABB756FA8F}.Release|x64.ActiveCfg = Release|iPhone
+ {5A67E426-F01B-4477-93D7-AFABB756FA8F}.Release|x86.ActiveCfg = Release|iPhone
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Ad-Hoc|Any CPU.ActiveCfg = Release|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Ad-Hoc|Any CPU.Build.0 = Release|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Ad-Hoc|Any CPU.Deploy.0 = Release|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Ad-Hoc|ARM.ActiveCfg = Release|ARM
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Ad-Hoc|ARM.Build.0 = Release|ARM
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Ad-Hoc|ARM.Deploy.0 = Release|ARM
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Ad-Hoc|iPhone.ActiveCfg = Release|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Ad-Hoc|iPhone.Build.0 = Release|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Ad-Hoc|iPhone.Deploy.0 = Release|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Release|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Ad-Hoc|x64.ActiveCfg = Release|x64
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Ad-Hoc|x64.Build.0 = Release|x64
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Ad-Hoc|x64.Deploy.0 = Release|x64
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Ad-Hoc|x86.ActiveCfg = Release|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Ad-Hoc|x86.Build.0 = Release|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Ad-Hoc|x86.Deploy.0 = Release|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.AppStore|Any CPU.ActiveCfg = Release|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.AppStore|Any CPU.Build.0 = Release|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.AppStore|Any CPU.Deploy.0 = Release|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.AppStore|ARM.ActiveCfg = Release|ARM
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.AppStore|ARM.Build.0 = Release|ARM
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.AppStore|ARM.Deploy.0 = Release|ARM
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.AppStore|iPhone.ActiveCfg = Release|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.AppStore|iPhone.Build.0 = Release|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.AppStore|iPhone.Deploy.0 = Release|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.AppStore|iPhoneSimulator.ActiveCfg = Release|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.AppStore|iPhoneSimulator.Build.0 = Release|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.AppStore|iPhoneSimulator.Deploy.0 = Release|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.AppStore|x64.ActiveCfg = Release|x64
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.AppStore|x64.Build.0 = Release|x64
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.AppStore|x64.Deploy.0 = Release|x64
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.AppStore|x86.ActiveCfg = Release|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.AppStore|x86.Build.0 = Release|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.AppStore|x86.Deploy.0 = Release|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Debug|Any CPU.ActiveCfg = Debug|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Debug|ARM.ActiveCfg = Debug|ARM
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Debug|ARM.Build.0 = Debug|ARM
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Debug|ARM.Deploy.0 = Debug|ARM
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Debug|iPhone.ActiveCfg = Debug|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Debug|iPhoneSimulator.ActiveCfg = Debug|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Debug|x64.ActiveCfg = Debug|x64
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Debug|x64.Build.0 = Debug|x64
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Debug|x64.Deploy.0 = Debug|x64
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Debug|x86.ActiveCfg = Debug|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Debug|x86.Build.0 = Debug|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Debug|x86.Deploy.0 = Debug|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Release|Any CPU.ActiveCfg = Release|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Release|ARM.ActiveCfg = Release|ARM
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Release|ARM.Build.0 = Release|ARM
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Release|ARM.Deploy.0 = Release|ARM
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Release|iPhone.ActiveCfg = Release|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Release|iPhoneSimulator.ActiveCfg = Release|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Release|x64.ActiveCfg = Release|x64
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Release|x64.Build.0 = Release|x64
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Release|x64.Deploy.0 = Release|x64
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Release|x86.ActiveCfg = Release|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Release|x86.Build.0 = Release|x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}.Release|x86.Deploy.0 = Release|x86
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {49DE1AD3-E86B-447D-9042-0838C84CD315}
+ EndGlobalSection
+EndGlobal
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/Assets/AboutAssets.txt b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/Assets/AboutAssets.txt
new file mode 100644
index 000000000..5ddf08729
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/Assets/AboutAssets.txt
@@ -0,0 +1,19 @@
+Any raw assets you want to be deployed with your application can be placed in
+this directory (and child directories) and given a Build Action of "AndroidAsset".
+
+These files will be deployed with you package and will be accessible using Android's
+AssetManager, like this:
+
+public class ReadAsset : Activity
+{
+ protected override void OnCreate (Bundle bundle)
+ {
+ base.OnCreate (bundle);
+
+ InputStream input = Assets.Open ("my_asset.txt");
+ }
+}
+
+Additionally, some Android functions will automatically load asset files:
+
+Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf");
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/BugSweeper.Android.csproj b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/BugSweeper.Android.csproj
new file mode 100644
index 000000000..b3b09122f
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/BugSweeper.Android.csproj
@@ -0,0 +1,180 @@
+
+
+
+
+ Debug
+ AnyCPU
+ 8.0.30703
+ 2.0
+ {D14653D6-F84F-4833-87AE-D2630437B77A}
+ {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ Library
+ Properties
+ BugSweeper.Droid
+ BugSweeper.Android
+ 512
+ true
+ Resources\Resource.Designer.cs
+ Off
+ Properties\AndroidManifest.xml
+ true
+ v7.1
+
+
+
+
+
+
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+ True
+ None
+ armeabi-v7a,x86
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+ False
+ SdkOnly
+
+
+
+ ..\..\packages\Xamarin.Forms.2.4.0.280\lib\MonoAndroid10\FormsViewGroup.dll
+
+
+
+
+
+
+
+
+ ..\..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Animated.Vector.Drawable.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.Annotations.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Annotations.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.Compat.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Compat.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.Core.UI.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Core.UI.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.Core.Utils.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Core.Utils.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.Design.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Design.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.Fragment.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Fragment.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.Media.Compat.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Media.Compat.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.v4.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v4.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.v7.AppCompat.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v7.AppCompat.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.v7.CardView.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v7.CardView.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.v7.MediaRouter.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v7.MediaRouter.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.v7.RecyclerView.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v7.RecyclerView.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.Vector.Drawable.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Vector.Drawable.dll
+
+
+ ..\..\packages\Xamarin.Forms.2.4.0.280\lib\MonoAndroid10\Xamarin.Forms.Core.dll
+
+
+ ..\..\packages\Xamarin.Forms.2.4.0.280\lib\MonoAndroid10\Xamarin.Forms.Platform.dll
+
+
+ ..\..\packages\Xamarin.Forms.2.4.0.280\lib\MonoAndroid10\Xamarin.Forms.Platform.Android.dll
+
+
+ ..\..\packages\Xamarin.Forms.2.4.0.280\lib\MonoAndroid10\Xamarin.Forms.Xaml.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/MainActivity.cs b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/MainActivity.cs
new file mode 100644
index 000000000..0e56a95a0
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/MainActivity.cs
@@ -0,0 +1,27 @@
+using System;
+
+using Android.App;
+using Android.Content.PM;
+using Android.Runtime;
+using Android.Views;
+using Android.Widget;
+using Android.OS;
+
+namespace BugSweeper.Droid
+{
+ [Activity (Label = "BugSweeper", Icon = "@drawable/icon", Theme="@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
+ public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
+ {
+ protected override void OnCreate (Bundle bundle)
+ {
+ TabLayoutResource = Resource.Layout.Tabbar;
+ ToolbarResource = Resource.Layout.Toolbar;
+
+ base.OnCreate (bundle);
+
+ global::Xamarin.Forms.Forms.Init (this, bundle);
+ LoadApplication (new BugSweeper.App ());
+ }
+ }
+}
+
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/Properties/AndroidManifest.xml b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/Properties/AndroidManifest.xml
new file mode 100644
index 000000000..d3442f825
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/Properties/AndroidManifest.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/Properties/AssemblyInfo.cs b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..4eec407cd
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/Properties/AssemblyInfo.cs
@@ -0,0 +1,34 @@
+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("BugSweeper.Android")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("BugSweeper.Android")]
+[assembly: AssemblyCopyright("Copyright © 2014")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+[assembly: ComVisible(false)]
+
+// 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)]
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/Resources/AboutResources.txt b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/Resources/AboutResources.txt
new file mode 100644
index 000000000..cb30f20b1
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/Resources/AboutResources.txt
@@ -0,0 +1,50 @@
+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.xml),
+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-hdpi/
+ icon.png
+
+ drawable-ldpi/
+ icon.png
+
+ drawable-mdpi/
+ icon.png
+
+ layout/
+ main.xml
+
+ 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
+"Resource" that contains the tokens for each one of the resources included. For example,
+for the above Resources layout, this is what the Resource class would expose:
+
+public class Resource {
+ 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 Resource.layout.main
+to reference the layout/main.xml file, or Resource.strings.first_string to reference the first
+string in the dictionary file values/strings.xml.
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/Resources/drawable-hdpi/icon.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/Resources/drawable-hdpi/icon.png
new file mode 100644
index 000000000..964f110ab
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/Resources/drawable-hdpi/icon.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/Resources/drawable-xhdpi/icon.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/Resources/drawable-xhdpi/icon.png
new file mode 100644
index 000000000..3c01e60ce
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/Resources/drawable-xhdpi/icon.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/Resources/drawable-xxhdpi/icon.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/Resources/drawable-xxhdpi/icon.png
new file mode 100644
index 000000000..0d8c1c57d
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/Resources/drawable-xxhdpi/icon.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/Resources/drawable/icon.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/Resources/drawable/icon.png
new file mode 100644
index 000000000..b0ba7150f
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/Resources/drawable/icon.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/Resources/layout/Tabbar.axml b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/Resources/layout/Tabbar.axml
new file mode 100644
index 000000000..ad1f87d81
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/Resources/layout/Tabbar.axml
@@ -0,0 +1,11 @@
+
+
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/Resources/layout/Toolbar.axml b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/Resources/layout/Toolbar.axml
new file mode 100644
index 000000000..aabd0a3b7
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/Resources/layout/Toolbar.axml
@@ -0,0 +1,9 @@
+
+
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/Resources/values/styles.xml b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/Resources/values/styles.xml
new file mode 100644
index 000000000..43b0a58c1
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/Resources/values/styles.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/packages.config b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/packages.config
new file mode 100644
index 000000000..a764baad1
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.Android/packages.config
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/App.xaml b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/App.xaml
new file mode 100644
index 000000000..c8d6d16b9
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/App.xaml
@@ -0,0 +1,8 @@
+
+
+
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/App.xaml.cs b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/App.xaml.cs
new file mode 100644
index 000000000..44d2b4527
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/App.xaml.cs
@@ -0,0 +1,107 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Runtime.InteropServices.WindowsRuntime;
+using Windows.ApplicationModel;
+using Windows.ApplicationModel.Activation;
+using Windows.Foundation;
+using Windows.Foundation.Collections;
+using Windows.UI.Xaml;
+using Windows.UI.Xaml.Controls;
+using Windows.UI.Xaml.Controls.Primitives;
+using Windows.UI.Xaml.Data;
+using Windows.UI.Xaml.Input;
+using Windows.UI.Xaml.Media;
+using Windows.UI.Xaml.Navigation;
+
+namespace BugSweeper.UWP
+{
+ ///
+ /// Provides application-specific behavior to supplement the default Application class.
+ ///
+ sealed partial class App : Application
+ {
+ ///
+ /// Initializes the singleton application object. This is the first line of authored code
+ /// executed, and as such is the logical equivalent of main() or WinMain().
+ ///
+ public App()
+ {
+ this.InitializeComponent();
+ this.Suspending += OnSuspending;
+ }
+
+ ///
+ /// Invoked when the application is launched normally by the end user. Other entry points
+ /// will be used such as when the application is launched to open a specific file.
+ ///
+ /// Details about the launch request and process.
+ protected override void OnLaunched(LaunchActivatedEventArgs e)
+ {
+
+#if DEBUG
+ if (System.Diagnostics.Debugger.IsAttached)
+ {
+ this.DebugSettings.EnableFrameRateCounter = true;
+ }
+#endif
+
+ Frame rootFrame = Window.Current.Content as Frame;
+
+ // Do not repeat app initialization when the Window already has content,
+ // just ensure that the window is active
+ if (rootFrame == null)
+ {
+ // Create a Frame to act as the navigation context and navigate to the first page
+ rootFrame = new Frame();
+
+ rootFrame.NavigationFailed += OnNavigationFailed;
+
+ Xamarin.Forms.Forms.Init(e);
+
+ if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
+ {
+ //TODO: Load state from previously suspended application
+ }
+
+ // Place the frame in the current Window
+ Window.Current.Content = rootFrame;
+ }
+
+ if (rootFrame.Content == null)
+ {
+ // When the navigation stack isn't restored navigate to the first page,
+ // configuring the new page by passing required information as a navigation
+ // parameter
+ rootFrame.Navigate(typeof(MainPage), e.Arguments);
+ }
+ // Ensure the current window is active
+ Window.Current.Activate();
+ }
+
+ ///
+ /// Invoked when Navigation to a certain page fails
+ ///
+ /// The Frame which failed navigation
+ /// Details about the navigation failure
+ void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
+ {
+ throw new Exception("Failed to load Page " + e.SourcePageType.FullName);
+ }
+
+ ///
+ /// Invoked when application execution is being suspended. Application state is saved
+ /// without knowing whether the application will be terminated or resumed with the contents
+ /// of memory still intact.
+ ///
+ /// The source of the suspend request.
+ /// Details about the suspend request.
+ private void OnSuspending(object sender, SuspendingEventArgs e)
+ {
+ var deferral = e.SuspendingOperation.GetDeferral();
+ //TODO: Save application state and stop any background activity
+ deferral.Complete();
+ }
+ }
+}
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/LockScreenLogo.scale-100.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/LockScreenLogo.scale-100.png
new file mode 100644
index 000000000..2691ddda5
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/LockScreenLogo.scale-100.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/LockScreenLogo.scale-125.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/LockScreenLogo.scale-125.png
new file mode 100644
index 000000000..1d968b55b
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/LockScreenLogo.scale-125.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/LockScreenLogo.scale-150.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/LockScreenLogo.scale-150.png
new file mode 100644
index 000000000..9ab2a9481
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/LockScreenLogo.scale-150.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/LockScreenLogo.scale-200.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/LockScreenLogo.scale-200.png
new file mode 100644
index 000000000..f12a7865b
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/LockScreenLogo.scale-200.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/LockScreenLogo.scale-400.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/LockScreenLogo.scale-400.png
new file mode 100644
index 000000000..2fd2f9949
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/LockScreenLogo.scale-400.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/SplashScreen.scale-100.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/SplashScreen.scale-100.png
new file mode 100644
index 000000000..8fc01d548
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/SplashScreen.scale-100.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/SplashScreen.scale-125.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/SplashScreen.scale-125.png
new file mode 100644
index 000000000..ff8f8c30c
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/SplashScreen.scale-125.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/SplashScreen.scale-150.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/SplashScreen.scale-150.png
new file mode 100644
index 000000000..edce16974
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/SplashScreen.scale-150.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/SplashScreen.scale-200.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/SplashScreen.scale-200.png
new file mode 100644
index 000000000..027589c77
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/SplashScreen.scale-200.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/SplashScreen.scale-400.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/SplashScreen.scale-400.png
new file mode 100644
index 000000000..f46b6d2c2
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/SplashScreen.scale-400.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Square150x150Logo.scale-200.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Square150x150Logo.scale-200.png
new file mode 100644
index 000000000..e88ae8340
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Square150x150Logo.scale-200.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Square44x44Logo.scale-100.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Square44x44Logo.scale-100.png
new file mode 100644
index 000000000..4ad2800b2
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Square44x44Logo.scale-100.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Square44x44Logo.scale-125.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Square44x44Logo.scale-125.png
new file mode 100644
index 000000000..482526fe9
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Square44x44Logo.scale-125.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Square44x44Logo.scale-150.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Square44x44Logo.scale-150.png
new file mode 100644
index 000000000..19ac2bf06
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Square44x44Logo.scale-150.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Square44x44Logo.scale-200.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Square44x44Logo.scale-200.png
new file mode 100644
index 000000000..a6e88ac3a
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Square44x44Logo.scale-200.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Square44x44Logo.scale-400.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Square44x44Logo.scale-400.png
new file mode 100644
index 000000000..0245755d3
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Square44x44Logo.scale-400.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Square44x44Logo.targetsize-16_altform-unplated.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Square44x44Logo.targetsize-16_altform-unplated.png
new file mode 100644
index 000000000..1f92251d9
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Square44x44Logo.targetsize-16_altform-unplated.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Square44x44Logo.targetsize-24_altform-unplated.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Square44x44Logo.targetsize-24_altform-unplated.png
new file mode 100644
index 000000000..053eccc80
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Square44x44Logo.targetsize-24_altform-unplated.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Square44x44Logo.targetsize-256_altform-unplated.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Square44x44Logo.targetsize-256_altform-unplated.png
new file mode 100644
index 000000000..31682a6a9
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Square44x44Logo.targetsize-256_altform-unplated.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Square44x44Logo.targetsize-32_altform-unplated.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Square44x44Logo.targetsize-32_altform-unplated.png
new file mode 100644
index 000000000..456a0a33d
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Square44x44Logo.targetsize-32_altform-unplated.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Square44x44Logo.targetsize-48_altform-unplated.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Square44x44Logo.targetsize-48_altform-unplated.png
new file mode 100644
index 000000000..378034e16
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Square44x44Logo.targetsize-48_altform-unplated.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/StoreLogo.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/StoreLogo.png
new file mode 100644
index 000000000..a197aaf55
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/StoreLogo.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Wide310x150Logo.scale-100.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Wide310x150Logo.scale-100.png
new file mode 100644
index 000000000..808136308
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Wide310x150Logo.scale-100.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Wide310x150Logo.scale-125.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Wide310x150Logo.scale-125.png
new file mode 100644
index 000000000..45736239b
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Wide310x150Logo.scale-125.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Wide310x150Logo.scale-150.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Wide310x150Logo.scale-150.png
new file mode 100644
index 000000000..d10db3e24
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Wide310x150Logo.scale-150.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Wide310x150Logo.scale-200.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Wide310x150Logo.scale-200.png
new file mode 100644
index 000000000..51b2a532c
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Wide310x150Logo.scale-200.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Wide310x150Logo.scale-400.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Wide310x150Logo.scale-400.png
new file mode 100644
index 000000000..ad96c43c9
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Assets/Wide310x150Logo.scale-400.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/BugSweeper.UWP.csproj b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/BugSweeper.UWP.csproj
new file mode 100644
index 000000000..4e3b3ff57
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/BugSweeper.UWP.csproj
@@ -0,0 +1,162 @@
+
+
+
+
+ Debug
+ x86
+ {9A994230-91AB-4F4D-BD1A-1B94D8C2E28D}
+ AppContainerExe
+ Properties
+ BugSweeper.UWP
+ BugSweeper.UWP
+ en-US
+ UAP
+ 10.0.15063.0
+ 10.0.10586.0
+ 14
+ true
+ 512
+ {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ BugSweeper.UWP_TemporaryKey.pfx
+
+
+ true
+ bin\ARM\Debug\
+ DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP
+ ;2008
+ full
+ ARM
+ false
+ prompt
+ true
+
+
+ bin\ARM\Release\
+ TRACE;NETFX_CORE;WINDOWS_UWP
+ true
+ ;2008
+ pdbonly
+ ARM
+ false
+ prompt
+ true
+ true
+
+
+ true
+ bin\x64\Debug\
+ DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP
+ ;2008
+ full
+ x64
+ false
+ prompt
+ true
+
+
+ bin\x64\Release\
+ TRACE;NETFX_CORE;WINDOWS_UWP
+ true
+ ;2008
+ pdbonly
+ x64
+ false
+ prompt
+ true
+ true
+
+
+ true
+ bin\x86\Debug\
+ DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP
+ ;2008
+ full
+ x86
+ false
+ prompt
+ true
+
+
+ bin\x86\Release\
+ TRACE;NETFX_CORE;WINDOWS_UWP
+ true
+ ;2008
+ pdbonly
+ x86
+ false
+ prompt
+ true
+ true
+
+
+
+
+
+
+
+ App.xaml
+
+
+ MainPage.xaml
+
+
+
+
+
+ Designer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ MSBuild:Compile
+ Designer
+
+
+ MSBuild:Compile
+ Designer
+
+
+
+ 14.0
+
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/MainPage.xaml b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/MainPage.xaml
new file mode 100644
index 000000000..61c42a9fd
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/MainPage.xaml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/MainPage.xaml.cs b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/MainPage.xaml.cs
new file mode 100644
index 000000000..22fd1f816
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/MainPage.xaml.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Runtime.InteropServices.WindowsRuntime;
+using Windows.Foundation;
+using Windows.Foundation.Collections;
+using Windows.UI.Xaml;
+using Windows.UI.Xaml.Controls;
+using Windows.UI.Xaml.Controls.Primitives;
+using Windows.UI.Xaml.Data;
+using Windows.UI.Xaml.Input;
+using Windows.UI.Xaml.Media;
+using Windows.UI.Xaml.Navigation;
+
+namespace BugSweeper.UWP
+{
+ public sealed partial class MainPage
+ {
+ public MainPage()
+ {
+ this.InitializeComponent();
+
+ LoadApplication(new BugSweeper.App());
+ }
+ }
+}
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Package.appxmanifest b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Package.appxmanifest
new file mode 100644
index 000000000..ae380e6e5
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Package.appxmanifest
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+ BugSweeper.UWP
+ User
+ Assets\StoreLogo.png
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Properties/AssemblyInfo.cs b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..6e4f378b2
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Properties/AssemblyInfo.cs
@@ -0,0 +1,29 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 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("BugSweeper.UWP")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("BugSweeper.UWP")]
+[assembly: AssemblyCopyright("Copyright © 2015")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 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")]
+[assembly: ComVisible(false)]
\ No newline at end of file
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Properties/Default.rd.xml b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Properties/Default.rd.xml
new file mode 100644
index 000000000..80a960ce3
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/Properties/Default.rd.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/project.json b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/project.json
new file mode 100644
index 000000000..5ec5a29d7
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.UWP/project.json
@@ -0,0 +1,17 @@
+{
+ "dependencies": {
+ "Microsoft.NETCore.UniversalWindowsPlatform": "5.2.2",
+ "Xamarin.Forms": "2.4.0.280"
+ },
+ "frameworks": {
+ "uap10.0": {}
+ },
+ "runtimes": {
+ "win10-arm": {},
+ "win10-arm-aot": {},
+ "win10-x86": {},
+ "win10-x86-aot": {},
+ "win10-x64": {},
+ "win10-x64-aot": {}
+ }
+}
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/AppDelegate.cs b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/AppDelegate.cs
new file mode 100644
index 000000000..fa4922870
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/AppDelegate.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using Foundation;
+using UIKit;
+
+namespace BugSweeper.iOS
+{
+ // The UIApplicationDelegate for the application. This class is responsible for launching the
+ // User Interface of the application, as well as listening (and optionally responding) to
+ // application events from iOS.
+ [Register("AppDelegate")]
+ public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
+ {
+ //
+ // This method is invoked when the application has loaded and is ready to run. In this
+ // method you should instantiate the window, load the UI into it and then make the window
+ // visible.
+ //
+ // You have 17 seconds to return from this method, or iOS will terminate your application.
+ //
+ public override bool FinishedLaunching(UIApplication app, NSDictionary options)
+ {
+ global::Xamarin.Forms.Forms.Init ();
+ LoadApplication (new BugSweeper.App ());
+
+ return base.FinishedLaunching (app, options);
+ }
+ }
+}
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/BugSweeper.iOS.csproj b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/BugSweeper.iOS.csproj
new file mode 100644
index 000000000..9dcd1166c
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/BugSweeper.iOS.csproj
@@ -0,0 +1,152 @@
+
+
+
+
+ Debug
+ iPhoneSimulator
+ 8.0.30703
+ 2.0
+ {5A67E426-F01B-4477-93D7-AFABB756FA8F}
+ {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ Exe
+ BugSweeper.iOS
+ Resources
+ BugSweeper.iOS
+
+
+
+ true
+ full
+ false
+ bin\iPhoneSimulator\Debug
+ DEBUG
+ prompt
+ 4
+ false
+ i386, x86_64
+ None
+ true
+ NSUrlSessionHandler
+
+
+ none
+ true
+ bin\iPhoneSimulator\Release
+ prompt
+ 4
+ None
+ i386, x86_64
+ false
+ NSUrlSessionHandler
+
+
+ true
+ full
+ false
+ bin\iPhone\Debug
+ DEBUG
+ prompt
+ 4
+ false
+ ARMv7, ARM64
+ iPhone Developer
+ true
+ Entitlements.plist
+ NSUrlSessionHandler
+
+
+ none
+ true
+ bin\iPhone\Release
+ prompt
+ 4
+ ARMv7, ARM64
+ false
+ iPhone Developer
+ Entitlements.plist
+ NSUrlSessionHandler
+
+
+ none
+ True
+ bin\iPhone\Ad-Hoc
+ prompt
+ 4
+ False
+ ARMv7, ARM64
+ True
+ Automatic:AdHoc
+ iPhone Distribution
+ Entitlements.plist
+ NSUrlSessionHandler
+
+
+ none
+ True
+ bin\iPhone\AppStore
+ prompt
+ 4
+ False
+ ARMv7, ARM64
+ Automatic:AppStore
+ iPhone Distribution
+ Entitlements.plist
+ NSUrlSessionHandler
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ..\..\packages\Xamarin.Forms.2.4.0.280\lib\Xamarin.iOS10\Xamarin.Forms.Core.dll
+
+
+ ..\..\packages\Xamarin.Forms.2.4.0.280\lib\Xamarin.iOS10\Xamarin.Forms.Platform.dll
+
+
+ ..\..\packages\Xamarin.Forms.2.4.0.280\lib\Xamarin.iOS10\Xamarin.Forms.Platform.iOS.dll
+
+
+ ..\..\packages\Xamarin.Forms.2.4.0.280\lib\Xamarin.iOS10\Xamarin.Forms.Xaml.dll
+
+
+
+
+
+
+
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Entitlements.plist b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Entitlements.plist
new file mode 100644
index 000000000..e9a3005f7
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Entitlements.plist
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Info.plist b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Info.plist
new file mode 100644
index 000000000..eb2b82125
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Info.plist
@@ -0,0 +1,52 @@
+
+
+
+
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ MinimumOSVersion
+ 8.0
+ CFBundleDisplayName
+ BugSweeper
+ CFBundleIdentifier
+ com.yourcompany.BugSweeper
+ CFBundleVersion
+ 1.0
+ CFBundleIconFiles
+
+ Icon-60@2x.png
+ Icon-60@3x.png
+ Icon-76.png
+ Icon-76@2x.png
+ Default.png
+ Default@2x.png
+ Default-568h@2x.png
+ Default-Portrait.png
+ Default-Portrait@2x.png
+ Icon-Small-40.png
+ Icon-Small-40@2x.png
+ Icon-Small-40@3x.png
+ Icon-Small.png
+ Icon-Small@2x.png
+ Icon-Small@3x.png
+
+ UILaunchStoryboardName
+ LaunchScreen.storyboard
+
+
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Main.cs b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Main.cs
new file mode 100644
index 000000000..1dee12a57
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Main.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using Foundation;
+using UIKit;
+
+namespace BugSweeper.iOS
+{
+ public class Application
+ {
+ // This is the main entry point of the application.
+ static void Main(string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main(args, null, "AppDelegate");
+ }
+ }
+}
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Properties/AssemblyInfo.cs b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..1305993a5
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 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("BugSweeper.iOS")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("BugSweeper.iOS")]
+[assembly: AssemblyCopyright("Copyright © 2014")]
+[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("72bdc44f-c588-44f3-b6df-9aace7daafdd")]
+
+// 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")]
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Default-568h@2x.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Default-568h@2x.png
new file mode 100644
index 000000000..26c6461e5
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Default-568h@2x.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Default-Portrait.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Default-Portrait.png
new file mode 100644
index 000000000..5d0d1ab4c
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Default-Portrait.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Default-Portrait@2x.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Default-Portrait@2x.png
new file mode 100644
index 000000000..0ee2688e8
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Default-Portrait@2x.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Default.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Default.png
new file mode 100644
index 000000000..b74643c0a
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Default.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Default@2x.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Default@2x.png
new file mode 100644
index 000000000..dbd6bd3e8
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Default@2x.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Icon-60@2x.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Icon-60@2x.png
new file mode 100644
index 000000000..4b03c4270
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Icon-60@2x.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Icon-60@3x.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Icon-60@3x.png
new file mode 100644
index 000000000..b03ca1bbc
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Icon-60@3x.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Icon-76.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Icon-76.png
new file mode 100644
index 000000000..587982e2a
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Icon-76.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Icon-76@2x.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Icon-76@2x.png
new file mode 100644
index 000000000..cd4e2c8fe
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Icon-76@2x.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Icon-Small-40.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Icon-Small-40.png
new file mode 100644
index 000000000..6acff9441
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Icon-Small-40.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Icon-Small-40@2x.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Icon-Small-40@2x.png
new file mode 100644
index 000000000..b833aac26
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Icon-Small-40@2x.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Icon-Small-40@3x.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Icon-Small-40@3x.png
new file mode 100644
index 000000000..ab8654e49
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Icon-Small-40@3x.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Icon-Small.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Icon-Small.png
new file mode 100644
index 000000000..33db7e714
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Icon-Small.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Icon-Small@2x.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Icon-Small@2x.png
new file mode 100644
index 000000000..bf45e2592
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Icon-Small@2x.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Icon-Small@3x.png b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Icon-Small@3x.png
new file mode 100644
index 000000000..7ad3891b9
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/Icon-Small@3x.png differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/LaunchScreen.storyboard b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/LaunchScreen.storyboard
new file mode 100644
index 000000000..a639c2f1a
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/Resources/LaunchScreen.storyboard
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/iTunesArtwork b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/iTunesArtwork
new file mode 100644
index 000000000..94c8ebd6b
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/iTunesArtwork differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/iTunesArtwork@2x b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/iTunesArtwork@2x
new file mode 100644
index 000000000..fa2ebf72d
Binary files /dev/null and b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/iTunesArtwork@2x differ
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/packages.config b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/packages.config
new file mode 100644
index 000000000..0b48b093d
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper.iOS/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper/App.xaml b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper/App.xaml
new file mode 100644
index 000000000..2eebc3350
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper/App.xaml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper/App.xaml.cs b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper/App.xaml.cs
new file mode 100644
index 000000000..d42d20fa3
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper/App.xaml.cs
@@ -0,0 +1,34 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using Xamarin.Forms;
+
+namespace BugSweeper
+{
+ public partial class App : Application
+ {
+ public App ()
+ {
+ InitializeComponent();
+
+ MainPage = new BugSweeper.MainPage();
+ }
+
+ protected override void OnStart ()
+ {
+ // Handle when your app starts
+ }
+
+ protected override void OnSleep ()
+ {
+ // Handle when your app sleeps
+ }
+
+ protected override void OnResume ()
+ {
+ // Handle when your app resumes
+ }
+ }
+}
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper/Board.cs b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper/Board.cs
new file mode 100644
index 000000000..e53d8e1d1
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper/Board.cs
@@ -0,0 +1,227 @@
+using System;
+using Xamarin.Forms;
+
+namespace BugSweeper
+{
+ public class Board : AbsoluteLayout
+ {
+ // Alternative sizes make the tiles a tad small.
+ const int COLS = 9; // 16
+ const int ROWS = 9; // 16
+ const int BUGS = 10; // 40
+
+ // The array of tiles
+ Tile[,] tiles = new Tile[ROWS, COLS];
+
+ int flaggedTileCount;
+ bool isGameInProgress; // on first tap
+ bool isGameInitialized; // on first double-tap
+ bool isGameEnded;
+
+ // Events to notify page.
+ public event EventHandler GameStarted;
+ public event EventHandler GameEnded;
+
+ public Board()
+ {
+ for (int row = 0; row < ROWS; row++)
+ for (int col = 0; col < COLS; col++)
+ {
+ Tile tile = new Tile(row, col);
+ tile.TileStatusChanged += OnTileStatusChanged;
+ Children.Add(tile.TileView);
+ tiles[row, col] = tile;
+ }
+
+ SizeChanged += (sender, args) =>
+ {
+ double tileWidth = this.Width / COLS;
+ double tileHeight = this.Height / ROWS;
+
+ foreach (Tile tile in tiles)
+ {
+ Rectangle bounds = new Rectangle(tile.Col * tileWidth,
+ tile.Row * tileHeight,
+ tileWidth, tileHeight);
+ SetLayoutBounds(tile.TileView, bounds);
+ }
+ };
+
+ NewGameInitialize();
+ }
+
+ public void NewGameInitialize()
+ {
+ // Clear all the tiles.
+ foreach (Tile tile in tiles)
+ tile.Initialize();
+
+ isGameInProgress = false;
+ isGameInitialized = false;
+ isGameEnded = false;
+ FlaggedTileCount = 0;
+ }
+
+ public int FlaggedTileCount
+ {
+ set
+ {
+ if (flaggedTileCount != value)
+ {
+ flaggedTileCount = value;
+ OnPropertyChanged();
+ }
+ }
+ get
+ {
+ return flaggedTileCount;
+ }
+ }
+
+ public int BugCount
+ {
+ get
+ {
+ return BUGS;
+ }
+ }
+
+
+ // Not called until the first tile is double-tapped.
+ void DefineNewBoard(int tappedRow, int tappedCol)
+ {
+ // Begin the assignment of bugs.
+ Random random = new Random();
+ int bugCount = 0;
+
+ while (bugCount < BUGS)
+ {
+ // Get random row and column.
+ int row = random.Next(ROWS);
+ int col = random.Next(COLS);
+
+ // Skip it if it's already a bug.
+ if (tiles[row, col].IsBug)
+ {
+ continue;
+ }
+
+ // Avoid the tappedRow & Col & surrounding ones.
+ if (row >= tappedRow - 1 &&
+ row <= tappedRow + 1 &&
+ col >= tappedCol - 1 &&
+ col <= tappedCol + 1)
+ {
+ continue;
+ }
+
+ // It's a bug!
+ tiles[row, col].IsBug = true;
+
+ // Calculate the surrounding bug count.
+ CycleThroughNeighbors(row, col, (neighborRow, neighborCol) =>
+ {
+ ++tiles[neighborRow, neighborCol].SurroundingBugCount;
+ });
+
+ bugCount++;
+ }
+ }
+
+ void CycleThroughNeighbors(int row, int col, Action callback)
+ {
+ int minRow = Math.Max(0, row - 1);
+ int maxRow = Math.Min(ROWS - 1, row + 1);
+ int minCol = Math.Max(0, col - 1);
+ int maxCol = Math.Min(COLS - 1, col + 1);
+
+ for (int neighborRow = minRow; neighborRow <= maxRow; neighborRow++)
+ for (int neighborCol = minCol; neighborCol <= maxCol; neighborCol++)
+ {
+ if (neighborRow != row || neighborCol != col)
+ callback(neighborRow, neighborCol);
+ }
+ }
+
+ void OnTileStatusChanged(object sender, EventArgs args)
+ {
+ if (isGameEnded)
+ return;
+
+ // With a first tile tapped, the game is now in progress.
+ if (!isGameInProgress)
+ {
+ isGameInProgress = true;
+
+ // Fire the GameStarted event.
+ GameStarted?.Invoke(this, EventArgs.Empty);
+ }
+
+ // Update the "flagged" bug count before checking for a loss.
+ int flaggedCount = 0;
+
+ foreach (Tile tile in tiles)
+ if (tile.Status == TileStatus.Flagged)
+ flaggedCount++;
+
+ FlaggedTileCount = flaggedCount;
+
+ // Get the tile whose status has changed.
+ Tile changedTile = (Tile)sender;
+ TileStatus changedStatus = changedTile.Status;
+
+ // If it's exposed, some actions are required.
+ if (changedStatus == TileStatus.Exposed)
+ {
+ if (!isGameInitialized)
+ {
+ DefineNewBoard(changedTile.Row, changedTile.Col);
+ isGameInitialized = true;
+ }
+
+ if (changedTile.IsBug)
+ {
+ isGameInProgress = false;
+ isGameEnded = true;
+
+ // Fire the GameEnded event!
+ GameEnded?.Invoke(this, false);
+ return;
+ }
+
+ // Auto expose for zero surrounding bugs.
+ if (changedTile.SurroundingBugCount == 0)
+ {
+ CycleThroughNeighbors(changedTile.Row, changedTile.Col, (neighborRow, neighborCol) =>
+ {
+ // Expose all the neighbors.
+ tiles[neighborRow, neighborCol].Status = TileStatus.Exposed;
+ });
+ }
+ }
+
+ // Check for a win.
+ bool hasWon = true;
+
+ foreach (Tile til in tiles)
+ {
+ if (til.IsBug && til.Status != TileStatus.Flagged)
+ hasWon = false;
+
+ if (!til.IsBug && til.Status != TileStatus.Exposed)
+ hasWon = false;
+ }
+
+ // If there's a win, celebrate!
+ if (hasWon)
+ {
+ isGameInProgress = false;
+ isGameEnded = true;
+
+ // Fire the GameEnded event!
+ GameEnded?.Invoke(this, true);
+ return;
+ }
+ }
+ }
+}
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper/BugSweeper.projitems b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper/BugSweeper.projitems
new file mode 100644
index 000000000..c830b853b
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper/BugSweeper.projitems
@@ -0,0 +1,31 @@
+
+
+
+ $(MSBuildAllProjects);$(MSBuildThisFileFullPath)
+ true
+ 7d98ecde-712d-4b4a-a82d-bcfeb28eb9b9
+
+
+ BugSweeper
+
+
+
+ App.xaml
+
+
+
+ MainPage.xaml
+
+
+
+
+
+ Designer
+ MSBuild:UpdateDesignTimeXaml
+
+
+ Designer
+ MSBuild:UpdateDesignTimeXaml
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper/BugSweeper.shproj b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper/BugSweeper.shproj
new file mode 100644
index 000000000..b25a26520
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper/BugSweeper.shproj
@@ -0,0 +1,12 @@
+
+
+
+ 7d98ecde-712d-4b4a-a82d-bcfeb28eb9b9
+
+
+
+
+
+
+
+
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper/MainPage.xaml b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper/MainPage.xaml
new file mode 100644
index 000000000..117cd5382
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper/MainPage.xaml
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper/MainPage.xaml.cs b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper/MainPage.xaml.cs
new file mode 100644
index 000000000..c8d7316bc
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper/MainPage.xaml.cs
@@ -0,0 +1,167 @@
+#pragma warning disable 4014 // for non-await'ed async call
+
+using System;
+using System.Threading.Tasks;
+using Xamarin.Forms;
+
+namespace BugSweeper
+{
+ public partial class MainPage : ContentPage
+ {
+ const string timeFormat = @"%m\:ss";
+
+ bool isGameInProgress;
+ DateTime gameStartTime;
+
+ public MainPage()
+ {
+ InitializeComponent();
+
+ board.GameStarted += (sender, args) =>
+ {
+ isGameInProgress = true;
+ gameStartTime = DateTime.Now;
+
+ Device.StartTimer(TimeSpan.FromSeconds(1), () =>
+ {
+ timeLabel.Text = (DateTime.Now - gameStartTime).ToString(timeFormat);
+ return isGameInProgress;
+ });
+ };
+
+ board.GameEnded += (sender, hasWon) =>
+ {
+ isGameInProgress = false;
+
+ if (hasWon)
+ {
+ DisplayWonAnimation();
+ }
+ else
+ {
+ DisplayLostAnimation();
+ }
+ };
+
+ PrepareForNewGame();
+
+ }
+
+ void PrepareForNewGame()
+ {
+ board.NewGameInitialize();
+
+ congratulationsText.IsVisible = false;
+ consolationText.IsVisible = false;
+ playAgainButton.IsVisible = false;
+ playAgainButton.IsEnabled = false;
+
+ timeLabel.Text = new TimeSpan().ToString(timeFormat);
+ isGameInProgress = false;
+ }
+
+ void OnMainContentViewSizeChanged(object sender, EventArgs args)
+ {
+ ContentView contentView = (ContentView)sender;
+ double width = contentView.Width;
+ double height = contentView.Height;
+
+ bool isLandscape = width > height;
+
+ if (isLandscape)
+ {
+ mainGrid.RowDefinitions[0].Height = 0;
+ mainGrid.RowDefinitions[1].Height = new GridLength(1, GridUnitType.Star);
+
+ mainGrid.ColumnDefinitions[0].Width = new GridLength(1, GridUnitType.Star);
+ mainGrid.ColumnDefinitions[1].Width = new GridLength(1, GridUnitType.Star);
+
+ Grid.SetRow(textStack, 1);
+ Grid.SetColumn(textStack, 0);
+ }
+ else // portrait
+ {
+ mainGrid.RowDefinitions[0].Height = new GridLength(3, GridUnitType.Star);
+ mainGrid.RowDefinitions[1].Height = new GridLength(5, GridUnitType.Star);
+
+ mainGrid.ColumnDefinitions[0].Width = 0;
+ mainGrid.ColumnDefinitions[1].Width = new GridLength(1, GridUnitType.Star);
+
+ Grid.SetRow(textStack, 0);
+ Grid.SetColumn(textStack, 1);
+ }
+ }
+
+ // Maintains a square aspect ratio for the board.
+ void OnBoardContentViewSizeChanged(object sender, EventArgs args)
+ {
+ ContentView contentView = (ContentView)sender;
+ double width = contentView.Width;
+ double height = contentView.Height;
+ double dimension = Math.Min(width, height);
+ double horzPadding = (width - dimension) / 2;
+ double vertPadding = (height - dimension) / 2;
+ contentView.Padding = new Thickness(horzPadding, vertPadding);
+ }
+
+ async void DisplayWonAnimation()
+ {
+ congratulationsText.Scale = 0;
+ congratulationsText.IsVisible = true;
+
+ // Because IsVisible has been false, the text might not have a size yet,
+ // in which case Measure will return a size.
+ double congratulationsTextWidth = congratulationsText.Measure(Double.PositiveInfinity, Double.PositiveInfinity).Request.Width;
+
+ congratulationsText.Rotation = 0;
+ congratulationsText.RotateTo(3 * 360, 1000, Easing.CubicOut);
+
+ double maxScale = 0.9 * board.Width / congratulationsTextWidth;
+ await congratulationsText.ScaleTo(maxScale, 1000);
+
+ foreach (View view in congratulationsText.Children)
+ {
+ view.Rotation = 0;
+ view.RotateTo(180);
+ await view.ScaleTo(3, 100);
+ view.RotateTo(360);
+ await view.ScaleTo(1, 100);
+ }
+
+ await DisplayPlayAgainButton();
+ }
+
+ async void DisplayLostAnimation()
+ {
+ consolationText.Scale = 0;
+ consolationText.IsVisible = true;
+
+ // (See above for rationale)
+ double consolationTextWidth = consolationText.Measure(Double.PositiveInfinity, Double.PositiveInfinity).Request.Width;
+
+ double maxScale = 0.9 * board.Width / consolationTextWidth;
+ await consolationText.ScaleTo(maxScale, 1000);
+ await Task.Delay(1000);
+ await DisplayPlayAgainButton();
+ }
+
+ async Task DisplayPlayAgainButton()
+ {
+ playAgainButton.Scale = 0;
+ playAgainButton.IsVisible = true;
+ playAgainButton.IsEnabled = true;
+
+ // (See above for rationale)
+ double playAgainButtonWidth = playAgainButton.Measure(Double.PositiveInfinity, Double.PositiveInfinity).Request.Width;
+
+ double maxScale = board.Width / playAgainButtonWidth;
+ await playAgainButton.ScaleTo(maxScale, 1000, Easing.SpringOut);
+ }
+
+ void OnPlayAgainButtonClicked(object sender, object EventArgs)
+ {
+ PrepareForNewGame();
+ }
+ }
+}
+
diff --git a/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper/Tile.cs b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper/Tile.cs
new file mode 100644
index 000000000..2a176c661
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/BugSweeper/BugSweeper/Tile.cs
@@ -0,0 +1,206 @@
+#define FIX_WINDOWS_DOUBLE_TAPS // Double-taps don't work well on Windows Runtime as of 2.3.0
+
+using System;
+using Xamarin.Forms;
+
+namespace BugSweeper
+{
+ public enum TileStatus
+ {
+ Hidden,
+ Flagged,
+ Exposed
+ }
+
+ public class Tile // : Frame
+ {
+ const string UrlPrefix = "http://xamarin.github.io/xamarin-forms-book-samples/BugSweeper/";
+ static ImageSource flagImageSource = ImageSource.FromUri(new Uri(UrlPrefix + "Xamarin120.png"));
+ static ImageSource bugImageSource = ImageSource.FromUri(new Uri(UrlPrefix + "RedBug.png"));
+
+ Label hiddenLabel = new Label
+ {
+ Text = " ",
+ TextColor = Color.Yellow,
+ BackgroundColor = Color.Yellow
+ };
+
+ Label exposedLabel = new Label
+ {
+ Text = " ",
+ TextColor = Color.Yellow,
+ BackgroundColor = Color.Blue,
+ HorizontalTextAlignment = TextAlignment.Center,
+ VerticalTextAlignment = TextAlignment.Center,
+ };
+
+ Image flagImage = new Image
+ {
+ Source = flagImageSource
+ };
+
+ Image bugImage = new Image
+ {
+ Source = bugImageSource
+ };
+
+ TileStatus tileStatus = TileStatus.Hidden;
+ bool doNotFireEvent;
+
+ public event EventHandler TileStatusChanged;
+
+ public Tile(int row, int col)
+ {
+ Row = row;
+ Col = col;
+
+ TileView = new Frame
+ {
+ Content = hiddenLabel,
+ BackgroundColor = Color.Black,
+ OutlineColor = Color.Black,
+ Padding = new Thickness(1)
+ };
+
+ TapGestureRecognizer singleTap = new TapGestureRecognizer
+ {
+ NumberOfTapsRequired = 1
+ };
+ singleTap.Tapped += OnSingleTap;
+ TileView.GestureRecognizers.Add(singleTap);
+
+ #if FIX_WINDOWS_DOUBLE_TAPS
+
+ if (Device.RuntimePlatform != Device.UWP)
+ {
+
+ #endif
+
+ TapGestureRecognizer doubleTap = new TapGestureRecognizer
+ {
+ NumberOfTapsRequired = 2
+ };
+ doubleTap.Tapped += OnDoubleTap;
+ TileView.GestureRecognizers.Add(doubleTap);
+
+ #if FIX_WINDOWS_DOUBLE_TAPS
+
+ }
+
+ #endif
+
+ }
+
+ public ContentView TileView { private set; get; }
+
+ public int Row { private set; get; }
+
+ public int Col { private set; get; }
+
+ public bool IsBug { set; get; }
+
+ public int SurroundingBugCount { set; get; }
+
+ public TileStatus Status
+ {
+ set
+ {
+ if (tileStatus != value)
+ {
+ tileStatus = value;
+
+ switch (tileStatus)
+ {
+ case TileStatus.Hidden:
+ TileView.Content = hiddenLabel;
+ break;
+
+ case TileStatus.Flagged:
+ TileView.Content = flagImage;
+ break;
+
+ case TileStatus.Exposed:
+ if (IsBug)
+ {
+ TileView.Content = bugImage;
+ }
+ else
+ {
+ exposedLabel.Text = (SurroundingBugCount > 0) ? SurroundingBugCount.ToString() : " ";
+ TileView.Content = exposedLabel;
+ }
+ break;
+ }
+
+ if (!doNotFireEvent)
+ {
+ TileStatusChanged?.Invoke(this, EventArgs.Empty);
+ }
+ }
+ }
+ get
+ {
+ return tileStatus;
+ }
+ }
+
+ // Does not fire TileStatusChanged events.
+ public void Initialize()
+ {
+ doNotFireEvent = true;
+ Status = TileStatus.Hidden;
+ IsBug = false;
+ SurroundingBugCount = 0;
+ doNotFireEvent = false;
+ }
+
+#if FIX_WINDOWS_DOUBLE_TAPS
+
+ bool lastTapSingle;
+ DateTime lastTapTime;
+
+#endif
+
+ void OnSingleTap(object sender, object args)
+ {
+
+#if FIX_WINDOWS_DOUBLE_TAPS
+
+ if (Device.RuntimePlatform == Device.UWP)
+ {
+ if (lastTapSingle && DateTime.Now - lastTapTime < TimeSpan.FromMilliseconds (500))
+ {
+ OnDoubleTap (sender, args);
+ lastTapSingle = false;
+ }
+ else
+ {
+ lastTapTime = DateTime.Now;
+ lastTapSingle = true;
+ }
+ }
+
+#endif
+
+ switch (Status)
+ {
+ case TileStatus.Hidden:
+ Status = TileStatus.Flagged;
+ break;
+
+ case TileStatus.Flagged:
+ Status = TileStatus.Hidden;
+ break;
+
+ case TileStatus.Exposed:
+ // Do nothing
+ break;
+ }
+ }
+
+ void OnDoubleTap (object sender, object args)
+ {
+ Status = TileStatus.Exposed;
+ }
+ }
+}
diff --git a/LivePlayer/BugSweeperLP/Metadata.xml b/LivePlayer/BugSweeperLP/Metadata.xml
new file mode 100644
index 000000000..fe02df876
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/Metadata.xml
@@ -0,0 +1,11 @@
+
+
+ C97AED2F-93AD-48C3-A59F-3D2F810CE58C
+ true
+ Intermediate
+ liveplayer
+ Android, iOS, windows-rt
+ Indie
+ true
+ A familiar game with a new twist.
+
diff --git a/LivePlayer/BugSweeperLP/README.md b/LivePlayer/BugSweeperLP/README.md
new file mode 100644
index 000000000..27b9eb0ac
--- /dev/null
+++ b/LivePlayer/BugSweeperLP/README.md
@@ -0,0 +1,16 @@
+BugSweeper
+======
+
+This is a familiar game with a new twist. Ten bugs are hidden in a 9-by-9 grid of tiles.
+To win, you must find and flag all ten bugs.
+
+Begin playing by double tapping any tile. That first double tap is always safe.
+Thereafter, numbers indicate the number of surrounding tiles with bugs.
+If you know that a tile has a bug, flag it (or unflag it) with a single tap.
+Avoid double-tapping a tile with a bug!
+
+
+Author
+------
+
+Charles Petzold
diff --git a/LivePlayer/BugSweeperLP/Screenshots/01Android.png b/LivePlayer/BugSweeperLP/Screenshots/01Android.png
new file mode 100644
index 000000000..a40ecaa40
Binary files /dev/null and b/LivePlayer/BugSweeperLP/Screenshots/01Android.png differ
diff --git a/LivePlayer/ColorControl/AppDelegate.cs b/LivePlayer/ColorControl/AppDelegate.cs
new file mode 100644
index 000000000..cdb2484e1
--- /dev/null
+++ b/LivePlayer/ColorControl/AppDelegate.cs
@@ -0,0 +1,53 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using Foundation;
+using UIKit;
+
+namespace ColorControl {
+ // The UIApplicationDelegate for the application. This class is responsible for launching the
+ // User Interface of the application, as well as listening (and optionally responding) to
+ // application events from iOS.
+ [Register ("AppDelegate")]
+ public partial class AppDelegate : UIApplicationDelegate {
+
+ static void Main (string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main (args, null, "AppDelegate");
+ }
+
+ // class-level declarations
+ UIWindow window;
+ UINavigationController navigationController;
+ UIViewController viewController;
+
+ //
+ // This method is invoked when the application has loaded and is ready to run. In this
+ // method you should instantiate the window, load the UI into it and then make the window
+ // visible.
+ //
+ // You have 17 seconds to return from this method, or iOS will terminate your application.
+ //
+ public override bool FinishedLaunching (UIApplication app, NSDictionary options)
+ {
+ // create a new window instance based on the screen size
+ window = new UIWindow (UIScreen.MainScreen.Bounds);
+
+ viewController = new ImageViewController();
+
+ navigationController = new UINavigationController();
+ navigationController.PushViewController (viewController, false);
+
+ window.RootViewController = navigationController;
+
+ // make the window visible
+ window.MakeKeyAndVisible ();
+
+ return true;
+ }
+ }
+}
+
diff --git a/LivePlayer/ColorControl/Camera.cs b/LivePlayer/ColorControl/Camera.cs
new file mode 100644
index 000000000..ad8d4842f
--- /dev/null
+++ b/LivePlayer/ColorControl/Camera.cs
@@ -0,0 +1,77 @@
+//
+// Camera.cs: Support code for taking pictures
+//
+// Copyright 2010 Miguel de Icaza
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using UIKit;
+using Foundation;
+
+namespace TweetStation
+{
+ //
+ // A static class that will reuse the UIImagePickerController
+ // as iPhoneOS has a crash if multiple UIImagePickerController are created
+ // http://stackoverflow.com/questions/487173
+ // (Follow the links)
+ //
+ public static class Camera
+ {
+ static UIImagePickerController picker;
+ static Action _callback;
+
+ static void Init ()
+ {
+ if (picker != null)
+ return;
+
+ picker = new UIImagePickerController ();
+ picker.Delegate = new CameraDelegate ();
+ }
+
+ class CameraDelegate : UIImagePickerControllerDelegate {
+ public override void FinishedPickingMedia (UIImagePickerController picker, NSDictionary info)
+ {
+ var cb = _callback;
+ _callback = null;
+
+ picker.DismissModalViewController (true);
+ cb (info);
+ }
+ }
+
+ public static void TakePicture (UIViewController parent, Action callback)
+ {
+ Init ();
+ picker.SourceType = UIImagePickerControllerSourceType.Camera;
+ _callback = callback;
+ parent.PresentModalViewController (picker, true);
+ }
+
+ public static void SelectPicture (UIViewController parent, Action callback)
+ {
+ Init ();
+ picker.SourceType = UIImagePickerControllerSourceType.PhotoLibrary;
+ _callback = callback;
+ parent.PresentModalViewController (picker, true);
+ }
+ }
+}
diff --git a/LivePlayer/ColorControl/ColorControl.csproj b/LivePlayer/ColorControl/ColorControl.csproj
new file mode 100644
index 000000000..64c05ded8
--- /dev/null
+++ b/LivePlayer/ColorControl/ColorControl.csproj
@@ -0,0 +1,98 @@
+
+
+
+ Debug
+ iPhoneSimulator
+ 8.0.30703
+ 2.0
+ {9785D147-C90E-47FD-A1A0-CBD233E708BB}
+ {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ Exe
+ ColorControl
+ Xamarin.iOS
+ v1.0
+
+
+ true
+ full
+ false
+ bin\iPhoneSimulator\Debug
+ DEBUG;
+ prompt
+ 4
+ false
+ true
+ true
+ None
+
+ MapView
+ NSUrlSessionHandler
+
+
+ none
+ false
+ bin\iPhoneSimulator\Release
+ prompt
+ 4
+ false
+ None
+ MapView
+ NSUrlSessionHandler
+
+
+ true
+ full
+ false
+ bin\iPhone\Debug
+ DEBUG;
+ prompt
+ 4
+ false
+ iPhone Developer
+ true
+ true
+
+ ColorControl
+
+ ARMv7
+ NSUrlSessionHandler
+
+
+ none
+ false
+ bin\iPhone\Release
+ prompt
+ 4
+ false
+ iPhone Developer
+ ColorControl
+ ARMv7, ARM64
+ NSUrlSessionHandler
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/ColorControl/ColorControl.sln b/LivePlayer/ColorControl/ColorControl.sln
new file mode 100644
index 000000000..de466bd27
--- /dev/null
+++ b/LivePlayer/ColorControl/ColorControl.sln
@@ -0,0 +1,26 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ColorControl", "ColorControl.csproj", "{9785D147-C90E-47FD-A1A0-CBD233E708BB}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|iPhoneSimulator = Debug|iPhoneSimulator
+ Release|iPhoneSimulator = Release|iPhoneSimulator
+ Debug|iPhone = Debug|iPhone
+ Release|iPhone = Release|iPhone
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {9785D147-C90E-47FD-A1A0-CBD233E708BB}.Debug|iPhone.ActiveCfg = Debug|iPhone
+ {9785D147-C90E-47FD-A1A0-CBD233E708BB}.Debug|iPhone.Build.0 = Debug|iPhone
+ {9785D147-C90E-47FD-A1A0-CBD233E708BB}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
+ {9785D147-C90E-47FD-A1A0-CBD233E708BB}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
+ {9785D147-C90E-47FD-A1A0-CBD233E708BB}.Release|iPhone.ActiveCfg = Release|iPhone
+ {9785D147-C90E-47FD-A1A0-CBD233E708BB}.Release|iPhone.Build.0 = Release|iPhone
+ {9785D147-C90E-47FD-A1A0-CBD233E708BB}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
+ {9785D147-C90E-47FD-A1A0-CBD233E708BB}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
+ EndGlobalSection
+ GlobalSection(MonoDevelopProperties) = preSolution
+ StartupItem = ColorControl.csproj
+ EndGlobalSection
+EndGlobal
diff --git a/LivePlayer/ColorControl/ImageViewController.cs b/LivePlayer/ColorControl/ImageViewController.cs
new file mode 100644
index 000000000..035821b53
--- /dev/null
+++ b/LivePlayer/ColorControl/ImageViewController.cs
@@ -0,0 +1,172 @@
+using System;
+using CoreGraphics;
+using AssetsLibrary;
+using UIKit;
+using Foundation;
+using CoreImage;
+
+/*
+"Sunrise near Atkeison Plateau" © 2012 Charles Atkeison,
+used under a Creative Commons Attribution-ShareAlike license: http://creativecommons.org/licenses/by-sa/3.0/
+*/
+
+namespace ColorControl {
+
+ public class ImageViewController : UIViewController {
+
+ UIImage sourceImage, displayImage;
+ NSDictionary sourceMeta;
+
+ UIButton cameraButton, saveButton, resetButton;
+ UIImageView imageView;
+ UISlider sliderC, sliderS, sliderB;
+ UILabel labelC, labelS, labelB;
+
+
+
+ public override void ViewDidLoad ()
+ {
+ base.ViewDidLoad ();
+ Title = "Color Controls Pro";
+ View.BackgroundColor = UIColor.White;
+
+ var sz = this.View.Bounds;
+
+ cameraButton = UIButton.FromType (UIButtonType.RoundedRect);
+ cameraButton.Frame = new CGRect(10, 80, 90, 40);
+ cameraButton.SetTitle ("Take Photo", UIControlState.Normal);
+ cameraButton.TouchUpInside += (sender, e) => {
+
+ TweetStation.Camera.TakePicture (this, (obj) =>{
+ // https://developer.apple.com/library/ios/#documentation/uikit/reference/UIImagePickerControllerDelegate_Protocol/UIImagePickerControllerDelegate/UIImagePickerControllerDelegate.html#//apple_ref/occ/intfm/UIImagePickerControllerDelegate/imagePickerController:didFinishPickingMediaWithInfo:
+ var photo = obj.ValueForKey(new NSString("UIImagePickerControllerOriginalImage")) as UIImage;
+ var meta = obj.ValueForKey(new NSString("UIImagePickerControllerMediaMetadata")) as NSDictionary;
+
+ sourceImage = photo;
+ displayImage = sourceImage.Scale(new CGSize(300, 200));
+ imageView.Image = displayImage;
+ sourceMeta = meta;
+
+ sliderS.Value = 1;
+ sliderB.Value = 0;
+ sliderC.Value = 1;
+ });
+ };
+ View.Add (cameraButton);
+
+ resetButton = UIButton.FromType (UIButtonType.RoundedRect);
+ resetButton.Frame = new CGRect(110, 80, 90, 40);
+ resetButton.SetTitle ("Reset", UIControlState.Normal);
+ resetButton.TouchUpInside += (sender, e) => {
+ sliderS.Value = 1;
+ sliderB.Value = 0;
+ sliderC.Value = 1;
+
+ HandleValueChanged (sender, e);
+ };
+ View.Add (resetButton);
+
+
+ // ACCESS DENIED
+ //saveButton = UIButton.FromType (UIButtonType.RoundedRect);
+ //saveButton.Frame = new CGRect(210, 80, 90, 40);
+ //saveButton.SetTitle ("Save", UIControlState.Normal);
+ //saveButton.TouchUpInside += (sender, e) => {
+ // ALAssetsLibrary library = new ALAssetsLibrary();
+
+ // var img = AdjustImage (sourceImage);
+
+ // if (sourceMeta == null) sourceMeta = new NSDictionary(); // when using 'clouds.jpg'
+
+ // library.WriteImageToSavedPhotosAlbum (img.CGImage, sourceMeta, (assetUrl, error) => {
+ // Console.WriteLine ("SAVED TO assetUrl:"+assetUrl);
+
+ // new UIAlertView("Saved", "Photo saved to Camera Roll" + error, null, "OK", null).Show ();
+ // });
+ //};
+ //View.Add (saveButton);
+
+ labelC = new UILabel(new CGRect(10, 240, 90, 20));
+ labelS = new UILabel(new CGRect(10, 200, 90, 20));
+ labelB = new UILabel(new CGRect(10, 160, 90, 20));
+
+ labelC.Text = "Contrast";
+ labelS.Text = "Saturation";
+ labelB.Text = "Brightness";
+
+ View.Add (labelC);
+ View.Add (labelS);
+ View.Add (labelB);
+
+ sliderB = new UISlider(new CGRect(100, 160, 210, 20));
+ sliderS = new UISlider(new CGRect(100, 200, 210, 20));
+ sliderC = new UISlider(new CGRect(100, 240, 210, 20));
+
+ // http://developer.apple.com/library/mac/#documentation/graphicsimaging/reference/CoreImageFilterReference/Reference/reference.html#//apple_ref/doc/filter/ci/CIColorControls
+ sliderS.MinValue = 0;
+ sliderS.MaxValue = 2;
+ sliderS.Value = 1;
+
+ sliderB.MinValue = -1;
+ sliderB.MaxValue = 1;
+ sliderB.Value = 0;
+
+ sliderC.MinValue = 0;
+ sliderC.MaxValue = 4;
+ sliderC.Value = 1;
+
+ // update the image in 'real time' as the sliders are moved
+ sliderC.ValueChanged += HandleValueChanged;
+ sliderS.ValueChanged += HandleValueChanged;
+ sliderB.ValueChanged += HandleValueChanged;
+
+ View.Add (sliderC);
+ View.Add (sliderS);
+ View.Add (sliderB);
+
+ //imageView = new UIImageView(new CGRect(10, 240, 300, 200));
+ imageView = new UIImageView(new CGRect(0, 290, sz.Width, sz.Width / 3 * 2));
+ //sourceImage = UIImage.FromFile ("clouds.jpg");
+ //displayImage = sourceImage;
+ //imageView.Image = displayImage;
+ View.Add (imageView);
+
+ if (!UIImagePickerController.IsSourceTypeAvailable (UIImagePickerControllerSourceType.Camera)) {
+ cameraButton.SetTitle ("No camera", UIControlState.Disabled);
+ cameraButton.SetTitleColor (UIColor.Gray, UIControlState.Disabled);
+ cameraButton.Enabled = false;
+ }
+ }
+
+ void HandleValueChanged(object sender, EventArgs e)
+ { // use the low-res version
+ if (displayImage != null)
+ {
+ imageView.Image = AdjustImage(displayImage);
+ }
+ }
+
+ CIContext context;
+ CIColorControls colorCtrls; //CIFilter
+
+ UIImage AdjustImage (UIImage image)
+ {
+ if (colorCtrls == null)
+ colorCtrls = new CIColorControls () { Image = CIImage.FromCGImage (image.CGImage) };
+ else
+ colorCtrls.Image = CIImage.FromCGImage(image.CGImage);
+
+ if (context == null)
+ context = CIContext.FromOptions (null);
+
+ colorCtrls.Brightness = sliderB.Value;
+ colorCtrls.Saturation = sliderS.Value;
+ colorCtrls.Contrast = sliderC.Value;
+
+ using (var outputImage = colorCtrls.OutputImage) {
+ var result = context.CreateCGImage (outputImage, outputImage.Extent);
+ return UIImage.FromImage (result);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/LivePlayer/ColorControl/Info.plist b/LivePlayer/ColorControl/Info.plist
new file mode 100644
index 000000000..f2b787cfc
--- /dev/null
+++ b/LivePlayer/ColorControl/Info.plist
@@ -0,0 +1,27 @@
+
+
+
+
+ CFBundleDisplayName
+ ColorControl
+ CFBundleIdentifier
+ com.xamarin.recipe.colorcontrol
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ MinimumOSVersion
+ 8.3
+ XSLaunchImageAssets
+ Resources/Images.xcassets/LaunchImage.launchimage
+ UILaunchStoryboardName
+ LaunchScreen
+
+
diff --git a/LivePlayer/ColorControl/Metadata.xml b/LivePlayer/ColorControl/Metadata.xml
new file mode 100644
index 000000000..e3e5d529b
--- /dev/null
+++ b/LivePlayer/ColorControl/Metadata.xml
@@ -0,0 +1,11 @@
+
+
+ 4A7B9108-1195-481C-AD0D-A5C9AD6A5D24
+ false
+ Beginner
+
+ iOS
+ Community
+ A simple iOS CoreImage demo.
+ true
+
diff --git a/LivePlayer/ColorControl/Resources/Icon-60.png b/LivePlayer/ColorControl/Resources/Icon-60.png
new file mode 100644
index 000000000..d073c9545
Binary files /dev/null and b/LivePlayer/ColorControl/Resources/Icon-60.png differ
diff --git a/LivePlayer/ColorControl/Resources/Icon-60@2x.png b/LivePlayer/ColorControl/Resources/Icon-60@2x.png
new file mode 100644
index 000000000..4b03c4270
Binary files /dev/null and b/LivePlayer/ColorControl/Resources/Icon-60@2x.png differ
diff --git a/LivePlayer/ColorControl/Resources/Icon-60@3x.png b/LivePlayer/ColorControl/Resources/Icon-60@3x.png
new file mode 100644
index 000000000..b03ca1bbc
Binary files /dev/null and b/LivePlayer/ColorControl/Resources/Icon-60@3x.png differ
diff --git a/LivePlayer/ColorControl/Resources/Images.xcassets/LaunchImage.launchimage/Contents.json b/LivePlayer/ColorControl/Resources/Images.xcassets/LaunchImage.launchimage/Contents.json
new file mode 100644
index 000000000..44c8e2e17
--- /dev/null
+++ b/LivePlayer/ColorControl/Resources/Images.xcassets/LaunchImage.launchimage/Contents.json
@@ -0,0 +1,7 @@
+{
+ "images": [],
+ "info": {
+ "version": 1,
+ "author": "xcode"
+ }
+}
\ No newline at end of file
diff --git a/LivePlayer/ColorControl/Resources/LaunchScreen.storyboard b/LivePlayer/ColorControl/Resources/LaunchScreen.storyboard
new file mode 100644
index 000000000..a639c2f1a
--- /dev/null
+++ b/LivePlayer/ColorControl/Resources/LaunchScreen.storyboard
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/LivePlayer/ColorControl/Screenshots/color-control-sml.png b/LivePlayer/ColorControl/Screenshots/color-control-sml.png
new file mode 100644
index 000000000..5215016bf
Binary files /dev/null and b/LivePlayer/ColorControl/Screenshots/color-control-sml.png differ
diff --git a/LivePlayer/ColorControl/readme.md b/LivePlayer/ColorControl/readme.md
new file mode 100644
index 000000000..4edc015b5
--- /dev/null
+++ b/LivePlayer/ColorControl/readme.md
@@ -0,0 +1,10 @@
+Color Control Sample (iOS)
+===========================
+
+This Xamarin.iOS app demonstrating CoreImage is also a good demo for the Xamarin Live Player.
+
+Follow the [setup instructions](https://developer.xamarin.com/guides/cross-platform/live/install) to try this out on your iPhone.
+
+
+
+[xamarin.com/live](https://xamarin.com/live)
diff --git a/LivePlayer/LiveView/.vs/LiveView/v15/Server/sqlite3/db.lock b/LivePlayer/LiveView/.vs/LiveView/v15/Server/sqlite3/db.lock
new file mode 100644
index 000000000..e69de29bb
diff --git a/LivePlayer/LiveView/.vs/LiveView/v15/Server/sqlite3/storage.ide b/LivePlayer/LiveView/.vs/LiveView/v15/Server/sqlite3/storage.ide
new file mode 100644
index 000000000..c00d9ea72
Binary files /dev/null and b/LivePlayer/LiveView/.vs/LiveView/v15/Server/sqlite3/storage.ide differ
diff --git a/LivePlayer/LiveView/LiveView.sln b/LivePlayer/LiveView/LiveView.sln
new file mode 100644
index 000000000..4770c8452
--- /dev/null
+++ b/LivePlayer/LiveView/LiveView.sln
@@ -0,0 +1,156 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.27004.2008
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "LiveView", "LiveView\LiveView\LiveView.shproj", "{1EBC99A4-EC72-4B4C-BB35-3D6BED942454}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LiveView.Android", "LiveView\LiveView.Android\LiveView.Android.csproj", "{32097E2E-CAC1-48F5-A403-12764C817CD1}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LiveView.iOS", "LiveView\LiveView.iOS\LiveView.iOS.csproj", "{97E52D0F-4AFB-4F9D-8C2E-D9A601461452}"
+EndProject
+Global
+ GlobalSection(SharedMSBuildProjectFiles) = preSolution
+ LiveView\LiveView\LiveView.projitems*{1ebc99a4-ec72-4b4c-bb35-3d6bed942454}*SharedItemsImports = 13
+ LiveView\LiveView\LiveView.projitems*{32097e2e-cac1-48f5-a403-12764c817cd1}*SharedItemsImports = 4
+ LiveView\LiveView\LiveView.projitems*{97e52d0f-4afb-4f9d-8c2e-d9a601461452}*SharedItemsImports = 4
+ EndGlobalSection
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Ad-Hoc|Any CPU = Ad-Hoc|Any CPU
+ Ad-Hoc|ARM = Ad-Hoc|ARM
+ Ad-Hoc|iPhone = Ad-Hoc|iPhone
+ Ad-Hoc|iPhoneSimulator = Ad-Hoc|iPhoneSimulator
+ Ad-Hoc|x64 = Ad-Hoc|x64
+ Ad-Hoc|x86 = Ad-Hoc|x86
+ AppStore|Any CPU = AppStore|Any CPU
+ AppStore|ARM = AppStore|ARM
+ AppStore|iPhone = AppStore|iPhone
+ AppStore|iPhoneSimulator = AppStore|iPhoneSimulator
+ AppStore|x64 = AppStore|x64
+ AppStore|x86 = AppStore|x86
+ Debug|Any CPU = Debug|Any CPU
+ Debug|ARM = Debug|ARM
+ Debug|iPhone = Debug|iPhone
+ Debug|iPhoneSimulator = Debug|iPhoneSimulator
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release|Any CPU = Release|Any CPU
+ Release|ARM = Release|ARM
+ Release|iPhone = Release|iPhone
+ Release|iPhoneSimulator = Release|iPhoneSimulator
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Ad-Hoc|Any CPU.Deploy.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Ad-Hoc|ARM.Build.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Ad-Hoc|ARM.Deploy.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Ad-Hoc|iPhone.Deploy.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Ad-Hoc|x64.Build.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Ad-Hoc|x64.Deploy.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Ad-Hoc|x86.Build.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Ad-Hoc|x86.Deploy.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.AppStore|Any CPU.Build.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.AppStore|Any CPU.Deploy.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.AppStore|ARM.ActiveCfg = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.AppStore|ARM.Build.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.AppStore|ARM.Deploy.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.AppStore|iPhone.ActiveCfg = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.AppStore|iPhone.Build.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.AppStore|iPhone.Deploy.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.AppStore|iPhoneSimulator.Deploy.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.AppStore|x64.ActiveCfg = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.AppStore|x64.Build.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.AppStore|x64.Deploy.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.AppStore|x86.ActiveCfg = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.AppStore|x86.Build.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.AppStore|x86.Deploy.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Debug|ARM.Build.0 = Debug|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Debug|ARM.Deploy.0 = Debug|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Debug|iPhone.Deploy.0 = Debug|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Debug|x64.Build.0 = Debug|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Debug|x64.Deploy.0 = Debug|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Debug|x86.Build.0 = Debug|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Debug|x86.Deploy.0 = Debug|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Release|ARM.ActiveCfg = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Release|ARM.Build.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Release|ARM.Deploy.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Release|iPhone.Build.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Release|iPhone.Deploy.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Release|x64.ActiveCfg = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Release|x64.Build.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Release|x64.Deploy.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Release|x86.ActiveCfg = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Release|x86.Build.0 = Release|Any CPU
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}.Release|x86.Deploy.0 = Release|Any CPU
+ {97E52D0F-4AFB-4F9D-8C2E-D9A601461452}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|iPhoneSimulator
+ {97E52D0F-4AFB-4F9D-8C2E-D9A601461452}.Ad-Hoc|ARM.ActiveCfg = Ad-Hoc|iPhone
+ {97E52D0F-4AFB-4F9D-8C2E-D9A601461452}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone
+ {97E52D0F-4AFB-4F9D-8C2E-D9A601461452}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone
+ {97E52D0F-4AFB-4F9D-8C2E-D9A601461452}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator
+ {97E52D0F-4AFB-4F9D-8C2E-D9A601461452}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator
+ {97E52D0F-4AFB-4F9D-8C2E-D9A601461452}.Ad-Hoc|x64.ActiveCfg = Ad-Hoc|iPhone
+ {97E52D0F-4AFB-4F9D-8C2E-D9A601461452}.Ad-Hoc|x86.ActiveCfg = Ad-Hoc|iPhone
+ {97E52D0F-4AFB-4F9D-8C2E-D9A601461452}.AppStore|Any CPU.ActiveCfg = AppStore|iPhoneSimulator
+ {97E52D0F-4AFB-4F9D-8C2E-D9A601461452}.AppStore|ARM.ActiveCfg = AppStore|iPhone
+ {97E52D0F-4AFB-4F9D-8C2E-D9A601461452}.AppStore|iPhone.ActiveCfg = AppStore|iPhone
+ {97E52D0F-4AFB-4F9D-8C2E-D9A601461452}.AppStore|iPhone.Build.0 = AppStore|iPhone
+ {97E52D0F-4AFB-4F9D-8C2E-D9A601461452}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator
+ {97E52D0F-4AFB-4F9D-8C2E-D9A601461452}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator
+ {97E52D0F-4AFB-4F9D-8C2E-D9A601461452}.AppStore|x64.ActiveCfg = AppStore|iPhone
+ {97E52D0F-4AFB-4F9D-8C2E-D9A601461452}.AppStore|x86.ActiveCfg = AppStore|iPhone
+ {97E52D0F-4AFB-4F9D-8C2E-D9A601461452}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator
+ {97E52D0F-4AFB-4F9D-8C2E-D9A601461452}.Debug|ARM.ActiveCfg = Debug|iPhone
+ {97E52D0F-4AFB-4F9D-8C2E-D9A601461452}.Debug|iPhone.ActiveCfg = Debug|iPhone
+ {97E52D0F-4AFB-4F9D-8C2E-D9A601461452}.Debug|iPhone.Build.0 = Debug|iPhone
+ {97E52D0F-4AFB-4F9D-8C2E-D9A601461452}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
+ {97E52D0F-4AFB-4F9D-8C2E-D9A601461452}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
+ {97E52D0F-4AFB-4F9D-8C2E-D9A601461452}.Debug|x64.ActiveCfg = Debug|iPhone
+ {97E52D0F-4AFB-4F9D-8C2E-D9A601461452}.Debug|x86.ActiveCfg = Debug|iPhone
+ {97E52D0F-4AFB-4F9D-8C2E-D9A601461452}.Release|Any CPU.ActiveCfg = Release|iPhoneSimulator
+ {97E52D0F-4AFB-4F9D-8C2E-D9A601461452}.Release|ARM.ActiveCfg = Release|iPhone
+ {97E52D0F-4AFB-4F9D-8C2E-D9A601461452}.Release|iPhone.ActiveCfg = Release|iPhone
+ {97E52D0F-4AFB-4F9D-8C2E-D9A601461452}.Release|iPhone.Build.0 = Release|iPhone
+ {97E52D0F-4AFB-4F9D-8C2E-D9A601461452}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
+ {97E52D0F-4AFB-4F9D-8C2E-D9A601461452}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
+ {97E52D0F-4AFB-4F9D-8C2E-D9A601461452}.Release|x64.ActiveCfg = Release|iPhone
+ {97E52D0F-4AFB-4F9D-8C2E-D9A601461452}.Release|x86.ActiveCfg = Release|iPhone
+ {97E52D0F-4AFB-4F9D-8C2E-D9A601461452}.Debug|Any CPU.Build.0 = Debug|iPhoneSimulator
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {41D9D204-BC1A-4F4F-B8C9-445CFDB014A7}
+ EndGlobalSection
+EndGlobal
diff --git a/LivePlayer/LiveView/LiveView/LiveView.Android/Assets/AboutAssets.txt b/LivePlayer/LiveView/LiveView/LiveView.Android/Assets/AboutAssets.txt
new file mode 100644
index 000000000..7badd3f1f
--- /dev/null
+++ b/LivePlayer/LiveView/LiveView/LiveView.Android/Assets/AboutAssets.txt
@@ -0,0 +1,19 @@
+Any raw assets you want to be deployed with your application can be placed in
+this directory (and child directories) and given a Build Action of "AndroidAsset".
+
+These files will be deployed with you package and will be accessible using Android's
+AssetManager, like this:
+
+public class ReadAsset : Activity
+{
+ protected override void OnCreate (Bundle bundle)
+ {
+ base.OnCreate (bundle);
+
+ InputStream input = Assets.Open ("my_asset.txt");
+ }
+}
+
+Additionally, some Android functions will automatically load asset files:
+
+Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf");
diff --git a/LivePlayer/LiveView/LiveView/LiveView.Android/LiveView.Android.csproj b/LivePlayer/LiveView/LiveView/LiveView.Android/LiveView.Android.csproj
new file mode 100644
index 000000000..5b49877fb
--- /dev/null
+++ b/LivePlayer/LiveView/LiveView/LiveView.Android/LiveView.Android.csproj
@@ -0,0 +1,180 @@
+
+
+
+
+ Debug
+ AnyCPU
+ 8.0.30703
+ 2.0
+ {32097E2E-CAC1-48F5-A403-12764C817CD1}
+ {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ Library
+ Properties
+ LiveView.Droid
+ LiveView.Android
+ 512
+ true
+ Resources\Resource.Designer.cs
+ Off
+ Properties\AndroidManifest.xml
+ true
+ v8.0
+
+
+
+
+
+
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+ True
+ None
+ armeabi-v7a,x86
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+ False
+ SdkOnly
+
+
+
+ ..\..\packages\Xamarin.Forms.2.4.0.280\lib\MonoAndroid10\FormsViewGroup.dll
+
+
+
+
+
+
+
+
+ ..\..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Animated.Vector.Drawable.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.Annotations.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Annotations.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.Compat.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Compat.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.Core.UI.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Core.UI.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.Core.Utils.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Core.Utils.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.Design.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Design.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.Fragment.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Fragment.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.Media.Compat.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Media.Compat.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.v4.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v4.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.v7.AppCompat.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v7.AppCompat.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.v7.CardView.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v7.CardView.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.v7.MediaRouter.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v7.MediaRouter.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.v7.RecyclerView.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v7.RecyclerView.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.Vector.Drawable.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Vector.Drawable.dll
+
+
+ ..\..\packages\Xamarin.Forms.2.4.0.280\lib\MonoAndroid10\Xamarin.Forms.Core.dll
+
+
+ ..\..\packages\Xamarin.Forms.2.4.0.280\lib\MonoAndroid10\Xamarin.Forms.Platform.dll
+
+
+ ..\..\packages\Xamarin.Forms.2.4.0.280\lib\MonoAndroid10\Xamarin.Forms.Platform.Android.dll
+
+
+ ..\..\packages\Xamarin.Forms.2.4.0.280\lib\MonoAndroid10\Xamarin.Forms.Xaml.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/LiveView/LiveView/LiveView.Android/MainActivity.cs b/LivePlayer/LiveView/LiveView/LiveView.Android/MainActivity.cs
new file mode 100644
index 000000000..c2492c906
--- /dev/null
+++ b/LivePlayer/LiveView/LiveView/LiveView.Android/MainActivity.cs
@@ -0,0 +1,27 @@
+using System;
+
+using Android.App;
+using Android.Content.PM;
+using Android.Runtime;
+using Android.Views;
+using Android.Widget;
+using Android.OS;
+
+namespace LiveView.Droid
+{
+ [Activity (Label = "LiveView", Icon = "@drawable/icon", Theme="@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
+ public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
+ {
+ protected override void OnCreate (Bundle bundle)
+ {
+ TabLayoutResource = Resource.Layout.Tabbar;
+ ToolbarResource = Resource.Layout.Toolbar;
+
+ base.OnCreate (bundle);
+
+ global::Xamarin.Forms.Forms.Init (this, bundle);
+ LoadApplication (new LiveView.App ());
+ }
+ }
+}
+
diff --git a/LivePlayer/LiveView/LiveView/LiveView.Android/Properties/AndroidManifest.xml b/LivePlayer/LiveView/LiveView/LiveView.Android/Properties/AndroidManifest.xml
new file mode 100644
index 000000000..4641efe53
--- /dev/null
+++ b/LivePlayer/LiveView/LiveView/LiveView.Android/Properties/AndroidManifest.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/LivePlayer/LiveView/LiveView/LiveView.Android/Properties/AssemblyInfo.cs b/LivePlayer/LiveView/LiveView/LiveView.Android/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..40dff3660
--- /dev/null
+++ b/LivePlayer/LiveView/LiveView/LiveView.Android/Properties/AssemblyInfo.cs
@@ -0,0 +1,34 @@
+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("LiveView.Android")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("LiveView.Android")]
+[assembly: AssemblyCopyright("Copyright © 2014")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+[assembly: ComVisible(false)]
+
+// 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)]
diff --git a/LivePlayer/LiveView/LiveView/LiveView.Android/Resources/AboutResources.txt b/LivePlayer/LiveView/LiveView/LiveView.Android/Resources/AboutResources.txt
new file mode 100644
index 000000000..17ba653dd
--- /dev/null
+++ b/LivePlayer/LiveView/LiveView/LiveView.Android/Resources/AboutResources.txt
@@ -0,0 +1,50 @@
+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.xml),
+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-hdpi/
+ icon.png
+
+ drawable-ldpi/
+ icon.png
+
+ drawable-mdpi/
+ icon.png
+
+ layout/
+ main.xml
+
+ 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
+"Resource" that contains the tokens for each one of the resources included. For example,
+for the above Resources layout, this is what the Resource class would expose:
+
+public class Resource {
+ 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 Resource.layout.main
+to reference the layout/main.xml file, or Resource.strings.first_string to reference the first
+string in the dictionary file values/strings.xml.
diff --git a/LivePlayer/LiveView/LiveView/LiveView.Android/Resources/drawable-hdpi/icon.png b/LivePlayer/LiveView/LiveView/LiveView.Android/Resources/drawable-hdpi/icon.png
new file mode 100644
index 000000000..964f110ab
Binary files /dev/null and b/LivePlayer/LiveView/LiveView/LiveView.Android/Resources/drawable-hdpi/icon.png differ
diff --git a/LivePlayer/LiveView/LiveView/LiveView.Android/Resources/drawable-xhdpi/icon.png b/LivePlayer/LiveView/LiveView/LiveView.Android/Resources/drawable-xhdpi/icon.png
new file mode 100644
index 000000000..3c01e60ce
Binary files /dev/null and b/LivePlayer/LiveView/LiveView/LiveView.Android/Resources/drawable-xhdpi/icon.png differ
diff --git a/LivePlayer/LiveView/LiveView/LiveView.Android/Resources/drawable-xxhdpi/icon.png b/LivePlayer/LiveView/LiveView/LiveView.Android/Resources/drawable-xxhdpi/icon.png
new file mode 100644
index 000000000..0d8c1c57d
Binary files /dev/null and b/LivePlayer/LiveView/LiveView/LiveView.Android/Resources/drawable-xxhdpi/icon.png differ
diff --git a/LivePlayer/LiveView/LiveView/LiveView.Android/Resources/drawable/icon.png b/LivePlayer/LiveView/LiveView/LiveView.Android/Resources/drawable/icon.png
new file mode 100644
index 000000000..b0ba7150f
Binary files /dev/null and b/LivePlayer/LiveView/LiveView/LiveView.Android/Resources/drawable/icon.png differ
diff --git a/LivePlayer/LiveView/LiveView/LiveView.Android/Resources/layout/Tabbar.axml b/LivePlayer/LiveView/LiveView/LiveView.Android/Resources/layout/Tabbar.axml
new file mode 100644
index 000000000..c8c4a94f9
--- /dev/null
+++ b/LivePlayer/LiveView/LiveView/LiveView.Android/Resources/layout/Tabbar.axml
@@ -0,0 +1,11 @@
+
+
diff --git a/LivePlayer/LiveView/LiveView/LiveView.Android/Resources/layout/Toolbar.axml b/LivePlayer/LiveView/LiveView/LiveView.Android/Resources/layout/Toolbar.axml
new file mode 100644
index 000000000..85670a6c2
--- /dev/null
+++ b/LivePlayer/LiveView/LiveView/LiveView.Android/Resources/layout/Toolbar.axml
@@ -0,0 +1,9 @@
+
+
diff --git a/LivePlayer/LiveView/LiveView/LiveView.Android/Resources/values/styles.xml b/LivePlayer/LiveView/LiveView/LiveView.Android/Resources/values/styles.xml
new file mode 100644
index 000000000..e1d36e61e
--- /dev/null
+++ b/LivePlayer/LiveView/LiveView/LiveView.Android/Resources/values/styles.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
diff --git a/LivePlayer/LiveView/LiveView/LiveView.Android/packages.config b/LivePlayer/LiveView/LiveView/LiveView.Android/packages.config
new file mode 100644
index 000000000..cc9d994b2
--- /dev/null
+++ b/LivePlayer/LiveView/LiveView/LiveView.Android/packages.config
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/LiveView/LiveView/LiveView.iOS/AppDelegate.cs b/LivePlayer/LiveView/LiveView/LiveView.iOS/AppDelegate.cs
new file mode 100644
index 000000000..ddc6b53c8
--- /dev/null
+++ b/LivePlayer/LiveView/LiveView/LiveView.iOS/AppDelegate.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using Foundation;
+using UIKit;
+
+namespace LiveView.iOS
+{
+ // The UIApplicationDelegate for the application. This class is responsible for launching the
+ // User Interface of the application, as well as listening (and optionally responding) to
+ // application events from iOS.
+ [Register("AppDelegate")]
+ public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
+ {
+ //
+ // This method is invoked when the application has loaded and is ready to run. In this
+ // method you should instantiate the window, load the UI into it and then make the window
+ // visible.
+ //
+ // You have 17 seconds to return from this method, or iOS will terminate your application.
+ //
+ public override bool FinishedLaunching(UIApplication app, NSDictionary options)
+ {
+ global::Xamarin.Forms.Forms.Init ();
+ LoadApplication (new LiveView.App ());
+
+ return base.FinishedLaunching (app, options);
+ }
+ }
+}
diff --git a/LivePlayer/LiveView/LiveView/LiveView.iOS/Entitlements.plist b/LivePlayer/LiveView/LiveView/LiveView.iOS/Entitlements.plist
new file mode 100644
index 000000000..d39866528
--- /dev/null
+++ b/LivePlayer/LiveView/LiveView/LiveView.iOS/Entitlements.plist
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/LivePlayer/LiveView/LiveView/LiveView.iOS/Info.plist b/LivePlayer/LiveView/LiveView/LiveView.iOS/Info.plist
new file mode 100644
index 000000000..1c167a8b8
--- /dev/null
+++ b/LivePlayer/LiveView/LiveView/LiveView.iOS/Info.plist
@@ -0,0 +1,52 @@
+
+
+
+
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ MinimumOSVersion
+ 8.0
+ CFBundleDisplayName
+ LiveView
+ CFBundleIdentifier
+ com.yourcompany.LiveView
+ CFBundleVersion
+ 1.0
+ CFBundleIconFiles
+
+ Icon-60@2x.png
+ Icon-60@3x.png
+ Icon-76.png
+ Icon-76@2x.png
+ Default.png
+ Default@2x.png
+ Default-568h@2x.png
+ Default-Portrait.png
+ Default-Portrait@2x.png
+ Icon-Small-40.png
+ Icon-Small-40@2x.png
+ Icon-Small-40@3x.png
+ Icon-Small.png
+ Icon-Small@2x.png
+ Icon-Small@3x.png
+
+ UILaunchStoryboardName
+ LaunchScreen.storyboard
+
+
diff --git a/LivePlayer/LiveView/LiveView/LiveView.iOS/LiveView.iOS.csproj b/LivePlayer/LiveView/LiveView/LiveView.iOS/LiveView.iOS.csproj
new file mode 100644
index 000000000..319622883
--- /dev/null
+++ b/LivePlayer/LiveView/LiveView/LiveView.iOS/LiveView.iOS.csproj
@@ -0,0 +1,152 @@
+
+
+
+
+ Debug
+ iPhoneSimulator
+ 8.0.30703
+ 2.0
+ {97E52D0F-4AFB-4F9D-8C2E-D9A601461452}
+ {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ Exe
+ LiveView.iOS
+ Resources
+ LiveView.iOS
+
+
+
+ true
+ full
+ false
+ bin\iPhoneSimulator\Debug
+ DEBUG
+ prompt
+ 4
+ false
+ i386, x86_64
+ None
+ true
+ NSUrlSessionHandler
+
+
+ none
+ true
+ bin\iPhoneSimulator\Release
+ prompt
+ 4
+ None
+ i386, x86_64
+ false
+ NSUrlSessionHandler
+
+
+ true
+ full
+ false
+ bin\iPhone\Debug
+ DEBUG
+ prompt
+ 4
+ false
+ ARMv7, ARM64
+ iPhone Developer
+ true
+ Entitlements.plist
+ NSUrlSessionHandler
+
+
+ none
+ true
+ bin\iPhone\Release
+ prompt
+ 4
+ ARMv7, ARM64
+ false
+ iPhone Developer
+ Entitlements.plist
+ NSUrlSessionHandler
+
+
+ none
+ True
+ bin\iPhone\Ad-Hoc
+ prompt
+ 4
+ False
+ ARMv7, ARM64
+ True
+ Automatic:AdHoc
+ iPhone Distribution
+ Entitlements.plist
+ NSUrlSessionHandler
+
+
+ none
+ True
+ bin\iPhone\AppStore
+ prompt
+ 4
+ False
+ ARMv7, ARM64
+ Automatic:AppStore
+ iPhone Distribution
+ Entitlements.plist
+ NSUrlSessionHandler
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ..\..\packages\Xamarin.Forms.2.4.0.280\lib\Xamarin.iOS10\Xamarin.Forms.Core.dll
+
+
+ ..\..\packages\Xamarin.Forms.2.4.0.280\lib\Xamarin.iOS10\Xamarin.Forms.Platform.dll
+
+
+ ..\..\packages\Xamarin.Forms.2.4.0.280\lib\Xamarin.iOS10\Xamarin.Forms.Platform.iOS.dll
+
+
+ ..\..\packages\Xamarin.Forms.2.4.0.280\lib\Xamarin.iOS10\Xamarin.Forms.Xaml.dll
+
+
+
+
+
+
+
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/LiveView/LiveView/LiveView.iOS/Main.cs b/LivePlayer/LiveView/LiveView/LiveView.iOS/Main.cs
new file mode 100644
index 000000000..ef296ffae
--- /dev/null
+++ b/LivePlayer/LiveView/LiveView/LiveView.iOS/Main.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using Foundation;
+using UIKit;
+
+namespace LiveView.iOS
+{
+ public class Application
+ {
+ // This is the main entry point of the application.
+ static void Main(string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main(args, null, "AppDelegate");
+ }
+ }
+}
diff --git a/LivePlayer/LiveView/LiveView/LiveView.iOS/Properties/AssemblyInfo.cs b/LivePlayer/LiveView/LiveView/LiveView.iOS/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..0f2bb194d
--- /dev/null
+++ b/LivePlayer/LiveView/LiveView/LiveView.iOS/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 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("LiveView.iOS")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("LiveView.iOS")]
+[assembly: AssemblyCopyright("Copyright © 2014")]
+[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("72bdc44f-c588-44f3-b6df-9aace7daafdd")]
+
+// 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")]
diff --git a/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Default-568h@2x.png b/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Default-568h@2x.png
new file mode 100644
index 000000000..26c6461e5
Binary files /dev/null and b/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Default-568h@2x.png differ
diff --git a/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Default-Portrait.png b/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Default-Portrait.png
new file mode 100644
index 000000000..5d0d1ab4c
Binary files /dev/null and b/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Default-Portrait.png differ
diff --git a/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Default-Portrait@2x.png b/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Default-Portrait@2x.png
new file mode 100644
index 000000000..0ee2688e8
Binary files /dev/null and b/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Default-Portrait@2x.png differ
diff --git a/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Default.png b/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Default.png
new file mode 100644
index 000000000..b74643c0a
Binary files /dev/null and b/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Default.png differ
diff --git a/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Default@2x.png b/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Default@2x.png
new file mode 100644
index 000000000..dbd6bd3e8
Binary files /dev/null and b/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Default@2x.png differ
diff --git a/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Icon-60@2x.png b/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Icon-60@2x.png
new file mode 100644
index 000000000..4b03c4270
Binary files /dev/null and b/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Icon-60@2x.png differ
diff --git a/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Icon-60@3x.png b/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Icon-60@3x.png
new file mode 100644
index 000000000..b03ca1bbc
Binary files /dev/null and b/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Icon-60@3x.png differ
diff --git a/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Icon-76.png b/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Icon-76.png
new file mode 100644
index 000000000..587982e2a
Binary files /dev/null and b/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Icon-76.png differ
diff --git a/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Icon-76@2x.png b/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Icon-76@2x.png
new file mode 100644
index 000000000..cd4e2c8fe
Binary files /dev/null and b/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Icon-76@2x.png differ
diff --git a/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Icon-Small-40.png b/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Icon-Small-40.png
new file mode 100644
index 000000000..6acff9441
Binary files /dev/null and b/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Icon-Small-40.png differ
diff --git a/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Icon-Small-40@2x.png b/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Icon-Small-40@2x.png
new file mode 100644
index 000000000..b833aac26
Binary files /dev/null and b/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Icon-Small-40@2x.png differ
diff --git a/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Icon-Small-40@3x.png b/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Icon-Small-40@3x.png
new file mode 100644
index 000000000..ab8654e49
Binary files /dev/null and b/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Icon-Small-40@3x.png differ
diff --git a/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Icon-Small.png b/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Icon-Small.png
new file mode 100644
index 000000000..33db7e714
Binary files /dev/null and b/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Icon-Small.png differ
diff --git a/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Icon-Small@2x.png b/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Icon-Small@2x.png
new file mode 100644
index 000000000..bf45e2592
Binary files /dev/null and b/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Icon-Small@2x.png differ
diff --git a/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Icon-Small@3x.png b/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Icon-Small@3x.png
new file mode 100644
index 000000000..7ad3891b9
Binary files /dev/null and b/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/Icon-Small@3x.png differ
diff --git a/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/LaunchScreen.storyboard b/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/LaunchScreen.storyboard
new file mode 100644
index 000000000..44abebc91
--- /dev/null
+++ b/LivePlayer/LiveView/LiveView/LiveView.iOS/Resources/LaunchScreen.storyboard
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/LivePlayer/LiveView/LiveView/LiveView.iOS/iTunesArtwork b/LivePlayer/LiveView/LiveView/LiveView.iOS/iTunesArtwork
new file mode 100644
index 000000000..94c8ebd6b
Binary files /dev/null and b/LivePlayer/LiveView/LiveView/LiveView.iOS/iTunesArtwork differ
diff --git a/LivePlayer/LiveView/LiveView/LiveView.iOS/iTunesArtwork@2x b/LivePlayer/LiveView/LiveView/LiveView.iOS/iTunesArtwork@2x
new file mode 100644
index 000000000..fa2ebf72d
Binary files /dev/null and b/LivePlayer/LiveView/LiveView/LiveView.iOS/iTunesArtwork@2x differ
diff --git a/LivePlayer/LiveView/LiveView/LiveView.iOS/packages.config b/LivePlayer/LiveView/LiveView/LiveView.iOS/packages.config
new file mode 100644
index 000000000..4c76fbe6f
--- /dev/null
+++ b/LivePlayer/LiveView/LiveView/LiveView.iOS/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/LiveView/LiveView/LiveView/App.xaml b/LivePlayer/LiveView/LiveView/LiveView/App.xaml
new file mode 100644
index 000000000..a261c45d0
--- /dev/null
+++ b/LivePlayer/LiveView/LiveView/LiveView/App.xaml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/LiveView/LiveView/LiveView/App.xaml.cs b/LivePlayer/LiveView/LiveView/LiveView/App.xaml.cs
new file mode 100644
index 000000000..16a940fd4
--- /dev/null
+++ b/LivePlayer/LiveView/LiveView/LiveView/App.xaml.cs
@@ -0,0 +1,34 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using Xamarin.Forms;
+
+namespace LiveView
+{
+ public partial class App : Application
+ {
+ public App ()
+ {
+ InitializeComponent();
+
+ MainPage = new LiveView.MainPage();
+ }
+
+ protected override void OnStart ()
+ {
+ // Handle when your app starts
+ }
+
+ protected override void OnSleep ()
+ {
+ // Handle when your app sleeps
+ }
+
+ protected override void OnResume ()
+ {
+ // Handle when your app resumes
+ }
+ }
+}
diff --git a/LivePlayer/LiveView/LiveView/LiveView/LiveView.projitems b/LivePlayer/LiveView/LiveView/LiveView/LiveView.projitems
new file mode 100644
index 000000000..fd8559247
--- /dev/null
+++ b/LivePlayer/LiveView/LiveView/LiveView/LiveView.projitems
@@ -0,0 +1,29 @@
+
+
+
+ $(MSBuildAllProjects);$(MSBuildThisFileFullPath)
+ true
+ 1ebc99a4-ec72-4b4c-bb35-3d6bed942454
+
+
+ LiveView
+
+
+
+ App.xaml
+
+
+ MainPage.xaml
+
+
+
+
+ Designer
+ MSBuild:UpdateDesignTimeXaml
+
+
+ Designer
+ MSBuild:UpdateDesignTimeXaml
+
+
+
diff --git a/LivePlayer/LiveView/LiveView/LiveView/LiveView.shproj b/LivePlayer/LiveView/LiveView/LiveView/LiveView.shproj
new file mode 100644
index 000000000..27bbf74d1
--- /dev/null
+++ b/LivePlayer/LiveView/LiveView/LiveView/LiveView.shproj
@@ -0,0 +1,12 @@
+
+
+
+ 1ebc99a4-ec72-4b4c-bb35-3d6bed942454
+
+
+
+
+
+
+
+
diff --git a/LivePlayer/LiveView/LiveView/LiveView/MainPage.xaml b/LivePlayer/LiveView/LiveView/LiveView/MainPage.xaml
new file mode 100644
index 000000000..d9df45977
--- /dev/null
+++ b/LivePlayer/LiveView/LiveView/LiveView/MainPage.xaml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/LiveView/LiveView/LiveView/MainPage.xaml.cs b/LivePlayer/LiveView/LiveView/LiveView/MainPage.xaml.cs
new file mode 100644
index 000000000..cdfff838a
--- /dev/null
+++ b/LivePlayer/LiveView/LiveView/LiveView/MainPage.xaml.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Xamarin.Forms;
+
+namespace LiveView
+{
+ public partial class MainPage : ContentPage
+ {
+
+ public MainPage()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/LivePlayer/LiveView/Metadata.xml b/LivePlayer/LiveView/Metadata.xml
new file mode 100644
index 000000000..33d7ffa50
--- /dev/null
+++ b/LivePlayer/LiveView/Metadata.xml
@@ -0,0 +1,11 @@
+
+
+ CF71E6BE-4206-45E2-89A7-668287A3FE2D
+ false
+ beginner
+ liveplayer
+ Android, iOS
+ Indie
+ true
+ Basic sample to allow play with Live Player Live View.
+
diff --git a/LivePlayer/LiveView/Screenshots/IMG_0012.PNG b/LivePlayer/LiveView/Screenshots/IMG_0012.PNG
new file mode 100644
index 000000000..92c891784
Binary files /dev/null and b/LivePlayer/LiveView/Screenshots/IMG_0012.PNG differ
diff --git a/LivePlayer/LiveView/readme.md b/LivePlayer/LiveView/readme.md
new file mode 100644
index 000000000..b50925588
--- /dev/null
+++ b/LivePlayer/LiveView/readme.md
@@ -0,0 +1,4 @@
+Live View
+==========
+
+This is a basic sample that will allow you to add and remove Xaml to explore the Xamarin Live Player's Live View capabilities.
diff --git a/LivePlayer/RpnCalculator/Droid/Assets/AboutAssets.txt b/LivePlayer/RpnCalculator/Droid/Assets/AboutAssets.txt
new file mode 100644
index 000000000..a9b0638eb
--- /dev/null
+++ b/LivePlayer/RpnCalculator/Droid/Assets/AboutAssets.txt
@@ -0,0 +1,19 @@
+Any raw assets you want to be deployed with your application can be placed in
+this directory (and child directories) and given a Build Action of "AndroidAsset".
+
+These files will be deployed with your package and will be accessible using Android's
+AssetManager, like this:
+
+public class ReadAsset : Activity
+{
+ protected override void OnCreate (Bundle bundle)
+ {
+ base.OnCreate (bundle);
+
+ InputStream input = Assets.Open ("my_asset.txt");
+ }
+}
+
+Additionally, some Android functions will automatically load asset files:
+
+Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf");
diff --git a/LivePlayer/RpnCalculator/Droid/MainActivity.cs b/LivePlayer/RpnCalculator/Droid/MainActivity.cs
new file mode 100644
index 000000000..818b6b621
--- /dev/null
+++ b/LivePlayer/RpnCalculator/Droid/MainActivity.cs
@@ -0,0 +1,28 @@
+using System;
+
+using Android.App;
+using Android.Content;
+using Android.Content.PM;
+using Android.Runtime;
+using Android.Views;
+using Android.Widget;
+using Android.OS;
+
+namespace RpnCalculator.Droid
+{
+ [Activity(Label = "RpnCalculator.Droid", Icon = "@drawable/icon", Theme = "@style/MyTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
+ public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
+ {
+ protected override void OnCreate(Bundle bundle)
+ {
+ TabLayoutResource = Resource.Layout.Tabbar;
+ ToolbarResource = Resource.Layout.Toolbar;
+
+ base.OnCreate(bundle);
+
+ global::Xamarin.Forms.Forms.Init(this, bundle);
+
+ LoadApplication(new App());
+ }
+ }
+}
diff --git a/LivePlayer/RpnCalculator/Droid/Properties/AndroidManifest.xml b/LivePlayer/RpnCalculator/Droid/Properties/AndroidManifest.xml
new file mode 100644
index 000000000..164577303
--- /dev/null
+++ b/LivePlayer/RpnCalculator/Droid/Properties/AndroidManifest.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/RpnCalculator/Droid/Properties/AssemblyInfo.cs b/LivePlayer/RpnCalculator/Droid/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..8b948a039
--- /dev/null
+++ b/LivePlayer/RpnCalculator/Droid/Properties/AssemblyInfo.cs
@@ -0,0 +1,27 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using Android.App;
+
+// Information about this assembly is defined by the following attributes.
+// Change them to the values specific to your project.
+
+[assembly: AssemblyTitle("RpnCalculator.Droid")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("${AuthorCopyright}")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
+// The form "{Major}.{Minor}.*" will automatically update the build and revision,
+// and "{Major}.{Minor}.{Build}.*" will update just the revision.
+
+[assembly: AssemblyVersion("1.0.0")]
+
+// The following attributes are used to specify the signing key for the assembly,
+// if desired. See the Mono documentation for more information about signing.
+
+//[assembly: AssemblyDelaySign(false)]
+//[assembly: AssemblyKeyFile("")]
diff --git a/LivePlayer/RpnCalculator/Droid/Resources/AboutResources.txt b/LivePlayer/RpnCalculator/Droid/Resources/AboutResources.txt
new file mode 100644
index 000000000..10f52d460
--- /dev/null
+++ b/LivePlayer/RpnCalculator/Droid/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.
diff --git a/LivePlayer/RpnCalculator/Droid/Resources/Resource.designer.cs b/LivePlayer/RpnCalculator/Droid/Resources/Resource.designer.cs
new file mode 100644
index 000000000..b88aa0bc4
--- /dev/null
+++ b/LivePlayer/RpnCalculator/Droid/Resources/Resource.designer.cs
@@ -0,0 +1,5936 @@
+#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("RpnCalculator.Droid.Resource", IsApplication=true)]
+
+namespace RpnCalculator.Droid
+{
+
+
+ [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()
+ {
+ global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionBarSize = global::RpnCalculator.Droid.Resource.Attribute.actionBarSize;
+ }
+
+ public partial class Animation
+ {
+
+ // aapt resource value: 0x7f040000
+ public const int abc_fade_in = 2130968576;
+
+ // aapt resource value: 0x7f040001
+ public const int abc_fade_out = 2130968577;
+
+ // aapt resource value: 0x7f040002
+ public const int abc_grow_fade_in_from_bottom = 2130968578;
+
+ // aapt resource value: 0x7f040003
+ public const int abc_popup_enter = 2130968579;
+
+ // aapt resource value: 0x7f040004
+ public const int abc_popup_exit = 2130968580;
+
+ // aapt resource value: 0x7f040005
+ public const int abc_shrink_fade_out_from_bottom = 2130968581;
+
+ // aapt resource value: 0x7f040006
+ public const int abc_slide_in_bottom = 2130968582;
+
+ // aapt resource value: 0x7f040007
+ public const int abc_slide_in_top = 2130968583;
+
+ // aapt resource value: 0x7f040008
+ public const int abc_slide_out_bottom = 2130968584;
+
+ // aapt resource value: 0x7f040009
+ public const int abc_slide_out_top = 2130968585;
+
+ // aapt resource value: 0x7f04000a
+ public const int design_bottom_sheet_slide_in = 2130968586;
+
+ // aapt resource value: 0x7f04000b
+ public const int design_bottom_sheet_slide_out = 2130968587;
+
+ // aapt resource value: 0x7f04000c
+ public const int design_fab_in = 2130968588;
+
+ // aapt resource value: 0x7f04000d
+ public const int design_fab_out = 2130968589;
+
+ // aapt resource value: 0x7f04000e
+ public const int design_snackbar_in = 2130968590;
+
+ // aapt resource value: 0x7f04000f
+ public const int design_snackbar_out = 2130968591;
+
+ static Animation()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Animation()
+ {
+ }
+ }
+
+ public partial class Attribute
+ {
+
+ // aapt resource value: 0x7f010004
+ public const int MediaRouteControllerWindowBackground = 2130771972;
+
+ // aapt resource value: 0x7f010061
+ public const int actionBarDivider = 2130772065;
+
+ // aapt resource value: 0x7f010062
+ public const int actionBarItemBackground = 2130772066;
+
+ // aapt resource value: 0x7f01005b
+ public const int actionBarPopupTheme = 2130772059;
+
+ // aapt resource value: 0x7f010060
+ public const int actionBarSize = 2130772064;
+
+ // aapt resource value: 0x7f01005d
+ public const int actionBarSplitStyle = 2130772061;
+
+ // aapt resource value: 0x7f01005c
+ public const int actionBarStyle = 2130772060;
+
+ // aapt resource value: 0x7f010057
+ public const int actionBarTabBarStyle = 2130772055;
+
+ // aapt resource value: 0x7f010056
+ public const int actionBarTabStyle = 2130772054;
+
+ // aapt resource value: 0x7f010058
+ public const int actionBarTabTextStyle = 2130772056;
+
+ // aapt resource value: 0x7f01005e
+ public const int actionBarTheme = 2130772062;
+
+ // aapt resource value: 0x7f01005f
+ public const int actionBarWidgetTheme = 2130772063;
+
+ // aapt resource value: 0x7f01007b
+ public const int actionButtonStyle = 2130772091;
+
+ // aapt resource value: 0x7f010077
+ public const int actionDropDownStyle = 2130772087;
+
+ // aapt resource value: 0x7f0100c9
+ public const int actionLayout = 2130772169;
+
+ // aapt resource value: 0x7f010063
+ public const int actionMenuTextAppearance = 2130772067;
+
+ // aapt resource value: 0x7f010064
+ public const int actionMenuTextColor = 2130772068;
+
+ // aapt resource value: 0x7f010067
+ public const int actionModeBackground = 2130772071;
+
+ // aapt resource value: 0x7f010066
+ public const int actionModeCloseButtonStyle = 2130772070;
+
+ // aapt resource value: 0x7f010069
+ public const int actionModeCloseDrawable = 2130772073;
+
+ // aapt resource value: 0x7f01006b
+ public const int actionModeCopyDrawable = 2130772075;
+
+ // aapt resource value: 0x7f01006a
+ public const int actionModeCutDrawable = 2130772074;
+
+ // aapt resource value: 0x7f01006f
+ public const int actionModeFindDrawable = 2130772079;
+
+ // aapt resource value: 0x7f01006c
+ public const int actionModePasteDrawable = 2130772076;
+
+ // aapt resource value: 0x7f010071
+ public const int actionModePopupWindowStyle = 2130772081;
+
+ // aapt resource value: 0x7f01006d
+ public const int actionModeSelectAllDrawable = 2130772077;
+
+ // aapt resource value: 0x7f01006e
+ public const int actionModeShareDrawable = 2130772078;
+
+ // aapt resource value: 0x7f010068
+ public const int actionModeSplitBackground = 2130772072;
+
+ // aapt resource value: 0x7f010065
+ public const int actionModeStyle = 2130772069;
+
+ // aapt resource value: 0x7f010070
+ public const int actionModeWebSearchDrawable = 2130772080;
+
+ // aapt resource value: 0x7f010059
+ public const int actionOverflowButtonStyle = 2130772057;
+
+ // aapt resource value: 0x7f01005a
+ public const int actionOverflowMenuStyle = 2130772058;
+
+ // aapt resource value: 0x7f0100cb
+ public const int actionProviderClass = 2130772171;
+
+ // aapt resource value: 0x7f0100ca
+ public const int actionViewClass = 2130772170;
+
+ // aapt resource value: 0x7f010083
+ public const int activityChooserViewStyle = 2130772099;
+
+ // aapt resource value: 0x7f0100a6
+ public const int alertDialogButtonGroupStyle = 2130772134;
+
+ // aapt resource value: 0x7f0100a7
+ public const int alertDialogCenterButtons = 2130772135;
+
+ // aapt resource value: 0x7f0100a5
+ public const int alertDialogStyle = 2130772133;
+
+ // aapt resource value: 0x7f0100a8
+ public const int alertDialogTheme = 2130772136;
+
+ // aapt resource value: 0x7f0100ba
+ public const int allowStacking = 2130772154;
+
+ // aapt resource value: 0x7f0100c1
+ public const int arrowHeadLength = 2130772161;
+
+ // aapt resource value: 0x7f0100c2
+ public const int arrowShaftLength = 2130772162;
+
+ // aapt resource value: 0x7f0100ad
+ public const int autoCompleteTextViewStyle = 2130772141;
+
+ // aapt resource value: 0x7f010032
+ public const int background = 2130772018;
+
+ // aapt resource value: 0x7f010034
+ public const int backgroundSplit = 2130772020;
+
+ // aapt resource value: 0x7f010033
+ public const int backgroundStacked = 2130772019;
+
+ // aapt resource value: 0x7f0100f5
+ public const int backgroundTint = 2130772213;
+
+ // aapt resource value: 0x7f0100f6
+ public const int backgroundTintMode = 2130772214;
+
+ // aapt resource value: 0x7f0100c3
+ public const int barLength = 2130772163;
+
+ // aapt resource value: 0x7f0100fb
+ public const int behavior_hideable = 2130772219;
+
+ // aapt resource value: 0x7f010121
+ public const int behavior_overlapTop = 2130772257;
+
+ // aapt resource value: 0x7f0100fa
+ public const int behavior_peekHeight = 2130772218;
+
+ // aapt resource value: 0x7f010117
+ public const int borderWidth = 2130772247;
+
+ // aapt resource value: 0x7f010080
+ public const int borderlessButtonStyle = 2130772096;
+
+ // aapt resource value: 0x7f010111
+ public const int bottomSheetDialogTheme = 2130772241;
+
+ // aapt resource value: 0x7f010112
+ public const int bottomSheetStyle = 2130772242;
+
+ // aapt resource value: 0x7f01007d
+ public const int buttonBarButtonStyle = 2130772093;
+
+ // aapt resource value: 0x7f0100ab
+ public const int buttonBarNegativeButtonStyle = 2130772139;
+
+ // aapt resource value: 0x7f0100ac
+ public const int buttonBarNeutralButtonStyle = 2130772140;
+
+ // aapt resource value: 0x7f0100aa
+ public const int buttonBarPositiveButtonStyle = 2130772138;
+
+ // aapt resource value: 0x7f01007c
+ public const int buttonBarStyle = 2130772092;
+
+ // aapt resource value: 0x7f010045
+ public const int buttonPanelSideLayout = 2130772037;
+
+ // aapt resource value: 0x7f0100ae
+ public const int buttonStyle = 2130772142;
+
+ // aapt resource value: 0x7f0100af
+ public const int buttonStyleSmall = 2130772143;
+
+ // aapt resource value: 0x7f0100bb
+ public const int buttonTint = 2130772155;
+
+ // aapt resource value: 0x7f0100bc
+ public const int buttonTintMode = 2130772156;
+
+ // aapt resource value: 0x7f01001b
+ public const int cardBackgroundColor = 2130771995;
+
+ // aapt resource value: 0x7f01001c
+ public const int cardCornerRadius = 2130771996;
+
+ // aapt resource value: 0x7f01001d
+ public const int cardElevation = 2130771997;
+
+ // aapt resource value: 0x7f01001e
+ public const int cardMaxElevation = 2130771998;
+
+ // aapt resource value: 0x7f010020
+ public const int cardPreventCornerOverlap = 2130772000;
+
+ // aapt resource value: 0x7f01001f
+ public const int cardUseCompatPadding = 2130771999;
+
+ // aapt resource value: 0x7f0100b0
+ public const int checkboxStyle = 2130772144;
+
+ // aapt resource value: 0x7f0100b1
+ public const int checkedTextViewStyle = 2130772145;
+
+ // aapt resource value: 0x7f0100d3
+ public const int closeIcon = 2130772179;
+
+ // aapt resource value: 0x7f010042
+ public const int closeItemLayout = 2130772034;
+
+ // aapt resource value: 0x7f0100ec
+ public const int collapseContentDescription = 2130772204;
+
+ // aapt resource value: 0x7f0100eb
+ public const int collapseIcon = 2130772203;
+
+ // aapt resource value: 0x7f010108
+ public const int collapsedTitleGravity = 2130772232;
+
+ // aapt resource value: 0x7f010104
+ public const int collapsedTitleTextAppearance = 2130772228;
+
+ // aapt resource value: 0x7f0100bd
+ public const int color = 2130772157;
+
+ // aapt resource value: 0x7f01009e
+ public const int colorAccent = 2130772126;
+
+ // aapt resource value: 0x7f0100a2
+ public const int colorButtonNormal = 2130772130;
+
+ // aapt resource value: 0x7f0100a0
+ public const int colorControlActivated = 2130772128;
+
+ // aapt resource value: 0x7f0100a1
+ public const int colorControlHighlight = 2130772129;
+
+ // aapt resource value: 0x7f01009f
+ public const int colorControlNormal = 2130772127;
+
+ // aapt resource value: 0x7f01009c
+ public const int colorPrimary = 2130772124;
+
+ // aapt resource value: 0x7f01009d
+ public const int colorPrimaryDark = 2130772125;
+
+ // aapt resource value: 0x7f0100a3
+ public const int colorSwitchThumbNormal = 2130772131;
+
+ // aapt resource value: 0x7f0100d8
+ public const int commitIcon = 2130772184;
+
+ // aapt resource value: 0x7f01003d
+ public const int contentInsetEnd = 2130772029;
+
+ // aapt resource value: 0x7f01003e
+ public const int contentInsetLeft = 2130772030;
+
+ // aapt resource value: 0x7f01003f
+ public const int contentInsetRight = 2130772031;
+
+ // aapt resource value: 0x7f01003c
+ public const int contentInsetStart = 2130772028;
+
+ // aapt resource value: 0x7f010021
+ public const int contentPadding = 2130772001;
+
+ // aapt resource value: 0x7f010025
+ public const int contentPaddingBottom = 2130772005;
+
+ // aapt resource value: 0x7f010022
+ public const int contentPaddingLeft = 2130772002;
+
+ // aapt resource value: 0x7f010023
+ public const int contentPaddingRight = 2130772003;
+
+ // aapt resource value: 0x7f010024
+ public const int contentPaddingTop = 2130772004;
+
+ // aapt resource value: 0x7f010105
+ public const int contentScrim = 2130772229;
+
+ // aapt resource value: 0x7f0100a4
+ public const int controlBackground = 2130772132;
+
+ // aapt resource value: 0x7f010137
+ public const int counterEnabled = 2130772279;
+
+ // aapt resource value: 0x7f010138
+ public const int counterMaxLength = 2130772280;
+
+ // aapt resource value: 0x7f01013a
+ public const int counterOverflowTextAppearance = 2130772282;
+
+ // aapt resource value: 0x7f010139
+ public const int counterTextAppearance = 2130772281;
+
+ // aapt resource value: 0x7f010035
+ public const int customNavigationLayout = 2130772021;
+
+ // aapt resource value: 0x7f0100d2
+ public const int defaultQueryHint = 2130772178;
+
+ // aapt resource value: 0x7f010075
+ public const int dialogPreferredPadding = 2130772085;
+
+ // aapt resource value: 0x7f010074
+ public const int dialogTheme = 2130772084;
+
+ // aapt resource value: 0x7f01002b
+ public const int displayOptions = 2130772011;
+
+ // aapt resource value: 0x7f010031
+ public const int divider = 2130772017;
+
+ // aapt resource value: 0x7f010082
+ public const int dividerHorizontal = 2130772098;
+
+ // aapt resource value: 0x7f0100c7
+ public const int dividerPadding = 2130772167;
+
+ // aapt resource value: 0x7f010081
+ public const int dividerVertical = 2130772097;
+
+ // aapt resource value: 0x7f0100bf
+ public const int drawableSize = 2130772159;
+
+ // aapt resource value: 0x7f010026
+ public const int drawerArrowStyle = 2130772006;
+
+ // aapt resource value: 0x7f010094
+ public const int dropDownListViewStyle = 2130772116;
+
+ // aapt resource value: 0x7f010078
+ public const int dropdownListPreferredItemHeight = 2130772088;
+
+ // aapt resource value: 0x7f010089
+ public const int editTextBackground = 2130772105;
+
+ // aapt resource value: 0x7f010088
+ public const int editTextColor = 2130772104;
+
+ // aapt resource value: 0x7f0100b2
+ public const int editTextStyle = 2130772146;
+
+ // aapt resource value: 0x7f010040
+ public const int elevation = 2130772032;
+
+ // aapt resource value: 0x7f010135
+ public const int errorEnabled = 2130772277;
+
+ // aapt resource value: 0x7f010136
+ public const int errorTextAppearance = 2130772278;
+
+ // aapt resource value: 0x7f010044
+ public const int expandActivityOverflowButtonDrawable = 2130772036;
+
+ // aapt resource value: 0x7f0100f7
+ public const int expanded = 2130772215;
+
+ // aapt resource value: 0x7f010109
+ public const int expandedTitleGravity = 2130772233;
+
+ // aapt resource value: 0x7f0100fe
+ public const int expandedTitleMargin = 2130772222;
+
+ // aapt resource value: 0x7f010102
+ public const int expandedTitleMarginBottom = 2130772226;
+
+ // aapt resource value: 0x7f010101
+ public const int expandedTitleMarginEnd = 2130772225;
+
+ // aapt resource value: 0x7f0100ff
+ public const int expandedTitleMarginStart = 2130772223;
+
+ // aapt resource value: 0x7f010100
+ public const int expandedTitleMarginTop = 2130772224;
+
+ // aapt resource value: 0x7f010103
+ public const int expandedTitleTextAppearance = 2130772227;
+
+ // aapt resource value: 0x7f01001a
+ public const int externalRouteEnabledDrawable = 2130771994;
+
+ // aapt resource value: 0x7f010115
+ public const int fabSize = 2130772245;
+
+ // aapt resource value: 0x7f010119
+ public const int foregroundInsidePadding = 2130772249;
+
+ // aapt resource value: 0x7f0100c0
+ public const int gapBetweenBars = 2130772160;
+
+ // aapt resource value: 0x7f0100d4
+ public const int goIcon = 2130772180;
+
+ // aapt resource value: 0x7f01011f
+ public const int headerLayout = 2130772255;
+
+ // aapt resource value: 0x7f010027
+ public const int height = 2130772007;
+
+ // aapt resource value: 0x7f01003b
+ public const int hideOnContentScroll = 2130772027;
+
+ // aapt resource value: 0x7f01013b
+ public const int hintAnimationEnabled = 2130772283;
+
+ // aapt resource value: 0x7f010134
+ public const int hintEnabled = 2130772276;
+
+ // aapt resource value: 0x7f010133
+ public const int hintTextAppearance = 2130772275;
+
+ // aapt resource value: 0x7f01007a
+ public const int homeAsUpIndicator = 2130772090;
+
+ // aapt resource value: 0x7f010036
+ public const int homeLayout = 2130772022;
+
+ // aapt resource value: 0x7f01002f
+ public const int icon = 2130772015;
+
+ // aapt resource value: 0x7f0100d0
+ public const int iconifiedByDefault = 2130772176;
+
+ // aapt resource value: 0x7f01008a
+ public const int imageButtonStyle = 2130772106;
+
+ // aapt resource value: 0x7f010038
+ public const int indeterminateProgressStyle = 2130772024;
+
+ // aapt resource value: 0x7f010043
+ public const int initialActivityCount = 2130772035;
+
+ // aapt resource value: 0x7f010120
+ public const int insetForeground = 2130772256;
+
+ // aapt resource value: 0x7f010028
+ public const int isLightTheme = 2130772008;
+
+ // aapt resource value: 0x7f01011d
+ public const int itemBackground = 2130772253;
+
+ // aapt resource value: 0x7f01011b
+ public const int itemIconTint = 2130772251;
+
+ // aapt resource value: 0x7f01003a
+ public const int itemPadding = 2130772026;
+
+ // aapt resource value: 0x7f01011e
+ public const int itemTextAppearance = 2130772254;
+
+ // aapt resource value: 0x7f01011c
+ public const int itemTextColor = 2130772252;
+
+ // aapt resource value: 0x7f01010b
+ public const int keylines = 2130772235;
+
+ // aapt resource value: 0x7f0100cf
+ public const int layout = 2130772175;
+
+ // aapt resource value: 0x7f010000
+ public const int layoutManager = 2130771968;
+
+ // aapt resource value: 0x7f01010e
+ public const int layout_anchor = 2130772238;
+
+ // aapt resource value: 0x7f010110
+ public const int layout_anchorGravity = 2130772240;
+
+ // aapt resource value: 0x7f01010d
+ public const int layout_behavior = 2130772237;
+
+ // aapt resource value: 0x7f0100fc
+ public const int layout_collapseMode = 2130772220;
+
+ // aapt resource value: 0x7f0100fd
+ public const int layout_collapseParallaxMultiplier = 2130772221;
+
+ // aapt resource value: 0x7f01010f
+ public const int layout_keyline = 2130772239;
+
+ // aapt resource value: 0x7f0100f8
+ public const int layout_scrollFlags = 2130772216;
+
+ // aapt resource value: 0x7f0100f9
+ public const int layout_scrollInterpolator = 2130772217;
+
+ // aapt resource value: 0x7f01009b
+ public const int listChoiceBackgroundIndicator = 2130772123;
+
+ // aapt resource value: 0x7f010076
+ public const int listDividerAlertDialog = 2130772086;
+
+ // aapt resource value: 0x7f010049
+ public const int listItemLayout = 2130772041;
+
+ // aapt resource value: 0x7f010046
+ public const int listLayout = 2130772038;
+
+ // aapt resource value: 0x7f010095
+ public const int listPopupWindowStyle = 2130772117;
+
+ // aapt resource value: 0x7f01008f
+ public const int listPreferredItemHeight = 2130772111;
+
+ // aapt resource value: 0x7f010091
+ public const int listPreferredItemHeightLarge = 2130772113;
+
+ // aapt resource value: 0x7f010090
+ public const int listPreferredItemHeightSmall = 2130772112;
+
+ // aapt resource value: 0x7f010092
+ public const int listPreferredItemPaddingLeft = 2130772114;
+
+ // aapt resource value: 0x7f010093
+ public const int listPreferredItemPaddingRight = 2130772115;
+
+ // aapt resource value: 0x7f010030
+ public const int logo = 2130772016;
+
+ // aapt resource value: 0x7f0100ef
+ public const int logoDescription = 2130772207;
+
+ // aapt resource value: 0x7f010122
+ public const int maxActionInlineWidth = 2130772258;
+
+ // aapt resource value: 0x7f0100ea
+ public const int maxButtonHeight = 2130772202;
+
+ // aapt resource value: 0x7f0100c5
+ public const int measureWithLargestChild = 2130772165;
+
+ // aapt resource value: 0x7f010005
+ public const int mediaRouteAudioTrackDrawable = 2130771973;
+
+ // aapt resource value: 0x7f010006
+ public const int mediaRouteBluetoothIconDrawable = 2130771974;
+
+ // aapt resource value: 0x7f010007
+ public const int mediaRouteButtonStyle = 2130771975;
+
+ // aapt resource value: 0x7f010008
+ public const int mediaRouteCastDrawable = 2130771976;
+
+ // aapt resource value: 0x7f010009
+ public const int mediaRouteChooserPrimaryTextStyle = 2130771977;
+
+ // aapt resource value: 0x7f01000a
+ public const int mediaRouteChooserSecondaryTextStyle = 2130771978;
+
+ // aapt resource value: 0x7f01000b
+ public const int mediaRouteCloseDrawable = 2130771979;
+
+ // aapt resource value: 0x7f01000c
+ public const int mediaRouteCollapseGroupDrawable = 2130771980;
+
+ // aapt resource value: 0x7f01000d
+ public const int mediaRouteConnectingDrawable = 2130771981;
+
+ // aapt resource value: 0x7f01000e
+ public const int mediaRouteControllerPrimaryTextStyle = 2130771982;
+
+ // aapt resource value: 0x7f01000f
+ public const int mediaRouteControllerSecondaryTextStyle = 2130771983;
+
+ // aapt resource value: 0x7f010010
+ public const int mediaRouteControllerTitleTextStyle = 2130771984;
+
+ // aapt resource value: 0x7f010011
+ public const int mediaRouteDefaultIconDrawable = 2130771985;
+
+ // aapt resource value: 0x7f010012
+ public const int mediaRouteExpandGroupDrawable = 2130771986;
+
+ // aapt resource value: 0x7f010013
+ public const int mediaRouteOffDrawable = 2130771987;
+
+ // aapt resource value: 0x7f010014
+ public const int mediaRouteOnDrawable = 2130771988;
+
+ // aapt resource value: 0x7f010015
+ public const int mediaRoutePauseDrawable = 2130771989;
+
+ // aapt resource value: 0x7f010016
+ public const int mediaRoutePlayDrawable = 2130771990;
+
+ // aapt resource value: 0x7f010017
+ public const int mediaRouteSpeakerGroupIconDrawable = 2130771991;
+
+ // aapt resource value: 0x7f010018
+ public const int mediaRouteSpeakerIconDrawable = 2130771992;
+
+ // aapt resource value: 0x7f010019
+ public const int mediaRouteTvIconDrawable = 2130771993;
+
+ // aapt resource value: 0x7f01011a
+ public const int menu = 2130772250;
+
+ // aapt resource value: 0x7f010047
+ public const int multiChoiceItemLayout = 2130772039;
+
+ // aapt resource value: 0x7f0100ee
+ public const int navigationContentDescription = 2130772206;
+
+ // aapt resource value: 0x7f0100ed
+ public const int navigationIcon = 2130772205;
+
+ // aapt resource value: 0x7f01002a
+ public const int navigationMode = 2130772010;
+
+ // aapt resource value: 0x7f0100cd
+ public const int overlapAnchor = 2130772173;
+
+ // aapt resource value: 0x7f0100f3
+ public const int paddingEnd = 2130772211;
+
+ // aapt resource value: 0x7f0100f2
+ public const int paddingStart = 2130772210;
+
+ // aapt resource value: 0x7f010098
+ public const int panelBackground = 2130772120;
+
+ // aapt resource value: 0x7f01009a
+ public const int panelMenuListTheme = 2130772122;
+
+ // aapt resource value: 0x7f010099
+ public const int panelMenuListWidth = 2130772121;
+
+ // aapt resource value: 0x7f010086
+ public const int popupMenuStyle = 2130772102;
+
+ // aapt resource value: 0x7f010041
+ public const int popupTheme = 2130772033;
+
+ // aapt resource value: 0x7f010087
+ public const int popupWindowStyle = 2130772103;
+
+ // aapt resource value: 0x7f0100cc
+ public const int preserveIconSpacing = 2130772172;
+
+ // aapt resource value: 0x7f010116
+ public const int pressedTranslationZ = 2130772246;
+
+ // aapt resource value: 0x7f010039
+ public const int progressBarPadding = 2130772025;
+
+ // aapt resource value: 0x7f010037
+ public const int progressBarStyle = 2130772023;
+
+ // aapt resource value: 0x7f0100da
+ public const int queryBackground = 2130772186;
+
+ // aapt resource value: 0x7f0100d1
+ public const int queryHint = 2130772177;
+
+ // aapt resource value: 0x7f0100b3
+ public const int radioButtonStyle = 2130772147;
+
+ // aapt resource value: 0x7f0100b4
+ public const int ratingBarStyle = 2130772148;
+
+ // aapt resource value: 0x7f0100b5
+ public const int ratingBarStyleIndicator = 2130772149;
+
+ // aapt resource value: 0x7f0100b6
+ public const int ratingBarStyleSmall = 2130772150;
+
+ // aapt resource value: 0x7f010002
+ public const int reverseLayout = 2130771970;
+
+ // aapt resource value: 0x7f010114
+ public const int rippleColor = 2130772244;
+
+ // aapt resource value: 0x7f0100d6
+ public const int searchHintIcon = 2130772182;
+
+ // aapt resource value: 0x7f0100d5
+ public const int searchIcon = 2130772181;
+
+ // aapt resource value: 0x7f01008e
+ public const int searchViewStyle = 2130772110;
+
+ // aapt resource value: 0x7f0100b7
+ public const int seekBarStyle = 2130772151;
+
+ // aapt resource value: 0x7f01007e
+ public const int selectableItemBackground = 2130772094;
+
+ // aapt resource value: 0x7f01007f
+ public const int selectableItemBackgroundBorderless = 2130772095;
+
+ // aapt resource value: 0x7f0100c8
+ public const int showAsAction = 2130772168;
+
+ // aapt resource value: 0x7f0100c6
+ public const int showDividers = 2130772166;
+
+ // aapt resource value: 0x7f0100e2
+ public const int showText = 2130772194;
+
+ // aapt resource value: 0x7f010048
+ public const int singleChoiceItemLayout = 2130772040;
+
+ // aapt resource value: 0x7f010001
+ public const int spanCount = 2130771969;
+
+ // aapt resource value: 0x7f0100be
+ public const int spinBars = 2130772158;
+
+ // aapt resource value: 0x7f010079
+ public const int spinnerDropDownItemStyle = 2130772089;
+
+ // aapt resource value: 0x7f0100b8
+ public const int spinnerStyle = 2130772152;
+
+ // aapt resource value: 0x7f0100e1
+ public const int splitTrack = 2130772193;
+
+ // aapt resource value: 0x7f01004a
+ public const int srcCompat = 2130772042;
+
+ // aapt resource value: 0x7f010003
+ public const int stackFromEnd = 2130771971;
+
+ // aapt resource value: 0x7f0100ce
+ public const int state_above_anchor = 2130772174;
+
+ // aapt resource value: 0x7f01010c
+ public const int statusBarBackground = 2130772236;
+
+ // aapt resource value: 0x7f010106
+ public const int statusBarScrim = 2130772230;
+
+ // aapt resource value: 0x7f0100db
+ public const int submitBackground = 2130772187;
+
+ // aapt resource value: 0x7f01002c
+ public const int subtitle = 2130772012;
+
+ // aapt resource value: 0x7f0100e4
+ public const int subtitleTextAppearance = 2130772196;
+
+ // aapt resource value: 0x7f0100f1
+ public const int subtitleTextColor = 2130772209;
+
+ // aapt resource value: 0x7f01002e
+ public const int subtitleTextStyle = 2130772014;
+
+ // aapt resource value: 0x7f0100d9
+ public const int suggestionRowLayout = 2130772185;
+
+ // aapt resource value: 0x7f0100df
+ public const int switchMinWidth = 2130772191;
+
+ // aapt resource value: 0x7f0100e0
+ public const int switchPadding = 2130772192;
+
+ // aapt resource value: 0x7f0100b9
+ public const int switchStyle = 2130772153;
+
+ // aapt resource value: 0x7f0100de
+ public const int switchTextAppearance = 2130772190;
+
+ // aapt resource value: 0x7f010126
+ public const int tabBackground = 2130772262;
+
+ // aapt resource value: 0x7f010125
+ public const int tabContentStart = 2130772261;
+
+ // aapt resource value: 0x7f010128
+ public const int tabGravity = 2130772264;
+
+ // aapt resource value: 0x7f010123
+ public const int tabIndicatorColor = 2130772259;
+
+ // aapt resource value: 0x7f010124
+ public const int tabIndicatorHeight = 2130772260;
+
+ // aapt resource value: 0x7f01012a
+ public const int tabMaxWidth = 2130772266;
+
+ // aapt resource value: 0x7f010129
+ public const int tabMinWidth = 2130772265;
+
+ // aapt resource value: 0x7f010127
+ public const int tabMode = 2130772263;
+
+ // aapt resource value: 0x7f010132
+ public const int tabPadding = 2130772274;
+
+ // aapt resource value: 0x7f010131
+ public const int tabPaddingBottom = 2130772273;
+
+ // aapt resource value: 0x7f010130
+ public const int tabPaddingEnd = 2130772272;
+
+ // aapt resource value: 0x7f01012e
+ public const int tabPaddingStart = 2130772270;
+
+ // aapt resource value: 0x7f01012f
+ public const int tabPaddingTop = 2130772271;
+
+ // aapt resource value: 0x7f01012d
+ public const int tabSelectedTextColor = 2130772269;
+
+ // aapt resource value: 0x7f01012b
+ public const int tabTextAppearance = 2130772267;
+
+ // aapt resource value: 0x7f01012c
+ public const int tabTextColor = 2130772268;
+
+ // aapt resource value: 0x7f01004b
+ public const int textAllCaps = 2130772043;
+
+ // aapt resource value: 0x7f010072
+ public const int textAppearanceLargePopupMenu = 2130772082;
+
+ // aapt resource value: 0x7f010096
+ public const int textAppearanceListItem = 2130772118;
+
+ // aapt resource value: 0x7f010097
+ public const int textAppearanceListItemSmall = 2130772119;
+
+ // aapt resource value: 0x7f01008c
+ public const int textAppearanceSearchResultSubtitle = 2130772108;
+
+ // aapt resource value: 0x7f01008b
+ public const int textAppearanceSearchResultTitle = 2130772107;
+
+ // aapt resource value: 0x7f010073
+ public const int textAppearanceSmallPopupMenu = 2130772083;
+
+ // aapt resource value: 0x7f0100a9
+ public const int textColorAlertDialogListItem = 2130772137;
+
+ // aapt resource value: 0x7f010113
+ public const int textColorError = 2130772243;
+
+ // aapt resource value: 0x7f01008d
+ public const int textColorSearchUrl = 2130772109;
+
+ // aapt resource value: 0x7f0100f4
+ public const int theme = 2130772212;
+
+ // aapt resource value: 0x7f0100c4
+ public const int thickness = 2130772164;
+
+ // aapt resource value: 0x7f0100dd
+ public const int thumbTextPadding = 2130772189;
+
+ // aapt resource value: 0x7f010029
+ public const int title = 2130772009;
+
+ // aapt resource value: 0x7f01010a
+ public const int titleEnabled = 2130772234;
+
+ // aapt resource value: 0x7f0100e9
+ public const int titleMarginBottom = 2130772201;
+
+ // aapt resource value: 0x7f0100e7
+ public const int titleMarginEnd = 2130772199;
+
+ // aapt resource value: 0x7f0100e6
+ public const int titleMarginStart = 2130772198;
+
+ // aapt resource value: 0x7f0100e8
+ public const int titleMarginTop = 2130772200;
+
+ // aapt resource value: 0x7f0100e5
+ public const int titleMargins = 2130772197;
+
+ // aapt resource value: 0x7f0100e3
+ public const int titleTextAppearance = 2130772195;
+
+ // aapt resource value: 0x7f0100f0
+ public const int titleTextColor = 2130772208;
+
+ // aapt resource value: 0x7f01002d
+ public const int titleTextStyle = 2130772013;
+
+ // aapt resource value: 0x7f010107
+ public const int toolbarId = 2130772231;
+
+ // aapt resource value: 0x7f010085
+ public const int toolbarNavigationButtonStyle = 2130772101;
+
+ // aapt resource value: 0x7f010084
+ public const int toolbarStyle = 2130772100;
+
+ // aapt resource value: 0x7f0100dc
+ public const int track = 2130772188;
+
+ // aapt resource value: 0x7f010118
+ public const int useCompatPadding = 2130772248;
+
+ // aapt resource value: 0x7f0100d7
+ public const int voiceIcon = 2130772183;
+
+ // aapt resource value: 0x7f01004c
+ public const int windowActionBar = 2130772044;
+
+ // aapt resource value: 0x7f01004e
+ public const int windowActionBarOverlay = 2130772046;
+
+ // aapt resource value: 0x7f01004f
+ public const int windowActionModeOverlay = 2130772047;
+
+ // aapt resource value: 0x7f010053
+ public const int windowFixedHeightMajor = 2130772051;
+
+ // aapt resource value: 0x7f010051
+ public const int windowFixedHeightMinor = 2130772049;
+
+ // aapt resource value: 0x7f010050
+ public const int windowFixedWidthMajor = 2130772048;
+
+ // aapt resource value: 0x7f010052
+ public const int windowFixedWidthMinor = 2130772050;
+
+ // aapt resource value: 0x7f010054
+ public const int windowMinWidthMajor = 2130772052;
+
+ // aapt resource value: 0x7f010055
+ public const int windowMinWidthMinor = 2130772053;
+
+ // aapt resource value: 0x7f01004d
+ public const int windowNoTitle = 2130772045;
+
+ static Attribute()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Attribute()
+ {
+ }
+ }
+
+ public partial class Boolean
+ {
+
+ // aapt resource value: 0x7f0c0003
+ public const int abc_action_bar_embed_tabs = 2131492867;
+
+ // aapt resource value: 0x7f0c0001
+ public const int abc_action_bar_embed_tabs_pre_jb = 2131492865;
+
+ // aapt resource value: 0x7f0c0004
+ public const int abc_action_bar_expanded_action_views_exclusive = 2131492868;
+
+ // aapt resource value: 0x7f0c0000
+ public const int abc_allow_stacked_button_bar = 2131492864;
+
+ // aapt resource value: 0x7f0c0005
+ public const int abc_config_actionMenuItemAllCaps = 2131492869;
+
+ // aapt resource value: 0x7f0c0002
+ public const int abc_config_allowActionMenuItemTextWithIcon = 2131492866;
+
+ // aapt resource value: 0x7f0c0006
+ public const int abc_config_closeDialogWhenTouchOutside = 2131492870;
+
+ // aapt resource value: 0x7f0c0007
+ public const int abc_config_showMenuShortcutsWhenKeyboardPresent = 2131492871;
+
+ static Boolean()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Boolean()
+ {
+ }
+ }
+
+ public partial class Color
+ {
+
+ // aapt resource value: 0x7f0b0048
+ public const int abc_background_cache_hint_selector_material_dark = 2131427400;
+
+ // aapt resource value: 0x7f0b0049
+ public const int abc_background_cache_hint_selector_material_light = 2131427401;
+
+ // aapt resource value: 0x7f0b004a
+ public const int abc_color_highlight_material = 2131427402;
+
+ // aapt resource value: 0x7f0b0004
+ public const int abc_input_method_navigation_guard = 2131427332;
+
+ // aapt resource value: 0x7f0b004b
+ public const int abc_primary_text_disable_only_material_dark = 2131427403;
+
+ // aapt resource value: 0x7f0b004c
+ public const int abc_primary_text_disable_only_material_light = 2131427404;
+
+ // aapt resource value: 0x7f0b004d
+ public const int abc_primary_text_material_dark = 2131427405;
+
+ // aapt resource value: 0x7f0b004e
+ public const int abc_primary_text_material_light = 2131427406;
+
+ // aapt resource value: 0x7f0b004f
+ public const int abc_search_url_text = 2131427407;
+
+ // aapt resource value: 0x7f0b0005
+ public const int abc_search_url_text_normal = 2131427333;
+
+ // aapt resource value: 0x7f0b0006
+ public const int abc_search_url_text_pressed = 2131427334;
+
+ // aapt resource value: 0x7f0b0007
+ public const int abc_search_url_text_selected = 2131427335;
+
+ // aapt resource value: 0x7f0b0050
+ public const int abc_secondary_text_material_dark = 2131427408;
+
+ // aapt resource value: 0x7f0b0051
+ public const int abc_secondary_text_material_light = 2131427409;
+
+ // aapt resource value: 0x7f0b0008
+ public const int accent_material_dark = 2131427336;
+
+ // aapt resource value: 0x7f0b0009
+ public const int accent_material_light = 2131427337;
+
+ // aapt resource value: 0x7f0b000a
+ public const int background_floating_material_dark = 2131427338;
+
+ // aapt resource value: 0x7f0b000b
+ public const int background_floating_material_light = 2131427339;
+
+ // aapt resource value: 0x7f0b000c
+ public const int background_material_dark = 2131427340;
+
+ // aapt resource value: 0x7f0b000d
+ public const int background_material_light = 2131427341;
+
+ // aapt resource value: 0x7f0b000e
+ public const int bright_foreground_disabled_material_dark = 2131427342;
+
+ // aapt resource value: 0x7f0b000f
+ public const int bright_foreground_disabled_material_light = 2131427343;
+
+ // aapt resource value: 0x7f0b0010
+ public const int bright_foreground_inverse_material_dark = 2131427344;
+
+ // aapt resource value: 0x7f0b0011
+ public const int bright_foreground_inverse_material_light = 2131427345;
+
+ // aapt resource value: 0x7f0b0012
+ public const int bright_foreground_material_dark = 2131427346;
+
+ // aapt resource value: 0x7f0b0013
+ public const int bright_foreground_material_light = 2131427347;
+
+ // aapt resource value: 0x7f0b0014
+ public const int button_material_dark = 2131427348;
+
+ // aapt resource value: 0x7f0b0015
+ public const int button_material_light = 2131427349;
+
+ // aapt resource value: 0x7f0b0000
+ public const int cardview_dark_background = 2131427328;
+
+ // aapt resource value: 0x7f0b0001
+ public const int cardview_light_background = 2131427329;
+
+ // aapt resource value: 0x7f0b0002
+ public const int cardview_shadow_end_color = 2131427330;
+
+ // aapt resource value: 0x7f0b0003
+ public const int cardview_shadow_start_color = 2131427331;
+
+ // aapt resource value: 0x7f0b003e
+ public const int design_fab_shadow_end_color = 2131427390;
+
+ // aapt resource value: 0x7f0b003f
+ public const int design_fab_shadow_mid_color = 2131427391;
+
+ // aapt resource value: 0x7f0b0040
+ public const int design_fab_shadow_start_color = 2131427392;
+
+ // aapt resource value: 0x7f0b0041
+ public const int design_fab_stroke_end_inner_color = 2131427393;
+
+ // aapt resource value: 0x7f0b0042
+ public const int design_fab_stroke_end_outer_color = 2131427394;
+
+ // aapt resource value: 0x7f0b0043
+ public const int design_fab_stroke_top_inner_color = 2131427395;
+
+ // aapt resource value: 0x7f0b0044
+ public const int design_fab_stroke_top_outer_color = 2131427396;
+
+ // aapt resource value: 0x7f0b0045
+ public const int design_snackbar_background_color = 2131427397;
+
+ // aapt resource value: 0x7f0b0046
+ public const int design_textinput_error_color_dark = 2131427398;
+
+ // aapt resource value: 0x7f0b0047
+ public const int design_textinput_error_color_light = 2131427399;
+
+ // aapt resource value: 0x7f0b0016
+ public const int dim_foreground_disabled_material_dark = 2131427350;
+
+ // aapt resource value: 0x7f0b0017
+ public const int dim_foreground_disabled_material_light = 2131427351;
+
+ // aapt resource value: 0x7f0b0018
+ public const int dim_foreground_material_dark = 2131427352;
+
+ // aapt resource value: 0x7f0b0019
+ public const int dim_foreground_material_light = 2131427353;
+
+ // aapt resource value: 0x7f0b001a
+ public const int foreground_material_dark = 2131427354;
+
+ // aapt resource value: 0x7f0b001b
+ public const int foreground_material_light = 2131427355;
+
+ // aapt resource value: 0x7f0b001c
+ public const int highlighted_text_material_dark = 2131427356;
+
+ // aapt resource value: 0x7f0b001d
+ public const int highlighted_text_material_light = 2131427357;
+
+ // aapt resource value: 0x7f0b001e
+ public const int hint_foreground_material_dark = 2131427358;
+
+ // aapt resource value: 0x7f0b001f
+ public const int hint_foreground_material_light = 2131427359;
+
+ // aapt resource value: 0x7f0b0020
+ public const int material_blue_grey_800 = 2131427360;
+
+ // aapt resource value: 0x7f0b0021
+ public const int material_blue_grey_900 = 2131427361;
+
+ // aapt resource value: 0x7f0b0022
+ public const int material_blue_grey_950 = 2131427362;
+
+ // aapt resource value: 0x7f0b0023
+ public const int material_deep_teal_200 = 2131427363;
+
+ // aapt resource value: 0x7f0b0024
+ public const int material_deep_teal_500 = 2131427364;
+
+ // aapt resource value: 0x7f0b0025
+ public const int material_grey_100 = 2131427365;
+
+ // aapt resource value: 0x7f0b0026
+ public const int material_grey_300 = 2131427366;
+
+ // aapt resource value: 0x7f0b0027
+ public const int material_grey_50 = 2131427367;
+
+ // aapt resource value: 0x7f0b0028
+ public const int material_grey_600 = 2131427368;
+
+ // aapt resource value: 0x7f0b0029
+ public const int material_grey_800 = 2131427369;
+
+ // aapt resource value: 0x7f0b002a
+ public const int material_grey_850 = 2131427370;
+
+ // aapt resource value: 0x7f0b002b
+ public const int material_grey_900 = 2131427371;
+
+ // aapt resource value: 0x7f0b002c
+ public const int primary_dark_material_dark = 2131427372;
+
+ // aapt resource value: 0x7f0b002d
+ public const int primary_dark_material_light = 2131427373;
+
+ // aapt resource value: 0x7f0b002e
+ public const int primary_material_dark = 2131427374;
+
+ // aapt resource value: 0x7f0b002f
+ public const int primary_material_light = 2131427375;
+
+ // aapt resource value: 0x7f0b0030
+ public const int primary_text_default_material_dark = 2131427376;
+
+ // aapt resource value: 0x7f0b0031
+ public const int primary_text_default_material_light = 2131427377;
+
+ // aapt resource value: 0x7f0b0032
+ public const int primary_text_disabled_material_dark = 2131427378;
+
+ // aapt resource value: 0x7f0b0033
+ public const int primary_text_disabled_material_light = 2131427379;
+
+ // aapt resource value: 0x7f0b0034
+ public const int ripple_material_dark = 2131427380;
+
+ // aapt resource value: 0x7f0b0035
+ public const int ripple_material_light = 2131427381;
+
+ // aapt resource value: 0x7f0b0036
+ public const int secondary_text_default_material_dark = 2131427382;
+
+ // aapt resource value: 0x7f0b0037
+ public const int secondary_text_default_material_light = 2131427383;
+
+ // aapt resource value: 0x7f0b0038
+ public const int secondary_text_disabled_material_dark = 2131427384;
+
+ // aapt resource value: 0x7f0b0039
+ public const int secondary_text_disabled_material_light = 2131427385;
+
+ // aapt resource value: 0x7f0b003a
+ public const int switch_thumb_disabled_material_dark = 2131427386;
+
+ // aapt resource value: 0x7f0b003b
+ public const int switch_thumb_disabled_material_light = 2131427387;
+
+ // aapt resource value: 0x7f0b0052
+ public const int switch_thumb_material_dark = 2131427410;
+
+ // aapt resource value: 0x7f0b0053
+ public const int switch_thumb_material_light = 2131427411;
+
+ // aapt resource value: 0x7f0b003c
+ public const int switch_thumb_normal_material_dark = 2131427388;
+
+ // aapt resource value: 0x7f0b003d
+ public const int switch_thumb_normal_material_light = 2131427389;
+
+ static Color()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Color()
+ {
+ }
+ }
+
+ public partial class Dimension
+ {
+
+ // aapt resource value: 0x7f060019
+ public const int abc_action_bar_content_inset_material = 2131099673;
+
+ // aapt resource value: 0x7f06000d
+ public const int abc_action_bar_default_height_material = 2131099661;
+
+ // aapt resource value: 0x7f06001a
+ public const int abc_action_bar_default_padding_end_material = 2131099674;
+
+ // aapt resource value: 0x7f06001b
+ public const int abc_action_bar_default_padding_start_material = 2131099675;
+
+ // aapt resource value: 0x7f06001d
+ public const int abc_action_bar_icon_vertical_padding_material = 2131099677;
+
+ // aapt resource value: 0x7f06001e
+ public const int abc_action_bar_overflow_padding_end_material = 2131099678;
+
+ // aapt resource value: 0x7f06001f
+ public const int abc_action_bar_overflow_padding_start_material = 2131099679;
+
+ // aapt resource value: 0x7f06000e
+ public const int abc_action_bar_progress_bar_size = 2131099662;
+
+ // aapt resource value: 0x7f060020
+ public const int abc_action_bar_stacked_max_height = 2131099680;
+
+ // aapt resource value: 0x7f060021
+ public const int abc_action_bar_stacked_tab_max_width = 2131099681;
+
+ // aapt resource value: 0x7f060022
+ public const int abc_action_bar_subtitle_bottom_margin_material = 2131099682;
+
+ // aapt resource value: 0x7f060023
+ public const int abc_action_bar_subtitle_top_margin_material = 2131099683;
+
+ // aapt resource value: 0x7f060024
+ public const int abc_action_button_min_height_material = 2131099684;
+
+ // aapt resource value: 0x7f060025
+ public const int abc_action_button_min_width_material = 2131099685;
+
+ // aapt resource value: 0x7f060026
+ public const int abc_action_button_min_width_overflow_material = 2131099686;
+
+ // aapt resource value: 0x7f06000c
+ public const int abc_alert_dialog_button_bar_height = 2131099660;
+
+ // aapt resource value: 0x7f060027
+ public const int abc_button_inset_horizontal_material = 2131099687;
+
+ // aapt resource value: 0x7f060028
+ public const int abc_button_inset_vertical_material = 2131099688;
+
+ // aapt resource value: 0x7f060029
+ public const int abc_button_padding_horizontal_material = 2131099689;
+
+ // aapt resource value: 0x7f06002a
+ public const int abc_button_padding_vertical_material = 2131099690;
+
+ // aapt resource value: 0x7f060011
+ public const int abc_config_prefDialogWidth = 2131099665;
+
+ // aapt resource value: 0x7f06002b
+ public const int abc_control_corner_material = 2131099691;
+
+ // aapt resource value: 0x7f06002c
+ public const int abc_control_inset_material = 2131099692;
+
+ // aapt resource value: 0x7f06002d
+ public const int abc_control_padding_material = 2131099693;
+
+ // aapt resource value: 0x7f060012
+ public const int abc_dialog_fixed_height_major = 2131099666;
+
+ // aapt resource value: 0x7f060013
+ public const int abc_dialog_fixed_height_minor = 2131099667;
+
+ // aapt resource value: 0x7f060014
+ public const int abc_dialog_fixed_width_major = 2131099668;
+
+ // aapt resource value: 0x7f060015
+ public const int abc_dialog_fixed_width_minor = 2131099669;
+
+ // aapt resource value: 0x7f06002e
+ public const int abc_dialog_list_padding_vertical_material = 2131099694;
+
+ // aapt resource value: 0x7f060016
+ public const int abc_dialog_min_width_major = 2131099670;
+
+ // aapt resource value: 0x7f060017
+ public const int abc_dialog_min_width_minor = 2131099671;
+
+ // aapt resource value: 0x7f06002f
+ public const int abc_dialog_padding_material = 2131099695;
+
+ // aapt resource value: 0x7f060030
+ public const int abc_dialog_padding_top_material = 2131099696;
+
+ // aapt resource value: 0x7f060031
+ public const int abc_disabled_alpha_material_dark = 2131099697;
+
+ // aapt resource value: 0x7f060032
+ public const int abc_disabled_alpha_material_light = 2131099698;
+
+ // aapt resource value: 0x7f060033
+ public const int abc_dropdownitem_icon_width = 2131099699;
+
+ // aapt resource value: 0x7f060034
+ public const int abc_dropdownitem_text_padding_left = 2131099700;
+
+ // aapt resource value: 0x7f060035
+ public const int abc_dropdownitem_text_padding_right = 2131099701;
+
+ // aapt resource value: 0x7f060036
+ public const int abc_edit_text_inset_bottom_material = 2131099702;
+
+ // aapt resource value: 0x7f060037
+ public const int abc_edit_text_inset_horizontal_material = 2131099703;
+
+ // aapt resource value: 0x7f060038
+ public const int abc_edit_text_inset_top_material = 2131099704;
+
+ // aapt resource value: 0x7f060039
+ public const int abc_floating_window_z = 2131099705;
+
+ // aapt resource value: 0x7f06003a
+ public const int abc_list_item_padding_horizontal_material = 2131099706;
+
+ // aapt resource value: 0x7f06003b
+ public const int abc_panel_menu_list_width = 2131099707;
+
+ // aapt resource value: 0x7f06003c
+ public const int abc_search_view_preferred_width = 2131099708;
+
+ // aapt resource value: 0x7f060018
+ public const int abc_search_view_text_min_width = 2131099672;
+
+ // aapt resource value: 0x7f06003d
+ public const int abc_seekbar_track_background_height_material = 2131099709;
+
+ // aapt resource value: 0x7f06003e
+ public const int abc_seekbar_track_progress_height_material = 2131099710;
+
+ // aapt resource value: 0x7f06003f
+ public const int abc_select_dialog_padding_start_material = 2131099711;
+
+ // aapt resource value: 0x7f06001c
+ public const int abc_switch_padding = 2131099676;
+
+ // aapt resource value: 0x7f060040
+ public const int abc_text_size_body_1_material = 2131099712;
+
+ // aapt resource value: 0x7f060041
+ public const int abc_text_size_body_2_material = 2131099713;
+
+ // aapt resource value: 0x7f060042
+ public const int abc_text_size_button_material = 2131099714;
+
+ // aapt resource value: 0x7f060043
+ public const int abc_text_size_caption_material = 2131099715;
+
+ // aapt resource value: 0x7f060044
+ public const int abc_text_size_display_1_material = 2131099716;
+
+ // aapt resource value: 0x7f060045
+ public const int abc_text_size_display_2_material = 2131099717;
+
+ // aapt resource value: 0x7f060046
+ public const int abc_text_size_display_3_material = 2131099718;
+
+ // aapt resource value: 0x7f060047
+ public const int abc_text_size_display_4_material = 2131099719;
+
+ // aapt resource value: 0x7f060048
+ public const int abc_text_size_headline_material = 2131099720;
+
+ // aapt resource value: 0x7f060049
+ public const int abc_text_size_large_material = 2131099721;
+
+ // aapt resource value: 0x7f06004a
+ public const int abc_text_size_medium_material = 2131099722;
+
+ // aapt resource value: 0x7f06004b
+ public const int abc_text_size_menu_material = 2131099723;
+
+ // aapt resource value: 0x7f06004c
+ public const int abc_text_size_small_material = 2131099724;
+
+ // aapt resource value: 0x7f06004d
+ public const int abc_text_size_subhead_material = 2131099725;
+
+ // aapt resource value: 0x7f06000f
+ public const int abc_text_size_subtitle_material_toolbar = 2131099663;
+
+ // aapt resource value: 0x7f06004e
+ public const int abc_text_size_title_material = 2131099726;
+
+ // aapt resource value: 0x7f060010
+ public const int abc_text_size_title_material_toolbar = 2131099664;
+
+ // aapt resource value: 0x7f060009
+ public const int cardview_compat_inset_shadow = 2131099657;
+
+ // aapt resource value: 0x7f06000a
+ public const int cardview_default_elevation = 2131099658;
+
+ // aapt resource value: 0x7f06000b
+ public const int cardview_default_radius = 2131099659;
+
+ // aapt resource value: 0x7f06005f
+ public const int design_appbar_elevation = 2131099743;
+
+ // aapt resource value: 0x7f060060
+ public const int design_bottom_sheet_modal_elevation = 2131099744;
+
+ // aapt resource value: 0x7f060061
+ public const int design_bottom_sheet_modal_peek_height = 2131099745;
+
+ // aapt resource value: 0x7f060062
+ public const int design_fab_border_width = 2131099746;
+
+ // aapt resource value: 0x7f060063
+ public const int design_fab_elevation = 2131099747;
+
+ // aapt resource value: 0x7f060064
+ public const int design_fab_image_size = 2131099748;
+
+ // aapt resource value: 0x7f060065
+ public const int design_fab_size_mini = 2131099749;
+
+ // aapt resource value: 0x7f060066
+ public const int design_fab_size_normal = 2131099750;
+
+ // aapt resource value: 0x7f060067
+ public const int design_fab_translation_z_pressed = 2131099751;
+
+ // aapt resource value: 0x7f060068
+ public const int design_navigation_elevation = 2131099752;
+
+ // aapt resource value: 0x7f060069
+ public const int design_navigation_icon_padding = 2131099753;
+
+ // aapt resource value: 0x7f06006a
+ public const int design_navigation_icon_size = 2131099754;
+
+ // aapt resource value: 0x7f060057
+ public const int design_navigation_max_width = 2131099735;
+
+ // aapt resource value: 0x7f06006b
+ public const int design_navigation_padding_bottom = 2131099755;
+
+ // aapt resource value: 0x7f06006c
+ public const int design_navigation_separator_vertical_padding = 2131099756;
+
+ // aapt resource value: 0x7f060058
+ public const int design_snackbar_action_inline_max_width = 2131099736;
+
+ // aapt resource value: 0x7f060059
+ public const int design_snackbar_background_corner_radius = 2131099737;
+
+ // aapt resource value: 0x7f06006d
+ public const int design_snackbar_elevation = 2131099757;
+
+ // aapt resource value: 0x7f06005a
+ public const int design_snackbar_extra_spacing_horizontal = 2131099738;
+
+ // aapt resource value: 0x7f06005b
+ public const int design_snackbar_max_width = 2131099739;
+
+ // aapt resource value: 0x7f06005c
+ public const int design_snackbar_min_width = 2131099740;
+
+ // aapt resource value: 0x7f06006e
+ public const int design_snackbar_padding_horizontal = 2131099758;
+
+ // aapt resource value: 0x7f06006f
+ public const int design_snackbar_padding_vertical = 2131099759;
+
+ // aapt resource value: 0x7f06005d
+ public const int design_snackbar_padding_vertical_2lines = 2131099741;
+
+ // aapt resource value: 0x7f060070
+ public const int design_snackbar_text_size = 2131099760;
+
+ // aapt resource value: 0x7f060071
+ public const int design_tab_max_width = 2131099761;
+
+ // aapt resource value: 0x7f06005e
+ public const int design_tab_scrollable_min_width = 2131099742;
+
+ // aapt resource value: 0x7f060072
+ public const int design_tab_text_size = 2131099762;
+
+ // aapt resource value: 0x7f060073
+ public const int design_tab_text_size_2line = 2131099763;
+
+ // aapt resource value: 0x7f06004f
+ public const int disabled_alpha_material_dark = 2131099727;
+
+ // aapt resource value: 0x7f060050
+ public const int disabled_alpha_material_light = 2131099728;
+
+ // aapt resource value: 0x7f060051
+ public const int highlight_alpha_material_colored = 2131099729;
+
+ // aapt resource value: 0x7f060052
+ public const int highlight_alpha_material_dark = 2131099730;
+
+ // aapt resource value: 0x7f060053
+ public const int highlight_alpha_material_light = 2131099731;
+
+ // aapt resource value: 0x7f060000
+ public const int item_touch_helper_max_drag_scroll_per_frame = 2131099648;
+
+ // aapt resource value: 0x7f060001
+ public const int item_touch_helper_swipe_escape_max_velocity = 2131099649;
+
+ // aapt resource value: 0x7f060002
+ public const int item_touch_helper_swipe_escape_velocity = 2131099650;
+
+ // aapt resource value: 0x7f060003
+ public const int mr_controller_volume_group_list_item_height = 2131099651;
+
+ // aapt resource value: 0x7f060004
+ public const int mr_controller_volume_group_list_item_icon_size = 2131099652;
+
+ // aapt resource value: 0x7f060005
+ public const int mr_controller_volume_group_list_max_height = 2131099653;
+
+ // aapt resource value: 0x7f060008
+ public const int mr_controller_volume_group_list_padding_top = 2131099656;
+
+ // aapt resource value: 0x7f060006
+ public const int mr_dialog_fixed_width_major = 2131099654;
+
+ // aapt resource value: 0x7f060007
+ public const int mr_dialog_fixed_width_minor = 2131099655;
+
+ // aapt resource value: 0x7f060054
+ public const int notification_large_icon_height = 2131099732;
+
+ // aapt resource value: 0x7f060055
+ public const int notification_large_icon_width = 2131099733;
+
+ // aapt resource value: 0x7f060056
+ public const int notification_subtext_size = 2131099734;
+
+ static Dimension()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Dimension()
+ {
+ }
+ }
+
+ public partial class Drawable
+ {
+
+ // aapt resource value: 0x7f020000
+ public const int abc_ab_share_pack_mtrl_alpha = 2130837504;
+
+ // aapt resource value: 0x7f020001
+ public const int abc_action_bar_item_background_material = 2130837505;
+
+ // aapt resource value: 0x7f020002
+ public const int abc_btn_borderless_material = 2130837506;
+
+ // aapt resource value: 0x7f020003
+ public const int abc_btn_check_material = 2130837507;
+
+ // aapt resource value: 0x7f020004
+ public const int abc_btn_check_to_on_mtrl_000 = 2130837508;
+
+ // aapt resource value: 0x7f020005
+ public const int abc_btn_check_to_on_mtrl_015 = 2130837509;
+
+ // aapt resource value: 0x7f020006
+ public const int abc_btn_colored_material = 2130837510;
+
+ // aapt resource value: 0x7f020007
+ public const int abc_btn_default_mtrl_shape = 2130837511;
+
+ // aapt resource value: 0x7f020008
+ public const int abc_btn_radio_material = 2130837512;
+
+ // aapt resource value: 0x7f020009
+ public const int abc_btn_radio_to_on_mtrl_000 = 2130837513;
+
+ // aapt resource value: 0x7f02000a
+ public const int abc_btn_radio_to_on_mtrl_015 = 2130837514;
+
+ // aapt resource value: 0x7f02000b
+ public const int abc_btn_rating_star_off_mtrl_alpha = 2130837515;
+
+ // aapt resource value: 0x7f02000c
+ public const int abc_btn_rating_star_on_mtrl_alpha = 2130837516;
+
+ // aapt resource value: 0x7f02000d
+ public const int abc_btn_switch_to_on_mtrl_00001 = 2130837517;
+
+ // aapt resource value: 0x7f02000e
+ public const int abc_btn_switch_to_on_mtrl_00012 = 2130837518;
+
+ // aapt resource value: 0x7f02000f
+ public const int abc_cab_background_internal_bg = 2130837519;
+
+ // aapt resource value: 0x7f020010
+ public const int abc_cab_background_top_material = 2130837520;
+
+ // aapt resource value: 0x7f020011
+ public const int abc_cab_background_top_mtrl_alpha = 2130837521;
+
+ // aapt resource value: 0x7f020012
+ public const int abc_control_background_material = 2130837522;
+
+ // aapt resource value: 0x7f020013
+ public const int abc_dialog_material_background_dark = 2130837523;
+
+ // aapt resource value: 0x7f020014
+ public const int abc_dialog_material_background_light = 2130837524;
+
+ // aapt resource value: 0x7f020015
+ public const int abc_edit_text_material = 2130837525;
+
+ // aapt resource value: 0x7f020016
+ public const int abc_ic_ab_back_mtrl_am_alpha = 2130837526;
+
+ // aapt resource value: 0x7f020017
+ public const int abc_ic_clear_mtrl_alpha = 2130837527;
+
+ // aapt resource value: 0x7f020018
+ public const int abc_ic_commit_search_api_mtrl_alpha = 2130837528;
+
+ // aapt resource value: 0x7f020019
+ public const int abc_ic_go_search_api_mtrl_alpha = 2130837529;
+
+ // aapt resource value: 0x7f02001a
+ public const int abc_ic_menu_copy_mtrl_am_alpha = 2130837530;
+
+ // aapt resource value: 0x7f02001b
+ public const int abc_ic_menu_cut_mtrl_alpha = 2130837531;
+
+ // aapt resource value: 0x7f02001c
+ public const int abc_ic_menu_moreoverflow_mtrl_alpha = 2130837532;
+
+ // aapt resource value: 0x7f02001d
+ public const int abc_ic_menu_paste_mtrl_am_alpha = 2130837533;
+
+ // aapt resource value: 0x7f02001e
+ public const int abc_ic_menu_selectall_mtrl_alpha = 2130837534;
+
+ // aapt resource value: 0x7f02001f
+ public const int abc_ic_menu_share_mtrl_alpha = 2130837535;
+
+ // aapt resource value: 0x7f020020
+ public const int abc_ic_search_api_mtrl_alpha = 2130837536;
+
+ // aapt resource value: 0x7f020021
+ public const int abc_ic_star_black_16dp = 2130837537;
+
+ // aapt resource value: 0x7f020022
+ public const int abc_ic_star_black_36dp = 2130837538;
+
+ // aapt resource value: 0x7f020023
+ public const int abc_ic_star_half_black_16dp = 2130837539;
+
+ // aapt resource value: 0x7f020024
+ public const int abc_ic_star_half_black_36dp = 2130837540;
+
+ // aapt resource value: 0x7f020025
+ public const int abc_ic_voice_search_api_mtrl_alpha = 2130837541;
+
+ // aapt resource value: 0x7f020026
+ public const int abc_item_background_holo_dark = 2130837542;
+
+ // aapt resource value: 0x7f020027
+ public const int abc_item_background_holo_light = 2130837543;
+
+ // aapt resource value: 0x7f020028
+ public const int abc_list_divider_mtrl_alpha = 2130837544;
+
+ // aapt resource value: 0x7f020029
+ public const int abc_list_focused_holo = 2130837545;
+
+ // aapt resource value: 0x7f02002a
+ public const int abc_list_longpressed_holo = 2130837546;
+
+ // aapt resource value: 0x7f02002b
+ public const int abc_list_pressed_holo_dark = 2130837547;
+
+ // aapt resource value: 0x7f02002c
+ public const int abc_list_pressed_holo_light = 2130837548;
+
+ // aapt resource value: 0x7f02002d
+ public const int abc_list_selector_background_transition_holo_dark = 2130837549;
+
+ // aapt resource value: 0x7f02002e
+ public const int abc_list_selector_background_transition_holo_light = 2130837550;
+
+ // aapt resource value: 0x7f02002f
+ public const int abc_list_selector_disabled_holo_dark = 2130837551;
+
+ // aapt resource value: 0x7f020030
+ public const int abc_list_selector_disabled_holo_light = 2130837552;
+
+ // aapt resource value: 0x7f020031
+ public const int abc_list_selector_holo_dark = 2130837553;
+
+ // aapt resource value: 0x7f020032
+ public const int abc_list_selector_holo_light = 2130837554;
+
+ // aapt resource value: 0x7f020033
+ public const int abc_menu_hardkey_panel_mtrl_mult = 2130837555;
+
+ // aapt resource value: 0x7f020034
+ public const int abc_popup_background_mtrl_mult = 2130837556;
+
+ // aapt resource value: 0x7f020035
+ public const int abc_ratingbar_full_material = 2130837557;
+
+ // aapt resource value: 0x7f020036
+ public const int abc_ratingbar_indicator_material = 2130837558;
+
+ // aapt resource value: 0x7f020037
+ public const int abc_ratingbar_small_material = 2130837559;
+
+ // aapt resource value: 0x7f020038
+ public const int abc_scrubber_control_off_mtrl_alpha = 2130837560;
+
+ // aapt resource value: 0x7f020039
+ public const int abc_scrubber_control_to_pressed_mtrl_000 = 2130837561;
+
+ // aapt resource value: 0x7f02003a
+ public const int abc_scrubber_control_to_pressed_mtrl_005 = 2130837562;
+
+ // aapt resource value: 0x7f02003b
+ public const int abc_scrubber_primary_mtrl_alpha = 2130837563;
+
+ // aapt resource value: 0x7f02003c
+ public const int abc_scrubber_track_mtrl_alpha = 2130837564;
+
+ // aapt resource value: 0x7f02003d
+ public const int abc_seekbar_thumb_material = 2130837565;
+
+ // aapt resource value: 0x7f02003e
+ public const int abc_seekbar_track_material = 2130837566;
+
+ // aapt resource value: 0x7f02003f
+ public const int abc_spinner_mtrl_am_alpha = 2130837567;
+
+ // aapt resource value: 0x7f020040
+ public const int abc_spinner_textfield_background_material = 2130837568;
+
+ // aapt resource value: 0x7f020041
+ public const int abc_switch_thumb_material = 2130837569;
+
+ // aapt resource value: 0x7f020042
+ public const int abc_switch_track_mtrl_alpha = 2130837570;
+
+ // aapt resource value: 0x7f020043
+ public const int abc_tab_indicator_material = 2130837571;
+
+ // aapt resource value: 0x7f020044
+ public const int abc_tab_indicator_mtrl_alpha = 2130837572;
+
+ // aapt resource value: 0x7f020045
+ public const int abc_text_cursor_material = 2130837573;
+
+ // aapt resource value: 0x7f020046
+ public const int abc_textfield_activated_mtrl_alpha = 2130837574;
+
+ // aapt resource value: 0x7f020047
+ public const int abc_textfield_default_mtrl_alpha = 2130837575;
+
+ // aapt resource value: 0x7f020048
+ public const int abc_textfield_search_activated_mtrl_alpha = 2130837576;
+
+ // aapt resource value: 0x7f020049
+ public const int abc_textfield_search_default_mtrl_alpha = 2130837577;
+
+ // aapt resource value: 0x7f02004a
+ public const int abc_textfield_search_material = 2130837578;
+
+ // aapt resource value: 0x7f02004b
+ public const int design_fab_background = 2130837579;
+
+ // aapt resource value: 0x7f02004c
+ public const int design_snackbar_background = 2130837580;
+
+ // aapt resource value: 0x7f02004d
+ public const int ic_audiotrack = 2130837581;
+
+ // aapt resource value: 0x7f02004e
+ public const int ic_audiotrack_light = 2130837582;
+
+ // aapt resource value: 0x7f02004f
+ public const int ic_bluetooth_grey = 2130837583;
+
+ // aapt resource value: 0x7f020050
+ public const int ic_bluetooth_white = 2130837584;
+
+ // aapt resource value: 0x7f020051
+ public const int ic_cast_dark = 2130837585;
+
+ // aapt resource value: 0x7f020052
+ public const int ic_cast_disabled_light = 2130837586;
+
+ // aapt resource value: 0x7f020053
+ public const int ic_cast_grey = 2130837587;
+
+ // aapt resource value: 0x7f020054
+ public const int ic_cast_light = 2130837588;
+
+ // aapt resource value: 0x7f020055
+ public const int ic_cast_off_light = 2130837589;
+
+ // aapt resource value: 0x7f020056
+ public const int ic_cast_on_0_light = 2130837590;
+
+ // aapt resource value: 0x7f020057
+ public const int ic_cast_on_1_light = 2130837591;
+
+ // aapt resource value: 0x7f020058
+ public const int ic_cast_on_2_light = 2130837592;
+
+ // aapt resource value: 0x7f020059
+ public const int ic_cast_on_light = 2130837593;
+
+ // aapt resource value: 0x7f02005a
+ public const int ic_cast_white = 2130837594;
+
+ // aapt resource value: 0x7f02005b
+ public const int ic_close_dark = 2130837595;
+
+ // aapt resource value: 0x7f02005c
+ public const int ic_close_light = 2130837596;
+
+ // aapt resource value: 0x7f02005d
+ public const int ic_collapse = 2130837597;
+
+ // aapt resource value: 0x7f02005e
+ public const int ic_collapse_00000 = 2130837598;
+
+ // aapt resource value: 0x7f02005f
+ public const int ic_collapse_00001 = 2130837599;
+
+ // aapt resource value: 0x7f020060
+ public const int ic_collapse_00002 = 2130837600;
+
+ // aapt resource value: 0x7f020061
+ public const int ic_collapse_00003 = 2130837601;
+
+ // aapt resource value: 0x7f020062
+ public const int ic_collapse_00004 = 2130837602;
+
+ // aapt resource value: 0x7f020063
+ public const int ic_collapse_00005 = 2130837603;
+
+ // aapt resource value: 0x7f020064
+ public const int ic_collapse_00006 = 2130837604;
+
+ // aapt resource value: 0x7f020065
+ public const int ic_collapse_00007 = 2130837605;
+
+ // aapt resource value: 0x7f020066
+ public const int ic_collapse_00008 = 2130837606;
+
+ // aapt resource value: 0x7f020067
+ public const int ic_collapse_00009 = 2130837607;
+
+ // aapt resource value: 0x7f020068
+ public const int ic_collapse_00010 = 2130837608;
+
+ // aapt resource value: 0x7f020069
+ public const int ic_collapse_00011 = 2130837609;
+
+ // aapt resource value: 0x7f02006a
+ public const int ic_collapse_00012 = 2130837610;
+
+ // aapt resource value: 0x7f02006b
+ public const int ic_collapse_00013 = 2130837611;
+
+ // aapt resource value: 0x7f02006c
+ public const int ic_collapse_00014 = 2130837612;
+
+ // aapt resource value: 0x7f02006d
+ public const int ic_collapse_00015 = 2130837613;
+
+ // aapt resource value: 0x7f02006e
+ public const int ic_expand = 2130837614;
+
+ // aapt resource value: 0x7f02006f
+ public const int ic_expand_00000 = 2130837615;
+
+ // aapt resource value: 0x7f020070
+ public const int ic_expand_00001 = 2130837616;
+
+ // aapt resource value: 0x7f020071
+ public const int ic_expand_00002 = 2130837617;
+
+ // aapt resource value: 0x7f020072
+ public const int ic_expand_00003 = 2130837618;
+
+ // aapt resource value: 0x7f020073
+ public const int ic_expand_00004 = 2130837619;
+
+ // aapt resource value: 0x7f020074
+ public const int ic_expand_00005 = 2130837620;
+
+ // aapt resource value: 0x7f020075
+ public const int ic_expand_00006 = 2130837621;
+
+ // aapt resource value: 0x7f020076
+ public const int ic_expand_00007 = 2130837622;
+
+ // aapt resource value: 0x7f020077
+ public const int ic_expand_00008 = 2130837623;
+
+ // aapt resource value: 0x7f020078
+ public const int ic_expand_00009 = 2130837624;
+
+ // aapt resource value: 0x7f020079
+ public const int ic_expand_00010 = 2130837625;
+
+ // aapt resource value: 0x7f02007a
+ public const int ic_expand_00011 = 2130837626;
+
+ // aapt resource value: 0x7f02007b
+ public const int ic_expand_00012 = 2130837627;
+
+ // aapt resource value: 0x7f02007c
+ public const int ic_expand_00013 = 2130837628;
+
+ // aapt resource value: 0x7f02007d
+ public const int ic_expand_00014 = 2130837629;
+
+ // aapt resource value: 0x7f02007e
+ public const int ic_expand_00015 = 2130837630;
+
+ // aapt resource value: 0x7f02007f
+ public const int ic_media_pause = 2130837631;
+
+ // aapt resource value: 0x7f020080
+ public const int ic_media_play = 2130837632;
+
+ // aapt resource value: 0x7f020081
+ public const int ic_media_route_disabled_mono_dark = 2130837633;
+
+ // aapt resource value: 0x7f020082
+ public const int ic_media_route_off_mono_dark = 2130837634;
+
+ // aapt resource value: 0x7f020083
+ public const int ic_media_route_on_0_mono_dark = 2130837635;
+
+ // aapt resource value: 0x7f020084
+ public const int ic_media_route_on_1_mono_dark = 2130837636;
+
+ // aapt resource value: 0x7f020085
+ public const int ic_media_route_on_2_mono_dark = 2130837637;
+
+ // aapt resource value: 0x7f020086
+ public const int ic_media_route_on_mono_dark = 2130837638;
+
+ // aapt resource value: 0x7f020087
+ public const int ic_pause_dark = 2130837639;
+
+ // aapt resource value: 0x7f020088
+ public const int ic_pause_light = 2130837640;
+
+ // aapt resource value: 0x7f020089
+ public const int ic_play_dark = 2130837641;
+
+ // aapt resource value: 0x7f02008a
+ public const int ic_play_light = 2130837642;
+
+ // aapt resource value: 0x7f02008b
+ public const int ic_speaker_dark = 2130837643;
+
+ // aapt resource value: 0x7f02008c
+ public const int ic_speaker_group_dark = 2130837644;
+
+ // aapt resource value: 0x7f02008d
+ public const int ic_speaker_group_light = 2130837645;
+
+ // aapt resource value: 0x7f02008e
+ public const int ic_speaker_light = 2130837646;
+
+ // aapt resource value: 0x7f02008f
+ public const int ic_tv_dark = 2130837647;
+
+ // aapt resource value: 0x7f020090
+ public const int ic_tv_light = 2130837648;
+
+ // aapt resource value: 0x7f020091
+ public const int icon = 2130837649;
+
+ // aapt resource value: 0x7f020092
+ public const int mr_dialog_material_background_dark = 2130837650;
+
+ // aapt resource value: 0x7f020093
+ public const int mr_dialog_material_background_light = 2130837651;
+
+ // aapt resource value: 0x7f020094
+ public const int mr_ic_audiotrack_light = 2130837652;
+
+ // aapt resource value: 0x7f020095
+ public const int mr_ic_cast_dark = 2130837653;
+
+ // aapt resource value: 0x7f020096
+ public const int mr_ic_cast_light = 2130837654;
+
+ // aapt resource value: 0x7f020097
+ public const int mr_ic_close_dark = 2130837655;
+
+ // aapt resource value: 0x7f020098
+ public const int mr_ic_close_light = 2130837656;
+
+ // aapt resource value: 0x7f020099
+ public const int mr_ic_media_route_connecting_mono_dark = 2130837657;
+
+ // aapt resource value: 0x7f02009a
+ public const int mr_ic_media_route_connecting_mono_light = 2130837658;
+
+ // aapt resource value: 0x7f02009b
+ public const int mr_ic_media_route_mono_dark = 2130837659;
+
+ // aapt resource value: 0x7f02009c
+ public const int mr_ic_media_route_mono_light = 2130837660;
+
+ // aapt resource value: 0x7f02009d
+ public const int mr_ic_pause_dark = 2130837661;
+
+ // aapt resource value: 0x7f02009e
+ public const int mr_ic_pause_light = 2130837662;
+
+ // aapt resource value: 0x7f02009f
+ public const int mr_ic_play_dark = 2130837663;
+
+ // aapt resource value: 0x7f0200a0
+ public const int mr_ic_play_light = 2130837664;
+
+ // aapt resource value: 0x7f0200a1
+ public const int notification_template_icon_bg = 2130837665;
+
+ static Drawable()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Drawable()
+ {
+ }
+ }
+
+ public partial class Id
+ {
+
+ // aapt resource value: 0x7f07008b
+ public const int action0 = 2131165323;
+
+ // aapt resource value: 0x7f07005a
+ public const int action_bar = 2131165274;
+
+ // aapt resource value: 0x7f070001
+ public const int action_bar_activity_content = 2131165185;
+
+ // aapt resource value: 0x7f070059
+ public const int action_bar_container = 2131165273;
+
+ // aapt resource value: 0x7f070055
+ public const int action_bar_root = 2131165269;
+
+ // aapt resource value: 0x7f070002
+ public const int action_bar_spinner = 2131165186;
+
+ // aapt resource value: 0x7f07003b
+ public const int action_bar_subtitle = 2131165243;
+
+ // aapt resource value: 0x7f07003a
+ public const int action_bar_title = 2131165242;
+
+ // aapt resource value: 0x7f07005b
+ public const int action_context_bar = 2131165275;
+
+ // aapt resource value: 0x7f07008f
+ public const int action_divider = 2131165327;
+
+ // aapt resource value: 0x7f070003
+ public const int action_menu_divider = 2131165187;
+
+ // aapt resource value: 0x7f070004
+ public const int action_menu_presenter = 2131165188;
+
+ // aapt resource value: 0x7f070057
+ public const int action_mode_bar = 2131165271;
+
+ // aapt resource value: 0x7f070056
+ public const int action_mode_bar_stub = 2131165270;
+
+ // aapt resource value: 0x7f07003c
+ public const int action_mode_close_button = 2131165244;
+
+ // aapt resource value: 0x7f07003d
+ public const int activity_chooser_view_content = 2131165245;
+
+ // aapt resource value: 0x7f070049
+ public const int alertTitle = 2131165257;
+
+ // aapt resource value: 0x7f07001e
+ public const int always = 2131165214;
+
+ // aapt resource value: 0x7f07001b
+ public const int beginning = 2131165211;
+
+ // aapt resource value: 0x7f07002a
+ public const int bottom = 2131165226;
+
+ // aapt resource value: 0x7f070044
+ public const int buttonPanel = 2131165252;
+
+ // aapt resource value: 0x7f07008c
+ public const int cancel_action = 2131165324;
+
+ // aapt resource value: 0x7f07002b
+ public const int center = 2131165227;
+
+ // aapt resource value: 0x7f07002c
+ public const int center_horizontal = 2131165228;
+
+ // aapt resource value: 0x7f07002d
+ public const int center_vertical = 2131165229;
+
+ // aapt resource value: 0x7f070052
+ public const int checkbox = 2131165266;
+
+ // aapt resource value: 0x7f070092
+ public const int chronometer = 2131165330;
+
+ // aapt resource value: 0x7f070033
+ public const int clip_horizontal = 2131165235;
+
+ // aapt resource value: 0x7f070034
+ public const int clip_vertical = 2131165236;
+
+ // aapt resource value: 0x7f07001f
+ public const int collapseActionView = 2131165215;
+
+ // aapt resource value: 0x7f07004a
+ public const int contentPanel = 2131165258;
+
+ // aapt resource value: 0x7f070050
+ public const int custom = 2131165264;
+
+ // aapt resource value: 0x7f07004f
+ public const int customPanel = 2131165263;
+
+ // aapt resource value: 0x7f070058
+ public const int decor_content_parent = 2131165272;
+
+ // aapt resource value: 0x7f070040
+ public const int default_activity_button = 2131165248;
+
+ // aapt resource value: 0x7f07006a
+ public const int design_bottom_sheet = 2131165290;
+
+ // aapt resource value: 0x7f070071
+ public const int design_menu_item_action_area = 2131165297;
+
+ // aapt resource value: 0x7f070070
+ public const int design_menu_item_action_area_stub = 2131165296;
+
+ // aapt resource value: 0x7f07006f
+ public const int design_menu_item_text = 2131165295;
+
+ // aapt resource value: 0x7f07006e
+ public const int design_navigation_view = 2131165294;
+
+ // aapt resource value: 0x7f07000e
+ public const int disableHome = 2131165198;
+
+ // aapt resource value: 0x7f07005c
+ public const int edit_query = 2131165276;
+
+ // aapt resource value: 0x7f07001c
+ public const int end = 2131165212;
+
+ // aapt resource value: 0x7f070097
+ public const int end_padder = 2131165335;
+
+ // aapt resource value: 0x7f070023
+ public const int enterAlways = 2131165219;
+
+ // aapt resource value: 0x7f070024
+ public const int enterAlwaysCollapsed = 2131165220;
+
+ // aapt resource value: 0x7f070025
+ public const int exitUntilCollapsed = 2131165221;
+
+ // aapt resource value: 0x7f07003e
+ public const int expand_activities_button = 2131165246;
+
+ // aapt resource value: 0x7f070051
+ public const int expanded_menu = 2131165265;
+
+ // aapt resource value: 0x7f070035
+ public const int fill = 2131165237;
+
+ // aapt resource value: 0x7f070036
+ public const int fill_horizontal = 2131165238;
+
+ // aapt resource value: 0x7f07002e
+ public const int fill_vertical = 2131165230;
+
+ // aapt resource value: 0x7f070038
+ public const int @fixed = 2131165240;
+
+ // aapt resource value: 0x7f070005
+ public const int home = 2131165189;
+
+ // aapt resource value: 0x7f07000f
+ public const int homeAsUp = 2131165199;
+
+ // aapt resource value: 0x7f070042
+ public const int icon = 2131165250;
+
+ // aapt resource value: 0x7f070020
+ public const int ifRoom = 2131165216;
+
+ // aapt resource value: 0x7f07003f
+ public const int image = 2131165247;
+
+ // aapt resource value: 0x7f070096
+ public const int info = 2131165334;
+
+ // aapt resource value: 0x7f070000
+ public const int item_touch_helper_previous_elevation = 2131165184;
+
+ // aapt resource value: 0x7f07002f
+ public const int left = 2131165231;
+
+ // aapt resource value: 0x7f070090
+ public const int line1 = 2131165328;
+
+ // aapt resource value: 0x7f070094
+ public const int line3 = 2131165332;
+
+ // aapt resource value: 0x7f07000b
+ public const int listMode = 2131165195;
+
+ // aapt resource value: 0x7f070041
+ public const int list_item = 2131165249;
+
+ // aapt resource value: 0x7f07008e
+ public const int media_actions = 2131165326;
+
+ // aapt resource value: 0x7f07001d
+ public const int middle = 2131165213;
+
+ // aapt resource value: 0x7f070037
+ public const int mini = 2131165239;
+
+ // aapt resource value: 0x7f07007d
+ public const int mr_art = 2131165309;
+
+ // aapt resource value: 0x7f070072
+ public const int mr_chooser_list = 2131165298;
+
+ // aapt resource value: 0x7f070075
+ public const int mr_chooser_route_desc = 2131165301;
+
+ // aapt resource value: 0x7f070073
+ public const int mr_chooser_route_icon = 2131165299;
+
+ // aapt resource value: 0x7f070074
+ public const int mr_chooser_route_name = 2131165300;
+
+ // aapt resource value: 0x7f07007a
+ public const int mr_close = 2131165306;
+
+ // aapt resource value: 0x7f070080
+ public const int mr_control_divider = 2131165312;
+
+ // aapt resource value: 0x7f070086
+ public const int mr_control_play_pause = 2131165318;
+
+ // aapt resource value: 0x7f070089
+ public const int mr_control_subtitle = 2131165321;
+
+ // aapt resource value: 0x7f070088
+ public const int mr_control_title = 2131165320;
+
+ // aapt resource value: 0x7f070087
+ public const int mr_control_title_container = 2131165319;
+
+ // aapt resource value: 0x7f07007b
+ public const int mr_custom_control = 2131165307;
+
+ // aapt resource value: 0x7f07007c
+ public const int mr_default_control = 2131165308;
+
+ // aapt resource value: 0x7f070077
+ public const int mr_dialog_area = 2131165303;
+
+ // aapt resource value: 0x7f070076
+ public const int mr_expandable_area = 2131165302;
+
+ // aapt resource value: 0x7f07008a
+ public const int mr_group_expand_collapse = 2131165322;
+
+ // aapt resource value: 0x7f07007e
+ public const int mr_media_main_control = 2131165310;
+
+ // aapt resource value: 0x7f070079
+ public const int mr_name = 2131165305;
+
+ // aapt resource value: 0x7f07007f
+ public const int mr_playback_control = 2131165311;
+
+ // aapt resource value: 0x7f070078
+ public const int mr_title_bar = 2131165304;
+
+ // aapt resource value: 0x7f070081
+ public const int mr_volume_control = 2131165313;
+
+ // aapt resource value: 0x7f070082
+ public const int mr_volume_group_list = 2131165314;
+
+ // aapt resource value: 0x7f070084
+ public const int mr_volume_item_icon = 2131165316;
+
+ // aapt resource value: 0x7f070085
+ public const int mr_volume_slider = 2131165317;
+
+ // aapt resource value: 0x7f070016
+ public const int multiply = 2131165206;
+
+ // aapt resource value: 0x7f07006d
+ public const int navigation_header_container = 2131165293;
+
+ // aapt resource value: 0x7f070021
+ public const int never = 2131165217;
+
+ // aapt resource value: 0x7f070010
+ public const int none = 2131165200;
+
+ // aapt resource value: 0x7f07000c
+ public const int normal = 2131165196;
+
+ // aapt resource value: 0x7f070028
+ public const int parallax = 2131165224;
+
+ // aapt resource value: 0x7f070046
+ public const int parentPanel = 2131165254;
+
+ // aapt resource value: 0x7f070029
+ public const int pin = 2131165225;
+
+ // aapt resource value: 0x7f070006
+ public const int progress_circular = 2131165190;
+
+ // aapt resource value: 0x7f070007
+ public const int progress_horizontal = 2131165191;
+
+ // aapt resource value: 0x7f070054
+ public const int radio = 2131165268;
+
+ // aapt resource value: 0x7f070030
+ public const int right = 2131165232;
+
+ // aapt resource value: 0x7f070017
+ public const int screen = 2131165207;
+
+ // aapt resource value: 0x7f070026
+ public const int scroll = 2131165222;
+
+ // aapt resource value: 0x7f07004e
+ public const int scrollIndicatorDown = 2131165262;
+
+ // aapt resource value: 0x7f07004b
+ public const int scrollIndicatorUp = 2131165259;
+
+ // aapt resource value: 0x7f07004c
+ public const int scrollView = 2131165260;
+
+ // aapt resource value: 0x7f070039
+ public const int scrollable = 2131165241;
+
+ // aapt resource value: 0x7f07005e
+ public const int search_badge = 2131165278;
+
+ // aapt resource value: 0x7f07005d
+ public const int search_bar = 2131165277;
+
+ // aapt resource value: 0x7f07005f
+ public const int search_button = 2131165279;
+
+ // aapt resource value: 0x7f070064
+ public const int search_close_btn = 2131165284;
+
+ // aapt resource value: 0x7f070060
+ public const int search_edit_frame = 2131165280;
+
+ // aapt resource value: 0x7f070066
+ public const int search_go_btn = 2131165286;
+
+ // aapt resource value: 0x7f070061
+ public const int search_mag_icon = 2131165281;
+
+ // aapt resource value: 0x7f070062
+ public const int search_plate = 2131165282;
+
+ // aapt resource value: 0x7f070063
+ public const int search_src_text = 2131165283;
+
+ // aapt resource value: 0x7f070067
+ public const int search_voice_btn = 2131165287;
+
+ // aapt resource value: 0x7f070068
+ public const int select_dialog_listview = 2131165288;
+
+ // aapt resource value: 0x7f070053
+ public const int shortcut = 2131165267;
+
+ // aapt resource value: 0x7f070011
+ public const int showCustom = 2131165201;
+
+ // aapt resource value: 0x7f070012
+ public const int showHome = 2131165202;
+
+ // aapt resource value: 0x7f070013
+ public const int showTitle = 2131165203;
+
+ // aapt resource value: 0x7f070098
+ public const int sliding_tabs = 2131165336;
+
+ // aapt resource value: 0x7f07006c
+ public const int snackbar_action = 2131165292;
+
+ // aapt resource value: 0x7f07006b
+ public const int snackbar_text = 2131165291;
+
+ // aapt resource value: 0x7f070027
+ public const int snap = 2131165223;
+
+ // aapt resource value: 0x7f070045
+ public const int spacer = 2131165253;
+
+ // aapt resource value: 0x7f070008
+ public const int split_action_bar = 2131165192;
+
+ // aapt resource value: 0x7f070018
+ public const int src_atop = 2131165208;
+
+ // aapt resource value: 0x7f070019
+ public const int src_in = 2131165209;
+
+ // aapt resource value: 0x7f07001a
+ public const int src_over = 2131165210;
+
+ // aapt resource value: 0x7f070031
+ public const int start = 2131165233;
+
+ // aapt resource value: 0x7f07008d
+ public const int status_bar_latest_event_content = 2131165325;
+
+ // aapt resource value: 0x7f070065
+ public const int submit_area = 2131165285;
+
+ // aapt resource value: 0x7f07000d
+ public const int tabMode = 2131165197;
+
+ // aapt resource value: 0x7f070095
+ public const int text = 2131165333;
+
+ // aapt resource value: 0x7f070093
+ public const int text2 = 2131165331;
+
+ // aapt resource value: 0x7f07004d
+ public const int textSpacerNoButtons = 2131165261;
+
+ // aapt resource value: 0x7f070091
+ public const int time = 2131165329;
+
+ // aapt resource value: 0x7f070043
+ public const int title = 2131165251;
+
+ // aapt resource value: 0x7f070048
+ public const int title_template = 2131165256;
+
+ // aapt resource value: 0x7f070099
+ public const int toolbar = 2131165337;
+
+ // aapt resource value: 0x7f070032
+ public const int top = 2131165234;
+
+ // aapt resource value: 0x7f070047
+ public const int topPanel = 2131165255;
+
+ // aapt resource value: 0x7f070069
+ public const int touch_outside = 2131165289;
+
+ // aapt resource value: 0x7f070009
+ public const int up = 2131165193;
+
+ // aapt resource value: 0x7f070014
+ public const int useLogo = 2131165204;
+
+ // aapt resource value: 0x7f07000a
+ public const int view_offset_helper = 2131165194;
+
+ // aapt resource value: 0x7f070083
+ public const int volume_item_container = 2131165315;
+
+ // aapt resource value: 0x7f070022
+ public const int withText = 2131165218;
+
+ // aapt resource value: 0x7f070015
+ public const int wrap_content = 2131165205;
+
+ static Id()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Id()
+ {
+ }
+ }
+
+ public partial class Integer
+ {
+
+ // aapt resource value: 0x7f090004
+ public const int abc_config_activityDefaultDur = 2131296260;
+
+ // aapt resource value: 0x7f090005
+ public const int abc_config_activityShortDur = 2131296261;
+
+ // aapt resource value: 0x7f090003
+ public const int abc_max_action_buttons = 2131296259;
+
+ // aapt resource value: 0x7f090009
+ public const int bottom_sheet_slide_duration = 2131296265;
+
+ // aapt resource value: 0x7f090006
+ public const int cancel_button_image_alpha = 2131296262;
+
+ // aapt resource value: 0x7f090008
+ public const int design_snackbar_text_max_lines = 2131296264;
+
+ // aapt resource value: 0x7f090000
+ public const int mr_controller_volume_group_list_animation_duration_ms = 2131296256;
+
+ // aapt resource value: 0x7f090001
+ public const int mr_controller_volume_group_list_fade_in_duration_ms = 2131296257;
+
+ // aapt resource value: 0x7f090002
+ public const int mr_controller_volume_group_list_fade_out_duration_ms = 2131296258;
+
+ // aapt resource value: 0x7f090007
+ public const int status_bar_notification_info_maxnum = 2131296263;
+
+ static Integer()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Integer()
+ {
+ }
+ }
+
+ public partial class Interpolator
+ {
+
+ // aapt resource value: 0x7f050000
+ public const int mr_fast_out_slow_in = 2131034112;
+
+ // aapt resource value: 0x7f050001
+ public const int mr_linear_out_slow_in = 2131034113;
+
+ static Interpolator()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Interpolator()
+ {
+ }
+ }
+
+ public partial class Layout
+ {
+
+ // aapt resource value: 0x7f030000
+ public const int abc_action_bar_title_item = 2130903040;
+
+ // aapt resource value: 0x7f030001
+ public const int abc_action_bar_up_container = 2130903041;
+
+ // aapt resource value: 0x7f030002
+ public const int abc_action_bar_view_list_nav_layout = 2130903042;
+
+ // aapt resource value: 0x7f030003
+ public const int abc_action_menu_item_layout = 2130903043;
+
+ // aapt resource value: 0x7f030004
+ public const int abc_action_menu_layout = 2130903044;
+
+ // aapt resource value: 0x7f030005
+ public const int abc_action_mode_bar = 2130903045;
+
+ // aapt resource value: 0x7f030006
+ public const int abc_action_mode_close_item_material = 2130903046;
+
+ // aapt resource value: 0x7f030007
+ public const int abc_activity_chooser_view = 2130903047;
+
+ // aapt resource value: 0x7f030008
+ public const int abc_activity_chooser_view_list_item = 2130903048;
+
+ // aapt resource value: 0x7f030009
+ public const int abc_alert_dialog_button_bar_material = 2130903049;
+
+ // aapt resource value: 0x7f03000a
+ public const int abc_alert_dialog_material = 2130903050;
+
+ // aapt resource value: 0x7f03000b
+ public const int abc_dialog_title_material = 2130903051;
+
+ // aapt resource value: 0x7f03000c
+ public const int abc_expanded_menu_layout = 2130903052;
+
+ // aapt resource value: 0x7f03000d
+ public const int abc_list_menu_item_checkbox = 2130903053;
+
+ // aapt resource value: 0x7f03000e
+ public const int abc_list_menu_item_icon = 2130903054;
+
+ // aapt resource value: 0x7f03000f
+ public const int abc_list_menu_item_layout = 2130903055;
+
+ // aapt resource value: 0x7f030010
+ public const int abc_list_menu_item_radio = 2130903056;
+
+ // aapt resource value: 0x7f030011
+ public const int abc_popup_menu_item_layout = 2130903057;
+
+ // aapt resource value: 0x7f030012
+ public const int abc_screen_content_include = 2130903058;
+
+ // aapt resource value: 0x7f030013
+ public const int abc_screen_simple = 2130903059;
+
+ // aapt resource value: 0x7f030014
+ public const int abc_screen_simple_overlay_action_mode = 2130903060;
+
+ // aapt resource value: 0x7f030015
+ public const int abc_screen_toolbar = 2130903061;
+
+ // aapt resource value: 0x7f030016
+ public const int abc_search_dropdown_item_icons_2line = 2130903062;
+
+ // aapt resource value: 0x7f030017
+ public const int abc_search_view = 2130903063;
+
+ // aapt resource value: 0x7f030018
+ public const int abc_select_dialog_material = 2130903064;
+
+ // aapt resource value: 0x7f030019
+ public const int design_bottom_sheet_dialog = 2130903065;
+
+ // aapt resource value: 0x7f03001a
+ public const int design_layout_snackbar = 2130903066;
+
+ // aapt resource value: 0x7f03001b
+ public const int design_layout_snackbar_include = 2130903067;
+
+ // aapt resource value: 0x7f03001c
+ public const int design_layout_tab_icon = 2130903068;
+
+ // aapt resource value: 0x7f03001d
+ public const int design_layout_tab_text = 2130903069;
+
+ // aapt resource value: 0x7f03001e
+ public const int design_menu_item_action_area = 2130903070;
+
+ // aapt resource value: 0x7f03001f
+ public const int design_navigation_item = 2130903071;
+
+ // aapt resource value: 0x7f030020
+ public const int design_navigation_item_header = 2130903072;
+
+ // aapt resource value: 0x7f030021
+ public const int design_navigation_item_separator = 2130903073;
+
+ // aapt resource value: 0x7f030022
+ public const int design_navigation_item_subheader = 2130903074;
+
+ // aapt resource value: 0x7f030023
+ public const int design_navigation_menu = 2130903075;
+
+ // aapt resource value: 0x7f030024
+ public const int design_navigation_menu_item = 2130903076;
+
+ // aapt resource value: 0x7f030025
+ public const int mr_chooser_dialog = 2130903077;
+
+ // aapt resource value: 0x7f030026
+ public const int mr_chooser_list_item = 2130903078;
+
+ // aapt resource value: 0x7f030027
+ public const int mr_controller_material_dialog_b = 2130903079;
+
+ // aapt resource value: 0x7f030028
+ public const int mr_controller_volume_item = 2130903080;
+
+ // aapt resource value: 0x7f030029
+ public const int mr_playback_control = 2130903081;
+
+ // aapt resource value: 0x7f03002a
+ public const int mr_volume_control = 2130903082;
+
+ // aapt resource value: 0x7f03002b
+ public const int notification_media_action = 2130903083;
+
+ // aapt resource value: 0x7f03002c
+ public const int notification_media_cancel_action = 2130903084;
+
+ // aapt resource value: 0x7f03002d
+ public const int notification_template_big_media = 2130903085;
+
+ // aapt resource value: 0x7f03002e
+ public const int notification_template_big_media_narrow = 2130903086;
+
+ // aapt resource value: 0x7f03002f
+ public const int notification_template_lines = 2130903087;
+
+ // aapt resource value: 0x7f030030
+ public const int notification_template_media = 2130903088;
+
+ // aapt resource value: 0x7f030031
+ public const int notification_template_part_chronometer = 2130903089;
+
+ // aapt resource value: 0x7f030032
+ public const int notification_template_part_time = 2130903090;
+
+ // aapt resource value: 0x7f030033
+ public const int select_dialog_item_material = 2130903091;
+
+ // aapt resource value: 0x7f030034
+ public const int select_dialog_multichoice_material = 2130903092;
+
+ // aapt resource value: 0x7f030035
+ public const int select_dialog_singlechoice_material = 2130903093;
+
+ // aapt resource value: 0x7f030036
+ public const int support_simple_spinner_dropdown_item = 2130903094;
+
+ // aapt resource value: 0x7f030037
+ public const int Tabbar = 2130903095;
+
+ // aapt resource value: 0x7f030038
+ public const int Toolbar = 2130903096;
+
+ static Layout()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Layout()
+ {
+ }
+ }
+
+ public partial class String
+ {
+
+ // aapt resource value: 0x7f08000f
+ public const int abc_action_bar_home_description = 2131230735;
+
+ // aapt resource value: 0x7f080010
+ public const int abc_action_bar_home_description_format = 2131230736;
+
+ // aapt resource value: 0x7f080011
+ public const int abc_action_bar_home_subtitle_description_format = 2131230737;
+
+ // aapt resource value: 0x7f080012
+ public const int abc_action_bar_up_description = 2131230738;
+
+ // aapt resource value: 0x7f080013
+ public const int abc_action_menu_overflow_description = 2131230739;
+
+ // aapt resource value: 0x7f080014
+ public const int abc_action_mode_done = 2131230740;
+
+ // aapt resource value: 0x7f080015
+ public const int abc_activity_chooser_view_see_all = 2131230741;
+
+ // aapt resource value: 0x7f080016
+ public const int abc_activitychooserview_choose_application = 2131230742;
+
+ // aapt resource value: 0x7f080017
+ public const int abc_capital_off = 2131230743;
+
+ // aapt resource value: 0x7f080018
+ public const int abc_capital_on = 2131230744;
+
+ // aapt resource value: 0x7f080019
+ public const int abc_search_hint = 2131230745;
+
+ // aapt resource value: 0x7f08001a
+ public const int abc_searchview_description_clear = 2131230746;
+
+ // aapt resource value: 0x7f08001b
+ public const int abc_searchview_description_query = 2131230747;
+
+ // aapt resource value: 0x7f08001c
+ public const int abc_searchview_description_search = 2131230748;
+
+ // aapt resource value: 0x7f08001d
+ public const int abc_searchview_description_submit = 2131230749;
+
+ // aapt resource value: 0x7f08001e
+ public const int abc_searchview_description_voice = 2131230750;
+
+ // aapt resource value: 0x7f08001f
+ public const int abc_shareactionprovider_share_with = 2131230751;
+
+ // aapt resource value: 0x7f080020
+ public const int abc_shareactionprovider_share_with_application = 2131230752;
+
+ // aapt resource value: 0x7f080021
+ public const int abc_toolbar_collapse_description = 2131230753;
+
+ // aapt resource value: 0x7f080023
+ public const int appbar_scrolling_view_behavior = 2131230755;
+
+ // aapt resource value: 0x7f080024
+ public const int bottom_sheet_behavior = 2131230756;
+
+ // aapt resource value: 0x7f080025
+ public const int character_counter_pattern = 2131230757;
+
+ // aapt resource value: 0x7f080000
+ public const int mr_button_content_description = 2131230720;
+
+ // aapt resource value: 0x7f080001
+ public const int mr_chooser_searching = 2131230721;
+
+ // aapt resource value: 0x7f080002
+ public const int mr_chooser_title = 2131230722;
+
+ // aapt resource value: 0x7f080003
+ public const int mr_controller_casting_screen = 2131230723;
+
+ // aapt resource value: 0x7f080004
+ public const int mr_controller_close_description = 2131230724;
+
+ // aapt resource value: 0x7f080005
+ public const int mr_controller_collapse_group = 2131230725;
+
+ // aapt resource value: 0x7f080006
+ public const int mr_controller_disconnect = 2131230726;
+
+ // aapt resource value: 0x7f080007
+ public const int mr_controller_expand_group = 2131230727;
+
+ // aapt resource value: 0x7f080008
+ public const int mr_controller_no_info_available = 2131230728;
+
+ // aapt resource value: 0x7f080009
+ public const int mr_controller_no_media_selected = 2131230729;
+
+ // aapt resource value: 0x7f08000a
+ public const int mr_controller_pause = 2131230730;
+
+ // aapt resource value: 0x7f08000b
+ public const int mr_controller_play = 2131230731;
+
+ // aapt resource value: 0x7f08000c
+ public const int mr_controller_stop = 2131230732;
+
+ // aapt resource value: 0x7f08000d
+ public const int mr_system_route_name = 2131230733;
+
+ // aapt resource value: 0x7f08000e
+ public const int mr_user_route_category_name = 2131230734;
+
+ // aapt resource value: 0x7f080022
+ public const int status_bar_notification_info_overflow = 2131230754;
+
+ static String()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private String()
+ {
+ }
+ }
+
+ public partial class Style
+ {
+
+ // aapt resource value: 0x7f0a00a1
+ public const int AlertDialog_AppCompat = 2131361953;
+
+ // aapt resource value: 0x7f0a00a2
+ public const int AlertDialog_AppCompat_Light = 2131361954;
+
+ // aapt resource value: 0x7f0a00a3
+ public const int Animation_AppCompat_Dialog = 2131361955;
+
+ // aapt resource value: 0x7f0a00a4
+ public const int Animation_AppCompat_DropDownUp = 2131361956;
+
+ // aapt resource value: 0x7f0a015a
+ public const int Animation_Design_BottomSheetDialog = 2131362138;
+
+ // aapt resource value: 0x7f0a0174
+ public const int AppCompatDialogStyle = 2131362164;
+
+ // aapt resource value: 0x7f0a00a5
+ public const int Base_AlertDialog_AppCompat = 2131361957;
+
+ // aapt resource value: 0x7f0a00a6
+ public const int Base_AlertDialog_AppCompat_Light = 2131361958;
+
+ // aapt resource value: 0x7f0a00a7
+ public const int Base_Animation_AppCompat_Dialog = 2131361959;
+
+ // aapt resource value: 0x7f0a00a8
+ public const int Base_Animation_AppCompat_DropDownUp = 2131361960;
+
+ // aapt resource value: 0x7f0a0018
+ public const int Base_CardView = 2131361816;
+
+ // aapt resource value: 0x7f0a00a9
+ public const int Base_DialogWindowTitle_AppCompat = 2131361961;
+
+ // aapt resource value: 0x7f0a00aa
+ public const int Base_DialogWindowTitleBackground_AppCompat = 2131361962;
+
+ // aapt resource value: 0x7f0a0051
+ public const int Base_TextAppearance_AppCompat = 2131361873;
+
+ // aapt resource value: 0x7f0a0052
+ public const int Base_TextAppearance_AppCompat_Body1 = 2131361874;
+
+ // aapt resource value: 0x7f0a0053
+ public const int Base_TextAppearance_AppCompat_Body2 = 2131361875;
+
+ // aapt resource value: 0x7f0a003b
+ public const int Base_TextAppearance_AppCompat_Button = 2131361851;
+
+ // aapt resource value: 0x7f0a0054
+ public const int Base_TextAppearance_AppCompat_Caption = 2131361876;
+
+ // aapt resource value: 0x7f0a0055
+ public const int Base_TextAppearance_AppCompat_Display1 = 2131361877;
+
+ // aapt resource value: 0x7f0a0056
+ public const int Base_TextAppearance_AppCompat_Display2 = 2131361878;
+
+ // aapt resource value: 0x7f0a0057
+ public const int Base_TextAppearance_AppCompat_Display3 = 2131361879;
+
+ // aapt resource value: 0x7f0a0058
+ public const int Base_TextAppearance_AppCompat_Display4 = 2131361880;
+
+ // aapt resource value: 0x7f0a0059
+ public const int Base_TextAppearance_AppCompat_Headline = 2131361881;
+
+ // aapt resource value: 0x7f0a0026
+ public const int Base_TextAppearance_AppCompat_Inverse = 2131361830;
+
+ // aapt resource value: 0x7f0a005a
+ public const int Base_TextAppearance_AppCompat_Large = 2131361882;
+
+ // aapt resource value: 0x7f0a0027
+ public const int Base_TextAppearance_AppCompat_Large_Inverse = 2131361831;
+
+ // aapt resource value: 0x7f0a005b
+ public const int Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Large = 2131361883;
+
+ // aapt resource value: 0x7f0a005c
+ public const int Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Small = 2131361884;
+
+ // aapt resource value: 0x7f0a005d
+ public const int Base_TextAppearance_AppCompat_Medium = 2131361885;
+
+ // aapt resource value: 0x7f0a0028
+ public const int Base_TextAppearance_AppCompat_Medium_Inverse = 2131361832;
+
+ // aapt resource value: 0x7f0a005e
+ public const int Base_TextAppearance_AppCompat_Menu = 2131361886;
+
+ // aapt resource value: 0x7f0a00ab
+ public const int Base_TextAppearance_AppCompat_SearchResult = 2131361963;
+
+ // aapt resource value: 0x7f0a005f
+ public const int Base_TextAppearance_AppCompat_SearchResult_Subtitle = 2131361887;
+
+ // aapt resource value: 0x7f0a0060
+ public const int Base_TextAppearance_AppCompat_SearchResult_Title = 2131361888;
+
+ // aapt resource value: 0x7f0a0061
+ public const int Base_TextAppearance_AppCompat_Small = 2131361889;
+
+ // aapt resource value: 0x7f0a0029
+ public const int Base_TextAppearance_AppCompat_Small_Inverse = 2131361833;
+
+ // aapt resource value: 0x7f0a0062
+ public const int Base_TextAppearance_AppCompat_Subhead = 2131361890;
+
+ // aapt resource value: 0x7f0a002a
+ public const int Base_TextAppearance_AppCompat_Subhead_Inverse = 2131361834;
+
+ // aapt resource value: 0x7f0a0063
+ public const int Base_TextAppearance_AppCompat_Title = 2131361891;
+
+ // aapt resource value: 0x7f0a002b
+ public const int Base_TextAppearance_AppCompat_Title_Inverse = 2131361835;
+
+ // aapt resource value: 0x7f0a009a
+ public const int Base_TextAppearance_AppCompat_Widget_ActionBar_Menu = 2131361946;
+
+ // aapt resource value: 0x7f0a0064
+ public const int Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle = 2131361892;
+
+ // aapt resource value: 0x7f0a0065
+ public const int Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse = 2131361893;
+
+ // aapt resource value: 0x7f0a0066
+ public const int Base_TextAppearance_AppCompat_Widget_ActionBar_Title = 2131361894;
+
+ // aapt resource value: 0x7f0a0067
+ public const int Base_TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse = 2131361895;
+
+ // aapt resource value: 0x7f0a0068
+ public const int Base_TextAppearance_AppCompat_Widget_ActionMode_Subtitle = 2131361896;
+
+ // aapt resource value: 0x7f0a0069
+ public const int Base_TextAppearance_AppCompat_Widget_ActionMode_Title = 2131361897;
+
+ // aapt resource value: 0x7f0a006a
+ public const int Base_TextAppearance_AppCompat_Widget_Button = 2131361898;
+
+ // aapt resource value: 0x7f0a009b
+ public const int Base_TextAppearance_AppCompat_Widget_Button_Inverse = 2131361947;
+
+ // aapt resource value: 0x7f0a00ac
+ public const int Base_TextAppearance_AppCompat_Widget_DropDownItem = 2131361964;
+
+ // aapt resource value: 0x7f0a006b
+ public const int Base_TextAppearance_AppCompat_Widget_PopupMenu_Large = 2131361899;
+
+ // aapt resource value: 0x7f0a006c
+ public const int Base_TextAppearance_AppCompat_Widget_PopupMenu_Small = 2131361900;
+
+ // aapt resource value: 0x7f0a006d
+ public const int Base_TextAppearance_AppCompat_Widget_Switch = 2131361901;
+
+ // aapt resource value: 0x7f0a006e
+ public const int Base_TextAppearance_AppCompat_Widget_TextView_SpinnerItem = 2131361902;
+
+ // aapt resource value: 0x7f0a00ad
+ public const int Base_TextAppearance_Widget_AppCompat_ExpandedMenu_Item = 2131361965;
+
+ // aapt resource value: 0x7f0a006f
+ public const int Base_TextAppearance_Widget_AppCompat_Toolbar_Subtitle = 2131361903;
+
+ // aapt resource value: 0x7f0a0070
+ public const int Base_TextAppearance_Widget_AppCompat_Toolbar_Title = 2131361904;
+
+ // aapt resource value: 0x7f0a0071
+ public const int Base_Theme_AppCompat = 2131361905;
+
+ // aapt resource value: 0x7f0a00ae
+ public const int Base_Theme_AppCompat_CompactMenu = 2131361966;
+
+ // aapt resource value: 0x7f0a002c
+ public const int Base_Theme_AppCompat_Dialog = 2131361836;
+
+ // aapt resource value: 0x7f0a00af
+ public const int Base_Theme_AppCompat_Dialog_Alert = 2131361967;
+
+ // aapt resource value: 0x7f0a00b0
+ public const int Base_Theme_AppCompat_Dialog_FixedSize = 2131361968;
+
+ // aapt resource value: 0x7f0a00b1
+ public const int Base_Theme_AppCompat_Dialog_MinWidth = 2131361969;
+
+ // aapt resource value: 0x7f0a001c
+ public const int Base_Theme_AppCompat_DialogWhenLarge = 2131361820;
+
+ // aapt resource value: 0x7f0a0072
+ public const int Base_Theme_AppCompat_Light = 2131361906;
+
+ // aapt resource value: 0x7f0a00b2
+ public const int Base_Theme_AppCompat_Light_DarkActionBar = 2131361970;
+
+ // aapt resource value: 0x7f0a002d
+ public const int Base_Theme_AppCompat_Light_Dialog = 2131361837;
+
+ // aapt resource value: 0x7f0a00b3
+ public const int Base_Theme_AppCompat_Light_Dialog_Alert = 2131361971;
+
+ // aapt resource value: 0x7f0a00b4
+ public const int Base_Theme_AppCompat_Light_Dialog_FixedSize = 2131361972;
+
+ // aapt resource value: 0x7f0a00b5
+ public const int Base_Theme_AppCompat_Light_Dialog_MinWidth = 2131361973;
+
+ // aapt resource value: 0x7f0a001d
+ public const int Base_Theme_AppCompat_Light_DialogWhenLarge = 2131361821;
+
+ // aapt resource value: 0x7f0a00b6
+ public const int Base_ThemeOverlay_AppCompat = 2131361974;
+
+ // aapt resource value: 0x7f0a00b7
+ public const int Base_ThemeOverlay_AppCompat_ActionBar = 2131361975;
+
+ // aapt resource value: 0x7f0a00b8
+ public const int Base_ThemeOverlay_AppCompat_Dark = 2131361976;
+
+ // aapt resource value: 0x7f0a00b9
+ public const int Base_ThemeOverlay_AppCompat_Dark_ActionBar = 2131361977;
+
+ // aapt resource value: 0x7f0a00ba
+ public const int Base_ThemeOverlay_AppCompat_Light = 2131361978;
+
+ // aapt resource value: 0x7f0a002e
+ public const int Base_V11_Theme_AppCompat_Dialog = 2131361838;
+
+ // aapt resource value: 0x7f0a002f
+ public const int Base_V11_Theme_AppCompat_Light_Dialog = 2131361839;
+
+ // aapt resource value: 0x7f0a0037
+ public const int Base_V12_Widget_AppCompat_AutoCompleteTextView = 2131361847;
+
+ // aapt resource value: 0x7f0a0038
+ public const int Base_V12_Widget_AppCompat_EditText = 2131361848;
+
+ // aapt resource value: 0x7f0a0073
+ public const int Base_V21_Theme_AppCompat = 2131361907;
+
+ // aapt resource value: 0x7f0a0074
+ public const int Base_V21_Theme_AppCompat_Dialog = 2131361908;
+
+ // aapt resource value: 0x7f0a0075
+ public const int Base_V21_Theme_AppCompat_Light = 2131361909;
+
+ // aapt resource value: 0x7f0a0076
+ public const int Base_V21_Theme_AppCompat_Light_Dialog = 2131361910;
+
+ // aapt resource value: 0x7f0a0098
+ public const int Base_V22_Theme_AppCompat = 2131361944;
+
+ // aapt resource value: 0x7f0a0099
+ public const int Base_V22_Theme_AppCompat_Light = 2131361945;
+
+ // aapt resource value: 0x7f0a009c
+ public const int Base_V23_Theme_AppCompat = 2131361948;
+
+ // aapt resource value: 0x7f0a009d
+ public const int Base_V23_Theme_AppCompat_Light = 2131361949;
+
+ // aapt resource value: 0x7f0a00bb
+ public const int Base_V7_Theme_AppCompat = 2131361979;
+
+ // aapt resource value: 0x7f0a00bc
+ public const int Base_V7_Theme_AppCompat_Dialog = 2131361980;
+
+ // aapt resource value: 0x7f0a00bd
+ public const int Base_V7_Theme_AppCompat_Light = 2131361981;
+
+ // aapt resource value: 0x7f0a00be
+ public const int Base_V7_Theme_AppCompat_Light_Dialog = 2131361982;
+
+ // aapt resource value: 0x7f0a00bf
+ public const int Base_V7_Widget_AppCompat_AutoCompleteTextView = 2131361983;
+
+ // aapt resource value: 0x7f0a00c0
+ public const int Base_V7_Widget_AppCompat_EditText = 2131361984;
+
+ // aapt resource value: 0x7f0a00c1
+ public const int Base_Widget_AppCompat_ActionBar = 2131361985;
+
+ // aapt resource value: 0x7f0a00c2
+ public const int Base_Widget_AppCompat_ActionBar_Solid = 2131361986;
+
+ // aapt resource value: 0x7f0a00c3
+ public const int Base_Widget_AppCompat_ActionBar_TabBar = 2131361987;
+
+ // aapt resource value: 0x7f0a0077
+ public const int Base_Widget_AppCompat_ActionBar_TabText = 2131361911;
+
+ // aapt resource value: 0x7f0a0078
+ public const int Base_Widget_AppCompat_ActionBar_TabView = 2131361912;
+
+ // aapt resource value: 0x7f0a0079
+ public const int Base_Widget_AppCompat_ActionButton = 2131361913;
+
+ // aapt resource value: 0x7f0a007a
+ public const int Base_Widget_AppCompat_ActionButton_CloseMode = 2131361914;
+
+ // aapt resource value: 0x7f0a007b
+ public const int Base_Widget_AppCompat_ActionButton_Overflow = 2131361915;
+
+ // aapt resource value: 0x7f0a00c4
+ public const int Base_Widget_AppCompat_ActionMode = 2131361988;
+
+ // aapt resource value: 0x7f0a00c5
+ public const int Base_Widget_AppCompat_ActivityChooserView = 2131361989;
+
+ // aapt resource value: 0x7f0a0039
+ public const int Base_Widget_AppCompat_AutoCompleteTextView = 2131361849;
+
+ // aapt resource value: 0x7f0a007c
+ public const int Base_Widget_AppCompat_Button = 2131361916;
+
+ // aapt resource value: 0x7f0a007d
+ public const int Base_Widget_AppCompat_Button_Borderless = 2131361917;
+
+ // aapt resource value: 0x7f0a007e
+ public const int Base_Widget_AppCompat_Button_Borderless_Colored = 2131361918;
+
+ // aapt resource value: 0x7f0a00c6
+ public const int Base_Widget_AppCompat_Button_ButtonBar_AlertDialog = 2131361990;
+
+ // aapt resource value: 0x7f0a009e
+ public const int Base_Widget_AppCompat_Button_Colored = 2131361950;
+
+ // aapt resource value: 0x7f0a007f
+ public const int Base_Widget_AppCompat_Button_Small = 2131361919;
+
+ // aapt resource value: 0x7f0a0080
+ public const int Base_Widget_AppCompat_ButtonBar = 2131361920;
+
+ // aapt resource value: 0x7f0a00c7
+ public const int Base_Widget_AppCompat_ButtonBar_AlertDialog = 2131361991;
+
+ // aapt resource value: 0x7f0a0081
+ public const int Base_Widget_AppCompat_CompoundButton_CheckBox = 2131361921;
+
+ // aapt resource value: 0x7f0a0082
+ public const int Base_Widget_AppCompat_CompoundButton_RadioButton = 2131361922;
+
+ // aapt resource value: 0x7f0a00c8
+ public const int Base_Widget_AppCompat_CompoundButton_Switch = 2131361992;
+
+ // aapt resource value: 0x7f0a001b
+ public const int Base_Widget_AppCompat_DrawerArrowToggle = 2131361819;
+
+ // aapt resource value: 0x7f0a00c9
+ public const int Base_Widget_AppCompat_DrawerArrowToggle_Common = 2131361993;
+
+ // aapt resource value: 0x7f0a0083
+ public const int Base_Widget_AppCompat_DropDownItem_Spinner = 2131361923;
+
+ // aapt resource value: 0x7f0a003a
+ public const int Base_Widget_AppCompat_EditText = 2131361850;
+
+ // aapt resource value: 0x7f0a0084
+ public const int Base_Widget_AppCompat_ImageButton = 2131361924;
+
+ // aapt resource value: 0x7f0a00ca
+ public const int Base_Widget_AppCompat_Light_ActionBar = 2131361994;
+
+ // aapt resource value: 0x7f0a00cb
+ public const int Base_Widget_AppCompat_Light_ActionBar_Solid = 2131361995;
+
+ // aapt resource value: 0x7f0a00cc
+ public const int Base_Widget_AppCompat_Light_ActionBar_TabBar = 2131361996;
+
+ // aapt resource value: 0x7f0a0085
+ public const int Base_Widget_AppCompat_Light_ActionBar_TabText = 2131361925;
+
+ // aapt resource value: 0x7f0a0086
+ public const int Base_Widget_AppCompat_Light_ActionBar_TabText_Inverse = 2131361926;
+
+ // aapt resource value: 0x7f0a0087
+ public const int Base_Widget_AppCompat_Light_ActionBar_TabView = 2131361927;
+
+ // aapt resource value: 0x7f0a0088
+ public const int Base_Widget_AppCompat_Light_PopupMenu = 2131361928;
+
+ // aapt resource value: 0x7f0a0089
+ public const int Base_Widget_AppCompat_Light_PopupMenu_Overflow = 2131361929;
+
+ // aapt resource value: 0x7f0a008a
+ public const int Base_Widget_AppCompat_ListPopupWindow = 2131361930;
+
+ // aapt resource value: 0x7f0a008b
+ public const int Base_Widget_AppCompat_ListView = 2131361931;
+
+ // aapt resource value: 0x7f0a008c
+ public const int Base_Widget_AppCompat_ListView_DropDown = 2131361932;
+
+ // aapt resource value: 0x7f0a008d
+ public const int Base_Widget_AppCompat_ListView_Menu = 2131361933;
+
+ // aapt resource value: 0x7f0a008e
+ public const int Base_Widget_AppCompat_PopupMenu = 2131361934;
+
+ // aapt resource value: 0x7f0a008f
+ public const int Base_Widget_AppCompat_PopupMenu_Overflow = 2131361935;
+
+ // aapt resource value: 0x7f0a00cd
+ public const int Base_Widget_AppCompat_PopupWindow = 2131361997;
+
+ // aapt resource value: 0x7f0a0030
+ public const int Base_Widget_AppCompat_ProgressBar = 2131361840;
+
+ // aapt resource value: 0x7f0a0031
+ public const int Base_Widget_AppCompat_ProgressBar_Horizontal = 2131361841;
+
+ // aapt resource value: 0x7f0a0090
+ public const int Base_Widget_AppCompat_RatingBar = 2131361936;
+
+ // aapt resource value: 0x7f0a009f
+ public const int Base_Widget_AppCompat_RatingBar_Indicator = 2131361951;
+
+ // aapt resource value: 0x7f0a00a0
+ public const int Base_Widget_AppCompat_RatingBar_Small = 2131361952;
+
+ // aapt resource value: 0x7f0a00ce
+ public const int Base_Widget_AppCompat_SearchView = 2131361998;
+
+ // aapt resource value: 0x7f0a00cf
+ public const int Base_Widget_AppCompat_SearchView_ActionBar = 2131361999;
+
+ // aapt resource value: 0x7f0a0091
+ public const int Base_Widget_AppCompat_SeekBar = 2131361937;
+
+ // aapt resource value: 0x7f0a0092
+ public const int Base_Widget_AppCompat_Spinner = 2131361938;
+
+ // aapt resource value: 0x7f0a001e
+ public const int Base_Widget_AppCompat_Spinner_Underlined = 2131361822;
+
+ // aapt resource value: 0x7f0a0093
+ public const int Base_Widget_AppCompat_TextView_SpinnerItem = 2131361939;
+
+ // aapt resource value: 0x7f0a00d0
+ public const int Base_Widget_AppCompat_Toolbar = 2131362000;
+
+ // aapt resource value: 0x7f0a0094
+ public const int Base_Widget_AppCompat_Toolbar_Button_Navigation = 2131361940;
+
+ // aapt resource value: 0x7f0a015b
+ public const int Base_Widget_Design_TabLayout = 2131362139;
+
+ // aapt resource value: 0x7f0a0017
+ public const int CardView = 2131361815;
+
+ // aapt resource value: 0x7f0a0019
+ public const int CardView_Dark = 2131361817;
+
+ // aapt resource value: 0x7f0a001a
+ public const int CardView_Light = 2131361818;
+
+ // aapt resource value: 0x7f0a0172
+ public const int MyTheme = 2131362162;
+
+ // aapt resource value: 0x7f0a0173
+ public const int MyTheme_Base = 2131362163;
+
+ // aapt resource value: 0x7f0a0032
+ public const int Platform_AppCompat = 2131361842;
+
+ // aapt resource value: 0x7f0a0033
+ public const int Platform_AppCompat_Light = 2131361843;
+
+ // aapt resource value: 0x7f0a0095
+ public const int Platform_ThemeOverlay_AppCompat = 2131361941;
+
+ // aapt resource value: 0x7f0a0096
+ public const int Platform_ThemeOverlay_AppCompat_Dark = 2131361942;
+
+ // aapt resource value: 0x7f0a0097
+ public const int Platform_ThemeOverlay_AppCompat_Light = 2131361943;
+
+ // aapt resource value: 0x7f0a0034
+ public const int Platform_V11_AppCompat = 2131361844;
+
+ // aapt resource value: 0x7f0a0035
+ public const int Platform_V11_AppCompat_Light = 2131361845;
+
+ // aapt resource value: 0x7f0a003c
+ public const int Platform_V14_AppCompat = 2131361852;
+
+ // aapt resource value: 0x7f0a003d
+ public const int Platform_V14_AppCompat_Light = 2131361853;
+
+ // aapt resource value: 0x7f0a0036
+ public const int Platform_Widget_AppCompat_Spinner = 2131361846;
+
+ // aapt resource value: 0x7f0a0043
+ public const int RtlOverlay_DialogWindowTitle_AppCompat = 2131361859;
+
+ // aapt resource value: 0x7f0a0044
+ public const int RtlOverlay_Widget_AppCompat_ActionBar_TitleItem = 2131361860;
+
+ // aapt resource value: 0x7f0a0045
+ public const int RtlOverlay_Widget_AppCompat_DialogTitle_Icon = 2131361861;
+
+ // aapt resource value: 0x7f0a0046
+ public const int RtlOverlay_Widget_AppCompat_PopupMenuItem = 2131361862;
+
+ // aapt resource value: 0x7f0a0047
+ public const int RtlOverlay_Widget_AppCompat_PopupMenuItem_InternalGroup = 2131361863;
+
+ // aapt resource value: 0x7f0a0048
+ public const int RtlOverlay_Widget_AppCompat_PopupMenuItem_Text = 2131361864;
+
+ // aapt resource value: 0x7f0a0049
+ public const int RtlOverlay_Widget_AppCompat_Search_DropDown = 2131361865;
+
+ // aapt resource value: 0x7f0a004a
+ public const int RtlOverlay_Widget_AppCompat_Search_DropDown_Icon1 = 2131361866;
+
+ // aapt resource value: 0x7f0a004b
+ public const int RtlOverlay_Widget_AppCompat_Search_DropDown_Icon2 = 2131361867;
+
+ // aapt resource value: 0x7f0a004c
+ public const int RtlOverlay_Widget_AppCompat_Search_DropDown_Query = 2131361868;
+
+ // aapt resource value: 0x7f0a004d
+ public const int RtlOverlay_Widget_AppCompat_Search_DropDown_Text = 2131361869;
+
+ // aapt resource value: 0x7f0a004e
+ public const int RtlOverlay_Widget_AppCompat_SearchView_MagIcon = 2131361870;
+
+ // aapt resource value: 0x7f0a004f
+ public const int RtlUnderlay_Widget_AppCompat_ActionButton = 2131361871;
+
+ // aapt resource value: 0x7f0a0050
+ public const int RtlUnderlay_Widget_AppCompat_ActionButton_Overflow = 2131361872;
+
+ // aapt resource value: 0x7f0a00d1
+ public const int TextAppearance_AppCompat = 2131362001;
+
+ // aapt resource value: 0x7f0a00d2
+ public const int TextAppearance_AppCompat_Body1 = 2131362002;
+
+ // aapt resource value: 0x7f0a00d3
+ public const int TextAppearance_AppCompat_Body2 = 2131362003;
+
+ // aapt resource value: 0x7f0a00d4
+ public const int TextAppearance_AppCompat_Button = 2131362004;
+
+ // aapt resource value: 0x7f0a00d5
+ public const int TextAppearance_AppCompat_Caption = 2131362005;
+
+ // aapt resource value: 0x7f0a00d6
+ public const int TextAppearance_AppCompat_Display1 = 2131362006;
+
+ // aapt resource value: 0x7f0a00d7
+ public const int TextAppearance_AppCompat_Display2 = 2131362007;
+
+ // aapt resource value: 0x7f0a00d8
+ public const int TextAppearance_AppCompat_Display3 = 2131362008;
+
+ // aapt resource value: 0x7f0a00d9
+ public const int TextAppearance_AppCompat_Display4 = 2131362009;
+
+ // aapt resource value: 0x7f0a00da
+ public const int TextAppearance_AppCompat_Headline = 2131362010;
+
+ // aapt resource value: 0x7f0a00db
+ public const int TextAppearance_AppCompat_Inverse = 2131362011;
+
+ // aapt resource value: 0x7f0a00dc
+ public const int TextAppearance_AppCompat_Large = 2131362012;
+
+ // aapt resource value: 0x7f0a00dd
+ public const int TextAppearance_AppCompat_Large_Inverse = 2131362013;
+
+ // aapt resource value: 0x7f0a00de
+ public const int TextAppearance_AppCompat_Light_SearchResult_Subtitle = 2131362014;
+
+ // aapt resource value: 0x7f0a00df
+ public const int TextAppearance_AppCompat_Light_SearchResult_Title = 2131362015;
+
+ // aapt resource value: 0x7f0a00e0
+ public const int TextAppearance_AppCompat_Light_Widget_PopupMenu_Large = 2131362016;
+
+ // aapt resource value: 0x7f0a00e1
+ public const int TextAppearance_AppCompat_Light_Widget_PopupMenu_Small = 2131362017;
+
+ // aapt resource value: 0x7f0a00e2
+ public const int TextAppearance_AppCompat_Medium = 2131362018;
+
+ // aapt resource value: 0x7f0a00e3
+ public const int TextAppearance_AppCompat_Medium_Inverse = 2131362019;
+
+ // aapt resource value: 0x7f0a00e4
+ public const int TextAppearance_AppCompat_Menu = 2131362020;
+
+ // aapt resource value: 0x7f0a00e5
+ public const int TextAppearance_AppCompat_SearchResult_Subtitle = 2131362021;
+
+ // aapt resource value: 0x7f0a00e6
+ public const int TextAppearance_AppCompat_SearchResult_Title = 2131362022;
+
+ // aapt resource value: 0x7f0a00e7
+ public const int TextAppearance_AppCompat_Small = 2131362023;
+
+ // aapt resource value: 0x7f0a00e8
+ public const int TextAppearance_AppCompat_Small_Inverse = 2131362024;
+
+ // aapt resource value: 0x7f0a00e9
+ public const int TextAppearance_AppCompat_Subhead = 2131362025;
+
+ // aapt resource value: 0x7f0a00ea
+ public const int TextAppearance_AppCompat_Subhead_Inverse = 2131362026;
+
+ // aapt resource value: 0x7f0a00eb
+ public const int TextAppearance_AppCompat_Title = 2131362027;
+
+ // aapt resource value: 0x7f0a00ec
+ public const int TextAppearance_AppCompat_Title_Inverse = 2131362028;
+
+ // aapt resource value: 0x7f0a00ed
+ public const int TextAppearance_AppCompat_Widget_ActionBar_Menu = 2131362029;
+
+ // aapt resource value: 0x7f0a00ee
+ public const int TextAppearance_AppCompat_Widget_ActionBar_Subtitle = 2131362030;
+
+ // aapt resource value: 0x7f0a00ef
+ public const int TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse = 2131362031;
+
+ // aapt resource value: 0x7f0a00f0
+ public const int TextAppearance_AppCompat_Widget_ActionBar_Title = 2131362032;
+
+ // aapt resource value: 0x7f0a00f1
+ public const int TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse = 2131362033;
+
+ // aapt resource value: 0x7f0a00f2
+ public const int TextAppearance_AppCompat_Widget_ActionMode_Subtitle = 2131362034;
+
+ // aapt resource value: 0x7f0a00f3
+ public const int TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse = 2131362035;
+
+ // aapt resource value: 0x7f0a00f4
+ public const int TextAppearance_AppCompat_Widget_ActionMode_Title = 2131362036;
+
+ // aapt resource value: 0x7f0a00f5
+ public const int TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse = 2131362037;
+
+ // aapt resource value: 0x7f0a00f6
+ public const int TextAppearance_AppCompat_Widget_Button = 2131362038;
+
+ // aapt resource value: 0x7f0a00f7
+ public const int TextAppearance_AppCompat_Widget_Button_Inverse = 2131362039;
+
+ // aapt resource value: 0x7f0a00f8
+ public const int TextAppearance_AppCompat_Widget_DropDownItem = 2131362040;
+
+ // aapt resource value: 0x7f0a00f9
+ public const int TextAppearance_AppCompat_Widget_PopupMenu_Large = 2131362041;
+
+ // aapt resource value: 0x7f0a00fa
+ public const int TextAppearance_AppCompat_Widget_PopupMenu_Small = 2131362042;
+
+ // aapt resource value: 0x7f0a00fb
+ public const int TextAppearance_AppCompat_Widget_Switch = 2131362043;
+
+ // aapt resource value: 0x7f0a00fc
+ public const int TextAppearance_AppCompat_Widget_TextView_SpinnerItem = 2131362044;
+
+ // aapt resource value: 0x7f0a015c
+ public const int TextAppearance_Design_CollapsingToolbar_Expanded = 2131362140;
+
+ // aapt resource value: 0x7f0a015d
+ public const int TextAppearance_Design_Counter = 2131362141;
+
+ // aapt resource value: 0x7f0a015e
+ public const int TextAppearance_Design_Counter_Overflow = 2131362142;
+
+ // aapt resource value: 0x7f0a015f
+ public const int TextAppearance_Design_Error = 2131362143;
+
+ // aapt resource value: 0x7f0a0160
+ public const int TextAppearance_Design_Hint = 2131362144;
+
+ // aapt resource value: 0x7f0a0161
+ public const int TextAppearance_Design_Snackbar_Message = 2131362145;
+
+ // aapt resource value: 0x7f0a0162
+ public const int TextAppearance_Design_Tab = 2131362146;
+
+ // aapt resource value: 0x7f0a003e
+ public const int TextAppearance_StatusBar_EventContent = 2131361854;
+
+ // aapt resource value: 0x7f0a003f
+ public const int TextAppearance_StatusBar_EventContent_Info = 2131361855;
+
+ // aapt resource value: 0x7f0a0040
+ public const int TextAppearance_StatusBar_EventContent_Line2 = 2131361856;
+
+ // aapt resource value: 0x7f0a0041
+ public const int TextAppearance_StatusBar_EventContent_Time = 2131361857;
+
+ // aapt resource value: 0x7f0a0042
+ public const int TextAppearance_StatusBar_EventContent_Title = 2131361858;
+
+ // aapt resource value: 0x7f0a00fd
+ public const int TextAppearance_Widget_AppCompat_ExpandedMenu_Item = 2131362045;
+
+ // aapt resource value: 0x7f0a00fe
+ public const int TextAppearance_Widget_AppCompat_Toolbar_Subtitle = 2131362046;
+
+ // aapt resource value: 0x7f0a00ff
+ public const int TextAppearance_Widget_AppCompat_Toolbar_Title = 2131362047;
+
+ // aapt resource value: 0x7f0a0100
+ public const int Theme_AppCompat = 2131362048;
+
+ // aapt resource value: 0x7f0a0101
+ public const int Theme_AppCompat_CompactMenu = 2131362049;
+
+ // aapt resource value: 0x7f0a001f
+ public const int Theme_AppCompat_DayNight = 2131361823;
+
+ // aapt resource value: 0x7f0a0020
+ public const int Theme_AppCompat_DayNight_DarkActionBar = 2131361824;
+
+ // aapt resource value: 0x7f0a0021
+ public const int Theme_AppCompat_DayNight_Dialog = 2131361825;
+
+ // aapt resource value: 0x7f0a0022
+ public const int Theme_AppCompat_DayNight_Dialog_Alert = 2131361826;
+
+ // aapt resource value: 0x7f0a0023
+ public const int Theme_AppCompat_DayNight_Dialog_MinWidth = 2131361827;
+
+ // aapt resource value: 0x7f0a0024
+ public const int Theme_AppCompat_DayNight_DialogWhenLarge = 2131361828;
+
+ // aapt resource value: 0x7f0a0025
+ public const int Theme_AppCompat_DayNight_NoActionBar = 2131361829;
+
+ // aapt resource value: 0x7f0a0102
+ public const int Theme_AppCompat_Dialog = 2131362050;
+
+ // aapt resource value: 0x7f0a0103
+ public const int Theme_AppCompat_Dialog_Alert = 2131362051;
+
+ // aapt resource value: 0x7f0a0104
+ public const int Theme_AppCompat_Dialog_MinWidth = 2131362052;
+
+ // aapt resource value: 0x7f0a0105
+ public const int Theme_AppCompat_DialogWhenLarge = 2131362053;
+
+ // aapt resource value: 0x7f0a0106
+ public const int Theme_AppCompat_Light = 2131362054;
+
+ // aapt resource value: 0x7f0a0107
+ public const int Theme_AppCompat_Light_DarkActionBar = 2131362055;
+
+ // aapt resource value: 0x7f0a0108
+ public const int Theme_AppCompat_Light_Dialog = 2131362056;
+
+ // aapt resource value: 0x7f0a0109
+ public const int Theme_AppCompat_Light_Dialog_Alert = 2131362057;
+
+ // aapt resource value: 0x7f0a010a
+ public const int Theme_AppCompat_Light_Dialog_MinWidth = 2131362058;
+
+ // aapt resource value: 0x7f0a010b
+ public const int Theme_AppCompat_Light_DialogWhenLarge = 2131362059;
+
+ // aapt resource value: 0x7f0a010c
+ public const int Theme_AppCompat_Light_NoActionBar = 2131362060;
+
+ // aapt resource value: 0x7f0a010d
+ public const int Theme_AppCompat_NoActionBar = 2131362061;
+
+ // aapt resource value: 0x7f0a0163
+ public const int Theme_Design = 2131362147;
+
+ // aapt resource value: 0x7f0a0164
+ public const int Theme_Design_BottomSheetDialog = 2131362148;
+
+ // aapt resource value: 0x7f0a0165
+ public const int Theme_Design_Light = 2131362149;
+
+ // aapt resource value: 0x7f0a0166
+ public const int Theme_Design_Light_BottomSheetDialog = 2131362150;
+
+ // aapt resource value: 0x7f0a0167
+ public const int Theme_Design_Light_NoActionBar = 2131362151;
+
+ // aapt resource value: 0x7f0a0168
+ public const int Theme_Design_NoActionBar = 2131362152;
+
+ // aapt resource value: 0x7f0a0000
+ public const int Theme_MediaRouter = 2131361792;
+
+ // aapt resource value: 0x7f0a0001
+ public const int Theme_MediaRouter_Light = 2131361793;
+
+ // aapt resource value: 0x7f0a0002
+ public const int Theme_MediaRouter_Light_DarkControlPanel = 2131361794;
+
+ // aapt resource value: 0x7f0a0003
+ public const int Theme_MediaRouter_LightControlPanel = 2131361795;
+
+ // aapt resource value: 0x7f0a010e
+ public const int ThemeOverlay_AppCompat = 2131362062;
+
+ // aapt resource value: 0x7f0a010f
+ public const int ThemeOverlay_AppCompat_ActionBar = 2131362063;
+
+ // aapt resource value: 0x7f0a0110
+ public const int ThemeOverlay_AppCompat_Dark = 2131362064;
+
+ // aapt resource value: 0x7f0a0111
+ public const int ThemeOverlay_AppCompat_Dark_ActionBar = 2131362065;
+
+ // aapt resource value: 0x7f0a0112
+ public const int ThemeOverlay_AppCompat_Light = 2131362066;
+
+ // aapt resource value: 0x7f0a0113
+ public const int Widget_AppCompat_ActionBar = 2131362067;
+
+ // aapt resource value: 0x7f0a0114
+ public const int Widget_AppCompat_ActionBar_Solid = 2131362068;
+
+ // aapt resource value: 0x7f0a0115
+ public const int Widget_AppCompat_ActionBar_TabBar = 2131362069;
+
+ // aapt resource value: 0x7f0a0116
+ public const int Widget_AppCompat_ActionBar_TabText = 2131362070;
+
+ // aapt resource value: 0x7f0a0117
+ public const int Widget_AppCompat_ActionBar_TabView = 2131362071;
+
+ // aapt resource value: 0x7f0a0118
+ public const int Widget_AppCompat_ActionButton = 2131362072;
+
+ // aapt resource value: 0x7f0a0119
+ public const int Widget_AppCompat_ActionButton_CloseMode = 2131362073;
+
+ // aapt resource value: 0x7f0a011a
+ public const int Widget_AppCompat_ActionButton_Overflow = 2131362074;
+
+ // aapt resource value: 0x7f0a011b
+ public const int Widget_AppCompat_ActionMode = 2131362075;
+
+ // aapt resource value: 0x7f0a011c
+ public const int Widget_AppCompat_ActivityChooserView = 2131362076;
+
+ // aapt resource value: 0x7f0a011d
+ public const int Widget_AppCompat_AutoCompleteTextView = 2131362077;
+
+ // aapt resource value: 0x7f0a011e
+ public const int Widget_AppCompat_Button = 2131362078;
+
+ // aapt resource value: 0x7f0a011f
+ public const int Widget_AppCompat_Button_Borderless = 2131362079;
+
+ // aapt resource value: 0x7f0a0120
+ public const int Widget_AppCompat_Button_Borderless_Colored = 2131362080;
+
+ // aapt resource value: 0x7f0a0121
+ public const int Widget_AppCompat_Button_ButtonBar_AlertDialog = 2131362081;
+
+ // aapt resource value: 0x7f0a0122
+ public const int Widget_AppCompat_Button_Colored = 2131362082;
+
+ // aapt resource value: 0x7f0a0123
+ public const int Widget_AppCompat_Button_Small = 2131362083;
+
+ // aapt resource value: 0x7f0a0124
+ public const int Widget_AppCompat_ButtonBar = 2131362084;
+
+ // aapt resource value: 0x7f0a0125
+ public const int Widget_AppCompat_ButtonBar_AlertDialog = 2131362085;
+
+ // aapt resource value: 0x7f0a0126
+ public const int Widget_AppCompat_CompoundButton_CheckBox = 2131362086;
+
+ // aapt resource value: 0x7f0a0127
+ public const int Widget_AppCompat_CompoundButton_RadioButton = 2131362087;
+
+ // aapt resource value: 0x7f0a0128
+ public const int Widget_AppCompat_CompoundButton_Switch = 2131362088;
+
+ // aapt resource value: 0x7f0a0129
+ public const int Widget_AppCompat_DrawerArrowToggle = 2131362089;
+
+ // aapt resource value: 0x7f0a012a
+ public const int Widget_AppCompat_DropDownItem_Spinner = 2131362090;
+
+ // aapt resource value: 0x7f0a012b
+ public const int Widget_AppCompat_EditText = 2131362091;
+
+ // aapt resource value: 0x7f0a012c
+ public const int Widget_AppCompat_ImageButton = 2131362092;
+
+ // aapt resource value: 0x7f0a012d
+ public const int Widget_AppCompat_Light_ActionBar = 2131362093;
+
+ // aapt resource value: 0x7f0a012e
+ public const int Widget_AppCompat_Light_ActionBar_Solid = 2131362094;
+
+ // aapt resource value: 0x7f0a012f
+ public const int Widget_AppCompat_Light_ActionBar_Solid_Inverse = 2131362095;
+
+ // aapt resource value: 0x7f0a0130
+ public const int Widget_AppCompat_Light_ActionBar_TabBar = 2131362096;
+
+ // aapt resource value: 0x7f0a0131
+ public const int Widget_AppCompat_Light_ActionBar_TabBar_Inverse = 2131362097;
+
+ // aapt resource value: 0x7f0a0132
+ public const int Widget_AppCompat_Light_ActionBar_TabText = 2131362098;
+
+ // aapt resource value: 0x7f0a0133
+ public const int Widget_AppCompat_Light_ActionBar_TabText_Inverse = 2131362099;
+
+ // aapt resource value: 0x7f0a0134
+ public const int Widget_AppCompat_Light_ActionBar_TabView = 2131362100;
+
+ // aapt resource value: 0x7f0a0135
+ public const int Widget_AppCompat_Light_ActionBar_TabView_Inverse = 2131362101;
+
+ // aapt resource value: 0x7f0a0136
+ public const int Widget_AppCompat_Light_ActionButton = 2131362102;
+
+ // aapt resource value: 0x7f0a0137
+ public const int Widget_AppCompat_Light_ActionButton_CloseMode = 2131362103;
+
+ // aapt resource value: 0x7f0a0138
+ public const int Widget_AppCompat_Light_ActionButton_Overflow = 2131362104;
+
+ // aapt resource value: 0x7f0a0139
+ public const int Widget_AppCompat_Light_ActionMode_Inverse = 2131362105;
+
+ // aapt resource value: 0x7f0a013a
+ public const int Widget_AppCompat_Light_ActivityChooserView = 2131362106;
+
+ // aapt resource value: 0x7f0a013b
+ public const int Widget_AppCompat_Light_AutoCompleteTextView = 2131362107;
+
+ // aapt resource value: 0x7f0a013c
+ public const int Widget_AppCompat_Light_DropDownItem_Spinner = 2131362108;
+
+ // aapt resource value: 0x7f0a013d
+ public const int Widget_AppCompat_Light_ListPopupWindow = 2131362109;
+
+ // aapt resource value: 0x7f0a013e
+ public const int Widget_AppCompat_Light_ListView_DropDown = 2131362110;
+
+ // aapt resource value: 0x7f0a013f
+ public const int Widget_AppCompat_Light_PopupMenu = 2131362111;
+
+ // aapt resource value: 0x7f0a0140
+ public const int Widget_AppCompat_Light_PopupMenu_Overflow = 2131362112;
+
+ // aapt resource value: 0x7f0a0141
+ public const int Widget_AppCompat_Light_SearchView = 2131362113;
+
+ // aapt resource value: 0x7f0a0142
+ public const int Widget_AppCompat_Light_Spinner_DropDown_ActionBar = 2131362114;
+
+ // aapt resource value: 0x7f0a0143
+ public const int Widget_AppCompat_ListPopupWindow = 2131362115;
+
+ // aapt resource value: 0x7f0a0144
+ public const int Widget_AppCompat_ListView = 2131362116;
+
+ // aapt resource value: 0x7f0a0145
+ public const int Widget_AppCompat_ListView_DropDown = 2131362117;
+
+ // aapt resource value: 0x7f0a0146
+ public const int Widget_AppCompat_ListView_Menu = 2131362118;
+
+ // aapt resource value: 0x7f0a0147
+ public const int Widget_AppCompat_PopupMenu = 2131362119;
+
+ // aapt resource value: 0x7f0a0148
+ public const int Widget_AppCompat_PopupMenu_Overflow = 2131362120;
+
+ // aapt resource value: 0x7f0a0149
+ public const int Widget_AppCompat_PopupWindow = 2131362121;
+
+ // aapt resource value: 0x7f0a014a
+ public const int Widget_AppCompat_ProgressBar = 2131362122;
+
+ // aapt resource value: 0x7f0a014b
+ public const int Widget_AppCompat_ProgressBar_Horizontal = 2131362123;
+
+ // aapt resource value: 0x7f0a014c
+ public const int Widget_AppCompat_RatingBar = 2131362124;
+
+ // aapt resource value: 0x7f0a014d
+ public const int Widget_AppCompat_RatingBar_Indicator = 2131362125;
+
+ // aapt resource value: 0x7f0a014e
+ public const int Widget_AppCompat_RatingBar_Small = 2131362126;
+
+ // aapt resource value: 0x7f0a014f
+ public const int Widget_AppCompat_SearchView = 2131362127;
+
+ // aapt resource value: 0x7f0a0150
+ public const int Widget_AppCompat_SearchView_ActionBar = 2131362128;
+
+ // aapt resource value: 0x7f0a0151
+ public const int Widget_AppCompat_SeekBar = 2131362129;
+
+ // aapt resource value: 0x7f0a0152
+ public const int Widget_AppCompat_Spinner = 2131362130;
+
+ // aapt resource value: 0x7f0a0153
+ public const int Widget_AppCompat_Spinner_DropDown = 2131362131;
+
+ // aapt resource value: 0x7f0a0154
+ public const int Widget_AppCompat_Spinner_DropDown_ActionBar = 2131362132;
+
+ // aapt resource value: 0x7f0a0155
+ public const int Widget_AppCompat_Spinner_Underlined = 2131362133;
+
+ // aapt resource value: 0x7f0a0156
+ public const int Widget_AppCompat_TextView_SpinnerItem = 2131362134;
+
+ // aapt resource value: 0x7f0a0157
+ public const int Widget_AppCompat_Toolbar = 2131362135;
+
+ // aapt resource value: 0x7f0a0158
+ public const int Widget_AppCompat_Toolbar_Button_Navigation = 2131362136;
+
+ // aapt resource value: 0x7f0a0169
+ public const int Widget_Design_AppBarLayout = 2131362153;
+
+ // aapt resource value: 0x7f0a016a
+ public const int Widget_Design_BottomSheet_Modal = 2131362154;
+
+ // aapt resource value: 0x7f0a016b
+ public const int Widget_Design_CollapsingToolbar = 2131362155;
+
+ // aapt resource value: 0x7f0a016c
+ public const int Widget_Design_CoordinatorLayout = 2131362156;
+
+ // aapt resource value: 0x7f0a016d
+ public const int Widget_Design_FloatingActionButton = 2131362157;
+
+ // aapt resource value: 0x7f0a016e
+ public const int Widget_Design_NavigationView = 2131362158;
+
+ // aapt resource value: 0x7f0a016f
+ public const int Widget_Design_ScrimInsetsFrameLayout = 2131362159;
+
+ // aapt resource value: 0x7f0a0170
+ public const int Widget_Design_Snackbar = 2131362160;
+
+ // aapt resource value: 0x7f0a0159
+ public const int Widget_Design_TabLayout = 2131362137;
+
+ // aapt resource value: 0x7f0a0171
+ public const int Widget_Design_TextInputLayout = 2131362161;
+
+ // aapt resource value: 0x7f0a0004
+ public const int Widget_MediaRouter_ChooserText = 2131361796;
+
+ // aapt resource value: 0x7f0a0005
+ public const int Widget_MediaRouter_ChooserText_Primary = 2131361797;
+
+ // aapt resource value: 0x7f0a0006
+ public const int Widget_MediaRouter_ChooserText_Primary_Dark = 2131361798;
+
+ // aapt resource value: 0x7f0a0007
+ public const int Widget_MediaRouter_ChooserText_Primary_Light = 2131361799;
+
+ // aapt resource value: 0x7f0a0008
+ public const int Widget_MediaRouter_ChooserText_Secondary = 2131361800;
+
+ // aapt resource value: 0x7f0a0009
+ public const int Widget_MediaRouter_ChooserText_Secondary_Dark = 2131361801;
+
+ // aapt resource value: 0x7f0a000a
+ public const int Widget_MediaRouter_ChooserText_Secondary_Light = 2131361802;
+
+ // aapt resource value: 0x7f0a000b
+ public const int Widget_MediaRouter_ControllerText = 2131361803;
+
+ // aapt resource value: 0x7f0a000c
+ public const int Widget_MediaRouter_ControllerText_Primary = 2131361804;
+
+ // aapt resource value: 0x7f0a000d
+ public const int Widget_MediaRouter_ControllerText_Primary_Dark = 2131361805;
+
+ // aapt resource value: 0x7f0a000e
+ public const int Widget_MediaRouter_ControllerText_Primary_Light = 2131361806;
+
+ // aapt resource value: 0x7f0a000f
+ public const int Widget_MediaRouter_ControllerText_Secondary = 2131361807;
+
+ // aapt resource value: 0x7f0a0010
+ public const int Widget_MediaRouter_ControllerText_Secondary_Dark = 2131361808;
+
+ // aapt resource value: 0x7f0a0011
+ public const int Widget_MediaRouter_ControllerText_Secondary_Light = 2131361809;
+
+ // aapt resource value: 0x7f0a0012
+ public const int Widget_MediaRouter_ControllerText_Title = 2131361810;
+
+ // aapt resource value: 0x7f0a0013
+ public const int Widget_MediaRouter_ControllerText_Title_Dark = 2131361811;
+
+ // aapt resource value: 0x7f0a0014
+ public const int Widget_MediaRouter_ControllerText_Title_Light = 2131361812;
+
+ // aapt resource value: 0x7f0a0015
+ public const int Widget_MediaRouter_Light_MediaRouteButton = 2131361813;
+
+ // aapt resource value: 0x7f0a0016
+ public const int Widget_MediaRouter_MediaRouteButton = 2131361814;
+
+ static Style()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Style()
+ {
+ }
+ }
+
+ public partial class Styleable
+ {
+
+ public static int[] ActionBar = new int[] {
+ 2130772007,
+ 2130772009,
+ 2130772010,
+ 2130772011,
+ 2130772012,
+ 2130772013,
+ 2130772014,
+ 2130772015,
+ 2130772016,
+ 2130772017,
+ 2130772018,
+ 2130772019,
+ 2130772020,
+ 2130772021,
+ 2130772022,
+ 2130772023,
+ 2130772024,
+ 2130772025,
+ 2130772026,
+ 2130772027,
+ 2130772028,
+ 2130772029,
+ 2130772030,
+ 2130772031,
+ 2130772032,
+ 2130772033,
+ 2130772090};
+
+ // aapt resource value: 10
+ public const int ActionBar_background = 10;
+
+ // aapt resource value: 12
+ public const int ActionBar_backgroundSplit = 12;
+
+ // aapt resource value: 11
+ public const int ActionBar_backgroundStacked = 11;
+
+ // aapt resource value: 21
+ public const int ActionBar_contentInsetEnd = 21;
+
+ // aapt resource value: 22
+ public const int ActionBar_contentInsetLeft = 22;
+
+ // aapt resource value: 23
+ public const int ActionBar_contentInsetRight = 23;
+
+ // aapt resource value: 20
+ public const int ActionBar_contentInsetStart = 20;
+
+ // aapt resource value: 13
+ public const int ActionBar_customNavigationLayout = 13;
+
+ // aapt resource value: 3
+ public const int ActionBar_displayOptions = 3;
+
+ // aapt resource value: 9
+ public const int ActionBar_divider = 9;
+
+ // aapt resource value: 24
+ public const int ActionBar_elevation = 24;
+
+ // aapt resource value: 0
+ public const int ActionBar_height = 0;
+
+ // aapt resource value: 19
+ public const int ActionBar_hideOnContentScroll = 19;
+
+ // aapt resource value: 26
+ public const int ActionBar_homeAsUpIndicator = 26;
+
+ // aapt resource value: 14
+ public const int ActionBar_homeLayout = 14;
+
+ // aapt resource value: 7
+ public const int ActionBar_icon = 7;
+
+ // aapt resource value: 16
+ public const int ActionBar_indeterminateProgressStyle = 16;
+
+ // aapt resource value: 18
+ public const int ActionBar_itemPadding = 18;
+
+ // aapt resource value: 8
+ public const int ActionBar_logo = 8;
+
+ // aapt resource value: 2
+ public const int ActionBar_navigationMode = 2;
+
+ // aapt resource value: 25
+ public const int ActionBar_popupTheme = 25;
+
+ // aapt resource value: 17
+ public const int ActionBar_progressBarPadding = 17;
+
+ // aapt resource value: 15
+ public const int ActionBar_progressBarStyle = 15;
+
+ // aapt resource value: 4
+ public const int ActionBar_subtitle = 4;
+
+ // aapt resource value: 6
+ public const int ActionBar_subtitleTextStyle = 6;
+
+ // aapt resource value: 1
+ public const int ActionBar_title = 1;
+
+ // aapt resource value: 5
+ public const int ActionBar_titleTextStyle = 5;
+
+ public static int[] ActionBarLayout = new int[] {
+ 16842931};
+
+ // aapt resource value: 0
+ public const int ActionBarLayout_android_layout_gravity = 0;
+
+ public static int[] ActionMenuItemView = new int[] {
+ 16843071};
+
+ // aapt resource value: 0
+ public const int ActionMenuItemView_android_minWidth = 0;
+
+ public static int[] ActionMenuView;
+
+ public static int[] ActionMode = new int[] {
+ 2130772007,
+ 2130772013,
+ 2130772014,
+ 2130772018,
+ 2130772020,
+ 2130772034};
+
+ // aapt resource value: 3
+ public const int ActionMode_background = 3;
+
+ // aapt resource value: 4
+ public const int ActionMode_backgroundSplit = 4;
+
+ // aapt resource value: 5
+ public const int ActionMode_closeItemLayout = 5;
+
+ // aapt resource value: 0
+ public const int ActionMode_height = 0;
+
+ // aapt resource value: 2
+ public const int ActionMode_subtitleTextStyle = 2;
+
+ // aapt resource value: 1
+ public const int ActionMode_titleTextStyle = 1;
+
+ public static int[] ActivityChooserView = new int[] {
+ 2130772035,
+ 2130772036};
+
+ // aapt resource value: 1
+ public const int ActivityChooserView_expandActivityOverflowButtonDrawable = 1;
+
+ // aapt resource value: 0
+ public const int ActivityChooserView_initialActivityCount = 0;
+
+ public static int[] AlertDialog = new int[] {
+ 16842994,
+ 2130772037,
+ 2130772038,
+ 2130772039,
+ 2130772040,
+ 2130772041};
+
+ // aapt resource value: 0
+ public const int AlertDialog_android_layout = 0;
+
+ // aapt resource value: 1
+ public const int AlertDialog_buttonPanelSideLayout = 1;
+
+ // aapt resource value: 5
+ public const int AlertDialog_listItemLayout = 5;
+
+ // aapt resource value: 2
+ public const int AlertDialog_listLayout = 2;
+
+ // aapt resource value: 3
+ public const int AlertDialog_multiChoiceItemLayout = 3;
+
+ // aapt resource value: 4
+ public const int AlertDialog_singleChoiceItemLayout = 4;
+
+ public static int[] AppBarLayout = new int[] {
+ 16842964,
+ 2130772032,
+ 2130772215};
+
+ // aapt resource value: 0
+ public const int AppBarLayout_android_background = 0;
+
+ // aapt resource value: 1
+ public const int AppBarLayout_elevation = 1;
+
+ // aapt resource value: 2
+ public const int AppBarLayout_expanded = 2;
+
+ public static int[] AppBarLayout_LayoutParams = new int[] {
+ 2130772216,
+ 2130772217};
+
+ // aapt resource value: 0
+ public const int AppBarLayout_LayoutParams_layout_scrollFlags = 0;
+
+ // aapt resource value: 1
+ public const int AppBarLayout_LayoutParams_layout_scrollInterpolator = 1;
+
+ public static int[] AppCompatImageView = new int[] {
+ 16843033,
+ 2130772042};
+
+ // aapt resource value: 0
+ public const int AppCompatImageView_android_src = 0;
+
+ // aapt resource value: 1
+ public const int AppCompatImageView_srcCompat = 1;
+
+ public static int[] AppCompatTextView = new int[] {
+ 16842804,
+ 2130772043};
+
+ // aapt resource value: 0
+ public const int AppCompatTextView_android_textAppearance = 0;
+
+ // aapt resource value: 1
+ public const int AppCompatTextView_textAllCaps = 1;
+
+ public static int[] AppCompatTheme = new int[] {
+ 16842839,
+ 16842926,
+ 2130772044,
+ 2130772045,
+ 2130772046,
+ 2130772047,
+ 2130772048,
+ 2130772049,
+ 2130772050,
+ 2130772051,
+ 2130772052,
+ 2130772053,
+ 2130772054,
+ 2130772055,
+ 2130772056,
+ 2130772057,
+ 2130772058,
+ 2130772059,
+ 2130772060,
+ 2130772061,
+ 2130772062,
+ 2130772063,
+ 2130772064,
+ 2130772065,
+ 2130772066,
+ 2130772067,
+ 2130772068,
+ 2130772069,
+ 2130772070,
+ 2130772071,
+ 2130772072,
+ 2130772073,
+ 2130772074,
+ 2130772075,
+ 2130772076,
+ 2130772077,
+ 2130772078,
+ 2130772079,
+ 2130772080,
+ 2130772081,
+ 2130772082,
+ 2130772083,
+ 2130772084,
+ 2130772085,
+ 2130772086,
+ 2130772087,
+ 2130772088,
+ 2130772089,
+ 2130772090,
+ 2130772091,
+ 2130772092,
+ 2130772093,
+ 2130772094,
+ 2130772095,
+ 2130772096,
+ 2130772097,
+ 2130772098,
+ 2130772099,
+ 2130772100,
+ 2130772101,
+ 2130772102,
+ 2130772103,
+ 2130772104,
+ 2130772105,
+ 2130772106,
+ 2130772107,
+ 2130772108,
+ 2130772109,
+ 2130772110,
+ 2130772111,
+ 2130772112,
+ 2130772113,
+ 2130772114,
+ 2130772115,
+ 2130772116,
+ 2130772117,
+ 2130772118,
+ 2130772119,
+ 2130772120,
+ 2130772121,
+ 2130772122,
+ 2130772123,
+ 2130772124,
+ 2130772125,
+ 2130772126,
+ 2130772127,
+ 2130772128,
+ 2130772129,
+ 2130772130,
+ 2130772131,
+ 2130772132,
+ 2130772133,
+ 2130772134,
+ 2130772135,
+ 2130772136,
+ 2130772137,
+ 2130772138,
+ 2130772139,
+ 2130772140,
+ 2130772141,
+ 2130772142,
+ 2130772143,
+ 2130772144,
+ 2130772145,
+ 2130772146,
+ 2130772147,
+ 2130772148,
+ 2130772149,
+ 2130772150,
+ 2130772151,
+ 2130772152,
+ 2130772153};
+
+ // aapt resource value: 23
+ public const int AppCompatTheme_actionBarDivider = 23;
+
+ // aapt resource value: 24
+ public const int AppCompatTheme_actionBarItemBackground = 24;
+
+ // aapt resource value: 17
+ public const int AppCompatTheme_actionBarPopupTheme = 17;
+
+ // aapt resource value: 22
+ public const int AppCompatTheme_actionBarSize = 22;
+
+ // aapt resource value: 19
+ public const int AppCompatTheme_actionBarSplitStyle = 19;
+
+ // aapt resource value: 18
+ public const int AppCompatTheme_actionBarStyle = 18;
+
+ // aapt resource value: 13
+ public const int AppCompatTheme_actionBarTabBarStyle = 13;
+
+ // aapt resource value: 12
+ public const int AppCompatTheme_actionBarTabStyle = 12;
+
+ // aapt resource value: 14
+ public const int AppCompatTheme_actionBarTabTextStyle = 14;
+
+ // aapt resource value: 20
+ public const int AppCompatTheme_actionBarTheme = 20;
+
+ // aapt resource value: 21
+ public const int AppCompatTheme_actionBarWidgetTheme = 21;
+
+ // aapt resource value: 49
+ public const int AppCompatTheme_actionButtonStyle = 49;
+
+ // aapt resource value: 45
+ public const int AppCompatTheme_actionDropDownStyle = 45;
+
+ // aapt resource value: 25
+ public const int AppCompatTheme_actionMenuTextAppearance = 25;
+
+ // aapt resource value: 26
+ public const int AppCompatTheme_actionMenuTextColor = 26;
+
+ // aapt resource value: 29
+ public const int AppCompatTheme_actionModeBackground = 29;
+
+ // aapt resource value: 28
+ public const int AppCompatTheme_actionModeCloseButtonStyle = 28;
+
+ // aapt resource value: 31
+ public const int AppCompatTheme_actionModeCloseDrawable = 31;
+
+ // aapt resource value: 33
+ public const int AppCompatTheme_actionModeCopyDrawable = 33;
+
+ // aapt resource value: 32
+ public const int AppCompatTheme_actionModeCutDrawable = 32;
+
+ // aapt resource value: 37
+ public const int AppCompatTheme_actionModeFindDrawable = 37;
+
+ // aapt resource value: 34
+ public const int AppCompatTheme_actionModePasteDrawable = 34;
+
+ // aapt resource value: 39
+ public const int AppCompatTheme_actionModePopupWindowStyle = 39;
+
+ // aapt resource value: 35
+ public const int AppCompatTheme_actionModeSelectAllDrawable = 35;
+
+ // aapt resource value: 36
+ public const int AppCompatTheme_actionModeShareDrawable = 36;
+
+ // aapt resource value: 30
+ public const int AppCompatTheme_actionModeSplitBackground = 30;
+
+ // aapt resource value: 27
+ public const int AppCompatTheme_actionModeStyle = 27;
+
+ // aapt resource value: 38
+ public const int AppCompatTheme_actionModeWebSearchDrawable = 38;
+
+ // aapt resource value: 15
+ public const int AppCompatTheme_actionOverflowButtonStyle = 15;
+
+ // aapt resource value: 16
+ public const int AppCompatTheme_actionOverflowMenuStyle = 16;
+
+ // aapt resource value: 57
+ public const int AppCompatTheme_activityChooserViewStyle = 57;
+
+ // aapt resource value: 92
+ public const int AppCompatTheme_alertDialogButtonGroupStyle = 92;
+
+ // aapt resource value: 93
+ public const int AppCompatTheme_alertDialogCenterButtons = 93;
+
+ // aapt resource value: 91
+ public const int AppCompatTheme_alertDialogStyle = 91;
+
+ // aapt resource value: 94
+ public const int AppCompatTheme_alertDialogTheme = 94;
+
+ // aapt resource value: 1
+ public const int AppCompatTheme_android_windowAnimationStyle = 1;
+
+ // aapt resource value: 0
+ public const int AppCompatTheme_android_windowIsFloating = 0;
+
+ // aapt resource value: 99
+ public const int AppCompatTheme_autoCompleteTextViewStyle = 99;
+
+ // aapt resource value: 54
+ public const int AppCompatTheme_borderlessButtonStyle = 54;
+
+ // aapt resource value: 51
+ public const int AppCompatTheme_buttonBarButtonStyle = 51;
+
+ // aapt resource value: 97
+ public const int AppCompatTheme_buttonBarNegativeButtonStyle = 97;
+
+ // aapt resource value: 98
+ public const int AppCompatTheme_buttonBarNeutralButtonStyle = 98;
+
+ // aapt resource value: 96
+ public const int AppCompatTheme_buttonBarPositiveButtonStyle = 96;
+
+ // aapt resource value: 50
+ public const int AppCompatTheme_buttonBarStyle = 50;
+
+ // aapt resource value: 100
+ public const int AppCompatTheme_buttonStyle = 100;
+
+ // aapt resource value: 101
+ public const int AppCompatTheme_buttonStyleSmall = 101;
+
+ // aapt resource value: 102
+ public const int AppCompatTheme_checkboxStyle = 102;
+
+ // aapt resource value: 103
+ public const int AppCompatTheme_checkedTextViewStyle = 103;
+
+ // aapt resource value: 84
+ public const int AppCompatTheme_colorAccent = 84;
+
+ // aapt resource value: 88
+ public const int AppCompatTheme_colorButtonNormal = 88;
+
+ // aapt resource value: 86
+ public const int AppCompatTheme_colorControlActivated = 86;
+
+ // aapt resource value: 87
+ public const int AppCompatTheme_colorControlHighlight = 87;
+
+ // aapt resource value: 85
+ public const int AppCompatTheme_colorControlNormal = 85;
+
+ // aapt resource value: 82
+ public const int AppCompatTheme_colorPrimary = 82;
+
+ // aapt resource value: 83
+ public const int AppCompatTheme_colorPrimaryDark = 83;
+
+ // aapt resource value: 89
+ public const int AppCompatTheme_colorSwitchThumbNormal = 89;
+
+ // aapt resource value: 90
+ public const int AppCompatTheme_controlBackground = 90;
+
+ // aapt resource value: 43
+ public const int AppCompatTheme_dialogPreferredPadding = 43;
+
+ // aapt resource value: 42
+ public const int AppCompatTheme_dialogTheme = 42;
+
+ // aapt resource value: 56
+ public const int AppCompatTheme_dividerHorizontal = 56;
+
+ // aapt resource value: 55
+ public const int AppCompatTheme_dividerVertical = 55;
+
+ // aapt resource value: 74
+ public const int AppCompatTheme_dropDownListViewStyle = 74;
+
+ // aapt resource value: 46
+ public const int AppCompatTheme_dropdownListPreferredItemHeight = 46;
+
+ // aapt resource value: 63
+ public const int AppCompatTheme_editTextBackground = 63;
+
+ // aapt resource value: 62
+ public const int AppCompatTheme_editTextColor = 62;
+
+ // aapt resource value: 104
+ public const int AppCompatTheme_editTextStyle = 104;
+
+ // aapt resource value: 48
+ public const int AppCompatTheme_homeAsUpIndicator = 48;
+
+ // aapt resource value: 64
+ public const int AppCompatTheme_imageButtonStyle = 64;
+
+ // aapt resource value: 81
+ public const int AppCompatTheme_listChoiceBackgroundIndicator = 81;
+
+ // aapt resource value: 44
+ public const int AppCompatTheme_listDividerAlertDialog = 44;
+
+ // aapt resource value: 75
+ public const int AppCompatTheme_listPopupWindowStyle = 75;
+
+ // aapt resource value: 69
+ public const int AppCompatTheme_listPreferredItemHeight = 69;
+
+ // aapt resource value: 71
+ public const int AppCompatTheme_listPreferredItemHeightLarge = 71;
+
+ // aapt resource value: 70
+ public const int AppCompatTheme_listPreferredItemHeightSmall = 70;
+
+ // aapt resource value: 72
+ public const int AppCompatTheme_listPreferredItemPaddingLeft = 72;
+
+ // aapt resource value: 73
+ public const int AppCompatTheme_listPreferredItemPaddingRight = 73;
+
+ // aapt resource value: 78
+ public const int AppCompatTheme_panelBackground = 78;
+
+ // aapt resource value: 80
+ public const int AppCompatTheme_panelMenuListTheme = 80;
+
+ // aapt resource value: 79
+ public const int AppCompatTheme_panelMenuListWidth = 79;
+
+ // aapt resource value: 60
+ public const int AppCompatTheme_popupMenuStyle = 60;
+
+ // aapt resource value: 61
+ public const int AppCompatTheme_popupWindowStyle = 61;
+
+ // aapt resource value: 105
+ public const int AppCompatTheme_radioButtonStyle = 105;
+
+ // aapt resource value: 106
+ public const int AppCompatTheme_ratingBarStyle = 106;
+
+ // aapt resource value: 107
+ public const int AppCompatTheme_ratingBarStyleIndicator = 107;
+
+ // aapt resource value: 108
+ public const int AppCompatTheme_ratingBarStyleSmall = 108;
+
+ // aapt resource value: 68
+ public const int AppCompatTheme_searchViewStyle = 68;
+
+ // aapt resource value: 109
+ public const int AppCompatTheme_seekBarStyle = 109;
+
+ // aapt resource value: 52
+ public const int AppCompatTheme_selectableItemBackground = 52;
+
+ // aapt resource value: 53
+ public const int AppCompatTheme_selectableItemBackgroundBorderless = 53;
+
+ // aapt resource value: 47
+ public const int AppCompatTheme_spinnerDropDownItemStyle = 47;
+
+ // aapt resource value: 110
+ public const int AppCompatTheme_spinnerStyle = 110;
+
+ // aapt resource value: 111
+ public const int AppCompatTheme_switchStyle = 111;
+
+ // aapt resource value: 40
+ public const int AppCompatTheme_textAppearanceLargePopupMenu = 40;
+
+ // aapt resource value: 76
+ public const int AppCompatTheme_textAppearanceListItem = 76;
+
+ // aapt resource value: 77
+ public const int AppCompatTheme_textAppearanceListItemSmall = 77;
+
+ // aapt resource value: 66
+ public const int AppCompatTheme_textAppearanceSearchResultSubtitle = 66;
+
+ // aapt resource value: 65
+ public const int AppCompatTheme_textAppearanceSearchResultTitle = 65;
+
+ // aapt resource value: 41
+ public const int AppCompatTheme_textAppearanceSmallPopupMenu = 41;
+
+ // aapt resource value: 95
+ public const int AppCompatTheme_textColorAlertDialogListItem = 95;
+
+ // aapt resource value: 67
+ public const int AppCompatTheme_textColorSearchUrl = 67;
+
+ // aapt resource value: 59
+ public const int AppCompatTheme_toolbarNavigationButtonStyle = 59;
+
+ // aapt resource value: 58
+ public const int AppCompatTheme_toolbarStyle = 58;
+
+ // aapt resource value: 2
+ public const int AppCompatTheme_windowActionBar = 2;
+
+ // aapt resource value: 4
+ public const int AppCompatTheme_windowActionBarOverlay = 4;
+
+ // aapt resource value: 5
+ public const int AppCompatTheme_windowActionModeOverlay = 5;
+
+ // aapt resource value: 9
+ public const int AppCompatTheme_windowFixedHeightMajor = 9;
+
+ // aapt resource value: 7
+ public const int AppCompatTheme_windowFixedHeightMinor = 7;
+
+ // aapt resource value: 6
+ public const int AppCompatTheme_windowFixedWidthMajor = 6;
+
+ // aapt resource value: 8
+ public const int AppCompatTheme_windowFixedWidthMinor = 8;
+
+ // aapt resource value: 10
+ public const int AppCompatTheme_windowMinWidthMajor = 10;
+
+ // aapt resource value: 11
+ public const int AppCompatTheme_windowMinWidthMinor = 11;
+
+ // aapt resource value: 3
+ public const int AppCompatTheme_windowNoTitle = 3;
+
+ public static int[] BottomSheetBehavior_Params = new int[] {
+ 2130772218,
+ 2130772219};
+
+ // aapt resource value: 1
+ public const int BottomSheetBehavior_Params_behavior_hideable = 1;
+
+ // aapt resource value: 0
+ public const int BottomSheetBehavior_Params_behavior_peekHeight = 0;
+
+ public static int[] ButtonBarLayout = new int[] {
+ 2130772154};
+
+ // aapt resource value: 0
+ public const int ButtonBarLayout_allowStacking = 0;
+
+ public static int[] CardView = new int[] {
+ 16843071,
+ 16843072,
+ 2130771995,
+ 2130771996,
+ 2130771997,
+ 2130771998,
+ 2130771999,
+ 2130772000,
+ 2130772001,
+ 2130772002,
+ 2130772003,
+ 2130772004,
+ 2130772005};
+
+ // aapt resource value: 1
+ public const int CardView_android_minHeight = 1;
+
+ // aapt resource value: 0
+ public const int CardView_android_minWidth = 0;
+
+ // aapt resource value: 2
+ public const int CardView_cardBackgroundColor = 2;
+
+ // aapt resource value: 3
+ public const int CardView_cardCornerRadius = 3;
+
+ // aapt resource value: 4
+ public const int CardView_cardElevation = 4;
+
+ // aapt resource value: 5
+ public const int CardView_cardMaxElevation = 5;
+
+ // aapt resource value: 7
+ public const int CardView_cardPreventCornerOverlap = 7;
+
+ // aapt resource value: 6
+ public const int CardView_cardUseCompatPadding = 6;
+
+ // aapt resource value: 8
+ public const int CardView_contentPadding = 8;
+
+ // aapt resource value: 12
+ public const int CardView_contentPaddingBottom = 12;
+
+ // aapt resource value: 9
+ public const int CardView_contentPaddingLeft = 9;
+
+ // aapt resource value: 10
+ public const int CardView_contentPaddingRight = 10;
+
+ // aapt resource value: 11
+ public const int CardView_contentPaddingTop = 11;
+
+ public static int[] CollapsingAppBarLayout_LayoutParams = new int[] {
+ 2130772220,
+ 2130772221};
+
+ // aapt resource value: 0
+ public const int CollapsingAppBarLayout_LayoutParams_layout_collapseMode = 0;
+
+ // aapt resource value: 1
+ public const int CollapsingAppBarLayout_LayoutParams_layout_collapseParallaxMultiplier = 1;
+
+ public static int[] CollapsingToolbarLayout = new int[] {
+ 2130772009,
+ 2130772222,
+ 2130772223,
+ 2130772224,
+ 2130772225,
+ 2130772226,
+ 2130772227,
+ 2130772228,
+ 2130772229,
+ 2130772230,
+ 2130772231,
+ 2130772232,
+ 2130772233,
+ 2130772234};
+
+ // aapt resource value: 11
+ public const int CollapsingToolbarLayout_collapsedTitleGravity = 11;
+
+ // aapt resource value: 7
+ public const int CollapsingToolbarLayout_collapsedTitleTextAppearance = 7;
+
+ // aapt resource value: 8
+ public const int CollapsingToolbarLayout_contentScrim = 8;
+
+ // aapt resource value: 12
+ public const int CollapsingToolbarLayout_expandedTitleGravity = 12;
+
+ // aapt resource value: 1
+ public const int CollapsingToolbarLayout_expandedTitleMargin = 1;
+
+ // aapt resource value: 5
+ public const int CollapsingToolbarLayout_expandedTitleMarginBottom = 5;
+
+ // aapt resource value: 4
+ public const int CollapsingToolbarLayout_expandedTitleMarginEnd = 4;
+
+ // aapt resource value: 2
+ public const int CollapsingToolbarLayout_expandedTitleMarginStart = 2;
+
+ // aapt resource value: 3
+ public const int CollapsingToolbarLayout_expandedTitleMarginTop = 3;
+
+ // aapt resource value: 6
+ public const int CollapsingToolbarLayout_expandedTitleTextAppearance = 6;
+
+ // aapt resource value: 9
+ public const int CollapsingToolbarLayout_statusBarScrim = 9;
+
+ // aapt resource value: 0
+ public const int CollapsingToolbarLayout_title = 0;
+
+ // aapt resource value: 13
+ public const int CollapsingToolbarLayout_titleEnabled = 13;
+
+ // aapt resource value: 10
+ public const int CollapsingToolbarLayout_toolbarId = 10;
+
+ public static int[] CompoundButton = new int[] {
+ 16843015,
+ 2130772155,
+ 2130772156};
+
+ // aapt resource value: 0
+ public const int CompoundButton_android_button = 0;
+
+ // aapt resource value: 1
+ public const int CompoundButton_buttonTint = 1;
+
+ // aapt resource value: 2
+ public const int CompoundButton_buttonTintMode = 2;
+
+ public static int[] CoordinatorLayout = new int[] {
+ 2130772235,
+ 2130772236};
+
+ // aapt resource value: 0
+ public const int CoordinatorLayout_keylines = 0;
+
+ // aapt resource value: 1
+ public const int CoordinatorLayout_statusBarBackground = 1;
+
+ public static int[] CoordinatorLayout_LayoutParams = new int[] {
+ 16842931,
+ 2130772237,
+ 2130772238,
+ 2130772239,
+ 2130772240};
+
+ // aapt resource value: 0
+ public const int CoordinatorLayout_LayoutParams_android_layout_gravity = 0;
+
+ // aapt resource value: 2
+ public const int CoordinatorLayout_LayoutParams_layout_anchor = 2;
+
+ // aapt resource value: 4
+ public const int CoordinatorLayout_LayoutParams_layout_anchorGravity = 4;
+
+ // aapt resource value: 1
+ public const int CoordinatorLayout_LayoutParams_layout_behavior = 1;
+
+ // aapt resource value: 3
+ public const int CoordinatorLayout_LayoutParams_layout_keyline = 3;
+
+ public static int[] DesignTheme = new int[] {
+ 2130772241,
+ 2130772242,
+ 2130772243};
+
+ // aapt resource value: 0
+ public const int DesignTheme_bottomSheetDialogTheme = 0;
+
+ // aapt resource value: 1
+ public const int DesignTheme_bottomSheetStyle = 1;
+
+ // aapt resource value: 2
+ public const int DesignTheme_textColorError = 2;
+
+ public static int[] DrawerArrowToggle = new int[] {
+ 2130772157,
+ 2130772158,
+ 2130772159,
+ 2130772160,
+ 2130772161,
+ 2130772162,
+ 2130772163,
+ 2130772164};
+
+ // aapt resource value: 4
+ public const int DrawerArrowToggle_arrowHeadLength = 4;
+
+ // aapt resource value: 5
+ public const int DrawerArrowToggle_arrowShaftLength = 5;
+
+ // aapt resource value: 6
+ public const int DrawerArrowToggle_barLength = 6;
+
+ // aapt resource value: 0
+ public const int DrawerArrowToggle_color = 0;
+
+ // aapt resource value: 2
+ public const int DrawerArrowToggle_drawableSize = 2;
+
+ // aapt resource value: 3
+ public const int DrawerArrowToggle_gapBetweenBars = 3;
+
+ // aapt resource value: 1
+ public const int DrawerArrowToggle_spinBars = 1;
+
+ // aapt resource value: 7
+ public const int DrawerArrowToggle_thickness = 7;
+
+ public static int[] FloatingActionButton = new int[] {
+ 2130772032,
+ 2130772213,
+ 2130772214,
+ 2130772244,
+ 2130772245,
+ 2130772246,
+ 2130772247,
+ 2130772248};
+
+ // aapt resource value: 1
+ public const int FloatingActionButton_backgroundTint = 1;
+
+ // aapt resource value: 2
+ public const int FloatingActionButton_backgroundTintMode = 2;
+
+ // aapt resource value: 6
+ public const int FloatingActionButton_borderWidth = 6;
+
+ // aapt resource value: 0
+ public const int FloatingActionButton_elevation = 0;
+
+ // aapt resource value: 4
+ public const int FloatingActionButton_fabSize = 4;
+
+ // aapt resource value: 5
+ public const int FloatingActionButton_pressedTranslationZ = 5;
+
+ // aapt resource value: 3
+ public const int FloatingActionButton_rippleColor = 3;
+
+ // aapt resource value: 7
+ public const int FloatingActionButton_useCompatPadding = 7;
+
+ public static int[] ForegroundLinearLayout = new int[] {
+ 16843017,
+ 16843264,
+ 2130772249};
+
+ // aapt resource value: 0
+ public const int ForegroundLinearLayout_android_foreground = 0;
+
+ // aapt resource value: 1
+ public const int ForegroundLinearLayout_android_foregroundGravity = 1;
+
+ // aapt resource value: 2
+ public const int ForegroundLinearLayout_foregroundInsidePadding = 2;
+
+ public static int[] LinearLayoutCompat = new int[] {
+ 16842927,
+ 16842948,
+ 16843046,
+ 16843047,
+ 16843048,
+ 2130772017,
+ 2130772165,
+ 2130772166,
+ 2130772167};
+
+ // aapt resource value: 2
+ public const int LinearLayoutCompat_android_baselineAligned = 2;
+
+ // aapt resource value: 3
+ public const int LinearLayoutCompat_android_baselineAlignedChildIndex = 3;
+
+ // aapt resource value: 0
+ public const int LinearLayoutCompat_android_gravity = 0;
+
+ // aapt resource value: 1
+ public const int LinearLayoutCompat_android_orientation = 1;
+
+ // aapt resource value: 4
+ public const int LinearLayoutCompat_android_weightSum = 4;
+
+ // aapt resource value: 5
+ public const int LinearLayoutCompat_divider = 5;
+
+ // aapt resource value: 8
+ public const int LinearLayoutCompat_dividerPadding = 8;
+
+ // aapt resource value: 6
+ public const int LinearLayoutCompat_measureWithLargestChild = 6;
+
+ // aapt resource value: 7
+ public const int LinearLayoutCompat_showDividers = 7;
+
+ public static int[] LinearLayoutCompat_Layout = new int[] {
+ 16842931,
+ 16842996,
+ 16842997,
+ 16843137};
+
+ // aapt resource value: 0
+ public const int LinearLayoutCompat_Layout_android_layout_gravity = 0;
+
+ // aapt resource value: 2
+ public const int LinearLayoutCompat_Layout_android_layout_height = 2;
+
+ // aapt resource value: 3
+ public const int LinearLayoutCompat_Layout_android_layout_weight = 3;
+
+ // aapt resource value: 1
+ public const int LinearLayoutCompat_Layout_android_layout_width = 1;
+
+ public static int[] ListPopupWindow = new int[] {
+ 16843436,
+ 16843437};
+
+ // aapt resource value: 0
+ public const int ListPopupWindow_android_dropDownHorizontalOffset = 0;
+
+ // aapt resource value: 1
+ public const int ListPopupWindow_android_dropDownVerticalOffset = 1;
+
+ public static int[] MediaRouteButton = new int[] {
+ 16843071,
+ 16843072,
+ 2130771994};
+
+ // aapt resource value: 1
+ public const int MediaRouteButton_android_minHeight = 1;
+
+ // aapt resource value: 0
+ public const int MediaRouteButton_android_minWidth = 0;
+
+ // aapt resource value: 2
+ public const int MediaRouteButton_externalRouteEnabledDrawable = 2;
+
+ public static int[] MenuGroup = new int[] {
+ 16842766,
+ 16842960,
+ 16843156,
+ 16843230,
+ 16843231,
+ 16843232};
+
+ // aapt resource value: 5
+ public const int MenuGroup_android_checkableBehavior = 5;
+
+ // aapt resource value: 0
+ public const int MenuGroup_android_enabled = 0;
+
+ // aapt resource value: 1
+ public const int MenuGroup_android_id = 1;
+
+ // aapt resource value: 3
+ public const int MenuGroup_android_menuCategory = 3;
+
+ // aapt resource value: 4
+ public const int MenuGroup_android_orderInCategory = 4;
+
+ // aapt resource value: 2
+ public const int MenuGroup_android_visible = 2;
+
+ public static int[] MenuItem = new int[] {
+ 16842754,
+ 16842766,
+ 16842960,
+ 16843014,
+ 16843156,
+ 16843230,
+ 16843231,
+ 16843233,
+ 16843234,
+ 16843235,
+ 16843236,
+ 16843237,
+ 16843375,
+ 2130772168,
+ 2130772169,
+ 2130772170,
+ 2130772171};
+
+ // aapt resource value: 14
+ public const int MenuItem_actionLayout = 14;
+
+ // aapt resource value: 16
+ public const int MenuItem_actionProviderClass = 16;
+
+ // aapt resource value: 15
+ public const int MenuItem_actionViewClass = 15;
+
+ // aapt resource value: 9
+ public const int MenuItem_android_alphabeticShortcut = 9;
+
+ // aapt resource value: 11
+ public const int MenuItem_android_checkable = 11;
+
+ // aapt resource value: 3
+ public const int MenuItem_android_checked = 3;
+
+ // aapt resource value: 1
+ public const int MenuItem_android_enabled = 1;
+
+ // aapt resource value: 0
+ public const int MenuItem_android_icon = 0;
+
+ // aapt resource value: 2
+ public const int MenuItem_android_id = 2;
+
+ // aapt resource value: 5
+ public const int MenuItem_android_menuCategory = 5;
+
+ // aapt resource value: 10
+ public const int MenuItem_android_numericShortcut = 10;
+
+ // aapt resource value: 12
+ public const int MenuItem_android_onClick = 12;
+
+ // aapt resource value: 6
+ public const int MenuItem_android_orderInCategory = 6;
+
+ // aapt resource value: 7
+ public const int MenuItem_android_title = 7;
+
+ // aapt resource value: 8
+ public const int MenuItem_android_titleCondensed = 8;
+
+ // aapt resource value: 4
+ public const int MenuItem_android_visible = 4;
+
+ // aapt resource value: 13
+ public const int MenuItem_showAsAction = 13;
+
+ public static int[] MenuView = new int[] {
+ 16842926,
+ 16843052,
+ 16843053,
+ 16843054,
+ 16843055,
+ 16843056,
+ 16843057,
+ 2130772172};
+
+ // aapt resource value: 4
+ public const int MenuView_android_headerBackground = 4;
+
+ // aapt resource value: 2
+ public const int MenuView_android_horizontalDivider = 2;
+
+ // aapt resource value: 5
+ public const int MenuView_android_itemBackground = 5;
+
+ // aapt resource value: 6
+ public const int MenuView_android_itemIconDisabledAlpha = 6;
+
+ // aapt resource value: 1
+ public const int MenuView_android_itemTextAppearance = 1;
+
+ // aapt resource value: 3
+ public const int MenuView_android_verticalDivider = 3;
+
+ // aapt resource value: 0
+ public const int MenuView_android_windowAnimationStyle = 0;
+
+ // aapt resource value: 7
+ public const int MenuView_preserveIconSpacing = 7;
+
+ public static int[] NavigationView = new int[] {
+ 16842964,
+ 16842973,
+ 16843039,
+ 2130772032,
+ 2130772250,
+ 2130772251,
+ 2130772252,
+ 2130772253,
+ 2130772254,
+ 2130772255};
+
+ // aapt resource value: 0
+ public const int NavigationView_android_background = 0;
+
+ // aapt resource value: 1
+ public const int NavigationView_android_fitsSystemWindows = 1;
+
+ // aapt resource value: 2
+ public const int NavigationView_android_maxWidth = 2;
+
+ // aapt resource value: 3
+ public const int NavigationView_elevation = 3;
+
+ // aapt resource value: 9
+ public const int NavigationView_headerLayout = 9;
+
+ // aapt resource value: 7
+ public const int NavigationView_itemBackground = 7;
+
+ // aapt resource value: 5
+ public const int NavigationView_itemIconTint = 5;
+
+ // aapt resource value: 8
+ public const int NavigationView_itemTextAppearance = 8;
+
+ // aapt resource value: 6
+ public const int NavigationView_itemTextColor = 6;
+
+ // aapt resource value: 4
+ public const int NavigationView_menu = 4;
+
+ public static int[] PopupWindow = new int[] {
+ 16843126,
+ 2130772173};
+
+ // aapt resource value: 0
+ public const int PopupWindow_android_popupBackground = 0;
+
+ // aapt resource value: 1
+ public const int PopupWindow_overlapAnchor = 1;
+
+ public static int[] PopupWindowBackgroundState = new int[] {
+ 2130772174};
+
+ // aapt resource value: 0
+ public const int PopupWindowBackgroundState_state_above_anchor = 0;
+
+ public static int[] RecyclerView = new int[] {
+ 16842948,
+ 2130771968,
+ 2130771969,
+ 2130771970,
+ 2130771971};
+
+ // aapt resource value: 0
+ public const int RecyclerView_android_orientation = 0;
+
+ // aapt resource value: 1
+ public const int RecyclerView_layoutManager = 1;
+
+ // aapt resource value: 3
+ public const int RecyclerView_reverseLayout = 3;
+
+ // aapt resource value: 2
+ public const int RecyclerView_spanCount = 2;
+
+ // aapt resource value: 4
+ public const int RecyclerView_stackFromEnd = 4;
+
+ public static int[] ScrimInsetsFrameLayout = new int[] {
+ 2130772256};
+
+ // aapt resource value: 0
+ public const int ScrimInsetsFrameLayout_insetForeground = 0;
+
+ public static int[] ScrollingViewBehavior_Params = new int[] {
+ 2130772257};
+
+ // aapt resource value: 0
+ public const int ScrollingViewBehavior_Params_behavior_overlapTop = 0;
+
+ public static int[] SearchView = new int[] {
+ 16842970,
+ 16843039,
+ 16843296,
+ 16843364,
+ 2130772175,
+ 2130772176,
+ 2130772177,
+ 2130772178,
+ 2130772179,
+ 2130772180,
+ 2130772181,
+ 2130772182,
+ 2130772183,
+ 2130772184,
+ 2130772185,
+ 2130772186,
+ 2130772187};
+
+ // aapt resource value: 0
+ public const int SearchView_android_focusable = 0;
+
+ // aapt resource value: 3
+ public const int SearchView_android_imeOptions = 3;
+
+ // aapt resource value: 2
+ public const int SearchView_android_inputType = 2;
+
+ // aapt resource value: 1
+ public const int SearchView_android_maxWidth = 1;
+
+ // aapt resource value: 8
+ public const int SearchView_closeIcon = 8;
+
+ // aapt resource value: 13
+ public const int SearchView_commitIcon = 13;
+
+ // aapt resource value: 7
+ public const int SearchView_defaultQueryHint = 7;
+
+ // aapt resource value: 9
+ public const int SearchView_goIcon = 9;
+
+ // aapt resource value: 5
+ public const int SearchView_iconifiedByDefault = 5;
+
+ // aapt resource value: 4
+ public const int SearchView_layout = 4;
+
+ // aapt resource value: 15
+ public const int SearchView_queryBackground = 15;
+
+ // aapt resource value: 6
+ public const int SearchView_queryHint = 6;
+
+ // aapt resource value: 11
+ public const int SearchView_searchHintIcon = 11;
+
+ // aapt resource value: 10
+ public const int SearchView_searchIcon = 10;
+
+ // aapt resource value: 16
+ public const int SearchView_submitBackground = 16;
+
+ // aapt resource value: 14
+ public const int SearchView_suggestionRowLayout = 14;
+
+ // aapt resource value: 12
+ public const int SearchView_voiceIcon = 12;
+
+ public static int[] SnackbarLayout = new int[] {
+ 16843039,
+ 2130772032,
+ 2130772258};
+
+ // aapt resource value: 0
+ public const int SnackbarLayout_android_maxWidth = 0;
+
+ // aapt resource value: 1
+ public const int SnackbarLayout_elevation = 1;
+
+ // aapt resource value: 2
+ public const int SnackbarLayout_maxActionInlineWidth = 2;
+
+ public static int[] Spinner = new int[] {
+ 16842930,
+ 16843126,
+ 16843131,
+ 16843362,
+ 2130772033};
+
+ // aapt resource value: 3
+ public const int Spinner_android_dropDownWidth = 3;
+
+ // aapt resource value: 0
+ public const int Spinner_android_entries = 0;
+
+ // aapt resource value: 1
+ public const int Spinner_android_popupBackground = 1;
+
+ // aapt resource value: 2
+ public const int Spinner_android_prompt = 2;
+
+ // aapt resource value: 4
+ public const int Spinner_popupTheme = 4;
+
+ public static int[] SwitchCompat = new int[] {
+ 16843044,
+ 16843045,
+ 16843074,
+ 2130772188,
+ 2130772189,
+ 2130772190,
+ 2130772191,
+ 2130772192,
+ 2130772193,
+ 2130772194};
+
+ // aapt resource value: 1
+ public const int SwitchCompat_android_textOff = 1;
+
+ // aapt resource value: 0
+ public const int SwitchCompat_android_textOn = 0;
+
+ // aapt resource value: 2
+ public const int SwitchCompat_android_thumb = 2;
+
+ // aapt resource value: 9
+ public const int SwitchCompat_showText = 9;
+
+ // aapt resource value: 8
+ public const int SwitchCompat_splitTrack = 8;
+
+ // aapt resource value: 6
+ public const int SwitchCompat_switchMinWidth = 6;
+
+ // aapt resource value: 7
+ public const int SwitchCompat_switchPadding = 7;
+
+ // aapt resource value: 5
+ public const int SwitchCompat_switchTextAppearance = 5;
+
+ // aapt resource value: 4
+ public const int SwitchCompat_thumbTextPadding = 4;
+
+ // aapt resource value: 3
+ public const int SwitchCompat_track = 3;
+
+ public static int[] TabItem = new int[] {
+ 16842754,
+ 16842994,
+ 16843087};
+
+ // aapt resource value: 0
+ public const int TabItem_android_icon = 0;
+
+ // aapt resource value: 1
+ public const int TabItem_android_layout = 1;
+
+ // aapt resource value: 2
+ public const int TabItem_android_text = 2;
+
+ public static int[] TabLayout = new int[] {
+ 2130772259,
+ 2130772260,
+ 2130772261,
+ 2130772262,
+ 2130772263,
+ 2130772264,
+ 2130772265,
+ 2130772266,
+ 2130772267,
+ 2130772268,
+ 2130772269,
+ 2130772270,
+ 2130772271,
+ 2130772272,
+ 2130772273,
+ 2130772274};
+
+ // aapt resource value: 3
+ public const int TabLayout_tabBackground = 3;
+
+ // aapt resource value: 2
+ public const int TabLayout_tabContentStart = 2;
+
+ // aapt resource value: 5
+ public const int TabLayout_tabGravity = 5;
+
+ // aapt resource value: 0
+ public const int TabLayout_tabIndicatorColor = 0;
+
+ // aapt resource value: 1
+ public const int TabLayout_tabIndicatorHeight = 1;
+
+ // aapt resource value: 7
+ public const int TabLayout_tabMaxWidth = 7;
+
+ // aapt resource value: 6
+ public const int TabLayout_tabMinWidth = 6;
+
+ // aapt resource value: 4
+ public const int TabLayout_tabMode = 4;
+
+ // aapt resource value: 15
+ public const int TabLayout_tabPadding = 15;
+
+ // aapt resource value: 14
+ public const int TabLayout_tabPaddingBottom = 14;
+
+ // aapt resource value: 13
+ public const int TabLayout_tabPaddingEnd = 13;
+
+ // aapt resource value: 11
+ public const int TabLayout_tabPaddingStart = 11;
+
+ // aapt resource value: 12
+ public const int TabLayout_tabPaddingTop = 12;
+
+ // aapt resource value: 10
+ public const int TabLayout_tabSelectedTextColor = 10;
+
+ // aapt resource value: 8
+ public const int TabLayout_tabTextAppearance = 8;
+
+ // aapt resource value: 9
+ public const int TabLayout_tabTextColor = 9;
+
+ public static int[] TextAppearance = new int[] {
+ 16842901,
+ 16842902,
+ 16842903,
+ 16842904,
+ 16843105,
+ 16843106,
+ 16843107,
+ 16843108,
+ 2130772043};
+
+ // aapt resource value: 4
+ public const int TextAppearance_android_shadowColor = 4;
+
+ // aapt resource value: 5
+ public const int TextAppearance_android_shadowDx = 5;
+
+ // aapt resource value: 6
+ public const int TextAppearance_android_shadowDy = 6;
+
+ // aapt resource value: 7
+ public const int TextAppearance_android_shadowRadius = 7;
+
+ // aapt resource value: 3
+ public const int TextAppearance_android_textColor = 3;
+
+ // aapt resource value: 0
+ public const int TextAppearance_android_textSize = 0;
+
+ // aapt resource value: 2
+ public const int TextAppearance_android_textStyle = 2;
+
+ // aapt resource value: 1
+ public const int TextAppearance_android_typeface = 1;
+
+ // aapt resource value: 8
+ public const int TextAppearance_textAllCaps = 8;
+
+ public static int[] TextInputLayout = new int[] {
+ 16842906,
+ 16843088,
+ 2130772275,
+ 2130772276,
+ 2130772277,
+ 2130772278,
+ 2130772279,
+ 2130772280,
+ 2130772281,
+ 2130772282,
+ 2130772283};
+
+ // aapt resource value: 1
+ public const int TextInputLayout_android_hint = 1;
+
+ // aapt resource value: 0
+ public const int TextInputLayout_android_textColorHint = 0;
+
+ // aapt resource value: 6
+ public const int TextInputLayout_counterEnabled = 6;
+
+ // aapt resource value: 7
+ public const int TextInputLayout_counterMaxLength = 7;
+
+ // aapt resource value: 9
+ public const int TextInputLayout_counterOverflowTextAppearance = 9;
+
+ // aapt resource value: 8
+ public const int TextInputLayout_counterTextAppearance = 8;
+
+ // aapt resource value: 4
+ public const int TextInputLayout_errorEnabled = 4;
+
+ // aapt resource value: 5
+ public const int TextInputLayout_errorTextAppearance = 5;
+
+ // aapt resource value: 10
+ public const int TextInputLayout_hintAnimationEnabled = 10;
+
+ // aapt resource value: 3
+ public const int TextInputLayout_hintEnabled = 3;
+
+ // aapt resource value: 2
+ public const int TextInputLayout_hintTextAppearance = 2;
+
+ public static int[] Toolbar = new int[] {
+ 16842927,
+ 16843072,
+ 2130772009,
+ 2130772012,
+ 2130772016,
+ 2130772028,
+ 2130772029,
+ 2130772030,
+ 2130772031,
+ 2130772033,
+ 2130772195,
+ 2130772196,
+ 2130772197,
+ 2130772198,
+ 2130772199,
+ 2130772200,
+ 2130772201,
+ 2130772202,
+ 2130772203,
+ 2130772204,
+ 2130772205,
+ 2130772206,
+ 2130772207,
+ 2130772208,
+ 2130772209};
+
+ // aapt resource value: 0
+ public const int Toolbar_android_gravity = 0;
+
+ // aapt resource value: 1
+ public const int Toolbar_android_minHeight = 1;
+
+ // aapt resource value: 19
+ public const int Toolbar_collapseContentDescription = 19;
+
+ // aapt resource value: 18
+ public const int Toolbar_collapseIcon = 18;
+
+ // aapt resource value: 6
+ public const int Toolbar_contentInsetEnd = 6;
+
+ // aapt resource value: 7
+ public const int Toolbar_contentInsetLeft = 7;
+
+ // aapt resource value: 8
+ public const int Toolbar_contentInsetRight = 8;
+
+ // aapt resource value: 5
+ public const int Toolbar_contentInsetStart = 5;
+
+ // aapt resource value: 4
+ public const int Toolbar_logo = 4;
+
+ // aapt resource value: 22
+ public const int Toolbar_logoDescription = 22;
+
+ // aapt resource value: 17
+ public const int Toolbar_maxButtonHeight = 17;
+
+ // aapt resource value: 21
+ public const int Toolbar_navigationContentDescription = 21;
+
+ // aapt resource value: 20
+ public const int Toolbar_navigationIcon = 20;
+
+ // aapt resource value: 9
+ public const int Toolbar_popupTheme = 9;
+
+ // aapt resource value: 3
+ public const int Toolbar_subtitle = 3;
+
+ // aapt resource value: 11
+ public const int Toolbar_subtitleTextAppearance = 11;
+
+ // aapt resource value: 24
+ public const int Toolbar_subtitleTextColor = 24;
+
+ // aapt resource value: 2
+ public const int Toolbar_title = 2;
+
+ // aapt resource value: 16
+ public const int Toolbar_titleMarginBottom = 16;
+
+ // aapt resource value: 14
+ public const int Toolbar_titleMarginEnd = 14;
+
+ // aapt resource value: 13
+ public const int Toolbar_titleMarginStart = 13;
+
+ // aapt resource value: 15
+ public const int Toolbar_titleMarginTop = 15;
+
+ // aapt resource value: 12
+ public const int Toolbar_titleMargins = 12;
+
+ // aapt resource value: 10
+ public const int Toolbar_titleTextAppearance = 10;
+
+ // aapt resource value: 23
+ public const int Toolbar_titleTextColor = 23;
+
+ public static int[] View = new int[] {
+ 16842752,
+ 16842970,
+ 2130772210,
+ 2130772211,
+ 2130772212};
+
+ // aapt resource value: 1
+ public const int View_android_focusable = 1;
+
+ // aapt resource value: 0
+ public const int View_android_theme = 0;
+
+ // aapt resource value: 3
+ public const int View_paddingEnd = 3;
+
+ // aapt resource value: 2
+ public const int View_paddingStart = 2;
+
+ // aapt resource value: 4
+ public const int View_theme = 4;
+
+ public static int[] ViewBackgroundHelper = new int[] {
+ 16842964,
+ 2130772213,
+ 2130772214};
+
+ // aapt resource value: 0
+ public const int ViewBackgroundHelper_android_background = 0;
+
+ // aapt resource value: 1
+ public const int ViewBackgroundHelper_backgroundTint = 1;
+
+ // aapt resource value: 2
+ public const int ViewBackgroundHelper_backgroundTintMode = 2;
+
+ public static int[] ViewStubCompat = new int[] {
+ 16842960,
+ 16842994,
+ 16842995};
+
+ // aapt resource value: 0
+ public const int ViewStubCompat_android_id = 0;
+
+ // aapt resource value: 2
+ public const int ViewStubCompat_android_inflatedId = 2;
+
+ // aapt resource value: 1
+ public const int ViewStubCompat_android_layout = 1;
+
+ static Styleable()
+ {
+ global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+ }
+
+ private Styleable()
+ {
+ }
+ }
+ }
+}
+#pragma warning restore 1591
diff --git a/LivePlayer/RpnCalculator/Droid/Resources/drawable-hdpi/icon.png b/LivePlayer/RpnCalculator/Droid/Resources/drawable-hdpi/icon.png
new file mode 100644
index 000000000..964f110ab
Binary files /dev/null and b/LivePlayer/RpnCalculator/Droid/Resources/drawable-hdpi/icon.png differ
diff --git a/LivePlayer/RpnCalculator/Droid/Resources/drawable-xhdpi/icon.png b/LivePlayer/RpnCalculator/Droid/Resources/drawable-xhdpi/icon.png
new file mode 100644
index 000000000..3c01e60ce
Binary files /dev/null and b/LivePlayer/RpnCalculator/Droid/Resources/drawable-xhdpi/icon.png differ
diff --git a/LivePlayer/RpnCalculator/Droid/Resources/drawable-xxhdpi/icon.png b/LivePlayer/RpnCalculator/Droid/Resources/drawable-xxhdpi/icon.png
new file mode 100644
index 000000000..0d8c1c57d
Binary files /dev/null and b/LivePlayer/RpnCalculator/Droid/Resources/drawable-xxhdpi/icon.png differ
diff --git a/LivePlayer/RpnCalculator/Droid/Resources/drawable/icon.png b/LivePlayer/RpnCalculator/Droid/Resources/drawable/icon.png
new file mode 100644
index 000000000..b0ba7150f
Binary files /dev/null and b/LivePlayer/RpnCalculator/Droid/Resources/drawable/icon.png differ
diff --git a/LivePlayer/RpnCalculator/Droid/Resources/layout/Tabbar.axml b/LivePlayer/RpnCalculator/Droid/Resources/layout/Tabbar.axml
new file mode 100644
index 000000000..0bc7e9db6
--- /dev/null
+++ b/LivePlayer/RpnCalculator/Droid/Resources/layout/Tabbar.axml
@@ -0,0 +1,2 @@
+
+
diff --git a/LivePlayer/RpnCalculator/Droid/Resources/layout/Toolbar.axml b/LivePlayer/RpnCalculator/Droid/Resources/layout/Toolbar.axml
new file mode 100644
index 000000000..d685cbadb
--- /dev/null
+++ b/LivePlayer/RpnCalculator/Droid/Resources/layout/Toolbar.axml
@@ -0,0 +1,2 @@
+
+
diff --git a/LivePlayer/RpnCalculator/Droid/Resources/values/styles.xml b/LivePlayer/RpnCalculator/Droid/Resources/values/styles.xml
new file mode 100644
index 000000000..7d6f9e578
--- /dev/null
+++ b/LivePlayer/RpnCalculator/Droid/Resources/values/styles.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
diff --git a/LivePlayer/RpnCalculator/Droid/RpnCalculator.Droid.csproj b/LivePlayer/RpnCalculator/Droid/RpnCalculator.Droid.csproj
new file mode 100644
index 000000000..56b7fc582
--- /dev/null
+++ b/LivePlayer/RpnCalculator/Droid/RpnCalculator.Droid.csproj
@@ -0,0 +1,118 @@
+
+
+
+ Debug
+ AnyCPU
+ {8C1B9066-AB96-4197-9002-24DF75AD472B}
+ {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ Library
+ RpnCalculator.Droid
+ RpnCalculator.Droid
+ True
+ Resources\Resource.designer.cs
+ Resource
+ Properties\AndroidManifest.xml
+ Resources
+ Assets
+ true
+ v6.0
+
+
+
+
+ true
+ full
+ false
+ bin\Debug
+ DEBUG;
+ prompt
+ 4
+ None
+
+
+ true
+ pdbonly
+ true
+ bin\Release
+ prompt
+ 4
+ true
+ false
+
+
+
+ ..\packages\Xamarin.Forms.2.3.4.247\lib\MonoAndroid10\FormsViewGroup.dll
+
+
+
+
+
+
+ ..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.Animated.Vector.Drawable.dll
+
+
+ ..\packages\Xamarin.Android.Support.Design.23.3.0\lib\MonoAndroid43\Xamarin.Android.Support.Design.dll
+
+
+ ..\packages\Xamarin.Android.Support.v4.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v4.dll
+
+
+ ..\packages\Xamarin.Android.Support.v7.AppCompat.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v7.AppCompat.dll
+
+
+ ..\packages\Xamarin.Android.Support.v7.CardView.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v7.CardView.dll
+
+
+ ..\packages\Xamarin.Android.Support.v7.MediaRouter.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v7.MediaRouter.dll
+
+
+ ..\packages\Xamarin.Android.Support.v7.RecyclerView.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v7.RecyclerView.dll
+
+
+ ..\packages\Xamarin.Android.Support.Vector.Drawable.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.Vector.Drawable.dll
+
+
+ ..\packages\Xamarin.Forms.2.3.4.247\lib\MonoAndroid10\Xamarin.Forms.Core.dll
+
+
+ ..\packages\Xamarin.Forms.2.3.4.247\lib\MonoAndroid10\Xamarin.Forms.Platform.dll
+
+
+ ..\packages\Xamarin.Forms.2.3.4.247\lib\MonoAndroid10\Xamarin.Forms.Platform.Android.dll
+
+
+ ..\packages\Xamarin.Forms.2.3.4.247\lib\MonoAndroid10\Xamarin.Forms.Xaml.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/RpnCalculator/Droid/packages.config b/LivePlayer/RpnCalculator/Droid/packages.config
new file mode 100644
index 000000000..69bcae05c
--- /dev/null
+++ b/LivePlayer/RpnCalculator/Droid/packages.config
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/RpnCalculator/Metadata.xml b/LivePlayer/RpnCalculator/Metadata.xml
new file mode 100644
index 000000000..984fc295d
--- /dev/null
+++ b/LivePlayer/RpnCalculator/Metadata.xml
@@ -0,0 +1,11 @@
+
+
+ 317A6E3D-6091-4A90-B824-27B33670A887
+ true
+ Beginner
+ liveplayer
+ Android, iOS
+ Community
+ RPN calculator built with Xamarin.Forms.
+ false
+
diff --git a/LivePlayer/RpnCalculator/RpnCalculator.sln b/LivePlayer/RpnCalculator/RpnCalculator.sln
new file mode 100644
index 000000000..2c786ccee
--- /dev/null
+++ b/LivePlayer/RpnCalculator/RpnCalculator.sln
@@ -0,0 +1,45 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "RpnCalculator", "RpnCalculator\RpnCalculator.shproj", "{25443187-2105-453A-830E-973C5539D680}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RpnCalculator.iOS", "iOS\RpnCalculator.iOS.csproj", "{4E4AD5FA-7A69-4DFA-92F9-F846D528B084}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RpnCalculator.Droid", "Droid\RpnCalculator.Droid.csproj", "{8C1B9066-AB96-4197-9002-24DF75AD472B}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|iPhoneSimulator = Debug|iPhoneSimulator
+ Release|iPhone = Release|iPhone
+ Release|iPhoneSimulator = Release|iPhoneSimulator
+ Debug|iPhone = Debug|iPhone
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {4E4AD5FA-7A69-4DFA-92F9-F846D528B084}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
+ {4E4AD5FA-7A69-4DFA-92F9-F846D528B084}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
+ {4E4AD5FA-7A69-4DFA-92F9-F846D528B084}.Release|iPhone.ActiveCfg = Release|iPhone
+ {4E4AD5FA-7A69-4DFA-92F9-F846D528B084}.Release|iPhone.Build.0 = Release|iPhone
+ {4E4AD5FA-7A69-4DFA-92F9-F846D528B084}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
+ {4E4AD5FA-7A69-4DFA-92F9-F846D528B084}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
+ {4E4AD5FA-7A69-4DFA-92F9-F846D528B084}.Debug|iPhone.ActiveCfg = Debug|iPhone
+ {4E4AD5FA-7A69-4DFA-92F9-F846D528B084}.Debug|iPhone.Build.0 = Debug|iPhone
+ {4E4AD5FA-7A69-4DFA-92F9-F846D528B084}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator
+ {4E4AD5FA-7A69-4DFA-92F9-F846D528B084}.Debug|Any CPU.Build.0 = Debug|iPhoneSimulator
+ {4E4AD5FA-7A69-4DFA-92F9-F846D528B084}.Release|Any CPU.ActiveCfg = Release|iPhone
+ {4E4AD5FA-7A69-4DFA-92F9-F846D528B084}.Release|Any CPU.Build.0 = Release|iPhone
+ {8C1B9066-AB96-4197-9002-24DF75AD472B}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {8C1B9066-AB96-4197-9002-24DF75AD472B}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {8C1B9066-AB96-4197-9002-24DF75AD472B}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {8C1B9066-AB96-4197-9002-24DF75AD472B}.Release|iPhone.Build.0 = Release|Any CPU
+ {8C1B9066-AB96-4197-9002-24DF75AD472B}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {8C1B9066-AB96-4197-9002-24DF75AD472B}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {8C1B9066-AB96-4197-9002-24DF75AD472B}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {8C1B9066-AB96-4197-9002-24DF75AD472B}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {8C1B9066-AB96-4197-9002-24DF75AD472B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8C1B9066-AB96-4197-9002-24DF75AD472B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8C1B9066-AB96-4197-9002-24DF75AD472B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8C1B9066-AB96-4197-9002-24DF75AD472B}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+EndGlobal
diff --git a/LivePlayer/RpnCalculator/RpnCalculator/App.cs b/LivePlayer/RpnCalculator/RpnCalculator/App.cs
new file mode 100644
index 000000000..585c0cbe5
--- /dev/null
+++ b/LivePlayer/RpnCalculator/RpnCalculator/App.cs
@@ -0,0 +1,37 @@
+using System;
+
+using Xamarin.Forms;
+
+namespace RpnCalculator
+{
+ public class App : Application
+ {
+ public App()
+ {
+ // The root page of your application
+ var content = new ContentPage
+ {
+ Title = "RpnCalculator",
+
+ };
+ var calc = new Calculator();
+ content.Content = calc.Make(content);
+ MainPage = content;
+ }
+
+ protected override void OnStart()
+ {
+ // Handle when your app starts
+ }
+
+ protected override void OnSleep()
+ {
+ // Handle when your app sleeps
+ }
+
+ protected override void OnResume()
+ {
+ // Handle when your app resumes
+ }
+ }
+}
diff --git a/LivePlayer/RpnCalculator/RpnCalculator/RpnCalculator.cs b/LivePlayer/RpnCalculator/RpnCalculator/RpnCalculator.cs
new file mode 100644
index 000000000..052307c32
--- /dev/null
+++ b/LivePlayer/RpnCalculator/RpnCalculator/RpnCalculator.cs
@@ -0,0 +1,383 @@
+using System;
+using System.Collections.Generic;
+using Xamarin.Forms;
+
+namespace RpnCalculator
+{
+ public class Calculator
+ {
+ public Grid Make(ContentPage page)
+ {
+
+ var mainGrid = new Grid();
+ page.Content = mainGrid;
+
+
+ mainGrid.BackgroundColor = Color.Transparent;
+
+ page.Padding = new Thickness(10, 10 + Device.OnPlatform(20, 0, 0), 10, 10);
+
+
+ // Remove previous RowDefinition objects on re-execution:
+ mainGrid.RowDefinitions.Clear();
+
+ mainGrid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto });
+ mainGrid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto });
+
+ for (int row = 0; row < 10; row++)
+ {
+ mainGrid.RowDefinitions.Add(new RowDefinition
+ {
+ Height = new GridLength(1, GridUnitType.Star)
+ });
+ }
+
+
+ // Remove previous ColumnDefinition objects on re-execution:
+ mainGrid.ColumnDefinitions.Clear();
+
+ for (int col = 0; col < 4; col++)
+ {
+ mainGrid.ColumnDefinitions.Add(new ColumnDefinition
+ {
+ Width = new GridLength(1, GridUnitType.Star)
+ });
+ }
+
+
+
+ // ENTERING NUMBERS
+
+ Label entryLabel = new Label
+ {
+ Text = "0",
+ BackgroundColor = new Color(0.85),
+ HorizontalTextAlignment = TextAlignment.End
+ };
+ mainGrid.Children.Add(entryLabel, 0, 4, 1, 2);
+
+
+
+ var numButtonInfos = new[]
+ {
+ new { text = "7", row = 7, col = 0, span = 1 },
+ new { text = "8", row = 7, col = 1, span = 1 },
+ new { text = "9", row = 7, col = 2, span = 1 },
+ new { text = "4", row = 8, col = 0, span = 1 },
+ new { text = "5", row = 8, col = 1, span = 1 },
+ new { text = "6", row = 8, col = 2, span = 1 },
+ new { text = "1", row = 9, col = 0, span = 1 },
+ new { text = "2", row = 9, col = 1, span = 1 },
+ new { text = "3", row = 9, col = 2, span = 1 },
+ new { text = "0", row = 10, col = 0, span = 2 },
+ new { text = ".", row = 10, col = 2, span = 1 }
+ };
+
+ foreach (var numButtonInfo in numButtonInfos)
+ {
+ var button = new Button
+ {
+ Text = numButtonInfo.text,
+ Margin = new Thickness(5)
+ };
+ button.Clicked += (sender, args) =>
+ {
+ string text = entryLabel.Text == "0" ? "" : entryLabel.Text;
+ text += (sender as Button).Text;
+
+ if (text == ".")
+ {
+ text = "0.";
+ }
+
+ double number;
+ if (Double.TryParse(text, out number))
+ {
+ entryLabel.Text = text;
+ }
+ else
+ {
+ Beeper.Error();
+ }
+ };
+ mainGrid.Children.Add(button, numButtonInfo.col,
+ numButtonInfo.col + numButtonInfo.span,
+ numButtonInfo.row,
+ numButtonInfo.row + 1);
+ }
+
+ var resourceDictionary = new ResourceDictionary();
+ page.Resources = resourceDictionary;
+
+
+ var buttonStyle = new Style(typeof(Button));
+ buttonStyle.Setters.Add(new Setter
+ {
+ Property = Button.BorderWidthProperty,
+ Value = 1
+ });
+
+ resourceDictionary.Add(buttonStyle);
+
+
+
+ // MANAGING THE STACK
+
+ stack = new Stack();
+
+
+ var stackGrid = new Grid();
+ stackGrid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto });
+ stackGrid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto });
+ stackGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto });
+ stackGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
+ mainGrid.Children.Add(stackGrid, 0, 4, 0, 1);
+
+
+ var xLabel = new Label { Text = "x = " };
+ stackGrid.Children.Add(xLabel, 0, 1);
+
+ xStackNumber = new Label { HorizontalTextAlignment = TextAlignment.End };
+ stackGrid.Children.Add(xStackNumber, 1, 1);
+
+ var yLabel = new Label { Text = "y = " };
+ stackGrid.Children.Add(yLabel, 0, 0);
+
+ yStackNumber = new Label { HorizontalTextAlignment = TextAlignment.End };
+ stackGrid.Children.Add(yStackNumber, 1, 0);
+
+
+
+ var enterButton = new Button
+ {
+ Text = "Enter"
+ };
+ enterButton.Clicked += (args, sender) =>
+ {
+ stack.Push(Double.Parse(entryLabel.Text));
+ entryLabel.Text = "0";
+ UpdateStackDisplay();
+ };
+ mainGrid.Children.Add(enterButton, 0, 4, 11, 12);
+
+
+ // CLEARING AND BACKSPACE
+
+ var clearAllButton = new Button { Text = "C" };
+ clearAllButton.Clicked += (args, sender) =>
+ {
+ stack.Clear();
+ entryLabel.Text = "0";
+ UpdateStackDisplay();
+ };
+ mainGrid.Children.Add(clearAllButton, 0, 6);
+
+
+ var clearEntryButton = new Button { Text = "CE" };
+ clearEntryButton.Clicked += (args, sender) =>
+ {
+ entryLabel.Text = "0";
+ };
+ mainGrid.Children.Add(clearEntryButton, 1, 6);
+
+
+ var backspaceButton = new Button { Text = "\x21E6" };
+ backspaceButton.Clicked += (args, sender) =>
+ {
+ entryLabel.Text = entryLabel.Text.Substring(0, entryLabel.Text.Length - 1);
+ if (entryLabel.Text.Length == 0)
+ {
+ entryLabel.Text = "0";
+ }
+ };
+ mainGrid.Children.Add(backspaceButton, 2, 4, 6, 7);
+
+ // BINARY OPERATIONS
+
+
+ var swapButton = new Button { Text = "x\x21D4y" };
+ swapButton.Clicked += (args, sender) =>
+ {
+ if (stack.Count < 2)
+ {
+ Beeper.Error();
+ }
+ else
+ {
+ double x = stack.Pop();
+ double y = stack.Pop();
+ stack.Push(x);
+ stack.Push(y);
+ UpdateStackDisplay();
+ }
+ };
+ mainGrid.Children.Add(swapButton, 1, 5);
+
+
+ BinaryOpInfo[] binaryOpInfos =
+ {
+ new BinaryOpInfo { Text = "\x00F7", Row = 7, Col = 3, Operation = (x, y) => x / y },
+ new BinaryOpInfo { Text = "\x00D7", Row = 8, Col = 3, Operation = (x, y) => x * y },
+ new BinaryOpInfo { Text = "\x2013", Row = 9, Col = 3, Operation = (x, y) => x - y },
+ new BinaryOpInfo { Text = "+", Row = 10, Col = 3, Operation = (x, y) => x + y },
+ new BinaryOpInfo { Text = "y\x1D61", Row = 2, Col = 0, Operation = Math.Pow }
+ };
+
+
+ Dictionary> binaryOpDictionary =
+ new Dictionary>();
+
+ foreach (BinaryOpInfo binaryOpInfo in binaryOpInfos)
+ {
+ var binaryOpButton = new Button // new BinaryOperationButton
+ {
+ Text = binaryOpInfo.Text,
+ // Operation = binaryOpInfo.Operation,
+ Style = buttonStyle
+ };
+
+ binaryOpDictionary.Add(binaryOpButton, binaryOpInfo.Operation);
+
+ binaryOpButton.Clicked += (sender, args) =>
+ {
+ if (entryLabel.Text != "0")
+ {
+ stack.Push(Double.Parse(entryLabel.Text));
+ entryLabel.Text = "0";
+ }
+ if (stack.Count < 2)
+ {
+ Beeper.Error();
+ }
+ else
+ {
+ // BinaryOperationButton button = sender as BinaryOperationButton;
+ Button button = sender as Button;
+ double x = stack.Pop();
+ double y = stack.Pop();
+ stack.Push(binaryOpDictionary[button](y, x));
+ UpdateStackDisplay();
+ }
+ };
+ mainGrid.Children.Add(binaryOpButton, binaryOpInfo.Col, binaryOpInfo.Row);
+ }
+
+
+
+ // UNARY OPERATIONS
+
+
+ UnaryOpInfo[] unaryOpInfos =
+ {
+ new UnaryOpInfo { Text = "log", Row = 2, Col = 1, Operation = Math.Log10 },
+ new UnaryOpInfo { Text = "ln", Row = 2, Col = 2, Operation = Math.Log },
+ new UnaryOpInfo { Text = "e\x1D61", Row = 2, Col = 3, Operation = Math.Exp },
+ new UnaryOpInfo { Text = "\x221Ax", Row = 3, Col = 0, Operation = Math.Sqrt },
+ new UnaryOpInfo { Text = "sin", Row = 3, Col = 1, Operation = Math.Sin },
+ new UnaryOpInfo { Text = "cos", Row = 3, Col = 2, Operation = Math.Cos },
+ new UnaryOpInfo { Text = "tan", Row = 3, Col = 3, Operation = Math.Tan },
+ new UnaryOpInfo { Text = "1/x", Row = 4, Col = 0, Operation = x => 1 / x },
+ new UnaryOpInfo { Text = "asin", Row = 4, Col = 1, Operation = Math.Asin },
+ new UnaryOpInfo { Text = "acos", Row = 4, Col = 2, Operation = Math.Acos },
+ new UnaryOpInfo { Text = "atan", Row = 4, Col = 3, Operation = Math.Atan },
+ new UnaryOpInfo { Text = "+/\x2013", Row = 5, Col = 0, Operation = x => -x },
+ new UnaryOpInfo { Text = "rad", Row = 5, Col = 2, Operation = d => Math.PI * d / 180 },
+ new UnaryOpInfo { Text = "deg", Row = 5, Col = 3, Operation = r => 180 * r / Math.PI }
+ };
+
+ Dictionary> unaryOpDictionary =
+ new Dictionary>();
+
+
+ foreach (UnaryOpInfo unaryOpInfo in unaryOpInfos)
+ {
+ var unaryOpButton = new Button // new UnaryOperationButton
+ {
+ Text = unaryOpInfo.Text,
+ // Operation = unaryOpInfo.Operation,
+ Style = buttonStyle
+ };
+
+ unaryOpDictionary.Add(unaryOpButton, unaryOpInfo.Operation);
+
+ unaryOpButton.Clicked += (sender, args) =>
+ {
+ if (entryLabel.Text != "0")
+ {
+ stack.Push(Double.Parse(entryLabel.Text));
+ entryLabel.Text = "0";
+ }
+ if (stack.Count < 1)
+ {
+ Beeper.Error();
+ }
+ else
+ {
+ Button button = sender as Button;
+ double x = stack.Pop();
+ stack.Push(unaryOpDictionary[button](x));
+ UpdateStackDisplay();
+ }
+ };
+ mainGrid.Children.Add(unaryOpButton, unaryOpInfo.Col, unaryOpInfo.Row);
+ }
+
+
+
+
+ return mainGrid;
+ }
+
+ Stack stack;
+ Label xStackNumber, yStackNumber;
+
+ void UpdateStackDisplay()
+ {
+ xStackNumber.Text = stack.Count > 0 ? stack.Peek().ToString() : "";
+
+ if (stack.Count > 1)
+ {
+ double hold = stack.Pop();
+ yStackNumber.Text = stack.Peek().ToString();
+ stack.Push(hold);
+ }
+ else
+ {
+ yStackNumber.Text = "";
+ }
+ }
+
+ }
+
+ static class Beeper
+ {
+ public static void Error()
+ {
+#if __ANDROID__
+ Android.Media.ToneGenerator toneGenerator = new Android.Media.ToneGenerator(Android.Media.Stream.Music, 100);
+ toneGenerator.StartTone(Android.Media.Tone.CdmaPip, 150);
+#elif __IOS__
+ AudioToolbox.SystemSound systemSound = systemSound = new AudioToolbox.SystemSound(1000);
+ systemSound.PlaySystemSound();
+#endif
+ }
+ }
+
+
+ public struct BinaryOpInfo
+ {
+ public string Text { set; get; }
+ public int Row { set; get; }
+ public int Col { set; get; }
+ public Func Operation { set; get; }
+ }
+
+ public struct UnaryOpInfo
+ {
+ public string Text { set; get; }
+ public int Row { set; get; }
+ public int Col { set; get; }
+ public Func Operation { set; get; }
+ }
+
+}
diff --git a/LivePlayer/RpnCalculator/RpnCalculator/RpnCalculator.projitems b/LivePlayer/RpnCalculator/RpnCalculator/RpnCalculator.projitems
new file mode 100644
index 000000000..2367a11f0
--- /dev/null
+++ b/LivePlayer/RpnCalculator/RpnCalculator/RpnCalculator.projitems
@@ -0,0 +1,15 @@
+
+
+
+ $(MSBuildAllProjects);$(MSBuildThisFileFullPath)
+ true
+ {25443187-2105-453A-830E-973C5539D680}
+
+
+ RpnCalculator
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/RpnCalculator/RpnCalculator/RpnCalculator.shproj b/LivePlayer/RpnCalculator/RpnCalculator/RpnCalculator.shproj
new file mode 100644
index 000000000..8d0a42bf3
--- /dev/null
+++ b/LivePlayer/RpnCalculator/RpnCalculator/RpnCalculator.shproj
@@ -0,0 +1,11 @@
+
+
+
+ {25443187-2105-453A-830E-973C5539D680}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/RpnCalculator/Screenshots/rpn-calculator-sml.png b/LivePlayer/RpnCalculator/Screenshots/rpn-calculator-sml.png
new file mode 100644
index 000000000..b0569f564
Binary files /dev/null and b/LivePlayer/RpnCalculator/Screenshots/rpn-calculator-sml.png differ
diff --git a/LivePlayer/RpnCalculator/iOS/AppDelegate.cs b/LivePlayer/RpnCalculator/iOS/AppDelegate.cs
new file mode 100644
index 000000000..89ea8a240
--- /dev/null
+++ b/LivePlayer/RpnCalculator/iOS/AppDelegate.cs
@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using Foundation;
+using UIKit;
+
+namespace RpnCalculator.iOS
+{
+ [Register("AppDelegate")]
+ public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
+ {
+ public override bool FinishedLaunching(UIApplication app, NSDictionary options)
+ {
+ global::Xamarin.Forms.Forms.Init();
+
+ LoadApplication(new App());
+
+ return base.FinishedLaunching(app, options);
+ }
+ }
+}
diff --git a/LivePlayer/RpnCalculator/iOS/Assets.xcassets/AppIcon.appiconset/Contents.json b/LivePlayer/RpnCalculator/iOS/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 000000000..4e646784c
--- /dev/null
+++ b/LivePlayer/RpnCalculator/iOS/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,157 @@
+{
+ "images": [
+ {
+ "idiom": "iphone",
+ "size": "29x29",
+ "scale": "1x"
+ },
+ {
+ "idiom": "iphone",
+ "size": "29x29",
+ "scale": "2x"
+ },
+ {
+ "idiom": "iphone",
+ "size": "29x29",
+ "scale": "3x"
+ },
+ {
+ "idiom": "iphone",
+ "size": "40x40",
+ "scale": "2x"
+ },
+ {
+ "idiom": "iphone",
+ "size": "40x40",
+ "scale": "3x"
+ },
+ {
+ "idiom": "iphone",
+ "size": "57x57",
+ "scale": "1x"
+ },
+ {
+ "idiom": "iphone",
+ "size": "57x57",
+ "scale": "2x"
+ },
+ {
+ "idiom": "iphone",
+ "size": "60x60",
+ "scale": "2x"
+ },
+ {
+ "idiom": "iphone",
+ "size": "60x60",
+ "scale": "3x"
+ },
+ {
+ "idiom": "ipad",
+ "size": "29x29",
+ "scale": "1x"
+ },
+ {
+ "idiom": "ipad",
+ "size": "29x29",
+ "scale": "2x"
+ },
+ {
+ "idiom": "ipad",
+ "size": "40x40",
+ "scale": "1x"
+ },
+ {
+ "idiom": "ipad",
+ "size": "40x40",
+ "scale": "2x"
+ },
+ {
+ "idiom": "ipad",
+ "size": "50x50",
+ "scale": "1x"
+ },
+ {
+ "idiom": "ipad",
+ "size": "50x50",
+ "scale": "2x"
+ },
+ {
+ "idiom": "ipad",
+ "size": "72x72",
+ "scale": "1x"
+ },
+ {
+ "idiom": "ipad",
+ "size": "72x72",
+ "scale": "2x"
+ },
+ {
+ "idiom": "ipad",
+ "size": "76x76",
+ "scale": "1x"
+ },
+ {
+ "idiom": "ipad",
+ "size": "76x76",
+ "scale": "2x"
+ },
+ {
+ "size": "24x24",
+ "idiom": "watch",
+ "scale": "2x",
+ "role": "notificationCenter",
+ "subtype": "38mm"
+ },
+ {
+ "size": "27.5x27.5",
+ "idiom": "watch",
+ "scale": "2x",
+ "role": "notificationCenter",
+ "subtype": "42mm"
+ },
+ {
+ "size": "29x29",
+ "idiom": "watch",
+ "role": "companionSettings",
+ "scale": "2x"
+ },
+ {
+ "size": "29x29",
+ "idiom": "watch",
+ "role": "companionSettings",
+ "scale": "3x"
+ },
+ {
+ "size": "40x40",
+ "idiom": "watch",
+ "scale": "2x",
+ "role": "appLauncher",
+ "subtype": "38mm"
+ },
+ {
+ "size": "44x44",
+ "idiom": "watch",
+ "scale": "2x",
+ "role": "longLook",
+ "subtype": "42mm"
+ },
+ {
+ "size": "86x86",
+ "idiom": "watch",
+ "scale": "2x",
+ "role": "quickLook",
+ "subtype": "38mm"
+ },
+ {
+ "size": "98x98",
+ "idiom": "watch",
+ "scale": "2x",
+ "role": "quickLook",
+ "subtype": "42mm"
+ }
+ ],
+ "info": {
+ "version": 1,
+ "author": "xcode"
+ }
+}
\ No newline at end of file
diff --git a/LivePlayer/RpnCalculator/iOS/Assets.xcassets/Contents.json b/LivePlayer/RpnCalculator/iOS/Assets.xcassets/Contents.json
new file mode 100644
index 000000000..4caf392f9
--- /dev/null
+++ b/LivePlayer/RpnCalculator/iOS/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/LivePlayer/RpnCalculator/iOS/Entitlements.plist b/LivePlayer/RpnCalculator/iOS/Entitlements.plist
new file mode 100644
index 000000000..9ae599370
--- /dev/null
+++ b/LivePlayer/RpnCalculator/iOS/Entitlements.plist
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/LivePlayer/RpnCalculator/iOS/Info.plist b/LivePlayer/RpnCalculator/iOS/Info.plist
new file mode 100644
index 000000000..eadf41708
--- /dev/null
+++ b/LivePlayer/RpnCalculator/iOS/Info.plist
@@ -0,0 +1,46 @@
+
+
+
+
+ CFBundleDisplayName
+ RpnCalculator
+ CFBundleName
+ RpnCalculator
+ CFBundleIdentifier
+ com.xamarin.rpncalculator
+ CFBundleShortVersionString
+ 1.0
+ CFBundleVersion
+ 1.0
+ LSRequiresIPhoneOS
+
+ MinimumOSVersion
+ 8.0
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIRequiredDeviceCapabilities
+
+ armv7
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ XSAppIconAssets
+ Assets.xcassets/AppIcon.appiconset
+
+
diff --git a/LivePlayer/RpnCalculator/iOS/LaunchScreen.storyboard b/LivePlayer/RpnCalculator/iOS/LaunchScreen.storyboard
new file mode 100644
index 000000000..7981a14b7
--- /dev/null
+++ b/LivePlayer/RpnCalculator/iOS/LaunchScreen.storyboard
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/LivePlayer/RpnCalculator/iOS/Main.cs b/LivePlayer/RpnCalculator/iOS/Main.cs
new file mode 100644
index 000000000..752084b4c
--- /dev/null
+++ b/LivePlayer/RpnCalculator/iOS/Main.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using Foundation;
+using UIKit;
+
+namespace RpnCalculator.iOS
+{
+ public class Application
+ {
+ // This is the main entry point of the application.
+ static void Main(string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main(args, null, "AppDelegate");
+ }
+ }
+}
diff --git a/LivePlayer/RpnCalculator/iOS/RpnCalculator.iOS.csproj b/LivePlayer/RpnCalculator/iOS/RpnCalculator.iOS.csproj
new file mode 100644
index 000000000..b069b7dfe
--- /dev/null
+++ b/LivePlayer/RpnCalculator/iOS/RpnCalculator.iOS.csproj
@@ -0,0 +1,121 @@
+
+
+
+ Debug
+ iPhoneSimulator
+ {4E4AD5FA-7A69-4DFA-92F9-F846D528B084}
+ {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ Exe
+ RpnCalculator.iOS
+ RpnCalculator.iOS
+ Resources
+
+
+ true
+ full
+ false
+ bin\iPhoneSimulator\Debug
+ DEBUG;ENABLE_TEST_CLOUD;
+ prompt
+ 4
+ iPhone Developer
+ true
+ true
+ true
+ true
+ 65497
+ None
+ i386, x86_64
+ NSUrlSessionHandler
+ x86
+
+
+ pdbonly
+ true
+ bin\iPhone\Release
+ prompt
+ 4
+ iPhone Developer
+ true
+ Entitlements.plist
+ SdkOnly
+ ARMv7, ARM64
+ NSUrlSessionHandler
+ x86
+
+
+ pdbonly
+ true
+ bin\iPhoneSimulator\Release
+ prompt
+ 4
+ iPhone Developer
+ true
+ true
+ None
+ i386, x86_64
+ NSUrlSessionHandler
+ x86
+
+
+ true
+ full
+ false
+ bin\iPhone\Debug
+ DEBUG;ENABLE_TEST_CLOUD;
+ prompt
+ 4
+ iPhone Developer
+ true
+ true
+ true
+ true
+ true
+ Entitlements.plist
+ 28507
+ SdkOnly
+ ARMv7, ARM64
+ NSUrlSessionHandler
+ x86
+
+
+
+
+
+
+
+ ..\packages\Xamarin.Forms.2.3.4.231\lib\Xamarin.iOS10\Xamarin.Forms.Core.dll
+
+
+ ..\packages\Xamarin.Forms.2.3.4.231\lib\Xamarin.iOS10\Xamarin.Forms.Platform.dll
+
+
+ ..\packages\Xamarin.Forms.2.3.4.231\lib\Xamarin.iOS10\Xamarin.Forms.Platform.iOS.dll
+
+
+ ..\packages\Xamarin.Forms.2.3.4.231\lib\Xamarin.iOS10\Xamarin.Forms.Xaml.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/RpnCalculator/iOS/packages.config b/LivePlayer/RpnCalculator/iOS/packages.config
new file mode 100644
index 000000000..dfb0a0c48
--- /dev/null
+++ b/LivePlayer/RpnCalculator/iOS/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/RpnCalculator/readme.md b/LivePlayer/RpnCalculator/readme.md
new file mode 100644
index 000000000..6a0d4fb4c
--- /dev/null
+++ b/LivePlayer/RpnCalculator/readme.md
@@ -0,0 +1,10 @@
+RPN Calculator (Xamarin.Forms)
+===========================
+
+This Xamarin.Forms app provides a "Reverse Polish Notation (RPN)" calculator you can use on your Android or iOS device
+
+Follow the [setup instructions](https://developer.xamarin.com/guides/cross-platform/live/install) to try this out on your iPhone.
+
+
+
+[xamarin.com/live](https://xamarin.com/live)
diff --git a/LivePlayer/XamagonXuzzleLP/Metadata.xml b/LivePlayer/XamagonXuzzleLP/Metadata.xml
new file mode 100644
index 000000000..16ffc9c51
--- /dev/null
+++ b/LivePlayer/XamagonXuzzleLP/Metadata.xml
@@ -0,0 +1,11 @@
+
+
+ D7E85141-3801-45A7-9ECD-718B42FF5741
+ true
+ Intermediate
+ liveplayer
+ Android, iOS
+ Indie
+ true
+ This sample implements the classic 14-15 puzzle using Xamarin.Forms.
+
diff --git a/LivePlayer/XamagonXuzzleLP/Screenshots/app-original.png b/LivePlayer/XamagonXuzzleLP/Screenshots/app-original.png
new file mode 100755
index 000000000..c9977c2f4
Binary files /dev/null and b/LivePlayer/XamagonXuzzleLP/Screenshots/app-original.png differ
diff --git a/LivePlayer/XamagonXuzzleLP/Screenshots/app.png b/LivePlayer/XamagonXuzzleLP/Screenshots/app.png
new file mode 100755
index 000000000..75908f501
Binary files /dev/null and b/LivePlayer/XamagonXuzzleLP/Screenshots/app.png differ
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle.sln b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle.sln
new file mode 100644
index 000000000..d77f6bee8
--- /dev/null
+++ b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle.sln
@@ -0,0 +1,157 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.27004.2002
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "XamagonXuzzle", "XamagonXuzzle\XamagonXuzzle\XamagonXuzzle.shproj", "{B4B707E6-0891-49C6-9B26-1159F1BD9D7C}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XamagonXuzzle.Android", "XamagonXuzzle\XamagonXuzzle.Android\XamagonXuzzle.Android.csproj", "{6507261D-2045-4FFF-8179-26863BCA043B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XamagonXuzzle.iOS", "XamagonXuzzle\XamagonXuzzle.iOS\XamagonXuzzle.iOS.csproj", "{E0896C4D-D4F9-45CB-A388-DEC1F4E926A0}"
+EndProject
+Global
+ GlobalSection(SharedMSBuildProjectFiles) = preSolution
+ XamagonXuzzle\XamagonXuzzle\XamagonXuzzle.projitems*{6507261d-2045-4fff-8179-26863bca043b}*SharedItemsImports = 4
+ XamagonXuzzle\XamagonXuzzle\XamagonXuzzle.projitems*{97dddd25-a36d-4613-8369-a65ed2b4df84}*SharedItemsImports = 4
+ XamagonXuzzle\XamagonXuzzle\XamagonXuzzle.projitems*{b4b707e6-0891-49c6-9b26-1159f1bd9d7c}*SharedItemsImports = 13
+ XamagonXuzzle\XamagonXuzzle\XamagonXuzzle.projitems*{e0896c4d-d4f9-45cb-a388-dec1f4e926a0}*SharedItemsImports = 4
+ EndGlobalSection
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Ad-Hoc|Any CPU = Ad-Hoc|Any CPU
+ Ad-Hoc|ARM = Ad-Hoc|ARM
+ Ad-Hoc|iPhone = Ad-Hoc|iPhone
+ Ad-Hoc|iPhoneSimulator = Ad-Hoc|iPhoneSimulator
+ Ad-Hoc|x64 = Ad-Hoc|x64
+ Ad-Hoc|x86 = Ad-Hoc|x86
+ AppStore|Any CPU = AppStore|Any CPU
+ AppStore|ARM = AppStore|ARM
+ AppStore|iPhone = AppStore|iPhone
+ AppStore|iPhoneSimulator = AppStore|iPhoneSimulator
+ AppStore|x64 = AppStore|x64
+ AppStore|x86 = AppStore|x86
+ Debug|Any CPU = Debug|Any CPU
+ Debug|ARM = Debug|ARM
+ Debug|iPhone = Debug|iPhone
+ Debug|iPhoneSimulator = Debug|iPhoneSimulator
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release|Any CPU = Release|Any CPU
+ Release|ARM = Release|ARM
+ Release|iPhone = Release|iPhone
+ Release|iPhoneSimulator = Release|iPhoneSimulator
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Ad-Hoc|Any CPU.Deploy.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Ad-Hoc|ARM.Build.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Ad-Hoc|ARM.Deploy.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Ad-Hoc|iPhone.Deploy.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Ad-Hoc|x64.Build.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Ad-Hoc|x64.Deploy.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Ad-Hoc|x86.Build.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Ad-Hoc|x86.Deploy.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.AppStore|Any CPU.Build.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.AppStore|Any CPU.Deploy.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.AppStore|ARM.ActiveCfg = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.AppStore|ARM.Build.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.AppStore|ARM.Deploy.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.AppStore|iPhone.ActiveCfg = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.AppStore|iPhone.Build.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.AppStore|iPhone.Deploy.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.AppStore|iPhoneSimulator.Deploy.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.AppStore|x64.ActiveCfg = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.AppStore|x64.Build.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.AppStore|x64.Deploy.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.AppStore|x86.ActiveCfg = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.AppStore|x86.Build.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.AppStore|x86.Deploy.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Debug|ARM.Build.0 = Debug|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Debug|ARM.Deploy.0 = Debug|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Debug|iPhone.Deploy.0 = Debug|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Debug|x64.Build.0 = Debug|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Debug|x64.Deploy.0 = Debug|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Debug|x86.Build.0 = Debug|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Debug|x86.Deploy.0 = Debug|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Release|ARM.ActiveCfg = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Release|ARM.Build.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Release|ARM.Deploy.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Release|iPhone.Build.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Release|iPhone.Deploy.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Release|x64.ActiveCfg = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Release|x64.Build.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Release|x64.Deploy.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Release|x86.ActiveCfg = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Release|x86.Build.0 = Release|Any CPU
+ {6507261D-2045-4FFF-8179-26863BCA043B}.Release|x86.Deploy.0 = Release|Any CPU
+ {E0896C4D-D4F9-45CB-A388-DEC1F4E926A0}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|iPhoneSimulator
+ {E0896C4D-D4F9-45CB-A388-DEC1F4E926A0}.Ad-Hoc|ARM.ActiveCfg = Ad-Hoc|iPhone
+ {E0896C4D-D4F9-45CB-A388-DEC1F4E926A0}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone
+ {E0896C4D-D4F9-45CB-A388-DEC1F4E926A0}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone
+ {E0896C4D-D4F9-45CB-A388-DEC1F4E926A0}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator
+ {E0896C4D-D4F9-45CB-A388-DEC1F4E926A0}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator
+ {E0896C4D-D4F9-45CB-A388-DEC1F4E926A0}.Ad-Hoc|x64.ActiveCfg = Ad-Hoc|iPhone
+ {E0896C4D-D4F9-45CB-A388-DEC1F4E926A0}.Ad-Hoc|x86.ActiveCfg = Ad-Hoc|iPhone
+ {E0896C4D-D4F9-45CB-A388-DEC1F4E926A0}.AppStore|Any CPU.ActiveCfg = AppStore|iPhoneSimulator
+ {E0896C4D-D4F9-45CB-A388-DEC1F4E926A0}.AppStore|ARM.ActiveCfg = AppStore|iPhone
+ {E0896C4D-D4F9-45CB-A388-DEC1F4E926A0}.AppStore|iPhone.ActiveCfg = AppStore|iPhone
+ {E0896C4D-D4F9-45CB-A388-DEC1F4E926A0}.AppStore|iPhone.Build.0 = AppStore|iPhone
+ {E0896C4D-D4F9-45CB-A388-DEC1F4E926A0}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator
+ {E0896C4D-D4F9-45CB-A388-DEC1F4E926A0}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator
+ {E0896C4D-D4F9-45CB-A388-DEC1F4E926A0}.AppStore|x64.ActiveCfg = AppStore|iPhone
+ {E0896C4D-D4F9-45CB-A388-DEC1F4E926A0}.AppStore|x86.ActiveCfg = AppStore|iPhone
+ {E0896C4D-D4F9-45CB-A388-DEC1F4E926A0}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator
+ {E0896C4D-D4F9-45CB-A388-DEC1F4E926A0}.Debug|ARM.ActiveCfg = Debug|iPhone
+ {E0896C4D-D4F9-45CB-A388-DEC1F4E926A0}.Debug|iPhone.ActiveCfg = Debug|iPhone
+ {E0896C4D-D4F9-45CB-A388-DEC1F4E926A0}.Debug|iPhone.Build.0 = Debug|iPhone
+ {E0896C4D-D4F9-45CB-A388-DEC1F4E926A0}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
+ {E0896C4D-D4F9-45CB-A388-DEC1F4E926A0}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
+ {E0896C4D-D4F9-45CB-A388-DEC1F4E926A0}.Debug|x64.ActiveCfg = Debug|iPhone
+ {E0896C4D-D4F9-45CB-A388-DEC1F4E926A0}.Debug|x86.ActiveCfg = Debug|iPhone
+ {E0896C4D-D4F9-45CB-A388-DEC1F4E926A0}.Release|Any CPU.ActiveCfg = Release|iPhoneSimulator
+ {E0896C4D-D4F9-45CB-A388-DEC1F4E926A0}.Release|ARM.ActiveCfg = Release|iPhone
+ {E0896C4D-D4F9-45CB-A388-DEC1F4E926A0}.Release|iPhone.ActiveCfg = Release|iPhone
+ {E0896C4D-D4F9-45CB-A388-DEC1F4E926A0}.Release|iPhone.Build.0 = Release|iPhone
+ {E0896C4D-D4F9-45CB-A388-DEC1F4E926A0}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
+ {E0896C4D-D4F9-45CB-A388-DEC1F4E926A0}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
+ {E0896C4D-D4F9-45CB-A388-DEC1F4E926A0}.Release|x64.ActiveCfg = Release|iPhone
+ {E0896C4D-D4F9-45CB-A388-DEC1F4E926A0}.Release|x86.ActiveCfg = Release|iPhone
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {44C2CE95-E7AD-4CFF-B207-4FDCCD147F13}
+ EndGlobalSection
+EndGlobal
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/Assets/AboutAssets.txt b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/Assets/AboutAssets.txt
new file mode 100644
index 000000000..5ddf08729
--- /dev/null
+++ b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/Assets/AboutAssets.txt
@@ -0,0 +1,19 @@
+Any raw assets you want to be deployed with your application can be placed in
+this directory (and child directories) and given a Build Action of "AndroidAsset".
+
+These files will be deployed with you package and will be accessible using Android's
+AssetManager, like this:
+
+public class ReadAsset : Activity
+{
+ protected override void OnCreate (Bundle bundle)
+ {
+ base.OnCreate (bundle);
+
+ InputStream input = Assets.Open ("my_asset.txt");
+ }
+}
+
+Additionally, some Android functions will automatically load asset files:
+
+Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf");
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/MainActivity.cs b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/MainActivity.cs
new file mode 100644
index 000000000..36cb6d7f4
--- /dev/null
+++ b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/MainActivity.cs
@@ -0,0 +1,27 @@
+using System;
+
+using Android.App;
+using Android.Content.PM;
+using Android.Runtime;
+using Android.Views;
+using Android.Widget;
+using Android.OS;
+
+namespace XamagonXuzzle.Droid
+{
+ [Activity (Label = "XamagonXuzzle", Icon = "@drawable/icon", Theme="@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
+ public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
+ {
+ protected override void OnCreate (Bundle bundle)
+ {
+ TabLayoutResource = Resource.Layout.Tabbar;
+ ToolbarResource = Resource.Layout.Toolbar;
+
+ base.OnCreate (bundle);
+
+ global::Xamarin.Forms.Forms.Init (this, bundle);
+ LoadApplication (new XamagonXuzzle.App ());
+ }
+ }
+}
+
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/Properties/AndroidManifest.xml b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/Properties/AndroidManifest.xml
new file mode 100644
index 000000000..52814542a
--- /dev/null
+++ b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/Properties/AndroidManifest.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/Properties/AssemblyInfo.cs b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..4d10fc427
--- /dev/null
+++ b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/Properties/AssemblyInfo.cs
@@ -0,0 +1,34 @@
+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("XamagonXuzzle.Android")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("XamagonXuzzle.Android")]
+[assembly: AssemblyCopyright("Copyright © 2014")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+[assembly: ComVisible(false)]
+
+// 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)]
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/Resources/AboutResources.txt b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/Resources/AboutResources.txt
new file mode 100644
index 000000000..cb30f20b1
--- /dev/null
+++ b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/Resources/AboutResources.txt
@@ -0,0 +1,50 @@
+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.xml),
+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-hdpi/
+ icon.png
+
+ drawable-ldpi/
+ icon.png
+
+ drawable-mdpi/
+ icon.png
+
+ layout/
+ main.xml
+
+ 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
+"Resource" that contains the tokens for each one of the resources included. For example,
+for the above Resources layout, this is what the Resource class would expose:
+
+public class Resource {
+ 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 Resource.layout.main
+to reference the layout/main.xml file, or Resource.strings.first_string to reference the first
+string in the dictionary file values/strings.xml.
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/Resources/drawable-hdpi/icon.png b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/Resources/drawable-hdpi/icon.png
new file mode 100644
index 000000000..964f110ab
Binary files /dev/null and b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/Resources/drawable-hdpi/icon.png differ
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/Resources/drawable-xhdpi/icon.png b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/Resources/drawable-xhdpi/icon.png
new file mode 100644
index 000000000..3c01e60ce
Binary files /dev/null and b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/Resources/drawable-xhdpi/icon.png differ
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/Resources/drawable-xxhdpi/icon.png b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/Resources/drawable-xxhdpi/icon.png
new file mode 100644
index 000000000..0d8c1c57d
Binary files /dev/null and b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/Resources/drawable-xxhdpi/icon.png differ
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/Resources/drawable/icon.png b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/Resources/drawable/icon.png
new file mode 100644
index 000000000..b0ba7150f
Binary files /dev/null and b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/Resources/drawable/icon.png differ
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/Resources/layout/Tabbar.axml b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/Resources/layout/Tabbar.axml
new file mode 100644
index 000000000..ad1f87d81
--- /dev/null
+++ b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/Resources/layout/Tabbar.axml
@@ -0,0 +1,11 @@
+
+
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/Resources/layout/Toolbar.axml b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/Resources/layout/Toolbar.axml
new file mode 100644
index 000000000..aabd0a3b7
--- /dev/null
+++ b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/Resources/layout/Toolbar.axml
@@ -0,0 +1,9 @@
+
+
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/Resources/values/styles.xml b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/Resources/values/styles.xml
new file mode 100644
index 000000000..43b0a58c1
--- /dev/null
+++ b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/Resources/values/styles.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/XamagonXuzzle.Android.csproj b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/XamagonXuzzle.Android.csproj
new file mode 100644
index 000000000..1dab7eb54
--- /dev/null
+++ b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/XamagonXuzzle.Android.csproj
@@ -0,0 +1,180 @@
+
+
+
+
+ Debug
+ AnyCPU
+ 8.0.30703
+ 2.0
+ {6507261D-2045-4FFF-8179-26863BCA043B}
+ {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ Library
+ Properties
+ XamagonXuzzle.Droid
+ XamagonXuzzle.Android
+ 512
+ true
+ Resources\Resource.Designer.cs
+ Off
+ Properties\AndroidManifest.xml
+ true
+ v8.0
+
+
+
+
+
+
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+ True
+ None
+ armeabi-v7a,x86
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+ False
+ SdkOnly
+
+
+
+ ..\..\packages\Xamarin.Forms.2.4.0.280\lib\MonoAndroid10\FormsViewGroup.dll
+
+
+
+
+
+
+
+
+ ..\..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Animated.Vector.Drawable.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.Annotations.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Annotations.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.Compat.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Compat.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.Core.UI.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Core.UI.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.Core.Utils.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Core.Utils.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.Design.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Design.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.Fragment.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Fragment.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.Media.Compat.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Media.Compat.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.v4.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v4.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.v7.AppCompat.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v7.AppCompat.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.v7.CardView.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v7.CardView.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.v7.MediaRouter.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v7.MediaRouter.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.v7.RecyclerView.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v7.RecyclerView.dll
+
+
+ ..\..\packages\Xamarin.Android.Support.Vector.Drawable.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Vector.Drawable.dll
+
+
+ ..\..\packages\Xamarin.Forms.2.4.0.280\lib\MonoAndroid10\Xamarin.Forms.Core.dll
+
+
+ ..\..\packages\Xamarin.Forms.2.4.0.280\lib\MonoAndroid10\Xamarin.Forms.Platform.dll
+
+
+ ..\..\packages\Xamarin.Forms.2.4.0.280\lib\MonoAndroid10\Xamarin.Forms.Platform.Android.dll
+
+
+ ..\..\packages\Xamarin.Forms.2.4.0.280\lib\MonoAndroid10\Xamarin.Forms.Xaml.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/packages.config b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/packages.config
new file mode 100644
index 000000000..a764baad1
--- /dev/null
+++ b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.Android/packages.config
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/AppDelegate.cs b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/AppDelegate.cs
new file mode 100644
index 000000000..d443615c0
--- /dev/null
+++ b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/AppDelegate.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using Foundation;
+using UIKit;
+
+namespace XamagonXuzzle.iOS
+{
+ // The UIApplicationDelegate for the application. This class is responsible for launching the
+ // User Interface of the application, as well as listening (and optionally responding) to
+ // application events from iOS.
+ [Register("AppDelegate")]
+ public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
+ {
+ //
+ // This method is invoked when the application has loaded and is ready to run. In this
+ // method you should instantiate the window, load the UI into it and then make the window
+ // visible.
+ //
+ // You have 17 seconds to return from this method, or iOS will terminate your application.
+ //
+ public override bool FinishedLaunching(UIApplication app, NSDictionary options)
+ {
+ global::Xamarin.Forms.Forms.Init ();
+ LoadApplication (new XamagonXuzzle.App ());
+
+ return base.FinishedLaunching (app, options);
+ }
+ }
+}
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Entitlements.plist b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Entitlements.plist
new file mode 100644
index 000000000..e9a3005f7
--- /dev/null
+++ b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Entitlements.plist
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Info.plist b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Info.plist
new file mode 100644
index 000000000..e0c7cff86
--- /dev/null
+++ b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Info.plist
@@ -0,0 +1,52 @@
+
+
+
+
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ MinimumOSVersion
+ 8.0
+ CFBundleDisplayName
+ XamagonXuzzle
+ CFBundleIdentifier
+ com.yourcompany.XamagonXuzzle
+ CFBundleVersion
+ 1.0
+ CFBundleIconFiles
+
+ Icon-60@2x.png
+ Icon-60@3x.png
+ Icon-76.png
+ Icon-76@2x.png
+ Default.png
+ Default@2x.png
+ Default-568h@2x.png
+ Default-Portrait.png
+ Default-Portrait@2x.png
+ Icon-Small-40.png
+ Icon-Small-40@2x.png
+ Icon-Small-40@3x.png
+ Icon-Small.png
+ Icon-Small@2x.png
+ Icon-Small@3x.png
+
+ UILaunchStoryboardName
+ LaunchScreen.storyboard
+
+
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Main.cs b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Main.cs
new file mode 100644
index 000000000..0b4d491b8
--- /dev/null
+++ b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Main.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using Foundation;
+using UIKit;
+
+namespace XamagonXuzzle.iOS
+{
+ public class Application
+ {
+ // This is the main entry point of the application.
+ static void Main(string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main(args, null, "AppDelegate");
+ }
+ }
+}
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Properties/AssemblyInfo.cs b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..b6e2c0c8c
--- /dev/null
+++ b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 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("XamagonXuzzle.iOS")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("XamagonXuzzle.iOS")]
+[assembly: AssemblyCopyright("Copyright © 2014")]
+[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("72bdc44f-c588-44f3-b6df-9aace7daafdd")]
+
+// 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")]
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Default-568h@2x.png b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Default-568h@2x.png
new file mode 100644
index 000000000..26c6461e5
Binary files /dev/null and b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Default-568h@2x.png differ
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Default-Portrait.png b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Default-Portrait.png
new file mode 100644
index 000000000..5d0d1ab4c
Binary files /dev/null and b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Default-Portrait.png differ
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Default-Portrait@2x.png b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Default-Portrait@2x.png
new file mode 100644
index 000000000..0ee2688e8
Binary files /dev/null and b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Default-Portrait@2x.png differ
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Default.png b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Default.png
new file mode 100644
index 000000000..b74643c0a
Binary files /dev/null and b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Default.png differ
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Default@2x.png b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Default@2x.png
new file mode 100644
index 000000000..dbd6bd3e8
Binary files /dev/null and b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Default@2x.png differ
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Icon-60@2x.png b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Icon-60@2x.png
new file mode 100644
index 000000000..4b03c4270
Binary files /dev/null and b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Icon-60@2x.png differ
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Icon-60@3x.png b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Icon-60@3x.png
new file mode 100644
index 000000000..b03ca1bbc
Binary files /dev/null and b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Icon-60@3x.png differ
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Icon-76.png b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Icon-76.png
new file mode 100644
index 000000000..587982e2a
Binary files /dev/null and b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Icon-76.png differ
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Icon-76@2x.png b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Icon-76@2x.png
new file mode 100644
index 000000000..cd4e2c8fe
Binary files /dev/null and b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Icon-76@2x.png differ
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Icon-Small-40.png b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Icon-Small-40.png
new file mode 100644
index 000000000..6acff9441
Binary files /dev/null and b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Icon-Small-40.png differ
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Icon-Small-40@2x.png b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Icon-Small-40@2x.png
new file mode 100644
index 000000000..b833aac26
Binary files /dev/null and b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Icon-Small-40@2x.png differ
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Icon-Small-40@3x.png b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Icon-Small-40@3x.png
new file mode 100644
index 000000000..ab8654e49
Binary files /dev/null and b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Icon-Small-40@3x.png differ
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Icon-Small.png b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Icon-Small.png
new file mode 100644
index 000000000..33db7e714
Binary files /dev/null and b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Icon-Small.png differ
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Icon-Small@2x.png b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Icon-Small@2x.png
new file mode 100644
index 000000000..bf45e2592
Binary files /dev/null and b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Icon-Small@2x.png differ
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Icon-Small@3x.png b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Icon-Small@3x.png
new file mode 100644
index 000000000..7ad3891b9
Binary files /dev/null and b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/Icon-Small@3x.png differ
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/LaunchScreen.storyboard b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/LaunchScreen.storyboard
new file mode 100644
index 000000000..a639c2f1a
--- /dev/null
+++ b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/Resources/LaunchScreen.storyboard
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/XamagonXuzzle.iOS.csproj b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/XamagonXuzzle.iOS.csproj
new file mode 100644
index 000000000..2564083b7
--- /dev/null
+++ b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/XamagonXuzzle.iOS.csproj
@@ -0,0 +1,152 @@
+
+
+
+
+ Debug
+ iPhoneSimulator
+ 8.0.30703
+ 2.0
+ {E0896C4D-D4F9-45CB-A388-DEC1F4E926A0}
+ {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ Exe
+ XamagonXuzzle.iOS
+ Resources
+ XamagonXuzzle.iOS
+
+
+
+ true
+ full
+ false
+ bin\iPhoneSimulator\Debug
+ DEBUG
+ prompt
+ 4
+ false
+ i386, x86_64
+ None
+ true
+ NSUrlSessionHandler
+
+
+ none
+ true
+ bin\iPhoneSimulator\Release
+ prompt
+ 4
+ None
+ i386, x86_64
+ false
+ NSUrlSessionHandler
+
+
+ true
+ full
+ false
+ bin\iPhone\Debug
+ DEBUG
+ prompt
+ 4
+ false
+ ARMv7, ARM64
+ iPhone Developer
+ true
+ Entitlements.plist
+ NSUrlSessionHandler
+
+
+ none
+ true
+ bin\iPhone\Release
+ prompt
+ 4
+ ARMv7, ARM64
+ false
+ iPhone Developer
+ Entitlements.plist
+ NSUrlSessionHandler
+
+
+ none
+ True
+ bin\iPhone\Ad-Hoc
+ prompt
+ 4
+ False
+ ARMv7, ARM64
+ True
+ Automatic:AdHoc
+ iPhone Distribution
+ Entitlements.plist
+ NSUrlSessionHandler
+
+
+ none
+ True
+ bin\iPhone\AppStore
+ prompt
+ 4
+ False
+ ARMv7, ARM64
+ Automatic:AppStore
+ iPhone Distribution
+ Entitlements.plist
+ NSUrlSessionHandler
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ..\..\packages\Xamarin.Forms.2.4.0.280\lib\Xamarin.iOS10\Xamarin.Forms.Core.dll
+
+
+ ..\..\packages\Xamarin.Forms.2.4.0.280\lib\Xamarin.iOS10\Xamarin.Forms.Platform.dll
+
+
+ ..\..\packages\Xamarin.Forms.2.4.0.280\lib\Xamarin.iOS10\Xamarin.Forms.Platform.iOS.dll
+
+
+ ..\..\packages\Xamarin.Forms.2.4.0.280\lib\Xamarin.iOS10\Xamarin.Forms.Xaml.dll
+
+
+
+
+
+
+
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/iTunesArtwork b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/iTunesArtwork
new file mode 100644
index 000000000..94c8ebd6b
Binary files /dev/null and b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/iTunesArtwork differ
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/iTunesArtwork@2x b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/iTunesArtwork@2x
new file mode 100644
index 000000000..fa2ebf72d
Binary files /dev/null and b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/iTunesArtwork@2x differ
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/packages.config b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/packages.config
new file mode 100644
index 000000000..0b48b093d
--- /dev/null
+++ b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle.iOS/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle/App.xaml b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle/App.xaml
new file mode 100644
index 000000000..dc4013e49
--- /dev/null
+++ b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle/App.xaml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle/App.xaml.cs b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle/App.xaml.cs
new file mode 100644
index 000000000..9991bb718
--- /dev/null
+++ b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle/App.xaml.cs
@@ -0,0 +1,34 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using Xamarin.Forms;
+
+namespace XamagonXuzzle
+{
+ public partial class App : Application
+ {
+ public App ()
+ {
+ InitializeComponent();
+
+ MainPage = new XamagonXuzzle.MainPage();
+ }
+
+ protected override void OnStart ()
+ {
+ // Handle when your app starts
+ }
+
+ protected override void OnSleep ()
+ {
+ // Handle when your app sleeps
+ }
+
+ protected override void OnResume ()
+ {
+ // Handle when your app resumes
+ }
+ }
+}
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle/MainPage.xaml b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle/MainPage.xaml
new file mode 100644
index 000000000..7c2cd5e19
--- /dev/null
+++ b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle/MainPage.xaml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle/MainPage.xaml.cs b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle/MainPage.xaml.cs
new file mode 100644
index 000000000..6307c86cc
--- /dev/null
+++ b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle/MainPage.xaml.cs
@@ -0,0 +1,169 @@
+using System;
+using System.Threading.Tasks;
+using Xamarin.Forms;
+
+namespace XamagonXuzzle
+{
+ public partial class MainPage : ContentPage
+ {
+ // Number of tiles horizontally and vertically,
+ // fixed based on available bitmaps
+ static readonly int NUM = 4;
+
+ // Array of tiles
+ Tile[,] tiles = new Tile[NUM, NUM];
+
+ // Empty row and column
+ int emptyRow = NUM - 1;
+ int emptyCol = NUM - 1;
+
+ double tileSize;
+ bool isBusy;
+
+ public MainPage()
+ {
+ InitializeComponent();
+
+ // Loop through the rows and columns.
+ for (int row = 0; row < NUM; row++)
+ {
+ for (int col = 0; col < NUM; col++)
+ {
+ // But skip the last one!
+ if (row == NUM - 1 && col == NUM - 1)
+ break;
+
+ // Create the tile
+ Tile tile = new Tile(row, col);
+
+ // Add tap recognition.
+ TapGestureRecognizer tapGestureRecognizer = new TapGestureRecognizer();
+ tapGestureRecognizer.Tapped += OnTileTapped;
+ tile.TileView.GestureRecognizers.Add(tapGestureRecognizer);
+
+ // Add the tile to the array and the AbsoluteLayout.
+ tiles[row, col] = tile;
+ absoluteLayout.Children.Add(tile.TileView);
+ }
+ }
+ }
+
+ void OnContainerSizeChanged(object sender, EventArgs args)
+ {
+ View container = (View)sender;
+ double width = container.Width;
+ double height = container.Height;
+
+ if (width <= 0 || height <= 0)
+ return;
+
+ // Orient StackLayout based on portrait/landscape mode.
+ stackLayout.Orientation = (width < height) ? StackOrientation.Vertical :
+ StackOrientation.Horizontal;
+
+ // Calculate tile size and position based on ContentView size.
+ tileSize = Math.Min(width, height) / NUM;
+ absoluteLayout.WidthRequest = NUM * tileSize;
+ absoluteLayout.HeightRequest = NUM * tileSize;
+
+ foreach (View fileView in absoluteLayout.Children)
+ {
+ Tile tile = Tile.Dictionary[fileView];
+
+ // Set tile bounds.
+ AbsoluteLayout.SetLayoutBounds(fileView, new Rectangle(tile.Col * tileSize,
+ tile.Row * tileSize,
+ tileSize,
+ tileSize));
+ }
+ }
+
+ async void OnTileTapped(object sender, EventArgs args)
+ {
+ if (isBusy)
+ return;
+
+ isBusy = true;
+
+ View tileView = (View)sender;
+ Tile tappedTile = Tile.Dictionary[tileView];
+
+ await ShiftIntoEmpty(tappedTile.Row, tappedTile.Col);
+ isBusy = false;
+ }
+
+ async Task ShiftIntoEmpty(int tappedRow, int tappedCol, uint length = 100)
+ {
+ // Shift columns.
+ if (tappedRow == emptyRow && tappedCol != emptyCol)
+ {
+ int inc = Math.Sign(tappedCol - emptyCol);
+ int begCol = emptyCol + inc;
+ int endCol = tappedCol + inc;
+
+ for (int col = begCol; col != endCol; col += inc)
+ {
+ await AnimateTile(emptyRow, col, emptyRow, emptyCol, length);
+ }
+ }
+ // Shift rows.
+ else if (tappedCol == emptyCol && tappedRow != emptyRow)
+ {
+ int inc = Math.Sign(tappedRow - emptyRow);
+ int begRow = emptyRow + inc;
+ int endRow = tappedRow + inc;
+
+ for (int row = begRow; row != endRow; row += inc)
+ {
+ await AnimateTile(row, emptyCol, emptyRow, emptyCol, length);
+ }
+ }
+ }
+
+ async Task AnimateTile(int row, int col, int newRow, int newCol, uint length)
+ {
+ // The tile to be animated.
+ Tile tile = tiles[row, col];
+ View tileView = tile.TileView;
+
+ // The destination rectangle.
+ Rectangle rect = new Rectangle(emptyCol * tileSize,
+ emptyRow * tileSize,
+ tileSize,
+ tileSize);
+
+ // Animate it!
+ await tileView.LayoutTo(rect, length);
+
+ // Set layout bounds to same Rectangle.
+ AbsoluteLayout.SetLayoutBounds(tileView, rect);
+
+ // Set several variables and properties for new layout.
+ tiles[newRow, newCol] = tile;
+ tile.Row = newRow;
+ tile.Col = newCol;
+ tiles[row, col] = null;
+ emptyRow = row;
+ emptyCol = col;
+ }
+
+ async void OnRandomizeButtonClicked(object sender, EventArgs args)
+ {
+ Button button = (Button)sender;
+ button.IsEnabled = false;
+ Random rand = new Random();
+
+ isBusy = true;
+
+ // Simulate some fast crazy taps.
+ for (int i = 0; i < 100; i++)
+ {
+ await ShiftIntoEmpty(rand.Next(NUM), emptyCol, 25);
+ await ShiftIntoEmpty(emptyRow, rand.Next(NUM), 25);
+ }
+ button.IsEnabled = true;
+
+ isBusy = false;
+ }
+ }
+}
\ No newline at end of file
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle/Tile.cs b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle/Tile.cs
new file mode 100644
index 000000000..2cfc35576
--- /dev/null
+++ b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle/Tile.cs
@@ -0,0 +1,39 @@
+using System;
+using System.Collections.Generic;
+using Xamarin.Forms;
+
+namespace XamagonXuzzle
+{
+ public class Tile
+ {
+ const string UrlPrefix = "http://xamarin.github.io/xamarin-forms-book-samples/XamagonXuzzle/";
+
+ public Tile(int row, int col)
+ {
+ Row = row;
+ Col = col;
+
+ TileView = new ContentView
+ {
+ Padding = new Thickness(1),
+
+ // Get the bitmap for each tile
+ Content = new Image
+ {
+ Source = ImageSource.FromUri(new Uri(UrlPrefix + "Bitmap" + row + col + ".png"))
+ }
+ };
+
+ // Add TileView to dictionary for obtaining Tile from TileView
+ Dictionary.Add(TileView, this);
+ }
+
+ public static Dictionary Dictionary { get; } = new Dictionary();
+
+ public int Row { set; get; }
+
+ public int Col { set; get; }
+
+ public View TileView { private set; get; }
+ }
+}
\ No newline at end of file
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle/XamagonXuzzle.projitems b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle/XamagonXuzzle.projitems
new file mode 100644
index 000000000..2b5c28550
--- /dev/null
+++ b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle/XamagonXuzzle.projitems
@@ -0,0 +1,30 @@
+
+
+
+ $(MSBuildAllProjects);$(MSBuildThisFileFullPath)
+ true
+ b4b707e6-0891-49c6-9b26-1159f1bd9d7c
+
+
+ XamagonXuzzle
+
+
+
+ App.xaml
+
+
+ MainPage.xaml
+
+
+
+
+
+ Designer
+ MSBuild:UpdateDesignTimeXaml
+
+
+ Designer
+ MSBuild:UpdateDesignTimeXaml
+
+
+
\ No newline at end of file
diff --git a/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle/XamagonXuzzle.shproj b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle/XamagonXuzzle.shproj
new file mode 100644
index 000000000..13689d120
--- /dev/null
+++ b/LivePlayer/XamagonXuzzleLP/XamagonXuzzle/XamagonXuzzle/XamagonXuzzle.shproj
@@ -0,0 +1,12 @@
+
+
+
+ b4b707e6-0891-49c6-9b26-1159f1bd9d7c
+
+
+
+
+
+
+
+
diff --git a/LivePlayer/XamagonXuzzleLP/readme.md b/LivePlayer/XamagonXuzzleLP/readme.md
new file mode 100644
index 000000000..a92aee5a7
--- /dev/null
+++ b/LivePlayer/XamagonXuzzleLP/readme.md
@@ -0,0 +1,29 @@
+---
+name: Xamarin.Forms - Xuzzle picture game
+description: "A variation of the classic 14-15 slider picture puzzle, built with Xamarin.Forms (game)"
+page_type: sample
+languages:
+- csharp
+products:
+- xamarin
+extensions:
+ tags:
+ - game
+urlFragment: liveplayer-xamagonxuzzlelp
+---
+# Xuzzle
+
+This is a variation of the classic 14-15 puzzle. On the early Mac, the 14-15 program was called PUZZLE.
+In early Windows, it was the only sample
+application for Microsoft Pascal for Windows 1.0, where it was called MUZZLE (for "Microsoft Puzzle").
+This is the Xamarin.Forms version, so it's called Xuzzle, and the 15 tiles contain the Xamarin logo.
+
+
+
+After pressing the Randomize button, just tap a tile to move it into an empty position.
+You can *tap* any tile in the row or column
+of the empty position to move one, two, or three tiles at once.
+
+When you successfully complete the puzzle, you'll be rewarded with an animation.
+
+This program is adapted from https://github.com/xamarin/xamarin-forms-book-samples/tree/master/Chapter22/XamagonXuzzle.
diff --git a/LivePlayer/readme.md b/LivePlayer/readme.md
new file mode 100644
index 000000000..0d9e9fba1
--- /dev/null
+++ b/LivePlayer/readme.md
@@ -0,0 +1,5 @@
+# Xamarin.Forms cross-platform samples
+
+- Basic Calculator
+- RPN Calculator
+- Xuzzle game
diff --git a/MWC/Dependencies/Community.CsharpSqlite/Community.CsharpSqlite.WP7.dll b/MWC/Dependencies/Community.CsharpSqlite/Community.CsharpSqlite.WP7.dll
deleted file mode 100644
index 80a162f0a..000000000
Binary files a/MWC/Dependencies/Community.CsharpSqlite/Community.CsharpSqlite.WP7.dll and /dev/null differ
diff --git a/MWC/Dependencies/Community.CsharpSqlite/Community.CsharpSqlite.WP7.pdb b/MWC/Dependencies/Community.CsharpSqlite/Community.CsharpSqlite.WP7.pdb
deleted file mode 100644
index 2575615bf..000000000
Binary files a/MWC/Dependencies/Community.CsharpSqlite/Community.CsharpSqlite.WP7.pdb and /dev/null differ
diff --git a/MWC/Dependencies/HtmlAgilityPack/HtmlAgilityPack.XML b/MWC/Dependencies/HtmlAgilityPack/HtmlAgilityPack.XML
deleted file mode 100644
index d136fcace..000000000
--- a/MWC/Dependencies/HtmlAgilityPack/HtmlAgilityPack.XML
+++ /dev/null
@@ -1,2429 +0,0 @@
-
-
-
- HtmlAgilityPack
-
-
-
-
- Represents an HTML navigator on an HTML document seen as a data store.
-
-
-
-
- Initializes a new instance of the HtmlNavigator and loads an HTML document from a stream.
-
- The input stream.
-
-
-
- Initializes a new instance of the HtmlNavigator and loads an HTML document from a stream.
-
- The input stream.
- Indicates whether to look for byte order marks at the beginning of the stream.
-
-
-
- Initializes a new instance of the HtmlNavigator and loads an HTML document from a stream.
-
- The input stream.
- The character encoding to use.
-
-
-
- Initializes a new instance of the HtmlNavigator and loads an HTML document from a stream.
-
- The input stream.
- The character encoding to use.
- Indicates whether to look for byte order marks at the beginning of the stream.
-
-
-
- Initializes a new instance of the HtmlNavigator and loads an HTML document from a stream.
-
- The input stream.
- The character encoding to use.
- Indicates whether to look for byte order marks at the beginning of the stream.
- The minimum buffer size.
-
-
-
- Initializes a new instance of the HtmlNavigator and loads an HTML document from a TextReader.
-
- The TextReader used to feed the HTML data into the document.
-
-
-
- Initializes a new instance of the HtmlNavigator and loads an HTML document from a file.
-
- The complete file path to be read.
-
-
-
- Initializes a new instance of the HtmlNavigator and loads an HTML document from a file.
-
- The complete file path to be read.
- Indicates whether to look for byte order marks at the beginning of the file.
-
-
-
- Initializes a new instance of the HtmlNavigator and loads an HTML document from a file.
-
- The complete file path to be read.
- The character encoding to use.
-
-
-
- Initializes a new instance of the HtmlNavigator and loads an HTML document from a file.
-
- The complete file path to be read.
- The character encoding to use.
- Indicates whether to look for byte order marks at the beginning of the file.
-
-
-
- Initializes a new instance of the HtmlNavigator and loads an HTML document from a file.
-
- The complete file path to be read.
- The character encoding to use.
- Indicates whether to look for byte order marks at the beginning of the file.
- The minimum buffer size.
-
-
-
- Creates a new HtmlNavigator positioned at the same node as this HtmlNavigator.
-
- A new HtmlNavigator object positioned at the same node as the original HtmlNavigator.
-
-
-
- Gets the value of the HTML attribute with the specified LocalName and NamespaceURI.
-
- The local name of the HTML attribute.
- The namespace URI of the attribute. Unsupported with the HtmlNavigator implementation.
- The value of the specified HTML attribute. String.Empty or null if a matching attribute is not found or if the navigator is not positioned on an element node.
-
-
-
- Returns the value of the namespace node corresponding to the specified local name.
- Always returns string.Empty for the HtmlNavigator implementation.
-
- The local name of the namespace node.
- Always returns string.Empty for the HtmlNavigator implementation.
-
-
-
- Determines whether the current HtmlNavigator is at the same position as the specified HtmlNavigator.
-
- The HtmlNavigator that you want to compare against.
- true if the two navigators have the same position, otherwise, false.
-
-
-
- Moves to the same position as the specified HtmlNavigator.
-
- The HtmlNavigator positioned on the node that you want to move to.
- true if successful, otherwise false. If false, the position of the navigator is unchanged.
-
-
-
- Moves to the HTML attribute with matching LocalName and NamespaceURI.
-
- The local name of the HTML attribute.
- The namespace URI of the attribute. Unsupported with the HtmlNavigator implementation.
- true if the HTML attribute is found, otherwise, false. If false, the position of the navigator does not change.
-
-
-
- Moves to the first sibling of the current node.
-
- true if the navigator is successful moving to the first sibling node, false if there is no first sibling or if the navigator is currently positioned on an attribute node.
-
-
-
- Moves to the first HTML attribute.
-
- true if the navigator is successful moving to the first HTML attribute, otherwise, false.
-
-
-
- Moves to the first child of the current node.
-
- true if there is a first child node, otherwise false.
-
-
-
- Moves the XPathNavigator to the first namespace node of the current element.
- Always returns false for the HtmlNavigator implementation.
-
- An XPathNamespaceScope value describing the namespace scope.
- Always returns false for the HtmlNavigator implementation.
-
-
-
- Moves to the node that has an attribute of type ID whose value matches the specified string.
-
- A string representing the ID value of the node to which you want to move. This argument does not need to be atomized.
- true if the move was successful, otherwise false. If false, the position of the navigator is unchanged.
-
-
-
- Moves the XPathNavigator to the namespace node with the specified local name.
- Always returns false for the HtmlNavigator implementation.
-
- The local name of the namespace node.
- Always returns false for the HtmlNavigator implementation.
-
-
-
- Moves to the next sibling of the current node.
-
- true if the navigator is successful moving to the next sibling node, false if there are no more siblings or if the navigator is currently positioned on an attribute node. If false, the position of the navigator is unchanged.
-
-
-
- Moves to the next HTML attribute.
-
-
-
-
-
- Moves the XPathNavigator to the next namespace node.
- Always returns falsefor the HtmlNavigator implementation.
-
- An XPathNamespaceScope value describing the namespace scope.
- Always returns false for the HtmlNavigator implementation.
-
-
-
- Moves to the parent of the current node.
-
- true if there is a parent node, otherwise false.
-
-
-
- Moves to the previous sibling of the current node.
-
- true if the navigator is successful moving to the previous sibling node, false if there is no previous sibling or if the navigator is currently positioned on an attribute node.
-
-
-
- Moves to the root node to which the current node belongs.
-
-
-
-
- Gets the base URI for the current node.
- Always returns string.Empty in the case of HtmlNavigator implementation.
-
-
-
-
- Gets the current HTML document.
-
-
-
-
- Gets the current HTML node.
-
-
-
-
- Gets a value indicating whether the current node has child nodes.
-
-
-
-
- Gets a value indicating whether the current node has child nodes.
-
-
-
-
- Gets a value indicating whether the current node is an empty element.
-
-
-
-
- Gets the name of the current HTML node without the namespace prefix.
-
-
-
-
- Gets the qualified name of the current node.
-
-
-
-
- Gets the namespace URI (as defined in the W3C Namespace Specification) of the current node.
- Always returns string.Empty in the case of HtmlNavigator implementation.
-
-
-
-
- Gets the associated with this implementation.
-
-
-
-
- Gets the type of the current node.
-
-
-
-
- Gets the prefix associated with the current node.
- Always returns string.Empty in the case of HtmlNavigator implementation.
-
-
-
-
- Gets the text value of the current node.
-
-
-
-
- Gets the xml:lang scope for the current node.
- Always returns string.Empty in the case of HtmlNavigator implementation.
-
-
-
-
- Represents the type of parsing error.
-
-
-
-
- A tag was not closed.
-
-
-
-
- A tag was not opened.
-
-
-
-
- There is a charset mismatch between stream and declared (META) encoding.
-
-
-
-
- An end tag was not required.
-
-
-
-
- An end tag is invalid at this position.
-
-
-
-
- Represents a fragment of code in a mixed code document.
-
-
-
-
- Represents a base class for fragments in a mixed code document.
-
-
-
-
- Gets the fragement text.
-
-
-
-
- Gets the type of fragment.
-
-
-
-
- Gets the line number of the fragment.
-
-
-
-
- Gets the line position (column) of the fragment.
-
-
-
-
- Gets the fragment position in the document's stream.
-
-
-
-
- Gets the fragment code text.
-
-
-
-
- Represents an HTML comment.
-
-
-
-
- Represents an HTML node.
-
-
-
-
- Gets the name of a comment node. It is actually defined as '#comment'.
-
-
-
-
- Gets the name of the document node. It is actually defined as '#document'.
-
-
-
-
- Gets the name of a text node. It is actually defined as '#text'.
-
-
-
-
- Gets a collection of flags that define specific behaviors for specific element nodes.
- The table contains a DictionaryEntry list with the lowercase tag name as the Key, and a combination of HtmlElementFlags as the Value.
-
-
-
-
- Initialize HtmlNode. Builds a list of all tags that have special allowances
-
-
-
-
- Initializes HtmlNode, providing type, owner and where it exists in a collection
-
-
-
-
-
-
-
- Creates a new XPathNavigator object for navigating this HTML node.
-
- An XPathNavigator object. The XPathNavigator is positioned on the node from which the method was called. It is not positioned on the root of the document.
-
-
-
- Determines if an element node can be kept overlapped.
-
- The name of the element node to check. May not be null.
- true if the name is the name of an element node that can be kept overlapped, false otherwise.
-
-
-
- Creates an HTML node from a string representing literal HTML.
-
- The HTML text.
- The newly created node instance.
-
-
-
- Determines if an element node is a CDATA element node.
-
- The name of the element node to check. May not be null.
- true if the name is the name of a CDATA element node, false otherwise.
-
-
-
- Determines if an element node is closed.
-
- The name of the element node to check. May not be null.
- true if the name is the name of a closed element node, false otherwise.
-
-
-
- Determines if an element node is defined as empty.
-
- The name of the element node to check. May not be null.
- true if the name is the name of an empty element node, false otherwise.
-
-
-
- Determines if a text corresponds to the closing tag of an node that can be kept overlapped.
-
- The text to check. May not be null.
- true or false.
-
-
-
- Returns a collection of all ancestor nodes of this element.
-
-
-
-
-
- Get Ancestors with matching name
-
-
-
-
-
-
- Returns a collection of all ancestor nodes of this element.
-
-
-
-
-
- Gets all anscestor nodes and the current node
-
-
-
-
-
-
- Adds the specified node to the end of the list of children of this node.
-
- The node to add. May not be null.
- The node added.
-
-
-
- Adds the specified node to the end of the list of children of this node.
-
- The node list to add. May not be null.
-
-
-
- Gets all Attributes with name
-
-
-
-
-
-
- Creates a duplicate of the node
-
-
-
-
-
- Creates a duplicate of the node and changes its name at the same time.
-
- The new name of the cloned node. May not be null.
- The cloned node.
-
-
-
- Creates a duplicate of the node and changes its name at the same time.
-
- The new name of the cloned node. May not be null.
- true to recursively clone the subtree under the specified node; false to clone only the node itself.
- The cloned node.
-
-
-
- Creates a duplicate of the node.
-
- true to recursively clone the subtree under the specified node; false to clone only the node itself.
- The cloned node.
-
-
-
- Creates a duplicate of the node and the subtree under it.
-
- The node to duplicate. May not be null.
-
-
-
- Creates a duplicate of the node.
-
- The node to duplicate. May not be null.
- true to recursively clone the subtree under the specified node, false to clone only the node itself.
-
-
-
- Creates an XPathNavigator using the root of this document.
-
-
-
-
-
- Gets all Descendant nodes for this node and each of child nodes
-
-
-
-
-
- Returns a collection of all descendant nodes of this element, in document order
-
-
-
-
-
- Gets all Descendant nodes in enumerated list
-
-
-
-
-
- Get all descendant nodes with matching name
-
-
-
-
-
-
- Returns a collection of all descendant nodes of this element, in document order
-
-
-
-
-
- Gets all descendant nodes including this node
-
-
-
-
-
-
- Gets first generation child node matching name
-
-
-
-
-
-
- Gets matching first generation child nodes matching name
-
-
-
-
-
-
- Helper method to get the value of an attribute of this node. If the attribute is not found, the default value will be returned.
-
- The name of the attribute to get. May not be null.
- The default value to return if not found.
- The value of the attribute if found, the default value if not found.
-
-
-
- Helper method to get the value of an attribute of this node. If the attribute is not found, the default value will be returned.
-
- The name of the attribute to get. May not be null.
- The default value to return if not found.
- The value of the attribute if found, the default value if not found.
-
-
-
- Helper method to get the value of an attribute of this node. If the attribute is not found, the default value will be returned.
-
- The name of the attribute to get. May not be null.
- The default value to return if not found.
- The value of the attribute if found, the default value if not found.
-
-
-
- Inserts the specified node immediately after the specified reference node.
-
- The node to insert. May not be null.
- The node that is the reference node. The newNode is placed after the refNode.
- The node being inserted.
-
-
-
- Inserts the specified node immediately before the specified reference node.
-
- The node to insert. May not be null.
- The node that is the reference node. The newChild is placed before this node.
- The node being inserted.
-
-
-
- Adds the specified node to the beginning of the list of children of this node.
-
- The node to add. May not be null.
- The node added.
-
-
-
- Adds the specified node list to the beginning of the list of children of this node.
-
- The node list to add. May not be null.
-
-
-
- Removes node from parent collection
-
-
-
-
- Removes all the children and/or attributes of the current node.
-
-
-
-
- Removes all the children of the current node.
-
-
-
-
- Removes the specified child node.
-
- The node being removed. May not be null.
- The node removed.
-
-
-
- Removes the specified child node.
-
- The node being removed. May not be null.
- true to keep grand children of the node, false otherwise.
- The node removed.
-
-
-
- Replaces the child node oldChild with newChild node.
-
- The new node to put in the child list.
- The node being replaced in the list.
- The node replaced.
-
-
-
- Selects a list of nodes matching the expression.
-
- The XPath expression.
- An containing a collection of nodes matching the query, or null if no node matched the XPath expression.
-
-
-
- Selects the first XmlNode that matches the XPath expression.
-
- The XPath expression. May not be null.
- The first that matches the XPath query or a null reference if no matching node was found.
-
-
-
- Helper method to set the value of an attribute of this node. If the attribute is not found, it will be created automatically.
-
- The name of the attribute to set. May not be null.
- The value for the attribute.
- The corresponding attribute instance.
-
-
-
- Saves all the children of the node to the specified TextWriter.
-
- The TextWriter to which you want to save.
-
-
-
- Saves all the children of the node to a string.
-
- The saved string.
-
-
-
- Saves the current node to the specified TextWriter.
-
- The TextWriter to which you want to save.
-
-
-
- Saves the current node to the specified XmlWriter.
-
- The XmlWriter to which you want to save.
-
-
-
- Saves the current node to a string.
-
- The saved string.
-
-
-
- Gets the collection of HTML attributes for this node. May not be null.
-
-
-
-
- Gets all the children of the node.
-
-
-
-
- Gets a value indicating if this node has been closed or not.
-
-
-
-
- Gets the collection of HTML attributes for the closing tag. May not be null.
-
-
-
-
- Gets the first child of the node.
-
-
-
-
- Gets a value indicating whether the current node has any attributes.
-
-
-
-
- Gets a value indicating whether this node has any child nodes.
-
-
-
-
- Gets a value indicating whether the current node has any attributes on the closing tag.
-
-
-
-
- Gets or sets the value of the 'id' HTML attribute. The document must have been parsed using the OptionUseIdAttribute set to true.
-
-
-
-
- Gets or Sets the HTML between the start and end tags of the object.
-
-
-
-
- Gets or Sets the text between the start and end tags of the object.
-
-
-
-
- Gets the last child of the node.
-
-
-
-
- Gets the line number of this node in the document.
-
-
-
-
- Gets the column number of this node in the document.
-
-
-
-
- Gets or sets this node's name.
-
-
-
-
- Gets the HTML node immediately following this element.
-
-
-
-
- Gets the type of this node.
-
-
-
-
- The original unaltered name of the tag
-
-
-
-
- Gets or Sets the object and its content in HTML.
-
-
-
-
- Gets the to which this node belongs.
-
-
-
-
- Gets the parent of this node (for nodes that can have parents).
-
-
-
-
- Gets the node immediately preceding this node.
-
-
-
-
- Gets the stream position of this node in the document, relative to the start of the document.
-
-
-
-
- Gets a valid XPath string that points to this node
-
-
-
-
- Gets or Sets the comment text of the node.
-
-
-
-
- Gets or Sets the HTML between the start and end tags of the object. In the case of a text node, it is equals to OuterHtml.
-
-
-
-
- Gets or Sets the object and its content in HTML.
-
-
-
-
- A utility class to compute CRC32.
-
-
-
-
- Compute a checksum for a given array of bytes.
-
- The array of bytes to compute the checksum for.
- The computed checksum.
-
-
-
- Compute a checksum for a given string.
-
- The string to compute the checksum for.
- The computed checksum.
-
-
-
- Represents an HTML attribute.
-
-
-
-
- Compares the current instance with another attribute. Comparison is based on attributes' name.
-
- An attribute to compare with this instance.
- A 32-bit signed integer that indicates the relative order of the names comparison.
-
-
-
- Creates a duplicate of this attribute.
-
- The cloned attribute.
-
-
-
- Removes this attribute from it's parents collection
-
-
-
-
- Gets the line number of this attribute in the document.
-
-
-
-
- Gets the column number of this attribute in the document.
-
-
-
-
- Gets the qualified name of the attribute.
-
-
-
-
- Name of attribute with original case
-
-
-
-
- Gets the HTML document to which this attribute belongs.
-
-
-
-
- Gets the HTML node to which this attribute belongs.
-
-
-
-
- Specifies what type of quote the data should be wrapped in
-
-
-
-
- Gets the stream position of this attribute in the document, relative to the start of the document.
-
-
-
-
- Gets or sets the value of the attribute.
-
-
-
-
- Gets a valid XPath string that points to this Attribute
-
-
-
-
- An Enum representing different types of Quotes used for surrounding attribute values
-
-
-
-
- A single quote mark '
-
-
-
-
- A double quote mark "
-
-
-
-
- Represents a list of mixed code fragments.
-
-
-
-
- Gets an enumerator that can iterate through the fragment list.
-
-
-
-
- Appends a fragment to the list of fragments.
-
- The fragment to append. May not be null.
-
-
-
- Gets an enumerator that can iterate through the fragment list.
-
-
-
-
- Prepends a fragment to the list of fragments.
-
- The fragment to append. May not be null.
-
-
-
- Remove a fragment from the list of fragments. If this fragment was not in the list, an exception will be raised.
-
- The fragment to remove. May not be null.
-
-
-
- Remove all fragments from the list.
-
-
-
-
- Remove a fragment from the list of fragments, using its index in the list.
-
- The index of the fragment to remove.
-
-
-
- Gets the Document
-
-
-
-
- Gets the number of fragments contained in the list.
-
-
-
-
- Gets a fragment from the list using its index.
-
-
-
-
- Represents a fragment enumerator.
-
-
-
-
- Advances the enumerator to the next element of the collection.
-
- true if the enumerator was successfully advanced to the next element; false if the enumerator has passed the end of the collection.
-
-
-
- Sets the enumerator to its initial position, which is before the first element in the collection.
-
-
-
-
- Gets the current element in the collection.
-
-
-
-
- Gets the current element in the collection.
-
-
-
-
- Represents an exception thrown by the HtmlWeb utility class.
-
-
-
-
- Creates an instance of the HtmlWebException.
-
- The exception's message.
-
-
-
- Represents the type of fragment in a mixed code document.
-
-
-
-
- The fragment contains code.
-
-
-
-
- The fragment contains text.
-
-
-
-
- Represents the type of a node.
-
-
-
-
- The root of a document.
-
-
-
-
- An HTML element.
-
-
-
-
- An HTML comment.
-
-
-
-
- A text node is always the child of an element or a document node.
-
-
-
-
- Flags that describe the behavior of an Element node.
-
-
-
-
- The node is a CDATA node.
-
-
-
-
- The node is empty. META or IMG are example of such nodes.
-
-
-
-
- The node will automatically be closed during parsing.
-
-
-
-
- The node can overlap.
-
-
-
-
- Represents an HTML text node.
-
-
-
-
- Gets or Sets the HTML between the start and end tags of the object. In the case of a text node, it is equals to OuterHtml.
-
-
-
-
- Gets or Sets the object and its content in HTML.
-
-
-
-
- Gets or Sets the text of the node.
-
-
-
-
- Represents a parsing error found during document parsing.
-
-
-
-
- Gets the type of error.
-
-
-
-
- Gets the line number of this error in the document.
-
-
-
-
- Gets the column number of this error in the document.
-
-
-
-
- Gets a description for the error.
-
-
-
-
- Gets the the full text of the line containing the error.
-
-
-
-
- Gets the absolute stream position of this error in the document, relative to the start of the document.
-
-
-
-
- Represents a complete HTML document.
-
-
-
-
- Adds Debugging attributes to node. Default is false.
-
-
-
-
- Defines if closing for non closed nodes must be done at the end or directly in the document.
- Setting this to true can actually change how browsers render the page. Default is false.
-
-
-
-
- Defines if non closed nodes will be checked at the end of parsing. Default is true.
-
-
-
-
- Defines if a checksum must be computed for the document while parsing. Default is false.
-
-
-
-
- Defines the default stream encoding to use. Default is System.Text.Encoding.Default.
-
-
-
-
- Defines if source text must be extracted while parsing errors.
- If the document has a lot of errors, or cascading errors, parsing performance can be dramatically affected if set to true.
- Default is false.
-
-
-
-
- Defines the maximum length of source text or parse errors. Default is 100.
-
-
-
-
- Defines if LI, TR, TH, TD tags must be partially fixed when nesting errors are detected. Default is false.
-
-
-
-
- Defines if output must conform to XML, instead of HTML.
-
-
-
-
- Defines if attribute value output must be optimized (not bound with double quotes if it is possible). Default is false.
-
-
-
-
- Defines if name must be output with it's original case. Useful for asp.net tags and attributes
-
-
-
-
- Defines if name must be output in uppercase. Default is false.
-
-
-
-
- Defines if declared encoding must be read from the document.
- Declared encoding is determined using the meta http-equiv="content-type" content="text/html;charset=XXXXX" html node.
- Default is true.
-
-
-
-
- Defines the name of a node that will throw the StopperNodeException when found as an end node. Default is null.
-
-
-
-
- Defines if the 'id' attribute must be specifically used. Default is true.
-
-
-
-
- Defines if empty nodes must be written as closed during output. Default is false.
-
-
-
-
- Creates an instance of an HTML document.
-
-
-
-
- Creates a new XPathNavigator object for navigating this HTML document.
-
- An XPathNavigator object. The XPathNavigator is positioned on the root of the document.
-
-
-
- Gets a valid XML name.
-
- Any text.
- A string that is a valid XML name.
-
-
-
- Applies HTML encoding to a specified string.
-
- The input string to encode. May not be null.
- The encoded string.
-
-
-
- Determines if the specified character is considered as a whitespace character.
-
- The character to check.
- true if if the specified character is considered as a whitespace character.
-
-
-
- Creates an HTML attribute with the specified name.
-
- The name of the attribute. May not be null.
- The new HTML attribute.
-
-
-
- Creates an HTML attribute with the specified name.
-
- The name of the attribute. May not be null.
- The value of the attribute.
- The new HTML attribute.
-
-
-
- Creates an HTML comment node.
-
- The new HTML comment node.
-
-
-
- Creates an HTML comment node with the specified comment text.
-
- The comment text. May not be null.
- The new HTML comment node.
-
-
-
- Creates an HTML element node with the specified name.
-
- The qualified name of the element. May not be null.
- The new HTML node.
-
-
-
- Creates an HTML text node.
-
- The new HTML text node.
-
-
-
- Creates an HTML text node with the specified text.
-
- The text of the node. May not be null.
- The new HTML text node.
-
-
-
- Detects the encoding of an HTML stream.
-
- The input stream. May not be null.
- The detected encoding.
-
-
-
- Detects the encoding of an HTML file.
-
- Path for the file containing the HTML document to detect. May not be null.
- The detected encoding.
-
-
-
- Detects the encoding of an HTML text provided on a TextReader.
-
- The TextReader used to feed the HTML. May not be null.
- The detected encoding.
-
-
-
- Detects the encoding of an HTML document from a file first, and then loads the file.
-
- The complete file path to be read.
-
-
-
- Detects the encoding of an HTML document from a file first, and then loads the file.
-
- The complete file path to be read. May not be null.
- true to detect encoding, false otherwise.
-
-
-
- Detects the encoding of an HTML text.
-
- The input html text. May not be null.
- The detected encoding.
-
-
-
- Gets the HTML node with the specified 'id' attribute value.
-
- The attribute id to match. May not be null.
- The HTML node with the matching id or null if not found.
-
-
-
- Loads an HTML document from a stream.
-
- The input stream.
-
-
-
- Loads an HTML document from a stream.
-
- The input stream.
- Indicates whether to look for byte order marks at the beginning of the stream.
-
-
-
- Loads an HTML document from a stream.
-
- The input stream.
- The character encoding to use.
-
-
-
- Loads an HTML document from a stream.
-
- The input stream.
- The character encoding to use.
- Indicates whether to look for byte order marks at the beginning of the stream.
-
-
-
- Loads an HTML document from a stream.
-
- The input stream.
- The character encoding to use.
- Indicates whether to look for byte order marks at the beginning of the stream.
- The minimum buffer size.
-
-
-
- Loads an HTML document from a file.
-
- The complete file path to be read. May not be null.
-
-
-
- Loads an HTML document from a file.
-
- The complete file path to be read. May not be null.
- Indicates whether to look for byte order marks at the beginning of the file.
-
-
-
- Loads an HTML document from a file.
-
- The complete file path to be read. May not be null.
- The character encoding to use. May not be null.
-
-
-
- Loads an HTML document from a file.
-
- The complete file path to be read. May not be null.
- The character encoding to use. May not be null.
- Indicates whether to look for byte order marks at the beginning of the file.
-
-
-
- Loads an HTML document from a file.
-
- The complete file path to be read. May not be null.
- The character encoding to use. May not be null.
- Indicates whether to look for byte order marks at the beginning of the file.
- The minimum buffer size.
-
-
-
- Loads the HTML document from the specified TextReader.
-
- The TextReader used to feed the HTML data into the document. May not be null.
-
-
-
- Loads the HTML document from the specified string.
-
- String containing the HTML document to load. May not be null.
-
-
-
- Saves the HTML document to the specified stream.
-
- The stream to which you want to save.
-
-
-
- Saves the HTML document to the specified stream.
-
- The stream to which you want to save. May not be null.
- The character encoding to use. May not be null.
-
-
-
- Saves the mixed document to the specified file.
-
- The location of the file where you want to save the document.
-
-
-
- Saves the mixed document to the specified file.
-
- The location of the file where you want to save the document. May not be null.
- The character encoding to use. May not be null.
-
-
-
- Saves the HTML document to the specified StreamWriter.
-
- The StreamWriter to which you want to save.
-
-
-
- Saves the HTML document to the specified TextWriter.
-
- The TextWriter to which you want to save. May not be null.
-
-
-
- Saves the HTML document to the specified XmlWriter.
-
- The XmlWriter to which you want to save.
-
-
-
- Gets the document CRC32 checksum if OptionComputeChecksum was set to true before parsing, 0 otherwise.
-
-
-
-
- Gets the document's declared encoding.
- Declared encoding is determined using the meta http-equiv="content-type" content="text/html;charset=XXXXX" html node.
-
-
-
-
- Gets the root node of the document.
-
-
-
-
- Gets the document's output encoding.
-
-
-
-
- Gets a list of parse errors found in the document.
-
-
-
-
- Gets the remaining text.
- Will always be null if OptionStopperNodeName is null.
-
-
-
-
- Gets the offset of Remainder in the original Html text.
- If OptionStopperNodeName is null, this will return the length of the original Html text.
-
-
-
-
- Gets the document's stream encoding.
-
-
-
-
- Represents a combined list and collection of HTML nodes.
-
-
-
-
- Initialize the HtmlNodeCollection with the base parent node
-
- The base node of the collection
-
-
-
- Add node to the collection
-
-
-
-
-
- Clears out the collection of HtmlNodes. Removes each nodes reference to parentnode, nextnode and prevnode
-
-
-
-
- Gets existence of node in collection
-
-
-
-
-
-
- Copy collection to array
-
-
-
-
-
-
- Get Enumerator
-
-
-
-
-
- Get Explicit Enumerator
-
-
-
-
-
- Get index of node
-
-
-
-
-
-
- Insert node at index
-
-
-
-
-
-
- Remove node
-
-
-
-
-
-
- Remove at index
-
-
-
-
-
- Get first instance of node in supplied collection
-
-
-
-
-
-
-
- Add node to the end of the collection
-
-
-
-
-
- Get first instance of node with name
-
-
-
-
-
-
- Get index of node
-
-
-
-
-
-
- Add node to the beginning of the collection
-
-
-
-
-
- Remove node at index
-
-
-
-
-
-
- Replace node at index
-
-
-
-
-
-
- Get all node descended from this collection
-
-
-
-
-
- Get all node descended from this collection with matching name
-
-
-
-
-
- Gets all first generation elements in collection
-
-
-
-
-
- Gets all first generation elements matching name
-
-
-
-
-
-
- All first generation nodes in collection
-
-
-
-
-
- Gets a given node from the list.
-
-
-
-
- Get node with tag name
-
-
-
-
-
-
- Gets the number of elements actually contained in the list.
-
-
-
-
- Is collection read only
-
-
-
-
- Gets the node at the specified index.
-
-
-
-
- A utility class to get HTML document from HTTP.
-
-
-
-
- Occurs after an HTTP request has been executed.
-
-
-
-
- Occurs before an HTML document is handled.
-
-
-
-
- Occurs before an HTTP request is executed.
-
-
-
-
- Gets the MIME content type for a given path extension.
-
- The input path extension.
- The default content type to return if any error occurs.
- The path extension's MIME content type.
-
-
-
- Gets the path extension for a given MIME content type.
-
- The input MIME content type.
- The default path extension to return if any error occurs.
- The MIME content type's path extension.
-
-
-
- Creates an instance of the given type from the specified Internet resource.
-
- The requested URL, such as "http://myserver/Mypath/Myfile.asp".
- The requested type.
- An newly created instance.
-
-
-
- Creates an instance of the given type from the specified Internet resource.
-
- The requested URL, such as "http://myserver/Mypath/Myfile.asp".
- The URL that specifies the XSLT stylesheet to load.
- An containing the namespace-qualified arguments used as input to the transform.
- The requested type.
- An newly created instance.
-
-
-
- Creates an instance of the given type from the specified Internet resource.
-
- The requested URL, such as "http://myserver/Mypath/Myfile.asp".
- The URL that specifies the XSLT stylesheet to load.
- An containing the namespace-qualified arguments used as input to the transform.
- The requested type.
- A file path where the temporary XML before transformation will be saved. Mostly used for debugging purposes.
- An newly created instance.
-
-
-
- Gets an HTML document from an Internet resource and saves it to the specified file.
-
- The requested URL, such as "http://myserver/Mypath/Myfile.asp".
- The location of the file where you want to save the document.
-
-
-
- Gets an HTML document from an Internet resource and saves it to the specified file. - Proxy aware
-
- The requested URL, such as "http://myserver/Mypath/Myfile.asp".
- The location of the file where you want to save the document.
-
-
-
-
-
- Gets an HTML document from an Internet resource and saves it to the specified file.
-
- The requested URL, such as "http://myserver/Mypath/Myfile.asp".
- The location of the file where you want to save the document.
- The HTTP method used to open the connection, such as GET, POST, PUT, or PROPFIND.
-
-
-
- Gets an HTML document from an Internet resource and saves it to the specified file. Understands Proxies
-
- The requested URL, such as "http://myserver/Mypath/Myfile.asp".
- The location of the file where you want to save the document.
-
- The HTTP method used to open the connection, such as GET, POST, PUT, or PROPFIND.
-
-
-
-
- Gets the cache file path for a specified url.
-
- The url fo which to retrieve the cache path. May not be null.
- The cache file path.
-
-
-
- Gets an HTML document from an Internet resource.
-
- The requested URL, such as "http://myserver/Mypath/Myfile.asp".
- A new HTML document.
-
-
-
- Gets an HTML document from an Internet resource.
-
- The requested URL, such as "http://myserver/Mypath/Myfile.asp".
- Host to use for Proxy
- Port the Proxy is on
- User Id for Authentication
- Password for Authentication
- A new HTML document.
-
-
-
- Loads an HTML document from an Internet resource.
-
- The requested URL, such as "http://myserver/Mypath/Myfile.asp".
- The HTTP method used to open the connection, such as GET, POST, PUT, or PROPFIND.
- A new HTML document.
-
-
-
- Loads an HTML document from an Internet resource.
-
- The requested URL, such as "http://myserver/Mypath/Myfile.asp".
- The HTTP method used to open the connection, such as GET, POST, PUT, or PROPFIND.
- Proxy to use with this request
- Credentials to use when authenticating
- A new HTML document.
-
-
-
- Loads an HTML document from an Internet resource and saves it to the specified XmlTextWriter.
-
- The requested URL, such as "http://myserver/Mypath/Myfile.asp".
- The XmlTextWriter to which you want to save.
-
-
-
- Loads an HTML document from an Internet resource and saves it to the specified XmlTextWriter, after an XSLT transformation.
-
- The requested URL, such as "http://myserver/Mypath/Myfile.asp".
- The URL that specifies the XSLT stylesheet to load.
- An XsltArgumentList containing the namespace-qualified arguments used as input to the transform.
- The XmlTextWriter to which you want to save.
-
-
-
- Loads an HTML document from an Internet resource and saves it to the specified XmlTextWriter, after an XSLT transformation.
-
- The requested URL, such as "http://myserver/Mypath/Myfile.asp". May not be null.
- The URL that specifies the XSLT stylesheet to load.
- An XsltArgumentList containing the namespace-qualified arguments used as input to the transform.
- The XmlTextWriter to which you want to save.
- A file path where the temporary XML before transformation will be saved. Mostly used for debugging purposes.
-
-
-
- Gets or Sets a value indicating if document encoding must be automatically detected.
-
-
-
-
- Gets or Sets a value indicating whether to get document only from the cache.
- If this is set to true and document is not found in the cache, nothing will be loaded.
-
-
-
-
- Gets or Sets the cache path. If null, no caching mechanism will be used.
-
-
-
-
- Gets a value indicating if the last document was retrieved from the cache.
-
-
-
-
- Gets the last request duration in milliseconds.
-
-
-
-
- Gets the URI of the Internet resource that actually responded to the request.
-
-
-
-
- Gets the last request status.
-
-
-
-
- Gets or Sets the size of the buffer used for memory operations.
-
-
-
-
- Gets or Sets a value indicating if cookies will be stored.
-
-
-
-
- Gets or Sets the User Agent HTTP 1.1 header sent on any webrequest
-
-
-
-
- Gets or Sets a value indicating whether the caching mechanisms should be used or not.
-
-
-
-
- Represents the method that will handle the PostResponse event.
-
-
-
-
- Represents the method that will handle the PreHandleDocument event.
-
-
-
-
- Represents the method that will handle the PreRequest event.
-
-
-
-
- A utility class to replace special characters by entities and vice-versa.
- Follows HTML 4.0 specification found at http://www.w3.org/TR/html4/sgml/entities.html
-
-
-
-
- Replace known entities by characters.
-
- The source text.
- The result text.
-
-
-
- Clone and entitize an HtmlNode. This will affect attribute values and nodes' text. It will also entitize all child nodes.
-
- The node to entitize.
- An entitized cloned node.
-
-
-
- Replace characters above 127 by entities.
-
- The source text.
- The result text.
-
-
-
- Replace characters above 127 by entities.
-
- The source text.
- If set to false, the function will not use known entities name. Default is true.
- The result text.
-
-
-
- Replace characters above 127 by entities.
-
- The source text.
- If set to false, the function will not use known entities name. Default is true.
- If set to true, the [quote], [ampersand], [lower than] and [greather than] characters will be entitized.
- The result text
-
-
-
- A collection of entities indexed by name.
-
-
-
-
- A collection of entities indexed by value.
-
-
-
-
- Represents a combined list and collection of HTML nodes.
-
-
-
-
- Adds supplied item to collection
-
-
-
-
-
- Explicit clear
-
-
-
-
- Retreives existence of supplied item
-
-
-
-
-
-
- Copies collection to array
-
-
-
-
-
-
- Get Explicit enumerator
-
-
-
-
-
- Explicit non-generic enumerator
-
-
-
-
-
- Retrieves the index for the supplied item, -1 if not found
-
-
-
-
-
-
- Inserts given item into collection at supplied index
-
-
-
-
-
-
- Explicit collection remove
-
-
-
-
-
-
- Removes the attribute at the specified index.
-
- The index of the attribute to remove.
-
-
-
- Adds a new attribute to the collection with the given values
-
-
-
-
-
-
- Inserts the specified attribute as the last attribute in the collection.
-
- The attribute to insert. May not be null.
- The appended attribute.
-
-
-
- Creates and inserts a new attribute as the last attribute in the collection.
-
- The name of the attribute to insert.
- The appended attribute.
-
-
-
- Creates and inserts a new attribute as the last attribute in the collection.
-
- The name of the attribute to insert.
- The value of the attribute to insert.
- The appended attribute.
-
-
-
- Checks for existance of attribute with given name
-
-
-
-
-
-
- Inserts the specified attribute as the first node in the collection.
-
- The attribute to insert. May not be null.
- The prepended attribute.
-
-
-
- Removes a given attribute from the list.
-
- The attribute to remove. May not be null.
-
-
-
- Removes an attribute from the list, using its name. If there are more than one attributes with this name, they will all be removed.
-
- The attribute's name. May not be null.
-
-
-
- Remove all attributes in the list.
-
-
-
-
- Returns all attributes with specified name. Handles case insentivity
-
- Name of the attribute
-
-
-
-
- Removes all attributes from the collection
-
-
-
-
- Clears the attribute collection
-
-
-
-
- Gets a given attribute from the list using its name.
-
-
-
-
- Gets the number of elements actually contained in the list.
-
-
-
-
- Gets readonly status of colelction
-
-
-
-
- Gets the attribute at the specified index.
-
-
-
-
- Represents a document with mixed code and text. ASP, ASPX, JSP, are good example of such documents.
-
-
-
-
- Gets or sets the token representing code end.
-
-
-
-
- Gets or sets the token representing code start.
-
-
-
-
- Gets or sets the token representing code directive.
-
-
-
-
- Gets or sets the token representing response write directive.
-
-
-
-
- Creates a mixed code document instance.
-
-
-
-
- Create a code fragment instances.
-
- The newly created code fragment instance.
-
-
-
- Create a text fragment instances.
-
- The newly created text fragment instance.
-
-
-
- Loads a mixed code document from a stream.
-
- The input stream.
-
-
-
- Loads a mixed code document from a stream.
-
- The input stream.
- Indicates whether to look for byte order marks at the beginning of the file.
-
-
-
- Loads a mixed code document from a stream.
-
- The input stream.
- The character encoding to use.
-
-
-
- Loads a mixed code document from a stream.
-
- The input stream.
- The character encoding to use.
- Indicates whether to look for byte order marks at the beginning of the file.
-
-
-
- Loads a mixed code document from a stream.
-
- The input stream.
- The character encoding to use.
- Indicates whether to look for byte order marks at the beginning of the file.
- The minimum buffer size.
-
-
-
- Loads a mixed code document from a file.
-
- The complete file path to be read.
-
-
-
- Loads a mixed code document from a file.
-
- The complete file path to be read.
- Indicates whether to look for byte order marks at the beginning of the file.
-
-
-
- Loads a mixed code document from a file.
-
- The complete file path to be read.
- The character encoding to use.
-
-
-
- Loads a mixed code document from a file.
-
- The complete file path to be read.
- The character encoding to use.
- Indicates whether to look for byte order marks at the beginning of the file.
-
-
-
- Loads a mixed code document from a file.
-
- The complete file path to be read.
- The character encoding to use.
- Indicates whether to look for byte order marks at the beginning of the file.
- The minimum buffer size.
-
-
-
- Loads the mixed code document from the specified TextReader.
-
- The TextReader used to feed the HTML data into the document.
-
-
-
- Loads a mixed document from a text
-
- The text to load.
-
-
-
- Saves the mixed document to the specified stream.
-
- The stream to which you want to save.
-
-
-
- Saves the mixed document to the specified stream.
-
- The stream to which you want to save.
- The character encoding to use.
-
-
-
- Saves the mixed document to the specified file.
-
- The location of the file where you want to save the document.
-
-
-
- Saves the mixed document to the specified file.
-
- The location of the file where you want to save the document.
- The character encoding to use.
-
-
-
- Saves the mixed document to the specified StreamWriter.
-
- The StreamWriter to which you want to save.
-
-
-
- Saves the mixed document to the specified TextWriter.
-
- The TextWriter to which you want to save.
-
-
-
- Gets the code represented by the mixed code document seen as a template.
-
-
-
-
- Gets the list of code fragments in the document.
-
-
-
-
- Gets the list of all fragments in the document.
-
-
-
-
- Gets the encoding of the stream used to read the document.
-
-
-
-
- Gets the list of text fragments in the document.
-
-
-
-
- Represents a fragment of text in a mixed code document.
-
-
-
-
- Gets the fragment text.
-
-
-
-
diff --git a/MWC/Dependencies/HtmlAgilityPack/HtmlAgilityPack.dll b/MWC/Dependencies/HtmlAgilityPack/HtmlAgilityPack.dll
deleted file mode 100644
index b0692c1d9..000000000
Binary files a/MWC/Dependencies/HtmlAgilityPack/HtmlAgilityPack.dll and /dev/null differ
diff --git a/MWC/Dependencies/HtmlAgilityPack/HtmlAgilityPack.pdb b/MWC/Dependencies/HtmlAgilityPack/HtmlAgilityPack.pdb
deleted file mode 100644
index bb9b8a376..000000000
Binary files a/MWC/Dependencies/HtmlAgilityPack/HtmlAgilityPack.pdb and /dev/null differ
diff --git a/MWC/Dependencies/Json.net/Newtonsoft.Json.dll b/MWC/Dependencies/Json.net/Newtonsoft.Json.dll
deleted file mode 100644
index 67b9d3511..000000000
Binary files a/MWC/Dependencies/Json.net/Newtonsoft.Json.dll and /dev/null differ
diff --git a/MWC/Dependencies/Json.net/Newtonsoft.Json.pdb b/MWC/Dependencies/Json.net/Newtonsoft.Json.pdb
deleted file mode 100644
index 0519669de..000000000
Binary files a/MWC/Dependencies/Json.net/Newtonsoft.Json.pdb and /dev/null differ
diff --git a/MWC/Dependencies/Json.net/Newtonsoft.Json.xml b/MWC/Dependencies/Json.net/Newtonsoft.Json.xml
deleted file mode 100644
index 121447eb7..000000000
--- a/MWC/Dependencies/Json.net/Newtonsoft.Json.xml
+++ /dev/null
@@ -1,7141 +0,0 @@
-
-
-
- Newtonsoft.Json
-
-
-
-
- Represents a reader that provides fast, non-cached, forward-only access to serialized Json data.
-
-
-
-
- Represents a reader that provides fast, non-cached, forward-only access to serialized Json data.
-
-
-
-
- Initializes a new instance of the class with the specified .
-
-
-
-
- Reads the next JSON token from the stream.
-
- true if the next token was read successfully; false if there are no more tokens to read.
-
-
-
- Reads the next JSON token from the stream as a .
-
- A or a null reference if the next JSON token is null.
-
-
-
- Reads the next JSON token from the stream as a .
-
- A .
-
-
-
- Reads the next JSON token from the stream as a .
-
- A .
-
-
-
- Skips the children of the current token.
-
-
-
-
- Sets the current token.
-
- The new token.
-
-
-
- Sets the current token and value.
-
- The new token.
- The value.
-
-
-
- Sets the state based on current token type.
-
-
-
-
- Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
-
-
-
-
- Releases unmanaged and - optionally - managed resources
-
- true to release both managed and unmanaged resources; false to release only unmanaged resources.
-
-
-
- Changes the to Closed.
-
-
-
-
- Gets the current reader state.
-
- The current reader state.
-
-
-
- Gets or sets a value indicating whether the underlying stream or
- should be closed when the reader is closed.
-
-
- true to close the underlying stream or when
- the reader is closed; otherwise false. The default is true.
-
-
-
-
- Gets the quotation mark character used to enclose the value of a string.
-
-
-
-
- Gets the type of the current Json token.
-
-
-
-
- Gets the text value of the current Json token.
-
-
-
-
- Gets The Common Language Runtime (CLR) type for the current Json token.
-
-
-
-
- Gets the depth of the current token in the JSON document.
-
- The depth of the current token in the JSON document.
-
-
-
- Specifies the state of the reader.
-
-
-
-
- The Read method has not been called.
-
-
-
-
- The end of the file has been reached successfully.
-
-
-
-
- Reader is at a property.
-
-
-
-
- Reader is at the start of an object.
-
-
-
-
- Reader is in an object.
-
-
-
-
- Reader is at the start of an array.
-
-
-
-
- Reader is in an array.
-
-
-
-
- The Close method has been called.
-
-
-
-
- Reader has just read a value.
-
-
-
-
- Reader is at the start of a constructor.
-
-
-
-
- Reader in a constructor.
-
-
-
-
- An error occurred that prevents the read operation from continuing.
-
-
-
-
- The end of the file has been reached successfully.
-
-
-
-
- Initializes a new instance of the class.
-
- The stream.
-
-
-
- Initializes a new instance of the class.
-
- The stream.
- if set to true the root object will be read as a JSON array.
- The used when reading values from BSON.
-
-
-
- Reads the next JSON token from the stream as a .
-
-
- A or a null reference if the next JSON token is null.
-
-
-
-
- Reads the next JSON token from the stream as a .
-
- A .
-
-
-
- Reads the next JSON token from the stream as a .
-
-
- A .
-
-
-
-
- Reads the next JSON token from the stream.
-
-
- true if the next token was read successfully; false if there are no more tokens to read.
-
-
-
-
- Changes the to Closed.
-
-
-
-
- Gets or sets a value indicating whether binary data reading should compatible with incorrect Json.NET 3.5 written binary.
-
-
- true if binary data reading will be compatible with incorrect Json.NET 3.5 written binary; otherwise, false.
-
-
-
-
- Gets or sets a value indicating whether the root object will be read as a JSON array.
-
-
- true if the root object will be read as a JSON array; otherwise, false.
-
-
-
-
- Gets or sets the used when reading values from BSON.
-
- The used when reading values from BSON.
-
-
-
- Represents a writer that provides a fast, non-cached, forward-only way of generating Json data.
-
-
-
-
- Represents a writer that provides a fast, non-cached, forward-only way of generating Json data.
-
-
-
-
- Creates an instance of the JsonWriter class.
-
-
-
-
- Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream.
-
-
-
-
- Closes this stream and the underlying stream.
-
-
-
-
- Writes the beginning of a Json object.
-
-
-
-
- Writes the end of a Json object.
-
-
-
-
- Writes the beginning of a Json array.
-
-
-
-
- Writes the end of an array.
-
-
-
-
- Writes the start of a constructor with the given name.
-
- The name of the constructor.
-
-
-
- Writes the end constructor.
-
-
-
-
- Writes the property name of a name/value pair on a Json object.
-
- The name of the property.
-
-
-
- Writes the end of the current Json object or array.
-
-
-
-
- Writes the current token.
-
- The to read the token from.
-
-
-
- Writes the specified end token.
-
- The end token to write.
-
-
-
- Writes indent characters.
-
-
-
-
- Writes the JSON value delimiter.
-
-
-
-
- Writes an indent space.
-
-
-
-
- Writes a null value.
-
-
-
-
- Writes an undefined value.
-
-
-
-
- Writes raw JSON without changing the writer's state.
-
- The raw JSON to write.
-
-
-
- Writes raw JSON where a value is expected and updates the writer's state.
-
- The raw JSON to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
- An error will raised if the value cannot be written as a single JSON token.
-
- The value to write.
-
-
-
- Writes out a comment /*...*/
containing the specified text.
-
- Text to place inside the comment.
-
-
-
- Writes out the given white space.
-
- The string of white space characters.
-
-
-
- Gets or sets a value indicating whether the underlying stream or
- should be closed when the writer is closed.
-
-
- true to close the underlying stream or when
- the writer is closed; otherwise false. The default is true.
-
-
-
-
- Gets the top.
-
- The top.
-
-
-
- Gets the state of the writer.
-
-
-
-
- Indicates how the output is formatted.
-
-
-
-
- Initializes a new instance of the class.
-
- The stream.
-
-
-
- Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream.
-
-
-
-
- Writes the end.
-
- The token.
-
-
-
- Writes out a comment /*...*/
containing the specified text.
-
- Text to place inside the comment.
-
-
-
- Writes the start of a constructor with the given name.
-
- The name of the constructor.
-
-
-
- Writes raw JSON.
-
- The raw JSON to write.
-
-
-
- Writes raw JSON where a value is expected and updates the writer's state.
-
- The raw JSON to write.
-
-
-
- Writes the beginning of a Json array.
-
-
-
-
- Writes the beginning of a Json object.
-
-
-
-
- Writes the property name of a name/value pair on a Json object.
-
- The name of the property.
-
-
-
- Closes this stream and the underlying stream.
-
-
-
-
- Writes a null value.
-
-
-
-
- Writes an undefined value.
-
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value that represents a BSON object id.
-
-
-
-
-
- Writes a BSON regex.
-
- The regex pattern.
- The regex options.
-
-
-
- Gets or sets the used when writing values to BSON.
- When set to no conversion will occur.
-
- The used when writing values to BSON.
-
-
-
- Represents a BSON Oid (object id).
-
-
-
-
- Initializes a new instance of the class.
-
- The Oid value.
-
-
-
- Gets or sets the value of the Oid.
-
- The value of the Oid.
-
-
-
- Converts a binary value to and from a base 64 string value.
-
-
-
-
- Converts an object to and from JSON.
-
-
-
-
- Writes the JSON representation of the object.
-
- The to write to.
- The value.
- The calling serializer.
-
-
-
- Reads the JSON representation of the object.
-
- The to read from.
- Type of the object.
- The existing value of object being read.
- The calling serializer.
- The object value.
-
-
-
- Determines whether this instance can convert the specified object type.
-
- Type of the object.
-
- true if this instance can convert the specified object type; otherwise, false.
-
-
-
-
- Gets the of the JSON produced by the JsonConverter.
-
- The of the JSON produced by the JsonConverter.
-
-
-
- Gets a value indicating whether this can read JSON.
-
- true if this can read JSON; otherwise, false.
-
-
-
- Gets a value indicating whether this can write JSON.
-
- true if this can write JSON; otherwise, false.
-
-
-
- Writes the JSON representation of the object.
-
- The to write to.
- The value.
- The calling serializer.
-
-
-
- Reads the JSON representation of the object.
-
- The to read from.
- Type of the object.
- The existing value of object being read.
- The calling serializer.
- The object value.
-
-
-
- Determines whether this instance can convert the specified object type.
-
- Type of the object.
-
- true if this instance can convert the specified object type; otherwise, false.
-
-
-
-
- Converts a to and from JSON.
-
-
-
-
- Writes the JSON representation of the object.
-
- The to write to.
- The value.
- The calling serializer.
-
-
-
- Reads the JSON representation of the object.
-
- The to read from.
- Type of the object.
- The existing value of object being read.
- The calling serializer.
- The object value.
-
-
-
- Determines whether this instance can convert the specified value type.
-
- Type of the value.
-
- true if this instance can convert the specified value type; otherwise, false.
-
-
-
-
- Converts a to and from JSON.
-
-
-
-
- Writes the JSON representation of the object.
-
- The to write to.
- The value.
- The calling serializer.
-
-
-
- Reads the JSON representation of the object.
-
- The to read from.
- Type of the object.
- The existing value of object being read.
- The calling serializer.
- The object value.
-
-
-
- Determines whether this instance can convert the specified value type.
-
- Type of the value.
-
- true if this instance can convert the specified value type; otherwise, false.
-
-
-
-
- Create a custom object
-
-
-
-
-
- Writes the JSON representation of the object.
-
- The to write to.
- The value.
- The calling serializer.
-
-
-
- Reads the JSON representation of the object.
-
- The to read from.
- Type of the object.
- The existing value of object being read.
- The calling serializer.
- The object value.
-
-
-
- Creates an object which will then be populated by the serializer.
-
- Type of the object.
-
-
-
-
- Determines whether this instance can convert the specified object type.
-
- Type of the object.
-
- true if this instance can convert the specified object type; otherwise, false.
-
-
-
-
- Gets a value indicating whether this can write JSON.
-
-
- true if this can write JSON; otherwise, false.
-
-
-
-
- Provides a base class for converting a to and from JSON.
-
-
-
-
- Determines whether this instance can convert the specified object type.
-
- Type of the object.
-
- true if this instance can convert the specified object type; otherwise, false.
-
-
-
-
- Converts an Entity Framework EntityKey to and from JSON.
-
-
-
-
- Writes the JSON representation of the object.
-
- The to write to.
- The value.
- The calling serializer.
-
-
-
- Reads the JSON representation of the object.
-
- The to read from.
- Type of the object.
- The existing value of object being read.
- The calling serializer.
- The object value.
-
-
-
- Determines whether this instance can convert the specified object type.
-
- Type of the object.
-
- true if this instance can convert the specified object type; otherwise, false.
-
-
-
-
- Converts an ExpandoObject to and from JSON.
-
-
-
-
- Writes the JSON representation of the object.
-
- The to write to.
- The value.
- The calling serializer.
-
-
-
- Reads the JSON representation of the object.
-
- The to read from.
- Type of the object.
- The existing value of object being read.
- The calling serializer.
- The object value.
-
-
-
- Determines whether this instance can convert the specified object type.
-
- Type of the object.
-
- true if this instance can convert the specified object type; otherwise, false.
-
-
-
-
- Gets a value indicating whether this can write JSON.
-
-
- true if this can write JSON; otherwise, false.
-
-
-
-
- Converts a to and from JSON.
-
-
-
-
- Writes the JSON representation of the object.
-
- The to write to.
- The value.
- The calling serializer.
-
-
-
- Reads the JSON representation of the object.
-
- The to read from.
- Type of the object.
- The existing value of object being read.
- The calling serializer.
- The object value.
-
-
-
- Determines whether this instance can convert the specified object type.
-
- Type of the object.
-
- true if this instance can convert the specified object type; otherwise, false.
-
-
-
-
- Converts a to and from JSON and BSON.
-
-
-
-
- Writes the JSON representation of the object.
-
- The to write to.
- The value.
- The calling serializer.
-
-
-
- Reads the JSON representation of the object.
-
- The to read from.
- Type of the object.
- The existing value of object being read.
- The calling serializer.
- The object value.
-
-
-
- Determines whether this instance can convert the specified object type.
-
- Type of the object.
-
- true if this instance can convert the specified object type; otherwise, false.
-
-
-
-
- Converts a to and from JSON and BSON.
-
-
-
-
- Writes the JSON representation of the object.
-
- The to write to.
- The value.
- The calling serializer.
-
-
-
- Reads the JSON representation of the object.
-
- The to read from.
- Type of the object.
- The existing value of object being read.
- The calling serializer.
- The object value.
-
-
-
- Determines whether this instance can convert the specified object type.
-
- Type of the object.
-
- true if this instance can convert the specified object type; otherwise, false.
-
-
-
-
- Converts an to and from its name string value.
-
-
- Converts an to and from its name string value.
-
-
-
-
- Writes the JSON representation of the object.
-
- The to write to.
- The value.
- The calling serializer.
-
-
-
- Reads the JSON representation of the object.
-
- The to read from.
- Type of the object.
- The existing value of object being read.
- The calling serializer.
- The object value.
-
-
-
- A cached representation of the Enum string representation to respect per Enum field name.
-
- The type of the Enum.
- A map of enum field name to either the field name, or the configured enum member name ().
-
-
-
- Determines whether this instance can convert the specified object type.
-
- Type of the object.
-
- true if this instance can convert the specified object type; otherwise, false.
-
-
-
-
- Gets or sets a value indicating whether the written enum text should be camel case.
-
- true if the written enum text will be camel case; otherwise, false.
-
-
-
- Specifies how constructors are used when initializing objects during deserialization by the .
-
-
-
-
- First attempt to use the public default constructor then fall back to single paramatized constructor.
-
-
-
-
- Allow Json.NET to use a non-public default constructor.
-
-
-
-
- Instructs the not to serialize the public field or public read/write property value.
-
-
-
-
- Represents a raw JSON string.
-
-
-
-
- Represents a value in JSON (string, integer, date, etc).
-
-
-
-
- Represents an abstract JSON token.
-
-
-
-
- Represents a collection of objects.
-
- The type of token
-
-
-
- Gets the with the specified key.
-
-
-
-
-
- Provides an interface to enable a class to return line and position information.
-
-
-
-
- Gets a value indicating whether the class can return line information.
-
-
- true if LineNumber and LinePosition can be provided; otherwise, false.
-
-
-
-
- Gets the current line number.
-
- The current line number or 0 if no line information is available (for example, HasLineInfo returns false).
-
-
-
- Gets the current line position.
-
- The current line position or 0 if no line information is available (for example, HasLineInfo returns false).
-
-
-
- Compares the values of two tokens, including the values of all descendant tokens.
-
- The first to compare.
- The second to compare.
- true if the tokens are equal; otherwise false.
-
-
-
- Adds the specified content immediately after this token.
-
- A content object that contains simple content or a collection of content objects to be added after this token.
-
-
-
- Adds the specified content immediately before this token.
-
- A content object that contains simple content or a collection of content objects to be added before this token.
-
-
-
- Returns a collection of the ancestor tokens of this token.
-
- A collection of the ancestor tokens of this token.
-
-
-
- Returns a collection of the sibling tokens after this token, in document order.
-
- A collection of the sibling tokens after this tokens, in document order.
-
-
-
- Returns a collection of the sibling tokens before this token, in document order.
-
- A collection of the sibling tokens before this token, in document order.
-
-
-
- Gets the with the specified key converted to the specified type.
-
- The type to convert the token to.
- The token key.
- The converted token value.
-
-
-
- Returns a collection of the child tokens of this token, in document order.
-
- An of containing the child tokens of this , in document order.
-
-
-
- Returns a collection of the child tokens of this token, in document order, filtered by the specified type.
-
- The type to filter the child tokens on.
- A containing the child tokens of this , in document order.
-
-
-
- Returns a collection of the child values of this token, in document order.
-
- The type to convert the values to.
- A containing the child values of this , in document order.
-
-
-
- Removes this token from its parent.
-
-
-
-
- Replaces this token with the specified token.
-
- The value.
-
-
-
- Writes this token to a .
-
- A into which this method will write.
- A collection of which will be used when writing the token.
-
-
-
- Returns the indented JSON for this token.
-
-
- The indented JSON for this token.
-
-
-
-
- Returns the JSON for this token using the given formatting and converters.
-
- Indicates how the output is formatted.
- A collection of which will be used when writing the token.
- The JSON for this token using the given formatting and converters.
-
-
-
- Performs an explicit conversion from to .
-
- The value.
- The result of the conversion.
-
-
-
- Performs an explicit conversion from to .
-
- The value.
- The result of the conversion.
-
-
-
- Performs an explicit conversion from to .
-
- The value.
- The result of the conversion.
-
-
-
- Performs an explicit conversion from to .
-
- The value.
- The result of the conversion.
-
-
-
- Performs an explicit conversion from to .
-
- The value.
- The result of the conversion.
-
-
-
- Performs an explicit conversion from to .
-
- The value.
- The result of the conversion.
-
-
-
- Performs an explicit conversion from to .
-
- The value.
- The result of the conversion.
-
-
-
- Performs an explicit conversion from to .
-
- The value.
- The result of the conversion.
-
-
-
- Performs an explicit conversion from to .
-
- The value.
- The result of the conversion.
-
-
-
- Performs an explicit conversion from to .
-
- The value.
- The result of the conversion.
-
-
-
- Performs an explicit conversion from to .
-
- The value.
- The result of the conversion.
-
-
-
- Performs an explicit conversion from to .
-
- The value.
- The result of the conversion.
-
-
-
- Performs an explicit conversion from to .
-
- The value.
- The result of the conversion.
-
-
-
- Performs an explicit conversion from to .
-
- The value.
- The result of the conversion.
-
-
-
- Performs an explicit conversion from to .
-
- The value.
- The result of the conversion.
-
-
-
- Performs an explicit conversion from to .
-
- The value.
- The result of the conversion.
-
-
-
- Performs an explicit conversion from to .
-
- The value.
- The result of the conversion.
-
-
-
- Performs an explicit conversion from to .
-
- The value.
- The result of the conversion.
-
-
-
- Performs an explicit conversion from to .
-
- The value.
- The result of the conversion.
-
-
-
- Performs an explicit conversion from to .
-
- The value.
- The result of the conversion.
-
-
-
- Performs an explicit conversion from to .
-
- The value.
- The result of the conversion.
-
-
-
- Performs an explicit conversion from to .
-
- The value.
- The result of the conversion.
-
-
-
- Performs an explicit conversion from to .
-
- The value.
- The result of the conversion.
-
-
-
- Performs an explicit conversion from to .
-
- The value.
- The result of the conversion.
-
-
-
- Performs an explicit conversion from to .
-
- The value.
- The result of the conversion.
-
-
-
- Performs an explicit conversion from to .
-
- The value.
- The result of the conversion.
-
-
-
- Performs an implicit conversion from to .
-
- The value to create a from.
- The initialized with the specified value.
-
-
-
- Performs an implicit conversion from to .
-
- The value to create a from.
- The initialized with the specified value.
-
-
-
- Performs an implicit conversion from to .
-
- The value to create a from.
- The initialized with the specified value.
-
-
-
- Performs an implicit conversion from to .
-
- The value to create a from.
- The initialized with the specified value.
-
-
-
- Performs an implicit conversion from to .
-
- The value to create a from.
- The initialized with the specified value.
-
-
-
- Performs an implicit conversion from to .
-
- The value to create a from.
- The initialized with the specified value.
-
-
-
- Performs an implicit conversion from to .
-
- The value to create a from.
- The initialized with the specified value.
-
-
-
- Performs an implicit conversion from to .
-
- The value to create a from.
- The initialized with the specified value.
-
-
-
- Performs an implicit conversion from to .
-
- The value to create a from.
- The initialized with the specified value.
-
-
-
- Performs an implicit conversion from to .
-
- The value to create a from.
- The initialized with the specified value.
-
-
-
- Performs an implicit conversion from to .
-
- The value to create a from.
- The initialized with the specified value.
-
-
-
- Performs an implicit conversion from to .
-
- The value to create a from.
- The initialized with the specified value.
-
-
-
- Performs an implicit conversion from to .
-
- The value to create a from.
- The initialized with the specified value.
-
-
-
- Performs an implicit conversion from to .
-
- The value to create a from.
- The initialized with the specified value.
-
-
-
- Performs an implicit conversion from to .
-
- The value to create a from.
- The initialized with the specified value.
-
-
-
- Performs an implicit conversion from to .
-
- The value to create a from.
- The initialized with the specified value.
-
-
-
- Performs an implicit conversion from to .
-
- The value to create a from.
- The initialized with the specified value.
-
-
-
- Performs an implicit conversion from to .
-
- The value to create a from.
- The initialized with the specified value.
-
-
-
- Performs an implicit conversion from to .
-
- The value to create a from.
- The initialized with the specified value.
-
-
-
- Performs an implicit conversion from to .
-
- The value to create a from.
- The initialized with the specified value.
-
-
-
- Performs an implicit conversion from to .
-
- The value to create a from.
- The initialized with the specified value.
-
-
-
- Performs an implicit conversion from to .
-
- The value to create a from.
- The initialized with the specified value.
-
-
-
- Performs an implicit conversion from to .
-
- The value to create a from.
- The initialized with the specified value.
-
-
-
- Performs an implicit conversion from to .
-
- The value to create a from.
- The initialized with the specified value.
-
-
-
- Performs an implicit conversion from to .
-
- The value to create a from.
- The initialized with the specified value.
-
-
-
- Performs an implicit conversion from to .
-
- The value to create a from.
- The initialized with the specified value.
-
-
-
- Creates an for this token.
-
- An that can be used to read this token and its descendants.
-
-
-
- Creates a from an object.
-
- The object that will be used to create .
- A with the value of the specified object
-
-
-
- Creates a from an object using the specified .
-
- The object that will be used to create .
- The that will be used when reading the object.
- A with the value of the specified object
-
-
-
- Creates the specified .NET type from the .
-
- The new object created from the JSON value.
-
-
-
- Creates the specified .NET type from the using the specified .
-
- The that will be used when creating the object.
- The new object created from the JSON value.
-
-
-
- Creates a from a .
-
- An positioned at the token to read into this .
-
- An that contains the token and its descendant tokens
- that were read from the reader. The runtime type of the token is determined
- by the token type of the first token encountered in the reader.
-
-
-
-
- Load a from a string that contains JSON.
-
- A that contains JSON.
- A populated from the string that contains JSON.
-
-
-
- Creates a from a .
-
- An positioned at the token to read into this .
-
- An that contains the token and its descendant tokens
- that were read from the reader. The runtime type of the token is determined
- by the token type of the first token encountered in the reader.
-
-
-
-
- Selects the token that matches the object path.
-
-
- The object path from the current to the
- to be returned. This must be a string of property names or array indexes separated
- by periods, such as Tables[0].DefaultView[0].Price
in C# or
- Tables(0).DefaultView(0).Price
in Visual Basic.
-
- The that matches the object path or a null reference if no matching token is found.
-
-
-
- Selects the token that matches the object path.
-
-
- The object path from the current to the
- to be returned. This must be a string of property names or array indexes separated
- by periods, such as Tables[0].DefaultView[0].Price
in C# or
- Tables(0).DefaultView(0).Price
in Visual Basic.
-
- A flag to indicate whether an error should be thrown if no token is found.
- The that matches the object path.
-
-
-
- Returns the responsible for binding operations performed on this object.
-
- The expression tree representation of the runtime value.
-
- The to bind this object.
-
-
-
-
- Returns the responsible for binding operations performed on this object.
-
- The expression tree representation of the runtime value.
-
- The to bind this object.
-
-
-
-
- Creates a new instance of the . All child tokens are recursively cloned.
-
- A new instance of the .
-
-
-
- Gets a comparer that can compare two tokens for value equality.
-
- A that can compare two nodes for value equality.
-
-
-
- Gets or sets the parent.
-
- The parent.
-
-
-
- Gets the root of this .
-
- The root of this .
-
-
-
- Gets the node type for this .
-
- The type.
-
-
-
- Gets a value indicating whether this token has childen tokens.
-
-
- true if this token has child values; otherwise, false.
-
-
-
-
- Gets the next sibling token of this node.
-
- The that contains the next sibling token.
-
-
-
- Gets the previous sibling token of this node.
-
- The that contains the previous sibling token.
-
-
-
- Gets the with the specified key.
-
- The with the specified key.
-
-
-
- Get the first child token of this token.
-
- A containing the first child token of the .
-
-
-
- Get the last child token of this token.
-
- A containing the last child token of the .
-
-
-
- Initializes a new instance of the class from another object.
-
- A object to copy from.
-
-
-
- Initializes a new instance of the class with the given value.
-
- The value.
-
-
-
- Initializes a new instance of the class with the given value.
-
- The value.
-
-
-
- Initializes a new instance of the class with the given value.
-
- The value.
-
-
-
- Initializes a new instance of the class with the given value.
-
- The value.
-
-
-
- Initializes a new instance of the class with the given value.
-
- The value.
-
-
-
- Initializes a new instance of the class with the given value.
-
- The value.
-
-
-
- Initializes a new instance of the class with the given value.
-
- The value.
-
-
-
- Initializes a new instance of the class with the given value.
-
- The value.
-
-
-
- Initializes a new instance of the class with the given value.
-
- The value.
-
-
-
- Initializes a new instance of the class with the given value.
-
- The value.
-
-
-
- Creates a comment with the given value.
-
- The value.
- A comment with the given value.
-
-
-
- Creates a string with the given value.
-
- The value.
- A string with the given value.
-
-
-
- Writes this token to a .
-
- A into which this method will write.
- A collection of which will be used when writing the token.
-
-
-
- Indicates whether the current object is equal to another object of the same type.
-
-
- true if the current object is equal to the parameter; otherwise, false.
-
- An object to compare with this object.
-
-
-
- Determines whether the specified is equal to the current .
-
- The to compare with the current .
-
- true if the specified is equal to the current ; otherwise, false.
-
-
- The parameter is null.
-
-
-
-
- Serves as a hash function for a particular type.
-
-
- A hash code for the current .
-
-
-
-
- Returns a that represents this instance.
-
-
- A that represents this instance.
-
-
-
-
- Returns a that represents this instance.
-
- The format.
-
- A that represents this instance.
-
-
-
-
- Returns a that represents this instance.
-
- The format provider.
-
- A that represents this instance.
-
-
-
-
- Returns a that represents this instance.
-
- The format.
- The format provider.
-
- A that represents this instance.
-
-
-
-
- Returns the responsible for binding operations performed on this object.
-
- The expression tree representation of the runtime value.
-
- The to bind this object.
-
-
-
-
- Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object.
-
- An object to compare with this instance.
-
- A 32-bit signed integer that indicates the relative order of the objects being compared. The return value has these meanings:
- Value
- Meaning
- Less than zero
- This instance is less than .
- Zero
- This instance is equal to .
- Greater than zero
- This instance is greater than .
-
-
- is not the same type as this instance.
-
-
-
-
- Gets a value indicating whether this token has childen tokens.
-
-
- true if this token has child values; otherwise, false.
-
-
-
-
- Gets the node type for this .
-
- The type.
-
-
-
- Gets or sets the underlying token value.
-
- The underlying token value.
-
-
-
- Initializes a new instance of the class from another object.
-
- A object to copy from.
-
-
-
- Initializes a new instance of the class.
-
- The raw json.
-
-
-
- Creates an instance of with the content of the reader's current token.
-
- The reader.
- An instance of with the content of the reader's current token.
-
-
-
- Indicating whether a property is required.
-
-
-
-
- The property is not required. The default state.
-
-
-
-
- The property must be defined in JSON but can be a null value.
-
-
-
-
- The property must be defined in JSON and cannot be a null value.
-
-
-
-
- Contract details for a used by the .
-
-
-
-
- Contract details for a used by the .
-
-
-
-
- Gets the underlying type for the contract.
-
- The underlying type for the contract.
-
-
-
- Gets or sets the type created during deserialization.
-
- The type created during deserialization.
-
-
-
- Gets or sets whether this type contract is serialized as a reference.
-
- Whether this type contract is serialized as a reference.
-
-
-
- Gets or sets the default for this contract.
-
- The converter.
-
-
-
- Gets or sets the method called immediately after deserialization of the object.
-
- The method called immediately after deserialization of the object.
-
-
-
- Gets or sets the method called during deserialization of the object.
-
- The method called during deserialization of the object.
-
-
-
- Gets or sets the method called after serialization of the object graph.
-
- The method called after serialization of the object graph.
-
-
-
- Gets or sets the method called before serialization of the object.
-
- The method called before serialization of the object.
-
-
-
- Gets or sets the default creator method used to create the object.
-
- The default creator method used to create the object.
-
-
-
- Gets or sets a value indicating whether [default creator non public].
-
- true if the default object creator is non-public; otherwise, false.
-
-
-
- Gets or sets the method called when an error is thrown during the serialization of the object.
-
- The method called when an error is thrown during the serialization of the object.
-
-
-
- Initializes a new instance of the class.
-
- The underlying type for the contract.
-
-
-
- Gets the object's properties.
-
- The object's properties.
-
-
-
- Gets or sets the property name resolver.
-
- The property name resolver.
-
-
-
- Contract details for a used by the .
-
-
-
-
- Initializes a new instance of the class.
-
- The underlying type for the contract.
-
-
-
- Gets or sets the ISerializable object constructor.
-
- The ISerializable object constructor.
-
-
-
- Contract details for a used by the .
-
-
-
-
- Initializes a new instance of the class.
-
- The underlying type for the contract.
-
-
-
- Contract details for a used by the .
-
-
-
-
- Initializes a new instance of the class.
-
- The underlying type for the contract.
-
-
-
- Get and set values for a using dynamic methods.
-
-
-
-
- Provides methods to get and set values.
-
-
-
-
- Sets the value.
-
- The target to set the value on.
- The value to set on the target.
-
-
-
- Gets the value.
-
- The target to get the value from.
- The value.
-
-
-
- Initializes a new instance of the class.
-
- The member info.
-
-
-
- Sets the value.
-
- The target to set the value on.
- The value to set on the target.
-
-
-
- Gets the value.
-
- The target to get the value from.
- The value.
-
-
-
- Provides data for the Error event.
-
-
-
-
- Initializes a new instance of the class.
-
- The current object.
- The error context.
-
-
-
- Gets the current object the error event is being raised against.
-
- The current object the error event is being raised against.
-
-
-
- Gets the error context.
-
- The error context.
-
-
-
- Represents a view of a .
-
-
-
-
- Initializes a new instance of the class.
-
- The name.
- Type of the property.
-
-
-
- When overridden in a derived class, returns whether resetting an object changes its value.
-
-
- true if resetting the component changes its value; otherwise, false.
-
- The component to test for reset capability.
-
-
-
-
- When overridden in a derived class, gets the current value of the property on a component.
-
-
- The value of a property for a given component.
-
- The component with the property for which to retrieve the value.
-
-
-
-
- When overridden in a derived class, resets the value for this property of the component to the default value.
-
- The component with the property value that is to be reset to the default value.
-
-
-
-
- When overridden in a derived class, sets the value of the component to a different value.
-
- The component with the property value that is to be set.
- The new value.
-
-
-
-
- When overridden in a derived class, determines a value indicating whether the value of this property needs to be persisted.
-
-
- true if the property should be persisted; otherwise, false.
-
- The component with the property to be examined for persistence.
-
-
-
-
- When overridden in a derived class, gets the type of the component this property is bound to.
-
-
- A that represents the type of component this property is bound to. When the or methods are invoked, the object specified might be an instance of this type.
-
-
-
-
- When overridden in a derived class, gets a value indicating whether this property is read-only.
-
-
- true if the property is read-only; otherwise, false.
-
-
-
-
- When overridden in a derived class, gets the type of the property.
-
-
- A that represents the type of the property.
-
-
-
-
- Gets the hash code for the name of the member.
-
-
-
- The hash code for the name of the member.
-
-
-
-
- Used to resolve references when serializing and deserializing JSON by the .
-
-
-
-
- Resolves a reference to its object.
-
- The serialization context.
- The reference to resolve.
- The object that
-
-
-
- Gets the reference for the sepecified object.
-
- The serialization context.
- The object to get a reference for.
- The reference to the object.
-
-
-
- Determines whether the specified object is referenced.
-
- The serialization context.
- The object to test for a reference.
-
- true if the specified object is referenced; otherwise, false.
-
-
-
-
- Adds a reference to the specified object.
-
- The serialization context.
- The reference.
- The object to reference.
-
-
-
- Specifies reference handling options for the .
-
-
-
-
- Do not preserve references when serializing types.
-
-
-
-
- Preserve references when serializing into a JSON object structure.
-
-
-
-
- Preserve references when serializing into a JSON array structure.
-
-
-
-
- Preserve references when serializing.
-
-
-
-
- Instructs the how to serialize the collection.
-
-
-
-
- Instructs the how to serialize the object.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
- Initializes a new instance of the class with the specified container Id.
-
- The container Id.
-
-
-
- Gets or sets the id.
-
- The id.
-
-
-
- Gets or sets the title.
-
- The title.
-
-
-
- Gets or sets the description.
-
- The description.
-
-
-
- Gets or sets a value that indicates whether to preserve object reference data.
-
-
- true to keep object reference; otherwise, false. The default is false.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
- Initializes a new instance of the class with a flag indicating whether the array can contain null items
-
- A flag indicating whether the array can contain null items.
-
-
-
- Initializes a new instance of the class with the specified container Id.
-
- The container Id.
-
-
-
- Gets or sets a value indicating whether null items are allowed in the collection.
-
- true if null items are allowed in the collection; otherwise, false.
-
-
-
- Specifies default value handling options for the .
-
-
-
-
- Include members where the member value is the same as the member's default value when serializing objects.
- Included members are written to JSON. Has no effect when deserializing.
-
-
-
-
- Ignore members where the member value is the same as the member's default value when serializing objects
- so that is is not written to JSON, and ignores setting members when the JSON value equals the member's default value.
-
-
-
-
- Members with a default value but no JSON will be set to their default value when deserializing.
-
-
-
-
- Ignore members where the member value is the same as the member's default value when serializing objects
- and sets members to their default value when deserializing.
-
-
-
-
- Instructs the to use the specified when serializing the member or class.
-
-
-
-
- Initializes a new instance of the class.
-
- Type of the converter.
-
-
-
- Gets the type of the converter.
-
- The type of the converter.
-
-
-
- Instructs the how to serialize the object.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
- Initializes a new instance of the class with the specified member serialization.
-
- The member serialization.
-
-
-
- Initializes a new instance of the class with the specified container Id.
-
- The container Id.
-
-
-
- Gets or sets the member serialization.
-
- The member serialization.
-
-
-
- Specifies the settings on a object.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
- Gets or sets how reference loops (e.g. a class referencing itself) is handled.
-
- Reference loop handling.
-
-
-
- Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization.
-
- Missing member handling.
-
-
-
- Gets or sets how objects are created during deserialization.
-
- The object creation handling.
-
-
-
- Gets or sets how null values are handled during serialization and deserialization.
-
- Null value handling.
-
-
-
- Gets or sets how null default are handled during serialization and deserialization.
-
- The default value handling.
-
-
-
- Gets or sets a collection that will be used during serialization.
-
- The converters.
-
-
-
- Gets or sets how object references are preserved by the serializer.
-
- The preserve references handling.
-
-
-
- Gets or sets how type name writing and reading is handled by the serializer.
-
- The type name handling.
-
-
-
- Gets or sets how a type name assembly is written and resolved by the serializer.
-
- The type name assembly format.
-
-
-
- Gets or sets how constructors are used during deserialization.
-
- The constructor handling.
-
-
-
- Gets or sets the contract resolver used by the serializer when
- serializing .NET objects to JSON and vice versa.
-
- The contract resolver.
-
-
-
- Gets or sets the used by the serializer when resolving references.
-
- The reference resolver.
-
-
-
- Gets or sets the used by the serializer when resolving type names.
-
- The binder.
-
-
-
- Gets or sets the error handler called during serialization and deserialization.
-
- The error handler called during serialization and deserialization.
-
-
-
- Gets or sets the used by the serializer when invoking serialization callback methods.
-
- The context.
-
-
-
- Represents a reader that provides validation.
-
-
-
-
- Initializes a new instance of the class that
- validates the content returned from the given .
-
- The to read from while validating.
-
-
-
- Reads the next JSON token from the stream as a .
-
-
- A or a null reference if the next JSON token is null.
-
-
-
-
- Reads the next JSON token from the stream as a .
-
- A .
-
-
-
- Reads the next JSON token from the stream as a .
-
- A .
-
-
-
- Reads the next JSON token from the stream.
-
-
- true if the next token was read successfully; false if there are no more tokens to read.
-
-
-
-
- Sets an event handler for receiving schema validation errors.
-
-
-
-
- Gets the text value of the current Json token.
-
-
-
-
-
- Gets the depth of the current token in the JSON document.
-
- The depth of the current token in the JSON document.
-
-
-
- Gets the quotation mark character used to enclose the value of a string.
-
-
-
-
-
- Gets the type of the current Json token.
-
-
-
-
-
- Gets The Common Language Runtime (CLR) type for the current Json token.
-
-
-
-
-
- Gets or sets the schema.
-
- The schema.
-
-
-
- Gets the used to construct this .
-
- The specified in the constructor.
-
-
-
- Compares tokens to determine whether they are equal.
-
-
-
-
- Determines whether the specified objects are equal.
-
- The first object of type to compare.
- The second object of type to compare.
-
- true if the specified objects are equal; otherwise, false.
-
-
-
-
- Returns a hash code for the specified object.
-
- The for which a hash code is to be returned.
- A hash code for the specified object.
- The type of is a reference type and is null.
-
-
-
- Specifies the member serialization options for the .
-
-
-
-
- All members are serialized by default. Members can be excluded using the .
-
-
-
-
- Only members must be marked with the are serialized.
-
-
-
-
- Specifies how object creation is handled by the .
-
-
-
-
- Reuse existing objects, create new objects when needed.
-
-
-
-
- Only reuse existing objects.
-
-
-
-
- Always create new objects.
-
-
-
-
- Converts a to and from the ISO 8601 date format (e.g. 2008-04-12T12:53Z).
-
-
-
-
- Writes the JSON representation of the object.
-
- The to write to.
- The value.
- The calling serializer.
-
-
-
- Reads the JSON representation of the object.
-
- The to read from.
- Type of the object.
- The existing value of object being read.
- The calling serializer.
- The object value.
-
-
-
- Gets or sets the date time styles used when converting a date to and from JSON.
-
- The date time styles used when converting a date to and from JSON.
-
-
-
- Gets or sets the date time format used when converting a date to and from JSON.
-
- The date time format used when converting a date to and from JSON.
-
-
-
- Gets or sets the culture used when converting a date to and from JSON.
-
- The culture used when converting a date to and from JSON.
-
-
-
- Converts a to and from a JavaScript date constructor (e.g. new Date(52231943)).
-
-
-
-
- Writes the JSON representation of the object.
-
- The to write to.
- The value.
- The calling serializer.
-
-
-
- Reads the JSON representation of the object.
-
- The to read from.
- Type of the object.
- The existing property value of the JSON that is being converted.
- The calling serializer.
- The object value.
-
-
-
- Specifies whether a DateTime object represents a local time, a Coordinated Universal Time (UTC), or is not specified as either local time or UTC.
-
-
-
-
- The time represented is local time.
-
-
-
-
- The time represented is UTC.
-
-
-
-
- The time represented is not specified as either local time or Coordinated Universal Time (UTC).
-
-
-
-
- Preserves the DateTimeKind field of a date when a DateTime object is converted to a string and the string is then converted back to a DateTime object.
-
-
-
-
- Converts XML to and from JSON.
-
-
-
-
- Writes the JSON representation of the object.
-
- The to write to.
- The calling serializer.
- The value.
-
-
-
- Reads the JSON representation of the object.
-
- The to read from.
- Type of the object.
- The existing value of object being read.
- The calling serializer.
- The object value.
-
-
-
- Checks if the attributeName is a namespace attribute.
-
- Attribute name to test.
- The attribute name prefix if it has one, otherwise an empty string.
- True if attribute name is for a namespace attribute, otherwise false.
-
-
-
- Determines whether this instance can convert the specified value type.
-
- Type of the value.
-
- true if this instance can convert the specified value type; otherwise, false.
-
-
-
-
- Gets or sets the name of the root element to insert when deserializing to XML if the JSON structure has produces multiple root elements.
-
- The name of the deserialize root element.
-
-
-
- Gets or sets a flag to indicate whether to write the Json.NET array attribute.
- This attribute helps preserve arrays when converting the written XML back to JSON.
-
- true if the array attibute is written to the XML; otherwise, false.
-
-
-
- Gets or sets a value indicating whether to write the root JSON object.
-
- true if the JSON root object is omitted; otherwise, false.
-
-
-
- Represents a reader that provides fast, non-cached, forward-only access to serialized Json data.
-
-
-
-
- Initializes a new instance of the class with the specified .
-
- The TextReader containing the XML data to read.
-
-
-
- Reads the next JSON token from the stream.
-
-
- true if the next token was read successfully; false if there are no more tokens to read.
-
-
-
-
- Reads the next JSON token from the stream as a .
-
-
- A or a null reference if the next JSON token is null.
-
-
-
-
- Reads the next JSON token from the stream as a .
-
- A .
-
-
-
- Reads the next JSON token from the stream as a .
-
- A .
-
-
-
- Changes the state to closed.
-
-
-
-
- Gets a value indicating whether the class can return line information.
-
-
- true if LineNumber and LinePosition can be provided; otherwise, false.
-
-
-
-
- Gets or sets the culture used when reading JSON. Defaults to .
-
-
-
-
- Gets the current line number.
-
-
- The current line number or 0 if no line information is available (for example, HasLineInfo returns false).
-
-
-
-
- Gets the current line position.
-
-
- The current line position or 0 if no line information is available (for example, HasLineInfo returns false).
-
-
-
-
- Instructs the to always serialize the member with the specified name.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
- Initializes a new instance of the class with the specified name.
-
- Name of the property.
-
-
-
- Gets or sets the null value handling used when serializing this property.
-
- The null value handling.
-
-
-
- Gets or sets the default value handling used when serializing this property.
-
- The default value handling.
-
-
-
- Gets or sets the reference loop handling used when serializing this property.
-
- The reference loop handling.
-
-
-
- Gets or sets the object creation handling used when deserializing this property.
-
- The object creation handling.
-
-
-
- Gets or sets the type name handling used when serializing this property.
-
- The type name handling.
-
-
-
- Gets or sets whether this property's value is serialized as a reference.
-
- Whether this property's value is serialized as a reference.
-
-
-
- Gets or sets the order of serialization and deserialization of a member.
-
- The numeric order of serialization or deserialization.
-
-
-
- Gets or sets the name of the property.
-
- The name of the property.
-
-
-
- Gets or sets a value indicating whether this property is required.
-
-
- A value indicating whether this property is required.
-
-
-
-
- Instructs the not to serialize the public field or public read/write property value.
-
-
-
-
- Represents a writer that provides a fast, non-cached, forward-only way of generating Json data.
-
-
-
-
- Creates an instance of the JsonWriter class using the specified .
-
- The TextWriter to write to.
-
-
-
- Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream.
-
-
-
-
- Closes this stream and the underlying stream.
-
-
-
-
- Writes the beginning of a Json object.
-
-
-
-
- Writes the beginning of a Json array.
-
-
-
-
- Writes the start of a constructor with the given name.
-
- The name of the constructor.
-
-
-
- Writes the specified end token.
-
- The end token to write.
-
-
-
- Writes the property name of a name/value pair on a Json object.
-
- The name of the property.
-
-
-
- Writes indent characters.
-
-
-
-
- Writes the JSON value delimiter.
-
-
-
-
- Writes an indent space.
-
-
-
-
- Writes a null value.
-
-
-
-
- Writes an undefined value.
-
-
-
-
- Writes raw JSON.
-
- The raw JSON to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes out a comment /*...*/
containing the specified text.
-
- Text to place inside the comment.
-
-
-
- Writes out the given white space.
-
- The string of white space characters.
-
-
-
- Gets or sets how many IndentChars to write for each level in the hierarchy when is set to Formatting.Indented.
-
-
-
-
- Gets or sets which character to use to quote attribute values.
-
-
-
-
- Gets or sets which character to use for indenting when is set to Formatting.Indented.
-
-
-
-
- Gets or sets a value indicating whether object names will be surrounded with quotes.
-
-
-
-
- The exception thrown when an error occurs while reading Json text.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
- Initializes a new instance of the class
- with a specified error message.
-
- The error message that explains the reason for the exception.
-
-
-
- Initializes a new instance of the class
- with a specified error message and a reference to the inner exception that is the cause of this exception.
-
- The error message that explains the reason for the exception.
- The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified.
-
-
-
- Initializes a new instance of the class.
-
- The that holds the serialized object data about the exception being thrown.
- The that contains contextual information about the source or destination.
- The parameter is null.
- The class name is null or is zero (0).
-
-
-
- The exception thrown when an error occurs while reading Json text.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
- Initializes a new instance of the class
- with a specified error message.
-
- The error message that explains the reason for the exception.
-
-
-
- Initializes a new instance of the class
- with a specified error message and a reference to the inner exception that is the cause of this exception.
-
- The error message that explains the reason for the exception.
- The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified.
-
-
-
- Initializes a new instance of the class.
-
- The that holds the serialized object data about the exception being thrown.
- The that contains contextual information about the source or destination.
- The parameter is null.
- The class name is null or is zero (0).
-
-
-
- Gets the line number indicating where the error occurred.
-
- The line number indicating where the error occurred.
-
-
-
- Gets the line position indicating where the error occurred.
-
- The line position indicating where the error occurred.
-
-
-
- Represents a collection of .
-
-
-
-
- Provides methods for converting between common language runtime types and JSON types.
-
-
-
-
- Represents JavaScript's boolean value true as a string. This field is read-only.
-
-
-
-
- Represents JavaScript's boolean value false as a string. This field is read-only.
-
-
-
-
- Represents JavaScript's null as a string. This field is read-only.
-
-
-
-
- Represents JavaScript's undefined as a string. This field is read-only.
-
-
-
-
- Represents JavaScript's positive infinity as a string. This field is read-only.
-
-
-
-
- Represents JavaScript's negative infinity as a string. This field is read-only.
-
-
-
-
- Represents JavaScript's NaN as a string. This field is read-only.
-
-
-
-
- Converts the to its JSON string representation.
-
- The value to convert.
- A JSON string representation of the .
-
-
-
- Converts the to its JSON string representation.
-
- The value to convert.
- A JSON string representation of the .
-
-
-
- Converts the to its JSON string representation.
-
- The value to convert.
- A JSON string representation of the .
-
-
-
- Converts the to its JSON string representation.
-
- The value to convert.
- A JSON string representation of the .
-
-
-
- Converts the to its JSON string representation.
-
- The value to convert.
- A JSON string representation of the .
-
-
-
- Converts the to its JSON string representation.
-
- The value to convert.
- A JSON string representation of the .
-
-
-
- Converts the to its JSON string representation.
-
- The value to convert.
- A JSON string representation of the .
-
-
-
- Converts the to its JSON string representation.
-
- The value to convert.
- A JSON string representation of the .
-
-
-
- Converts the to its JSON string representation.
-
- The value to convert.
- A JSON string representation of the .
-
-
-
- Converts the to its JSON string representation.
-
- The value to convert.
- A JSON string representation of the .
-
-
-
- Converts the to its JSON string representation.
-
- The value to convert.
- A JSON string representation of the .
-
-
-
- Converts the to its JSON string representation.
-
- The value to convert.
- A JSON string representation of the .
-
-
-
- Converts the to its JSON string representation.
-
- The value to convert.
- A JSON string representation of the .
-
-
-
- Converts the to its JSON string representation.
-
- The value to convert.
- A JSON string representation of the .
-
-
-
- Converts the to its JSON string representation.
-
- The value to convert.
- A JSON string representation of the .
-
-
-
- Converts the to its JSON string representation.
-
- The value to convert.
- A JSON string representation of the .
-
-
-
- Converts the to its JSON string representation.
-
- The value to convert.
- A JSON string representation of the .
-
-
-
- Converts the to its JSON string representation.
-
- The value to convert.
- A JSON string representation of the .
-
-
-
- Converts the to its JSON string representation.
-
- The value to convert.
- A JSON string representation of the .
-
-
-
- Converts the to its JSON string representation.
-
- The value to convert.
- A JSON string representation of the .
-
-
-
- Converts the to its JSON string representation.
-
- The value to convert.
- The string delimiter character.
- A JSON string representation of the .
-
-
-
- Converts the to its JSON string representation.
-
- The value to convert.
- A JSON string representation of the .
-
-
-
- Serializes the specified object to a JSON string.
-
- The object to serialize.
- A JSON string representation of the object.
-
-
-
- Serializes the specified object to a JSON string.
-
- The object to serialize.
- Indicates how the output is formatted.
-
- A JSON string representation of the object.
-
-
-
-
- Serializes the specified object to a JSON string using a collection of .
-
- The object to serialize.
- A collection converters used while serializing.
- A JSON string representation of the object.
-
-
-
- Serializes the specified object to a JSON string using a collection of .
-
- The object to serialize.
- Indicates how the output is formatted.
- A collection converters used while serializing.
- A JSON string representation of the object.
-
-
-
- Serializes the specified object to a JSON string using a collection of .
-
- The object to serialize.
- Indicates how the output is formatted.
- The used to serialize the object.
- If this is null, default serialization settings will be is used.
-
- A JSON string representation of the object.
-
-
-
-
- Deserializes the JSON to a .NET object.
-
- The JSON to deserialize.
- The deserialized object from the Json string.
-
-
-
- Deserializes the JSON to a .NET object.
-
- The JSON to deserialize.
-
- The used to deserialize the object.
- If this is null, default serialization settings will be is used.
-
- The deserialized object from the JSON string.
-
-
-
- Deserializes the JSON to the specified .NET type.
-
- The JSON to deserialize.
- The of object being deserialized.
- The deserialized object from the Json string.
-
-
-
- Deserializes the JSON to the specified .NET type.
-
- The type of the object to deserialize to.
- The JSON to deserialize.
- The deserialized object from the Json string.
-
-
-
- Deserializes the JSON to the given anonymous type.
-
-
- The anonymous type to deserialize to. This can't be specified
- traditionally and must be infered from the anonymous type passed
- as a parameter.
-
- The JSON to deserialize.
- The anonymous type object.
- The deserialized anonymous type from the JSON string.
-
-
-
- Deserializes the JSON to the specified .NET type.
-
- The type of the object to deserialize to.
- The JSON to deserialize.
- Converters to use while deserializing.
- The deserialized object from the JSON string.
-
-
-
- Deserializes the JSON to the specified .NET type.
-
- The type of the object to deserialize to.
- The object to deserialize.
-
- The used to deserialize the object.
- If this is null, default serialization settings will be is used.
-
- The deserialized object from the JSON string.
-
-
-
- Deserializes the JSON to the specified .NET type.
-
- The JSON to deserialize.
- The type of the object to deserialize.
- Converters to use while deserializing.
- The deserialized object from the JSON string.
-
-
-
- Deserializes the JSON to the specified .NET type.
-
- The JSON to deserialize.
- The type of the object to deserialize to.
-
- The used to deserialize the object.
- If this is null, default serialization settings will be is used.
-
- The deserialized object from the JSON string.
-
-
-
- Populates the object with values from the JSON string.
-
- The JSON to populate values from.
- The target object to populate values onto.
-
-
-
- Populates the object with values from the JSON string.
-
- The JSON to populate values from.
- The target object to populate values onto.
-
- The used to deserialize the object.
- If this is null, default serialization settings will be is used.
-
-
-
-
- Serializes the XML node to a JSON string.
-
- The node to serialize.
- A JSON string of the XmlNode.
-
-
-
- Serializes the XML node to a JSON string.
-
- The node to serialize.
- Indicates how the output is formatted.
- A JSON string of the XmlNode.
-
-
-
- Serializes the XML node to a JSON string.
-
- The node to serialize.
- Indicates how the output is formatted.
- Omits writing the root object.
- A JSON string of the XmlNode.
-
-
-
- Deserializes the XmlNode from a JSON string.
-
- The JSON string.
- The deserialized XmlNode
-
-
-
- Deserializes the XmlNode from a JSON string nested in a root elment.
-
- The JSON string.
- The name of the root element to append when deserializing.
- The deserialized XmlNode
-
-
-
- Deserializes the XmlNode from a JSON string nested in a root elment.
-
- The JSON string.
- The name of the root element to append when deserializing.
-
- A flag to indicate whether to write the Json.NET array attribute.
- This attribute helps preserve arrays when converting the written XML back to JSON.
-
- The deserialized XmlNode
-
-
-
- Serializes the to a JSON string.
-
- The node to convert to JSON.
- A JSON string of the XNode.
-
-
-
- Serializes the to a JSON string.
-
- The node to convert to JSON.
- Indicates how the output is formatted.
- A JSON string of the XNode.
-
-
-
- Serializes the to a JSON string.
-
- The node to serialize.
- Indicates how the output is formatted.
- Omits writing the root object.
- A JSON string of the XNode.
-
-
-
- Deserializes the from a JSON string.
-
- The JSON string.
- The deserialized XNode
-
-
-
- Deserializes the from a JSON string nested in a root elment.
-
- The JSON string.
- The name of the root element to append when deserializing.
- The deserialized XNode
-
-
-
- Deserializes the from a JSON string nested in a root elment.
-
- The JSON string.
- The name of the root element to append when deserializing.
-
- A flag to indicate whether to write the Json.NET array attribute.
- This attribute helps preserve arrays when converting the written XML back to JSON.
-
- The deserialized XNode
-
-
-
- The exception thrown when an error occurs during Json serialization or deserialization.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
- Initializes a new instance of the class
- with a specified error message.
-
- The error message that explains the reason for the exception.
-
-
-
- Initializes a new instance of the class
- with a specified error message and a reference to the inner exception that is the cause of this exception.
-
- The error message that explains the reason for the exception.
- The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified.
-
-
-
- Initializes a new instance of the class.
-
- The that holds the serialized object data about the exception being thrown.
- The that contains contextual information about the source or destination.
- The parameter is null.
- The class name is null or is zero (0).
-
-
-
- Serializes and deserializes objects into and from the JSON format.
- The enables you to control how objects are encoded into JSON.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
- Creates a new instance using the specified .
-
- The settings to be applied to the .
- A new instance using the specified .
-
-
-
- Populates the JSON values onto the target object.
-
- The that contains the JSON structure to reader values from.
- The target object to populate values onto.
-
-
-
- Populates the JSON values onto the target object.
-
- The that contains the JSON structure to reader values from.
- The target object to populate values onto.
-
-
-
- Deserializes the Json structure contained by the specified .
-
- The that contains the JSON structure to deserialize.
- The being deserialized.
-
-
-
- Deserializes the Json structure contained by the specified
- into an instance of the specified type.
-
- The containing the object.
- The of object being deserialized.
- The instance of being deserialized.
-
-
-
- Deserializes the Json structure contained by the specified
- into an instance of the specified type.
-
- The containing the object.
- The type of the object to deserialize.
- The instance of being deserialized.
-
-
-
- Deserializes the Json structure contained by the specified
- into an instance of the specified type.
-
- The containing the object.
- The of object being deserialized.
- The instance of being deserialized.
-
-
-
- Serializes the specified and writes the Json structure
- to a Stream using the specified .
-
- The used to write the Json structure.
- The to serialize.
-
-
-
- Serializes the specified and writes the Json structure
- to a Stream using the specified .
-
- The used to write the Json structure.
- The to serialize.
-
-
-
- Occurs when the errors during serialization and deserialization.
-
-
-
-
- Gets or sets the used by the serializer when resolving references.
-
-
-
-
- Gets or sets the used by the serializer when resolving type names.
-
-
-
-
- Gets or sets how type name writing and reading is handled by the serializer.
-
-
-
-
- Gets or sets how a type name assembly is written and resolved by the serializer.
-
- The type name assembly format.
-
-
-
- Gets or sets how object references are preserved by the serializer.
-
-
-
-
- Get or set how reference loops (e.g. a class referencing itself) is handled.
-
-
-
-
- Get or set how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization.
-
-
-
-
- Get or set how null values are handled during serialization and deserialization.
-
-
-
-
- Get or set how null default are handled during serialization and deserialization.
-
-
-
-
- Gets or sets how objects are created during deserialization.
-
- The object creation handling.
-
-
-
- Gets or sets how constructors are used during deserialization.
-
- The constructor handling.
-
-
-
- Gets a collection that will be used during serialization.
-
- Collection that will be used during serialization.
-
-
-
- Gets or sets the contract resolver used by the serializer when
- serializing .NET objects to JSON and vice versa.
-
-
-
-
- Gets or sets the used by the serializer when invoking serialization callback methods.
-
- The context.
-
-
-
- Contains the LINQ to JSON extension methods.
-
-
-
-
- Returns a collection of tokens that contains the ancestors of every token in the source collection.
-
- The type of the objects in source, constrained to .
- An of that contains the source collection.
- An of that contains the ancestors of every node in the source collection.
-
-
-
- Returns a collection of tokens that contains the descendants of every token in the source collection.
-
- The type of the objects in source, constrained to .
- An of that contains the source collection.
- An of that contains the descendants of every node in the source collection.
-
-
-
- Returns a collection of child properties of every object in the source collection.
-
- An of that contains the source collection.
- An of that contains the properties of every object in the source collection.
-
-
-
- Returns a collection of child values of every object in the source collection with the given key.
-
- An of that contains the source collection.
- The token key.
- An of that contains the values of every node in the source collection with the given key.
-
-
-
- Returns a collection of child values of every object in the source collection.
-
- An of that contains the source collection.
- An of that contains the values of every node in the source collection.
-
-
-
- Returns a collection of converted child values of every object in the source collection with the given key.
-
- The type to convert the values to.
- An of that contains the source collection.
- The token key.
- An that contains the converted values of every node in the source collection with the given key.
-
-
-
- Returns a collection of converted child values of every object in the source collection.
-
- The type to convert the values to.
- An of that contains the source collection.
- An that contains the converted values of every node in the source collection.
-
-
-
- Converts the value.
-
- The type to convert the value to.
- A cast as a of .
- A converted value.
-
-
-
- Converts the value.
-
- The source collection type.
- The type to convert the value to.
- A cast as a of .
- A converted value.
-
-
-
- Returns a collection of child tokens of every array in the source collection.
-
- The source collection type.
- An of that contains the source collection.
- An of that contains the values of every node in the source collection.
-
-
-
- Returns a collection of converted child tokens of every array in the source collection.
-
- An of that contains the source collection.
- The type to convert the values to.
- The source collection type.
- An that contains the converted values of every node in the source collection.
-
-
-
- Returns the input typed as .
-
- An of that contains the source collection.
- The input typed as .
-
-
-
- Returns the input typed as .
-
- The source collection type.
- An of that contains the source collection.
- The input typed as .
-
-
-
- Represents a JSON constructor.
-
-
-
-
- Represents a token that can contain other tokens.
-
-
-
-
- Raises the event.
-
- The instance containing the event data.
-
-
-
- Raises the event.
-
- The instance containing the event data.
-
-
-
- Raises the event.
-
- The instance containing the event data.
-
-
-
- Returns a collection of the child tokens of this token, in document order.
-
-
- An of containing the child tokens of this , in document order.
-
-
-
-
- Returns a collection of the child values of this token, in document order.
-
- The type to convert the values to.
-
- A containing the child values of this , in document order.
-
-
-
-
- Returns a collection of the descendant tokens for this token in document order.
-
- An containing the descendant tokens of the .
-
-
-
- Adds the specified content as children of this .
-
- The content to be added.
-
-
-
- Adds the specified content as the first children of this .
-
- The content to be added.
-
-
-
- Creates an that can be used to add tokens to the .
-
- An that is ready to have content written to it.
-
-
-
- Replaces the children nodes of this token with the specified content.
-
- The content.
-
-
-
- Removes the child nodes from this token.
-
-
-
-
- Occurs when the list changes or an item in the list changes.
-
-
-
-
- Occurs before an item is added to the collection.
-
-
-
-
- Occurs when the items list of the collection has changed, or the collection is reset.
-
-
-
-
- Gets the container's children tokens.
-
- The container's children tokens.
-
-
-
- Gets a value indicating whether this token has childen tokens.
-
-
- true if this token has child values; otherwise, false.
-
-
-
-
- Get the first child token of this token.
-
-
- A containing the first child token of the .
-
-
-
-
- Get the last child token of this token.
-
-
- A containing the last child token of the .
-
-
-
-
- Gets the count of child JSON tokens.
-
- The count of child JSON tokens
-
-
-
- Initializes a new instance of the class.
-
-
-
-
- Initializes a new instance of the class from another object.
-
- A object to copy from.
-
-
-
- Initializes a new instance of the class with the specified name and content.
-
- The constructor name.
- The contents of the constructor.
-
-
-
- Initializes a new instance of the class with the specified name and content.
-
- The constructor name.
- The contents of the constructor.
-
-
-
- Initializes a new instance of the class with the specified name.
-
- The constructor name.
-
-
-
- Writes this token to a .
-
- A into which this method will write.
- A collection of which will be used when writing the token.
-
-
-
- Loads an from a .
-
- A that will be read for the content of the .
- A that contains the JSON that was read from the specified .
-
-
-
- Gets the container's children tokens.
-
- The container's children tokens.
-
-
-
- Gets or sets the name of this constructor.
-
- The constructor name.
-
-
-
- Gets the node type for this .
-
- The type.
-
-
-
- Gets the with the specified key.
-
- The with the specified key.
-
-
-
- Represents a collection of objects.
-
- The type of token
-
-
-
- An empty collection of objects.
-
-
-
-
- Initializes a new instance of the struct.
-
- The enumerable.
-
-
-
- Returns an enumerator that iterates through the collection.
-
-
- A that can be used to iterate through the collection.
-
-
-
-
- Returns an enumerator that iterates through a collection.
-
-
- An object that can be used to iterate through the collection.
-
-
-
-
- Determines whether the specified is equal to this instance.
-
- The to compare with this instance.
-
- true if the specified is equal to this instance; otherwise, false.
-
-
-
-
- Returns a hash code for this instance.
-
-
- A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table.
-
-
-
-
- Gets the with the specified key.
-
-
-
-
-
- Represents a JSON object.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
- Initializes a new instance of the class from another object.
-
- A object to copy from.
-
-
-
- Initializes a new instance of the class with the specified content.
-
- The contents of the object.
-
-
-
- Initializes a new instance of the class with the specified content.
-
- The contents of the object.
-
-
-
- Gets an of this object's properties.
-
- An of this object's properties.
-
-
-
- Gets a the specified name.
-
- The property name.
- A with the specified name or null.
-
-
-
- Gets an of this object's property values.
-
- An of this object's property values.
-
-
-
- Loads an from a .
-
- A that will be read for the content of the .
- A that contains the JSON that was read from the specified .
-
-
-
- Load a from a string that contains JSON.
-
- A that contains JSON.
- A populated from the string that contains JSON.
-
-
-
- Creates a from an object.
-
- The object that will be used to create .
- A with the values of the specified object
-
-
-
- Creates a from an object.
-
- The object that will be used to create .
- The that will be used to read the object.
- A with the values of the specified object
-
-
-
- Writes this token to a .
-
- A into which this method will write.
- A collection of which will be used when writing the token.
-
-
-
- Adds the specified property name.
-
- Name of the property.
- The value.
-
-
-
- Removes the property with the specified name.
-
- Name of the property.
- true if item was successfully removed; otherwise, false.
-
-
-
- Tries the get value.
-
- Name of the property.
- The value.
- true if a value was successfully retrieved; otherwise, false.
-
-
-
- Returns an enumerator that iterates through the collection.
-
-
- A that can be used to iterate through the collection.
-
-
-
-
- Raises the event with the provided arguments.
-
- Name of the property.
-
-
-
- Raises the event with the provided arguments.
-
- Name of the property.
-
-
-
- Returns the properties for this instance of a component.
-
-
- A that represents the properties for this component instance.
-
-
-
-
- Returns the properties for this instance of a component using the attribute array as a filter.
-
- An array of type that is used as a filter.
-
- A that represents the filtered properties for this component instance.
-
-
-
-
- Returns a collection of custom attributes for this instance of a component.
-
-
- An containing the attributes for this object.
-
-
-
-
- Returns the class name of this instance of a component.
-
-
- The class name of the object, or null if the class does not have a name.
-
-
-
-
- Returns the name of this instance of a component.
-
-
- The name of the object, or null if the object does not have a name.
-
-
-
-
- Returns a type converter for this instance of a component.
-
-
- A that is the converter for this object, or null if there is no for this object.
-
-
-
-
- Returns the default event for this instance of a component.
-
-
- An that represents the default event for this object, or null if this object does not have events.
-
-
-
-
- Returns the default property for this instance of a component.
-
-
- A that represents the default property for this object, or null if this object does not have properties.
-
-
-
-
- Returns an editor of the specified type for this instance of a component.
-
- A that represents the editor for this object.
-
- An of the specified type that is the editor for this object, or null if the editor cannot be found.
-
-
-
-
- Returns the events for this instance of a component using the specified attribute array as a filter.
-
- An array of type that is used as a filter.
-
- An that represents the filtered events for this component instance.
-
-
-
-
- Returns the events for this instance of a component.
-
-
- An that represents the events for this component instance.
-
-
-
-
- Returns an object that contains the property described by the specified property descriptor.
-
- A that represents the property whose owner is to be found.
-
- An that represents the owner of the specified property.
-
-
-
-
- Returns the responsible for binding operations performed on this object.
-
- The expression tree representation of the runtime value.
-
- The to bind this object.
-
-
-
-
- Gets the container's children tokens.
-
- The container's children tokens.
-
-
-
- Occurs when a property value changes.
-
-
-
-
- Occurs when a property value is changing.
-
-
-
-
- Gets the node type for this .
-
- The type.
-
-
-
- Gets the with the specified key.
-
- The with the specified key.
-
-
-
- Gets or sets the with the specified property name.
-
-
-
-
-
- Represents a JSON array.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
- Initializes a new instance of the class from another object.
-
- A object to copy from.
-
-
-
- Initializes a new instance of the class with the specified content.
-
- The contents of the array.
-
-
-
- Initializes a new instance of the class with the specified content.
-
- The contents of the array.
-
-
-
- Loads an from a .
-
- A that will be read for the content of the .
- A that contains the JSON that was read from the specified .
-
-
-
- Load a from a string that contains JSON.
-
- A that contains JSON.
- A populated from the string that contains JSON.
-
-
-
- Creates a from an object.
-
- The object that will be used to create .
- A with the values of the specified object
-
-
-
- Creates a from an object.
-
- The object that will be used to create .
- The that will be used to read the object.
- A with the values of the specified object
-
-
-
- Writes this token to a .
-
- A into which this method will write.
- A collection of which will be used when writing the token.
-
-
-
- Determines the index of a specific item in the .
-
- The object to locate in the .
-
- The index of if found in the list; otherwise, -1.
-
-
-
-
- Inserts an item to the at the specified index.
-
- The zero-based index at which should be inserted.
- The object to insert into the .
-
- is not a valid index in the .
- The is read-only.
-
-
-
- Removes the item at the specified index.
-
- The zero-based index of the item to remove.
-
- is not a valid index in the .
- The is read-only.
-
-
-
- Adds an item to the .
-
- The object to add to the .
- The is read-only.
-
-
-
- Removes all items from the .
-
- The is read-only.
-
-
-
- Determines whether the contains a specific value.
-
- The object to locate in the .
-
- true if is found in the ; otherwise, false.
-
-
-
-
- Removes the first occurrence of a specific object from the .
-
- The object to remove from the .
-
- true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original .
-
- The is read-only.
-
-
-
- Gets the container's children tokens.
-
- The container's children tokens.
-
-
-
- Gets the node type for this .
-
- The type.
-
-
-
- Gets the with the specified key.
-
- The with the specified key.
-
-
-
- Gets or sets the at the specified index.
-
-
-
-
-
- Represents a reader that provides fast, non-cached, forward-only access to serialized Json data.
-
-
-
-
- Initializes a new instance of the class.
-
- The token to read from.
-
-
-
- Reads the next JSON token from the stream as a .
-
-
- A or a null reference if the next JSON token is null.
-
-
-
-
- Reads the next JSON token from the stream as a .
-
- A .
-
-
-
- Reads the next JSON token from the stream as a .
-
- A .
-
-
-
- Reads the next JSON token from the stream.
-
-
- true if the next token was read successfully; false if there are no more tokens to read.
-
-
-
-
- Represents a writer that provides a fast, non-cached, forward-only way of generating Json data.
-
-
-
-
- Initializes a new instance of the class writing to the given .
-
- The container being written to.
-
-
-
- Initializes a new instance of the class.
-
-
-
-
- Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream.
-
-
-
-
- Closes this stream and the underlying stream.
-
-
-
-
- Writes the beginning of a Json object.
-
-
-
-
- Writes the beginning of a Json array.
-
-
-
-
- Writes the start of a constructor with the given name.
-
- The name of the constructor.
-
-
-
- Writes the end.
-
- The token.
-
-
-
- Writes the property name of a name/value pair on a Json object.
-
- The name of the property.
-
-
-
- Writes a null value.
-
-
-
-
- Writes an undefined value.
-
-
-
-
- Writes raw JSON.
-
- The raw JSON to write.
-
-
-
- Writes out a comment /*...*/
containing the specified text.
-
- Text to place inside the comment.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Writes a value.
-
- The value to write.
-
-
-
- Gets the token being writen.
-
- The token being writen.
-
-
-
- Represents a JSON property.
-
-
-
-
- Initializes a new instance of the class from another object.
-
- A object to copy from.
-
-
-
- Initializes a new instance of the class.
-
- The property name.
- The property content.
-
-
-
- Initializes a new instance of the class.
-
- The property name.
- The property content.
-
-
-
- Writes this token to a .
-
- A into which this method will write.
- A collection of which will be used when writing the token.
-
-
-
- Loads an from a .
-
- A that will be read for the content of the .
- A that contains the JSON that was read from the specified .
-
-
-
- Gets the container's children tokens.
-
- The container's children tokens.
-
-
-
- Gets the property name.
-
- The property name.
-
-
-
- Gets or sets the property value.
-
- The property value.
-
-
-
- Gets the node type for this .
-
- The type.
-
-
-
- Specifies the type of token.
-
-
-
-
- No token type has been set.
-
-
-
-
- A JSON object.
-
-
-
-
- A JSON array.
-
-
-
-
- A JSON constructor.
-
-
-
-
- A JSON object property.
-
-
-
-
- A comment.
-
-
-
-
- An integer value.
-
-
-
-
- A float value.
-
-
-
-
- A string value.
-
-
-
-
- A boolean value.
-
-
-
-
- A null value.
-
-
-
-
- An undefined value.
-
-
-
-
- A date value.
-
-
-
-
- A raw JSON value.
-
-
-
-
- A collection of bytes value.
-
-
-
-
- A Guid value.
-
-
-
-
- A Uri value.
-
-
-
-
- A TimeSpan value.
-
-
-
-
- Contains the JSON schema extension methods.
-
-
-
-
- Determines whether the is valid.
-
- The source to test.
- The schema to test with.
-
- true if the specified is valid; otherwise, false.
-
-
-
-
- Validates the specified .
-
- The source to test.
- The schema to test with.
-
-
-
- Validates the specified .
-
- The source to test.
- The schema to test with.
- The validation event handler.
-
-
-
- Returns detailed information about the schema exception.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
- Initializes a new instance of the class
- with a specified error message.
-
- The error message that explains the reason for the exception.
-
-
-
- Initializes a new instance of the class
- with a specified error message and a reference to the inner exception that is the cause of this exception.
-
- The error message that explains the reason for the exception.
- The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified.
-
-
-
- Initializes a new instance of the class.
-
- The that holds the serialized object data about the exception being thrown.
- The that contains contextual information about the source or destination.
- The parameter is null.
- The class name is null or is zero (0).
-
-
-
- Gets the line number indicating where the error occurred.
-
- The line number indicating where the error occurred.
-
-
-
- Gets the line position indicating where the error occurred.
-
- The line position indicating where the error occurred.
-
-
-
- Resolves from an id.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
- Gets a for the specified id.
-
- The id.
- A for the specified id.
-
-
-
- Gets or sets the loaded schemas.
-
- The loaded schemas.
-
-
-
- Specifies undefined schema Id handling options for the .
-
-
-
-
- Do not infer a schema Id.
-
-
-
-
- Use the .NET type name as the schema Id.
-
-
-
-
- Use the assembly qualified .NET type name as the schema Id.
-
-
-
-
- Returns detailed information related to the .
-
-
-
-
- Gets the associated with the validation event.
-
- The JsonSchemaException associated with the validation event.
-
-
-
- Gets the text description corresponding to the validation event.
-
- The text description.
-
-
-
- Represents the callback method that will handle JSON schema validation events and the .
-
-
-
-
- Resolves member mappings for a type, camel casing property names.
-
-
-
-
- Used by to resolves a for a given .
-
-
-
-
- Used by to resolves a for a given .
-
-
-
-
- Resolves the contract for a given type.
-
- The type to resolve a contract for.
- The contract for a given type.
-
-
-
- Initializes a new instance of the class.
-
-
-
-
- Initializes a new instance of the class.
-
-
- If set to true the will use a cached shared with other resolvers of the same type.
- Sharing the cache will significantly performance because expensive reflection will only happen once but could cause unexpected
- behavior if different instances of the resolver are suppose to produce different results. When set to false it is highly
- recommended to reuse instances with the .
-
-
-
-
- Resolves the contract for a given type.
-
- The type to resolve a contract for.
- The contract for a given type.
-
-
-
- Gets the serializable members for the type.
-
- The type to get serializable members for.
- The serializable members for the type.
-
-
-
- Creates a for the given type.
-
- Type of the object.
- A for the given type.
-
-
-
- Creates the constructor parameters.
-
- The constructor to create properties for.
- The type's member properties.
- Properties for the given .
-
-
-
- Creates a for the given .
-
- The matching member property.
- The constructor parameter.
- A created for the given .
-
-
-
- Resolves the default for the contract.
-
- Type of the object.
-
-
-
-
- Creates a for the given type.
-
- Type of the object.
- A for the given type.
-
-
-
- Creates a for the given type.
-
- Type of the object.
- A for the given type.
-
-
-
- Creates a for the given type.
-
- Type of the object.
- A for the given type.
-
-
-
- Creates a for the given type.
-
- Type of the object.
- A for the given type.
-
-
-
- Creates a for the given type.
-
- Type of the object.
- A for the given type.
-
-
-
- Creates a for the given type.
-
- Type of the object.
- A for the given type.
-
-
-
- Creates a for the given type.
-
- Type of the object.
- A for the given type.
-
-
-
- Determines which contract type is created for the given type.
-
- Type of the object.
- A for the given type.
-
-
-
- Creates properties for the given .
-
- The type to create properties for.
- /// The member serialization mode for the type.
- Properties for the given .
-
-
-
- Creates the used by the serializer to get and set values from a member.
-
- The member.
- The used by the serializer to get and set values from a member.
-
-
-
- Creates a for the given .
-
- The member's parent .
- The member to create a for.
- A created for the given .
-
-
-
- Resolves the name of the property.
-
- Name of the property.
- Name of the property.
-
-
-
- Gets a value indicating whether members are being get and set using dynamic code generation.
- This value is determined by the runtime permissions available.
-
-
- true if using dynamic code generation; otherwise, false.
-
-
-
-
- Gets or sets the default members search flags.
-
- The default members search flags.
-
-
-
- Gets or sets a value indicating whether compiler generated members should be serialized.
-
-
- true if serialized compiler generated members; otherwise, false.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
- Resolves the name of the property.
-
- Name of the property.
- The property name camel cased.
-
-
-
- The default serialization binder used when resolving and loading classes from type names.
-
-
-
-
- When overridden in a derived class, controls the binding of a serialized object to a type.
-
- Specifies the name of the serialized object.
- Specifies the name of the serialized object.
-
- The type of the object the formatter creates a new instance of.
-
-
-
-
- When overridden in a derived class, controls the binding of a serialized object to a type.
-
- The type of the object the formatter creates a new instance of.
- Specifies the name of the serialized object.
- Specifies the name of the serialized object.
-
-
-
- Provides information surrounding an error.
-
-
-
-
- Gets or sets the error.
-
- The error.
-
-
-
- Gets the original object that caused the error.
-
- The original object that caused the error.
-
-
-
- Gets the member that caused the error.
-
- The member that caused the error.
-
-
-
- Gets or sets a value indicating whether this is handled.
-
- true if handled; otherwise, false.
-
-
-
- Contract details for a used by the .
-
-
-
-
- Initializes a new instance of the class.
-
- The underlying type for the contract.
-
-
-
- Contract details for a used by the .
-
-
-
-
- Initializes a new instance of the class.
-
- The underlying type for the contract.
-
-
-
- Gets or sets the property name resolver.
-
- The property name resolver.
-
-
-
- Maps a JSON property to a .NET member or constructor parameter.
-
-
-
-
- Returns a that represents this instance.
-
-
- A that represents this instance.
-
-
-
-
- Gets or sets the name of the property.
-
- The name of the property.
-
-
-
- Gets or sets the order of serialization and deserialization of a member.
-
- The numeric order of serialization or deserialization.
-
-
-
- Gets or sets the name of the underlying member or parameter.
-
- The name of the underlying member or parameter.
-
-
-
- Gets the that will get and set the during serialization.
-
- The that will get and set the during serialization.
-
-
-
- Gets or sets the type of the property.
-
- The type of the property.
-
-
-
- Gets or sets the for the property.
- If set this converter takes presidence over the contract converter for the property type.
-
- The converter.
-
-
-
- Gets the member converter.
-
- The member converter.
-
-
-
- Gets a value indicating whether this is ignored.
-
- true if ignored; otherwise, false.
-
-
-
- Gets a value indicating whether this is readable.
-
- true if readable; otherwise, false.
-
-
-
- Gets a value indicating whether this is writable.
-
- true if writable; otherwise, false.
-
-
-
- Gets the default value.
-
- The default value.
-
-
-
- Gets a value indicating whether this is required.
-
- A value indicating whether this is required.
-
-
-
- Gets a value indicating whether this property preserves object references.
-
-
- true if this instance is reference; otherwise, false.
-
-
-
-
- Gets the property null value handling.
-
- The null value handling.
-
-
-
- Gets the property default value handling.
-
- The default value handling.
-
-
-
- Gets the property reference loop handling.
-
- The reference loop handling.
-
-
-
- Gets the property object creation handling.
-
- The object creation handling.
-
-
-
- Gets or sets the type name handling.
-
- The type name handling.
-
-
-
- Gets or sets a predicate used to determine whether the property should be serialize.
-
- A predicate used to determine whether the property should be serialize.
-
-
-
- Gets or sets a predicate used to determine whether the property should be serialized.
-
- A predicate used to determine whether the property should be serialized.
-
-
-
- Gets or sets an action used to set whether the property has been deserialized.
-
- An action used to set whether the property has been deserialized.
-
-
-
- A collection of objects.
-
-
-
-
- Initializes a new instance of the class.
-
- The type.
-
-
-
- When implemented in a derived class, extracts the key from the specified element.
-
- The element from which to extract the key.
- The key for the specified element.
-
-
-
- Adds a object.
-
- The property to add to the collection.
-
-
-
- Gets the closest matching object.
- First attempts to get an exact case match of propertyName and then
- a case insensitive match.
-
- Name of the property.
- A matching property if found.
-
-
-
- Gets a property by property name.
-
- The name of the property to get.
- Type property name string comparison.
- A matching property if found.
-
-
-
- Specifies missing member handling options for the .
-
-
-
-
- Ignore a missing member and do not attempt to deserialize it.
-
-
-
-
- Throw a when a missing member is encountered during deserialization.
-
-
-
-
- Specifies null value handling options for the .
-
-
-
-
- Include null values when serializing and deserializing objects.
-
-
-
-
- Ignore null values when serializing and deserializing objects.
-
-
-
-
- Specifies reference loop handling options for the .
-
-
-
-
- Throw a when a loop is encountered.
-
-
-
-
- Ignore loop references and do not serialize.
-
-
-
-
- Serialize loop references.
-
-
-
-
- An in-memory representation of a JSON Schema.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
- Reads a from the specified .
-
- The containing the JSON Schema to read.
- The object representing the JSON Schema.
-
-
-
- Reads a from the specified .
-
- The containing the JSON Schema to read.
- The to use when resolving schema references.
- The object representing the JSON Schema.
-
-
-
- Load a from a string that contains schema JSON.
-
- A that contains JSON.
- A populated from the string that contains JSON.
-
-
-
- Parses the specified json.
-
- The json.
- The resolver.
- A populated from the string that contains JSON.
-
-
-
- Writes this schema to a .
-
- A into which this method will write.
-
-
-
- Writes this schema to a using the specified .
-
- A into which this method will write.
- The resolver used.
-
-
-
- Returns a that represents the current .
-
-
- A that represents the current .
-
-
-
-
- Gets or sets the id.
-
-
-
-
- Gets or sets the title.
-
-
-
-
- Gets or sets whether the object is required.
-
-
-
-
- Gets or sets whether the object is read only.
-
-
-
-
- Gets or sets whether the object is visible to users.
-
-
-
-
- Gets or sets whether the object is transient.
-
-
-
-
- Gets or sets the description of the object.
-
-
-
-
- Gets or sets the types of values allowed by the object.
-
- The type.
-
-
-
- Gets or sets the pattern.
-
- The pattern.
-
-
-
- Gets or sets the minimum length.
-
- The minimum length.
-
-
-
- Gets or sets the maximum length.
-
- The maximum length.
-
-
-
- Gets or sets a number that the value should be divisble by.
-
- A number that the value should be divisble by.
-
-
-
- Gets or sets the minimum.
-
- The minimum.
-
-
-
- Gets or sets the maximum.
-
- The maximum.
-
-
-
- Gets or sets a flag indicating whether the value can not equal the number defined by the "minimum" attribute.
-
- A flag indicating whether the value can not equal the number defined by the "minimum" attribute.
-
-
-
- Gets or sets a flag indicating whether the value can not equal the number defined by the "maximum" attribute.
-
- A flag indicating whether the value can not equal the number defined by the "maximum" attribute.
-
-
-
- Gets or sets the minimum number of items.
-
- The minimum number of items.
-
-
-
- Gets or sets the maximum number of items.
-
- The maximum number of items.
-
-
-
- Gets or sets the of items.
-
- The of items.
-
-
-
- Gets or sets the of properties.
-
- The of properties.
-
-
-
- Gets or sets the of additional properties.
-
- The of additional properties.
-
-
-
- Gets or sets the pattern properties.
-
- The pattern properties.
-
-
-
- Gets or sets a value indicating whether additional properties are allowed.
-
-
- true if additional properties are allowed; otherwise, false.
-
-
-
-
- Gets or sets the required property if this property is present.
-
- The required property if this property is present.
-
-
-
- Gets or sets the identity.
-
- The identity.
-
-
-
- Gets or sets the a collection of valid enum values allowed.
-
- A collection of valid enum values allowed.
-
-
-
- Gets or sets a collection of options.
-
- A collection of options.
-
-
-
- Gets or sets disallowed types.
-
- The disallow types.
-
-
-
- Gets or sets the default value.
-
- The default value.
-
-
-
- Gets or sets the extend .
-
- The extended .
-
-
-
- Gets or sets the format.
-
- The format.
-
-
-
- Generates a from a specified .
-
-
-
-
- Generate a from the specified type.
-
- The type to generate a from.
- A generated from the specified type.
-
-
-
- Generate a from the specified type.
-
- The type to generate a from.
- The used to resolve schema references.
- A generated from the specified type.
-
-
-
- Generate a from the specified type.
-
- The type to generate a from.
- Specify whether the generated root will be nullable.
- A generated from the specified type.
-
-
-
- Generate a from the specified type.
-
- The type to generate a from.
- The used to resolve schema references.
- Specify whether the generated root will be nullable.
- A generated from the specified type.
-
-
-
- Gets or sets how undefined schemas are handled by the serializer.
-
-
-
-
- Gets or sets the contract resolver.
-
- The contract resolver.
-
-
-
- The value types allowed by the .
-
-
-
-
- No type specified.
-
-
-
-
- String type.
-
-
-
-
- Float type.
-
-
-
-
- Integer type.
-
-
-
-
- Boolean type.
-
-
-
-
- Object type.
-
-
-
-
- Array type.
-
-
-
-
- Null type.
-
-
-
-
- Any type.
-
-
-
-
- Contract details for a used by the .
-
-
-
-
- Initializes a new instance of the class.
-
- The underlying type for the contract.
-
-
-
- Gets or sets the object member serialization.
-
- The member object serialization.
-
-
-
- Gets the object's properties.
-
- The object's properties.
-
-
-
- Gets the constructor parameters required for any non-default constructor
-
-
-
-
- Gets or sets the override constructor used to create the object.
- This is set when a constructor is marked up using the
- JsonConstructor attribute.
-
- The override constructor.
-
-
-
- Gets or sets the parametrized constructor used to create the object.
-
- The parametrized constructor.
-
-
-
- Serializes the dynamic.
-
- The writer.
- The value.
- The contract.
-
-
-
- Contract details for a used by the .
-
-
-
-
- Initializes a new instance of the class.
-
- The underlying type for the contract.
-
-
-
- Get and set values for a using reflection.
-
-
-
-
- Initializes a new instance of the class.
-
- The member info.
-
-
-
- Sets the value.
-
- The target to set the value on.
- The value to set on the target.
-
-
-
- Gets the value.
-
- The target to get the value from.
- The value.
-
-
-
- When applied to a method, specifies that the method is called when an error occurs serializing an object.
-
-
-
-
- Helper method for generating a MetaObject which calls a
- specific method on Dynamic that returns a result
-
-
-
-
- Helper method for generating a MetaObject which calls a
- specific method on Dynamic, but uses one of the arguments for
- the result.
-
-
-
-
- Helper method for generating a MetaObject which calls a
- specific method on Dynamic, but uses one of the arguments for
- the result.
-
-
-
-
- Returns a Restrictions object which includes our current restrictions merged
- with a restriction limiting our type
-
-
-
-
- Represents a method that constructs an object.
-
-
-
-
- Specifies type name handling options for the .
-
-
-
-
- Do not include the .NET type name when serializing types.
-
-
-
-
- Include the .NET type name when serializing into a JSON object structure.
-
-
-
-
- Include the .NET type name when serializing into a JSON array structure.
-
-
-
-
- Include the .NET type name when the type of the object being serialized is not the same as its declared type.
-
-
-
-
- Always include the .NET type name when serializing.
-
-
-
-
- Converts the value to the specified type.
-
- The type to convert the value to.
- The value to convert.
- The converted type.
-
-
-
- Converts the value to the specified type.
-
- The type to convert the value to.
- The value to convert.
- The culture to use when converting.
- The converted type.
-
-
-
- Converts the value to the specified type.
-
- The value to convert.
- The culture to use when converting.
- The type to convert the value to.
- The converted type.
-
-
-
- Converts the value to the specified type.
-
- The type to convert the value to.
- The value to convert.
- The converted value if the conversion was successful or the default value of T if it failed.
-
- true if initialValue was converted successfully; otherwise, false.
-
-
-
-
- Converts the value to the specified type.
-
- The type to convert the value to.
- The value to convert.
- The culture to use when converting.
- The converted value if the conversion was successful or the default value of T if it failed.
-
- true if initialValue was converted successfully; otherwise, false.
-
-
-
-
- Converts the value to the specified type.
-
- The value to convert.
- The culture to use when converting.
- The type to convert the value to.
- The converted value if the conversion was successful or the default value of T if it failed.
-
- true if initialValue was converted successfully; otherwise, false.
-
-
-
-
- Converts the value to the specified type. If the value is unable to be converted, the
- value is checked whether it assignable to the specified type.
-
- The type to convert or cast the value to.
- The value to convert.
- The converted type. If conversion was unsuccessful, the initial value is returned if assignable to the target type
-
-
-
- Converts the value to the specified type. If the value is unable to be converted, the
- value is checked whether it assignable to the specified type.
-
- The type to convert or cast the value to.
- The value to convert.
- The culture to use when converting.
- The converted type. If conversion was unsuccessful, the initial value is returned if assignable to the target type
-
-
-
- Converts the value to the specified type. If the value is unable to be converted, the
- value is checked whether it assignable to the specified type.
-
- The value to convert.
- The culture to use when converting.
- The type to convert or cast the value to.
-
- The converted type. If conversion was unsuccessful, the initial value
- is returned if assignable to the target type.
-
-
-
-
- Converts the value to the specified type. If the value is unable to be converted, the
- value is checked whether it assignable to the specified type.
-
- The type to convert the value to.
- The value to convert.
- The converted value if the conversion was successful or the default value of T if it failed.
-
- true if initialValue was converted successfully or is assignable; otherwise, false.
-
-
-
-
- Converts the value to the specified type. If the value is unable to be converted, the
- value is checked whether it assignable to the specified type.
-
- The type to convert the value to.
- The value to convert.
- The culture to use when converting.
- The converted value if the conversion was successful or the default value of T if it failed.
-
- true if initialValue was converted successfully or is assignable; otherwise, false.
-
-
-
-
- Converts the value to the specified type. If the value is unable to be converted, the
- value is checked whether it assignable to the specified type.
-
- The value to convert.
- The culture to use when converting.
- The type to convert the value to.
- The converted value if the conversion was successful or the default value of T if it failed.
-
- true if initialValue was converted successfully or is assignable; otherwise, false.
-
-
-
-
- Parses the specified enum member name, returning it's value.
-
- Name of the enum member.
-
-
-
-
- Parses the specified enum member name, returning it's value.
-
- Name of the enum member.
- If set to true ignore case.
-
-
-
-
- Gets a dictionary of the names and values of an Enum type.
-
-
-
-
-
- Gets a dictionary of the names and values of an Enum type.
-
-
-
-
-
- Gets a dictionary of the names and values of an Enum type.
-
- The enum type to get names and values for.
-
-
-
-
- Gets the maximum valid value of an Enum type. Flags enums are ORed.
-
- The type of the returned value. Must be assignable from the enum's underlying value type.
- The enum type to get the maximum value for.
-
-
-
-
- Specifies the type of Json token.
-
-
-
-
- This is returned by the if a method has not been called.
-
-
-
-
- An object start token.
-
-
-
-
- An array start token.
-
-
-
-
- A constructor start token.
-
-
-
-
- An object property name.
-
-
-
-
- A comment.
-
-
-
-
- Raw JSON.
-
-
-
-
- An interger.
-
-
-
-
- A float.
-
-
-
-
- A string.
-
-
-
-
- A boolean.
-
-
-
-
- A null token.
-
-
-
-
- An undefined token.
-
-
-
-
- An object end token.
-
-
-
-
- An array end token.
-
-
-
-
- A constructor end token.
-
-
-
-
- A Date.
-
-
-
-
- Byte data.
-
-
-
-
- Specifies the state of the .
-
-
-
-
- An exception has been thrown, which has left the in an invalid state.
- You may call the method to put the in the Closed state.
- Any other method calls results in an being thrown.
-
-
-
-
- The method has been called.
-
-
-
-
- An object is being written.
-
-
-
-
- A array is being written.
-
-
-
-
- A constructor is being written.
-
-
-
-
- A property is being written.
-
-
-
-
- A write method has not been called.
-
-
-
-
- Specifies formatting options for the .
-
-
-
-
- No special formatting is applied. This is the default.
-
-
-
-
- Causes child objects to be indented according to the and settings.
-
-
-
-
- Builds a string. Unlike StringBuilder this class lets you reuse it's internal buffer.
-
-
-
-
- Determines whether the collection is null or empty.
-
- The collection.
-
- true if the collection is null or empty; otherwise, false.
-
-
-
-
- Determines whether the collection is null or empty.
-
- The collection.
-
- true if the collection is null or empty; otherwise, false.
-
-
-
-
- Determines whether the collection is null, empty or its contents are uninitialized values.
-
- The list.
-
- true if the collection is null or empty or its contents are uninitialized values; otherwise, false.
-
-
-
-
- Makes a slice of the specified list in between the start and end indexes.
-
- The list.
- The start index.
- The end index.
- A slice of the list.
-
-
-
- Makes a slice of the specified list in between the start and end indexes,
- getting every so many items based upon the step.
-
- The list.
- The start index.
- The end index.
- The step.
- A slice of the list.
-
-
-
- Group the collection using a function which returns the key.
-
- The source collection to group.
- The key selector.
- A Dictionary with each key relating to a list of objects in a list grouped under it.
-
-
-
- Adds the elements of the specified collection to the specified generic IList.
-
- The list to add to.
- The collection of elements to add.
-
-
-
- Returns the index of the first occurrence in a sequence by using the default equality comparer.
-
- The type of the elements of source.
- A sequence in which to locate a value.
- The object to locate in the sequence
- The zero-based index of the first occurrence of value within the entire sequence, if found; otherwise, –1.
-
-
-
- Returns the index of the first occurrence in a sequence by using a specified IEqualityComparer.
-
- The type of the elements of source.
- A sequence in which to locate a value.
- The object to locate in the sequence
- An equality comparer to compare values.
- The zero-based index of the first occurrence of value within the entire sequence, if found; otherwise, –1.
-
-
-
- Gets the type of the typed collection's items.
-
- The type.
- The type of the typed collection's items.
-
-
-
- Tests whether the list's items are their unitialized value.
-
- The list.
- Whether the list's items are their unitialized value
-
-
-
- Gets the member's underlying type.
-
- The member.
- The underlying type of the member.
-
-
-
- Determines whether the member is an indexed property.
-
- The member.
-
- true if the member is an indexed property; otherwise, false.
-
-
-
-
- Determines whether the property is an indexed property.
-
- The property.
-
- true if the property is an indexed property; otherwise, false.
-
-
-
-
- Gets the member's value on the object.
-
- The member.
- The target object.
- The member's value on the object.
-
-
-
- Sets the member's value on the target object.
-
- The member.
- The target.
- The value.
-
-
-
- Determines whether the specified MemberInfo can be read.
-
- The MemberInfo to determine whether can be read.
- /// if set to true then allow the member to be gotten non-publicly.
-
- true if the specified MemberInfo can be read; otherwise, false.
-
-
-
-
- Determines whether the specified MemberInfo can be set.
-
- The MemberInfo to determine whether can be set.
- if set to true then allow the member to be set non-publicly.
- if set to true then allow the member to be set if read-only.
-
- true if the specified MemberInfo can be set; otherwise, false.
-
-
-
-
- Determines whether the string contains white space.
-
- The string to test for white space.
-
- true if the string contains white space; otherwise, false.
-
-
-
-
- Determines whether the string is all white space. Empty string will return false.
-
- The string to test whether it is all white space.
-
- true if the string is all white space; otherwise, false.
-
-
-
-
- Ensures the target string ends with the specified string.
-
- The target.
- The value.
- The target string with the value string at the end.
-
-
-
- Perform an action if the string is not null or empty.
-
- The value.
- The action to perform.
-
-
-
- Indents the specified string.
-
- The string to indent.
- The number of characters to indent by.
-
-
-
-
- Indents the specified string.
-
- The string to indent.
- The number of characters to indent by.
- The indent character.
-
-
-
-
- Numbers the lines.
-
- The string to number.
-
-
-
-
- Nulls an empty string.
-
- The string.
- Null if the string was null, otherwise the string unchanged.
-
-
-
diff --git a/MWC/Dependencies/Microsoft.Phone.Controls.Toolkit/Microsoft.Phone.Controls.Toolkit.dll b/MWC/Dependencies/Microsoft.Phone.Controls.Toolkit/Microsoft.Phone.Controls.Toolkit.dll
deleted file mode 100644
index 44d59b1d9..000000000
Binary files a/MWC/Dependencies/Microsoft.Phone.Controls.Toolkit/Microsoft.Phone.Controls.Toolkit.dll and /dev/null differ
diff --git a/MWC/Dependencies/Microsoft.Phone.Controls.Toolkit/Microsoft.Phone.Controls.Toolkit.pdb b/MWC/Dependencies/Microsoft.Phone.Controls.Toolkit/Microsoft.Phone.Controls.Toolkit.pdb
deleted file mode 100644
index ac620fd89..000000000
Binary files a/MWC/Dependencies/Microsoft.Phone.Controls.Toolkit/Microsoft.Phone.Controls.Toolkit.pdb and /dev/null differ
diff --git a/MWC/Dependencies/log4net/log4net.dll b/MWC/Dependencies/log4net/log4net.dll
deleted file mode 100644
index ffc57e112..000000000
Binary files a/MWC/Dependencies/log4net/log4net.dll and /dev/null differ
diff --git a/MWC/MWC.Core.Contracts/BL/Conference.cs b/MWC/MWC.Core.Contracts/BL/Conference.cs
deleted file mode 100644
index 53e403c91..000000000
--- a/MWC/MWC.Core.Contracts/BL/Conference.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Xml.Serialization;
-
-namespace MWC.BL
-{
- public partial class Conference
- {
- public Conference()
- {
- Speakers = new List();
- Sessions = new List();
- Exhibitors = new List();
- }
-
- [XmlElement("se")]
- public List Sessions { get; set; }
- [XmlElement("sp")]
- public List Speakers { get; set; }
- [XmlElement("ex")]
- public List Exhibitors { get; set; }
- }
-}
diff --git a/MWC/MWC.Core.Contracts/BL/Exhibitor.cs b/MWC/MWC.Core.Contracts/BL/Exhibitor.cs
deleted file mode 100644
index c0e61ef15..000000000
--- a/MWC/MWC.Core.Contracts/BL/Exhibitor.cs
+++ /dev/null
@@ -1,43 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Xml.Serialization;
-
-namespace MWC.BL
-{
- public partial class Exhibitor
- {
- [XmlAttribute("n")]
- public virtual string Name { get; set; }
- [XmlAttribute("ci")]
- public virtual string City { get; set; }
- [XmlAttribute("co")]
- public virtual string Country { get; set; }
- [XmlElement("l")]
- public virtual string Locations { get; set; }
- [XmlAttribute("fe")]
- public virtual bool IsFeatured { get; set; }
- [XmlElement("o")]
- public virtual string Overview { get; set; }
- [XmlAttribute("t")]
- public virtual string Tags { get; set; }
- [XmlAttribute("d")]
- public virtual string Email { get; set; }
- [XmlAttribute("a")]
- public virtual string Address { get; set; }
- [XmlAttribute("p")]
- public virtual string Phone { get; set; }
- [XmlAttribute("fa")]
- public virtual string Fax { get; set; }
- [XmlAttribute("i")]
- public string ImageUrl { get; set; }
-
- [XmlIgnore]
- public string DetailUrl { get; set; }
-
- public Exhibitor()
- {
- }
- }
-}
diff --git a/MWC/MWC.Core.Contracts/BL/Exhibitors.cs b/MWC/MWC.Core.Contracts/BL/Exhibitors.cs
deleted file mode 100644
index 0018b1bcd..000000000
--- a/MWC/MWC.Core.Contracts/BL/Exhibitors.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Xml.Serialization;
-
-namespace MWC.BL
-{
- public class Exhibitors
- {
- public Exhibitors()
- {
- this.Items = new List();
- }
-
- [XmlElement("ex")]
- public List Items { get; set; }
- }
-}
diff --git a/MWC/MWC.Core.Contracts/BL/Session.cs b/MWC/MWC.Core.Contracts/BL/Session.cs
deleted file mode 100644
index e9e368c62..000000000
--- a/MWC/MWC.Core.Contracts/BL/Session.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Xml.Serialization;
-
-namespace MWC.BL
-{
- public partial class Session
- {
- [XmlElement("t")]
- public string Title { get; set; }
- [XmlAttribute("st")]
- public DateTime Start { get; set; }
- [XmlAttribute("en")]
- public DateTime End { get; set; }
- [XmlAttribute("r")]
- public string Room { get; set; }
- [XmlAttribute("sn")]
- public string SpeakerNames { get; set; }
- [XmlElement("o")]
- public string Overview { get; set; }
- [XmlElement("sk")]
- public List SpeakerKeys { get; set; }
- [XmlIgnore]
- public List SpeakerList { get; set; }
- [XmlIgnore]
- public string DetailUrl { get; set; }
-
- public Session()
- {
- SpeakerList = new List();
- SpeakerKeys = new List();
- }
- }
-}
diff --git a/MWC/MWC.Core.Contracts/BL/Speaker.cs b/MWC/MWC.Core.Contracts/BL/Speaker.cs
deleted file mode 100644
index 78570de3a..000000000
--- a/MWC/MWC.Core.Contracts/BL/Speaker.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Xml.Serialization;
-
-namespace MWC.BL
-{
- public partial class Speaker
- {
- [XmlAttribute("k")]
- public string Key { get; set; }
- [XmlAttribute("n")]
- public string Name { get; set; }
- [XmlAttribute("t")]
- public string Title { get; set; }
- [XmlAttribute("c")]
- public string Company { get; set; }
- [XmlAttribute("b")]
- public string Bio { get; set; }
- [XmlAttribute("i")]
- public string ImageUrl { get; set; }
- [XmlIgnore]
- public string DetailUrl { get; set; }
-
- public Speaker()
- {
- Key = Guid.NewGuid().ToString();
- }
- }
-}
diff --git a/MWC/MWC.Core.Contracts/MWC.Core.Contracts.csproj b/MWC/MWC.Core.Contracts/MWC.Core.Contracts.csproj
deleted file mode 100644
index 095b5e1fc..000000000
--- a/MWC/MWC.Core.Contracts/MWC.Core.Contracts.csproj
+++ /dev/null
@@ -1,56 +0,0 @@
-
-
-
- Debug
- AnyCPU
- 8.0.30703
- 2.0
- {61ADEA53-1161-4E22-B28A-5B35820C6CB3}
- Library
- Properties
- MWC
- MWC.Core.Contracts
- v4.0
- 512
-
-
- true
- full
- false
- bin\Debug\
- DEBUG;TRACE
- prompt
- 4
-
-
- pdbonly
- true
- bin\Release\
- TRACE
- prompt
- 4
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/MWC/MWC.Core.Contracts/Properties/AssemblyInfo.cs b/MWC/MWC.Core.Contracts/Properties/AssemblyInfo.cs
deleted file mode 100644
index d373d1dde..000000000
--- a/MWC/MWC.Core.Contracts/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// 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("MWC.Core.Contracts")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("MWC.Core.Contracts")]
-[assembly: AssemblyCopyright("Copyright © 2012")]
-[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("126b4256-e7ac-452e-a0f4-6e902c733005")]
-
-// 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")]
diff --git a/MWC/MWC.Core.Parser/BL/ConferenceManager.cs b/MWC/MWC.Core.Parser/BL/ConferenceManager.cs
deleted file mode 100644
index 400758edc..000000000
--- a/MWC/MWC.Core.Parser/BL/ConferenceManager.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-
-namespace MWC.BL
-{
- public static class ConferenceManager
- {
- public static Conference GetConference(bool doPartial)
- {
- Conference conf = new Conference();
-
- var sessions = SessionManager.GetSessionList(doPartial);
- conf.Sessions = sessions;
-
- foreach(var session in sessions)
- {
- conf.Speakers.AddRange(session.SpeakerList);
- }
-
- //conf.Exhibitors = ExhibitorManager.GetExhibitorList(doPartial);
-
- return conf;
- }
- }
-}
diff --git a/MWC/MWC.Core.Parser/BL/ExhibitorManager.cs b/MWC/MWC.Core.Parser/BL/ExhibitorManager.cs
deleted file mode 100644
index d3f2724c7..000000000
--- a/MWC/MWC.Core.Parser/BL/ExhibitorManager.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using MWC.BL;
-
-namespace MWC.BL
-{
- public static class ExhibitorManager
- {
- public static List GetExhibitorList(bool doPartial)
- {
- return SAL.ExhibitorManager.GetExhibitorList(doPartial);
- }
- }
-}
diff --git a/MWC/MWC.Core.Parser/BL/JsonRequest.cs b/MWC/MWC.Core.Parser/BL/JsonRequest.cs
deleted file mode 100644
index 81ad390d2..000000000
--- a/MWC/MWC.Core.Parser/BL/JsonRequest.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-
-namespace MWC.BL
-{
- public class JsonRequest
- {
- public int eventId { get; set; }
- public int pageSize { get; set; }
- public int page { get; set; }
- public string sortOrder { get; set; }
- public string sortColumn { get; set; }
- public string searchName { get; set; }
- public string searchCompany { get; set; }
- public string searchJobTitle { get; set; }
- public string searchCountry { get; set; }
- public string searchInterest { get; set; }
- public string filterChar { get; set; }
- public string searchSession { get; set; }
- public int topicID { get; set; }
-
- public JsonRequest(int page)
- {
- this.eventId = 7;
- this.page = page;
- this.sortOrder = "";
- this.sortColumn = "";
- this.searchName = "";
- this.searchCompany = "";
- this.searchJobTitle = "";
- this.searchCountry = "";
- this.searchInterest = "";
- this.filterChar = "";
- this.searchSession = "";
- this.topicID = -1;
- }
- }
-}
diff --git a/MWC/MWC.Core.Parser/BL/LogManager.cs b/MWC/MWC.Core.Parser/BL/LogManager.cs
deleted file mode 100644
index f0924c1f3..000000000
--- a/MWC/MWC.Core.Parser/BL/LogManager.cs
+++ /dev/null
@@ -1,73 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using log4net;
-
-namespace MWC.BL
-{
- public enum LogLevel
- {
- DEBUG,
- ERROR,
- FATAL,
- INFO,
- WARN
- }
-
- ///
- /// LogManager handles all logging for the application.
- ///
- public static class LogManager
- {
- ///
- /// ctor to configure log4net
- ///
- static LogManager()
- {
- log4net.Config.XmlConfigurator.Configure();
- }
-
- private static ILog log = log4net.LogManager.GetLogger(typeof(MWC.BL.LogManager));
-
- ///
- /// Write the exception message and stack trace fo the log
- ///
- ///
- public static void WriteLog(Exception ex)
- {
- WriteLog(LogLevel.ERROR, string.Format("{0}\r\n{1}", ex.Message, ex.StackTrace));
- if(ex.InnerException != null)
- {
- WriteLog(ex.InnerException);
- }
- }
- ///
- /// Write the message and loglevel to the log.
- ///
- ///
- ///
- public static void WriteLog(LogLevel logLevel, string msg)
- {
- switch(logLevel)
- {
- case LogLevel.DEBUG:
- log.Debug(msg);
- break;
- case LogLevel.ERROR:
- log.Error(msg);
- break;
- case LogLevel.FATAL:
- log.Fatal(msg);
- break;
- case LogLevel.INFO:
- log.Info(msg);
- break;
- case LogLevel.WARN:
- log.Warn(msg);
- break;
- default: throw new NotImplementedException();
- }
- }
- }
-}
diff --git a/MWC/MWC.Core.Parser/BL/SessionManager.cs b/MWC/MWC.Core.Parser/BL/SessionManager.cs
deleted file mode 100644
index a1da45ace..000000000
--- a/MWC/MWC.Core.Parser/BL/SessionManager.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-
-namespace MWC.BL
-{
- public static class SessionManager
- {
- public static List GetSessionList(bool doPartial)
- {
- return SAL.SessionManager.GetSessionList(doPartial);
- }
- }
-}
diff --git a/MWC/MWC.Core.Parser/MWC.Core.Parser.csproj b/MWC/MWC.Core.Parser/MWC.Core.Parser.csproj
deleted file mode 100644
index 7262a5fa0..000000000
--- a/MWC/MWC.Core.Parser/MWC.Core.Parser.csproj
+++ /dev/null
@@ -1,76 +0,0 @@
-
-
-
- Debug
- AnyCPU
- 8.0.30703
- 2.0
- {C32FF43A-7CBA-4F79-82CE-32C428CFDA51}
- Library
- Properties
- MWC
- MWC.Core.Parser
- v4.0
- 512
-
-
- true
- full
- false
- bin\Debug\
- DEBUG;TRACE
- prompt
- 4
-
-
- pdbonly
- true
- bin\Release\
- TRACE
- prompt
- 4
-
-
-
- ..\Dependencies\HtmlAgilityPack\HtmlAgilityPack.dll
-
-
-
- ..\Dependencies\Json.net\Newtonsoft.Json.dll
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {61ADEA53-1161-4E22-B28A-5B35820C6CB3}
- MWC.Core.Contracts
-
-
-
-
-
\ No newline at end of file
diff --git a/MWC/MWC.Core.Parser/Properties/AssemblyInfo.cs b/MWC/MWC.Core.Parser/Properties/AssemblyInfo.cs
deleted file mode 100644
index 2f527d7ea..000000000
--- a/MWC/MWC.Core.Parser/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// 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("MWC.Core.Parser")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("MWC.Core.Parser")]
-[assembly: AssemblyCopyright("Copyright © 2012")]
-[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("e5d0b2b3-ec23-4a37-ac29-ab7c4b842c0a")]
-
-// 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")]
diff --git a/MWC/MWC.Core.Parser/SAL/ExhibitorManager.cs b/MWC/MWC.Core.Parser/SAL/ExhibitorManager.cs
deleted file mode 100644
index c6ba4afa5..000000000
--- a/MWC/MWC.Core.Parser/SAL/ExhibitorManager.cs
+++ /dev/null
@@ -1,131 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using MWC.BL;
-using MWC.SAL.Helpers;
-using Newtonsoft.Json.Linq;
-
-namespace MWC.SAL
-{
- public static class ExhibitorManager
- {
- private static string baseUrl = "http://www.mobileworldcongress.com/";
-
- public static List GetExhibitorList(bool doPartial)
- {
- List results = new List();
- // TODO: make this 0
- int page = 0;
-
- while(true)
- {
- bool isBlankPage = true;
- #region Ajax Args
- // this.eventId = 7;
- //this.pageSize = 20;
- //this.page = isNaN(page) ? 0 : page;
- //this.sortOrder = $("#page_content_ctl00_ddlSort").val();
- //this.filterChar = filterChar;
- //this.searchName = $("#searchName").val();
- //this.searchCompany = $("#searchCompany").val();
- //this.searchCountry = $("#page_content_ctl00_ddlCountries option:selected").text();
- //this.searchInterest = $("#page_content_ctl00_ddlInterest").val();
- #endregion
- string url = baseUrl + "/API/WebService.asmx/GetExhibitors";
- string data = String.Concat("{\"eventId\":7,\"pageSize\":20,\"page\":", page, ",\"sortOrder\":0,\"filterChar\":\"\",\"searchName\":\"\",\"searchCompany\":\"\",\"searchCountry\":\"Any\",\"searchInterest\":-1}");
- string json = string.Empty;
-
- json = WebHelper.HttpPost(url, data);
- var j = JObject.Parse(json);
-
- HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
- doc.LoadHtml(j["d"]["ReturnText"].ToString());
-
- HtmlAgilityPack.HtmlNodeCollection nodes = null;
- if((nodes = doc.DocumentNode.SelectNodes("//li[@class='exhibitorListItem Connect']")) != null)
- {
- isBlankPage = false;
- results.AddRange(ParseExhibitors(nodes, true));
- }
-
- if((nodes = doc.DocumentNode.SelectNodes("//li[@class='exhibitorListItem Basic']")) != null)
- {
- isBlankPage = false;
- results.AddRange(ParseExhibitors(nodes, false));
- }
-
- if(isBlankPage) { break; }
-
- page++;
-
- if(doPartial) break;
- }
- results = GetExtendedData(results);
- return results;
- }
-
- private static List GetExtendedData(List exhibitors)
- {
- foreach(var exhibitor in exhibitors)
- {
- string url = baseUrl + exhibitor.DetailUrl;
- string html = WebHelper.HttpGet(url);
-
- HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
- doc.LoadHtml(html);
-
- exhibitor.Overview = HtmlDocHelper.GetInnerText(doc, "//*[@id=\"page_content_ctl00_ctl00_divDescription\"]");
- exhibitor.Tags = HtmlDocHelper.GetInnerText(doc, "//*[@id=\"page_content_ctl00_ctl00_ulDetailTags\"]");
- exhibitor.Email = HtmlDocHelper.GetInnerText(doc, "//*[@id=\"page_content_ctl00_ctl00_hlEmail\"]");
- exhibitor.Phone = HtmlDocHelper.GetInnerText(doc, "//*[@id=\"page_content_ctl00_ctl00_divTel\"]").Replace("Tel:", "").Trim();
- exhibitor.Fax = HtmlDocHelper.GetInnerText(doc, "//*[@id=\"page_content_ctl00_ctl00_divFax\"]").Replace("Fax:", "").Trim();
- exhibitor.ImageUrl = HtmlDocHelper.GetAttribute(doc.DocumentNode, "//*[@id=\"page_content_ctl00_ctl00_imgExhibitorDetail\"]", "src");
-
- var nodes = doc.DocumentNode.SelectNodes("//ul[@id=\"page_content_ctl00_ctl00_ulDetailAddress\"]/li");
- if(nodes != null)
- {
- List addressParts = new List();
- foreach(var node in nodes)
- {
- addressParts.Add(node.InnerText);
- }
- exhibitor.Address = string.Join(", ", addressParts);
- }
- }
- return exhibitors;
- }
-
- private static List ParseExhibitors(HtmlAgilityPack.HtmlNodeCollection nodes, bool isFeatured)
- {
- List exhibitors = new List();
- foreach(HtmlAgilityPack.HtmlNode node in nodes)
- {
- Exhibitor exhibitor = new Exhibitor();
- exhibitor.DetailUrl = node.SelectSingleNode("div[2]/h3/a").Attributes["href"].Value;
- exhibitor.Name = node.SelectSingleNode("div[2]/h3/a").InnerText.Trim();
- exhibitor.IsFeatured = isFeatured;
-
- string[] cityCountry = node.SelectSingleNode("div[2]/div/h4").InnerText.Split(',');
- if(cityCountry.Length >= 2)
- {
- exhibitor.City = cityCountry[0].Trim();
- exhibitor.Country = cityCountry[1].Trim();
- }
-
- var locationNodes = node.SelectNodes("div[3]/ul/li");
- if(locationNodes != null)
- {
- List locations = new List();
-
- foreach(var l in locationNodes)
- { locations.Add(string.Concat("Hall ", l.InnerText)); }
-
- exhibitor.Locations = string.Join(", ", locations.ToArray());
- }
- exhibitors.Add(exhibitor);
- }
- return exhibitors;
- }
- }
-}
diff --git a/MWC/MWC.Core.Parser/SAL/Helpers/HtmlDocHelper.cs b/MWC/MWC.Core.Parser/SAL/Helpers/HtmlDocHelper.cs
deleted file mode 100644
index 8bb0e6e36..000000000
--- a/MWC/MWC.Core.Parser/SAL/Helpers/HtmlDocHelper.cs
+++ /dev/null
@@ -1,42 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-
-namespace MWC.SAL.Helpers
-{
- public static class HtmlDocHelper
- {
- public static string GetInnerText(HtmlAgilityPack.HtmlDocument doc, string xpath)
- {
- return GetInnerText(doc.DocumentNode, xpath);
- }
-
- public static string GetAttribute(HtmlAgilityPack.HtmlDocument doc, string xpath, string attributeName)
- {
- return GetAttribute(doc.DocumentNode, xpath, attributeName);
- }
-
- public static string GetInnerText(HtmlAgilityPack.HtmlNode doc, string xpath)
- {
- string result = string.Empty;
-
- var node = doc.SelectSingleNode(xpath);
- if(node != null)
- { result = node.InnerText.Trim(); }
-
- return result;
- }
-
- public static string GetAttribute(HtmlAgilityPack.HtmlNode doc, string xpath, string attributeName)
- {
- string result = string.Empty;
-
- var node = doc.SelectSingleNode(xpath);
- if(node != null)
- { result = node.Attributes[attributeName].Value; }
-
- return result;
- }
- }
-}
diff --git a/MWC/MWC.Core.Parser/SAL/Helpers/WebHelper.cs b/MWC/MWC.Core.Parser/SAL/Helpers/WebHelper.cs
deleted file mode 100644
index 8cd97c7ee..000000000
--- a/MWC/MWC.Core.Parser/SAL/Helpers/WebHelper.cs
+++ /dev/null
@@ -1,108 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Net;
-using System.IO;
-
-namespace MWC.SAL.Helpers
-{
- public static class WebHelper
- {
- public static string HttpGet(string url)
- {
- int tryCount = 0;
- int maxRetries = 3;
- string result = string.Empty;
- while(true)
- {
- try
- {
- HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
- // get the http response
- HttpWebResponse response = (HttpWebResponse)request.GetResponse();
- using(StreamReader sr = new StreamReader(response.GetResponseStream()))
- {
- result = sr.ReadToEnd();
- }
- break;
- }
- catch(WebException webex)
- {
- if(tryCount < maxRetries)
- { tryCount++; }
- else
- {
- Console.WriteLine(url);
- throw webex;
- }
- }
- }
- return result;
- }
-
- public static string HttpPost(string url, string data)
- {
- string result = string.Empty;
-
- try
- {
- HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
- request.Method = "POST";
- request.ContentType = "application/json";
-
- // prepare the bytes to send to the request stream
- byte[] bytes = Encoding.UTF8.GetBytes(data.ToString());
- request.ContentLength = data.ToString().Length;
-
- // write the data to the request stream
- using(Stream requestStream = request.GetRequestStream())
- {
- requestStream.Write(bytes, 0, bytes.Length);
- }
-
- HttpWebResponse response = (HttpWebResponse)request.GetResponse();
- using(StreamReader sr = new StreamReader(response.GetResponseStream()))
- {
- result = sr.ReadToEnd();
- }
- }
- catch(WebException web)
- {
- if(web.Response != null)
- {
- Stream errorStream = ((HttpWebResponse)web.Response).GetResponseStream();
- using(StreamReader errorSr = new StreamReader(errorStream))
- {
- string errorResponse = errorSr.ReadToEnd();
- Console.WriteLine(errorResponse);
- }
- }
- throw web;
- }
- return result;
-
- }
-
- public static string Scrape(string url)
- {
- WebClient client = new WebClient();
- client.Headers.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 6.0)");
-
- try
- {
- using(Stream data = client.OpenRead(url))
- {
- using(StreamReader sr = new StreamReader(data))
- {
- return sr.ReadToEnd();
- }
- }
- }
- catch(Exception ex)
- {
- return "Could not retrieve file: \n\n" + ex.Message;
- }
- }
- }
-}
diff --git a/MWC/MWC.Core.Parser/SAL/SessionManager.cs b/MWC/MWC.Core.Parser/SAL/SessionManager.cs
deleted file mode 100644
index 6f01e54b4..000000000
--- a/MWC/MWC.Core.Parser/SAL/SessionManager.cs
+++ /dev/null
@@ -1,183 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Net;
-using System.IO;
-using MWC.SAL.Helpers;
-using MWC.BL;
-using Newtonsoft.Json;
-using Newtonsoft.Json.Linq;
-using System.Web;
-
-namespace MWC.SAL
-{
- public static class SessionManager
- {
- private static string baseUrl = "http://www.mobileworldcongress.com/";
-
- public static List GetSessionList(bool doPartial)
- {
- List results = new List();
- int page = 12;
-
- while(true)
- {
- string url = baseUrl + "/API/WebService.asmx/GetEventSessionsByTopic";
- //string data = String.Concat("{\"eventID\":7,\"pageSize\":10,\"page\":", page, ",\"topicID\":-1,\"searchName\":\"\"}");
- string data = JsonConvert.SerializeObject(new JsonRequest(page));
- string json = string.Empty;
-
- json = WebHelper.HttpPost(url, data);
- var j = JObject.Parse(json);
-
- HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
- doc.LoadHtml(j["d"]["ReturnText"].ToString());
-
- var nodes = doc.DocumentNode.SelectNodes("//li[@class='eventSessionListItem']");
- if(nodes != null)
- {
- foreach(HtmlAgilityPack.HtmlNode node in nodes)
- {
- Session session = new Session();
- session.Title = node.SelectSingleNode("div[2]/h3/a").InnerText;
- session.DetailUrl = node.SelectSingleNode("div[2]/h3/a").Attributes["href"].Value;
- var date = node.SelectSingleNode("div[3]/div");
- var time = node.SelectSingleNode("div[3]/div[2]");
-
- var dateTime = ParseDateTime(date.InnerText, time.InnerText);
- session.Start = dateTime[0];
- session.End = dateTime[1];
- session.Room = HtmlDocHelper.GetInnerText(node, "div[2]/div/ul[@class='ulLocations']");
- session.SpeakerNames = HtmlDocHelper.GetInnerText(node, "div[2]/div[@class='eventSessionSpeakers']/ul");
-
- results.Add(session);
- }
- }
- else
- {
- break;
- }
- page++;
-
- if(doPartial) break;
- }
-
- results = GetExtendedSessions(results);
-
- foreach(var result in results)
- {
- result.SpeakerList = GetExtendedSpeakers(result.SpeakerList);
- }
-
- return results;
- }
-
- private static List GetExtendedSessions(List sessions)
- {
- foreach(var session in sessions)
- {
- string url = baseUrl + session.DetailUrl;
- string html = WebHelper.HttpGet(url);
-
- HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
- doc.LoadHtml(html);
-
- string text = string.Empty;
-
- var node = doc.DocumentNode.SelectSingleNode("//*[@id=\"page_content_Content4_oModuleEventSessions_5_ctl00_ctl01_divDescription\"]");
- if(node != null)
- {
- var nodes = node.SelectNodes("p");
- if(nodes != null)
- {
- bool wasEmpty = false;
- foreach(var n in nodes)
- {
- string part = HttpUtility.HtmlDecode(n.InnerText.Trim().Replace("\n\t", "\r\n"));
- if(part == "Jointly developed with") { part = ""; }
-
- if(part.Trim() == string.Empty)
- {
- if(!wasEmpty)
- {
- text += "\r\n";
- wasEmpty = true;
- }
- }
- else
- {
- text += part.Trim() + "\r\n";
- wasEmpty = false;
- }
-
- //foreach(var item in n.SelectNodes("text()"))
- //{
- // string part = HttpUtility.HtmlDecode(item.InnerText.Trim().Replace("\n\t", "\r\n"));
- // text += part + "\r\n";
- //}
- }
- }
- }
- session.Overview = text.Trim();
- session.Overview = session.Overview.Replace("Click here", "Visit the MWC website");
-
- var speakers = doc.DocumentNode.SelectNodes("//*[@id=\"page_content_Content4_oModuleEventSessions_5_ctl00_ctl02_pnlSpeakers\"]/ul/li");
- if(speakers != null)
- {
- foreach(var s in speakers)
- {
- if(s.InnerText != "No speakers")
- {
- Speaker speaker = new Speaker();
- speaker.Name = HtmlDocHelper.GetInnerText(s, "div[@class='event-list-name']/a");
- speaker.DetailUrl = HtmlDocHelper.GetAttribute(s, "div[@class='event-list-name']/a", "href");
- speaker.Company = HtmlDocHelper.GetInnerText(s, "div[@class='event-list-company']");
- speaker.Title = HtmlDocHelper.GetInnerText(s, "div[@class='event-list-position']");
- session.SpeakerList.Add(speaker);
- session.SpeakerKeys.Add(speaker.Key);
- }
- }
- }
- }
- return sessions;
- }
-
- private static List GetExtendedSpeakers(List speakers)
- {
- foreach(var speaker in speakers)
- {
- string url = baseUrl + speaker.DetailUrl;
- string html = WebHelper.HttpGet(url);
-
- HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
- doc.LoadHtml(html);
-
- speaker.ImageUrl = baseUrl + HtmlDocHelper.GetAttribute(doc, "//div[@class='profile-pic profile-pic-large']/a/img", "src");
-
- var nodes = doc.DocumentNode.SelectNodes("//div[@class='uiUserField_Name']");
- if(nodes != null)
- {
- foreach(var node in nodes)
- {
- if(node.InnerText == "About Me")
- {
- speaker.Bio = node.NextSibling.NextSibling.InnerText.Trim();
- }
- }
- }
- }
- return speakers;
- }
-
- private static DateTime[] ParseDateTime(string dt, string ti)
- {
- DateTime[] results = new DateTime[2];
- DateTime startDate = DateTime.Parse(dt + " " + ti.Split('-')[0]);
- DateTime endDate = DateTime.Parse(dt + " " + ti.Split('-')[1]);
- results[0] = startDate;
- results[1] = endDate;
- return results;
- }
- }
-}
diff --git a/MWC/MWC.Core.WP7/MWC.Core.WP7.csproj b/MWC/MWC.Core.WP7/MWC.Core.WP7.csproj
deleted file mode 100644
index b8b620169..000000000
--- a/MWC/MWC.Core.WP7/MWC.Core.WP7.csproj
+++ /dev/null
@@ -1,154 +0,0 @@
-
-
-
- Debug
- AnyCPU
- 10.0.20506
- 2.0
- {91D0E086-F406-4BE9-A710-13B1323BA522}
- {C089C8C0-30E0-4E22-80C0-CE093F111A43};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}
- Library
- Properties
- MWC.Core.WP7
- MWC.Core.WP7
- v4.0
- $(TargetFrameworkVersion)
- WindowsPhone71
- Silverlight
- false
- true
- true
-
-
- true
- full
- false
- Bin\Debug
- DEBUG;TRACE;SILVERLIGHT;WINDOWS_PHONE
- true
- true
- prompt
- 4
-
-
- pdbonly
- true
- Bin\Release
- TRACE;SILVERLIGHT;WINDOWS_PHONE
- true
- true
- prompt
- 4
-
-
-
- ..\Dependencies\Community.CsharpSqlite\Community.CsharpSqlite.WP7.dll
-
-
-
-
-
-
-
-
-
-
-
-
-
- BL\Conference.cs
-
-
- BL\Contracts\BusinessEntityBase.cs
-
-
- BL\Contracts\IBusinessEntity.cs
-
-
- BL\Exhibitor.cs
-
-
- BL\Favorite.cs
-
-
- BL\Managers\DaysManager.cs
-
-
- BL\Managers\ExhibitorManager.cs
-
-
- BL\Managers\FavoritesManager.cs
-
-
- BL\Managers\NewsManager.cs
-
-
- BL\Managers\SessionManager.cs
-
-
- BL\Managers\SpeakerManager.cs
-
-
- BL\Managers\TwitterFeedManager.cs
-
-
- BL\Managers\UpdateFinishedEventArgs.cs
-
-
- BL\Managers\UpdateManager.cs
-
-
- BL\Session.cs
-
-
- BL\SessionSpeaker.cs
-
-
- BL\SessionTimeslot.cs
-
-
- BL\Speaker.cs
-
-
- Constants.cs
-
-
- DAL\DataManager.cs
-
-
- DL\MwcDatabase.cs
-
-
- DL\SQLite_WP7.cs
-
-
- SAL\MwcSiteParser.cs
-
-
- SAL\RSSEntry.cs
-
-
- SAL\RSSParser.cs
-
-
- SAL\Tweet.cs
-
-
- SAL\TwitterParser.cs
-
-
- SAL\XmlFeedParserBase.cs
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/MWC/MWC.Core.WP7/Properties/AssemblyInfo.cs b/MWC/MWC.Core.WP7/Properties/AssemblyInfo.cs
deleted file mode 100644
index 3e51e6f4b..000000000
--- a/MWC/MWC.Core.WP7/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-using System.Resources;
-
-// 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("MWC.Core.WP7")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("MWC.Core.WP7")]
-[assembly: AssemblyCopyright("Copyright © 2012")]
-[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("87bf502a-9d6a-435f-baef-aadbcddcfd45")]
-
-// 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 Revision and Build Numbers
-// by using the '*' as shown below:
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
-[assembly: NeutralResourcesLanguageAttribute("en-US")]
diff --git a/MWC/MWC.Core/BL/Conference.cs b/MWC/MWC.Core/BL/Conference.cs
deleted file mode 100644
index 535688438..000000000
--- a/MWC/MWC.Core/BL/Conference.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using System.Collections.Generic;
-using System.Xml;
-using System.Xml.Serialization;
-
-namespace MWC.BL
-{
- public class Conference
- {
- public Conference ()
- {
- Speakers = new List();
- Sessions = new List();
- Exhibitors = new List();
- }
-
- [XmlElement("sp")]
- public List Speakers { get; set; }
- [XmlElement("se")]
- public List Sessions { get; set; }
- [XmlElement("ex")]
- public List Exhibitors { get; set; }
- }
-}
\ No newline at end of file
diff --git a/MWC/MWC.Core/BL/Contracts/BusinessEntityBase.cs b/MWC/MWC.Core/BL/Contracts/BusinessEntityBase.cs
deleted file mode 100644
index 2f3410813..000000000
--- a/MWC/MWC.Core/BL/Contracts/BusinessEntityBase.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-using System;
-using MWC.DL.SQLite;
-
-namespace MWC.BL.Contracts
-{
- ///
- /// Business entity base class. Provides the ID property.
- ///
- public abstract class BusinessEntityBase : IBusinessEntity
- {
- public BusinessEntityBase ()
- {
- }
-
- ///
- /// Gets or sets the Database ID.
- ///
- ///
- /// The ID.
- ///
- [PrimaryKey, AutoIncrement]
- [System.Xml.Serialization.XmlIgnore]
- public int ID { get; set; }
-
- }
-}
-
diff --git a/MWC/MWC.Core/BL/Contracts/IBusinessEntity.cs b/MWC/MWC.Core/BL/Contracts/IBusinessEntity.cs
deleted file mode 100644
index bc4f7f138..000000000
--- a/MWC/MWC.Core/BL/Contracts/IBusinessEntity.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-using System;
-
-namespace MWC.BL.Contracts
-{
- public interface IBusinessEntity
- {
- int ID { get; set; }
- }
-}
-
diff --git a/MWC/MWC.Core/BL/Exhibitor.cs b/MWC/MWC.Core/BL/Exhibitor.cs
deleted file mode 100644
index eedbb9f79..000000000
--- a/MWC/MWC.Core/BL/Exhibitor.cs
+++ /dev/null
@@ -1,67 +0,0 @@
-using System.Xml.Serialization;
-using System;
-
-namespace MWC.BL
-{
- ///
- /// Represents an Exhibitor at the conference.
- ///
- public partial class Exhibitor : Contracts.BusinessEntityBase
- {
- [XmlAttribute("n")]
- public virtual string Name { get; set; }
- [XmlAttribute("ci")]
- public virtual string City { get; set; }
- [XmlAttribute("co")]
- public virtual string Country { get; set; }
- [XmlElement("l")]
- public virtual string Locations { get; set; }
- [XmlAttribute("fe")]
- public virtual bool IsFeatured { get; set; }
- [XmlElement("o")]
- public virtual string Overview { get; set; }
- [XmlAttribute("t")]
- public virtual string Tags { get; set; }
- [XmlAttribute("d")]
- public virtual string Email { get; set; }
- [XmlAttribute("a")]
- public virtual string Address { get; set; }
- [XmlAttribute("p")]
- public virtual string Phone { get; set; }
- [XmlAttribute("fa")]
- public virtual string Fax { get; set; }
- [XmlAttribute("i")]
- public string ImageUrl { get; set; }
-
- public Exhibitor ()
- {
- }
-
- ///
- /// Used in the UI to build 'fast scrolling'/'index scrolling'
- ///
- public string Index {
- get {
- return IsCapitalLetter(Name[0]) ? Name[0].ToString().ToUpper() : "1";
- }
- }
- bool IsCapitalLetter(char startsWith)
- {
- return ((startsWith >= 'A') && (startsWith <= 'Z'))
- || ((startsWith >= 'a') && (startsWith <= 'z'));
- }
-
- public string FormattedCityCountry {
- get {
- string cityCountry = City;
- if (!String.IsNullOrEmpty(cityCountry)) {
- if (!String.IsNullOrEmpty(Country))
- cityCountry += ", " + Country;
- } else
- cityCountry = Country;
- return cityCountry;
- }
- }
- }
-}
-
diff --git a/MWC/MWC.Core/BL/Favorite.cs b/MWC/MWC.Core/BL/Favorite.cs
deleted file mode 100644
index db69934dd..000000000
--- a/MWC/MWC.Core/BL/Favorite.cs
+++ /dev/null
@@ -1,22 +0,0 @@
-using System;
-using MWC.BL.Contracts;
-using MWC.DL.SQLite;
-
-namespace MWC.BL
-{
- ///
- /// DataModel for whether a session is a 'favorite' of the user
- ///
- public class Favorite : BusinessEntityBase
- {
- public Favorite () {}
-
- ///
- /// Gets or sets the session I.
- ///
- [Obsolete("Not used, the ID is like quicksand, always moving and changing")]
- public int SessionID { get; set; }
-
- public string SessionKey { get; set; }
- }
-}
\ No newline at end of file
diff --git a/MWC/MWC.Core/BL/Managers/DaysManager.cs b/MWC/MWC.Core/BL/Managers/DaysManager.cs
deleted file mode 100644
index b71e29910..000000000
--- a/MWC/MWC.Core/BL/Managers/DaysManager.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-using System;
-using System.Collections.Generic;
-
-namespace MWC
-{
- ///
- /// Okay, maybe overkill, but it's nice to have a simple way
- /// to get the list of days for the conference that's xplatform
- ///
- public static class DaysManager
- {
- static DaysManager ()
- {
- }
-
- public static List GetDays ()
- {
- DateTime dayMin = Constants.StartDateMin; //new DateTime ( 2012, 02, 27, 0, 0, 0 );
- DateTime dayMax = Constants.EndDateMax;
-
- var days = new List();
- for (var i = 0; dayMin.AddDays (i) < dayMax; i++)
- {
- days.Add (dayMin.AddDays (i));
- }
-
- return days;
- }
-
- }
-}
\ No newline at end of file
diff --git a/MWC/MWC.Core/BL/Managers/ExhibitorManager.cs b/MWC/MWC.Core/BL/Managers/ExhibitorManager.cs
deleted file mode 100644
index 3f9a22574..000000000
--- a/MWC/MWC.Core/BL/Managers/ExhibitorManager.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-
-namespace MWC.BL.Managers
-{
- public static class ExhibitorManager
- {
- static ExhibitorManager ()
- {
- }
-
- internal static void UpdateExhibitorData(IList exhibitors)
- {
- DAL.DataManager.DeleteExhibitors();
- DAL.DataManager.SaveExhibitors (exhibitors); //SAL.MwcSiteParser.GetExhibitors ());
- }
-
- public static IList GetExhibitors ()
- {
- var iexhibitors = DAL.DataManager.GetExhibitors();
- return iexhibitors.ToList(); // new List();
- }
-
- public static Exhibitor GetExhibitor (int exhibitorID)
- {
- return DAL.DataManager.GetExhibitor (exhibitorID);
- }
-
- public static Exhibitor GetExhibitorWithName (string exhibitorName)
- {
- return DAL.DataManager.GetExhibitorWithName (exhibitorName);
- }
- }
-}
-
diff --git a/MWC/MWC.Core/BL/Managers/FavoritesManager.cs b/MWC/MWC.Core/BL/Managers/FavoritesManager.cs
deleted file mode 100644
index 1b3c425d6..000000000
--- a/MWC/MWC.Core/BL/Managers/FavoritesManager.cs
+++ /dev/null
@@ -1,57 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-
-namespace MWC.BL.Managers {
- public static class FavoritesManager {
-
- static FavoritesManager ()
- {
- }
-
- public static IList GetFavorites ()
- {
- return new List (DAL.DataManager.GetFavorites ());
- }
- public static bool IsFavorite(string sessionKey)
- {
- return DAL.DataManager.GetIsFavorite (sessionKey);
- }
- public static void AddFavoriteSession(Favorite favorite)
- {
- DAL.DataManager.SaveFavorite(favorite);
- }
- public static void RemoveFavoriteSession(string sessionKey)
- {
- DAL.DataManager.DeleteFavorite (sessionKey);
- }
-
- public static IList GetFavoriteTimeslots()
- {
- var sessions = SessionManager.GetSessions();
- var timeslotHeaderFormat = "dddd H:mm";
- return new List(GroupSessionsByTimeslot(sessions, timeslotHeaderFormat));
- }
- ///
- /// Split favorite sessions up into timeslot groups
- ///
- static IEnumerable GroupSessionsByTimeslot (IList sessions, string headerFormat)
- {
- var favs = BL.Managers.FavoritesManager.GetFavorites();
- // extract IDs from Favorites query
- List favoriteIDs = new List();
- foreach (var f in favs) favoriteIDs.Add (f.SessionKey);
-
- return from session in sessions
- where favoriteIDs.Contains(session.Key)
- group session by session.Start.Ticks into timeslot
- orderby timeslot.Key
- select new SessionTimeslot(
- new DateTime(timeslot.Key).ToString(headerFormat)
- ,
- from eachSession in timeslot
- select eachSession
- );
- }
- }
-}
\ No newline at end of file
diff --git a/MWC/MWC.Core/BL/Managers/NewsManager.cs b/MWC/MWC.Core/BL/Managers/NewsManager.cs
deleted file mode 100644
index f09d8e004..000000000
--- a/MWC/MWC.Core/BL/Managers/NewsManager.cs
+++ /dev/null
@@ -1,51 +0,0 @@
-using System;
-using System.Collections.Generic;
-
-namespace MWC.BL.Managers {
- public static class NewsManager {
- static object locker = new object();
-
- public static event EventHandler UpdateStarted = delegate {};
- public static event EventHandler UpdateFinished = delegate {};
- public static bool IsUpdating
- {
- get { return _isUpdating; }
- set { _isUpdating = value; }
- }
- private static bool _isUpdating = false;
-
- static NewsManager ()
- {
- }
-
- public static RSSEntry Get(int newsID)
- {
- return DAL.DataManager.GetNews(newsID);
- }
- public static IList Get()
- {
- return new List ( DAL.DataManager.GetNews () );
- }
-
- public static void Update()
- {
- // make this a critical section to ensure that access is serial
- lock(locker) {
- UpdateStarted (null, EventArgs.Empty);
-
- SAL.RSSParser _newsParser = new SAL.RSSParser(Constants.NewsUrl);
-
- _isUpdating = true;
- _newsParser.Refresh(delegate {
- var news = _newsParser.AllItems;
-
- DAL.DataManager.DeleteNews ();
- DAL.DataManager.SaveNews (news);
-
- UpdateFinished (null, EventArgs.Empty);
- _isUpdating = false;
- });
- }
- }
- }
-}
\ No newline at end of file
diff --git a/MWC/MWC.Core/BL/Managers/SessionManager.cs b/MWC/MWC.Core/BL/Managers/SessionManager.cs
deleted file mode 100644
index fbc39041d..000000000
--- a/MWC/MWC.Core/BL/Managers/SessionManager.cs
+++ /dev/null
@@ -1,92 +0,0 @@
-using System;
-using MWC.BL;
-using System.Collections.Generic;
-using System.Linq;
-
-namespace MWC.BL.Managers {
- public static class SessionManager {
-
- static SessionManager ()
- {
- }
-
- ///
- /// Does two things:
- /// * calculates the 'key' for the session (concat starttime and title),
- /// and then setting the .Key property so it'll be saved to sqlite
- /// * extracts the Speaker.Keys for each session and creates a seperate
- /// list of them to be saved in a seperate sqlite table (used to join
- /// Speakers and Sessions later). Saved to sqlite by the caller.
- ///
- internal static List GenerateKeysAndSpeakers (IList sessions)
- {
- var sessionSpeakers = new List();
-
- foreach (var s in sessions) {
- s.Key = s.Start.ToString("yyMMddhhmm") + s.Title;
-
- foreach (var p in s.SpeakerKeys) {
- sessionSpeakers.Add(new SessionSpeaker(s.Key, p));
- }
- }
- return sessionSpeakers;
- }
-
- internal static void UpdateSessionData(IList sessions)
- {
- DAL.DataManager.DeleteSessions ();
- DAL.DataManager.SaveSessions(sessions); //SAL.MwcSiteParser.GetSessions () ); //TODO: figure out Exception in Android
- }
-
- public static IList GetSessions ()
- {
- var isessions = DAL.DataManager.GetSessions();
- return isessions.ToList(); // new List(DAL.DataManager.GetSessions()); //TODO: figure out Exception in Android
- }
-
- public static IList GetSessions ( int day )
- {
- var isessions = DAL.DataManager.GetSessions(day);
- return isessions.ToList(); // new List ( DAL.DataManager.GetSessions ( day ) );
- }
-
- public static IList GetSessionTimeslots()
- {
- var sessions = GetSessions();
- var timeslotHeaderFormat = "dddd H:mm";
- return new List(GroupSessionsByTimeslot(sessions, timeslotHeaderFormat));
- }
-
- public static IList GetSessionTimeslots(int day)
- {
- var sessions = GetSessions(day);
- var timeslotHeaderFormat = "H:mm";
- return new List(GroupSessionsByTimeslot(sessions, timeslotHeaderFormat));
- }
- ///
- /// Split sessions up into timeslot groups
- ///
- static IEnumerable GroupSessionsByTimeslot (IList sessions, string headerFormat)
- {
- return from session in sessions
- group session by session.Start.Ticks into timeslot
- orderby timeslot.Key
- select new SessionTimeslot(
- new DateTime(timeslot.Key).ToString(headerFormat)
- ,
- from eachSession in timeslot
- select eachSession
- );
- }
-
- public static Session GetSession (int id)
- {
- return DAL.DataManager.GetSession (id);
- }
-
- public static Session GetSessionWithKey (string key)
- {
- return DAL.DataManager.GetSessionWithKey (key);
- }
- }
-}
\ No newline at end of file
diff --git a/MWC/MWC.Core/BL/Managers/SpeakerManager.cs b/MWC/MWC.Core/BL/Managers/SpeakerManager.cs
deleted file mode 100644
index 8ee76c65c..000000000
--- a/MWC/MWC.Core/BL/Managers/SpeakerManager.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-
-namespace MWC.BL.Managers
-{
- public static class SpeakerManager
- {
- static SpeakerManager ()
- {
- }
-
- internal static void UpdateSpeakerData(IList speakers)
- {
- DAL.DataManager.DeleteSpeakers ();
- DAL.DataManager.SaveSpeakers (speakers); //SAL.MwcSiteParser.GetSpeakers ());
- }
-
- public static IList GetSpeakers ()
- {
- var ispeakers = DAL.DataManager.GetSpeakers();
- var speakers = ispeakers.ToList(); // new List(ispeakers); //TODO: figure out Exception in Android
- speakers.Sort( (s1, s2) => s1.Name.CompareTo (s2.Name));
- return speakers;
- }
-
- public static Speaker GetSpeaker (int speakerID)
- {
- return DAL.DataManager.GetSpeaker ( speakerID );
- }
-
- public static Speaker GetSpeakerWithKey (string speakerKey)
- {
- return DAL.DataManager.GetSpeakerWithKey (speakerKey);
- }
- }
-}
-
diff --git a/MWC/MWC.Core/BL/Managers/TwitterFeedManager.cs b/MWC/MWC.Core/BL/Managers/TwitterFeedManager.cs
deleted file mode 100644
index 63102b423..000000000
--- a/MWC/MWC.Core/BL/Managers/TwitterFeedManager.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-using System;
-using System.Collections.Generic;
-using MWC.SAL;
-
-namespace MWC.BL.Managers {
- public static class TwitterFeedManager {
- static object locker = new object();
-
- public static event EventHandler UpdateStarted = delegate {};
- public static event EventHandler UpdateFinished = delegate {};
-
- public static bool IsUpdating
- {
- get { return _isUpdating; }
- set { _isUpdating = value; }
- }
- private static bool _isUpdating = false;
-
- static TwitterFeedManager ()
- {}
-
- public static Tweet GetTweet(int tweetID)
- {
- return DAL.DataManager.GetTweet(tweetID);
- }
-
- public static IList GetTweets()
- {
- return new List ( DAL.DataManager.GetTweets () );
- }
-
- public static void Update()
- {
- // make this a critical section to ensure that access is serial
- lock(locker)
- {
- UpdateStarted (null, EventArgs.Empty);
-
- var _twitterParser = new TwitterParser(Constants.TwitterUrl);
-
- _isUpdating = true;
- _twitterParser.Refresh(delegate {
- var tweets = _twitterParser.AllItems;
-
- DAL.DataManager.DeleteTweets ();
- DAL.DataManager.SaveTweets (tweets);
-
- UpdateFinished (null, EventArgs.Empty);
- _isUpdating = false;
- });
- }
- }
- }
-}
\ No newline at end of file
diff --git a/MWC/MWC.Core/BL/Managers/UpdateFinishedEventArgs.cs b/MWC/MWC.Core/BL/Managers/UpdateFinishedEventArgs.cs
deleted file mode 100644
index 6d448acc2..000000000
--- a/MWC/MWC.Core/BL/Managers/UpdateFinishedEventArgs.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using System;
-
-namespace MWC
-{
- public enum UpdateType
- {
- SeedData,
- Conference,
- Exhibitors
- }
-
- ///
- /// When a data update has finished, pass back whether it succeeded or failed
- /// and also the type of data that was updated (so the calling code can do useful stuff)
- ///
- public class UpdateFinishedEventArgs : EventArgs
- {
- public bool Success {get;set;}
-
- public UpdateType UpdateType {get;set;}
-
- public UpdateFinishedEventArgs (UpdateType updateType, bool success)
- {
- this.UpdateType = updateType;
- this.Success = success;
- }
- }
-}
-
diff --git a/MWC/MWC.Core/BL/Managers/UpdateManager.cs b/MWC/MWC.Core/BL/Managers/UpdateManager.cs
deleted file mode 100644
index e700299fd..000000000
--- a/MWC/MWC.Core/BL/Managers/UpdateManager.cs
+++ /dev/null
@@ -1,184 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Xml.Serialization;
-
-namespace MWC.BL.Managers {
- ///
- /// Central point for triggering data update from server
- /// to our local SQLite db
- ///
- public static class UpdateManager {
- private static object locker = new object();
-
- public static event EventHandler UpdateStarted = delegate {};
- public static event EventHandler UpdateFinished = delegate {};
-
- public static event EventHandler UpdateExhibitorsStarted = delegate {};
- public static event EventHandler UpdateExhibitorsFinished = delegate {};
-
- ///
- /// Gets or sets a value indicating whether the data is updating.
- ///
- ///
- /// true if the data is updating; otherwise, false.
- ///
- public static bool IsUpdating
- {
- get { return isUpdating; }
- set { isUpdating = value; }
- }
- public static bool IsUpdatingExhibitors
- {
- get { return isUpdatingExhibitors; }
- set { isUpdatingExhibitors = value; }
- }
- private static bool isUpdatingExhibitors = false;
- private static bool isUpdating = false;
-
- static UpdateManager ()
- {
- }
-
- ///
- /// Console.WriteLines only emitted in DEBUG mode, so they won't occur
- /// on a real device in the Distribution version
- ///
- [System.Diagnostics.Conditional("DEBUG")]
- public static void WriteLine(string format, params object[] arg)
- {
- Console.WriteLine(format, arg);
- }
-
- public static bool HasDataAlready {
- get {
- return MWC.DL.MwcDatabase.CountTable() > 0;
- }
- }
-
- public static void UpdateFromFile(string xmlString)
- {
- WriteLine ("### Updating all data from local file");
-
- // make this a critical section to ensure that access is serial
- lock (locker) {
- isUpdating = true;
- UpdateStarted (null, EventArgs.Empty);
- var ea = new UpdateFinishedEventArgs (UpdateType.SeedData, false);
-
- var c = MWC.SAL.MWCSiteParser.DeserializeConference (xmlString);
- if (c != null) {
- if (SaveToDatabase (c)) {
- ea.Success = true;
- }
- }
- UpdateFinished (null, ea);
- isUpdating = false;
- }
- }
- ///
- /// Updates all conference data from the cloud. Sets UpdateManager.IsUpdating
- /// to true while updating. serialized, thread-safe access.
- /// (although, the webclient request is async...)
- /// 0) {
- DAL.DataManager.DeleteSpeakers ();
- DAL.DataManager.SaveSpeakers (c.Speakers);
- }
- if (c.Sessions.Count > 0) {
- DAL.DataManager.DeleteSessions ();
- DAL.DataManager.DeleteSessionSpeakers ();
- var speakers = SessionManager.GenerateKeysAndSpeakers (c.Sessions);
- DAL.DataManager.SaveSessions (c.Sessions);
- DAL.DataManager.SaveSessionSpeakers (speakers);
- }
- if (c.Exhibitors.Count > 0) {
- DAL.DataManager.DeleteExhibitors ();
- DAL.DataManager.SaveExhibitors (c.Exhibitors);
- }
- success = true;
- } catch (Exception ex) {
- WriteLine ("xxx SAVING conference to sqlite failed " + ex.Message);
- }
- return success;
- }
- static bool SaveToDatabase(List exhibitors)
- {
- bool success = false;
- try {
- WriteLine ("yyy SAVING new exhibitors data to sqlite");
- if (exhibitors.Count > 0) {
- DAL.DataManager.DeleteExhibitors ();
- DAL.DataManager.SaveExhibitors (exhibitors);
- }
- success = true;
- } catch (Exception) {
- WriteLine ("xxx SAVING exhibitors to sqlite failed");
- }
- return success;
- }
- }
-}
\ No newline at end of file
diff --git a/MWC/MWC.Core/BL/Session.cs b/MWC/MWC.Core/BL/Session.cs
deleted file mode 100644
index 8f0453795..000000000
--- a/MWC/MWC.Core/BL/Session.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Xml.Serialization;
-
-namespace MWC.BL {
- public partial class Session : Contracts.BusinessEntityBase {
-
- [XmlElement("t")]
- public string Title { get; set; }
- [XmlAttribute("st")]
- public DateTime Start { get; set; }
- [XmlAttribute("en")]
- public DateTime End { get; set; }
- [XmlAttribute("r")]
- public string Room { get; set; }
- [XmlAttribute("sn")]
- public string SpeakerNames { get; set; }
- [XmlElement("o")]
- public string Overview { get; set; }
-
- // These are ONLY POPULATED on the client-side, when a single Session is requested
- [XmlElement("sk")]
- [MWC.DL.SQLite.Ignore]
- public List SpeakerKeys { get; set; }
-
- [XmlIgnore]
- [MWC.DL.SQLite.Ignore]
- public List Speakers { get; set; }
-
- /// Only populated on the client-side, using StartTime+Title
- public string Key { get; set; }
-
- public Session ()
- {
- // seems like WP7 likes these initialized, because after deserialization of empty lists they are otherwise null
- SpeakerKeys = new List();
- Speakers = new List();
- }
- }
-}
\ No newline at end of file
diff --git a/MWC/MWC.Core/BL/SessionSpeaker.cs b/MWC/MWC.Core/BL/SessionSpeaker.cs
deleted file mode 100644
index 0ad4beb7d..000000000
--- a/MWC/MWC.Core/BL/SessionSpeaker.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-using System.Xml.Serialization;
-
-namespace MWC.BL {
- public partial class SessionSpeaker : Contracts.BusinessEntityBase {
-
- public string SessionKey { get; set; }
-
- public string SpeakerKey { get; set; }
-
- public SessionSpeaker ()
- {
- }
-
- public SessionSpeaker (string sessionKey, string speakerKey)
- {
- SessionKey = sessionKey;
- SpeakerKey = speakerKey;
- }
- }
-}
-
diff --git a/MWC/MWC.Core/BL/SessionTimeslot.cs b/MWC/MWC.Core/BL/SessionTimeslot.cs
deleted file mode 100644
index d929ab207..000000000
--- a/MWC/MWC.Core/BL/SessionTimeslot.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace MWC.BL {
- public class SessionTimeslot {
- ///
- /// Used to group sessions (inc favorites) by time, esp in a linq expression for MT.D
- ///
- public SessionTimeslot(string timeslot, IEnumerable sessions)
- {
- Timeslot = timeslot;
- Sessions = new List(sessions);
- }
- public string Timeslot { get; set; }
- public IList Sessions { get; set; }
- }
-}
diff --git a/MWC/MWC.Core/BL/Speaker.cs b/MWC/MWC.Core/BL/Speaker.cs
deleted file mode 100644
index c9a6e53aa..000000000
--- a/MWC/MWC.Core/BL/Speaker.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Xml.Serialization;
-
-namespace MWC.BL
-{
- public partial class Speaker : Contracts.BusinessEntityBase
- {
- [XmlAttribute("k")]
- public string Key { get; set; }
- [XmlAttribute("n")]
- public string Name { get; set; }
- [XmlAttribute("t")]
- public string Title { get; set; }
- [XmlAttribute("c")]
- public string Company { get; set; }
- [XmlAttribute("b")]
- public string Bio { get; set; }
- [XmlAttribute("i")]
- public string ImageUrl { get; set; }
-
- // These are ONLY POPULATED on the client-side, when a single Speaker is requested
- [MWC.DL.SQLite.Ignore]
- public List SessionKeys { get; set; }
-
- [XmlIgnore]
- [MWC.DL.SQLite.Ignore]
- public List Sessions { get; set; }
-
- public Speaker ()
- {
- }
-
- public string Index {
- get {
- return Name.Length == 0 ? "A" : Name[0].ToString().ToUpper();
- }
- }
- }
-}
-
diff --git a/MWC/MWC.Core/Constants.cs b/MWC/MWC.Core/Constants.cs
deleted file mode 100644
index 78cdc7ff4..000000000
--- a/MWC/MWC.Core/Constants.cs
+++ /dev/null
@@ -1,42 +0,0 @@
-using System;
-using System.Collections.Generic;
-
-namespace MWC {
- public class Constants {
-
- public Constants ()
- {
- }
-
- public static DateTime StartDateMin = new DateTime ( 2012, 02, 27, 0, 0, 0 );
- public static DateTime EndDateMax = new DateTime ( 2012, 03, 1, 23, 59, 59 );
-
- public const string NewsBaseUrl = "news.google.com"; // for Reachability test
- public const string NewsUrl = "http://news.google.com/news?q=mobile%20world%20congress&output=rss";
-
- public const string TwitterUrl = "https://api.twitter.com/1.1/search/tweets.json?q=%40mobileworldlive&show-user=true&count=40&result-type=recent";
- public const string OAuthUrl = "https://api.twitter.com/oauth2/token";
- public const string OAuthConsumerKey = "onoOUsBbjVWc8msLyuRJQ";
- public const string OAuthConsumerSecret = "Vxh0zMFRAWp2LbkwfDNvUKU2dQhaVgFFv3M04gDKFE";
-
- public const string ConferenceDataBaseUrl = "mwc.xamarin.com";
- public const string ConferenceDataUrl = "http://docs.xamarin.com/guides/cross-platform/application_fundamentals/building_cross_platform_applications/case_study-mwc/Resources/conference.xml";
- public const string ExhibitorDataUrl = "http://docs.xamarin.com/guides/cross-platform/application_fundamentals/building_cross_platform_applications/case_study-mwc/Resources/exhibitors.xml";
-
- public const float MapPinLatitude = 41.374377f;
- public const float MapPinLongitude = 2.152226f;
- public const string MapPinTitle = "Mobile World Congress 2012";
- public const string MapPinSubtitle = "Fira de Barcelona";
-
- public const string AboutUrlLinkedIn = "http://www.linkedin.com/company/xamarin";
- public const string AboutUrlStackOverflow = "http://stackoverflow.com/questions/tagged/monotouch";
- public const string AboutUrlTwitter = "https://twitter.com/#!/xamarinhq";
- public const string AboutUrlYouTube = "http://www.youtube.com/xamarinhq";
- public const string AboutUrlFacebook = "http://www.facebook.com/pages/Xamarin/283148898401104";
- public const string AboutUrlBlogRss = "http://blog.xamarin.com/feed/";
- public const string AboutMailto = "hello@xamarin.com";
- public const string AboutTwitter = "@xamarinhq";
-
- public const string AboutText = @"Xamarin was founded in 2011 with the mission to make it fast, easy and fun to build great mobile apps. Xamarin’s products are used by individual developers and companies, including VMware, Target, Rdio, and Medtronic, to simplify creation and operation of high-performance, cross-platform mobile consumer and corporate applications, targeting phones and tablets running iOS, Android and Windows. For more information, visit http://xamarin.com or email hello@xamarin.com. To download the code for this app go to http://mwc.xamarin.com.";
- }
-}
\ No newline at end of file
diff --git a/MWC/MWC.Core/DAL/DataManager.cs b/MWC/MWC.Core/DAL/DataManager.cs
deleted file mode 100644
index 335f469e3..000000000
--- a/MWC/MWC.Core/DAL/DataManager.cs
+++ /dev/null
@@ -1,246 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using MWC.BL;
-
-namespace MWC.DAL {
- ///
- /// [abstracts fromt the underlying data source(s)]
- /// [if multiple data sources, can agreggate/etc without BL knowing]
- /// [superflous if only one data source]
- ///
- public static class DataManager {
- #region Session
-
- public static IEnumerable GetSessions ()
- {
- return DL.MwcDatabase.GetItems ();
- }
-
- public static Session GetSession (int id)
- {
- //return DL.MwcDatabase.GetItem (id);
- return DL.MwcDatabase.GetSession(id);
- }
-
- public static Session GetSessionWithKey (string key)
- {
- return DL.MwcDatabase.GetSessionWithKey (key);
- }
-
- public static int SaveSession (Session item)
- {
- return DL.MwcDatabase.SaveItem (item);
- }
-
- public static void SaveSessions (IEnumerable items)
- {
- DL.MwcDatabase.SaveItems (items);
- }
-
- public static void SaveSessionSpeakers (IEnumerable items)
- {
- DL.MwcDatabase.SaveItems (items);
- }
-
- public static int DeleteSession(int id)
- {
- return DL.MwcDatabase.DeleteItem (id);
- }
-
- public static void DeleteSessions()
- {
- DL.MwcDatabase.ClearTable();
- }
-
- public static void DeleteSessionSpeakers()
- {
- DL.MwcDatabase.ClearTable();
- }
-
- ///
- /// Gets the sessions for a given day (day 1 - 4).
- ///
- ///
- /// [1 - 4] number of the day in the conference.
- /// Converted to zero-based in the method
- ///
- public static IEnumerable GetSessions (int day)
- {
- DateTime dayMin = Constants.StartDateMin;
-
- // increment for days
- dayMin = dayMin.AddDays (day - 1);
- DateTime dayMax = dayMin.AddHours (24);
-
- return DL.MwcDatabase.GetSessionsByStartDate (dayMin, dayMax);
- }
-
- #endregion
-
- #region Speaker
-
- public static IEnumerable GetSpeakers ()
- {
- return DL.MwcDatabase.GetItems ();
- }
-
- public static Speaker GetSpeaker (int id)
- {
- //return DL.MwcDatabase.GetItem (id);
- return DL.MwcDatabase.GetSpeaker(id);
- }
-
- public static Speaker GetSpeakerWithKey (string key)
- {
- return DL.MwcDatabase.GetSpeakerWithKey (key);
- }
-
- public static int SaveSpeaker (Speaker item)
- {
- return DL.MwcDatabase.SaveItem (item);
- }
-
- public static void SaveSpeakers (IEnumerable items)
- {
- DL.MwcDatabase.SaveItems (items);
- }
-
- public static int DeleteSpeaker(int id)
- {
- return DL.MwcDatabase.DeleteItem (id);
- }
-
- public static void DeleteSpeakers()
- {
- DL.MwcDatabase.ClearTable();
- }
-
- #endregion
-
- #region Exhibitor
-
- public static IEnumerable GetExhibitors ()
- {
- return DL.MwcDatabase.GetItems ().OrderBy (exhibitor => exhibitor.Name);
- }
-
- public static Exhibitor GetExhibitor (int id)
- {
- //return DL.MwcDatabase.GetItem (id);
- return DL.MwcDatabase.GetExhibitor(id);
- }
-
- public static Exhibitor GetExhibitorWithName (string name)
- {
- return DL.MwcDatabase.GetExhibitorWithName (name);
- }
-
- public static int SaveExhibitor (Exhibitor item)
- {
- return DL.MwcDatabase.SaveItem (item);
- }
-
- public static void SaveExhibitors (IEnumerable items)
- {
- DL.MwcDatabase.SaveItems (items);
- }
-
- public static int DeleteExhibitor(int id)
- {
- return DL.MwcDatabase.DeleteItem (id);
- }
-
- public static void DeleteExhibitors()
- {
- DL.MwcDatabase.ClearTable();
- }
-
- #endregion
-
- #region Favorites
-
- // API for managing favorites is via SessionName
- // since Session.ID might not survive data updates
- // (to be confirmed, adapt if required)
-
- public static int SaveFavorite (Favorite favorite)
- {
- //var fav = new Favorite { SessionKey = sessionKey };
- return DL.MwcDatabase.SaveItem(favorite);
- }
-
- public static IEnumerable GetFavorites ()
- {
- return DL.MwcDatabase.GetItems ();
- }
-
- public static bool GetIsFavorite (string sessionKey)
- {
- var fav = (from f in GetFavorites()
- where f.SessionKey == sessionKey
- select f).FirstOrDefault();
-
- return fav != null;
- }
-
- static int GetFavoriteID(string sessionKey)
- {
- var fav = (from f in GetFavorites()
- where f.SessionKey == sessionKey
- select f).FirstOrDefault();
-
- return fav != null?fav.ID:-1;
- }
-
- public static int DeleteFavorite(string sessionKey)
- {
- int id = GetFavoriteID(sessionKey);
- if (id >= 0)
- return DL.MwcDatabase.DeleteFavorite (id); // HACK: was DeleteItem
- else
- return -1;
- }
- #endregion
-
- #region Tweets
- public static void SaveTweets (IEnumerable items)
- {
- DL.MwcDatabase.SaveItems (items);
- }
- public static Tweet GetTweet(int id)
- {
- //return DL.MwcDatabase.GetItem (id);
- return DL.MwcDatabase.GetTweet(id);
- }
- public static IEnumerable GetTweets ()
- {
- return DL.MwcDatabase.GetItems ();
- }
- public static void DeleteTweets()
- {
- DL.MwcDatabase.ClearTable();
- }
- #endregion
-
- #region News
- public static void SaveNews (IEnumerable items)
- {
- DL.MwcDatabase.SaveItems (items);
- }
- public static RSSEntry GetNews(int id)
- {
- //return DL.MwcDatabase.GetItem (id);
- return DL.MwcDatabase.GetNews(id);
- }
- public static IEnumerable GetNews ()
- {
- return DL.MwcDatabase.GetItems ().OrderByDescending (item => item.Published);
- }
- public static void DeleteNews()
- {
- DL.MwcDatabase.ClearTable();
- }
- #endregion
- }
-}
\ No newline at end of file
diff --git a/MWC/MWC.Core/DL/MwcDatabase.cs b/MWC/MWC.Core/DL/MwcDatabase.cs
deleted file mode 100644
index 5471be0b9..000000000
--- a/MWC/MWC.Core/DL/MwcDatabase.cs
+++ /dev/null
@@ -1,308 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using MWC.BL;
-using MWC.DL.SQLite;
-using System.IO;
-
-namespace MWC.DL {
- ///
- /// TaskDatabase builds on SQLite.Net and represents a specific database, in our case, the MWC DB.
- /// It contains methods for retreival and persistance as well as db creation, all based on the
- /// underlying ORM.
- ///
- public class MwcDatabase : SQLiteConnection {
- protected static MwcDatabase me = null;
- protected static string dbLocation;
-
- static object locker = new object ();
-
- ///
- /// Initializes a new instance of the MwcDatabase.
- /// if the database doesn't exist, it will create the database and all the tables.
- ///
- ///
- /// Path.
- ///
- protected MwcDatabase (string path) : base (path)
- {
- // create the tables
- CreateTable ();
- CreateTable ();
- CreateTable ();
- CreateTable ();
-
- // FK
- CreateTable ();
-
- // these are really for caches
- CreateTable ();
- CreateTable ();
- }
-
- static MwcDatabase ()
- {
- // set the db location
- dbLocation = DatabaseFilePath;
-
- // instantiate a new db
- me = new MwcDatabase(dbLocation);
- }
-
- public static string DatabaseFilePath {
- get {
-#if SILVERLIGHT
- var path = "MwcDB.db3";
-#else
-
-#if __ANDROID__
- string libraryPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); ;
-#else
- // we need to put in /Library/ on iOS5.1 to meet Apple's iCloud terms
- // (they don't want non-user-generated data in Documents)
- string documentsPath = Environment.GetFolderPath (Environment.SpecialFolder.Personal); // Documents folder
- string libraryPath = Path.Combine (documentsPath, "../Library/");
-#endif
- var path = Path.Combine (libraryPath, "MwcDB.db3");
-#endif
- return path;
-}
- }
-
- public static IEnumerable GetItems () where T : BL.Contracts.IBusinessEntity, new ()
- {
- lock (locker) {
- return (from i in me.Table () select i).ToList ();
- }
- }
-
- public static T GetItem (int id) where T : BL.Contracts.IBusinessEntity, new ()
- {
- lock (locker) {
-
- // ---
- //return (from i in me.Table ()
- // where i.ID == id
- // select i).FirstOrDefault ();
-
- // +++ To properly use Generic version and eliminate NotSupportedException
- // ("Cannot compile: " + expr.NodeType.ToString ()); in SQLite.cs
- return me.Table().FirstOrDefault(x => x.ID == id);
- }
- }
-
- public static int SaveItem (T item) where T : BL.Contracts.IBusinessEntity
- {
- lock (locker) {
- if (item.ID != 0) {
- me.Update (item);
- return item.ID;
- } else {
- return me.Insert (item);
- }
- }
- }
-
- public static void SaveItems (IEnumerable items) where T : BL.Contracts.IBusinessEntity
- {
- lock (locker) {
- me.BeginTransaction ();
-
- foreach (T item in items) {
- SaveItem (item);
- }
-
- me.Commit ();
- }
- }
-
- // HACK: fixes UNHANDLED EXCEPTION: System.NotSupportedException: Cannot store type: MWC.BL.Favorite
- public static int DeleteFavorite(int id)
- {
- lock (locker) {
- return me.Delete(new Favorite() { ID = id });
- }
- }
-
- public static int DeleteItem(int id) where T : BL.Contracts.IBusinessEntity, new ()
- {
- lock (locker) {
- return me.Delete (new T () { ID = id });
- }
- }
-
- public static void ClearTable() where T : BL.Contracts.IBusinessEntity, new ()
- {
- lock (locker) {
- me.Execute (string.Format ("delete from \"{0}\"", typeof (T).Name));
- }
- }
-
- // helper for checking if database has been populated
- public static int CountTable() where T : BL.Contracts.IBusinessEntity, new ()
- {
- lock (locker) {
- string sql = string.Format ("select count (*) from \"{0}\"", typeof (T).Name);
- var c = me.CreateCommand (sql, new object[0]);
- return c.ExecuteScalar();
- }
- }
-
-// public static IEnumerable Query(string query)
-// {
-// return _me.Query.
-// }
-
- public static IEnumerable GetSessionsByStartDate(DateTime dateMin, DateTime dateMax)
- {
- lock (locker) {
- return (from i in me.Table ()
- where i.Start >= dateMin && i.Start <= dateMax
- select i).ToList ();
- }
- }
-
-
- /*
- * the following two queries are currently required because the Generic versions throw
- * an exception on this line in SQLite.cs (Android ONLY)
- * 1565: throw new NotSupportedException ("Cannot compile: " + expr.NodeType.ToString ());
- *
- * ALSO now I've added some additional processing to the Session and Speaker to 'join' them
- */
- ///
- /// Gets the Session AND linked Speakers
- ///
- public static Session GetSession (int id)
- {
- lock (locker) {
- Session session = (from s in me.Table ()
- where s.ID == id
- select s).FirstOrDefault ();
- try{ // bug occurs in simulator...???
- session.SpeakerKeys = (from ss in me.Table ()
- where ss.SessionKey == session.Key
- select ss.SpeakerKey).ToList();
- var speakers = GetItems();
-
- var speakerInSession = (from sp in speakers
- where session.SpeakerKeys.Contains (sp.Key)
- select sp).ToList ();
-
- session.Speakers = speakerInSession;
- } catch {}
- return session;
- }
- }
- ///
- /// Gets the Session AND linked Speakers
- ///
- public static Session GetSessionWithKey (string key)
- {
- lock (locker) {
- Session session = (from s in me.Table ()
- where s.Key == key
- select s).FirstOrDefault ();
-
- session.SpeakerKeys = (from ss in me.Table ()
- where ss.SessionKey == session.Key
- select ss.SpeakerKey).ToList();
- var speakers = GetItems();
-
- var speakersInSession = (from sp in speakers
- where session.SpeakerKeys.Contains (sp.Key)
- select sp).ToList ();
-
- session.Speakers = speakersInSession;
-
- return session;
- }
- }
- ///
- /// Gets the Speaker AND linked Sessions
- ///
- public static Speaker GetSpeaker(int id)
- {
- lock (locker) {
- Speaker speaker = (from s in me.Table ()
- where s.ID == id
- select s).FirstOrDefault ();
-
- var keys = (from ss in me.Table ()
- where ss.SpeakerKey == speaker.Key
- select ss).ToList();
- // HACK: gets around "Default constructor not found for type System.String" error
- speaker.SessionKeys = keys.Select (x => x.SpeakerKey).ToList ();
-
- var sessions = GetItems();
-
- var sessionsForSpeaker = (from se in sessions
- where speaker.SessionKeys.Contains (se.Key)
- select se).ToList ();
-
- speaker.Sessions = sessionsForSpeaker;
-
- return speaker;
- }
- }
- ///
- /// Gets the Speaker AND linked Sessions
- ///
- public static Speaker GetSpeakerWithKey (string key)
- {
- lock (locker) {
- Speaker speaker = (from s in me.Table ()
- where s.Key == key
- select s).FirstOrDefault ();
-
- speaker.SessionKeys = (from ss in me.Table ()
- where ss.SpeakerKey == speaker.Key
- select ss.SessionKey).ToList();
- var sessions = GetItems();
-
- var sessionsForSpeaker = (from se in sessions
- where speaker.SessionKeys.Contains (se.Key)
- select se).ToList ();
-
- speaker.Sessions = sessionsForSpeaker;
-
- return speaker;
- }
- }
- public static Exhibitor GetExhibitor(int id)
- {
- lock (locker) {
- //return DL.MwcDatabase.GetItem (id);
- return (from s in me.Table ()
- where s.ID == id
- select s).FirstOrDefault ();
- }
- }
- public static Exhibitor GetExhibitorWithName (string name)
- {
- lock (locker) {
- return (from s in me.Table ()
- where s.Name == name
- select s).FirstOrDefault ();
- }
- }
- public static Tweet GetTweet(int id)
- {
- lock (locker) {
- //return DL.MwcDatabase.GetItem (id);
- return (from s in me.Table ()
- where s.ID == id
- select s).FirstOrDefault ();
- }
- }
- public static RSSEntry GetNews(int id)
- {
- lock (locker) {
- //return DL.MwcDatabase.GetItem (id);
- return (from s in me.Table ()
- where s.ID == id
- select s).FirstOrDefault ();
- }
- }
- }
-}
\ No newline at end of file
diff --git a/MWC/MWC.Core/DL/SQLite.cs b/MWC/MWC.Core/DL/SQLite.cs
deleted file mode 100644
index d8cab528b..000000000
--- a/MWC/MWC.Core/DL/SQLite.cs
+++ /dev/null
@@ -1,2666 +0,0 @@
-//
-// Copyright (c) 2009-2012 Krueger Systems, Inc.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-//
-#if WINDOWS_PHONE
-#define USE_CSHARP_SQLITE
-#endif
-
-using System;
-using System.Diagnostics;
-using System.Runtime.InteropServices;
-using System.Collections.Generic;
-using System.Reflection;
-using System.Linq;
-using System.Linq.Expressions;
-using System.Threading;
-
-#if USE_CSHARP_SQLITE
-using Community.CsharpSqlite;
-using Sqlite3DatabaseHandle = Community.CsharpSqlite.Sqlite3.sqlite3;
-using Sqlite3Statement = Community.CsharpSqlite.Sqlite3.Vdbe;
-#else
-using Sqlite3DatabaseHandle = System.IntPtr;
-using Sqlite3Statement = System.IntPtr;
-#endif
-
-namespace MWC.DL.SQLite {
- public class SQLiteException : System.Exception {
- public SQLite3.Result Result { get; private set; }
-
- protected SQLiteException(SQLite3.Result r, string message)
- : base(message)
- {
- Result = r;
- }
-
- public static SQLiteException New(SQLite3.Result r, string message)
- {
- return new SQLiteException(r, message);
- }
- }
-
- [Flags]
- public enum SQLiteOpenFlags {
- ReadOnly = 1, ReadWrite = 2, Create = 4,
- NoMutex = 0x8000, FullMutex = 0x10000,
- SharedCache = 0x20000, PrivateCache = 0x40000,
- ProtectionComplete = 0x00100000,
- ProtectionCompleteUnlessOpen = 0x00200000,
- ProtectionCompleteUntilFirstUserAuthentication = 0x00300000,
- ProtectionNone = 0x00400000
- }
-
- ///
- /// Represents an open connection to a SQLite database.
- ///
- public class SQLiteConnection : IDisposable {
- private bool _open;
- private TimeSpan _busyTimeout;
- private Dictionary _mappings = null;
- private Dictionary _tables = null;
- private System.Diagnostics.Stopwatch _sw;
- private long _elapsedMilliseconds = 0;
-
- private int _trasactionDepth = 0;
- private Random _rand = new Random();
-
- public Sqlite3DatabaseHandle Handle { get; private set; }
-#if USE_CSHARP_SQLITE
- internal static readonly Sqlite3DatabaseHandle NullHandle = null;
-#else
- internal static readonly Sqlite3DatabaseHandle NullHandle = IntPtr.Zero;
-#endif
-
- public string DatabasePath { get; private set; }
-
- public bool TimeExecution { get; set; }
-
- public bool Trace { get; set; }
-
- public bool StoreDateTimeAsTicks { get; private set; }
-
- ///
- /// Constructs a new SQLiteConnection and opens a SQLite database specified by databasePath.
- ///
- ///
- /// Specifies the path to the database file.
- ///
- ///
- /// Specifies whether to store DateTime properties as ticks (true) or strings (false). You
- /// absolutely do want to store them as Ticks in all new projects. The default of false is
- /// only here for backwards compatibility. There is a *significant* speed advantage, with no
- /// down sides, when setting storeDateTimeAsTicks = true.
- ///
- public SQLiteConnection(string databasePath, bool storeDateTimeAsTicks = false)
- {
- DatabasePath = databasePath;
- Sqlite3DatabaseHandle handle;
- var r = SQLite3.Open(DatabasePath, out handle);
- Handle = handle;
- if (r != SQLite3.Result.OK) {
- throw SQLiteException.New(r, String.Format("Could not open database file: {0} ({1})", DatabasePath, r));
- }
- _open = true;
-
- StoreDateTimeAsTicks = storeDateTimeAsTicks;
-
- BusyTimeout = TimeSpan.FromSeconds(0.1);
- }
-
- ///
- /// Constructs a new SQLiteConnection and opens a SQLite database specified by databasePath.
- ///
- ///
- /// Specifies the path to the database file.
- ///
- ///
- /// Specifies whether to store DateTime properties as ticks (true) or strings (false). You
- /// absolutely do want to store them as Ticks in all new projects. The default of false is
- /// only here for backwards compatibility. There is a *significant* speed advantage, with no
- /// down sides, when setting storeDateTimeAsTicks = true.
- ///
- public SQLiteConnection(string databasePath, SQLiteOpenFlags openFlags, bool storeDateTimeAsTicks = false)
- {
- DatabasePath = databasePath;
- Sqlite3DatabaseHandle handle;
-
-#if SILVERLIGHT
- var r = SQLite3.Open (databasePath, out handle, (int)openFlags, IntPtr.Zero);
-#else
- // open using the byte[]
- // in the case where the path may include Unicode
- // force open to using UTF-8 using sqlite3_open_v2
- byte[] databasePathAsBytes;
- int databasePathLength;
-
- databasePathLength = System.Text.Encoding.UTF8.GetByteCount(DatabasePath);
- databasePathAsBytes = new byte[databasePathLength + 1];
- databasePathLength = System.Text.Encoding.UTF8.GetBytes(DatabasePath, 0, DatabasePath.Length, databasePathAsBytes, 0);
-
- var r = SQLite3.Open(databasePathAsBytes, out handle, (int)openFlags, IntPtr.Zero);
-#endif
-
- Handle = handle;
- if (r != SQLite3.Result.OK) {
- throw SQLiteException.New(r, String.Format("Could not open database file: {0} ({1})", DatabasePath, r));
- }
- _open = true;
-
- StoreDateTimeAsTicks = storeDateTimeAsTicks;
-
- BusyTimeout = TimeSpan.FromSeconds(0.1);
- }
-
- static SQLiteConnection()
- {
- if (_preserveDuringLinkMagic) {
- var ti = new TableInfo();
- ti.name = "magic";
- }
- }
-
- ///
- /// Used to list some code that we want the MonoTouch linker
- /// to see, but that we never want to actually execute.
- ///
- static bool _preserveDuringLinkMagic = false;
-
- ///
- /// Sets a busy handler to sleep the specified amount of time when a table is locked.
- /// The handler will sleep multiple times until a total time of has accumulated.
- ///
- public TimeSpan BusyTimeout
- {
- get { return _busyTimeout; }
- set
- {
- _busyTimeout = value;
- if (Handle != NullHandle) {
- SQLite3.BusyTimeout(Handle, (int)_busyTimeout.TotalMilliseconds);
- }
- }
- }
-
- ///
- /// Returns the mappings from types to tables that the connection
- /// currently understands.
- ///
- public IEnumerable TableMappings
- {
- get
- {
- if (_tables == null) {
- return Enumerable.Empty();
- } else {
- return _tables.Values;
- }
- }
- }
-
- ///
- /// Retrieves the mapping that is automatically generated for the given type.
- ///
- ///
- /// The type whose mapping to the database is returned.
- ///
- ///
- /// The mapping represents the schema of the columns of the database and contains
- /// methods to set and get properties of objects.
- ///
- public TableMapping GetMapping(Type type)
- {
- if (_mappings == null) {
- _mappings = new Dictionary();
- }
- TableMapping map;
- if (!_mappings.TryGetValue(type.FullName, out map)) {
- map = new TableMapping(type);
- _mappings[type.FullName] = map;
- }
- return map;
- }
-
- ///
- /// Retrieves the mapping that is automatically generated for the given type.
- ///
- ///
- /// The mapping represents the schema of the columns of the database and contains
- /// methods to set and get properties of objects.
- ///
- public TableMapping GetMapping()
- {
- return GetMapping(typeof(T));
- }
-
- private struct IndexedColumn {
- public int Order;
- public string ColumnName;
- }
-
- private struct IndexInfo {
- public string IndexName;
- public string TableName;
- public bool Unique;
- public List Columns;
- }
-
- ///
- /// Executes a "drop table" on the database. This is non-recoverable.
- ///
- public int DropTable()
- {
- var map = GetMapping(typeof(T));
-
- var query = string.Format("drop table if exists \"{0}\"", map.TableName);
-
- return Execute(query);
- }
-
- ///
- /// Executes a "create table if not exists" on the database. It also
- /// creates any specified indexes on the columns of the table. It uses
- /// a schema automatically generated from the specified type. You can
- /// later access this schema by calling GetMapping.
- ///
- ///
- /// The number of entries added to the database schema.
- ///
- public int CreateTable()
- {
- return CreateTable(typeof(T));
- }
-
- ///
- /// Executes a "create table if not exists" on the database. It also
- /// creates any specified indexes on the columns of the table. It uses
- /// a schema automatically generated from the specified type. You can
- /// later access this schema by calling GetMapping.
- ///
- /// Type to reflect to a database table.
- ///
- /// The number of entries added to the database schema.
- ///
- public int CreateTable(Type ty)
- {
- if (_tables == null) {
- _tables = new Dictionary();
- }
- TableMapping map;
- if (!_tables.TryGetValue(ty.FullName, out map)) {
- map = GetMapping(ty);
- _tables.Add(ty.FullName, map);
- }
- var query = "create table if not exists \"" + map.TableName + "\"(\n";
-
- var decls = map.Columns.Select(p => Orm.SqlDecl(p, StoreDateTimeAsTicks));
- var decl = string.Join(",\n", decls.ToArray());
- query += decl;
- query += ")";
-
- var count = Execute(query);
-
- if (count == 0) { //Possible bug: This always seems to return 0?
- // Table already exists, migrate it
- MigrateTable(map);
- }
-
- var indexes = new Dictionary();
- foreach (var c in map.Columns) {
- foreach (var i in c.Indices) {
- var iname = i.Name ?? map.TableName + "_" + c.Name;
- IndexInfo iinfo;
- if (!indexes.TryGetValue(iname, out iinfo)) {
- iinfo = new IndexInfo {
- IndexName = iname,
- TableName = map.TableName,
- Unique = i.Unique,
- Columns = new List()
- };
- indexes.Add(iname, iinfo);
- }
-
- if (i.Unique != iinfo.Unique)
- throw new Exception("All the columns in an index must have the same value for their Unique property");
-
- iinfo.Columns.Add(new IndexedColumn {
- Order = i.Order,
- ColumnName = c.Name
- });
- }
- }
-
- foreach (var indexName in indexes.Keys) {
- var index = indexes[indexName];
- const string sqlFormat = "create {3} index if not exists \"{0}\" on \"{1}\"(\"{2}\")";
- var columns = String.Join("\",\"", index.Columns.OrderBy(i => i.Order).Select(i => i.ColumnName).ToArray());
- var sql = String.Format(sqlFormat, indexName, index.TableName, columns, index.Unique ? "unique" : "");
- count += Execute(sql);
- }
-
- return count;
- }
-
- public class TableInfo {
- public int cid { get; set; }
-
- public string name { get; set; }
-
- public string type { get; set; }
-
- public int notnull { get; set; }
-
- public string dflt_value { get; set; }
-
- public int pk { get; set; }
- }
-
- void MigrateTable(TableMapping map)
- {
- var query = "pragma table_info(\"" + map.TableName + "\")";
-
- var existingCols = Query(query);
-
- var toBeAdded = new List();
-
- foreach (var p in map.Columns) {
- var found = false;
- foreach (var c in existingCols) {
- found = p.Name == c.name;
- if (found)
- break;
- }
- if (!found) {
- toBeAdded.Add(p);
- }
- }
-
- foreach (var p in toBeAdded) {
- var addCol = "alter table \"" + map.TableName + "\" add column " + Orm.SqlDecl(p, StoreDateTimeAsTicks);
- Execute(addCol);
- }
- }
-
- ///
- /// Creates a new SQLiteCommand. Can be overridden to provide a sub-class.
- ///
- ///
- protected virtual SQLiteCommand NewCommand()
- {
- return new SQLiteCommand(this);
- }
-
- ///
- /// Creates a new SQLiteCommand given the command text with arguments. Place a '?'
- /// in the command text for each of the arguments.
- ///
- ///
- /// The fully escaped SQL.
- ///
- ///
- /// Arguments to substitute for the occurences of '?' in the command text.
- ///
- ///
- /// A
- ///
- public SQLiteCommand CreateCommand(string cmdText, params object[] ps)
- {
- if (!_open) {
- throw SQLiteException.New(SQLite3.Result.Error, "Cannot create commands from unopened database");
- } else {
- var cmd = NewCommand();
- cmd.CommandText = cmdText;
- foreach (var o in ps) {
- cmd.Bind(o);
- }
- return cmd;
- }
- }
-
- ///
- /// Creates a SQLiteCommand given the command text (SQL) with arguments. Place a '?'
- /// in the command text for each of the arguments and then executes that command.
- /// Use this method instead of Query when you don't expect rows back. Such cases include
- /// INSERTs, UPDATEs, and DELETEs.
- /// You can set the Trace or TimeExecution properties of the connection
- /// to profile execution.
- ///
- ///
- /// The fully escaped SQL.
- ///
- ///
- /// Arguments to substitute for the occurences of '?' in the query.
- ///
- ///
- /// The number of rows modified in the database as a result of this execution.
- ///
- public int Execute(string query, params object[] args)
- {
- var cmd = CreateCommand(query, args);
-
- if (TimeExecution) {
- if (_sw == null) {
- _sw = new System.Diagnostics.Stopwatch();
- }
- _sw.Reset();
- _sw.Start();
- }
-
- var r = cmd.ExecuteNonQuery();
-
- if (TimeExecution) {
- _sw.Stop();
- _elapsedMilliseconds += _sw.ElapsedMilliseconds;
- Debug.WriteLine(string.Format("Finished in {0} ms ({1:0.0} s total)", _sw.ElapsedMilliseconds, _elapsedMilliseconds / 1000.0));
- }
-
- return r;
- }
-
- public T ExecuteScalar(string query, params object[] args)
- {
- var cmd = CreateCommand(query, args);
-
- if (TimeExecution) {
- if (_sw == null) {
- _sw = new System.Diagnostics.Stopwatch();
- }
- _sw.Reset();
- _sw.Start();
- }
-
- var r = cmd.ExecuteScalar();
-
- if (TimeExecution) {
- _sw.Stop();
- _elapsedMilliseconds += _sw.ElapsedMilliseconds;
- Debug.WriteLine(string.Format("Finished in {0} ms ({1:0.0} s total)", _sw.ElapsedMilliseconds, _elapsedMilliseconds / 1000.0));
- }
-
- return r;
- }
-
- ///
- /// Creates a SQLiteCommand given the command text (SQL) with arguments. Place a '?'
- /// in the command text for each of the arguments and then executes that command.
- /// It returns each row of the result using the mapping automatically generated for
- /// the given type.
- ///
- ///
- /// The fully escaped SQL.
- ///
- ///
- /// Arguments to substitute for the occurences of '?' in the query.
- ///
- ///
- /// An enumerable with one result for each row returned by the query.
- ///
- public List Query(string query, params object[] args) where T : new()
- {
- var cmd = CreateCommand(query, args);
- return cmd.ExecuteQuery();
- }
-
- ///
- /// Creates a SQLiteCommand given the command text (SQL) with arguments. Place a '?'
- /// in the command text for each of the arguments and then executes that command.
- /// It returns each row of the result using the mapping automatically generated for
- /// the given type.
- ///
- ///
- /// The fully escaped SQL.
- ///
- ///
- /// Arguments to substitute for the occurences of '?' in the query.
- ///
- ///
- /// An enumerable with one result for each row returned by the query.
- /// The enumerator will call sqlite3_step on each call to MoveNext, so the database
- /// connection must remain open for the lifetime of the enumerator.
- ///
- public IEnumerable DeferredQuery(string query, params object[] args) where T : new()
- {
- var cmd = CreateCommand(query, args);
- return cmd.ExecuteDeferredQuery();
- }
-
- ///
- /// Creates a SQLiteCommand given the command text (SQL) with arguments. Place a '?'
- /// in the command text for each of the arguments and then executes that command.
- /// It returns each row of the result using the specified mapping. This function is
- /// only used by libraries in order to query the database via introspection. It is
- /// normally not used.
- ///
- ///
- /// A to use to convert the resulting rows
- /// into objects.
- ///
- ///
- /// The fully escaped SQL.
- ///
- ///
- /// Arguments to substitute for the occurences of '?' in the query.
- ///
- ///
- /// An enumerable with one result for each row returned by the query.
- ///
- public List Query(TableMapping map, string query, params object[] args)
- {
- var cmd = CreateCommand(query, args);
- return cmd.ExecuteQuery(map);
- }
-
- ///
- /// Creates a SQLiteCommand given the command text (SQL) with arguments. Place a '?'
- /// in the command text for each of the arguments and then executes that command.
- /// It returns each row of the result using the specified mapping. This function is
- /// only used by libraries in order to query the database via introspection. It is
- /// normally not used.
- ///
- ///
- /// A to use to convert the resulting rows
- /// into objects.
- ///
- ///
- /// The fully escaped SQL.
- ///
- ///
- /// Arguments to substitute for the occurences of '?' in the query.
- ///
- ///
- /// An enumerable with one result for each row returned by the query.
- /// The enumerator will call sqlite3_step on each call to MoveNext, so the database
- /// connection must remain open for the lifetime of the enumerator.
- ///
- public IEnumerable DeferredQuery(TableMapping map, string query, params object[] args)
- {
- var cmd = CreateCommand(query, args);
- return cmd.ExecuteDeferredQuery(map);
- }
-
- ///
- /// Returns a queryable interface to the table represented by the given type.
- ///
- ///
- /// A queryable object that is able to translate Where, OrderBy, and Take
- /// queries into native SQL.
- ///
- public TableQuery Table() where T : new()
- {
- return new TableQuery(this);
- }
-
- ///
- /// Attempts to retrieve an object with the given primary key from the table
- /// associated with the specified type. Use of this method requires that
- /// the given type have a designated PrimaryKey (using the PrimaryKeyAttribute).
- ///
- ///
- /// The primary key.
- ///
- ///
- /// The object with the given primary key. Throws a not found exception
- /// if the object is not found.
- ///
- public T Get(object pk) where T : new()
- {
- var map = GetMapping(typeof(T));
- return Query(map.GetByPrimaryKeySql, pk).First();
- }
-
- ///
- /// Attempts to retrieve the first object that matches the predicate from the table
- /// associated with the specified type.
- ///
- ///
- /// A predicate for which object to find.
- ///
- ///
- /// The object that matches the given predicate. Throws a not found exception
- /// if the object is not found.
- ///
- public T Get(Expression> predicate) where T : new()
- {
- return Table().Where(predicate).First();
- }
-
- ///
- /// Attempts to retrieve an object with the given primary key from the table
- /// associated with the specified type. Use of this method requires that
- /// the given type have a designated PrimaryKey (using the PrimaryKeyAttribute).
- ///
- ///
- /// The primary key.
- ///
- ///
- /// The object with the given primary key or null
- /// if the object is not found.
- ///
- public T Find(object pk) where T : new()
- {
- var map = GetMapping(typeof(T));
- return Query(map.GetByPrimaryKeySql, pk).FirstOrDefault();
- }
-
- ///
- /// Attempts to retrieve an object with the given primary key from the table
- /// associated with the specified type. Use of this method requires that
- /// the given type have a designated PrimaryKey (using the PrimaryKeyAttribute).
- ///
- ///
- /// The primary key.
- ///
- ///
- /// The TableMapping used to identify the object type.
- ///
- ///
- /// The object with the given primary key or null
- /// if the object is not found.
- ///
- public object Find(object pk, TableMapping map)
- {
- return Query(map, map.GetByPrimaryKeySql, pk).FirstOrDefault();
- }
-
- ///
- /// Attempts to retrieve the first object that matches the predicate from the table
- /// associated with the specified type.
- ///
- ///
- /// A predicate for which object to find.
- ///
- ///
- /// The object that matches the given predicate or null
- /// if the object is not found.
- ///
- public T Find(Expression> predicate) where T : new()
- {
- return Table().Where(predicate).FirstOrDefault();
- }
-
- ///
- /// Whether has been called and the database is waiting for a .
- ///
- public bool IsInTransaction
- {
- get { return _trasactionDepth > 0; }
- }
-
- ///
- /// Begins a new transaction. Call to end the transaction.
- ///
- /// Throws if a transaction has already begun.
- public void BeginTransaction()
- {
- // The BEGIN command only works if the transaction stack is empty,
- // or in other words if there are no pending transactions.
- // If the transaction stack is not empty when the BEGIN command is invoked,
- // then the command fails with an error.
- // Rather than crash with an error, we will just ignore calls to BeginTransaction
- // that would result in an error.
- if (Interlocked.CompareExchange(ref _trasactionDepth, 1, 0) == 0) {
- try {
- Execute("begin transaction");
- } catch (Exception ex) {
- var sqlExp = ex as SQLiteException;
- if (sqlExp != null) {
- // It is recommended that applications respond to the errors listed below
- // by explicitly issuing a ROLLBACK command.
- // TODO: This rollback failsafe should be localized to all throw sites.
- switch (sqlExp.Result) {
- case SQLite3.Result.IOError:
- case SQLite3.Result.Full:
- case SQLite3.Result.Busy:
- case SQLite3.Result.NoMem:
- case SQLite3.Result.Interrupt:
- RollbackTo(null, true);
- break;
- }
- } else {
- // Call decrement and not VolatileWrite in case we've already
- // created a transaction point in SaveTransactionPoint since the catch.
- Interlocked.Decrement(ref _trasactionDepth);
- }
-
- throw;
- }
- } else {
- // Calling BeginTransaction on an already open transaction is invalid
- throw new System.InvalidOperationException("Cannot begin a transaction while already in a transaction.");
- }
- }
-
- ///
- /// Creates a savepoint in the database at the current point in the transaction timeline.
- /// Begins a new transaction if one is not in progress.
- ///
- /// Call to undo transactions since the returned savepoint.
- /// Call to commit transactions after the savepoint returned here.
- /// Call to end the transaction, committing all changes.
- ///
- /// A string naming the savepoint.
- public string SaveTransactionPoint()
- {
- int depth = Interlocked.Increment(ref _trasactionDepth) - 1;
- string retVal = "S" + (short)_rand.Next(short.MaxValue) + "D" + depth;
-
- try {
- Execute("savepoint " + retVal);
- } catch (Exception ex) {
- var sqlExp = ex as SQLiteException;
- if (sqlExp != null) {
- // It is recommended that applications respond to the errors listed below
- // by explicitly issuing a ROLLBACK command.
- // TODO: This rollback failsafe should be localized to all throw sites.
- switch (sqlExp.Result) {
- case SQLite3.Result.IOError:
- case SQLite3.Result.Full:
- case SQLite3.Result.Busy:
- case SQLite3.Result.NoMem:
- case SQLite3.Result.Interrupt:
- RollbackTo(null, true);
- break;
- }
- } else {
- Interlocked.Decrement(ref _trasactionDepth);
- }
-
- throw;
- }
-
- return retVal;
- }
-
- ///
- /// Rolls back the transaction that was begun by or .
- ///
- public void Rollback()
- {
- RollbackTo(null, false);
- }
-
- ///
- /// Rolls back the savepoint created by or SaveTransactionPoint.
- ///
- /// The name of the savepoint to roll back to, as returned by . If savepoint is null or empty, this method is equivalent to a call to
- public void RollbackTo(string savepoint)
- {
- RollbackTo(savepoint, false);
- }
-
- ///
- /// Rolls back the transaction that was begun by .
- ///
- /// true to avoid throwing exceptions, false otherwise
- private void RollbackTo(string savepoint, bool noThrow)
- {
- // Rolling back without a TO clause rolls backs all transactions
- // and leaves the transaction stack empty.
- try {
- if (String.IsNullOrEmpty(savepoint)) {
- if (Interlocked.Exchange(ref _trasactionDepth, 0) > 0) {
- Execute("rollback");
- }
- } else {
- DoSavePointExecute(savepoint, "rollback to ");
- }
- } catch (SQLiteException) {
- if (!noThrow)
- throw;
-
- }
- // No need to rollback if there are no transactions open.
- }
-
- ///
- /// Releases a savepoint returned from . Releasing a savepoint
- /// makes changes since that savepoint permanent if the savepoint began the transaction,
- /// or otherwise the changes are permanent pending a call to .
- ///
- /// The RELEASE command is like a COMMIT for a SAVEPOINT.
- ///
- /// The name of the savepoint to release. The string should be the result of a call to
- public void Release(string savepoint)
- {
- DoSavePointExecute(savepoint, "release ");
- }
-
- private void DoSavePointExecute(string savepoint, string cmd)
- {
- // Validate the savepoint
- int firstLen = savepoint.IndexOf('D');
- if (firstLen >= 2 && savepoint.Length > firstLen + 1) {
- int depth;
- if (Int32.TryParse(savepoint.Substring(firstLen + 1), out depth)) {
- // TODO: Mild race here, but inescapable without locking almost everywhere.
- if (0 <= depth && depth < _trasactionDepth) {
-#if NETFX_CORE
- Volatile.Write (ref _trasactionDepth, depth);
-#elif SILVERLIGHT
- _trasactionDepth = depth;
-#else
- Thread.VolatileWrite(ref _trasactionDepth, depth);
-#endif
- Execute(cmd + savepoint);
- return;
- }
- }
- }
-
- throw new ArgumentException("savePoint", "savePoint is not valid, and should be the result of a call to SaveTransactionPoint.");
- }
-
- ///
- /// Commits the transaction that was begun by .
- ///
- public void Commit()
- {
- if (Interlocked.Exchange(ref _trasactionDepth, 0) != 0) {
- Execute("commit");
- }
- // Do nothing on a commit with no open transaction
- }
-
- ///
- /// Executes within a (possibly nested) transaction by wrapping it in a SAVEPOINT. If an
- /// exception occurs the whole transaction is rolled back, not just the current savepoint. The exception
- /// is rethrown.
- ///
- ///
- /// The to perform within a transaction. can contain any number
- /// of operations on the connection but should never call or
- /// .
- ///
- public void RunInTransaction(Action action)
- {
- try {
- var savePoint = SaveTransactionPoint();
- action();
- Release(savePoint);
- } catch (Exception) {
- Rollback();
- throw;
- }
- }
-
- ///
- /// Inserts all specified objects.
- ///
- ///
- /// An of the objects to insert.
- ///
- ///
- /// The number of rows added to the table.
- ///
- public int InsertAll(System.Collections.IEnumerable objects, bool beginTransaction = true)
- {
- if (beginTransaction) {
- BeginTransaction();
- }
- var c = 0;
- foreach (var r in objects) {
- c += Insert(r);
- }
- if (beginTransaction) {
- Commit();
- }
- return c;
- }
-
- ///
- /// Inserts the given object and retrieves its
- /// auto incremented primary key if it has one.
- ///
- ///
- /// The object to insert.
- ///
- ///
- /// The number of rows added to the table.
- ///
- public int Insert(object obj)
- {
- if (obj == null) {
- return 0;
- }
- return Insert(obj, "", obj.GetType());
- }
-
- public int Insert(object obj, Type objType)
- {
- return Insert(obj, "", objType);
- }
-
- public int Insert(object obj, string extra)
- {
- if (obj == null) {
- return 0;
- }
- return Insert(obj, extra, obj.GetType());
- }
-
- ///
- /// Inserts the given object and retrieves its
- /// auto incremented primary key if it has one.
- ///
- ///
- /// The object to insert.
- ///
- ///
- /// Literal SQL code that gets placed into the command. INSERT {extra} INTO ...
- ///
- ///
- /// The type of object to insert.
- ///
- ///
- /// The number of rows added to the table.
- ///
- public int Insert(object obj, string extra, Type objType)
- {
- if (obj == null || objType == null) {
- return 0;
- }
-
- var map = GetMapping(objType);
-
- var cols = map.InsertColumns;
- var vals = new object[cols.Length];
- for (var i = 0; i < vals.Length; i++) {
- vals[i] = cols[i].GetValue(obj);
- }
-
- var insertCmd = map.GetInsertCommand(this, extra);
- var count = insertCmd.ExecuteNonQuery(vals);
-
- if (map.HasAutoIncPK) {
- var id = SQLite3.LastInsertRowid(Handle);
- map.SetAutoIncPK(obj, id);
- }
-
- return count;
- }
-
- ///
- /// Updates all of the columns of a table using the specified object
- /// except for its primary key.
- /// The object is required to have a primary key.
- ///
- ///
- /// The object to update. It must have a primary key designated using the PrimaryKeyAttribute.
- ///
- ///
- /// The number of rows updated.
- ///
- public int Update(object obj)
- {
- if (obj == null) {
- return 0;
- }
- return Update(obj, obj.GetType());
- }
-
- public int Update(object obj, Type objType)
- {
- if (obj == null || objType == null) {
- return 0;
- }
-
- var map = GetMapping(objType);
-
- var pk = map.PK;
-
- if (pk == null) {
- throw new NotSupportedException("Cannot update " + map.TableName + ": it has no PK");
- }
-
- var cols = from p in map.Columns
- where p != pk
- select p;
- var vals = from c in cols
- select c.GetValue(obj);
- var ps = new List(vals);
- ps.Add(pk.GetValue(obj));
- var q = string.Format("update \"{0}\" set {1} where {2} = ? ", map.TableName, string.Join(",", (from c in cols
- select "\"" + c.Name + "\" = ? ").ToArray()), pk.Name);
- return Execute(q, ps.ToArray());
- }
-
- ///
- /// Deletes the given object from the database using its primary key.
- ///
- ///
- /// The object to delete. It must have a primary key designated using the PrimaryKeyAttribute.
- ///
- ///
- /// The number of rows deleted.
- ///
- public int Delete(object objectToDelete)
- {
- var map = GetMapping(objectToDelete.GetType());
- var pk = map.PK;
- if (pk == null) {
- throw new NotSupportedException("Cannot delete " + map.TableName + ": it has no PK");
- }
- var q = string.Format("delete from \"{0}\" where \"{1}\" = ?", map.TableName, pk.Name);
- return Execute(q, pk.GetValue(objectToDelete));
- }
-
- ///
- /// Deletes the object with the specified primary key.
- ///
- ///
- /// The primary key of the object to delete.
- ///
- ///
- /// The number of objects deleted.
- ///
- ///
- /// The type of object.
- ///
- public int Delete(object primaryKey)
- {
- var map = GetMapping(typeof(T));
- var pk = map.PK;
- if (pk == null) {
- throw new NotSupportedException("Cannot delete " + map.TableName + ": it has no PK");
- }
- var q = string.Format("delete from \"{0}\" where \"{1}\" = ?", map.TableName, pk.Name);
- return Execute(q, primaryKey);
- }
-
- ///
- /// Deletes all the objects from the specified table.
- /// WARNING WARNING: Let me repeat. It deletes ALL the objects from the
- /// specified table. Do you really want to do that?
- ///
- ///
- /// The number of objects deleted.
- ///
- ///
- /// The type of objects to delete.
- ///
- public int DeleteAll()
- {
- var map = GetMapping(typeof(T));
- var query = string.Format("delete from \"{0}\"", map.TableName);
- return Execute(query);
- }
-
- ~SQLiteConnection()
- {
- Dispose(false);
- }
-
- public void Dispose()
- {
- Dispose(true);
- GC.SuppressFinalize(this);
- }
-
- protected virtual void Dispose(bool disposing)
- {
- Close();
- }
-
- public void Close()
- {
- if (_open && Handle != NullHandle) {
- try {
- if (_mappings != null) {
- foreach (var sqlInsertCommand in _mappings.Values) {
- sqlInsertCommand.Dispose();
- }
- }
- var r = SQLite3.Close(Handle);
- if (r != SQLite3.Result.OK) {
- string msg = SQLite3.GetErrmsg(Handle);
- throw SQLiteException.New(r, msg);
- }
- } finally {
- Handle = NullHandle;
- _open = false;
- }
- }
- }
- }
-
- ///
- /// Represents a parsed connection string.
- ///
- class SQLiteConnectionString {
- public string ConnectionString { get; private set; }
- public string DatabasePath { get; private set; }
- public bool StoreDateTimeAsTicks { get; private set; }
-
-#if NETFX_CORE
- static readonly string MetroStyleDataPath = Windows.Storage.ApplicationData.Current.LocalFolder.Path;
-#endif
-
- public SQLiteConnectionString(string databasePath, bool storeDateTimeAsTicks)
- {
- ConnectionString = databasePath;
- StoreDateTimeAsTicks = storeDateTimeAsTicks;
-
-#if NETFX_CORE
- DatabasePath = System.IO.Path.Combine (MetroStyleDataPath, databasePath);
-#else
- DatabasePath = databasePath;
-#endif
- }
- }
-
- [AttributeUsage(AttributeTargets.Class)]
- public class TableAttribute : Attribute {
- public string Name { get; set; }
-
- public TableAttribute(string name)
- {
- Name = name;
- }
- }
-
- [AttributeUsage(AttributeTargets.Property)]
- public class ColumnAttribute : Attribute {
- public string Name { get; set; }
-
- public ColumnAttribute(string name)
- {
- Name = name;
- }
- }
-
- [AttributeUsage(AttributeTargets.Property)]
- public class PrimaryKeyAttribute : Attribute {
- }
-
- [AttributeUsage(AttributeTargets.Property)]
- public class AutoIncrementAttribute : Attribute {
- }
-
- [AttributeUsage(AttributeTargets.Property)]
- public class IndexedAttribute : Attribute {
- public string Name { get; set; }
- public int Order { get; set; }
- public virtual bool Unique { get; set; }
-
- public IndexedAttribute()
- {
- }
-
- public IndexedAttribute(string name, int order)
- {
- Name = name;
- Order = order;
- }
- }
-
- [AttributeUsage(AttributeTargets.Property)]
- public class IgnoreAttribute : Attribute {
- }
-
- [AttributeUsage(AttributeTargets.Property)]
- public class UniqueAttribute : IndexedAttribute {
- public override bool Unique
- {
- get { return true; }
- set { /* throw? */ }
- }
- }
-
- [AttributeUsage(AttributeTargets.Property)]
- public class MaxLengthAttribute : Attribute {
- public int Value { get; private set; }
-
- public MaxLengthAttribute(int length)
- {
- Value = length;
- }
- }
-
- [AttributeUsage(AttributeTargets.Property)]
- public class CollationAttribute : Attribute {
- public string Value { get; private set; }
-
- public CollationAttribute(string collation)
- {
- Value = collation;
- }
- }
-
- public class TableMapping {
- public Type MappedType { get; private set; }
-
- public string TableName { get; private set; }
-
- public Column[] Columns { get; private set; }
-
- public Column PK { get; private set; }
-
- public string GetByPrimaryKeySql { get; private set; }
-
- Column _autoPk = null;
- Column[] _insertColumns = null;
-
- public TableMapping(Type type)
- {
- MappedType = type;
-
-#if NETFX_CORE
- var tableAttr = (TableAttribute)System.Reflection.CustomAttributeExtensions
- .GetCustomAttribute(type.GetTypeInfo(), typeof(TableAttribute), true);
-#else
- var tableAttr = (TableAttribute)type.GetCustomAttributes(typeof(TableAttribute), true).FirstOrDefault();
-#endif
-
- TableName = tableAttr != null ? tableAttr.Name : MappedType.Name;
-
-#if !NETFX_CORE
- var props = MappedType.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty);
-#else
- var props = from p in MappedType.GetRuntimeProperties()
- where ((p.GetMethod != null && p.GetMethod.IsPublic) || (p.SetMethod != null && p.SetMethod.IsPublic) || (p.GetMethod != null && p.GetMethod.IsStatic) || (p.SetMethod != null && p.SetMethod.IsStatic))
- select p;
-#endif
- var cols = new List();
- foreach (var p in props) {
-#if !NETFX_CORE
- var ignore = p.GetCustomAttributes(typeof(IgnoreAttribute), true).Length > 0;
-#else
- var ignore = p.GetCustomAttributes (typeof(IgnoreAttribute), true).Count() > 0;
-#endif
- if (p.CanWrite && !ignore) {
- cols.Add(new Column(p));
- }
- }
- Columns = cols.ToArray();
- foreach (var c in Columns) {
- if (c.IsAutoInc && c.IsPK) {
- _autoPk = c;
- }
- if (c.IsPK) {
- PK = c;
- }
- }
-
- HasAutoIncPK = _autoPk != null;
-
- if (PK != null) {
- GetByPrimaryKeySql = string.Format("select * from \"{0}\" where \"{1}\" = ?", TableName, PK.Name);
- } else {
- // People should not be calling Get/Find without a PK
- GetByPrimaryKeySql = string.Format("select * from \"{0}\" limit 1", TableName);
- }
- }
-
- public bool HasAutoIncPK { get; private set; }
-
- public void SetAutoIncPK(object obj, long id)
- {
- if (_autoPk != null) {
- _autoPk.SetValue(obj, Convert.ChangeType(id, _autoPk.ColumnType, null));
- }
- }
-
- public Column[] InsertColumns
- {
- get
- {
- if (_insertColumns == null) {
- _insertColumns = Columns.Where(c => !c.IsAutoInc).ToArray();
- }
- return _insertColumns;
- }
- }
-
- public Column FindColumnWithPropertyName(string propertyName)
- {
- var exact = Columns.Where(c => c.PropertyName == propertyName).FirstOrDefault();
- return exact;
- }
-
- public Column FindColumn(string columnName)
- {
- var exact = Columns.Where(c => c.Name == columnName).FirstOrDefault();
- return exact;
- }
-
- PreparedSqlLiteInsertCommand _insertCommand;
- string _insertCommandExtra = null;
-
- public PreparedSqlLiteInsertCommand GetInsertCommand(SQLiteConnection conn, string extra)
- {
- if (_insertCommand == null) {
- _insertCommand = CreateInsertCommand(conn, extra);
- _insertCommandExtra = extra;
- } else if (_insertCommandExtra != extra) {
- _insertCommand.Dispose();
- _insertCommand = CreateInsertCommand(conn, extra);
- _insertCommandExtra = extra;
- }
- return _insertCommand;
- }
-
- private PreparedSqlLiteInsertCommand CreateInsertCommand(SQLiteConnection conn, string extra)
- {
- var cols = InsertColumns;
- string insertSql;
- if (!cols.Any() && Columns.Count() == 1 && Columns[0].IsAutoInc) {
- insertSql = string.Format("insert {1} into \"{0}\" default values", TableName, extra);
- } else {
- insertSql = string.Format("insert {3} into \"{0}\"({1}) values ({2})", TableName,
- string.Join(",", (from c in cols
- select "\"" + c.Name + "\"").ToArray()),
- string.Join(",", (from c in cols
- select "?").ToArray()), extra);
-
- }
-
- var insertCommand = new PreparedSqlLiteInsertCommand(conn);
- insertCommand.CommandText = insertSql;
- return insertCommand;
- }
-
- protected internal void Dispose()
- {
- if (_insertCommand != null) {
- _insertCommand.Dispose();
- _insertCommand = null;
- }
- }
-
- public class Column {
- PropertyInfo _prop;
-
- public string Name { get; private set; }
-
- public string PropertyName { get { return _prop.Name; } }
-
- public Type ColumnType { get; private set; }
-
- public string Collation { get; private set; }
-
- public bool IsAutoInc { get; private set; }
-
- public bool IsPK { get; private set; }
-
- public IEnumerable Indices { get; set; }
-
- public bool IsNullable { get; private set; }
-
- public int MaxStringLength { get; private set; }
-
- public Column(PropertyInfo prop)
- {
- var colAttr = (ColumnAttribute)prop.GetCustomAttributes(typeof(ColumnAttribute), true).FirstOrDefault();
-
- _prop = prop;
- Name = colAttr == null ? prop.Name : colAttr.Name;
- //If this type is Nullable then Nullable.GetUnderlyingType returns the T, otherwise it returns null, so get the the actual type instead
- ColumnType = Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType;
- Collation = Orm.Collation(prop);
- IsAutoInc = Orm.IsAutoInc(prop);
- IsPK = Orm.IsPK(prop);
- Indices = Orm.GetIndices(prop);
- IsNullable = !IsPK;
- MaxStringLength = Orm.MaxStringLength(prop);
- }
-
- public void SetValue(object obj, object val)
- {
- _prop.SetValue(obj, val, null);
- }
-
- public object GetValue(object obj)
- {
- return _prop.GetValue(obj, null);
- }
- }
- }
-
- public static class Orm {
- public const int DefaultMaxStringLength = 140;
-
- public static string SqlDecl(TableMapping.Column p, bool storeDateTimeAsTicks)
- {
- string decl = "\"" + p.Name + "\" " + SqlType(p, storeDateTimeAsTicks) + " ";
-
- if (p.IsPK) {
- decl += "primary key ";
- }
- if (p.IsAutoInc) {
- decl += "autoincrement ";
- }
- if (!p.IsNullable) {
- decl += "not null ";
- }
- if (!string.IsNullOrEmpty(p.Collation)) {
- decl += "collate " + p.Collation + " ";
- }
-
- return decl;
- }
-
- public static string SqlType(TableMapping.Column p, bool storeDateTimeAsTicks)
- {
- var clrType = p.ColumnType;
- if (clrType == typeof(Boolean) || clrType == typeof(Byte) || clrType == typeof(UInt16) || clrType == typeof(SByte) || clrType == typeof(Int16) || clrType == typeof(Int32)) {
- return "integer";
- } else if (clrType == typeof(UInt32) || clrType == typeof(Int64)) {
- return "bigint";
- } else if (clrType == typeof(Single) || clrType == typeof(Double) || clrType == typeof(Decimal)) {
- return "float";
- } else if (clrType == typeof(String)) {
- int len = p.MaxStringLength;
- return "varchar(" + len + ")";
- } else if (clrType == typeof(DateTime)) {
- return storeDateTimeAsTicks ? "bigint" : "datetime";
-#if !NETFX_CORE
- } else if (clrType.IsEnum) {
-#else
- } else if (clrType.GetTypeInfo().IsEnum) {
-#endif
- return "integer";
- } else if (clrType == typeof(byte[])) {
- return "blob";
-#if SQLITE_SUPPORT_GUID
- } else if (clrType == typeof(Guid)) {
- return "varchar(36)";
-#endif
- } else {
- throw new NotSupportedException("Don't know about " + clrType);
- }
- }
-
- public static bool IsPK(MemberInfo p)
- {
- var attrs = p.GetCustomAttributes(typeof(PrimaryKeyAttribute), true);
-#if !NETFX_CORE
- return attrs.Length > 0;
-#else
- return attrs.Count() > 0;
-#endif
- }
-
- public static string Collation(MemberInfo p)
- {
- var attrs = p.GetCustomAttributes(typeof(CollationAttribute), true);
-#if !NETFX_CORE
- if (attrs.Length > 0) {
- return ((CollationAttribute)attrs[0]).Value;
-#else
- if (attrs.Count() > 0) {
- return ((CollationAttribute)attrs.First()).Value;
-#endif
- } else {
- return string.Empty;
- }
- }
-
- public static bool IsAutoInc(MemberInfo p)
- {
- var attrs = p.GetCustomAttributes(typeof(AutoIncrementAttribute), true);
-#if !NETFX_CORE
- return attrs.Length > 0;
-#else
- return attrs.Count() > 0;
-#endif
- }
-
- public static IEnumerable GetIndices(MemberInfo p)
- {
- var attrs = p.GetCustomAttributes(typeof(IndexedAttribute), true);
- return attrs.Cast();
- }
-
- public static int MaxStringLength(PropertyInfo p)
- {
- var attrs = p.GetCustomAttributes(typeof(MaxLengthAttribute), true);
-#if !NETFX_CORE
- if (attrs.Length > 0) {
- return ((MaxLengthAttribute)attrs[0]).Value;
-#else
- if (attrs.Count() > 0) {
- return ((MaxLengthAttribute)attrs.First()).Value;
-#endif
- } else {
- return DefaultMaxStringLength;
- }
- }
- }
-
- public class SQLiteCommand {
- SQLiteConnection _conn;
- private List _bindings;
-
- public string CommandText { get; set; }
-
- internal SQLiteCommand(SQLiteConnection conn)
- {
- _conn = conn;
- _bindings = new List();
- CommandText = "";
- }
-
- public int ExecuteNonQuery()
- {
- if (_conn.Trace) {
- Debug.WriteLine("Executing: " + this);
- }
-
- var r = SQLite3.Result.OK;
- var stmt = Prepare();
- r = SQLite3.Step(stmt);
- Finalize(stmt);
- if (r == SQLite3.Result.Done) {
- int rowsAffected = SQLite3.Changes(_conn.Handle);
- return rowsAffected;
- } else if (r == SQLite3.Result.Error) {
- string msg = SQLite3.GetErrmsg(_conn.Handle);
- throw SQLiteException.New(r, msg);
- } else {
- throw SQLiteException.New(r, r.ToString());
- }
- }
-
- public IEnumerable ExecuteDeferredQuery()
- {
- return ExecuteDeferredQuery(_conn.GetMapping(typeof(T)));
- }
-
- public List ExecuteQuery()
- {
- return ExecuteDeferredQuery(_conn.GetMapping(typeof(T))).ToList();
- }
-
- public List ExecuteQuery(TableMapping map)
- {
- return ExecuteDeferredQuery(map).ToList();
- }
-
- ///
- /// Invoked every time an instance is loaded from the database.
- ///
- ///
- /// The newly created object.
- ///
- ///
- /// This can be overridden in combination with the