From bedcb0057d6bf721a3d8c3a06338662e23092775 Mon Sep 17 00:00:00 2001 From: zcx <1078327420@qq.com> Date: Thu, 14 Dec 2023 18:36:42 +0800 Subject: [PATCH] Squashed commit of the following: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit a6bf1d5701a0968cc9120efe48e7fe5c2f2bcbb8 Author: zcx <1078327420@qq.com> Date: Thu Dec 14 18:36:19 2023 +0800 UI包一部分 commit a99095dbf958cb855d36fbfb2d0a55833c624fa1 Author: zcx <1078327420@qq.com> Date: Thu Dec 14 18:25:02 2023 +0800 data包 commit b7353d6c78d87569f08313df8fd5ec7341d232e0 Merge: b5f43d0 0b1994e Author: zcx <1078327420@qq.com> Date: Thu Dec 14 18:22:15 2023 +0800 Merge branch 'main' of https://bdgit.educoder.net/pq3fnjual/Minotes into 曾晨曦_branch # Conflicts: # .gitignore # doc/实践模板-开源软件泛读、标注和维护报告文档.docx commit b5f43d07211990d77bd2858abbe5d0509aac389d Author: zcx <1078327420@qq.com> Date: Sun Dec 10 10:38:18 2023 +0800 1 commit a8c79ccdc54d8bafb9a3036f8d759924879e2a11 Author: zcx <1078327420@qq.com> Date: Mon Dec 4 21:09:41 2023 +0800 。 --- .../net/micode/notes/tool/BackupUtils.java | 159 ++++++++--------- .../micode/notes/ui/AlarmAlertActivity.java | 100 ++++++++--- .../micode/notes/ui/AlarmInitReceiver.java | 25 ++- .../net/micode/notes/ui/AlarmReceiver.java | 12 +- .../net/micode/notes/ui/DateTimePicker.java | 164 ++++++++++-------- .../micode/notes/ui/DateTimePickerDialog.java | 43 +++-- .../src/net/micode/notes/ui/DropdownMenu.java | 26 +-- 7 files changed, 307 insertions(+), 222 deletions(-) diff --git a/src/Notes-master/src/net/micode/notes/tool/BackupUtils.java b/src/Notes-master/src/net/micode/notes/tool/BackupUtils.java index 39f6ec4..740fdbb 100644 --- a/src/Notes-master/src/net/micode/notes/tool/BackupUtils.java +++ b/src/Notes-master/src/net/micode/notes/tool/BackupUtils.java @@ -15,76 +15,60 @@ */ package net.micode.notes.tool; - -import android.content.Context; -import android.database.Cursor; -import android.os.Environment; -import android.text.TextUtils; -import android.text.format.DateFormat; -import android.util.Log; - -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.DataColumns; -import net.micode.notes.data.Notes.DataConstants; -import net.micode.notes.data.Notes.NoteColumns; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.PrintStream; - - + public class BackupUtils { - private static final String TAG = "BackupUtils"; + private static final String TAG = "BackupUtils"; // Singleton stuff - private static BackupUtils sInstance; - + private static BackupUtils sInstance; //ΪʲôԶĶ + public static synchronized BackupUtils getInstance(Context context) { + //ynchronized ؼ֣,൱ڲһ̣߳߳A + //еʱ,Ҫû߳BC Dȣ(߸ͬ)еĻҪʹsynchronized߳BC Dд߳A,ûеĻ,,ȻֱС + //÷synchronized synchronized 顣 if (sInstance == null) { + //ǰݲڣһ sInstance = new BackupUtils(context); } return sInstance; } - + /** * Following states are signs to represents backup or restore * status */ - // Currently, the sdcard is not mounted - public static final int STATE_SD_CARD_UNMOUONTED = 0; - // The backup file not exist + // Currently, the sdcard is not mounted SDûбװֻ + public static final int STATE_SD_CARD_UNMOUONTED = 0; + // The backup file not exist ļв public static final int STATE_BACKUP_FILE_NOT_EXIST = 1; - // The data is not well formated, may be changed by other programs + // The data is not well formated, may be changed by other programs ѱƻܱ޸ public static final int STATE_DATA_DESTROIED = 2; - // Some run-time exception which causes restore or backup fails + // Some run-time exception which causes restore or backup fails ʱ쳣 public static final int STATE_SYSTEM_ERROR = 3; - // Backup or restore success + // Backup or restore success ɹ洢 public static final int STATE_SUCCESS = 4; - + private TextExport mTextExport; - - private BackupUtils(Context context) { + + private BackupUtils(Context context) { //ʼ mTextExport = new TextExport(context); } - - private static boolean externalStorageAvailable() { + + private static boolean externalStorageAvailable() { //ⲿ洢Ƿ return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()); } - + public int exportToText() { return mTextExport.exportToText(); } - + public String getExportedTextFileName() { return mTextExport.mFileName; } - + public String getExportedTextFileDir() { return mTextExport.mFileDirectory; } - + private static class TextExport { private static final String[] NOTE_PROJECTION = { NoteColumns.ID, @@ -92,13 +76,13 @@ public class BackupUtils { NoteColumns.SNIPPET, NoteColumns.TYPE }; - + private static final int NOTE_COLUMN_ID = 0; - + private static final int NOTE_COLUMN_MODIFIED_DATE = 1; - + private static final int NOTE_COLUMN_SNIPPET = 2; - + private static final String[] DATA_PROJECTION = { DataColumns.CONTENT, DataColumns.MIME_TYPE, @@ -107,71 +91,71 @@ public class BackupUtils { DataColumns.DATA3, DataColumns.DATA4, }; - + private static final int DATA_COLUMN_CONTENT = 0; - + private static final int DATA_COLUMN_MIME_TYPE = 1; - + private static final int DATA_COLUMN_CALL_DATE = 2; - + private static final int DATA_COLUMN_PHONE_NUMBER = 4; - + private final String [] TEXT_FORMAT; private static final int FORMAT_FOLDER_NAME = 0; private static final int FORMAT_NOTE_DATE = 1; private static final int FORMAT_NOTE_CONTENT = 2; - + private Context mContext; private String mFileName; private String mFileDirectory; - + public TextExport(Context context) { TEXT_FORMAT = context.getResources().getStringArray(R.array.format_for_exported_note); mContext = context; - mFileName = ""; + mFileName = ""; //ΪʲôΪ? mFileDirectory = ""; } - - private String getFormat(int id) { + + private String getFormat(int id) { //ȡıɲ return TEXT_FORMAT[id]; } - + /** * Export the folder identified by folder id to text */ - private void exportFolderToText(String folderId, PrintStream ps) { - // Query notes belong to this folder + private void exportFolderToText(String folderId, PrintStream ps) { + // Query notes belong to this folder ͨѯparent idļidnoteѡƶIDļµNote Cursor notesCursor = mContext.getContentResolver().query(Notes.CONTENT_NOTE_URI, NOTE_PROJECTION, NoteColumns.PARENT_ID + "=?", new String[] { folderId }, null); - - if (notesCursor != null) { + + if (notesCursor != null) { if (notesCursor.moveToFirst()) { do { - // Print note's last modified date + // Print note's last modified date ps汣note ps.println(String.format(getFormat(FORMAT_NOTE_DATE), DateFormat.format( mContext.getString(R.string.format_datetime_mdhm), notesCursor.getLong(NOTE_COLUMN_MODIFIED_DATE)))); // Query data belong to this note String noteId = notesCursor.getString(NOTE_COLUMN_ID); - exportNoteToText(noteId, ps); + exportNoteToText(noteId, ps); //ļtext } while (notesCursor.moveToNext()); } notesCursor.close(); } } - + /** * Export note identified by id to a print stream */ - private void exportNoteToText(String noteId, PrintStream ps) { + private void exportNoteToText(String noteId, PrintStream ps) { Cursor dataCursor = mContext.getContentResolver().query(Notes.CONTENT_DATA_URI, DATA_PROJECTION, DataColumns.NOTE_ID + "=?", new String[] { noteId }, null); - - if (dataCursor != null) { + + if (dataCursor != null) { //ùɨݣΪcallnotenote֣ps.printline if (dataCursor.moveToFirst()) { do { String mimeType = dataCursor.getString(DATA_COLUMN_MIME_TYPE); @@ -180,8 +164,8 @@ public class BackupUtils { String phoneNumber = dataCursor.getString(DATA_COLUMN_PHONE_NUMBER); long callDate = dataCursor.getLong(DATA_COLUMN_CALL_DATE); String location = dataCursor.getString(DATA_COLUMN_CONTENT); - - if (!TextUtils.isEmpty(phoneNumber)) { + + if (!TextUtils.isEmpty(phoneNumber)) { //жǷΪַ ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), phoneNumber)); } @@ -214,29 +198,29 @@ public class BackupUtils { Log.e(TAG, e.toString()); } } - + /** * Note will be exported as text which is user readable */ - public int exportToText() { + public int exportToText() { //ܺexportFolderexportNote if (!externalStorageAvailable()) { Log.d(TAG, "Media was not mounted"); return STATE_SD_CARD_UNMOUONTED; } - + PrintStream ps = getExportToTextPrintStream(); if (ps == null) { Log.e(TAG, "get print stream error"); return STATE_SYSTEM_ERROR; } - // First export folder and its notes + // First export folder and its notes ļУǵıǩ Cursor folderCursor = mContext.getContentResolver().query( Notes.CONTENT_NOTE_URI, NOTE_PROJECTION, "(" + NoteColumns.TYPE + "=" + Notes.TYPE_FOLDER + " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + ") OR " + NoteColumns.ID + "=" + Notes.ID_CALL_RECORD_FOLDER, null, null); - + if (folderCursor != null) { if (folderCursor.moveToFirst()) { do { @@ -256,14 +240,14 @@ public class BackupUtils { } folderCursor.close(); } - - // Export notes in root's folder + + // Export notes in root's folder Ŀ¼ıǩڲκļУ޷ͨļеʵһֱǩĵ Cursor noteCursor = mContext.getContentResolver().query( Notes.CONTENT_NOTE_URI, NOTE_PROJECTION, NoteColumns.TYPE + "=" + +Notes.TYPE_NOTE + " AND " + NoteColumns.PARENT_ID + "=0", null, null); - + if (noteCursor != null) { if (noteCursor.moveToFirst()) { do { @@ -278,14 +262,14 @@ public class BackupUtils { noteCursor.close(); } ps.close(); - + return STATE_SUCCESS; } - + /** * Get a print stream pointed to the file {@generateExportedTextFile} */ - private PrintStream getExportToTextPrintStream() { + private PrintStream getExportToTextPrintStream() { File file = generateFileMountedOnSDcard(mContext, R.string.file_path, R.string.file_name_txt_format); if (file == null) { @@ -297,7 +281,7 @@ public class BackupUtils { PrintStream ps = null; try { FileOutputStream fos = new FileOutputStream(file); - ps = new PrintStream(fos); + ps = new PrintStream(fos); //psضļĿľǵļֱ } catch (FileNotFoundException e) { e.printStackTrace(); return null; @@ -308,22 +292,22 @@ public class BackupUtils { return ps; } } - + /** * Generate the text file to store imported data */ private static File generateFileMountedOnSDcard(Context context, int filePathResId, int fileNameFormatResId) { StringBuilder sb = new StringBuilder(); - sb.append(Environment.getExternalStorageDirectory()); - sb.append(context.getString(filePathResId)); - File filedir = new File(sb.toString()); + sb.append(Environment.getExternalStorageDirectory()); //ⲿSDĴ洢· + sb.append(context.getString(filePathResId)); //ļĴ洢· + File filedir = new File(sb.toString()); //filedirӦþ洢·Ϣ sb.append(context.getString( fileNameFormatResId, DateFormat.format(context.getString(R.string.format_date_ymd), System.currentTimeMillis()))); File file = new File(sb.toString()); - - try { + + try { //Щļڣ½ if (!filedir.exists()) { filedir.mkdir(); } @@ -336,9 +320,8 @@ public class BackupUtils { } catch (IOException e) { e.printStackTrace(); } - +// try catch 쳣 return null; } } - - + \ No newline at end of file diff --git a/src/Notes-master/src/net/micode/notes/ui/AlarmAlertActivity.java b/src/Notes-master/src/net/micode/notes/ui/AlarmAlertActivity.java index 85723be..7fc5aec 100644 --- a/src/Notes-master/src/net/micode/notes/ui/AlarmAlertActivity.java +++ b/src/Notes-master/src/net/micode/notes/ui/AlarmAlertActivity.java @@ -15,7 +15,7 @@ */ package net.micode.notes.ui; - + import android.app.Activity; import android.app.AlertDialog; import android.content.Context; @@ -32,68 +32,91 @@ import android.os.PowerManager; import android.provider.Settings; import android.view.Window; import android.view.WindowManager; - + import net.micode.notes.R; import net.micode.notes.data.Notes; import net.micode.notes.tool.DataUtils; - + import java.io.IOException; - - + public class AlarmAlertActivity extends Activity implements OnClickListener, OnDismissListener { - private long mNoteId; - private String mSnippet; + private long mNoteId; //ıݿ洢еID + private String mSnippet; //ʾʱֵıƬ private static final int SNIPPET_PREW_MAX_LEN = 60; MediaPlayer mPlayer; - + @Override - protected void onCreate(Bundle savedInstanceState) { + protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + //Bundle͵Map͵ƣkey-valueʽ洢ݵ + //onsaveInstanceStateActivity״̬ + //ܴonCreateIJsavedInsanceStateл״̬ requestWindowFeature(Window.FEATURE_NO_TITLE); - + //ʾޱ + final Window win = getWindow(); win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); - + if (!isScreenOn()) { win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON + //ִ | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON + // | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON + //ʱ | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR); - } - + }//ֻʾʱ䣬Ļ + Intent intent = getIntent(); - + try { mNoteId = Long.valueOf(intent.getData().getPathSegments().get(1)); mSnippet = DataUtils.getSnippetById(this.getContentResolver(), mNoteId); + //IDݿлȡǩݣ + //getContentResolverʵݹʵ洢 mSnippet = mSnippet.length() > SNIPPET_PREW_MAX_LEN ? mSnippet.substring(0, SNIPPET_PREW_MAX_LEN) + getResources().getString(R.string.notelist_string_info) : mSnippet; + //жϱǩƬǷﵽϳ } catch (IllegalArgumentException e) { e.printStackTrace(); return; } - + /* + try + { + // + } + catch(Exception e) + { + // 쳣 + } + д󣬾ͻ᷵д쳣Ĵ*/ mPlayer = new MediaPlayer(); if (DataUtils.visibleInNoteDatabase(getContentResolver(), mNoteId, Notes.TYPE_NOTE)) { showActionDialog(); + //Ի playAlarmSound(); + //ʾ } else { finish(); + //Ӷ } } - + private boolean isScreenOn() { + //жĻǷϵͳжϣ󷵻ֵDz PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); return pm.isScreenOn(); } - + private void playAlarmSound() { + //ʾ Uri url = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_ALARM); - + //ϵͳURIõʾ int silentModeStreams = Settings.System.getInt(getContentResolver(), Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0); - + if ((silentModeStreams & (1 << AudioManager.STREAM_ALARM)) != 0) { mPlayer.setAudioStreamType(silentModeStreams); } else { @@ -101,12 +124,19 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD } try { mPlayer.setDataSource(this, url); + //setDataSource(Context context, Uri uri) + //ͣ޷ֵöýԴ Uri mPlayer.prepare(); + //׼ͬ mPlayer.setLooping(true); + //Ƿѭ mPlayer.start(); + //ʼ } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); + //e.printStackTrace()׳쳣 ʾĵϢ + //System.out.println(e)ӡ쳣ֵ쳣 } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); @@ -118,41 +148,61 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD e.printStackTrace(); } } - + private void showActionDialog() { AlertDialog.Builder dialog = new AlertDialog.Builder(this); + //AlertDialogĹ췽ȫProtected + //ԲֱͨnewһAlertDialogһAlertDialog + //ҪһAlertDialogҪõAlertDialog.Builderеcreate() + //dialog½һAlertDialog dialog.setTitle(R.string.app_name); + //ΪԻñ dialog.setMessage(mSnippet); + //ΪԻ dialog.setPositiveButton(R.string.notealert_ok, this); + //Ի"Yes"ť if (isScreenOn()) { dialog.setNegativeButton(R.string.notealert_enter, this); - } + }//Ի"No"ť dialog.show().setOnDismissListener(this); } - + public void onClick(DialogInterface dialog, int which) { switch (which) { + //whichѡclickһIJ case DialogInterface.BUTTON_NEGATIVE: + //ȡ Intent intent = new Intent(this, NoteEditActivity.class); + //ʵݴ intent.setAction(Intent.ACTION_VIEW); + //ö intent.putExtra(Intent.EXTRA_UID, mNoteId); + //ʵkey-value + //EXTRA_UIDΪkeymNoteIdΪ startActivity(intent); + //ʼ break; default: + //ȷ break; } } - + public void onDismiss(DialogInterface dialog) { + // stopAlarmSound(); + //ֹͣ finish(); + //ɸö } - + private void stopAlarmSound() { if (mPlayer != null) { mPlayer.stop(); + //ֹͣ mPlayer.release(); + //ͷMediaPlayer mPlayer = null; } } -} +} \ No newline at end of file diff --git a/src/Notes-master/src/net/micode/notes/ui/AlarmInitReceiver.java b/src/Notes-master/src/net/micode/notes/ui/AlarmInitReceiver.java index f221202..16951b9 100644 --- a/src/Notes-master/src/net/micode/notes/ui/AlarmInitReceiver.java +++ b/src/Notes-master/src/net/micode/notes/ui/AlarmInitReceiver.java @@ -15,7 +15,7 @@ */ package net.micode.notes.ui; - + import android.app.AlarmManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; @@ -23,30 +23,34 @@ import android.content.ContentUris; import android.content.Context; import android.content.Intent; import android.database.Cursor; - + import net.micode.notes.data.Notes; import net.micode.notes.data.Notes.NoteColumns; - - + + public class AlarmInitReceiver extends BroadcastReceiver { - + private static final String [] PROJECTION = new String [] { NoteColumns.ID, NoteColumns.ALERTED_DATE }; - + //ݿIJñǩIDʱ private static final int COLUMN_ID = 0; private static final int COLUMN_ALERTED_DATE = 1; - + @Override public void onReceive(Context context, Intent intent) { long currentDate = System.currentTimeMillis(); + //System.currentTimeMillis()һǰĺ + //ʵ1970110ʱĺ Cursor c = context.getContentResolver().query(Notes.CONTENT_NOTE_URI, PROJECTION, NoteColumns.ALERTED_DATE + ">? AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE, new String[] { String.valueOf(currentDate) }, + //longcurrentDateתΪַ null); - + //Cursorͨݿеıǩݣҵ͵ǰϵͳʱȵıǩ + if (c != null) { if (c.moveToFirst()) { do { @@ -61,5 +65,8 @@ public class AlarmInitReceiver extends BroadcastReceiver { } c.close(); } + //ȻͨϲϷ֣ӻƵͨҪļ + //½IntentPendingIntentԼAlarmManager + //Ǹݿʱ䴴һӻ } -} +} \ No newline at end of file diff --git a/src/Notes-master/src/net/micode/notes/ui/AlarmReceiver.java b/src/Notes-master/src/net/micode/notes/ui/AlarmReceiver.java index 54e503b..eb4b388 100644 --- a/src/Notes-master/src/net/micode/notes/ui/AlarmReceiver.java +++ b/src/Notes-master/src/net/micode/notes/ui/AlarmReceiver.java @@ -15,16 +15,22 @@ */ package net.micode.notes.ui; - + import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; - + public class AlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { - intent.setClass(context, AlarmAlertActivity.class); + intent.setClass(context, AlarmAlertActivity.class); + //AlarmAlertActivity intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + //activityҪactivityջУactivity;activityʱȻһactivityջ + //Ҫһջװactivity context.startActivity(intent); } } +//ʵalarmӽûİ +//ûҪǶsetClassaddFlags + \ No newline at end of file diff --git a/src/Notes-master/src/net/micode/notes/ui/DateTimePicker.java b/src/Notes-master/src/net/micode/notes/ui/DateTimePicker.java index 496b0cd..e00be38 100644 --- a/src/Notes-master/src/net/micode/notes/ui/DateTimePicker.java +++ b/src/Notes-master/src/net/micode/notes/ui/DateTimePicker.java @@ -15,23 +15,24 @@ */ package net.micode.notes.ui; - + import java.text.DateFormatSymbols; import java.util.Calendar; - + import net.micode.notes.R; - - + + import android.content.Context; import android.text.format.DateFormat; import android.view.View; import android.widget.FrameLayout; import android.widget.NumberPicker; - + public class DateTimePicker extends FrameLayout { - + //FrameLayoutDzģ֮һ + //еԪȫĻϷ 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; @@ -45,25 +46,27 @@ public class DateTimePicker extends FrameLayout { 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; + //NumberPickerѡ + //ﶨĸȫʱҪѡıڡʱ֡磩 private Calendar mDate; - + //Calendar͵ımDateڲʱ private String[] mDateDisplayValues = new String[DAYS_IN_ALL_WEEK]; - + private boolean mIsAm; - + 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) { @@ -71,41 +74,49 @@ public class DateTimePicker extends FrameLayout { updateDateControl(); onDateTimeChanged(); } - }; - + };//OnValueChangeListenerʱıҪǶڵļ + //ڵֵݸmDateupdateDateControlͬ + private NumberPicker.OnValueChangeListener mOnHourChangedListener = new NumberPicker.OnValueChangeListener() { - @Override + //Ƕ СʱHour ļ + @Override public void onValueChange(NumberPicker picker, int oldVal, int newVal) { boolean isDateChanged = false; Calendar cal = Calendar.getInstance(); + //һCalendarıcalںIJ if (!mIs24HourView) { if (!mIsAm && oldVal == HOURS_IN_HALF_DAY - 1 && newVal == HOURS_IN_HALF_DAY) { cal.setTimeInMillis(mDate.getTimeInMillis()); cal.add(Calendar.DAY_OF_YEAR, 1); isDateChanged = true; + //Ƕ12Сʱʱ1112㽻ʱڵĸ } else if (mIsAm && oldVal == HOURS_IN_HALF_DAY && newVal == HOURS_IN_HALF_DAY - 1) { cal.setTimeInMillis(mDate.getTimeInMillis()); cal.add(Calendar.DAY_OF_YEAR, -1); isDateChanged = true; - } + } + //Ƕ12Сʱʱ賿1112㽻ʱڵĸ 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(); - } + }//Ƕ12Сʱʱ1112㽻ʱAMPMĸ } else { if (oldVal == HOURS_IN_ALL_DAY - 1 && newVal == 0) { cal.setTimeInMillis(mDate.getTimeInMillis()); cal.add(Calendar.DAY_OF_YEAR, 1); isDateChanged = true; + //Ƕ24Сʱʱ1112㽻ʱڵĸ } else if (oldVal == 0 && newVal == HOURS_IN_ALL_DAY - 1) { cal.setTimeInMillis(mDate.getTimeInMillis()); cal.add(Calendar.DAY_OF_YEAR, -1); isDateChanged = true; } - } + } //Ƕ12Сʱʱ賿1112㽻ʱڵĸ int newHour = mHourSpinner.getValue() % HOURS_IN_HALF_DAY + (mIsAm ? 0 : HOURS_IN_HALF_DAY); + //ͨѡnewHourĸֵ mDate.set(Calendar.HOUR_OF_DAY, newHour); + //ͨsetµHourֵmDate onDateTimeChanged(); if (isDateChanged) { setCurrentYear(cal.get(Calendar.YEAR)); @@ -114,18 +125,22 @@ public class DateTimePicker extends FrameLayout { } } }; - + private NumberPicker.OnValueChangeListener mOnMinuteChangedListener = new NumberPicker.OnValueChangeListener() { @Override + //Ƕ ӣMinuteıļ public void onValueChange(NumberPicker picker, int oldVal, int newVal) { int minValue = mMinuteSpinner.getMinValue(); int maxValue = mMinuteSpinner.getMaxValue(); int offset = 0; + //offsetΪСʱıһ¼ if (oldVal == maxValue && newVal == minValue) { offset += 1; } else if (oldVal == minValue && newVal == maxValue) { offset -= 1; } + //ԭֵΪ59ֵΪ0offset1 + //ԭֵΪ0ֵΪ59offset1 if (offset != 0) { mDate.add(Calendar.HOUR_OF_DAY, offset); mHourSpinner.setValue(getCurrentHour()); @@ -143,9 +158,10 @@ public class DateTimePicker extends FrameLayout { onDateTimeChanged(); } }; - + private NumberPicker.OnValueChangeListener mOnAmPmChangedListener = new NumberPicker.OnValueChangeListener() { - @Override + //AMPMļ + @Override public void onValueChange(NumberPicker picker, int oldVal, int newVal) { mIsAm = !mIsAm; if (mIsAm) { @@ -157,63 +173,66 @@ public class DateTimePicker extends FrameLayout { onDateTimeChanged(); } }; - + 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()); - } - + }//ͨݿķʣȡǰϵͳʱ + public DateTimePicker(Context context, long date) { this(context, date, DateFormat.is24HourFormat(context)); - } - + }//溯ĵõһ֣1970ҪDateFormat + public DateTimePicker(Context context, long date, boolean is24HourView) { super(context); + //ȡϵͳʱ mDate = Calendar.getInstance(); mInitialising = true; mIsAm = getCurrentHourOfDay() >= HOURS_IN_HALF_DAY; inflate(context, R.layout.datetime_picker, this); - + //ǰActivityõlayoutԻlayout + //Ҫlayoutϵݣͱinflate()ȽԻlayoutҳ + //ȻfindViewById()ҵ 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 = (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); mAmPmSpinner.setMaxValue(AMPM_SPINNER_MAX_VAL); mAmPmSpinner.setDisplayedValues(stringsForAmPm); mAmPmSpinner.setOnValueChangedListener(mOnAmPmChangedListener); - + // update controls to initial state updateDateControl(); updateHourControl(); updateAmPmControl(); - + 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,12 +245,14 @@ public class DateTimePicker extends FrameLayout { mAmPmSpinner.setEnabled(enabled); mIsEnabled = enabled; } - + //ʣsetEnabled + //ĴͨԭעѾȽͨж + //ĸҪǶõĸܵʵ @Override public boolean isEnabled() { return mIsEnabled; } - + /** * Get the current date in millis * @@ -239,8 +260,8 @@ public class DateTimePicker extends FrameLayout { */ public long getCurrentDateInTimeMillis() { return mDate.getTimeInMillis(); - } - + }//ʵֺõǰ + /** * Set the current date * @@ -251,8 +272,8 @@ public class DateTimePicker extends FrameLayout { cal.setTimeInMillis(date); setCurrentDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE)); - } - + }//ʵֺܡõǰʱ䣬date + /** * Set the current date * @@ -269,17 +290,18 @@ public class DateTimePicker extends FrameLayout { setCurrentDay(dayOfMonth); setCurrentHour(hourOfDay); setCurrentMinute(minute); - } - + }//ʵֺܡõǰʱ䣬Ǹϸı + /** * Get current year * * @return The current year */ + //ǵõyearmonthdayֵ public int getCurrentYear() { return mDate.get(Calendar.YEAR); } - + /** * Set current year * @@ -293,7 +315,7 @@ public class DateTimePicker extends FrameLayout { updateDateControl(); onDateTimeChanged(); } - + /** * Get current month in the year * @@ -302,7 +324,7 @@ public class DateTimePicker extends FrameLayout { public int getCurrentMonth() { return mDate.get(Calendar.MONTH); } - + /** * Set current month in the year * @@ -316,7 +338,7 @@ public class DateTimePicker extends FrameLayout { updateDateControl(); onDateTimeChanged(); } - + /** * Get current day of the month * @@ -325,7 +347,7 @@ public class DateTimePicker extends FrameLayout { public int getCurrentDay() { return mDate.get(Calendar.DAY_OF_MONTH); } - + /** * Set current day of the month * @@ -339,7 +361,7 @@ public class DateTimePicker extends FrameLayout { updateDateControl(); onDateTimeChanged(); } - + /** * Get current hour in 24 hour mode, in the range (0~23) * @return The current hour in 24 hour mode @@ -347,7 +369,7 @@ public class DateTimePicker extends FrameLayout { public int getCurrentHourOfDay() { return mDate.get(Calendar.HOUR_OF_DAY); } - + private int getCurrentHour() { if (mIs24HourView){ return getCurrentHourOfDay(); @@ -360,7 +382,7 @@ public class DateTimePicker extends FrameLayout { } } } - + /** * Set current hour in 24 hour mode, in the range (0~23) * @@ -388,7 +410,7 @@ public class DateTimePicker extends FrameLayout { mHourSpinner.setValue(hourOfDay); onDateTimeChanged(); } - + /** * Get currentMinute * @@ -397,7 +419,7 @@ public class DateTimePicker extends FrameLayout { public int getCurrentMinute() { return mDate.get(Calendar.MINUTE); } - + /** * Set current minute */ @@ -409,14 +431,14 @@ public class DateTimePicker extends FrameLayout { mDate.set(Calendar.MINUTE, minute); onDateTimeChanged(); } - + /** * @return true if this is in 24 hour view else false. */ public boolean is24HourView () { return mIs24HourView; } - + /** * Set whether in 24 hour or AM/PM mode. * @@ -433,7 +455,7 @@ public class DateTimePicker extends FrameLayout { setCurrentHour(hour); updateAmPmControl(); } - + private void updateDateControl() { Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(mDate.getTimeInMillis()); @@ -446,8 +468,8 @@ public class DateTimePicker extends FrameLayout { mDateSpinner.setDisplayedValues(mDateDisplayValues); mDateSpinner.setValue(DAYS_IN_ALL_WEEK / 2); mDateSpinner.invalidate(); - } - + }// ڼ㷨 + private void updateAmPmControl() { if (mIs24HourView) { mAmPmSpinner.setVisibility(View.GONE); @@ -455,9 +477,9 @@ public class DateTimePicker extends FrameLayout { int index = mIsAm ? Calendar.AM : Calendar.PM; mAmPmSpinner.setValue(index); mAmPmSpinner.setVisibility(View.VISIBLE); - } + }// 㷨 } - + private void updateHourControl() { if (mIs24HourView) { mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW); @@ -465,9 +487,9 @@ public class DateTimePicker extends FrameLayout { } else { mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_12_HOUR_VIEW); mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_12_HOUR_VIEW); - } + }// Сʱ㷨 } - + /** * Set the callback that indicates the 'Set' button has been pressed. * @param callback the callback, if null will do nothing @@ -475,11 +497,11 @@ public class DateTimePicker extends FrameLayout { public void setOnDateTimeChangedListener(OnDateTimeChangedListener callback) { mOnDateTimeChangedListener = callback; } - + private void onDateTimeChanged() { if (mOnDateTimeChangedListener != null) { mOnDateTimeChangedListener.onDateTimeChanged(this, getCurrentYear(), getCurrentMonth(), getCurrentDay(), getCurrentHourOfDay(), getCurrentMinute()); - } + } } -} +} \ No newline at end of file diff --git a/src/Notes-master/src/net/micode/notes/ui/DateTimePickerDialog.java b/src/Notes-master/src/net/micode/notes/ui/DateTimePickerDialog.java index 2c47ba4..0dcfb80 100644 --- a/src/Notes-master/src/net/micode/notes/ui/DateTimePickerDialog.java +++ b/src/Notes-master/src/net/micode/notes/ui/DateTimePickerDialog.java @@ -15,35 +15,42 @@ */ package net.micode.notes.ui; - + import java.util.Calendar; - + import net.micode.notes.R; import net.micode.notes.ui.DateTimePicker; import net.micode.notes.ui.DateTimePicker.OnDateTimeChangedListener; - + import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.text.format.DateFormat; import android.text.format.DateUtils; - + public class DateTimePickerDialog extends AlertDialog implements OnClickListener { - + private Calendar mDate = Calendar.getInstance(); + //һCalendar͵ı mDateʱIJ private boolean mIs24HourView; private OnDateTimeSetListener mOnDateTimeSetListener; + //һʱڹѡؼ mOnDateTimeSetListener private DateTimePicker mDateTimePicker; - + //DateTimePickerؼؼһûԴбѡ񵥸ֵ + //ʱؼϵͷʾΪ֣һбһѡڵ + public interface OnDateTimeSetListener { void OnDateTimeSet(AlertDialog dialog, long date); } - + public DateTimePickerDialog(Context context, long date) { + //ԸýԻʵ super(context); + //ݿIJ 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) { @@ -52,26 +59,31 @@ public class DateTimePickerDialog extends AlertDialog implements OnClickListener 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); + //Ϊ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()); } - + public void set24HourView(boolean is24HourView) { mIs24HourView = is24HourView; } - + public void setOnDateTimeSetListener(OnDateTimeSetListener callBack) { mOnDateTimeSetListener = callBack; - } - + }//ʱڹѡؼʵ + private void updateTitle(long date) { int flag = DateUtils.FORMAT_SHOW_YEAR | @@ -79,12 +91,13 @@ public class DateTimePickerDialog extends AlertDialog implements OnClickListener DateUtils.FORMAT_SHOW_TIME; flag |= mIs24HourView ? DateUtils.FORMAT_24HOUR : DateUtils.FORMAT_24HOUR; setTitle(DateUtils.formatDateTime(this.getContext(), date, flag)); - } - + }//androidгڹࣨAPIDateUtilsʾʱ + public void onClick(DialogInterface arg0, int arg1) { if (mOnDateTimeSetListener != null) { mOnDateTimeSetListener.OnDateTimeSet(this, mDate.getTimeInMillis()); } - } - + }//һarg0ǽյ¼ĶԻ + //ڶarg1ǸöԻϵİť + } \ No newline at end of file diff --git a/src/Notes-master/src/net/micode/notes/ui/DropdownMenu.java b/src/Notes-master/src/net/micode/notes/ui/DropdownMenu.java index 613dc74..c8d0835 100644 --- a/src/Notes-master/src/net/micode/notes/ui/DropdownMenu.java +++ b/src/Notes-master/src/net/micode/notes/ui/DropdownMenu.java @@ -15,7 +15,7 @@ */ package net.micode.notes.ui; - + import android.content.Context; import android.view.Menu; import android.view.MenuItem; @@ -24,38 +24,42 @@ import android.view.View.OnClickListener; import android.widget.Button; import android.widget.PopupMenu; import android.widget.PopupMenu.OnMenuItemClickListener; - + import net.micode.notes.R; - + public class DropdownMenu { 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); + //viewı mPopupMenu = new PopupMenu(context, mButton); mMenu = mPopupMenu.getMenu(); mPopupMenu.getMenuInflater().inflate(menuId, mMenu); + //MenuInflaterʵMenuĿ¼µMenuļ + //IDȷmenuѡ mButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { mPopupMenu.show(); } }); } - + public void setOnDropdownMenuItemClickListener(OnMenuItemClickListener listener) { if (mPopupMenu != null) { mPopupMenu.setOnMenuItemClickListener(listener); - } + }//ò˵ļ } - + public MenuItem findItem(int id) { return mMenu.findItem(id); - } - + }//ڲ˵ѡijʼ˵Ҫѡ + public void setTitle(CharSequence title) { mButton.setText(title); - } -} + }//ļñ +} \ No newline at end of file