diff --git a/src/Notes-master/res/drawable/bg_bubble_ai.xml b/src/Notes-master/res/drawable/bg_bubble_ai.xml new file mode 100644 index 0000000..4cff932 --- /dev/null +++ b/src/Notes-master/res/drawable/bg_bubble_ai.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/src/Notes-master/res/drawable/bg_bubble_reminder.xml b/src/Notes-master/res/drawable/bg_bubble_reminder.xml new file mode 100644 index 0000000..ead6ad0 --- /dev/null +++ b/src/Notes-master/res/drawable/bg_bubble_reminder.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/src/Notes-master/res/drawable/bg_bubble_user.xml b/src/Notes-master/res/drawable/bg_bubble_user.xml new file mode 100644 index 0000000..e51d7c4 --- /dev/null +++ b/src/Notes-master/res/drawable/bg_bubble_user.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/src/Notes-master/res/menu/note_list.xml b/src/Notes-master/res/menu/note_list.xml index 9aa83b0..b90b9ff 100644 --- a/src/Notes-master/res/menu/note_list.xml +++ b/src/Notes-master/res/menu/note_list.xml @@ -25,9 +25,17 @@ android:id="@+id/menu_export_text" android:title="@string/menu_export_text"/> + + android:id="@+id/menu_pull" + android:title="@string/menu_pull" + android:icon="@android:drawable/ic_popup_sync" /> + + + %1$d 字 + Push + Pull + 全局悬浮球 开启后可在屏幕边缘显示快捷图标,点击立即记录灵感 开启悬浮球需要“显示在其他应用上”的权限,请手动授予 diff --git a/src/Notes-master/src/net/micode/notes/data/Notes.java b/src/Notes-master/src/net/micode/notes/data/Notes.java index c799bd9..cde268f 100644 --- a/src/Notes-master/src/net/micode/notes/data/Notes.java +++ b/src/Notes-master/src/net/micode/notes/data/Notes.java @@ -268,8 +268,6 @@ public class Notes { * 1: 日程提醒卡片 (Reminder Card) */ public static final String MSG_TYPE = "msg_type"; - public static final int MSG_TYPE_TEXT = 0; // 普通对话 - public static final int MSG_TYPE_REMINDER = 1; // [核心] 提醒卡片(UI显示金色气泡) public static final String CONTENT = "content"; public static final String CREATED_AT = "created_at"; diff --git a/src/Notes-master/src/net/micode/notes/data/NotesProvider.java b/src/Notes-master/src/net/micode/notes/data/NotesProvider.java index cc8e5fb..e5cebcd 100644 --- a/src/Notes-master/src/net/micode/notes/data/NotesProvider.java +++ b/src/Notes-master/src/net/micode/notes/data/NotesProvider.java @@ -50,7 +50,6 @@ public class NotesProvider extends ContentProvider { private static final int URI_SEARCH = 5; private static final int URI_SEARCH_SUGGEST = 6; private static final int URI_USER_ACCOUNT = 7; // 新增编号 - private static final int URI_CHAT_MESSAGES = 8; static { mMatcher = new UriMatcher(UriMatcher.NO_MATCH); @@ -62,8 +61,6 @@ public class NotesProvider extends ContentProvider { mMatcher.addURI(Notes.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY, URI_SEARCH_SUGGEST); mMatcher.addURI(Notes.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", URI_SEARCH_SUGGEST); mMatcher.addURI(Notes.AUTHORITY, "user_account", URI_USER_ACCOUNT); - // [核心新增]:让系统认识 content://micode_notes/chat_messages - mMatcher.addURI(Notes.AUTHORITY, "chat_messages", URI_CHAT_MESSAGES); } /** @@ -143,9 +140,6 @@ public class NotesProvider extends ContentProvider { Log.e(TAG, "got exception: " + ex.toString()); } break; - case URI_CHAT_MESSAGES: - c = db.query(NotesDatabaseHelper.TABLE.CHAT_MESSAGES, projection, selection, selectionArgs, null, null, sortOrder); - break; default: throw new IllegalArgumentException("Unknown URI " + uri); } @@ -174,12 +168,6 @@ public class NotesProvider extends ContentProvider { case URI_USER_ACCOUNT: insertedId = db.insert(TABLE.USER_ACCOUNT, null, values); break; - // [核心新增]:处理聊天消息的真正入库逻辑 - case URI_CHAT_MESSAGES: - insertedId = db.insert(NotesDatabaseHelper.TABLE.CHAT_MESSAGES, null, values); - // 插入成功后发送数据变更通知,让 ChatFragment 能够自动刷新 - getContext().getContentResolver().notifyChange(uri, null); - break; default: throw new IllegalArgumentException("Unknown URI " + uri); } diff --git a/src/Notes-master/src/net/micode/notes/sync/SyncWorker.java b/src/Notes-master/src/net/micode/notes/sync/SyncWorker.java index 5702460..f1e55a6 100644 --- a/src/Notes-master/src/net/micode/notes/sync/SyncWorker.java +++ b/src/Notes-master/src/net/micode/notes/sync/SyncWorker.java @@ -15,17 +15,11 @@ import androidx.work.WorkerParameters; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.firestore.FirebaseFirestore; import com.google.firebase.firestore.QueryDocumentSnapshot; -import com.google.gson.JsonObject; import net.micode.notes.data.Notes; import net.micode.notes.data.Notes.NoteColumns; import net.micode.notes.model.CloudNote; -import net.micode.notes.tool.AiNotificationHelper; import net.micode.notes.tool.SyncMapper; -import net.micode.notes.tool.ai.AiDataSyncHelper; -import net.micode.notes.tool.ai.CozeClient; -import net.micode.notes.tool.ai.CozeRequest; -import net.micode.notes.tool.ai.CozeResponse; import java.util.UUID; import java.util.concurrent.CountDownLatch; @@ -37,7 +31,6 @@ public class SyncWorker extends Worker { public static final int MODE_ALL = 0; // 默认:全量同步 public static final int MODE_PUSH = 1; // 仅上传 public static final int MODE_PULL = 2; // 仅拉取 - public static final int MODE_REMINDER = 3; public SyncWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) { super(context, workerParams); @@ -63,7 +56,6 @@ public class SyncWorker extends Worker { // --- PUSH 逻辑 (保持同步执行即可,因为它本身不依赖回调返回数据给UI) --- if (mode == MODE_PUSH || mode == MODE_ALL) { performPush(db, uid); - syncToCozeAgent(); } // --- PULL 逻辑 (异步变同步) --- @@ -80,12 +72,6 @@ public class SyncWorker extends Worker { } } - // 2. 在 doWork() 中增加判断 - if (mode == MODE_REMINDER) { - String title = getInputData().getString("reminder_title"); - requestAiReminderReply(title); - } - return isSuccess[0] ? Result.success() : Result.failure(); } catch (Exception e) { @@ -94,161 +80,6 @@ public class SyncWorker extends Worker { } } - // 3. 实现提醒请求逻辑 - private void requestAiReminderReply(String agendaTitle) { - try { - // 1. 构造请求参数 - com.google.gson.JsonObject json = new com.google.gson.JsonObject(); - json.addProperty("intent", "reminder"); - json.addProperty("payload", "日程即将开始:" + agendaTitle); - json.addProperty("current_time", AiDataSyncHelper.getCurrentTime()); - - // 2. 发起对话 - CozeRequest request = new CozeRequest(CozeClient.BOT_ID, "user_demo", json.toString()); - retrofit2.Response response = CozeClient.getInstance() - .chat(CozeClient.getAuthToken(), request).execute(); - - // 声明变量,用于存放最终结果 - String finalAnswer = null; - - if (response.isSuccessful() && response.body() != null && response.body().data != null) { - String chatId = response.body().data.id; - String convId = response.body().data.conversation_id; - - // 3. 轮询状态直到完成 - String status = ""; - int retries = 0; - while (!"completed".equals(status) && retries < 15) { - Thread.sleep(2000); - retrofit2.Response pollResp = CozeClient.getInstance() - .retrieveChat(CozeClient.getAuthToken(), chatId, convId).execute(); - - if (pollResp.isSuccessful() && pollResp.body() != null && pollResp.body().data != null) { - status = pollResp.body().data.status; - } - retries++; - } - - // 4. [核心修复点]:状态完成后,请求消息列表并解析出 content - if ("completed".equals(status)) { - retrofit2.Response msgListResp = CozeClient.getInstance() - .getMessageList(CozeClient.getAuthToken(), chatId, convId).execute(); - - if (msgListResp.isSuccessful() && msgListResp.body() != null) { - com.google.gson.JsonArray messages = msgListResp.body().getAsJsonArray("data"); - - // 遍历寻找 AI 的回答内容 - for (com.google.gson.JsonElement el : messages) { - com.google.gson.JsonObject m = el.getAsJsonObject(); - if ("assistant".equals(m.get("role").getAsString()) && - "answer".equals(m.get("type").getAsString())) { - finalAnswer = m.get("content").getAsString(); - break; - } - } - } - } - } - - // 5. 统一处理最终结果 - if (finalAnswer != null && !finalAnswer.isEmpty()) { - saveReminderToLocal(finalAnswer); - AiNotificationHelper.sendAiNotification(getApplicationContext(), finalAnswer); - Log.d("AiReminder", "Successfully got AI reminder: " + finalAnswer); - } else { - Log.w("AiReminder", "AI returned empty answer for reminder."); - } - - } catch (Exception e) { - Log.e("AiReminder", "Error in requestAiReminderReply", e); - } - } - - private void saveReminderToLocal(String content) { - android.content.ContentValues values = new android.content.ContentValues(); - values.put(Notes.ChatColumns.SENDER_TYPE, 1); // AI - values.put(Notes.ChatColumns.MSG_TYPE, 1); // [重要] 设为提醒卡片类型 - values.put(Notes.ChatColumns.CONTENT, content); - values.put(Notes.ChatColumns.CREATED_AT, System.currentTimeMillis()); - getApplicationContext().getContentResolver().insert( - android.net.Uri.parse("content://micode_notes/chat_messages"), values); - } - - // 在 SyncWorker 类中添加 - private void syncToCozeAgent() { - try { - com.google.gson.JsonObject payloadJson = new com.google.gson.JsonObject(); - payloadJson.addProperty("intent", "sync"); - payloadJson.addProperty("payload", AiDataSyncHelper.getSyncPayload(getApplicationContext())); - payloadJson.addProperty("current_time", AiDataSyncHelper.getCurrentTime()); - - CozeRequest request = new CozeRequest(CozeClient.BOT_ID, "user_demo", payloadJson.toString()); - - // 1. 发起对话 - retrofit2.Response response = CozeClient.getInstance() - .chat(CozeClient.getAuthToken(), request).execute(); - - if (response.isSuccessful() && response.body() != null && response.body().data != null) { - String chatId = response.body().data.id; - String convId = response.body().data.conversation_id; // [关键] 获取会话ID - - String status = ""; - int retries = 0; - while (!"completed".equals(status) && retries < 15) { - Thread.sleep(2000); - // [关键] 传入两个 ID 轮询 - retrofit2.Response pollResp = CozeClient.getInstance() - .retrieveChat(CozeClient.getAuthToken(), chatId, convId).execute(); - - if (pollResp.isSuccessful() && pollResp.body() != null && pollResp.body().data != null) { - status = pollResp.body().data.status; - } - retries++; - } - - // 2. 完成后抓取真正的“Answer” - if ("completed".equals(status)) { - retrofit2.Response msgListResp = CozeClient.getInstance() - .getMessageList(CozeClient.getAuthToken(), chatId, convId).execute(); - - if (msgListResp.isSuccessful() && msgListResp.body() != null) { - com.google.gson.JsonArray messages = msgListResp.body().getAsJsonArray("data"); - String finalAnswer = null; - - // 遍历寻找 role=assistant 且 type=answer 的内容 - for (com.google.gson.JsonElement el : messages) { - com.google.gson.JsonObject m = el.getAsJsonObject(); - if ("assistant".equals(m.get("role").getAsString()) && - "answer".equals(m.get("type").getAsString())) { - finalAnswer = m.get("content").getAsString(); - break; - } - } - - if (finalAnswer != null && !finalAnswer.isEmpty()) { - // 插入本地数据库并弹通知 - saveChatMessageToLocal(finalAnswer); - AiNotificationHelper.sendAiNotification(getApplicationContext(), finalAnswer); - } - } - } - } - } catch (Exception e) { - Log.e("CozeSync", "Sync Failed", e); - } - } - - // 辅助方法:将 AI 消息存入本地 chat_messages 表 - private void saveChatMessageToLocal(String content) { - android.content.ContentValues values = new android.content.ContentValues(); - values.put(net.micode.notes.data.Notes.ChatColumns.SENDER_TYPE, 1); // AI - values.put(net.micode.notes.data.Notes.ChatColumns.MSG_TYPE, 0); // 文本 - values.put(net.micode.notes.data.Notes.ChatColumns.CONTENT, content); - values.put(net.micode.notes.data.Notes.ChatColumns.CREATED_AT, System.currentTimeMillis()); - getApplicationContext().getContentResolver().insert( - android.net.Uri.parse("content://micode_notes/chat_messages"), values); - } - /** * [上行逻辑]:查询本地所有 sync_state = 1 的记录并上传 */ diff --git a/src/Notes-master/src/net/micode/notes/tool/ai/CozeApiService.java b/src/Notes-master/src/net/micode/notes/tool/ai/CozeApiService.java index 602891c..842da02 100644 --- a/src/Notes-master/src/net/micode/notes/tool/ai/CozeApiService.java +++ b/src/Notes-master/src/net/micode/notes/tool/ai/CozeApiService.java @@ -1,31 +1,18 @@ package net.micode.notes.tool.ai; -import com.google.gson.JsonObject; - import retrofit2.Call; import retrofit2.http.Body; -import retrofit2.http.GET; import retrofit2.http.Header; import retrofit2.http.POST; -import retrofit2.http.Query; public interface CozeApiService { + /** + * 发起智能体对话 + * 对应文档:https://www.coze.cn/open/docs/developer_guides/chat + */ @POST("v3/chat") - Call chat(@Header("Authorization") String token, @Body CozeRequest request); - - // [核心修复] 轮询接口:使用 Query 参数传递 IDs - @POST("v3/chat/retrieve") - Call retrieveChat( - @Header("Authorization") String token, - @Query("chat_id") String chatId, - @Query("conversation_id") String conversationId - ); - - // [核心新增] 获取消息列表:用于抓取 AI 的文本回复 - @GET("v3/chat/message/list") - Call getMessageList( + Call chat( @Header("Authorization") String token, - @Query("chat_id") String chatId, - @Query("conversation_id") String conversationId + @Body CozeRequest request ); } \ No newline at end of file diff --git a/src/Notes-master/src/net/micode/notes/tool/ai/CozeResponse.java b/src/Notes-master/src/net/micode/notes/tool/ai/CozeResponse.java index 0423e6f..0aa9010 100644 --- a/src/Notes-master/src/net/micode/notes/tool/ai/CozeResponse.java +++ b/src/Notes-master/src/net/micode/notes/tool/ai/CozeResponse.java @@ -14,8 +14,13 @@ public class CozeResponse { public ChatData data; public static class ChatData { - public String id; // chat_id - public String conversation_id; // [核心修复] 必须添加此字段 - public String status; + @SerializedName("id") + public String id; // 会话ID + + @SerializedName("status") + public String status; // 状态:completed, in_progress等 + + // 注意:非流式模式下,回复通常在后续的消息查询中或特定的 V3 响应字段中 + // 为了简化 Demo,我们假设智能体立即返回了结果 } } \ No newline at end of file diff --git a/src/Notes-master/src/net/micode/notes/ui/AgendaFragment.java b/src/Notes-master/src/net/micode/notes/ui/AgendaFragment.java index e54f84f..a85da6e 100644 --- a/src/Notes-master/src/net/micode/notes/ui/AgendaFragment.java +++ b/src/Notes-master/src/net/micode/notes/ui/AgendaFragment.java @@ -20,7 +20,6 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import net.micode.notes.R; import net.micode.notes.data.Notes; -import net.micode.notes.tool.ai.AiReminderScheduler; import net.micode.notes.data.Notes.NoteColumns; import java.util.ArrayList; import java.util.Calendar; @@ -152,14 +151,6 @@ public class AgendaFragment extends Fragment { cv.put(NoteColumns.LOCAL_MODIFIED, 1); getContext().getContentResolver().insert(Notes.CONTENT_NOTE_URI, cv); - // [新增] 核心补丁:让 AI 助理感知到新日程 - try { - AiReminderScheduler.updateAllReminders(getContext()); - android.util.Log.d("AiReminder", "Scheduled from Agenda Quick Add"); - } catch (Exception e) { - e.printStackTrace(); - } - // 重置 UI et.setText(""); tvQuickTime.setText("全天"); diff --git a/src/Notes-master/src/net/micode/notes/ui/ChatFragment.java b/src/Notes-master/src/net/micode/notes/ui/ChatFragment.java index d8ded54..60aa21e 100644 --- a/src/Notes-master/src/net/micode/notes/ui/ChatFragment.java +++ b/src/Notes-master/src/net/micode/notes/ui/ChatFragment.java @@ -20,9 +20,6 @@ public class ChatFragment extends Fragment { private List mMessages = new ArrayList<>(); private EditText mInput; - private android.database.ContentObserver mChatObserver; - private static final android.net.Uri CHAT_URI = android.net.Uri.parse("content://micode_notes/chat_messages"); - @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_chat, container, false); @@ -34,172 +31,19 @@ public class ChatFragment extends Fragment { mRecyclerView.setAdapter(mAdapter); view.findViewById(R.id.btn_chat_send).setOnClickListener(v -> { - final String text = mInput.getText().toString().trim(); - if (text.isEmpty()) return; - - // --- 第一部分:将用户消息存入数据库 --- - // 之前我们是手动 mMessages.add(...),现在不用了! - // 因为 ContentObserver 监听到数据库插入后,会自动调用 loadHistory 刷新列表。 - new Thread(() -> { - android.content.ContentValues userValues = new android.content.ContentValues(); - userValues.put(net.micode.notes.data.Notes.ChatColumns.SENDER_TYPE, 0); // 0 代表用户 - userValues.put(net.micode.notes.data.Notes.ChatColumns.MSG_TYPE, 0); // 普通文本 - userValues.put(net.micode.notes.data.Notes.ChatColumns.CONTENT, text); - userValues.put(net.micode.notes.data.Notes.ChatColumns.CREATED_AT, System.currentTimeMillis()); - - // 执行插入 - getContext().getContentResolver().insert(CHAT_URI, userValues); - }).start(); - - // 清空输入框 - mInput.setText(""); - - // --- 第二部分:向 AI 发起请求 (逻辑保持之前的异步方式) --- - new Thread(() -> { - try { - // 1. 组装请求 (intent=chat) - com.google.gson.JsonObject json = new com.google.gson.JsonObject(); - json.addProperty("intent", "chat"); - json.addProperty("payload", text); - json.addProperty("current_time", net.micode.notes.tool.ai.AiDataSyncHelper.getCurrentTime()); - - net.micode.notes.tool.ai.CozeRequest request = new net.micode.notes.tool.ai.CozeRequest( - net.micode.notes.tool.ai.CozeClient.BOT_ID, "user_demo", json.toString()); - - // 2. 发起 API 请求并轮询完成状态 - retrofit2.Response response = - net.micode.notes.tool.ai.CozeClient.getInstance().chat( - net.micode.notes.tool.ai.CozeClient.getAuthToken(), request).execute(); - - if (response.isSuccessful() && response.body() != null && response.body().data != null) { - String chatId = response.body().data.id; - String convId = response.body().data.conversation_id; - android.util.Log.d("MiChat", "开始轮询 AI 响应, ChatID: " + chatId); - - String status = ""; - int retries = 0; - while (!"completed".equals(status) && retries < 30) { // 最多等 60 秒 - Thread.sleep(2000); - retrofit2.Response poll = - net.micode.notes.tool.ai.CozeClient.getInstance().retrieveChat( - net.micode.notes.tool.ai.CozeClient.getAuthToken(), chatId, convId).execute(); - - if (poll.isSuccessful() && poll.body() != null && poll.body().data != null) { - status = poll.body().data.status; - android.util.Log.d("MiChat", "当前状态: " + status); - if ("failed".equals(status)) break; - } - retries++; - } - - if ("completed".equals(status)) { - android.util.Log.d("MiChat", "轮询完成,准备抓取回复内容..."); - retrofit2.Response msgList = - net.micode.notes.tool.ai.CozeClient.getInstance().getMessageList( - net.micode.notes.tool.ai.CozeClient.getAuthToken(), chatId, convId).execute(); - - if (msgList.isSuccessful() && msgList.body() != null) { - com.google.gson.JsonArray dataArray = msgList.body().getAsJsonArray("data"); - boolean foundAnswer = false; - for (com.google.gson.JsonElement el : dataArray) { - com.google.gson.JsonObject m = el.getAsJsonObject(); - - // 【核心检查点】打印出 AI 返回的所有消息类型,看看为什么没匹配到 - android.util.Log.d("MiChat", "收到消息: role=" + m.get("role").getAsString() + - ", type=" + m.get("type").getAsString()); - - // 寻找 AI 发送的真正的回答内容 - if ("assistant".equals(m.get("role").getAsString()) && - "answer".equals(m.get("type").getAsString())) { - - String answer = m.get("content").getAsString(); - foundAnswer = true; - - // 存入数据库,触发 ContentObserver 刷新 UI - android.content.ContentValues aiValues = new android.content.ContentValues(); - aiValues.put(net.micode.notes.data.Notes.ChatColumns.SENDER_TYPE, 1); - aiValues.put(net.micode.notes.data.Notes.ChatColumns.MSG_TYPE, 0); - aiValues.put(net.micode.notes.data.Notes.ChatColumns.CONTENT, answer); - aiValues.put(net.micode.notes.data.Notes.ChatColumns.CREATED_AT, System.currentTimeMillis()); - - getContext().getContentResolver().insert(CHAT_URI, aiValues); - android.util.Log.d("MiChat", "AI 回复已入库: " + answer); - break; - } - } - if (!foundAnswer) { - android.util.Log.w("MiChat", "未在消息列表中找到 type 为 answer 的回复!"); - } - } - } else { - android.util.Log.e("MiChat", "轮询超时或失败,最终状态: " + status); - } - } - } catch (Exception e) { - e.printStackTrace(); - } - }).start(); - }); - - // 1. 初次加载历史记录 - loadHistory(); - - // 2. 注册观察者:监听数据库变化 - mChatObserver = new android.database.ContentObserver(new android.os.Handler()) { - @Override - public void onChange(boolean selfChange) { - super.onChange(selfChange); - android.util.Log.d("ChatFragment", "Database changed, reloading..."); - loadHistory(); // 数据库一变就重新加载 + String text = mInput.getText().toString().trim(); + if (!text.isEmpty()) { + // 1. 本地插入用户消息 + ChatMessage userMsg = new ChatMessage(0, 0, text); + mMessages.add(userMsg); + mAdapter.notifyItemInserted(mMessages.size() - 1); + mRecyclerView.smoothScrollToPosition(mMessages.size() - 1); + mInput.setText(""); + + // TODO: Step 3 将在此处调用 CozeClient } - }; - getContext().getContentResolver().registerContentObserver(CHAT_URI, true, mChatObserver); + }); return view; } - - @Override - public void onDestroyView() { - super.onDestroyView(); - if (mChatObserver != null) { - getContext().getContentResolver().unregisterContentObserver(mChatObserver); - } - } - - private void loadHistory() { - new Thread(() -> { - android.database.Cursor cursor = getContext().getContentResolver().query( - CHAT_URI, - null, null, null, "created_at ASC" // 按时间顺序排列 - ); - - List history = new ArrayList<>(); - if (cursor != null) { - while (cursor.moveToNext()) { - // 根据 Step 1 定义的列顺序取值 - int senderType = cursor.getInt(cursor.getColumnIndex(net.micode.notes.data.Notes.ChatColumns.SENDER_TYPE)); - int msgType = cursor.getInt(cursor.getColumnIndex(net.micode.notes.data.Notes.ChatColumns.MSG_TYPE)); - String content = cursor.getString(cursor.getColumnIndex(net.micode.notes.data.Notes.ChatColumns.CONTENT)); - long time = cursor.getLong(cursor.getColumnIndex(net.micode.notes.data.Notes.ChatColumns.CREATED_AT)); - - ChatMessage msg = new ChatMessage(senderType, msgType, content); - msg.createdAt = time; - history.add(msg); - } - cursor.close(); - } - - // 回到主线程更新 UI - if (getActivity() != null) { - getActivity().runOnUiThread(() -> { - mMessages.clear(); - mMessages.addAll(history); - mAdapter.notifyDataSetChanged(); - if (mMessages.size() > 0) { - mRecyclerView.scrollToPosition(mMessages.size() - 1); - } - }); - } - }).start(); - } } \ No newline at end of file diff --git a/src/Notes-master/src/net/micode/notes/ui/NoteEditActivity.java b/src/Notes-master/src/net/micode/notes/ui/NoteEditActivity.java index 3dc8567..ec0ee41 100644 --- a/src/Notes-master/src/net/micode/notes/ui/NoteEditActivity.java +++ b/src/Notes-master/src/net/micode/notes/ui/NoteEditActivity.java @@ -78,7 +78,6 @@ import net.micode.notes.tool.ResourceParser; import net.micode.notes.tool.ResourceParser.TextAppearanceResources; import net.micode.notes.ui.DateTimePickerDialog.OnDateTimeSetListener; import net.micode.notes.ui.NoteEditText.OnTextViewChangeListener; -import net.micode.notes.tool.ai.AiReminderScheduler; import net.micode.notes.widget.NoteWidgetProvider_2x; import net.micode.notes.widget.NoteWidgetProvider_4x; @@ -1613,15 +1612,6 @@ public class NoteEditActivity extends AppCompatActivity implements OnClickListen saveImages(); setResult(RESULT_OK); - - // [新增] 刷新 AI 助理的闹钟计划 - try { - // 每次保存成功,都让调度器重新扫描一遍所有日程,更新系统闹钟 - AiReminderScheduler.updateAllReminders(this); - android.util.Log.d("AiAssistant", "Reminders scheduled successfully after save."); - } catch (Exception e) { - android.util.Log.e("AiAssistant", "Failed to schedule reminders", e); - } } return saved; } diff --git a/src/Notes-master/src/net/micode/notes/ui/NotesListActivity.java b/src/Notes-master/src/net/micode/notes/ui/NotesListActivity.java index 2c1e705..9928b28 100644 --- a/src/Notes-master/src/net/micode/notes/ui/NotesListActivity.java +++ b/src/Notes-master/src/net/micode/notes/ui/NotesListActivity.java @@ -1442,21 +1442,19 @@ public class NotesListActivity extends AppCompatActivity implements OnClickListe } }); break; + // [新增] 处理 Push case R.id.menu_push: - // 手术点:更新提示语 - Toast.makeText(this, "正在备份数据并同步 AI 大脑...", Toast.LENGTH_SHORT).show(); + Toast.makeText(this, "正在上传数据到云端...", Toast.LENGTH_SHORT).show(); - // [修复] 去掉前面的 androidx.work.Data,直接赋值 + // 构造参数:MODE_PUSH inputData = new androidx.work.Data.Builder() .putInt(net.micode.notes.sync.SyncWorker.KEY_SYNC_MODE, net.micode.notes.sync.SyncWorker.MODE_PUSH) .build(); - // [修复] 去掉前面的 androidx.work.OneTimeWorkRequest,直接赋值 syncRequest = new androidx.work.OneTimeWorkRequest.Builder(net.micode.notes.sync.SyncWorker.class) .setInputData(inputData) .build(); - // 提交任务 androidx.work.WorkManager.getInstance(this).enqueue(syncRequest); break; case R.id.menu_setting: {