remove Xamarin Forms remnants

This commit is contained in:
2025-01-26 19:47:56 -06:00
parent 83e9b2706d
commit c13f746631
107 changed files with 0 additions and 51739 deletions
-19
View File
@@ -1,19 +0,0 @@
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");
Binary file not shown.
-46
View File
@@ -1,46 +0,0 @@
using System;
using Android.App;
using Android.Content;
using Android.Content.PM;
using Android.OS;
using Android.Net;
using Serilog;
namespace qController.Droid
{
[Activity(Label = "qControl", Icon = "@drawable/icon", Theme = "@style/MyTheme", ScreenOrientation = ScreenOrientation.Portrait, 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);
Log.Logger = new LoggerConfiguration().WriteTo.AndroidLog().CreateLogger();
LoadApplication(new App());
Acr.UserDialogs.UserDialogs.Init(this);
if (Build.VERSION.SdkInt >= BuildVersionCodes.M)
{
ConnectivityManager connMgr = (ConnectivityManager)Application.Context.GetSystemService(Context.ConnectivityService);
Network[] networks = connMgr.GetAllNetworks();
for (int i = 0; i < networks.Length; i++)
{
Network network = networks[i];
NetworkInfo networkInfo = connMgr.GetNetworkInfo(network);
if (networkInfo.Type == ConnectivityType.Wifi && networkInfo.IsAvailable && networkInfo.IsConnected)
{
Log.Debug("ANDROID MAIN ACTIVITY - First Wi-Fi found......binding");
connMgr.BindProcessToNetwork(network);
}
}
}
}
}
}
-8
View File
@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="37" android:versionName="1.6.7" package="com.jwetzell.qlabcontroller" android:installLocation="auto">
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="34" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application android:label="qControl" android:icon="@drawable/icon"></application>
</manifest>
-27
View File
@@ -1,27 +0,0 @@
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("qController.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("")]
-44
View File
@@ -1,44 +0,0 @@
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.
-45107
View File
File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

-2
View File
@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.TabLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/sliding_tabs" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?attr/colorPrimary" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" app:tabIndicatorColor="@android:color/white" app:tabGravity="fill" app:tabMode="fixed" />
-2
View File
@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?attr/colorPrimary" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" android:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
-27
View File
@@ -1,27 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<style name="MyTheme" parent="MyTheme.Base">
</style>
<!-- Base theme applied no matter what API -->
<style name="MyTheme.Base" parent="Theme.AppCompat.Light.DarkActionBar">
<!--If you are using revision 22.1 please use just windowNoTitle. Without android:-->
<item name="windowNoTitle">true</item>
<!--We will be using the toolbar so no need to show ActionBar-->
<item name="windowActionBar">false</item>
<!-- Set theme colors from http://www.google.com/design/spec/style/color.html#color-color-palette-->
<!-- colorPrimary is used for the default action bar background -->
<item name="colorPrimary">#2196F3</item>
<!-- colorPrimaryDark is used for the status bar -->
<item name="colorPrimaryDark">#1976D2</item>
<!-- colorAccent is used as the default value for colorControlActivated
which is used to tint widgets -->
<item name="colorAccent">#FF4081</item>
<!-- You can also set colorControlNormal, colorControlActivated
colorControlHighlight and colorSwitchThumbNormal. -->
<item name="windowActionModeOverlay">true</item>
<item name="android:datePickerDialogTheme">@style/AppCompatDialogStyle</item>
</style>
<style name="AppCompatDialogStyle" parent="Theme.AppCompat.Light.Dialog">
<item name="colorAccent">#FF4081</item>
</style>
</resources>
-23
View File
@@ -1,23 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Reactive" publicKeyToken="94bc3704cddfc263" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="8.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.99.0" newVersion="4.0.99.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
-183
View File
@@ -1,183 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Acr.Settings" version="9.0.1" targetFramework="monoandroid13.0" />
<package id="Acr.Support" version="2.1.0" targetFramework="monoandroid13.0" />
<package id="Acr.UserDialogs" version="7.2.0.562" targetFramework="monoandroid13.0" />
<package id="AndHUD" version="1.5.0" targetFramework="monoandroid13.0" />
<package id="Microsoft.CSharp" version="4.7.0" targetFramework="monoandroid90" />
<package id="Microsoft.NETCore.Platforms" version="7.0.4" targetFramework="monoandroid13.0" />
<package id="Microsoft.Win32.Primitives" version="4.3.0" targetFramework="monoandroid90" />
<package id="NETStandard.Library" version="2.0.3" targetFramework="monoandroid90" />
<package id="Newtonsoft.Json" version="13.0.3" targetFramework="monoandroid13.0" />
<package id="Serilog" version="3.1.1" targetFramework="monoandroid13.0" />
<package id="Serilog.Sinks.Xamarin" version="1.0.0" targetFramework="monoandroid12.0" />
<package id="Splat" version="15.1.1" targetFramework="monoandroid13.0" />
<package id="Square.OkHttp3" version="4.12.0" targetFramework="monoandroid13.0" />
<package id="Square.OkIO" version="3.6.0" targetFramework="monoandroid13.0" />
<package id="Square.OkIO.JVM" version="3.6.0" targetFramework="monoandroid13.0" />
<package id="System.AppContext" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Buffers" version="4.5.1" targetFramework="monoandroid13.0" />
<package id="System.Collections" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Collections.Concurrent" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Collections.NonGeneric" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.ComponentModel" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.ComponentModel.TypeConverter" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Console" version="4.3.1" targetFramework="monoandroid90" />
<package id="System.Diagnostics.Contracts" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Diagnostics.Debug" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Diagnostics.DiagnosticSource" version="8.0.1" targetFramework="monoandroid13.0" />
<package id="System.Diagnostics.Process" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Diagnostics.StackTrace" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Diagnostics.Tools" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Diagnostics.TraceSource" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Diagnostics.Tracing" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Dynamic.Runtime" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Globalization" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Globalization.Calendars" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.IO" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.IO.Compression" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.IO.Compression.ZipFile" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.IO.FileSystem" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.IO.FileSystem.Primitives" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.IO.FileSystem.Watcher" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Linq" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Linq.Expressions" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Memory" version="4.5.5" targetFramework="monoandroid13.0" />
<package id="System.Net.Http" version="4.3.4" targetFramework="monoandroid90" />
<package id="System.Net.NameResolution" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Net.NetworkInformation" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Net.Primitives" version="4.3.1" targetFramework="monoandroid90" />
<package id="System.Net.Requests" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Net.Sockets" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Numerics.Vectors" version="4.5.0" targetFramework="monoandroid90" />
<package id="System.ObjectModel" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Reactive" version="6.0.1" targetFramework="monoandroid13.0" />
<package id="System.Reflection" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Reflection.Extensions" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Reflection.Primitives" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Reflection.TypeExtensions" version="4.7.0" targetFramework="monoandroid90" />
<package id="System.Resources.ResourceManager" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Runtime" version="4.3.1" targetFramework="monoandroid90" />
<package id="System.Runtime.CompilerServices.Unsafe" version="6.0.0" targetFramework="monoandroid13.0" />
<package id="System.Runtime.Extensions" version="4.3.1" targetFramework="monoandroid90" />
<package id="System.Runtime.Handles" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Runtime.InteropServices" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Runtime.InteropServices.RuntimeInformation" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Runtime.InteropServices.WindowsRuntime" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Runtime.Numerics" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Runtime.Serialization.Formatters" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Runtime.Serialization.Primitives" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Security.Cryptography.Algorithms" version="4.3.1" targetFramework="monoandroid90" />
<package id="System.Security.Cryptography.Encoding" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Security.Cryptography.Primitives" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Security.Cryptography.X509Certificates" version="4.3.2" targetFramework="monoandroid90" />
<package id="System.Text.Encoding" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Text.Encoding.Extensions" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Text.RegularExpressions" version="4.3.1" targetFramework="monoandroid90" />
<package id="System.Threading" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Threading.Tasks" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="monoandroid90" />
<package id="System.Threading.Thread" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Threading.Timer" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Xml.ReaderWriter" version="4.3.1" targetFramework="monoandroid90" />
<package id="System.Xml.XDocument" version="4.3.0" targetFramework="monoandroid90" />
<package id="System.Xml.XmlDocument" version="4.3.0" targetFramework="monoandroid90" />
<package id="TcpSharp" version="1.3.6" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Activity" version="1.8.1" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Activity.Ktx" version="1.8.1" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Annotation" version="1.7.0.2" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Annotation.Experimental" version="1.3.1.3" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Annotation.Jvm" version="1.7.0.2" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.AppCompat" version="1.6.1.5" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.AppCompat.AppCompatResources" version="1.6.1.6" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Arch.Core.Common" version="2.2.0.5" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Arch.Core.Runtime" version="2.2.0.5" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.AsyncLayoutInflater" version="1.0.0.21" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Browser" version="1.5.0.3" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.CardView" version="1.0.0.23" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Collection" version="1.3.0.1" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Collection.Jvm" version="1.3.0.1" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Collection.Ktx" version="1.3.0.1" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Concurrent.Futures" version="1.1.0.16" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.ConstraintLayout" version="2.1.4.8" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.ConstraintLayout.Core" version="1.0.4.8" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.ConstraintLayout.Solver" version="2.0.4.16" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.CoordinatorLayout" version="1.2.0.9" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Core" version="1.12.0.2" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Core.Core.Ktx" version="1.12.0.2" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.CursorAdapter" version="1.0.0.21" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.CustomView" version="1.1.0.20" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.CustomView.PoolingContainer" version="1.0.0.7" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.DocumentFile" version="1.0.1.21" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.DrawerLayout" version="1.2.0.5" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.DynamicAnimation" version="1.0.0.21" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Emoji2" version="1.4.0.2" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Emoji2.ViewsHelper" version="1.4.0.2" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Fragment" version="1.6.2" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Fragment.Ktx" version="1.6.2" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Interpolator" version="1.0.0.21" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Legacy.Support.Core.UI" version="1.0.0.22" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Legacy.Support.Core.Utils" version="1.0.0.21" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Legacy.Support.V4" version="1.0.0.21" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Lifecycle.Common" version="2.6.2.2" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Lifecycle.LiveData" version="2.3.1.1" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Lifecycle.LiveData.Core" version="2.6.2.2" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Lifecycle.LiveData.Core.Ktx" version="2.6.2.2" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Lifecycle.Process" version="2.6.2.2" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Lifecycle.Runtime" version="2.6.2.2" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Lifecycle.Runtime.Ktx" version="2.6.2.2" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Lifecycle.ViewModel" version="2.6.2.2" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Lifecycle.ViewModel.Ktx" version="2.6.2.2" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Lifecycle.ViewModelSavedState" version="2.6.2.2" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Loader" version="1.1.0.21" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.LocalBroadcastManager" version="1.1.0.9" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Media" version="1.6.0.8" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.MediaRouter" version="1.6.0.1" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Migration" version="1.0.10" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.MultiDex" version="2.0.1.21" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Navigation.Common" version="2.7.5" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Navigation.Runtime" version="2.7.5" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Navigation.UI" version="2.3.5.1" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Palette" version="1.0.0.21" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Preference" version="1.2.1.2" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Print" version="1.0.0.21" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.ProfileInstaller.ProfileInstaller" version="1.3.1.4" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.RecyclerView" version="1.3.2" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.ResourceInspection.Annotation" version="1.0.1.9" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.SavedState" version="1.2.1.5" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.SavedState.SavedState.Ktx" version="1.2.1.5" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.SlidingPaneLayout" version="1.2.0.9" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Startup.StartupRuntime" version="1.1.1.9" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.SwipeRefreshLayout" version="1.1.0.16" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Tracing.Tracing" version="1.1.0.8" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Transition" version="1.4.1.14" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.VectorDrawable" version="1.1.0.21" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.VectorDrawable.Animated" version="1.1.0.21" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.VersionedParcelable" version="1.1.1.21" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.ViewPager" version="1.0.0.21" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.ViewPager2" version="1.0.0.23" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Window" version="1.2.0" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.Window.Extensions.Core.Core" version="1.0.0.3" targetFramework="monoandroid13.0" />
<package id="Xamarin.Build.Download" version="0.11.4" targetFramework="monoandroid13.0" />
<package id="Xamarin.Essentials" version="1.8.1" targetFramework="monoandroid13.0" />
<package id="Xamarin.Forms" version="5.0.0.2662" targetFramework="monoandroid13.0" />
<package id="Xamarin.Google.Android.Material" version="1.8.0.1" targetFramework="monoandroid13.0" />
<package id="Xamarin.Google.AutoValue.Annotations" version="1.10.4.1" targetFramework="monoandroid13.0" />
<package id="Xamarin.Google.Dagger" version="2.48.1" targetFramework="monoandroid13.0" />
<package id="Xamarin.Google.ErrorProne.Annotations" version="2.23.0" targetFramework="monoandroid13.0" />
<package id="Xamarin.Google.Guava.ListenableFuture" version="1.0.0.16" targetFramework="monoandroid13.0" />
<package id="Xamarin.GooglePlayServices.Base" version="118.2.0.4" targetFramework="monoandroid13.0" />
<package id="Xamarin.GooglePlayServices.Basement" version="118.2.0.4" targetFramework="monoandroid13.0" />
<package id="Xamarin.GooglePlayServices.Maps" version="118.1.0.5" targetFramework="monoandroid13.0" />
<package id="Xamarin.GooglePlayServices.Stats" version="117.0.3.7" targetFramework="monoandroid13.0" />
<package id="Xamarin.GooglePlayServices.Tasks" version="118.0.2.5" targetFramework="monoandroid13.0" />
<package id="Xamarin.JavaX.Inject" version="1.0.0.10" targetFramework="monoandroid13.0" />
<package id="Xamarin.Jetbrains.Annotations" version="24.1.0" targetFramework="monoandroid13.0" />
<package id="Xamarin.Kotlin.StdLib" version="1.9.20" targetFramework="monoandroid13.0" />
<package id="Xamarin.Kotlin.StdLib.Common" version="1.9.20" targetFramework="monoandroid13.0" />
<package id="Xamarin.Kotlin.StdLib.Jdk7" version="1.9.20" targetFramework="monoandroid13.0" />
<package id="Xamarin.Kotlin.StdLib.Jdk8" version="1.9.20" targetFramework="monoandroid13.0" />
<package id="Xamarin.KotlinX.Coroutines.Android" version="1.7.3.2" targetFramework="monoandroid13.0" />
<package id="Xamarin.KotlinX.Coroutines.Core.Jvm" version="1.7.3.2" targetFramework="monoandroid13.0" />
<package id="Zeroconf" version="3.5.11" targetFramework="monoandroid13.0" />
</packages>
-698
View File
@@ -1,698 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\Xamarin.Forms.5.0.0.2662\build\Xamarin.Forms.props" Condition="Exists('..\packages\Xamarin.Forms.5.0.0.2662\build\Xamarin.Forms.props')" />
<Import Project="..\packages\Xamarin.Forms.5.0.0.2612\build\Xamarin.Forms.props" Condition="Exists('..\packages\Xamarin.Forms.5.0.0.2612\build\Xamarin.Forms.props')" />
<Import Project="..\packages\Xamarin.Forms.5.0.0.2291\build\Xamarin.Forms.props" Condition="Exists('..\packages\Xamarin.Forms.5.0.0.2291\build\Xamarin.Forms.props')" />
<Import Project="..\packages\Xamarin.Build.Download.0.10.0\build\Xamarin.Build.Download.props" Condition="Exists('..\packages\Xamarin.Build.Download.0.10.0\build\Xamarin.Build.Download.props')" />
<Import Project="..\packages\Xamarin.Forms.5.0.0.2012\build\Xamarin.Forms.props" Condition="Exists('..\packages\Xamarin.Forms.5.0.0.2012\build\Xamarin.Forms.props')" />
<Import Project="..\packages\Xamarin.AndroidX.Migration.1.0.8\build\monoandroid90\Xamarin.AndroidX.Migration.props" Condition="Exists('..\packages\Xamarin.AndroidX.Migration.1.0.8\build\monoandroid90\Xamarin.AndroidX.Migration.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{D960ED89-25D2-46E8-B24C-1FFFCD19C0D9}</ProjectGuid>
<ProjectTypeGuids>{EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<OutputType>Library</OutputType>
<RootNamespace>qController.Droid</RootNamespace>
<AssemblyName>qController.Droid</AssemblyName>
<TargetFrameworkVersion>v13.0</TargetFrameworkVersion>
<AndroidApplication>True</AndroidApplication>
<AndroidResgenFile>Resources\Resource.designer.cs</AndroidResgenFile>
<AndroidResgenClass>Resource</AndroidResgenClass>
<AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>
<MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>
<MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug</OutputPath>
<DefineConstants>DEBUG;</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AndroidSigningKeyStore>
</AndroidSigningKeyStore>
<AndroidSupportedAbis>x86;armeabi-v7a;arm64-v8a;x86_64</AndroidSupportedAbis>
<MandroidI18n>
</MandroidI18n>
<AotAssemblies>false</AotAssemblies>
<AndroidEnableProfiledAot>false</AndroidEnableProfiledAot>
<AndroidLinkMode>None</AndroidLinkMode>
<LangVersion>latestmajor</LangVersion>
<EmbedAssembliesIntoApk>true</EmbedAssembliesIntoApk>
<EnableLLVM>false</EnableLLVM>
<BundleAssemblies>false</BundleAssemblies>
<AndroidEnableMultiDex>true</AndroidEnableMultiDex>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugSymbols>false</DebugSymbols>
<DebugType>
</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release</OutputPath>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AndroidManagedSymbols>true</AndroidManagedSymbols>
<AndroidUseSharedRuntime>false</AndroidUseSharedRuntime>
<AndroidSigningStorePass>
</AndroidSigningStorePass>
<AndroidSigningKeyAlias>
</AndroidSigningKeyAlias>
<AndroidSigningKeyPass>
</AndroidSigningKeyPass>
<AndroidSupportedAbis>armeabi-v7a;x86;arm64-v8a;x86_64</AndroidSupportedAbis>
<AotAssemblies>false</AotAssemblies>
<AndroidEnableProfiledAot>true</AndroidEnableProfiledAot>
<AndroidLinkTool>r8</AndroidLinkTool>
<EmbedAssembliesIntoApk>true</EmbedAssembliesIntoApk>
<MandroidI18n />
<LangVersion>latestmajor</LangVersion>
</PropertyGroup>
<ItemGroup>
<Reference Include="Acr.Settings, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Acr.Settings.9.0.1\lib\monoandroid80\Acr.Settings.dll</HintPath>
</Reference>
<Reference Include="AndHUD, Version=1.5.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\AndHUD.1.5.0\lib\monoandroid12.0\AndHUD.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.13.0.3\lib\netstandard2.0\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="Serilog, Version=2.0.0.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10, processorArchitecture=MSIL">
<HintPath>..\packages\Serilog.3.1.1\lib\netstandard2.1\Serilog.dll</HintPath>
</Reference>
<Reference Include="Square.OkHttp3, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Square.OkHttp3.4.12.0\lib\monoandroid12.0\Square.OkHttp3.dll</HintPath>
</Reference>
<Reference Include="Square.OkIO, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Square.OkIO.3.6.0\lib\monoandroid12.0\Square.OkIO.dll</HintPath>
</Reference>
<Reference Include="Square.OkIO.JVM, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Square.OkIO.JVM.3.6.0\lib\monoandroid12.0\Square.OkIO.JVM.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Buffers.4.5.1\lib\netstandard2.0\System.Buffers.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Memory, Version=4.0.1.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Memory.4.5.5\lib\netstandard2.0\System.Memory.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.Xml" />
<Reference Include="System.Core" />
<Reference Include="Mono.Android" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.IO.Compression" />
<Reference Include="Java.Interop" />
<Reference Include="System.Collections" />
<Reference Include="System.IdentityModel" />
<Reference Include="System.Runtime.Serialization" />
<Reference Include="System.Threading.Tasks" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Numerics" />
<Reference Include="System.Numerics.Vectors" />
<Reference Include="Acr.Support.Android">
<HintPath>..\packages\Acr.Support.2.1.0\lib\MonoAndroid10\Acr.Support.Android.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Serilog.Sinks.Xamarin">
<HintPath>..\packages\Serilog.Sinks.Xamarin.1.0.0\lib\monoandroid90\Serilog.Sinks.Xamarin.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Activity, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Activity.1.8.1\lib\monoandroid12.0\Xamarin.AndroidX.Activity.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Activity.Ktx, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Activity.Ktx.1.8.1\lib\monoandroid12.0\Xamarin.AndroidX.Activity.Ktx.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Annotation, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Annotation.1.7.0.2\lib\monoandroid12.0\Xamarin.AndroidX.Annotation.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Annotation.Experimental, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Annotation.Experimental.1.3.1.3\lib\monoandroid12.0\Xamarin.AndroidX.Annotation.Experimental.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Annotation.Jvm, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Annotation.Jvm.1.7.0.2\lib\monoandroid12.0\Xamarin.AndroidX.Annotation.Jvm.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.AppCompat, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.AppCompat.1.6.1.5\lib\monoandroid12.0\Xamarin.AndroidX.AppCompat.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.AppCompat.AppCompatResources, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.AppCompat.AppCompatResources.1.6.1.6\lib\monoandroid12.0\Xamarin.AndroidX.AppCompat.AppCompatResources.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Arch.Core.Common, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Arch.Core.Common.2.2.0.5\lib\monoandroid12.0\Xamarin.AndroidX.Arch.Core.Common.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Arch.Core.Runtime, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Arch.Core.Runtime.2.2.0.5\lib\monoandroid12.0\Xamarin.AndroidX.Arch.Core.Runtime.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.AsyncLayoutInflater, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.AsyncLayoutInflater.1.0.0.21\lib\monoandroid12.0\Xamarin.AndroidX.AsyncLayoutInflater.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.CardView, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.CardView.1.0.0.23\lib\monoandroid12.0\Xamarin.AndroidX.CardView.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Collection, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Collection.1.3.0.1\lib\monoandroid12.0\Xamarin.AndroidX.Collection.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Collection.Jvm, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Collection.Jvm.1.3.0.1\lib\monoandroid12.0\Xamarin.AndroidX.Collection.Jvm.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Collection.Ktx, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Collection.Ktx.1.3.0.1\lib\monoandroid12.0\Xamarin.AndroidX.Collection.Ktx.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Concurrent.Futures, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Concurrent.Futures.1.1.0.16\lib\monoandroid12.0\Xamarin.AndroidX.Concurrent.Futures.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.ConstraintLayout, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.ConstraintLayout.2.1.4.8\lib\monoandroid12.0\Xamarin.AndroidX.ConstraintLayout.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.ConstraintLayout.Core, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.ConstraintLayout.Core.1.0.4.8\lib\monoandroid12.0\Xamarin.AndroidX.ConstraintLayout.Core.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.ConstraintLayout.Solver, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.ConstraintLayout.Solver.2.0.4.16\lib\monoandroid12.0\Xamarin.AndroidX.ConstraintLayout.Solver.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.CoordinatorLayout, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.CoordinatorLayout.1.2.0.9\lib\monoandroid12.0\Xamarin.AndroidX.CoordinatorLayout.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Core, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Core.1.12.0.2\lib\monoandroid12.0\Xamarin.AndroidX.Core.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Core.Core.Ktx, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Core.Core.Ktx.1.12.0.2\lib\monoandroid12.0\Xamarin.AndroidX.Core.Core.Ktx.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.CursorAdapter, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.CursorAdapter.1.0.0.21\lib\monoandroid12.0\Xamarin.AndroidX.CursorAdapter.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.CustomView, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.CustomView.1.1.0.20\lib\monoandroid12.0\Xamarin.AndroidX.CustomView.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.CustomView.PoolingContainer, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.CustomView.PoolingContainer.1.0.0.7\lib\monoandroid12.0\Xamarin.AndroidX.CustomView.PoolingContainer.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.DocumentFile, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.DocumentFile.1.0.1.21\lib\monoandroid12.0\Xamarin.AndroidX.DocumentFile.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.DrawerLayout, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.DrawerLayout.1.2.0.5\lib\monoandroid12.0\Xamarin.AndroidX.DrawerLayout.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.DynamicAnimation, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.DynamicAnimation.1.0.0.21\lib\monoandroid12.0\Xamarin.AndroidX.DynamicAnimation.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Emoji2, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Emoji2.1.4.0.2\lib\monoandroid12.0\Xamarin.AndroidX.Emoji2.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Emoji2.ViewsHelper, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Emoji2.ViewsHelper.1.4.0.2\lib\monoandroid12.0\Xamarin.AndroidX.Emoji2.ViewsHelper.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Fragment, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Fragment.1.6.2\lib\monoandroid12.0\Xamarin.AndroidX.Fragment.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Fragment.Ktx, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Fragment.Ktx.1.6.2\lib\monoandroid12.0\Xamarin.AndroidX.Fragment.Ktx.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Interpolator, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Interpolator.1.0.0.21\lib\monoandroid12.0\Xamarin.AndroidX.Interpolator.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Legacy.Support.Core.UI, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Legacy.Support.Core.UI.1.0.0.22\lib\monoandroid12.0\Xamarin.AndroidX.Legacy.Support.Core.UI.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Legacy.Support.Core.Utils, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Legacy.Support.Core.Utils.1.0.0.21\lib\monoandroid12.0\Xamarin.AndroidX.Legacy.Support.Core.Utils.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Legacy.Support.V4, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Legacy.Support.V4.1.0.0.21\lib\monoandroid12.0\Xamarin.AndroidX.Legacy.Support.V4.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Lifecycle.Common, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Lifecycle.Common.2.6.2.2\lib\monoandroid12.0\Xamarin.AndroidX.Lifecycle.Common.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Lifecycle.LiveData.Core, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Lifecycle.LiveData.Core.2.6.2.2\lib\monoandroid12.0\Xamarin.AndroidX.Lifecycle.LiveData.Core.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Lifecycle.LiveData.Core.Ktx, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Lifecycle.LiveData.Core.Ktx.2.6.2.2\lib\monoandroid12.0\Xamarin.AndroidX.Lifecycle.LiveData.Core.Ktx.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Lifecycle.Process, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Lifecycle.Process.2.6.2.2\lib\monoandroid12.0\Xamarin.AndroidX.Lifecycle.Process.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Lifecycle.Runtime, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Lifecycle.Runtime.2.6.2.2\lib\monoandroid12.0\Xamarin.AndroidX.Lifecycle.Runtime.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Lifecycle.Runtime.Ktx, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Lifecycle.Runtime.Ktx.2.6.2.2\lib\monoandroid12.0\Xamarin.AndroidX.Lifecycle.Runtime.Ktx.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Lifecycle.ViewModel, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Lifecycle.ViewModel.2.6.2.2\lib\monoandroid12.0\Xamarin.AndroidX.Lifecycle.ViewModel.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Lifecycle.ViewModel.Ktx, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Lifecycle.ViewModel.Ktx.2.6.2.2\lib\monoandroid12.0\Xamarin.AndroidX.Lifecycle.ViewModel.Ktx.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Lifecycle.ViewModelSavedState, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.2.6.2.2\lib\monoandroid12.0\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Loader, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Loader.1.1.0.21\lib\monoandroid12.0\Xamarin.AndroidX.Loader.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.LocalBroadcastManager, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.LocalBroadcastManager.1.1.0.9\lib\monoandroid12.0\Xamarin.AndroidX.LocalBroadcastManager.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Media, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Media.1.6.0.8\lib\monoandroid12.0\Xamarin.AndroidX.Media.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.MediaRouter, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.MediaRouter.1.6.0.1\lib\monoandroid12.0\Xamarin.AndroidX.MediaRouter.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Navigation.Common, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Navigation.Common.2.7.5\lib\monoandroid12.0\Xamarin.AndroidX.Navigation.Common.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Navigation.Runtime, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Navigation.Runtime.2.7.5\lib\monoandroid12.0\Xamarin.AndroidX.Navigation.Runtime.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Palette, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Palette.1.0.0.21\lib\monoandroid12.0\Xamarin.AndroidX.Palette.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Preference, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Preference.1.2.1.2\lib\monoandroid12.0\Xamarin.AndroidX.Preference.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Print, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Print.1.0.0.21\lib\monoandroid12.0\Xamarin.AndroidX.Print.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.ProfileInstaller.ProfileInstaller, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.ProfileInstaller.ProfileInstaller.1.3.1.4\lib\monoandroid12.0\Xamarin.AndroidX.ProfileInstaller.ProfileInstaller.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.RecyclerView, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.RecyclerView.1.3.2\lib\monoandroid12.0\Xamarin.AndroidX.RecyclerView.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.ResourceInspection.Annotation, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.ResourceInspection.Annotation.1.0.1.9\lib\monoandroid12.0\Xamarin.AndroidX.ResourceInspection.Annotation.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.SavedState, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.SavedState.1.2.1.5\lib\monoandroid12.0\Xamarin.AndroidX.SavedState.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.SavedState.SavedState.Ktx, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.SavedState.SavedState.Ktx.1.2.1.5\lib\monoandroid12.0\Xamarin.AndroidX.SavedState.SavedState.Ktx.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.SlidingPaneLayout, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.SlidingPaneLayout.1.2.0.9\lib\monoandroid12.0\Xamarin.AndroidX.SlidingPaneLayout.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Startup.StartupRuntime, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Startup.StartupRuntime.1.1.1.9\lib\monoandroid12.0\Xamarin.AndroidX.Startup.StartupRuntime.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.SwipeRefreshLayout, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.SwipeRefreshLayout.1.1.0.16\lib\monoandroid12.0\Xamarin.AndroidX.SwipeRefreshLayout.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Tracing.Tracing, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Tracing.Tracing.1.1.0.8\lib\monoandroid12.0\Xamarin.AndroidX.Tracing.Tracing.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Transition, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Transition.1.4.1.14\lib\monoandroid12.0\Xamarin.AndroidX.Transition.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.VectorDrawable, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.VectorDrawable.1.1.0.21\lib\monoandroid12.0\Xamarin.AndroidX.VectorDrawable.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.VectorDrawable.Animated, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.VectorDrawable.Animated.1.1.0.21\lib\monoandroid12.0\Xamarin.AndroidX.VectorDrawable.Animated.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.VersionedParcelable, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.VersionedParcelable.1.1.1.21\lib\monoandroid12.0\Xamarin.AndroidX.VersionedParcelable.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.ViewPager, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.ViewPager.1.0.0.21\lib\monoandroid12.0\Xamarin.AndroidX.ViewPager.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.ViewPager2, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.ViewPager2.1.0.0.23\lib\monoandroid12.0\Xamarin.AndroidX.ViewPager2.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Window, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Window.1.2.0\lib\monoandroid12.0\Xamarin.AndroidX.Window.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Window.Extensions.Core.Core, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.AndroidX.Window.Extensions.Core.Core.1.0.0.3\lib\monoandroid12.0\Xamarin.AndroidX.Window.Extensions.Core.Core.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Google.AutoValue.Annotations, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.Google.AutoValue.Annotations.1.10.4.1\lib\monoandroid12.0\Xamarin.Google.AutoValue.Annotations.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Google.Dagger, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.Google.Dagger.2.48.1\lib\monoandroid12.0\Xamarin.Google.Dagger.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Google.ErrorProne.Annotations, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.Google.ErrorProne.Annotations.2.23.0\lib\monoandroid12.0\Xamarin.Google.ErrorProne.Annotations.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Google.Guava.ListenableFuture, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.Google.Guava.ListenableFuture.1.0.0.16\lib\monoandroid12.0\Xamarin.Google.Guava.ListenableFuture.dll</HintPath>
</Reference>
<Reference Include="Xamarin.GooglePlayServices.Basement, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.GooglePlayServices.Basement.118.2.0.4\lib\monoandroid12.0\Xamarin.GooglePlayServices.Basement.dll</HintPath>
</Reference>
<Reference Include="Xamarin.GooglePlayServices.Stats, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.GooglePlayServices.Stats.117.0.3.7\lib\monoandroid12.0\Xamarin.GooglePlayServices.Stats.dll</HintPath>
</Reference>
<Reference Include="Xamarin.GooglePlayServices.Tasks, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.GooglePlayServices.Tasks.118.0.2.5\lib\monoandroid12.0\Xamarin.GooglePlayServices.Tasks.dll</HintPath>
</Reference>
<Reference Include="Xamarin.JavaX.Inject, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.JavaX.Inject.1.0.0.10\lib\monoandroid12.0\Xamarin.JavaX.Inject.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Jetbrains.Annotations, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.Jetbrains.Annotations.24.1.0\lib\monoandroid12.0\Xamarin.Jetbrains.Annotations.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Kotlin.StdLib, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.Kotlin.StdLib.1.9.20\lib\monoandroid12.0\Xamarin.Kotlin.StdLib.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Xamarin.Kotlin.StdLib.Common, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.Kotlin.StdLib.Common.1.9.20\lib\monoandroid12.0\Xamarin.Kotlin.StdLib.Common.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Kotlin.StdLib.Jdk7, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.Kotlin.StdLib.Jdk7.1.9.20\lib\monoandroid12.0\Xamarin.Kotlin.StdLib.Jdk7.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Kotlin.StdLib.Jdk8, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.Kotlin.StdLib.Jdk8.1.9.20\lib\monoandroid12.0\Xamarin.Kotlin.StdLib.Jdk8.dll</HintPath>
</Reference>
<Reference Include="Xamarin.KotlinX.Coroutines.Android, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.KotlinX.Coroutines.Android.1.7.3.2\lib\monoandroid12.0\Xamarin.KotlinX.Coroutines.Android.dll</HintPath>
</Reference>
<Reference Include="Xamarin.KotlinX.Coroutines.Core.Jvm, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.KotlinX.Coroutines.Core.Jvm.1.7.3.2\lib\monoandroid12.0\Xamarin.KotlinX.Coroutines.Core.Jvm.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.MultiDex">
<HintPath>..\packages\Xamarin.AndroidX.MultiDex.2.0.1.21\lib\monoandroid12.0\Xamarin.AndroidX.MultiDex.dll</HintPath>
</Reference>
<Reference Include="mscorlib" />
<Reference Include="Xamarin.GooglePlayServices.Base">
<HintPath>..\packages\Xamarin.GooglePlayServices.Base.118.2.0.4\lib\monoandroid12.0\Xamarin.GooglePlayServices.Base.dll</HintPath>
</Reference>
<Reference Include="Xamarin.GooglePlayServices.Maps">
<HintPath>..\packages\Xamarin.GooglePlayServices.Maps.118.1.0.5\lib\monoandroid12.0\Xamarin.GooglePlayServices.Maps.dll</HintPath>
</Reference>
<Reference Include="Acr.UserDialogs">
<HintPath>..\packages\Acr.UserDialogs.7.2.0.562\lib\monoandroid10.0\Acr.UserDialogs.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Browser">
<HintPath>..\packages\Xamarin.AndroidX.Browser.1.5.0.3\lib\monoandroid12.0\Xamarin.AndroidX.Browser.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Google.Android.Material">
<HintPath>..\packages\Xamarin.Google.Android.Material.1.8.0.1\lib\monoandroid12.0\Xamarin.Google.Android.Material.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Lifecycle.LiveData">
<HintPath>..\packages\Xamarin.AndroidX.Lifecycle.LiveData.2.3.1.1\lib\monoandroid90\Xamarin.AndroidX.Lifecycle.LiveData.dll</HintPath>
</Reference>
<Reference Include="Xamarin.AndroidX.Navigation.UI">
<HintPath>..\packages\Xamarin.AndroidX.Navigation.UI.2.3.5.1\lib\monoandroid90\Xamarin.AndroidX.Navigation.UI.dll</HintPath>
</Reference>
<Reference Include="FormsViewGroup">
<HintPath>..\packages\Xamarin.Forms.5.0.0.2662\lib\MonoAndroid13.0\FormsViewGroup.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Forms.Core">
<HintPath>..\packages\Xamarin.Forms.5.0.0.2662\lib\MonoAndroid13.0\Xamarin.Forms.Core.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Forms.Platform.Android">
<HintPath>..\packages\Xamarin.Forms.5.0.0.2662\lib\MonoAndroid13.0\Xamarin.Forms.Platform.Android.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Forms.Platform">
<HintPath>..\packages\Xamarin.Forms.5.0.0.2662\lib\MonoAndroid13.0\Xamarin.Forms.Platform.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Forms.Xaml">
<HintPath>..\packages\Xamarin.Forms.5.0.0.2662\lib\MonoAndroid13.0\Xamarin.Forms.Xaml.dll</HintPath>
</Reference>
<Reference Include="Zeroconf">
<HintPath>..\packages\Zeroconf.3.5.11\lib\netstandard2.0\Zeroconf.dll</HintPath>
</Reference>
<Reference Include="TcpSharp">
<HintPath>..\packages\TcpSharp.1.3.6\lib\netstandard2.1\TcpSharp.dll</HintPath>
</Reference>
<Reference Include="System.Diagnostics.DiagnosticSource">
<HintPath>..\packages\System.Diagnostics.DiagnosticSource.8.0.1\lib\netstandard2.0\System.Diagnostics.DiagnosticSource.dll</HintPath>
</Reference>
<Reference Include="System.Reactive">
<HintPath>..\packages\System.Reactive.6.0.1\lib\netstandard2.0\System.Reactive.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Essentials">
<HintPath>..\packages\Xamarin.Essentials.1.8.1\lib\monoandroid13.0\Xamarin.Essentials.dll</HintPath>
</Reference>
<Reference Include="Splat">
<HintPath>..\packages\Splat.15.1.1\lib\netstandard2.0\Splat.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="MainActivity.cs" />
<Compile Include="Resources\Resource.designer.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="Resources\AboutResources.txt" />
<None Include="Properties\AndroidManifest.xml" />
<None Include="Assets\AboutAssets.txt" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\layout\Tabbar.axml" />
<AndroidResource Include="Resources\layout\Toolbar.axml" />
<AndroidResource Include="Resources\values\styles.xml" />
<AndroidResource Include="Resources\drawable\icon.png" />
<AndroidResource Include="Resources\drawable-hdpi\icon.png" />
<AndroidResource Include="Resources\drawable-xhdpi\icon.png" />
<AndroidResource Include="Resources\drawable-xxhdpi\icon.png" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\qController.Standard\qController.csproj">
<Project>{86160AAC-2150-41B0-BB06-4442CA054A78}</Project>
<Name>qController</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<AndroidAsset Include="Assets\qfont.ttf" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />
<Import Project="..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets" Condition="Exists('..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Migration.1.0.8\build\monoandroid90\Xamarin.AndroidX.Migration.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Migration.1.0.8\build\monoandroid90\Xamarin.AndroidX.Migration.targets')" />
<Import Project="..\packages\Xamarin.Google.Guava.ListenableFuture.1.0.0.2\build\monoandroid50\Xamarin.Google.Guava.ListenableFuture.targets" Condition="Exists('..\packages\Xamarin.Google.Guava.ListenableFuture.1.0.0.2\build\monoandroid50\Xamarin.Google.Guava.ListenableFuture.targets')" />
<Import Project="..\packages\Xamarin.Forms.5.0.0.2012\build\Xamarin.Forms.targets" Condition="Exists('..\packages\Xamarin.Forms.5.0.0.2012\build\Xamarin.Forms.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Annotation.Experimental.1.0.0.9\build\monoandroid9.0\Xamarin.AndroidX.Annotation.Experimental.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Annotation.Experimental.1.0.0.9\build\monoandroid9.0\Xamarin.AndroidX.Annotation.Experimental.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Annotation.1.1.0.9\build\monoandroid9.0\Xamarin.AndroidX.Annotation.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Annotation.1.1.0.9\build\monoandroid9.0\Xamarin.AndroidX.Annotation.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Lifecycle.Common.2.3.0.1\build\monoandroid9.0\Xamarin.AndroidX.Lifecycle.Common.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Lifecycle.Common.2.3.0.1\build\monoandroid9.0\Xamarin.AndroidX.Lifecycle.Common.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Lifecycle.LiveData.Core.2.3.0.1\build\monoandroid9.0\Xamarin.AndroidX.Lifecycle.LiveData.Core.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Lifecycle.LiveData.Core.2.3.0.1\build\monoandroid9.0\Xamarin.AndroidX.Lifecycle.LiveData.Core.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Lifecycle.LiveData.2.3.0.1\build\monoandroid9.0\Xamarin.AndroidX.Lifecycle.LiveData.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Lifecycle.LiveData.2.3.0.1\build\monoandroid9.0\Xamarin.AndroidX.Lifecycle.LiveData.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Lifecycle.Runtime.2.3.0.1\build\monoandroid9.0\Xamarin.AndroidX.Lifecycle.Runtime.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Lifecycle.Runtime.2.3.0.1\build\monoandroid9.0\Xamarin.AndroidX.Lifecycle.Runtime.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Lifecycle.ViewModel.2.3.0.1\build\monoandroid9.0\Xamarin.AndroidX.Lifecycle.ViewModel.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Lifecycle.ViewModel.2.3.0.1\build\monoandroid9.0\Xamarin.AndroidX.Lifecycle.ViewModel.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.2.3.0.1\build\monoandroid9.0\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.2.3.0.1\build\monoandroid9.0\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Activity.1.2.1\build\monoandroid9.0\Xamarin.AndroidX.Activity.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Activity.1.2.1\build\monoandroid9.0\Xamarin.AndroidX.Activity.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Media.1.2.1.2\build\monoandroid9.0\Xamarin.AndroidX.Media.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Media.1.2.1.2\build\monoandroid9.0\Xamarin.AndroidX.Media.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Fragment.1.3.1\build\monoandroid9.0\Xamarin.AndroidX.Fragment.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Fragment.1.3.1\build\monoandroid9.0\Xamarin.AndroidX.Fragment.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Transition.1.4.0.1\build\monoandroid9.0\Xamarin.AndroidX.Transition.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Transition.1.4.0.1\build\monoandroid9.0\Xamarin.AndroidX.Transition.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.MediaRouter.1.2.2.1\build\monoandroid9.0\Xamarin.AndroidX.MediaRouter.targets" Condition="Exists('..\packages\Xamarin.AndroidX.MediaRouter.1.2.2.1\build\monoandroid9.0\Xamarin.AndroidX.MediaRouter.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.MediaRouter.1.2.4.1\build\monoandroid90\Xamarin.AndroidX.MediaRouter.targets" Condition="Exists('..\packages\Xamarin.AndroidX.MediaRouter.1.2.4.1\build\monoandroid90\Xamarin.AndroidX.MediaRouter.targets')" />
<Import Project="..\packages\Xamarin.Google.Android.Material.1.4.0.1\build\monoandroid90\Xamarin.Google.Android.Material.targets" Condition="Exists('..\packages\Xamarin.Google.Android.Material.1.4.0.1\build\monoandroid90\Xamarin.Google.Android.Material.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Activity.1.3.0\build\monoandroid90\Xamarin.AndroidX.Activity.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Activity.1.3.0\build\monoandroid90\Xamarin.AndroidX.Activity.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Annotation.Experimental.1.1.0.3\build\monoandroid90\Xamarin.AndroidX.Annotation.Experimental.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Annotation.Experimental.1.1.0.3\build\monoandroid90\Xamarin.AndroidX.Annotation.Experimental.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.ConstraintLayout.Solver.2.0.4.5\build\monoandroid90\Xamarin.AndroidX.ConstraintLayout.Solver.targets" Condition="Exists('..\packages\Xamarin.AndroidX.ConstraintLayout.Solver.2.0.4.5\build\monoandroid90\Xamarin.AndroidX.ConstraintLayout.Solver.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.MultiDex.2.0.1.10\build\monoandroid90\Xamarin.AndroidX.MultiDex.targets" Condition="Exists('..\packages\Xamarin.AndroidX.MultiDex.2.0.1.10\build\monoandroid90\Xamarin.AndroidX.MultiDex.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Arch.Core.Common.2.1.0.11\build\monoandroid90\Xamarin.AndroidX.Arch.Core.Common.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Arch.Core.Common.2.1.0.11\build\monoandroid90\Xamarin.AndroidX.Arch.Core.Common.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Arch.Core.Runtime.2.1.0.11\build\monoandroid90\Xamarin.AndroidX.Arch.Core.Runtime.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Arch.Core.Runtime.2.1.0.11\build\monoandroid90\Xamarin.AndroidX.Arch.Core.Runtime.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.CursorAdapter.1.0.0.10\build\monoandroid90\Xamarin.AndroidX.CursorAdapter.targets" Condition="Exists('..\packages\Xamarin.AndroidX.CursorAdapter.1.0.0.10\build\monoandroid90\Xamarin.AndroidX.CursorAdapter.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.DocumentFile.1.0.1.10\build\monoandroid90\Xamarin.AndroidX.DocumentFile.targets" Condition="Exists('..\packages\Xamarin.AndroidX.DocumentFile.1.0.1.10\build\monoandroid90\Xamarin.AndroidX.DocumentFile.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Interpolator.1.0.0.10\build\monoandroid90\Xamarin.AndroidX.Interpolator.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Interpolator.1.0.0.10\build\monoandroid90\Xamarin.AndroidX.Interpolator.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Lifecycle.Common.2.3.1.3\build\monoandroid90\Xamarin.AndroidX.Lifecycle.Common.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Lifecycle.Common.2.3.1.3\build\monoandroid90\Xamarin.AndroidX.Lifecycle.Common.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Lifecycle.LiveData.Core.2.3.1.3\build\monoandroid90\Xamarin.AndroidX.Lifecycle.LiveData.Core.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Lifecycle.LiveData.Core.2.3.1.3\build\monoandroid90\Xamarin.AndroidX.Lifecycle.LiveData.Core.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Lifecycle.Runtime.2.3.1.4\build\monoandroid90\Xamarin.AndroidX.Lifecycle.Runtime.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Lifecycle.Runtime.2.3.1.4\build\monoandroid90\Xamarin.AndroidX.Lifecycle.Runtime.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Lifecycle.ViewModel.2.3.1.3\build\monoandroid90\Xamarin.AndroidX.Lifecycle.ViewModel.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Lifecycle.ViewModel.2.3.1.3\build\monoandroid90\Xamarin.AndroidX.Lifecycle.ViewModel.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.LocalBroadcastManager.1.0.0.10\build\monoandroid90\Xamarin.AndroidX.LocalBroadcastManager.targets" Condition="Exists('..\packages\Xamarin.AndroidX.LocalBroadcastManager.1.0.0.10\build\monoandroid90\Xamarin.AndroidX.LocalBroadcastManager.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Print.1.0.0.10\build\monoandroid90\Xamarin.AndroidX.Print.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Print.1.0.0.10\build\monoandroid90\Xamarin.AndroidX.Print.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.SavedState.1.1.0.4\build\monoandroid90\Xamarin.AndroidX.SavedState.targets" Condition="Exists('..\packages\Xamarin.AndroidX.SavedState.1.1.0.4\build\monoandroid90\Xamarin.AndroidX.SavedState.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.2.3.1.3\build\monoandroid90\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.2.3.1.3\build\monoandroid90\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Tracing.Tracing.1.0.0.3\build\monoandroid90\Xamarin.AndroidX.Tracing.Tracing.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Tracing.Tracing.1.0.0.3\build\monoandroid90\Xamarin.AndroidX.Tracing.Tracing.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.VersionedParcelable.1.1.1.10\build\monoandroid90\Xamarin.AndroidX.VersionedParcelable.targets" Condition="Exists('..\packages\Xamarin.AndroidX.VersionedParcelable.1.1.1.10\build\monoandroid90\Xamarin.AndroidX.VersionedParcelable.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.AsyncLayoutInflater.1.0.0.10\build\monoandroid90\Xamarin.AndroidX.AsyncLayoutInflater.targets" Condition="Exists('..\packages\Xamarin.AndroidX.AsyncLayoutInflater.1.0.0.10\build\monoandroid90\Xamarin.AndroidX.AsyncLayoutInflater.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.CustomView.1.1.0.9\build\monoandroid90\Xamarin.AndroidX.CustomView.targets" Condition="Exists('..\packages\Xamarin.AndroidX.CustomView.1.1.0.9\build\monoandroid90\Xamarin.AndroidX.CustomView.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.CoordinatorLayout.1.1.0.10\build\monoandroid90\Xamarin.AndroidX.CoordinatorLayout.targets" Condition="Exists('..\packages\Xamarin.AndroidX.CoordinatorLayout.1.1.0.10\build\monoandroid90\Xamarin.AndroidX.CoordinatorLayout.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.DrawerLayout.1.1.1.5\build\monoandroid90\Xamarin.AndroidX.DrawerLayout.targets" Condition="Exists('..\packages\Xamarin.AndroidX.DrawerLayout.1.1.1.5\build\monoandroid90\Xamarin.AndroidX.DrawerLayout.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Loader.1.1.0.10\build\monoandroid90\Xamarin.AndroidX.Loader.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Loader.1.1.0.10\build\monoandroid90\Xamarin.AndroidX.Loader.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Legacy.Support.Core.Utils.1.0.0.10\build\monoandroid90\Xamarin.AndroidX.Legacy.Support.Core.Utils.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Legacy.Support.Core.Utils.1.0.0.10\build\monoandroid90\Xamarin.AndroidX.Legacy.Support.Core.Utils.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.DynamicAnimation.1.0.0.10\build\monoandroid90\Xamarin.AndroidX.DynamicAnimation.targets" Condition="Exists('..\packages\Xamarin.AndroidX.DynamicAnimation.1.0.0.10\build\monoandroid90\Xamarin.AndroidX.DynamicAnimation.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Navigation.Common.2.3.5.3\build\monoandroid90\Xamarin.AndroidX.Navigation.Common.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Navigation.Common.2.3.5.3\build\monoandroid90\Xamarin.AndroidX.Navigation.Common.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Navigation.Runtime.2.3.5.3\build\monoandroid90\Xamarin.AndroidX.Navigation.Runtime.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Navigation.Runtime.2.3.5.3\build\monoandroid90\Xamarin.AndroidX.Navigation.Runtime.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Palette.1.0.0.10\build\monoandroid90\Xamarin.AndroidX.Palette.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Palette.1.0.0.10\build\monoandroid90\Xamarin.AndroidX.Palette.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.RecyclerView.1.2.1.3\build\monoandroid90\Xamarin.AndroidX.RecyclerView.targets" Condition="Exists('..\packages\Xamarin.AndroidX.RecyclerView.1.2.1.3\build\monoandroid90\Xamarin.AndroidX.RecyclerView.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.SlidingPaneLayout.1.1.0.5\build\monoandroid90\Xamarin.AndroidX.SlidingPaneLayout.targets" Condition="Exists('..\packages\Xamarin.AndroidX.SlidingPaneLayout.1.1.0.5\build\monoandroid90\Xamarin.AndroidX.SlidingPaneLayout.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.SwipeRefreshLayout.1.1.0.5\build\monoandroid90\Xamarin.AndroidX.SwipeRefreshLayout.targets" Condition="Exists('..\packages\Xamarin.AndroidX.SwipeRefreshLayout.1.1.0.5\build\monoandroid90\Xamarin.AndroidX.SwipeRefreshLayout.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.VectorDrawable.1.1.0.10\build\monoandroid90\Xamarin.AndroidX.VectorDrawable.targets" Condition="Exists('..\packages\Xamarin.AndroidX.VectorDrawable.1.1.0.10\build\monoandroid90\Xamarin.AndroidX.VectorDrawable.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.VectorDrawable.Animated.1.1.0.10\build\monoandroid90\Xamarin.AndroidX.VectorDrawable.Animated.targets" Condition="Exists('..\packages\Xamarin.AndroidX.VectorDrawable.Animated.1.1.0.10\build\monoandroid90\Xamarin.AndroidX.VectorDrawable.Animated.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.AppCompat.AppCompatResources.1.3.1.3\build\monoandroid90\Xamarin.AndroidX.AppCompat.AppCompatResources.targets" Condition="Exists('..\packages\Xamarin.AndroidX.AppCompat.AppCompatResources.1.3.1.3\build\monoandroid90\Xamarin.AndroidX.AppCompat.AppCompatResources.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.ViewPager.1.0.0.10\build\monoandroid90\Xamarin.AndroidX.ViewPager.targets" Condition="Exists('..\packages\Xamarin.AndroidX.ViewPager.1.0.0.10\build\monoandroid90\Xamarin.AndroidX.ViewPager.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Fragment.1.3.6.3\build\monoandroid90\Xamarin.AndroidX.Fragment.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Fragment.1.3.6.3\build\monoandroid90\Xamarin.AndroidX.Fragment.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.AppCompat.1.3.1.3\build\monoandroid90\Xamarin.AndroidX.AppCompat.targets" Condition="Exists('..\packages\Xamarin.AndroidX.AppCompat.1.3.1.3\build\monoandroid90\Xamarin.AndroidX.AppCompat.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Legacy.Support.Core.UI.1.0.0.11\build\monoandroid90\Xamarin.AndroidX.Legacy.Support.Core.UI.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Legacy.Support.Core.UI.1.0.0.11\build\monoandroid90\Xamarin.AndroidX.Legacy.Support.Core.UI.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Legacy.Support.V4.1.0.0.10\build\monoandroid90\Xamarin.AndroidX.Legacy.Support.V4.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Legacy.Support.V4.1.0.0.10\build\monoandroid90\Xamarin.AndroidX.Legacy.Support.V4.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Preference.1.1.1.11\build\monoandroid90\Xamarin.AndroidX.Preference.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Preference.1.1.1.11\build\monoandroid90\Xamarin.AndroidX.Preference.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Transition.1.4.1.3\build\monoandroid90\Xamarin.AndroidX.Transition.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Transition.1.4.1.3\build\monoandroid90\Xamarin.AndroidX.Transition.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.ViewPager2.1.0.0.12\build\monoandroid90\Xamarin.AndroidX.ViewPager2.targets" Condition="Exists('..\packages\Xamarin.AndroidX.ViewPager2.1.0.0.12\build\monoandroid90\Xamarin.AndroidX.ViewPager2.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Concurrent.Futures.1.1.0.5\build\monoandroid90\Xamarin.AndroidX.Concurrent.Futures.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Concurrent.Futures.1.1.0.5\build\monoandroid90\Xamarin.AndroidX.Concurrent.Futures.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Browser.1.3.0.8\build\monoandroid90\Xamarin.AndroidX.Browser.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Browser.1.3.0.8\build\monoandroid90\Xamarin.AndroidX.Browser.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.MediaRouter.1.2.5.2\build\monoandroid90\Xamarin.AndroidX.MediaRouter.targets" Condition="Exists('..\packages\Xamarin.AndroidX.MediaRouter.1.2.5.2\build\monoandroid90\Xamarin.AndroidX.MediaRouter.targets')" />
<Import Project="..\packages\Xamarin.Google.Guava.ListenableFuture.1.0.0.5\build\monoandroid90\Xamarin.Google.Guava.ListenableFuture.targets" Condition="Exists('..\packages\Xamarin.Google.Guava.ListenableFuture.1.0.0.5\build\monoandroid90\Xamarin.Google.Guava.ListenableFuture.targets')" />
<Import Project="..\packages\Xamarin.GooglePlayServices.Basement.117.6.0.4\build\monoandroid90\Xamarin.GooglePlayServices.Basement.targets" Condition="Exists('..\packages\Xamarin.GooglePlayServices.Basement.117.6.0.4\build\monoandroid90\Xamarin.GooglePlayServices.Basement.targets')" />
<Import Project="..\packages\Xamarin.GooglePlayServices.Base.117.6.0.3\build\monoandroid90\Xamarin.GooglePlayServices.Base.targets" Condition="Exists('..\packages\Xamarin.GooglePlayServices.Base.117.6.0.3\build\monoandroid90\Xamarin.GooglePlayServices.Base.targets')" />
<Import Project="..\packages\Xamarin.GooglePlayServices.Maps.117.0.1.3\build\monoandroid90\Xamarin.GooglePlayServices.Maps.targets" Condition="Exists('..\packages\Xamarin.GooglePlayServices.Maps.117.0.1.3\build\monoandroid90\Xamarin.GooglePlayServices.Maps.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.ConstraintLayout.Core.1.0.1.2\build\monoandroid90\Xamarin.AndroidX.ConstraintLayout.Core.targets" Condition="Exists('..\packages\Xamarin.AndroidX.ConstraintLayout.Core.1.0.1.2\build\monoandroid90\Xamarin.AndroidX.ConstraintLayout.Core.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Annotation.1.2.0.3\build\monoandroid90\Xamarin.AndroidX.Annotation.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Annotation.1.2.0.3\build\monoandroid90\Xamarin.AndroidX.Annotation.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.CardView.1.0.0.11\build\monoandroid90\Xamarin.AndroidX.CardView.targets" Condition="Exists('..\packages\Xamarin.AndroidX.CardView.1.0.0.11\build\monoandroid90\Xamarin.AndroidX.CardView.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Collection.1.1.0.10\build\monoandroid90\Xamarin.AndroidX.Collection.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Collection.1.1.0.10\build\monoandroid90\Xamarin.AndroidX.Collection.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Core.1.6.0.3\build\monoandroid90\Xamarin.AndroidX.Core.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Core.1.6.0.3\build\monoandroid90\Xamarin.AndroidX.Core.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Media.1.4.2.2\build\monoandroid90\Xamarin.AndroidX.Media.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Media.1.4.2.2\build\monoandroid90\Xamarin.AndroidX.Media.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.ConstraintLayout.2.1.1.2\build\monoandroid90\Xamarin.AndroidX.ConstraintLayout.targets" Condition="Exists('..\packages\Xamarin.AndroidX.ConstraintLayout.2.1.1.2\build\monoandroid90\Xamarin.AndroidX.ConstraintLayout.targets')" />
<Import Project="..\packages\Xamarin.Build.Download.0.10.0\build\Xamarin.Build.Download.targets" Condition="Exists('..\packages\Xamarin.Build.Download.0.10.0\build\Xamarin.Build.Download.targets')" />
<Import Project="..\packages\Xamarin.Forms.5.0.0.2291\build\Xamarin.Forms.targets" Condition="Exists('..\packages\Xamarin.Forms.5.0.0.2291\build\Xamarin.Forms.targets')" />
<Import Project="..\packages\Xamarin.GooglePlayServices.Tasks.117.2.1.3\build\monoandroid90\Xamarin.GooglePlayServices.Tasks.targets" Condition="Exists('..\packages\Xamarin.GooglePlayServices.Tasks.117.2.1.3\build\monoandroid90\Xamarin.GooglePlayServices.Tasks.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Activity.1.3.1.2\build\monoandroid90\Xamarin.AndroidX.Activity.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Activity.1.3.1.2\build\monoandroid90\Xamarin.AndroidX.Activity.targets')" />
<Import Project="..\packages\Xamarin.Kotlin.StdLib.Common.1.6.21\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Common.targets" Condition="Exists('..\packages\Xamarin.Kotlin.StdLib.Common.1.6.21\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Common.targets')" />
<Import Project="..\packages\Xamarin.Kotlin.StdLib.1.6.21\build\monoandroid12.0\Xamarin.Kotlin.StdLib.targets" Condition="Exists('..\packages\Xamarin.Kotlin.StdLib.1.6.21\build\monoandroid12.0\Xamarin.Kotlin.StdLib.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>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}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.CursorAdapter.1.0.0.21\build\monoandroid12.0\Xamarin.AndroidX.CursorAdapter.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.CursorAdapter.1.0.0.21\build\monoandroid12.0\Xamarin.AndroidX.CursorAdapter.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.ResourceInspection.Annotation.1.0.1.9\build\monoandroid12.0\Xamarin.AndroidX.ResourceInspection.Annotation.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.ResourceInspection.Annotation.1.0.1.9\build\monoandroid12.0\Xamarin.AndroidX.ResourceInspection.Annotation.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Lifecycle.LiveData.Core.2.6.2.2\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.LiveData.Core.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Lifecycle.LiveData.Core.2.6.2.2\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.LiveData.Core.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.CustomView.1.1.0.20\build\monoandroid12.0\Xamarin.AndroidX.CustomView.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.CustomView.1.1.0.20\build\monoandroid12.0\Xamarin.AndroidX.CustomView.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.DrawerLayout.1.2.0.5\build\monoandroid12.0\Xamarin.AndroidX.DrawerLayout.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.DrawerLayout.1.2.0.5\build\monoandroid12.0\Xamarin.AndroidX.DrawerLayout.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Lifecycle.Process.2.6.2.2\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.Process.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Lifecycle.Process.2.6.2.2\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.Process.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Emoji2.1.4.0.2\build\monoandroid12.0\Xamarin.AndroidX.Emoji2.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Emoji2.1.4.0.2\build\monoandroid12.0\Xamarin.AndroidX.Emoji2.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Emoji2.ViewsHelper.1.4.0.2\build\monoandroid12.0\Xamarin.AndroidX.Emoji2.ViewsHelper.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Emoji2.ViewsHelper.1.4.0.2\build\monoandroid12.0\Xamarin.AndroidX.Emoji2.ViewsHelper.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Loader.1.1.0.21\build\monoandroid12.0\Xamarin.AndroidX.Loader.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Loader.1.1.0.21\build\monoandroid12.0\Xamarin.AndroidX.Loader.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.2.6.2.2\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.2.6.2.2\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.VectorDrawable.1.1.0.21\build\monoandroid12.0\Xamarin.AndroidX.VectorDrawable.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.VectorDrawable.1.1.0.21\build\monoandroid12.0\Xamarin.AndroidX.VectorDrawable.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.VectorDrawable.Animated.1.1.0.21\build\monoandroid12.0\Xamarin.AndroidX.VectorDrawable.Animated.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.VectorDrawable.Animated.1.1.0.21\build\monoandroid12.0\Xamarin.AndroidX.VectorDrawable.Animated.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.ViewPager.1.0.0.21\build\monoandroid12.0\Xamarin.AndroidX.ViewPager.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.ViewPager.1.0.0.21\build\monoandroid12.0\Xamarin.AndroidX.ViewPager.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.AppCompat.1.6.1.5\build\monoandroid12.0\Xamarin.AndroidX.AppCompat.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.AppCompat.1.6.1.5\build\monoandroid12.0\Xamarin.AndroidX.AppCompat.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.ConstraintLayout.Core.1.0.4.8\build\monoandroid12.0\Xamarin.AndroidX.ConstraintLayout.Core.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.ConstraintLayout.Core.1.0.4.8\build\monoandroid12.0\Xamarin.AndroidX.ConstraintLayout.Core.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.DocumentFile.1.0.1.21\build\monoandroid12.0\Xamarin.AndroidX.DocumentFile.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.DocumentFile.1.0.1.21\build\monoandroid12.0\Xamarin.AndroidX.DocumentFile.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.LocalBroadcastManager.1.1.0.9\build\monoandroid12.0\Xamarin.AndroidX.LocalBroadcastManager.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.LocalBroadcastManager.1.1.0.9\build\monoandroid12.0\Xamarin.AndroidX.LocalBroadcastManager.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Print.1.0.0.21\build\monoandroid12.0\Xamarin.AndroidX.Print.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Print.1.0.0.21\build\monoandroid12.0\Xamarin.AndroidX.Print.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.CoordinatorLayout.1.2.0.9\build\monoandroid12.0\Xamarin.AndroidX.CoordinatorLayout.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.CoordinatorLayout.1.2.0.9\build\monoandroid12.0\Xamarin.AndroidX.CoordinatorLayout.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.CustomView.PoolingContainer.1.0.0.7\build\monoandroid12.0\Xamarin.AndroidX.CustomView.PoolingContainer.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.CustomView.PoolingContainer.1.0.0.7\build\monoandroid12.0\Xamarin.AndroidX.CustomView.PoolingContainer.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Legacy.Support.Core.Utils.1.0.0.21\build\monoandroid12.0\Xamarin.AndroidX.Legacy.Support.Core.Utils.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Legacy.Support.Core.Utils.1.0.0.21\build\monoandroid12.0\Xamarin.AndroidX.Legacy.Support.Core.Utils.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.DynamicAnimation.1.0.0.21\build\monoandroid12.0\Xamarin.AndroidX.DynamicAnimation.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.DynamicAnimation.1.0.0.21\build\monoandroid12.0\Xamarin.AndroidX.DynamicAnimation.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.ConstraintLayout.2.1.4.8\build\monoandroid12.0\Xamarin.AndroidX.ConstraintLayout.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.ConstraintLayout.2.1.4.8\build\monoandroid12.0\Xamarin.AndroidX.ConstraintLayout.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Transition.1.4.1.14\build\monoandroid12.0\Xamarin.AndroidX.Transition.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Transition.1.4.1.14\build\monoandroid12.0\Xamarin.AndroidX.Transition.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.ViewPager2.1.0.0.23\build\monoandroid12.0\Xamarin.AndroidX.ViewPager2.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.ViewPager2.1.0.0.23\build\monoandroid12.0\Xamarin.AndroidX.ViewPager2.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Google.Android.Material.1.8.0.1\build\monoandroid12.0\Xamarin.Google.Android.Material.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Google.Android.Material.1.8.0.1\build\monoandroid12.0\Xamarin.Google.Android.Material.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Collection.Ktx.1.3.0.1\build\monoandroid12.0\Xamarin.AndroidX.Collection.Ktx.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Collection.Ktx.1.3.0.1\build\monoandroid12.0\Xamarin.AndroidX.Collection.Ktx.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Navigation.Common.2.7.5\build\monoandroid12.0\Xamarin.AndroidX.Navigation.Common.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Navigation.Common.2.7.5\build\monoandroid12.0\Xamarin.AndroidX.Navigation.Common.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Navigation.Runtime.2.7.5\build\monoandroid12.0\Xamarin.AndroidX.Navigation.Runtime.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Navigation.Runtime.2.7.5\build\monoandroid12.0\Xamarin.AndroidX.Navigation.Runtime.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Window.Extensions.Core.Core.1.0.0.3\build\monoandroid12.0\Xamarin.AndroidX.Window.Extensions.Core.Core.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Window.Extensions.Core.Core.1.0.0.3\build\monoandroid12.0\Xamarin.AndroidX.Window.Extensions.Core.Core.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.SwipeRefreshLayout.1.1.0.16\build\monoandroid12.0\Xamarin.AndroidX.SwipeRefreshLayout.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.SwipeRefreshLayout.1.1.0.16\build\monoandroid12.0\Xamarin.AndroidX.SwipeRefreshLayout.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.SlidingPaneLayout.1.2.0.9\build\monoandroid12.0\Xamarin.AndroidX.SlidingPaneLayout.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.SlidingPaneLayout.1.2.0.9\build\monoandroid12.0\Xamarin.AndroidX.SlidingPaneLayout.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Legacy.Support.Core.UI.1.0.0.22\build\monoandroid12.0\Xamarin.AndroidX.Legacy.Support.Core.UI.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Legacy.Support.Core.UI.1.0.0.22\build\monoandroid12.0\Xamarin.AndroidX.Legacy.Support.Core.UI.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.GooglePlayServices.Basement.118.2.0.4\build\monoandroid12.0\Xamarin.GooglePlayServices.Basement.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.GooglePlayServices.Basement.118.2.0.4\build\monoandroid12.0\Xamarin.GooglePlayServices.Basement.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.GooglePlayServices.Tasks.118.0.2.5\build\monoandroid12.0\Xamarin.GooglePlayServices.Tasks.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.GooglePlayServices.Tasks.118.0.2.5\build\monoandroid12.0\Xamarin.GooglePlayServices.Tasks.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Palette.1.0.0.21\build\monoandroid12.0\Xamarin.AndroidX.Palette.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Palette.1.0.0.21\build\monoandroid12.0\Xamarin.AndroidX.Palette.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Lifecycle.LiveData.Core.Ktx.2.6.2.2\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.LiveData.Core.Ktx.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Lifecycle.LiveData.Core.Ktx.2.6.2.2\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.LiveData.Core.Ktx.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Fragment.1.6.2\build\monoandroid12.0\Xamarin.AndroidX.Fragment.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Fragment.1.6.2\build\monoandroid12.0\Xamarin.AndroidX.Fragment.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Fragment.Ktx.1.6.2\build\monoandroid12.0\Xamarin.AndroidX.Fragment.Ktx.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Fragment.Ktx.1.6.2\build\monoandroid12.0\Xamarin.AndroidX.Fragment.Ktx.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.ConstraintLayout.Solver.2.0.4.16\build\monoandroid12.0\Xamarin.AndroidX.ConstraintLayout.Solver.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.ConstraintLayout.Solver.2.0.4.16\build\monoandroid12.0\Xamarin.AndroidX.ConstraintLayout.Solver.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Media.1.6.0.8\build\monoandroid12.0\Xamarin.AndroidX.Media.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Media.1.6.0.8\build\monoandroid12.0\Xamarin.AndroidX.Media.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.MediaRouter.1.6.0.1\build\monoandroid12.0\Xamarin.AndroidX.MediaRouter.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.MediaRouter.1.6.0.1\build\monoandroid12.0\Xamarin.AndroidX.MediaRouter.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Kotlin.StdLib.Common.1.9.20\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Common.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Kotlin.StdLib.Common.1.9.20\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Common.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Preference.1.2.1.2\build\monoandroid12.0\Xamarin.AndroidX.Preference.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Preference.1.2.1.2\build\monoandroid12.0\Xamarin.AndroidX.Preference.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Window.1.2.0\build\monoandroid12.0\Xamarin.AndroidX.Window.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Window.1.2.0\build\monoandroid12.0\Xamarin.AndroidX.Window.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.RecyclerView.1.3.2\build\monoandroid12.0\Xamarin.AndroidX.RecyclerView.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.RecyclerView.1.3.2\build\monoandroid12.0\Xamarin.AndroidX.RecyclerView.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Legacy.Support.V4.1.0.0.21\build\monoandroid12.0\Xamarin.AndroidX.Legacy.Support.V4.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Legacy.Support.V4.1.0.0.21\build\monoandroid12.0\Xamarin.AndroidX.Legacy.Support.V4.targets'))" />
</Target>
<Import Project="..\packages\Xamarin.AndroidX.CursorAdapter.1.0.0.21\build\monoandroid12.0\Xamarin.AndroidX.CursorAdapter.targets" Condition="Exists('..\packages\Xamarin.AndroidX.CursorAdapter.1.0.0.21\build\monoandroid12.0\Xamarin.AndroidX.CursorAdapter.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.ResourceInspection.Annotation.1.0.1.9\build\monoandroid12.0\Xamarin.AndroidX.ResourceInspection.Annotation.targets" Condition="Exists('..\packages\Xamarin.AndroidX.ResourceInspection.Annotation.1.0.1.9\build\monoandroid12.0\Xamarin.AndroidX.ResourceInspection.Annotation.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Lifecycle.LiveData.Core.2.6.2.2\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.LiveData.Core.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Lifecycle.LiveData.Core.2.6.2.2\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.LiveData.Core.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.CustomView.1.1.0.20\build\monoandroid12.0\Xamarin.AndroidX.CustomView.targets" Condition="Exists('..\packages\Xamarin.AndroidX.CustomView.1.1.0.20\build\monoandroid12.0\Xamarin.AndroidX.CustomView.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.DrawerLayout.1.2.0.5\build\monoandroid12.0\Xamarin.AndroidX.DrawerLayout.targets" Condition="Exists('..\packages\Xamarin.AndroidX.DrawerLayout.1.2.0.5\build\monoandroid12.0\Xamarin.AndroidX.DrawerLayout.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Lifecycle.Process.2.6.2.2\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.Process.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Lifecycle.Process.2.6.2.2\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.Process.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Emoji2.1.4.0.2\build\monoandroid12.0\Xamarin.AndroidX.Emoji2.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Emoji2.1.4.0.2\build\monoandroid12.0\Xamarin.AndroidX.Emoji2.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Emoji2.ViewsHelper.1.4.0.2\build\monoandroid12.0\Xamarin.AndroidX.Emoji2.ViewsHelper.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Emoji2.ViewsHelper.1.4.0.2\build\monoandroid12.0\Xamarin.AndroidX.Emoji2.ViewsHelper.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Loader.1.1.0.21\build\monoandroid12.0\Xamarin.AndroidX.Loader.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Loader.1.1.0.21\build\monoandroid12.0\Xamarin.AndroidX.Loader.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.2.6.2.2\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.2.6.2.2\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.VectorDrawable.1.1.0.21\build\monoandroid12.0\Xamarin.AndroidX.VectorDrawable.targets" Condition="Exists('..\packages\Xamarin.AndroidX.VectorDrawable.1.1.0.21\build\monoandroid12.0\Xamarin.AndroidX.VectorDrawable.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.VectorDrawable.Animated.1.1.0.21\build\monoandroid12.0\Xamarin.AndroidX.VectorDrawable.Animated.targets" Condition="Exists('..\packages\Xamarin.AndroidX.VectorDrawable.Animated.1.1.0.21\build\monoandroid12.0\Xamarin.AndroidX.VectorDrawable.Animated.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.ViewPager.1.0.0.21\build\monoandroid12.0\Xamarin.AndroidX.ViewPager.targets" Condition="Exists('..\packages\Xamarin.AndroidX.ViewPager.1.0.0.21\build\monoandroid12.0\Xamarin.AndroidX.ViewPager.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.AppCompat.1.6.1.5\build\monoandroid12.0\Xamarin.AndroidX.AppCompat.targets" Condition="Exists('..\packages\Xamarin.AndroidX.AppCompat.1.6.1.5\build\monoandroid12.0\Xamarin.AndroidX.AppCompat.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.ConstraintLayout.Core.1.0.4.8\build\monoandroid12.0\Xamarin.AndroidX.ConstraintLayout.Core.targets" Condition="Exists('..\packages\Xamarin.AndroidX.ConstraintLayout.Core.1.0.4.8\build\monoandroid12.0\Xamarin.AndroidX.ConstraintLayout.Core.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.DocumentFile.1.0.1.21\build\monoandroid12.0\Xamarin.AndroidX.DocumentFile.targets" Condition="Exists('..\packages\Xamarin.AndroidX.DocumentFile.1.0.1.21\build\monoandroid12.0\Xamarin.AndroidX.DocumentFile.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.LocalBroadcastManager.1.1.0.9\build\monoandroid12.0\Xamarin.AndroidX.LocalBroadcastManager.targets" Condition="Exists('..\packages\Xamarin.AndroidX.LocalBroadcastManager.1.1.0.9\build\monoandroid12.0\Xamarin.AndroidX.LocalBroadcastManager.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Print.1.0.0.21\build\monoandroid12.0\Xamarin.AndroidX.Print.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Print.1.0.0.21\build\monoandroid12.0\Xamarin.AndroidX.Print.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.CoordinatorLayout.1.2.0.9\build\monoandroid12.0\Xamarin.AndroidX.CoordinatorLayout.targets" Condition="Exists('..\packages\Xamarin.AndroidX.CoordinatorLayout.1.2.0.9\build\monoandroid12.0\Xamarin.AndroidX.CoordinatorLayout.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.CustomView.PoolingContainer.1.0.0.7\build\monoandroid12.0\Xamarin.AndroidX.CustomView.PoolingContainer.targets" Condition="Exists('..\packages\Xamarin.AndroidX.CustomView.PoolingContainer.1.0.0.7\build\monoandroid12.0\Xamarin.AndroidX.CustomView.PoolingContainer.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Legacy.Support.Core.Utils.1.0.0.21\build\monoandroid12.0\Xamarin.AndroidX.Legacy.Support.Core.Utils.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Legacy.Support.Core.Utils.1.0.0.21\build\monoandroid12.0\Xamarin.AndroidX.Legacy.Support.Core.Utils.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.DynamicAnimation.1.0.0.21\build\monoandroid12.0\Xamarin.AndroidX.DynamicAnimation.targets" Condition="Exists('..\packages\Xamarin.AndroidX.DynamicAnimation.1.0.0.21\build\monoandroid12.0\Xamarin.AndroidX.DynamicAnimation.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.ConstraintLayout.2.1.4.8\build\monoandroid12.0\Xamarin.AndroidX.ConstraintLayout.targets" Condition="Exists('..\packages\Xamarin.AndroidX.ConstraintLayout.2.1.4.8\build\monoandroid12.0\Xamarin.AndroidX.ConstraintLayout.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Transition.1.4.1.14\build\monoandroid12.0\Xamarin.AndroidX.Transition.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Transition.1.4.1.14\build\monoandroid12.0\Xamarin.AndroidX.Transition.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.ViewPager2.1.0.0.23\build\monoandroid12.0\Xamarin.AndroidX.ViewPager2.targets" Condition="Exists('..\packages\Xamarin.AndroidX.ViewPager2.1.0.0.23\build\monoandroid12.0\Xamarin.AndroidX.ViewPager2.targets')" />
<Import Project="..\packages\Xamarin.Google.Android.Material.1.8.0.1\build\monoandroid12.0\Xamarin.Google.Android.Material.targets" Condition="Exists('..\packages\Xamarin.Google.Android.Material.1.8.0.1\build\monoandroid12.0\Xamarin.Google.Android.Material.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Collection.Ktx.1.3.0.1\build\monoandroid12.0\Xamarin.AndroidX.Collection.Ktx.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Collection.Ktx.1.3.0.1\build\monoandroid12.0\Xamarin.AndroidX.Collection.Ktx.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Navigation.Common.2.7.5\build\monoandroid12.0\Xamarin.AndroidX.Navigation.Common.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Navigation.Common.2.7.5\build\monoandroid12.0\Xamarin.AndroidX.Navigation.Common.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Navigation.Runtime.2.7.5\build\monoandroid12.0\Xamarin.AndroidX.Navigation.Runtime.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Navigation.Runtime.2.7.5\build\monoandroid12.0\Xamarin.AndroidX.Navigation.Runtime.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Window.Extensions.Core.Core.1.0.0.3\build\monoandroid12.0\Xamarin.AndroidX.Window.Extensions.Core.Core.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Window.Extensions.Core.Core.1.0.0.3\build\monoandroid12.0\Xamarin.AndroidX.Window.Extensions.Core.Core.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.SwipeRefreshLayout.1.1.0.16\build\monoandroid12.0\Xamarin.AndroidX.SwipeRefreshLayout.targets" Condition="Exists('..\packages\Xamarin.AndroidX.SwipeRefreshLayout.1.1.0.16\build\monoandroid12.0\Xamarin.AndroidX.SwipeRefreshLayout.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.SlidingPaneLayout.1.2.0.9\build\monoandroid12.0\Xamarin.AndroidX.SlidingPaneLayout.targets" Condition="Exists('..\packages\Xamarin.AndroidX.SlidingPaneLayout.1.2.0.9\build\monoandroid12.0\Xamarin.AndroidX.SlidingPaneLayout.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Legacy.Support.Core.UI.1.0.0.22\build\monoandroid12.0\Xamarin.AndroidX.Legacy.Support.Core.UI.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Legacy.Support.Core.UI.1.0.0.22\build\monoandroid12.0\Xamarin.AndroidX.Legacy.Support.Core.UI.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.MultiDex.2.0.1.21\build\monoandroid12.0\Xamarin.AndroidX.MultiDex.targets" Condition="Exists('..\packages\Xamarin.AndroidX.MultiDex.2.0.1.21\build\monoandroid12.0\Xamarin.AndroidX.MultiDex.targets')" />
<Import Project="..\packages\Xamarin.GooglePlayServices.Basement.118.2.0.4\build\monoandroid12.0\Xamarin.GooglePlayServices.Basement.targets" Condition="Exists('..\packages\Xamarin.GooglePlayServices.Basement.118.2.0.4\build\monoandroid12.0\Xamarin.GooglePlayServices.Basement.targets')" />
<Import Project="..\packages\Xamarin.GooglePlayServices.Tasks.118.0.2.5\build\monoandroid12.0\Xamarin.GooglePlayServices.Tasks.targets" Condition="Exists('..\packages\Xamarin.GooglePlayServices.Tasks.118.0.2.5\build\monoandroid12.0\Xamarin.GooglePlayServices.Tasks.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Palette.1.0.0.21\build\monoandroid12.0\Xamarin.AndroidX.Palette.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Palette.1.0.0.21\build\monoandroid12.0\Xamarin.AndroidX.Palette.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Lifecycle.LiveData.Core.Ktx.2.6.2.2\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.LiveData.Core.Ktx.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Lifecycle.LiveData.Core.Ktx.2.6.2.2\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.LiveData.Core.Ktx.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Fragment.1.6.2\build\monoandroid12.0\Xamarin.AndroidX.Fragment.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Fragment.1.6.2\build\monoandroid12.0\Xamarin.AndroidX.Fragment.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Fragment.Ktx.1.6.2\build\monoandroid12.0\Xamarin.AndroidX.Fragment.Ktx.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Fragment.Ktx.1.6.2\build\monoandroid12.0\Xamarin.AndroidX.Fragment.Ktx.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.ConstraintLayout.Solver.2.0.4.16\build\monoandroid12.0\Xamarin.AndroidX.ConstraintLayout.Solver.targets" Condition="Exists('..\packages\Xamarin.AndroidX.ConstraintLayout.Solver.2.0.4.16\build\monoandroid12.0\Xamarin.AndroidX.ConstraintLayout.Solver.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Media.1.6.0.8\build\monoandroid12.0\Xamarin.AndroidX.Media.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Media.1.6.0.8\build\monoandroid12.0\Xamarin.AndroidX.Media.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.MediaRouter.1.6.0.1\build\monoandroid12.0\Xamarin.AndroidX.MediaRouter.targets" Condition="Exists('..\packages\Xamarin.AndroidX.MediaRouter.1.6.0.1\build\monoandroid12.0\Xamarin.AndroidX.MediaRouter.targets')" />
<Import Project="..\packages\Xamarin.Kotlin.StdLib.Common.1.9.20\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Common.targets" Condition="Exists('..\packages\Xamarin.Kotlin.StdLib.Common.1.9.20\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Common.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Preference.1.2.1.2\build\monoandroid12.0\Xamarin.AndroidX.Preference.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Preference.1.2.1.2\build\monoandroid12.0\Xamarin.AndroidX.Preference.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Window.1.2.0\build\monoandroid12.0\Xamarin.AndroidX.Window.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Window.1.2.0\build\monoandroid12.0\Xamarin.AndroidX.Window.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.RecyclerView.1.3.2\build\monoandroid12.0\Xamarin.AndroidX.RecyclerView.targets" Condition="Exists('..\packages\Xamarin.AndroidX.RecyclerView.1.3.2\build\monoandroid12.0\Xamarin.AndroidX.RecyclerView.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Legacy.Support.V4.1.0.0.21\build\monoandroid12.0\Xamarin.AndroidX.Legacy.Support.V4.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Legacy.Support.V4.1.0.0.21\build\monoandroid12.0\Xamarin.AndroidX.Legacy.Support.V4.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Browser.1.5.0.3\build\monoandroid12.0\Xamarin.AndroidX.Browser.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Browser.1.5.0.3\build\monoandroid12.0\Xamarin.AndroidX.Browser.targets')" />
<Import Project="..\packages\Xamarin.Google.Android.Material.1.8.0.1\build\monoandroid12.0\Xamarin.Google.Android.Material.targets" Condition="Exists('..\packages\Xamarin.Google.Android.Material.1.8.0.1\build\monoandroid12.0\Xamarin.Google.Android.Material.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Lifecycle.LiveData.2.3.1.1\build\monoandroid90\Xamarin.AndroidX.Lifecycle.LiveData.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Lifecycle.LiveData.2.3.1.1\build\monoandroid90\Xamarin.AndroidX.Lifecycle.LiveData.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Navigation.UI.2.3.5.1\build\monoandroid90\Xamarin.AndroidX.Navigation.UI.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Navigation.UI.2.3.5.1\build\monoandroid90\Xamarin.AndroidX.Navigation.UI.targets')" />
<Import Project="..\packages\Xamarin.GooglePlayServices.Maps.118.1.0.5\build\monoandroid12.0\Xamarin.GooglePlayServices.Maps.targets" Condition="Exists('..\packages\Xamarin.GooglePlayServices.Maps.118.1.0.5\build\monoandroid12.0\Xamarin.GooglePlayServices.Maps.targets')" />
<Import Project="..\packages\Xamarin.GooglePlayServices.Stats.117.0.3.7\build\monoandroid12.0\Xamarin.GooglePlayServices.Stats.targets" Condition="Exists('..\packages\Xamarin.GooglePlayServices.Stats.117.0.3.7\build\monoandroid12.0\Xamarin.GooglePlayServices.Stats.targets')" />
<Import Project="..\packages\Xamarin.GooglePlayServices.Base.118.2.0.4\build\monoandroid12.0\Xamarin.GooglePlayServices.Base.targets" Condition="Exists('..\packages\Xamarin.GooglePlayServices.Base.118.2.0.4\build\monoandroid12.0\Xamarin.GooglePlayServices.Base.targets')" />
<Import Project="..\packages\Xamarin.Google.Guava.ListenableFuture.1.0.0.16\build\monoandroid12.0\Xamarin.Google.Guava.ListenableFuture.targets" Condition="Exists('..\packages\Xamarin.Google.Guava.ListenableFuture.1.0.0.16\build\monoandroid12.0\Xamarin.Google.Guava.ListenableFuture.targets')" />
<Import Project="..\packages\Xamarin.Kotlin.StdLib.1.9.20\build\monoandroid12.0\Xamarin.Kotlin.StdLib.targets" Condition="Exists('..\packages\Xamarin.Kotlin.StdLib.1.9.20\build\monoandroid12.0\Xamarin.Kotlin.StdLib.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Arch.Core.Common.2.2.0.5\build\monoandroid12.0\Xamarin.AndroidX.Arch.Core.Common.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Arch.Core.Common.2.2.0.5\build\monoandroid12.0\Xamarin.AndroidX.Arch.Core.Common.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Collection.Jvm.1.3.0.1\build\monoandroid12.0\Xamarin.AndroidX.Collection.Jvm.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Collection.Jvm.1.3.0.1\build\monoandroid12.0\Xamarin.AndroidX.Collection.Jvm.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Collection.1.3.0.1\build\monoandroid12.0\Xamarin.AndroidX.Collection.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Collection.1.3.0.1\build\monoandroid12.0\Xamarin.AndroidX.Collection.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Concurrent.Futures.1.1.0.16\build\monoandroid12.0\Xamarin.AndroidX.Concurrent.Futures.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Concurrent.Futures.1.1.0.16\build\monoandroid12.0\Xamarin.AndroidX.Concurrent.Futures.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Interpolator.1.0.0.21\build\monoandroid12.0\Xamarin.AndroidX.Interpolator.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Interpolator.1.0.0.21\build\monoandroid12.0\Xamarin.AndroidX.Interpolator.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Lifecycle.ViewModel.2.6.2.2\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.ViewModel.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Lifecycle.ViewModel.2.6.2.2\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.ViewModel.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Tracing.Tracing.1.1.0.8\build\monoandroid12.0\Xamarin.AndroidX.Tracing.Tracing.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Tracing.Tracing.1.1.0.8\build\monoandroid12.0\Xamarin.AndroidX.Tracing.Tracing.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Startup.StartupRuntime.1.1.1.9\build\monoandroid12.0\Xamarin.AndroidX.Startup.StartupRuntime.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Startup.StartupRuntime.1.1.1.9\build\monoandroid12.0\Xamarin.AndroidX.Startup.StartupRuntime.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.ProfileInstaller.ProfileInstaller.1.3.1.4\build\monoandroid12.0\Xamarin.AndroidX.ProfileInstaller.ProfileInstaller.targets" Condition="Exists('..\packages\Xamarin.AndroidX.ProfileInstaller.ProfileInstaller.1.3.1.4\build\monoandroid12.0\Xamarin.AndroidX.ProfileInstaller.ProfileInstaller.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.VersionedParcelable.1.1.1.21\build\monoandroid12.0\Xamarin.AndroidX.VersionedParcelable.targets" Condition="Exists('..\packages\Xamarin.AndroidX.VersionedParcelable.1.1.1.21\build\monoandroid12.0\Xamarin.AndroidX.VersionedParcelable.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Lifecycle.Common.2.6.2.2\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.Common.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Lifecycle.Common.2.6.2.2\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.Common.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Lifecycle.Runtime.2.6.2.2\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.Runtime.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Lifecycle.Runtime.2.6.2.2\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.Runtime.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Core.1.12.0.2\build\monoandroid12.0\Xamarin.AndroidX.Core.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Core.1.12.0.2\build\monoandroid12.0\Xamarin.AndroidX.Core.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Core.Core.Ktx.1.12.0.2\build\monoandroid12.0\Xamarin.AndroidX.Core.Core.Ktx.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Core.Core.Ktx.1.12.0.2\build\monoandroid12.0\Xamarin.AndroidX.Core.Core.Ktx.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Lifecycle.Runtime.Ktx.2.6.2.2\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.Runtime.Ktx.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Lifecycle.Runtime.Ktx.2.6.2.2\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.Runtime.Ktx.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Lifecycle.ViewModel.Ktx.2.6.2.2\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.ViewModel.Ktx.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Lifecycle.ViewModel.Ktx.2.6.2.2\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.ViewModel.Ktx.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.SavedState.1.2.1.5\build\monoandroid12.0\Xamarin.AndroidX.SavedState.targets" Condition="Exists('..\packages\Xamarin.AndroidX.SavedState.1.2.1.5\build\monoandroid12.0\Xamarin.AndroidX.SavedState.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Activity.1.8.1\build\monoandroid12.0\Xamarin.AndroidX.Activity.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Activity.1.8.1\build\monoandroid12.0\Xamarin.AndroidX.Activity.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.SavedState.SavedState.Ktx.1.2.1.5\build\monoandroid12.0\Xamarin.AndroidX.SavedState.SavedState.Ktx.targets" Condition="Exists('..\packages\Xamarin.AndroidX.SavedState.SavedState.Ktx.1.2.1.5\build\monoandroid12.0\Xamarin.AndroidX.SavedState.SavedState.Ktx.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Activity.Ktx.1.8.1\build\monoandroid12.0\Xamarin.AndroidX.Activity.Ktx.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Activity.Ktx.1.8.1\build\monoandroid12.0\Xamarin.AndroidX.Activity.Ktx.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Annotation.1.7.0.2\build\monoandroid12.0\Xamarin.AndroidX.Annotation.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Annotation.1.7.0.2\build\monoandroid12.0\Xamarin.AndroidX.Annotation.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Annotation.Experimental.1.3.1.3\build\monoandroid12.0\Xamarin.AndroidX.Annotation.Experimental.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Annotation.Experimental.1.3.1.3\build\monoandroid12.0\Xamarin.AndroidX.Annotation.Experimental.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Annotation.Jvm.1.7.0.2\build\monoandroid12.0\Xamarin.AndroidX.Annotation.Jvm.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Annotation.Jvm.1.7.0.2\build\monoandroid12.0\Xamarin.AndroidX.Annotation.Jvm.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.AppCompat.AppCompatResources.1.6.1.6\build\monoandroid12.0\Xamarin.AndroidX.AppCompat.AppCompatResources.targets" Condition="Exists('..\packages\Xamarin.AndroidX.AppCompat.AppCompatResources.1.6.1.6\build\monoandroid12.0\Xamarin.AndroidX.AppCompat.AppCompatResources.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Arch.Core.Runtime.2.2.0.5\build\monoandroid12.0\Xamarin.AndroidX.Arch.Core.Runtime.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Arch.Core.Runtime.2.2.0.5\build\monoandroid12.0\Xamarin.AndroidX.Arch.Core.Runtime.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.AsyncLayoutInflater.1.0.0.21\build\monoandroid12.0\Xamarin.AndroidX.AsyncLayoutInflater.targets" Condition="Exists('..\packages\Xamarin.AndroidX.AsyncLayoutInflater.1.0.0.21\build\monoandroid12.0\Xamarin.AndroidX.AsyncLayoutInflater.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.CardView.1.0.0.23\build\monoandroid12.0\Xamarin.AndroidX.CardView.targets" Condition="Exists('..\packages\Xamarin.AndroidX.CardView.1.0.0.23\build\monoandroid12.0\Xamarin.AndroidX.CardView.targets')" />
<Import Project="..\packages\Xamarin.KotlinX.Coroutines.Android.1.7.3.2\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Android.targets" Condition="Exists('..\packages\Xamarin.KotlinX.Coroutines.Android.1.7.3.2\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Android.targets')" />
<Import Project="..\packages\Xamarin.Forms.5.0.0.2662\build\Xamarin.Forms.targets" Condition="Exists('..\packages\Xamarin.Forms.5.0.0.2662\build\Xamarin.Forms.targets')" />
<Import Project="..\packages\Xamarin.KotlinX.Coroutines.Core.Jvm.1.7.3.2\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Core.Jvm.targets" Condition="Exists('..\packages\Xamarin.KotlinX.Coroutines.Core.Jvm.1.7.3.2\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Core.Jvm.targets')" />
<Import Project="..\packages\Xamarin.Kotlin.StdLib.Jdk8.1.9.20\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Jdk8.targets" Condition="Exists('..\packages\Xamarin.Kotlin.StdLib.Jdk8.1.9.20\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Jdk8.targets')" />
<Import Project="..\packages\Xamarin.Kotlin.StdLib.Jdk7.1.9.20\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Jdk7.targets" Condition="Exists('..\packages\Xamarin.Kotlin.StdLib.Jdk7.1.9.20\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Jdk7.targets')" />
<Import Project="..\packages\Xamarin.Jetbrains.Annotations.24.1.0\build\monoandroid12.0\Xamarin.Jetbrains.Annotations.targets" Condition="Exists('..\packages\Xamarin.Jetbrains.Annotations.24.1.0\build\monoandroid12.0\Xamarin.Jetbrains.Annotations.targets')" />
</Project>
-20
View File
@@ -1,20 +0,0 @@
using Foundation;
using UIKit;
using Serilog;
namespace qController.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();
Log.Logger = new LoggerConfiguration().WriteTo.NSLog().MinimumLevel.Error().CreateLogger();
LoadApplication(new App());
return base.FinishedLaunching(app, options);
}
}
}
@@ -1,246 +0,0 @@
{
"images": [
{
"filename": "icon_20pt@2x.png",
"size": "20x20",
"scale": "2x",
"idiom": "iphone"
},
{
"filename": "icon_20pt@3x.png",
"size": "20x20",
"scale": "3x",
"idiom": "iphone"
},
{
"filename": "icon_29pt@2x.png",
"size": "29x29",
"scale": "2x",
"idiom": "iphone"
},
{
"filename": "icon_29pt@3x.png",
"size": "29x29",
"scale": "3x",
"idiom": "iphone"
},
{
"filename": "icon_40pt@2x.png",
"size": "40x40",
"scale": "2x",
"idiom": "iphone"
},
{
"size": "40x40",
"scale": "3x",
"idiom": "iphone"
},
{
"filename": "icon_60pt@2x.png",
"size": "60x60",
"scale": "2x",
"idiom": "iphone"
},
{
"filename": "icon_60pt@3x.png",
"size": "60x60",
"scale": "3x",
"idiom": "iphone"
},
{
"filename": "icon_20pt.png",
"size": "20x20",
"scale": "1x",
"idiom": "ipad"
},
{
"filename": "icon_20pt@2x.png",
"size": "20x20",
"scale": "2x",
"idiom": "ipad"
},
{
"size": "29x29",
"scale": "1x",
"idiom": "ipad"
},
{
"size": "29x29",
"scale": "2x",
"idiom": "ipad"
},
{
"filename": "icon_40pt.png",
"size": "40x40",
"scale": "1x",
"idiom": "ipad"
},
{
"filename": "icon_40pt@2x.png",
"size": "40x40",
"scale": "2x",
"idiom": "ipad"
},
{
"filename": "icon_83.5@2x.png",
"size": "83.5x83.5",
"scale": "2x",
"idiom": "ipad"
},
{
"filename": "icon_76pt.png",
"size": "76x76",
"scale": "1x",
"idiom": "ipad"
},
{
"filename": "icon_76pt@2x.png",
"size": "76x76",
"scale": "2x",
"idiom": "ipad"
},
{
"filename": "Icon.png",
"size": "1024x1024",
"scale": "1x",
"idiom": "ios-marketing"
},
{
"size": "60x60",
"scale": "2x",
"idiom": "car"
},
{
"size": "60x60",
"scale": "3x",
"idiom": "car"
},
{
"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": "appLauncher",
"size": "44x44",
"subtype": "40mm",
"scale": "2x",
"idiom": "watch"
},
{
"role": "appLauncher",
"size": "50x50",
"subtype": "44mm",
"scale": "2x",
"idiom": "watch"
},
{
"role": "quickLook",
"size": "86x86",
"subtype": "38mm",
"scale": "2x",
"idiom": "watch"
},
{
"role": "quickLook",
"size": "98x98",
"subtype": "42mm",
"scale": "2x",
"idiom": "watch"
},
{
"role": "quickLook",
"size": "108x108",
"subtype": "44mm",
"scale": "2x",
"idiom": "watch"
},
{
"size": "1024x1024",
"scale": "1x",
"idiom": "watch-marketing"
},
{
"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"
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 714 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

-6
View File
@@ -1,6 +0,0 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
-6
View File
@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
</dict>
</plist>
-49
View File
@@ -1,49 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDisplayName</key>
<string>qControl</string>
<key>CFBundleName</key>
<string>qControl</string>
<key>CFBundleIdentifier</key>
<string>com.jwetzell.qController</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>MinimumOSVersion</key>
<string>8.0</string>
<key>UIDeviceFamily</key>
<array>
<integer>1</integer>
</array>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>XSAppIconAssets</key>
<string>Assets.xcassets/AppIcon.appiconset</string>
<key>CFBundleShortVersionString</key>
<string>2.2.8</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>UIAppFonts</key>
<array>
<string>qfont.ttf</string>
</array>
</dict>
</plist>
-27
View File
@@ -1,27 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="9532" systemVersion="15D21" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" initialViewController="01J-lp-oVM">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9530"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="Llm-lL-Icb"/>
<viewControllerLayoutGuide type="bottom" id="xb3-aO-Qok"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<rect key="frame" x="0.0" y="0.0" width="414" height="736"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" colorSpace="custom" customColorSpace="sRGB" red="0.290160656" green="0.2902164459" blue="0.2901571095" alpha="1"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
</document>
-12
View File
@@ -1,12 +0,0 @@
using UIKit;
namespace qController.iOS
{
public class Application
{
static void Main(string[] args)
{
UIApplication.Main(args, null, typeof(AppDelegate));
}
}
}
Binary file not shown.
-15
View File
@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Reactive" publicKeyToken="94bc3704cddfc263" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
-88
View File
@@ -1,88 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Acr.Settings" version="9.0.1" targetFramework="xamarinios10" />
<package id="Acr.UserDialogs" version="7.2.0.562" targetFramework="xamarinios10" />
<package id="BTProgressHUD" version="1.5.0" targetFramework="xamarinios10" />
<package id="Microsoft.CSharp" version="4.7.0" targetFramework="xamarinios10" />
<package id="Microsoft.NETCore.Platforms" version="7.0.4" targetFramework="xamarinios10" />
<package id="Microsoft.Win32.Primitives" version="4.3.0" targetFramework="xamarinios10" />
<package id="NETStandard.Library" version="2.0.3" targetFramework="xamarinios10" />
<package id="Newtonsoft.Json" version="13.0.3" targetFramework="xamarinios10" />
<package id="Serilog" version="3.1.1" targetFramework="xamarinios10" />
<package id="Serilog.Sinks.Xamarin" version="1.0.0" targetFramework="xamarinios10" />
<package id="System.AppContext" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Buffers" version="4.5.1" targetFramework="xamarinios10" />
<package id="System.Collections" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Collections.Concurrent" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Collections.NonGeneric" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.ComponentModel" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.ComponentModel.TypeConverter" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Console" version="4.3.1" targetFramework="xamarinios10" />
<package id="System.Diagnostics.Contracts" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Diagnostics.Debug" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Diagnostics.DiagnosticSource" version="8.0.1" targetFramework="xamarinios10" />
<package id="System.Diagnostics.Process" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Diagnostics.StackTrace" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Diagnostics.Tools" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Diagnostics.TraceSource" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Diagnostics.Tracing" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Dynamic.Runtime" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Globalization" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Globalization.Calendars" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.IO" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.IO.Compression" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.IO.Compression.ZipFile" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.IO.FileSystem" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.IO.FileSystem.Primitives" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.IO.FileSystem.Watcher" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Linq" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Linq.Expressions" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Memory" version="4.5.5" targetFramework="xamarinios10" />
<package id="System.Net.NameResolution" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Net.NetworkInformation" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Net.Primitives" version="4.3.1" targetFramework="xamarinios10" />
<package id="System.Net.Requests" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Net.Sockets" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Numerics.Vectors" version="4.5.0" targetFramework="xamarinios10" />
<package id="System.ObjectModel" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Reactive" version="6.0.1" targetFramework="xamarinios10" />
<package id="System.Reactive.Core" version="6.0.1" targetFramework="xamarinios10" />
<package id="System.Reactive.Interfaces" version="6.0.1" targetFramework="xamarinios10" />
<package id="System.Reactive.Linq" version="6.0.1" targetFramework="xamarinios10" />
<package id="System.Reactive.PlatformServices" version="6.0.1" targetFramework="xamarinios10" />
<package id="System.Reflection" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Reflection.Extensions" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Reflection.Primitives" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Reflection.TypeExtensions" version="4.7.0" targetFramework="xamarinios10" />
<package id="System.Resources.ResourceManager" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Runtime.CompilerServices.Unsafe" version="6.0.0" targetFramework="xamarinios10" />
<package id="System.Runtime.Extensions" version="4.3.1" targetFramework="xamarinios10" />
<package id="System.Runtime.Handles" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Runtime.InteropServices" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Runtime.InteropServices.RuntimeInformation" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Runtime.InteropServices.WindowsRuntime" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Runtime.Numerics" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Runtime.Serialization.Formatters" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Runtime.Serialization.Primitives" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Security.Cryptography.Algorithms" version="4.3.1" targetFramework="xamarinios10" />
<package id="System.Security.Cryptography.Encoding" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Security.Cryptography.Primitives" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Security.Cryptography.X509Certificates" version="4.3.2" targetFramework="xamarinios10" />
<package id="System.Text.Encoding" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Text.Encoding.Extensions" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Text.RegularExpressions" version="4.3.1" targetFramework="xamarinios10" />
<package id="System.Threading" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Threading.Tasks" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="xamarinios10" />
<package id="System.Threading.Thread" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Threading.Timer" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Xml.ReaderWriter" version="4.3.1" targetFramework="xamarinios10" />
<package id="System.Xml.XDocument" version="4.3.0" targetFramework="xamarinios10" />
<package id="System.Xml.XmlDocument" version="4.3.0" targetFramework="xamarinios10" />
<package id="TcpSharp" version="1.3.6" targetFramework="xamarinios10" />
<package id="Xamarin.Build.Download" version="0.11.4" targetFramework="xamarinios10" />
<package id="Xamarin.Essentials" version="1.8.1" targetFramework="xamarinios10" />
<package id="Xamarin.Forms" version="5.0.0.2662" targetFramework="xamarinios10" />
<package id="Xamarin.iOS.MaterialComponents" version="92.0.0" targetFramework="xamarinios10" />
<package id="Zeroconf" version="3.5.11" targetFramework="xamarinios10" />
</packages>
-254
View File
@@ -1,254 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\Xamarin.Forms.5.0.0.2662\build\Xamarin.Forms.props" Condition="Exists('..\packages\Xamarin.Forms.5.0.0.2662\build\Xamarin.Forms.props')" />
<Import Project="..\packages\Xamarin.Build.Download.0.11.4\build\Xamarin.Build.Download.props" Condition="Exists('..\packages\Xamarin.Build.Download.0.11.4\build\Xamarin.Build.Download.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">iPhoneSimulator</Platform>
<ProjectGuid>{A30F10F2-4CBC-47E6-841D-8DCAD05BAA0D}</ProjectGuid>
<ProjectTypeGuids>{FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<OutputType>Exe</OutputType>
<RootNamespace>qController.iOS</RootNamespace>
<AssemblyName>qController.iOS</AssemblyName>
<IPhoneResourcePrefix>Resources</IPhoneResourcePrefix>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|iPhoneSimulator' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\iPhoneSimulator\Debug</OutputPath>
<DefineConstants>DEBUG;ENABLE_TEST_CLOUD;</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<CodesignKey>Apple Development: Created via API (WH3Q9R7VKH)</CodesignKey>
<MtouchDebug>true</MtouchDebug>
<MtouchNoSymbolStrip>true</MtouchNoSymbolStrip>
<MtouchFastDev>true</MtouchFastDev>
<IOSDebuggerPort>16530</IOSDebuggerPort>
<MtouchLink>None</MtouchLink>
<MtouchArch>x86_64</MtouchArch>
<MtouchHttpClientHandler>HttpClientHandler</MtouchHttpClientHandler>
<PlatformTarget>x86</PlatformTarget>
<CodesignProvision>VS: com.jwetzell.qController Development</CodesignProvision>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhone' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\iPhone\Release</OutputPath>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<CodesignKey>Apple Development: Created via API (WH3Q9R7VKH)</CodesignKey>
<MtouchFloat32>true</MtouchFloat32>
<CodesignEntitlements>Entitlements.plist</CodesignEntitlements>
<MtouchLink>SdkOnly</MtouchLink>
<MtouchArch>ARMv7, ARM64</MtouchArch>
<MtouchHttpClientHandler>HttpClientHandler</MtouchHttpClientHandler>
<PlatformTarget>x86</PlatformTarget>
<CodesignProvision>VS: com.jwetzell.qController Development</CodesignProvision>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhoneSimulator' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\iPhoneSimulator\Release</OutputPath>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<CodesignKey>Apple Development: Created via API (WH3Q9R7VKH)</CodesignKey>
<MtouchNoSymbolStrip>true</MtouchNoSymbolStrip>
<MtouchLink>None</MtouchLink>
<MtouchArch>x86_64</MtouchArch>
<MtouchHttpClientHandler>HttpClientHandler</MtouchHttpClientHandler>
<PlatformTarget>x86</PlatformTarget>
<CodesignProvision>VS: com.jwetzell.qController Development</CodesignProvision>
<MtouchExtraArgs>-v -v -v -v</MtouchExtraArgs>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|iPhone' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\iPhone\Debug</OutputPath>
<DefineConstants>DEBUG;ENABLE_TEST_CLOUD;</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<CodesignKey>Apple Development: Created via API (WH3Q9R7VKH)</CodesignKey>
<DeviceSpecificBuild>true</DeviceSpecificBuild>
<MtouchDebug>true</MtouchDebug>
<MtouchNoSymbolStrip>true</MtouchNoSymbolStrip>
<MtouchFastDev>true</MtouchFastDev>
<MtouchFloat32>true</MtouchFloat32>
<CodesignEntitlements>Entitlements.plist</CodesignEntitlements>
<IOSDebuggerPort>60997</IOSDebuggerPort>
<MtouchLink>SdkOnly</MtouchLink>
<MtouchArch>ARM64</MtouchArch>
<MtouchHttpClientHandler>HttpClientHandler</MtouchHttpClientHandler>
<PlatformTarget>x86</PlatformTarget>
<CodesignProvision>VS: com.jwetzell.qController Development</CodesignProvision>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Xml" />
<Reference Include="System.Core" />
<Reference Include="Xamarin.iOS" />
<Reference Include="BTProgressHUD">
<HintPath>..\packages\BTProgressHUD.1.5.0\lib\xamarinios10\BTProgressHUD.dll</HintPath>
</Reference>
<Reference Include="Acr.UserDialogs">
<HintPath>..\packages\Acr.UserDialogs.7.2.0.562\lib\xamarinios10\Acr.UserDialogs.dll</HintPath>
</Reference>
<Reference Include="OpenTK-1.0" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml.Linq" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.IO.Compression" />
<Reference Include="Newtonsoft.Json">
<HintPath>..\packages\Newtonsoft.Json.13.0.3\lib\netstandard2.0\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="Acr.Settings">
<HintPath>..\packages\Acr.Settings.9.0.1\lib\xamarinios10\Acr.Settings.dll</HintPath>
</Reference>
<Reference Include="System.Reactive">
<HintPath>..\packages\System.Reactive.6.0.1\lib\netstandard2.0\System.Reactive.dll</HintPath>
</Reference>
<Reference Include="System.Reactive.Core">
<HintPath>..\packages\System.Reactive.Core.6.0.1\lib\netstandard2.0\System.Reactive.Core.dll</HintPath>
</Reference>
<Reference Include="System.Reactive.Interfaces">
<HintPath>..\packages\System.Reactive.Interfaces.6.0.1\lib\netstandard2.0\System.Reactive.Interfaces.dll</HintPath>
</Reference>
<Reference Include="System.Reactive.Linq">
<HintPath>..\packages\System.Reactive.Linq.6.0.1\lib\netstandard2.0\System.Reactive.Linq.dll</HintPath>
</Reference>
<Reference Include="System.Reactive.PlatformServices">
<HintPath>..\packages\System.Reactive.PlatformServices.6.0.1\lib\netstandard2.0\System.Reactive.PlatformServices.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Forms.Core">
<HintPath>..\packages\Xamarin.Forms.5.0.0.2662\lib\Xamarin.iOS10\Xamarin.Forms.Core.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Forms.Platform">
<HintPath>..\packages\Xamarin.Forms.5.0.0.2662\lib\Xamarin.iOS10\Xamarin.Forms.Platform.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Forms.Xaml">
<HintPath>..\packages\Xamarin.Forms.5.0.0.2662\lib\Xamarin.iOS10\Xamarin.Forms.Xaml.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Essentials">
<HintPath>..\packages\Xamarin.Essentials.1.8.1\lib\xamarinios10\Xamarin.Essentials.dll</HintPath>
</Reference>
<Reference Include="Serilog">
<HintPath>..\packages\Serilog.3.1.1\lib\netstandard2.1\Serilog.dll</HintPath>
</Reference>
<Reference Include="Serilog.Sinks.Xamarin">
<HintPath>..\packages\Serilog.Sinks.Xamarin.1.0.0\lib\xamarinios10\Serilog.Sinks.Xamarin.dll</HintPath>
</Reference>
<Reference Include="System.Drawing.Common.dll" />
<Reference Include="MaterialComponents">
<HintPath>..\packages\Xamarin.iOS.MaterialComponents.92.0.0\lib\Xamarin.iOS\MaterialComponents.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Forms.Platform.iOS">
<HintPath>..\packages\Xamarin.Forms.5.0.0.2662\lib\Xamarin.iOS10\Xamarin.Forms.Platform.iOS.dll</HintPath>
</Reference>
<Reference Include="System.Numerics" />
<Reference Include="mscorlib" />
<Reference Include="System.Numerics.Vectors" />
<Reference Include="System.Buffers">
<HintPath>..\packages\System.Buffers.4.5.1\lib\netstandard2.0\System.Buffers.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.CompilerServices.Unsafe">
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.Memory">
<HintPath>..\packages\System.Memory.4.5.5\lib\netstandard2.0\System.Memory.dll</HintPath>
</Reference>
<Reference Include="System.Diagnostics.DiagnosticSource">
<HintPath>..\packages\System.Diagnostics.DiagnosticSource.8.0.1\lib\netstandard2.0\System.Diagnostics.DiagnosticSource.dll</HintPath>
</Reference>
<Reference Include="Zeroconf">
<HintPath>..\packages\Zeroconf.3.5.11\lib\xamarinios10\Zeroconf.dll</HintPath>
</Reference>
<Reference Include="TcpSharp">
<HintPath>..\packages\TcpSharp.1.3.6\lib\netstandard2.1\TcpSharp.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\Contents.json">
<Visible>false</Visible>
</ImageAsset>
<ImageAsset Include="Assets.xcassets\Contents.json">
<Visible>false</Visible>
</ImageAsset>
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\icon_20pt%402x.png">
<Visible>false</Visible>
</ImageAsset>
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\icon_20pt%403x.png">
<Visible>false</Visible>
</ImageAsset>
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\icon_29pt%402x.png">
<Visible>false</Visible>
</ImageAsset>
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\icon_29pt%403x.png">
<Visible>false</Visible>
</ImageAsset>
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\Icon.png">
<Visible>false</Visible>
</ImageAsset>
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\icon_40pt%402x.png">
<Visible>false</Visible>
</ImageAsset>
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\icon_40pt.png">
<Visible>false</Visible>
</ImageAsset>
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\icon_76pt.png">
<Visible>false</Visible>
</ImageAsset>
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\icon_76pt%402x.png">
<Visible>false</Visible>
</ImageAsset>
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\icon_83.5%402x.png">
<Visible>false</Visible>
</ImageAsset>
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\icon_20pt.png">
<Visible>false</Visible>
</ImageAsset>
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\icon_60pt%402x.png">
<Visible>false</Visible>
</ImageAsset>
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\icon_60pt%403x.png">
<Visible>false</Visible>
</ImageAsset>
</ItemGroup>
<ItemGroup>
<Folder Include="Assets.xcassets\add.imageset\" />
<Folder Include="Assets.xcassets\back.imageset\" />
<Folder Include="Assets.xcassets\connect.imageset\" />
<Folder Include="Assets.xcassets\delete.imageset\" />
<Folder Include="Assets.xcassets\hamburger.imageset\" />
<Folder Include="Assets.xcassets\scan.imageset\" />
</ItemGroup>
<ItemGroup>
<InterfaceDefinition Include="LaunchScreen.storyboard" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="Info.plist" />
<None Include="Entitlements.plist" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<Compile Include="Main.cs" />
<Compile Include="AppDelegate.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\qController.Standard\qController.csproj">
<Project>{86160AAC-2150-41B0-BB06-4442CA054A78}</Project>
<Name>qController</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<BundleResource Include="Resources\qfont.ttf" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\iOS\Xamarin.iOS.CSharp.targets" />
<Import Project="..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets" Condition="Exists('..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets')" />
<Import Project="..\packages\Xamarin.Build.Download.0.11.4\build\Xamarin.Build.Download.targets" Condition="Exists('..\packages\Xamarin.Build.Download.0.11.4\build\Xamarin.Build.Download.targets')" />
<Import Project="..\packages\Xamarin.Forms.5.0.0.2662\build\Xamarin.Forms.targets" Condition="Exists('..\packages\Xamarin.Forms.5.0.0.2662\build\Xamarin.Forms.targets')" />
</Project>
@@ -1,45 +0,0 @@
using Xamarin.Forms;
namespace qController
{
public class QButton : Button
{
public QCommand qCommand
{
get;
set;
}
public QButton(QCommand command)
{
qCommand = command;
Text = qCommand.text;
TextColor = Color.Black;
FontSize = App.WidthUnit * 5;
if (qCommand.osc.Contains("go"))
{
BackgroundColor = Color.SeaGreen;
switch (Device.RuntimePlatform)
{
case Device.iOS:
FontSize = App.HeightUnit * 4;
FontAttributes = FontAttributes.Bold;
break;
case Device.Android:
FontSize = App.HeightUnit * 4;
FontAttributes = FontAttributes.Bold;
break;
}
}
else if (qCommand.osc.Contains("panic"))
{
BackgroundColor = Color.IndianRed;
}
else
{
BackgroundColor = Color.FromHex("D8D8D8");
}
}
}
}
@@ -1,29 +0,0 @@
using Xamarin.Forms;
namespace qController
{
public class QLevelsButton : ShadowButton
{
public Button button;
public QLevelsButton()
{
button = new Button
{
Text = QIcon.SLIDERS,
TextColor = Color.Black,
FontFamily = App.QFont,
FontSize = App.HeightUnit * 4,
VerticalOptions = LayoutOptions.FillAndExpand,
HorizontalOptions = LayoutOptions.FillAndExpand,
HeightRequest = App.HeightUnit * 8,
WidthRequest = App.HeightUnit * 8,
CornerRadius = (int)(App.HeightUnit * 4),
BackgroundColor = Color.LightBlue
};
HeightRequest = button.Height;
WidthRequest = button.Width;
CornerRadius = button.CornerRadius;
Content = button;
}
}
}
@@ -1,28 +0,0 @@
using Xamarin.Forms;
namespace qController
{
public class ShadowButton : Frame
{
public ShadowButton(Button b)
{
//Content = b;
HeightRequest = b.Height;
WidthRequest = b.Width;
CornerRadius = b.CornerRadius;
Padding = new Thickness(0);
Content = b;
HasShadow = true;
BorderColor = Color.Black;
IsVisible = false;
}
public ShadowButton()
{
HasShadow = true;
BorderColor = Color.Black;
IsVisible = false;
Padding = new Thickness(0);
}
}
}
@@ -1,128 +0,0 @@
using System;
using System.Collections.Generic;
using Xamarin.Forms;
using qController.Communication;
namespace qController.Cell
{
public class QControlsBlock : Frame
{
Grid mainG;
EventHandler callback;
public QControlsBlock(EventHandler callback)
{
this.callback = callback;
Margin = new Thickness(10);
Padding = new Thickness(0);
IsVisible = true;
BackgroundColor = Color.Transparent;
//highlight Button Grid
//BackgroundColor = Color.FromHex("FF0000");
List<QCommand> commands = new List<QCommand>();
commands.Add(QCommands.PREVIOUS);
commands.Add(QCommands.PAUSE);
commands.Add(QCommands.NEXT);
commands.Add(QCommands.PREVIEW);
commands.Add(QCommands.PANIC);
commands.Add(QCommands.RESUME);
//setCustomButtons(commands);
setDefaultButtons();
}
void setDefaultButtons()
{
List<QButton> buttons = new List<QButton>();
buttons.Add(new QButton(QCommands.PREVIOUS));
buttons.Add(new QButton(QCommands.PANIC));
buttons.Add(new QButton(QCommands.NEXT));
buttons.Add(new QButton(QCommands.PREVIEW));
buttons.Add(new QButton(QCommands.PAUSE));
buttons.Add(new QButton(QCommands.RESUME));
mainG = new Grid
{
Padding = new Thickness(0),
RowDefinitions = {
new RowDefinition{Height = GridLength.Star},
new RowDefinition{Height = GridLength.Star},
new RowDefinition{Height = GridLength.Star}
},
ColumnDefinitions = {
new ColumnDefinition{Width = new GridLength(1,GridUnitType.Star)},
new ColumnDefinition{Width = new GridLength(1,GridUnitType.Star)},
new ColumnDefinition{Width = new GridLength(1,GridUnitType.Star)}
},
Margin = new Thickness(0)
};
int row = 0;
int column = 0;
for (int i = 0; i < buttons.Count; i++)
{
QButton b = buttons[i];
b.Clicked += callback;
mainG.Children.Add(b, column, row);
row++;
if (row == 3)
{
row = 0;
column = 2;
}
}
QButton goButton = new QButton(QCommands.GO);
goButton.Clicked += callback;
mainG.Children.Add(goButton, 1, 0);
Grid.SetRowSpan(goButton, 3);
Content = mainG;
}
public void setCustomButtons(List<QCommand> commands)
{
mainG = new Grid
{
Padding = new Thickness(0),
RowDefinitions = {
new RowDefinition{Height = GridLength.Auto},
new RowDefinition{Height = GridLength.Auto},
new RowDefinition{Height = GridLength.Auto}
},
ColumnDefinitions = {
new ColumnDefinition{Width = new GridLength(1,GridUnitType.Star)},
new ColumnDefinition{Width = new GridLength(1,GridUnitType.Star)},
new ColumnDefinition{Width = new GridLength(1,GridUnitType.Star)}
},
Margin = new Thickness(0)
};
int row = 0;
int column = 0;
for (int i = 0; i < commands.Count; i++)
{
QButton b = new QButton(commands[i]);
b.Clicked += callback;
mainG.Children.Add(b, column, row);
row++;
if (row == 3)
{
row = 0;
column = 2;
}
}
QButton goButton = new QButton(QCommands.GO);
goButton.Clicked += callback;
mainG.Children.Add(goButton, 1, 0);
Grid.SetRowSpan(goButton, 3);
Content = mainG;
}
}
}
@@ -1,130 +0,0 @@
using System.Collections.ObjectModel;
using Xamarin.Forms;
using qController.QItems;
namespace qController.Cell
{
public class QCueListCell : Frame
{
public ListView cueListView;
public Button closeButton;
public ObservableCollection<OSCListItem> items;
public QCueListCell(QCueList qCueList)
{
switch (Device.RuntimePlatform)
{
case Device.iOS:
Margin = new Thickness(10, 30, 10, 10);
break;
case Device.Android:
Margin = new Thickness(10, 10, 10, 10);
break;
}
Padding = new Thickness(10);
items = new ObservableCollection<OSCListItem>();
cueListView = new ListView
{
ItemsSource = items,
RowHeight = (int)(App.HeightUnit * 6),
ItemTemplate = new DataTemplate(() =>
{
var grid = new Grid { Padding = new Thickness(5, 10) };
grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(30) });
grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Star });
var icon = new Label();
icon.FontFamily = App.QFont;
icon.SetBinding(Label.TextProperty, "Icon");
icon.HorizontalTextAlignment = TextAlignment.Center;
icon.VerticalTextAlignment = TextAlignment.Center;
icon.FontSize = App.HeightUnit * 3;
var label = new Label { VerticalOptions = LayoutOptions.FillAndExpand };
label.SetBinding(Label.TextProperty, "Text");
if (label.Text == "Disconnect")
{
label.TextColor = Color.DarkRed;
}
switch (Device.RuntimePlatform)
{
case Device.iOS:
label.FontSize = App.HeightUnit * 3;
break;
case Device.Android:
label.FontSize = App.HeightUnit * 2.2;
break;
}
grid.Children.Add(icon);
grid.Children.Add(label, 1, 0);
return new ViewCell { View = grid };
})
};
StackLayout layout = new StackLayout();
closeButton = new Button
{
BackgroundColor = Color.Gray,
Text = "Close",
TextColor = Color.White
};
layout.Children.Add(closeButton);
layout.Children.Add(cueListView);
Content = layout;
for(int j=0; j < qCueList.cues.Count; j++)
{
var cue = qCueList.cues[j];
AddSubCues(cue, 0);
}
}
public void AddSubCues(QCue cue, int level)
{
var cueIcon = cue.getIconString();
var cueTitle = "";
for (int i = 0; i < level; i++)
{
cueTitle += " ";
}
if (cue.number != "")
{
cueTitle += cue.number + " - " + cue.listName;
}
else
{
cueTitle += cue.listName;
}
if (cue.cues != null)
{
items.Add(new OSCListItem
{
Text = cueTitle,
Icon = cueIcon,
Command = "/select_id/" + cue.uniqueID
});
//uncomment to load nested group cues
for (int i = 0; i < cue.cues.Count; i++)
{
var sub_cue = cue.cues[i];
AddSubCues(sub_cue, level + 1);
}
}
else
{
items.Add(new OSCListItem
{
Text = cueTitle,
Icon = cueIcon,
Command = "/select_id/" + cue.uniqueID
});
}
}
}
}
@@ -1,118 +0,0 @@
using System;
using Xamarin.Forms;
using Serilog;
namespace qController.Cell
{
public class QInstanceCell : ViewCell
{
public QInstanceCell()
{
Label nameLabel = new Label();
Label addressLabel = new Label();
Label connectLabel = new Label();
Label deleteLabel = new Label();
var connectTapGesture = new TapGestureRecognizer();
var deleteTapGesture = new TapGestureRecognizer();
connectTapGesture.Tapped += Connect;
connectLabel.GestureRecognizers.Add(connectTapGesture);
deleteTapGesture.Tapped += Delete;
deleteLabel.GestureRecognizers.Add(deleteTapGesture);
InitItems();
//SET BINDINGS
nameLabel.SetBinding(Label.TextProperty, new Binding("name"));
addressLabel.SetBinding(Label.TextProperty,new Binding("address"));
Grid mainG = new Grid
{
//Padding = new Thickness(10),
RowDefinitions = {
new RowDefinition{Height = GridLength.Auto},
new RowDefinition{Height = GridLength.Auto}
},
ColumnDefinitions = {
new ColumnDefinition{Width = new GridLength(1,GridUnitType.Star)},
new ColumnDefinition{Width = new GridLength(4,GridUnitType.Star)},
new ColumnDefinition{Width = new GridLength(1,GridUnitType.Star)}
}
};
mainG.Children.Add(nameLabel, 1, 0);
mainG.Children.Add(addressLabel,1,1);
mainG.Children.Add(connectLabel,2,0);
Grid.SetRowSpan(connectLabel,2);
mainG.Children.Add(deleteLabel, 0, 0);
Grid.SetRowSpan(deleteLabel,2);
Frame f = new Frame
{
Content = mainG,
BorderColor = Color.Black,
VerticalOptions = LayoutOptions.CenterAndExpand,
HorizontalOptions = LayoutOptions.FillAndExpand,
Padding = 0,
Margin = new Thickness(10,10,10,10),
CornerRadius=20,
BackgroundColor = Color.FromHex("D8D8D8")
};
View = f;
void InitItems()
{
nameLabel.HorizontalTextAlignment = TextAlignment.Center;
nameLabel.VerticalTextAlignment = TextAlignment.End;
nameLabel.FontAttributes = FontAttributes.Bold;
nameLabel.FontSize = App.HeightUnit * 3;
nameLabel.Margin = new Thickness(0, 20, 0, 0);
addressLabel.HorizontalTextAlignment = TextAlignment.Center;
addressLabel.VerticalTextAlignment = TextAlignment.Start;
addressLabel.FontSize = App.HeightUnit * 2.5;
addressLabel.Margin = new Thickness(0, 0, 0, 20);
connectLabel.HorizontalOptions = LayoutOptions.StartAndExpand;
connectLabel.VerticalOptions = LayoutOptions.CenterAndExpand;
connectLabel.Text = QIcon.WIFI;
connectLabel.FontSize = App.HeightUnit * 5;
connectLabel.TextColor = Color.LimeGreen;
deleteLabel.HorizontalOptions = LayoutOptions.CenterAndExpand;
deleteLabel.VerticalOptions = LayoutOptions.CenterAndExpand;
deleteLabel.Text = QIcon.TRASH_EMPTY;
deleteLabel.FontSize = App.HeightUnit * 5;
deleteLabel.TextColor = Color.Red;
connectLabel.FontFamily = App.QFont;
deleteLabel.FontFamily = App.QFont;
}
void Delete(object sender, EventArgs e)
{
Log.Debug("QINSTANCECELL - Delete " + nameLabel.Text + "," + addressLabel.Text + " Pressed");
QStorage.RemoveInstance(nameLabel.Text,addressLabel.Text);
}
void Connect(object sender, EventArgs e)
{
App.rootPage.Detail.Navigation.PushAsync(new ControlPage(nameLabel.Text, addressLabel.Text));
Log.Debug("QINSTANCECELL - Connect To " + nameLabel.Text + " Pressed");
}
}
}
}
@@ -1,121 +0,0 @@
using System.Collections.Generic;
using Xamarin.Forms;
namespace qController.Cell
{
public class QLevelsCell : Frame
{
public List<double> levels;
public string activeCue;
public Slider mainSlider;
public Slider leftSlider;
public Slider rightSlider;
public Label mainLabel;
public Label rightLabel;
public Label leftLabel;
public QLevelsCell()
{
Padding = new Thickness(5);
CornerRadius = 20;
BorderColor = Color.Black;
HasShadow = true;
BackgroundColor = Color.FromHex("D8D8D8");
IsVisible = false;
//highlight for testing
//BackgroundColor = Color.Red;
Grid mainG = new Grid
{
Padding = new Thickness(0),
RowDefinitions = {
new RowDefinition{Height = GridLength.Star},
new RowDefinition{Height = GridLength.Star},
new RowDefinition{Height = GridLength.Star}
},
ColumnDefinitions = {
new ColumnDefinition{Width = new GridLength(1,GridUnitType.Star)},
new ColumnDefinition{Width = new GridLength(1,GridUnitType.Star)},
new ColumnDefinition{Width = new GridLength(1,GridUnitType.Star)},
new ColumnDefinition{Width = new GridLength(1,GridUnitType.Star)},
new ColumnDefinition{Width = new GridLength(1,GridUnitType.Star)}
}
};
mainSlider = new Slider
{
Minimum = -60,
Maximum = 12
};
leftSlider = new Slider
{
Minimum = -60,
Maximum = 12
};
rightSlider = new Slider
{
Minimum = -60,
Maximum = 12
};
mainLabel = new Label
{
Text = "MAIN:",
VerticalTextAlignment = TextAlignment.Center,
HorizontalTextAlignment = TextAlignment.Center
};
leftLabel = new Label
{
Text = "1:",
VerticalTextAlignment = TextAlignment.Center,
HorizontalTextAlignment = TextAlignment.Center
};
rightLabel = new Label
{
Text = "2:",
VerticalTextAlignment = TextAlignment.Center,
HorizontalTextAlignment = TextAlignment.Center
};
mainG.Children.Add(mainSlider, 1, 0);
mainG.Children.Add(leftSlider, 1, 1);
mainG.Children.Add(rightSlider, 1, 2);
Grid.SetColumnSpan(mainSlider, 4);
Grid.SetColumnSpan(leftSlider, 4);
Grid.SetColumnSpan(rightSlider, 4);
mainG.Children.Add(mainLabel, 0, 0);
mainG.Children.Add(leftLabel, 0, 1);
mainG.Children.Add(rightLabel, 0, 2);
Content = mainG;
Margin = new Thickness(10);
}
public void UpdateLevels(List<double> lin_levels)
{
levels = lin_levels;
if (mainSlider != null)
{
mainSlider.Value = levels[0];
}
if (leftSlider != null)
{
leftSlider.Value = levels[1];
}
if (rightSlider != null)
{
rightSlider.Value = levels[2];
}
}
}
}
@@ -1,235 +0,0 @@
using System;
using Acr.UserDialogs;
using qController.QItems;
using Xamarin.Forms;
namespace qController.Cell
{
public class CueEditArgs : EventArgs
{
public string CueID
{
get;
set;
}
public string Property
{
get;
set;
}
public string NewValue
{
get;
set;
}
}
public class QSelectedCueCell : Frame
{
public delegate void SelectedCueEditedHandler(object source, CueEditArgs args);
public event SelectedCueEditedHandler SelectedCueEdited;
Label name;
Label number;
Label type;
public Label notes;
public QCue activeCue;
public QSelectedCueCell()
{
Grid mainG = new Grid
{
Padding = new Thickness(0),
RowDefinitions =
{
new RowDefinition{Height = GridLength.Star},
new RowDefinition{Height = new GridLength(2, GridUnitType.Star)}
},
ColumnDefinitions =
{
new ColumnDefinition{Width = new GridLength(1,GridUnitType.Star)},
new ColumnDefinition{Width = new GridLength(1,GridUnitType.Star)},
new ColumnDefinition{Width = new GridLength(1,GridUnitType.Star)},
new ColumnDefinition{Width = new GridLength(1,GridUnitType.Star)},
new ColumnDefinition{Width = new GridLength(1,GridUnitType.Star)}
}
};
Grid topGrid = new Grid
{
Padding = new Thickness(0),
RowDefinitions =
{
new RowDefinition{Height = GridLength.Auto}
},
ColumnDefinitions =
{
new ColumnDefinition{Width = new GridLength(1,GridUnitType.Star)},
new ColumnDefinition{Width = new GridLength(1,GridUnitType.Star)},
new ColumnDefinition{Width = new GridLength(1,GridUnitType.Star)},
new ColumnDefinition{Width = new GridLength(1,GridUnitType.Star)},
new ColumnDefinition{Width = new GridLength(1,GridUnitType.Star)}
}
};
Grid bottomGrid = new Grid
{
Padding = new Thickness(0),
RowDefinitions =
{
new RowDefinition{Height = new GridLength(1,GridUnitType.Star)},
new RowDefinition{Height = new GridLength(2,GridUnitType.Star)}
},
ColumnDefinitions =
{
new ColumnDefinition{Width = new GridLength(1,GridUnitType.Star)},
new ColumnDefinition{Width = new GridLength(1,GridUnitType.Star)},
new ColumnDefinition{Width = new GridLength(1,GridUnitType.Star)},
new ColumnDefinition{Width = new GridLength(1,GridUnitType.Star)},
new ColumnDefinition{Width = new GridLength(1,GridUnitType.Star)}
}
};
number = new Label {
Text = "",
FontAttributes = FontAttributes.Bold,
FontSize = App.HeightUnit * 5
};
name = new Label {
Text = "Loading Workspace....",
FontAttributes = FontAttributes.Bold,
HorizontalTextAlignment = TextAlignment.Center,
FontSize = App.HeightUnit * 3.5,
Margin = new Thickness(0)
};
type = new Label {
Text = QIcon.SPIN3,
FontFamily = App.QFont,
VerticalTextAlignment = TextAlignment.Center,
HorizontalTextAlignment = TextAlignment.End,
FontSize = App.HeightUnit * 5
};
notes = new Label {
Text = "Loading Cue Lists and Playhead Position",
HorizontalTextAlignment = TextAlignment.Center,
Margin = new Thickness(0,0,0,10),
VerticalOptions = LayoutOptions.FillAndExpand,
HorizontalOptions = LayoutOptions.FillAndExpand
};
//BACKGROUND COLORS FOR TESTING ONLY
//notes.BackgroundColor = Color.Red;
//number.BackgroundColor = Color.Red;
//name.BackgroundColor = Color.Red;
//type.BackgroundColor = Color.Red;
//topGrid.BackgroundColor = Color.Green;
//bottomGrid.BackgroundColor = Color.Green;
topGrid.Children.Add(number, 0, 0);
topGrid.Children.Add(type, 4, 0);
Grid.SetColumnSpan(number, 3);
Grid.SetColumnSpan(type, 1);
bottomGrid.Children.Add(name, 0, 0);
bottomGrid.Children.Add(notes, 0, 1);
Grid.SetColumnSpan(name, 5);
Grid.SetColumnSpan(notes,5);
mainG.Children.Add(topGrid, 0, 0);
Grid.SetColumnSpan(topGrid, 5);
mainG.Children.Add(bottomGrid, 0, 1);
Grid.SetColumnSpan(bottomGrid, 5);
CornerRadius = 20;
BackgroundColor = Color.FromHex("D8D8D8");
HeightRequest = App.HeightUnit * 25;
Margin = new Thickness(10);
Content = mainG;
SetupDoubleTapEdit();
}
void SetupDoubleTapEdit()
{
var notesDoubleTap = new TapGestureRecognizer();
var nameDoubleTap = new TapGestureRecognizer();
var numberDoubleTap = new TapGestureRecognizer();
notesDoubleTap.NumberOfTapsRequired = 2;
nameDoubleTap.NumberOfTapsRequired = 2;
numberDoubleTap.NumberOfTapsRequired = 2;
notesDoubleTap.Tapped += (s, e) =>
{
UserDialogs.Instance.Prompt(new PromptConfig
{
Title = "Update Notes",
Message = "Changes notes to update",
OkText = "Update",
Text = notes.Text,
OnAction = (qNotes) =>
{
if (!qNotes.Ok)
return;
OnSelectedCueEdited("notes", qNotes.Text);
}
});
};
nameDoubleTap.Tapped += (s, e) =>
{
UserDialogs.Instance.Prompt(new PromptConfig
{
Title = "Update Name",
Message = "Change name to update",
OkText = "Update",
Text = name.Text,
OnAction = (qName) =>
{
if (!qName.Ok)
return;
OnSelectedCueEdited("name", qName.Text);
}
});
};
numberDoubleTap.Tapped += (s, e) =>
{
UserDialogs.Instance.Prompt(new PromptConfig
{
Title = "Update Number",
Message = "Change number to update",
OkText = "Update",
Text = number.Text,
OnAction = (qNumber) =>
{
if (!qNumber.Ok)
return;
OnSelectedCueEdited("number", qNumber.Text);
}
});
};
notes.GestureRecognizers.Add(notesDoubleTap);
name.GestureRecognizers.Add(nameDoubleTap);
number.GestureRecognizers.Add(numberDoubleTap);
}
public void UpdateSelectedCue(QCue cue)
{
activeCue = cue;
name.Text = cue.listName;
number.Text = cue.number;
type.Text = cue.getIconString();
notes.Text = cue.notes;
}
protected virtual void OnSelectedCueEdited(string prop, string value)
{
SelectedCueEdited?.Invoke(this, new CueEditArgs() { CueID = activeCue.uniqueID, Property = prop, NewValue = value });
}
}
}
@@ -1,71 +0,0 @@
using System;
using System.Collections.Generic;
using qController.QItems;
namespace qController.Communication
{
public class CueEventArgs : EventArgs
{
public QCue Cue
{
get;
set;
}
}
public class WorkspaceEventArgs : EventArgs
{
public QWorkspace UpdatedWorkspace
{
get;
set;
}
}
public class PlaybackPositionArgs : EventArgs
{
public string PlaybackPosition
{
get;
set;
}
}
public class ConnectEventArgs : EventArgs
{
public string Status
{
get;
set;
}
public string WorkspaceId
{
get;
set;
}
}
public class WorkspaceInfoArgs : EventArgs
{
public List<QWorkspaceInfo> WorkspaceInfo
{
get;
set;
}
}
public class ChildrenEventArgs : EventArgs
{
public string cue_id
{
get;
set;
}
public List<QCue> children
{
get;
set;
}
}
}
@@ -1,16 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace qController.Communication
{
public delegate void SelectedCueUpdatedHandler(object source, CueEventArgs args);
public delegate void WorkspaceUpdatedHandler(object source, WorkspaceEventArgs args);
public delegate void CueInfoUpdatedHandler(object source, CueEventArgs args);
public delegate void PlaybackPositionUpdatedHandler(object source, PlaybackPositionArgs args);
public delegate void ConnectionStatusHandler(object source, ConnectEventArgs args);
public delegate void ChildrenUpdateHandler(object source, ChildrenEventArgs args);
public delegate void WorkspaceDisconnectHandler(object source, EventArgs args);
public delegate void WorkspaceInfoHandler(object source, WorkspaceInfoArgs args);
public delegate void WorkspaceLoadErrorHandler(object source, WorkspaceEventArgs args);
}
@@ -1,19 +0,0 @@
//IP Address verification
//IMPLEMENT A ISREACHABLE METHOD TO BE ABLE TO DISPLAY ONLINE QINSTANCES
using System.Net;
namespace qController.Communication
{
public class IPHelper
{
public IPHelper()
{
}
public static bool IsValidAddress(string ipString){
if ((ipString.Split('.').Length - 1) != 3) return false;
IPAddress address;
return IPAddress.TryParse(ipString, out address);
}
}
}
@@ -1,109 +0,0 @@
//Class used to facilitate communication with a QInstance
//Listens for incoming messages via qReceiver (UDP) and tcpClient (TCP)
//TODO: WEIRD MESSAGE PARSING RULES NEED FIXED
using System;
using SharpOSC;
using Serilog;
namespace qController.Communication
{
public class QClient
{
private TCPClient tcpClient;
public QParser qParser;
string Address;
int Port;
public bool connected;
public QClient(string address, int port)
{
Address = address;
Port = port;
qParser = new QParser();
tcpClient = new TCPClient(Address, Port);
connected = tcpClient.Connect();
tcpClient.MessageReceived += OnMessageReceived;
}
//one method for messages received whether from TCP or UDP (SAME MSG FORMAT)
private void OnMessageReceived(object source, MessageEventArgs args)
{
Log.Debug("QCLIENT - Message Received: " + args.Message.Address);
//TODO: find a better filtering process
if (!args.Message.Address.Contains("update"))
qParser.ParseMessage(args.Message);
else if (args.Message.Address.Contains("playbackPosition") || args.Message.Address.Contains("cueList") || args.Message.Address.Contains("dashboard"))
qParser.ParseMessage(args.Message);
else if (args.Message.Address.Contains("cue_id"))
{
var parts = args.Message.Address.Split('/');
UpdateSpecificCue(parts[3], parts[5]);
}
else
ProcessUpdate(args.Message);
}
public void sendTCP(string address)
{
//Log.Debug($"QCLIENT - TCP Sent with address: {address}");
try
{
tcpClient.Send(new OscMessage(address));
}
catch (Exception ex)
{
Log.Debug("QCLIENT - Send and Receive Exception: " + ex.Message);
}
}
public void sendTCP(string address, params object[] args)
{
//Log.Debug($"QCLIENT - TCP Sent with address: {address}");
try
{
tcpClient.Send(new OscMessage(address, args));
}
catch (Exception ex)
{
Log.Debug("QCLIENT - Send and Receive w/Args Exception: " + ex.Message);
}
}
public void ProcessUpdate(OscMessage msg)
{
Log.Debug("QCLIENT - Process Update: " + msg.Address);
if (msg.Address.Contains("workspace"))
{
UpdateWorkspace("not yet implemented");
}
}
public void UpdateSpecificCue(string workspace_id,string cue_id)
{
string valuesForKeys = "[\"number\",\"uniqueID\",\"flagged\",\"listName\",\"type\",\"colorName\",\"name\",\"armed\",\"displayName\",\"isBroken\",\"isLoaded\",\"isPaused\",\"isRunning\",\"preWait\",\"duration\",\"postWait\",\"translationX\",\"translationY\",\"opacity\",\"scaleX\",\"scaleY\",\"notes\",\"levels\"]";
string address = "/workspace/" + workspace_id + "/cue_id/" + cue_id + "/valuesForKeys";
sendTCP(address, valuesForKeys);
}
public void UpdateSelectedCue(string workspace_id)
{
string valuesForKeys = "[\"number\",\"uniqueID\",\"flagged\",\"listName\",\"type\",\"colorName\",\"name\",\"armed\",\"displayName\",\"isBroken\",\"isLoaded\",\"isPaused\",\"isRunning\",\"preWait\",\"duration\",\"postWait\",\"translationX\",\"translationY\",\"opacity\",\"scaleX\",\"scaleY\",\"notes\",\"levels\"]";
string address = "/workspace/" + workspace_id + "/cue/selected/valuesForKeys";
sendTCP(address, valuesForKeys);
}
public void UpdateWorkspace(string ws_id)
{
Log.Debug("QCLIENT - Workspace needs to be updated: " + ws_id);
}
public void Close()
{
tcpClient.Close();
}
}
}
@@ -1,81 +0,0 @@
//Class used for overall Workspace control (ONLY REPRESENTS ONE WORKSPACE)
//Contains all necessary items to facilitate communication (sending, receiving) to a QLab workspace
//Also contains the local QWorkspace object which stores all the information that is used in displaying
//TODO: STILL NEED TO WORK ON PASSWORD PROTECTED WORKSPACES
using Serilog;
using qController.QItems;
namespace qController.Communication
{
public class QController
{
public QUpdater qUpdater;
public QClient qClient;
public QWorkspace qWorkspace;
public string playbackPosition;
private string ipAddress;
private int port;
public QController(string address, int port)
{
this.port = port;
this.ipAddress = address;
qClient = new QClient(ipAddress, port);
qUpdater = new QUpdater(this);
}
public void Connect(string workspace_id)
{
Log.Debug($"QCONTROLLER - Connect Called: {workspace_id}");
qWorkspace = new QWorkspace(workspace_id);
qClient.sendTCP("/workspace/"+workspace_id+"/connect");
}
public void Connect(string workspace_id, string passcode)
{
Log.Debug($"QCONTROLLER - Connect with Passcode Called: {workspace_id}:{passcode}");
qWorkspace = new QWorkspace(workspace_id);
qClient.sendTCP("/workspace/" + workspace_id + "/connect", passcode);
}
public void Connect(QWorkspace workspace)
{
if(workspace.passcode != null)
Connect(workspace.workspace_id, workspace.passcode);
else
Connect(workspace.workspace_id);
}
public void KickOff()
{
Log.Debug($"QCONTROLLER - Searching for workspaces on: {ipAddress}");
qClient.sendTCP("/workspaces");
}
public void Disconnect()
{
Log.Debug($"QCONTROLLER - Disconnecting from: {qWorkspace.workspace_id}");
qClient.sendTCP("/workspace/"+qWorkspace.workspace_id+"/disconnect");
}
public void Resume()
{
//qClient = new QClient(ipAddress, port);
//qUpdater = new QUpdater(this);
if(qWorkspace != null)
{
Log.Debug($"QCONTROLLER - Resuming: {qWorkspace.workspace_id}");
}
}
public void Kill(){
Log.Debug("QCONTROLLER - Killing");
if (qClient != null)
qClient.Close();
}
}
}
@@ -1,23 +0,0 @@
//Currently unused would like to reimplement eventually
//Currently being done in qConnectionPage.xaml.cs Scan() method
//TODO: Implement this along with a way of getting active Instances and # of workspaces for an instance
using Serilog;
using System.Collections.Generic;
using Zeroconf;
namespace qController.Communication
{
public class QFinder
{
public QFinder()
{
}
public async void SearchForWorkspaces()
{
Log.Debug("QFINDER - Scanning Started");
IReadOnlyList<IZeroconfHost> results = await ZeroconfResolver.ResolveAsync("_qlab._tcp.local.");
Log.Debug("QFINDER - Scanning Done");
}
}
}
@@ -1,184 +0,0 @@
using System;
using SharpOSC;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using System.Collections.Generic;
using qController.QItems;
using Serilog;
namespace qController.Communication
{
public class QParser
{
public QParser()
{
}
public event WorkspaceLoadErrorHandler WorkspaceLoadError;
public event WorkspaceInfoHandler WorkspaceInfoReceived;
public event WorkspaceDisconnectHandler WorkspaceDisconnect;
public event ChildrenUpdateHandler ChildrenUpdated;
public event ConnectionStatusHandler ConnectionStatusChanged;
public event SelectedCueUpdatedHandler SelectedCueUpdated;
public event WorkspaceUpdatedHandler WorkspaceUpdated;
public event CueInfoUpdatedHandler CueInfoUpdated;
public event PlaybackPositionUpdatedHandler PlaybackPositionUpdated;
public void ParseMessage(OscMessage msg){
if (!msg.Address.Contains("null"))
{
if (msg.Address.Contains("valuesForKeys"))
{
ParseCueUpdateInfo(msg);
}
else if (msg.Address.Contains("cueLists"))
ParseWorkspaceInfo(msg);
else if (msg.Address.Contains("playbackPosition"))
ParsePositionUpdateInfo(msg);
else if (msg.Address.Contains("thump"))
Log.Debug("QPARSER - Heartbeat Received");
else if (msg.Address.Contains("disconnect"))
OnWorkspaceDisconnect();
else if (msg.Address.Contains("connect"))
ParseConnectInfo(msg);
else if (msg.Address.Contains("children"))
ParseChildrenInfo(msg);
else if (msg.Address.Contains("workspaces"))
ParseQInfo(msg);
else
{
Log.Debug("QPARSER - Unkown message type: " + msg.Address);
foreach (var item in msg.Arguments)
{
Log.Debug(item.ToString());
}
}
}
}
public void ParseConnectInfo(OscMessage msg)
{
if (msg.Arguments.Count > 0)
{
JToken connectStatus = OSC2JSON(msg);
;
OnConnectionStatusChanged(connectStatus.ToString(), msg.Address.Split('/')[3]);
}
}
public void ParsePositionUpdateInfo(OscMessage msg)
{
if(msg.Arguments.Count > 0)
{
OnPlaybackPositionUpdated(msg.Arguments[0].ToString());
}
}
public void ParseCueUpdateInfo(OscMessage msg)
{
JToken cueUpdate = OSC2JSON(msg);
QCue cue = JsonConvert.DeserializeObject<QCue>(cueUpdate.ToString());
OnCueInfoUpdated(cue);
}
public void ParseSelectedCueInfo(OscMessage msg){
JToken selectedCue = OSC2JSON(msg);
QCue cue = JsonConvert.DeserializeObject<QCue>(selectedCue.ToString());
OnSelectedCueUpdated(cue);
}
public void ParseQInfo(OscMessage msg)
{
JToken qInfo = OSC2JSON(msg);
List<QWorkspaceInfo> qWorkspaceInfo = JsonConvert.DeserializeObject<List<QWorkspaceInfo>>(qInfo.ToString());
OnWorkspaceInfoReceived(qWorkspaceInfo);
}
public void ParseWorkspaceInfo(OscMessage msg)
{
if (msg.Arguments.Count > 0)
{
var parts = msg.Address.Split('/');
string id = parts[3];
if (msg.Arguments[0].ToString() != "")
{
try
{
QWorkspace workspace = JsonConvert.DeserializeObject<QWorkspace>(msg.Arguments[0].ToString());
OnWorkspaceUpdated(workspace);
}
catch (Exception ex)
{
Log.Debug($"QPARSER - Workspace Load Error: {ex.ToString()}");
OnWorkspaceLoadError(id);
}
}
else
{
OnWorkspaceLoadError(id);
}
}
}
public void ParseChildrenInfo(OscMessage msg)
{
if (msg.Arguments.Count > 0)
{
string cue_id = msg.Address.Split('/')[3];
JToken children_obj = OSC2JSON(msg);
List<QCue> children = JsonConvert.DeserializeObject<List<QCue>>(children_obj.ToString());
OnChildrenUpdated(cue_id, children);
}
}
public JToken OSC2JSON(OscMessage Msg){
JObject json = JObject.Parse(Msg.Arguments.ToArray()[0].ToString());
return json.GetValue("data");
}
protected virtual void OnWorkspaceUpdated(QWorkspace workspace)
{
WorkspaceUpdated?.Invoke(this, new WorkspaceEventArgs() { UpdatedWorkspace = workspace });
}
protected virtual void OnSelectedCueUpdated(QCue cue)
{
SelectedCueUpdated?.Invoke(this, new CueEventArgs() { Cue = cue });
}
protected virtual void OnCueInfoUpdated(QCue cue)
{
CueInfoUpdated?.Invoke(this, new CueEventArgs() { Cue = cue });
}
protected virtual void OnPlaybackPositionUpdated(string id)
{
PlaybackPositionUpdated?.Invoke(this, new PlaybackPositionArgs() { PlaybackPosition = id });
}
protected virtual void OnConnectionStatusChanged(string status, string workspace_id)
{
ConnectionStatusChanged?.Invoke(this, new ConnectEventArgs() { Status = status, WorkspaceId = workspace_id });
}
protected virtual void OnChildrenUpdated(string id, List<QCue> cues)
{
ChildrenUpdated?.Invoke(this, new ChildrenEventArgs() { cue_id = id, children = cues });
}
protected virtual void OnWorkspaceDisconnect()
{
WorkspaceDisconnect?.Invoke(this, new EventArgs());
}
protected virtual void OnWorkspaceInfoReceived(List<QWorkspaceInfo> workspaces)
{
WorkspaceInfoReceived?.Invoke(this, new WorkspaceInfoArgs() { WorkspaceInfo = workspaces });
}
protected virtual void OnWorkspaceLoadError(string id)
{
WorkspaceLoadError?.Invoke(this, new WorkspaceEventArgs { UpdatedWorkspace = new QWorkspace(id) });
}
}
}
@@ -1,32 +0,0 @@
using System;
using System.Net;
using SharpOSC;
namespace qController
{
public class QSender
{
TCPSender tcpSender;
public QSender(string address, int port)
{
tcpSender = new TCPSender(address, port);
tcpSender.MessageReceived += OnMessageReceived;
}
void OnMessageReceived(object source, MessageEventArgs args)
{
Console.WriteLine("New Message Received");
}
public void sendString(string address) {
tcpSender.Send(new OscMessage(address));
}
public void sendArgs(string address, object args){
tcpSender.Send(new OscMessage(address, args));
}
}
}
@@ -1,75 +0,0 @@
//Class used for updating local "copy" of workspace info, cue-lists, cues, etc.
using Serilog;
namespace qController.Communication
{
public class QUpdater
{
private QController qController;
public QUpdater(QController controller)
{
qController = controller;
qController.qClient.qParser.CueInfoUpdated += OnCueUpdateReceived;
qController.qClient.qParser.WorkspaceUpdated += OnWorkspaceUpdated;
qController.qClient.qParser.PlaybackPositionUpdated += OnPlaybackPositionUpdated;
qController.qClient.qParser.WorkspaceLoadError += OnWorkspaceLoadError;
qController.qClient.qParser.ConnectionStatusChanged += OnConnectionStatusChanged;
}
private void OnConnectionStatusChanged(object source, ConnectEventArgs args)
{
Log.Debug("QUPDATER - Connection Status Changed: " + args.Status);
if (args.Status.Contains("ok"))
{
//new sort of connect format for QLab 5 ok:view|control|edit is connection good
if(args.Status.Contains(":") && !args.Status.Contains("view"))
{
return;
}
qController.qClient.sendTCP("/workspace/" + qController.qWorkspace.workspace_id + "/updates", 1);
qController.qClient.sendTCP("/workspace/" + qController.qWorkspace.workspace_id + "/cueLists");
}
}
private void OnWorkspaceLoadError(object source, WorkspaceEventArgs args)
{
Log.Debug("QUPDATER - Loading cuelists has failed for some reason retrying");
}
public void OnCueUpdateReceived(object source, CueEventArgs args)
{
qController.qWorkspace.UpdateCue(args.Cue);
if (args.Cue.type == "Group")
{
//Log.Debug("QUpdater/Updated cue was group cue, sending children request");
qController.qClient.sendTCP("/workspace/"+qController.qWorkspace.workspace_id+"/cue_id/" + args.Cue.uniqueID + "/children");
}
}
public void OnWorkspaceUpdated(object source, WorkspaceEventArgs args)
{
qController.qWorkspace = args.UpdatedWorkspace;
qController.playbackPosition = null;
qController.qWorkspace.CheckPopulated();
if (qController.qWorkspace.IsPopulated)
{
Log.Debug("QUPDATER - Workspace group cues are already populated");
App.showToast("Workspace cues have been loaded....");
//get selected cue
qController.qClient.UpdateSelectedCue(qController.qWorkspace.workspace_id);
return;
}
}
public void OnPlaybackPositionUpdated(object source, PlaybackPositionArgs args)
{
qController.playbackPosition = args.PlaybackPosition;
Log.Debug("QUPDATER - Update Specific Cue Called because of Playback Position Updated");
qController.qClient.UpdateSpecificCue(qController.qWorkspace.workspace_id,args.PlaybackPosition);
}
}
}
@@ -1,52 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace SharpOSC
{
internal static class Extensions
{
public static int FirstIndexAfter<T>(this IEnumerable<T> items, int start, Func<T, bool> predicate)
{
if (items == null) throw new ArgumentNullException("items");
if (predicate == null) throw new ArgumentNullException("predicate");
if (start >= items.Count()) throw new ArgumentOutOfRangeException("start");
int retVal = 0;
foreach (var item in items)
{
if (retVal >= start && predicate(item)) return retVal;
retVal++;
}
return -1;
}
public static List<List<T>> Split<T>(this IEnumerable<T> data, Func<T, bool> predicate)
{
var output = new List<List<T>>();
var curr = new List<T>();
output.Add(curr);
foreach (var x in data)
{
if (predicate(x))
{
curr = new List<T>();
output.Add(curr);
}
else
curr.Add(x);
}
return output;
}
public static T[] SubArray<T>(this T[] data, int index, int length)
{
T[] result = new T[length];
Array.Copy(data, index, result, 0, length);
return result;
}
}
}
@@ -1,64 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace SharpOSC
{
public struct Midi
{
public byte Port;
public byte Status;
public byte Data1;
public byte Data2;
public Midi(byte port, byte status, byte data1, byte data2)
{
this.Port = port;
this.Status = status;
this.Data1 = data1;
this.Data2 = data2;
}
public override bool Equals(System.Object obj)
{
if (obj.GetType() == typeof(Midi))
{
if (this.Port == ((Midi)obj).Port && this.Status == ((Midi)obj).Status && this.Data1 == ((Midi)obj).Data1 && this.Data2 == ((Midi)obj).Data2)
return true;
else
return false;
}
else if (obj.GetType() == typeof(byte[]))
{
if (this.Port == ((byte[])obj)[0] && this.Status == ((byte[])obj)[1] && this.Data1 == ((byte[])obj)[2] && this.Data2 == ((byte[])obj)[3])
return true;
else
return false;
}
else
return false;
}
public static bool operator ==(Midi a, Midi b)
{
if (a.Equals(b))
return true;
else
return false;
}
public static bool operator !=(Midi a, Midi b)
{
if (!a.Equals(b))
return true;
else
return false;
}
public override int GetHashCode()
{
return (Port << 24) + (Status << 16) + (Data1 << 8) + (Data2);
}
}
}
@@ -1,68 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace SharpOSC
{
public class OscBundle : OscPacket
{
Timetag _timetag;
public UInt64 Timetag
{
get { return _timetag.Tag; }
set { _timetag.Tag = value; }
}
public DateTime Timestamp
{
get { return _timetag.Timestamp; }
set { _timetag.Timestamp = value; }
}
public List<OscMessage> Messages;
public OscBundle(UInt64 timetag, params OscMessage[] args)
{
_timetag = new Timetag(timetag);
Messages = new List<OscMessage>();
Messages.AddRange(args);
}
public override byte[] GetBytes()
{
string bundle = "#bundle";
int bundleTagLen = Utils.AlignedStringLength(bundle);
byte[] tag = setULong(_timetag.Tag);
List<byte[]> outMessages = new List<byte[]>();
foreach (OscMessage msg in Messages)
{
outMessages.Add(msg.GetBytes());
}
int len = bundleTagLen + tag.Length + outMessages.Sum(x => x.Length + 4);
int i = 0;
byte[] output = new byte[len];
Encoding.UTF8.GetBytes(bundle).CopyTo(output, i);
i += bundleTagLen;
tag.CopyTo(output, i);
i += tag.Length;
foreach (byte[] msg in outMessages)
{
var size = setInt(msg.Length);
size.CopyTo(output, i);
i += size.Length;
msg.CopyTo(output, i);
i += msg.Length; // msg size is always a multiple of 4
}
return output;
}
}
}
@@ -1,160 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace SharpOSC
{
public class OscMessage : OscPacket
{
public string Address;
public List<object> Arguments;
public OscMessage(string address, params object[] args)
{
this.Address = address;
Arguments = new List<object>();
Arguments.AddRange(args);
}
public override byte[] GetBytes()
{
List<byte[]> parts = new List<byte[]>();
List<object> currentList = Arguments;
int ArgumentsIndex = 0;
string typeString = ",";
int i = 0;
while (i < currentList.Count)
{
var arg = currentList[i];
string type = (arg != null) ? arg.GetType().ToString() : "null";
switch (type)
{
case "System.Int32":
typeString += "i";
parts.Add(setInt((int)arg));
break;
case "System.Single":
if (float.IsPositiveInfinity((float)arg))
{
typeString += "I";
}
else
{
typeString += "f";
parts.Add(setFloat((float)arg));
}
break;
case "System.String":
typeString += "s";
parts.Add(setString((string)arg));
break;
case "System.Byte[]":
typeString += "b";
parts.Add(setBlob((byte[])arg));
break;
case "System.Int64":
typeString += "h";
parts.Add(setLong((Int64)arg));
break;
case "System.UInt64":
typeString += "t";
parts.Add(setULong((UInt64)arg));
break;
case "SharpOSC.Timetag":
typeString += "t";
parts.Add(setULong(((Timetag)arg).Tag));
break;
case "System.Double":
if (Double.IsPositiveInfinity((double)arg))
{
typeString += "I";
}
else
{
typeString += "d";
parts.Add(setDouble((double)arg));
}
break;
case "SharpOSC.Symbol":
typeString += "S";
parts.Add(setString(((Symbol)arg).Value));
break;
case "System.Char":
typeString += "c";
parts.Add(setChar((char)arg));
break;
case "SharpOSC.RGBA":
typeString += "r";
parts.Add(setRGBA((RGBA)arg));
break;
case "SharpOSC.Midi":
typeString += "m";
parts.Add(setMidi((Midi)arg));
break;
case "System.Boolean":
typeString += ((bool)arg) ? "T" : "F";
break;
case "null":
typeString += "N";
break;
// This part handles arrays. It points currentList to the array and resets i
// The array is processed like normal and when it is finished we replace
// currentList back with Arguments and continue from where we left off
case "System.Object[]":
case "System.Collections.Generic.List`1[System.Object]":
if(arg.GetType() == typeof(object[]))
arg = ((object[])arg).ToList();
if (Arguments != currentList)
throw new Exception("Nested Arrays are not supported");
typeString += "[";
currentList = (List<object>)arg;
ArgumentsIndex = i;
i = 0;
continue;
default:
throw new Exception("Unable to transmit values of type " + type);
}
i++;
if (currentList != Arguments && i == currentList.Count)
{
// End of array, go back to main Argument list
typeString += "]";
currentList = Arguments;
i = ArgumentsIndex+1;
}
}
int addressLen = (Address.Length == 0 || Address == null ) ? 0 : Utils.AlignedStringLength(Address);
int typeLen = Utils.AlignedStringLength(typeString);
int total = addressLen + typeLen + parts.Sum(x => x.Length);
byte[] output = new byte[total];
i = 0;
Encoding.UTF8.GetBytes(Address).CopyTo(output, i);
i += addressLen;
Encoding.UTF8.GetBytes(typeString).CopyTo(output, i);
i += typeLen;
foreach (byte[] part in parts)
{
part.CopyTo(output, i);
i += part.Length;
}
return output;
}
}
}
@@ -1,493 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text;
using Serilog;
namespace SharpOSC
{
public abstract class OscPacket
{
public static OscPacket GetPacket(byte[] OscData)
{
if (OscData[0] == '#')
return parseBundle(OscData);
else
return parseMessage(OscData);
}
public abstract byte[] GetBytes();
#region Parse OSC packages
/// <summary>
/// Takes in an OSC bundle package in byte form and parses it into a more usable OscBundle object
/// </summary>
/// <param name="msg"></param>
/// <returns>Message containing various arguments and an address</returns>
private static OscMessage parseMessage(byte[] msg)
{
int index = 0;
//Log.Debug("Raw ASCII DATA: " + System.Text.Encoding.ASCII.GetString(msg));
//Log.Debug("Raw UTF-8 DATA: " + System.Text.Encoding.UTF8.GetString(msg));
string address = null;
char[] types = new char[0];
List<object> arguments = new List<object>();
List<object> mainArray = arguments; // used as a reference when we are parsing arrays to get the main array back
// Get address
address = getAddress(msg, index);
index += msg.FirstIndexAfter(address.Length, x => x == ',');
if (index % 4 != 0)
throw new Exception("Misaligned OSC Packet data. Address string is not padded correctly and does not align to 4 byte interval");
// Get type tags
types = getTypes(msg, index);
index += types.Length;
while (index % 4 != 0)
index++;
bool commaParsed = false;
foreach (char type in types)
{
// skip leading comma
if (type == ',' && !commaParsed)
{
commaParsed = true;
continue;
}
switch(type)
{
case ('\0'):
break;
case('i'):
int intVal = getInt(msg, index);
arguments.Add(intVal);
index += 4;
break;
case('f'):
float floatVal = getFloat(msg, index);
arguments.Add(floatVal);
index += 4;
break;
case('s'):
string stringVal = getString(msg, index);
arguments.Add(stringVal);
index += stringVal.Length;
break;
case('b'):
byte[] blob = getBlob(msg, index);
arguments.Add(blob);
index += 4 + blob.Length;
break;
case ('h'):
Int64 hval = getLong(msg, index);
arguments.Add(hval);
index += 8;
break;
case ('t'):
UInt64 sval = getULong(msg, index);
arguments.Add(new Timetag(sval));
index += 8;
break;
case ('d'):
double dval = getDouble(msg, index);
arguments.Add(dval);
index += 8;
break;
case ('S'):
string SymbolVal = getString(msg, index);
arguments.Add(new Symbol(SymbolVal));
index += SymbolVal.Length;
break;
case ('c'):
char cval = getChar(msg, index);
arguments.Add(cval);
index += 4;
break;
case ('r'):
RGBA rgbaval = getRGBA(msg, index);
arguments.Add(rgbaval);
index += 4;
break;
case ('m'):
Midi midival = getMidi(msg, index);
arguments.Add(midival);
index += 4;
break;
case ('T'):
arguments.Add(true);
break;
case ('F'):
arguments.Add(false);
break;
case ('N'):
arguments.Add(null);
break;
case ('I'):
arguments.Add(double.PositiveInfinity);
break;
case ('['):
if (arguments != mainArray)
throw new Exception("SharpOSC does not support nested arrays");
arguments = new List<object>(); // make arguments point to a new object array
break;
case (']'):
mainArray.Add(arguments); // add the array to the main array
arguments = mainArray; // make arguments point back to the main array
break;
default:
throw new Exception("OSC type tag '" + type + "' is unknown.");
}
while (index % 4 != 0)
index++;
}
return new OscMessage(address, arguments.ToArray());
}
/// <summary>
/// Takes in an OSC bundle package in byte form and parses it into a more usable OscBundle object
/// </summary>
/// <param name="bundle"></param>
/// <returns>Bundle containing elements and a timetag</returns>
private static OscBundle parseBundle(byte[] bundle)
{
UInt64 timetag;
List<OscMessage> messages = new List<OscMessage>();
int index = 0;
var bundleTag = Encoding.UTF8.GetString(bundle.SubArray(0, 8));
index += 8;
timetag = getULong(bundle, index);
index += 8;
if (bundleTag != "#bundle\0")
throw new Exception("Not a bundle");
while (index < bundle.Length)
{
int size = getInt(bundle, index);
index += 4;
byte[] messageBytes = bundle.SubArray(index, size);
var message = parseMessage(messageBytes);
messages.Add(message);
index += size;
while (index % 4 != 0)
index++;
}
OscBundle output = new OscBundle(timetag, messages.ToArray());
return output;
}
#endregion
#region Get arguments from byte array
private static string getAddress(byte[] msg, int index)
{
int i = index;
string address = "";
for (; i < msg.Length; i += 4)
{
if (msg[i] == ',')
{
if (i == 0)
return "";
address = Encoding.UTF8.GetString(msg.SubArray(index, i - 1));
break;
}
}
if (i >= msg.Length && address == null)
throw new Exception("no comma found");
return address.Replace("\0", "");
}
private static char[] getTypes(byte[] msg, int index)
{
int i = index + 4;
char[] types = null;
for (; i < msg.Length; i += 4)
{
if (msg[i - 1] == 0)
{
types = Encoding.UTF8.GetChars(msg.SubArray(index, i - index));
break;
}
}
if (types == null)
{
byte[] term = { 0 };
types = Encoding.UTF8.GetChars(term);
}
if (i >= msg.Length && types == null)
throw new Exception("No null terminator after type string");
return types;
}
private static int getInt(byte[] msg, int index)
{
int val = (msg[index] << 24) + (msg[index + 1] << 16) + (msg[index + 2] << 8) + (msg[index + 3] << 0);
return val;
}
private static float getFloat(byte[] msg, int index)
{
byte[] reversed = new byte[4];
reversed[3] = msg[index];
reversed[2] = msg[index+1];
reversed[1] = msg[index+2];
reversed[0] = msg[index + 3];
float val = System.BitConverter.ToSingle(reversed, 0);
return val;
}
private static string getString(byte[] msg, int index)
{
string output = null;
int i = index + 4;
for (; (i-1) < msg.Length; i += 4)
{
if (msg[i - 1] == 0)
{
output = Encoding.UTF8.GetString(msg.SubArray(index, i - index));
break;
}
}
if (output == null)
{
byte[] term = { 0 };
output = Encoding.UTF8.GetString(term);
}
if (i >= msg.Length && output == null)
throw new Exception("No null terminator after type string");
return output.Replace("\0", "");
}
private static byte[] getBlob(byte[] msg, int index)
{
int size = getInt(msg, index);
return msg.SubArray(index + 4, size);
}
private static UInt64 getULong(byte[] msg, int index)
{
UInt64 val = ((UInt64)msg[index] << 56) + ((UInt64)msg[index + 1] << 48) + ((UInt64)msg[index + 2] << 40) + ((UInt64)msg[index + 3] << 32)
+ ((UInt64)msg[index + 4] << 24) + ((UInt64)msg[index + 5] << 16) + ((UInt64)msg[index + 6] << 8) + ((UInt64)msg[index + 7] << 0);
return val;
}
private static Int64 getLong(byte[] msg, int index)
{
byte[] var = new byte[8];
var[7] = msg[index];
var[6] = msg[index+1];
var[5] = msg[index+2];
var[4] = msg[index+3];
var[3] = msg[index+4];
var[2] = msg[index+5];
var[1] = msg[index+6];
var[0] = msg[index+7];
Int64 val = BitConverter.ToInt64(var, 0);
return val;
}
private static double getDouble(byte[] msg, int index)
{
byte[] var = new byte[8];
var[7] = msg[index];
var[6] = msg[index + 1];
var[5] = msg[index + 2];
var[4] = msg[index + 3];
var[3] = msg[index + 4];
var[2] = msg[index + 5];
var[1] = msg[index + 6];
var[0] = msg[index + 7];
double val = BitConverter.ToDouble(var, 0);
return val;
}
private static char getChar(byte[] msg, int index)
{
return (char)msg[index + 3];
}
private static RGBA getRGBA(byte[] msg, int index)
{
return new RGBA(msg[index], msg[index + 1], msg[index + 2], msg[index + 3]);
}
private static Midi getMidi(byte[] msg, int index)
{
return new Midi(msg[index], msg[index + 1], msg[index + 2], msg[index + 3]);
}
#endregion
#region Create byte arrays for arguments
protected static byte[] setInt(int value)
{
byte[] msg = new byte[4];
var bytes = BitConverter.GetBytes(value);
msg[0] = bytes[3];
msg[1] = bytes[2];
msg[2] = bytes[1];
msg[3] = bytes[0];
return msg;
}
protected static byte[] setFloat(float value)
{
byte[] msg = new byte[4];
var bytes = BitConverter.GetBytes(value);
msg[0] = bytes[3];
msg[1] = bytes[2];
msg[2] = bytes[1];
msg[3] = bytes[0];
return msg;
}
protected static byte[] setString(string value)
{
var bytes = Encoding.UTF8.GetBytes(value);
int len = bytes.Length + (4 - bytes.Length % 4);
if (len <= bytes.Length) len = len + 4;
byte[] msg = new byte[len];
bytes.CopyTo(msg, 0);
return msg;
}
protected static byte[] setBlob(byte[] value)
{
int len = value.Length + 4;
len = len + (4 - len % 4);
byte[] msg = new byte[len];
byte[] size = setInt(value.Length);
size.CopyTo(msg, 0);
value.CopyTo(msg, 4);
return msg;
}
protected static byte[] setLong(Int64 value)
{
byte[] rev = BitConverter.GetBytes(value);
byte[] output = new byte[8];
output[0] = rev[7];
output[1] = rev[6];
output[2] = rev[5];
output[3] = rev[4];
output[4] = rev[3];
output[5] = rev[2];
output[6] = rev[1];
output[7] = rev[0];
return output;
}
protected static byte[] setULong(UInt64 value)
{
byte[] rev = BitConverter.GetBytes(value);
byte[] output = new byte[8];
output[0] = rev[7];
output[1] = rev[6];
output[2] = rev[5];
output[3] = rev[4];
output[4] = rev[3];
output[5] = rev[2];
output[6] = rev[1];
output[7] = rev[0];
return output;
}
protected static byte[] setDouble(double value)
{
byte[] rev = BitConverter.GetBytes(value);
byte[] output = new byte[8];
output[0] = rev[7];
output[1] = rev[6];
output[2] = rev[5];
output[3] = rev[4];
output[4] = rev[3];
output[5] = rev[2];
output[6] = rev[1];
output[7] = rev[0];
return output;
}
protected static byte[] setChar(char value)
{
byte[] output = new byte[4];
output[0] = 0;
output[1] = 0;
output[2] = 0;
output[3] = (byte)value;
return output;
}
protected static byte[] setRGBA(RGBA value)
{
byte[] output = new byte[4];
output[0] = value.R;
output[1] = value.G;
output[2] = value.B;
output[3] = value.A;
return output;
}
protected static byte[] setMidi(Midi value)
{
byte[] output = new byte[4];
output[0] = value.Port;
output[1] = value.Status;
output[2] = value.Data1;
output[3] = value.Data2;
return output;
}
#endregion
}
}
@@ -1,59 +0,0 @@
namespace SharpOSC
{
public struct RGBA
{
public byte R;
public byte G;
public byte B;
public byte A;
public RGBA(byte red, byte green, byte blue, byte alpha)
{
this.R = red;
this.G = green;
this.B = blue;
this.A = alpha;
}
public override bool Equals(System.Object obj)
{
if (obj.GetType() == typeof(RGBA))
{
if (this.R == ((RGBA)obj).R && this.G == ((RGBA)obj).G && this.B == ((RGBA)obj).B && this.A == ((RGBA)obj).A)
return true;
else
return false;
}
else if (obj.GetType() == typeof(byte[]))
{
if (this.R == ((byte[])obj)[0] && this.G == ((byte[])obj)[1] && this.B == ((byte[])obj)[2] && this.A == ((byte[])obj)[3])
return true;
else
return false;
}
else
return false;
}
public static bool operator ==(RGBA a, RGBA b)
{
if (a.Equals(b))
return true;
else
return false;
}
public static bool operator !=(RGBA a, RGBA b)
{
if (!a.Equals(b))
return true;
else
return false;
}
public override int GetHashCode()
{
return (R << 24) + (G << 16) + (B << 8) + (A);
}
}
}
@@ -1,82 +0,0 @@
using System.Collections.Generic;
namespace SharpOSC
{
public static class SlipFrame
{
public static readonly byte END = 0xc0;
public static readonly byte ESC = 0xdb;
public static readonly byte ESC_END = 0xDC;
public static readonly byte ESC_ESC = 0xDD;
public static List<byte[]> Decode(byte[] data)
{
List<byte[]> messages = new List<byte[]>();
List<byte> buffer = new List<byte>();
bool escapeNext = false;
for (int i = 0; i < data.Length; i++)
{
if (data[i] == ESC)
{
escapeNext = true;
continue;
}
if (escapeNext)
{
if (data[i] == ESC_END)
{
buffer.Add(END);
}
else if (data[i] == ESC_ESC)
{
buffer.Add(ESC);
}
escapeNext = false;
}
else if (data[i] == END)
{
if(buffer.Count > 0)
{
messages.Add(buffer.ToArray());
}
buffer.Clear();
}
else
{
buffer.Add(data[i]);
}
}
return messages;
}
public static byte[] Encode(byte[] data)
{
List<byte> slipData = new List<byte>();
byte[] esc_end = { ESC, ESC_END };
byte[] esc_esc = { ESC, ESC_ESC };
byte[] end = { END };
int length = data.Length;
for (int i = 0; i < length; i++)
{
if (data[i] == END)
{
slipData.AddRange(esc_end);
}
else if (data[i] == ESC)
{
slipData.AddRange(esc_esc);
}
else
{
slipData.Add(data[i]);
}
}
slipData.AddRange(end);
return slipData.ToArray();
}
}
}
@@ -1,64 +0,0 @@
namespace SharpOSC
{
public class Symbol
{
public string Value;
public Symbol()
{
Value = "";
}
public Symbol(string value)
{
this.Value = value;
}
override
public string ToString()
{
return Value;
}
public override bool Equals(System.Object obj)
{
if (obj.GetType() == typeof(Symbol))
{
if (this.Value == ((Symbol)obj).Value)
return true;
else
return false;
}
else if (obj.GetType() == typeof(string))
{
if (this.Value == ((string)obj))
return true;
else
return false;
}
else
return false;
}
public static bool operator ==(Symbol a, Symbol b)
{
if (a.Equals(b))
return true;
else
return false;
}
public static bool operator !=(Symbol a, Symbol b)
{
if (!a.Equals(b))
return true;
else
return false;
}
public override int GetHashCode()
{
return Value.GetHashCode();
}
}
}
@@ -1,164 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Serilog;
using TcpSharp;
namespace SharpOSC
{
public class MessageEventArgs : EventArgs
{
public OscMessage Message
{
get;
set;
}
}
public class TCPClient
{
private ILogger _log = Log.Logger.ForContext<TCPClient>();
public int Port
{
get { return _port; }
}
int _port;
public string Address
{
get { return _address; }
}
public delegate void MessageReceivedHandler(object source, MessageEventArgs args);
public event MessageReceivedHandler MessageReceived;
string _address;
TcpSharpSocketClient tcpClient;
private List<byte> frameStream = new List<byte>();
public TCPClient(string address, int port)
{
_port = port;
_address = address;
}
public bool Connect()
{
try
{
tcpClient = new TcpSharpSocketClient(Address, Port);
tcpClient.OnConnected += ClientConnected;
tcpClient.OnDataReceived += DataReceived;
tcpClient.OnDisconnected += ClientDisconneted;
tcpClient.OnError += ClientError;
tcpClient.Connect();
return true;
}
catch (Exception e)
{
_log.Error(e.Message);
return false;
}
}
private void ClientError(object sender, OnClientErrorEventArgs e)
{
_log.Error("client error");
_log.Error(e.Exception.ToString());
}
private void ClientDisconneted(object sender, OnClientDisconnectedEventArgs e)
{
_log.Information($"client disconnected: {e.Reason}");
Close();
}
private void DataReceived(object sender, OnClientDataReceivedEventArgs e)
{
frameStream.AddRange(e.Data);
int i = 0;
int frameEnd = frameStream.FindIndex(1, frameByte => frameByte.Equals(SlipFrame.END));
while (frameEnd > 0)
{
List<byte> frame = frameStream.GetRange(0, frameEnd + 1);
frameStream.RemoveRange(0, frameEnd + 1);
List<byte[]> messages = SlipFrame.Decode(frame.ToArray());
foreach (var message in messages)
{
try
{
OscPacket packet = OscPacket.GetPacket(message);
OscMessage responseMessage = (OscMessage)packet;
if (packet == null)
{
_log.Error("packet is null");
}
if (responseMessage == null)
{
_log.Error("responeMessage is null");
}
OnMessageReceived(responseMessage);
}
catch (Exception ex)
{
_log.Error($"Exception parsing OSC message: {ex.ToString()}");
}
}
frameEnd = frameStream.FindIndex(0, frameByte => frameByte.Equals(SlipFrame.END));
}
}
private void ClientConnected(object sender, OnClientConnectedEventArgs e)
{
_log.Debug($"connected to <{Address}:{Port}>");
}
public void Send(byte[] message)
{
byte[] slipData = SlipFrame.Encode(message);
tcpClient.SendBytes(slipData.ToArray());
}
public void Send(OscPacket packet)
{
byte[] data = packet.GetBytes();
Send(data);
}
public bool IsConnected
{
get
{
if (tcpClient == null)
return false;
else
return tcpClient.Connected;
}
}
public void Close()
{
if (tcpClient != null)
{
tcpClient.OnConnected -= ClientConnected;
tcpClient.OnDataReceived -= DataReceived;
tcpClient.OnDisconnected -= ClientDisconneted;
if (tcpClient.Connected)
{
_log.Debug($"closing connection to {Address}");
tcpClient.Disconnect();
}
}
}
protected virtual void OnMessageReceived(OscMessage msg)
{
MessageReceived?.Invoke(this, new MessageEventArgs() { Message = msg });
}
}
}
@@ -1,89 +0,0 @@
using System;
namespace SharpOSC
{
public struct Timetag
{
public UInt64 Tag;
public DateTime Timestamp
{
get
{
return Utils.TimetagToDateTime(Tag);
}
set
{
Tag = Utils.DateTimeToTimetag(value);
}
}
/// <summary>
/// Gets or sets the fraction of a second in the timestamp. the double precision number is multiplied by 2^32
/// giving an accuracy down to about 230 picoseconds ( 1/(2^32) of a second)
/// </summary>
public double Fraction
{
get
{
return Utils.TimetagToFraction(Tag);
}
set
{
Tag = (Tag & 0xFFFFFFFF00000000) + (UInt32)(value * 0xFFFFFFFF);
}
}
public Timetag(UInt64 value)
{
this.Tag = value;
}
public Timetag(DateTime value)
{
Tag = 0;
this.Timestamp = value;
}
public override bool Equals(System.Object obj)
{
if (obj.GetType() == typeof(Timetag))
{
if (this.Tag == ((Timetag)obj).Tag)
return true;
else
return false;
}
else if (obj.GetType() == typeof(UInt64))
{
if (this.Tag == ((UInt64)obj))
return true;
else
return false;
}
else
return false;
}
public static bool operator ==(Timetag a, Timetag b)
{
if (a.Equals(b))
return true;
else
return false;
}
public static bool operator !=(Timetag a, Timetag b)
{
if (a.Equals(b))
return true;
else
return false;
}
public override int GetHashCode()
{
return (int)( ((uint)(Tag >> 32) + (uint)(Tag & 0x00000000FFFFFFFF)) / 2);
}
}
}
@@ -1,180 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using Serilog;
namespace SharpOSC
{
public delegate void HandleOscPacket(OscPacket packet);
public delegate void HandleBytePacket(byte[] packet);
public class UDPListener : IDisposable
{
public int Port { get; private set; }
object callbackLock;
UdpClient receivingUdpClient;
IPEndPoint RemoteIpEndPoint;
HandleBytePacket BytePacketCallback = null;
HandleOscPacket OscPacketCallback = null;
Queue<byte[]> queue;
ManualResetEvent ClosingEvent;
public UDPListener(int port)
{
Port = port;
queue = new Queue<byte[]>();
ClosingEvent = new ManualResetEvent(false);
callbackLock = new object();
// try to open the port 10 times, else fail
for (int i = 0; i < 10; i++)
{
try
{
receivingUdpClient = new UdpClient(port);
break;
}
catch (Exception)
{
// Failed in ten tries, throw the exception and give up
if (i >= 9)
throw;
Thread.Sleep(5);
}
}
RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
// setup first async event
AsyncCallback callBack = new AsyncCallback(ReceiveCallback);
receivingUdpClient.BeginReceive(callBack, null);
}
public UDPListener(int port, HandleOscPacket callback) : this(port)
{
this.OscPacketCallback = callback;
}
public UDPListener(int port, HandleBytePacket callback) : this(port)
{
this.BytePacketCallback = callback;
}
void ReceiveCallback(IAsyncResult result)
{
Monitor.Enter(callbackLock);
Byte[] bytes = null;
try
{
bytes = receivingUdpClient.EndReceive(result, ref RemoteIpEndPoint);
}
catch (ObjectDisposedException e)
{
// Ignore if disposed. This happens when closing the listener
Log.Debug(e.ToString());
}
// Process bytes
if (bytes != null && bytes.Length > 0)
{
if (BytePacketCallback != null)
{
BytePacketCallback(bytes);
}
else if (OscPacketCallback != null)
{
OscPacket packet = null;
try
{
packet = OscPacket.GetPacket(bytes);
}
catch (Exception e)
{
Log.Debug(e.ToString());
// If there is an error reading the packet, null is sent to the callback
}
//Log.Debug("Raw UDP In: " + System.Text.Encoding.ASCII.GetString(bytes));
OscPacketCallback(packet);
}
else
{
lock (queue)
{
queue.Enqueue(bytes);
}
}
}
if (closing)
ClosingEvent.Set();
else
{
// Setup next async event
AsyncCallback callBack = new AsyncCallback(ReceiveCallback);
receivingUdpClient.BeginReceive(callBack, null);
}
Monitor.Exit(callbackLock);
}
bool closing = false;
public void Close()
{
lock (callbackLock)
{
ClosingEvent.Reset();
closing = true;
receivingUdpClient.Close();
}
ClosingEvent.WaitOne();
}
public void Dispose()
{
this.Close();
}
public OscPacket Receive()
{
if (closing) throw new Exception("UDPListener has been closed.");
lock (queue)
{
if (queue.Count() > 0)
{
byte[] bytes = queue.Dequeue();
var packet = OscPacket.GetPacket(bytes);
//Log.Debug("Raw UDP In: " + System.Text.Encoding.ASCII.GetString(bytes));
return packet;
}
else
return null;
}
}
public byte[] ReceiveBytes()
{
if (closing) throw new Exception("UDPListener has been closed.");
lock (queue)
{
if (queue.Count() > 0)
{
byte[] bytes = queue.Dequeue();
return bytes;
}
else
return null;
}
}
}
}
@@ -1,53 +0,0 @@
using System;
using System.Net.Sockets;
using System.Net;
namespace SharpOSC
{
public class UDPSender
{
public int Port
{
get { return _port; }
}
int _port;
public string Address
{
get { return _address; }
}
string _address;
IPEndPoint RemoteIpEndPoint;
Socket sock;
public UDPSender(string address, int port)
{
_port = port;
_address = address;
sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
var addresses = System.Net.Dns.GetHostAddresses(address);
if (addresses.Length == 0) throw new Exception("Unable to find IP address for " + address);
RemoteIpEndPoint = new IPEndPoint(addresses[0], port);
}
public void Send(byte[] message)
{
sock.SendTo(message, RemoteIpEndPoint);
}
public void Send(OscPacket packet)
{
byte[] data = packet.GetBytes();
Send(data);
}
public void Close()
{
sock.Close();
}
}
}
@@ -1,47 +0,0 @@
using System;
namespace SharpOSC
{
public class Utils
{
public static DateTime TimetagToDateTime(UInt64 val)
{
if (val == 1)
return DateTime.Now;
UInt32 seconds = (UInt32)(val >> 32);
var time = DateTime.Parse("1900-01-01 00:00:00");
time = time.AddSeconds(seconds);
var fraction = TimetagToFraction(val);
time = time.AddSeconds(fraction);
return time;
}
public static double TimetagToFraction(UInt64 val)
{
if (val == 1)
return 0.0;
UInt32 seconds = (UInt32)(val & 0x00000000FFFFFFFF);
double fraction = (double)seconds / (UInt32)(0xFFFFFFFF);
return fraction;
}
public static UInt64 DateTimeToTimetag(DateTime value)
{
UInt64 seconds = (UInt32)(value - DateTime.Parse("1900-01-01 00:00:00.000")).TotalSeconds;
UInt64 fraction = (UInt32)(0xFFFFFFFF * ((double)value.Millisecond / 1000));
UInt64 output = (seconds << 32) + fraction;
return output;
}
public static int AlignedStringLength(string val)
{
int len = val.Length + (4 - val.Length % 4);
if (len <= val.Length) len += 4;
return len;
}
}
}
@@ -1,40 +0,0 @@
using Acr.UserDialogs;
using qController.Communication;
namespace qController.Dialogs
{
public class AddInstancePrompt : PromptConfig
{
public AddInstancePrompt()
{
Title = "Enter IP of QLab Computer";
Message = "Enter an IP Address to save";
OkText = "Next";
OnTextChanged = args =>
{
//IPAddress ugh
args.IsValid = IPHelper.IsValidAddress(args.Value);
};
OnAction = (qAddress) =>
{
if (!qAddress.Ok)
return;
UserDialogs.Instance.Prompt(new PromptConfig
{
Title = "Enter Name",
Message = "Enter a Name for " + qAddress.Text,
OkText = "Save",
OnAction = (qName) => {
if (!qName.Ok)
return;
QStorage.AddInstance(qName.Text, qAddress.Text);
App.showToast("Manual Workspace Added!");
}
});
};
}
}
}
@@ -1,22 +0,0 @@
using System;
using Acr.UserDialogs;
using Xamarin.Essentials;
namespace qController.Dialogs
{
public class DonatePrompt : ConfirmConfig
{
public DonatePrompt()
{
Title = "Support the Project";
Message = "This application will never be a paid app or contain any sort of ads, but if you choose to show your support you may do so by clicking the Donate button below. Thank you!";
OkText = "Donate";
OnAction = (response) =>
{
if (response)
Launcher.OpenAsync(new Uri("https://linktr.ee/JoelWetzell"));
};
}
}
}
@@ -1,15 +0,0 @@
using System;
using Acr.UserDialogs;
namespace qController.Dialogs
{
public class NoWorkspacesConfig : ConfirmConfig
{
public NoWorkspacesConfig(Action<bool> action)
{
Message = "QLab doesn't have any workspaces open?";
OkText = "Disconnect";
OnAction = action;
}
}
}
@@ -1,87 +0,0 @@
using System;
using System.Collections.Generic;
using Acr.UserDialogs;
using qController.QItems;
using Serilog;
namespace qController.Dialogs
{
public class WorkspacePromptArgs : EventArgs
{
public QWorkspace SelectedWorkspace
{
get;
set;
}
}
public class WorkspacePrompt
{
public delegate void WorkspaceSelectedHandler(object source, WorkspacePromptArgs args);
public event WorkspaceSelectedHandler WorkspaceSelected;
public WorkspacePrompt()
{
}
public ActionSheetConfig getActionSheetConfigForWorkspaces(List<QWorkspaceInfo> workspaces)
{
ActionSheetConfig actionSheetConfig = new ActionSheetConfig();
actionSheetConfig.SetTitle("Select Workspace");
for (int i = 0; i < workspaces.Count; i++)
{
QWorkspaceInfo workspace = workspaces[i];
actionSheetConfig.Add(workspace.displayName, new Action(() => {
Log.Debug("CONTROLPAGE - Workspace Selected " + workspace.displayName);
if (!workspace.hasPasscode)
{
OnWorkspaceSelected(new QWorkspace(workspace.uniqueID));
}
else
{
promptWorkspacePasscode(workspace.uniqueID);
}
}));
}
return actionSheetConfig;
}
public void promptWorkspacePasscode(string workspace_id)
{
UserDialogs.Instance.Prompt(new PromptConfig
{
InputType = InputType.Number,
MaxLength = 4,
Title = "Enter Workspace Passcode",
OkText = "Connect",
IsCancellable = true,
OnAction = (resp) =>
{
if (resp.Ok)
{
OnWorkspaceSelected(new QWorkspace(workspace_id,resp.Value));
}
else
{
OnWorkspaceSelected(null);
}
}
});
}
protected virtual void OnWorkspaceSelected(QWorkspace workspace)
{
if (WorkspaceSelected != null)
WorkspaceSelected(this, new WorkspacePromptArgs() { SelectedWorkspace = workspace });
}
}
}
@@ -1,51 +0,0 @@
using System.Collections.Generic;
namespace qController.QItems
{
public class QCue
{
//info loaded from "/cueLists"
public string number { get; set; }
public string uniqueID { get; set; }
public bool flagged { get; set; }
public string listName { get; set; }
public string type { get; set; }
public string colorName { get; set; }
public string name { get; set; }
public bool armed { get; set; }
//info loaded from "/valuesForKeys
public decimal translationX { get; set; }
public bool isRunning { get; set; }
public decimal scaleX { get; set; }
public bool isPaused { get; set; }
public decimal translationY { get; set; }
public decimal preWait { get; set; }
public decimal opacity { get; set; }
public decimal scaleY { get; set; }
public decimal duration { get; set; }
public decimal postWait { get; set; }
public bool isBroken { get; set; }
public string displayName { get; set; }
public bool isLoaded { get; set; }
public string notes { get; set; }
public List<List<double>> levels { get; set; }
//info loaded from /children
public List<QCue> cues { get; set; }
//get string for icon font from cue type
public string getIconString()
{
return QIcon.GetIconFromType(type);
}
public string IconText
{
get
{
return QIcon.GetIconFromType(type);
}
}
}
}
@@ -1,25 +0,0 @@
using System.Collections.Generic;
namespace qController.QItems
{
public class QCueList
{
public string number { get; set; }
public string uniqueID { get; set; }
public List<QCue> cues { get; set; }
public bool flagged { get; set; }
public string listName { get; set; }
public string type { get; set; }
public string colorName { get; set; }
public string name { get; set; }
public bool armed { get; set; }
public string IconText
{
get
{
return QIcon.GetIconFromType("Group");
}
}
}
}
@@ -1,10 +0,0 @@
using System;
namespace qController.Classes.Cues
{
public class QDefinitions
{
public QDefinitions()
{
}
}
}
@@ -1,34 +0,0 @@
using Xamarin.Forms;
namespace qController.QItems
{
public class QInstance
{
public string name { get; set; }
public string address { get; set; }
public QInstance()
{
}
public QInstance(string tName, string tAddress)
{
name = tName;
address = tAddress;
}
public bool IsReachable()
{
/*try
{
IPAddress instanceIP = IPAddress.Parse(address);
Ping p = new System.Net.NetworkInformation.Ping();
PingReply reply = p.Send(instanceIP);
return reply.Status == IPStatus.Success ? true : false;
}
catch
{
return false;
}*/
return true;
}
}
}
@@ -1,126 +0,0 @@
//Class pertains to the local copy of a workspace, with methods for fetching/updating information inside
using System.Collections.Generic;
using Serilog;
namespace qController.QItems
{
public class QWorkspace
{
public string status { get; set; }
public List<QCueList> data { get; set; }
public string workspace_id { get; set; }
public string address { get; set; }
public bool IsPopulated { get; set; }
public string passcode { get; set; }
//ONLY FOR PASSING A WORKSPACE LOAD ERROR
public QWorkspace(string id)
{
workspace_id = id;
}
public QWorkspace(string id, string passcode)
{
workspace_id = id;
this.passcode = passcode;
}
public QWorkspace()
{
}
public QCue GetCue(string cue_id)
{
foreach (var cueList in data)
{
foreach (var cue in cueList.cues)
{
if(cue.uniqueID == cue_id)
{
return cue;
}
}
}
return null;
}
public QCueList GetCueList(string id)
{
foreach (var cueList in data)
{
if(cueList.uniqueID == id)
{
return cueList;
}
}
return null;
}
public void UpdateCue(QCue cue)
{
for (int i = 0; i < data.Count; i++)
{
for (int j = 0; j < data[i].cues.Count; j++)
{
if(data[i].cues[j].uniqueID == cue.uniqueID)
{
//Log.Debug("Cue found and updated in workspace: " + cue.uniqueID);
data[i].cues[j] = cue;
return;
}
}
}
}
public void UpdateChildren(string cue_id, List<QCue> children)
{
for (int i = 0; i < data.Count; i++)
{
for (int j = 0; j < data[i].cues.Count; j++)
{
if (data[i].cues[j].uniqueID == cue_id)
{
if(data[i].cues[j].type == "Group")
{
data[i].cues[j].cues = children;
return;
}
}
}
}
}
public bool CheckPopulated()
{
if(data == null)
{
IsPopulated = false;
return false;
}
for (int i = 0; i < data.Count; i++)
{
for (int j = 0; j < data[i].cues.Count; j++)
{
if (data[i].cues[j].type == "Group" && data[i].cues[j].cues == null)
{
IsPopulated = false;
return false;
}
}
}
IsPopulated = true;
return true;
}
public void PrintStats()
{
foreach (var cueList in data)
{
Log.Debug(cueList.listName + "("+ cueList.cues.Count + " cues)");
}
}
}
}
@@ -1,11 +0,0 @@
//General information about a QLab Workspace
namespace qController.QItems
{
public class QWorkspaceInfo
{
public string version { get; set; }
public string displayName { get; set; }
public string uniqueID { get; set; }
public bool hasPasscode { get; set; }
}
}
@@ -1,11 +0,0 @@
namespace qController
{
public class MenuPageItem
{
public string Title { get; set; }
public string Icon { get; set; }
public string Command { get; set; }
}
}
@@ -1,15 +0,0 @@
using qController.QItems;
namespace qController
{
public class NoQCueSelected : QCue
{
public NoQCueSelected()
{
listName = "No Cue Selected";
type = "";
notes = "Workspace has loaded but no cue is selected";
number = "!";
}
}
}
@@ -1,11 +0,0 @@
namespace qController
{
public class OSCListItem
{
public string Text { get; set; }
public string Icon { get; set; }
public string Command { get; set; }
}
}
@@ -1,17 +0,0 @@
namespace qController
{
public class QCommand
{
public string osc;
public string text;
public string type;
public QCommand(string display, string cmd, string command_type)
{
text = display;
osc = cmd;
type = command_type;
}
}
}
@@ -1,17 +0,0 @@
namespace qController
{
public static class QCommands
{
public static QCommand GO = new QCommand("GO", "/go","WORKSPACE");
public static QCommand PANIC = new QCommand("Panic", "/panic","WORKSPACE");
public static QCommand PAUSE = new QCommand("Pause", "/pause","WORKSPACE");
public static QCommand PREVIEW = new QCommand("Preview", "/preview","WORKSPACE");
public static QCommand RESUME = new QCommand("Resume", "/resume","WORKSPACE");
public static QCommand PREVIOUS = new QCommand("Previous","/select/previous","WORKSPACE");
public static QCommand NEXT = new QCommand("Next", "/select/next","WORKSPACE");
public static QCommand RESET = new QCommand("Reset","/reset","WORKSPACE");
public static QCommand STOP = new QCommand("Stop","/stop","WORKSPACE");
public static QCommand HARDSTOP = new QCommand("Hard Stop", "/hardStop","WORKSPACE");
}
}
@@ -1,118 +0,0 @@
//Get appropriately letter or unicode character for Icon font
namespace qController
{
public static class QIcon
{
public const string SEARCH = "\uE800";
public const string PLUS = "\uE801";
public const string TRASH_EMPTY = "\uE802";
public const string CANCEL = "\uE803";
public const string MUSIC = "\uE804";
public const string VIDEO = "\uE805";
public const string VIDEOCAM = "\uE806";
public const string VOLUME_UP = "\uE807";
public const string CLOCK = "\uE808";
public const string PLAY = "\uE809";
public const string STOP = "\uE80A";
public const string PAUSE = "\uE80B";
public const string CW = "\uE80C";
public const string TARGET = "\uE80D";
public const string CHART_PIE = "\uE80E";
public const string UNDO = "\uE80F";
public const string POWER = "\uE810";
public const string QRCODE = "\uE811";
public const string MAIL = "\uE812";
public const string LEFT_DIR = "\uE813";
public const string LIST = "\uE814";
public const string SPIN3 = "\uE832";
public const string MENU = "\uF0C9";
public const string LIGHTBULB = "\uF0EB";
public const string MIC = "\uF130";
public const string MINUS_SQUARED = "\uF146";
public const string DOLLAR = "\uF155";
public const string RIGHT = "\uF178";
public const string DOT_CIRCLED = "\uF192";
public const string SLIDERS = "\uF1DE";
public const string WIFI = "\uF1EB";
public const string OBJECT_UNGROUP = "\uF248";
public const string HOURGLASS_O = "\uF250";
public const string COMMENTING_O = "\uF27B";
public static string GetIconFromType(string type)
{
switch (type)
{
case "Group":
return "g";
case "Audio":
return "a";
case "Mic":
return "m";
case "Video":
return "v";
case "Camera":
return "c";
case "Text":
return "t";
case "Light":
return LIGHTBULB;
case "Fade":
return "f";
case "Network":
return "o";
case "MIDI":
return "M";
case "MIDI File":
return "F";
case "Timecode":
return "T";
case "Start":
return "s";
case "Stop":
return "S";
case "Pause":
return "p";
case "Load":
return "l";
case "Reset":
return "r";
case "Devamp":
return "d";
case "GoTo":
return "G";
case "Target":
return "R";
case "Arm":
return "A";
case "Disarm":
return "D";
case "Wait":
return "W";
case "Memo":
return "e";
case "Script":
return "C";
default:
return "";
}
}
}
}
@@ -1,70 +0,0 @@
using Serilog;
using System.Collections.ObjectModel;
using Acr.Settings;
using qController.QItems;
namespace qController
{
public class QStorage
{
public static ObservableCollection<QInstance> qInstances;
static QStorage(){
qInstances = (ObservableCollection<QInstance>)CrossSettings.Current.GetValue(new ObservableCollection<QInstance>().GetType(), "qInstances", null);
if (qInstances == null)
{
Log.Debug("QSTORAGE - No qInstance exists creating one");
qInstances = new ObservableCollection<QInstance>();
updateStorage();
}
}
public static bool AddInstance(string name, string address){
return AddInstance(new QInstance(name, address));
}
public static bool AddInstance(QInstance q){
if(!Contains(q.name, q.address)){
qInstances.Add(q);
updateStorage();
return true;
}else{
return false;
}
}
public static void RemoveInstance(string name, string address){
foreach (var item in qInstances)
{
if(item.address == address && item.name == name){
RemoveInstance(item);
return;
}
}
}
public static void RemoveInstance(QInstance q){
qInstances.Remove(q);
updateStorage();
}
private static void updateStorage(){
CrossSettings.Current.SetValue("qInstances", qInstances);
}
public static bool Contains(string name, string address){
foreach (var item in qInstances)
{
Log.Information("Item name: " + item.name + " Found Name: " + name);
if (item.address == address)
{
return true;
}
}
return false;
}
public bool IsEmpty(){
return qInstances.Count == 0;
}
}
}
-10
View File
@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Application xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="qController.App">
<Application.Resources>
<!-- Application resource dictionary -->
<OnPlatform x:Key="qfont" x:TypeArguments="x:String">
<On Platform="Android" Value="qfont.ttf#qfont" />
<On Platform="iOS" Value="qfont" />
</OnPlatform>
</Application.Resources>
</Application>
-68
View File
@@ -1,68 +0,0 @@
using Acr.UserDialogs;
using Xamarin.Forms;
using Xamarin.Essentials;
using qController.Communication;
namespace qController
{
public partial class App : Application
{
public static INavigation iNav;
public static NavigationPage NavigationPage { get; private set; }
public static RootPage rootPage;
public static string QFont;
public static DisplayInfo mainDisplayInfo;
public static double Height;
public static double Width;
public static double HeightUnit;
public static double WidthUnit;
public static QController qControllerToResume;
public static bool MenuIsPresented
{
get
{
return rootPage.IsPresented;
}
set
{
rootPage.IsPresented = value;
}
}
public App()
{
InitializeComponent();
/*MainPage = new NavigationPage(new QConnectionPage());
iNav = MainPage.Navigation;*/
mainDisplayInfo = DeviceDisplay.MainDisplayInfo;
Height = mainDisplayInfo.Height / mainDisplayInfo.Density;
Width = mainDisplayInfo.Width / mainDisplayInfo.Density;
HeightUnit = Height / 100.0;
WidthUnit = Width / 100.0;
switch (Device.RuntimePlatform)
{
case Device.iOS:
QFont = "qfont";
break;
case Device.Android:
QFont = "qfont.ttf#qfont";
break;
}
rootPage = new RootPage();
rootPage.Detail = new NavigationPage(new QConnectionPage());
MainPage = rootPage;
}
public static void showToast(string message)
{
var toastConfig = new ToastConfig(message);
toastConfig.SetDuration(3000);
toastConfig.SetPosition(ToastPosition.Bottom);
UserDialogs.Instance.Toast(toastConfig);
}
}
}
@@ -1,21 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="qController.ControlPage"
BackgroundColor="#4A4A4A">
<ContentPage.Content>
<AbsoluteLayout x:Name="sLayout">
<Grid x:Name="topBar" HorizontalOptions="FillAndExpand" AbsoluteLayout.LayoutBounds="0,0,1,.09" AbsoluteLayout.LayoutFlags="All" BackgroundColor="#71AEFF">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="4*" />
</Grid.ColumnDefinitions>
<Label x:Name = "menuButton" FontFamily = "{StaticResource qfont}" HorizontalOptions = "Start" VerticalOptions="End" Margin="20,10,20,10" Grid.Row="0" Grid.Column="0" FontSize="25" Text="&#xF0C9;"/>
<Label x:Name = "instanceName" HorizontalTextAlignment="End" HorizontalOptions = "FillAndExpand" VerticalOptions="End" Margin="20,10,20,10" Grid.Row="0" Grid.Column="1"/>
</Grid>
</AbsoluteLayout>
</ContentPage.Content>
</ContentPage>
@@ -1,394 +0,0 @@
using System;
using System.Collections.Generic;
using Xamarin.Forms;
using Serilog;
using Acr.UserDialogs;
using qController.Dialogs;
using qController.QItems;
using qController.Cell;
using qController.Communication;
namespace qController
{
public partial class ControlPage : ContentPage
{
QController qController;
QSelectedCueCell qCell;
QLevelsCell qLevelsCell;
QCueListCell qCueListCell;
QLevelsButton showLevelsButton;
QControlsBlock qControlsBlock;
WorkspacePrompt workspacePrompt = new WorkspacePrompt();
public ControlPage(string name, string address)
{
InitializeComponent();
qController = new QController(address, 53000);
qController.qClient.qParser.WorkspaceInfoReceived += WorkspaceInfoReceived;
qController.qClient.qParser.WorkspaceUpdated += WorkspaceUpdated;
qController.qClient.qParser.WorkspaceDisconnect += WorkspaceDisconnected;
qController.qClient.qParser.PlaybackPositionUpdated += PlaybackPositionUpdated;
qController.qClient.qParser.ConnectionStatusChanged += OnConnectionStatusChanged;
qController.qClient.qParser.CueInfoUpdated += OnCueUpdateReceived;
qController.qClient.qParser.ChildrenUpdated += OnChildrenUpdated;
workspacePrompt.WorkspaceSelected += OnWorkspaceSelected;
App.rootPage.MenuItemSelected += OnMenuItemSelected;
instanceName.Text = name;
InitGUI();
if (!qController.qClient.connected) {
App.showToast("Error connecting...make sure QLab is running");
Back();
} else {
qController.KickOff();
}
}
private void OnWorkspaceSelected(object source, WorkspacePromptArgs args)
{
if (args.SelectedWorkspace != null) {
qController.Connect(args.SelectedWorkspace);
} else {
Log.Debug("CONTROLPAGE - No Workspace selected backing out");
Back();
}
}
private void OnConnectionStatusChanged(object source, ConnectEventArgs args)
{
Log.Debug($"CONTROLPAGE - Connection Status Changed: {args.WorkspaceId} : {args.Status}");
if (args.Status.Contains("ok")) {
if(args.Status.Contains(":") && !args.Status.Contains("view")) {
workspacePrompt.promptWorkspacePasscode(args.WorkspaceId);
return;
}
Device.BeginInvokeOnMainThread(() => {
FinishUI();
});
} else if (args.Status.Contains("badpass")) {
workspacePrompt.promptWorkspacePasscode(args.WorkspaceId);
}
}
private void WorkspaceInfoReceived(object source, WorkspaceInfoArgs args)
{
if (args.WorkspaceInfo.Count > 1) {
Log.Debug("CONTROLPAGE - MULTIPLE WORKSPACES ON SELECTED COMPUTER");
PromptForWorkspace(args.WorkspaceInfo);
} else if (args.WorkspaceInfo.Count == 1) {
Log.Debug("CONTROLPAGE - ONLY ONE WORKSPACE ON SELECTED COMPUTER");
if (!args.WorkspaceInfo[0].hasPasscode) {
qController.Connect(args.WorkspaceInfo[0].uniqueID);
} else {
workspacePrompt.promptWorkspacePasscode(args.WorkspaceInfo[0].uniqueID);
}
} else {
NoWorkspacesConfig noWorkspacesConfig = new NoWorkspacesConfig(NoWorkspaceDetected);
UserDialogs.Instance.Confirm(noWorkspacesConfig);
}
}
private void PromptForWorkspace(List<QWorkspaceInfo> workspaces)
{
UserDialogs.Instance.ActionSheet(workspacePrompt.getActionSheetConfigForWorkspaces(workspaces));
}
private void InitGUI()
{
App.rootPage.MenuPage.ChangeToControl();
NavigationPage.SetHasNavigationBar(this, false);
qCell = new QSelectedCueCell();
qCell.SelectedCueEdited += OnSelectedCueEdited;
AbsoluteLayout.SetLayoutFlags(qCell, AbsoluteLayoutFlags.All);
instanceName.FontSize = App.HeightUnit * 3;
switch (Device.RuntimePlatform)
{
case Device.iOS:
AbsoluteLayout.SetLayoutBounds(qCell, new Rectangle(0, 0.13, 1, 0.30));
topBar.HeightRequest = App.Height * .09;
menuButton.FontSize = App.Height * .04;
break;
case Device.Android:
AbsoluteLayout.SetLayoutBounds(qCell, new Rectangle(0, 0.13, 1, 0.35));
topBar.HeightRequest = App.Height * .06;
menuButton.FontSize = App.Height * .05;
break;
}
//Menu Button Setup
var menuButtonGesture = new TapGestureRecognizer();
menuButtonGesture.Tapped += ShowMenu;
menuButton.GestureRecognizers.Add(menuButtonGesture);
menuButton.Margin = new Thickness(App.WidthUnit * 2, 0, 0, App.WidthUnit * 2);
sLayout.Children.Add(qCell);
}
private void SendOSCFromButton(object sender, EventArgs args)
{
if (((QButton)sender).qCommand.type == "WORKSPACE")
{
string workspace_prefix = "/workspace/" + qController.qWorkspace.workspace_id;
string command = workspace_prefix + ((QButton)sender).qCommand.osc;
qController.qClient.sendTCP(command);
}
}
private void OnSelectedCueEdited(object source, CueEditArgs args)
{
string address = "/workspace/" + qController.qWorkspace.workspace_id + "/cue_id/" + args.CueID + "/" + args.Property;
qController.qClient.sendTCP(address, args.NewValue);
}
void FinishUI()
{
string workspace_prefix = "/workspace/" + qController.qWorkspace.workspace_id;
qLevelsCell = new QLevelsCell();
qLevelsCell.mainSlider.ValueChanged += (sender, args) =>
{
qController.qClient.sendTCP(workspace_prefix + "/cue_id/" + qLevelsCell.activeCue + "/sliderLevel/0", (float)args.NewValue);
};
qLevelsCell.leftSlider.ValueChanged += (sender, args) =>
{
qController.qClient.sendTCP(workspace_prefix + "/cue_id/" + qLevelsCell.activeCue + "/sliderLevel/1", (float)args.NewValue);
};
qLevelsCell.rightSlider.ValueChanged += (sender, args) =>
{
qController.qClient.sendTCP(workspace_prefix + "/cue_id/" + qLevelsCell.activeCue + "/sliderLevel/2", (float)args.NewValue);
};
showLevelsButton = new QLevelsButton();
showLevelsButton.button.Clicked += (s, e) =>
{
qLevelsCell.IsVisible = !qLevelsCell.IsVisible;
};
qControlsBlock = new QControlsBlock(SendOSCFromButton);
AbsoluteLayout.SetLayoutFlags(qControlsBlock, AbsoluteLayoutFlags.All);
AbsoluteLayout.SetLayoutFlags(qLevelsCell, AbsoluteLayoutFlags.All);
AbsoluteLayout.SetLayoutFlags(showLevelsButton, AbsoluteLayoutFlags.PositionProportional);
switch (Device.RuntimePlatform)
{
case Device.iOS:
AbsoluteLayout.SetLayoutBounds(qControlsBlock, new Rectangle(0, 0.53, 1, 0.25));
AbsoluteLayout.SetLayoutBounds(qLevelsCell, new Rectangle(0.9, 0.40, 0.8, 0.25));
AbsoluteLayout.SetLayoutBounds(showLevelsButton, new Rectangle(0.02, 0.34, App.HeightUnit * 8, App.HeightUnit * 8));
break;
case Device.Android:
AbsoluteLayout.SetLayoutBounds(qControlsBlock, new Rectangle(0, 0.58, 1, 0.25));
AbsoluteLayout.SetLayoutBounds(qLevelsCell, new Rectangle(0.9, 0.45, 0.8, 0.25));
AbsoluteLayout.SetLayoutBounds(showLevelsButton, new Rectangle(0.02, 0.39, App.HeightUnit * 8, App.HeightUnit * 8));
break;
}
sLayout.Children.Add(qControlsBlock);
sLayout.Children.Add(qLevelsCell);
sLayout.Children.Add(showLevelsButton);
}
private void ToggeQLevelsCellVisiblity(object sender, EventArgs e)
{
qLevelsCell.IsVisible = !qLevelsCell.IsVisible;
}
void ShowMenu(object sender, EventArgs e)
{
App.MenuIsPresented = true;
}
void Back()
{
if (qController.qClient.connected)
{
qController.Kill();
}
App.rootPage.MenuItemSelected -= OnMenuItemSelected;
Device.BeginInvokeOnMainThread(() =>
{
App.rootPage.MenuPage.ChangeToHome();
App.rootPage.Detail.Navigation.PopAsync();
});
}
public void NoWorkspaceDetected(bool resp)
{
if (resp)
{
Back();
}
}
public void WorkspaceDisconnected(object sender, EventArgs e)
{
Back();
}
public void WorkspaceUpdated(object sender, WorkspaceEventArgs e)
{
if(e.UpdatedWorkspace.data == null)
{
Log.Debug("[ControlPage] Workspace Update contains null data.");
return;
}
if(e.UpdatedWorkspace.data.Count > 0)
{
qController.qWorkspace = e.UpdatedWorkspace;
qController.qWorkspace.CheckPopulated();
if (qController.qWorkspace.IsPopulated)
{
Device.BeginInvokeOnMainThread(() =>
{
App.rootPage.MenuPage.ChangeToWorkspace(e.UpdatedWorkspace);
});
if (qCell.activeCue == null)
{
Device.BeginInvokeOnMainThread(() => {
qCell.UpdateSelectedCue(new NoQCueSelected());
});
Log.Debug("CONTROLPAGE - Update Selected Cue Called because of Inital Workspace Load");
qController.qClient.UpdateSelectedCue(qController.qWorkspace.workspace_id);
}
Log.Debug("CONTROLPAGE - Workspace Updated " + qController.qWorkspace.workspace_id);
}
}
}
public void PlaybackPositionUpdated(object sender, PlaybackPositionArgs e)
{
qController.playbackPosition = e.PlaybackPosition;
Log.Debug("CONTROLPAGE - Playback Position Updated " + qController.playbackPosition);
QCue cue = qController.qWorkspace.GetCue(qController.playbackPosition);
if(cue != null)
{
Device.BeginInvokeOnMainThread(() => {
if (cue.levels != null)
showLevelsButton.IsVisible = true;
else
{
showLevelsButton.IsVisible = false;
qLevelsCell.IsVisible = false;
}
qCell.UpdateSelectedCue(cue);
});
}
}
public void OnCueUpdateReceived(object sender, CueEventArgs args)
{
if(qController != null)
{
if(qController.qWorkspace != null)
{
qController.qWorkspace.UpdateCue(args.Cue);
if (qController.playbackPosition == null)
{
qController.playbackPosition = args.Cue.uniqueID;
}
if (args.Cue.uniqueID == qController.playbackPosition)
{
Device.BeginInvokeOnMainThread(() =>
{
Log.Debug("CONTROLPAGE - Refreshing Currently Displayed Cue");
if (args.Cue.levels != null) {
Log.Debug("before show levels button and cue.levels isnt null");
showLevelsButton.IsVisible = true;
Log.Debug("after show levels button and cue.levels isnt null");
} else {
showLevelsButton.IsVisible = false;
qLevelsCell.IsVisible = false;
}
qCell.UpdateSelectedCue(args.Cue);
if(qLevelsCell != null)
{
qLevelsCell.activeCue = args.Cue.uniqueID;
if (args.Cue.levels != null)
{
qLevelsCell.UpdateLevels(args.Cue.levels[0]);
}
}
});
}
}
}
}
private void OnChildrenUpdated(object source, ChildrenEventArgs args)
{
if(qController != null)
{
if(qController.qWorkspace != null)
{
qController.qWorkspace.UpdateChildren(args.cue_id, args.children);
}
}
}
private void OnMenuItemSelected(object source, MenuEventArgs args)
{
if (args.Command.Contains("/"))
{
qController.qClient.sendTCP(args.Command);
} else if (args.Command == "disconnect") {
Back();
} else if (args.Command.Contains("cueList")) {
var parts = args.Command.Split(' ');
if(parts.Length > 1)
{
Device.BeginInvokeOnMainThread(() =>
{
qCueListCell = new QCueListCell(qController.qWorkspace.GetCueList(parts[1]));
qCueListCell.closeButton.Clicked += CloseCueList;
qCueListCell.cueListView.ItemSelected += OnCueListItemSelected;
AbsoluteLayout.SetLayoutFlags(qCueListCell, AbsoluteLayoutFlags.All);
AbsoluteLayout.SetLayoutBounds(qCueListCell, new Rectangle(0, 0.2, 1, 0.9));
sLayout.Children.Add(qCueListCell);
});
}
}
}
private void CloseCueList(object sender, EventArgs e)
{
Device.BeginInvokeOnMainThread(() =>
{
sLayout.Children.Remove(qCueListCell);
});
}
private void OnCueListItemSelected(object sender, SelectedItemChangedEventArgs e)
{
OSCListItem cue = (OSCListItem)e.SelectedItem;
string selectCueOSC = "/workspace/" + qController.qWorkspace.workspace_id + cue.Command;
qController.qClient.sendTCP(selectCueOSC);
CloseCueList(sender,e);
}
protected override bool OnBackButtonPressed()
{
Back();
return true;
}
}
}
-5
View File
@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="qController.HomePage">
<ContentPage.Content>
</ContentPage.Content>
</ContentPage>
@@ -1,15 +0,0 @@
using System;
using System.Collections.Generic;
using Xamarin.Forms;
namespace qController
{
public partial class HomePage : ContentPage
{
public HomePage()
{
InitializeComponent();
}
}
}
-9
View File
@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="qController.MenuPage">
<StackLayout>
<ListView x:Name="listView">
</ListView>
</StackLayout>
</ContentPage>
-134
View File
@@ -1,134 +0,0 @@
using System.Collections.ObjectModel;
using Xamarin.Forms;
using qController.QItems;
using System;
using Xamarin.Forms.PlatformConfiguration;
using Xamarin.Forms.PlatformConfiguration.iOSSpecific;
namespace qController
{
public partial class MenuPage : ContentPage
{
public ObservableCollection<MenuPageItem> items { get; } = new ObservableCollection<MenuPageItem>();
public MenuPage()
{
On<iOS>().SetUseSafeArea(true);
Title = "Menu";
InitializeComponent();
ChangeToHome();
listView.ItemsSource = items;
listView.RowHeight = (int)(App.HeightUnit * 6);
listView.ItemTemplate = new DataTemplate(() =>
{
var grid = new Grid {
Padding = new Thickness(5, 10),
ColumnDefinitions =
{
new ColumnDefinition{Width = new GridLength(30)},
new ColumnDefinition { Width = GridLength.Star }
}
};
var icon = new Label {
FontFamily = App.QFont,
HorizontalTextAlignment = TextAlignment.Center,
VerticalTextAlignment = TextAlignment.Center,
FontSize = App.HeightUnit * 3
};
icon.SetBinding(Label.TextProperty, "Icon");
var label = new Label {
VerticalOptions = LayoutOptions.FillAndExpand
};
label.SetBinding(Label.TextProperty, "Title");
if (label.Text == "Disconnect")
label.TextColor = Color.DarkRed;
switch (Device.RuntimePlatform)
{
case Device.iOS:
label.FontSize = App.HeightUnit * 3;
break;
case Device.Android:
label.FontSize = App.HeightUnit * 2.2;
break;
}
grid.Children.Add(icon);
grid.Children.Add(label, 1, 0);
return new ViewCell { View = grid };
});
}
public void setItemSelected(EventHandler<SelectedItemChangedEventArgs> ItemSelected){
listView.ItemSelected += ItemSelected;
}
public void clearSelectedItem()
{
listView.SelectedItem = null;
}
public void ChangeToControl()
{
items.Clear();
items.Add(new MenuPageItem
{
Title = "Disconnect",
Icon = QIcon.CANCEL,
Command = "disconnect"
});
}
public void ChangeToWorkspace(QWorkspace workspace)
{
for(int i = 0; i < workspace.data.Count; i++)
{
var cueList = workspace.data[i];
items.Add(new MenuPageItem
{
Title = cueList.listName,
Icon = cueList.IconText,
Command = "cueList " + cueList.uniqueID
});
}
}
public void ChangeToHome()
{
items.Clear();
items.Add(new MenuPageItem
{
Title = "Scan Network",
Icon = "\uE800",
Command = "scan"
});
items.Add(new MenuPageItem
{
Title = "Add Manually",
Icon = "\uE801",
Command = "add"
});
items.Add(new MenuPageItem
{
Title = "Send Feedback",
Icon = QIcon.MAIL,
Command = "feedback"
});
items.Add(new MenuPageItem
{
Title = "Support Project",
Icon = QIcon.DOLLAR,
Command = "support"
});
}
}
}
-5
View File
@@ -1,5 +0,0 @@
<FlyoutPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="qController.RootPage">
</FlyoutPage>
@@ -1,41 +0,0 @@
using System;
using Xamarin.Forms;
namespace qController
{
public class MenuEventArgs : EventArgs
{
public string Command
{
get;
set;
}
}
public partial class RootPage : FlyoutPage
{
public MenuPage MenuPage;
public delegate void MenuItemSelectedHandler(object source, MenuEventArgs args);
public event MenuItemSelectedHandler MenuItemSelected;
public RootPage()
{
InitializeComponent();
MenuPage = new MenuPage();
MenuPage.setItemSelected(OnItemSelected);
Flyout = MenuPage;
}
void OnItemSelected(object sender, SelectedItemChangedEventArgs e)
{
var item = e.SelectedItem as MenuPageItem;
if (item != null)
{
MenuPage.clearSelectedItem();
IsPresented = false;
MenuItemSelected?.Invoke(this, new MenuEventArgs { Command = item.Command });
}
}
}
}
@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="qController.Pages.RootPageDetail" Title="Detail">
<StackLayout Padding="10">
<Label Text="This is a detail page. To get the 'triple' line icon on each platform add a icon to each platform and update the 'Master' page with an Icon that references it." />
</StackLayout>
</ContentPage>
@@ -1,20 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
namespace qController.Pages
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class RootPageDetail : ContentPage
{
public RootPageDetail()
{
InitializeComponent();
}
}
}

Some files were not shown because too many files have changed in this diff Show More