|
|
|
@ -78,63 +78,119 @@ import java.io.InputStream;
|
|
|
|
import java.io.InputStreamReader;
|
|
|
|
import java.io.InputStreamReader;
|
|
|
|
import java.util.HashSet;
|
|
|
|
import java.util.HashSet;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 笔记列表活动
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* 这个类是应用的主界面,用于显示笔记列表并提供笔记管理功能。
|
|
|
|
|
|
|
|
* 支持创建、编辑、删除笔记,文件夹管理,笔记同步,以及桌面小部件集成。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* 主要功能:
|
|
|
|
|
|
|
|
* 1. 显示笔记列表,支持按文件夹分类查看
|
|
|
|
|
|
|
|
* 2. 创建新笔记和文件夹
|
|
|
|
|
|
|
|
* 3. 批量选择和操作笔记(删除、移动)
|
|
|
|
|
|
|
|
* 4. 笔记同步到 Google Tasks
|
|
|
|
|
|
|
|
* 5. 导出笔记为文本文件
|
|
|
|
|
|
|
|
* 6. 与桌面小部件集成
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @see NoteEditActivity
|
|
|
|
|
|
|
|
* @see NotesListAdapter
|
|
|
|
|
|
|
|
* @see GTaskSyncService
|
|
|
|
|
|
|
|
*/
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 文件夹删除菜单ID
|
|
|
|
private static final int MENU_FOLDER_DELETE = 0;
|
|
|
|
private static final int MENU_FOLDER_DELETE = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 文件夹查看菜单ID
|
|
|
|
private static final int MENU_FOLDER_VIEW = 1;
|
|
|
|
private static final int MENU_FOLDER_VIEW = 1;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 文件夹重命名菜单ID
|
|
|
|
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";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 列表编辑状态枚举
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* 定义笔记列表的三种显示状态
|
|
|
|
|
|
|
|
*/
|
|
|
|
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 BackgroundQueryHandler mBackgroundQueryHandler;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 笔记列表适配器
|
|
|
|
private NotesListAdapter mNotesListAdapter;
|
|
|
|
private NotesListAdapter mNotesListAdapter;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 笔记列表视图
|
|
|
|
private ListView mNotesListView;
|
|
|
|
private ListView mNotesListView;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 新建笔记按钮
|
|
|
|
private Button mAddNewNote;
|
|
|
|
private Button mAddNewNote;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 是否正在分发触摸事件
|
|
|
|
private boolean mDispatch;
|
|
|
|
private boolean mDispatch;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 触摸事件的原始Y坐标
|
|
|
|
private int mOriginY;
|
|
|
|
private int mOriginY;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 分发触摸事件的Y坐标
|
|
|
|
private int mDispatchY;
|
|
|
|
private int mDispatchY;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 标题栏文本视图
|
|
|
|
private TextView mTitleBar;
|
|
|
|
private TextView mTitleBar;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 当前文件夹ID
|
|
|
|
private long mCurrentFolderId;
|
|
|
|
private long mCurrentFolderId;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 内容解析器
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 普通选择条件:指定父文件夹ID
|
|
|
|
private static final String NORMAL_SELECTION = NoteColumns.PARENT_ID + "=?";
|
|
|
|
private static final String NORMAL_SELECTION = NoteColumns.PARENT_ID + "=?";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 根文件夹选择条件:显示所有非系统笔记和有内容的通话记录文件夹
|
|
|
|
private static final String ROOT_FOLDER_SELECTION = "(" + NoteColumns.TYPE + "<>"
|
|
|
|
private static final String ROOT_FOLDER_SELECTION = "(" + NoteColumns.TYPE + "<>"
|
|
|
|
+ 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;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 活动创建时的初始化方法
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* 设置布局,初始化资源,首次使用时添加介绍笔记
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param savedInstanceState 保存的实例状态
|
|
|
|
|
|
|
|
*/
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
protected void onCreate(Bundle savedInstanceState) {
|
|
|
|
protected void onCreate(Bundle savedInstanceState) {
|
|
|
|
super.onCreate(savedInstanceState);
|
|
|
|
super.onCreate(savedInstanceState);
|
|
|
|
@ -147,6 +203,15 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
setAppInfoFromRawRes();
|
|
|
|
setAppInfoFromRawRes();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 活动结果回调方法
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* 当从笔记编辑活动返回时,刷新笔记列表
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param requestCode 请求码,标识是哪个活动返回
|
|
|
|
|
|
|
|
* @param resultCode 结果码,RESULT_OK表示操作成功
|
|
|
|
|
|
|
|
* @param data 返回的Intent数据
|
|
|
|
|
|
|
|
*/
|
|
|
|
@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 +222,11 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 从原始资源文件加载并创建介绍笔记
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* 首次使用应用时,从res/raw/introduction文件读取内容并创建一条介绍笔记
|
|
|
|
|
|
|
|
*/
|
|
|
|
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 +273,22 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 活动启动时的回调方法
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* 启动异步查询笔记列表
|
|
|
|
|
|
|
|
*/
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
protected void onStart() {
|
|
|
|
protected void onStart() {
|
|
|
|
super.onStart();
|
|
|
|
super.onStart();
|
|
|
|
startAsyncNotesListQuery();
|
|
|
|
startAsyncNotesListQuery();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 初始化资源
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* 初始化所有UI组件、适配器和监听器
|
|
|
|
|
|
|
|
*/
|
|
|
|
private void initResources() {
|
|
|
|
private void initResources() {
|
|
|
|
mContentResolver = this.getContentResolver();
|
|
|
|
mContentResolver = this.getContentResolver();
|
|
|
|
mBackgroundQueryHandler = new BackgroundQueryHandler(this.getContentResolver());
|
|
|
|
mBackgroundQueryHandler = new BackgroundQueryHandler(this.getContentResolver());
|
|
|
|
@ -231,11 +311,23 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
mModeCallBack = new ModeCallback();
|
|
|
|
mModeCallBack = new ModeCallback();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 多选模式回调类
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* 实现ListView.MultiChoiceModeListener接口,处理多选模式的创建、销毁和项选中状态变化
|
|
|
|
|
|
|
|
*/
|
|
|
|
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 ActionMode对象
|
|
|
|
|
|
|
|
* @param menu 菜单对象
|
|
|
|
|
|
|
|
* @return true表示成功创建
|
|
|
|
|
|
|
|
*/
|
|
|
|
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);
|
|
|
|
@ -259,6 +351,12 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
(Button) customView.findViewById(R.id.selection_menu),
|
|
|
|
(Button) customView.findViewById(R.id.selection_menu),
|
|
|
|
R.menu.note_list_dropdown);
|
|
|
|
R.menu.note_list_dropdown);
|
|
|
|
mDropDownMenu.setOnDropdownMenuItemClickListener(new PopupMenu.OnMenuItemClickListener(){
|
|
|
|
mDropDownMenu.setOnDropdownMenuItemClickListener(new PopupMenu.OnMenuItemClickListener(){
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 下拉菜单项点击事件处理
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param item 被点击的菜单项
|
|
|
|
|
|
|
|
* @return true表示事件已处理
|
|
|
|
|
|
|
|
*/
|
|
|
|
public boolean onMenuItemClick(MenuItem item) {
|
|
|
|
public boolean onMenuItemClick(MenuItem item) {
|
|
|
|
mNotesListAdapter.selectAll(!mNotesListAdapter.isAllSelected());
|
|
|
|
mNotesListAdapter.selectAll(!mNotesListAdapter.isAllSelected());
|
|
|
|
updateMenu();
|
|
|
|
updateMenu();
|
|
|
|
@ -269,6 +367,11 @@ 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,26 +389,60 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 准备多选模式的操作栏
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param mode ActionMode对象
|
|
|
|
|
|
|
|
* @param menu 菜单对象
|
|
|
|
|
|
|
|
* @return false
|
|
|
|
|
|
|
|
*/
|
|
|
|
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 ActionMode对象
|
|
|
|
|
|
|
|
* @param item 被点击的菜单项
|
|
|
|
|
|
|
|
* @return false
|
|
|
|
|
|
|
|
*/
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 销毁多选模式的操作栏
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* 退出选择模式,恢复列表视图的常规状态
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param mode ActionMode对象
|
|
|
|
|
|
|
|
*/
|
|
|
|
public void onDestroyActionMode(ActionMode mode) {
|
|
|
|
public void onDestroyActionMode(ActionMode mode) {
|
|
|
|
mNotesListAdapter.setChoiceMode(false);
|
|
|
|
mNotesListAdapter.setChoiceMode(false);
|
|
|
|
mNotesListView.setLongClickable(true);
|
|
|
|
mNotesListView.setLongClickable(true);
|
|
|
|
mAddNewNote.setVisibility(View.VISIBLE);
|
|
|
|
mAddNewNote.setVisibility(View.VISIBLE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 完成多选模式
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* 手动结束ActionMode
|
|
|
|
|
|
|
|
*/
|
|
|
|
public void finishActionMode() {
|
|
|
|
public void finishActionMode() {
|
|
|
|
mActionMode.finish();
|
|
|
|
mActionMode.finish();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 列表项选中状态变化事件处理
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param mode ActionMode对象
|
|
|
|
|
|
|
|
* @param position 列表项位置
|
|
|
|
|
|
|
|
* @param id 列表项ID
|
|
|
|
|
|
|
|
* @param checked 是否选中
|
|
|
|
|
|
|
|
*/
|
|
|
|
public void onItemCheckedStateChanged(ActionMode mode, int position, long id,
|
|
|
|
public void onItemCheckedStateChanged(ActionMode mode, int position, long id,
|
|
|
|
boolean checked) {
|
|
|
|
boolean checked) {
|
|
|
|
mNotesListAdapter.setCheckedItem(position, checked);
|
|
|
|
mNotesListAdapter.setCheckedItem(position, checked);
|
|
|
|
@ -408,6 +545,13 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 启动异步笔记列表查询
|
|
|
|
|
|
|
|
* <p>
|
|
|
|
|
|
|
|
* 根据当前文件夹ID构建查询条件,启动后台查询获取笔记列表数据。
|
|
|
|
|
|
|
|
* 根文件夹使用特殊的查询条件,子文件夹使用普通查询条件。
|
|
|
|
|
|
|
|
* </p>
|
|
|
|
|
|
|
|
*/
|
|
|
|
private void startAsyncNotesListQuery() {
|
|
|
|
private void startAsyncNotesListQuery() {
|
|
|
|
String selection = (mCurrentFolderId == Notes.ID_ROOT_FOLDER) ? ROOT_FOLDER_SELECTION
|
|
|
|
String selection = (mCurrentFolderId == Notes.ID_ROOT_FOLDER) ? ROOT_FOLDER_SELECTION
|
|
|
|
: NORMAL_SELECTION;
|
|
|
|
: NORMAL_SELECTION;
|
|
|
|
@ -417,11 +561,35 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
}, NoteColumns.TYPE + " DESC," + NoteColumns.MODIFIED_DATE + " DESC");
|
|
|
|
}, NoteColumns.TYPE + " DESC," + NoteColumns.MODIFIED_DATE + " DESC");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 后台查询处理器
|
|
|
|
|
|
|
|
* <p>
|
|
|
|
|
|
|
|
* 继承自AsyncQueryHandler,用于在后台线程执行数据库查询,
|
|
|
|
|
|
|
|
* 避免阻塞UI线程。
|
|
|
|
|
|
|
|
* </p>
|
|
|
|
|
|
|
|
*/
|
|
|
|
private final class BackgroundQueryHandler extends AsyncQueryHandler {
|
|
|
|
private final class BackgroundQueryHandler extends AsyncQueryHandler {
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 构造函数
|
|
|
|
|
|
|
|
* @param contentResolver 内容解析器
|
|
|
|
|
|
|
|
*/
|
|
|
|
public BackgroundQueryHandler(ContentResolver contentResolver) {
|
|
|
|
public BackgroundQueryHandler(ContentResolver contentResolver) {
|
|
|
|
super(contentResolver);
|
|
|
|
super(contentResolver);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 查询完成回调
|
|
|
|
|
|
|
|
* <p>
|
|
|
|
|
|
|
|
* 根据查询令牌处理不同的查询结果:
|
|
|
|
|
|
|
|
* <ul>
|
|
|
|
|
|
|
|
* <li>FOLDER_NOTE_LIST_QUERY_TOKEN: 更新笔记列表适配器</li>
|
|
|
|
|
|
|
|
* <li>FOLDER_LIST_QUERY_TOKEN: 显示文件夹选择菜单</li>
|
|
|
|
|
|
|
|
* </ul>
|
|
|
|
|
|
|
|
* </p>
|
|
|
|
|
|
|
|
* @param token 查询令牌
|
|
|
|
|
|
|
|
* @param cookie Cookie对象
|
|
|
|
|
|
|
|
* @param cursor 查询结果游标
|
|
|
|
|
|
|
|
*/
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
|
|
|
|
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
|
|
|
|
switch (token) {
|
|
|
|
switch (token) {
|
|
|
|
@ -441,6 +609,14 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 显示文件夹选择菜单
|
|
|
|
|
|
|
|
* <p>
|
|
|
|
|
|
|
|
* 显示一个对话框,列出所有可用的目标文件夹供用户选择,
|
|
|
|
|
|
|
|
* 用于移动选中的笔记到指定文件夹。
|
|
|
|
|
|
|
|
* </p>
|
|
|
|
|
|
|
|
* @param cursor 包含文件夹列表的游标
|
|
|
|
|
|
|
|
*/
|
|
|
|
private void showFolderListMenu(Cursor cursor) {
|
|
|
|
private void showFolderListMenu(Cursor cursor) {
|
|
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this);
|
|
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this);
|
|
|
|
builder.setTitle(R.string.menu_title_select_folder);
|
|
|
|
builder.setTitle(R.string.menu_title_select_folder);
|
|
|
|
@ -462,6 +638,12 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
builder.show();
|
|
|
|
builder.show();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 创建新笔记
|
|
|
|
|
|
|
|
* <p>
|
|
|
|
|
|
|
|
* 启动NoteEditActivity创建新笔记,传递当前文件夹ID。
|
|
|
|
|
|
|
|
* </p>
|
|
|
|
|
|
|
|
*/
|
|
|
|
private void createNewNote() {
|
|
|
|
private void createNewNote() {
|
|
|
|
Intent intent = new Intent(this, NoteEditActivity.class);
|
|
|
|
Intent intent = new Intent(this, NoteEditActivity.class);
|
|
|
|
intent.setAction(Intent.ACTION_INSERT_OR_EDIT);
|
|
|
|
intent.setAction(Intent.ACTION_INSERT_OR_EDIT);
|
|
|
|
@ -469,6 +651,14 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
this.startActivityForResult(intent, REQUEST_CODE_NEW_NODE);
|
|
|
|
this.startActivityForResult(intent, REQUEST_CODE_NEW_NODE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 批量删除笔记
|
|
|
|
|
|
|
|
* <p>
|
|
|
|
|
|
|
|
* 在后台线程中删除选中的笔记。
|
|
|
|
|
|
|
|
* 如果处于同步模式,将笔记移动到垃圾箱文件夹;
|
|
|
|
|
|
|
|
* 否则直接删除。同时更新相关的小部件。
|
|
|
|
|
|
|
|
* </p>
|
|
|
|
|
|
|
|
*/
|
|
|
|
private void batchDelete() {
|
|
|
|
private void batchDelete() {
|
|
|
|
new AsyncTask<Void, Void, HashSet<AppWidgetAttribute>>() {
|
|
|
|
new AsyncTask<Void, Void, HashSet<AppWidgetAttribute>>() {
|
|
|
|
protected HashSet<AppWidgetAttribute> doInBackground(Void... unused) {
|
|
|
|
protected HashSet<AppWidgetAttribute> doInBackground(Void... unused) {
|
|
|
|
@ -506,6 +696,15 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
}.execute();
|
|
|
|
}.execute();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 删除文件夹
|
|
|
|
|
|
|
|
* <p>
|
|
|
|
|
|
|
|
* 删除指定的文件夹及其包含的所有笔记。
|
|
|
|
|
|
|
|
* 如果处于同步模式,将文件夹移动到垃圾箱;
|
|
|
|
|
|
|
|
* 否则直接删除。同时更新相关的小部件。
|
|
|
|
|
|
|
|
* </p>
|
|
|
|
|
|
|
|
* @param folderId 要删除的文件夹ID
|
|
|
|
|
|
|
|
*/
|
|
|
|
private void deleteFolder(long folderId) {
|
|
|
|
private void deleteFolder(long folderId) {
|
|
|
|
if (folderId == Notes.ID_ROOT_FOLDER) {
|
|
|
|
if (folderId == Notes.ID_ROOT_FOLDER) {
|
|
|
|
Log.e(TAG, "Wrong folder id, should not happen " + folderId);
|
|
|
|
Log.e(TAG, "Wrong folder id, should not happen " + folderId);
|
|
|
|
@ -533,6 +732,13 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 打开笔记
|
|
|
|
|
|
|
|
* <p>
|
|
|
|
|
|
|
|
* 启动NoteEditActivity查看和编辑指定的笔记。
|
|
|
|
|
|
|
|
* </p>
|
|
|
|
|
|
|
|
* @param data 笔记数据项
|
|
|
|
|
|
|
|
*/
|
|
|
|
private void openNode(NoteItemData data) {
|
|
|
|
private void openNode(NoteItemData data) {
|
|
|
|
Intent intent = new Intent(this, NoteEditActivity.class);
|
|
|
|
Intent intent = new Intent(this, NoteEditActivity.class);
|
|
|
|
intent.setAction(Intent.ACTION_VIEW);
|
|
|
|
intent.setAction(Intent.ACTION_VIEW);
|
|
|
|
@ -540,6 +746,14 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
this.startActivityForResult(intent, REQUEST_CODE_OPEN_NODE);
|
|
|
|
this.startActivityForResult(intent, REQUEST_CODE_OPEN_NODE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 打开文件夹
|
|
|
|
|
|
|
|
* <p>
|
|
|
|
|
|
|
|
* 进入指定的文件夹,显示该文件夹中的笔记列表。
|
|
|
|
|
|
|
|
* 更新标题栏显示文件夹名称,并隐藏新建笔记按钮(如果是通话记录文件夹)。
|
|
|
|
|
|
|
|
* </p>
|
|
|
|
|
|
|
|
* @param data 文件夹数据项
|
|
|
|
|
|
|
|
*/
|
|
|
|
private void openFolder(NoteItemData data) {
|
|
|
|
private void openFolder(NoteItemData data) {
|
|
|
|
mCurrentFolderId = data.getId();
|
|
|
|
mCurrentFolderId = data.getId();
|
|
|
|
startAsyncNotesListQuery();
|
|
|
|
startAsyncNotesListQuery();
|
|
|
|
@ -567,6 +781,12 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 显示软键盘
|
|
|
|
|
|
|
|
* <p>
|
|
|
|
|
|
|
|
* 强制显示系统软键盘,用于输入文件夹名称。
|
|
|
|
|
|
|
|
* </p>
|
|
|
|
|
|
|
|
*/
|
|
|
|
private void showSoftInput() {
|
|
|
|
private void showSoftInput() {
|
|
|
|
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
|
|
|
|
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
|
|
|
|
if (inputMethodManager != null) {
|
|
|
|
if (inputMethodManager != null) {
|
|
|
|
@ -574,11 +794,26 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 隐藏软键盘
|
|
|
|
|
|
|
|
* <p>
|
|
|
|
|
|
|
|
* 隐藏指定视图的软键盘。
|
|
|
|
|
|
|
|
* </p>
|
|
|
|
|
|
|
|
* @param view 要隐藏键盘的视图
|
|
|
|
|
|
|
|
*/
|
|
|
|
private void hideSoftInput(View view) {
|
|
|
|
private void hideSoftInput(View view) {
|
|
|
|
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
|
|
|
|
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
|
|
|
|
inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
|
|
|
|
inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 显示创建或修改文件夹对话框
|
|
|
|
|
|
|
|
* <p>
|
|
|
|
|
|
|
|
* 显示一个对话框,允许用户输入文件夹名称。
|
|
|
|
|
|
|
|
* 根据create参数决定是创建新文件夹还是修改现有文件夹名称。
|
|
|
|
|
|
|
|
* </p>
|
|
|
|
|
|
|
|
* @param create true表示创建新文件夹,false表示修改文件夹名称
|
|
|
|
|
|
|
|
*/
|
|
|
|
private void showCreateOrModifyFolderDialog(final boolean create) {
|
|
|
|
private void showCreateOrModifyFolderDialog(final boolean create) {
|
|
|
|
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
|
|
|
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
|
|
|
View view = LayoutInflater.from(this).inflate(R.layout.dialog_edit_text, null);
|
|
|
|
View view = LayoutInflater.from(this).inflate(R.layout.dialog_edit_text, null);
|
|
|
|
@ -664,6 +899,16 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 返回键按下处理
|
|
|
|
|
|
|
|
* <p>
|
|
|
|
|
|
|
|
* 根据当前列表状态处理返回键事件:
|
|
|
|
|
|
|
|
* <ul>
|
|
|
|
|
|
|
|
* <li>子文件夹或通话记录文件夹:返回根文件夹列表</li>
|
|
|
|
|
|
|
|
* <li>笔记列表:调用父类方法退出Activity</li>
|
|
|
|
|
|
|
|
* </ul>
|
|
|
|
|
|
|
|
* </p>
|
|
|
|
|
|
|
|
*/
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
public void onBackPressed() {
|
|
|
|
public void onBackPressed() {
|
|
|
|
switch (mState) {
|
|
|
|
switch (mState) {
|
|
|
|
@ -688,6 +933,14 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 更新小部件
|
|
|
|
|
|
|
|
* <p>
|
|
|
|
|
|
|
|
* 发送广播更新指定的小部件,使其显示最新的笔记内容。
|
|
|
|
|
|
|
|
* </p>
|
|
|
|
|
|
|
|
* @param appWidgetId 小部件ID
|
|
|
|
|
|
|
|
* @param appWidgetType 小部件类型(2x或4x)
|
|
|
|
|
|
|
|
*/
|
|
|
|
private void updateWidget(int appWidgetId, int appWidgetType) {
|
|
|
|
private void updateWidget(int appWidgetId, int appWidgetType) {
|
|
|
|
Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
|
|
|
|
Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
|
|
|
|
if (appWidgetType == Notes.TYPE_WIDGET_2X) {
|
|
|
|
if (appWidgetType == Notes.TYPE_WIDGET_2X) {
|
|
|
|
@ -707,6 +960,12 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
setResult(RESULT_OK, intent);
|
|
|
|
setResult(RESULT_OK, intent);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 文件夹上下文菜单创建监听器
|
|
|
|
|
|
|
|
* <p>
|
|
|
|
|
|
|
|
* 为文件夹项创建上下文菜单,提供查看、删除和重命名选项。
|
|
|
|
|
|
|
|
* </p>
|
|
|
|
|
|
|
|
*/
|
|
|
|
private final OnCreateContextMenuListener mFolderOnCreateContextMenuListener = new OnCreateContextMenuListener() {
|
|
|
|
private final OnCreateContextMenuListener mFolderOnCreateContextMenuListener = new OnCreateContextMenuListener() {
|
|
|
|
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
|
|
|
|
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
|
|
|
|
if (mFocusNoteDataItem != null) {
|
|
|
|
if (mFocusNoteDataItem != null) {
|
|
|
|
@ -760,6 +1019,19 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 准备选项菜单
|
|
|
|
|
|
|
|
* <p>
|
|
|
|
|
|
|
|
* 根据当前列表状态加载不同的菜单资源:
|
|
|
|
|
|
|
|
* <ul>
|
|
|
|
|
|
|
|
* <li>笔记列表:显示同步、设置、新建文件夹、导出、搜索等选项</li>
|
|
|
|
|
|
|
|
* <li>子文件夹:显示新建笔记选项</li>
|
|
|
|
|
|
|
|
* <li>通话记录文件夹:显示新建笔记选项</li>
|
|
|
|
|
|
|
|
* </ul>
|
|
|
|
|
|
|
|
* </p>
|
|
|
|
|
|
|
|
* @param menu 选项菜单对象
|
|
|
|
|
|
|
|
* @return true
|
|
|
|
|
|
|
|
*/
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
public boolean onPrepareOptionsMenu(Menu menu) {
|
|
|
|
public boolean onPrepareOptionsMenu(Menu menu) {
|
|
|
|
menu.clear();
|
|
|
|
menu.clear();
|
|
|
|
@ -778,6 +1050,22 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 选项菜单项选择处理
|
|
|
|
|
|
|
|
* <p>
|
|
|
|
|
|
|
|
* 处理用户点击选项菜单的事件,包括:
|
|
|
|
|
|
|
|
* <ul>
|
|
|
|
|
|
|
|
* <li>新建文件夹</li>
|
|
|
|
|
|
|
|
* <li>导出笔记为文本</li>
|
|
|
|
|
|
|
|
* <li>同步或取消同步</li>
|
|
|
|
|
|
|
|
* <li>打开设置</li>
|
|
|
|
|
|
|
|
* <li>新建笔记</li>
|
|
|
|
|
|
|
|
* <li>搜索</li>
|
|
|
|
|
|
|
|
* </ul>
|
|
|
|
|
|
|
|
* </p>
|
|
|
|
|
|
|
|
* @param item 被点击的菜单项
|
|
|
|
|
|
|
|
* @return true
|
|
|
|
|
|
|
|
*/
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
public boolean onOptionsItemSelected(MenuItem item) {
|
|
|
|
public boolean onOptionsItemSelected(MenuItem item) {
|
|
|
|
switch (item.getItemId()) {
|
|
|
|
switch (item.getItemId()) {
|
|
|
|
@ -818,12 +1106,26 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 搜索请求处理
|
|
|
|
|
|
|
|
* <p>
|
|
|
|
|
|
|
|
* 启动系统搜索界面,允许用户搜索笔记内容。
|
|
|
|
|
|
|
|
* </p>
|
|
|
|
|
|
|
|
* @return true
|
|
|
|
|
|
|
|
*/
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
public boolean onSearchRequested() {
|
|
|
|
public boolean onSearchRequested() {
|
|
|
|
startSearch(null, false, null /* appData */, false);
|
|
|
|
startSearch(null, false, null /* appData */, false);
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 导出笔记为文本文件
|
|
|
|
|
|
|
|
* <p>
|
|
|
|
|
|
|
|
* 在后台线程中将所有笔记导出为文本文件到SD卡。
|
|
|
|
|
|
|
|
* 根据导出结果显示相应的提示对话框。
|
|
|
|
|
|
|
|
* </p>
|
|
|
|
|
|
|
|
*/
|
|
|
|
private void exportNoteToText() {
|
|
|
|
private void exportNoteToText() {
|
|
|
|
final BackupUtils backup = BackupUtils.getInstance(NotesListActivity.this);
|
|
|
|
final BackupUtils backup = BackupUtils.getInstance(NotesListActivity.this);
|
|
|
|
new AsyncTask<Void, Void, Integer>() {
|
|
|
|
new AsyncTask<Void, Void, Integer>() {
|
|
|
|
@ -866,18 +1168,50 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
}.execute();
|
|
|
|
}.execute();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 检查是否处于同步模式
|
|
|
|
|
|
|
|
* <p>
|
|
|
|
|
|
|
|
* 判断是否已设置同步账户,如果已设置则表示处于同步模式。
|
|
|
|
|
|
|
|
* </p>
|
|
|
|
|
|
|
|
* @return true表示处于同步模式,false表示未同步
|
|
|
|
|
|
|
|
*/
|
|
|
|
private boolean isSyncMode() {
|
|
|
|
private boolean isSyncMode() {
|
|
|
|
return NotesPreferenceActivity.getSyncAccountName(this).trim().length() > 0;
|
|
|
|
return NotesPreferenceActivity.getSyncAccountName(this).trim().length() > 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 启动设置Activity
|
|
|
|
|
|
|
|
* <p>
|
|
|
|
|
|
|
|
* 启动NotesPreferenceActivity进行应用设置。
|
|
|
|
|
|
|
|
* </p>
|
|
|
|
|
|
|
|
*/
|
|
|
|
private void startPreferenceActivity() {
|
|
|
|
private void startPreferenceActivity() {
|
|
|
|
Activity from = getParent() != null ? getParent() : this;
|
|
|
|
Activity from = getParent() != null ? getParent() : this;
|
|
|
|
Intent intent = new Intent(from, NotesPreferenceActivity.class);
|
|
|
|
Intent intent = new Intent(from, NotesPreferenceActivity.class);
|
|
|
|
from.startActivityIfNeeded(intent, -1);
|
|
|
|
from.startActivityIfNeeded(intent, -1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 列表项点击监听器
|
|
|
|
|
|
|
|
* <p>
|
|
|
|
|
|
|
|
* 处理笔记列表项的点击事件,根据当前状态和项类型执行相应操作:
|
|
|
|
|
|
|
|
* <ul>
|
|
|
|
|
|
|
|
* <li>多选模式:切换选中状态</li>
|
|
|
|
|
|
|
|
* <li>笔记列表:打开文件夹或笔记</li>
|
|
|
|
|
|
|
|
* <li>子文件夹/通话记录文件夹:打开笔记</li>
|
|
|
|
|
|
|
|
* </ul>
|
|
|
|
|
|
|
|
* </p>
|
|
|
|
|
|
|
|
*/
|
|
|
|
private class OnListItemClickListener implements OnItemClickListener {
|
|
|
|
private class OnListItemClickListener implements OnItemClickListener {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 列表项点击事件处理
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param parent 父视图
|
|
|
|
|
|
|
|
* @param view 被点击的视图
|
|
|
|
|
|
|
|
* @param position 列表项位置
|
|
|
|
|
|
|
|
* @param id 列表项ID
|
|
|
|
|
|
|
|
*/
|
|
|
|
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
|
|
|
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
|
|
|
if (view instanceof NotesListItem) {
|
|
|
|
if (view instanceof NotesListItem) {
|
|
|
|
NoteItemData item = ((NotesListItem) view).getItemData();
|
|
|
|
NoteItemData item = ((NotesListItem) view).getItemData();
|
|
|
|
@ -917,6 +1251,13 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 启动查询目标文件夹
|
|
|
|
|
|
|
|
* <p>
|
|
|
|
|
|
|
|
* 查询所有可用的文件夹,用于显示在移动笔记的对话框中。
|
|
|
|
|
|
|
|
* 排除垃圾箱文件夹和当前文件夹。
|
|
|
|
|
|
|
|
* </p>
|
|
|
|
|
|
|
|
*/
|
|
|
|
private void startQueryDestinationFolders() {
|
|
|
|
private void startQueryDestinationFolders() {
|
|
|
|
String selection = NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>? AND " + NoteColumns.ID + "<>?";
|
|
|
|
String selection = NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>? AND " + NoteColumns.ID + "<>?";
|
|
|
|
selection = (mState == ListEditState.NOTE_LIST) ? selection:
|
|
|
|
selection = (mState == ListEditState.NOTE_LIST) ? selection:
|
|
|
|
@ -935,6 +1276,15 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
NoteColumns.MODIFIED_DATE + " DESC");
|
|
|
|
NoteColumns.MODIFIED_DATE + " DESC");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 列表项长按事件处理
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param parent 父视图
|
|
|
|
|
|
|
|
* @param view 被长按的视图
|
|
|
|
|
|
|
|
* @param position 列表项位置
|
|
|
|
|
|
|
|
* @param id 列表项ID
|
|
|
|
|
|
|
|
* @return true表示事件已处理
|
|
|
|
|
|
|
|
*/
|
|
|
|
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
|
|
|
|
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
|
|
|
|
if (view instanceof NotesListItem) {
|
|
|
|
if (view instanceof NotesListItem) {
|
|
|
|
mFocusNoteDataItem = ((NotesListItem) view).getItemData();
|
|
|
|
mFocusNoteDataItem = ((NotesListItem) view).getItemData();
|
|
|
|
|