remove Xamarin Forms remnants
@@ -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");
|
|
||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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>
|
|
||||||
@@ -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("")]
|
|
||||||
@@ -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.
|
|
||||||
|
Before Width: | Height: | Size: 4.7 KiB |
|
Before Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 4.7 KiB |
@@ -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" />
|
|
||||||
@@ -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" />
|
|
||||||
@@ -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>
|
|
||||||
@@ -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>
|
|
||||||
@@ -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>
|
|
||||||
@@ -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>
|
|
||||||
@@ -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"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Before Width: | Height: | Size: 714 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 6.0 KiB |
|
Before Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 9.3 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 8.7 KiB |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 31 KiB |
@@ -1,6 +0,0 @@
|
|||||||
{
|
|
||||||
"info" : {
|
|
||||||
"version" : 1,
|
|
||||||
"author" : "xcode"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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>
|
|
||||||
@@ -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>
|
|
||||||
@@ -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>
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
using UIKit;
|
|
||||||
|
|
||||||
namespace qController.iOS
|
|
||||||
{
|
|
||||||
public class Application
|
|
||||||
{
|
|
||||||
static void Main(string[] args)
|
|
||||||
{
|
|
||||||
UIApplication.Main(args, null, typeof(AppDelegate));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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>
|
|
||||||
@@ -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>
|
|
||||||
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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>
|
|
||||||
@@ -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=""/>
|
|
||||||
<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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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>
|
|
||||||
@@ -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"
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||