Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 93dd08049c | |||
| 8c1b105942 | |||
| ee390c249a | |||
| 55ab8136f3 | |||
| dd2f98c809 | |||
| 08ee73b2eb | |||
| 3b1f235e81 | |||
| 87f9c17352 | |||
| 79776ddb45 | |||
| e398ead7ba | |||
| f6938e8b8a | |||
| a2eb9d37f6 | |||
| a99eb85fdd | |||
| bd647edd48 | |||
| 77374d8b50 | |||
| a6be76cc3a | |||
| 8c56999da0 | |||
| 898b0b9235 |
@@ -21,10 +21,9 @@ android {
|
|||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId = "com.kain344.firefly_go_android"
|
applicationId = "com.kain344.firefly_go_android"
|
||||||
minSdk = 24
|
minSdk = 24
|
||||||
//noinspection OldTargetApi
|
|
||||||
targetSdk = 35
|
targetSdk = 35
|
||||||
versionCode = 1
|
versionCode = 2
|
||||||
versionName = "1.0"
|
versionName = "1.0.1"
|
||||||
|
|
||||||
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
|
||||||
@@ -101,4 +100,3 @@ dependencies {
|
|||||||
|
|
||||||
implementation(libs.slf4j.android)
|
implementation(libs.slf4j.android)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
BIN
Binary file not shown.
@@ -2,12 +2,22 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools">
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"
|
||||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
|
tools:ignore="ForegroundServicesPolicy" />
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
|
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"
|
||||||
|
tools:ignore="RequestInstallPackagesPolicy" />
|
||||||
<uses-permission android:name="android.permission.READ_LOGS"/>
|
<uses-permission android:name="android.permission.READ_LOGS"/>
|
||||||
|
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
|
||||||
|
tools:ignore="ScopedStorage" />
|
||||||
|
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
@@ -20,6 +30,7 @@
|
|||||||
android:requestLegacyExternalStorage="true"
|
android:requestLegacyExternalStorage="true"
|
||||||
android:theme="@style/Theme.FireflyGoAndroid"
|
android:theme="@style/Theme.FireflyGoAndroid"
|
||||||
tools:targetApi="31">
|
tools:targetApi="31">
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".MainActivity"
|
android:name=".MainActivity"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
@@ -32,9 +43,12 @@
|
|||||||
|
|
||||||
<service
|
<service
|
||||||
android:name=".GolangServerService"
|
android:name=".GolangServerService"
|
||||||
android:foregroundServiceType="dataSync"
|
android:foregroundServiceType="specialUse"
|
||||||
android:exported="false" />
|
android:exported="false">
|
||||||
|
<property
|
||||||
|
android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
|
||||||
|
android:value="Running local Golang TCP/UDP Server" />
|
||||||
|
</service>
|
||||||
|
|
||||||
<provider
|
<provider
|
||||||
android:name="androidx.core.content.FileProvider"
|
android:name="androidx.core.content.FileProvider"
|
||||||
|
|||||||
+248
-21
@@ -1,32 +1,32 @@
|
|||||||
{
|
{
|
||||||
"leader": 3,
|
"leader": 2,
|
||||||
"lineups": {
|
"lineups": {
|
||||||
"0": 1217,
|
"0": 1409,
|
||||||
"1": 1307,
|
"1": 1407,
|
||||||
"2": 1005,
|
"2": 1406,
|
||||||
"3": 1410
|
"3": 1403
|
||||||
},
|
},
|
||||||
"position": {
|
"position": {
|
||||||
"x": -30,
|
"x": -4030,
|
||||||
"z": -22750,
|
"z": -13006,
|
||||||
"y": -15000,
|
"y": 0,
|
||||||
"rot_y": 234288
|
"rot_y": 270000
|
||||||
},
|
},
|
||||||
"scene": {
|
"scene": {
|
||||||
"plane_id": 10000,
|
"plane_id": 10000,
|
||||||
"floor_id": 10000003,
|
"floor_id": 10000000,
|
||||||
"entry_id": 100000352
|
"entry_id": 100000104
|
||||||
},
|
},
|
||||||
"player_outfit": [
|
"player_outfit": [
|
||||||
1003
|
1003
|
||||||
],
|
],
|
||||||
"char_path": {
|
"char_path": {
|
||||||
"main": 8010,
|
"main": 8008,
|
||||||
"march_7": 1224
|
"march_7": 1224
|
||||||
},
|
},
|
||||||
"char_enhanced": {
|
"char_enhanced": {
|
||||||
"1004": 1,
|
"1004": 1,
|
||||||
"1005": 1,
|
"1005": 0,
|
||||||
"1006": 1,
|
"1006": 1,
|
||||||
"1102": 1,
|
"1102": 1,
|
||||||
"1205": 1,
|
"1205": 1,
|
||||||
@@ -39,17 +39,186 @@
|
|||||||
"challenge": {
|
"challenge": {
|
||||||
"challenge_id": 0,
|
"challenge_id": 0,
|
||||||
"skip_half": 0,
|
"skip_half": 0,
|
||||||
|
"random_seed": 0,
|
||||||
"blessings": [],
|
"blessings": [],
|
||||||
"is_in_challenge": false,
|
"is_in_challenge": false,
|
||||||
"current_stage_id": 30122121,
|
"current_stage_id": 0,
|
||||||
"path_resonance_id": 0,
|
"path_resonance_id": 0,
|
||||||
"maze_buff": 0,
|
"maze_buff": 0,
|
||||||
"first_lineup": [],
|
"first_lineup": [],
|
||||||
"second_lineup": []
|
"second_lineup": []
|
||||||
},
|
},
|
||||||
|
"challenge_tierce": {
|
||||||
|
"challenge_id": 0,
|
||||||
|
"current_stage_id": 0,
|
||||||
|
"maze_buff": 0,
|
||||||
|
"path_resonance_id": 0,
|
||||||
|
"is_in_challenge": false,
|
||||||
|
"is_single_stage": false,
|
||||||
|
"challenge_tierce_data": {
|
||||||
|
"20245": {
|
||||||
|
"stage_1": {
|
||||||
|
"blessing": 3031361,
|
||||||
|
"cycle_count": 0,
|
||||||
|
"battle_status": 1,
|
||||||
|
"DeadCount": 0,
|
||||||
|
"score": 40000,
|
||||||
|
"lineup": [
|
||||||
|
1407,
|
||||||
|
1413,
|
||||||
|
1415,
|
||||||
|
1409
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"stage_2": {
|
||||||
|
"blessing": 3031361,
|
||||||
|
"cycle_count": 0,
|
||||||
|
"battle_status": 1,
|
||||||
|
"DeadCount": 0,
|
||||||
|
"score": 40000,
|
||||||
|
"lineup": [
|
||||||
|
1310,
|
||||||
|
1225,
|
||||||
|
1321,
|
||||||
|
1222
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"stage_3": {
|
||||||
|
"blessing": 3031362,
|
||||||
|
"cycle_count": 0,
|
||||||
|
"battle_status": 1,
|
||||||
|
"DeadCount": 0,
|
||||||
|
"score": 40000,
|
||||||
|
"lineup": [
|
||||||
|
1506,
|
||||||
|
1502,
|
||||||
|
1501,
|
||||||
|
1217
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"30185": {
|
||||||
|
"stage_1": {
|
||||||
|
"blessing": 3111090,
|
||||||
|
"cycle_count": 0,
|
||||||
|
"battle_status": 1,
|
||||||
|
"DeadCount": 0,
|
||||||
|
"score": 3932,
|
||||||
|
"lineup": [
|
||||||
|
1501,
|
||||||
|
1502,
|
||||||
|
1414,
|
||||||
|
1506
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"stage_2": {
|
||||||
|
"blessing": 3111085,
|
||||||
|
"cycle_count": 0,
|
||||||
|
"battle_status": 1,
|
||||||
|
"DeadCount": 0,
|
||||||
|
"score": 3913,
|
||||||
|
"lineup": [
|
||||||
|
1310,
|
||||||
|
1225,
|
||||||
|
1303,
|
||||||
|
1321
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"stage_3": {
|
||||||
|
"blessing": 3111071,
|
||||||
|
"cycle_count": 0,
|
||||||
|
"battle_status": 1,
|
||||||
|
"DeadCount": 0,
|
||||||
|
"score": 4000,
|
||||||
|
"lineup": [
|
||||||
|
1415,
|
||||||
|
1413,
|
||||||
|
1407,
|
||||||
|
1409
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"5213": {
|
||||||
|
"stage_1": {
|
||||||
|
"blessing": 0,
|
||||||
|
"cycle_count": 0,
|
||||||
|
"battle_status": 1,
|
||||||
|
"DeadCount": 0,
|
||||||
|
"score": 0,
|
||||||
|
"lineup": [
|
||||||
|
1407,
|
||||||
|
1413,
|
||||||
|
1415,
|
||||||
|
1409
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"stage_2": {
|
||||||
|
"blessing": 0,
|
||||||
|
"cycle_count": 1,
|
||||||
|
"battle_status": 1,
|
||||||
|
"DeadCount": 0,
|
||||||
|
"score": 0,
|
||||||
|
"lineup": [
|
||||||
|
1310,
|
||||||
|
1321,
|
||||||
|
1225,
|
||||||
|
1222
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"stage_3": {
|
||||||
|
"blessing": 0,
|
||||||
|
"cycle_count": 0,
|
||||||
|
"battle_status": 1,
|
||||||
|
"DeadCount": 0,
|
||||||
|
"score": 0,
|
||||||
|
"lineup": [
|
||||||
|
1506,
|
||||||
|
1502,
|
||||||
|
1501,
|
||||||
|
1414
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"5313": {
|
||||||
|
"stage_1": {
|
||||||
|
"blessing": 0,
|
||||||
|
"cycle_count": 0,
|
||||||
|
"battle_status": 3,
|
||||||
|
"DeadCount": 0,
|
||||||
|
"score": 0,
|
||||||
|
"lineup": [
|
||||||
|
1510,
|
||||||
|
8001,
|
||||||
|
1004,
|
||||||
|
1414
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"stage_2": {
|
||||||
|
"blessing": 0,
|
||||||
|
"cycle_count": 0,
|
||||||
|
"battle_status": 0,
|
||||||
|
"DeadCount": 0,
|
||||||
|
"score": 0,
|
||||||
|
"lineup": [
|
||||||
|
1302
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"stage_3": {
|
||||||
|
"blessing": 0,
|
||||||
|
"cycle_count": 0,
|
||||||
|
"battle_status": 0,
|
||||||
|
"DeadCount": 0,
|
||||||
|
"score": 0,
|
||||||
|
"lineup": [
|
||||||
|
1321
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"challenge_peak": {
|
"challenge_peak": {
|
||||||
"current_mode": "Knight",
|
"current_mode": "Knight",
|
||||||
"group_id": 6,
|
"group_id": 8,
|
||||||
"is_in_challenge_peak": false,
|
"is_in_challenge_peak": false,
|
||||||
"challenge_peak_data": {
|
"challenge_peak_data": {
|
||||||
"1": {
|
"1": {
|
||||||
@@ -269,16 +438,16 @@
|
|||||||
"challenge_id": 604,
|
"challenge_id": 604,
|
||||||
"blessing": 3033053,
|
"blessing": 3033053,
|
||||||
"lineup": [
|
"lineup": [
|
||||||
1501,
|
1505,
|
||||||
1506,
|
1217,
|
||||||
1502,
|
1502,
|
||||||
1217
|
8001
|
||||||
],
|
],
|
||||||
"stage_id": 30506021,
|
"stage_id": 30506021,
|
||||||
"is_hard_mode": false
|
"is_hard_mode": false
|
||||||
},
|
},
|
||||||
"knight_data": {
|
"knight_data": {
|
||||||
"current_challenge_id": 603,
|
"current_challenge_id": 602,
|
||||||
"details_data": [
|
"details_data": [
|
||||||
{
|
{
|
||||||
"lineup": [
|
"lineup": [
|
||||||
@@ -309,6 +478,60 @@
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"7": {
|
||||||
|
"checkmate_data": {
|
||||||
|
"challenge_id": 704,
|
||||||
|
"blessing": 3033061,
|
||||||
|
"lineup": [
|
||||||
|
1505,
|
||||||
|
1502,
|
||||||
|
1414,
|
||||||
|
1410
|
||||||
|
],
|
||||||
|
"stage_id": 30507021,
|
||||||
|
"is_hard_mode": false
|
||||||
|
},
|
||||||
|
"knight_data": {
|
||||||
|
"current_challenge_id": 703,
|
||||||
|
"details_data": [
|
||||||
|
{
|
||||||
|
"lineup": [
|
||||||
|
1414
|
||||||
|
],
|
||||||
|
"stage_id": 30507011,
|
||||||
|
"challenge_id": 701
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"lineup": [
|
||||||
|
1501
|
||||||
|
],
|
||||||
|
"stage_id": 30507012,
|
||||||
|
"challenge_id": 702
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"lineup": [
|
||||||
|
1507,
|
||||||
|
1222
|
||||||
|
],
|
||||||
|
"stage_id": 30507013,
|
||||||
|
"challenge_id": 703
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"8": {
|
||||||
|
"checkmate_data": {
|
||||||
|
"challenge_id": 0,
|
||||||
|
"blessing": 0,
|
||||||
|
"lineup": null,
|
||||||
|
"stage_id": 0,
|
||||||
|
"is_hard_mode": false
|
||||||
|
},
|
||||||
|
"knight_data": {
|
||||||
|
"current_challenge_id": 0,
|
||||||
|
"details_data": null
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -328,7 +551,8 @@
|
|||||||
},
|
},
|
||||||
"cycle_count": 1,
|
"cycle_count": 1,
|
||||||
"stage_id": 30118121,
|
"stage_id": 30118121,
|
||||||
"mode": false
|
"mode": false,
|
||||||
|
"custom_lineup": []
|
||||||
},
|
},
|
||||||
"profile_data": {
|
"profile_data": {
|
||||||
"cur_chat_bubble_id": 220009,
|
"cur_chat_bubble_id": 220009,
|
||||||
@@ -339,6 +563,7 @@
|
|||||||
"cur_avatar_player_icon": 202034,
|
"cur_avatar_player_icon": 202034,
|
||||||
"cur_player_personal_card": 253001,
|
"cur_player_personal_card": 253001,
|
||||||
"cur_signature": "Firefly GO By Kain",
|
"cur_signature": "Firefly GO By Kain",
|
||||||
|
"cur_nickname": "Firefly GO",
|
||||||
"cur_display_avatar": [
|
"cur_display_avatar": [
|
||||||
1310,
|
1310,
|
||||||
1309,
|
1309,
|
||||||
@@ -350,7 +575,9 @@
|
|||||||
},
|
},
|
||||||
"skin_data": {
|
"skin_data": {
|
||||||
"1001": 1100101,
|
"1001": 1100101,
|
||||||
"1310": 1131001
|
"1310": 1131001,
|
||||||
|
"1407": 1140701,
|
||||||
|
"1415": 1141501
|
||||||
},
|
},
|
||||||
"extra_setting": {
|
"extra_setting": {
|
||||||
"censorship": false,
|
"censorship": false,
|
||||||
+9273
-6149
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,128 @@
|
|||||||
|
{
|
||||||
|
"CNBETAAndroid4.3.51": {
|
||||||
|
"asset_bundle_url": "https://autopatchos.starrails.com/asb/BetaLive/output_15261247_f6e6db2125cf_369da465b36faf",
|
||||||
|
"asset_bundle_url_b": "https://autopatchos.starrails.com/asb/BetaLive/output_15235885_6091fd15561a_83828f542dc1f3",
|
||||||
|
"ex_resource_url": "https://autopatchos.starrails.com/design_data/BetaLive/output_15265964_c2fbb1eb05fc_f2238199ee2b6e",
|
||||||
|
"lua_url": "https://autopatchos.starrails.com/lua/BetaLive/output_15242148_d40f856defc0_599b68a0adf7bd",
|
||||||
|
"ifix_url": "https://autopatchos.starrails.com/ifix/BetaLive/output_15265964_799df4f0ecef_5a94550ba64cff"
|
||||||
|
},
|
||||||
|
"CNBETAAndroid4.3.52": {
|
||||||
|
"asset_bundle_url": "https://autopatchos.starrails.com/asb/BetaLive/output_15305566_fea016d35145_54bbf8ab4009f5",
|
||||||
|
"asset_bundle_url_b": "https://autopatchos.starrails.com/asb/BetaLive/output_15305566_fea016d35145_54bbf8ab4009f5",
|
||||||
|
"ex_resource_url": "https://autopatchos.starrails.com/design_data/BetaLive/output_15318724_a7af31327e74_b3328eb95329b2",
|
||||||
|
"lua_url": "https://autopatchos.starrails.com/lua/BetaLive/output_15305751_09783637ccc4_d16f9c81138ab3",
|
||||||
|
"ifix_url": "https://autopatchos.starrails.com/ifix/BetaLive/output_15265964_799df4f0ecef_5a94550ba64cff"
|
||||||
|
},
|
||||||
|
"CNBETAAndroid4.3.53": {
|
||||||
|
"asset_bundle_url": "https://autopatchos.starrails.com/asb/BetaLive/output_15378434_99bffafdeff7_5d97713dcef07f",
|
||||||
|
"asset_bundle_url_b": "https://autopatchos.starrails.com/asb/BetaLive/output_15378434_99bffafdeff7_5d97713dcef07f",
|
||||||
|
"ex_resource_url": "https://autopatchos.starrails.com/design_data/BetaLive/output_15385668_07011a79dadf_1111728953724e",
|
||||||
|
"lua_url": "https://autopatchos.starrails.com/lua/BetaLive/output_15378559_7514340ac82f_70dad6c56b8bc7",
|
||||||
|
"ifix_url": "https://autopatchos.starrails.com/ifix/BetaLive/output_15384138_4e4be8cf97ac_1e3fcfa0a93bef"
|
||||||
|
},
|
||||||
|
"CNBETAWin4.3.51": {
|
||||||
|
"asset_bundle_url": "https://autopatchos.starrails.com/asb/BetaLive/output_15261247_f6e6db2125cf_369da465b36faf",
|
||||||
|
"asset_bundle_url_b": "https://autopatchos.starrails.com/asb/BetaLive/output_15235885_6091fd15561a_83828f542dc1f3",
|
||||||
|
"ex_resource_url": "https://autopatchos.starrails.com/design_data/BetaLive/output_15265964_c2fbb1eb05fc_f2238199ee2b6e",
|
||||||
|
"lua_url": "https://autopatchos.starrails.com/lua/BetaLive/output_15242148_d40f856defc0_599b68a0adf7bd",
|
||||||
|
"ifix_url": "https://autopatchos.starrails.com/ifix/BetaLive/output_15265964_799df4f0ecef_5a94550ba64cff"
|
||||||
|
},
|
||||||
|
"CNBETAWin4.3.52": {
|
||||||
|
"asset_bundle_url": "https://autopatchos.starrails.com/asb/BetaLive/output_15305566_fea016d35145_54bbf8ab4009f5",
|
||||||
|
"asset_bundle_url_b": "https://autopatchos.starrails.com/asb/BetaLive/output_15305566_fea016d35145_54bbf8ab4009f5",
|
||||||
|
"ex_resource_url": "https://autopatchos.starrails.com/design_data/BetaLive/output_15318724_a7af31327e74_b3328eb95329b2",
|
||||||
|
"lua_url": "https://autopatchos.starrails.com/lua/BetaLive/output_15305751_09783637ccc4_d16f9c81138ab3",
|
||||||
|
"ifix_url": "https://autopatchos.starrails.com/ifix/BetaLive/output_15265964_799df4f0ecef_5a94550ba64cff"
|
||||||
|
},
|
||||||
|
"CNBETAWin4.3.53": {
|
||||||
|
"asset_bundle_url": "https://autopatchos.starrails.com/asb/BetaLive/output_15378434_99bffafdeff7_5d97713dcef07f",
|
||||||
|
"asset_bundle_url_b": "https://autopatchos.starrails.com/asb/BetaLive/output_15378434_99bffafdeff7_5d97713dcef07f",
|
||||||
|
"ex_resource_url": "https://autopatchos.starrails.com/design_data/BetaLive/output_15385668_07011a79dadf_1111728953724e",
|
||||||
|
"lua_url": "https://autopatchos.starrails.com/lua/BetaLive/output_15378559_7514340ac82f_70dad6c56b8bc7",
|
||||||
|
"ifix_url": "https://autopatchos.starrails.com/ifix/BetaLive/output_15384138_4e4be8cf97ac_1e3fcfa0a93bef"
|
||||||
|
},
|
||||||
|
"CNBETAiOS4.3.51": {
|
||||||
|
"asset_bundle_url": "https://autopatchos.starrails.com/asb/BetaLive/output_15261247_f6e6db2125cf_369da465b36faf",
|
||||||
|
"asset_bundle_url_b": "https://autopatchos.starrails.com/asb/BetaLive/output_15235885_6091fd15561a_83828f542dc1f3",
|
||||||
|
"ex_resource_url": "https://autopatchos.starrails.com/design_data/BetaLive/output_15265964_c2fbb1eb05fc_f2238199ee2b6e",
|
||||||
|
"lua_url": "https://autopatchos.starrails.com/lua/BetaLive/output_15242148_d40f856defc0_599b68a0adf7bd",
|
||||||
|
"ifix_url": "https://autopatchos.starrails.com/ifix/BetaLive/output_15265964_799df4f0ecef_5a94550ba64cff"
|
||||||
|
},
|
||||||
|
"CNBETAiOS4.3.52": {
|
||||||
|
"asset_bundle_url": "https://autopatchos.starrails.com/asb/BetaLive/output_15305566_fea016d35145_54bbf8ab4009f5",
|
||||||
|
"asset_bundle_url_b": "https://autopatchos.starrails.com/asb/BetaLive/output_15305566_fea016d35145_54bbf8ab4009f5",
|
||||||
|
"ex_resource_url": "https://autopatchos.starrails.com/design_data/BetaLive/output_15318724_a7af31327e74_b3328eb95329b2",
|
||||||
|
"lua_url": "https://autopatchos.starrails.com/lua/BetaLive/output_15305751_09783637ccc4_d16f9c81138ab3",
|
||||||
|
"ifix_url": "https://autopatchos.starrails.com/ifix/BetaLive/output_15265964_799df4f0ecef_5a94550ba64cff"
|
||||||
|
},
|
||||||
|
"CNBETAiOS4.3.53": {
|
||||||
|
"asset_bundle_url": "https://autopatchos.starrails.com/asb/BetaLive/output_15378434_99bffafdeff7_5d97713dcef07f",
|
||||||
|
"asset_bundle_url_b": "https://autopatchos.starrails.com/asb/BetaLive/output_15378434_99bffafdeff7_5d97713dcef07f",
|
||||||
|
"ex_resource_url": "https://autopatchos.starrails.com/design_data/BetaLive/output_15385668_07011a79dadf_1111728953724e",
|
||||||
|
"lua_url": "https://autopatchos.starrails.com/lua/BetaLive/output_15378559_7514340ac82f_70dad6c56b8bc7",
|
||||||
|
"ifix_url": "https://autopatchos.starrails.com/ifix/BetaLive/output_15384138_4e4be8cf97ac_1e3fcfa0a93bef"
|
||||||
|
},
|
||||||
|
"OSBETAAndroid4.3.51": {
|
||||||
|
"asset_bundle_url": "https://autopatchos.starrails.com/asb/BetaLive/output_15261247_f6e6db2125cf_369da465b36faf",
|
||||||
|
"asset_bundle_url_b": "https://autopatchos.starrails.com/asb/BetaLive/output_15235885_6091fd15561a_83828f542dc1f3",
|
||||||
|
"ex_resource_url": "https://autopatchos.starrails.com/design_data/BetaLive/output_15265964_c2fbb1eb05fc_f2238199ee2b6e",
|
||||||
|
"lua_url": "https://autopatchos.starrails.com/lua/BetaLive/output_15242148_d40f856defc0_599b68a0adf7bd",
|
||||||
|
"ifix_url": "https://autopatchos.starrails.com/ifix/BetaLive/output_15265964_799df4f0ecef_5a94550ba64cff"
|
||||||
|
},
|
||||||
|
"OSBETAAndroid4.3.52": {
|
||||||
|
"asset_bundle_url": "https://autopatchos.starrails.com/asb/BetaLive/output_15305566_fea016d35145_54bbf8ab4009f5",
|
||||||
|
"asset_bundle_url_b": "https://autopatchos.starrails.com/asb/BetaLive/output_15305566_fea016d35145_54bbf8ab4009f5",
|
||||||
|
"ex_resource_url": "https://autopatchos.starrails.com/design_data/BetaLive/output_15318724_a7af31327e74_b3328eb95329b2",
|
||||||
|
"lua_url": "https://autopatchos.starrails.com/lua/BetaLive/output_15305751_09783637ccc4_d16f9c81138ab3",
|
||||||
|
"ifix_url": "https://autopatchos.starrails.com/ifix/BetaLive/output_15265964_799df4f0ecef_5a94550ba64cff"
|
||||||
|
},
|
||||||
|
"OSBETAAndroid4.3.53": {
|
||||||
|
"asset_bundle_url": "https://autopatchos.starrails.com/asb/BetaLive/output_15378434_99bffafdeff7_5d97713dcef07f",
|
||||||
|
"asset_bundle_url_b": "https://autopatchos.starrails.com/asb/BetaLive/output_15378434_99bffafdeff7_5d97713dcef07f",
|
||||||
|
"ex_resource_url": "https://autopatchos.starrails.com/design_data/BetaLive/output_15385668_07011a79dadf_1111728953724e",
|
||||||
|
"lua_url": "https://autopatchos.starrails.com/lua/BetaLive/output_15378559_7514340ac82f_70dad6c56b8bc7",
|
||||||
|
"ifix_url": "https://autopatchos.starrails.com/ifix/BetaLive/output_15384138_4e4be8cf97ac_1e3fcfa0a93bef"
|
||||||
|
},
|
||||||
|
"OSBETAWin4.3.51": {
|
||||||
|
"asset_bundle_url": "https://autopatchos.starrails.com/asb/BetaLive/output_15261247_f6e6db2125cf_369da465b36faf",
|
||||||
|
"asset_bundle_url_b": "https://autopatchos.starrails.com/asb/BetaLive/output_15235885_6091fd15561a_83828f542dc1f3",
|
||||||
|
"ex_resource_url": "https://autopatchos.starrails.com/design_data/BetaLive/output_15265964_c2fbb1eb05fc_f2238199ee2b6e",
|
||||||
|
"lua_url": "https://autopatchos.starrails.com/lua/BetaLive/output_15242148_d40f856defc0_599b68a0adf7bd",
|
||||||
|
"ifix_url": "https://autopatchos.starrails.com/ifix/BetaLive/output_15265964_799df4f0ecef_5a94550ba64cff"
|
||||||
|
},
|
||||||
|
"OSBETAWin4.3.52": {
|
||||||
|
"asset_bundle_url": "https://autopatchos.starrails.com/asb/BetaLive/output_15305566_fea016d35145_54bbf8ab4009f5",
|
||||||
|
"asset_bundle_url_b": "https://autopatchos.starrails.com/asb/BetaLive/output_15305566_fea016d35145_54bbf8ab4009f5",
|
||||||
|
"ex_resource_url": "https://autopatchos.starrails.com/design_data/BetaLive/output_15318724_a7af31327e74_b3328eb95329b2",
|
||||||
|
"lua_url": "https://autopatchos.starrails.com/lua/BetaLive/output_15305751_09783637ccc4_d16f9c81138ab3",
|
||||||
|
"ifix_url": "https://autopatchos.starrails.com/ifix/BetaLive/output_15265964_799df4f0ecef_5a94550ba64cff"
|
||||||
|
},
|
||||||
|
"OSBETAWin4.3.53": {
|
||||||
|
"asset_bundle_url": "https://autopatchos.starrails.com/asb/BetaLive/output_15378434_99bffafdeff7_5d97713dcef07f",
|
||||||
|
"asset_bundle_url_b": "https://autopatchos.starrails.com/asb/BetaLive/output_15378434_99bffafdeff7_5d97713dcef07f",
|
||||||
|
"ex_resource_url": "https://autopatchos.starrails.com/design_data/BetaLive/output_15385668_07011a79dadf_1111728953724e",
|
||||||
|
"lua_url": "https://autopatchos.starrails.com/lua/BetaLive/output_15378559_7514340ac82f_70dad6c56b8bc7",
|
||||||
|
"ifix_url": "https://autopatchos.starrails.com/ifix/BetaLive/output_15384138_4e4be8cf97ac_1e3fcfa0a93bef"
|
||||||
|
},
|
||||||
|
"OSBETAiOS4.3.51": {
|
||||||
|
"asset_bundle_url": "https://autopatchos.starrails.com/asb/BetaLive/output_15261247_f6e6db2125cf_369da465b36faf",
|
||||||
|
"asset_bundle_url_b": "https://autopatchos.starrails.com/asb/BetaLive/output_15235885_6091fd15561a_83828f542dc1f3",
|
||||||
|
"ex_resource_url": "https://autopatchos.starrails.com/design_data/BetaLive/output_15265964_c2fbb1eb05fc_f2238199ee2b6e",
|
||||||
|
"lua_url": "https://autopatchos.starrails.com/lua/BetaLive/output_15242148_d40f856defc0_599b68a0adf7bd",
|
||||||
|
"ifix_url": "https://autopatchos.starrails.com/ifix/BetaLive/output_15265964_799df4f0ecef_5a94550ba64cff"
|
||||||
|
},
|
||||||
|
"OSBETAiOS4.3.52": {
|
||||||
|
"asset_bundle_url": "https://autopatchos.starrails.com/asb/BetaLive/output_15305566_fea016d35145_54bbf8ab4009f5",
|
||||||
|
"asset_bundle_url_b": "https://autopatchos.starrails.com/asb/BetaLive/output_15305566_fea016d35145_54bbf8ab4009f5",
|
||||||
|
"ex_resource_url": "https://autopatchos.starrails.com/design_data/BetaLive/output_15318724_a7af31327e74_b3328eb95329b2",
|
||||||
|
"lua_url": "https://autopatchos.starrails.com/lua/BetaLive/output_15305751_09783637ccc4_d16f9c81138ab3",
|
||||||
|
"ifix_url": "https://autopatchos.starrails.com/ifix/BetaLive/output_15265964_799df4f0ecef_5a94550ba64cff"
|
||||||
|
},
|
||||||
|
"OSBETAiOS4.3.53": {
|
||||||
|
"asset_bundle_url": "https://autopatchos.starrails.com/asb/BetaLive/output_15378434_99bffafdeff7_5d97713dcef07f",
|
||||||
|
"asset_bundle_url_b": "https://autopatchos.starrails.com/asb/BetaLive/output_15378434_99bffafdeff7_5d97713dcef07f",
|
||||||
|
"ex_resource_url": "https://autopatchos.starrails.com/design_data/BetaLive/output_15385668_07011a79dadf_1111728953724e",
|
||||||
|
"lua_url": "https://autopatchos.starrails.com/lua/BetaLive/output_15378559_7514340ac82f_70dad6c56b8bc7",
|
||||||
|
"ifix_url": "https://autopatchos.starrails.com/ifix/BetaLive/output_15384138_4e4be8cf97ac_1e3fcfa0a93bef"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,10 +1,12 @@
|
|||||||
package com.example.firefly_go_android
|
package com.example.firefly_go_android
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
import android.app.NotificationChannel
|
import android.app.NotificationChannel
|
||||||
import android.app.NotificationManager
|
import android.app.NotificationManager
|
||||||
import android.app.PendingIntent
|
import android.app.PendingIntent
|
||||||
import android.app.Service
|
import android.app.Service
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
|
import android.content.pm.ServiceInfo
|
||||||
import android.graphics.BitmapFactory
|
import android.graphics.BitmapFactory
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.os.IBinder
|
import android.os.IBinder
|
||||||
@@ -16,6 +18,7 @@ import androidx.compose.runtime.setValue
|
|||||||
import androidx.core.app.NotificationCompat
|
import androidx.core.app.NotificationCompat
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import libandroid.Libandroid
|
import libandroid.Libandroid
|
||||||
|
import androidx.core.content.edit
|
||||||
|
|
||||||
class GolangServerService : Service() {
|
class GolangServerService : Service() {
|
||||||
|
|
||||||
@@ -33,9 +36,10 @@ class GolangServerService : Service() {
|
|||||||
createNotificationChannel()
|
createNotificationChannel()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressLint("WakelockTimeout")
|
||||||
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
||||||
if (isRunning) {
|
if (isRunning) {
|
||||||
Log.d(TAG, "❗ Server is already running")
|
Log.d(TAG, "Server is already running")
|
||||||
return START_STICKY
|
return START_STICKY
|
||||||
}
|
}
|
||||||
isRunning = true
|
isRunning = true
|
||||||
@@ -64,42 +68,63 @@ class GolangServerService : Service() {
|
|||||||
.setCategory(NotificationCompat.CATEGORY_SERVICE)
|
.setCategory(NotificationCompat.CATEGORY_SERVICE)
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
|
if (Build.VERSION.SDK_INT >= 34) {
|
||||||
|
startForeground(
|
||||||
|
NOTIFICATION_ID,
|
||||||
|
notification,
|
||||||
|
ServiceInfo.FOREGROUND_SERVICE_TYPE_SPECIAL_USE
|
||||||
|
)
|
||||||
|
} else if (Build.VERSION.SDK_INT >= 29) {
|
||||||
|
startForeground(
|
||||||
|
NOTIFICATION_ID,
|
||||||
|
notification,
|
||||||
|
ServiceInfo.FOREGROUND_SERVICE_TYPE_MANIFEST
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
startForeground(NOTIFICATION_ID, notification)
|
||||||
|
}
|
||||||
|
|
||||||
startForeground(NOTIFICATION_ID, notification)
|
// Khởi tạo WakeLock và WifiLock
|
||||||
|
|
||||||
try {
|
try {
|
||||||
val powerManager = getSystemService(POWER_SERVICE) as PowerManager
|
val powerManager = getSystemService(POWER_SERVICE) as PowerManager
|
||||||
wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "GolangServer::WakeLock")
|
wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "GolangServer::WakeLock")
|
||||||
wakeLock?.acquire(10*60*1000L)
|
wakeLock?.acquire()
|
||||||
Log.d(TAG, "✅ WakeLock acquired")
|
Log.d(TAG, "WakeLock acquired")
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
Log.e(TAG, "❌ WakeLock failed", e)
|
Log.e(TAG, "Lock failed", e)
|
||||||
}
|
}
|
||||||
|
|
||||||
Thread {
|
Thread {
|
||||||
try {
|
try {
|
||||||
val appDataPath = intent?.getStringExtra("appDataPath")
|
val sharedPrefs = getSharedPreferences("AppPrefs", MODE_PRIVATE)
|
||||||
|
var appDataPath = intent?.getStringExtra("appDataPath")
|
||||||
|
|
||||||
|
if (appDataPath != null) {
|
||||||
|
sharedPrefs.edit { putString("saved_app_data_path", appDataPath) }
|
||||||
|
} else {
|
||||||
|
appDataPath = sharedPrefs.getString("saved_app_data_path", null)
|
||||||
|
}
|
||||||
|
|
||||||
if (appDataPath != null) {
|
if (appDataPath != null) {
|
||||||
Libandroid.setPathDataLocal(appDataPath)
|
Libandroid.setPathDataLocal(appDataPath)
|
||||||
Log.d(TAG, "✅ Set path data: $appDataPath")
|
Log.d(TAG, "Set path data: $appDataPath")
|
||||||
} else {
|
} else {
|
||||||
isRunning = false
|
isRunning = false
|
||||||
Log.e(TAG, "❌ appDataPath not received in intent")
|
Log.e(TAG, "appDataPath not received and not found in SharedPreferences")
|
||||||
stopSelf()
|
stopSelf()
|
||||||
return@Thread
|
return@Thread
|
||||||
}
|
}
|
||||||
|
|
||||||
Libandroid.setServerRunning(true)
|
Libandroid.setServerRunning(true)
|
||||||
isRunning = true
|
isRunning = true
|
||||||
Log.d(TAG, "✅ Server started")
|
Log.d(TAG, "Server started")
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
isRunning = false
|
isRunning = false
|
||||||
Log.e(TAG, "❌ Error starting server", e)
|
Log.e(TAG, "Error starting server", e)
|
||||||
stopSelf()
|
stopSelf()
|
||||||
}
|
}
|
||||||
}.start()
|
}.start()
|
||||||
|
|
||||||
|
|
||||||
return START_STICKY
|
return START_STICKY
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -107,7 +132,6 @@ class GolangServerService : Service() {
|
|||||||
super.onDestroy()
|
super.onDestroy()
|
||||||
Log.d(TAG, "onDestroy called")
|
Log.d(TAG, "onDestroy called")
|
||||||
|
|
||||||
// 1. Tắt server
|
|
||||||
try {
|
try {
|
||||||
val result = Libandroid.setServerRunning(false)
|
val result = Libandroid.setServerRunning(false)
|
||||||
isRunning = false
|
isRunning = false
|
||||||
@@ -116,15 +140,16 @@ class GolangServerService : Service() {
|
|||||||
Log.e(TAG, "Error shutting down server", e)
|
Log.e(TAG, "Error shutting down server", e)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Nhả các khóa tài nguyên
|
||||||
try {
|
try {
|
||||||
wakeLock?.let {
|
wakeLock?.let {
|
||||||
if (it.isHeld) {
|
if (it.isHeld) {
|
||||||
it.release()
|
it.release()
|
||||||
Log.d(TAG, "✅ WakeLock released")
|
Log.d(TAG, "WakeLock released")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
Log.e(TAG, "❌ Failed to release WakeLock", e)
|
Log.e(TAG, "Failed to release Locks", e)
|
||||||
}
|
}
|
||||||
isRunning = false
|
isRunning = false
|
||||||
}
|
}
|
||||||
@@ -143,7 +168,7 @@ class GolangServerService : Service() {
|
|||||||
|
|
||||||
val manager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
|
val manager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
|
||||||
manager.createNotificationChannel(channel)
|
manager.createNotificationChannel(channel)
|
||||||
Log.d(TAG, "✅ Notification channel created")
|
Log.d(TAG, "Notification channel created")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4,8 +4,9 @@ import AutoUpdaterManager
|
|||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
|
import android.os.Build
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import android.os.Environment
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.activity.ComponentActivity
|
import androidx.activity.ComponentActivity
|
||||||
@@ -67,6 +68,11 @@ import kotlinx.coroutines.delay
|
|||||||
import org.json.JSONObject
|
import org.json.JSONObject
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.text.font.FontFamily
|
import androidx.compose.ui.text.font.FontFamily
|
||||||
|
import android.os.PowerManager
|
||||||
|
import android.provider.Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
|
||||||
|
import androidx.core.content.ContextCompat
|
||||||
|
import androidx.core.net.toUri
|
||||||
|
import android.provider.Settings
|
||||||
|
|
||||||
data class AppVersion(
|
data class AppVersion(
|
||||||
val latestVersion: String,
|
val latestVersion: String,
|
||||||
@@ -77,23 +83,62 @@ data class AppVersion(
|
|||||||
class MainActivity : ComponentActivity() {
|
class MainActivity : ComponentActivity() {
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
requestBatteryExemption(this)
|
||||||
|
requestInstallPermission(this)
|
||||||
|
requestStoragePermission(this)
|
||||||
|
|
||||||
val appDataPath = filesDir.absolutePath
|
val appDataPath = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "FireflyGo").absolutePath
|
||||||
val dataDir = File("$appDataPath/data")
|
val dataDir = File("$appDataPath/data")
|
||||||
dataDir.mkdirs()
|
if (!dataDir.exists()) dataDir.mkdirs()
|
||||||
|
|
||||||
copyRawToFile(this, dataDir, "data-in-game.json", R.raw.data_in_game_json)
|
val sharedPrefs = getSharedPreferences("AppPrefs", MODE_PRIVATE)
|
||||||
copyRawToFile(this, dataDir, "freesr-data.json", R.raw.freesr_data_json)
|
|
||||||
copyRawToFile(this, dataDir, "version.json", R.raw.version_json)
|
|
||||||
|
|
||||||
val jsonString = resources.openRawResource(R.raw.app_version_json).use { input ->
|
// Lấy thông tin Package
|
||||||
input.bufferedReader().use { it.readText() }
|
val packageInfo = if (Build.VERSION.SDK_INT >= 33) {
|
||||||
|
packageManager.getPackageInfo(packageName, android.content.pm.PackageManager.PackageInfoFlags.of(0))
|
||||||
|
} else {
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
|
packageManager.getPackageInfo(packageName, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
val jsonObject = JSONObject(jsonString)
|
val currentVersionCode = if (Build.VERSION.SDK_INT >= 33) packageInfo.longVersionCode else packageInfo.versionCode.toLong()
|
||||||
val latestVersion = jsonObject.getString("latest_version")
|
val currentLastUpdateTime = packageInfo.lastUpdateTime
|
||||||
val changelog = jsonObject.getString("changelog")
|
|
||||||
val apkUrl = jsonObject.getString("apk_url")
|
val savedVersionCode = sharedPrefs.getLong("last_version_code", 0L)
|
||||||
|
val savedLastUpdateTime = sharedPrefs.getLong("last_update_time", 0L)
|
||||||
|
|
||||||
|
val isFolderEmpty = dataDir.listFiles()?.isEmpty() ?: true
|
||||||
|
|
||||||
|
val shouldOverride = currentVersionCode > savedVersionCode ||
|
||||||
|
currentLastUpdateTime > savedLastUpdateTime ||
|
||||||
|
isFolderEmpty
|
||||||
|
|
||||||
|
Log.i("AppUpdate", "Code: $currentVersionCode, LastUpdate: $currentLastUpdateTime")
|
||||||
|
Log.i("AppUpdate", "SavedCode: $savedVersionCode, SavedUpdate: $savedLastUpdateTime")
|
||||||
|
Log.i("AppUpdate", "Should Override: $shouldOverride")
|
||||||
|
|
||||||
|
if (copyRawToFile(this, dataDir, shouldOverride)) {
|
||||||
|
if (shouldOverride) {
|
||||||
|
sharedPrefs.edit()
|
||||||
|
.putLong("last_version_code", currentVersionCode)
|
||||||
|
.putLong("last_update_time", currentLastUpdateTime)
|
||||||
|
.apply()
|
||||||
|
Log.i("AppUpdate", "Updated SharedPreferences with new version and time")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val jsonString = try {
|
||||||
|
resources.openRawResource(R.raw.app_version_json).use { input ->
|
||||||
|
input.bufferedReader().use { it.readText() }
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
"{}"
|
||||||
|
}
|
||||||
|
|
||||||
|
val jsonObject = if (jsonString.isNotEmpty()) JSONObject(jsonString) else JSONObject()
|
||||||
|
val latestVersion = jsonObject.optString("latest_version", "1.0.0")
|
||||||
|
val changelog = jsonObject.optString("changelog", "")
|
||||||
|
val apkUrl = jsonObject.optString("apk_url", "")
|
||||||
|
|
||||||
val appVersion = AppVersion(latestVersion, changelog, apkUrl)
|
val appVersion = AppVersion(latestVersion, changelog, apkUrl)
|
||||||
|
|
||||||
@@ -112,22 +157,82 @@ class MainActivity : ComponentActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@SuppressLint("BatteryLife")
|
||||||
|
|
||||||
fun copyRawToFile(context: Context, targetDir: File, fileName: String, resId: Int, override: Boolean = false) {
|
fun requestBatteryExemption(context: Context) {
|
||||||
val outFile = File(targetDir, fileName)
|
val powerManager = context.getSystemService(Context.POWER_SERVICE) as PowerManager
|
||||||
if (!outFile.exists() || override) {
|
if (!powerManager.isIgnoringBatteryOptimizations(context.packageName)) {
|
||||||
try {
|
val intent = Intent().apply {
|
||||||
context.resources.openRawResource(resId).use { input ->
|
action = ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
|
||||||
FileOutputStream(outFile).use { output ->
|
data = "package:${context.packageName}".toUri()
|
||||||
input.copyTo(output)
|
}
|
||||||
|
context.startActivity(intent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun requestInstallPermission(context: Context) {
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
if (!context.packageManager.canRequestPackageInstalls()) {
|
||||||
|
val intent = Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES).apply {
|
||||||
|
data = "package:${context.packageName}".toUri()
|
||||||
|
}
|
||||||
|
context.startActivity(intent)
|
||||||
|
Toast.makeText(context, "Please allow installing unknown apps to update", Toast.LENGTH_LONG).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun requestStoragePermission(context: Context) {
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
||||||
|
if (!Environment.isExternalStorageManager()) {
|
||||||
|
try {
|
||||||
|
val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION).apply {
|
||||||
|
data = "package:${context.packageName}".toUri()
|
||||||
|
}
|
||||||
|
context.startActivity(intent)
|
||||||
|
Toast.makeText(context, "Please allow All Files Access to load game data", Toast.LENGTH_LONG).show()
|
||||||
|
} catch (e: Exception) {
|
||||||
|
try {
|
||||||
|
val intent = Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION)
|
||||||
|
context.startActivity(intent)
|
||||||
|
} catch (ex: Exception) {
|
||||||
|
Log.e("StoragePermission", "Failed to open settings", ex)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Log.i("FileCopy", "${if (override) "✅ Overridden" else "✅ Copied"} $fileName to ${outFile.absolutePath}")
|
|
||||||
} catch (e: Exception) {
|
|
||||||
Log.e("FileCopy", "❌ Failed to copy $fileName: ${e.message}")
|
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
Log.i("FileCopy", "ℹ️ $fileName already exists at ${outFile.absolutePath}")
|
}
|
||||||
|
fun copyRawToFile(context: Context, targetDir: File, override: Boolean = false): Boolean {
|
||||||
|
val files = listOf(
|
||||||
|
"data-in-game.json" to "data-in-game.json",
|
||||||
|
"freesr-data.json" to "freesr-data.json",
|
||||||
|
"version.json" to "version.json"
|
||||||
|
)
|
||||||
|
|
||||||
|
return try {
|
||||||
|
if (!targetDir.exists()) targetDir.mkdirs()
|
||||||
|
|
||||||
|
for ((assetFile, outName) in files) {
|
||||||
|
val outFile = File(targetDir, outName)
|
||||||
|
|
||||||
|
if (outFile.exists() && !override) {
|
||||||
|
Log.i("CopyRaw", "Skipping $outName (already exists and no override)")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
Log.i("CopyRaw", "Copying $assetFile to ${outFile.absolutePath} (Override: $override)")
|
||||||
|
context.assets.open(assetFile).use { input ->
|
||||||
|
FileOutputStream(outFile).use { output ->
|
||||||
|
input.copyTo(output)
|
||||||
|
output.fd.sync()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
true
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Log.e("CopyRaw", "Error copying asset file: ${e.message}", e)
|
||||||
|
false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -136,18 +241,18 @@ fun removeFile(targetDir: File, fileName: String): Boolean {
|
|||||||
return if (file.exists()) {
|
return if (file.exists()) {
|
||||||
try {
|
try {
|
||||||
if (file.delete()) {
|
if (file.delete()) {
|
||||||
Log.i("FileRemove", "🗑️ Removed $fileName from ${file.absolutePath}")
|
Log.i("FileRemove", "Removed $fileName from ${file.absolutePath}")
|
||||||
true
|
true
|
||||||
} else {
|
} else {
|
||||||
Log.e("FileRemove", "❌ Failed to remove $fileName from ${file.absolutePath}")
|
Log.e("FileRemove", "Failed to remove $fileName from ${file.absolutePath}")
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
Log.e("FileRemove", "❌ Error removing $fileName: ${e.message}")
|
Log.e("FileRemove", "Error removing $fileName: ${e.message}")
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Log.i("FileRemove", "ℹ️ $fileName does not exist in ${targetDir.absolutePath}")
|
Log.i("FileRemove", "$fileName does not exist in ${targetDir.absolutePath}")
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -239,7 +344,7 @@ fun ServerControlScreen(appDataPath: String, dataDir: File, appVersion: AppVersi
|
|||||||
if (!isRunning) {
|
if (!isRunning) {
|
||||||
val intent = Intent(context, GolangServerService::class.java)
|
val intent = Intent(context, GolangServerService::class.java)
|
||||||
intent.putExtra("appDataPath", appDataPath)
|
intent.putExtra("appDataPath", appDataPath)
|
||||||
context.startService(intent)
|
ContextCompat.startForegroundService(context, intent)
|
||||||
} else {
|
} else {
|
||||||
context.stopService(Intent(context, GolangServerService::class.java))
|
context.stopService(Intent(context, GolangServerService::class.java))
|
||||||
}
|
}
|
||||||
@@ -272,7 +377,8 @@ fun ServerControlScreen(appDataPath: String, dataDir: File, appVersion: AppVersi
|
|||||||
|
|
||||||
// Widget icons row
|
// Widget icons row
|
||||||
Row(
|
Row(
|
||||||
horizontalArrangement = Arrangement.spacedBy(32.dp),
|
modifier = Modifier.fillMaxWidth(0.85f),
|
||||||
|
horizontalArrangement = Arrangement.SpaceEvenly,
|
||||||
verticalAlignment = Alignment.CenterVertically
|
verticalAlignment = Alignment.CenterVertically
|
||||||
) {
|
) {
|
||||||
|
|
||||||
@@ -280,6 +386,7 @@ fun ServerControlScreen(appDataPath: String, dataDir: File, appVersion: AppVersi
|
|||||||
Column(
|
Column(
|
||||||
horizontalAlignment = Alignment.CenterHorizontally,
|
horizontalAlignment = Alignment.CenterHorizontally,
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
|
.width(80.dp)
|
||||||
.clickable { showUpdateDialog = true }
|
.clickable { showUpdateDialog = true }
|
||||||
.background(
|
.background(
|
||||||
Color.White.copy(alpha = 0.8f),
|
Color.White.copy(alpha = 0.8f),
|
||||||
@@ -307,6 +414,7 @@ fun ServerControlScreen(appDataPath: String, dataDir: File, appVersion: AppVersi
|
|||||||
Column(
|
Column(
|
||||||
horizontalAlignment = Alignment.CenterHorizontally,
|
horizontalAlignment = Alignment.CenterHorizontally,
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
|
.width(80.dp)
|
||||||
.clickable { showResetDialog = true }
|
.clickable { showResetDialog = true }
|
||||||
.background(
|
.background(
|
||||||
Color.White.copy(alpha = 0.8f),
|
Color.White.copy(alpha = 0.8f),
|
||||||
@@ -334,6 +442,7 @@ fun ServerControlScreen(appDataPath: String, dataDir: File, appVersion: AppVersi
|
|||||||
Column(
|
Column(
|
||||||
horizontalAlignment = Alignment.CenterHorizontally,
|
horizontalAlignment = Alignment.CenterHorizontally,
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
|
.width(80.dp)
|
||||||
.clickable {
|
.clickable {
|
||||||
showLogs = true // mở popup log
|
showLogs = true // mở popup log
|
||||||
}
|
}
|
||||||
@@ -382,9 +491,7 @@ fun ServerControlScreen(appDataPath: String, dataDir: File, appVersion: AppVersi
|
|||||||
onClick = {
|
onClick = {
|
||||||
showResetDialog = false
|
showResetDialog = false
|
||||||
try {
|
try {
|
||||||
copyRawToFile(context, dataDir, "data-in-game.json", R.raw.data_in_game_json, true)
|
copyRawToFile(context, dataDir, true)
|
||||||
copyRawToFile(context, dataDir, "freesr-data.json", R.raw.freesr_data_json, true)
|
|
||||||
copyRawToFile(context, dataDir, "version.json", R.raw.version_json, true)
|
|
||||||
Toast.makeText(context, "Data has been reset successfully", Toast.LENGTH_SHORT).show()
|
Toast.makeText(context, "Data has been reset successfully", Toast.LENGTH_SHORT).show()
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
Toast.makeText(context, "Reset failed: ${e.message}", Toast.LENGTH_SHORT).show()
|
Toast.makeText(context, "Reset failed: ${e.message}", Toast.LENGTH_SHORT).show()
|
||||||
@@ -568,7 +675,7 @@ fun AutoUpdateDialog(
|
|||||||
val context = LocalContext.current
|
val context = LocalContext.current
|
||||||
val autoUpdaterManager = AutoUpdaterManager(context)
|
val autoUpdaterManager = AutoUpdaterManager(context)
|
||||||
var update by remember { mutableStateOf<UpdateFeatures?>(null) }
|
var update by remember { mutableStateOf<UpdateFeatures?>(null) }
|
||||||
var progress by remember { mutableIntStateOf(0) }
|
var progress by remember { mutableStateOf(0) }
|
||||||
var showDialog by remember { mutableStateOf(false) }
|
var showDialog by remember { mutableStateOf(false) }
|
||||||
var isDownloading by remember { mutableStateOf(false) }
|
var isDownloading by remember { mutableStateOf(false) }
|
||||||
var downloadComplete by remember { mutableStateOf(false) }
|
var downloadComplete by remember { mutableStateOf(false) }
|
||||||
@@ -610,11 +717,6 @@ fun AutoUpdateDialog(
|
|||||||
LaunchedEffect(progress) {
|
LaunchedEffect(progress) {
|
||||||
if (progress >= 100 && isDownloading) {
|
if (progress >= 100 && isDownloading) {
|
||||||
downloadComplete = true
|
downloadComplete = true
|
||||||
|
|
||||||
removeFile(dataDir, "data-in-game.json" )
|
|
||||||
removeFile(dataDir, "freesr-data.json")
|
|
||||||
removeFile(dataDir, "version.json")
|
|
||||||
delay(500)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"latest_version": "4.1.1-01",
|
"latest_version": "4.3.3-01",
|
||||||
"changelog": "UPDATE: 4.1.51",
|
"changelog": "UPDATE: 4.3.5X",
|
||||||
"apk_url": "https://git.kain.io.vn/Firefly-Shelter/FireflyGo_Android/releases/download/4.1.1-01/firefly_go_android.apk"
|
"apk_url": "https://git.kain.io.vn/Firefly-Shelter/FireflyGo_Android/releases/download/4.3.3-01/firefly_go_android.apk"
|
||||||
}
|
}
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
{
|
|
||||||
"CNBETAAndroid4.1.51": {
|
|
||||||
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_14372365_fa78e03ad599_36972b4e3bb553",
|
|
||||||
"asset_bundle_url_b": "https://autopatchcn.bhsr.com/asb/BetaLive/output_14352532_e3dee8767e70_9fd758f12171f5",
|
|
||||||
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_14394020_12e3f0c6a002_07566508dd1394",
|
|
||||||
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_14358961_e055a63b3c34_b199a0234548b5",
|
|
||||||
"ifix_url": "https://autopatchcn.bhsr.com/ifix/BetaLive/output_14374543_04d971175704_ab00cb3f54bb00"
|
|
||||||
},
|
|
||||||
"CNBETAWin4.1.51": {
|
|
||||||
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_14372365_fa78e03ad599_36972b4e3bb553",
|
|
||||||
"asset_bundle_url_b": "https://autopatchcn.bhsr.com/asb/BetaLive/output_14352532_e3dee8767e70_9fd758f12171f5",
|
|
||||||
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_14394020_12e3f0c6a002_07566508dd1394",
|
|
||||||
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_14358961_e055a63b3c34_b199a0234548b5",
|
|
||||||
"ifix_url": "https://autopatchcn.bhsr.com/ifix/BetaLive/output_14374543_04d971175704_ab00cb3f54bb00"
|
|
||||||
},
|
|
||||||
"CNBETAiOS4.1.51": {
|
|
||||||
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_14372365_fa78e03ad599_36972b4e3bb553",
|
|
||||||
"asset_bundle_url_b": "https://autopatchcn.bhsr.com/asb/BetaLive/output_14352532_e3dee8767e70_9fd758f12171f5",
|
|
||||||
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_14394020_12e3f0c6a002_07566508dd1394",
|
|
||||||
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_14358961_e055a63b3c34_b199a0234548b5",
|
|
||||||
"ifix_url": "https://autopatchcn.bhsr.com/ifix/BetaLive/output_14374543_04d971175704_ab00cb3f54bb00"
|
|
||||||
},
|
|
||||||
"OSBETAAndroid4.1.51": {
|
|
||||||
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_14372365_fa78e03ad599_36972b4e3bb553",
|
|
||||||
"asset_bundle_url_b": "https://autopatchcn.bhsr.com/asb/BetaLive/output_14352532_e3dee8767e70_9fd758f12171f5",
|
|
||||||
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_14394020_12e3f0c6a002_07566508dd1394",
|
|
||||||
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_14358961_e055a63b3c34_b199a0234548b5",
|
|
||||||
"ifix_url": "https://autopatchcn.bhsr.com/ifix/BetaLive/output_14374543_04d971175704_ab00cb3f54bb00"
|
|
||||||
},
|
|
||||||
"OSBETAWin4.1.51": {
|
|
||||||
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_14372365_fa78e03ad599_36972b4e3bb553",
|
|
||||||
"asset_bundle_url_b": "https://autopatchcn.bhsr.com/asb/BetaLive/output_14352532_e3dee8767e70_9fd758f12171f5",
|
|
||||||
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_14394020_12e3f0c6a002_07566508dd1394",
|
|
||||||
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_14358961_e055a63b3c34_b199a0234548b5",
|
|
||||||
"ifix_url": "https://autopatchcn.bhsr.com/ifix/BetaLive/output_14374543_04d971175704_ab00cb3f54bb00"
|
|
||||||
},
|
|
||||||
"OSBETAiOS4.1.51": {
|
|
||||||
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_14372365_fa78e03ad599_36972b4e3bb553",
|
|
||||||
"asset_bundle_url_b": "https://autopatchcn.bhsr.com/asb/BetaLive/output_14352532_e3dee8767e70_9fd758f12171f5",
|
|
||||||
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_14394020_12e3f0c6a002_07566508dd1394",
|
|
||||||
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_14358961_e055a63b3c34_b199a0234548b5",
|
|
||||||
"ifix_url": "https://autopatchcn.bhsr.com/ifix/BetaLive/output_14374543_04d971175704_ab00cb3f54bb00"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
## - UPDATE: Support 4.1.5X
|
## - UPDATE: Support 4.3.5X
|
||||||
+2
-2
@@ -1,4 +1,4 @@
|
|||||||
{
|
{
|
||||||
"tag": "4.1.1-01",
|
"tag": "4.3.3-01",
|
||||||
"title": "PreBuild Version 4.1.51 - 01"
|
"title": "PreBuild Version 4.3.53 - 01"
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user