From 43b1a8b3e3936e2c1efcbfaf567b4d6f090c2fa7 Mon Sep 17 00:00:00 2001 From: sky121113 Date: Thu, 14 May 2026 17:42:30 +0800 Subject: [PATCH] =?UTF-8?q?[FEAT]=20=E6=9C=80=E4=BD=B3=E5=8C=96=E4=B8=BB?= =?UTF-8?q?=E4=BB=8B=E9=9D=A2=E4=BD=88=E5=B1=80=E4=B8=A6=E5=AF=A6=E4=BD=9C?= =?UTF-8?q?=20MQTT=20=E5=84=AA=E9=9B=85=E9=87=8D=E5=95=9F=E9=82=8F?= =?UTF-8?q?=E8=BC=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 在主介面 (activity_main.xml) 加入 ScrollView 容器,支援更多功能按鈕的滾動顯示。 2. 新增「進入系統畫面」按鈕,方便開發與偵錯。 3. 實作 MQTT 優雅斷線機制,在 App 手動或自動重啟前先行中斷 MQTT 連線,避免觸發 LWT 離線告警。 4. 修正貨道商品價格顯示邏輯,當價格為 0 時自動隱藏售價標籤。 5. 調整 VmcFragment 中的售價合法性判斷基準。 6. 更新 compiler-apk 工作流說明文件。 --- .agents/workflows/compiler-apk.md | 4 +- .../com/unibuy/smartdevice/HomeActivity.java | 24 ++-- .../com/unibuy/smartdevice/MainActivity.java | 65 ++++----- .../smartdevice/ui/FontendActivity.java | 23 ++-- .../ui/devs/vmc/RecyclerVmcBuyListAdpter.java | 8 +- .../smartdevice/ui/devs/vmc/VmcFragment.java | 2 +- app/src/main/res/layout/activity_main.xml | 127 ++++++++++-------- 7 files changed, 133 insertions(+), 120 deletions(-) diff --git a/.agents/workflows/compiler-apk.md b/.agents/workflows/compiler-apk.md index 0fc3c42..8a2b18b 100644 --- a/.agents/workflows/compiler-apk.md +++ b/.agents/workflows/compiler-apk.md @@ -11,8 +11,8 @@ description: 自動編譯 Android APK、輸出至專屬目錄並安裝至實體 ```bash // turbo -# 終止殘留的 Gradle/Java 程序,避免多個 Daemon 互搶資源 -pkill -9 -f "gradle" 2>/dev/null; pkill -9 -f "GradleDaemon" 2>/dev/null; sleep 3 +# 終止殘留的 Gradle Daemon 程序,避免多個 Daemon 互搶資源,同時避免誤殺 VS Code Gradle 擴充功能 +./gradlew --stop 2>/dev/null; pkill -9 -f "org.gradle.launcher.daemon.bootstrap.GradleDaemon" 2>/dev/null; sleep 3 export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 cd /home/mama/projects/TaiwanStar_general_size_s_Chengwai diff --git a/app/src/main/java/com/unibuy/smartdevice/HomeActivity.java b/app/src/main/java/com/unibuy/smartdevice/HomeActivity.java index 4bbad9d..b104fd1 100644 --- a/app/src/main/java/com/unibuy/smartdevice/HomeActivity.java +++ b/app/src/main/java/com/unibuy/smartdevice/HomeActivity.java @@ -299,17 +299,21 @@ public class HomeActivity extends AppCompatActivityAbstract { } public void ReSetAPP2(){ - Intent intent = new Intent(getApplicationContext(), FontendActivity.class); - // 清空所有 Task,重新啟動 - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK - | Intent.FLAG_ACTIVITY_CLEAR_TASK); - startActivity(intent); + getLogs().info("🔄HomeActivity - Scheduled Hard App restarting via gracefulDisconnect..."); + com.unibuy.smartdevice.external.mqtt.MqttManager.getInstance().gracefulDisconnect(() -> { + new android.os.Handler(android.os.Looper.getMainLooper()).post(() -> { + Intent intent = new Intent(getApplicationContext(), HomeActivity.class); + // 清空所有 Task,重新啟動 + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK + | Intent.FLAG_ACTIVITY_CLEAR_TASK); + startActivity(intent); - // 建議搭配 finishAffinity(),確保所有舊的 Activity 都被清掉 - //finishAffinity(); - // 建議先 log 再 kill - getLogs().info("🔄MainActivity - App restarting..."); - android.os.Process.killProcess(android.os.Process.myPid()); + // 建議搭配 finishAffinity(),確保所有舊的 Activity 都被清掉 + finishAffinity(); + + android.os.Process.killProcess(android.os.Process.myPid()); + }); + }); } diff --git a/app/src/main/java/com/unibuy/smartdevice/MainActivity.java b/app/src/main/java/com/unibuy/smartdevice/MainActivity.java index 4b29299..b7d1491 100644 --- a/app/src/main/java/com/unibuy/smartdevice/MainActivity.java +++ b/app/src/main/java/com/unibuy/smartdevice/MainActivity.java @@ -192,13 +192,7 @@ public class MainActivity extends AppCompatActivityAbstract { return; } - boolean hidden = isNavigationReallyHidden(); - - if (hidden) { - enterShoppingPlatform(); - } else { - showMustHideSystemBarsDialog(); - } + enterShoppingPlatform(); }); // 🛠️ 開發者後門:長按 3 秒強制進入購物平台 (適合手機開發測試) @@ -267,13 +261,15 @@ public class MainActivity extends AppCompatActivityAbstract { }); binding.buttonresetapp.setOnClickListener(v -> { - boolean hidden = isNavigationReallyHidden(); + // 管理員手動重啟,直接執行不再檢查導覽列 + ReSetAPP(); + }); - if (hidden) { - ReSetAPP(); - } else { - showMustHideSystemBarsDialog(); - } + binding.buttonOpenSystemSettings.setOnClickListener(v -> { + // 開啟 Android 系統設定 + Intent intent = new Intent(android.provider.Settings.ACTION_SETTINGS); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); }); } @@ -611,36 +607,21 @@ public class MainActivity extends AppCompatActivityAbstract { } public void ReSetAPP() { - // Intent intent = new Intent(getCtx(), FontendActivity.class); // 改為你的啟動 - // Activity - // intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | - // Intent.FLAG_ACTIVITY_CLEAR_TASK); - // - // PendingIntent pendingIntent = PendingIntent.getActivity( - // getCtx(), 0, intent, PendingIntent.FLAG_IMMUTABLE | - // PendingIntent.FLAG_CANCEL_CURRENT); - // - // AlarmManager alarmManager = (AlarmManager) - // getCtx().getSystemService(Context.ALARM_SERVICE); - // alarmManager.setExact(AlarmManager.RTC, System.currentTimeMillis() + 1000, - // pendingIntent); - // - // // 建議先 log 再 kill - // getLogs().info("🔄 App restarting..."); - // android.os.Process.killProcess(android.os.Process.myPid()); - Intent intent = new Intent(getApplicationContext(), FontendActivity.class); - // 清空所有 Task,重新啟動 - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK - | Intent.FLAG_ACTIVITY_CLEAR_TASK); - startActivity(intent); + getLogs().info("🔄MainActivity - Manual App restarting via gracefulDisconnect..."); + com.unibuy.smartdevice.external.mqtt.MqttManager.getInstance().gracefulDisconnect(() -> { + new android.os.Handler(android.os.Looper.getMainLooper()).post(() -> { + Intent intent = new Intent(getApplicationContext(), HomeActivity.class); + // 清空所有 Task,重新啟動 + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK + | Intent.FLAG_ACTIVITY_CLEAR_TASK); + startActivity(intent); - // 建議搭配 finishAffinity(),確保所有舊的 Activity 都被清掉 - finishAffinity(); - // 建議先 log 再 kill - getLogs().info("🔄MainActivity - App restarting..."); - - android.os.Process.killProcess(android.os.Process.myPid()); - // 完全不需要 killProcess() + // 建議搭配 finishAffinity(),確保所有舊的 Activity 都被清掉 + finishAffinity(); + + android.os.Process.killProcess(android.os.Process.myPid()); + }); + }); } @Override diff --git a/app/src/main/java/com/unibuy/smartdevice/ui/FontendActivity.java b/app/src/main/java/com/unibuy/smartdevice/ui/FontendActivity.java index 4b8427c..ab06162 100644 --- a/app/src/main/java/com/unibuy/smartdevice/ui/FontendActivity.java +++ b/app/src/main/java/com/unibuy/smartdevice/ui/FontendActivity.java @@ -406,7 +406,7 @@ public class FontendActivity extends AppCompatActivityAbstract { } public void ReSetAPP() { - Intent intent = new Intent(getApplicationContext(), FontendActivity.class); + Intent intent = new Intent(getApplicationContext(), HomeActivity.class); // 清空所有 Task,重新啟動 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); @@ -419,7 +419,7 @@ public class FontendActivity extends AppCompatActivityAbstract { } public void ReSetAPP2() { - Intent intent = new Intent(getApplicationContext(), FontendActivity.class); + Intent intent = new Intent(getApplicationContext(), HomeActivity.class); // 清空所有 Task,重新啟動 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); @@ -816,14 +816,19 @@ public class FontendActivity extends AppCompatActivityAbstract { boolean isBusy = MyApp.getInstance().isMachineBusy(); if (idle >= 90 && !isBusy) { getLogs().info("RestartAPP2:閒置 " + idle + " 秒且機台不忙碌,執行真重啟"); - // 切回主執行緒執行重啟 - new android.os.Handler(android.os.Looper.getMainLooper()).post(() -> { - Intent intent = new Intent(getApplicationContext(), com.unibuy.smartdevice.HomeActivity.class); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); - startActivity(intent); + getLogs().info("RestartAPP2:執行真重啟 (MQTT 優雅斷線模式)"); + com.unibuy.smartdevice.external.mqtt.MqttManager.getInstance().gracefulDisconnect(() -> { + new android.os.Handler(android.os.Looper.getMainLooper()).post(() -> { + Intent intent = new Intent(getApplicationContext(), com.unibuy.smartdevice.HomeActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); + startActivity(intent); - android.os.Process.killProcess(android.os.Process.myPid()); - System.exit(0); + // 確保所有舊的 Activity 都被清掉 + finishAffinity(); + + android.os.Process.killProcess(android.os.Process.myPid()); + System.exit(0); + }); }); return; } diff --git a/app/src/main/java/com/unibuy/smartdevice/ui/devs/vmc/RecyclerVmcBuyListAdpter.java b/app/src/main/java/com/unibuy/smartdevice/ui/devs/vmc/RecyclerVmcBuyListAdpter.java index 1547c38..c3d79ed 100644 --- a/app/src/main/java/com/unibuy/smartdevice/ui/devs/vmc/RecyclerVmcBuyListAdpter.java +++ b/app/src/main/java/com/unibuy/smartdevice/ui/devs/vmc/RecyclerVmcBuyListAdpter.java @@ -100,8 +100,12 @@ public class RecyclerVmcBuyListAdpter extends RecyclerView.Adapter 0 ? machinePrice : sellingPrice; - - holder.binding.textPrice.setText("NT$ " + price); + if (price > 0) { + holder.binding.textPrice.setVisibility(View.VISIBLE); + holder.binding.textPrice.setText("NT$ " + price); + } else { + holder.binding.textPrice.setVisibility(View.GONE); + } holder.binding.mask.setVisibility(View.GONE); holder.binding.textMask.setText(""); diff --git a/app/src/main/java/com/unibuy/smartdevice/ui/devs/vmc/VmcFragment.java b/app/src/main/java/com/unibuy/smartdevice/ui/devs/vmc/VmcFragment.java index 85112a9..cf5e284 100644 --- a/app/src/main/java/com/unibuy/smartdevice/ui/devs/vmc/VmcFragment.java +++ b/app/src/main/java/com/unibuy/smartdevice/ui/devs/vmc/VmcFragment.java @@ -287,7 +287,7 @@ public class VmcFragment extends FragmentAbstract { return product == null || product.getProductID().isEmpty() || product.getProductName().isEmpty() - || product.getSellingPrice() <= 0; + || product.getSellingPrice() < 0; } @Override diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index bcd78fc..24cc2d2 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -8,75 +8,80 @@ tools:context=".MainActivity" android:background="@color/light_gray"> - -