diff --git a/app/src/main/java/net/micode/notes/ui/NotesListItem.java b/app/src/main/java/net/micode/notes/ui/NotesListItem.java index 1221e80..2e11f60 100644 --- a/app/src/main/java/net/micode/notes/ui/NotesListItem.java +++ b/app/src/main/java/net/micode/notes/ui/NotesListItem.java @@ -29,18 +29,33 @@ import net.micode.notes.data.Notes; import net.micode.notes.tool.DataUtils; import net.micode.notes.tool.ResourceParser.NoteItemBgResources; - +/** + * 笔记列表项视图 + * 用于展示单个笔记或文件夹条目,支持多选模式和不同类型的界面展示 + */ public class NotesListItem extends LinearLayout { + // 提醒图标(闹钟/通话记录等) private ImageView mAlert; + // 标题文本 private TextView mTitle; + // 时间文本(最后修改时间) private TextView mTime; + // 通话记录名称(仅通话相关条目显示) private TextView mCallName; + // 绑定的数据项 private NoteItemData mItemData; + // 多选模式下的复选框 private CheckBox mCheckBox; + /** + * 构造方法 + * @param context 上下文环境 + */ public NotesListItem(Context context) { super(context); + // 加载列表项布局 inflate(context, R.layout.note_item, this); + // 初始化子视图 mAlert = (ImageView) findViewById(R.id.iv_alert_icon); mTitle = (TextView) findViewById(R.id.tv_title); mTime = (TextView) findViewById(R.id.tv_time); @@ -48,43 +63,60 @@ public class NotesListItem extends LinearLayout { mCheckBox = (CheckBox) findViewById(android.R.id.checkbox); } + /** + * 绑定数据并更新视图显示 + * @param context 上下文环境 + * @param data 要绑定的笔记/文件夹数据项 + * @param choiceMode 是否处于多选模式 + * @param checked 当前项是否被选中(多选模式下有效) + */ public void bind(Context context, NoteItemData data, boolean choiceMode, boolean checked) { + // 处理多选模式下的复选框显示 if (choiceMode && data.getType() == Notes.TYPE_NOTE) { - mCheckBox.setVisibility(View.VISIBLE); - mCheckBox.setChecked(checked); + mCheckBox.setVisibility(View.VISIBLE); // 显示复选框(仅笔记项在多选模式下可见) + mCheckBox.setChecked(checked); // 设置选中状态 } else { - mCheckBox.setVisibility(View.GONE); + mCheckBox.setVisibility(View.GONE); // 隐藏复选框 } - mItemData = data; + mItemData = data; // 保存数据项 + + // 根据数据类型和上下文设置不同的显示逻辑 if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) { - mCallName.setVisibility(View.GONE); - mAlert.setVisibility(View.VISIBLE); - mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem); + // 通话记录文件夹特殊处理 + mCallName.setVisibility(View.GONE); // 隐藏通话名称 + mAlert.setVisibility(View.VISIBLE); // 显示提醒图标 + mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem); // 设置主标题样式 + // 显示文件夹名称和笔记数量 mTitle.setText(context.getString(R.string.call_record_folder_name) + context.getString(R.string.format_folder_files_count, data.getNotesCount())); - mAlert.setImageResource(R.drawable.call_record); + mAlert.setImageResource(R.drawable.call_record); // 设置通话记录图标 } else if (data.getParentId() == Notes.ID_CALL_RECORD_FOLDER) { - mCallName.setVisibility(View.VISIBLE); - mCallName.setText(data.getCallName()); - mTitle.setTextAppearance(context,R.style.TextAppearanceSecondaryItem); - mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet())); + // 通话记录文件夹内的笔记项 + mCallName.setVisibility(View.VISIBLE); // 显示通话名称 + mCallName.setText(data.getCallName()); // 设置通话人姓名 + mTitle.setTextAppearance(context, R.style.TextAppearanceSecondaryItem); // 设置次级标题样式 + mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet())); // 显示格式化后的摘要 + // 根据是否有提醒设置提醒图标 if (data.hasAlert()) { - mAlert.setImageResource(R.drawable.clock); + mAlert.setImageResource(R.drawable.clock); // 闹钟图标 mAlert.setVisibility(View.VISIBLE); } else { mAlert.setVisibility(View.GONE); } } else { - mCallName.setVisibility(View.GONE); - mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem); + // 普通笔记或文件夹 + mCallName.setVisibility(View.GONE); // 隐藏通话名称 + mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem); // 设置主标题样式 if (data.getType() == Notes.TYPE_FOLDER) { + // 文件夹项:显示名称和子项数量 mTitle.setText(data.getSnippet() + context.getString(R.string.format_folder_files_count, - data.getNotesCount())); - mAlert.setVisibility(View.GONE); + data.getNotesCount())); + mAlert.setVisibility(View.GONE); // 文件夹不显示提醒图标 } else { + // 普通笔记项:显示摘要和提醒图标 mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet())); if (data.hasAlert()) { mAlert.setImageResource(R.drawable.clock); @@ -94,29 +126,45 @@ public class NotesListItem extends LinearLayout { } } } + // 显示相对时间(如“5分钟前”) mTime.setText(DateUtils.getRelativeTimeSpanString(data.getModifiedDate())); + // 设置列表项背景(根据笔记类型和样式) setBackground(data); } + /** + * 设置列表项背景资源 + * @param data 数据项 + */ private void setBackground(NoteItemData data) { - int id = data.getBgColorId(); + int id = data.getBgColorId(); // 获取背景颜色ID if (data.getType() == Notes.TYPE_NOTE) { + // 笔记项背景处理(根据位置和样式) if (data.isSingle() || data.isOneFollowingFolder()) { + // 单独项或跟随一个文件夹的项 setBackgroundResource(NoteItemBgResources.getNoteBgSingleRes(id)); } else if (data.isLast()) { + // 最后一项 setBackgroundResource(NoteItemBgResources.getNoteBgLastRes(id)); } else if (data.isFirst() || data.isMultiFollowingFolder()) { + // 第一项或跟随多个文件夹的项 setBackgroundResource(NoteItemBgResources.getNoteBgFirstRes(id)); } else { + // 普通项 setBackgroundResource(NoteItemBgResources.getNoteBgNormalRes(id)); } } else { + // 文件夹项背景(固定样式) setBackgroundResource(NoteItemBgResources.getFolderBgRes()); } } + /** + * 获取绑定的数据项 + * @return 笔记/文件夹数据项 + */ public NoteItemData getItemData() { return mItemData; } -} +} \ No newline at end of file diff --git a/app/src/main/java/net/micode/notes/ui/NotesPreferenceActivity.java b/app/src/main/java/net/micode/notes/ui/NotesPreferenceActivity.java index 07c5f7e..38fbd65 100644 --- a/app/src/main/java/net/micode/notes/ui/NotesPreferenceActivity.java +++ b/app/src/main/java/net/micode/notes/ui/NotesPreferenceActivity.java @@ -47,43 +47,47 @@ import net.micode.notes.data.Notes; import net.micode.notes.data.Notes.NoteColumns; import net.micode.notes.gtask.remote.GTaskSyncService; - +/** + * 笔记应用的设置Activity,继承自PreferenceActivity + * 主要处理与Google Task同步相关的账户设置和同步操作 + */ public class NotesPreferenceActivity extends PreferenceActivity { + // 偏好设置文件名 public static final String PREFERENCE_NAME = "notes_preferences"; - + // 同步账户名的偏好设置键 public static final String PREFERENCE_SYNC_ACCOUNT_NAME = "pref_key_account_name"; - + // 上次同步时间的偏好设置键 public static final String PREFERENCE_LAST_SYNC_TIME = "pref_last_sync_time"; - + // 背景颜色随机设置的偏好设置键 public static final String PREFERENCE_SET_BG_COLOR_KEY = "pref_key_bg_random_appear"; - + // 同步账户分类的键 private static final String PREFERENCE_SYNC_ACCOUNT_KEY = "pref_sync_account_key"; - + // 账户权限过滤键 private static final String AUTHORITIES_FILTER_KEY = "authorities"; - private PreferenceCategory mAccountCategory; - - private GTaskReceiver mReceiver; - - private Account[] mOriAccounts; - - private boolean mHasAddedAccount; + private PreferenceCategory mAccountCategory; // 账户分类偏好 + private GTaskReceiver mReceiver; // 同步服务广播接收器 + private Account[] mOriAccounts; // 原始账户列表 + private boolean mHasAddedAccount; // 是否添加了新账户的标志 @Override protected void onCreate(Bundle icicle) { super.onCreate(icicle); - /* using the app icon for navigation */ + // 在ActionBar上显示返回按钮 getActionBar().setDisplayHomeAsUpEnabled(true); + // 从XML资源添加偏好设置 addPreferencesFromResource(R.xml.preferences); mAccountCategory = (PreferenceCategory) findPreference(PREFERENCE_SYNC_ACCOUNT_KEY); mReceiver = new GTaskReceiver(); + // 注册广播接收器,监听同步服务状态变化 IntentFilter filter = new IntentFilter(); filter.addAction(GTaskSyncService.GTASK_SERVICE_BROADCAST_NAME); registerReceiver(mReceiver, filter); mOriAccounts = null; + // 添加设置界面的头部视图 View header = LayoutInflater.from(this).inflate(R.layout.settings_header, null); getListView().addHeaderView(header, null, true); } @@ -92,11 +96,11 @@ public class NotesPreferenceActivity extends PreferenceActivity { protected void onResume() { super.onResume(); - // need to set sync account automatically if user has added a new - // account + // 如果用户添加了新账户,需要自动设置同步账户 if (mHasAddedAccount) { Account[] accounts = getGoogleAccounts(); if (mOriAccounts != null && accounts.length > mOriAccounts.length) { + // 找出新添加的账户 for (Account accountNew : accounts) { boolean found = false; for (Account accountOld : mOriAccounts) { @@ -113,19 +117,23 @@ public class NotesPreferenceActivity extends PreferenceActivity { } } - refreshUI(); + refreshUI(); // 刷新UI } @Override protected void onDestroy() { + // 注销广播接收器 if (mReceiver != null) { unregisterReceiver(mReceiver); } super.onDestroy(); } + /** + * 加载账户偏好设置 + */ private void loadAccountPreference() { - mAccountCategory.removeAll(); + mAccountCategory.removeAll(); // 清除所有现有偏好 Preference accountPref = new Preference(this); final String defaultAccount = getSyncAccountName(this); @@ -135,48 +143,52 @@ public class NotesPreferenceActivity extends PreferenceActivity { public boolean onPreferenceClick(Preference preference) { if (!GTaskSyncService.isSyncing()) { if (TextUtils.isEmpty(defaultAccount)) { - // the first time to set account + // 第一次设置账户,显示选择账户对话框 showSelectAccountAlertDialog(); } else { - // if the account has already been set, we need to promp - // user about the risk + // 账户已设置,显示更改账户确认对话框 showChangeAccountConfirmAlertDialog(); } } else { + // 同步进行中,不能更改账户 Toast.makeText(NotesPreferenceActivity.this, - R.string.preferences_toast_cannot_change_account, Toast.LENGTH_SHORT) + R.string.preferences_toast_cannot_change_account, Toast.LENGTH_SHORT) .show(); } return true; } }); - mAccountCategory.addPreference(accountPref); + mAccountCategory.addPreference(accountPref); // 添加账户偏好 } + /** + * 加载同步按钮状态 + */ private void loadSyncButton() { Button syncButton = (Button) findViewById(R.id.preference_sync_button); TextView lastSyncTimeView = (TextView) findViewById(R.id.prefenerece_sync_status_textview); - // set button state + // 设置按钮状态 if (GTaskSyncService.isSyncing()) { syncButton.setText(getString(R.string.preferences_button_sync_cancel)); syncButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { - GTaskSyncService.cancelSync(NotesPreferenceActivity.this); + GTaskSyncService.cancelSync(NotesPreferenceActivity.this); // 取消同步 } }); } else { syncButton.setText(getString(R.string.preferences_button_sync_immediately)); syncButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { - GTaskSyncService.startSync(NotesPreferenceActivity.this); + GTaskSyncService.startSync(NotesPreferenceActivity.this); // 开始同步 } }); } + // 只有设置了同步账户才能启用同步按钮 syncButton.setEnabled(!TextUtils.isEmpty(getSyncAccountName(this))); - // set last sync time + // 设置上次同步时间显示 if (GTaskSyncService.isSyncing()) { lastSyncTimeView.setText(GTaskSyncService.getProgressString()); lastSyncTimeView.setVisibility(View.VISIBLE); @@ -193,14 +205,21 @@ public class NotesPreferenceActivity extends PreferenceActivity { } } + /** + * 刷新UI + */ private void refreshUI() { loadAccountPreference(); loadSyncButton(); } + /** + * 显示选择账户对话框 + */ private void showSelectAccountAlertDialog() { AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); + // 设置自定义标题视图 View titleView = LayoutInflater.from(this).inflate(R.layout.account_dialog_title, null); TextView titleTextView = (TextView) titleView.findViewById(R.id.account_dialog_title); titleTextView.setText(getString(R.string.preferences_dialog_select_account_title)); @@ -210,13 +229,14 @@ public class NotesPreferenceActivity extends PreferenceActivity { dialogBuilder.setCustomTitle(titleView); dialogBuilder.setPositiveButton(null, null); - Account[] accounts = getGoogleAccounts(); + Account[] accounts = getGoogleAccounts(); // 获取所有Google账户 String defAccount = getSyncAccountName(this); - mOriAccounts = accounts; - mHasAddedAccount = false; + mOriAccounts = accounts; // 保存原始账户列表 + mHasAddedAccount = false; // 重置添加账户标志 if (accounts.length > 0) { + // 创建账户选择列表 CharSequence[] items = new CharSequence[accounts.length]; final CharSequence[] itemMapping = items; int checkedItem = -1; @@ -230,6 +250,7 @@ public class NotesPreferenceActivity extends PreferenceActivity { dialogBuilder.setSingleChoiceItems(items, checkedItem, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { + // 设置选择的账户 setSyncAccount(itemMapping[which].toString()); dialog.dismiss(); refreshUI(); @@ -237,6 +258,7 @@ public class NotesPreferenceActivity extends PreferenceActivity { }); } + // 添加"添加账户"视图 View addAccountView = LayoutInflater.from(this).inflate(R.layout.add_account_text, null); dialogBuilder.setView(addAccountView); @@ -244,9 +266,10 @@ public class NotesPreferenceActivity extends PreferenceActivity { addAccountView.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { mHasAddedAccount = true; + // 启动添加账户设置界面 Intent intent = new Intent("android.settings.ADD_ACCOUNT_SETTINGS"); intent.putExtra(AUTHORITIES_FILTER_KEY, new String[] { - "gmail-ls" + "gmail-ls" // 只显示Gmail账户 }); startActivityForResult(intent, -1); dialog.dismiss(); @@ -254,9 +277,13 @@ public class NotesPreferenceActivity extends PreferenceActivity { }); } + /** + * 显示更改账户确认对话框 + */ private void showChangeAccountConfirmAlertDialog() { AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); + // 设置自定义标题视图 View titleView = LayoutInflater.from(this).inflate(R.layout.account_dialog_title, null); TextView titleTextView = (TextView) titleView.findViewById(R.id.account_dialog_title); titleTextView.setText(getString(R.string.preferences_dialog_change_account_title, @@ -265,6 +292,7 @@ public class NotesPreferenceActivity extends PreferenceActivity { subtitleTextView.setText(getString(R.string.preferences_dialog_change_account_warn_msg)); dialogBuilder.setCustomTitle(titleView); + // 设置菜单项 CharSequence[] menuItemArray = new CharSequence[] { getString(R.string.preferences_menu_change_account), getString(R.string.preferences_menu_remove_account), @@ -273,8 +301,10 @@ public class NotesPreferenceActivity extends PreferenceActivity { dialogBuilder.setItems(menuItemArray, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { if (which == 0) { + // 更改账户 showSelectAccountAlertDialog(); } else if (which == 1) { + // 移除账户 removeSyncAccount(); refreshUI(); } @@ -283,11 +313,17 @@ public class NotesPreferenceActivity extends PreferenceActivity { dialogBuilder.show(); } + /** + * 获取所有Google账户 + */ private Account[] getGoogleAccounts() { AccountManager accountManager = AccountManager.get(this); - return accountManager.getAccountsByType("com.google"); + return accountManager.getAccountsByType("com.google"); // 只获取Google账户 } + /** + * 设置同步账户 + */ private void setSyncAccount(String account) { if (!getSyncAccountName(this).equals(account)) { SharedPreferences settings = getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); @@ -299,10 +335,10 @@ public class NotesPreferenceActivity extends PreferenceActivity { } editor.commit(); - // clean up last sync time + // 清除上次同步时间 setLastSyncTime(this, 0); - // clean up local gtask related info + // 清除本地GTask相关信息 new Thread(new Runnable() { public void run() { ContentValues values = new ContentValues(); @@ -318,6 +354,9 @@ public class NotesPreferenceActivity extends PreferenceActivity { } } + /** + * 移除同步账户 + */ private void removeSyncAccount() { SharedPreferences settings = getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = settings.edit(); @@ -329,7 +368,7 @@ public class NotesPreferenceActivity extends PreferenceActivity { } editor.commit(); - // clean up local gtask related info + // 清除本地GTask相关信息 new Thread(new Runnable() { public void run() { ContentValues values = new ContentValues(); @@ -340,12 +379,18 @@ public class NotesPreferenceActivity extends PreferenceActivity { }).start(); } + /** + * 获取当前同步账户名 + */ public static String getSyncAccountName(Context context) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); return settings.getString(PREFERENCE_SYNC_ACCOUNT_NAME, ""); } + /** + * 设置上次同步时间 + */ public static void setLastSyncTime(Context context, long time) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); @@ -354,29 +399,36 @@ public class NotesPreferenceActivity extends PreferenceActivity { editor.commit(); } + /** + * 获取上次同步时间 + */ public static long getLastSyncTime(Context context) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); return settings.getLong(PREFERENCE_LAST_SYNC_TIME, 0); } + /** + * GTask同步服务广播接收器 + */ private class GTaskReceiver extends BroadcastReceiver { - @Override public void onReceive(Context context, Intent intent) { - refreshUI(); + refreshUI(); // 刷新UI if (intent.getBooleanExtra(GTaskSyncService.GTASK_SERVICE_BROADCAST_IS_SYNCING, false)) { + // 更新同步进度显示 TextView syncStatus = (TextView) findViewById(R.id.prefenerece_sync_status_textview); syncStatus.setText(intent .getStringExtra(GTaskSyncService.GTASK_SERVICE_BROADCAST_PROGRESS_MSG)); } - } } + @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: + // 点击返回按钮,返回到笔记列表Activity Intent intent = new Intent(this, NotesListActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); @@ -385,4 +437,4 @@ public class NotesPreferenceActivity extends PreferenceActivity { return false; } } -} +} \ No newline at end of file