diff --git a/README.md b/README.md index 9672d9c..834347f 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ NLChat是专门为[小熊派BearPi的星闪代码](https://github.com/Hny0305Lin/Bearpi_Hi2821_Pico_NLChat)开发的一款基于SLE通讯的文本传输软件,目前还在开发中,敬请期待完整版向大家开放。 -![IMG.SHIELD.IO](https://img.shields.io/badge/Hi2821_NLChat-Release1.2.1.2024.0701-gray.svg?colorA=007FFC&colorB=4DDDFC&style=for-the-badge) +![IMG.SHIELD.IO](https://img.shields.io/badge/Hi2821_NLChat-Release1.2.16.2024.0701-gray.svg?colorA=007FFC&colorB=4DDDFC&style=for-the-badge) ![NLChat](https://github.com/Hny0305Lin/NLChat/blob/master/DevSummary/NLChat.jpg) diff --git a/app/src/main/java/com/haohanyh/linmengjia/nearlink/nlchat/fun/ChatCore/ChatUtils.java b/app/src/main/java/com/haohanyh/linmengjia/nearlink/nlchat/fun/ChatCore/ChatUtils.java index d37b201..184f86a 100644 --- a/app/src/main/java/com/haohanyh/linmengjia/nearlink/nlchat/fun/ChatCore/ChatUtils.java +++ b/app/src/main/java/com/haohanyh/linmengjia/nearlink/nlchat/fun/ChatCore/ChatUtils.java @@ -2,9 +2,20 @@ package com.haohanyh.linmengjia.nearlink.nlchat.fun.ChatCore; public class ChatUtils { + //这里设置的是UI相关,是否做到消息滚动展示在UI上,而不是全部展示,全部展示会占用大量UI资源 + private static final boolean scrollingMessages = false; // 控制是否启用滚动消息功能 + //这里设置的是数据库相关,是否做到消息保存进SQLite里 + private static boolean sqlite = true; // 控制是否启用SQLite功能 //这里设置的是跟C代码相关的,白名单获取聊天文本,当这些文本出现在串口通讯里面的时候,提取这String后者即可,期间过滤掉前者和大量串口log。 private static final String PREFIX_SERVER = " Let's start chatting, This is the content of the server:"; private static final String PREFIX_CLIENT = " Let's start chatting, This is the content of the client:"; + //控制是否启用滚动消息功能 + public static boolean isScrollingMessages() { return scrollingMessages; } + + //控制是否启用SQLite功能 + public static boolean isSqlite() { return sqlite; } + + public static void setSqlite(boolean sqlite) { ChatUtils.sqlite = sqlite; } //对方为星闪服务端 public static String getPrefixServer() { diff --git a/app/src/main/java/com/haohanyh/linmengjia/nearlink/nlchat/fun/MainActivity.java b/app/src/main/java/com/haohanyh/linmengjia/nearlink/nlchat/fun/MainActivity.java index 2a4b0a7..1e00578 100644 --- a/app/src/main/java/com/haohanyh/linmengjia/nearlink/nlchat/fun/MainActivity.java +++ b/app/src/main/java/com/haohanyh/linmengjia/nearlink/nlchat/fun/MainActivity.java @@ -7,6 +7,7 @@ import android.content.DialogInterface; import android.content.Intent; import android.content.res.Resources; +import android.database.Cursor; import android.hardware.usb.UsbManager; import android.net.Uri; import android.os.Build; @@ -52,6 +53,7 @@ import com.haohanyh.linmengjia.nearlink.nlchat.fun.WCHUart.WCHUartSettings; import java.text.SimpleDateFormat; +import java.util.LinkedList; import java.util.Objects; public class MainActivity extends AppCompatActivity implements View.OnClickListener { @@ -89,7 +91,8 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe //手机常量,代码里设置 private final boolean MobileKeepScreenOn = false; - + //调用SQLite + private SQLiteDataBaseAPP dbHelper; /** * @@ -127,12 +130,16 @@ private void Init() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { if (Environment.isExternalStorageManager()) { Log.v(TAG,"Android 10以上设备是否获取最高读写文件权限?:" + Environment.isExternalStorageManager()); - SQLiteDataBaseAPP.SQLiteData().CreateSql(getApplicationContext().getFilesDir().getAbsolutePath()); + //既然有权限了,带上数据库初始化 + if (ChatUtils.isSqlite()) { + dbHelper = SQLiteDataBaseAPP.SQLiteData(); + dbHelper.CreateSql(getFilesDir().getPath()); + loadMessagesFromDatabase(); + } } else { Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);intent.setData(Uri.parse("package:" + this.getPackageName()));startActivityForResult(intent, 1024); } } - //创建CH34x设备对象 MainAPP.CH34X = new CH34xUARTDriver( (UsbManager) getSystemService(Context.USB_SERVICE), this, @@ -472,7 +479,7 @@ private void InitToOpen() { if (MainAPP.CH34X.setConfig(WCHUartSettings.needGetData().getBaudRate(), WCHUartSettings.needGetData().getDataBit(), WCHUartSettings.needGetData().getStopBit(), WCHUartSettings.needGetData().getParity(), WCHUartSettings.needGetData().getFlowControl())) { - CH34xReadData();//配置成功后读数据 + NearLinkChatReadData();//配置成功后读数据 HhandlerI.sendEmptyMessage(30); SnackBarToastForDebug("请主动发送数据或静待接收数据!","谢谢",0,Snackbar.LENGTH_SHORT); } else { @@ -487,8 +494,38 @@ private void InitToOpen() { } } - public String TextOfServer = ""; - private void CH34xReadData() { + private void loadMessagesFromDatabase() { + Cursor cursor = dbHelper.getAllMessages(); + if (cursor != null) { + try { + while (cursor.moveToNext()) { + @SuppressLint("Range") String message = cursor.getString(cursor.getColumnIndex("message")); + @SuppressLint("Range") String sender = cursor.getString(cursor.getColumnIndex("sender")); + // 根据sender区分消息显示 + if ("server".equals(sender)) { + NearLinkServerText.append(message + "\n"); + } else { + NearLinkClientText.append(message + "\n"); + } + } + } finally { + cursor.close(); + } + } + } + + private void saveMessageToDatabase(String message, String sender) { + String timestamp = dateFormat.format(new java.util.Date()); + dbHelper.saveMessageToDatabase(message, sender, timestamp); + } + + private StringBuilder buffer = new StringBuilder(); + private LinkedList serverMessageQueue = new LinkedList<>(); + private LinkedList clientMessageQueue = new LinkedList<>(); + private static final int MAX_MESSAGES = 10; // 设置最大消息数量 + @SuppressLint("SimpleDateFormat") + private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss.SSS"); + private void NearLinkChatReadData() { //先播报星闪软件情况,已经UART接入星闪网络,再好好的处理字符 HhandlerI.sendEmptyMessage(10); StringBuffer stringBuffer = new StringBuffer(); @@ -501,19 +538,33 @@ private void CH34xReadData() { stringBuffer.append(processedString); //处理完再打印到UI上 runOnUiThread(() -> { - NearLinkServerText.append(processedString); - if (NearLinkServerText.length() > 2048) { - String str = NearLinkServerText.getText().toString().substring(NearLinkServerText.getText().length() - 1024, NearLinkServerText.getText().length()); - NearLinkServerText.setText(""); - NearLinkServerText.append(str); + saveMessageToDatabase(processedString, "server"); + if (ChatUtils.isScrollingMessages()) { + if (serverMessageQueue.size() >= MAX_MESSAGES * 3) { + serverMessageQueue.poll(); + } + serverMessageQueue.add(processedString); + updateServerTextView(); + } else { + NearLinkServerText.append(processedString); + if (NearLinkServerText.length() > 2048) { + String str = NearLinkServerText.getText().toString().substring(NearLinkServerText.getText().length() - 1024, NearLinkServerText.getText().length()); + NearLinkServerText.setText(""); + NearLinkServerText.append(str); + } } }); }); } - private StringBuilder buffer = new StringBuilder(); - @SuppressLint("SimpleDateFormat") - private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss.SSS"); + private void updateServerTextView() { + StringBuilder allMessages = new StringBuilder(); + for (String message : serverMessageQueue) { + allMessages.append(message); + } + NearLinkServerText.setText(allMessages.toString()); + } + private String CH34xProcessingForReadData(String string) { buffer.append(string); String result = buffer.toString(); @@ -550,8 +601,7 @@ private String CH34xProcessingForReadData(String string) { return ""; } - public String TextOfClient = ""; - public void nearlinkChatSend(View view) { + public void NearLinkChatSendData(View view) { HhandlerI.sendEmptyMessage(10); byte[] to_send = StringUtils.needProcess().toByteArray(String.valueOf(EditChatSend.getText())); //以字符串方式发送 int retval = MainAPP.CH34X.writeData(to_send, to_send.length);//写数据,第一个参数为需要发送的字节数组,第二个参数为需要发送的字节长度,返回实际发送的字节长度 @@ -563,17 +613,34 @@ public void nearlinkChatSend(View view) { runOnUiThread(new Runnable() { @Override public void run() { - NearLinkClientText.append(TextOfClient); - if (NearLinkClientText.length() > 2048) { - String str = NearLinkClientText.getText().toString().substring(NearLinkClientText.getText().length() - 1024, NearLinkClientText.getText().length()); - NearLinkClientText.setText(""); - NearLinkClientText.append(str); + saveMessageToDatabase(TextOfClient, "client"); + if (ChatUtils.isScrollingMessages()) { + if (clientMessageQueue.size() >= MAX_MESSAGES) { + clientMessageQueue.poll(); // 移除最早的消息 + } + clientMessageQueue.add(TextOfClient); + updateClientTextView(); + } else { + NearLinkClientText.append(TextOfClient); + if (NearLinkClientText.length() > 2048) { + String str = NearLinkClientText.getText().toString().substring(NearLinkClientText.getText().length() - 1024, NearLinkClientText.getText().length()); + NearLinkClientText.setText(""); + NearLinkClientText.append(str); + } } } }); } } + private void updateClientTextView() { + StringBuilder allMessages = new StringBuilder(); + for (String message : clientMessageQueue) { + allMessages.append(message); + } + NearLinkClientText.setText(allMessages.toString()); + } + private String CH34xProcessingForSendData(String string) { //添加时间戳 String timestamp = dateFormat.format(new java.util.Date()); diff --git a/app/src/main/java/com/haohanyh/linmengjia/nearlink/nlchat/fun/SQLite/SQLiteDataBaseAPP.java b/app/src/main/java/com/haohanyh/linmengjia/nearlink/nlchat/fun/SQLite/SQLiteDataBaseAPP.java index 7b8f6ba..6fe7048 100644 --- a/app/src/main/java/com/haohanyh/linmengjia/nearlink/nlchat/fun/SQLite/SQLiteDataBaseAPP.java +++ b/app/src/main/java/com/haohanyh/linmengjia/nearlink/nlchat/fun/SQLite/SQLiteDataBaseAPP.java @@ -5,6 +5,9 @@ */ package com.haohanyh.linmengjia.nearlink.nlchat.fun.SQLite; +import android.content.ContentValues; +import android.database.Cursor; + import io.requery.android.database.sqlite.SQLiteDatabase; public class SQLiteDataBaseAPP { @@ -20,6 +23,29 @@ public void CreateSql(String SDPath) { sqLiteDataBaseForUser = SQLiteDatabase.openOrCreateDatabase(SDPath + "/NLChatUser.db", null); sqLiteDataBaseForChat = SQLiteDatabase.openOrCreateDatabase(SDPath + "/NLChatChat.db",null); + createChatTable(); sqLiteDataBaseForDevice = SQLiteDatabase.openOrCreateDatabase(SDPath + "/NLChatDevice.db",null); } + + private void createChatTable() { + String TABLE_CREATE = + "CREATE TABLE IF NOT EXISTS messages (" + + "_id INTEGER PRIMARY KEY AUTOINCREMENT, " + + "message TEXT, " + + "sender TEXT, " + + "timestamp TEXT);"; + sqLiteDataBaseForChat.execSQL(TABLE_CREATE); + } + + public void saveMessageToDatabase(String message, String sender, String timestamp) { + ContentValues values = new ContentValues(); + values.put("message", message); + values.put("sender", sender); + values.put("timestamp", timestamp); + sqLiteDataBaseForChat.insert("messages", null, values); + } + + public Cursor getAllMessages() { + return sqLiteDataBaseForChat.query("messages", null, null, null, null, null, "timestamp ASC"); + } } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 4e4ca39..547769e 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -160,7 +160,7 @@ - - - - - - - - NLChat com.haohanyh.linmengjia.nearlink.nlchat.fun - 1.2.1.2024.0701 + 1.2.16.2024.0701 NLChat,浩瀚银河宗旨为用爱和魔法创造Android APP。 友情感谢 @@ -59,7 +59,6 @@ 阅后即焚(默认2分钟清) 通讯加密(Dev) 聊天文本进入剪贴板 - 聊天消息自动+1 消息通知(手动开启) 背景运行(Daemon) 自动备份设置(JSON)