From 89c7d04f7a0a42cdb1583bb2932ee2ab018eb0aa Mon Sep 17 00:00:00 2001 From: sky121113 Date: Tue, 16 Jun 2026 11:09:45 +0800 Subject: [PATCH] =?UTF-8?q?[FIX]=20=E4=BF=AE=E5=BE=A9=E9=81=A0=E7=AB=AF?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=A8=AD=E5=AE=9A=E8=AA=A4=E5=88=AA=E5=BB=A3?= =?UTF-8?q?=E5=91=8A=EF=BC=8C=E4=B8=A6=E5=AE=8C=E5=96=84=E6=A9=9F=E5=8F=B0?= =?UTF-8?q?=E8=B3=87=E8=A8=8A=E5=88=97=E9=A1=AF=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. [FIX] persistCurrentSettings() 原以 deleteAll() 清空整張 SettingsDao, 連坐刪除廣告(VideoEoxPlayer)等持久資料;改為僅 deleteWhere 逐筆刪除 接下來要重寫的 4 個設定 key(Machine/Esunpay/GreenInvoice/Greenpaysetting)。 修正「遠端更新設定→重啟 App 後廣告消失,須再更新廣告才出現」問題。 2. [FEAT] 機台資訊列左側改顯示「序號 + 版本號(Ver versionName)」。 3. [FEAT] 機台資訊列網路訊號改為動態:依 WiFi RSSI / 行動網路 dBm 切換訊號格數 icon 與文字(無網路/WiFi/行動/有線),並於 SET_NETWORK 與輪詢時即時更新。 4. [REFACTOR] 進站後門觸控由舊 textNetwork 遷移至機台資訊列的「序號+版本號」元素 (舊系統列已隱藏不再接收觸控)。 5. [STYLE] activity_fontend 機台資訊名稱樣式調整(灰色/14sp/透明度 0.7)。 6. 版號 verPatch 93 → 94。 --- app/build.gradle | 2 +- .../smartdevice/external/StarCloudAPI.java | 7 +- .../smartdevice/ui/FontendActivity.java | 91 +++++++++++++++++-- app/src/main/res/layout/activity_fontend.xml | 6 +- 4 files changed, 94 insertions(+), 12 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d678b68..6f8ad82 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,7 +10,7 @@ plugins { // 避免不同尺寸機台間版本號產生衝突。 // ========================================================================= def verMinor = 1 -def verPatch = 93 +def verPatch = 94 diff --git a/app/src/main/java/com/unibuy/smartdevice/external/StarCloudAPI.java b/app/src/main/java/com/unibuy/smartdevice/external/StarCloudAPI.java index f579926..50ce796 100644 --- a/app/src/main/java/com/unibuy/smartdevice/external/StarCloudAPI.java +++ b/app/src/main/java/com/unibuy/smartdevice/external/StarCloudAPI.java @@ -1130,7 +1130,12 @@ public class StarCloudAPI { Log.i(TAG, "persistCurrentSettings() - Saving to DB: machineID=" + MyApp.getInstance().getMachine().getMachineID() + ", token=" + MyApp.getInstance().getMachine().getApiKey()); SettingsDao settingsDao = new SettingsDao(handlerMain.getContext()); - settingsDao.deleteAll(); + // 只刪除本方法接下來要重寫的這 4 個設定 key,避免 deleteAll() 連坐刪掉廣告(VideoEoxPlayer)等其他持久資料。 + // 否則「遠端更新設定→重啟」會因廣告列被清空且啟動不會主動抓 B005,導致廣告消失。 + settingsDao.deleteWhere(MyApp.getInstance().getMachine().getClass().getSimpleName()); + settingsDao.deleteWhere(MyApp.getInstance().getEsunpay().getClass().getSimpleName()); + settingsDao.deleteWhere(MyApp.getInstance().getGreenInvoice().getClass().getSimpleName()); + settingsDao.deleteWhere(MyApp.getInstance().getGreenpaySetting().getClass().getSimpleName()); settingsDao.insertOne(new SettingStructure(MyApp.getInstance().getMachine().getClass().getSimpleName(), new String[] { 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 400c9d0..5a7148d 100644 --- a/app/src/main/java/com/unibuy/smartdevice/ui/FontendActivity.java +++ b/app/src/main/java/com/unibuy/smartdevice/ui/FontendActivity.java @@ -335,8 +335,8 @@ public class FontendActivity extends AppCompatActivityAbstract implements SaleFl getLogs().update("Temperature", String.valueOf(DevXinYuanController.getTemperature()), "℃"); // 同步更新機台資訊列 - binding.textMachineInfoName.setText(MyApp.getInstance().getMachine().getMachineID()); - // 待日後動態更改:binding.textMachineInfoNetwork.setText(getString(R.string.network) + ":" + networkDevice); + updateMachineInfoName(); + updateMachineInfoNetwork(); binding.textMachineInfoTemperature.setText(getString(R.string.temp) + ":" + tempStr); try { @@ -392,7 +392,7 @@ public class FontendActivity extends AppCompatActivityAbstract implements SaleFl case SET_NETWORK: getLogs().info("網路:" + message); binding.textNetwork.setText(message); - // 待日後動態更改:binding.textMachineInfoNetwork.setText(message); + updateMachineInfoNetwork(); break; case RESET_SLOTNO: new ResetSlotNo(this).start(); @@ -642,6 +642,80 @@ public class FontendActivity extends AppCompatActivityAbstract implements SaleFl return -1; // 無法獲取訊號強度 } + /** 取得 App 版本名稱(versionName),取不到時回 "0"。 */ + private String getAppVersionName() { + try { + return getPackageManager().getPackageInfo(getPackageName(), 0).versionName; + } catch (PackageManager.NameNotFoundException e) { + return "0"; + } + } + + /** 機台資訊列左側:顯示「序號 + 版本號」。 */ + private void updateMachineInfoName() { + if (binding == null) { + return; + } + binding.textMachineInfoName.setText( + MyApp.getInstance().getMachine().getMachineID() + " Ver " + getAppVersionName()); + } + + /** + * 依系統/下位機回報的網路狀態,動態更新機台資訊列的網路訊號 icon 與文字。 + * WiFi 依 RSSI(dBm) 分 1~3 格與滿格;行動網路(SIM) 依 dBm 分 0~4 格;無網路顯示 0 格。 + */ + private void updateMachineInfoNetwork() { + if (binding == null) { + return; + } + int iconRes = R.drawable.signal_cellular_0_bar_24; // 預設:無網路 + String label = getString(R.string.no_internet); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + Network network = connectivityManager.getActiveNetwork(); + NetworkCapabilities capabilities = (network != null) + ? connectivityManager.getNetworkCapabilities(network) : null; + if (capabilities != null + && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) { + if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { + int rssi = 0; // 0 代表系統未提供強度 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + rssi = capabilities.getSignalStrength(); + } + iconRes = wifiIconByRssi(rssi); + label = getString(R.string.wireless_internet); + } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { + iconRes = cellularIconByDbm(getMobileSignalStrength()); + label = getString(R.string.mobile_network); + } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) { + iconRes = R.drawable.network_wifi_24; // 有線:以滿格示意連線正常 + label = getString(R.string.wired_internet); + } + } + } + binding.textMachineInfoNetwork.setText(label); + binding.textMachineInfoNetwork.setCompoundDrawablesRelativeWithIntrinsicBounds(iconRes, 0, 0, 0); + } + + /** WiFi RSSI(dBm) → icon;數字越接近 0 越強,rssi==0 視為未提供強度回滿格。 */ + private int wifiIconByRssi(int rssi) { + if (rssi == 0 || rssi >= -55) return R.drawable.network_wifi_24; // 滿格 + if (rssi >= -66) return R.drawable.network_wifi_3_bar_24; // 等級3 + if (rssi >= -77) return R.drawable.network_wifi_2_bar_24; // 等級2 + return R.drawable.network_wifi_1_bar_24; // 等級1 + } + + /** 行動網路 dBm → icon;數字越接近 0 越強,-1 代表取不到訊號。 */ + private int cellularIconByDbm(int dbm) { + if (dbm == -1) return R.drawable.signal_cellular_0_bar_24; // 無網路 + if (dbm >= -85) return R.drawable.signal_cellular_4_bar_24; // 滿格 + if (dbm >= -95) return R.drawable.signal_cellular_3_bar_24; // 等級3 + if (dbm >= -105) return R.drawable.signal_cellular_2_bar_24; // 等級2 + if (dbm >= -115) return R.drawable.signal_cellular_1_bar_24; // 等級1 + return R.drawable.signal_cellular_0_bar_24; // 無網路 + } + private void setBottomNavigation() { vmcFragment = new VmcFragment(getHandlerMain()); activeFragment = vmcFragment; @@ -772,8 +846,9 @@ public class FontendActivity extends AppCompatActivityAbstract implements SaleFl binding.btnswitchlanTW.setOnClickListener(v -> showLanguagePicker()); // 新增:機台資訊列的語言按鈕 binding.textMachineInfoLang.setOnClickListener(v -> showLanguagePicker()); - // 機台資訊列一動就顯示機台 ID - binding.textMachineInfoName.setText(MyApp.getInstance().getMachine().getMachineID()); + // 機台資訊列:顯示序號 + 版本號 + updateMachineInfoName(); + updateMachineInfoNetwork(); String currentLang = LanguageHelper.getSavedLanguage(this); binding.textMachineInfoLangText.setText(LanguageHelper.getDisplayName(currentLang)); @@ -785,7 +860,8 @@ public class FontendActivity extends AppCompatActivityAbstract implements SaleFl finish(); }; - binding.textNetwork.setOnTouchListener((v, event) -> { + // 後門已遷至機台資訊列的「序號 + 版本號」元素(舊的 textNetwork 整條系統列已隱藏,不再接收觸控) + binding.textMachineInfoName.setOnTouchListener((v, event) -> { switch (event.getAction()) { case android.view.MotionEvent.ACTION_DOWN: networkHandler.postDelayed(networkRunnable, 2000); // 2秒 @@ -843,7 +919,8 @@ public class FontendActivity extends AppCompatActivityAbstract implements SaleFl binding.btnswitchlanJa.setVisibility(View.GONE); binding.btnswitchlanTW.setOnClickListener(v -> showLanguagePicker()); binding.textMachineInfoLang.setOnClickListener(v -> showLanguagePicker()); - binding.textMachineInfoName.setText(MyApp.getInstance().getMachine().getMachineID()); + updateMachineInfoName(); + updateMachineInfoNetwork(); String currentLang = LanguageHelper.getSavedLanguage(this); binding.textMachineInfoLangText.setText(LanguageHelper.getDisplayName(currentLang)); } diff --git a/app/src/main/res/layout/activity_fontend.xml b/app/src/main/res/layout/activity_fontend.xml index c491597..b1f3b02 100644 --- a/app/src/main/res/layout/activity_fontend.xml +++ b/app/src/main/res/layout/activity_fontend.xml @@ -111,9 +111,9 @@ android:layout_weight="1" android:gravity="start|center_vertical" android:text="--" - android:textColor="@color/primary" - android:textSize="27sp" - android:textStyle="bold" + android:textColor="@color/gray" + android:textSize="14sp" + android:alpha="0.7" android:singleLine="true" android:ellipsize="end" />