|
|
|
@ -13,7 +13,7 @@
|
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
|
* limitations under the License.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/*NoteEditActivity类实现了便签的编辑活动*/
|
|
|
|
|
package net.micode.notes.ui;
|
|
|
|
|
|
|
|
|
|
import android.Manifest;
|
|
|
|
@ -118,23 +118,32 @@ import retrofit2.converter.gson.GsonConverterFactory;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**NoteEditActivity继承了Android库中的Activity类
|
|
|
|
|
*并实现了OnClickListener,NoteSettingChangedListener, OnTextViewChangeListener这三个接口
|
|
|
|
|
*这表明该活动可以处理单击事件、侦听笔记设置中的更改并响应文本视图中的更改。*/
|
|
|
|
|
|
|
|
|
|
public class NoteEditActivity<关闭> extends AppCompatActivity implements OnClickListener,
|
|
|
|
|
NoteSettingChangedListener, OnTextViewChangeListener {
|
|
|
|
|
|
|
|
|
|
/**此类用于保存对与活动头相关的各种UI元素的引用*/
|
|
|
|
|
private class HeadViewHolder {
|
|
|
|
|
//TextView(文本框),用于显示文本的一个控件
|
|
|
|
|
// 用于显示关于笔记的最后一次修改的信息。
|
|
|
|
|
public TextView tvModified;
|
|
|
|
|
|
|
|
|
|
//一个用于显示警告标识的 ImageView,可能指示提醒或重要注释状态。
|
|
|
|
|
//ImageView,图像视图,直接继承自View类,它的主要功能是用于显示图片。
|
|
|
|
|
//ImageView可以适用于任何布局中,并且Android为其提供了缩放和着色的一些操作。
|
|
|
|
|
public ImageView ivAlertIcon;
|
|
|
|
|
|
|
|
|
|
public TextView tvToptext;
|
|
|
|
|
|
|
|
|
|
//用于显示与警报关联的日期的 TextView。
|
|
|
|
|
public TextView tvAlertDate;
|
|
|
|
|
|
|
|
|
|
//一个 ImageView,是一个用于设置背景颜色的按钮
|
|
|
|
|
public ImageView ibSetBgColor;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**函数定义了一个静态的、不可变的Map对象sBgSelectorBtnsMap,并在静态初始化块时往其中放入了键值对。
|
|
|
|
|
* 键是控件的id,R.id是用于访问应用程序资源的标识符,通过R.id可以在代码中引用对应的控件进行操作
|
|
|
|
|
* 值是ResourceParser类(界面元素的解析工具类,通过R.java这个类撷取资源供程序调用)中定义的有关颜色常量。
|
|
|
|
|
* 这样就可以通过控件的id快速获取对应的常量值,从而进行相应的操作*/
|
|
|
|
|
private static final Map<Integer, Integer> sBgSelectorBtnsMap = new HashMap<Integer, Integer>();
|
|
|
|
|
|
|
|
|
|
static {
|
|
|
|
@ -145,6 +154,10 @@ public class NoteEditActivity<关闭> extends AppCompatActivity implements OnCli
|
|
|
|
|
sBgSelectorBtnsMap.put(R.id.iv_bg_white, ResourceParser.WHITE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**初始化静态Map对象sBgSelectorSelectionMap
|
|
|
|
|
* 键是ResourceParser类中定义的有关颜色常量
|
|
|
|
|
* 值是控件的id
|
|
|
|
|
* 这样就可以通过常量值快速获取对应的控件的id,从而进行相应的操作*/
|
|
|
|
|
private static final Map<Integer, Integer> sBgSelectorSelectionMap = new HashMap<Integer, Integer>();
|
|
|
|
|
|
|
|
|
|
static {
|
|
|
|
@ -155,6 +168,10 @@ public class NoteEditActivity<关闭> extends AppCompatActivity implements OnCli
|
|
|
|
|
sBgSelectorSelectionMap.put(ResourceParser.WHITE, R.id.iv_bg_white_select);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**初始化静态Map对象sFontSizeBtnsMap
|
|
|
|
|
* 键是控件的id
|
|
|
|
|
* 值是ResourceParser类中定义的有关字体大小常量
|
|
|
|
|
* 这样就可以通过控件的id快速获取对应的常量值,从而进行相应的操作*/
|
|
|
|
|
private static final Map<Integer, Integer> sFontSizeBtnsMap = new HashMap<Integer, Integer>();
|
|
|
|
|
|
|
|
|
|
static {
|
|
|
|
@ -164,6 +181,10 @@ public class NoteEditActivity<关闭> extends AppCompatActivity implements OnCli
|
|
|
|
|
sFontSizeBtnsMap.put(R.id.ll_font_super, ResourceParser.TEXT_SUPER);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**初始化静态Map对象sFontSelectorSelectionMap
|
|
|
|
|
* 键是ResourceParser类中定义的有关字体大小常量
|
|
|
|
|
* 值是控件的id
|
|
|
|
|
* 这样就可以通过常量值快速获取对应的控件的id,从而进行相应的操作*/
|
|
|
|
|
private static final Map<Integer, Integer> sFontSelectorSelectionMap = new HashMap<Integer, Integer>();
|
|
|
|
|
|
|
|
|
|
static {
|
|
|
|
@ -174,9 +195,17 @@ public class NoteEditActivity<关闭> extends AppCompatActivity implements OnCli
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static final String TAG = "NoteEditActivity";
|
|
|
|
|
/**私有静态常量字符串TAG,并赋值为"NoteEditActivity"。
|
|
|
|
|
* 通常用于在代码中标识日志输出或调试信息的来源,可以帮助开发者更容易地识别和过滤特定的日志输出。
|
|
|
|
|
* Log.d和Log.e是Android中的日志记录方法。它们用于在开发过程中输出调试信息和错误信息。
|
|
|
|
|
* Log.d用于输出调试消息,通常用于输出一些调试信息,而Log.e用于输出错误消息,通常用于输出一些错误信息或异常信息。
|
|
|
|
|
* 这些日志信息可以帮助开发人员在开发和测试过程中进行调试和故障排除。*/
|
|
|
|
|
//保存头部视图的UI元素
|
|
|
|
|
|
|
|
|
|
private HeadViewHolder mNoteHeaderHolder;
|
|
|
|
|
|
|
|
|
|
//声明与注释编辑器相关的各种UI元素和数据的成员变量
|
|
|
|
|
//Android中的View类代表用户界面中基本的构建块。一个View在屏幕中占据一个矩形区域、并且负责绘制和事件处理。
|
|
|
|
|
private View mHeadViewPanel;
|
|
|
|
|
|
|
|
|
|
private View mNoteBgColorSelector;
|
|
|
|
@ -187,16 +216,21 @@ public class NoteEditActivity<关闭> extends AppCompatActivity implements OnCli
|
|
|
|
|
|
|
|
|
|
private View mNoteEditorPanel;
|
|
|
|
|
|
|
|
|
|
//表示正在编辑的工作笔记的对象
|
|
|
|
|
private WorkingNote mWorkingNote;
|
|
|
|
|
|
|
|
|
|
// SharedPreferences用于存储和检索用户首选项
|
|
|
|
|
private SharedPreferences mSharedPrefs;
|
|
|
|
|
//变量存储选定的字体大小ID
|
|
|
|
|
private int mFontSizeId;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// SharedPreferences中与字体大小相关的首选项键的常量字符串
|
|
|
|
|
private static final String PREFERENCE_FONT_SIZE = "pref_font_size";
|
|
|
|
|
|
|
|
|
|
//常量定义快捷图标标题的最大长度
|
|
|
|
|
private static final int SHORTCUT_ICON_TITLE_MAX_LEN = 10;
|
|
|
|
|
|
|
|
|
|
//使用特殊的Unicode字符表示选中和未选中状态的常量
|
|
|
|
|
public static final String TAG_CHECKED = String.valueOf('\u221A');
|
|
|
|
|
public static final String TAG_UNCHECKED = String.valueOf('\u25A1');
|
|
|
|
|
|
|
|
|
@ -216,12 +250,16 @@ public class NoteEditActivity<关闭> extends AppCompatActivity implements OnCli
|
|
|
|
|
|
|
|
|
|
private boolean mIsRvoke = false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//用于保存EditText元素列表的LinearLayout
|
|
|
|
|
private LinearLayout mEditTextList;
|
|
|
|
|
|
|
|
|
|
//存储用户查询的字符串变量
|
|
|
|
|
private String mUserQuery;
|
|
|
|
|
private Pattern mPattern;
|
|
|
|
|
|
|
|
|
|
/**在创建活动时调用 onCreate 方法
|
|
|
|
|
* 并将内容视图设置为指定的布局。然后它检查活动是否是第一次创建
|
|
|
|
|
* 并根据意图初始化其状态。如果初始化失败,则活动完成*/
|
|
|
|
|
@Override
|
|
|
|
|
protected void onCreate(Bundle savedInstanceState) {
|
|
|
|
|
super.onCreate(savedInstanceState);
|
|
|
|
@ -253,6 +291,11 @@ public class NoteEditActivity<关闭> extends AppCompatActivity implements OnCli
|
|
|
|
|
* 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);
|
|
|
|
@ -267,6 +310,10 @@ public class NoteEditActivity<关闭> extends AppCompatActivity implements OnCli
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 这个函数主要实现了初始化Activity状态的功能。
|
|
|
|
|
* 它检查传入的Intent是否为ACTION_VIEW,如果是则从Intent中获取ID并进行相应的处理;如果不是则记录错误信息并结束Activity。
|
|
|
|
|
* 最后,它设置了监听器并返回了一个布尔值表示初始化状态的结果。*/
|
|
|
|
|
private boolean initActivityState(Intent intent) {
|
|
|
|
|
/**
|
|
|
|
|
* If the user specified the {@link Intent#ACTION_VIEW} but not provided with id,
|
|
|
|
@ -350,12 +397,17 @@ public class NoteEditActivity<关闭> extends AppCompatActivity implements OnCli
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
*当activity恢复时,调用 initNoteScreen ()来设置便笺编辑器和相关的 UI 组件,初始化note屏幕*/
|
|
|
|
|
@Override
|
|
|
|
|
protected void onResume() {
|
|
|
|
|
super.onResume();
|
|
|
|
|
initNoteScreen();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* InitNoteScreen方法根据笔记类型(检查表或常规文本)配置笔记编辑器的各个方面,
|
|
|
|
|
* 设置文本外观,处理背景视图,设置时间戳,并包括一个用于设置警报的占位符(由于 DateTimePicker 不可用,当前禁用)。*/
|
|
|
|
|
private void initNoteScreen() {
|
|
|
|
|
mNoteEditor.setTextAppearance(this, TextAppearanceResources
|
|
|
|
|
.getTexAppearanceResource(mFontSizeId));
|
|
|
|
@ -385,6 +437,8 @@ public class NoteEditActivity<关闭> extends AppCompatActivity implements OnCli
|
|
|
|
|
showTopHeader();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 此方法根据mWorkingNote中时钟警报的存在和过期状态处理UI中警报的可见性和文本设置。*/
|
|
|
|
|
private void showAlertHeader() {
|
|
|
|
|
if (mWorkingNote.hasClockAlert()) {
|
|
|
|
|
long time = System.currentTimeMillis();
|
|
|
|
@ -411,12 +465,17 @@ public class NoteEditActivity<关闭> extends AppCompatActivity implements OnCli
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 对于在清单中将 launchMode 设置为“ singleTop”的活动,调用此方法。这里使用它来初始化具有新意图的活动状态。*/
|
|
|
|
|
@Override
|
|
|
|
|
protected void onNewIntent(Intent intent) {
|
|
|
|
|
super.onNewIntent(intent);
|
|
|
|
|
initActivityState(intent);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 调用此方法以保存活动的当前状态。它检查数据库中是否存在工作说明。
|
|
|
|
|
* 如果没有,它将保存注释以生成 ID。注释 ID 随后添加到 outState 包,并添加一条日志语句以进行调试。*/
|
|
|
|
|
@Override
|
|
|
|
|
protected void onSaveInstanceState(Bundle outState) {
|
|
|
|
|
super.onSaveInstanceState(outState);
|
|
|
|
@ -432,6 +491,7 @@ public class NoteEditActivity<关闭> extends AppCompatActivity implements OnCli
|
|
|
|
|
Log.d(TAG, "Save working note id: " + mWorkingNote.getNoteId() + " onSaveInstanceState");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**检查背景颜色选择器是否可见,触摸事件是否在其边界之外*/
|
|
|
|
|
@Override
|
|
|
|
|
public boolean dispatchTouchEvent(MotionEvent ev) {
|
|
|
|
|
if (mNoteBgColorSelector.getVisibility() == View.VISIBLE
|
|
|
|
@ -448,6 +508,8 @@ public class NoteEditActivity<关闭> extends AppCompatActivity implements OnCli
|
|
|
|
|
return super.dispatchTouchEvent(ev);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**检查MotionEvent是否在View的边界内的Helper方法
|
|
|
|
|
* 返回值是一个bool量*/
|
|
|
|
|
private boolean inRangeOfView(View view, MotionEvent ev) {
|
|
|
|
|
int[] location = new int[2];
|
|
|
|
|
view.getLocationOnScreen(location);
|
|
|
|
@ -462,13 +524,19 @@ public class NoteEditActivity<关闭> extends AppCompatActivity implements OnCli
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 初始化活动使用的资源。*/
|
|
|
|
|
private void initResources() {
|
|
|
|
|
//查找和设置头部视图面板
|
|
|
|
|
mHeadViewPanel = findViewById(R.id.note_title);
|
|
|
|
|
//初始化注释头视图的holder
|
|
|
|
|
mNoteHeaderHolder = new HeadViewHolder();
|
|
|
|
|
//在holder中查找并设置各种注释头视图
|
|
|
|
|
mNoteHeaderHolder.tvModified = (TextView) findViewById(R.id.tv_modified_date);
|
|
|
|
|
mNoteHeaderHolder.ivAlertIcon = (ImageView) findViewById(R.id.iv_alert_icon);
|
|
|
|
|
mNoteHeaderHolder.tvAlertDate = (TextView) findViewById(R.id.tv_alert_date);
|
|
|
|
|
mNoteHeaderHolder.tvToptext = (TextView) findViewById(R.id.tv_set_top);
|
|
|
|
|
//查找并设置注释编辑器及其父面板
|
|
|
|
|
mNoteHeaderHolder.ibSetBgColor = (ImageView) findViewById(R.id.btn_set_bg_color);
|
|
|
|
|
|
|
|
|
|
mNoteHeaderHolder.ibSetBgColor.setOnClickListener(this);
|
|
|
|
@ -493,19 +561,23 @@ public class NoteEditActivity<关闭> extends AppCompatActivity implements OnCli
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
mNoteEditorPanel = findViewById(R.id.sv_note_edit);
|
|
|
|
|
//查找并设置音符背景颜色选择器
|
|
|
|
|
mNoteBgColorSelector = findViewById(R.id.note_bg_color_selector);
|
|
|
|
|
//遍历后台选择器按钮并设置点击监听器
|
|
|
|
|
for (int id : sBgSelectorBtnsMap.keySet()) {
|
|
|
|
|
ImageView iv = (ImageView) findViewById(id);
|
|
|
|
|
iv.setOnClickListener(this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//查找并设置字体大小选择器
|
|
|
|
|
mFontSizeSelector = findViewById(R.id.font_size_selector);
|
|
|
|
|
//遍历字体大小按钮并设置单击侦听器
|
|
|
|
|
for (int id : sFontSizeBtnsMap.keySet()) {
|
|
|
|
|
View view = findViewById(id);
|
|
|
|
|
view.setOnClickListener(this);
|
|
|
|
|
}
|
|
|
|
|
;
|
|
|
|
|
};
|
|
|
|
|
//初始化SharedPreferences用于存储首选项
|
|
|
|
|
mSharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
|
|
|
|
|
//使用默认值检索字体大小首选项
|
|
|
|
|
mFontSizeId = mSharedPrefs.getInt(PREFERENCE_FONT_SIZE, ResourceParser.BG_DEFAULT_FONT_SIZE);
|
|
|
|
|
/**
|
|
|
|
|
* HACKME: Fix bug of store the resource id in shared preference.
|
|
|
|
@ -515,6 +587,7 @@ public class NoteEditActivity<关闭> extends AppCompatActivity implements OnCli
|
|
|
|
|
if (mFontSizeId >= TextAppearanceResources.getResourcesSize()) {
|
|
|
|
|
mFontSizeId = ResourceParser.BG_DEFAULT_FONT_SIZE;
|
|
|
|
|
}
|
|
|
|
|
//查找并设置edittext列表的线性布局
|
|
|
|
|
mEditTextList = (LinearLayout) findViewById(R.id.note_edit_list);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -523,44 +596,60 @@ public class NoteEditActivity<关闭> extends AppCompatActivity implements OnCli
|
|
|
|
|
translate();
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
*当活动暂停时调用。覆盖Android生命周期中的onPause方法。
|
|
|
|
|
*在活动暂停之前执行必要的操作。*/
|
|
|
|
|
@Override
|
|
|
|
|
protected void onPause() {
|
|
|
|
|
super.onPause();
|
|
|
|
|
//如果saveNote()方法返回true,则保存当前笔记数据
|
|
|
|
|
if (saveNote()) {
|
|
|
|
|
Log.d(TAG, "Note data was saved with length:" + mWorkingNote.getContent().length());
|
|
|
|
|
}
|
|
|
|
|
//清除所有设置状态
|
|
|
|
|
clearSettingState();
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 更新与当前笔记相关的应用程序小部件。
|
|
|
|
|
* 构造一个意图来更新应用小部件并广播它*/
|
|
|
|
|
private void updateWidget() {
|
|
|
|
|
//为应用小部件更新创建一个intent
|
|
|
|
|
Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
|
|
|
|
|
//根据小部件类型设置小部件提供程序的类
|
|
|
|
|
if (mWorkingNote.getWidgetType() == Notes.TYPE_WIDGET_2X) {
|
|
|
|
|
intent.setClass(this, NoteWidgetProvider_2x.class);
|
|
|
|
|
} else if (mWorkingNote.getWidgetType() == Notes.TYPE_WIDGET_4X) {
|
|
|
|
|
intent.setClass(this, NoteWidgetProvider_4x.class);
|
|
|
|
|
} else {
|
|
|
|
|
//记录不支持的小部件类型的错误,并从方法返回
|
|
|
|
|
Log.e(TAG, "Unspported widget type");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//向intent中添加widget ID
|
|
|
|
|
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[]{
|
|
|
|
|
mWorkingNote.getWidgetId()
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
//广播更新应用小部件的意图
|
|
|
|
|
sendBroadcast(intent);
|
|
|
|
|
//设置活动的结果来表示成功
|
|
|
|
|
setResult(RESULT_OK, intent);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
*处理活动中各种视图的点击事件。
|
|
|
|
|
* @param v 被点击的视图 */
|
|
|
|
|
public void onClick(View v) {
|
|
|
|
|
int id = v.getId();
|
|
|
|
|
//检查“设置背景色”按钮是否被点击
|
|
|
|
|
if (id == R.id.btn_set_bg_color) {
|
|
|
|
|
//显示背景颜色选择器并设置所选颜色的可见性
|
|
|
|
|
mNoteBgColorSelector.setVisibility(View.VISIBLE);
|
|
|
|
|
findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility(
|
|
|
|
|
View.VISIBLE);
|
|
|
|
|
} else if (sBgSelectorBtnsMap.containsKey(id)) {
|
|
|
|
|
//检查背景颜色选择器按钮是否被点击。隐藏当前选择的颜色,设置新颜色,隐藏选择器
|
|
|
|
|
findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility(
|
|
|
|
|
View.GONE);
|
|
|
|
|
mWorkingNote.setBgColorId(sBgSelectorBtnsMap.get(id));
|
|
|
|
|