|
|
|
@ -1,3 +1,4 @@
|
|
|
|
|
//于亚榕注释
|
|
|
|
|
/*
|
|
|
|
|
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
|
|
|
|
|
*
|
|
|
|
@ -72,18 +73,17 @@ import java.util.regex.Matcher;
|
|
|
|
|
import java.util.regex.Pattern;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
NoteSettingChangedListener, OnTextViewChangeListener {
|
|
|
|
|
//该类主要是针对标签的编辑
|
|
|
|
|
//继承了系统内部许多和监听有关的类
|
|
|
|
|
private class HeadViewHolder {
|
|
|
|
|
public TextView tvModified;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public ImageView ivAlertIcon;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public TextView tvAlertDate;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public ImageView ibSetBgColor;
|
|
|
|
|
}
|
|
|
|
|
//使用Map实现数据存储
|
|
|
|
@ -96,7 +96,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
sBgSelectorBtnsMap.put(R.id.iv_bg_white, ResourceParser.WHITE);
|
|
|
|
|
//put函数是将指定值和指定键相连
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static final Map<Integer, Integer> sBgSelectorSelectionMap = new HashMap<Integer, Integer>();
|
|
|
|
|
static {
|
|
|
|
|
sBgSelectorSelectionMap.put(ResourceParser.YELLOW, R.id.iv_bg_yellow_select);
|
|
|
|
@ -106,7 +106,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
sBgSelectorSelectionMap.put(ResourceParser.WHITE, R.id.iv_bg_white_select);
|
|
|
|
|
//put函数是将指定值和指定键相连
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static final Map<Integer, Integer> sFontSizeBtnsMap = new HashMap<Integer, Integer>();
|
|
|
|
|
static {
|
|
|
|
|
sFontSizeBtnsMap.put(R.id.ll_font_large, ResourceParser.TEXT_LARGE);
|
|
|
|
@ -115,7 +115,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
sFontSizeBtnsMap.put(R.id.ll_font_super, ResourceParser.TEXT_SUPER);
|
|
|
|
|
//put函数是将指定值和指定键相连
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static final Map<Integer, Integer> sFontSelectorSelectionMap = new HashMap<Integer, Integer>();
|
|
|
|
|
static {
|
|
|
|
|
sFontSelectorSelectionMap.put(ResourceParser.TEXT_LARGE, R.id.iv_large_select);
|
|
|
|
@ -124,11 +124,11 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
sFontSelectorSelectionMap.put(ResourceParser.TEXT_SUPER, R.id.iv_super_select);
|
|
|
|
|
//put函数是将指定值和指定键相连
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static final String TAG = "NoteEditActivity";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private HeadViewHolder mNoteHeaderHolder;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private View mHeadViewPanel;
|
|
|
|
|
//私有化一个界面操作mHeadViewPanel,对表头的操作
|
|
|
|
|
private View mNoteBgColorSelector;
|
|
|
|
@ -148,17 +148,17 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
private int mFontSizeId;
|
|
|
|
|
//用于操作字体的大小
|
|
|
|
|
private static final String PREFERENCE_FONT_SIZE = "pref_font_size";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static final int SHORTCUT_ICON_TITLE_MAX_LEN = 10;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static final String TAG_CHECKED = String.valueOf('\u221A');
|
|
|
|
|
public static final String TAG_UNCHECKED = String.valueOf('\u25A1');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private LinearLayout mEditTextList;
|
|
|
|
|
//线性布局
|
|
|
|
|
private String mUserQuery;
|
|
|
|
|
private Pattern mPattern;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
protected void onCreate(Bundle savedInstanceState) {
|
|
|
|
|
super.onCreate(savedInstanceState);
|
|
|
|
@ -170,25 +170,25 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
}
|
|
|
|
|
initResources();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Current activity may be killed when the memory is low. Once it is killed, for another time
|
|
|
|
|
* user load this activity, we should restore the former state
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
protected void onRestoreInstanceState(Bundle savedInstanceState) {
|
|
|
|
|
super.onRestoreInstanceState(savedInstanceState);
|
|
|
|
|
if (savedInstanceState != null && savedInstanceState.containsKey(Intent.EXTRA_UID)) {
|
|
|
|
|
Intent intent = new Intent(Intent.ACTION_VIEW);
|
|
|
|
|
intent.putExtra(Intent.EXTRA_UID, savedInstanceState.getLong(Intent.EXTRA_UID));
|
|
|
|
|
super.onRestoreInstanceState(savedInstanceState);//将保存的实例状态传递给父类以进行默认的恢复操作
|
|
|
|
|
if (savedInstanceState != null && savedInstanceState.containsKey(Intent.EXTRA_UID)) {//判断是否存在保存的实例状态
|
|
|
|
|
Intent intent = new Intent(Intent.ACTION_VIEW);//创建一个新的Intent对象
|
|
|
|
|
intent.putExtra(Intent.EXTRA_UID, savedInstanceState.getLong(Intent.EXTRA_UID));//使用Intent.EXTRA_UID作为键将保存的长整型值(savedInstanceState.getLong(Intent.EXTRA_UID))放入Intent中
|
|
|
|
|
if (!initActivityState(intent)) {
|
|
|
|
|
finish();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
Log.d(TAG, "Restoring from killed activity");
|
|
|
|
|
Log.d(TAG, "Restoring from killed activity");//记录一条调试日志,表示正在从先前被终止的活动中进行恢复
|
|
|
|
|
}//为防止内存不足时程序的终止,在这里有一个保存现场的函数
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private boolean initActivityState(Intent intent) {
|
|
|
|
|
/**
|
|
|
|
|
* If the user specified the {@link Intent#ACTION_VIEW} but not provided with id,
|
|
|
|
@ -204,8 +204,8 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
*/
|
|
|
|
|
//根据键值查找ID
|
|
|
|
|
if (intent.hasExtra(SearchManager.EXTRA_DATA_KEY)) {
|
|
|
|
|
noteId = Long.parseLong(intent.getStringExtra(SearchManager.EXTRA_DATA_KEY));
|
|
|
|
|
mUserQuery = intent.getStringExtra(SearchManager.USER_QUERY);
|
|
|
|
|
noteId = Long.parseLong(intent.getStringExtra(SearchManager.EXTRA_DATA_KEY));//获取该键对应的字符串值
|
|
|
|
|
mUserQuery = intent.getStringExtra(SearchManager.USER_QUERY);//获取键为SearchManager.USER_QUERY的字符串值,并将其赋值给mUserQuery变量
|
|
|
|
|
}
|
|
|
|
|
//如果ID在数据库中未找到
|
|
|
|
|
if (!DataUtils.visibleInNoteDatabase(getContentResolver(), noteId, Notes.TYPE_NOTE)) {
|
|
|
|
@ -215,7 +215,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
showToast(R.string.error_note_not_exist);
|
|
|
|
|
finish();
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//ID在数据库中找到
|
|
|
|
|
else {
|
|
|
|
|
mWorkingNote = WorkingNote.load(this, noteId);
|
|
|
|
@ -232,7 +232,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
| WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
|
|
|
|
|
} else if(TextUtils.equals(Intent.ACTION_INSERT_OR_EDIT, intent.getAction())) {
|
|
|
|
|
// intent.getAction()
|
|
|
|
|
// 大多用于broadcast发送广播时给机制(intent)设置一个action,就是一个字符串
|
|
|
|
|
// 大多用于broadcast发送广播时给机制(intent)设置一个action,就是一个字符串
|
|
|
|
|
// 用户可以通过receive(接受)intent,通过 getAction得到的字符串,来决定做什么
|
|
|
|
|
long folderId = intent.getLongExtra(Notes.INTENT_EXTRA_FOLDER_ID, 0);
|
|
|
|
|
int widgetId = intent.getIntExtra(Notes.INTENT_EXTRA_WIDGET_ID,
|
|
|
|
@ -245,15 +245,15 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
// Parse call-record note
|
|
|
|
|
String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
|
|
|
|
|
long callDate = intent.getLongExtra(Notes.INTENT_EXTRA_CALL_DATE, 0);
|
|
|
|
|
if (callDate != 0 && phoneNumber != null) {
|
|
|
|
|
if (callDate != 0 && phoneNumber != null) {//检查phoneNumber是否为空。如果为空,记录一条警告日志,表示通话记录的号码为空
|
|
|
|
|
if (TextUtils.isEmpty(phoneNumber)) {
|
|
|
|
|
Log.w(TAG, "The call record number is null");
|
|
|
|
|
}
|
|
|
|
|
long noteId = 0;
|
|
|
|
|
long noteId = 0;//初始化一个长整型变量noteId并将其初始化为0
|
|
|
|
|
if ((noteId = DataUtils.getNoteIdByPhoneNumberAndCallDate(getContentResolver(),
|
|
|
|
|
phoneNumber, callDate)) > 0) {
|
|
|
|
|
mWorkingNote = WorkingNote.load(this, noteId);
|
|
|
|
|
if (mWorkingNote == null) {
|
|
|
|
|
phoneNumber, callDate)) > 0) {//根据给定的电话号码和通话日期从内容解析器中获取对应的便签ID。如果返回的noteId大于0,则表示已存在与该电话号码和通话日期相关的便签
|
|
|
|
|
mWorkingNote = WorkingNote.load(this, noteId);//加载该便签,并将其赋值给mWorkingNote变量
|
|
|
|
|
if (mWorkingNote == null) {//如果加载便签失败(mWorkingNote == null),记录一条错误日志,并结束当前活动并返回false
|
|
|
|
|
Log.e(TAG, "load call note failed with note id" + noteId);
|
|
|
|
|
finish();
|
|
|
|
|
return false;
|
|
|
|
@ -261,15 +261,15 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
//将电话号码与手机的号码簿相关
|
|
|
|
|
} else {
|
|
|
|
|
mWorkingNote = WorkingNote.createEmptyNote(this, folderId, widgetId,
|
|
|
|
|
widgetType, bgResId);
|
|
|
|
|
mWorkingNote.convertToCallNote(phoneNumber, callDate);
|
|
|
|
|
widgetType, bgResId);//创建一个新的空便签,并将其赋值给mWorkingNote变量
|
|
|
|
|
mWorkingNote.convertToCallNote(phoneNumber, callDate);//将电话号码和通话日期转换为便签的内容
|
|
|
|
|
//
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
mWorkingNote = WorkingNote.createEmptyNote(this, folderId, widgetId, widgetType,
|
|
|
|
|
bgResId);
|
|
|
|
|
bgResId);//创建一个新的空便签,并将其赋值给mWorkingNote变量
|
|
|
|
|
}//创建一个新的WorkingNote
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
getWindow().setSoftInputMode(
|
|
|
|
|
WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE
|
|
|
|
|
| WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
|
|
|
|
@ -281,22 +281,22 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
mWorkingNote.setOnSettingStatusChangedListener(this);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
protected void onResume() {
|
|
|
|
|
super.onResume();
|
|
|
|
|
initNoteScreen();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void initNoteScreen() {
|
|
|
|
|
//对界面的初始化操作
|
|
|
|
|
mNoteEditor.setTextAppearance(this, TextAppearanceResources
|
|
|
|
|
.getTexAppearanceResource(mFontSizeId));
|
|
|
|
|
//设置外观
|
|
|
|
|
if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) {
|
|
|
|
|
switchToListMode(mWorkingNote.getContent());
|
|
|
|
|
if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) {//检查mWorkingNote对象的检查列表模式是否为TextNote.MODE_CHECK_LIST
|
|
|
|
|
switchToListMode(mWorkingNote.getContent());//将编辑器切换为列表模式,并将内容设置为mWorkingNote对象的内容
|
|
|
|
|
} else {
|
|
|
|
|
mNoteEditor.setText(getHighlightQueryResult(mWorkingNote.getContent(), mUserQuery));
|
|
|
|
|
mNoteEditor.setText(getHighlightQueryResult(mWorkingNote.getContent(), mUserQuery));//将内容设置为mWorkingNote对象的内容,并高亮显示与用户查询(mUserQuery)匹配的部分
|
|
|
|
|
mNoteEditor.setSelection(mNoteEditor.getText().length());
|
|
|
|
|
}
|
|
|
|
|
for (Integer id : sBgSelectorSelectionMap.keySet()) {
|
|
|
|
@ -304,12 +304,12 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
}
|
|
|
|
|
mHeadViewPanel.setBackgroundResource(mWorkingNote.getTitleBgResId());
|
|
|
|
|
mNoteEditorPanel.setBackgroundResource(mWorkingNote.getBgColorResId());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mNoteHeaderHolder.tvModified.setText(DateUtils.formatDateTime(this,
|
|
|
|
|
mWorkingNote.getModifiedDate(), DateUtils.FORMAT_SHOW_DATE
|
|
|
|
|
| DateUtils.FORMAT_NUMERIC_DATE | DateUtils.FORMAT_SHOW_TIME
|
|
|
|
|
| DateUtils.FORMAT_SHOW_YEAR));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* TODO: Add the menu for setting alert. Currently disable it because the DateTimePicker
|
|
|
|
|
* is not ready
|
|
|
|
@ -320,29 +320,30 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
private void showAlertHeader() {
|
|
|
|
|
if (mWorkingNote.hasClockAlert()) {
|
|
|
|
|
long time = System.currentTimeMillis();
|
|
|
|
|
if (time > mWorkingNote.getAlertDate()) {
|
|
|
|
|
if (time > mWorkingNote.getAlertDate()) {//如果系统时间已经超过了闹钟设置的时间,
|
|
|
|
|
mNoteHeaderHolder.tvAlertDate.setText(R.string.note_alert_expired);
|
|
|
|
|
}
|
|
|
|
|
}//那么显示一个提示文字“闹钟已过期”(R.string.note_alert_expired)在界面上,使用mNoteHeaderHolder.tvAlertDate.setText()方法设置文本内容
|
|
|
|
|
//如果系统时间大于了闹钟设置的时间,那么闹钟失效
|
|
|
|
|
else {
|
|
|
|
|
else {//根据当前时间和闹钟时间计算出相对时间差,以分钟为单位显示在界面上
|
|
|
|
|
mNoteHeaderHolder.tvAlertDate.setText(DateUtils.getRelativeTimeSpanString(
|
|
|
|
|
mWorkingNote.getAlertDate(), time, DateUtils.MINUTE_IN_MILLIS));
|
|
|
|
|
}
|
|
|
|
|
//将显示闹钟日期的文本视图mNoteHeaderHolder.tvAlertDate设置为可见状态(View.VISIBLE),并显示一个闹钟图标mNoteHeaderHolder.ivAlertIcon
|
|
|
|
|
mNoteHeaderHolder.tvAlertDate.setVisibility(View.VISIBLE);
|
|
|
|
|
mNoteHeaderHolder.ivAlertIcon.setVisibility(View.VISIBLE);
|
|
|
|
|
//显示闹钟开启的图标
|
|
|
|
|
} else {
|
|
|
|
|
} else {//如果mWorkingNote没有设置闹钟提醒,即不满足mWorkingNote.hasClockAlert()条件,那么将隐藏闹钟日期的文本视图和闹钟图标,通过将它们的可见性设置为View.GONE来实现
|
|
|
|
|
mNoteHeaderHolder.tvAlertDate.setVisibility(View.GONE);
|
|
|
|
|
mNoteHeaderHolder.ivAlertIcon.setVisibility(View.GONE);
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
protected void onNewIntent(Intent intent) {
|
|
|
|
|
super.onNewIntent(intent);
|
|
|
|
|
initActivityState(intent);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
protected void onSaveInstanceState(Bundle outState) {
|
|
|
|
|
super.onSaveInstanceState(outState);
|
|
|
|
@ -359,7 +360,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
outState.putLong(Intent.EXTRA_UID, mWorkingNote.getNoteId());
|
|
|
|
|
Log.d(TAG, "Save working note id: " + mWorkingNote.getNoteId() + " onSaveInstanceState");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
//MotionEvent是对屏幕触控的传递机制
|
|
|
|
|
public boolean dispatchTouchEvent(MotionEvent ev) {
|
|
|
|
@ -368,7 +369,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
mNoteBgColorSelector.setVisibility(View.GONE);
|
|
|
|
|
return true;
|
|
|
|
|
}//颜色选择器在屏幕上可见
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (mFontSizeSelector.getVisibility() == View.VISIBLE
|
|
|
|
|
&& !inRangeOfView(mFontSizeSelector, ev)) {
|
|
|
|
|
mFontSizeSelector.setVisibility(View.GONE);
|
|
|
|
@ -392,7 +393,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void initResources() {
|
|
|
|
|
mHeadViewPanel = findViewById(R.id.note_title);
|
|
|
|
|
mNoteHeaderHolder = new HeadViewHolder();
|
|
|
|
@ -408,7 +409,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
ImageView iv = (ImageView) findViewById(id);
|
|
|
|
|
iv.setOnClickListener(this);
|
|
|
|
|
}//对标签各项属性内容的初始化
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mFontSizeSelector = findViewById(R.id.font_size_selector);
|
|
|
|
|
for (int id : sFontSizeBtnsMap.keySet()) {
|
|
|
|
|
View view = findViewById(id);
|
|
|
|
@ -426,7 +427,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
}
|
|
|
|
|
mEditTextList = (LinearLayout) findViewById(R.id.note_edit_list);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
protected void onPause() {
|
|
|
|
|
super.onPause();
|
|
|
|
@ -446,97 +447,98 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
Log.e(TAG, "Unspported widget type");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] {
|
|
|
|
|
mWorkingNote.getWidgetId()
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sendBroadcast(intent);
|
|
|
|
|
setResult(RESULT_OK, intent);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void onClick(View v) {
|
|
|
|
|
int id = v.getId();
|
|
|
|
|
if (id == R.id.btn_set_bg_color) {
|
|
|
|
|
mNoteBgColorSelector.setVisibility(View.VISIBLE);
|
|
|
|
|
int id = v.getId();//获取被点击视图的ID,并将其赋值给id变量
|
|
|
|
|
if (id == R.id.btn_set_bg_color) {//点击的是设置背景颜色的按钮
|
|
|
|
|
mNoteBgColorSelector.setVisibility(View.VISIBLE);//将背景颜色选择器视图mNoteBgColorSelector设置为可见状态(View.VISIBLE)
|
|
|
|
|
findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility(
|
|
|
|
|
- View.VISIBLE);
|
|
|
|
|
} else if (sBgSelectorBtnsMap.containsKey(id)) {
|
|
|
|
|
- View.VISIBLE);//找到当前背景颜色对应的选择项视图,并将其设置为可见状态
|
|
|
|
|
} else if (sBgSelectorBtnsMap.containsKey(id)) {//点击的是背景颜色选择器中的一个选项按钮
|
|
|
|
|
findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility(
|
|
|
|
|
View.GONE);
|
|
|
|
|
mWorkingNote.setBgColorId(sBgSelectorBtnsMap.get(id));
|
|
|
|
|
mNoteBgColorSelector.setVisibility(View.GONE);
|
|
|
|
|
} else if (sFontSizeBtnsMap.containsKey(id)) {
|
|
|
|
|
findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.GONE);
|
|
|
|
|
mFontSizeId = sFontSizeBtnsMap.get(id);
|
|
|
|
|
mSharedPrefs.edit().putInt(PREFERENCE_FONT_SIZE, mFontSizeId).commit();
|
|
|
|
|
findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.VISIBLE);
|
|
|
|
|
if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) {
|
|
|
|
|
View.GONE);//找到当前背景颜色对应的选择项视图,并将其设置为不可见状态(View.GONE)
|
|
|
|
|
mWorkingNote.setBgColorId(sBgSelectorBtnsMap.get(id));//将被点击的选项按钮对应的背景颜色ID设置给mWorkingNote对象
|
|
|
|
|
mNoteBgColorSelector.setVisibility(View.GONE);//将背景颜色选择器视图mNoteBgColorSelector设置为不可见状态
|
|
|
|
|
} else if (sFontSizeBtnsMap.containsKey(id)) {//点击的是字体大小选择器中的一个选项按钮
|
|
|
|
|
findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.GONE);//找到当前字体大小对应的选择项视图,并将其设置为不可见状态(View.GONE)
|
|
|
|
|
mFontSizeId = sFontSizeBtnsMap.get(id);//将被点击的选项按钮对应的字体大小ID设置给mFontSizeId变量
|
|
|
|
|
mSharedPrefs.edit().putInt(PREFERENCE_FONT_SIZE, mFontSizeId).commit();//使用mSharedPrefs对象将mFontSizeId保存到偏好设置中
|
|
|
|
|
findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.VISIBLE);//找到当前字体大小对应的选择项视图,并将其设置为可见状态
|
|
|
|
|
if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) {//如果当前便签是待办事项模式
|
|
|
|
|
getWorkingText();
|
|
|
|
|
switchToListMode(mWorkingNote.getContent());
|
|
|
|
|
switchToListMode(mWorkingNote.getContent());//获取当前便签中的文本内容,并切换到列表模式
|
|
|
|
|
} else {
|
|
|
|
|
mNoteEditor.setTextAppearance(this,
|
|
|
|
|
TextAppearanceResources.getTexAppearanceResource(mFontSizeId));
|
|
|
|
|
TextAppearanceResources.getTexAppearanceResource(mFontSizeId));//将便签编辑器mNoteEditor的文本外观设置为对应字体大小的样式
|
|
|
|
|
}
|
|
|
|
|
mFontSizeSelector.setVisibility(View.GONE);
|
|
|
|
|
mFontSizeSelector.setVisibility(View.GONE);//将字体大小选择器视图mFontSizeSelector设置为不可见状态
|
|
|
|
|
}
|
|
|
|
|
}//************************存在问题
|
|
|
|
|
|
|
|
|
|
}//
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onBackPressed() {
|
|
|
|
|
if(clearSettingState()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
saveNote();
|
|
|
|
|
super.onBackPressed();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private boolean clearSettingState() {
|
|
|
|
|
|
|
|
|
|
private boolean clearSettingState() {//用于清除设置状态
|
|
|
|
|
if (mNoteBgColorSelector.getVisibility() == View.VISIBLE) {
|
|
|
|
|
mNoteBgColorSelector.setVisibility(View.GONE);
|
|
|
|
|
mNoteBgColorSelector.setVisibility(View.GONE);//将背景颜色选择器视图mNoteBgColorSelector设置为不可见状态(View.GONE)
|
|
|
|
|
return true;
|
|
|
|
|
} else if (mFontSizeSelector.getVisibility() == View.VISIBLE) {
|
|
|
|
|
mFontSizeSelector.setVisibility(View.GONE);
|
|
|
|
|
mFontSizeSelector.setVisibility(View.GONE);//将字体大小选择器视图mFontSizeSelector设置为不可见状态
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void onBackgroundColorChanged() {
|
|
|
|
|
|
|
|
|
|
public void onBackgroundColorChanged() {//用于在背景颜色改变时进行相应的处理
|
|
|
|
|
findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility(
|
|
|
|
|
View.VISIBLE);
|
|
|
|
|
View.VISIBLE);//找到当前背景颜色对应的选择项视图,并将其设置为可见状态(View.VISIBLE)
|
|
|
|
|
//将便签编辑器容器视图mNoteEditorPanel和标题栏容器视图mHeadViewPanel的背景资源ID设置为mWorkingNote对象所选的背景颜色对应的资源ID
|
|
|
|
|
mNoteEditorPanel.setBackgroundResource(mWorkingNote.getBgColorResId());
|
|
|
|
|
mHeadViewPanel.setBackgroundResource(mWorkingNote.getTitleBgResId());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
//对选择菜单的准备
|
|
|
|
|
public boolean onPrepareOptionsMenu(Menu menu) {
|
|
|
|
|
if (isFinishing()) {
|
|
|
|
|
public boolean onPrepareOptionsMenu(Menu menu) {//在准备显示选项菜单时进行相应的处理
|
|
|
|
|
if (isFinishing()) {//检查当前活动是否即将结束
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
clearSettingState();
|
|
|
|
|
menu.clear();
|
|
|
|
|
if (mWorkingNote.getFolderId() == Notes.ID_CALL_RECORD_FOLDER) {
|
|
|
|
|
getMenuInflater().inflate(R.menu.call_note_edit, menu);
|
|
|
|
|
clearSettingState();//清除设置状态
|
|
|
|
|
menu.clear();//清除之前的菜单项
|
|
|
|
|
if (mWorkingNote.getFolderId() == Notes.ID_CALL_RECORD_FOLDER) {//如果文件夹ID等于Notes.ID_CALL_RECORD_FOLDER,表示当前工作便签是通话记录文件夹
|
|
|
|
|
getMenuInflater().inflate(R.menu.call_note_edit, menu);//将R.menu.call_note_edit布局文件实例化为菜单项,并添加到选项菜单中
|
|
|
|
|
// MenuInflater是用来实例化Menu目录下的Menu布局文件的
|
|
|
|
|
} else {
|
|
|
|
|
getMenuInflater().inflate(R.menu.note_edit, menu);
|
|
|
|
|
getMenuInflater().inflate(R.menu.note_edit, menu);//将R.menu.note_edit布局文件实例化为菜单项,并添加到选项菜单中
|
|
|
|
|
}
|
|
|
|
|
if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) {
|
|
|
|
|
menu.findItem(R.id.menu_list_mode).setTitle(R.string.menu_normal_mode);
|
|
|
|
|
if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) {//如果是检查列表模式(TextNote.MODE_CHECK_LIST)
|
|
|
|
|
menu.findItem(R.id.menu_list_mode).setTitle(R.string.menu_normal_mode);//将选项菜单中ID为R.id.menu_list_mode的菜单项的标题设置为字符串资源R.string.menu_normal_mode
|
|
|
|
|
} else {
|
|
|
|
|
menu.findItem(R.id.menu_list_mode).setTitle(R.string.menu_list_mode);
|
|
|
|
|
menu.findItem(R.id.menu_list_mode).setTitle(R.string.menu_list_mode);//将选项菜单中ID为R.id.menu_list_mode的菜单项的标题设置为字符串资源R.string.menu_list_mode
|
|
|
|
|
}
|
|
|
|
|
if (mWorkingNote.hasClockAlert()) {
|
|
|
|
|
menu.findItem(R.id.menu_alert).setVisible(false);
|
|
|
|
|
if (mWorkingNote.hasClockAlert()) {//如果有闹钟提醒
|
|
|
|
|
menu.findItem(R.id.menu_alert).setVisible(false);//将选项菜单中ID为R.id.menu_alert的菜单项设置为不可见(setVisible(false))
|
|
|
|
|
} else {
|
|
|
|
|
menu.findItem(R.id.menu_delete_remind).setVisible(false);
|
|
|
|
|
menu.findItem(R.id.menu_delete_remind).setVisible(false);//将选项菜单中ID为R.id.menu_delete_remind的菜单项设置为不可见
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
/*
|
|
|
|
|
* 函数功能:动态改变菜单选项内容
|
|
|
|
@ -610,7 +612,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 函数功能:建立事件提醒器
|
|
|
|
|
* 函数实现:如下注释
|
|
|
|
@ -623,12 +625,12 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
mWorkingNote.setAlertDate(date , true);
|
|
|
|
|
//选择提醒的日期
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
//建立时间日期的监听器
|
|
|
|
|
d.show();
|
|
|
|
|
//显示对话框
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Share note to apps that support {@link Intent#ACTION_SEND} action
|
|
|
|
|
* and {@text/plain} type
|
|
|
|
@ -647,7 +649,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
context.startActivity(intent);
|
|
|
|
|
//在acti中进行链接
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 函数功能:创建一个新的便签
|
|
|
|
|
* 函数实现:如下注释
|
|
|
|
@ -656,7 +658,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
// Firstly, save current editing notes
|
|
|
|
|
//保存当前便签
|
|
|
|
|
saveNote();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// For safety, start a new NoteEditActivity
|
|
|
|
|
finish();
|
|
|
|
|
Intent intent = new Intent(this, NoteEditActivity.class);
|
|
|
|
@ -668,7 +670,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
startActivity(intent);
|
|
|
|
|
//开始activity并链接
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 函数功能:删除当前便签
|
|
|
|
|
* 函数实现:如下注释
|
|
|
|
@ -702,7 +704,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
mWorkingNote.markDeleted(true);
|
|
|
|
|
//将这些标签的删除标记置为true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 函数功能:判断是否为同步模式
|
|
|
|
|
* 函数实现:直接看NotesPreferenceActivity中同步名称是否为空
|
|
|
|
@ -710,7 +712,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
private boolean isSyncMode() {
|
|
|
|
|
return NotesPreferenceActivity.getSyncAccountName(this).trim().length() > 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 函数功能:设置提醒时间
|
|
|
|
|
* 函数实现:如下注释
|
|
|
|
@ -743,20 +745,20 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
* There is the condition that user has input nothing (the note is
|
|
|
|
|
* not worthy saving), we have no note id, remind the user that he
|
|
|
|
|
* should input something
|
|
|
|
|
*/
|
|
|
|
|
*/
|
|
|
|
|
//没有运行的便签就报错
|
|
|
|
|
Log.e(TAG, "Clock alert setting error");
|
|
|
|
|
showToast(R.string.error_note_empty_for_clock);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 函数功能:Widget发生改变的所触发的事件
|
|
|
|
|
*/
|
|
|
|
|
public void onWidgetChanged() {
|
|
|
|
|
updateWidget();//更新Widget
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 函数功能: 删除编辑文本框所触发的事件
|
|
|
|
|
* 函数实现:如下注释
|
|
|
|
@ -772,7 +774,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
.setIndex(i - 1);
|
|
|
|
|
//通过id把编辑框存在便签编辑框中
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mEditTextList.removeViewAt(index);
|
|
|
|
|
//删除特定位置的视图
|
|
|
|
|
NoteEditText edit = null;
|
|
|
|
@ -789,7 +791,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
edit.requestFocus();//请求优先完成该此 编辑
|
|
|
|
|
edit.setSelection(length);//定位到length位置处的条目
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 函数功能:进入编辑文本框所触发的事件
|
|
|
|
|
* 函数实现:如下注释
|
|
|
|
@ -802,7 +804,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
Log.e(TAG, "Index out of mEditTextList boundrary, should not happen");
|
|
|
|
|
//越界把偶偶
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
View view = getListItem(text, index);
|
|
|
|
|
mEditTextList.addView(view, index);
|
|
|
|
|
//建立一个新的视图并添加到编辑文本框内
|
|
|
|
@ -815,7 +817,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
//遍历子文本框并设置对应对下标
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 函数功能:切换至列表模式
|
|
|
|
|
* 函数实现:如下注释
|
|
|
|
@ -835,13 +837,13 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
mEditTextList.addView(getListItem("", index));
|
|
|
|
|
mEditTextList.getChildAt(index).findViewById(R.id.et_edit_text).requestFocus();
|
|
|
|
|
//优先请求此操作
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mNoteEditor.setVisibility(View.GONE);
|
|
|
|
|
//便签编辑器不可见
|
|
|
|
|
mEditTextList.setVisibility(View.VISIBLE);
|
|
|
|
|
//将文本编辑框置为可见
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 函数功能:获取高亮效果的反馈情况
|
|
|
|
|
* 函数实现:如下注释
|
|
|
|
@ -867,7 +869,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
}
|
|
|
|
|
return spannable;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 函数功能:获取列表项
|
|
|
|
|
* 函数实现:如下注释
|
|
|
|
@ -889,7 +891,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
//建立一个打钩框并设置监听器
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (item.startsWith(TAG_CHECKED)) {
|
|
|
|
|
//选择勾选
|
|
|
|
|
cb.setChecked(true);
|
|
|
|
@ -901,14 +903,14 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
edit.setPaintFlags(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG);
|
|
|
|
|
item = item.substring(TAG_UNCHECKED.length(), item.length()).trim();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
edit.setOnTextViewChangeListener(this);
|
|
|
|
|
edit.setIndex(index);
|
|
|
|
|
edit.setText(getHighlightQueryResult(item, mUserQuery));
|
|
|
|
|
//运行编辑框的监听器对该行为作出反应,并设置下标及文本内容
|
|
|
|
|
return view;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 函数功能:便签内容发生改变所 触发的事件
|
|
|
|
|
* 函数实现:如下注释
|
|
|
|
@ -926,7 +928,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
}
|
|
|
|
|
//如果内容不为空则将其子编辑框可见性置为可见,否则不可见
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 函数功能:检查模式和列表模式的切换
|
|
|
|
|
* 函数实现:如下注释
|
|
|
|
@ -947,7 +949,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
//修改文本编辑器的内容和可见性
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 函数功能:设置勾选选项表并返回是否勾选的标记
|
|
|
|
|
* 函数实现:如下注释
|
|
|
|
@ -961,7 +963,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
//创建可变字符串
|
|
|
|
|
for (int i = 0; i < mEditTextList.getChildCount(); i++) {
|
|
|
|
|
View view = mEditTextList.getChildAt(i);
|
|
|
|
|
//遍历所有子编辑框的视图
|
|
|
|
|
//遍历所有子编辑框的视图
|
|
|
|
|
NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text);
|
|
|
|
|
if (!TextUtils.isEmpty(edit.getText())) {
|
|
|
|
|
//若文本不为空
|
|
|
|
@ -984,10 +986,10 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
}
|
|
|
|
|
return hasChecked;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 函数功能:保存便签
|
|
|
|
|
* 函数实现:如下注释
|
|
|
|
|
* 函数实现:如下注释
|
|
|
|
|
*/
|
|
|
|
|
private boolean saveNote() {
|
|
|
|
|
getWorkingText();
|
|
|
|
@ -1006,10 +1008,10 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
}
|
|
|
|
|
return saved;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 函数功能:将便签发送至桌面
|
|
|
|
|
* 函数实现:如下注释
|
|
|
|
|
* 函数实现:如下注释
|
|
|
|
|
*/
|
|
|
|
|
private void sendToDesktop() {
|
|
|
|
|
/**
|
|
|
|
@ -1021,7 +1023,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
saveNote();
|
|
|
|
|
//若不存在数据也就是新的标签就保存起来先
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (mWorkingNote.getNoteId() > 0) {
|
|
|
|
|
//若是有内容
|
|
|
|
|
Intent sender = new Intent();
|
|
|
|
@ -1053,10 +1055,10 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
//空便签直接报错
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 函数功能:编辑小图标的标题
|
|
|
|
|
* 函数实现:如下注释
|
|
|
|
|
* 函数实现:如下注释
|
|
|
|
|
*/
|
|
|
|
|
private String makeShortcutIconTitle(String content) {
|
|
|
|
|
content = content.replace(TAG_CHECKED, "");
|
|
|
|
@ -1064,8 +1066,8 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
return content.length() > SHORTCUT_ICON_TITLE_MAX_LEN ? content.substring(0,
|
|
|
|
|
SHORTCUT_ICON_TITLE_MAX_LEN) : content;
|
|
|
|
|
//直接设置为content中的内容并返回,有勾选和未勾选2种
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 函数功能:显示提示的视图
|
|
|
|
|
* 函数实现:根据下标显示对应的提示
|
|
|
|
@ -1073,7 +1075,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
private void showToast(int resId) {
|
|
|
|
|
showToast(resId, Toast.LENGTH_SHORT);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 函数功能:持续显示提示的视图
|
|
|
|
|
* 函数实现:根据下标和持续的时间(duration)编辑提示视图并显示
|
|
|
|
@ -1081,4 +1083,4 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
private void showToast(int resId, int duration) {
|
|
|
|
|
Toast.makeText(this, resId, duration).show();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|