diff --git a/doc/实践统计-阅读分析和维护小米便签.xlsx b/doc/实践统计-阅读分析和维护小米便签.xlsx new file mode 100644 index 0000000..53068ef Binary files /dev/null and b/doc/实践统计-阅读分析和维护小米便签.xlsx differ diff --git a/doc/实践考评-阅读维护小米便签的团队自评报告.xlsx b/doc/实践考评-阅读维护小米便签的团队自评报告.xlsx new file mode 100644 index 0000000..4612a53 Binary files /dev/null and b/doc/实践考评-阅读维护小米便签的团队自评报告.xlsx differ diff --git a/doc/实践考评-阅读维护小米便签的汇报.pptx b/doc/实践考评-阅读维护小米便签的汇报.pptx new file mode 100644 index 0000000..9790329 Binary files /dev/null and b/doc/实践考评-阅读维护小米便签的汇报.pptx differ diff --git a/doc/小米便签泛读和标注报告文档.docx b/doc/小米便签泛读和标注报告文档.docx deleted file mode 100644 index 2af7980..0000000 Binary files a/doc/小米便签泛读和标注报告文档.docx and /dev/null differ diff --git a/doc/小米便签的泛读、标注和维护报告文档 .docx b/doc/小米便签的泛读、标注和维护报告文档 .docx new file mode 100644 index 0000000..4b1913e Binary files /dev/null and b/doc/小米便签的泛读、标注和维护报告文档 .docx differ diff --git a/doc/小米便签的质量分析报告.docx b/doc/小米便签的质量分析报告.docx new file mode 100644 index 0000000..f43242e Binary files /dev/null and b/doc/小米便签的质量分析报告.docx differ diff --git a/src/notes/ui/NoteEditActivity.java b/src/notes/ui/NoteEditActivity.java index 5140e04..e11f325 100644 --- a/src/notes/ui/NoteEditActivity.java +++ b/src/notes/ui/NoteEditActivity.java @@ -16,7 +16,9 @@ package net.micode.notes.ui; -import android.app.Activity; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; +import androidx.core.content.ContextCompat; import android.app.AlarmManager; import android.app.AlertDialog; import android.app.PendingIntent; @@ -120,7 +122,7 @@ import java.util.Map; import java.util.HashMap; -public class NoteEditActivity extends Activity implements OnClickListener, +public class NoteEditActivity extends AppCompatActivity implements OnClickListener, NoteSettingChangedListener, OnTextViewChangeListener, OnSelectionChangeListener { private class HeadViewHolder { public TextView tvModified; @@ -366,6 +368,8 @@ public class NoteEditActivity extends Activity implements OnClickListener, private HeadViewHolder mNoteHeaderHolder; + private TextView mTvEmotion; + private View mHeadViewPanel; private View mNoteBgColorSelector; @@ -449,6 +453,35 @@ public class NoteEditActivity extends Activity implements OnClickListener, protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.note_edit); + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_edit); + if (toolbar != null) { + // ensure toolbar title is visible and matches theme + try { + toolbar.setTitleTextColor(ContextCompat.getColor(this, android.R.color.white)); + } catch (Exception ignored) {} + toolbar.setVisibility(View.VISIBLE); + toolbar.bringToFront(); + toolbar.setTitle(R.string.app_name); + setSupportActionBar(toolbar); + if (getSupportActionBar() != null) { + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + } + // try to ensure overflow icon visible + try { + toolbar.setOverflowIcon(ContextCompat.getDrawable(this, android.R.drawable.ic_menu_more)); + } catch (Exception ignored) {} + try { + toolbar.inflateMenu(R.menu.note_edit); + } catch (Exception e) { + // fail silently if menu resource not found + } + toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + return NoteEditActivity.this.onOptionsItemSelected(item); + } + }); + } if (savedInstanceState == null && !initActivityState(getIntent())) { finish(); @@ -1283,20 +1316,48 @@ public class NoteEditActivity extends Activity implements OnClickListener, menu.findItem(R.id.menu_list_mode).setTitle(R.string.menu_list_mode); } if (mWorkingNote.hasClockAlert()) { - menu.findItem(R.id.menu_alert).setVisible(false); + MenuItem alertItem = menu.findItem(R.id.menu_alert); + if (alertItem != null) { + alertItem.setVisible(false); + } } else { - menu.findItem(R.id.menu_delete_remind).setVisible(false); + MenuItem deleteRemindItem = menu.findItem(R.id.menu_delete_remind); + if (deleteRemindItem != null) { + deleteRemindItem.setVisible(false); + } } // 习惯相关菜单处理 boolean isHabit = mWorkingNote.isHabit(); - menu.findItem(R.id.menu_set_habit).setVisible(!isHabit); - menu.findItem(R.id.menu_habit_settings).setVisible(isHabit); - menu.findItem(R.id.menu_stop_habit).setVisible(isHabit); + MenuItem setHabitItem = menu.findItem(R.id.menu_set_habit); + if (setHabitItem != null) { + setHabitItem.setVisible(!isHabit); + } + MenuItem habitSettingsItem = menu.findItem(R.id.menu_habit_settings); + if (habitSettingsItem != null) { + habitSettingsItem.setVisible(isHabit); + } + MenuItem stopHabitItem = menu.findItem(R.id.menu_stop_habit); + if (stopHabitItem != null) { + stopHabitItem.setVisible(isHabit); + } + // pinned menu + MenuItem pinItem = menu.findItem(R.id.menu_pin); + if (pinItem != null) { + if (mWorkingNote.isPinned()) { + pinItem.setTitle(R.string.menu_unpin); + } else { + pinItem.setTitle(R.string.menu_pin); + } + } return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == android.R.id.home) { + finish(); + return true; + } switch (item.getItemId()) { case R.id.menu_new_note://新建笔记 createNewNote(); @@ -1345,6 +1406,18 @@ public class NoteEditActivity extends Activity implements OnClickListener, mWorkingNote.setHabit(true, ""); showHabitConfigDialog(); break; + case R.id.menu_pin: + boolean newState = !mWorkingNote.isPinned(); + mWorkingNote.setPinned(newState); + mWorkingNote.saveNote(); + setResult(RESULT_OK); + invalidateOptionsMenu(); + if (newState) { + Toast.makeText(this, R.string.pinned_label, Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(this, R.string.menu_unpin, Toast.LENGTH_SHORT).show(); + } + break; case R.id.menu_habit_settings: // 显示习惯设置对话框 showHabitConfigDialog(); @@ -1378,6 +1451,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, mImageInsertHelper.startPickImage(); } break; + default: break; } @@ -1634,27 +1708,30 @@ public class NoteEditActivity extends Activity implements OnClickListener, focused.findViewById(R.id.et_edit_text).requestFocus(); } else { // 普通模式下,直接显示翻译结果 - SpannableString spannable = new SpannableString(result); + // 构建 HTML 格式的字符串,使用 标签来设置翻译结果的颜色 + StringBuilder htmlBuilder = new StringBuilder(); // 分析文本结构:原文和翻译交替出现 // 格式:原文1\n翻译1\n原文2\n翻译2\n... String[] lines = result.split("\n"); - int currentPosition = 0; boolean isTranslation = false; for (String line : lines) { if (!TextUtils.isEmpty(line)) { if (isTranslation) { // 设置翻译结果为浅灰色 - int start = currentPosition; - int end = currentPosition + line.length(); - spannable.setSpan(new ForegroundColorSpan(Color.parseColor("#999999")), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + htmlBuilder.append(""); + htmlBuilder.append(line); + htmlBuilder.append(""); + } else { + // 原文保持默认颜色 + htmlBuilder.append(line); } isTranslation = !isTranslation; } - currentPosition += line.length() + 1; // +1 for newline + htmlBuilder.append("
"); } - mNoteEditor.setHtml(spannable.toString()); + mNoteEditor.setHtml(htmlBuilder.toString()); // scroll to first translation // RichEditor doesn't support setSelection method, so we skip this } @@ -1809,6 +1886,27 @@ public class NoteEditActivity extends Activity implements OnClickListener, mNoteEditor.setVisibility(View.GONE);//隐藏编辑框 mEditTextList.setVisibility(View.VISIBLE); + + // 更新列表模式下的字符统计 + updateListModeCharCount(); + } + + // 更新列表模式下的字符统计 + private void updateListModeCharCount() { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < mEditTextList.getChildCount(); i++) { + View child = mEditTextList.getChildAt(i); + EditText et = (EditText) child.findViewById(R.id.et_edit_text); + if (et != null) { + String text = et.getText().toString(); + if (!TextUtils.isEmpty(text)) { + sb.append(text).append("\n"); + } + } + } + String listText = sb.toString(); + int charCount = calcVisibleCharCount(listText); + mNoteHeaderHolder.tvCharNum.setText("字符数:" + charCount); } private Spannable getHighlightQueryResult(String fullText, String userQuery) { @@ -1906,6 +2004,8 @@ public class NoteEditActivity extends Activity implements OnClickListener, } else { edit.setPaintFlags(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG);//清除删除线效果 } + // 复选框状态变化时也更新字符统计 + updateListModeCharCount(); } }); @@ -1922,6 +2022,20 @@ public class NoteEditActivity extends Activity implements OnClickListener, edit.setOnTextViewChangeListener(this); //新增选区变化回调接口设置 edit.setOnSelectionChangeListener(this); + // 添加文本变化监听器,用于更新字符统计 + edit.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) {} + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + // 更新列表模式下的字符统计 + updateListModeCharCount(); + } + + @Override + public void afterTextChanged(Editable s) {} + }); edit.setIndex(index); edit.setText(getHighlightQueryResult(item, mUserQuery)); return view;