diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0082d7e..a713e2e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -150,7 +150,7 @@ - + { super.onCreate(savedInstanceState); setupImmersiveMode(); initView(); + startService(new Intent(this, DeviceMonitorService.class)); } 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); + // 设置初始全屏标志 + int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_LAYOUT_STABLE + // 隐藏导航栏 + | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + // 沉浸式模式 + | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; + + decorView.setSystemUiVisibility(uiOptions); + + // 添加监听器,当系统UI可见性变化时重新应用全屏设置 + decorView.setOnSystemUiVisibilityChangeListener(visibility -> { + // 当系统UI可见性变化时,重新设置全屏 + decorView.setSystemUiVisibility(uiOptions); + }); + + // 确保Activity的主题也支持全屏 + getWindow().setFlags( + WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN + ); + } + @Override + protected void onResume() { + super.onResume(); + setupImmersiveMode(); } public void initView() { diff --git a/app/src/main/java/com/bonus/canteen/activity/MainActivity.java b/app/src/main/java/com/bonus/canteen/activity/MainActivity.java index 3087400..ad12665 100644 --- a/app/src/main/java/com/bonus/canteen/activity/MainActivity.java +++ b/app/src/main/java/com/bonus/canteen/activity/MainActivity.java @@ -51,6 +51,7 @@ import android.view.Surface; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; +import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; import android.widget.Button; import android.widget.EditText; @@ -164,17 +165,36 @@ public class MainActivity extends AppCompatActivity { setContentView(R.layout.activity_main); activity = this; //设置全屏 - setFullScreen(); + setupImmersiveMode(); init(); //初始化秤--延迟两秒 (否则程序会崩溃) mHandler.postDelayed(this::initScale, 2000); } - private void setFullScreen() { - getWindow().getDecorView().setSystemUiVisibility( - View.SYSTEM_UI_FLAG_FULLSCREEN - | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN - | View.SYSTEM_UI_FLAG_LAYOUT_STABLE + private void setupImmersiveMode() { + View decorView = getWindow().getDecorView(); + + // 设置初始全屏标志 + int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_LAYOUT_STABLE + // 隐藏导航栏 + | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + // 沉浸式模式 + | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; + + decorView.setSystemUiVisibility(uiOptions); + + // 添加监听器,当系统UI可见性变化时重新应用全屏设置 + decorView.setOnSystemUiVisibilityChangeListener(visibility -> { + // 当系统UI可见性变化时,重新设置全屏 + decorView.setSystemUiVisibility(uiOptions); + }); + + // 确保Activity的主题也支持全屏 + getWindow().setFlags( + WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN ); } @@ -273,6 +293,7 @@ public class MainActivity extends AppCompatActivity { }); findViewById(R.id.refresh).setOnClickListener(view -> { isInitData = false; + XToastUtils.info("正在刷新,请稍候..."); initStallTab(canteenList.get(0).getCanteenId()); }); } @@ -321,7 +342,7 @@ public class MainActivity extends AppCompatActivity { for (int i = 0; i < tempSize; i++) { hexString.append(String.format("%02X ", tempBuffer[i])); } - if (!isStopRead && !ThreadPoolManager.getExecutor().isShutdown()) { + if (!ThreadPoolManager.getExecutor().isShutdown()) { ThreadPoolManager.getExecutor().execute(() -> parseTheData(hexString.toString())); } } @@ -642,7 +663,6 @@ public class MainActivity extends AppCompatActivity { if (jsonObject.getInteger("code") == 200) { String userName = AppDatabase.getDatabase(this).loginInfoDao().getLoginInfoOne().getUserName(); runOnUiThread(() -> { - isStopRead = false; // 重新开始读取秤数据 isUpload = false; XToastUtils.success("留样成功"); KeepSampleRecordBean keepSampleRecordBean = new KeepSampleRecordBean(); @@ -662,15 +682,16 @@ public class MainActivity extends AppCompatActivity { toPrint(keepSampleRecordBean); dialog.dismiss(); currentDishBean = new DishBean(); // 清空当前菜品信息 + ThreadPoolManager.getExecutor().execute(this::readScale); }); } else { isUpload = false; - isStopRead = false; // 重新开始读取秤数据 + ThreadPoolManager.getExecutor().execute(this::readScale); runOnUiThread(() -> XToastUtils.error("留样失败,请重试!")); } } else { isUpload = false; - isStopRead = false; // 重新开始读取秤数据 + ThreadPoolManager.getExecutor().execute(this::readScale); runOnUiThread(() -> XToastUtils.error("留样失败,请重试!")); } }); @@ -685,9 +706,13 @@ public class MainActivity extends AppCompatActivity { try { h = AutoReplyPrint.INSTANCE.CP_Port_OpenUsb("VID:0x4B43,PID:0x3538", 1); if (h == Pointer.NULL) { - Log.e(TAG, "打印机连接失败"); - runOnUiThread(() -> XToastUtils.error("打印机连接失败,请检查设备连接")); - return; +// runOnUiThread(() -> XToastUtils.warning("打印机连接失败,尝试重新连接")); + h = AutoReplyPrint.INSTANCE.CP_Port_OpenUsb("VID:0x4B43,PID:0x3538", 1); + if (h == Pointer.NULL) { + Log.e(TAG, "打印机连接失败"); + runOnUiThread(() -> XToastUtils.error("打印机连接失败,请检查设备连接")); + return; + } } TestFunction fun = new TestFunction(); fun.ctx = activity; @@ -1181,7 +1206,7 @@ public class MainActivity extends AppCompatActivity { protected void onResume() { super.onResume(); startBackgroundThread(); - + setupImmersiveMode(); // 如果Surface已经可用,直接打开相机 if (mSurfaceView.getHolder().getSurface().isValid()) { openCamera(); diff --git a/app/src/main/java/com/bonus/canteen/activity/ParamSettingsActivity.java b/app/src/main/java/com/bonus/canteen/activity/ParamSettingsActivity.java index 5badcdd..6bda649 100644 --- a/app/src/main/java/com/bonus/canteen/activity/ParamSettingsActivity.java +++ b/app/src/main/java/com/bonus/canteen/activity/ParamSettingsActivity.java @@ -24,6 +24,7 @@ import android.os.Bundle; import android.text.InputType; import android.view.LayoutInflater; import android.view.View; +import android.view.WindowManager; import android.widget.TextView; import androidx.annotation.NonNull; @@ -55,18 +56,42 @@ public class ParamSettingsActivity extends BaseActivity { + // 当系统UI可见性变化时,重新设置全屏 + decorView.setSystemUiVisibility(uiOptions); + }); + + // 确保Activity的主题也支持全屏 + getWindow().setFlags( + WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN + ); + } + @Override + protected void onResume() { + super.onResume(); + setupImmersiveMode(); + } private void initView() { TextView pageTitle = findViewById(R.id.page_title); pageTitle.setText("参数设置"); diff --git a/app/src/main/java/com/bonus/canteen/activity/SampleRetentionRecordActivity.java b/app/src/main/java/com/bonus/canteen/activity/SampleRetentionRecordActivity.java index 6988ed6..93e75e4 100644 --- a/app/src/main/java/com/bonus/canteen/activity/SampleRetentionRecordActivity.java +++ b/app/src/main/java/com/bonus/canteen/activity/SampleRetentionRecordActivity.java @@ -8,6 +8,7 @@ import android.os.Looper; import android.util.Log; import android.view.LayoutInflater; import android.view.View; +import android.view.WindowManager; import android.widget.TextView; import androidx.annotation.NonNull; @@ -76,20 +77,44 @@ public class SampleRetentionRecordActivity extends BaseActivity { + // 当系统UI可见性变化时,重新设置全屏 + decorView.setSystemUiVisibility(uiOptions); + }); + + // 确保Activity的主题也支持全屏 + getWindow().setFlags( + WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN ); } + @Override + protected void onResume() { + super.onResume(); + setupImmersiveMode(); + } private void initSaveStatusList() { saveStatusBeanList.clear(); diff --git a/app/src/main/java/com/bonus/canteen/activity/SampleRetentionRecordDetailsActivity.java b/app/src/main/java/com/bonus/canteen/activity/SampleRetentionRecordDetailsActivity.java index a58967c..a165a2f 100644 --- a/app/src/main/java/com/bonus/canteen/activity/SampleRetentionRecordDetailsActivity.java +++ b/app/src/main/java/com/bonus/canteen/activity/SampleRetentionRecordDetailsActivity.java @@ -23,6 +23,7 @@ import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; +import android.view.WindowManager; import android.widget.ImageView; import android.widget.TextView; @@ -56,12 +57,7 @@ public class SampleRetentionRecordDetailsActivity extends BaseActivity { + // 当系统UI可见性变化时,重新设置全屏 + decorView.setSystemUiVisibility(uiOptions); + }); + + // 确保Activity的主题也支持全屏 + getWindow().setFlags( + WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN + ); + } + @Override + protected void onResume() { + super.onResume(); + setupImmersiveMode(); + } protected void initTitleView() { TextView titleView = findViewById(R.id.page_title); @@ -103,7 +129,7 @@ public class SampleRetentionRecordDetailsActivity extends BaseActivity extends XPageAct protected void onCreate(Bundle savedInstanceState) { initStatusBarStyle(); super.onCreate(savedInstanceState); - registerSlideBack(); + unregisterSlideBack(); } /** diff --git a/app/src/main/java/com/bonus/canteen/print/TestFunction.java b/app/src/main/java/com/bonus/canteen/print/TestFunction.java index ff7e5f0..2857097 100644 --- a/app/src/main/java/com/bonus/canteen/print/TestFunction.java +++ b/app/src/main/java/com/bonus/canteen/print/TestFunction.java @@ -35,9 +35,9 @@ public class TestFunction { void Test_Pos_QueryPrintResult(Pointer h) { boolean result = AutoReplyPrint.INSTANCE.CP_Pos_QueryPrintResult(h, 30000); if (!result) - TestUtils.showMessageOnUiThread(ctx, "Print failed"); + TestUtils.showMessageOnUiThread(ctx, "打印失败"); else - TestUtils.showMessageOnUiThread(ctx, "Print Success"); + TestUtils.showMessageOnUiThread(ctx, "打印成功"); } } diff --git a/app/src/main/java/com/bonus/canteen/service/DeviceMonitorService.java b/app/src/main/java/com/bonus/canteen/service/DeviceMonitorService.java new file mode 100644 index 0000000..85c94f0 --- /dev/null +++ b/app/src/main/java/com/bonus/canteen/service/DeviceMonitorService.java @@ -0,0 +1,124 @@ +/* + * 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.service; + +import android.app.Service; +import android.content.Intent; +import android.os.IBinder; +import android.util.Log; + +import androidx.annotation.Nullable; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.net.ServerSocket; +import java.net.Socket; + +// Android Service中创建TCP服务 +public class DeviceMonitorService extends Service { + private ServerSocket serverSocket; + private boolean isRunning = false; + private int port = 8080; // 设置的端口号 + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + startTCPServer(); + return START_STICKY; + } + + private void startTCPServer() { + new Thread(() -> { + try { + serverSocket = new ServerSocket(port); + isRunning = true; + + Log.d("DeviceMonitor", "TCP服务已启动,端口: " + port); + + while (isRunning) { + Socket clientSocket = serverSocket.accept(); + // 处理客户端连接 + handleClientConnection(clientSocket); + } + + } catch (IOException e) { + Log.e("DeviceMonitor", "启动TCP服务失败: " + e.getMessage()); + // 端口被占用,尝试其他端口 + tryAlternativePorts(); + } + }).start(); + } + + private void tryAlternativePorts() { + int[] alternativePorts = {8081, 8082, 8000, 8888, 9000}; + for (int altPort : alternativePorts) { + try { + this.port = altPort; + serverSocket = new ServerSocket(altPort); + isRunning = true; + Log.d("DeviceMonitor", "TCP服务在备用端口启动: " + altPort); + break; + } catch (IOException ex) { + Log.e("DeviceMonitor", "端口 " + altPort + " 也被占用"); + } + } + } + + private void handleClientConnection(Socket clientSocket) { + new Thread(() -> { + try { + // 读取客户端数据 + BufferedReader reader = new BufferedReader( + new InputStreamReader(clientSocket.getInputStream())); + + String request = reader.readLine(); +// Log.d("DeviceMonitor", "收到请求: " + request); + + // 返回响应 + PrintWriter writer = new PrintWriter(clientSocket.getOutputStream()); + writer.println("DEVICE_STATUS:ONLINE"); + writer.flush(); + + clientSocket.close(); + } catch (IOException e) { + Log.e("DeviceMonitor", "处理连接错误: " + e.getMessage()); + } + }).start(); + } + + @Override + public void onDestroy() { + isRunning = false; + try { + if (serverSocket != null) { + serverSocket.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + super.onDestroy(); + } + + @Nullable + @Override + public IBinder onBind(Intent intent) { + return null; + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/bonus/canteen/utils/DateTimeHelper.java b/app/src/main/java/com/bonus/canteen/utils/DateTimeHelper.java index a58e0fa..0e4dd04 100644 --- a/app/src/main/java/com/bonus/canteen/utils/DateTimeHelper.java +++ b/app/src/main/java/com/bonus/canteen/utils/DateTimeHelper.java @@ -18,11 +18,13 @@ package com.bonus.canteen.utils; import android.annotation.SuppressLint; +import android.util.Log; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; +import java.util.concurrent.TimeUnit; public class DateTimeHelper { public static String format(Date d, String f) { @@ -87,4 +89,20 @@ public class DateTimeHelper { } return false; } + + public static int calculateHoursDifference(String startTimeStr, String endTimeStr) { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); + try { + Date startDate = formatter.parse(startTimeStr); + Date endDate = formatter.parse(endTimeStr); + + long diffInMillis = Math.abs(endDate.getTime() - startDate.getTime()); + Log.e("duration", diffInMillis + ""); + + return (int) TimeUnit.MILLISECONDS.toHours(diffInMillis); + } catch (ParseException e) { + e.printStackTrace(); + return 0; + } + } } diff --git a/app/src/main/java/com/bonus/canteen/utils/WorkConfig.java b/app/src/main/java/com/bonus/canteen/utils/WorkConfig.java index 807c786..f427de6 100644 --- a/app/src/main/java/com/bonus/canteen/utils/WorkConfig.java +++ b/app/src/main/java/com/bonus/canteen/utils/WorkConfig.java @@ -25,15 +25,15 @@ public class WorkConfig { throw new UnsupportedOperationException("Cannot instantiate utility class"); } //本地 - protected static String baseUrl = "http://192.168.0.244:48380/smart-canteen"; - protected static String prefixesUrl = "http://192.168.0.244:48380"; + protected static String baseUrl = "http://192.168.20.234:48390/smart-canteen"; + protected static String prefixesUrl = "http://192.168.20.234:48390"; // protected static String baseUrl = "http://192.168.0.244:48380/smart-canteen"; // protected static String prefixesUrl = "http://192.168.0.244:48380"; - protected static String fileUrl = "http://192.168.0.14:9090/lnyst/"; + protected static String fileUrl = "http://192.168.20.234:9090/lnyst/"; protected static String updateUrl = "https://www.baidu.com"; - protected static String serverUri = "tcp://192.168.0.244:1883"; - protected static String MqttUserName = "admin"; - protected static String MqttPassWord = "Bonus@admin123!"; + protected static String serverUri = "tcp://192.168.20.234:1883"; + protected static String MqttUserName = "guest"; + protected static String MqttPassWord = "Bonus@Rabbitmq123!"; protected static String APP_ID = "52XE2dQBtdmMsfDMvyKmPCCPyFsc4jvo8TKvAdaYfr28"; protected static String APP_KEY = "9YFPa6eiuNQAFnzJUadn4LaR8w1bcw3a5ZWYZB6FB57Y"; protected static String FACE_PASS_RATE = "0.8"; diff --git a/app/src/main/res/drawable-hdpi/ic_splash_app_logo_xui.png b/app/src/main/res/drawable-hdpi/ic_splash_app_logo_xui.png index 1f5c884..185cdaa 100644 Binary files a/app/src/main/res/drawable-hdpi/ic_splash_app_logo_xui.png and b/app/src/main/res/drawable-hdpi/ic_splash_app_logo_xui.png differ diff --git a/app/src/main/res/drawable/activity_title_bg.xml b/app/src/main/res/drawable/activity_title_bg.xml new file mode 100644 index 0000000..c534217 --- /dev/null +++ b/app/src/main/res/drawable/activity_title_bg.xml @@ -0,0 +1,7 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_login_logo.png b/app/src/main/res/drawable/ic_login_logo.png index fe7c15d..f62e44c 100644 Binary files a/app/src/main/res/drawable/ic_login_logo.png and b/app/src/main/res/drawable/ic_login_logo.png differ diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 20e53c5..3155cc5 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -26,7 +26,7 @@ android:layout_width="500dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" - android:layout_marginStart="240dp" + android:layout_marginStart="160dp" android:padding="50dp" android:background="@drawable/btn_border_bg_10_white_1" android:orientation="vertical"> @@ -82,7 +82,7 @@ android:maxLength="20" android:hint="@string/please_enter_username" android:textColorHint="#999999" - android:text="13866134935" + android:text="18158863319" android:inputType="textPersonName" android:background="@android:color/transparent" android:paddingStart="10dp" @@ -116,7 +116,7 @@ android:layout_marginEnd="5dp" android:inputType="textPassword" android:paddingLeft="10dp" - android:text="Bonus$2028" /> + android:text="Bonus$2025" /> + android:layout_height="wrap_content"> + android:textSize="11pt"/> + android:textSize="11pt"/> + android:textSize="11pt"/> diff --git a/app/src/main/res/layout/activity_title.xml b/app/src/main/res/layout/activity_title.xml index b55f093..c39ddb8 100644 --- a/app/src/main/res/layout/activity_title.xml +++ b/app/src/main/res/layout/activity_title.xml @@ -3,7 +3,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="80dp" - android:background="@drawable/title_bg" + android:background="@drawable/activity_title_bg" android:orientation="vertical"> - 智慧食堂 + 智能留样仪 通用浏览器 更多