diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a7531e2..203d567 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -134,6 +134,10 @@ android:name="com.bonus.canteen.activity.setting.ParamSettingsActivity" android:configChanges="keyboardHidden|keyboard" android:windowSoftInputMode="adjustPan|stateHidden" /> + diff --git a/app/src/main/java/com/bonus/canteen/activity/OperationActivity.java b/app/src/main/java/com/bonus/canteen/activity/OperationActivity.java index 70d7d0e..402913b 100644 --- a/app/src/main/java/com/bonus/canteen/activity/OperationActivity.java +++ b/app/src/main/java/com/bonus/canteen/activity/OperationActivity.java @@ -817,12 +817,12 @@ public class OperationActivity extends BaseActivity DialogLoader.getInstance().showConfirmDialog( this, @@ -1039,7 +1041,31 @@ public class OperationActivity extends BaseActivity dialog.dismiss() )); + + TextView exitApp = view.findViewById(R.id.exitApp); + exitApp.setOnClickListener(v3 -> DialogLoader.getInstance().showConfirmDialog( + this, + "是否确认退出程序?", + getString(R.string.lab_yes), + (dialog, which) -> { + // 获取应用的包名 + String packageName = getBaseContext().getPackageName(); + // 获取ActivityManager服务 + ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); + // 终止所有后台进程 + if (activityManager != null) { + activityManager.killBackgroundProcesses(packageName); + } + // 终止当前进程 + android.os.Process.killProcess(android.os.Process.myPid()); + System.exit(0); + dialog.dismiss(); + }, + getString(R.string.lab_no), + (dialog, which) -> dialog.dismiss() + )); }); + }); } @@ -1110,7 +1136,7 @@ public class OperationActivity extends BaseActivity { if (premiumAmount.toString().isEmpty() && !salesMenuEntityList.isEmpty()) { //弹出支付弹窗 可取消支付 或 记账 - if(isPayShow) return; + if (isPayShow) return; openDialog(); SoundManager.getInstance().play(Sound.createSimpleSound(R.raw.please_pay)); openPayWay("pay"); diff --git a/app/src/main/java/com/bonus/canteen/activity/setting/NativeInfoActivity.java b/app/src/main/java/com/bonus/canteen/activity/setting/NativeInfoActivity.java new file mode 100644 index 0000000..8e3dd5f --- /dev/null +++ b/app/src/main/java/com/bonus/canteen/activity/setting/NativeInfoActivity.java @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2025 xuexiangjys(xuexiangjys@163.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.bonus.canteen.activity.setting; + +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.TextView; + +import com.bonus.canteen.core.BaseActivity; +import com.bonus.canteen.db.AppDatabase; +import com.bonus.canteen.db.entity.base.DeviceInfo; +import com.bonus.canteen.utils.ThreadPoolManager; +import com.ccb.facedevice.sdk.utils.AppUtil; +import com.ccb.facedevice.sdk.utils.DeviceUtil; +import com.xuexiang.xui.XUI; + +import org.easydarwin.easypusher.R; +import org.easydarwin.easypusher.databinding.ActivityCanteenNativeInfoBinding; + +public class NativeInfoActivity extends BaseActivity { + + private DeviceInfo deviceInfo = new DeviceInfo(); + + @Override + protected ActivityCanteenNativeInfoBinding viewBindingInflate(LayoutInflater inflater) { + return ActivityCanteenNativeInfoBinding.inflate(inflater); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + XUI.initTheme(this); + setupImmersiveMode(); + intView(); + } + + private void setupImmersiveMode() { + View decorView = getWindow().getDecorView(); + int flags = View.SYSTEM_UI_FLAG_FULLSCREEN + | View.SYSTEM_UI_FLAG_LAYOUT_STABLE + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + flags |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; + } + decorView.setSystemUiVisibility(flags); + } + + private void intView() { + TextView tvTitle = findViewById(R.id.page_title); + TextView ivBack = findViewById(R.id.page_back); + tvTitle.setText("本机信息"); + ivBack.setOnClickListener(v -> { + Intent intent = new Intent(this, SettingsActivity.class); + startActivity(intent); + finish(); + }); + initData(); + } + + + protected void initData() { + ThreadPoolManager.getExecutor().execute(() -> { + deviceInfo = AppDatabase.getDatabase(this).deviceInfoDao().getDeviceInfoOne(); + boolean isExist = deviceInfo == null; + binding.tvSn.setText(AppUtil.getSn(this)); + binding.tvKey.setText(DeviceUtil.getDeviceKey()); + binding.tvDeviceCode.setText(isExist ? "" : deviceInfo.getDeviceName()); + binding.tvMerchantId.setText(isExist ? "" : deviceInfo.getTenantId()); + binding.tvCanteenId.setText(isExist ? "" : deviceInfo.getCanteenId()); + binding.tvCanteenName.setText(isExist ? "" : deviceInfo.getCanteenName()); + binding.tvStallId.setText(isExist ? "" : deviceInfo.getStallId()); + binding.tvStallName.setText(isExist ? "" : deviceInfo.getStallName()); + }); + } + + @Override + public void onDestroy() { + super.onDestroy(); + } +} diff --git a/app/src/main/java/com/bonus/canteen/activity/setting/SettingsActivity.java b/app/src/main/java/com/bonus/canteen/activity/setting/SettingsActivity.java index c529dde..8e5b644 100644 --- a/app/src/main/java/com/bonus/canteen/activity/setting/SettingsActivity.java +++ b/app/src/main/java/com/bonus/canteen/activity/setting/SettingsActivity.java @@ -87,6 +87,7 @@ public class SettingsActivity extends BaseActivity 0 && restrictNum < Integer.parseInt(bean.getNum().add(BigDecimal.valueOf(1)) + "")){ + if(restrictNum > 0 && restrictNum < Integer.parseInt(input.toString())){ ((Activity) context).runOnUiThread(() -> { XToastUtils.warning("该菜品已达个人限购上限!"); SoundManager.getInstance().play(Sound.createSimpleSound(R.raw.purchase_limit)); @@ -195,12 +195,9 @@ public class SalesMenuAdapter extends BaseAdapter { })) .inputRange(1, 2) .positiveText("确定") - .onPositive((dialog, which) -> { - }) + .onPositive((dialog, which) -> {}) .negativeText("取消") - .onNegative((dialog, which) -> { - dialog.dismiss(); - }) + .onNegative((dialog, which) -> dialog.dismiss()) .cancelable(false) .show(); } diff --git a/app/src/main/java/com/bonus/canteen/adapter/setting/SettingAdapter.java b/app/src/main/java/com/bonus/canteen/adapter/setting/SettingAdapter.java index a58b60c..ced5073 100644 --- a/app/src/main/java/com/bonus/canteen/adapter/setting/SettingAdapter.java +++ b/app/src/main/java/com/bonus/canteen/adapter/setting/SettingAdapter.java @@ -71,6 +71,10 @@ public class SettingAdapter extends BaseAdapter { //打开餐次页面 ((SettingsActivity) context).openNewPage("mealTime"); break; + case "本机信息": + //打开本机信息页面 + ((SettingsActivity) context).openNewPage("nativeInfo"); + break; default: break; } diff --git a/app/src/main/res/layout/activity_canteen_native_info.xml b/app/src/main/res/layout/activity_canteen_native_info.xml new file mode 100644 index 0000000..ecb3da2 --- /dev/null +++ b/app/src/main/res/layout/activity_canteen_native_info.xml @@ -0,0 +1,235 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_canteen_operation.xml b/app/src/main/res/layout/activity_canteen_operation.xml index fc8b3a1..83d7a75 100644 --- a/app/src/main/res/layout/activity_canteen_operation.xml +++ b/app/src/main/res/layout/activity_canteen_operation.xml @@ -43,15 +43,16 @@ android:layout_height="match_parent" android:layout_gravity="end"> @@ -382,7 +383,8 @@ android:id="@+id/menu_list" android:layout_width="match_parent" android:layout_height="591dp" - android:layout_weight="10"> + android:layout_weight="10" + android:padding="5dp"> diff --git a/app/src/main/res/layout/popup_window_more.xml b/app/src/main/res/layout/popup_window_more.xml index 839548e..01a12ca 100644 --- a/app/src/main/res/layout/popup_window_more.xml +++ b/app/src/main/res/layout/popup_window_more.xml @@ -54,4 +54,16 @@ android:text="重启APP" android:textColor="@color/white" android:textSize="22sp" /> + + diff --git a/sdk/build.gradle b/sdk/build.gradle index cfcd519..d1f5296 100644 --- a/sdk/build.gradle +++ b/sdk/build.gradle @@ -34,4 +34,5 @@ dependencies { implementation files('libs\\f3sdk.jar') implementation files('libs\\SDKLib.jar') implementation 'com.sunmi:printerlibrary:1.0.18' + implementation 'com.blankj:utilcodex:1.30.5' } \ No newline at end of file diff --git a/sdk/src/main/java/com/ccb/facedevice/sdk/utils/DeviceUtil.java b/sdk/src/main/java/com/ccb/facedevice/sdk/utils/DeviceUtil.java index 9958124..9c059e9 100644 --- a/sdk/src/main/java/com/ccb/facedevice/sdk/utils/DeviceUtil.java +++ b/sdk/src/main/java/com/ccb/facedevice/sdk/utils/DeviceUtil.java @@ -2,10 +2,13 @@ package com.ccb.facedevice.sdk.utils; import android.content.Context; import android.os.Build; +import android.os.Environment; import com.ccb.facedevice.sdk.FaceSdkInitCallback; import com.ccb.facedevice.sdk.mainboard.MainboardManage; +import java.io.File; + public class DeviceUtil { private static Context mContext = null; @@ -34,7 +37,23 @@ public class DeviceUtil { return ""; } } + public static String getDeviceKey() { + String str2 = FileIOUtil.readFile2String(keyFilePath()); + String str1 = str2; + if(StringUtil.isEmpty(str2)) { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append(RandomUtil.getSixRadndomNum()); + stringBuilder.append(""); + str1 = stringBuilder.toString(); + FileIOUtil.writeFileFromString(keyFilePath(), str1); + } + return str1; + } + + private static String keyFilePath() { + return (new File(FileUtil.createOrExistsDir(Environment.getExternalStorageDirectory(), "key"), "key.txt")).getAbsolutePath(); + } public static String getDeviceModel() { try { return Build.MODEL; diff --git a/sdk/src/main/java/com/ccb/facedevice/sdk/utils/FileIOUtil.java b/sdk/src/main/java/com/ccb/facedevice/sdk/utils/FileIOUtil.java new file mode 100644 index 0000000..a59de3f --- /dev/null +++ b/sdk/src/main/java/com/ccb/facedevice/sdk/utils/FileIOUtil.java @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2025 xuexiangjys(xuexiangjys@163.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.ccb.facedevice.sdk.utils; + + +import com.blankj.utilcode.util.FileIOUtils; + +import java.io.File; + +public class FileIOUtil { + public static byte[] readFile2BytesByMap(File paramFile) { + return FileIOUtils.readFile2BytesByMap(paramFile); + } + + public static String readFile2String(File paramFile) { + return FileIOUtils.readFile2String(paramFile); + } + + public static String readFile2String(File paramFile, String paramString) { + return FileIOUtils.readFile2String(paramFile, paramString); + } + + public static String readFile2String(String paramString) { + return FileIOUtils.readFile2String(paramString); + } + + public static String readFile2String(String paramString1, String paramString2) { + return FileIOUtils.readFile2String(paramString1, paramString2); + } + + public static boolean writeFileFromBytesByStream(File paramFile, byte[] paramArrayOfbyte) { + return FileIOUtils.writeFileFromBytesByStream(paramFile, paramArrayOfbyte); + } + + public static boolean writeFileFromString(File paramFile, String paramString) { + return FileIOUtils.writeFileFromString(paramFile, paramString); + } + + public static boolean writeFileFromString(String paramString1, String paramString2) { + return FileIOUtils.writeFileFromString(paramString1, paramString2); + } + + public static boolean writeFileFromString2(String paramString1, String paramString2, boolean paramBoolean) { + return FileIOUtils.writeFileFromString(paramString1, paramString2, paramBoolean); + } +} + diff --git a/sdk/src/main/java/com/ccb/facedevice/sdk/utils/RandomUtil.java b/sdk/src/main/java/com/ccb/facedevice/sdk/utils/RandomUtil.java new file mode 100644 index 0000000..8b863ac --- /dev/null +++ b/sdk/src/main/java/com/ccb/facedevice/sdk/utils/RandomUtil.java @@ -0,0 +1,6 @@ +package com.ccb.facedevice.sdk.utils; +public class RandomUtil { + public static int getSixRadndomNum() { + return (int)((Math.random() * 9.0D + 1.0D) * 100000.0D); + } +} \ No newline at end of file diff --git a/sdk/src/main/java/com/ccb/facedevice/sdk/utils/StringUtil.java b/sdk/src/main/java/com/ccb/facedevice/sdk/utils/StringUtil.java index d634835..0169462 100644 --- a/sdk/src/main/java/com/ccb/facedevice/sdk/utils/StringUtil.java +++ b/sdk/src/main/java/com/ccb/facedevice/sdk/utils/StringUtil.java @@ -46,6 +46,10 @@ public class StringUtil { return new String(chars); } + public static boolean isEmpty(String paramString) { + return paramString == null || paramString.isEmpty() || paramString.equals("null"); + } + public static String double2String(Double d) { return d == null ? null : String.valueOf(d); }