|
|
|
|
@ -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 格式的字符串,使用 <span> 标签来设置翻译结果的颜色
|
|
|
|
|
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("<span style=\"color:#999999;\">");
|
|
|
|
|
htmlBuilder.append(line);
|
|
|
|
|
htmlBuilder.append("</span>");
|
|
|
|
|
} else {
|
|
|
|
|
// 原文保持默认颜色
|
|
|
|
|
htmlBuilder.append(line);
|
|
|
|
|
}
|
|
|
|
|
isTranslation = !isTranslation;
|
|
|
|
|
}
|
|
|
|
|
currentPosition += line.length() + 1; // +1 for newline
|
|
|
|
|
htmlBuilder.append("<br>");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|