[FIX] 修復遠端更新設定誤刪廣告,並完善機台資訊列顯示

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。
This commit is contained in:
sky121113 2026-06-16 11:09:45 +08:00
parent f700881788
commit 89c7d04f7a
4 changed files with 94 additions and 12 deletions

View File

@ -10,7 +10,7 @@ plugins {
//
// =========================================================================
def verMinor = 1
def verPatch = 93
def verPatch = 94

View File

@ -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[] {

View File

@ -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));
}

View File

@ -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" />