Compare commits

..

71 Commits

Author SHA1 Message Date
Kain344 8c1b105942 feat: fix bug
Build / build (push) Successful in 5m3s
2026-06-10 10:23:04 +07:00
Kain344 ee390c249a feat: fix bug
Build / build (push) Successful in 10m28s
2026-06-10 10:13:47 +07:00
Kain344 55ab8136f3 feat: update version to 4.3.2-01 and changelog
Build / build (push) Successful in 5m13s
2026-06-09 19:32:34 +07:00
Kain344 dd2f98c809 feat: optimaze
Build / build (push) Successful in 5m41s
2026-06-07 13:20:59 +07:00
Kain344 08ee73b2eb feat: update data
Build / build (push) Successful in 5m32s
2026-06-04 08:39:19 +07:00
Kain344 3b1f235e81 feat: update data
Build / build (push) Has been cancelled
2026-06-04 08:35:14 +07:00
Kain344 87f9c17352 UPDATE: 4.2.0
Build / build (push) Successful in 5m10s
2026-04-22 08:32:05 +07:00
Kain344 79776ddb45 UPDATE: new data
Build / build (push) Successful in 5m15s
2026-04-16 11:29:55 +07:00
Kain344 e398ead7ba UPDATE: Support custom lineup
Build / build (push) Successful in 5m32s
2026-04-12 17:16:00 +07:00
Kain344 f6938e8b8a FIX: fix stuck when replace lineup
Build / build (push) Successful in 5m22s
2026-04-07 20:46:46 +07:00
Kain344 a2eb9d37f6 UPDATE: v4
Build / build (push) Successful in 10m49s
2026-04-07 16:23:40 +07:00
Kain344 a99eb85fdd UPDATE: Real map fix
Build / build (push) Successful in 5m24s
2026-04-04 00:11:40 +07:00
Kain344 bd647edd48 UPDATE: Fix bug
Build / build (push) Successful in 5m18s
2026-04-03 18:01:15 +07:00
Kain344 77374d8b50 UPDATE: Fix bug 2026-04-03 18:00:54 +07:00
Kain344 a6be76cc3a UPDATE: Fix load map
Build / build (push) Successful in 5m18s
2026-04-02 01:09:45 +07:00
Kain344 8c56999da0 UPDATE: New data
Build / build (push) Successful in 5m40s
2026-03-31 12:38:21 +07:00
Kain344 898b0b9235 UPDATE: Fix something
Build / build (push) Successful in 5m49s
2026-03-29 12:38:39 +07:00
Kain344 2d74e99b32 UPDATE: 4.1.5X
Build / build (push) Successful in 5m56s
2026-03-20 02:51:29 +07:00
Kain344 988eeb2dd9 UPDATE: 4.0.5X
Build / build (push) Successful in 10m25s
2026-03-16 16:51:31 +07:00
Kain344 f64f690a0a UPDATE: 3.7.52
Build / build (push) Successful in 13m0s
2025-11-11 21:04:25 +07:00
Kain344 b0c4a7e05a UPDATE: Support TCP, Apply Singleton pattern, Replace reflection with Type Factory + sync.Pool for optimization, Optimize file release process
Build / build (push) Successful in 8m47s
2025-10-19 13:20:56 +07:00
Kain344 0a44f56c2f Re-optima apk
Build / build (push) Successful in 6m3s
2025-10-18 09:13:43 +07:00
Kain344 527c8176e4 FIX: Update new resource
Build / build (push) Successful in 7m18s
2025-10-17 12:31:30 +07:00
Kain344 a54219b781 FIX: Update new resource
Build / build (push) Failing after 3m37s
2025-10-17 12:24:53 +07:00
Kain344 84cf16c3bf UPDATE: Update to 3.6.54
Build / build (push) Failing after 6m2s
2025-10-17 10:47:09 +07:00
Kain344 becf6779f7 Add CI/CD
Build / build (push) Successful in 8m55s
2025-10-08 21:51:08 +07:00
Kain344 d61b2aa907 Add CI/CD
Build / build (push) Failing after 5m40s
2025-10-08 20:51:48 +07:00
Kain344 534c08c70a Add CI/CD
Build / build (push) Has been cancelled
2025-10-08 19:51:05 +07:00
Kain344 bc3e6f514a Add CI/CD
Build / build (push) Failing after 8m14s
2025-10-08 19:29:42 +07:00
Kain344 2469b9ff83 Add CI/CD
Build / build (push) Failing after 9m7s
2025-10-08 19:15:26 +07:00
Kain344 f3abdff971 Add CI/CD
Build / build (push) Has been cancelled
2025-10-08 19:11:38 +07:00
Kain344 af1b71f929 Add CI/CD
Build / build (push) Failing after 7m20s
2025-10-08 19:00:23 +07:00
Kain344 4146f260ac Add CI/CD
Build / build (push) Failing after 6m29s
2025-10-08 18:00:20 +07:00
Kain344 7c5200f838 Add CI/CD
Build / build (push) Failing after 2m56s
2025-10-08 17:42:30 +07:00
Kain344 17d6856f58 Add CI/CD
Build / build (push) Failing after 4m3s
2025-10-08 17:32:49 +07:00
Kain344 2ba164a05c Add CI/CD
Build / build (push) Failing after 6m11s
2025-10-08 17:23:30 +07:00
Kain344 ecd02b8885 Add CI/CD
Build / build (push) Failing after 9m16s
2025-10-08 17:11:26 +07:00
Kain344 08caef28ab Add CI/CD
Build / build (push) Has been cancelled
2025-10-08 17:09:26 +07:00
Kain344 b587da0b9a Add CI/CD
Build / build (push) Has been cancelled
2025-10-08 16:52:32 +07:00
Kain344 0f7748a1df Add CI/CD
Build / build (push) Failing after 5m7s
2025-10-08 16:47:19 +07:00
Kain344 2a2159eb8a Add CI/CD
Build / build (push) Has been cancelled
2025-10-08 16:27:52 +07:00
Kain344 866de7a49e Add CI/CD
Build / build (push) Failing after 27s
2025-10-08 16:27:05 +07:00
Kain344 c49be0b2e7 Add CI/CD
Build / build (push) Failing after 29s
2025-10-08 16:19:25 +07:00
Kain344 00155e3619 Add CI/CD
Build / build (push) Failing after 27s
2025-10-08 16:14:26 +07:00
Kain344 6a9b6bc3a8 Add CI/CD
Build / build (push) Failing after 28s
2025-10-08 16:11:22 +07:00
Kain344 e7b7751fbb Add CI/CD
Build / build (push) Failing after 13m27s
2025-10-08 14:04:47 +07:00
Kain344 66f6ef6cec Add CI/CD
Build / build (push) Failing after 3m31s
2025-10-08 13:36:07 +07:00
Kain344 1d149bfa19 Add CI/CD
Build / build (push) Has been cancelled
2025-10-08 13:31:03 +07:00
Kain344 707f7adbeb Add CI/CD
Build / build (push) Failing after 4m26s
2025-10-08 13:21:11 +07:00
Kain344 b9f73f0d0f Add CI/CD
Build / build (push) Failing after 3m59s
2025-10-08 13:01:38 +07:00
Kain344 2f191a2c41 Add CI/CD
Build / build (push) Failing after 5m8s
2025-10-08 12:44:45 +07:00
Kain344 47f3f1f55d Add CI/CD
Build / build (push) Failing after 9m53s
2025-10-08 12:28:39 +07:00
Kain344 9399dbe051 Add CI/CD
Build / build (push) Failing after 6m43s
2025-10-08 12:02:22 +07:00
Kain344 a044ca8189 Add CI/CD
Build / build (push) Failing after 5m20s
2025-10-08 11:48:31 +07:00
Kain344 67e06fd017 Add CI/CD
Build / build (push) Failing after 3m30s
2025-10-08 11:26:43 +07:00
Kain344 629e0cb456 Add CI/CD
Build / build (push) Failing after 4m55s
2025-10-08 11:17:28 +07:00
Kain344 4135f02885 Add CI/CD
Build / build (push) Failing after 3m18s
2025-10-08 11:01:09 +07:00
Kain344 6149ff55ab FIX: Fix sync data 2025-10-04 22:14:57 +07:00
Kain344 7722e5fa70 UPDATE: Re-optimize performance 2025-10-04 21:16:44 +07:00
Kain344 dafb6aba1b UPDATE: New res 2025-10-03 22:03:27 +07:00
Kain344 3e967d7bed UPDATE: New res 2025-10-03 22:02:57 +07:00
Kain344 c75207f8e1 UPDATE: Extra setting 2025-10-02 23:37:14 +07:00
Kain344 3871dc8677 FIX: Fix env 2025-09-30 12:06:51 +07:00
Kain344 72dc9b238f UPDATE: Update new link 2025-09-30 11:15:49 +07:00
Kain344 edf158028e UPDATE: apk link 2025-09-30 10:30:40 +07:00
Kain344 e21b59b9b1 UPDATE: Update to 3.6.52 2025-09-30 10:10:06 +07:00
Kain344 4c10a53229 UPDATE: Fix bug, update libs 2025-09-02 20:00:36 +07:00
Kain344 e61bb39fc5 UPDATE: Update for v4 2025-09-02 14:18:06 +07:00
Kain344 8f86f3ea61 UPDATE: Add self update, reset data, logs 2025-08-25 09:56:01 +07:00
Kain344 d57f7c024b UPDATE: Add self update, reset data, logs 2025-08-25 09:54:12 +07:00
Kain344 aec3601f2a UPDATE: Add self update, reset data, logs 2025-08-25 09:52:03 +07:00
41 changed files with 13138 additions and 4481 deletions
+61
View File
@@ -0,0 +1,61 @@
name: Build
run-name: ${{ gitea.actor }} build 🚀
on:
push:
branches:
- master
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Set Up JDK
uses: actions/setup-java@v4
with:
distribution: 'zulu'
java-version: '17'
- name: Setup Android SDK
uses: amyu/setup-android@v5
with:
cache-disabled: true
- name: Grant execute permissions
run: |
chmod +x ./gradlew
chmod +x ./script/release-uploader
- name: Download AAR manually
run: |
FILE="app/libs/firefly-go.aar"
URL="https://git.kain.io.vn/Firefly-Shelter/FireflyGo_Android/media/branch/master/app/libs/firefly-go.aar"
echo "📥 Downloading $FILE from $URL"
curl -L -o "$FILE" "$URL"
- name: Build signed release APK
env:
KEYSTORE_PATH: ${{ github.workspace }}/KeyStore.jks
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
run: |
./gradlew assembleRelease \
-Pandroid.injected.signing.store.file=$KEYSTORE_PATH \
-Pandroid.injected.signing.store.password=$KEYSTORE_PASSWORD \
-Pandroid.injected.signing.key.alias=$KEY_ALIAS \
-Pandroid.injected.signing.key.password=$KEY_PASSWORD
- name: Find and rename release APK
run: |
APK_FILE=$(ls app/build/outputs/apk/release/*.apk | head -n 1)
echo "Found APK: $APK_FILE"
mv "$APK_FILE" app/build/outputs/apk/release/firefly_go_android.apk
- name: Upload release
env:
REPO_TOKEN: ${{ secrets.REPO_TOKEN }}
run: script/release-uploader -token=$REPO_TOKEN -release-url="https://git.kain.io.vn/api/v1/repos/Firefly-Shelter/FireflyGo_Android/releases" -files="app/build/outputs/apk/release/firefly_go_android.apk"
+1
View File
@@ -15,3 +15,4 @@
.externalNativeBuild .externalNativeBuild
.cxx .cxx
local.properties local.properties
.history/
Generated
+1 -1
View File
@@ -1 +1 @@
FireflyPsAndorid FireflyGoAndroid
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="CompilerConfiguration"> <component name="CompilerConfiguration">
<bytecodeTargetLevel target="21" /> <bytecodeTargetLevel target="17" />
</component> </component>
</project> </project>
+13
View File
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DeviceTable">
<option name="columnSorters">
<list>
<ColumnSorterState>
<option name="column" value="Name" />
<option name="order" value="ASCENDING" />
</ColumnSorterState>
</list>
</option>
</component>
</project>
+1 -1
View File
@@ -6,7 +6,6 @@
<GradleProjectSettings> <GradleProjectSettings>
<option name="testRunner" value="CHOOSE_PER_TEST" /> <option name="testRunner" value="CHOOSE_PER_TEST" />
<option name="externalProjectPath" value="$PROJECT_DIR$" /> <option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" />
<option name="modules"> <option name="modules">
<set> <set>
<option value="$PROJECT_DIR$" /> <option value="$PROJECT_DIR$" />
@@ -15,5 +14,6 @@
</option> </option>
</GradleProjectSettings> </GradleProjectSettings>
</option> </option>
<option name="parallelModelFetch" value="true" />
</component> </component>
</project> </project>
+8
View File
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="MarkdownSettings">
<option name="previewPanelProviderInfo">
<ProviderInfo name="Compose (experimental)" className="com.intellij.markdown.compose.preview.ComposePanelProvider" />
</option>
</component>
</project>
+1 -1
View File
@@ -1,6 +1,6 @@
<project version="4"> <project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" /> <component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="jbr-21" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_17" project-jdk-name="jbr-21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" /> <output url="file://$PROJECT_DIR$/build/classes" />
</component> </component>
<component name="ProjectType"> <component name="ProjectType">
+71 -29
View File
@@ -1,60 +1,102 @@
@file:Suppress("UnstableApiUsage")
plugins { plugins {
alias(libs.plugins.android.application) alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.android) alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.compose) alias(libs.plugins.kotlin.compose)
} }
kotlin {
jvmToolchain(17)
}
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(17))
}
}
android { android {
namespace = "com.example.fireflypsandorid" namespace = "com.example.firefly_go_android"
compileSdk = 35 compileSdk = 36
defaultConfig { defaultConfig {
applicationId = "com.example.fireflypsandorid" applicationId = "com.kain344.firefly_go_android"
minSdk = 24 minSdk = 24
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"
} }
buildTypes { buildTypes {
release { release {
isMinifyEnabled = false isMinifyEnabled = true
isShrinkResources = true
proguardFiles( proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"), getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro" "proguard-rules.pro"
) )
ndk {
abiFilters.addAll(listOf("arm64-v8a"))
}
} }
} }
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = "11"
}
buildFeatures { buildFeatures {
compose = true compose = true
viewBinding = true
}
composeOptions {
kotlinCompilerExtensionVersion = "1.5.0"
}
buildToolsVersion = "36.0.0"
ndkVersion = "27.2.12479018"
dependenciesInfo {
includeInApk = false
includeInBundle = false
} }
} }
dependencies { dependencies {
implementation(libs.androidx.core.ktx) implementation(libs.androidx.core.ktx)
implementation(libs.androidx.lifecycle.runtime.ktx) implementation(libs.androidx.lifecycle.runtime.ktx.v293)
implementation(libs.androidx.activity.compose) implementation(libs.androidx.activity.compose.v1101)
implementation(platform(libs.androidx.compose.bom)) // Compose UI
implementation(libs.androidx.ui) implementation(libs.ui)
implementation(libs.androidx.ui.graphics) implementation(libs.ui.graphics)
implementation(libs.androidx.ui.tooling.preview) implementation(libs.ui.tooling.preview)
implementation(libs.androidx.material3)
// Foundation & Animation
implementation(libs.androidx.foundation)
implementation(libs.androidx.animation)
implementation(libs.androidx.animation.core)
// Material & Material3
implementation(libs.androidx.material)
implementation(libs.androidx.material.icons.extended)
implementation(libs.material3)
implementation(libs.androidx.material3.window.size.class1)
// Auto updater library
implementation(libs.autoupdater)
// Unit Test
testImplementation(libs.junit) testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core) // Android Instrumentation Test
androidTestImplementation(platform(libs.androidx.compose.bom)) androidTestImplementation(libs.androidx.junit.v130)
androidTestImplementation(libs.androidx.ui.test.junit4) androidTestImplementation(libs.androidx.espresso.core.v370)
debugImplementation(libs.androidx.ui.tooling) androidTestImplementation(libs.ui.test.junit4)
debugImplementation(libs.androidx.ui.test.manifest)
implementation(files("../library/firefly-go.aar")) // Debug
} debugImplementation(libs.ui.tooling)
debugImplementation(libs.ui.test.manifest)
// Local AAR library
implementation(files("libs/firefly-go.aar"))
implementation(libs.slf4j.android)
}
Binary file not shown.
BIN
View File
Binary file not shown.
@@ -1,4 +1,4 @@
package com.example.fireflypsandorid package com.example.firefly_go_android
import androidx.test.platform.app.InstrumentationRegistry import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
+33 -6
View File
@@ -2,11 +2,23 @@
<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.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.MANAGE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<application <application
android:allowBackup="true" android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules" android:dataExtractionRules="@xml/data_extraction_rules"
@@ -16,12 +28,13 @@
android:roundIcon="@mipmap/ic_launcher_round" android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true" android:supportsRtl="true"
android:requestLegacyExternalStorage="true" android:requestLegacyExternalStorage="true"
android:theme="@style/Theme.FireflyPsAndorid" 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"
android:theme="@style/Theme.FireflyPsAndorid"> android:theme="@style/Theme.FireflyGoAndroid">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
@@ -30,8 +43,22 @@
<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
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
</application> </application>
</manifest> </manifest>
+588
View File
@@ -0,0 +1,588 @@
{
"leader": 2,
"lineups": {
"0": 1409,
"1": 1407,
"2": 1406,
"3": 1403
},
"position": {
"x": -4030,
"z": -13006,
"y": 0,
"rot_y": 270000
},
"scene": {
"plane_id": 10000,
"floor_id": 10000000,
"entry_id": 100000104
},
"player_outfit": [
1003
],
"char_path": {
"main": 8008,
"march_7": 1224
},
"char_enhanced": {
"1004": 1,
"1005": 0,
"1006": 1,
"1102": 1,
"1205": 1,
"1212": 1,
"1217": 1,
"1306": 1,
"1307": 1,
"1310": 1
},
"challenge": {
"challenge_id": 0,
"skip_half": 0,
"random_seed": 0,
"blessings": [],
"is_in_challenge": false,
"current_stage_id": 0,
"path_resonance_id": 0,
"maze_buff": 0,
"first_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": {
"current_mode": "Knight",
"group_id": 8,
"is_in_challenge_peak": false,
"challenge_peak_data": {
"1": {
"checkmate_data": {
"challenge_id": 104,
"blessing": 3033006,
"lineup": [
1413,
1409,
1407,
1403
],
"stage_id": 30501022,
"is_hard_mode": true
},
"knight_data": {
"current_challenge_id": 103,
"details_data": [
{
"lineup": [
1222,
1225,
1310,
1303
],
"stage_id": 30501011,
"challenge_id": 101
},
{
"lineup": [
1412,
1414,
1408,
1313
],
"stage_id": 30501012,
"challenge_id": 102
},
{
"lineup": [
1407,
1403,
1409,
1413
],
"stage_id": 30501013,
"challenge_id": 103
}
]
}
},
"2": {
"checkmate_data": {
"challenge_id": 204,
"blessing": 3033021,
"lineup": [
1415,
1413,
1409,
1407
],
"stage_id": 30502022,
"is_hard_mode": true
},
"knight_data": {
"current_challenge_id": 203,
"details_data": [
{
"lineup": [
1302,
1309,
1410
],
"stage_id": 30502011,
"challenge_id": 201
},
{
"lineup": [
1221,
1222
],
"stage_id": 30502012,
"challenge_id": 202
},
{
"lineup": [
1415,
8001,
1414,
1313
],
"stage_id": 30502013,
"challenge_id": 203
}
]
}
},
"3": {
"checkmate_data": {
"challenge_id": 304,
"blessing": 3033032,
"lineup": [
1222,
1225,
1310,
1321
],
"stage_id": 30503021,
"is_hard_mode": false
},
"knight_data": {
"current_challenge_id": 302,
"details_data": [
{
"lineup": [
1003
],
"stage_id": 30503011,
"challenge_id": 301
},
{
"lineup": [
1315
],
"stage_id": 30503012,
"challenge_id": 302
},
{
"lineup": [
8001
],
"stage_id": 30503013,
"challenge_id": 303
}
]
}
},
"4": {
"checkmate_data": {
"challenge_id": 404,
"blessing": 3033045,
"lineup": [
1310
],
"stage_id": 30504021,
"is_hard_mode": false
},
"knight_data": {
"current_challenge_id": 401,
"details_data": [
{
"lineup": [
1302
],
"stage_id": 30504011,
"challenge_id": 401
},
{
"lineup": [
1321
],
"stage_id": 30504012,
"challenge_id": 402
},
{
"lineup": [
1218
],
"stage_id": 30504013,
"challenge_id": 403
}
]
}
},
"5": {
"checkmate_data": {
"challenge_id": 504,
"blessing": 3033050,
"lineup": [
1415,
1413,
1407,
1409
],
"stage_id": 30505021,
"is_hard_mode": false
},
"knight_data": {
"current_challenge_id": 501,
"details_data": [
{
"lineup": [
1310
],
"stage_id": 30505011,
"challenge_id": 501
},
{
"lineup": [
1407
],
"stage_id": 30505012,
"challenge_id": 502
},
{
"lineup": [
1502
],
"stage_id": 30505013,
"challenge_id": 503
}
]
}
},
"6": {
"checkmate_data": {
"challenge_id": 604,
"blessing": 3033053,
"lineup": [
1505,
1217,
1502,
8001
],
"stage_id": 30506021,
"is_hard_mode": false
},
"knight_data": {
"current_challenge_id": 602,
"details_data": [
{
"lineup": [
1309
],
"stage_id": 30506011,
"challenge_id": 601
},
{
"lineup": [
1321,
1310,
1225,
1303
],
"stage_id": 30506012,
"challenge_id": 602
},
{
"lineup": [
1415,
1413,
1409,
1407
],
"stage_id": 30506013,
"challenge_id": 603
}
]
}
},
"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
}
}
}
},
"theory_craft": {
"hp": {
"1": [
200000,
1000000,
200000
],
"2": [
2000000000,
2000000000,
2000000000
],
"3": []
},
"cycle_count": 1,
"stage_id": 30118121,
"mode": false,
"custom_lineup": []
},
"profile_data": {
"cur_chat_bubble_id": 220009,
"cur_phone_theme_id": 221012,
"cur_phone_case_id": 254001,
"cur_pam_skin_id": 252000,
"cur_pet_id": 0,
"cur_avatar_player_icon": 202034,
"cur_player_personal_card": 253001,
"cur_signature": "Firefly GO By Kain",
"cur_nickname": "Firefly GO",
"cur_display_avatar": [
1310,
1309,
1407,
1413,
1412
],
"cur_is_display_avatar": true
},
"skin_data": {
"1001": 1100101,
"1310": 1131001,
"1407": 1140701,
"1415": 1141501
},
"extra_setting": {
"censorship": false,
"cm": false,
"first_person": false,
"hide_ui": false
}
}
File diff suppressed because it is too large Load Diff
+86
View File
@@ -0,0 +1,86 @@
{
"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"
},
"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"
},
"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"
},
"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"
},
"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"
},
"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"
}
}
@@ -1,11 +1,13 @@
package com.example.fireflypsandorid 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.Context
import android.content.Intent import android.content.Intent
import android.content.pm.ServiceInfo
import android.graphics.BitmapFactory
import android.os.Build import android.os.Build
import android.os.IBinder import android.os.IBinder
import android.os.PowerManager import android.os.PowerManager
@@ -14,7 +16,9 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
import androidx.core.content.ContextCompat
import libandroid.Libandroid import libandroid.Libandroid
import androidx.core.content.edit
class GolangServerService : Service() { class GolangServerService : Service() {
@@ -32,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
@@ -47,49 +52,79 @@ class GolangServerService : Service() {
notificationIntent, notificationIntent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
) )
val largeIcon = BitmapFactory.decodeResource(resources, R.mipmap.ic_launcher)
val notification = NotificationCompat.Builder(this, CHANNEL_ID) val notification = NotificationCompat.Builder(this, CHANNEL_ID)
.setSmallIcon(R.mipmap.ic_launcher_round)
.setLargeIcon(largeIcon)
.setContentTitle("FireflyGO Server") .setContentTitle("FireflyGO Server")
.setContentText("FireflyGO is running...") .setContentText("Server is running...")
.setSmallIcon(R.drawable.ic_launcher_foreground) .setColor(ContextCompat.getColor(this, R.color.teal_700))
.setOngoing(true)
.setOnlyAlertOnce(true)
.setContentIntent(pendingIntent) .setContentIntent(pendingIntent)
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setShowWhen(false)
.setCategory(NotificationCompat.CATEGORY_SERVICE)
.build() .build()
startForeground(NOTIFICATION_ID, notification) 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)
}
// 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() 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
} }
@@ -97,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
@@ -106,16 +140,16 @@ class GolangServerService : Service() {
Log.e(TAG, "Error shutting down server", e) Log.e(TAG, "Error shutting down server", e)
} }
// 2. Giải phóng WakeLock nếu còn giữ // 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
} }
@@ -132,9 +166,9 @@ class GolangServerService : Service() {
description = "Channel for running Golang backend in foreground" description = "Channel for running Golang backend in foreground"
} }
val manager = getSystemService(Context.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")
} }
} }
} }
File diff suppressed because it is too large Load Diff
@@ -1,4 +1,4 @@
package com.example.fireflypsandorid.ui.theme package com.example.firefly_go_android.ui.theme
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
@@ -1,6 +1,5 @@
package com.example.fireflypsandorid.ui.theme package com.example.firefly_go_android.ui.theme
import android.app.Activity
import android.os.Build import android.os.Build
import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
@@ -1,4 +1,4 @@
package com.example.fireflypsandorid.ui.theme package com.example.firefly_go_android.ui.theme
import androidx.compose.material3.Typography import androidx.compose.material3.Typography
import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.TextStyle
@@ -1,154 +0,0 @@
package com.example.fireflypsandorid
import android.annotation.SuppressLint
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.*
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.example.fireflypsandorid.ui.theme.FireflyPsAndoridTheme
import java.io.*
class MainActivity : ComponentActivity() {
private val tag = "AppInit"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val appDataPath = filesDir.absolutePath
val dataDir = File("$appDataPath/data")
dataDir.mkdirs()
checkAndCreateFile(dataDir, "data-in-game.json", R.raw.data_in_game_json)
checkAndCreateFile(dataDir, "freesr-data.json", R.raw.freesr_data_json)
checkAndCreateFile(dataDir, "version.json", R.raw.version_json)
enableEdgeToEdge()
setContent {
FireflyPsAndoridTheme {
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
ServerControlScreen(appDataPath, Modifier.padding(innerPadding))
}
}
}
}
private fun checkAndCreateFile(targetDir: File, fileName: String, resId: Int) {
val outFile = File(targetDir, fileName)
if (!outFile.exists()) {
try {
resources.openRawResource(resId).use { input ->
FileOutputStream(outFile).use { output ->
input.copyTo(output)
}
}
Log.i(tag, "✅ Copied $fileName to ${outFile.absolutePath}")
} catch (e: Exception) {
Log.e(tag, "❌ Failed to copy $fileName: ${e.message}")
}
} else {
Log.i(tag, "$fileName already exists at ${outFile.absolutePath}")
}
}
}
@SuppressLint("ImplicitSamInstance")
@Composable
fun ServerControlScreen(appDataPath: String, modifier: Modifier = Modifier) {
val context = LocalContext.current
val isRunning = GolangServerService.isRunning
val serverImage = if (isRunning)
painterResource(id = R.drawable.server_running)
else
painterResource(id = R.drawable.server_stopped)
Column(
modifier = modifier
.fillMaxSize()
.padding(24.dp),
verticalArrangement = Arrangement.SpaceBetween,
horizontalAlignment = Alignment.CenterHorizontally
) {
// Title
Text(
text = "Firefly Ps for Android",
fontSize = 26.sp,
fontWeight = FontWeight.Bold,
modifier = Modifier
.padding(top = 24.dp),
color = Color(0xFF4CAF50).copy(alpha = 0.9f) // Lime Green
)
Spacer(modifier = Modifier.height(8.dp))
// Server status image
Image(
painter = serverImage,
contentDescription = null,
contentScale = ContentScale.Crop,
modifier = Modifier
.fillMaxWidth()
.height(250.dp)
.padding(8.dp)
)
Spacer(modifier = Modifier.height(8.dp))
// Toggle button
Button(
onClick = {
try {
if (!isRunning) {
val intent = Intent(context, GolangServerService::class.java)
intent.putExtra("appDataPath", appDataPath)
context.startService(intent)
} else {
context.stopService(Intent(context, GolangServerService::class.java))
}
} catch (e: Exception) {
Toast.makeText(context, "Error: ${e.message}", Toast.LENGTH_SHORT).show()
}
},
colors = ButtonDefaults.buttonColors(
containerColor = if (isRunning) Color(0xFFB71C1C) else Color(0xFF2196F3),
contentColor = Color.White
),
shape = RoundedCornerShape(12.dp),
modifier = Modifier
.fillMaxWidth(0.7f)
.height(50.dp)
) {
Text(
text = if (isRunning) "Stop Server" else "Start Server",
fontSize = 20.sp
)
}
Spacer(modifier = Modifier.height(4.dp))
// Server status text
Text(
text = if (isRunning) "Server is running" else "Server is stopped",
fontSize = 24.sp,
color = if (isRunning) Color(0xFF4CAF50) else Color.Gray
)
Spacer(modifier = Modifier.height(24.dp))
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

@@ -0,0 +1,5 @@
{
"latest_version": "4.3.2-02",
"changelog": "UPDATE: 4.3.5X",
"apk_url": "https://git.kain.io.vn/Firefly-Shelter/FireflyGo_Android/releases/download/4.3.2-02/firefly_go_android.apk"
}
-128
View File
@@ -1,128 +0,0 @@
{
"leader": 0,
"lineups": {
"0": 1413,
"1": 1403,
"2": 1409,
"3": 1407
},
"position": {
"x": -30,
"z": -22750,
"y": -15000,
"rot_y": 234288
},
"scene": {
"plane_id": 10000,
"floor_id": 10000003,
"entry_id": 100000352
},
"char_path": {
"main": 8008,
"march_7": 1224
},
"char_enhanced": {
"1005": 1,
"1006": 1,
"1205": 1,
"1212": 1
},
"battle": {
"battle_id": 0,
"skip_half": 0,
"blessings": [],
"freesr": false,
"current_half": 0,
"path_resonance_id": 0,
"maze_buff": 0,
"first_lineup": [],
"second_lineup": []
},
"battle_peak": {
"current_mode": "Knight",
"group_id": 1,
"is_in_challenge_peak": false,
"challenge_peak_data": {
"1": {
"checkmate_data": {
"challenge_id": 104,
"blessing": 3033006,
"lineup": [
1413,
1409,
1407,
1403
],
"stage_id": 30501021,
"is_hard_mode": false
},
"knight_data": {
"current_challenge_id": 101,
"details_data": [
{
"lineup": [
1222,
1225,
1310,
1303
],
"stage_id": 30501011,
"challenge_id": 101
},
{
"lineup": [
1412,
1414,
1408,
1313
],
"stage_id": 30501012,
"challenge_id": 102
},
{
"lineup": [
1407,
1403,
1409,
1413
],
"stage_id": 30501013,
"challenge_id": 103
}
]
}
}
}
},
"theory_craft": {
"hp": {
"1": 600000,
"2": 10000000
},
"cycle_count": 1,
"log": false,
"mode": false
},
"profile_data": {
"cur_chat_bubble_id": 220000,
"cur_phone_theme_id": 221012,
"cur_phone_case_id": 254001,
"cur_pam_skin_id": 252000,
"cur_pet_id": 1003,
"cur_avatar_player_icon": 202034,
"cur_player_personal_card": 253001,
"cur_signature": "Firefly GO By Kain",
"cur_display_avatar": [
1310,
1309,
1407,
1413,
1412
],
"cur_is_display_avatar": true
},
"skin_data": {
"1001": 1100101,
"1310": 1131001
}
}
-51
View File
@@ -1,51 +0,0 @@
{
"CNBETAAndroid3.5.52": {
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_11537608_83921e2bbfb5_f15a1cc2aaba76",
"asset_bundle_url_b": "https://autopatchcn.bhsr.com/asb/BetaLive/output_11531357_ac5c50fe7c5c_5b8f1dfdef8d06",
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_11555075_e532a47d9e06_61b3c1ed162173",
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_11531873_abaa8247cede_b13c1ccb975acd",
"ifix_url": "https://autopatchcn.bhsr.com/ifix/BetaLive/output_0_40d2ce0253_c61ba99f70b885"
},
"CNBETAWin3.5.52": {
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_11537608_83921e2bbfb5_f15a1cc2aaba76",
"asset_bundle_url_b": "https://autopatchcn.bhsr.com/asb/BetaLive/output_11531357_ac5c50fe7c5c_5b8f1dfdef8d06",
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_11555075_e532a47d9e06_61b3c1ed162173",
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_11531873_abaa8247cede_b13c1ccb975acd",
"ifix_url": "https://autopatchcn.bhsr.com/ifix/BetaLive/output_0_40d2ce0253_c61ba99f70b885"
},
"CNBETAiOS3.5.52": {
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_11537608_83921e2bbfb5_f15a1cc2aaba76",
"asset_bundle_url_b": "https://autopatchcn.bhsr.com/asb/BetaLive/output_11531357_ac5c50fe7c5c_5b8f1dfdef8d06",
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_11555075_e532a47d9e06_61b3c1ed162173",
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_11531873_abaa8247cede_b13c1ccb975acd",
"ifix_url": "https://autopatchcn.bhsr.com/ifix/BetaLive/output_0_40d2ce0253_c61ba99f70b885"
},
"OSBETAAndroid3.5.52": {
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_11537608_83921e2bbfb5_f15a1cc2aaba76",
"asset_bundle_url_b": "https://autopatchcn.bhsr.com/asb/BetaLive/output_11531357_ac5c50fe7c5c_5b8f1dfdef8d06",
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_11555075_e532a47d9e06_61b3c1ed162173",
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_11531873_abaa8247cede_b13c1ccb975acd",
"ifix_url": "https://autopatchcn.bhsr.com/ifix/BetaLive/output_0_40d2ce0253_c61ba99f70b885"
},
"OSBETAWin3.5.52": {
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_11537608_83921e2bbfb5_f15a1cc2aaba76",
"asset_bundle_url_b": "https://autopatchcn.bhsr.com/asb/BetaLive/output_11531357_ac5c50fe7c5c_5b8f1dfdef8d06",
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_11555075_e532a47d9e06_61b3c1ed162173",
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_11531873_abaa8247cede_b13c1ccb975acd",
"ifix_url": "https://autopatchcn.bhsr.com/ifix/BetaLive/output_0_40d2ce0253_c61ba99f70b885"
},
"OSBETAiOS3.5.52": {
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_11537608_83921e2bbfb5_f15a1cc2aaba76",
"asset_bundle_url_b": "https://autopatchcn.bhsr.com/asb/BetaLive/output_11531357_ac5c50fe7c5c_5b8f1dfdef8d06",
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_11555075_e532a47d9e06_61b3c1ed162173",
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_11531873_abaa8247cede_b13c1ccb975acd",
"ifix_url": "https://autopatchcn.bhsr.com/ifix/BetaLive/output_0_40d2ce0253_c61ba99f70b885"
},
"CNBETAWin3.5.51": {
"asset_bundle_url": "https://autopatchcn.bhsr.com/asb/BetaLive/output_11497493_b4a5d8f717df_d632f2f00b0108",
"asset_bundle_url_b": "https://autopatchcn.bhsr.com/asb/BetaLive/output_11443120_75e75bb630b2_bb1653f50a24b3",
"ex_resource_url": "https://autopatchcn.bhsr.com/design_data/BetaLive/output_11503893_72129078bcdf_31a0117dd0c5aa",
"lua_url": "https://autopatchcn.bhsr.com/lua/BetaLive/output_11475376_d8a6597dc30c_b9f6afe07715f3",
"ifix_url": "https://autopatchcn.bhsr.com/ifix/BetaLive/output_11454524_a18a9e47d5b8_3647b1d6ce2d9a"
}
}
+1 -1
View File
@@ -1,3 +1,3 @@
<resources> <resources>
<string name="app_name">FireflyGo-3.5.5X</string> <string name="app_name">Firefly Go</string>
</resources> </resources>
+1 -1
View File
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<style name="Theme.FireflyPsAndorid" parent="android:Theme.Material.Light.NoActionBar" /> <style name="Theme.FireflyGoAndroid" parent="android:Theme.Material.Light.NoActionBar" />
</resources> </resources>
+3
View File
@@ -0,0 +1,3 @@
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-files-path name="downloads" path="Download/"/>
</paths>
@@ -1,4 +1,4 @@
package com.example.fireflypsandorid package com.example.firefly_go_android
import org.junit.Test import org.junit.Test
+5 -1
View File
@@ -14,10 +14,14 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
# AndroidX package structure to make it clearer which packages are bundled with the # AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app's APK # Android operating system, and which are packaged with your app's APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn # https://developer.android.com/topic/libraries/support-library/androidx-rn
org.gradle.parallel=true
android.useAndroidX=true android.useAndroidX=true
# Kotlin code style for this project: "official" or "obsolete": # Kotlin code style for this project: "official" or "obsolete":
kotlin.code.style=official kotlin.code.style=official
# Enables namespacing of each library's R class so that its R class includes only the # Enables namespacing of each library's R class so that its R class includes only the
# resources declared in the library itself and none from the library's dependencies, # resources declared in the library itself and none from the library's dependencies,
# thereby reducing the size of the R class for that library # thereby reducing the size of the R class for that library
android.nonTransitiveRClass=true android.nonTransitiveRClass=true
#org.gradle.configuration-cache=false
android.r8.optimizedResourceShrinking=true
org.gradle.java.installations.auto-download=true
+13
View File
@@ -0,0 +1,13 @@
#This file is generated by updateDaemonJvm
toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/536afcd1dff540251f85e5d2c80458cf/redirect
toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/398ffe3949748bfb1d5636f023d228fd/redirect
toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/536afcd1dff540251f85e5d2c80458cf/redirect
toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/398ffe3949748bfb1d5636f023d228fd/redirect
toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/e99bae143b75f9a10ead10248f02055e/redirect
toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/658299a896470fbb3103ba3a430ee227/redirect
toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/536afcd1dff540251f85e5d2c80458cf/redirect
toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/398ffe3949748bfb1d5636f023d228fd/redirect
toolchainUrl.WINDOWS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/248ffb1098f61659502d0c09aa348294/redirect
toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/932015f6361ccaead0c6d9b8717ed96e/redirect
toolchainVendor=JETBRAINS
toolchainVersion=21
+39 -20
View File
@@ -1,29 +1,48 @@
[versions] [versions]
agp = "8.9.1" activityComposeVersion = "1.11.0"
kotlin = "2.0.21" agp = "8.13.0"
coreKtx = "1.10.1" androidxJunit = "1.3.0"
animationCore = "1.9.3"
autoupdater = "1.0.1"
espressoCoreVersion = "3.7.0"
foundation = "1.9.3"
kotlin = "2.2.20"
coreKtx = "1.17.0"
junit = "4.13.2" junit = "4.13.2"
junitVersion = "1.1.5" lifecycleRuntimeKtxVersion = "2.9.4"
espressoCore = "3.5.1" material = "1.9.3"
lifecycleRuntimeKtx = "2.6.1" material3WindowSizeClass = "1.4.0"
activityCompose = "1.8.0" materialIconsExtended = "1.7.8"
composeBom = "2024.09.00" slf4jAndroidVersion = "1.7.36"
ui = "1.9.3"
uiGraphics = "1.9.3"
uiTestJunit4 = "1.9.3"
uiTestManifest = "1.9.3"
uiTooling = "1.9.3"
uiToolingPreview = "1.9.3"
[libraries] [libraries]
androidx-activity-compose-v1101 = { module = "androidx.activity:activity-compose", version.ref = "activityComposeVersion" }
androidx-animation = { module = "androidx.compose.animation:animation", version.ref = "animationCore" }
androidx-animation-core = { module = "androidx.compose.animation:animation-core", version.ref = "animationCore" }
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
androidx-espresso-core-v370 = { module = "androidx.test.espresso:espresso-core", version.ref = "espressoCoreVersion" }
androidx-foundation = { module = "androidx.compose.foundation:foundation", version.ref = "foundation" }
androidx-junit-v130 = { module = "androidx.test.ext:junit", version.ref = "androidxJunit" }
androidx-lifecycle-runtime-ktx-v293 = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtxVersion" }
androidx-material = { module = "androidx.compose.material:material", version.ref = "material" }
androidx-material-icons-extended = { module = "androidx.compose.material:material-icons-extended", version.ref = "materialIconsExtended" }
androidx-material3-window-size-class1 = { module = "androidx.compose.material3:material3-window-size-class", version.ref = "material3WindowSizeClass" }
autoupdater = { module = "com.github.CSAbhiOnline:AutoUpdater", version.ref = "autoupdater" }
junit = { group = "junit", name = "junit", version.ref = "junit" } junit = { group = "junit", name = "junit", version.ref = "junit" }
androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } material3 = { module = "androidx.compose.material3:material3", version.ref = "material3WindowSizeClass" }
androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } slf4j-android = { module = "org.slf4j:slf4j-android", version.ref = "slf4jAndroidVersion" }
androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" } ui = { module = "androidx.compose.ui:ui", version.ref = "ui" }
androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" } ui-graphics = { module = "androidx.compose.ui:ui-graphics", version.ref = "uiGraphics" }
androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" } ui-test-junit4 = { module = "androidx.compose.ui:ui-test-junit4", version.ref = "uiTestJunit4" }
androidx-ui = { group = "androidx.compose.ui", name = "ui" } ui-test-manifest = { module = "androidx.compose.ui:ui-test-manifest", version.ref = "uiTestManifest" }
androidx-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" } ui-tooling = { module = "androidx.compose.ui:ui-tooling", version.ref = "uiTooling" }
androidx-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview", version.ref = "uiToolingPreview" }
androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" }
androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" }
androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" }
androidx-material3 = { group = "androidx.compose.material3", name = "material3" }
[plugins] [plugins]
android-application = { id = "com.android.application", version.ref = "agp" } android-application = { id = "com.android.application", version.ref = "agp" }
+2 -2
View File
@@ -1,6 +1,6 @@
#Mon Apr 28 17:05:34 ICT 2025 #Wed Oct 08 15:20:16 ICT 2025
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
-3
View File
@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:abad4850602cbc65eba293b5d11527f6412275c1c7e5fd4e146c59fe3cf6258d
size 73423352
+3
View File
@@ -0,0 +1,3 @@
# Changelog
## - UPDATE: Support 4.3.5X
Binary file not shown.
+4
View File
@@ -0,0 +1,4 @@
{
"tag": "4.3.2-02",
"title": "PreBuild Version 4.3.52 - 02"
}
+12 -1
View File
@@ -1,5 +1,8 @@
pluginManagement { pluginManagement {
repositories { repositories {
maven {
setUrl("https://jitpack.io")
}
google { google {
content { content {
includeGroupByRegex("com\\.android.*") includeGroupByRegex("com\\.android.*")
@@ -9,15 +12,23 @@ pluginManagement {
} }
mavenCentral() mavenCentral()
gradlePluginPortal() gradlePluginPortal()
} }
} }
plugins {
id("org.gradle.toolchains.foojay-resolver-convention") version "0.10.0"
}
dependencyResolutionManagement { dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories { repositories {
maven {
setUrl("https://jitpack.io")
}
google() google()
mavenCentral() mavenCentral()
} }
} }
rootProject.name = "FireflyPsAndorid" rootProject.name = "FireflyGoAndroid"
include(":app") include(":app")