Upgrade to .net5.0-adnroid framework

This commit is contained in:
zhiyang7 2023-02-02 09:37:06 +08:00
parent a42acb8176
commit 8fcb6e9041
18 changed files with 315 additions and 208 deletions

Binary file not shown.

View File

@ -16,12 +16,14 @@
<AndroidResgenFile>Resources\Resource.designer.cs</AndroidResgenFile>
<AndroidResgenClass>Resource</AndroidResgenClass>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<AndroidUseLatestPlatformSdk>false</AndroidUseLatestPlatformSdk>
<AndroidUseLatestPlatformSdk>true</AndroidUseLatestPlatformSdk>
<TargetFrameworkVersion>v12.0</TargetFrameworkVersion>
<TargetFramework>net5.0-android</TargetFramework>
<AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>
<MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>
<MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>
<AndroidEnableSGenConcurrent>true</AndroidEnableSGenConcurrent>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>True</DebugSymbols>
@ -32,12 +34,12 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AndroidUseSharedRuntime>false</AndroidUseSharedRuntime>
<AndroidLinkMode>None</AndroidLinkMode>
<AndroidLinkMode>Full</AndroidLinkMode>
<EmbedAssembliesIntoApk>True</EmbedAssembliesIntoApk>
<AndroidManagedSymbols>false</AndroidManagedSymbols>
<AndroidUseAapt2>false</AndroidUseAapt2>
<AndroidSupportedAbis>armeabi-v7a;x86;arm64-v8a;x86_64</AndroidSupportedAbis>
<AndroidDexTool>dx</AndroidDexTool>
<AndroidDexTool>d8</AndroidDexTool>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugSymbols>True</DebugSymbols>
@ -51,9 +53,9 @@
<AndroidUseSharedRuntime>false</AndroidUseSharedRuntime>
<AndroidLinkMode>None</AndroidLinkMode>
<EmbedAssembliesIntoApk>True</EmbedAssembliesIntoApk>
<AndroidUseAapt2>false</AndroidUseAapt2>
<AndroidUseAapt2>true</AndroidUseAapt2>
<AndroidSupportedAbis>armeabi-v7a;x86;arm64-v8a;x86_64</AndroidSupportedAbis>
<AndroidDexTool>dx</AndroidDexTool>
<AndroidDexTool>d8</AndroidDexTool>
</PropertyGroup>
<ItemGroup>
<Compile Include="Resources\Resource.designer.cs" />
@ -77,43 +79,29 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\SMAPI\SMAPI.csproj" />
<Reference Include="Microsoft.AppCenter, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null">
<HintPath>..\packages\Microsoft.AppCenter.2.6.4\lib\MonoAndroid403\Microsoft.AppCenter.dll</HintPath>
<Private>True</Private>
<Reference Include="StardewValley">
<HintPath>..\..\..\Downloads\StardewValleyAndroidStuff\base_1.5.6.31\assemblies\StardewValley.dll</HintPath>
</Reference>
<Reference Include="Microsoft.AppCenter.Analytics, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null">
<HintPath>..\packages\Microsoft.AppCenter.Analytics.2.6.4\lib\MonoAndroid403\Microsoft.AppCenter.Analytics.dll</HintPath>
<Private>True</Private>
<Reference Include="StardewValley.GameData">
<HintPath>..\..\..\Downloads\StardewValleyAndroidStuff\base_1.5.6.31\assemblies\StardewValley.GameData.dll</HintPath>
</Reference>
<Reference Include="Microsoft.AppCenter.Analytics.Android.Bindings, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null">
<HintPath>..\packages\Microsoft.AppCenter.Analytics.2.6.4\lib\MonoAndroid403\Microsoft.AppCenter.Analytics.Android.Bindings.dll</HintPath>
<Private>True</Private>
<Reference Include="xTile">
<HintPath>..\..\..\Downloads\StardewValleyAndroidStuff\base_1.5.6.31\assemblies\xTile.dll</HintPath>
</Reference>
<Reference Include="Microsoft.AppCenter.Android.Bindings, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null">
<HintPath>..\packages\Microsoft.AppCenter.2.6.4\lib\MonoAndroid403\Microsoft.AppCenter.Android.Bindings.dll</HintPath>
<Private>True</Private>
<Reference Include="BmFont">
<HintPath>..\..\..\Downloads\StardewValleyAndroidStuff\base_1.5.6.31\assemblies\BmFont.dll</HintPath>
</Reference>
<Reference Include="Microsoft.AppCenter.Crashes, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null">
<HintPath>..\packages\Microsoft.AppCenter.Crashes.2.6.4\lib\MonoAndroid403\Microsoft.AppCenter.Crashes.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.AppCenter.Crashes.Android.Bindings, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null">
<HintPath>..\packages\Microsoft.AppCenter.Crashes.2.6.4\lib\MonoAndroid403\Microsoft.AppCenter.Crashes.Android.Bindings.dll</HintPath>
<Private>True</Private>
</Reference>
<PackageReference Include="MonoGame.Framework.Android">
<Version>3.6.0.862</Version>
</PackageReference>
<Reference Include="MonoGame.Framework, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null">
<HintPath>..\..\..\Downloads\StardewValleyAndroidStuff\base_1.4.5.145\assemblies\MonoGame.Framework.dll</HintPath>
</Reference>
<Reference Include="MonoGame.Framework.Content.Pipeline">
<HintPath>..\..\..\Downloads\StardewValleyAndroidStuff\base_1.4.5.145\assemblies\MonoGame.Framework.Content.Pipeline.dll</HintPath>
<!-- <PackageReference Include="MonoGame.Framework.Android">-->
<!-- <Version>3.6.0.862</Version>-->
<!-- </PackageReference>-->
<Reference Include="MonoGame.Framework">
<HintPath>..\..\..\Downloads\StardewValleyAndroidStuff\base_1.5.6.31\assemblies\MonoGame.Framework.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Xml" />
<Reference Include="System.Core" />
<Reference Include="Mono.Android" />
<Reference Include="Mono.Security" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\mipmap\ic_launcher.png" />

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="151" android:versionName="1.4.5.151" android:installLocation="auto" package="com.zane.stardewvalley2" platformBuildVersionCode="29" platformBuildVersionName="9">
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="29" />
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="156" android:versionName="1.5.6.31" android:installLocation="auto" package="com.zane.stardewvalley2" platformBuildVersionCode="31" platformBuildVersionName="9">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="31" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

View File

@ -14,7 +14,7 @@ namespace Loader
{
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "1.0.0.0")]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "13.1.0.5")]
public partial class Resource
{
@ -80,11 +80,9 @@ namespace Loader
global::StardewModdingAPI.Resource.Id.action_divider = global::Loader.Resource.Id.action_divider;
global::StardewModdingAPI.Resource.Id.action_image = global::Loader.Resource.Id.action_image;
global::StardewModdingAPI.Resource.Id.action_text = global::Loader.Resource.Id.action_text;
global::StardewModdingAPI.Resource.Id.appIcon = global::Loader.Resource.Id.appIcon;
global::StardewModdingAPI.Resource.Id.async = global::Loader.Resource.Id.async;
global::StardewModdingAPI.Resource.Id.blocking = global::Loader.Resource.Id.blocking;
global::StardewModdingAPI.Resource.Id.chronometer = global::Loader.Resource.Id.chronometer;
global::StardewModdingAPI.Resource.Id.description = global::Loader.Resource.Id.description;
global::StardewModdingAPI.Resource.Id.forever = global::Loader.Resource.Id.forever;
global::StardewModdingAPI.Resource.Id.icon = global::Loader.Resource.Id.icon;
global::StardewModdingAPI.Resource.Id.icon_group = global::Loader.Resource.Id.icon_group;
@ -93,23 +91,17 @@ namespace Loader
global::StardewModdingAPI.Resource.Id.line1 = global::Loader.Resource.Id.line1;
global::StardewModdingAPI.Resource.Id.line3 = global::Loader.Resource.Id.line3;
global::StardewModdingAPI.Resource.Id.normal = global::Loader.Resource.Id.normal;
global::StardewModdingAPI.Resource.Id.notificationLayout = global::Loader.Resource.Id.notificationLayout;
global::StardewModdingAPI.Resource.Id.notification_background = global::Loader.Resource.Id.notification_background;
global::StardewModdingAPI.Resource.Id.notification_main_column = global::Loader.Resource.Id.notification_main_column;
global::StardewModdingAPI.Resource.Id.notification_main_column_container = global::Loader.Resource.Id.notification_main_column_container;
global::StardewModdingAPI.Resource.Id.progress_bar = global::Loader.Resource.Id.progress_bar;
global::StardewModdingAPI.Resource.Id.progress_bar_frame = global::Loader.Resource.Id.progress_bar_frame;
global::StardewModdingAPI.Resource.Id.progress_text = global::Loader.Resource.Id.progress_text;
global::StardewModdingAPI.Resource.Id.right_icon = global::Loader.Resource.Id.right_icon;
global::StardewModdingAPI.Resource.Id.right_side = global::Loader.Resource.Id.right_side;
global::StardewModdingAPI.Resource.Id.spacer = global::Loader.Resource.Id.spacer;
global::StardewModdingAPI.Resource.Id.tag_transition_group = global::Loader.Resource.Id.tag_transition_group;
global::StardewModdingAPI.Resource.Id.tag_unhandled_key_event_manager = global::Loader.Resource.Id.tag_unhandled_key_event_manager;
global::StardewModdingAPI.Resource.Id.tag_unhandled_key_listeners = global::Loader.Resource.Id.tag_unhandled_key_listeners;
global::StardewModdingAPI.Resource.Id.text = global::Loader.Resource.Id.text;
global::StardewModdingAPI.Resource.Id.text2 = global::Loader.Resource.Id.text2;
global::StardewModdingAPI.Resource.Id.time = global::Loader.Resource.Id.time;
global::StardewModdingAPI.Resource.Id.time_remaining = global::Loader.Resource.Id.time_remaining;
global::StardewModdingAPI.Resource.Id.title = global::Loader.Resource.Id.title;
global::StardewModdingAPI.Resource.Integer.status_bar_notification_info_maxnum = global::Loader.Resource.Integer.status_bar_notification_info_maxnum;
global::StardewModdingAPI.Resource.Layout.notification_action = global::Loader.Resource.Layout.notification_action;
@ -118,38 +110,9 @@ namespace Loader
global::StardewModdingAPI.Resource.Layout.notification_template_icon_group = global::Loader.Resource.Layout.notification_template_icon_group;
global::StardewModdingAPI.Resource.Layout.notification_template_part_chronometer = global::Loader.Resource.Layout.notification_template_part_chronometer;
global::StardewModdingAPI.Resource.Layout.notification_template_part_time = global::Loader.Resource.Layout.notification_template_part_time;
global::StardewModdingAPI.Resource.Layout.status_bar_ongoing_event_progress_bar = global::Loader.Resource.Layout.status_bar_ongoing_event_progress_bar;
global::StardewModdingAPI.Resource.String.app_name = global::Loader.Resource.String.app_name;
global::StardewModdingAPI.Resource.String.hello = global::Loader.Resource.String.hello;
global::StardewModdingAPI.Resource.String.kilobytes_per_second = global::Loader.Resource.String.kilobytes_per_second;
global::StardewModdingAPI.Resource.String.notification_download_complete = global::Loader.Resource.String.notification_download_complete;
global::StardewModdingAPI.Resource.String.notification_download_failed = global::Loader.Resource.String.notification_download_failed;
global::StardewModdingAPI.Resource.String.state_completed = global::Loader.Resource.String.state_completed;
global::StardewModdingAPI.Resource.String.state_connecting = global::Loader.Resource.String.state_connecting;
global::StardewModdingAPI.Resource.String.state_downloading = global::Loader.Resource.String.state_downloading;
global::StardewModdingAPI.Resource.String.state_failed = global::Loader.Resource.String.state_failed;
global::StardewModdingAPI.Resource.String.state_failed_cancelled = global::Loader.Resource.String.state_failed_cancelled;
global::StardewModdingAPI.Resource.String.state_failed_fetching_url = global::Loader.Resource.String.state_failed_fetching_url;
global::StardewModdingAPI.Resource.String.state_failed_sdcard_full = global::Loader.Resource.String.state_failed_sdcard_full;
global::StardewModdingAPI.Resource.String.state_failed_unlicensed = global::Loader.Resource.String.state_failed_unlicensed;
global::StardewModdingAPI.Resource.String.state_fetching_url = global::Loader.Resource.String.state_fetching_url;
global::StardewModdingAPI.Resource.String.state_idle = global::Loader.Resource.String.state_idle;
global::StardewModdingAPI.Resource.String.state_paused_by_request = global::Loader.Resource.String.state_paused_by_request;
global::StardewModdingAPI.Resource.String.state_paused_network_setup_failure = global::Loader.Resource.String.state_paused_network_setup_failure;
global::StardewModdingAPI.Resource.String.state_paused_network_unavailable = global::Loader.Resource.String.state_paused_network_unavailable;
global::StardewModdingAPI.Resource.String.state_paused_roaming = global::Loader.Resource.String.state_paused_roaming;
global::StardewModdingAPI.Resource.String.state_paused_sdcard_unavailable = global::Loader.Resource.String.state_paused_sdcard_unavailable;
global::StardewModdingAPI.Resource.String.state_paused_wifi_disabled = global::Loader.Resource.String.state_paused_wifi_disabled;
global::StardewModdingAPI.Resource.String.state_paused_wifi_unavailable = global::Loader.Resource.String.state_paused_wifi_unavailable;
global::StardewModdingAPI.Resource.String.state_unknown = global::Loader.Resource.String.state_unknown;
global::StardewModdingAPI.Resource.String.status_bar_notification_info_overflow = global::Loader.Resource.String.status_bar_notification_info_overflow;
global::StardewModdingAPI.Resource.String.time_remaining = global::Loader.Resource.String.time_remaining;
global::StardewModdingAPI.Resource.String.time_remaining_notification = global::Loader.Resource.String.time_remaining_notification;
global::StardewModdingAPI.Resource.Style.ButtonBackground = global::Loader.Resource.Style.ButtonBackground;
global::StardewModdingAPI.Resource.Style.NotificationText = global::Loader.Resource.Style.NotificationText;
global::StardewModdingAPI.Resource.Style.NotificationTextSecondary = global::Loader.Resource.Style.NotificationTextSecondary;
global::StardewModdingAPI.Resource.Style.NotificationTextShadow = global::Loader.Resource.Style.NotificationTextShadow;
global::StardewModdingAPI.Resource.Style.NotificationTitle = global::Loader.Resource.Style.NotificationTitle;
global::StardewModdingAPI.Resource.Style.TextAppearance_Compat_Notification = global::Loader.Resource.Style.TextAppearance_Compat_Notification;
global::StardewModdingAPI.Resource.Style.TextAppearance_Compat_Notification_Info = global::Loader.Resource.Style.TextAppearance_Compat_Notification_Info;
global::StardewModdingAPI.Resource.Style.TextAppearance_Compat_Notification_Line2 = global::Loader.Resource.Style.TextAppearance_Compat_Notification_Line2;
@ -441,9 +404,6 @@ namespace Loader
// aapt resource value: 0x7f0a001a
public const int actions = 2131361818;
// aapt resource value: 0x7f0a001d
public const int appIcon = 2131361821;
// aapt resource value: 0x7f0a0008
public const int async = 2131361800;
@ -453,9 +413,6 @@ namespace Loader
// aapt resource value: 0x7f0a0018
public const int chronometer = 2131361816;
// aapt resource value: 0x7f0a0022
public const int description = 2131361826;
// aapt resource value: 0x7f0a000a
public const int forever = 2131361802;
@ -480,9 +437,6 @@ namespace Loader
// aapt resource value: 0x7f0a000c
public const int normal = 2131361804;
// aapt resource value: 0x7f0a001c
public const int notificationLayout = 2131361820;
// aapt resource value: 0x7f0a0016
public const int notification_background = 2131361814;
@ -492,24 +446,12 @@ namespace Loader
// aapt resource value: 0x7f0a0010
public const int notification_main_column_container = 2131361808;
// aapt resource value: 0x7f0a0021
public const int progress_bar = 2131361825;
// aapt resource value: 0x7f0a0020
public const int progress_bar_frame = 2131361824;
// aapt resource value: 0x7f0a001e
public const int progress_text = 2131361822;
// aapt resource value: 0x7f0a0015
public const int right_icon = 2131361813;
// aapt resource value: 0x7f0a0013
public const int right_side = 2131361811;
// aapt resource value: 0x7f0a0023
public const int spacer = 2131361827;
// aapt resource value: 0x7f0a0002
public const int tag_transition_group = 2131361794;
@ -528,9 +470,6 @@ namespace Loader
// aapt resource value: 0x7f0a0017
public const int time = 2131361815;
// aapt resource value: 0x7f0a001f
public const int time_remaining = 2131361823;
// aapt resource value: 0x7f0a0007
public const int title = 2131361799;
@ -581,9 +520,6 @@ namespace Loader
// aapt resource value: 0x7f040005
public const int notification_template_part_time = 2130968581;
// aapt resource value: 0x7f040006
public const int status_bar_ongoing_event_progress_bar = 2130968582;
static Layout()
{
global::Android.Runtime.ResourceIdManager.UpdateIdValues();
@ -622,86 +558,17 @@ namespace Loader
public partial class String
{
// aapt resource value: 0x7f06001a
public const int action_settings = 2131099674;
// aapt resource value: 0x7f060002
public const int app_name = 2131099650;
// aapt resource value: 0x7f060003
public const int action_settings = 2131099651;
// aapt resource value: 0x7f060001
public const int hello = 2131099649;
// aapt resource value: 0x7f060003
public const int kilobytes_per_second = 2131099651;
// aapt resource value: 0x7f060004
public const int notification_download_complete = 2131099652;
// aapt resource value: 0x7f060005
public const int notification_download_failed = 2131099653;
// aapt resource value: 0x7f060006
public const int state_completed = 2131099654;
// aapt resource value: 0x7f060007
public const int state_connecting = 2131099655;
// aapt resource value: 0x7f060008
public const int state_downloading = 2131099656;
// aapt resource value: 0x7f060009
public const int state_failed = 2131099657;
// aapt resource value: 0x7f06000a
public const int state_failed_cancelled = 2131099658;
// aapt resource value: 0x7f06000b
public const int state_failed_fetching_url = 2131099659;
// aapt resource value: 0x7f06000c
public const int state_failed_sdcard_full = 2131099660;
// aapt resource value: 0x7f06000d
public const int state_failed_unlicensed = 2131099661;
// aapt resource value: 0x7f06000e
public const int state_fetching_url = 2131099662;
// aapt resource value: 0x7f06000f
public const int state_idle = 2131099663;
// aapt resource value: 0x7f060010
public const int state_paused_by_request = 2131099664;
// aapt resource value: 0x7f060011
public const int state_paused_network_setup_failure = 2131099665;
// aapt resource value: 0x7f060012
public const int state_paused_network_unavailable = 2131099666;
// aapt resource value: 0x7f060013
public const int state_paused_roaming = 2131099667;
// aapt resource value: 0x7f060014
public const int state_paused_sdcard_unavailable = 2131099668;
// aapt resource value: 0x7f060015
public const int state_paused_wifi_disabled = 2131099669;
// aapt resource value: 0x7f060016
public const int state_paused_wifi_unavailable = 2131099670;
// aapt resource value: 0x7f060017
public const int state_unknown = 2131099671;
public const int app_name = 2131099649;
// aapt resource value: 0x7f060000
public const int status_bar_notification_info_overflow = 2131099648;
public const int hello = 2131099648;
// aapt resource value: 0x7f060018
public const int time_remaining = 2131099672;
// aapt resource value: 0x7f060019
public const int time_remaining_notification = 2131099673;
// aapt resource value: 0x7f060002
public const int status_bar_notification_info_overflow = 2131099650;
static String()
{
@ -716,21 +583,6 @@ namespace Loader
public partial class Style
{
// aapt resource value: 0x7f09000a
public const int ButtonBackground = 2131296266;
// aapt resource value: 0x7f090008
public const int NotificationText = 2131296264;
// aapt resource value: 0x7f090007
public const int NotificationTextSecondary = 2131296263;
// aapt resource value: 0x7f09000b
public const int NotificationTextShadow = 2131296267;
// aapt resource value: 0x7f090009
public const int NotificationTitle = 2131296265;
// aapt resource value: 0x7f090000
public const int TextAppearance_Compat_Notification = 2131296256;
@ -746,8 +598,8 @@ namespace Loader
// aapt resource value: 0x7f090003
public const int TextAppearance_Compat_Notification_Title = 2131296259;
// aapt resource value: 0x7f09000c
public const int Theme_Splash = 2131296268;
// aapt resource value: 0x7f090007
public const int Theme_Splash = 2131296263;
// aapt resource value: 0x7f090004
public const int Widget_Compat_NotificationActionContainer = 2131296260;

View File

@ -1,6 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.AppCenter" version="2.6.4" targetFramework="monoandroid10.0" />
<package id="Microsoft.AppCenter.Analytics" version="2.6.4" targetFramework="monoandroid10.0" />
<package id="Microsoft.AppCenter.Crashes" version="2.6.4" targetFramework="monoandroid10.0" />
</packages>
</packages>

View File

@ -0,0 +1,42 @@
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
#nullable enable
namespace System.Linq
{
public static class EnumerableExtension
{
/// <summary>Produces a sequence of tuples with elements from the two specified sequences.</summary>
/// <param name="first">The first sequence to merge.</param>
/// <param name="second">The second sequence to merge.</param>
/// <typeparam name="TFirst">The type of the elements of the first input sequence.</typeparam>
/// <typeparam name="TSecond">The type of the elements of the second input sequence.</typeparam>
/// <returns>A sequence of tuples with elements taken from the first and second sequences, in that order.</returns>
public static IEnumerable<(TFirst First, TSecond Second)> Zip<TFirst, TSecond>(
this IEnumerable<TFirst> first,
IEnumerable<TSecond> second)
{
if (first == null)
throw new ArgumentNullException("first");
if (second == null)
throw new ArgumentNullException("second");
return ZipIterator<TFirst, TSecond>(first, second);
}
#nullable disable
private static IEnumerable<(TFirst First, TSecond Second)> ZipIterator<TFirst, TSecond>(
IEnumerable<TFirst> first,
IEnumerable<TSecond> second)
{
using (IEnumerator<TFirst> e1 = first.GetEnumerator())
{
using (IEnumerator<TSecond> e2 = second.GetEnumerator())
{
while (e1.MoveNext() && e2.MoveNext())
yield return (e1.Current, e2.Current);
}
}
}
}
}

View File

@ -0,0 +1,71 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{E5FE4C97-1A7C-4A97-9904-7351CA020C7F}</ProjectGuid>
<ProjectTypeGuids>{EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>MobilePatch</RootNamespace>
<AssemblyName>MobilePatch</AssemblyName>
<FileAlignment>512</FileAlignment>
<AndroidResgenFile>Resources\Resource.Designer.cs</AndroidResgenFile>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<AndroidUseLatestPlatformSdk>True</AndroidUseLatestPlatformSdk>
<TargetFrameworkVersion>v12.0</TargetFrameworkVersion>
<TargetFramework>net5.0-android</TargetFramework>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Mono.Android" />
<Reference Include="mscorlib" />
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Mobile\EnumerableExtension.cs" />
<Compile Include="Mobile\MobileMemoryExtension.cs" />
<Compile Include="Mobile\MobileTypeExtension.cs" />
<Compile Include="Resources\Resource.Designer.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\AboutResources.txt" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\values\strings.xml" />
</ItemGroup>
<ItemGroup>
<Folder Include="Resources\drawable\" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View File

@ -0,0 +1,30 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using Android.App;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("MobilePatch")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("MobilePatch")]
[assembly: AssemblyCopyright("Copyright © 2023")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@ -0,0 +1,44 @@
Images, layout descriptions, binary blobs and string dictionaries can be included
in your application as resource files. Various Android APIs are designed to
operate on the resource IDs instead of dealing with images, strings or binary blobs
directly.
For example, a sample Android app that contains a user interface layout (main.axml),
an internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png)
would keep its resources in the "Resources" directory of the application:
Resources/
drawable/
icon.png
layout/
main.axml
values/
strings.xml
In order to get the build system to recognize Android resources, set the build action to
"AndroidResource". The native Android APIs do not operate directly with filenames, but
instead operate on resource IDs. When you compile an Android application that uses resources,
the build system will package the resources for distribution and generate a class called "R"
(this is an Android convention) that contains the tokens for each one of the resources
included. For example, for the above Resources layout, this is what the R class would expose:
public class R {
public class drawable {
public const int icon = 0x123;
}
public class layout {
public const int main = 0x456;
}
public class strings {
public const int first_string = 0xabc;
public const int second_string = 0xbcd;
}
}
You would then use R.drawable.icon to reference the drawable/icon.png file, or R.layout.main
to reference the layout/main.axml file, or R.strings.first_string to reference the first
string in the dictionary file values/strings.xml.

View File

@ -0,0 +1,59 @@
#pragma warning disable 1591
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
[assembly: global::Android.Runtime.ResourceDesignerAttribute("MobilePatch.Resource", IsApplication=false)]
namespace MobilePatch
{
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "13.1.0.5")]
public partial class Resource
{
static Resource()
{
global::Android.Runtime.ResourceIdManager.UpdateIdValues();
}
public partial class Attribute
{
static Attribute()
{
global::Android.Runtime.ResourceIdManager.UpdateIdValues();
}
private Attribute()
{
}
}
public partial class String
{
// aapt resource value: 0x7F010000
public static int app_name = 2130771968;
// aapt resource value: 0x7F010001
public static int hello = 2130771969;
static String()
{
global::Android.Runtime.ResourceIdManager.UpdateIdValues();
}
private String()
{
}
}
}
}
#pragma warning restore 1591

View File

@ -0,0 +1,4 @@
<resources>
<string name="hello">Hello World, Click Me!</string>
<string name="app_name">MobilePatch</string>
</resources>

View File

@ -2,7 +2,9 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
#if !SMAPI_FOR_MOBILE
using Pathoschild.Http.Client;
#endif
using StardewModdingAPI.Toolkit.Serialization;
using StardewModdingAPI.Toolkit.Utilities;
@ -17,8 +19,10 @@ namespace StardewModdingAPI.Toolkit.Framework.Clients.WebApi
/// <summary>The API version number.</summary>
private readonly ISemanticVersion Version;
#if !SMAPI_FOR_MOBILE
/// <summary>The underlying HTTP client.</summary>
private readonly IClient Client;
#endif
/*********
@ -30,10 +34,12 @@ namespace StardewModdingAPI.Toolkit.Framework.Clients.WebApi
public WebApiClient(string baseUrl, ISemanticVersion version)
{
this.Version = version;
#if !SMAPI_FOR_MOBILE
this.Client = new FluentClient(baseUrl)
.SetUserAgent($"SMAPI/{version}");
this.Client.Formatters.JsonFormatter.SerializerSettings = JsonHelper.CreateDefaultSettings();
#endif
}
/// <summary>Get metadata about a set of mods from the web API.</summary>
@ -44,6 +50,7 @@ namespace StardewModdingAPI.Toolkit.Framework.Clients.WebApi
/// <param name="includeExtendedMetadata">Whether to include extended metadata for each mod.</param>
public async Task<IDictionary<string, ModEntryModel>> GetModInfoAsync(ModSearchEntryModel[] mods, ISemanticVersion apiVersion, ISemanticVersion gameVersion, Platform platform, bool includeExtendedMetadata = false)
{
#if !SMAPI_FOR_MOBILE
ModEntryModel[] result = await this.Client
.PostAsync(
$"v{this.Version}/mods",
@ -52,12 +59,16 @@ namespace StardewModdingAPI.Toolkit.Framework.Clients.WebApi
.As<ModEntryModel[]>();
return result.ToDictionary(p => p.ID);
#endif
return new Dictionary<string, ModEntryModel>();
}
/// <inheritdoc />
public void Dispose()
{
#if !SMAPI_FOR_MOBILE
this.Client.Dispose();
#endif
}
}
}

View File

@ -10,12 +10,14 @@
<!-- <Import Project="..\..\build\common.targets" />-->
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="Pathoschild.Http.FluentClient" Version="4.2.0" />
<ItemGroup Condition="'$(BUILD_FOR_MOBILE)' != ''">
<Reference Include="Newtonsoft.Json">
<HintPath>..\..\build\Newtonsoft.Json.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup Condition="'$(BUILD_FOR_MOBILE)' == ''">
<PackageReference Include="Pathoschild.Http.FluentClient" Version="4.2.0" />
<PackageReference Include="HtmlAgilityPack" Version="1.11.28" />
<PackageReference Include="Pathoschild.Http.FluentClient" Version="4.2.0" />
<PackageReference Include="System.Management" Version="5.0.0" Condition="'$(OS)' == 'Windows_NT'" />

View File

@ -112,6 +112,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SMAPI.Tests.ModApiConsumer"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SMAPI", "SMAPI\SMAPI.csproj", "{EBD13EAB-E70B-4D9F-92C2-C34A21E1FA32}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MobilePatch", "MobilePatch\MobilePatch.csproj", "{E5FE4C97-1A7C-4A97-9904-7351CA020C7F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -179,6 +181,10 @@ Global
{EBD13EAB-E70B-4D9F-92C2-C34A21E1FA32}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EBD13EAB-E70B-4D9F-92C2-C34A21E1FA32}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EBD13EAB-E70B-4D9F-92C2-C34A21E1FA32}.Release|Any CPU.Build.0 = Release|Any CPU
{E5FE4C97-1A7C-4A97-9904-7351CA020C7F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E5FE4C97-1A7C-4A97-9904-7351CA020C7F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E5FE4C97-1A7C-4A97-9904-7351CA020C7F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E5FE4C97-1A7C-4A97-9904-7351CA020C7F}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -203,6 +209,7 @@ Global
{3B5BF14D-F612-4C83-9EF6-E3EBFCD08766} = {4D661178-38FB-43E4-AA5F-9B0406919344}
{239AEEAC-07D1-4A3F-AA99-8C74F5038F50} = {82D22ED7-A0A7-4D64-8E92-4B6A5E74ED11}
{2A4DF030-E8B1-4BBD-AA93-D4DE68CB9D85} = {82D22ED7-A0A7-4D64-8E92-4B6A5E74ED11}
{E5FE4C97-1A7C-4A97-9904-7351CA020C7F} = {6BBCA4D1-213F-4843-B910-DF2D66E3D8CF}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {70143042-A862-47A8-A677-7C819DDC90DC}

View File

@ -12,14 +12,14 @@ namespace StardewModdingAPI.Events
*********/
/// <summary>The asset names that were invalidated.</summary>
#if SMAPI_FOR_MOBILE
public IReadOnlyCollection<IAssetName> Names { get; }
public IImmutableSet<IAssetName> Names { get; }
#else
public IReadOnlySet<IAssetName> Names { get; }
#endif
/// <summary>The <see cref="Names"/> with any locale codes stripped.</summary>
/// <remarks>For example, if <see cref="Names"/> contains a locale like <c>Data/Bundles.fr-FR</c>, this will have the name without locale like <c>Data/Bundles</c>. If the name has no locale, this field is equivalent.</remarks>
#if SMAPI_FOR_MOBILE
public IReadOnlyCollection<IAssetName> NamesWithoutLocale { get; }
public IImmutableSet<IAssetName> NamesWithoutLocale { get; }
#else
public IReadOnlySet<IAssetName> NamesWithoutLocale { get; }
#endif

View File

@ -17,7 +17,7 @@
<Deterministic>True</Deterministic>
<AndroidResgenFile>Resources\Resource.designer.cs</AndroidResgenFile>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<AndroidUseLatestPlatformSdk>false</AndroidUseLatestPlatformSdk>
<AndroidUseLatestPlatformSdk>True</AndroidUseLatestPlatformSdk>
<TargetFrameworkVersion>v12.0</TargetFrameworkVersion>
<TargetFramework>net5.0-android</TargetFramework>
<AndroidUseAapt2>true</AndroidUseAapt2>
@ -142,6 +142,9 @@
<Reference Include="0Harmony">
<HintPath>..\..\build\0Harmony.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>..\..\build\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="Microsoft.CSharp" />
<Reference Include="SMAPI.Toolkit">
<HintPath>..\SMAPI.Toolkit\bin\Debug\netstandard2.0\SMAPI.Toolkit.dll</HintPath>
@ -163,8 +166,6 @@
</PackageReference>
<PackageReference Include="Mono.Cecil" Version="0.11.4" />
<PackageReference Include="MonoMod.Common" Version="22.3.5.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.2" />
<PackageReference Include="Pathoschild.Http.FluentClient" Version="4.2.0" />
<Reference Include="Pintail">
<HintPath>..\..\build\Pintail.dll</HintPath>
</Reference>
@ -175,6 +176,9 @@
<!-- legacy package; remove in SMAPI 4.0.0 -->
<PackageReference Include="System.Runtime.Caching" Version="5.0.0" />
<PackageReference Include="System.Collections.Immutable" Version="5.0.0" />
<ProjectReference Include="..\MobilePatch\MobilePatch.csproj" />
</ItemGroup>
<ItemGroup Condition="'$(BUILD_FOR_MOBILE)' != ''">
<Compile Include="**\*.cs" Exclude="**/.vshistory/**;obj/**" />
@ -191,10 +195,6 @@
<Folder Include="Resources\drawable\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="System.Collections.Immutable" Version="5.0.0" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" Condition="'$(BUILD_FOR_MOBILE)' != ''" />
<Import Project="..\SMAPI.Internal\SMAPI.Internal.projitems" Label="Shared" />
<Import Project="..\SMAPI.Internal.Patching\SMAPI.Internal.Patching.projitems" Label="Shared" />