|
|
@ -14,116 +14,150 @@
|
|
|
|
* limitations under the License.
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 代表这个类是UI包中的一个
|
|
|
|
|
|
|
|
*/
|
|
|
|
package net.micode.notes.ui;
|
|
|
|
package net.micode.notes.ui;
|
|
|
|
|
|
|
|
|
|
|
|
import android.app.Activity;
|
|
|
|
/**
|
|
|
|
import android.app.AlertDialog;
|
|
|
|
* 这些类涵盖了 Android 应用程序开发中常用的
|
|
|
|
import android.app.Dialog;
|
|
|
|
* UI 元素、数据存储、后台任务处理、系统服务调用等方面的功能。
|
|
|
|
import android.appwidget.AppWidgetManager;
|
|
|
|
*/
|
|
|
|
import android.content.AsyncQueryHandler;
|
|
|
|
|
|
|
|
import android.content.ContentResolver;
|
|
|
|
|
|
|
|
import android.content.ContentValues;
|
|
|
|
|
|
|
|
import android.content.Context;
|
|
|
|
|
|
|
|
import android.content.DialogInterface;
|
|
|
|
|
|
|
|
import android.content.Intent;
|
|
|
|
|
|
|
|
import android.content.SharedPreferences;
|
|
|
|
|
|
|
|
import android.database.Cursor;
|
|
|
|
|
|
|
|
import android.os.AsyncTask;
|
|
|
|
|
|
|
|
import android.os.Bundle;
|
|
|
|
|
|
|
|
import android.preference.PreferenceManager;
|
|
|
|
|
|
|
|
import android.text.Editable;
|
|
|
|
|
|
|
|
import android.text.TextUtils;
|
|
|
|
|
|
|
|
import android.text.TextWatcher;
|
|
|
|
|
|
|
|
import android.util.Log;
|
|
|
|
|
|
|
|
import android.view.ActionMode;
|
|
|
|
|
|
|
|
import android.view.ContextMenu;
|
|
|
|
|
|
|
|
import android.view.ContextMenu.ContextMenuInfo;
|
|
|
|
|
|
|
|
import android.view.Display;
|
|
|
|
|
|
|
|
import android.view.HapticFeedbackConstants;
|
|
|
|
|
|
|
|
import android.view.LayoutInflater;
|
|
|
|
|
|
|
|
import android.view.Menu;
|
|
|
|
|
|
|
|
import android.view.MenuItem;
|
|
|
|
|
|
|
|
import android.view.MenuItem.OnMenuItemClickListener;
|
|
|
|
|
|
|
|
import android.view.MotionEvent;
|
|
|
|
|
|
|
|
import android.view.View;
|
|
|
|
|
|
|
|
import android.view.View.OnClickListener;
|
|
|
|
|
|
|
|
import android.view.View.OnCreateContextMenuListener;
|
|
|
|
|
|
|
|
import android.view.View.OnTouchListener;
|
|
|
|
|
|
|
|
import android.view.inputmethod.InputMethodManager;
|
|
|
|
|
|
|
|
import android.widget.AdapterView;
|
|
|
|
|
|
|
|
import android.widget.AdapterView.OnItemClickListener;
|
|
|
|
|
|
|
|
import android.widget.AdapterView.OnItemLongClickListener;
|
|
|
|
|
|
|
|
import android.widget.Button;
|
|
|
|
|
|
|
|
import android.widget.EditText;
|
|
|
|
|
|
|
|
import android.widget.ListView;
|
|
|
|
|
|
|
|
import android.widget.PopupMenu;
|
|
|
|
|
|
|
|
import android.widget.TextView;
|
|
|
|
|
|
|
|
import android.widget.Toast;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import net.micode.notes.R;
|
|
|
|
|
|
|
|
import net.micode.notes.data.Notes;
|
|
|
|
|
|
|
|
import net.micode.notes.data.Notes.NoteColumns;
|
|
|
|
|
|
|
|
import net.micode.notes.gtask.remote.GTaskSyncService;
|
|
|
|
|
|
|
|
import net.micode.notes.model.WorkingNote;
|
|
|
|
|
|
|
|
import net.micode.notes.tool.BackupUtils;
|
|
|
|
|
|
|
|
import net.micode.notes.tool.DataUtils;
|
|
|
|
|
|
|
|
import net.micode.notes.tool.ResourceParser;
|
|
|
|
|
|
|
|
import net.micode.notes.ui.NotesListAdapter.AppWidgetAttribute;
|
|
|
|
|
|
|
|
import net.micode.notes.widget.NoteWidgetProvider_2x;
|
|
|
|
|
|
|
|
import net.micode.notes.widget.NoteWidgetProvider_4x;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import java.io.BufferedReader;
|
|
|
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
|
|
|
import java.io.InputStream;
|
|
|
|
|
|
|
|
import java.io.InputStreamReader;
|
|
|
|
|
|
|
|
import java.util.HashSet;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import android.app.Activity; //表示应用程序中的一个活动,例如界面展示等
|
|
|
|
|
|
|
|
import android.app.AlertDialog; //用于显示对话框的类
|
|
|
|
|
|
|
|
import android.app.Dialog; //用于创建对话框的类
|
|
|
|
|
|
|
|
import android.appwidget.AppWidgetManager; //用于管理桌面小组件的类
|
|
|
|
|
|
|
|
import android.content.AsyncQueryHandler; //用于在后台执行异步数据库查询的处理器。
|
|
|
|
|
|
|
|
import android.content.ContentResolver; //用于访问应用程序的内容提供者,进行数据的增删改查。
|
|
|
|
|
|
|
|
import android.content.ContentValues; //用于存储键值对,用于对数据库进行操作。
|
|
|
|
|
|
|
|
import android.content.Context; //表示 Android 应用程序的当前状态,提供访问应用程序的资源和类的接口。
|
|
|
|
|
|
|
|
import android.content.DialogInterface; //用于创建对话框与用户进行交互。
|
|
|
|
|
|
|
|
import android.content.Intent; //用于在应用程序内部或者不同应用程序之间进行交互或传递信息。
|
|
|
|
|
|
|
|
import android.content.SharedPreferences; //用于存储应用程序的轻量级 key-value 数据。
|
|
|
|
|
|
|
|
import android.database.Cursor; //用于在数据集中进行移动并访问查询结果。
|
|
|
|
|
|
|
|
import android.os.AsyncTask; //用于在后台执行长时间运行的操作,并在主线程更新用户界面。
|
|
|
|
|
|
|
|
import android.os.Bundle; //用于传递数据。
|
|
|
|
|
|
|
|
import android.preference.PreferenceManager; //用于访问应用程序的默认共享偏好设置。
|
|
|
|
|
|
|
|
import android.text.Editable; //表示文本框中的可编辑文本。
|
|
|
|
|
|
|
|
import android.text.TextUtils; //用于处理和操作文本数据。
|
|
|
|
|
|
|
|
import android.text.TextWatcher; //用于监听文本变化的接口。
|
|
|
|
|
|
|
|
import android.util.Log; //用于在调试时记录日志。
|
|
|
|
|
|
|
|
import android.view.ActionMode; //用于在用户界面上执行上下文操作的模式。
|
|
|
|
|
|
|
|
import android.view.ContextMenu; //用于在视图组件上下文菜单的呈现。
|
|
|
|
|
|
|
|
import android.view.ContextMenu.ContextMenuInfo; //提供有关创建上下文菜单的视图组件的额外信息。
|
|
|
|
|
|
|
|
import android.view.Display; //表示屏幕上的显示内容。
|
|
|
|
|
|
|
|
import android.view.HapticFeedbackConstants; //用于触觉反馈的常量值。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import android.view.LayoutInflater; //用于动态加载 XML 布局文件。
|
|
|
|
|
|
|
|
import android.view.Menu; //表示应用程序的菜单。
|
|
|
|
|
|
|
|
import android.view.MenuItem; //用于表示菜单项。
|
|
|
|
|
|
|
|
import android.view.MenuItem.OnMenuItemClickListener; //用于监听菜单项点击事件的接口。
|
|
|
|
|
|
|
|
import android.view.MotionEvent; //用于表示单个事件的运动事件。
|
|
|
|
|
|
|
|
import android.view.View; //用户界面上的可视元素。
|
|
|
|
|
|
|
|
import android.view.View.OnClickListener; //用于监听视图点击事件的接口。
|
|
|
|
|
|
|
|
import android.view.View.OnCreateContextMenuListener; //用于监听创建上下文菜单的接口。
|
|
|
|
|
|
|
|
import android.view.View.OnTouchListener; //用于监听视图触摸事件的接口。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import android.view.inputmethod.InputMethodManager; //用于管理输入法框架的接口。
|
|
|
|
|
|
|
|
import android.widget.AdapterView; //用于在视图组件中表示数据项的子集合。
|
|
|
|
|
|
|
|
import android.widget.AdapterView.OnItemClickListener; //用于监听列表项点击事件的接口。
|
|
|
|
|
|
|
|
import android.widget.AdapterView.OnItemLongClickListener; //用于监听列表项长按事件的接口。
|
|
|
|
|
|
|
|
import android.widget.Button; //用于在用户界面中表示按钮。
|
|
|
|
|
|
|
|
import android.widget.EditText; //用于在用户界面中表示可编辑的文本视图。
|
|
|
|
|
|
|
|
import android.widget.ListView; //用于在用户界面中表示列表视图。
|
|
|
|
|
|
|
|
import android.widget.PopupMenu; //用于显示弹出菜单的类。
|
|
|
|
|
|
|
|
import android.widget.TextView; //用于在用户界面中表示文本视图。
|
|
|
|
|
|
|
|
import android.widget.Toast; //用于显示简短消息的类。
|
|
|
|
|
|
|
|
import net.micode.notes.R; //引用应用程序的资源。
|
|
|
|
|
|
|
|
import net.micode.notes.data.Notes; //包含与笔记相关的数据的类。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import net.micode.notes.data.Notes.NoteColumns; //包含笔记数据列的类。
|
|
|
|
|
|
|
|
import net.micode.notes.gtask.remote.GTaskSyncService; //用于与 Google 任务同步服务进行交互的类
|
|
|
|
|
|
|
|
import net.micode.notes.model.WorkingNote; //与正在编辑的笔记相关联的类。
|
|
|
|
|
|
|
|
import net.micode.notes.tool.BackupUtils; //用于处理备份的工具类
|
|
|
|
|
|
|
|
import net.micode.notes.tool.DataUtils; //包含处理数据的实用方法的类。
|
|
|
|
|
|
|
|
import net.micode.notes.tool.ResourceParser; //用于解析资源的类。
|
|
|
|
|
|
|
|
import net.micode.notes.ui.NotesListAdapter.AppWidgetAttribute; //用于在笔记列表适配器中表示应用程序小部件属性的类。
|
|
|
|
|
|
|
|
import net.micode.notes.widget.NoteWidgetProvider_2x; //用于创建 2x 大小笔记应用程序小部件的类。
|
|
|
|
|
|
|
|
import net.micode.notes.widget.NoteWidgetProvider_4x; //用于创建 4x 大小笔记应用程序小部件的类。用于创建 4x 大小笔记应用程序小部件的类。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import java.io.BufferedReader; //用于从字符输入流中读取文本的类。
|
|
|
|
|
|
|
|
import java.io.IOException; //用于处理输入输出异常的类。
|
|
|
|
|
|
|
|
import java.io.InputStream; //用于表示输入字节流的类。
|
|
|
|
|
|
|
|
import java.io.InputStreamReader; //用于从字节流到字符流的桥梁。
|
|
|
|
|
|
|
|
import java.util.HashSet; //用于表示一组不重复的元素的类。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 该类是Activity类的子类
|
|
|
|
|
|
|
|
* 实现了监听用户点击的接口功能
|
|
|
|
|
|
|
|
*/
|
|
|
|
public class NotesListActivity extends Activity implements OnClickListener, OnItemLongClickListener {
|
|
|
|
public class NotesListActivity extends Activity implements OnClickListener, OnItemLongClickListener {
|
|
|
|
private static final int FOLDER_NOTE_LIST_QUERY_TOKEN = 0;
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 定义了一些静态常量
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
private static final int FOLDER_NOTE_LIST_QUERY_TOKEN = 0; //定义查询便签列表相关的变量
|
|
|
|
|
|
|
|
|
|
|
|
private static final int FOLDER_LIST_QUERY_TOKEN = 1;
|
|
|
|
private static final int FOLDER_LIST_QUERY_TOKEN = 1; //定义查询的相关变量
|
|
|
|
|
|
|
|
|
|
|
|
private static final int MENU_FOLDER_DELETE = 0;
|
|
|
|
private static final int MENU_FOLDER_DELETE = 0; //标识用户是否选择了删除选项
|
|
|
|
|
|
|
|
|
|
|
|
private static final int MENU_FOLDER_VIEW = 1;
|
|
|
|
private static final int MENU_FOLDER_VIEW = 1; //标识用户选择的外观
|
|
|
|
|
|
|
|
|
|
|
|
private static final int MENU_FOLDER_CHANGE_NAME = 2;
|
|
|
|
private static final int MENU_FOLDER_CHANGE_NAME = 2; //标识用户是否选择重命名
|
|
|
|
|
|
|
|
|
|
|
|
private static final String PREFERENCE_ADD_INTRODUCTION = "net.micode.notes.introduction";
|
|
|
|
private static final String PREFERENCE_ADD_INTRODUCTION = "net.micode.notes.introduction";
|
|
|
|
|
|
|
|
//定义一个字符串指向应用介绍
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 这是一个枚举类型,用于表示列表的编辑状态。
|
|
|
|
|
|
|
|
* 枚举类型可以用来定义一组相关的常量,
|
|
|
|
|
|
|
|
* 这里定义了三种可能的列表编辑状态:
|
|
|
|
|
|
|
|
* NOTE_LIST(便签列表)、SUB_FOLDER(子文件夹)、
|
|
|
|
|
|
|
|
* CALL_RECORD_FOLDER(通话记录文件夹)
|
|
|
|
|
|
|
|
*/
|
|
|
|
private enum ListEditState {
|
|
|
|
private enum ListEditState {
|
|
|
|
NOTE_LIST, SUB_FOLDER, CALL_RECORD_FOLDER
|
|
|
|
NOTE_LIST, SUB_FOLDER, CALL_RECORD_FOLDER
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
private ListEditState mState;
|
|
|
|
private ListEditState mState; //定义了一个标识列表编辑状态的变量
|
|
|
|
|
|
|
|
|
|
|
|
private BackgroundQueryHandler mBackgroundQueryHandler;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private NotesListAdapter mNotesListAdapter;
|
|
|
|
private BackgroundQueryHandler mBackgroundQueryHandler; //用于在后台执行数据库查询等操作,以避免阻塞UI线程
|
|
|
|
|
|
|
|
|
|
|
|
private ListView mNotesListView;
|
|
|
|
private NotesListAdapter mNotesListAdapter; //用于管理便签列表中数据项的适配器,通常与 ListView 一起使用
|
|
|
|
|
|
|
|
|
|
|
|
private Button mAddNewNote;
|
|
|
|
private ListView mNotesListView; //它表示便签列表的视图,用于显示便签列表中的数据项,
|
|
|
|
|
|
|
|
// 并与适配器(NotesListAdapter)一起工作以展示数据。
|
|
|
|
|
|
|
|
|
|
|
|
private boolean mDispatch;
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 定义了一些类变量
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
private Button mAddNewNote; //声明了一个私有成员变量 mAddNewNote,类型为 Button,
|
|
|
|
|
|
|
|
// 用来表示一个按钮控件,通常用于用户点击以添加新的便签。
|
|
|
|
|
|
|
|
|
|
|
|
private int mOriginY;
|
|
|
|
private boolean mDispatch; //声明了一个私有成员变量 mDispatch,类型为 boolean,
|
|
|
|
|
|
|
|
// 用来表示一个标志位,可能用于控制某些事件的分发。
|
|
|
|
|
|
|
|
|
|
|
|
private int mDispatchY;
|
|
|
|
private int mOriginY; //声明了两个私有成员变量 mOriginY 和 mDispatchY,类型为 int,
|
|
|
|
|
|
|
|
private int mDispatchY; // 可能用于记录某些位置坐标的信息。
|
|
|
|
|
|
|
|
|
|
|
|
private TextView mTitleBar;
|
|
|
|
private TextView mTitleBar; //声明了一个私有成员变量 mTitleBar,类型为 TextView,
|
|
|
|
|
|
|
|
// 用来表示一个文本视图,通常用于显示标题栏的文本信息。
|
|
|
|
|
|
|
|
|
|
|
|
private long mCurrentFolderId;
|
|
|
|
private long mCurrentFolderId; //用来表示当前文件夹的ID。
|
|
|
|
|
|
|
|
|
|
|
|
private ContentResolver mContentResolver;
|
|
|
|
private ContentResolver mContentResolver; //用来获取应用的内容提供者,用于访问应用的数据
|
|
|
|
|
|
|
|
|
|
|
|
private ModeCallback mModeCallBack;
|
|
|
|
private ModeCallback mModeCallBack; //用于处理列表的编辑模式
|
|
|
|
|
|
|
|
|
|
|
|
private static final String TAG = "NotesListActivity";
|
|
|
|
private static final String TAG = "NotesListActivity"; //通常用于在日志或调试信息中标识类名
|
|
|
|
|
|
|
|
|
|
|
|
public static final int NOTES_LISTVIEW_SCROLL_RATE = 30;
|
|
|
|
public static final int NOTES_LISTVIEW_SCROLL_RATE = 30; //表示便签列表视图的滚动速率
|
|
|
|
|
|
|
|
|
|
|
|
private NoteItemData mFocusNoteDataItem;
|
|
|
|
private NoteItemData mFocusNoteDataItem; //用于表示当前焦点的便签数据项
|
|
|
|
|
|
|
|
|
|
|
|
private static final String NORMAL_SELECTION = NoteColumns.PARENT_ID + "=?";
|
|
|
|
private static final String NORMAL_SELECTION = NoteColumns.PARENT_ID + "=?";
|
|
|
|
|
|
|
|
|
|
|
@ -131,9 +165,10 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
+ Notes.TYPE_SYSTEM + " AND " + NoteColumns.PARENT_ID + "=?)" + " OR ("
|
|
|
|
+ Notes.TYPE_SYSTEM + " AND " + NoteColumns.PARENT_ID + "=?)" + " OR ("
|
|
|
|
+ NoteColumns.ID + "=" + Notes.ID_CALL_RECORD_FOLDER + " AND "
|
|
|
|
+ NoteColumns.ID + "=" + Notes.ID_CALL_RECORD_FOLDER + " AND "
|
|
|
|
+ NoteColumns.NOTES_COUNT + ">0)";
|
|
|
|
+ NoteColumns.NOTES_COUNT + ">0)";
|
|
|
|
|
|
|
|
//分别表示正常的选择条件和根文件夹的选择条件,
|
|
|
|
|
|
|
|
//通常用于数据库查询的条件语句
|
|
|
|
private final static int REQUEST_CODE_OPEN_NODE = 102;
|
|
|
|
private final static int REQUEST_CODE_OPEN_NODE = 102;
|
|
|
|
private final static int REQUEST_CODE_NEW_NODE = 103;
|
|
|
|
private final static int REQUEST_CODE_NEW_NODE = 103; //分别表示启动Activity时用到的请求码,用于区分不同的启动请求
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
protected void onCreate(Bundle savedInstanceState) {
|
|
|
|
protected void onCreate(Bundle savedInstanceState) {
|
|
|
@ -147,6 +182,17 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
setAppInfoFromRawRes();
|
|
|
|
setAppInfoFromRawRes();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 被重写的一个方法
|
|
|
|
|
|
|
|
* 这是一个用于处理Activity返回结果的方法。
|
|
|
|
|
|
|
|
* 当通过startActivityForResult方法启动的Activity结束后,会回调到这个方法。
|
|
|
|
|
|
|
|
* 参数requestCode是用于标识请求的整型值,
|
|
|
|
|
|
|
|
* resultCode是用于标识返回结果的整型值,
|
|
|
|
|
|
|
|
* data是用于携带返回数据的Intent对象。
|
|
|
|
|
|
|
|
* @param requestCode
|
|
|
|
|
|
|
|
* @param resultCode
|
|
|
|
|
|
|
|
* @param data
|
|
|
|
|
|
|
|
*/
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
|
|
|
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
|
|
|
if (resultCode == RESULT_OK
|
|
|
|
if (resultCode == RESULT_OK
|
|
|
@ -157,6 +203,12 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 这是一个私有方法,用于从原始资源中获取应用信息并保存到SharedPreferences中。
|
|
|
|
|
|
|
|
* 首先,它会检查SharedPreferences中是否已经添加了介绍信息,
|
|
|
|
|
|
|
|
* 如果没有,则读取raw资源中的介绍信息,并创建一个新的WorkingNote对象。
|
|
|
|
|
|
|
|
* 接着,将介绍信息保存到SharedPreferences中,标记已经添加了介绍信息。
|
|
|
|
|
|
|
|
*/
|
|
|
|
private void setAppInfoFromRawRes() {
|
|
|
|
private void setAppInfoFromRawRes() {
|
|
|
|
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
|
|
|
|
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
|
|
|
|
if (!sp.getBoolean(PREFERENCE_ADD_INTRODUCTION, false)) {
|
|
|
|
if (!sp.getBoolean(PREFERENCE_ADD_INTRODUCTION, false)) {
|
|
|
@ -203,12 +255,22 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 这是一个重写的Activity生命周期方法,当Activity即将可见时会调用此方法。
|
|
|
|
|
|
|
|
* 在这个方法中,首先调用了父类的onStart方法,然后调用了startAsyncNotesListQuery方法。
|
|
|
|
|
|
|
|
*/
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
protected void onStart() {
|
|
|
|
protected void onStart() {
|
|
|
|
super.onStart();
|
|
|
|
super.onStart();
|
|
|
|
startAsyncNotesListQuery();
|
|
|
|
startAsyncNotesListQuery();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 这是一个私有方法,用于初始化资源。在这个方法中,对一些成员变量进行了初始化,
|
|
|
|
|
|
|
|
* 例如内容解析器、后台查询处理器、当前文件夹ID、便签列表视图、按钮的点击监听器等。
|
|
|
|
|
|
|
|
* 这些初始化操作可以确保在Activity启动时,相关资源和状态都得到了正确的设置,
|
|
|
|
|
|
|
|
* 以便后续的操作和交互能够正常进行。
|
|
|
|
|
|
|
|
*/
|
|
|
|
private void initResources() {
|
|
|
|
private void initResources() {
|
|
|
|
mContentResolver = this.getContentResolver();
|
|
|
|
mContentResolver = this.getContentResolver();
|
|
|
|
mBackgroundQueryHandler = new BackgroundQueryHandler(this.getContentResolver());
|
|
|
|
mBackgroundQueryHandler = new BackgroundQueryHandler(this.getContentResolver());
|
|
|
@ -231,11 +293,23 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
mModeCallBack = new ModeCallback();
|
|
|
|
mModeCallBack = new ModeCallback();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 这个 ModeCallback 类实现了
|
|
|
|
|
|
|
|
* ListView.MultiChoiceModeListener
|
|
|
|
|
|
|
|
* 和 OnMenuItemClickListener 接口,
|
|
|
|
|
|
|
|
* 用于处理列表的多选模式操作和菜单项点击事件的监听。
|
|
|
|
|
|
|
|
*/
|
|
|
|
private class ModeCallback implements ListView.MultiChoiceModeListener, OnMenuItemClickListener {
|
|
|
|
private class ModeCallback implements ListView.MultiChoiceModeListener, OnMenuItemClickListener {
|
|
|
|
private DropdownMenu mDropDownMenu;
|
|
|
|
private DropdownMenu mDropDownMenu;
|
|
|
|
private ActionMode mActionMode;
|
|
|
|
private ActionMode mActionMode;
|
|
|
|
private MenuItem mMoveMenu;
|
|
|
|
private MenuItem mMoveMenu;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 当进入多选模式时被调用,在这个方法中设置多选模式的界面和菜单。
|
|
|
|
|
|
|
|
* @param mode
|
|
|
|
|
|
|
|
* @param menu
|
|
|
|
|
|
|
|
* @return
|
|
|
|
|
|
|
|
*/
|
|
|
|
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
|
|
|
|
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
|
|
|
|
getMenuInflater().inflate(R.menu.note_list_options, menu);
|
|
|
|
getMenuInflater().inflate(R.menu.note_list_options, menu);
|
|
|
|
menu.findItem(R.id.delete).setOnMenuItemClickListener(this);
|
|
|
|
menu.findItem(R.id.delete).setOnMenuItemClickListener(this);
|
|
|
@ -269,6 +343,9 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 更新下拉菜单的显示状态,包括选中项的数量和标题等。
|
|
|
|
|
|
|
|
*/
|
|
|
|
private void updateMenu() {
|
|
|
|
private void updateMenu() {
|
|
|
|
int selectedCount = mNotesListAdapter.getSelectedCount();
|
|
|
|
int selectedCount = mNotesListAdapter.getSelectedCount();
|
|
|
|
// Update dropdown menu
|
|
|
|
// Update dropdown menu
|
|
|
@ -286,11 +363,23 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 在准备多选模式时被调用,可以在这个方法中进行一些准备工作。
|
|
|
|
|
|
|
|
* @param mode
|
|
|
|
|
|
|
|
* @param menu
|
|
|
|
|
|
|
|
* @return
|
|
|
|
|
|
|
|
*/
|
|
|
|
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
|
|
|
|
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
|
|
|
|
// TODO Auto-generated method stub
|
|
|
|
// TODO Auto-generated method stub
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 在选择操作项时被调用,可以在这个方法中处理操作项的点击事件。
|
|
|
|
|
|
|
|
* @param mode
|
|
|
|
|
|
|
|
* @param item
|
|
|
|
|
|
|
|
* @return
|
|
|
|
|
|
|
|
*/
|
|
|
|
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
|
|
|
|
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
|
|
|
|
// TODO Auto-generated method stub
|
|
|
|
// TODO Auto-generated method stub
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
@ -319,28 +408,26 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
switch (item.getItemId()) {
|
|
|
|
int itemId = item.getItemId();
|
|
|
|
case R.id.delete:
|
|
|
|
if (itemId == R.id.delete) {
|
|
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this);
|
|
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this);
|
|
|
|
builder.setTitle(getString(R.string.alert_title_delete));
|
|
|
|
builder.setTitle(getString(R.string.alert_title_delete));
|
|
|
|
builder.setIcon(android.R.drawable.ic_dialog_alert);
|
|
|
|
builder.setIcon(android.R.drawable.ic_dialog_alert);
|
|
|
|
builder.setMessage(getString(R.string.alert_message_delete_notes,
|
|
|
|
builder.setMessage(getString(R.string.alert_message_delete_notes,
|
|
|
|
mNotesListAdapter.getSelectedCount()));
|
|
|
|
mNotesListAdapter.getSelectedCount()));
|
|
|
|
builder.setPositiveButton(android.R.string.ok,
|
|
|
|
builder.setPositiveButton(android.R.string.ok,
|
|
|
|
new DialogInterface.OnClickListener() {
|
|
|
|
new DialogInterface.OnClickListener() {
|
|
|
|
public void onClick(DialogInterface dialog,
|
|
|
|
public void onClick(DialogInterface dialog,
|
|
|
|
int which) {
|
|
|
|
int which) {
|
|
|
|
batchDelete();
|
|
|
|
batchDelete();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
builder.setNegativeButton(android.R.string.cancel, null);
|
|
|
|
builder.setNegativeButton(android.R.string.cancel, null);
|
|
|
|
builder.show();
|
|
|
|
builder.show();
|
|
|
|
break;
|
|
|
|
} else if (itemId == R.id.move) {
|
|
|
|
case R.id.move:
|
|
|
|
startQueryDestinationFolders();
|
|
|
|
startQueryDestinationFolders();
|
|
|
|
} else {
|
|
|
|
break;
|
|
|
|
return false;
|
|
|
|
default:
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -558,12 +645,8 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void onClick(View v) {
|
|
|
|
public void onClick(View v) {
|
|
|
|
switch (v.getId()) {
|
|
|
|
if (v.getId() == R.id.btn_new_note) {
|
|
|
|
case R.id.btn_new_note:
|
|
|
|
createNewNote();
|
|
|
|
createNewNote();
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -780,40 +863,27 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
public boolean onOptionsItemSelected(MenuItem item) {
|
|
|
|
public boolean onOptionsItemSelected(MenuItem item) {
|
|
|
|
switch (item.getItemId()) {
|
|
|
|
int itemId = item.getItemId();
|
|
|
|
case R.id.menu_new_folder: {
|
|
|
|
if (itemId == R.id.menu_new_folder) {
|
|
|
|
showCreateOrModifyFolderDialog(true);
|
|
|
|
showCreateOrModifyFolderDialog(true);
|
|
|
|
break;
|
|
|
|
} else if (itemId == R.id.menu_export_text) {
|
|
|
|
}
|
|
|
|
exportNoteToText();
|
|
|
|
case R.id.menu_export_text: {
|
|
|
|
} else if (itemId == R.id.menu_sync) {
|
|
|
|
exportNoteToText();
|
|
|
|
if (isSyncMode()) {
|
|
|
|
break;
|
|
|
|
if (TextUtils.equals(item.getTitle(), getString(R.string.menu_sync))) {
|
|
|
|
}
|
|
|
|
GTaskSyncService.startSync(this);
|
|
|
|
case R.id.menu_sync: {
|
|
|
|
|
|
|
|
if (isSyncMode()) {
|
|
|
|
|
|
|
|
if (TextUtils.equals(item.getTitle(), getString(R.string.menu_sync))) {
|
|
|
|
|
|
|
|
GTaskSyncService.startSync(this);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
GTaskSyncService.cancelSync(this);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
startPreferenceActivity();
|
|
|
|
GTaskSyncService.cancelSync(this);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
} else {
|
|
|
|
}
|
|
|
|
|
|
|
|
case R.id.menu_setting: {
|
|
|
|
|
|
|
|
startPreferenceActivity();
|
|
|
|
startPreferenceActivity();
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
case R.id.menu_new_note: {
|
|
|
|
} else if (itemId == R.id.menu_setting) {
|
|
|
|
createNewNote();
|
|
|
|
startPreferenceActivity();
|
|
|
|
break;
|
|
|
|
} else if (itemId == R.id.menu_new_note) {
|
|
|
|
}
|
|
|
|
createNewNote();
|
|
|
|
case R.id.menu_search:
|
|
|
|
} else if (itemId == R.id.menu_search) {
|
|
|
|
onSearchRequested();
|
|
|
|
onSearchRequested();
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|