From 1374eb0388c1a352ea904c4c0d8ce60b55fe2967 Mon Sep 17 00:00:00 2001 From: lyt <1905191745@qq.com> Date: Sat, 6 Jan 2024 12:15:38 +0800 Subject: [PATCH] lyt --- .../micode/notes/ui/AlarmAlertActivity.java | 57 +- .../micode/notes/ui/AlarmInitReceiver.java | 22 +- .../net/micode/notes/ui/AlarmReceiver.java | 6 +- .../net/micode/notes/ui/DateTimePicker.java | 50 +- .../micode/notes/ui/DateTimePickerDialog.java | 50 +- .../net/micode/notes/ui/DropdownMenu.java | 23 +- .../micode/notes/ui/FoldersListAdapter.java | 20 +- .../net/micode/notes/ui/NoteEditActivity.java | 84 +- .../net/micode/notes/ui/NoteEditText.java | 200 ++- .../net/micode/notes/ui/NoteItemData.java | 105 +- .../micode/notes/ui/NotesListActivity.java | 1138 +++++++++-------- .../net/micode/notes/ui/NotesListAdapter.java | 17 + .../net/micode/notes/ui/NotesListItem.java | 44 +- .../notes/ui/NotesPreferenceActivity.java | 420 +++--- 14 files changed, 1188 insertions(+), 1048 deletions(-) diff --git a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/AlarmAlertActivity.java b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/AlarmAlertActivity.java index 85723be..5a3aa97 100644 --- a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/AlarmAlertActivity.java +++ b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/AlarmAlertActivity.java @@ -41,10 +41,10 @@ import java.io.IOException; public class AlarmAlertActivity extends Activity implements OnClickListener, OnDismissListener { - private long mNoteId; - private String mSnippet; - private static final int SNIPPET_PREW_MAX_LEN = 60; - MediaPlayer mPlayer; + private long mNoteId; // 提醒记录的ID + private String mSnippet; // 提醒记录的摘要 + private static final int SNIPPET_PREW_MAX_LEN = 60; // 摘要预览的最大长度 + MediaPlayer mPlayer; // 媒体播放器 @Override protected void onCreate(Bundle savedInstanceState) { @@ -64,20 +64,20 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD Intent intent = getIntent(); try { - mNoteId = Long.valueOf(intent.getData().getPathSegments().get(1)); - mSnippet = DataUtils.getSnippetById(this.getContentResolver(), mNoteId); + mNoteId = Long.valueOf(intent.getData().getPathSegments().get(1)); // 从Intent中获取提醒记录的ID + mSnippet = DataUtils.getSnippetById(this.getContentResolver(), mNoteId); // 根据ID从数据库中获取提醒记录的摘要 mSnippet = mSnippet.length() > SNIPPET_PREW_MAX_LEN ? mSnippet.substring(0, SNIPPET_PREW_MAX_LEN) + getResources().getString(R.string.notelist_string_info) - : mSnippet; + : mSnippet; // 如果摘要超过预设的最大长度,则截断并添加附加信息 } catch (IllegalArgumentException e) { e.printStackTrace(); return; } - mPlayer = new MediaPlayer(); - if (DataUtils.visibleInNoteDatabase(getContentResolver(), mNoteId, Notes.TYPE_NOTE)) { - showActionDialog(); - playAlarmSound(); + mPlayer = new MediaPlayer(); // 创建媒体播放器实例 + if (DataUtils.visibleInNoteDatabase(getContentResolver(), mNoteId, Notes.TYPE_NOTE)) { // 检查提醒记录是否在数据库中可见 + showActionDialog(); // 显示操作对话框 + playAlarmSound(); // 播放闹钟声音 } else { finish(); } @@ -85,25 +85,25 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD private boolean isScreenOn() { PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); - return pm.isScreenOn(); + return pm.isScreenOn(); // 检查屏幕是否亮起 } private void playAlarmSound() { - Uri url = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_ALARM); + Uri url = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_ALARM); // 获取闹钟铃声的URI int silentModeStreams = Settings.System.getInt(getContentResolver(), - Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0); + Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0); // 获取受静音模式影响的音频流 if ((silentModeStreams & (1 << AudioManager.STREAM_ALARM)) != 0) { - mPlayer.setAudioStreamType(silentModeStreams); + mPlayer.setAudioStreamType(silentModeStreams); // 设置媒体播放器的音频流类型 } else { mPlayer.setAudioStreamType(AudioManager.STREAM_ALARM); } try { - mPlayer.setDataSource(this, url); - mPlayer.prepare(); - mPlayer.setLooping(true); - mPlayer.start(); + mPlayer.setDataSource(this, url); // 设置媒体播放器的数据源 + mPlayer.prepare(); // 准备媒体播放器 + mPlayer.setLooping(true); // 设置循环播放 + mPlayer.start(); // 开始播放 } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); @@ -122,12 +122,12 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD private void showActionDialog() { AlertDialog.Builder dialog = new AlertDialog.Builder(this); dialog.setTitle(R.string.app_name); - dialog.setMessage(mSnippet); - dialog.setPositiveButton(R.string.notealert_ok, this); + dialog.setMessage(mSnippet); // 设置对话框的消息内容为提醒记录的摘要 + dialog.setPositiveButton(R.string.notealert_ok, this); // 设置对话框的确定按钮 if (isScreenOn()) { - dialog.setNegativeButton(R.string.notealert_enter, this); + dialog.setNegativeButton(R.string.notealert_enter, this); // 设置对话框的取消按钮 } - dialog.show().setOnDismissListener(this); + dialog.show().setOnDismissListener(this); // 显示对话框,并设置对话框的消失监听器 } public void onClick(DialogInterface dialog, int which) { @@ -136,7 +136,7 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD Intent intent = new Intent(this, NoteEditActivity.class); intent.setAction(Intent.ACTION_VIEW); intent.putExtra(Intent.EXTRA_UID, mNoteId); - startActivity(intent); + startActivity(intent); // 启动编辑提醒记录的界面 break; default: break; @@ -144,15 +144,16 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD } public void onDismiss(DialogInterface dialog) { - stopAlarmSound(); - finish(); + stopAlarmSound(); // 停止闹钟声音 + finish(); // 结束当前Activity } private void stopAlarmSound() { if (mPlayer != null) { - mPlayer.stop(); - mPlayer.release(); + mPlayer.stop(); // 停止播放 + mPlayer.release(); // 释放资源 mPlayer = null; } } } + diff --git a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/AlarmInitReceiver.java b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/AlarmInitReceiver.java index f221202..b609331 100644 --- a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/AlarmInitReceiver.java +++ b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/AlarmInitReceiver.java @@ -31,8 +31,8 @@ import net.micode.notes.data.Notes.NoteColumns; public class AlarmInitReceiver extends BroadcastReceiver { private static final String [] PROJECTION = new String [] { - NoteColumns.ID, - NoteColumns.ALERTED_DATE + NoteColumns.ID, // 提醒记录的ID + NoteColumns.ALERTED_DATE // 提醒时间 }; private static final int COLUMN_ID = 0; @@ -40,7 +40,9 @@ public class AlarmInitReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { - long currentDate = System.currentTimeMillis(); + long currentDate = System.currentTimeMillis(); // 获取当前时间 + + // 查询数据库,获取需要提醒的记录 Cursor c = context.getContentResolver().query(Notes.CONTENT_NOTE_URI, PROJECTION, NoteColumns.ALERTED_DATE + ">? AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE, @@ -50,16 +52,16 @@ public class AlarmInitReceiver extends BroadcastReceiver { if (c != null) { if (c.moveToFirst()) { do { - long alertDate = c.getLong(COLUMN_ALERTED_DATE); - Intent sender = new Intent(context, AlarmReceiver.class); - sender.setData(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, c.getLong(COLUMN_ID))); - PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, sender, 0); - AlarmManager alermManager = (AlarmManager) context - .getSystemService(Context.ALARM_SERVICE); - alermManager.set(AlarmManager.RTC_WAKEUP, alertDate, pendingIntent); + long alertDate = c.getLong(COLUMN_ALERTED_DATE); // 获取提醒时间 + Intent sender = new Intent(context, AlarmReceiver.class); // 创建Intent对象,用于触发AlarmReceiver类 + sender.setData(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, c.getLong(COLUMN_ID))); // 设置Intent的数据,以便在AlarmReceiver类中获取相应的提醒记录 + PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, sender, 0); // 创建待定的广播Intent + AlarmManager alermManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); // 获取AlarmManager实例 + alermManager.set(AlarmManager.RTC_WAKEUP, alertDate, pendingIntent); // 设置闹钟提醒 } while (c.moveToNext()); } c.close(); } } } + diff --git a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/AlarmReceiver.java b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/AlarmReceiver.java index 54e503b..e35893b 100644 --- a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/AlarmReceiver.java +++ b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/AlarmReceiver.java @@ -23,8 +23,8 @@ import android.content.Intent; public class AlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { - intent.setClass(context, AlarmAlertActivity.class); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - context.startActivity(intent); + intent.setClass(context, AlarmAlertActivity.class);//设置要启动的Activity类 + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//addFlags()方法用于添加启动标志 + context.startActivity(intent);//用于启动Activity } } diff --git a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/DateTimePicker.java b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/DateTimePicker.java index 496b0cd..13247d9 100644 --- a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/DateTimePicker.java +++ b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/DateTimePicker.java @@ -30,55 +30,82 @@ import android.widget.NumberPicker; public class DateTimePicker extends FrameLayout { + // 默认启用状态 private static final boolean DEFAULT_ENABLE_STATE = true; + // 一天中的小时数 private static final int HOURS_IN_HALF_DAY = 12; private static final int HOURS_IN_ALL_DAY = 24; + + // 一周中的天数 private static final int DAYS_IN_ALL_WEEK = 7; + + // 日期选择器的最小和最大值 private static final int DATE_SPINNER_MIN_VAL = 0; private static final int DATE_SPINNER_MAX_VAL = DAYS_IN_ALL_WEEK - 1; + + // 24小时制小时选择器的最小和最大值 private static final int HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW = 0; private static final int HOUR_SPINNER_MAX_VAL_24_HOUR_VIEW = 23; + + // 12小时制小时选择器的最小和最大值 private static final int HOUR_SPINNER_MIN_VAL_12_HOUR_VIEW = 1; private static final int HOUR_SPINNER_MAX_VAL_12_HOUR_VIEW = 12; + + // 分钟选择器的最小和最大值 private static final int MINUT_SPINNER_MIN_VAL = 0; private static final int MINUT_SPINNER_MAX_VAL = 59; + + // 上午/下午选择器的最小和最大值 private static final int AMPM_SPINNER_MIN_VAL = 0; private static final int AMPM_SPINNER_MAX_VAL = 1; + // 日期选择器、小时选择器、分钟选择器和上午/下午选择器 private final NumberPicker mDateSpinner; private final NumberPicker mHourSpinner; private final NumberPicker mMinuteSpinner; private final NumberPicker mAmPmSpinner; + + // 当前日期 private Calendar mDate; + // 显示的日期值 private String[] mDateDisplayValues = new String[DAYS_IN_ALL_WEEK]; + // 是否为上午 private boolean mIsAm; + // 是否为24小时制 private boolean mIs24HourView; + // 是否启用控件 private boolean mIsEnabled = DEFAULT_ENABLE_STATE; + // 是否正在初始化 private boolean mInitialising; + // 日期时间变化监听器 private OnDateTimeChangedListener mOnDateTimeChangedListener; + // 日期选择器值改变监听器 private NumberPicker.OnValueChangeListener mOnDateChangedListener = new NumberPicker.OnValueChangeListener() { @Override public void onValueChange(NumberPicker picker, int oldVal, int newVal) { + // 根据新旧值的差值更新日期 mDate.add(Calendar.DAY_OF_YEAR, newVal - oldVal); updateDateControl(); onDateTimeChanged(); } }; + // 小时选择器值改变监听器 private NumberPicker.OnValueChangeListener mOnHourChangedListener = new NumberPicker.OnValueChangeListener() { @Override public void onValueChange(NumberPicker picker, int oldVal, int newVal) { boolean isDateChanged = false; Calendar cal = Calendar.getInstance(); if (!mIs24HourView) { + // 处理12小时制的上午/下午切换 if (!mIsAm && oldVal == HOURS_IN_HALF_DAY - 1 && newVal == HOURS_IN_HALF_DAY) { cal.setTimeInMillis(mDate.getTimeInMillis()); cal.add(Calendar.DAY_OF_YEAR, 1); @@ -88,12 +115,14 @@ public class DateTimePicker extends FrameLayout { cal.add(Calendar.DAY_OF_YEAR, -1); isDateChanged = true; } + // 处理上午/下午切换 if (oldVal == HOURS_IN_HALF_DAY - 1 && newVal == HOURS_IN_HALF_DAY || oldVal == HOURS_IN_HALF_DAY && newVal == HOURS_IN_HALF_DAY - 1) { mIsAm = !mIsAm; updateAmPmControl(); } } else { + // 处理24小时制的日期切换 if (oldVal == HOURS_IN_ALL_DAY - 1 && newVal == 0) { cal.setTimeInMillis(mDate.getTimeInMillis()); cal.add(Calendar.DAY_OF_YEAR, 1); @@ -104,6 +133,7 @@ public class DateTimePicker extends FrameLayout { isDateChanged = true; } } + // 更新小时 int newHour = mHourSpinner.getValue() % HOURS_IN_HALF_DAY + (mIsAm ? 0 : HOURS_IN_HALF_DAY); mDate.set(Calendar.HOUR_OF_DAY, newHour); onDateTimeChanged(); @@ -115,12 +145,14 @@ public class DateTimePicker extends FrameLayout { } }; + // 分钟选择器值改变监听器 private NumberPicker.OnValueChangeListener mOnMinuteChangedListener = new NumberPicker.OnValueChangeListener() { @Override public void onValueChange(NumberPicker picker, int oldVal, int newVal) { int minValue = mMinuteSpinner.getMinValue(); int maxValue = mMinuteSpinner.getMaxValue(); int offset = 0; + // 处理分钟的进位和借位 if (oldVal == maxValue && newVal == minValue) { offset += 1; } else if (oldVal == minValue && newVal == maxValue) { @@ -144,9 +176,11 @@ public class DateTimePicker extends FrameLayout { } }; + // 上午/下午选择器值改变监听器 private NumberPicker.OnValueChangeListener mOnAmPmChangedListener = new NumberPicker.OnValueChangeListener() { @Override public void onValueChange(NumberPicker picker, int oldVal, int newVal) { + // 切换上午/下午 mIsAm = !mIsAm; if (mIsAm) { mDate.add(Calendar.HOUR_OF_DAY, -HOURS_IN_HALF_DAY); @@ -158,11 +192,13 @@ public class DateTimePicker extends FrameLayout { } }; + // 日期时间变化监听器接口 public interface OnDateTimeChangedListener { void onDateTimeChanged(DateTimePicker view, int year, int month, int dayOfMonth, int hourOfDay, int minute); } + // 构造函数 public DateTimePicker(Context context) { this(context, System.currentTimeMillis()); } @@ -178,19 +214,24 @@ public class DateTimePicker extends FrameLayout { mIsAm = getCurrentHourOfDay() >= HOURS_IN_HALF_DAY; inflate(context, R.layout.datetime_picker, this); + // 初始化日期选择器 mDateSpinner = (NumberPicker) findViewById(R.id.date); mDateSpinner.setMinValue(DATE_SPINNER_MIN_VAL); mDateSpinner.setMaxValue(DATE_SPINNER_MAX_VAL); mDateSpinner.setOnValueChangedListener(mOnDateChangedListener); + // 初始化小时选择器 mHourSpinner = (NumberPicker) findViewById(R.id.hour); mHourSpinner.setOnValueChangedListener(mOnHourChangedListener); + + // 初始化分钟选择器 mMinuteSpinner = (NumberPicker) findViewById(R.id.minute); mMinuteSpinner.setMinValue(MINUT_SPINNER_MIN_VAL); mMinuteSpinner.setMaxValue(MINUT_SPINNER_MAX_VAL); mMinuteSpinner.setOnLongPressUpdateInterval(100); mMinuteSpinner.setOnValueChangedListener(mOnMinuteChangedListener); + // 初始化上午/下午选择器 String[] stringsForAmPm = new DateFormatSymbols().getAmPmStrings(); mAmPmSpinner = (NumberPicker) findViewById(R.id.amPm); mAmPmSpinner.setMinValue(AMPM_SPINNER_MIN_VAL); @@ -198,22 +239,24 @@ public class DateTimePicker extends FrameLayout { mAmPmSpinner.setDisplayedValues(stringsForAmPm); mAmPmSpinner.setOnValueChangedListener(mOnAmPmChangedListener); - // update controls to initial state + // 更新控件的初始状态 updateDateControl(); updateHourControl(); updateAmPmControl(); + // 设置是否为24小时制 set24HourView(is24HourView); - // set to current time + // 设置当前时间 setCurrentDate(date); + // 设置是否启用控件 setEnabled(isEnabled()); - // set the content descriptions mInitialising = false; } + // 设置控件是否启用 @Override public void setEnabled(boolean enabled) { if (mIsEnabled == enabled) { @@ -226,6 +269,7 @@ public class DateTimePicker extends FrameLayout { mAmPmSpinner.setEnabled(enabled); mIsEnabled = enabled; } +} @Override public boolean isEnabled() { diff --git a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/DateTimePickerDialog.java b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/DateTimePickerDialog.java index 2c47ba4..23d7fe3 100644 --- a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/DateTimePickerDialog.java +++ b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/DateTimePickerDialog.java @@ -31,10 +31,10 @@ import android.text.format.DateUtils; public class DateTimePickerDialog extends AlertDialog implements OnClickListener { - private Calendar mDate = Calendar.getInstance(); - private boolean mIs24HourView; - private OnDateTimeSetListener mOnDateTimeSetListener; - private DateTimePicker mDateTimePicker; + private Calendar mDate = Calendar.getInstance(); // 日历对象,用于存储日期和时间 + private boolean mIs24HourView; // 是否使用24小时制 + private OnDateTimeSetListener mOnDateTimeSetListener; // 日期时间设置监听器 + private DateTimePicker mDateTimePicker; // 日期时间选择器 public interface OnDateTimeSetListener { void OnDateTimeSet(AlertDialog dialog, long date); @@ -42,34 +42,34 @@ public class DateTimePickerDialog extends AlertDialog implements OnClickListener public DateTimePickerDialog(Context context, long date) { super(context); - mDateTimePicker = new DateTimePicker(context); - setView(mDateTimePicker); + mDateTimePicker = new DateTimePicker(context); // 创建日期时间选择器 + setView(mDateTimePicker); // 将日期时间选择器设置为对话框的视图 mDateTimePicker.setOnDateTimeChangedListener(new OnDateTimeChangedListener() { public void onDateTimeChanged(DateTimePicker view, int year, int month, int dayOfMonth, int hourOfDay, int minute) { - mDate.set(Calendar.YEAR, year); - mDate.set(Calendar.MONTH, month); - mDate.set(Calendar.DAY_OF_MONTH, dayOfMonth); - mDate.set(Calendar.HOUR_OF_DAY, hourOfDay); - mDate.set(Calendar.MINUTE, minute); - updateTitle(mDate.getTimeInMillis()); + mDate.set(Calendar.YEAR, year); // 设置年份 + mDate.set(Calendar.MONTH, month); // 设置月份 + mDate.set(Calendar.DAY_OF_MONTH, dayOfMonth); // 设置日期 + mDate.set(Calendar.HOUR_OF_DAY, hourOfDay); // 设置小时 + mDate.set(Calendar.MINUTE, minute); // 设置分钟 + updateTitle(mDate.getTimeInMillis()); // 更新对话框标题 } }); - mDate.setTimeInMillis(date); - mDate.set(Calendar.SECOND, 0); - mDateTimePicker.setCurrentDate(mDate.getTimeInMillis()); - setButton(context.getString(R.string.datetime_dialog_ok), this); - setButton2(context.getString(R.string.datetime_dialog_cancel), (OnClickListener)null); - set24HourView(DateFormat.is24HourFormat(this.getContext())); - updateTitle(mDate.getTimeInMillis()); + mDate.setTimeInMillis(date); // 设置初始日期时间 + mDate.set(Calendar.SECOND, 0); // 将秒数设置为0 + mDateTimePicker.setCurrentDate(mDate.getTimeInMillis()); // 设置日期时间选择器的当前日期时间 + setButton(context.getString(R.string.datetime_dialog_ok), this); // 设置确定按钮 + setButton2(context.getString(R.string.datetime_dialog_cancel), (OnClickListener)null); // 设置取消按钮 + set24HourView(DateFormat.is24HourFormat(this.getContext())); // 根据系统设置确定是否使用24小时制 + updateTitle(mDate.getTimeInMillis()); // 更新对话框标题 } public void set24HourView(boolean is24HourView) { - mIs24HourView = is24HourView; + mIs24HourView = is24HourView; // 设置是否使用24小时制 } public void setOnDateTimeSetListener(OnDateTimeSetListener callBack) { - mOnDateTimeSetListener = callBack; + mOnDateTimeSetListener = callBack; // 设置日期时间设置监听器 } private void updateTitle(long date) { @@ -77,14 +77,14 @@ public class DateTimePickerDialog extends AlertDialog implements OnClickListener DateUtils.FORMAT_SHOW_YEAR | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_TIME; - flag |= mIs24HourView ? DateUtils.FORMAT_24HOUR : DateUtils.FORMAT_24HOUR; - setTitle(DateUtils.formatDateTime(this.getContext(), date, flag)); + flag |= mIs24HourView ? DateUtils.FORMAT_24HOUR : DateUtils.FORMAT_24HOUR; // 根据是否使用24小时制设置标志位 + setTitle(DateUtils.formatDateTime(this.getContext(), date, flag)); // 根据日期时间和标志位设置对话框标题 } public void onClick(DialogInterface arg0, int arg1) { if (mOnDateTimeSetListener != null) { - mOnDateTimeSetListener.OnDateTimeSet(this, mDate.getTimeInMillis()); + mOnDateTimeSetListener.OnDateTimeSet(this, mDate.getTimeInMillis()); // 触发日期时间设置监听器 } } -} \ No newline at end of file +} diff --git a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/DropdownMenu.java b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/DropdownMenu.java index 613dc74..6e81766 100644 --- a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/DropdownMenu.java +++ b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/DropdownMenu.java @@ -28,34 +28,35 @@ import android.widget.PopupMenu.OnMenuItemClickListener; import net.micode.notes.R; public class DropdownMenu { - private Button mButton; - private PopupMenu mPopupMenu; - private Menu mMenu; + private Button mButton; // 下拉菜单的按钮 + private PopupMenu mPopupMenu; // 弹出菜单 + private Menu mMenu; // 菜单 public DropdownMenu(Context context, Button button, int menuId) { mButton = button; - mButton.setBackgroundResource(R.drawable.dropdown_icon); - mPopupMenu = new PopupMenu(context, mButton); - mMenu = mPopupMenu.getMenu(); - mPopupMenu.getMenuInflater().inflate(menuId, mMenu); + mButton.setBackgroundResource(R.drawable.dropdown_icon); // 设置按钮的背景图像为下拉图标 + mPopupMenu = new PopupMenu(context, mButton); // 创建弹出菜单 + mMenu = mPopupMenu.getMenu(); // 获取菜单 + mPopupMenu.getMenuInflater().inflate(menuId, mMenu); // 填充菜单项 mButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { - mPopupMenu.show(); + mPopupMenu.show(); // 点击按钮时显示弹出菜单 } }); } public void setOnDropdownMenuItemClickListener(OnMenuItemClickListener listener) { if (mPopupMenu != null) { - mPopupMenu.setOnMenuItemClickListener(listener); + mPopupMenu.setOnMenuItemClickListener(listener); // 设置菜单项点击监听器 } } public MenuItem findItem(int id) { - return mMenu.findItem(id); + return mMenu.findItem(id); // 查找指定ID的菜单项 } public void setTitle(CharSequence title) { - mButton.setText(title); + mButton.setText(title); // 设置按钮的文本 } } + diff --git a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/FoldersListAdapter.java b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/FoldersListAdapter.java index 96b77da..5fbba82 100644 --- a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/FoldersListAdapter.java +++ b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/FoldersListAdapter.java @@ -31,12 +31,12 @@ import net.micode.notes.data.Notes.NoteColumns; public class FoldersListAdapter extends CursorAdapter { public static final String [] PROJECTION = { - NoteColumns.ID, - NoteColumns.SNIPPET + NoteColumns.ID, // 列索引0:ID列 + NoteColumns.SNIPPET // 列索引1:SNIPPET列 }; - public static final int ID_COLUMN = 0; - public static final int NAME_COLUMN = 1; + public static final int ID_COLUMN = 0; // ID列的索引 + public static final int NAME_COLUMN = 1; // 名称列的索引 public FoldersListAdapter(Context context, Cursor c) { super(context, c); @@ -45,7 +45,7 @@ public class FoldersListAdapter extends CursorAdapter { @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { - return new FolderListItem(context); + return new FolderListItem(context); // 创建一个新的FolderListItem视图 } @Override @@ -53,14 +53,14 @@ public class FoldersListAdapter extends CursorAdapter { if (view instanceof FolderListItem) { String folderName = (cursor.getLong(ID_COLUMN) == Notes.ID_ROOT_FOLDER) ? context .getString(R.string.menu_move_parent_folder) : cursor.getString(NAME_COLUMN); - ((FolderListItem) view).bind(folderName); + ((FolderListItem) view).bind(folderName); // 将文件夹名称绑定到视图 } } public String getFolderName(Context context, int position) { Cursor cursor = (Cursor) getItem(position); return (cursor.getLong(ID_COLUMN) == Notes.ID_ROOT_FOLDER) ? context - .getString(R.string.menu_move_parent_folder) : cursor.getString(NAME_COLUMN); + .getString(R.string.menu_move_parent_folder) : cursor.getString(NAME_COLUMN); // 获取指定位置的文件夹名称 } private class FolderListItem extends LinearLayout { @@ -68,13 +68,13 @@ public class FoldersListAdapter extends CursorAdapter { public FolderListItem(Context context) { super(context); - inflate(context, R.layout.folder_list_item, this); + inflate(context, R.layout.folder_list_item, this); // 填充自定义视图 mName = (TextView) findViewById(R.id.tv_folder_name); } public void bind(String name) { - mName.setText(name); + mName.setText(name); // 设置文件夹名称 } } - } + diff --git a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NoteEditActivity.java b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NoteEditActivity.java index 7cf5b67..9fac8a0 100644 --- a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NoteEditActivity.java +++ b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NoteEditActivity.java @@ -80,83 +80,83 @@ import java.util.regex.Pattern; public class NoteEditActivity extends Activity implements OnClickListener, NoteSettingChangedListener, OnTextViewChangeListener { private class HeadViewHolder { - public TextView tvModified; + public TextView tvModified; // 修改日期 - public ImageView ivAlertIcon; + public ImageView ivAlertIcon; // 提醒图标 - public TextView tvAlertDate; + public TextView tvAlertDate; // 提醒日期 - public ImageView ibSetBgColor; - public EditText editText; - public TextView textView; + public ImageView ibSetBgColor; // 设置背景颜色按钮 + public EditText editText; // 编辑框 + public TextView textView; // 文本视图 } private static final Map sBgSelectorBtnsMap = new HashMap(); static { - sBgSelectorBtnsMap.put(R.id.iv_bg_yellow, ResourceParser.YELLOW); - sBgSelectorBtnsMap.put(R.id.iv_bg_red, ResourceParser.RED); - sBgSelectorBtnsMap.put(R.id.iv_bg_blue, ResourceParser.BLUE); - sBgSelectorBtnsMap.put(R.id.iv_bg_green, ResourceParser.GREEN); - sBgSelectorBtnsMap.put(R.id.iv_bg_white, ResourceParser.WHITE); + sBgSelectorBtnsMap.put(R.id.iv_bg_yellow, ResourceParser.YELLOW); // 黄色背景按钮 + sBgSelectorBtnsMap.put(R.id.iv_bg_red, ResourceParser.RED); // 红色背景按钮 + sBgSelectorBtnsMap.put(R.id.iv_bg_blue, ResourceParser.BLUE); // 蓝色背景按钮 + sBgSelectorBtnsMap.put(R.id.iv_bg_green, ResourceParser.GREEN); // 绿色背景按钮 + sBgSelectorBtnsMap.put(R.id.iv_bg_white, ResourceParser.WHITE); // 白色背景按钮 } private static final Map sBgSelectorSelectionMap = new HashMap(); static { - sBgSelectorSelectionMap.put(ResourceParser.YELLOW, R.id.iv_bg_yellow_select); - sBgSelectorSelectionMap.put(ResourceParser.RED, R.id.iv_bg_red_select); - sBgSelectorSelectionMap.put(ResourceParser.BLUE, R.id.iv_bg_blue_select); - sBgSelectorSelectionMap.put(ResourceParser.GREEN, R.id.iv_bg_green_select); - sBgSelectorSelectionMap.put(ResourceParser.WHITE, R.id.iv_bg_white_select); + sBgSelectorSelectionMap.put(ResourceParser.YELLOW, R.id.iv_bg_yellow_select); // 选择的黄色背景按钮 + sBgSelectorSelectionMap.put(ResourceParser.RED, R.id.iv_bg_red_select); // 选择的红色背景按钮 + sBgSelectorSelectionMap.put(ResourceParser.BLUE, R.id.iv_bg_blue_select); // 选择的蓝色背景按钮 + sBgSelectorSelectionMap.put(ResourceParser.GREEN, R.id.iv_bg_green_select); // 选择的绿色背景按钮 + sBgSelectorSelectionMap.put(ResourceParser.WHITE, R.id.iv_bg_white_select); // 选择的白色背景按钮 } private static final Map sFontSizeBtnsMap = new HashMap(); static { - sFontSizeBtnsMap.put(R.id.ll_font_large, ResourceParser.TEXT_LARGE); - sFontSizeBtnsMap.put(R.id.ll_font_small, ResourceParser.TEXT_SMALL); - sFontSizeBtnsMap.put(R.id.ll_font_normal, ResourceParser.TEXT_MEDIUM); - sFontSizeBtnsMap.put(R.id.ll_font_super, ResourceParser.TEXT_SUPER); + sFontSizeBtnsMap.put(R.id.ll_font_large, ResourceParser.TEXT_LARGE); // 大号字体按钮 + sFontSizeBtnsMap.put(R.id.ll_font_small, ResourceParser.TEXT_SMALL); // 小号字体按钮 + sFontSizeBtnsMap.put(R.id.ll_font_normal, ResourceParser.TEXT_MEDIUM); // 中号字体按钮 + sFontSizeBtnsMap.put(R.id.ll_font_super, ResourceParser.TEXT_SUPER); // 超大号字体按钮 } private static final Map sFontSelectorSelectionMap = new HashMap(); static { - sFontSelectorSelectionMap.put(ResourceParser.TEXT_LARGE, R.id.iv_large_select); - sFontSelectorSelectionMap.put(ResourceParser.TEXT_SMALL, R.id.iv_small_select); - sFontSelectorSelectionMap.put(ResourceParser.TEXT_MEDIUM, R.id.iv_medium_select); - sFontSelectorSelectionMap.put(ResourceParser.TEXT_SUPER, R.id.iv_super_select); + sFontSelectorSelectionMap.put(ResourceParser.TEXT_LARGE, R.id.iv_large_select); // 选择的大号字体按钮 + sFontSelectorSelectionMap.put(ResourceParser.TEXT_SMALL, R.id.iv_small_select); // 选择的小号字体按钮 + sFontSelectorSelectionMap.put(ResourceParser.TEXT_MEDIUM, R.id.iv_medium_select); // 选择的中号字体按钮 + sFontSelectorSelectionMap.put(ResourceParser.TEXT_SUPER, R.id.iv_super_select); // 选择的超大号字体按钮 } private static final String TAG = "NoteEditActivity"; - private HeadViewHolder mNoteHeaderHolder; + private HeadViewHolder mNoteHeaderHolder; // 头部视图持有者 - private View mHeadViewPanel; + private View mHeadViewPanel; // 头部视图面板 - private View mNoteBgColorSelector; + private View mNoteBgColorSelector; // 笔记背景颜色选择器 - private View mFontSizeSelector; + private View mFontSizeSelector; // 字体大小选择器 - private EditText mNoteEditor; + private EditText mNoteEditor; // 笔记编辑器 - private View mNoteEditorPanel; + private View mNoteEditorPanel; // 笔记编辑器面板 - private WorkingNote mWorkingNote; + private WorkingNote mWorkingNote; // 当前工作笔记 - private SharedPreferences mSharedPrefs; - private int mFontSizeId; + private SharedPreferences mSharedPrefs; // 共享首选项 + private int mFontSizeId; // 字体大小ID - private static final String PREFERENCE_FONT_SIZE = "pref_font_size"; + private static final String PREFERENCE_FONT_SIZE = "pref_font_size"; // 字体大小首选项 - private static final int SHORTCUT_ICON_TITLE_MAX_LEN = 10; + private static final int SHORTCUT_ICON_TITLE_MAX_LEN = 10; // 快捷图标标题最大长度 - public static final String TAG_CHECKED = String.valueOf('\u221A'); - public static final String TAG_UNCHECKED = String.valueOf('\u25A1'); + public static final String TAG_CHECKED = String.valueOf('\u221A'); // 选中标签 + public static final String TAG_UNCHECKED = String.valueOf('\u25A1'); // 未选中标签 - private LinearLayout mEditTextList; + private LinearLayout mEditTextList; // 编辑文本列表 - private String mUserQuery; - private Pattern mPattern; - private EditText editText; - private TextView textView; + private String mUserQuery; // 用户查询 + private Pattern mPattern; // 模式 + private EditText editText; // 编辑框 + private TextView textView; // 文本视图 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); diff --git a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NoteEditText.java b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NoteEditText.java index 2afe2a8..55a8322 100644 --- a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NoteEditText.java +++ b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NoteEditText.java @@ -99,119 +99,117 @@ public class NoteEditText extends EditText { // TODO Auto-generated constructor stub } - @Override - public boolean onTouchEvent(MotionEvent event) { - switch (event.getAction()) { - case MotionEvent.ACTION_DOWN: - - int x = (int) event.getX(); - int y = (int) event.getY(); - x -= getTotalPaddingLeft(); - y -= getTotalPaddingTop(); - x += getScrollX(); - y += getScrollY(); - - Layout layout = getLayout(); - int line = layout.getLineForVertical(y); - int off = layout.getOffsetForHorizontal(line, x); - Selection.setSelection(getText(), off); - break; - } - - return super.onTouchEvent(event); + @Override +public boolean onTouchEvent(MotionEvent event) { + // 处理触摸事件,用于设置光标位置 + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + int x = (int) event.getX(); + int y = (int) event.getY(); + x -= getTotalPaddingLeft(); + y -= getTotalPaddingTop(); + x += getScrollX(); + y += getScrollY(); + Layout layout = getLayout(); + int line = layout.getLineForVertical(y); + int off = layout.getOffsetForHorizontal(line, x); + Selection.setSelection(getText(), off); + break; } + return super.onTouchEvent(event); +} - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - switch (keyCode) { - case KeyEvent.KEYCODE_ENTER: - if (mOnTextViewChangeListener != null) { - return false; - } - break; - case KeyEvent.KEYCODE_DEL: - mSelectionStartBeforeDelete = getSelectionStart(); - break; - default: - break; - } - return super.onKeyDown(keyCode, event); +@Override +public boolean onKeyDown(int keyCode, KeyEvent event) { + // 处理按键按下事件 + switch (keyCode) { + case KeyEvent.KEYCODE_ENTER: + if (mOnTextViewChangeListener != null) { + return false; + } + break; + case KeyEvent.KEYCODE_DEL: + mSelectionStartBeforeDelete = getSelectionStart(); + break; + default: + break; } + return super.onKeyDown(keyCode, event); +} - @Override - public boolean onKeyUp(int keyCode, KeyEvent event) { - switch(keyCode) { - case KeyEvent.KEYCODE_DEL: - if (mOnTextViewChangeListener != null) { - if (0 == mSelectionStartBeforeDelete && mIndex != 0) { - mOnTextViewChangeListener.onEditTextDelete(mIndex, getText().toString()); - return true; - } - } else { - Log.d(TAG, "OnTextViewChangeListener was not seted"); - } - break; - case KeyEvent.KEYCODE_ENTER: - if (mOnTextViewChangeListener != null) { - int selectionStart = getSelectionStart(); - String text = getText().subSequence(selectionStart, length()).toString(); - setText(getText().subSequence(0, selectionStart)); - mOnTextViewChangeListener.onEditTextEnter(mIndex + 1, text); - } else { - Log.d(TAG, "OnTextViewChangeListener was not seted"); +@Override +public boolean onKeyUp(int keyCode, KeyEvent event) { + // 处理按键释放事件 + switch(keyCode) { + case KeyEvent.KEYCODE_DEL: + if (mOnTextViewChangeListener != null) { + if (0 == mSelectionStartBeforeDelete && mIndex != 0) { + mOnTextViewChangeListener.onEditTextDelete(mIndex, getText().toString()); + return true; } - break; - default: - break; - } - return super.onKeyUp(keyCode, event); - } - - @Override - protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { - if (mOnTextViewChangeListener != null) { - if (!focused && TextUtils.isEmpty(getText())) { - mOnTextViewChangeListener.onTextChange(mIndex, false); } else { - mOnTextViewChangeListener.onTextChange(mIndex, true); + Log.d(TAG, "OnTextViewChangeListener was not seted"); } - } - super.onFocusChanged(focused, direction, previouslyFocusedRect); + break; + case KeyEvent.KEYCODE_ENTER: + if (mOnTextViewChangeListener != null) { + int selectionStart = getSelectionStart(); + String text = getText().subSequence(selectionStart, length()).toString(); + setText(getText().subSequence(0, selectionStart)); + mOnTextViewChangeListener.onEditTextEnter(mIndex + 1, text); + } else { + Log.d(TAG, "OnTextViewChangeListener was not seted"); + } + break; + default: + break; } + return super.onKeyUp(keyCode, event); +} - @Override - protected void onCreateContextMenu(ContextMenu menu) { - if (getText() instanceof Spanned) { - int selStart = getSelectionStart(); - int selEnd = getSelectionEnd(); - - int min = Math.min(selStart, selEnd); - int max = Math.max(selStart, selEnd); - - final URLSpan[] urls = ((Spanned) getText()).getSpans(min, max, URLSpan.class); - if (urls.length == 1) { - int defaultResId = 0; - for(String schema: sSchemaActionResMap.keySet()) { - if(urls[0].getURL().indexOf(schema) >= 0) { - defaultResId = sSchemaActionResMap.get(schema); - break; - } - } +@Override +protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { + // 处理焦点变化事件 + if (mOnTextViewChangeListener != null) { + if (!focused && TextUtils.isEmpty(getText())) { + mOnTextViewChangeListener.onTextChange(mIndex, false); + } else { + mOnTextViewChangeListener.onTextChange(mIndex, true); + } + } + super.onFocusChanged(focused, direction, previouslyFocusedRect); +} - if (defaultResId == 0) { - defaultResId = R.string.note_link_other; +@Override +protected void onCreateContextMenu(ContextMenu menu) { + // 创建上下文菜单 + if (getText() instanceof Spanned) { + int selStart = getSelectionStart(); + int selEnd = getSelectionEnd(); + int min = Math.min(selStart, selEnd); + int max = Math.max(selStart, selEnd); + final URLSpan[] urls = ((Spanned) getText()).getSpans(min, max, URLSpan.class); + if (urls.length == 1) { + int defaultResId = 0; + for(String schema: sSchemaActionResMap.keySet()) { + if(urls[0].getURL().indexOf(schema) >= 0) { + defaultResId = sSchemaActionResMap.get(schema); + break; } - - menu.add(0, 0, 0, defaultResId).setOnMenuItemClickListener( - new OnMenuItemClickListener() { - public boolean onMenuItemClick(MenuItem item) { - // goto a new intent - urls[0].onClick(NoteEditText.this); - return true; - } - }); } + if (defaultResId == 0) { + defaultResId = R.string.note_link_other; + } + menu.add(0, 0, 0, defaultResId).setOnMenuItemClickListener( + new OnMenuItemClickListener() { + public boolean onMenuItemClick(MenuItem item) { + // 执行URLSpan的点击操作 + urls[0].onClick(NoteEditText.this); + return true; + } + }); } - super.onCreateContextMenu(menu); } + super.onCreateContextMenu(menu); } + diff --git a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NoteItemData.java b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NoteItemData.java index 0f5a878..f2c79f9 100644 --- a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NoteItemData.java +++ b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NoteItemData.java @@ -77,62 +77,69 @@ public class NoteItemData { private boolean mIsMultiNotesFollowingFolder; public NoteItemData(Context context, Cursor cursor) { - mId = cursor.getLong(ID_COLUMN); - mAlertDate = cursor.getLong(ALERTED_DATE_COLUMN); - mBgColorId = cursor.getInt(BG_COLOR_ID_COLUMN); - mCreatedDate = cursor.getLong(CREATED_DATE_COLUMN); - mHasAttachment = (cursor.getInt(HAS_ATTACHMENT_COLUMN) > 0) ? true : false; - mModifiedDate = cursor.getLong(MODIFIED_DATE_COLUMN); - mNotesCount = cursor.getInt(NOTES_COUNT_COLUMN); - mParentId = cursor.getLong(PARENT_ID_COLUMN); - mSnippet = cursor.getString(SNIPPET_COLUMN); - mSnippet = mSnippet.replace(NoteEditActivity.TAG_CHECKED, "").replace( - NoteEditActivity.TAG_UNCHECKED, ""); - mType = cursor.getInt(TYPE_COLUMN); - mWidgetId = cursor.getInt(WIDGET_ID_COLUMN); - mWidgetType = cursor.getInt(WIDGET_TYPE_COLUMN); - - mPhoneNumber = ""; - if (mParentId == Notes.ID_CALL_RECORD_FOLDER) { - mPhoneNumber = DataUtils.getCallNumberByNoteId(context.getContentResolver(), mId); - if (!TextUtils.isEmpty(mPhoneNumber)) { - mName = Contact.getContact(context, mPhoneNumber); - if (mName == null) { - mName = mPhoneNumber; - } + // 构造函数,用于从数据库查询结果中创建NoteItemData对象 + mId = cursor.getLong(ID_COLUMN); + mAlertDate = cursor.getLong(ALERTED_DATE_COLUMN); + mBgColorId = cursor.getInt(BG_COLOR_ID_COLUMN); + mCreatedDate = cursor.getLong(CREATED_DATE_COLUMN); + mHasAttachment = (cursor.getInt(HAS_ATTACHMENT_COLUMN) > 0) ? true : false; + mModifiedDate = cursor.getLong(MODIFIED_DATE_COLUMN); + mNotesCount = cursor.getInt(NOTES_COUNT_COLUMN); + mParentId = cursor.getLong(PARENT_ID_COLUMN); + mSnippet = cursor.getString(SNIPPET_COLUMN); + mSnippet = mSnippet.replace(NoteEditActivity.TAG_CHECKED, "").replace( + NoteEditActivity.TAG_UNCHECKED, ""); + mType = cursor.getInt(TYPE_COLUMN); + mWidgetId = cursor.getInt(WIDGET_ID_COLUMN); + mWidgetType = cursor.getInt(WIDGET_TYPE_COLUMN); + + mPhoneNumber = ""; + if (mParentId == Notes.ID_CALL_RECORD_FOLDER) { + // 如果父文件夹ID为通话记录文件夹ID,则获取与该笔记关联的电话号码 + mPhoneNumber = DataUtils.getCallNumberByNoteId(context.getContentResolver(), mId); + if (!TextUtils.isEmpty(mPhoneNumber)) { + // 如果电话号码不为空,则获取联系人姓名 + mName = Contact.getContact(context, mPhoneNumber); + if (mName == null) { + mName = mPhoneNumber; } } + } - if (mName == null) { - mName = ""; - } - checkPostion(cursor); - } - - private void checkPostion(Cursor cursor) { - mIsLastItem = cursor.isLast() ? true : false; - mIsFirstItem = cursor.isFirst() ? true : false; - mIsOnlyOneItem = (cursor.getCount() == 1); - mIsMultiNotesFollowingFolder = false; - mIsOneNoteFollowingFolder = false; - - if (mType == Notes.TYPE_NOTE && !mIsFirstItem) { - int position = cursor.getPosition(); - if (cursor.moveToPrevious()) { - if (cursor.getInt(TYPE_COLUMN) == Notes.TYPE_FOLDER - || cursor.getInt(TYPE_COLUMN) == Notes.TYPE_SYSTEM) { - if (cursor.getCount() > (position + 1)) { - mIsMultiNotesFollowingFolder = true; - } else { - mIsOneNoteFollowingFolder = true; - } - } - if (!cursor.moveToNext()) { - throw new IllegalStateException("cursor move to previous but can't move back"); + if (mName == null) { + mName = ""; + } + checkPostion(cursor); +} + +private void checkPostion(Cursor cursor) { + // 检查笔记在列表中的位置 + mIsLastItem = cursor.isLast() ? true : false; + mIsFirstItem = cursor.isFirst() ? true : false; + mIsOnlyOneItem = (cursor.getCount() == 1); + mIsMultiNotesFollowingFolder = false; + mIsOneNoteFollowingFolder = false; + + if (mType == Notes.TYPE_NOTE && !mIsFirstItem) { + // 如果笔记类型为普通笔记且不是第一个笔记 + int position = cursor.getPosition(); + if (cursor.moveToPrevious()) { + if (cursor.getInt(TYPE_COLUMN) == Notes.TYPE_FOLDER + || cursor.getInt(TYPE_COLUMN) == Notes.TYPE_SYSTEM) { + // 如果上一个笔记类型为文件夹或系统文件夹 + if (cursor.getCount() > (position + 1)) { + mIsMultiNotesFollowingFolder = true; + } else { + mIsOneNoteFollowingFolder = true; } } + if (!cursor.moveToNext()) { + throw new IllegalStateException("cursor move to previous but can't move back"); + } } } +} + public boolean isOneFollowingFolder() { return mIsOneNoteFollowingFolder; diff --git a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NotesListActivity.java b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NotesListActivity.java index da9e327..29e3301 100644 --- a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NotesListActivity.java +++ b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NotesListActivity.java @@ -139,361 +139,362 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt 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.lanyangyang); - initResources(); +protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.note_list); + getWindow().setBackgroundDrawableResource(R.drawable.lanyangyang); + initResources(); - /** - * 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); - } else { - super.onActivityResult(requestCode, resultCode, data); - } +@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); + } else { + super.onActivityResult(requestCode, resultCode, data); } +} - private void setAppInfoFromRawRes() { - 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); - 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); - } - } else { - Log.e(TAG, "Read introduction file error"); - return; +private void setAppInfoFromRawRes() { + 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); + 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); } - } catch (IOException e) { - e.printStackTrace(); + } else { + Log.e(TAG, "读取介绍文件错误"); return; - } finally { - if(in != null) { - try { - in.close(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + } + } catch (IOException e) { + e.printStackTrace(); + return; + } finally { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + 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(); - } else { - Log.e(TAG, "Save introduction note error"); - return; - } + // 创建一个新的笔记并设置介绍文本 + 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, "保存介绍笔记错误"); + return; } } +} +@Override +protected void onStart() { + super.onStart(); + startAsyncNotesListQuery(); // 在Activity启动时调用异步查询笔记列表的方法 +} - @Override - protected void onStart() { - super.onStart(); - 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()); - mDispatch = false; - mDispatchY = 0; - mOriginY = 0; - mTitleBar = (TextView) findViewById(R.id.tv_title_bar); - mState = ListEditState.NOTE_LIST; - mModeCallBack = new ModeCallback(); - - } - - private class ModeCallback implements ListView.MultiChoiceModeListener, OnMenuItemClickListener { - private DropdownMenu mDropDownMenu; - private ActionMode mActionMode; - 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); - mMoveMenu = menu.findItem(R.id.move); - if (mFocusNoteDataItem.getParentId() == Notes.ID_CALL_RECORD_FOLDER - || DataUtils.getUserFolderCount(mContentResolver) == 0) { - mMoveMenu.setVisible(false); - } else { - mMoveMenu.setVisible(true); - 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); - mDropDownMenu.setOnDropdownMenuItemClickListener(new PopupMenu.OnMenuItemClickListener(){ - public boolean onMenuItemClick(MenuItem item) { - mNotesListAdapter.selectAll(!mNotesListAdapter.isAllSelected()); - updateMenu(); - return true; - } - - }); - return true; - } +private void initResources() { + mContentResolver = this.getContentResolver(); // 获取ContentResolver对象 + mBackgroundQueryHandler = new BackgroundQueryHandler(this.getContentResolver()); // 创建BackgroundQueryHandler对象 + mCurrentFolderId = Notes.ID_ROOT_FOLDER; // 设置当前文件夹ID为根文件夹ID + mNotesListView = (ListView) findViewById(R.id.notes_list); // 获取笔记列表的ListView + 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); // 获取标题栏的TextView + mState = ListEditState.NOTE_LIST; // 设置列表编辑状态为笔记列表 + mModeCallBack = new ModeCallback(); // 创建ModeCallback对象 +} - private void updateMenu() { - int selectedCount = mNotesListAdapter.getSelectedCount(); - // Update dropdown menu - 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); - } else { - item.setChecked(false); - item.setTitle(R.string.menu_select_all); - } +private class ModeCallback implements ListView.MultiChoiceModeListener, OnMenuItemClickListener { + private DropdownMenu mDropDownMenu; // 下拉菜单 + private ActionMode mActionMode; // ActionMode对象 + 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); // 设置删除菜单项的点击监听器 + mMoveMenu = menu.findItem(R.id.move); // 获取移动菜单项 + if (mFocusNoteDataItem.getParentId() == Notes.ID_CALL_RECORD_FOLDER || DataUtils.getUserFolderCount(mContentResolver) == 0) { + mMoveMenu.setVisible(false); // 如果当前笔记所在文件夹是通话记录文件夹或用户文件夹数量为0,则隐藏移动菜单项 + } else { + mMoveMenu.setVisible(true); // 否则显示移动菜单项,并设置点击监听器 + mMoveMenu.setOnMenuItemClickListener(this); + } + mActionMode = mode; // 设置ActionMode对象 + 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); // 设置ActionMode的自定义视图 + 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(); // 更新菜单 + return true; } - } + }); + return true; + } - public boolean onPrepareActionMode(ActionMode mode, Menu menu) { - // TODO Auto-generated method stub - return false; + private void updateMenu() { + 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); + } else { + item.setChecked(false); + item.setTitle(R.string.menu_select_all); + } } + } - public boolean onActionItemClicked(ActionMode mode, MenuItem item) { - // TODO Auto-generated method stub - return false; - } + public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + return false; + } - public void onDestroyActionMode(ActionMode mode) { - mNotesListAdapter.setChoiceMode(false); - mNotesListView.setLongClickable(true); - mAddNewNote.setVisibility(View.VISIBLE); - onStart(); - } + public boolean onActionItemClicked(ActionMode mode, MenuItem item) { + return false; + } - public void finishActionMode() { - mActionMode.finish(); - } + public void onDestroyActionMode(ActionMode mode) { + mNotesListAdapter.setChoiceMode(false); // 设置笔记列表适配器的选择模式为单选模式 + mNotesListView.setLongClickable(true); // 设置笔记列表可长按 + mAddNewNote.setVisibility(View.VISIBLE); // 显示新建笔记按钮 + onStart(); // 重新调用onStart()方法 + } - public void onItemCheckedStateChanged(ActionMode mode, int position, long id, - boolean checked) { - mNotesListAdapter.setCheckedItem(position, checked); - updateMenu(); - } + public void finishActionMode() { + mActionMode.finish(); // 结束ActionMode + } - public boolean onMenuItemClick(MenuItem item) { - if (mNotesListAdapter.getSelectedCount() == 0) { - Toast.makeText(NotesListActivity.this, getString(R.string.menu_select_none), - Toast.LENGTH_SHORT).show(); - return true; - } + public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { + mNotesListAdapter.setCheckedItem(position, checked); // 设置选中的笔记项 + updateMenu(); // 更新菜单 + } - 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, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, - int which) { - batchDelete(); - } - }); - builder.setNegativeButton(android.R.string.cancel, null); - builder.show(); - } else if (itemId == R.id.move) { - startQueryDestinationFolders(); - } else { - return false; - } + public boolean onMenuItemClick(MenuItem item) { + if (mNotesListAdapter.getSelectedCount() == 0) { + Toast.makeText(NotesListActivity.this, getString(R.string.menu_select_none), Toast.LENGTH_SHORT).show(); // 如果没有选中的笔记,则显示提示信息 return true; } - } - private class NewNoteOnTouchListener implements OnTouchListener { - - public boolean onTouch(View v, MotionEvent event) { - switch (event.getAction()) { - 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.12x+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))) { - mOriginY = (int) event.getY(); - mDispatchY = eventY; - event.setLocation(event.getX(), mDispatchY); - mDispatch = true; - return mNotesListView.dispatchTouchEvent(event); - } - } - break; + 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, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + batchDelete(); // 批量删除选中的笔记 } - case MotionEvent.ACTION_MOVE: { - if (mDispatch) { - mDispatchY += (int) event.getY() - mOriginY; - event.setLocation(event.getX(), mDispatchY); - return mNotesListView.dispatchTouchEvent(event); - } - break; + }); + builder.setNegativeButton(android.R.string.cancel, null); + builder.show(); + } else if (itemId == R.id.move) { + startQueryDestinationFolders(); // 查询目标文件夹 + } else { + return false; + } + return true; + } +} +private class NewNoteOnTouchListener implements OnTouchListener { + // 触摸事件监听器,用于处理新笔记按钮的触摸事件 + + public boolean onTouch(View v, MotionEvent event) { + // 当触摸事件发生时调用此方法 + switch (event.getAction()) { + 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(); } - default: { - if (mDispatch) { + /** + * 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.12x+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)) { + // 当点击"New Note"按钮的透明部分时,将事件分发给按钮后面的列表视图 + 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); - mDispatch = false; + mDispatch = true; return mNotesListView.dispatchTouchEvent(event); } - break; } + break; + } + case MotionEvent.ACTION_MOVE: { + // 当手指移动时执行以下操作 + if (mDispatch) { + mDispatchY += (int) event.getY() - mOriginY; + event.setLocation(event.getX(), mDispatchY); + return mNotesListView.dispatchTouchEvent(event); + } + break; + } + default: { + // 其他情况下执行以下操作 + if (mDispatch) { + event.setLocation(event.getX(), mDispatchY); + mDispatch = false; + return mNotesListView.dispatchTouchEvent(event); + } + 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"); + 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"); +} - private final class BackgroundQueryHandler extends AsyncQueryHandler { - public BackgroundQueryHandler(ContentResolver contentResolver) { - super(contentResolver); - } +private final class BackgroundQueryHandler extends AsyncQueryHandler { + // 后台查询处理器,用于执行异步查询操作 + public BackgroundQueryHandler(ContentResolver contentResolver) { + super(contentResolver); + } - @Override - protected void onQueryComplete(int token, Object cookie, Cursor cursor) { - switch (token) { - case FOLDER_NOTE_LIST_QUERY_TOKEN: - mNotesListAdapter.changeCursor(cursor); - break; - case FOLDER_LIST_QUERY_TOKEN: - if (cursor != null && cursor.getCount() > 0) { - showFolderListMenu(cursor); - } else { - Log.e(TAG, "Query folder failed"); - } - break; - default: - return; - } + @Override + protected void onQueryComplete(int token, Object cookie, Cursor cursor) { + // 查询完成时调用此方法 + switch (token) { + case FOLDER_NOTE_LIST_QUERY_TOKEN: + // 查询笔记列表完成 + mNotesListAdapter.changeCursor(cursor); + break; + case FOLDER_LIST_QUERY_TOKEN: + // 查询文件夹列表完成 + if (cursor != null && cursor.getCount() > 0) { + showFolderListMenu(cursor); + } else { + Log.e(TAG, "Query folder failed"); + } + break; + default: + return; } } +} - private void showFolderListMenu(Cursor cursor) { - AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this); - builder.setTitle(R.string.menu_title_select_folder); - final FoldersListAdapter adapter = new FoldersListAdapter(this, cursor); - builder.setAdapter(adapter, new DialogInterface.OnClickListener() { +private void showFolderListMenu(Cursor cursor) { + // 显示文件夹列表菜单 + AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this); + 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(); + } + }); + builder.show(); +} - 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(); - } - }); - builder.show(); - } +private void createNewNote() { + // 创建新笔记 + 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); +} - private void createNewNote() { - 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); - } - - private void batchDelete() { - new AsyncTask>() { - protected HashSet doInBackground(Void... unused) { - HashSet widgets = mNotesListAdapter.getSelectedWidget(); - if (!isSyncMode()) { - // if not synced, delete notes directly - if (DataUtils.batchDeleteNotes(mContentResolver, mNotesListAdapter - .getSelectedItemIds())) { - } else { - Log.e(TAG, "Delete notes error, should not happens"); - } +private void batchDelete() { + // 批量删除 + new AsyncTask>() { + protected HashSet doInBackground(Void... unused) { + HashSet widgets = mNotesListAdapter.getSelectedWidget(); + if (!isSyncMode()) { + // 如果不是同步模式,则直接删除笔记 + if (DataUtils.batchDeleteNotes(mContentResolver, mNotesListAdapter + .getSelectedItemIds())) { } 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"); - } + Log.e(TAG, "Delete notes error, should not happens"); + } + } else { + // 在同步模式下,将删除的笔记移动到回收站文件夹 + if (!DataUtils.batchMoveToFolder(mContentResolver, mNotesListAdapter + .getSelectedItemIds(), Notes.ID_TRASH_FOLER)) { + Log.e(TAG, "Move notes to trash folder error, should not happens"); } - return widgets; } + return widgets; + } @Override protected void onPostExecute(HashSet widgets) { @@ -685,294 +686,307 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt }); } - @Override - public void onBackPressed() { - switch (mState) { - case SUB_FOLDER: - mCurrentFolderId = Notes.ID_ROOT_FOLDER; - mState = ListEditState.NOTE_LIST; - 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(); - break; - case NOTE_LIST: - super.onBackPressed(); - break; - default: - break; - } + @Override +public void onBackPressed() { + // 当返回按钮按下时调用此方法 + switch (mState) { + case SUB_FOLDER: + // 如果当前状态为子文件夹状态,则返回到根文件夹状态 + mCurrentFolderId = Notes.ID_ROOT_FOLDER; + mState = ListEditState.NOTE_LIST; + 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(); + break; + case NOTE_LIST: + // 如果当前状态为笔记列表状态,则执行默认的返回操作 + super.onBackPressed(); + break; + default: + break; } +} - private void updateWidget(int appWidgetId, int appWidgetType) { - Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE); - if (appWidgetType == Notes.TYPE_WIDGET_2X) { - intent.setClass(this, NoteWidgetProvider_2x.class); - } else if (appWidgetType == Notes.TYPE_WIDGET_4X) { - intent.setClass(this, NoteWidgetProvider_4x.class); - } else { - Log.e(TAG, "Unspported widget type"); - return; - } - - intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] { - appWidgetId - }); - - sendBroadcast(intent); - setResult(RESULT_OK, intent); +private void updateWidget(int appWidgetId, int appWidgetType) { + // 更新小部件 + Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE); + if (appWidgetType == Notes.TYPE_WIDGET_2X) { + intent.setClass(this, NoteWidgetProvider_2x.class); + } else if (appWidgetType == Notes.TYPE_WIDGET_4X) { + intent.setClass(this, NoteWidgetProvider_4x.class); + } else { + Log.e(TAG, "Unspported widget type"); + return; } - 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); - } - } - }; + intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] { + appWidgetId + }); - @Override - public void onContextMenuClosed(Menu menu) { - if (mNotesListView != null) { - mNotesListView.setOnCreateContextMenuListener(null); + sendBroadcast(intent); + setResult(RESULT_OK, intent); +} + +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); } - super.onContextMenuClosed(menu); } +}; - @Override - public boolean onContextItemSelected(MenuItem item) { - if (mFocusNoteDataItem == null) { - Log.e(TAG, "The long click data item is null"); - return false; - } - switch (item.getItemId()) { - case MENU_FOLDER_VIEW: - 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() { - public void onClick(DialogInterface dialog, int which) { - deleteFolder(mFocusNoteDataItem.getId()); - } - }); - builder.setNegativeButton(android.R.string.cancel, null); - builder.show(); - break; - case MENU_FOLDER_CHANGE_NAME: - showCreateOrModifyFolderDialog(false); - break; - default: - break; - } +@Override +public void onContextMenuClosed(Menu menu) { + if (mNotesListView != null) { + mNotesListView.setOnCreateContextMenuListener(null); + } + super.onContextMenuClosed(menu); +} - return true; +@Override +public boolean onContextItemSelected(MenuItem item) { + if (mFocusNoteDataItem == null) { + Log.e(TAG, "The long click data item is null"); + return false; + } + switch (item.getItemId()) { + case MENU_FOLDER_VIEW: + 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() { + public void onClick(DialogInterface dialog, int which) { + deleteFolder(mFocusNoteDataItem.getId()); + } + }); + builder.setNegativeButton(android.R.string.cancel, null); + builder.show(); + break; + case MENU_FOLDER_CHANGE_NAME: + showCreateOrModifyFolderDialog(false); + break; + default: + break; } - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - 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); - } 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); - } - if (mode == -1) { - menu.findItem(R.id.menu_lanyangyang).setVisible(false); - } else if (mode == 0) { - menu.findItem(R.id.menu_grass).setVisible(false); - }else if (mode == 1) { - menu.findItem(R.id.menu_playground1).setVisible(false); - } - return true; + return true; +} + +@Override +public boolean onPrepareOptionsMenu(Menu menu) { + // 准备选项菜单 + menu.clear(); + if (mState == ListEditState.NOTE_LIST) { + getMenuInflater().inflate(R.menu.note_list, menu); + // 设置同步或取消同步的菜单项 + 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); } + if (mode == -1) { + menu.findItem(R.id.menu_lanyangyang).setVisible(false); + } else if (mode == 0) { + menu.findItem(R.id.menu_grass).setVisible(false); + }else if (mode == 1) { + menu.findItem(R.id.menu_playground1).setVisible(false); + } + return true; +} - @Override - public boolean onOptionsItemSelected(MenuItem item) { - int itemId = item.getItemId(); - 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); - } else { - GTaskSyncService.cancelSync(this); - } +@Override +public boolean onOptionsItemSelected(MenuItem item) { + // 当选项菜单项被选中时调用此方法 + int itemId = item.getItemId(); + 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); } else { - startPreferenceActivity(); + GTaskSyncService.cancelSync(this); } - } else if (itemId == R.id.menu_setting) { + } else { startPreferenceActivity(); - } else if (itemId == R.id.menu_new_note) { - createNewNote(); - } else if (itemId == R.id.menu_search) { - onSearchRequested(); - } else if (itemId == R.id.menu_lanyangyang) { - mode = -1; - getWindow().setBackgroundDrawableResource(R.drawable.lanyangyang); - } else if (itemId == R.id.menu_grass) { - mode = 0; - getWindow().setBackgroundDrawableResource(R.drawable.grass); - } else if (itemId == R.id.menu_playground1) { - mode = 1; - getWindow().setBackgroundDrawableResource(R.drawable.playground1); } - return true; + } 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_lanyangyang) { + mode = -1; + getWindow().setBackgroundDrawableResource(R.drawable.lanyangyang); + } else if (itemId == R.id.menu_grass) { + mode = 0; + getWindow().setBackgroundDrawableResource(R.drawable.grass); + } else if (itemId == R.id.menu_playground1) { + mode = 1; + getWindow().setBackgroundDrawableResource(R.drawable.playground1); } + return true; +} - @Override - public boolean onSearchRequested() { - startSearch(null, false, null /* appData */, false); - return true; - } +@Override +public boolean onSearchRequested() { + // 当搜索请求发生时调用此方法 + startSearch(null, false, null /* appData */, false); + return true; +} - private void exportNoteToText() { - final BackupUtils backup = BackupUtils.getInstance(NotesListActivity.this); - new AsyncTask() { +private void exportNoteToText() { + // 导出笔记为文本文件 + final BackupUtils backup = BackupUtils.getInstance(NotesListActivity.this); + new AsyncTask() { - @Override - protected Integer doInBackground(Void... unused) { - return backup.exportToText(); - } + @Override + protected Integer doInBackground(Void... unused) { + 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.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.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.setPositiveButton(android.R.string.ok, null); - builder.show(); - } + @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.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.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.setPositiveButton(android.R.string.ok, null); + builder.show(); } + } - }.execute(); - } + }.execute(); +} - private boolean isSyncMode() { - return NotesPreferenceActivity.getSyncAccountName(this).trim().length() > 0; - } +private boolean isSyncMode() { + // 判断是否为同步模式 + 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); - } +private void startPreferenceActivity() { + // 启动设置界面 + Activity from = getParent() != null ? getParent() : this; + Intent intent = new Intent(from, NotesPreferenceActivity.class); + from.startActivityIfNeeded(intent, -1); +} - private class OnListItemClickListener implements OnItemClickListener { +private class OnListItemClickListener implements OnItemClickListener { - public void onItemClick(AdapterView parent, View view, int position, long id) { - if (view instanceof NotesListItem) { - NoteItemData item = ((NotesListItem) view).getItemData(); - if (mNotesListAdapter.isInChoiceMode()) { - if (item.getType() == Notes.TYPE_NOTE) { - position = position - mNotesListView.getHeaderViewsCount(); - mModeCallBack.onItemCheckedStateChanged(null, position, id, - !mNotesListAdapter.isSelectedItem(position)); - } - return; + public void onItemClick(AdapterView parent, View view, int position, long id) { + if (view instanceof NotesListItem) { + NoteItemData item = ((NotesListItem) view).getItemData(); + if (mNotesListAdapter.isInChoiceMode()) { + if (item.getType() == Notes.TYPE_NOTE) { + position = position - mNotesListView.getHeaderViewsCount(); + 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); - } else if (item.getType() == Notes.TYPE_NOTE) { - openNode(item); - } else { - Log.e(TAG, "Wrong note type in NOTE_LIST"); - } - break; - case SUB_FOLDER: - case CALL_RECORD_FOLDER: - if (item.getType() == Notes.TYPE_NOTE) { - openNode(item); - } else { - Log.e(TAG, "Wrong note type in SUB_FOLDER"); - } - break; - default: - break; - } + switch (mState) { + case NOTE_LIST: + if (item.getType() == Notes.TYPE_FOLDER + || item.getType() == Notes.TYPE_SYSTEM) { + openFolder(item); + } else if (item.getType() == Notes.TYPE_NOTE) { + openNode(item); + } else { + Log.e(TAG, "Wrong note type in NOTE_LIST"); + } + break; + case SUB_FOLDER: + case CALL_RECORD_FOLDER: + if (item.getType() == Notes.TYPE_NOTE) { + openNode(item); + } else { + Log.e(TAG, "Wrong note type in SUB_FOLDER"); + } + break; + default: + break; } } - } - 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"); - } +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"); +} - public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { - if (view instanceof NotesListItem) { - 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); - } else { - Log.e(TAG, "startActionMode fails"); - } - } else if (mFocusNoteDataItem.getType() == Notes.TYPE_FOLDER) { - mNotesListView.setOnCreateContextMenuListener(mFolderOnCreateContextMenuListener); +public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { + if (view instanceof NotesListItem) { + 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); + } else { + Log.e(TAG, "startActionMode fails"); } + } else if (mFocusNoteDataItem.getType() == Notes.TYPE_FOLDER) { + mNotesListView.setOnCreateContextMenuListener(mFolderOnCreateContextMenuListener); } - return false; } + return false; } + diff --git a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NotesListAdapter.java b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NotesListAdapter.java index 51c9cb9..74066b0 100644 --- a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NotesListAdapter.java +++ b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NotesListAdapter.java @@ -38,11 +38,13 @@ public class NotesListAdapter extends CursorAdapter { private int mNotesCount; private boolean mChoiceMode; + // 静态内部类,用于存储小部件的属性 public static class AppWidgetAttribute { public int widgetId; public int widgetType; }; + // 构造函数,初始化成员变量 public NotesListAdapter(Context context) { super(context, null); mSelectedIndex = new HashMap(); @@ -50,11 +52,13 @@ public class NotesListAdapter extends CursorAdapter { mNotesCount = 0; } + // 创建新的NotesListItem视图 @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { return new NotesListItem(context); } + // 将数据绑定到视图上 @Override public void bindView(View view, Context context, Cursor cursor) { if (view instanceof NotesListItem) { @@ -64,20 +68,24 @@ public class NotesListAdapter extends CursorAdapter { } } + // 设置指定位置的项的选中状态 public void setCheckedItem(final int position, final boolean checked) { mSelectedIndex.put(position, checked); notifyDataSetChanged(); } + // 判断是否处于选择模式 public boolean isInChoiceMode() { return mChoiceMode; } + // 设置选择模式 public void setChoiceMode(boolean mode) { mSelectedIndex.clear(); mChoiceMode = mode; } + // 选择所有的项 public void selectAll(boolean checked) { Cursor cursor = getCursor(); for (int i = 0; i < getCount(); i++) { @@ -89,6 +97,7 @@ public class NotesListAdapter extends CursorAdapter { } } + // 获取选中项的ID集合 public HashSet getSelectedItemIds() { HashSet itemSet = new HashSet(); for (Integer position : mSelectedIndex.keySet()) { @@ -105,6 +114,7 @@ public class NotesListAdapter extends CursorAdapter { return itemSet; } + // 获取选中的小部件集合 public HashSet getSelectedWidget() { HashSet itemSet = new HashSet(); for (Integer position : mSelectedIndex.keySet()) { @@ -128,6 +138,7 @@ public class NotesListAdapter extends CursorAdapter { return itemSet; } + // 获取选中项的数量 public int getSelectedCount() { Collection values = mSelectedIndex.values(); if (null == values) { @@ -143,11 +154,13 @@ public class NotesListAdapter extends CursorAdapter { return count; } + // 判断是否所有项都被选中 public boolean isAllSelected() { int checkedCount = getSelectedCount(); return (checkedCount != 0 && checkedCount == mNotesCount); } + // 判断指定位置的项是否被选中 public boolean isSelectedItem(final int position) { if (null == mSelectedIndex.get(position)) { return false; @@ -155,18 +168,21 @@ public class NotesListAdapter extends CursorAdapter { return mSelectedIndex.get(position); } + // 数据发生变化时更新笔记项的数量 @Override protected void onContentChanged() { super.onContentChanged(); calcNotesCount(); } + // 更改游标时更新笔记项的数量 @Override public void changeCursor(Cursor cursor) { super.changeCursor(cursor); calcNotesCount(); } + // 计算笔记项的数量 private void calcNotesCount() { mNotesCount = 0; for (int i = 0; i < getCount(); i++) { @@ -182,3 +198,4 @@ public class NotesListAdapter extends CursorAdapter { } } } + diff --git a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NotesListItem.java b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NotesListItem.java index 1221e80..93e1aef 100644 --- a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NotesListItem.java +++ b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NotesListItem.java @@ -31,24 +31,25 @@ 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; + private ImageView mAlert; // 显示警告图标的ImageView + private TextView mTitle; // 显示标题的TextView + private TextView mTime; // 显示时间的TextView + private TextView mCallName; // 显示呼叫名称的TextView + private NoteItemData mItemData; // 笔记项的数据 + private CheckBox mCheckBox; // 多选模式下的复选框 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); - mCallName = (TextView) findViewById(R.id.tv_name); - mCheckBox = (CheckBox) findViewById(android.R.id.checkbox); + inflate(context, R.layout.note_item, this); // 加载note_item布局文件到当前LinearLayout + mAlert = (ImageView) findViewById(R.id.iv_alert_icon); // 初始化mAlert为布局文件中的ImageView + mTitle = (TextView) findViewById(R.id.tv_title); // 初始化mTitle为布局文件中的TextView + mTime = (TextView) findViewById(R.id.tv_time); // 初始化mTime为布局文件中的TextView + mCallName = (TextView) findViewById(R.id.tv_name); // 初始化mCallName为布局文件中的TextView + mCheckBox = (CheckBox) findViewById(android.R.id.checkbox); // 初始化mCheckBox为布局文件中的CheckBox } 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); @@ -56,8 +57,11 @@ public class NotesListItem extends LinearLayout { 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); @@ -65,6 +69,7 @@ public class NotesListItem extends LinearLayout { + context.getString(R.string.format_folder_files_count, data.getNotesCount())); 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); @@ -76,15 +81,18 @@ public class NotesListItem extends LinearLayout { mAlert.setVisibility(View.GONE); } } else { + // 其他类型的数据 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); } else { + // 如果数据是笔记类型 mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet())); if (data.hasAlert()) { mAlert.setImageResource(R.drawable.clock); @@ -94,14 +102,16 @@ public class NotesListItem extends LinearLayout { } } } - mTime.setText(DateUtils.getRelativeTimeSpanString(data.getModifiedDate())); - setBackground(data); + mTime.setText(DateUtils.getRelativeTimeSpanString(data.getModifiedDate())); // 设置时间文本 + + setBackground(data); // 设置背景 } private void setBackground(NoteItemData data) { int id = data.getBgColorId(); if (data.getType() == Notes.TYPE_NOTE) { + // 如果数据是笔记类型 if (data.isSingle() || data.isOneFollowingFolder()) { setBackgroundResource(NoteItemBgResources.getNoteBgSingleRes(id)); } else if (data.isLast()) { @@ -112,11 +122,13 @@ public class NotesListItem extends LinearLayout { setBackgroundResource(NoteItemBgResources.getNoteBgNormalRes(id)); } } else { + // 如果数据是文件夹类型 setBackgroundResource(NoteItemBgResources.getFolderBgRes()); } } public NoteItemData getItemData() { - return mItemData; + return mItemData; // 返回笔记项的数据 } } + diff --git a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NotesPreferenceActivity.java b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NotesPreferenceActivity.java index 07c5f7e..655d3b9 100644 --- a/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NotesPreferenceActivity.java +++ b/src/Notes-master1/app/src/main/java/net/micode/notes/ui/NotesPreferenceActivity.java @@ -70,225 +70,269 @@ public class NotesPreferenceActivity extends PreferenceActivity { private boolean mHasAddedAccount; @Override - protected void onCreate(Bundle icicle) { - super.onCreate(icicle); - - /* using the app icon for navigation */ - getActionBar().setDisplayHomeAsUpEnabled(true); - - 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); - } +protected void onCreate(Bundle icicle) { + super.onCreate(icicle); + + /* using the app icon for navigation */ + getActionBar().setDisplayHomeAsUpEnabled(true); // 设置ActionBar的导航按钮可见,通常用于返回上一个界面。 + + addPreferencesFromResource(R.xml.preferences); // 从XML资源文件中加载偏好设置。 + + mAccountCategory = (PreferenceCategory) findPreference(PREFERENCE_SYNC_ACCOUNT_KEY); // 获取偏好设置中的PreferenceCategory对象。 + + mReceiver = new GTaskReceiver(); // 创建一个GTaskReceiver对象,用于接收广播。 + + IntentFilter filter = new IntentFilter(); // 创建一个IntentFilter对象,用于过滤广播。 + + filter.addAction(GTaskSyncService.GTASK_SERVICE_BROADCAST_NAME); // 添加一个广播动作到IntentFilter中。 + + registerReceiver(mReceiver, filter); // 注册广播接收器,使其能够接收指定动作的广播。 + + mOriAccounts = null; // 将mOriAccounts变量设置为null。 + + View header = LayoutInflater.from(this).inflate(R.layout.settings_header, null); // 通过布局文件`settings_header`创建一个视图对象。 + + getListView().addHeaderView(header, null, true); // 将创建的视图对象添加为ListView的头部视图。 +} + @Override - 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) { - if (TextUtils.equals(accountOld.name, accountNew.name)) { - found = true; - break; - } - } - if (!found) { - setSyncAccount(accountNew.name); +protected void onResume() { + super.onResume(); + + // 如果用户已经添加了一个新的账户,那么就需要自动设置同步账户 + if (mHasAddedAccount) { + // 获取所有的Google账户,并将其存储在一个数组中 + Account[] accounts = getGoogleAccounts(); + // 如果新账户的数量大于旧账户的数量,说明有新账户添加 + if (mOriAccounts != null && accounts.length > mOriAccounts.length) { + // 遍历新账户数组,与旧账户数组进行比较 + for (Account accountNew : accounts) { + boolean found = false; + for (Account accountOld : mOriAccounts) { + // 如果找到了相同的账户,将found标志设置为true,并跳出循环 + if (TextUtils.equals(accountOld.name, accountNew.name)) { + found = true; break; } } + // 如果没有找到相同的账户,就调用setSyncAccount()方法设置同步账户为新账户的名称,并跳出循环 + if (!found) { + setSyncAccount(accountNew.name); + break; + } } } - - refreshUI(); } - @Override - protected void onDestroy() { - if (mReceiver != null) { - unregisterReceiver(mReceiver); - } - super.onDestroy(); + // 刷新用户界面 + refreshUI(); +} + + + @Override +protected void onDestroy() { + // 如果广播接收器不为空,则取消注册 + if (mReceiver != null) { + unregisterReceiver(mReceiver); } + super.onDestroy(); +} - private void loadAccountPreference() { - mAccountCategory.removeAll(); - - Preference accountPref = new Preference(this); - final String defaultAccount = getSyncAccountName(this); - accountPref.setTitle(getString(R.string.preferences_account_title)); - accountPref.setSummary(getString(R.string.preferences_account_summary)); - accountPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { - 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(); - } +private void loadAccountPreference() { + // 清空账户类别下的所有偏好设置 + mAccountCategory.removeAll(); + + // 创建一个Preference对象 + Preference accountPref = new Preference(this); + final String defaultAccount = getSyncAccountName(this); + // 设置Preference的标题和摘要 + accountPref.setTitle(getString(R.string.preferences_account_title)); + accountPref.setSummary(getString(R.string.preferences_account_summary)); + // 设置Preference的点击事件监听器 + accountPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { + public boolean onPreferenceClick(Preference preference) { + // 如果当前没有正在进行同步操作 + if (!GTaskSyncService.isSyncing()) { + // 如果默认账户为空,说明是第一次设置账户 + if (TextUtils.isEmpty(defaultAccount)) { + // 显示选择账户的对话框 + showSelectAccountAlertDialog(); } else { - Toast.makeText(NotesPreferenceActivity.this, - R.string.preferences_toast_cannot_change_account, Toast.LENGTH_SHORT) - .show(); + // 如果账户已经设置过,需要提示用户风险 + showChangeAccountConfirmAlertDialog(); } - return true; + } else { + // 如果当前正在进行同步操作,显示提示信息 + Toast.makeText(NotesPreferenceActivity.this, + R.string.preferences_toast_cannot_change_account, Toast.LENGTH_SHORT) + .show(); } - }); + return true; + } + }); - mAccountCategory.addPreference(accountPref); - } + // 将Preference添加到账户类别下 + 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); - } - }); - } else { - syncButton.setText(getString(R.string.preferences_button_sync_immediately)); - syncButton.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - GTaskSyncService.startSync(NotesPreferenceActivity.this); - } - }); - } - syncButton.setEnabled(!TextUtils.isEmpty(getSyncAccountName(this))); + private void loadSyncButton() { + // 获取同步按钮和上次同步时间的视图 + Button syncButton = (Button) findViewById(R.id.preference_sync_button); + TextView lastSyncTimeView = (TextView) findViewById(R.id.prefenerece_sync_status_textview); - // set last sync time - if (GTaskSyncService.isSyncing()) { - lastSyncTimeView.setText(GTaskSyncService.getProgressString()); + // 设置按钮状态 + 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); + } + }); + } else { + syncButton.setText(getString(R.string.preferences_button_sync_immediately)); + syncButton.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + // 开始同步操作 + GTaskSyncService.startSync(NotesPreferenceActivity.this); + } + }); + } + // 根据同步账户的名称设置按钮是否可用 + syncButton.setEnabled(!TextUtils.isEmpty(getSyncAccountName(this))); + + // 设置上次同步时间 + if (GTaskSyncService.isSyncing()) { + lastSyncTimeView.setText(GTaskSyncService.getProgressString()); + lastSyncTimeView.setVisibility(View.VISIBLE); + } else { + long lastSyncTime = getLastSyncTime(this); + if (lastSyncTime != 0) { + lastSyncTimeView.setText(getString(R.string.preferences_last_sync_time, + DateFormat.format(getString(R.string.preferences_last_sync_time_format), + lastSyncTime))); lastSyncTimeView.setVisibility(View.VISIBLE); } else { - long lastSyncTime = getLastSyncTime(this); - if (lastSyncTime != 0) { - lastSyncTimeView.setText(getString(R.string.preferences_last_sync_time, - DateFormat.format(getString(R.string.preferences_last_sync_time_format), - lastSyncTime))); - lastSyncTimeView.setVisibility(View.VISIBLE); - } else { - lastSyncTimeView.setVisibility(View.GONE); - } + lastSyncTimeView.setVisibility(View.GONE); } } +} - 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)); - TextView subtitleTextView = (TextView) titleView.findViewById(R.id.account_dialog_subtitle); - subtitleTextView.setText(getString(R.string.preferences_dialog_select_account_tips)); +private void refreshUI() { + // 刷新用户界面 + loadAccountPreference(); + loadSyncButton(); +} - dialogBuilder.setCustomTitle(titleView); - dialogBuilder.setPositiveButton(null, null); - Account[] accounts = getGoogleAccounts(); - String defAccount = getSyncAccountName(this); - - mOriAccounts = accounts; - mHasAddedAccount = false; - - if (accounts.length > 0) { - CharSequence[] items = new CharSequence[accounts.length]; - final CharSequence[] itemMapping = items; - int checkedItem = -1; - int index = 0; - for (Account account : accounts) { - if (TextUtils.equals(account.name, defAccount)) { - checkedItem = index; - } - items[index++] = account.name; + 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)); + TextView subtitleTextView = (TextView) titleView.findViewById(R.id.account_dialog_subtitle); + subtitleTextView.setText(getString(R.string.preferences_dialog_select_account_tips)); + dialogBuilder.setCustomTitle(titleView); + dialogBuilder.setPositiveButton(null, null); + + // 获取Google账户列表和当前同步账户 + Account[] accounts = getGoogleAccounts(); + String defAccount = getSyncAccountName(this); + + mOriAccounts = accounts; + mHasAddedAccount = false; + + if (accounts.length > 0) { + // 构建单选列表项 + CharSequence[] items = new CharSequence[accounts.length]; + final CharSequence[] itemMapping = items; + int checkedItem = -1; + int index = 0; + for (Account account : accounts) { + if (TextUtils.equals(account.name, defAccount)) { + checkedItem = index; } - dialogBuilder.setSingleChoiceItems(items, checkedItem, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - setSyncAccount(itemMapping[which].toString()); - dialog.dismiss(); - refreshUI(); - } - }); + items[index++] = account.name; } - - View addAccountView = LayoutInflater.from(this).inflate(R.layout.add_account_text, null); - dialogBuilder.setView(addAccountView); - - final AlertDialog dialog = dialogBuilder.show(); - 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" + dialogBuilder.setSingleChoiceItems(items, checkedItem, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + // 设置同步账户并刷新界面 + setSyncAccount(itemMapping[which].toString()); + dialog.dismiss(); + refreshUI(); + } }); - startActivityForResult(intent, -1); - dialog.dismiss(); - } - }); } - 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, - getSyncAccountName(this))); - TextView subtitleTextView = (TextView) titleView.findViewById(R.id.account_dialog_subtitle); - 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), - getString(R.string.preferences_menu_cancel) - }; - dialogBuilder.setItems(menuItemArray, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - if (which == 0) { - showSelectAccountAlertDialog(); - } else if (which == 1) { - removeSyncAccount(); - refreshUI(); - } + // 设置添加账户的视图 + View addAccountView = LayoutInflater.from(this).inflate(R.layout.add_account_text, null); + dialogBuilder.setView(addAccountView); + + // 显示对话框 + final AlertDialog dialog = dialogBuilder.show(); + 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" + }); + startActivityForResult(intent, -1); + dialog.dismiss(); + } + }); +} + +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, + getSyncAccountName(this))); + TextView subtitleTextView = (TextView) titleView.findViewById(R.id.account_dialog_subtitle); + 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), + getString(R.string.preferences_menu_cancel) + }; + dialogBuilder.setItems(menuItemArray, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + if (which == 0) { + // 显示选择账户的对话框 + showSelectAccountAlertDialog(); + } else if (which == 1) { + // 移除同步账户并刷新界面 + removeSyncAccount(); + refreshUI(); } - }); - dialogBuilder.show(); - } + } + }); + dialogBuilder.show(); +} + +private Account[] getGoogleAccounts() { + // 获取Google账户列表 + AccountManager accountManager = AccountManager.get(this); + return accountManager.getAccountsByType("com.google"); +} - private Account[] getGoogleAccounts() { - AccountManager accountManager = AccountManager.get(this); - return accountManager.getAccountsByType("com.google"); - } private void setSyncAccount(String account) { +/*设置同步账户。它首先检查传入的账户名是否与当前保存的账户名不同,如果不同,则更新SharedPreferences中的账户名。然后,它清除上次同步时间,并在后台线程中清除本地与GTask相关的信息。最后,它显示一个Toast消息,通知用户账户设置成功。*/ if (!getSyncAccountName(this).equals(account)) { SharedPreferences settings = getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = settings.edit(); @@ -339,7 +383,7 @@ public class NotesPreferenceActivity extends PreferenceActivity { } }).start(); } - +//设置上次同步时间 public static String getSyncAccountName(Context context) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); @@ -361,7 +405,7 @@ public class NotesPreferenceActivity extends PreferenceActivity { } private class GTaskReceiver extends BroadcastReceiver { - +//广播接收器,用于接收GTask同步服务的广播消息。 @Override public void onReceive(Context context, Intent intent) { refreshUI(); @@ -370,7 +414,7 @@ public class NotesPreferenceActivity extends PreferenceActivity { syncStatus.setText(intent .getStringExtra(GTaskSyncService.GTASK_SERVICE_BROADCAST_PROGRESS_MSG)); } - +//它在接收到广播后刷新UI,并根据广播中的信息更新同步状态 } }