@ -14,154 +14,116 @@
* limitations under the License .
* /
/ * *
* 代 表 这 个 类 是 UI 包 中 的 一 个
* /
package net.micode.notes.ui ;
/ * *
* 这 些 类 涵 盖 了 Android 应 用 程 序 开 发 中 常 用 的
* UI 元 素 、 数 据 存 储 、 后 台 任 务 处 理 、 系 统 服 务 调 用 等 方 面 的 功 能 。
* /
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 ;
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.annotation.SuppressLint ;
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.KeyEvent ;
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 {
/ * *
* 定 义 了 一 些 静 态 常 量
* /
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" ;
//定义一个字符串指向应用介绍
/ * *
* 这 是 一 个 枚 举 类 型 , 用 于 表 示 列 表 的 编 辑 状 态 。
* 枚 举 类 型 可 以 用 来 定 义 一 组 相 关 的 常 量 ,
* 这 里 定 义 了 三 种 可 能 的 列 表 编 辑 状 态 :
* NOTE_LIST ( 便 签 列 表 ) 、 SUB_FOLDER ( 子 文 件 夹 ) 、
* CALL_RECORD_FOLDER ( 通 话 记 录 文 件 夹 )
* /
private enum ListEditState {
NOTE_LIST , SUB_FOLDER , CALL_RECORD_FOLDER
} ;
private int mBackgroundState = - 1 ; //定义了一个用于标识开始界面背景的变量
private ListEditState mState ;
private ListEditState mState ; //定义了一个标识列表编辑状态的变量
private BackgroundQueryHandler mBackgroundQueryHandler ;
private BackgroundQueryHandler mBackgroundQueryHandler ; //用于在后台执行数据库查询等操作, 以避免阻塞UI线程
private NotesListAdapter mNotesListAdapter ;
private NotesListAdapter mNotesListAdapter ; //用于管理便签列表中数据项的适配器,通常与 ListView 一起使用
private ListView mNotesListView ;
private ListView mNotesListView ; //它表示便签列表的视图,用于显示便签列表中的数据项,
// 并与适配器( NotesListAdapter) 一起工作以展示数据。
private Button mAddNewNote ;
/ * *
* 定 义 了 一 些 类 变 量
* /
private Button mAddNewNote ; //声明了一个私有成员变量 mAddNewNote, 类型为 Button,
// 用来表示一个按钮控件,通常用于用户点击以添加新的便签。
private boolean mDispatch ;
private boolean mDispatch ; //声明了一个私有成员变量 mDispatch, 类型为 boolean,
// 用来表示一个标志位,可能用于控制某些事件的分发。
private int mOriginY ;
private int mOriginY ; //声明了两个私有成员变量 mOriginY 和 mDispatchY, 类型为 int,
private int mDispatchY ; // 可能用于记录某些位置坐标的信息。
private int mDispatchY ;
private TextView mTitleBar ; //声明了一个私有成员变量 mTitleBar, 类型为 TextView,
// 用来表示一个文本视图,通常用于显示标题栏的文本信息。
private TextView mTitleBar ;
private long mCurrentFolderId ; //用来表示当前文件夹的ID。
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 ;
private static final String NORMAL_SELECTION = NoteColumns . PARENT_ID + "=?" ;
@ -169,16 +131,14 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
+ 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 ; //分别表示启动Activity时用到的请求码, 用于区分不同的启动请求
private final static int REQUEST_CODE_NEW_NODE = 103 ;
@Override
protected void onCreate ( Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState ) ;
setContentView ( R . layout . note_list ) ;
getWindow ( ) . setBackgroundDrawableResource ( R . drawable . list_background ) ;
initResources ( ) ;
/ * *
@ -187,17 +147,6 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
setAppInfoFromRawRes ( ) ;
}
/ * *
* 被 重 写 的 一 个 方 法
* 这 是 一 个 用 于 处 理 Activity 返 回 结 果 的 方 法 。
* 当 通 过 startActivityForResult 方 法 启 动 的 Activity 结 束 后 , 会 回 调 到 这 个 方 法 。
* 参 数 requestCode 是 用 于 标 识 请 求 的 整 型 值 ,
* resultCode 是 用 于 标 识 返 回 结 果 的 整 型 值 ,
* data 是 用 于 携 带 返 回 数 据 的 Intent 对 象 。
* @param requestCode
* @param resultCode
* @param data
* /
@Override
protected void onActivityResult ( int requestCode , int resultCode , Intent data ) {
if ( resultCode = = RESULT_OK
@ -208,12 +157,6 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
}
}
/ * *
* 这 是 一 个 私 有 方 法 , 用 于 从 原 始 资 源 中 获 取 应 用 信 息 并 保 存 到 SharedPreferences 中 。
* 首 先 , 它 会 检 查 SharedPreferences 中 是 否 已 经 添 加 了 介 绍 信 息 ,
* 如 果 没 有 , 则 读 取 raw 资 源 中 的 介 绍 信 息 , 并 创 建 一 个 新 的 WorkingNote 对 象 。
* 接 着 , 将 介 绍 信 息 保 存 到 SharedPreferences 中 , 标 记 已 经 添 加 了 介 绍 信 息 。
* /
private void setAppInfoFromRawRes ( ) {
SharedPreferences sp = PreferenceManager . getDefaultSharedPreferences ( this ) ;
if ( ! sp . getBoolean ( PREFERENCE_ADD_INTRODUCTION , false ) ) {
@ -260,27 +203,16 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
}
}
/ * *
* 这 是 一 个 重 写 的 Activity 生 命 周 期 方 法 , 当 Activity 即 将 可 见 时 会 调 用 此 方 法 。
* 在 这 个 方 法 中 , 首 先 调 用 了 父 类 的 onStart 方 法 , 然 后 调 用 了 startAsyncNotesListQuery 方 法 。
* /
@Override
protected void onStart ( ) {
super . onStart ( ) ;
startAsyncNotesListQuery ( ) ;
}
/ * *
* 这 是 一 个 私 有 方 法 , 用 于 初 始 化 资 源 。 在 这 个 方 法 中 , 对 一 些 成 员 变 量 进 行 了 初 始 化 ,
* 例 如 内 容 解 析 器 、 后 台 查 询 处 理 器 、 当 前 文 件 夹 ID 、 便 签 列 表 视 图 、 按 钮 的 点 击 监 听 器 等 。
* 这 些 初 始 化 操 作 可 以 确 保 在 Activity 启 动 时 , 相 关 资 源 和 状 态 都 得 到 了 正 确 的 设 置 ,
* 以 便 后 续 的 操 作 和 交 互 能 够 正 常 进 行 。
* /
private void initResources ( ) {
mContentResolver = this . getContentResolver ( ) ;
mBackgroundQueryHandler = new BackgroundQueryHandler ( this . getContentResolver ( ) ) ;
mCurrentFolderId = Notes . ID_ROOT_FOLDER ;
//mCurrentFolderId = Notes.ID_TRASH_FOLER;
mNotesListView = ( ListView ) findViewById ( R . id . notes_list ) ;
mNotesListView . addFooterView ( LayoutInflater . from ( this ) . inflate ( R . layout . note_list_footer , null ) ,
null , false ) ;
@ -297,25 +229,16 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
mTitleBar = ( TextView ) findViewById ( R . id . tv_title_bar ) ;
mState = ListEditState . NOTE_LIST ;
mModeCallBack = new ModeCallback ( ) ;
editText = ( EditText ) findViewById ( R . id . note_edit_view ) ;
textView = ( TextView ) findViewById ( R . id . text_num ) ;
}
/ * *
* 这 个 ModeCallback 类 实 现 了
* ListView . MultiChoiceModeListener
* 和 OnMenuItemClickListener 接 口 ,
* 用 于 处 理 列 表 的 多 选 模 式 操 作 和 菜 单 项 点 击 事 件 的 监 听 。
* /
private class ModeCallback implements ListView . MultiChoiceModeListener , OnMenuItemClickListener {
private DropdownMenu mDropDownMenu ;
private ActionMode mActionMode ;
private MenuItem mMoveMenu ;
/ * *
* 当 进 入 多 选 模 式 时 被 调 用 , 在 这 个 方 法 中 设 置 多 选 模 式 的 界 面 和 菜 单 。
* @param mode
* @param menu
* @return
* /
public boolean onCreateActionMode ( ActionMode mode , Menu menu ) {
getMenuInflater ( ) . inflate ( R . menu . note_list_options , menu ) ;
menu . findItem ( R . id . delete ) . setOnMenuItemClickListener ( this ) ;
@ -349,9 +272,6 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
return true ;
}
/ * *
* 更 新 下 拉 菜 单 的 显 示 状 态 , 包 括 选 中 项 的 数 量 和 标 题 等 。
* /
private void updateMenu ( ) {
int selectedCount = mNotesListAdapter . getSelectedCount ( ) ;
// Update dropdown menu
@ -369,23 +289,11 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
}
}
/ * *
* 在 准 备 多 选 模 式 时 被 调 用 , 可 以 在 这 个 方 法 中 进 行 一 些 准 备 工 作 。
* @param mode
* @param menu
* @return
* /
public boolean onPrepareActionMode ( ActionMode mode , Menu menu ) {
// TODO Auto-generated method stub
return false ;
}
/ * *
* 在 选 择 操 作 项 时 被 调 用 , 可 以 在 这 个 方 法 中 处 理 操 作 项 的 点 击 事 件 。
* @param mode
* @param item
* @return
* /
public boolean onActionItemClicked ( ActionMode mode , MenuItem item ) {
// TODO Auto-generated method stub
return false ;
@ -414,21 +322,28 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
return true ;
}
int itemId = item . getItemId ( ) ;
if ( itemId = = R . id . delete ) {
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 ,
( dialog , which ) - > batchDelete ( ) ) ;
builder . setNegativeButton ( android . R . string . cancel , null ) ;
builder . show ( ) ;
} else if ( itemId = = R . id . move ) {
startQueryDestinationFolders ( ) ;
} else {
return false ;
switch ( item . getItemId ( ) ) {
case R . id . delete :
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 . setNegativeButton ( android . R . string . cancel , null ) ;
builder . show ( ) ;
break ;
case R . id . move :
startQueryDestinationFolders ( ) ;
break ;
default :
return false ;
}
return true ;
}
@ -572,7 +487,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
// in sync mode, we'll move the deleted note into the trash
// folder
if ( ! DataUtils . batchMoveToFolder ( mContentResolver , mNotesListAdapter
. getSelectedItemIds ( ) , Notes . ID_TRASH_FOL D ER) ) {
. getSelectedItemIds ( ) , Notes . ID_TRASH_FOL ER) ) {
Log . e ( TAG , "Move notes to trash folder error, should not happens" ) ;
}
}
@ -609,7 +524,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
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_FOL D ER) ;
DataUtils . batchMoveToFolder ( mContentResolver , ids , Notes . ID_TRASH_FOL ER) ;
}
if ( widgets ! = null ) {
for ( AppWidgetAttribute widget : widgets ) {
@ -646,8 +561,12 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
}
public void onClick ( View v ) {
if ( v . getId ( ) = = R . id . btn_new_note ) {
createNewNote ( ) ;
switch ( v . getId ( ) ) {
case R . id . btn_new_note :
createNewNote ( ) ;
break ;
default :
break ;
}
}
@ -663,7 +582,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
inputMethodManager . hideSoftInputFromWindow ( view . getWindowToken ( ) , 0 ) ;
}
private void showCreateOrModifyFolderDialog ( final boolean create ) {
private void showCreateOrModifyFolderDialog ( final boolean create ) { //新建文件夹
final AlertDialog . Builder builder = new AlertDialog . Builder ( this ) ;
View view = LayoutInflater . from ( this ) . inflate ( R . layout . dialog_edit_text , null ) ;
final EditText etName = ( EditText ) view . findViewById ( R . id . et_foler_name ) ;
@ -748,33 +667,6 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
} ) ;
}
private void checkBackground ( int itemId , AlertDialog . Builder bkgBuilder ) {
bkgBuilder . setTitle ( getString ( R . string . alert_title_check_background ) ) ;
bkgBuilder . setIcon ( android . R . drawable . ic_dialog_alert ) ;
if ( itemId = = R . id . menu_MyBackground_cloud & & mBackgroundState ! = 0 ) {
bkgBuilder . setMessage ( getString ( R . string . alert_message_check_cloud ) ) ;
bkgBuilder . setPositiveButton ( android . R . string . ok , ( dialog , which ) - >
getWindow ( ) . setBackgroundDrawableResource ( R . drawable . mybackground_cloud ) ) ; //采用lambda方法, 更新背景
mBackgroundState = 0 ;
bkgBuilder . setNegativeButton ( android . R . string . cancel , null ) ;
bkgBuilder . show ( ) ;
} else if ( itemId = = R . id . menu_MyBackground_lake & & mBackgroundState ! = 1 ) {
bkgBuilder . setMessage ( getString ( R . string . alert_message_check_lake ) ) ;
bkgBuilder . setPositiveButton ( android . R . string . ok , ( dialog , which ) - >
getWindow ( ) . setBackgroundDrawableResource ( R . drawable . mybackground_lake ) ) ;
bkgBuilder . setNegativeButton ( android . R . string . cancel , null ) ;
mBackgroundState = 1 ;
bkgBuilder . show ( ) ;
} else if ( itemId = = R . id . menu_MyBackground_gril & & mBackgroundState ! = 2 ) {
bkgBuilder . setMessage ( getString ( R . string . alert_message_check_girl ) ) ;
bkgBuilder . setPositiveButton ( android . R . string . ok , ( dialog , which ) - >
getWindow ( ) . setBackgroundDrawableResource ( R . drawable . mybackground_girl ) ) ;
bkgBuilder . setNegativeButton ( android . R . string . cancel , null ) ;
mBackgroundState = 2 ;
bkgBuilder . show ( ) ;
}
}
@Override
public void onBackPressed ( ) {
switch ( mState ) {
@ -871,6 +763,34 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
return true ;
}
private void checkBackground ( int itemId , AlertDialog . Builder bkgBuilder ) {
bkgBuilder . setTitle ( getString ( R . string . alert_title_check_background ) ) ;
bkgBuilder . setIcon ( android . R . drawable . ic_dialog_alert ) ;
if ( itemId = = R . id . menu_MyBackground_cloud & & mBackgroundState ! = 0 ) {
bkgBuilder . setMessage ( getString ( R . string . alert_message_check_cloud ) ) ;
bkgBuilder . setPositiveButton ( android . R . string . ok , ( dialog , which ) - >
getWindow ( ) . setBackgroundDrawableResource ( R . drawable . mybackground_cloud ) ) ; //采用lambda方法, 更新背景
mBackgroundState = 0 ;
bkgBuilder . setNegativeButton ( android . R . string . cancel , null ) ;
bkgBuilder . show ( ) ;
} else if ( itemId = = R . id . menu_MyBackground_lake & & mBackgroundState ! = 1 ) {
bkgBuilder . setMessage ( getString ( R . string . alert_message_check_lake ) ) ;
bkgBuilder . setPositiveButton ( android . R . string . ok , ( dialog , which ) - >
getWindow ( ) . setBackgroundDrawableResource ( R . drawable . mybackground_lake ) ) ;
bkgBuilder . setNegativeButton ( android . R . string . cancel , null ) ;
mBackgroundState = 1 ;
bkgBuilder . show ( ) ;
} else if ( itemId = = R . id . menu_MyBackground_gril & & mBackgroundState ! = 2 ) {
bkgBuilder . setMessage ( getString ( R . string . alert_message_check_girl ) ) ;
bkgBuilder . setPositiveButton ( android . R . string . ok , ( dialog , which ) - >
getWindow ( ) . setBackgroundDrawableResource ( R . drawable . mybackground_girl ) ) ;
bkgBuilder . setNegativeButton ( android . R . string . cancel , null ) ;
mBackgroundState = 2 ;
bkgBuilder . show ( ) ;
}
}
@Override
public boolean onPrepareOptionsMenu ( Menu menu ) {
menu . clear ( ) ;
@ -893,38 +813,52 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
public boolean onOptionsItemSelected ( MenuItem item ) {
int itemId = item . getItemId ( ) ;
/ * *
* 用 于 切 换 背 景 的 弹 窗
* /
AlertDialog . Builder bkgBuilder = new AlertDialog . Builder ( NotesListActivity . this ) ;
if ( itemId = = R . id . menu_new_folder ) {
showCreateOrModifyFolderDialog ( true ) ;
} else if ( itemId = = R . id . menu_export_text ) {
exportNoteToText ( ) ;
} else if ( itemId = = R . id . menu_sync ) {
if ( isSyncMode ( ) ) {
if ( TextUtils . equals ( item . getTitle ( ) , getString ( R . string . menu_sync ) ) ) {
GTaskSyncService . startSync ( this ) ;
switch ( item . getItemId ( ) ) {
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 ) ;
} else {
GTaskSyncService . cancelSync ( this ) ;
}
} else {
GTaskSyncService . cancelSync ( this ) ;
startPreferenceActivity( ) ;
}
} else {
break ;
}
case R . id . menu_setting : {
startPreferenceActivity ( ) ;
break ;
}
} else if ( itemId = = R . id . menu_setting ) {
startPreferenceActivity ( ) ;
} else if ( itemId = = R . id . menu_new_note ) {
createNewNote ( ) ;
} else if ( itemId = = R . id . menu_search ) {
onSearchRequested ( ) ;
} else if ( itemId = = R . id . menu_MyBackground_cloud ) { //给便签软件换开始界面
checkBackground ( itemId , bkgBuilder ) ;
} else if ( itemId = = R . id . menu_MyBackground_lake ) {
checkBackground ( itemId , bkgBuilder ) ;
} else if ( itemId = = R . id . menu_MyBackground_gril ) {
checkBackground ( itemId , bkgBuilder ) ;
}
case R . id . menu_new_note : {
createNewNote ( ) ;
break ;
}
case R . id . menu_search :
onSearchRequested ( ) ;
break ;
case R . id . menu_countallNotes :
showNumberofNotes ( ) ;
break ;
case R . id . menu_MyBackground_cloud :
case R . id . menu_MyBackground_lake :
case R . id . menu_MyBackground_gril :
checkBackground ( itemId , bkgBuilder ) ;
break ;
default :
break ;
}
return true ;
}
@ -975,6 +909,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
} . execute ( ) ;
}
private boolean isSyncMode ( ) {
return NotesPreferenceActivity . getSyncAccountName ( this ) . trim ( ) . length ( ) > 0 ;
}
@ -1038,7 +973,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
selection ,
new String [ ] {
String . valueOf ( Notes . TYPE_FOLDER ) ,
String . valueOf ( Notes . ID_TRASH_FOL D ER) ,
String . valueOf ( Notes . ID_TRASH_FOL ER) ,
String . valueOf ( mCurrentFolderId )
} ,
NoteColumns . MODIFIED_DATE + " DESC" ) ;
@ -1060,4 +995,14 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
}
return false ;
}
private void showNumberofNotes ( ) {
AlertDialog . Builder btr = new AlertDialog . Builder ( this ) ;
btr . setTitle ( "目前便签数" ) ;
btr . setMessage ( "目前有 " + Integer . toString ( mNotesListAdapter . retCount ( ) ) + "个便签" ) ;
btr . show ( ) ;
}
private EditText editText ;
private TextView textView ;
}