From bd9bcae01d1eb9020df1280658543184465271fd Mon Sep 17 00:00:00 2001
From: chinosk <2248589280@qq.com>
Date: Sun, 1 Dec 2024 03:49:58 +0000
Subject: [PATCH] Add `login as ios`. Trim version string.

---
 app/build.gradle                              |  2 +-
 app/src/main/cpp/GakumasLocalify/Hook.cpp     | 42 +++++++++++++++++++
 .../cpp/GakumasLocalify/config/Config.cpp     |  3 ++
 .../cpp/GakumasLocalify/config/Config.hpp     |  2 +
 .../gakumas/localify/ConfigUpdateListener.kt  |  6 +++
 .../localify/hookUtils/FilesChecker.kt        |  4 +-
 .../gakumas/localify/models/GakumasConfig.kt  |  2 +
 .../ui/pages/subPages/AdvancedSettingsPage.kt |  4 ++
 app/src/main/res/values-ja/strings.xml        |  1 +
 app/src/main/res/values-zh-rCN/strings.xml    |  1 +
 app/src/main/res/values/strings.xml           |  1 +
 11 files changed, 65 insertions(+), 3 deletions(-)

diff --git a/app/build.gradle b/app/build.gradle
index f92b51c..35b3ec6 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -16,7 +16,7 @@ android {
         minSdk 29
         targetSdk 34
         versionCode 4
-        versionName "v1.6.3"
+        versionName "v1.6.4"
 
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
         vectorDrawables {
diff --git a/app/src/main/cpp/GakumasLocalify/Hook.cpp b/app/src/main/cpp/GakumasLocalify/Hook.cpp
index 9832299..2a429ea 100644
--- a/app/src/main/cpp/GakumasLocalify/Hook.cpp
+++ b/app/src/main/cpp/GakumasLocalify/Hook.cpp
@@ -763,6 +763,32 @@ namespace GakumasLocal::HookMain {
         CampusActorController_LateUpdate_Orig(self, mtd);
     }
 
+    DEFINE_HOOK(bool, PlatformInformation_get_IsAndroid, ()) {
+        if (Config::loginAsIOS) {
+            return false;
+        }
+        // Log::DebugFmt("PlatformInformation_get_IsAndroid: 0x%x", ret);
+        return PlatformInformation_get_IsAndroid_Orig();
+    }
+
+    DEFINE_HOOK(bool, PlatformInformation_get_IsIOS, ()) {
+        if (Config::loginAsIOS) {
+            return true;
+        }
+        // Log::DebugFmt("PlatformInformation_get_IsIOS: 0x%x", ret);
+        return PlatformInformation_get_IsIOS_Orig();
+    }
+
+    DEFINE_HOOK(Il2cppString*, ApiBase_GetPlatformString, (void* self, void* mtd)) {
+        if (Config::loginAsIOS) {
+            return Il2cppString::New("iOS");
+        }
+        // auto ret = ApiBase_GetPlatformString_Orig(self, mtd);
+        // Log::DebugFmt("ApiBase_GetPlatformString: %s", ret->ToString().c_str());
+        return ApiBase_GetPlatformString_Orig(self, mtd);
+    }
+
+
     void UpdateSwingBreastBonesData(void* initializeData) {
         if (!Config::enableBreastParam) return;
         static auto CampusActorAnimationInitializeData_klass = Il2cppUtils::GetClass("campus-submodule.Runtime.dll", "ActorAnimation",
@@ -954,6 +980,22 @@ namespace GakumasLocal::HookMain {
         ADD_HOOK(CampusActorController_LateUpdate,
                  Il2cppUtils::GetMethodPointer("campus-submodule.Runtime.dll", "Campus.Common",
                                                "CampusActorController", "LateUpdate"));
+
+        ADD_HOOK(PlatformInformation_get_IsAndroid, Il2cppUtils::GetMethodPointer("Firebase.Platform.dll", "Firebase.Platform",
+                                                                         "PlatformInformation", "get_IsAndroid"));
+        ADD_HOOK(PlatformInformation_get_IsIOS, Il2cppUtils::GetMethodPointer("Firebase.Platform.dll", "Firebase.Platform",
+                                                                                  "PlatformInformation", "get_IsIOS"));
+
+        auto api_klass = Il2cppUtils::GetClass("Assembly-CSharp.dll", "Campus.Common.Network", "Api");
+        if (api_klass) {
+            // Qua.Network.ApiBase
+            auto api_parent = UnityResolve::Invoke<Il2cppUtils::Il2CppClassHead*>("il2cpp_class_get_parent", api_klass->address);
+            if (api_parent) {
+                // Log::DebugFmt("api_parent at %p, name: %s::%s", api_parent, api_parent->namespaze, api_parent->name);
+                ADD_HOOK(ApiBase_GetPlatformString, Il2cppUtils::il2cpp_class_get_method_from_name(api_parent, "GetPlatformString", 0)->methodPointer);
+            }
+        }
+
         /*
         static auto CampusActorController_klass = Il2cppUtils::GetClass("campus-submodule.Runtime.dll",
                                                                         "Campus.Common", "CampusActorController");
diff --git a/app/src/main/cpp/GakumasLocalify/config/Config.cpp b/app/src/main/cpp/GakumasLocalify/config/Config.cpp
index 2493565..83e28a4 100644
--- a/app/src/main/cpp/GakumasLocalify/config/Config.cpp
+++ b/app/src/main/cpp/GakumasLocalify/config/Config.cpp
@@ -21,6 +21,8 @@ namespace GakumasLocal::Config {
     std::string liveCustomeHeadId = "";
     std::string liveCustomeCostumeId = "";
 
+    bool loginAsIOS = false;
+
     bool useCustomeGraphicSettings = false;
     float renderScale = 0.77f;
     int qualitySettingsLevel = 3;
@@ -68,6 +70,7 @@ namespace GakumasLocal::Config {
             GetConfigItem(enableLiveCustomeDress);
             GetConfigItem(liveCustomeHeadId);
             GetConfigItem(liveCustomeCostumeId);
+            GetConfigItem(loginAsIOS);
             GetConfigItem(useCustomeGraphicSettings);
             GetConfigItem(renderScale);
             GetConfigItem(qualitySettingsLevel);
diff --git a/app/src/main/cpp/GakumasLocalify/config/Config.hpp b/app/src/main/cpp/GakumasLocalify/config/Config.hpp
index cba35b4..3813a4a 100644
--- a/app/src/main/cpp/GakumasLocalify/config/Config.hpp
+++ b/app/src/main/cpp/GakumasLocalify/config/Config.hpp
@@ -19,6 +19,8 @@ namespace GakumasLocal::Config {
     extern std::string liveCustomeHeadId;
     extern std::string liveCustomeCostumeId;
 
+    extern bool loginAsIOS;
+
     extern bool useCustomeGraphicSettings;
     extern float renderScale;
     extern int qualitySettingsLevel;
diff --git a/app/src/main/java/io/github/chinosk/gakumas/localify/ConfigUpdateListener.kt b/app/src/main/java/io/github/chinosk/gakumas/localify/ConfigUpdateListener.kt
index 4c2bf32..3fa7fd9 100644
--- a/app/src/main/java/io/github/chinosk/gakumas/localify/ConfigUpdateListener.kt
+++ b/app/src/main/java/io/github/chinosk/gakumas/localify/ConfigUpdateListener.kt
@@ -17,6 +17,7 @@ import kotlinx.coroutines.runBlocking
 interface ConfigListener {
     fun onEnabledChanged(value: Boolean)
     fun onForceExportResourceChanged(value: Boolean)
+    fun onLoginAsIOSChanged(value: Boolean)
     fun onTextTestChanged(value: Boolean)
     fun onReplaceFontChanged(value: Boolean)
     fun onLazyInitChanged(value: Boolean)
@@ -115,6 +116,11 @@ interface ConfigUpdateListener: ConfigListener, IHasConfigItems {
         pushKeyEvent(KeyEvent(1145, 30))
     }
 
+    override fun onLoginAsIOSChanged(value: Boolean) {
+        config.loginAsIOS = value
+        saveConfig()
+    }
+
     override fun onReplaceFontChanged(value: Boolean) {
         config.replaceFont = value
         saveConfig()
diff --git a/app/src/main/java/io/github/chinosk/gakumas/localify/hookUtils/FilesChecker.kt b/app/src/main/java/io/github/chinosk/gakumas/localify/hookUtils/FilesChecker.kt
index 61d72e7..2bea30e 100644
--- a/app/src/main/java/io/github/chinosk/gakumas/localify/hookUtils/FilesChecker.kt
+++ b/app/src/main/java/io/github/chinosk/gakumas/localify/hookUtils/FilesChecker.kt
@@ -84,7 +84,7 @@ object FilesChecker {
         for (i in assets.list(localizationFilesDir)!!) {
             if (i.toString() == "version.txt") {
                 val stream = assets.open("$localizationFilesDir/$i")
-                return convertToString(stream)
+                return convertToString(stream).trim()
             }
         }
         return "0.0"
@@ -96,7 +96,7 @@ object FilesChecker {
 
         val versionFile = File(pluginFilesDir, "version.txt")
         if (!versionFile.exists()) return "0.0"
-        return versionFile.readText()
+        return versionFile.readText().trim()
     }
 
     fun convertToString(inputStream: InputStream?): String {
diff --git a/app/src/main/java/io/github/chinosk/gakumas/localify/models/GakumasConfig.kt b/app/src/main/java/io/github/chinosk/gakumas/localify/models/GakumasConfig.kt
index 3f206bc..fca7b64 100644
--- a/app/src/main/java/io/github/chinosk/gakumas/localify/models/GakumasConfig.kt
+++ b/app/src/main/java/io/github/chinosk/gakumas/localify/models/GakumasConfig.kt
@@ -19,6 +19,8 @@ data class GakumasConfig (
     var liveCustomeHeadId: String = "",
     var liveCustomeCostumeId: String = "",
 
+    var loginAsIOS: Boolean = false,
+
     var useCustomeGraphicSettings: Boolean = false,
     var renderScale: Float = 0.77f,
     var qualitySettingsLevel: Int = 3,
diff --git a/app/src/main/java/io/github/chinosk/gakumas/localify/ui/pages/subPages/AdvancedSettingsPage.kt b/app/src/main/java/io/github/chinosk/gakumas/localify/ui/pages/subPages/AdvancedSettingsPage.kt
index c920b92..88dbd58 100644
--- a/app/src/main/java/io/github/chinosk/gakumas/localify/ui/pages/subPages/AdvancedSettingsPage.kt
+++ b/app/src/main/java/io/github/chinosk/gakumas/localify/ui/pages/subPages/AdvancedSettingsPage.kt
@@ -86,6 +86,10 @@ fun AdvanceSettingsPage(modifier: Modifier = Modifier,
                     GakuSwitch(modifier, stringResource(R.string.force_export_resource), checked = config.value.forceExportResource) {
                             v -> context?.onForceExportResourceChanged(v)
                     }
+
+                    GakuSwitch(modifier, stringResource(R.string.login_as_ios), checked = config.value.loginAsIOS) {
+                            v -> context?.onLoginAsIOSChanged(v)
+                    }
                 }
             }
 
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index 7811307..b95925c 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -50,6 +50,7 @@
     <string name="export_text">テキストをエクスポート</string>
     <string name="exposed_dropdown_menu_content_description">ドロップダウンメニューを表示</string>
     <string name="force_export_resource">リソースのアップデートを強制する</string>
+    <string name="login_as_ios">iOSとしてログイン</string>
     <string name="gakumas_localify">Gakumas Localify</string>
     <string name="game_patch">ゲームパッチ</string>
     <string name="graphic_settings">グラフィック設定</string>
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 1e78fbd..b856d71 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -16,6 +16,7 @@
     <string name="text_hook_test_mode">文本 hook 测试模式</string>
     <string name="export_text">导出文本</string>
     <string name="force_export_resource">启动后强制导出资源</string>
+    <string name="login_as_ios">以 iOS 登陆</string>
     <string name="max_high">极高</string>
     <string name="very_high">超高</string>
     <string name="hign">高</string>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index e1a455c..ed35cef 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -16,6 +16,7 @@
     <string name="text_hook_test_mode">Text Hook Test Mode</string>
     <string name="export_text">Export Text</string>
     <string name="force_export_resource">Force Update Resource</string>
+    <string name="login_as_ios">Login as iOS</string>
     <string name="max_high">Ultra</string>
     <string name="very_high">Very High</string>
     <string name="hign">High</string>