SMainActivity cleanup and Virtual Keyboard Reflection Fix
This commit is contained in:
parent
f1a17641be
commit
e75e569bce
|
@ -50,9 +50,6 @@ namespace StardewModdingAPI.Mods.VirtualKeyboard
|
|||
helper.Events.Input.ButtonReleased += this.EventInputButtonReleased;
|
||||
helper.Events.Input.ButtonPressed += this.EventInputButtonPressed;
|
||||
|
||||
//TODO
|
||||
//re-enable SMAPI IReflected checks
|
||||
|
||||
MainActivity activity = this.helper.Reflection.GetField<MainActivity>(typeof(MainActivity), "instance").GetValue();
|
||||
object score = activity.GetType().GetField("core", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(activity);
|
||||
object eventManager = score.GetType().GetField("EventManager", BindingFlags.Public | BindingFlags.Instance).GetValue(score);
|
||||
|
@ -115,7 +112,7 @@ namespace StardewModdingAPI.Mods.VirtualKeyboard
|
|||
}
|
||||
if (this.shouldTrigger())
|
||||
{
|
||||
object inputState = this.helper.Reflection.GetField<object>(e, "InputState").GetValue();
|
||||
object inputState = e.GetType().GetField("InputState", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(e);
|
||||
object buttonReleasedEventArgs = Activator.CreateInstance(typeof(ButtonReleasedEventArgs), BindingFlags.NonPublic | BindingFlags.Instance, null, new object[] { this.button, e.Cursor, inputState }, null);
|
||||
EventArgsKeyPressed eventArgsKeyReleased = new EventArgsKeyPressed((Keys)this.button);
|
||||
try
|
||||
|
|
|
@ -1,31 +1,21 @@
|
|||
using Android.App;
|
||||
using Android.Content;
|
||||
using Android.Content.PM;
|
||||
using Android.Graphics;
|
||||
using Android.OS;
|
||||
using Android.Provider;
|
||||
using Android.Runtime;
|
||||
using Android.Support.V4.App;
|
||||
using Android.Support.V4.Content;
|
||||
using Android.Util;
|
||||
using Android.Views;
|
||||
using Google.Android.Vending.Expansion.Downloader;
|
||||
using Google.Android.Vending.Licensing;
|
||||
using Java.Lang;
|
||||
using Java.Util;
|
||||
using Microsoft.AppCenter;
|
||||
using Microsoft.AppCenter.Analytics;
|
||||
using Microsoft.AppCenter.Crashes;
|
||||
using Microsoft.Xna.Framework;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using StardewModdingAPI.Framework;
|
||||
using StardewValley;
|
||||
using Android.Widget;
|
||||
using StardewModdingAPI.Framework.ModLoading;
|
||||
using System.Reflection;
|
||||
|
||||
namespace StardewModdingAPI
|
||||
|
@ -71,78 +61,12 @@ namespace StardewModdingAPI
|
|||
DownloaderService.StartDownloadServiceIfRequired(context, intent, typeof(ExpansionDownloaderService));
|
||||
}
|
||||
}
|
||||
|
||||
private const float MIN_TILE_HEIGHT_IN_INCHES = 0.225f;
|
||||
|
||||
private const float OPTIMAL_TILE_HEIGHT_IN_INCHES = 0.3f;
|
||||
|
||||
private const float MIN_VISIBLE_ROWS = 10f;
|
||||
|
||||
private const float MIN_ZOOM_SCALE = 0.5f;
|
||||
|
||||
private const float MAX_ZOOM_SCALE = 5f;
|
||||
|
||||
private const float OPTIMAL_BUTTON_HEIGHT_IN_INCHES = 0.2f;
|
||||
|
||||
|
||||
private SCore core;
|
||||
|
||||
public const string API_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAry4fecehDpCohQk4XhiIZX9ylIGUThWZxfN9qwvQyTh53hvnpQl/lCrjfflKoPz6gz5jJn6JI1PTnoBy/iXVx1+kbO99qBgJE2V8PS5pq+Usbeqqmqqzx4lEzhiYQ2um92v4qkldNYZFwbTODYPIMbSbaLm7eK9ZyemaRbg9ssAl4QYs0EVxzDK1DjuXilRk28WxiK3lNJTz4cT38bfs4q6Zvuk1vWUvnMqcxiugox6c/9j4zZS5C4+k+WY6mHjUMuwssjCY3G+aImWDSwnU3w9G41q8EoPvJ1049PIi7GJXErusTYZITmqfonyejmSFLPt8LHtux9AmJgFSrC3UhwIDAQAB";
|
||||
|
||||
private LicenseChecker _licenseChecker;
|
||||
|
||||
private IDownloaderService _expansionDownloaderService;
|
||||
|
||||
private IDownloaderServiceConnection _downloaderServiceConnection;
|
||||
|
||||
private PowerManager.WakeLock _wakeLock;
|
||||
|
||||
private Action _callback;
|
||||
|
||||
public static float ZoomScale
|
||||
{
|
||||
get;
|
||||
private set;
|
||||
}
|
||||
|
||||
public static float MenuButtonScale
|
||||
{
|
||||
get;
|
||||
private set;
|
||||
}
|
||||
|
||||
public static string LastSaveGameID
|
||||
{
|
||||
get;
|
||||
private set;
|
||||
}
|
||||
|
||||
public static int ScreenWidthPixels
|
||||
{
|
||||
get;
|
||||
private set;
|
||||
}
|
||||
|
||||
public static int ScreenHeightPixels
|
||||
{
|
||||
get;
|
||||
private set;
|
||||
}
|
||||
|
||||
public bool HasPermissions
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.PackageManager.CheckPermission("android.permission.ACCESS_NETWORK_STATE", this.PackageName) == Permission.Granted
|
||||
&& this.PackageManager.CheckPermission("android.permission.ACCESS_WIFI_STATE", this.PackageName) == Permission.Granted
|
||||
&& this.PackageManager.CheckPermission("android.permission.INTERNET", this.PackageName) == Permission.Granted
|
||||
&& this.PackageManager.CheckPermission("android.permission.READ_EXTERNAL_STORAGE", this.PackageName) == Permission.Granted
|
||||
&& this.PackageManager.CheckPermission("android.permission.VIBRATE", this.PackageName) == Permission.Granted
|
||||
&& this.PackageManager.CheckPermission("android.permission.WAKE_LOCK", this.PackageName) == Permission.Granted
|
||||
&& this.PackageManager.CheckPermission("android.permission.WRITE_EXTERNAL_STORAGE", this.PackageName) == Permission.Granted
|
||||
&& this.PackageManager.CheckPermission("com.android.vending.CHECK_LICENSE", this.PackageName) == Permission.Granted;
|
||||
}
|
||||
}
|
||||
|
||||
private string[] requiredPermissions => new string[8]
|
||||
{
|
||||
"android.permission.ACCESS_NETWORK_STATE",
|
||||
|
@ -186,16 +110,20 @@ namespace StardewModdingAPI
|
|||
this._wakeLock = powerManager.NewWakeLock(WakeLockFlags.Full, "StardewWakeLock");
|
||||
this._wakeLock.Acquire();
|
||||
base.OnCreate(bundle);
|
||||
//this.CheckAppPermissions();
|
||||
Android.Util.Log.Error("Stardew", base.HasPermissions.ToString());
|
||||
if (!base.HasPermissions)
|
||||
{
|
||||
base.PromptForPermissions();
|
||||
}
|
||||
this.OnCreatePartTwo();
|
||||
}
|
||||
|
||||
public void OnCreatePartTwo()
|
||||
{
|
||||
this.SetZoomScaleAndMenuButtonScale();
|
||||
this.SetSavesPath();
|
||||
this.SetPaddingForMenus();
|
||||
Toast.MakeText(context: this, "Starting SMAPI", ToastLength.Long).Show();
|
||||
typeof(MainActivity).GetMethod("SetZoomScaleAndMenuButtonScale")?.Invoke(this, null);
|
||||
typeof(MainActivity).GetMethod("SetSavesPath")?.Invoke(this, null);
|
||||
base.SetPaddingForMenus();
|
||||
Toast.MakeText(context: this, "Initializing SMAPI", ToastLength.Long).Show();
|
||||
|
||||
Program.Main(null);
|
||||
|
||||
|
@ -208,589 +136,34 @@ namespace StardewModdingAPI
|
|||
this.CheckUsingServerManagedPolicy();
|
||||
}
|
||||
|
||||
protected override void OnResume()
|
||||
{
|
||||
base.OnResume();
|
||||
if (this._wakeLock != null && !this._wakeLock.IsHeld)
|
||||
{
|
||||
this._wakeLock.Acquire();
|
||||
}
|
||||
if (this._expansionDownloaderService != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
this._expansionDownloaderService.RequestContinueDownload();
|
||||
}
|
||||
catch (System.Exception exception)
|
||||
{
|
||||
Crashes.TrackError(exception);
|
||||
}
|
||||
}
|
||||
this.RequestedOrientation = ScreenOrientation.SensorLandscape;
|
||||
this.SetImmersive();
|
||||
if (this._downloaderServiceConnection != null)
|
||||
{
|
||||
this._downloaderServiceConnection.Connect(this);
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnStop()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (this._wakeLock != null && this._wakeLock.IsHeld)
|
||||
{
|
||||
this._wakeLock.Release();
|
||||
}
|
||||
}
|
||||
catch (System.Exception exception)
|
||||
{
|
||||
Crashes.TrackError(exception);
|
||||
}
|
||||
base.OnStop();
|
||||
if (this._downloaderServiceConnection != null)
|
||||
{
|
||||
this._downloaderServiceConnection.Disconnect(this);
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnWindowFocusChanged(bool hasFocus)
|
||||
{
|
||||
base.OnWindowFocusChanged(hasFocus);
|
||||
if (hasFocus)
|
||||
{
|
||||
this.RequestedOrientation = ScreenOrientation.SensorLandscape;
|
||||
this.SetImmersive();
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnPause()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (this._wakeLock != null && this._wakeLock.IsHeld)
|
||||
{
|
||||
this._wakeLock.Release();
|
||||
}
|
||||
}
|
||||
catch (System.Exception exception)
|
||||
{
|
||||
Crashes.TrackError(exception);
|
||||
}
|
||||
if (this._expansionDownloaderService != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
this._expansionDownloaderService.RequestPauseDownload();
|
||||
}
|
||||
catch (System.Exception exception2)
|
||||
{
|
||||
Crashes.TrackError(exception2);
|
||||
}
|
||||
}
|
||||
base.OnPause();
|
||||
Game1.emergencyBackup();
|
||||
}
|
||||
|
||||
protected void SetImmersive()
|
||||
{
|
||||
if (Build.VERSION.SdkInt >= BuildVersionCodes.Kitkat)
|
||||
{
|
||||
this.Window.DecorView.SystemUiVisibility = (StatusBarVisibility)5894;
|
||||
}
|
||||
}
|
||||
|
||||
private void SetSavesPath()
|
||||
{
|
||||
Game1.savesPath = System.IO.Path.Combine((string)(Java.Lang.Object)Android.OS.Environment.ExternalStorageDirectory, "StardewValley");
|
||||
Game1.hiddenSavesPath = System.IO.Path.Combine((string)(Java.Lang.Object)Android.OS.Environment.ExternalStorageDirectory, "StardewValley");
|
||||
}
|
||||
|
||||
private void SetZoomScaleAndMenuButtonScale()
|
||||
{
|
||||
Android.Graphics.Point point = new Android.Graphics.Point();
|
||||
this.WindowManager.DefaultDisplay.GetRealSize(point);
|
||||
float num = point.X;
|
||||
float num2 = point.Y;
|
||||
float num3 = System.Math.Min(this.Resources.DisplayMetrics.Xdpi, this.Resources.DisplayMetrics.Ydpi);
|
||||
if (point.Y > point.X)
|
||||
{
|
||||
num = point.Y;
|
||||
num2 = point.X;
|
||||
}
|
||||
ScreenWidthPixels = (int)num;
|
||||
ScreenHeightPixels = (int)num2;
|
||||
float num4 = num3 * 0.3f;
|
||||
float num5 = num2 / num4;
|
||||
float val = num4 / 64f;
|
||||
if (num5 < 10f)
|
||||
{
|
||||
num4 = num3 * 0.225f;
|
||||
val = num4 / 64f;
|
||||
}
|
||||
ZoomScale = System.Math.Max(0.5f, System.Math.Min(val, 5f));
|
||||
MenuButtonScale = num3 * 0.2f / 64f;
|
||||
MenuButtonScale = System.Math.Max(0.5f, System.Math.Min(MenuButtonScale, 5f));
|
||||
Console.WriteLine("MainActivity.SetZoomScale width:" + num + ", height:" + num2 + ", dpi:" + num3 + ", pixelsPerTile:" + num4 + ", ZoomScale:" + ZoomScale + ", MenuButtonScale:" + MenuButtonScale);
|
||||
}
|
||||
|
||||
public int GetBuild()
|
||||
{
|
||||
Android.Content.Context context = Application.Context;
|
||||
return context.PackageManager.GetPackageInfo(context.PackageName, (PackageInfoFlags)0).VersionCode;
|
||||
}
|
||||
|
||||
public void SetPaddingForMenus()
|
||||
{
|
||||
//("MainActivity.SetPaddingForMenus build:" + GetBuild());
|
||||
if (Build.VERSION.SdkInt >= BuildVersionCodes.P && this.Window != null && this.Window.DecorView != null && this.Window.DecorView.RootWindowInsets != null && this.Window.DecorView.RootWindowInsets.DisplayCutout != null)
|
||||
{
|
||||
DisplayCutout displayCutout = this.Window.DecorView.RootWindowInsets.DisplayCutout;
|
||||
//("MainActivity.SetPaddingForMenus DisplayCutout:" + displayCutout);
|
||||
if (displayCutout.SafeInsetLeft > 0 || displayCutout.SafeInsetRight > 0)
|
||||
{
|
||||
Game1.toolbarPaddingX = (Game1.xEdge = System.Math.Max(displayCutout.SafeInsetLeft, displayCutout.SafeInsetRight));
|
||||
//("MainActivity.SetPaddingForMenus CUT OUT toolbarPaddingX:" + Game1.toolbarPaddingX + ", xEdge:" + Game1.xEdge);
|
||||
return;
|
||||
}
|
||||
}
|
||||
string manufacturer = Build.Manufacturer;
|
||||
string model = Build.Model;
|
||||
if (manufacturer == "Google" && model == "Pixel 2 XL")
|
||||
{
|
||||
Game1.xEdge = 26;
|
||||
Game1.toolbarPaddingX = 12;
|
||||
}
|
||||
else if (manufacturer.ToLower() == "samsung")
|
||||
{
|
||||
if (model == "SM-G950U")
|
||||
{
|
||||
Game1.xEdge = 25;
|
||||
Game1.toolbarPaddingX = 40;
|
||||
}
|
||||
else if (model == "SM-N960F")
|
||||
{
|
||||
Game1.xEdge = 20;
|
||||
Game1.toolbarPaddingX = 20;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DisplayMetrics displayMetrics = new DisplayMetrics();
|
||||
this.WindowManager.DefaultDisplay.GetRealMetrics(displayMetrics);
|
||||
if (displayMetrics.HeightPixels >= 1920 || displayMetrics.WidthPixels >= 1920)
|
||||
{
|
||||
Game1.xEdge = 20;
|
||||
Game1.toolbarPaddingX = 20;
|
||||
}
|
||||
}
|
||||
//("MainActivity.SetPaddingForMenus Manufacturer:" + manufacturer + ", Model:" + model + ", xEdge:" + Game1.xEdge + ", toolbarPaddingX:" + Game1.toolbarPaddingX);
|
||||
}
|
||||
|
||||
private void CheckForLastSavedGame()
|
||||
{
|
||||
string savesPath = Game1.savesPath;
|
||||
LastSaveGameID = null;
|
||||
int num = 0;
|
||||
if (!Directory.Exists(savesPath))
|
||||
{
|
||||
return;
|
||||
}
|
||||
string[] array = Directory.EnumerateDirectories(savesPath).ToArray();
|
||||
foreach (string path in array)
|
||||
{
|
||||
string text = System.IO.Path.Combine(savesPath, path, "SaveGameInfo");
|
||||
DateTime lastWriteTimeUtc = File.GetLastWriteTimeUtc(text);
|
||||
int num2 = (int)lastWriteTimeUtc.Subtract(new DateTime(1970, 1, 1)).TotalSeconds;
|
||||
if (num2 > num)
|
||||
{
|
||||
num = num2;
|
||||
string[] array2 = text.Split('/');
|
||||
if (array2.Length > 1)
|
||||
{
|
||||
LastSaveGameID = array2[array2.Length - 2];
|
||||
}
|
||||
}
|
||||
//("MainActivity.CheckForLastSavedGame pathToFile:" + text + ", lastModified:" + lastWriteTimeUtc.ToLongDateString() + ", unixTimestamp:" + num2);
|
||||
}
|
||||
}
|
||||
|
||||
private void CheckToCopySaveGames()
|
||||
{
|
||||
string savesPath = Game1.savesPath;
|
||||
if (!Directory.Exists(savesPath + "/Ahsoka_119548412"))
|
||||
{
|
||||
this.CopySaveGame("Ahsoka_119548412");
|
||||
}
|
||||
if (!Directory.Exists(savesPath + "/Leia_116236289"))
|
||||
{
|
||||
this.CopySaveGame("Leia_116236289");
|
||||
}
|
||||
}
|
||||
|
||||
private void CopySaveGame(string saveGameID)
|
||||
{
|
||||
//("MainActivity.CopySaveGame... saveGameID:" + saveGameID);
|
||||
MemoryStream memoryStream = new MemoryStream(131072);
|
||||
Stream stream = TitleContainer.OpenStream("Content/SaveGames/" + saveGameID + "/SaveGameInfo");
|
||||
stream.CopyTo(memoryStream);
|
||||
memoryStream.Seek(0L, SeekOrigin.Begin);
|
||||
byte[] buffer = memoryStream.GetBuffer();
|
||||
int count = (int)memoryStream.Length;
|
||||
stream.Close();
|
||||
memoryStream = new MemoryStream(2097152);
|
||||
Stream stream2 = TitleContainer.OpenStream("Content/SaveGames/" + saveGameID + "/" + saveGameID);
|
||||
stream2.CopyTo(memoryStream);
|
||||
memoryStream.Seek(0L, SeekOrigin.Begin);
|
||||
byte[] buffer2 = memoryStream.GetBuffer();
|
||||
int count2 = (int)memoryStream.Length;
|
||||
stream2.Close();
|
||||
try
|
||||
{
|
||||
string savesPath = Game1.savesPath;
|
||||
if (!Directory.Exists(savesPath))
|
||||
{
|
||||
Directory.CreateDirectory(savesPath);
|
||||
}
|
||||
string text = System.IO.Path.Combine(savesPath, saveGameID);
|
||||
Directory.CreateDirectory(text);
|
||||
using (FileStream fileStream = File.OpenWrite(System.IO.Path.Combine(text, "SaveGameInfo")))
|
||||
{
|
||||
fileStream.Write(buffer, 0, count);
|
||||
}
|
||||
using (FileStream fileStream2 = File.OpenWrite(System.IO.Path.Combine(text, saveGameID)))
|
||||
{
|
||||
fileStream2.Write(buffer2, 0, count2);
|
||||
}
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
{
|
||||
//("MainActivity.CopySaveGame ERROR WRITING STREAM:" + ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
public void ShowDiskFullDialogue()
|
||||
{
|
||||
//("MainActivity.ShowDiskFullDialogue");
|
||||
string message = "Disk full. You need to free up some space to continue.";
|
||||
if (LocalizedContentManager.CurrentLanguageCode == LocalizedContentManager.LanguageCode.de)
|
||||
{
|
||||
message = "Festplatte voll. Sie müssen etwas Platz schaffen, um fortzufahren.";
|
||||
}
|
||||
else if (LocalizedContentManager.CurrentLanguageCode == LocalizedContentManager.LanguageCode.es)
|
||||
{
|
||||
message = "Disco lleno. Necesitas liberar algo de espacio para continuar.";
|
||||
}
|
||||
else if (LocalizedContentManager.CurrentLanguageCode == LocalizedContentManager.LanguageCode.fr)
|
||||
{
|
||||
message = "Disque plein. Vous devez libérer de l'espace pour continuer.";
|
||||
}
|
||||
else if (LocalizedContentManager.CurrentLanguageCode == LocalizedContentManager.LanguageCode.hu)
|
||||
{
|
||||
message = "Megtelt a lemez. Szüksége van egy kis hely felszabadítására a folytatáshoz.";
|
||||
}
|
||||
else if (LocalizedContentManager.CurrentLanguageCode == LocalizedContentManager.LanguageCode.it)
|
||||
{
|
||||
message = "Disco pieno. È necessario liberare spazio per continuare.";
|
||||
}
|
||||
else if (LocalizedContentManager.CurrentLanguageCode == LocalizedContentManager.LanguageCode.ja)
|
||||
{
|
||||
message = "ディスクがいっぱいです。続行するにはスペ\u30fcスをいくらか解放する必要があります。";
|
||||
}
|
||||
else if (LocalizedContentManager.CurrentLanguageCode == LocalizedContentManager.LanguageCode.ko)
|
||||
{
|
||||
message = "디스크 꽉 참. 계속하려면 여유 공간을 확보해야합니다.";
|
||||
}
|
||||
else if (LocalizedContentManager.CurrentLanguageCode == LocalizedContentManager.LanguageCode.pt)
|
||||
{
|
||||
message = "Disco cheio. Você precisa liberar algum espaço para continuar.";
|
||||
}
|
||||
else if (LocalizedContentManager.CurrentLanguageCode == LocalizedContentManager.LanguageCode.ru)
|
||||
{
|
||||
message = "Диск полон. Вам нужно освободить место, чтобы продолжить.";
|
||||
}
|
||||
else if (LocalizedContentManager.CurrentLanguageCode == LocalizedContentManager.LanguageCode.tr)
|
||||
{
|
||||
message = "Disk dolu. Devam etmek için biraz alan boşaltmanız gerekiyor.";
|
||||
}
|
||||
else if (LocalizedContentManager.CurrentLanguageCode == LocalizedContentManager.LanguageCode.zh)
|
||||
{
|
||||
message = "磁盘已满。你需要释放一些空间才能继续。";
|
||||
}
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
builder.SetMessage(message);
|
||||
builder.SetPositiveButton("OK", delegate
|
||||
{
|
||||
});
|
||||
Dialog dialog = builder.Create();
|
||||
if (!this.IsFinishing)
|
||||
{
|
||||
dialog.Show();
|
||||
}
|
||||
}
|
||||
|
||||
public void PromptForPermissionsIfNecessary(Action callback = null)
|
||||
{
|
||||
//Log.It("MainActivity.PromptForPermissionsIfNecessary...");
|
||||
if (this.HasPermissions)
|
||||
{
|
||||
if (callback != null)
|
||||
{
|
||||
//Log.It("MainActivity.PromptForPermissionsIfNecessary has permissions, calling callback");
|
||||
callback();
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//Log.It("MainActivity.PromptForPermissionsIfNecessary doesn't have permissions, prompt for them");
|
||||
this._callback = callback;
|
||||
this.PromptForPermissionsWithReasonFirst();
|
||||
}
|
||||
}
|
||||
|
||||
private void PromptForPermissionsWithReasonFirst()
|
||||
{
|
||||
//Log.It("MainActivity.PromptForPermissionsWithReasonFirst...");
|
||||
if (!this.HasPermissions)
|
||||
{
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
string languageCode = Locale.Default.Language.Substring(0, 2);
|
||||
builder.SetMessage(this.PermissionMessageA(languageCode));
|
||||
builder.SetPositiveButton(this.GetOKString(languageCode), delegate (object senderAlert, DialogClickEventArgs args)
|
||||
{
|
||||
//Log.It("MainActivity.PromptForPermissionsWithReasonFirst PromptForPermissions A");
|
||||
this.PromptForPermissions();
|
||||
});
|
||||
Dialog dialog = builder.Create();
|
||||
if (!this.IsFinishing)
|
||||
{
|
||||
dialog.Show();
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//Log.It("MainActivity.PromptForPermissionsWithReasonFirst PromptForPermissions B");
|
||||
this.PromptForPermissions();
|
||||
}
|
||||
}
|
||||
|
||||
private string GetOKString(string languageCode)
|
||||
{
|
||||
if (languageCode == "de")
|
||||
{
|
||||
return "OK";
|
||||
}
|
||||
if (languageCode == "es")
|
||||
{
|
||||
return "DE ACUERDO";
|
||||
}
|
||||
if (languageCode == "ja")
|
||||
{
|
||||
return "OK";
|
||||
}
|
||||
if (languageCode == "pt")
|
||||
{
|
||||
return "Está bem";
|
||||
}
|
||||
if (languageCode == "ru")
|
||||
{
|
||||
return "Хорошо";
|
||||
}
|
||||
if (languageCode == "ko")
|
||||
{
|
||||
return "승인";
|
||||
}
|
||||
if (languageCode == "tr")
|
||||
{
|
||||
return "tamam";
|
||||
}
|
||||
if (languageCode == "fr")
|
||||
{
|
||||
return "D'accord";
|
||||
}
|
||||
if (languageCode == "hu")
|
||||
{
|
||||
return "rendben";
|
||||
}
|
||||
if (languageCode == "it")
|
||||
{
|
||||
return "ok";
|
||||
}
|
||||
if (languageCode == "zh")
|
||||
{
|
||||
return "好";
|
||||
}
|
||||
return "OK";
|
||||
}
|
||||
|
||||
private string PermissionMessageA(string languageCode)
|
||||
{
|
||||
if (languageCode == "de")
|
||||
{
|
||||
return "Du musst die Erlaubnis zum Lesen/Schreiben auf dem externen Speicher geben, um das Spiel zu speichern und Speicherstände auf andere Plattformen übertragen zu können. Bitte gib diese Genehmigung, um spielen zu können.";
|
||||
}
|
||||
if (languageCode == "es")
|
||||
{
|
||||
return "Para guardar la partida y transferir partidas guardadas a y desde otras plataformas, se necesita permiso para leer/escribir en almacenamiento externo. Concede este permiso para poder jugar.";
|
||||
}
|
||||
if (languageCode == "ja")
|
||||
{
|
||||
return "外部機器への読み込み/書き出しの許可が、ゲームのセーブデータの保存や他プラットフォームとの双方向のデータ移行実行に必要です。プレイを続けるには許可をしてください。";
|
||||
}
|
||||
if (languageCode == "pt")
|
||||
{
|
||||
return "Para salvar o jogo e transferir jogos salvos entre plataformas é necessário permissão para ler/gravar em armazenamento externo. Forneça essa permissão para jogar.";
|
||||
}
|
||||
if (languageCode == "ru")
|
||||
{
|
||||
return "Для сохранения игры и переноса сохранений с/на другие платформы нужно разрешение на чтение-запись на внешнюю память. Дайте разрешение, чтобы начать играть.";
|
||||
}
|
||||
if (languageCode == "ko")
|
||||
{
|
||||
return "게임을 저장하려면 외부 저장공간에 대한 읽기/쓰기 권한이 필요합니다. 또한 저장 데이터 이전 기능을 허용해 다른 플랫폼에서 게임 진행상황을 가져올 때에도 권한이 필요합니다. 게임을 플레이하려면 권한을 허용해 주십시오.";
|
||||
}
|
||||
if (languageCode == "tr")
|
||||
{
|
||||
return "Oyunu kaydetmek ve kayıtları platformlardan platformlara taşımak için harici depolamada okuma/yazma izni gereklidir. Lütfen oynayabilmek için izin verin.";
|
||||
}
|
||||
if (languageCode == "fr")
|
||||
{
|
||||
return "Une autorisation de lecture / écriture sur un stockage externe est requise pour sauvegarder le jeu et vous permettre de transférer des sauvegardes vers et depuis d'autres plateformes. Veuillez donner l'autorisation afin de jouer.";
|
||||
}
|
||||
if (languageCode == "hu")
|
||||
{
|
||||
return "A játék mentéséhez, és ahhoz, hogy a különböző platformok között hordozhasd a játékmentést, engedélyezned kell a külső tárhely olvasását/írását, Kérjük, a játékhoz engedélyezd ezeket.";
|
||||
}
|
||||
if (languageCode == "it")
|
||||
{
|
||||
return "È necessaria l'autorizzazione a leggere/scrivere su un dispositivo di memorizzazione esterno per salvare la partita e per consentire di trasferire i salvataggi da e su altre piattaforme. Concedi l'autorizzazione per giocare.";
|
||||
}
|
||||
if (languageCode == "zh")
|
||||
{
|
||||
return "《星露谷物语》请求获得授权用来保存游戏数据以及访问线上功能。";
|
||||
}
|
||||
return "Read/write to external storage permission is required to save the game, and to allow to you transfer saves to and from other platforms. Please give permission in order to play.";
|
||||
}
|
||||
|
||||
private string PermissionMessageB(string languageCode)
|
||||
{
|
||||
if (languageCode == "de")
|
||||
{
|
||||
return "Bitte geh in die Handy-Einstellungen > Apps > Stardew Valley > Berechtigungen und aktiviere den Speicher, um das Spiel zu spielen.";
|
||||
}
|
||||
if (languageCode == "es")
|
||||
{
|
||||
return "En el teléfono, ve a Ajustes > Aplicaciones > Stardew Valley > Permisos y activa Almacenamiento para jugar al juego.";
|
||||
}
|
||||
if (languageCode == "ja")
|
||||
{
|
||||
return "設定 > アプリ > スターデューバレー > 許可の順に開いていき、ストレージを有効にしてからゲームをプレイしましょう。";
|
||||
}
|
||||
if (languageCode == "pt")
|
||||
{
|
||||
return "Acesse Configurar > Aplicativos > Stardew Valley > Permissões e ative Armazenamento para jogar.";
|
||||
}
|
||||
if (languageCode == "ru")
|
||||
{
|
||||
return "Перейдите в меню Настройки > Приложения > Stardew Valley > Разрешения и дайте доступ к памяти, чтобы начать играть.";
|
||||
}
|
||||
if (languageCode == "ko")
|
||||
{
|
||||
return "휴대전화의 설정 > 어플리케이션 > 스타듀 밸리 > 권한 에서 저장공간을 활성화한 뒤 게임을 플레이해 주십시오.";
|
||||
}
|
||||
if (languageCode == "tr")
|
||||
{
|
||||
return "Lütfen oyunu oynayabilmek için telefonda Ayarlar > Uygulamalar > Stardew Valley > İzinler ve Depolamayı etkinleştir yapın.";
|
||||
}
|
||||
if (languageCode == "fr")
|
||||
{
|
||||
return "Veuillez aller dans les Paramètres du téléphone> Applications> Stardew Valley> Autorisations, puis activez Stockage pour jouer.";
|
||||
}
|
||||
if (languageCode == "hu")
|
||||
{
|
||||
return "Lépje be a telefonodon a Beállítások > Alkalmazások > Stardew Valley > Engedélyek menübe, majd engedélyezd a Tárhelyet a játékhoz.";
|
||||
}
|
||||
if (languageCode == "it")
|
||||
{
|
||||
return "Nel telefono, vai su Impostazioni > Applicazioni > Stardew Valley > Autorizzazioni e attiva Memoria archiviazione per giocare.";
|
||||
}
|
||||
if (languageCode == "zh")
|
||||
{
|
||||
return "可在“设置-权限隐私-按应用管理权限-星露谷物语”进行设置,并打开“电话”、“读取位置信息”、“存储”权限。";
|
||||
}
|
||||
return "Please go into phone Settings > Apps > Stardew Valley > Permissions, and enable Storage to play the game.";
|
||||
}
|
||||
|
||||
|
||||
private void LogPermissions()
|
||||
{
|
||||
//("MainActivity.LogPermissions , AccessNetworkState:" + ContextCompat.CheckSelfPermission(this, "android.permission.ACCESS_NETWORK_STATE") + ", AccessWifiState:" + ContextCompat.CheckSelfPermission(this, "android.permission.ACCESS_WIFI_STATE") + ", Internet:" + ContextCompat.CheckSelfPermission(this, "android.permission.INTERNET") + ", ReadExternalStorage:" + ContextCompat.CheckSelfPermission(this, "android.permission.READ_EXTERNAL_STORAGE") + ", Vibrate:" + ContextCompat.CheckSelfPermission(this, "android.permission.VIBRATE") + ", WakeLock:" + ContextCompat.CheckSelfPermission(this, "android.permission.WAKE_LOCK") + ", WriteExternalStorage:" + ContextCompat.CheckSelfPermission(this, "android.permission.WRITE_EXTERNAL_STORAGE") + ", CheckLicense:" + ContextCompat.CheckSelfPermission(this, "com.android.vending.CHECK_LICENSE"));
|
||||
}
|
||||
|
||||
public void CheckAppPermissions()
|
||||
{
|
||||
this.LogPermissions();
|
||||
if (base.HasPermissions)
|
||||
{
|
||||
//("MainActivity.CheckAppPermissions permissions already granted.");
|
||||
this.OnCreatePartTwo();
|
||||
return;
|
||||
}
|
||||
this.PromptForPermissionsWithReasonFirst();
|
||||
}
|
||||
|
||||
public void PromptForPermissions()
|
||||
{
|
||||
//("MainActivity.PromptForPermissions requesting permissions...");
|
||||
ActivityCompat.RequestPermissions(this, this.deniedPermissionsArray, 0);
|
||||
}
|
||||
|
||||
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults)
|
||||
{
|
||||
//("MainActivity.OnRequestPermissionsResult requestCode:" + requestCode + " len:" + permissions.Length);
|
||||
if (permissions.Length == 0)
|
||||
{
|
||||
//("MainActivity.OnRequestPermissionsResult no permissions returned, RETURNING");
|
||||
return;
|
||||
}
|
||||
}
|
||||
string languageCode = Locale.Default.Language.Substring(0, 2);
|
||||
int num = 0;
|
||||
if (requestCode == 0)
|
||||
{
|
||||
for (int i = 0; i < grantResults.Length; i++)
|
||||
{
|
||||
//("MainActivity.OnRequestPermissionsResult permission:" + permissions[i] + ", granted:" + grantResults[i]);
|
||||
if (grantResults[i] == Permission.Granted)
|
||||
{
|
||||
num++;
|
||||
}
|
||||
else if (grantResults[i] == Permission.Denied)
|
||||
{
|
||||
//("MainActivity.OnRequestPermissionsResult PERMISSION " + permissions[i] + " DENIED!");
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
if (ActivityCompat.ShouldShowRequestPermissionRationale(this, permissions[i]))
|
||||
try
|
||||
{
|
||||
builder.SetMessage(this.PermissionMessageA(languageCode));
|
||||
builder.SetPositiveButton(this.GetOKString(languageCode), delegate (object senderAlert, DialogClickEventArgs args)
|
||||
if (ActivityCompat.ShouldShowRequestPermissionRationale(this, permissions[i]))
|
||||
{
|
||||
//Log.It("MainActivity.OnRequestPermissionsResult PromptForPermissions D");
|
||||
this.PromptForPermissions();
|
||||
});
|
||||
}
|
||||
}
|
||||
else
|
||||
catch (IllegalArgumentException exception)
|
||||
{
|
||||
builder.SetMessage(this.PermissionMessageB(languageCode));
|
||||
builder.SetPositiveButton(this.GetOKString(languageCode), delegate (object senderAlert, DialogClickEventArgs args)
|
||||
{
|
||||
this.OpenAppSettingsOnPhone();
|
||||
});
|
||||
}
|
||||
Dialog dialog = builder.Create();
|
||||
if (!this.IsFinishing)
|
||||
{
|
||||
dialog.Show();
|
||||
this.Finish();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -800,30 +173,17 @@ namespace StardewModdingAPI
|
|||
{
|
||||
if (this._callback != null)
|
||||
{
|
||||
//("MainActivity.OnRequestPermissionsResult permissions granted, calling callback");
|
||||
this._callback();
|
||||
this._callback = null;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
//("MainActivity.OnRequestPermissionsResult " + num + "/" + permissions.Length + " granted, check for licence...");
|
||||
this.OnCreatePartTwo();
|
||||
}
|
||||
this.OnCreatePartTwo();
|
||||
}
|
||||
}
|
||||
|
||||
private void OpenAppSettingsOnPhone()
|
||||
{
|
||||
Intent intent = new Intent();
|
||||
intent.SetAction("android.settings.APPLICATION_DETAILS_SETTINGS");
|
||||
Android.Net.Uri data = Android.Net.Uri.FromParts("package", this.PackageName, null);
|
||||
intent.SetData(data);
|
||||
this.StartActivity(intent);
|
||||
}
|
||||
|
||||
private void CheckUsingServerManagedPolicy()
|
||||
{
|
||||
//("MainActivity.CheckUsingServerManagedPolicy");
|
||||
byte[] salt = new byte[15]
|
||||
{
|
||||
46,
|
||||
|
@ -850,158 +210,22 @@ namespace StardewModdingAPI
|
|||
this._licenseChecker.CheckAccess(this);
|
||||
}
|
||||
|
||||
private void CheckForValidLicence()
|
||||
public new void Allow(PolicyResponse response)
|
||||
{
|
||||
//("MainActivity.CheckForValidLicence");
|
||||
StrictPolicy policy = new StrictPolicy();
|
||||
this._licenseChecker = new LicenseChecker(this, policy, "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAry4fecehDpCohQk4XhiIZX9ylIGUThWZxfN9qwvQyTh53hvnpQl/lCrjfflKoPz6gz5jJn6JI1PTnoBy/iXVx1+kbO99qBgJE2V8PS5pq+Usbeqqmqqzx4lEzhiYQ2um92v4qkldNYZFwbTODYPIMbSbaLm7eK9ZyemaRbg9ssAl4QYs0EVxzDK1DjuXilRk28WxiK3lNJTz4cT38bfs4q6Zvuk1vWUvnMqcxiugox6c/9j4zZS5C4+k+WY6mHjUMuwssjCY3G+aImWDSwnU3w9G41q8EoPvJ1049PIi7GJXErusTYZITmqfonyejmSFLPt8LHtux9AmJgFSrC3UhwIDAQAB");
|
||||
this._licenseChecker.CheckAccess(this);
|
||||
}
|
||||
|
||||
public void Allow(PolicyResponse response)
|
||||
{
|
||||
//("MainActivity.Allow response:" + response.ToString());
|
||||
typeof(MainActivity).GetMethod("CheckToDownloadExpansion", BindingFlags.Instance | BindingFlags.NonPublic)?.Invoke(this, null);
|
||||
}
|
||||
|
||||
public void DontAllow(PolicyResponse response)
|
||||
public new void DontAllow(PolicyResponse response)
|
||||
{
|
||||
//("MainActivity.DontAllow response:" + response.ToString());
|
||||
switch (response)
|
||||
{
|
||||
case PolicyResponse.Retry:
|
||||
this.WaitThenCheckForValidLicence();
|
||||
typeof(MainActivity).GetMethod("WaitThenCheckForValidLicence")?.Invoke(this, null);
|
||||
break;
|
||||
case PolicyResponse.Licensed:
|
||||
typeof(MainActivity).GetMethod("CheckToDownloadExpansion", BindingFlags.Instance | BindingFlags.NonPublic)?.Invoke(this, null);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private async void WaitThenCheckForValidLicence()
|
||||
{
|
||||
await Task.Delay(TimeSpan.FromSeconds(30.0));
|
||||
this.CheckUsingServerManagedPolicy();
|
||||
}
|
||||
|
||||
public void ApplicationError(LicenseCheckerErrorCode errorCode)
|
||||
{
|
||||
//("MainActivity.ApplicationError errorCode:" + errorCode.ToString());
|
||||
}
|
||||
|
||||
private void CheckToDownloadExpansion()
|
||||
{
|
||||
if (this.ExpansionAlreadyDownloaded())
|
||||
{
|
||||
//("MainActivity.CheckToDownloadExpansion Expansion already downloaded");
|
||||
this.OnExpansionDowloaded();
|
||||
}
|
||||
else
|
||||
{
|
||||
//("MainActivity.CheckToDownloadExpansion Need to download expansion");
|
||||
this.StartExpansionDownload();
|
||||
}
|
||||
}
|
||||
|
||||
private bool ExpansionAlreadyDownloaded()
|
||||
{
|
||||
DownloadInfo[] downloads = DownloadsDB.GetDB().GetDownloads();
|
||||
if (downloads == null || !downloads.Any())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (downloads != null)
|
||||
{
|
||||
DownloadInfo[] array = downloads;
|
||||
foreach (DownloadInfo downloadInfo in array)
|
||||
{
|
||||
if (!Helpers.DoesFileExist(this, downloadInfo.FileName, downloadInfo.TotalBytes, deleteFileOnMismatch: false))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private void OnExpansionDowloaded()
|
||||
{
|
||||
this.OnCreatePartTwo();
|
||||
if (this.core.GameInstance != null)
|
||||
{
|
||||
this.core.GameInstance.CreateMusicWaveBank();
|
||||
}
|
||||
}
|
||||
|
||||
private void StartExpansionDownload()
|
||||
{
|
||||
//("MainActivity.StartExpansionDownload");
|
||||
Intent intent = this.Intent;
|
||||
Intent intent2 = new Intent(this, typeof(SMainActivity));
|
||||
intent2.SetFlags(ActivityFlags.ClearTop | ActivityFlags.NewTask);
|
||||
intent2.SetAction(intent.Action);
|
||||
if (intent.Categories != null)
|
||||
{
|
||||
foreach (string category in intent.Categories)
|
||||
{
|
||||
intent2.AddCategory(category);
|
||||
}
|
||||
}
|
||||
PendingIntent activity = PendingIntent.GetActivity(this, 0, intent2, PendingIntentFlags.UpdateCurrent);
|
||||
try
|
||||
{
|
||||
DownloaderServiceRequirement downloaderServiceRequirement = DownloaderService.StartDownloadServiceIfRequired(this, activity, typeof(ExpansionDownloaderService));
|
||||
if (downloaderServiceRequirement != 0)
|
||||
{
|
||||
//("MainActivity.StartExpansionDownload A startResult:" + downloaderServiceRequirement);
|
||||
this._downloaderServiceConnection = DownloaderClientMarshaller.CreateStub(this, typeof(ExpansionDownloaderService));
|
||||
this._downloaderServiceConnection.Connect(this);
|
||||
//("MainActivity.StartExpansionDownload B startResult:" + downloaderServiceRequirement);
|
||||
}
|
||||
else
|
||||
{
|
||||
//("MainActivity.StartExpansionDownload - all files have finished downloading already");
|
||||
this.OnExpansionDowloaded();
|
||||
}
|
||||
}
|
||||
catch (IllegalStateException ex)
|
||||
{
|
||||
//("MainActivity.StartExpansionDownload ERROR exception:" + ex);
|
||||
Crashes.TrackError(ex);
|
||||
}
|
||||
}
|
||||
|
||||
public void OnServiceConnected(Messenger messenger)
|
||||
{
|
||||
//("MainActivity.OnServiceConnected messenger:" + messenger.ToString());
|
||||
this._expansionDownloaderService = DownloaderServiceMarshaller.CreateProxy(messenger);
|
||||
this._expansionDownloaderService.OnClientUpdated(this._downloaderServiceConnection.GetMessenger());
|
||||
}
|
||||
|
||||
public void OnDownloadProgress(DownloadProgressInfo progress)
|
||||
{
|
||||
//("MainActivity.OnDownloadProgress OverallProgress:" + progress.OverallProgress + ", OverallTotal:" + progress.OverallTotal + ", TimeRemaining:" + progress.TimeRemaining + ", CurrentSpeed:" + progress.CurrentSpeed);
|
||||
}
|
||||
|
||||
public void OnDownloadStateChanged(DownloaderClientState downloaderClientState)
|
||||
{
|
||||
//("MainActivity.OnDownloadStateChanged downloaderClientState:" + downloaderClientState.ToString());
|
||||
switch (downloaderClientState)
|
||||
{
|
||||
case DownloaderClientState.PausedWifiDisabledNeedCellularPermission:
|
||||
case DownloaderClientState.PausedNeedCellularPermission:
|
||||
this._expansionDownloaderService.SetDownloadFlags(DownloaderServiceFlags.DownloadOverCellular);
|
||||
this._expansionDownloaderService.RequestContinueDownload();
|
||||
break;
|
||||
case DownloaderClientState.Completed:
|
||||
if (this._expansionDownloaderService != null)
|
||||
{
|
||||
this._expansionDownloaderService.Dispose();
|
||||
this._expansionDownloaderService = null;
|
||||
}
|
||||
this.OnExpansionDowloaded();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue