@ -5,7 +5,7 @@
* you may not use this file except in compliance with the License .
* You may obtain a copy of the License at
*
* http : //www.apache.org/licenses/LICENSE-2.0
* < url id = "d0s4geb67ti966oe1310" type = "url" status = "parsed" title = "Apache License, Version 2.0" wc = "10467" > http : //www.apache.org/licenses/LICENSE-2.0 </url>
*
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an "AS IS" BASIS ,
@ -79,101 +79,98 @@ import java.io.InputStreamReader;
import java.util.HashSet ;
public class NotesListActivity extends Activity implements OnClickListener , OnItemLongClickListener {
//定义背景
private int mode = - 1 ; //add
// 定义查询标记
private static final int FOLDER_NOTE_LIST_QUERY_TOKEN = 0 ;
private static final int FOLDER_LIST_QUERY_TOKEN = 1 ;
// 定义菜单项 ID
private static final int MENU_FOLDER_DELETE = 0 ;
private static final int MENU_FOLDER_VIEW = 1 ;
private static final int MENU_FOLDER_CHANGE_NAME = 2 ;
// 定义偏好设置键
private static final String PREFERENCE_ADD_INTRODUCTION = "net.micode.notes.introduction" ;
// 定义列表编辑状态枚举
private enum ListEditState {
NOTE_LIST , SUB_FOLDER , CALL_RECORD_FOLDER
} ;
// 定义当前列表编辑状态
private ListEditState mState ;
// 定义异步查询处理器
private BackgroundQueryHandler mBackgroundQueryHandler ;
// 定义笔记列表适配器
private NotesListAdapter mNotesListAdapter ;
// 定义笔记列表视图
private ListView mNotesListView ;
// 定义新建笔记按钮
private Button mAddNewNote ;
// 定义是否正在分发触摸事件的标志
private boolean mDispatch ;
// 定义触摸事件的原始 Y 坐标和分发 Y 坐标
private int mOriginY ;
private int mDispatchY ;
// 定义标题栏视图
private TextView mTitleBar ;
// 定义当前文件夹 ID
private long mCurrentFolderId ;
// 定义内容解析器
private ContentResolver mContentResolver ;
// 定义多选模式回调
private ModeCallback mModeCallBack ;
// 定义日志标签
private static final String TAG = "NotesListActivity" ;
// 定义列表视图滚动速率
public static final int NOTES_LISTVIEW_SCROLL_RATE = 30 ;
// 定义焦点笔记数据项
private NoteItemData mFocusNoteDataItem ;
// 定义查询选择条件
private static final String NORMAL_SELECTION = NoteColumns . PARENT_ID + "=?" ;
private static final String ROOT_FOLDER_SELECTION = "(" + NoteColumns . TYPE + "<>"
+ Notes . TYPE_SYSTEM + " AND " + NoteColumns . PARENT_ID + "=?)" + " OR ("
+ NoteColumns . ID + "=" + Notes . ID_CALL_RECORD_FOLDER + " AND "
+ NoteColumns . NOTES_COUNT + ">0)" ;
private static final String ROOT_FOLDER_SELECTION = "(" + NoteColumns . TYPE + "<>" + Notes . TYPE_SYSTEM + " AND " + NoteColumns . PARENT_ID + "=?)" + " OR (" + NoteColumns . ID + "=" + Notes . ID_CALL_RECORD_FOLDER + " AND " + NoteColumns . NOTES_COUNT + ">0)" ;
// 定义请求码
private final static int REQUEST_CODE_OPEN_NODE = 102 ;
private final static int REQUEST_CODE_NEW_NODE = 103 ;
@Override
protected void onCreate ( Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState ) ;
setContentView ( R . layout . note_list ) ;
initResources ( ) ;
setContentView ( R . layout . note_list ) ; // 设置布局文件为 note_list
initResources ( ) ; // 初始化资源
getWindow ( ) . setBackgroundDrawableResource ( R . drawable . graygoo ) ;
getWindow ( ) . setBackgroundDrawableResource ( R . drawable . hutao ) ;
getWindow ( ) . setBackgroundDrawableResource ( R . drawable . miku ) ;
/ * *
* Insert an introduction when user firstly use this application
* 当 用 户 首 次 使 用 此 应 用 时 插 入 介 绍
* /
setAppInfoFromRawRes ( ) ;
setAppInfoFromRawRes ( ) ; // 从原始资源文件中读取介绍信息并创建笔记
}
@Override
protected void onActivityResult ( int requestCode , int resultCode , Intent data ) {
if ( resultCode = = RESULT_OK
& & ( requestCode = = REQUEST_CODE_OPEN_NODE | | requestCode = = REQUEST_CODE_NEW_NODE ) ) {
mNotesListAdapter . changeCursor ( null ) ;
if ( resultCode = = RESULT_OK & & ( requestCode = = REQUEST_CODE_OPEN_NODE | | requestCode = = REQUEST_CODE_NEW_NODE ) ) {
mNotesListAdapter . changeCursor ( null ) ; // 更改游标以刷新列表
} else {
super . onActivityResult ( requestCode , resultCode , data ) ;
super . onActivityResult ( requestCode , resultCode , data ) ; // 调用父类的方法
}
}
private void setAppInfoFromRawRes ( ) {
SharedPreferences sp = PreferenceManager . getDefaultSharedPreferences ( this ) ;
if ( ! sp . getBoolean ( PREFERENCE_ADD_INTRODUCTION , false ) ) {
StringBuilder sb = new StringBuilder ( ) ;
SharedPreferences sp = PreferenceManager . getDefaultSharedPreferences ( this ) ; // 获取默认偏好设置
if ( ! sp . getBoolean ( PREFERENCE_ADD_INTRODUCTION , false ) ) { // 如果未添加介绍
StringBuilder sb = new StringBuilder ( ) ; // 创建字符串构建器
InputStream in = null ;
try {
in = getResources ( ) . openRawResource ( R . raw . introduction ) ;
in = getResources ( ) . openRawResource ( R . raw . introduction ) ; // 打开原始资源文件
if ( in ! = null ) {
InputStreamReader isr = new InputStreamReader ( in ) ;
BufferedReader br = new BufferedReader ( isr ) ;
char [ ] buf = new char [ 1024 ] ;
int len = 0 ;
while ( ( len = br . read ( buf ) ) > 0 ) {
sb . append ( buf , 0 , len ) ;
sb . append ( buf , 0 , len ) ; // 将读取的内容追加到字符串构建器
}
} else {
Log . e ( TAG , " Read introduction file error ") ;
Log . e ( TAG , " 读取介绍文件错误 ") ;
return ;
}
} catch ( IOException e ) {
@ -182,22 +179,19 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
} finally {
if ( in ! = null ) {
try {
in . close ( ) ;
in . close ( ) ; // 关闭输入流
} catch ( IOException e ) {
// TODO Auto-generated catch block
e . printStackTrace ( ) ;
}
}
}
WorkingNote note = WorkingNote . createEmptyNote ( this , Notes . ID_ROOT_FOLDER ,
AppWidgetManager . INVALID_APPWIDGET_ID , Notes . TYPE_WIDGET_INVALIDE ,
ResourceParser . RED ) ;
note . setWorkingText ( sb . toString ( ) ) ;
if ( note . saveNote ( ) ) {
sp . edit ( ) . putBoolean ( PREFERENCE_ADD_INTRODUCTION , true ) . commit ( ) ;
WorkingNote note = WorkingNote . createEmptyNote ( this , Notes . ID_ROOT_FOLDER , AppWidgetManager . INVALID_APPWIDGET_ID , Notes . TYPE_WIDGET_INVALIDE , ResourceParser . RED ) ; // 创建空笔记
note . setWorkingText ( sb . toString ( ) ) ; // 设置笔记内容
if ( note . saveNote ( ) ) { // 保存笔记
sp . edit ( ) . putBoolean ( PREFERENCE_ADD_INTRODUCTION , true ) . commit ( ) ; // 更新偏好设置
} else {
Log . e ( TAG , " Save introduction note error ") ;
Log . e ( TAG , "保存介绍笔记错误" ) ;
return ;
}
}
@ -206,29 +200,28 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
@Override
protected void onStart ( ) {
super . onStart ( ) ;
startAsyncNotesListQuery ( ) ;
startAsyncNotesListQuery ( ) ; // 开始异步查询笔记列表
}
private void initResources ( ) {
mContentResolver = this . getContentResolver ( ) ;
mBackgroundQueryHandler = new BackgroundQueryHandler ( this . getContentResolver ( ) ) ;
mCurrentFolderId = Notes . ID_ROOT_FOLDER ;
mNotesListView = ( ListView ) findViewById ( R . id . notes_list ) ;
mNotesListView . addFooterView ( LayoutInflater . from ( this ) . inflate ( R . layout . note_list_footer , null ) ,
null , false ) ;
mNotesListView . setOnItemClickListener ( new OnListItemClickListener ( ) ) ;
mNotesListView . setOnItemLongClickListener ( this ) ;
mNotesListAdapter = new NotesListAdapter ( this ) ;
mNotesListView . setAdapter ( mNotesListAdapter ) ;
mAddNewNote = ( Button ) findViewById ( R . id . btn_new_note ) ;
mAddNewNote . setOnClickListener ( this ) ;
mAddNewNote . setOnTouchListener ( new NewNoteOnTouchListener ( ) ) ;
mContentResolver = this . getContentResolver ( ) ; // 获取内容解析器
mBackgroundQueryHandler = new BackgroundQueryHandler ( this . getContentResolver ( ) ) ; // 创建异步查询处理器
mCurrentFolderId = Notes . ID_ROOT_FOLDER ; // 设置当前文件夹 ID 为根文件夹
mNotesListView = ( ListView ) findViewById ( R . id . notes_list ) ; // 获取笔记列表视图
mNotesListView . addFooterView ( LayoutInflater . from ( this ) . inflate ( R . layout . note_list_footer , null ) , null , false ) ; // 添加页脚视图
mNotesListView . setOnItemClickListener ( new OnListItemClickListener ( ) ) ; // 设置项点击监听器
mNotesListView . setOnItemLongClickListener ( this ) ; // 设置项长按监听器
mNotesListAdapter = new NotesListAdapter ( this ) ; // 创建笔记列表适配器
mNotesListView . setAdapter ( mNotesListAdapter ) ; // 设置适配器
mAddNewNote = ( Button ) findViewById ( R . id . btn_new_note ) ; // 获取新建笔记按钮
mAddNewNote . setOnClickListener ( this ) ; // 设置点击监听器
mAddNewNote . setOnTouchListener ( new NewNoteOnTouchListener ( ) ) ; // 设置触摸监听器
mDispatch = false ;
mDispatchY = 0 ;
mOriginY = 0 ;
mTitleBar = ( TextView ) findViewById ( R . id . tv_title_bar ) ;
mState = ListEditState . NOTE_LIST ;
mModeCallBack = new ModeCallback ( ) ;
mTitleBar = ( TextView ) findViewById ( R . id . tv_title_bar ) ; // 获取标题栏视图
mState = ListEditState . NOTE_LIST ; // 设置列表编辑状态为笔记列表
mModeCallBack = new ModeCallback ( ) ; // 创建多选模式回调
}
private class ModeCallback implements ListView . MultiChoiceModeListener , OnMenuItemClickListener {
@ -237,85 +230,76 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
private MenuItem mMoveMenu ;
public boolean onCreateActionMode ( ActionMode mode , Menu menu ) {
getMenuInflater ( ) . inflate ( R . menu . note_list_options , menu ) ;
menu . findItem ( R . id . delete ) . setOnMenuItemClickListener ( this ) ;
getMenuInflater ( ) . inflate ( R . menu . note_list_options , menu ) ; // 加载菜单资源
menu . findItem ( R . id . delete ) . setOnMenuItemClickListener ( this ) ; // 设置菜单项点击监听器
mMoveMenu = menu . findItem ( R . id . move ) ;
if ( mFocusNoteDataItem . getParentId ( ) = = Notes . ID_CALL_RECORD_FOLDER
| | DataUtils . getUserFolderCount ( mContentResolver ) = = 0 ) {
mMoveMenu . setVisible ( false ) ;
if ( mFocusNoteDataItem . getParentId ( ) = = Notes . ID_CALL_RECORD_FOLDER | | DataUtils . getUserFolderCount ( mContentResolver ) = = 0 ) {
mMoveMenu . setVisible ( false ) ; // 如果是通话记录文件夹或没有用户文件夹,则隐藏移动菜单项
} else {
mMoveMenu . setVisible ( true ) ;
mMoveMenu . setOnMenuItemClickListener ( this ) ;
mMoveMenu . setOnMenuItemClickListener ( this ) ; // 设置菜单项点击监听器
}
mActionMode = mode ;
mNotesListAdapter . setChoiceMode ( true ) ;
mNotesListView . setLongClickable ( false ) ;
mAddNewNote . setVisibility ( View . GONE ) ;
View customView = LayoutInflater . from ( NotesListActivity . this ) . inflate (
R . layout . note_list_dropdown_menu , null ) ;
mode . setCustomView ( customView ) ;
mDropDownMenu = new DropdownMenu ( NotesListActivity . this ,
( Button ) customView . findViewById ( R . id . selection_menu ) ,
R . menu . note_list_dropdown ) ;
mNotesListAdapter . setChoiceMode ( true ) ; // 设置适配器为选择模式
mNotesListView . setLongClickable ( false ) ; // 禁用长按事件
mAddNewNote . setVisibility ( View . GONE ) ; // 隐藏新建笔记按钮
View customView = LayoutInflater . from ( NotesListActivity . this ) . inflate ( R . layout . note_list_dropdown_menu , null ) ; // 加载自定义视图
mode . setCustomView ( customView ) ; // 设置自定义视图
mDropDownMenu = new DropdownMenu ( NotesListActivity . this , ( Button ) customView . findViewById ( R . id . selection_menu ) , R . menu . note_list_dropdown ) ; // 创建下拉菜单
mDropDownMenu . setOnDropdownMenuItemClickListener ( new PopupMenu . OnMenuItemClickListener ( ) {
public boolean onMenuItemClick ( MenuItem item ) {
mNotesListAdapter . selectAll ( ! mNotesListAdapter . isAllSelected ( ) ) ;
updateMenu ( ) ;
mNotesListAdapter . selectAll ( ! mNotesListAdapter . isAllSelected ( ) ) ; // 选择或取消选择所有项
updateMenu ( ) ; // 更新菜单
return true ;
}
} ) ;
return true ;
}
private void updateMenu ( ) {
int selectedCount = mNotesListAdapter . getSelectedCount ( ) ;
// Update dropdown menu
int selectedCount = mNotesListAdapter . getSelectedCount ( ) ; // 获取已选择的项数
// 更新下拉菜单
String format = getResources ( ) . getString ( R . string . menu_select_title , selectedCount ) ;
mDropDownMenu . setTitle ( format ) ;
MenuItem item = mDropDownMenu . findItem ( R . id . action_select_all ) ;
if ( item ! = null ) {
if ( mNotesListAdapter . isAllSelected ( ) ) {
item . setChecked ( true ) ;
item . setTitle ( R . string . menu_deselect_all ) ;
item . setTitle ( R . string . menu_deselect_all ) ; // 设置为取消选择全部
} else {
item . setChecked ( false ) ;
item . setTitle ( R . string . menu_select_all ) ;
item . setTitle ( R . string . menu_select_all ) ; // 设置为选择全部
}
}
}
public boolean onPrepareActionMode ( ActionMode mode , Menu menu ) {
// TODO Auto-generated method stub
return false ;
}
public boolean onActionItemClicked ( ActionMode mode , MenuItem item ) {
// TODO Auto-generated method stub
return false ;
}
public void onDestroyActionMode ( ActionMode mode ) {
mNotesListAdapter . setChoiceMode ( false ) ;
mNotesListView . setLongClickable ( true ) ;
mAddNewNote . setVisibility ( View . VISIBLE ) ;
mNotesListAdapter . setChoiceMode ( false ) ; // 退出选择模式
mNotesListView . setLongClickable ( true ) ; // 恢复长按事件
mAddNewNote . setVisibility ( View . VISIBLE ) ; // 显示新建笔记按钮
}
public void finishActionMode ( ) {
mActionMode . finish ( ) ;
mActionMode . finish ( ) ; // 结束多选模式
}
public void onItemCheckedStateChanged ( ActionMode mode , int position , long id ,
boolean checked ) {
mNotesListAdapter . setCheckedItem ( position , checked ) ;
updateMenu ( ) ;
public void onItemCheckedStateChanged ( ActionMode mode , int position , long id , boolean checked ) {
mNotesListAdapter . setCheckedItem ( position , checked ) ; // 设置选中状态
updateMenu ( ) ; // 更新菜单
}
public boolean onMenuItemClick ( MenuItem item ) {
if ( mNotesListAdapter . getSelectedCount ( ) = = 0 ) {
Toast . makeText ( NotesListActivity . this , getString ( R . string . menu_select_none ) ,
Toast . LENGTH_SHORT ) . show ( ) ;
Toast . makeText ( NotesListActivity . this , getString ( R . string . menu_select_none ) , Toast . LENGTH_SHORT ) . show ( ) ; // 显示未选择任何项的提示
return true ;
}
@ -324,20 +308,17 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
AlertDialog . Builder builder = new AlertDialog . Builder ( NotesListActivity . this ) ;
builder . setTitle ( getString ( R . string . alert_title_delete ) ) ;
builder . setIcon ( android . R . drawable . ic_dialog_alert ) ;
builder . setMessage ( getString ( R . string . alert_message_delete_notes ,
mNotesListAdapter . getSelectedCount ( ) ) ) ;
builder . setPositiveButton ( android . R . string . ok ,
new DialogInterface . OnClickListener ( ) {
public void onClick ( DialogInterface dialog ,
int which ) {
batchDelete ( ) ;
builder . setMessage ( getString ( R . string . alert_message_delete_notes , mNotesListAdapter . getSelectedCount ( ) ) ) ; // 设置删除确认对话框
builder . setPositiveButton ( android . R . string . ok , new DialogInterface . OnClickListener ( ) {
public void onClick ( DialogInterface dialog , int which ) {
batchDelete ( ) ; // 批量删除
}
} ) ;
builder . setNegativeButton ( android . R . string . cancel , null ) ;
builder . show ( ) ;
break ;
case R . id . move :
startQueryDestinationFolders ( ) ;
startQueryDestinationFolders ( ) ; // 开始查询目标文件夹
break ;
default :
return false ;
@ -347,36 +328,21 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
}
private class NewNoteOnTouchListener implements OnTouchListener {
public boolean onTouch ( View v , MotionEvent event ) {
switch ( event . getAction ( ) ) {
case MotionEvent . ACTION_DOWN : {
case MotionEvent . ACTION_DOWN :
Display display = getWindowManager ( ) . getDefaultDisplay ( ) ;
int screenHeight = display . getHeight ( ) ;
int newNoteViewHeight = mAddNewNote . getHeight ( ) ;
int start = screenHeight - newNoteViewHeight ;
int eventY = start + ( int ) event . getY ( ) ;
/ * *
* Minus TitleBar ' s height
* /
if ( mState = = ListEditState . SUB_FOLDER ) {
eventY - = mTitleBar . getHeight ( ) ;
start - = mTitleBar . getHeight ( ) ;
}
/ * *
* HACKME : When click the transparent part of "New Note" button , dispatch
* the event to the list view behind this button . The transparent part of
* "New Note" button could be expressed by formula y = - 0.12 x + 94 ( Unit : pixel )
* and the line top of the button . The coordinate based on left of the " New
* Note " button . The 94 represents maximum height of the transparent part .
* Notice that , if the background of the button changes , the formula should
* also change . This is very bad , just for the UI designer ' s strong requirement .
* /
if ( event . getY ( ) < ( event . getX ( ) * ( - 0.12 ) + 94 ) ) {
View view = mNotesListView . getChildAt ( mNotesListView . getChildCount ( ) - 1
- mNotesListView . getFooterViewsCount ( ) ) ;
if ( view ! = null & & view . getBottom ( ) > start
& & ( view . getTop ( ) < ( start + 94 ) ) ) {
View view = mNotesListView . getChildAt ( mNotesListView . getChildCount ( ) - 1 - mNotesListView . getFooterViewsCount ( ) ) ;
if ( view ! = null & & view . getBottom ( ) > start & & ( view . getTop ( ) < ( start + 94 ) ) ) {
mOriginY = ( int ) event . getY ( ) ;
mDispatchY = eventY ;
event . setLocation ( event . getX ( ) , mDispatchY ) ;
@ -385,16 +351,14 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
}
}
break ;
}
case MotionEvent . ACTION_MOVE : {
case MotionEvent . ACTION_MOVE :
if ( mDispatch ) {
mDispatchY + = ( int ) event . getY ( ) - mOriginY ;
event . setLocation ( event . getX ( ) , mDispatchY ) ;
return mNotesListView . dispatchTouchEvent ( event ) ;
}
break ;
}
default : {
default :
if ( mDispatch ) {
event . setLocation ( event . getX ( ) , mDispatchY ) ;
mDispatch = false ;
@ -402,19 +366,13 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
}
break ;
}
}
return false ;
}
} ;
}
private void startAsyncNotesListQuery ( ) {
String selection = ( mCurrentFolderId = = Notes . ID_ROOT_FOLDER ) ? ROOT_FOLDER_SELECTION
: NORMAL_SELECTION ;
mBackgroundQueryHandler . startQuery ( FOLDER_NOTE_LIST_QUERY_TOKEN , null ,
Notes . CONTENT_NOTE_URI , NoteItemData . PROJECTION , selection , new String [ ] {
String . valueOf ( mCurrentFolderId )
} , NoteColumns . TYPE + " DESC," + NoteColumns . MODIFIED_DATE + " DESC" ) ;
String selection = ( mCurrentFolderId = = Notes . ID_ROOT_FOLDER ) ? ROOT_FOLDER_SELECTION : NORMAL_SELECTION ;
mBackgroundQueryHandler . startQuery ( FOLDER_NOTE_LIST_QUERY_TOKEN , null , Notes . CONTENT_NOTE_URI , NoteItemData . PROJECTION , selection , new String [ ] { String . valueOf ( mCurrentFolderId ) } , NoteColumns . TYPE + " DESC," + NoteColumns . MODIFIED_DATE + " DESC" ) ;
}
private final class BackgroundQueryHandler extends AsyncQueryHandler {
@ -426,13 +384,13 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
protected void onQueryComplete ( int token , Object cookie , Cursor cursor ) {
switch ( token ) {
case FOLDER_NOTE_LIST_QUERY_TOKEN :
mNotesListAdapter . changeCursor ( cursor ) ;
mNotesListAdapter . changeCursor ( cursor ) ; // 更改游标以更新列表
break ;
case FOLDER_LIST_QUERY_TOKEN :
if ( cursor ! = null & & cursor . getCount ( ) > 0 ) {
showFolderListMenu ( cursor ) ;
showFolderListMenu ( cursor ) ; // 显示文件夹列表菜单
} else {
Log . e ( TAG , " Query folder failed ") ;
Log . e ( TAG , " 查询文件夹失败 ") ;
}
break ;
default :
@ -446,17 +404,10 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
builder . setTitle ( R . string . menu_title_select_folder ) ;
final FoldersListAdapter adapter = new FoldersListAdapter ( this , cursor ) ;
builder . setAdapter ( adapter , new DialogInterface . OnClickListener ( ) {
public void onClick ( DialogInterface dialog , int which ) {
DataUtils . batchMoveToFolder ( mContentResolver ,
mNotesListAdapter . getSelectedItemIds ( ) , adapter . getItemId ( which ) ) ;
Toast . makeText (
NotesListActivity . this ,
getString ( R . string . format_move_notes_to_folder ,
mNotesListAdapter . getSelectedCount ( ) ,
adapter . getFolderName ( NotesListActivity . this , which ) ) ,
Toast . LENGTH_SHORT ) . show ( ) ;
mModeCallBack . finishActionMode ( ) ;
DataUtils . batchMoveToFolder ( mContentResolver , mNotesListAdapter . getSelectedItemIds ( ) , adapter . getItemId ( which ) ) ; // 批量移动到文件夹
Toast . makeText ( NotesListActivity . this , getString ( R . string . format_move_notes_to_folder , mNotesListAdapter . getSelectedCount ( ) , adapter . getFolderName ( NotesListActivity . this , which ) ) , Toast . LENGTH_SHORT ) . show ( ) ; // 显示移动成功的提示
mModeCallBack . finishActionMode ( ) ; // 结束多选模式
}
} ) ;
builder . show ( ) ;
@ -466,26 +417,21 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
Intent intent = new Intent ( this , NoteEditActivity . class ) ;
intent . setAction ( Intent . ACTION_INSERT_OR_EDIT ) ;
intent . putExtra ( Notes . INTENT_EXTRA_FOLDER_ID , mCurrentFolderId ) ;
this . startActivityForResult ( intent , REQUEST_CODE_NEW_NODE ) ;
this . startActivityForResult ( intent , REQUEST_CODE_NEW_NODE ) ; // 启动新建笔记活动
}
private void batchDelete ( ) {
new AsyncTask < Void , Void , HashSet < AppWidgetAttribute > > ( ) {
protected HashSet < AppWidgetAttribute > doInBackground ( Void . . . unused ) {
HashSet < AppWidgetAttribute > widgets = mNotesListAdapter . getSelectedWidget ( ) ;
HashSet < AppWidgetAttribute > widgets = mNotesListAdapter . getSelectedWidget ( ) ; // 获取选中的小部件属性
if ( ! isSyncMode ( ) ) {
// if not synced, delete notes directly
if ( DataUtils . batchDeleteNotes ( mContentResolver , mNotesListAdapter
. getSelectedItemIds ( ) ) ) {
if ( DataUtils . batchDeleteNotes ( mContentResolver , mNotesListAdapter . getSelectedItemIds ( ) ) ) { // 批量删除笔记
} else {
Log . e ( TAG , " Delete notes error, should not happens ") ;
Log . e ( TAG , "删除笔记错误,不应该发生" ) ;
}
} else {
// in sync mode, we'll move the deleted note into the trash
// folder
if ( ! DataUtils . batchMoveToFolder ( mContentResolver , mNotesListAdapter
. getSelectedItemIds ( ) , Notes . ID_TRASH_FOLER ) ) {
Log . e ( TAG , "Move notes to trash folder error, should not happens" ) ;
if ( ! DataUtils . batchMoveToFolder ( mContentResolver , mNotesListAdapter . getSelectedItemIds ( ) , Notes . ID_TRASH_FOLER ) ) { // 批量移动到回收站文件夹
Log . e ( TAG , "移动笔记到回收站文件夹错误,不应该发生" ) ;
}
}
return widgets ;
@ -495,39 +441,34 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
protected void onPostExecute ( HashSet < AppWidgetAttribute > widgets ) {
if ( widgets ! = null ) {
for ( AppWidgetAttribute widget : widgets ) {
if ( widget . widgetId ! = AppWidgetManager . INVALID_APPWIDGET_ID
& & widget . widgetType ! = Notes . TYPE_WIDGET_INVALIDE ) {
updateWidget ( widget . widgetId , widget . widgetType ) ;
if ( widget . widgetId ! = AppWidgetManager . INVALID_APPWIDGET_ID & & widget . widgetType ! = Notes . TYPE_WIDGET_INVALIDE ) {
updateWidget ( widget . widgetId , widget . widgetType ) ; // 更新小部件
}
}
}
mModeCallBack . finishActionMode ( ) ;
mModeCallBack . finishActionMode ( ) ; // 结束多选模式
}
} . execute ( ) ;
}
private void deleteFolder ( long folderId ) {
if ( folderId = = Notes . ID_ROOT_FOLDER ) {
Log . e ( TAG , " Wrong folder id, should not happen " + folderId ) ;
Log . e ( TAG , " 错误的文件夹 ID, 不应该发生 " + folderId ) ;
return ;
}
HashSet < Long > ids = new HashSet < Long > ( ) ;
ids . add ( folderId ) ;
HashSet < AppWidgetAttribute > widgets = DataUtils . getFolderNoteWidget ( mContentResolver ,
folderId ) ;
HashSet < AppWidgetAttribute > widgets = DataUtils . getFolderNoteWidget ( mContentResolver , folderId ) ;
if ( ! isSyncMode ( ) ) {
// if not synced, delete folder directly
DataUtils . batchDeleteNotes ( mContentResolver , ids ) ;
DataUtils . batchDeleteNotes ( mContentResolver , ids ) ; // 批量删除笔记
} else {
// in sync mode, we'll move the deleted folder into the trash folder
DataUtils . batchMoveToFolder ( mContentResolver , ids , Notes . ID_TRASH_FOLER ) ;
DataUtils . batchMoveToFolder ( mContentResolver , ids , Notes . ID_TRASH_FOLER ) ; // 批量移动到回收站文件夹
}
if ( widgets ! = null ) {
for ( AppWidgetAttribute widget : widgets ) {
if ( widget . widgetId ! = AppWidgetManager . INVALID_APPWIDGET_ID
& & widget . widgetType ! = Notes . TYPE_WIDGET_INVALIDE ) {
updateWidget ( widget . widgetId , widget . widgetType ) ;
if ( widget . widgetId ! = AppWidgetManager . INVALID_APPWIDGET_ID & & widget . widgetType ! = Notes . TYPE_WIDGET_INVALIDE ) {
updateWidget ( widget . widgetId , widget . widgetType ) ; // 更新小部件
}
}
}
@ -537,30 +478,30 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
Intent intent = new Intent ( this , NoteEditActivity . class ) ;
intent . setAction ( Intent . ACTION_VIEW ) ;
intent . putExtra ( Intent . EXTRA_UID , data . getId ( ) ) ;
this . startActivityForResult ( intent , REQUEST_CODE_OPEN_NODE ) ;
this . startActivityForResult ( intent , REQUEST_CODE_OPEN_NODE ) ; // 启动查看笔记活动
}
private void openFolder ( NoteItemData data ) {
mCurrentFolderId = data . getId ( ) ;
startAsyncNotesListQuery ( ) ;
startAsyncNotesListQuery ( ) ; // 开始异步查询笔记列表
if ( data . getId ( ) = = Notes . ID_CALL_RECORD_FOLDER ) {
mState = ListEditState . CALL_RECORD_FOLDER ;
mAddNewNote . setVisibility ( View . GONE ) ;
mAddNewNote . setVisibility ( View . GONE ) ; // 隐藏新建笔记按钮
} else {
mState = ListEditState . SUB_FOLDER ;
}
if ( data . getId ( ) = = Notes . ID_CALL_RECORD_FOLDER ) {
mTitleBar . setText ( R . string . call_record_folder_name ) ;
mTitleBar . setText ( R . string . call_record_folder_name ) ; // 设置标题栏文本为通话记录文件夹名称
} else {
mTitleBar . setText ( data . getSnippet ( ) ) ;
mTitleBar . setText ( data . getSnippet ( ) ) ; // 设置标题栏文本为文件夹名称
}
mTitleBar . setVisibility ( View . VISIBLE ) ;
mTitleBar . setVisibility ( View . VISIBLE ) ; // 显示标题栏
}
public void onClick ( View v ) {
switch ( v . getId ( ) ) {
case R . id . btn_new_note :
createNewNote ( ) ;
createNewNote ( ) ; // 创建新笔记
break ;
default :
break ;
@ -570,13 +511,13 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
private void showSoftInput ( ) {
InputMethodManager inputMethodManager = ( InputMethodManager ) getSystemService ( Context . INPUT_METHOD_SERVICE ) ;
if ( inputMethodManager ! = null ) {
inputMethodManager . toggleSoftInput ( InputMethodManager . SHOW_FORCED , 0 ) ;
inputMethodManager . toggleSoftInput ( InputMethodManager . SHOW_FORCED , 0 ) ; // 显示软键盘
}
}
private void hideSoftInput ( View view ) {
InputMethodManager inputMethodManager = ( InputMethodManager ) getSystemService ( Context . INPUT_METHOD_SERVICE ) ;
inputMethodManager . hideSoftInputFromWindow ( view . getWindowToken ( ) , 0 ) ;
inputMethodManager . hideSoftInputFromWindow ( view . getWindowToken ( ) , 0 ) ; // 隐藏软键盘
}
private void showCreateOrModifyFolderDialog ( final boolean create ) {
@ -586,15 +527,15 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
showSoftInput ( ) ;
if ( ! create ) {
if ( mFocusNoteDataItem ! = null ) {
etName . setText ( mFocusNoteDataItem . getSnippet ( ) ) ;
builder . setTitle ( getString ( R . string . menu_folder_change_name ) ) ;
etName . setText ( mFocusNoteDataItem . getSnippet ( ) ) ; // 设置文件夹名称
builder . setTitle ( getString ( R . string . menu_folder_change_name ) ) ; // 设置对话框标题为更改文件夹名称
} else {
Log . e ( TAG , " The long click data item is null ") ;
Log . e ( TAG , " 长按的数据项为空 ") ;
return ;
}
} else {
etName . setText ( "" ) ;
builder . setTitle ( this . getString ( R . string . menu_create_folder ) ) ;
builder . setTitle ( this . getString ( R . string . menu_create_folder ) ) ; // 设置对话框标题为创建文件夹
}
builder . setPositiveButton ( android . R . string . ok , null ) ;
@ -611,8 +552,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
hideSoftInput ( etName ) ;
String name = etName . getText ( ) . toString ( ) ;
if ( DataUtils . checkVisibleFolderName ( mContentResolver , name ) ) {
Toast . makeText ( NotesListActivity . this , getString ( R . string . folder_exist , name ) ,
Toast . LENGTH_LONG ) . show ( ) ;
Toast . makeText ( NotesListActivity . this , getString ( R . string . folder_exist , name ) , Toast . LENGTH_LONG ) . show ( ) ; // 显示文件夹已存在的提示
etName . setSelection ( 0 , etName . length ( ) ) ;
return ;
}
@ -622,16 +562,13 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
values . put ( NoteColumns . SNIPPET , name ) ;
values . put ( NoteColumns . TYPE , Notes . TYPE_FOLDER ) ;
values . put ( NoteColumns . LOCAL_MODIFIED , 1 ) ;
mContentResolver . update ( Notes . CONTENT_NOTE_URI , values , NoteColumns . ID
+ "=?" , new String [ ] {
String . valueOf ( mFocusNoteDataItem . getId ( ) )
} ) ;
mContentResolver . update ( Notes . CONTENT_NOTE_URI , values , NoteColumns . ID + "=?" , new String [ ] { String . valueOf ( mFocusNoteDataItem . getId ( ) ) } ) ; // 更新文件夹名称
}
} else if ( ! TextUtils . isEmpty ( name ) ) {
ContentValues values = new ContentValues ( ) ;
values . put ( NoteColumns . SNIPPET , name ) ;
values . put ( NoteColumns . TYPE , Notes . TYPE_FOLDER ) ;
mContentResolver . insert ( Notes . CONTENT_NOTE_URI , values ) ;
mContentResolver . insert ( Notes . CONTENT_NOTE_URI , values ) ; // 插入新文件夹
}
dialog . dismiss ( ) ;
}
@ -640,13 +577,8 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
if ( TextUtils . isEmpty ( etName . getText ( ) ) ) {
positive . setEnabled ( false ) ;
}
/ * *
* When the name edit text is null , disable the positive button
* /
etName . addTextChangedListener ( new TextWatcher ( ) {
public void beforeTextChanged ( CharSequence s , int start , int count , int after ) {
// TODO Auto-generated method stub
}
public void onTextChanged ( CharSequence s , int start , int before , int count ) {
@ -658,8 +590,6 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
}
public void afterTextChanged ( Editable s ) {
// TODO Auto-generated method stub
}
} ) ;
}
@ -670,18 +600,18 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
case SUB_FOLDER :
mCurrentFolderId = Notes . ID_ROOT_FOLDER ;
mState = ListEditState . NOTE_LIST ;
startAsyncNotesListQuery ( ) ;
mTitleBar . setVisibility ( View . GONE ) ;
startAsyncNotesListQuery ( ) ; // 返回根文件夹
mTitleBar . setVisibility ( View . GONE ) ; // 隐藏标题栏
break ;
case CALL_RECORD_FOLDER :
mCurrentFolderId = Notes . ID_ROOT_FOLDER ;
mState = ListEditState . NOTE_LIST ;
mAddNewNote . setVisibility ( View . VISIBLE ) ;
mTitleBar . setVisibility ( View . GONE ) ;
startAsyncNotesListQuery ( ) ;
mAddNewNote . setVisibility ( View . VISIBLE ) ; // 显示新建笔记按钮
mTitleBar . setVisibility ( View . GONE ) ; // 隐藏标题栏
startAsyncNotesListQuery ( ) ; // 返回根文件夹
break ;
case NOTE_LIST :
super . onBackPressed ( ) ;
super . onBackPressed ( ) ; // 调用父类的返回键处理方法
break ;
default :
break ;
@ -695,13 +625,11 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
} else if ( appWidgetType = = Notes . TYPE_WIDGET_4X ) {
intent . setClass ( this , NoteWidgetProvider_4x . class ) ;
} else {
Log . e ( TAG , " Unspported widget type ") ;
Log . e ( TAG , " 不支持的小部件类型 ") ;
return ;
}
intent . putExtra ( AppWidgetManager . EXTRA_APPWIDGET_IDS , new int [ ] {
appWidgetId
} ) ;
intent . putExtra ( AppWidgetManager . EXTRA_APPWIDGET_IDS , new int [ ] { appWidgetId } ) ;
sendBroadcast ( intent ) ;
setResult ( RESULT_OK , intent ) ;
@ -710,10 +638,10 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
private final OnCreateContextMenuListener mFolderOnCreateContextMenuListener = new OnCreateContextMenuListener ( ) {
public void onCreateContextMenu ( ContextMenu menu , View v , ContextMenuInfo menuInfo ) {
if ( mFocusNoteDataItem ! = null ) {
menu . setHeaderTitle ( mFocusNoteDataItem . getSnippet ( ) ) ;
menu . add ( 0 , MENU_FOLDER_VIEW , 0 , R . string . menu_folder_view ) ;
menu . add ( 0 , MENU_FOLDER_DELETE , 0 , R . string . menu_folder_delete ) ;
menu . add ( 0 , MENU_FOLDER_CHANGE_NAME , 0 , R . string . menu_folder_change_name ) ;
menu . setHeaderTitle ( mFocusNoteDataItem . getSnippet ( ) ) ; // 设置上下文菜单标题为文件夹名称
menu . add ( 0 , MENU_FOLDER_VIEW , 0 , R . string . menu_folder_view ) ; // 添加查看文件夹菜单项
menu . add ( 0 , MENU_FOLDER_DELETE , 0 , R . string . menu_folder_delete ) ; // 添加删除文件夹菜单项
menu . add ( 0 , MENU_FOLDER_CHANGE_NAME , 0 , R . string . menu_folder_change_name ) ; // 添加更改文件夹名称菜单项
}
}
} ;
@ -721,7 +649,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
@Override
public void onContextMenuClosed ( Menu menu ) {
if ( mNotesListView ! = null ) {
mNotesListView . setOnCreateContextMenuListener ( null ) ;
mNotesListView . setOnCreateContextMenuListener ( null ) ; // 移除上下文菜单创建监听器
}
super . onContextMenuClosed ( menu ) ;
}
@ -729,29 +657,28 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
@Override
public boolean onContextItemSelected ( MenuItem item ) {
if ( mFocusNoteDataItem = = null ) {
Log . e ( TAG , " The long click data item is null ") ;
Log . e ( TAG , " 长按的数据项为空 ") ;
return false ;
}
switch ( item . getItemId ( ) ) {
case MENU_FOLDER_VIEW :
openFolder ( mFocusNoteDataItem ) ;
openFolder ( mFocusNoteDataItem ) ; // 打开文件夹
break ;
case MENU_FOLDER_DELETE :
AlertDialog . Builder builder = new AlertDialog . Builder ( this ) ;
builder . setTitle ( getString ( R . string . alert_title_delete ) ) ;
builder . setIcon ( android . R . drawable . ic_dialog_alert ) ;
builder . setMessage ( getString ( R . string . alert_message_delete_folder ) ) ;
builder . setPositiveButton ( android . R . string . ok ,
new DialogInterface . OnClickListener ( ) {
builder . setMessage ( getString ( R . string . alert_message_delete_folder ) ) ; // 设置删除文件夹确认对话框
builder . setPositiveButton ( android . R . string . ok , new DialogInterface . OnClickListener ( ) {
public void onClick ( DialogInterface dialog , int which ) {
deleteFolder ( mFocusNoteDataItem . getId ( ) ) ;
deleteFolder ( mFocusNoteDataItem . getId ( ) ) ; // 删除文件夹
}
} ) ;
builder . setNegativeButton ( android . R . string . cancel , null ) ;
builder . show ( ) ;
break ;
case MENU_FOLDER_CHANGE_NAME :
showCreateOrModifyFolderDialog ( false ) ;
showCreateOrModifyFolderDialog ( false ) ; // 显示创建或修改文件夹对话框
break ;
default :
break ;
@ -765,50 +692,64 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
menu . clear ( ) ;
if ( mState = = ListEditState . NOTE_LIST ) {
getMenuInflater ( ) . inflate ( R . menu . note_list , menu ) ;
// set sync or sync_cancel
menu . findItem ( R . id . menu_sync ) . setTitle (
GTaskSyncService . isSyncing ( ) ? R . string . menu_sync_cancel : R . string . menu_sync ) ;
menu . findItem ( R . id . menu_sync ) . setTitle ( GTaskSyncService . isSyncing ( ) ? R . string . menu_sync_cancel : R . string . menu_sync ) ; // 设置同步菜单项标题
} else if ( mState = = ListEditState . SUB_FOLDER ) {
getMenuInflater ( ) . inflate ( R . menu . sub_folder , menu ) ;
} else if ( mState = = ListEditState . CALL_RECORD_FOLDER ) {
getMenuInflater ( ) . inflate ( R . menu . call_record_folder , menu ) ;
} else {
Log . e ( TAG , " Wrong state: " + mState ) ;
Log . e ( TAG , " 错误的状态: " + mState ) ;
}
if ( mode = = - 1 ) menu . findItem ( R . id . menu_graygoo ) . setVisible ( false ) ;
else if ( mode = = 0 ) menu . findItem ( R . id . menu_miku ) . setVisible ( false ) ;
else if ( mode = = 1 ) menu . findItem ( R . id . menu_hutao ) . setVisible ( false ) ;
return true ;
}
@Override
public boolean onOptionsItemSelected ( MenuItem item ) {
switch ( item . getItemId ( ) ) {
case R . id . menu_new_folder : {
showCreateOrModifyFolderDialog ( true ) ;
case R . id . menu_graygoo : {
mode = - 1 ;
getWindow ( ) . setBackgroundDrawableResource ( R . drawable . graygoo ) ;
break ;
}
case R . id . menu_miku : {
mode = 0 ;
getWindow ( ) . setBackgroundDrawableResource ( R . drawable . miku ) ;
break ;
}
case R . id . menu_export_text : {
exportNoteToText ( ) ;
case R . id . menu_hutao : {
mode = 1 ;
getWindow ( ) . setBackgroundDrawableResource ( R . drawable . hutao ) ;
break ;
}
case R . id . menu_sync : {
case R . id . menu_new_folder :
showCreateOrModifyFolderDialog ( true ) ; // 显示创建文件夹对话框
break ;
case R . id . menu_export_text :
exportNoteToText ( ) ; // 导出笔记为文本文件
break ;
case R . id . menu_sync :
if ( isSyncMode ( ) ) {
if ( TextUtils . equals ( item . getTitle ( ) , getString ( R . string . menu_sync ) ) ) {
GTaskSyncService . startSync ( this ) ;
GTaskSyncService . startSync ( this ) ; // 开始同步
} else {
GTaskSyncService . cancelSync ( this ) ;
GTaskSyncService . cancelSync ( this ) ; // 取消同步
}
} else {
startPreferenceActivity ( ) ;
startPreferenceActivity ( ) ; // 启动偏好设置活动
}
break ;
}
case R . id . menu_setting : {
startPreferenceActivity ( ) ;
case R . id . menu_setting :
startPreferenceActivity ( ) ; // 启动偏好设置活动
break ;
}
case R . id . menu_new_note : {
createNewNote ( ) ;
case R . id . menu_new_note :
createNewNote ( ) ; // 创建新笔记
break ;
}
case R . id . menu_search :
onSearchRequested ( ) ;
break ;
@ -820,7 +761,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
@Override
public boolean onSearchRequested ( ) {
startSearch ( null , false , null /* appData */ , false ) ;
startSearch ( null , false , null , false ) ;
return true ;
}
@ -830,34 +771,27 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
@Override
protected Integer doInBackground ( Void . . . unused ) {
return backup . exportToText ( ) ;
return backup . exportToText ( ) ; // 导出笔记为文本文件
}
@Override
protected void onPostExecute ( Integer result ) {
if ( result = = BackupUtils . STATE_SD_CARD_UNMOUONTED ) {
AlertDialog . Builder builder = new AlertDialog . Builder ( NotesListActivity . this ) ;
builder . setTitle ( NotesListActivity . this
. getString ( R . string . failed_sdcard_export ) ) ;
builder . setMessage ( NotesListActivity . this
. getString ( R . string . error_sdcard_unmounted ) ) ;
builder . setTitle ( NotesListActivity . this . getString ( R . string . failed_sdcard_export ) ) ;
builder . setMessage ( NotesListActivity . this . getString ( R . string . error_sdcard_unmounted ) ) ;
builder . setPositiveButton ( android . R . string . ok , null ) ;
builder . show ( ) ;
} else if ( result = = BackupUtils . STATE_SUCCESS ) {
AlertDialog . Builder builder = new AlertDialog . Builder ( NotesListActivity . this ) ;
builder . setTitle ( NotesListActivity . this
. getString ( R . string . success_sdcard_export ) ) ;
builder . setMessage ( NotesListActivity . this . getString (
R . string . format_exported_file_location , backup
. getExportedTextFileName ( ) , backup . getExportedTextFileDir ( ) ) ) ;
builder . setTitle ( NotesListActivity . this . getString ( R . string . success_sdcard_export ) ) ;
builder . setMessage ( NotesListActivity . this . getString ( R . string . format_exported_file_location , backup . getExportedTextFileName ( ) , backup . getExportedTextFileDir ( ) ) ) ;
builder . setPositiveButton ( android . R . string . ok , null ) ;
builder . show ( ) ;
} else if ( result = = BackupUtils . STATE_SYSTEM_ERROR ) {
AlertDialog . Builder builder = new AlertDialog . Builder ( NotesListActivity . this ) ;
builder . setTitle ( NotesListActivity . this
. getString ( R . string . failed_sdcard_export ) ) ;
builder . setMessage ( NotesListActivity . this
. getString ( R . string . error_sdcard_export ) ) ;
builder . setTitle ( NotesListActivity . this . getString ( R . string . failed_sdcard_export ) ) ;
builder . setMessage ( NotesListActivity . this . getString ( R . string . error_sdcard_export ) ) ;
builder . setPositiveButton ( android . R . string . ok , null ) ;
builder . show ( ) ;
}
@ -867,13 +801,13 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
}
private boolean isSyncMode ( ) {
return NotesPreferenceActivity . getSyncAccountName ( this ) . trim ( ) . length ( ) > 0 ;
return NotesPreferenceActivity . getSyncAccountName ( this ) . trim ( ) . length ( ) > 0 ; // 判断是否为同步模式
}
private void startPreferenceActivity ( ) {
Activity from = getParent ( ) ! = null ? getParent ( ) : this ;
Intent intent = new Intent ( from , NotesPreferenceActivity . class ) ;
from . startActivityIfNeeded ( intent , - 1 ) ;
from . startActivityIfNeeded ( intent , - 1 ) ; // 启动偏好设置活动
}
private class OnListItemClickListener implements OnItemClickListener {
@ -884,29 +818,27 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
if ( mNotesListAdapter . isInChoiceMode ( ) ) {
if ( item . getType ( ) = = Notes . TYPE_NOTE ) {
position = position - mNotesListView . getHeaderViewsCount ( ) ;
mModeCallBack . onItemCheckedStateChanged ( null , position , id ,
! mNotesListAdapter . isSelectedItem ( position ) ) ;
mModeCallBack . onItemCheckedStateChanged ( null , position , id , ! mNotesListAdapter . isSelectedItem ( position ) ) ; // 切换选中状态
}
return ;
}
switch ( mState ) {
case NOTE_LIST :
if ( item . getType ( ) = = Notes . TYPE_FOLDER
| | item . getType ( ) = = Notes . TYPE_SYSTEM ) {
openFolder ( item ) ;
if ( item . getType ( ) = = Notes . TYPE_FOLDER | | item . getType ( ) = = Notes . TYPE_SYSTEM ) {
openFolder ( item ) ; // 打开文件夹
} else if ( item . getType ( ) = = Notes . TYPE_NOTE ) {
openNode ( item ) ;
openNode ( item ) ; // 打开笔记
} else {
Log . e ( TAG , " Wrong note type in NOTE_LIST ") ;
Log . e ( TAG , " 笔记列表中的错误笔记类型 ") ;
}
break ;
case SUB_FOLDER :
case CALL_RECORD_FOLDER :
if ( item . getType ( ) = = Notes . TYPE_NOTE ) {
openNode ( item ) ;
openNode ( item ) ; // 打开笔记
} else {
Log . e ( TAG , " Wrong note type in SUB_FOLDER ") ;
Log . e ( TAG , " 子文件夹中的错误笔记类型 ") ;
}
break ;
default :
@ -919,20 +851,8 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
private void startQueryDestinationFolders ( ) {
String selection = NoteColumns . TYPE + "=? AND " + NoteColumns . PARENT_ID + "<>? AND " + NoteColumns . ID + "<>?" ;
selection = ( mState = = ListEditState . NOTE_LIST ) ? selection :
"(" + selection + ") OR (" + NoteColumns . ID + "=" + Notes . ID_ROOT_FOLDER + ")" ;
mBackgroundQueryHandler . startQuery ( FOLDER_LIST_QUERY_TOKEN ,
null ,
Notes . CONTENT_NOTE_URI ,
FoldersListAdapter . PROJECTION ,
selection ,
new String [ ] {
String . valueOf ( Notes . TYPE_FOLDER ) ,
String . valueOf ( Notes . ID_TRASH_FOLER ) ,
String . valueOf ( mCurrentFolderId )
} ,
NoteColumns . MODIFIED_DATE + " DESC" ) ;
selection = ( mState = = ListEditState . NOTE_LIST ) ? selection : "(" + selection + ") OR (" + NoteColumns . ID + "=" + Notes . ID_ROOT_FOLDER + ")" ;
mBackgroundQueryHandler . startQuery ( FOLDER_LIST_QUERY_TOKEN , null , Notes . CONTENT_NOTE_URI , FoldersListAdapter . PROJECTION , selection , new String [ ] { String . valueOf ( Notes . TYPE_FOLDER ) , String . valueOf ( Notes . ID_TRASH_FOLER ) , String . valueOf ( mCurrentFolderId ) } , NoteColumns . MODIFIED_DATE + " DESC" ) ;
}
public boolean onItemLongClick ( AdapterView < ? > parent , View view , int position , long id ) {
@ -940,13 +860,13 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
mFocusNoteDataItem = ( ( NotesListItem ) view ) . getItemData ( ) ;
if ( mFocusNoteDataItem . getType ( ) = = Notes . TYPE_NOTE & & ! mNotesListAdapter . isInChoiceMode ( ) ) {
if ( mNotesListView . startActionMode ( mModeCallBack ) ! = null ) {
mModeCallBack . onItemCheckedStateChanged ( null , position , id , true ) ;
mNotesListView . performHapticFeedback ( HapticFeedbackConstants . LONG_PRESS ) ;
mModeCallBack . onItemCheckedStateChanged ( null , position , id , true ) ; // 进入多选模式并选中当前项
mNotesListView . performHapticFeedback ( HapticFeedbackConstants . LONG_PRESS ) ; // 执行触觉反馈
} else {
Log . e ( TAG , " startActionMode fails ") ;
Log . e ( TAG , " 进入多选模式失败 ") ;
}
} else if ( mFocusNoteDataItem . getType ( ) = = Notes . TYPE_FOLDER ) {
mNotesListView . setOnCreateContextMenuListener ( mFolderOnCreateContextMenuListener ) ;
mNotesListView . setOnCreateContextMenuListener ( mFolderOnCreateContextMenuListener ) ; // 设置上下文菜单创建监听器
}
}
return false ;