Compare commits

...

18 Commits

Author SHA1 Message Date
lyy bcc54e841a Merge branch 'master' of https://bdgit.educoder.net/p82fie9y6/Notes-master
1 year ago
lyy da1bcf2436 完成
1 year ago
lyy b9e54a336b 总结
1 year ago
lyy 0dd138191c 维护文档
1 year ago
lyy 90ca66e737 精读注释
1 year ago
lyy dfdee18119 Merge branch 'develop' of https://bdgit.educoder.net/p82fie9y6/Notes-master into develop
1 year ago
lyy 814967bce3 Squashed commit of the following:
1 year ago
lyy 85eea4ea72 Merge branch 'develop' of https://bdgit.educoder.net/p82fie9y6/Notes-master into text
1 year ago
lyy e386d33ba0 Squashed commit of the following:
1 year ago
lyy c8e65c4496 打开回收站
1 year ago
lyy 9816a0b8b8 在非回收站处删除便签时,移入回收站;在回收站删除便签时,彻底删除
1 year ago
lyy 4d298a1d1c 精读
1 year ago
lyy 29dd857eae 报告
1 year ago
lyy 04d774fb4f 精读标注
1 year ago
lyy b38189d2e9 泛读报告
1 year ago
lyy d16d33bf60 精读标注
1 year ago
lyy 9801f62dc6 精读标注
1 year ago
lyy 20aa128028 泛读
1 year ago

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>

@ -0,0 +1,6 @@
projectKey=Notesmaster
serverUrl=http://localhost:9000
serverVersion=10.4.1.88267
dashboardUrl=http://localhost:9000/dashboard?id=Notesmaster
ceTaskId=2019e6c5-c99a-4acb-9b67-55523a27ab64
ceTaskUrl=http://localhost:9000/api/ce/task?id=2019e6c5-c99a-4acb-9b67-55523a27ab64

@ -1,4 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<<<<<<< HEAD
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.micode.notes"
android:versionCode="1"
android:versionName="0.1">
=======
<!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
@ -19,6 +25,7 @@
package="net.micode.notes"
android:versionCode="1"
android:versionName="0.1" >
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
<uses-sdk android:minSdkVersion="14" />
@ -33,6 +40,35 @@
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
<<<<<<< HEAD
android:icon="@drawable/icon_app"
android:label="@string/app_name">
<activity
android:name=".ui.RecycleBinActivity"
android:exported="true" />
<activity
android:name=".ui.NotesListActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:label="@string/app_name"
android:launchMode="singleTop"
android:theme="@style/NoteTheme"
android:uiOptions="splitActionBarWhenNarrow"
android:windowSoftInputMode="adjustPan">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ui.NoteEditActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:launchMode="singleTop"
android:theme="@style/NoteTheme">
=======
android:icon="@drawable/icon_app"
android:label="@string/app_name" >
<activity
@ -58,12 +94,26 @@
android:exported="true"
android:theme="@style/NoteTheme" >
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.item/text_note" />
<data android:mimeType="vnd.android.cursor.item/call_note" />
</intent-filter>
<<<<<<< HEAD
<intent-filter>
<action android:name="android.intent.action.INSERT_OR_EDIT" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.item/text_note" />
<data android:mimeType="vnd.android.cursor.item/call_note" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
=======
<intent-filter>
<action android:name="android.intent.action.INSERT_OR_EDIT" />
@ -74,10 +124,27 @@
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data
<<<<<<< HEAD
android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>
<provider
android:name=".data.NotesProvider"
android:authorities="micode_notes"
android:exported="true"
android:multiprocess="true" />
<receiver
android:name=".widget.NoteWidgetProvider_2x"
android:exported="true"
android:label="@string/app_widget2x2">
=======
android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>
@ -92,6 +159,7 @@
android:name=".widget.NoteWidgetProvider_2x"
android:exported="true"
android:label="@string/app_widget2x2" >
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="android.appwidget.action.APPWIDGET_DELETED" />
@ -99,6 +167,15 @@
</intent-filter>
<meta-data
<<<<<<< HEAD
android:name="android.appwidget.provider"
android:resource="@xml/widget_2x_info" />
</receiver>
<receiver
android:name=".widget.NoteWidgetProvider_4x"
android:exported="true"
android:label="@string/app_widget4x4">
=======
android:name="android.appwidget.provider"
android:resource="@xml/widget_2x_info" />
</receiver>
@ -107,6 +184,7 @@
android:exported="true"
android:label="@string/app_widget4x4" >
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="android.appwidget.action.APPWIDGET_DELETED" />
@ -114,16 +192,52 @@
</intent-filter>
<meta-data
<<<<<<< HEAD
android:name="android.appwidget.provider"
android:resource="@xml/widget_4x_info" />
</receiver>
<receiver
android:name=".ui.AlarmInitReceiver"
android:exported="true">
=======
android:name="android.appwidget.provider"
android:resource="@xml/widget_4x_info" />
</receiver>
<receiver android:name=".ui.AlarmInitReceiver"
android:exported="true">
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<<<<<<< HEAD
<receiver
android:name=".ui.AlarmReceiver"
android:process=":remote"></receiver>
<activity
android:name=".ui.AlarmAlertActivity"
android:label="@string/app_name"
android:launchMode="singleInstance"
android:theme="@android:style/Theme.Holo.Wallpaper.NoTitleBar"></activity>
<activity
android:name=".ui.NotesPreferenceActivity"
android:label="@string/preferences_title"
android:launchMode="singleTop"
android:theme="@android:style/Theme.Holo.Light"></activity>
<service
android:name=".gtask.remote.GTaskSyncService"
android:exported="false"></service>
<meta-data
android:name="android.app.default_searchable"
android:value=".ui.NoteEditActivity" />
</application>
</manifest>
=======
<receiver
android:name="net.micode.notes.ui.AlarmReceiver"
@ -154,3 +268,4 @@
android:value=".ui.NoteEditActivity" />
</application>
</manifest>
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0

@ -0,0 +1,6 @@
projectKey=NotesMaster
serverUrl=http://localhost:9000
serverVersion=10.4.1.88267
dashboardUrl=http://localhost:9000/dashboard?id=NotesMaster
ceTaskId=28879bc4-8782-4a98-bdff-28ee9ac42f78
ceTaskUrl=http://localhost:9000/api/ce/task?id=28879bc4-8782-4a98-bdff-28ee9ac42f78

@ -25,7 +25,11 @@ import android.util.Log;
import java.util.HashMap;
<<<<<<< HEAD
public class Contact {//联系人数据库
=======
public class Contact {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private static HashMap<String, String> sContactCache;
private static final String TAG = "Contact";

@ -17,7 +17,11 @@
package net.micode.notes.data;
import android.net.Uri;
<<<<<<< HEAD
public class Notes {//便签数据库,用于记录便签相关属性和数据
=======
public class Notes {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
public static final String AUTHORITY = "micode_notes";
public static final String TAG = "Notes";
public static final int TYPE_NOTE = 0;

@ -27,7 +27,11 @@ import net.micode.notes.data.Notes.DataConstants;
import net.micode.notes.data.Notes.NoteColumns;
<<<<<<< HEAD
public class NotesDatabaseHelper extends SQLiteOpenHelper {//数据库帮助类,用于辅助创建、处理数据库的条目
=======
public class NotesDatabaseHelper extends SQLiteOpenHelper {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private static final String DB_NAME = "note.db";
private static final int DB_VERSION = 4;

@ -35,7 +35,11 @@ import net.micode.notes.data.Notes.NoteColumns;
import net.micode.notes.data.NotesDatabaseHelper.TABLE;
<<<<<<< HEAD
public class NotesProvider extends ContentProvider {//便签信息提供类
=======
public class NotesProvider extends ContentProvider {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private static final UriMatcher mMatcher;
private NotesDatabaseHelper mHelper;

@ -20,7 +20,11 @@ import android.database.Cursor;
import org.json.JSONObject;
<<<<<<< HEAD
public abstract class Node {//同步任务的管理结点,用于设置、保存同步动作的信息
=======
public abstract class Node {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
public static final int SYNC_ACTION_NONE = 0;
public static final int SYNC_ACTION_ADD_REMOTE = 1;

@ -35,7 +35,11 @@ import org.json.JSONException;
import org.json.JSONObject;
<<<<<<< HEAD
public class SqlData {//数据库中基本数据,方法包括读取数据、获取数据库中数据、提交数据到数据库
=======
public class SqlData {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private static final String TAG = SqlData.class.getSimpleName();
private static final int INVALID_ID = -99999;

@ -38,7 +38,11 @@ import org.json.JSONObject;
import java.util.ArrayList;
<<<<<<< HEAD
public class SqlNote {//数据库中便签数据,方法包括读取便签内容、从数据库中获取便签数据、设置便签内容、提交便签数据到数据库
=======
public class SqlNote {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private static final String TAG = SqlNote.class.getSimpleName();
private static final int INVALID_ID = -99999;

@ -32,7 +32,11 @@ import org.json.JSONException;
import org.json.JSONObject;
<<<<<<< HEAD
public class Task extends Node {//同步任务将创建、更新和同步动作包装成JSON对象用本地和远程的JSON对结点内容进行设置获取同步信息进行本地和远程的同步
=======
public class Task extends Node {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private static final String TAG = Task.class.getSimpleName();
private boolean mCompleted;

@ -30,7 +30,11 @@ import org.json.JSONObject;
import java.util.ArrayList;
<<<<<<< HEAD
public class TaskList extends Node {//同步任务列表将Task组织成同步任务列表进行管理
=======
public class TaskList extends Node {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private static final String TAG = TaskList.class.getSimpleName();
private int mIndex;

@ -16,7 +16,11 @@
package net.micode.notes.gtask.exception;
<<<<<<< HEAD
public class ActionFailureException extends RuntimeException {//动作失败异常
=======
public class ActionFailureException extends RuntimeException {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private static final long serialVersionUID = 4425249765923293627L;
public ActionFailureException() {

@ -16,7 +16,11 @@
package net.micode.notes.gtask.exception;
<<<<<<< HEAD
public class NetworkFailureException extends Exception {//网络异常失败
=======
public class NetworkFailureException extends Exception {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private static final long serialVersionUID = 2107610287180234136L;
public NetworkFailureException() {

@ -63,7 +63,11 @@ public class GTaskASyncTask extends AsyncTask<Void, String, Integer> {
});
}
<<<<<<< HEAD
private void showNotification(int tickerId, String content) {//GTask异步任务方法包括任务同步和取消显示同步任务的进程、通知和结果
=======
private void showNotification(int tickerId, String content) {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
PendingIntent pendingIntent;
if (tickerId != R.string.ticker_success) {
pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,

@ -61,7 +61,11 @@ import java.util.zip.Inflater;
import java.util.zip.InflaterInputStream;
<<<<<<< HEAD
public class GTaskClient {//GTask客户端提供登录Google账户创建任务和任务列表添加和删除结点提交、重置更新、获取任务列表等功能
=======
public class GTaskClient {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private static final String TAG = GTaskClient.class.getSimpleName();
private static final String GTASK_URL = "https://mail.google.com/tasks/";

@ -48,7 +48,11 @@ import java.util.Iterator;
import java.util.Map;
<<<<<<< HEAD
public class GTaskManager {//GTask管理者提供同步本地和远端的任务初始化任务列表同步内容、文件夹添加、更新本地和远端结点刷新本地同步任务ID等功能
=======
public class GTaskManager {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private static final String TAG = GTaskManager.class.getSimpleName();
public static final int STATE_SUCCESS = 0;

@ -23,7 +23,11 @@ import android.content.Intent;
import android.os.Bundle;
import android.os.IBinder;
<<<<<<< HEAD
public class GTaskSyncService extends Service {//GTask同步服务用于提供同步服务 (开始、取消同步),发送广播
=======
public class GTaskSyncService extends Service {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
public final static String ACTION_STRING_NAME = "sync_action_type";
public final static int ACTION_START_SYNC = 0;

@ -15,6 +15,17 @@
*/
package net.micode.notes.model;
<<<<<<< HEAD
import android.content.ContentProviderOperation;//批量的更新、插入、删除数据。
import android.content.ContentProviderResult;//操作的结果
import android.content.ContentUris;//用于添加和获取Uri后面的ID
import android.content.ContentValues;//一种用来存储基本数据类型数据的存储机制
import android.content.Context;//需要用该类来弄清楚调用者的实例
import android.content.OperationApplicationException;//操作应用程序容错
import android.net.Uri;//表示待操作的数据
import android.os.RemoteException;//远程容错
import android.util.Log;//输出日志,比如说出错、警告等
=======
import android.content.ContentProviderOperation;
import android.content.ContentProviderResult;
import android.content.ContentUris;
@ -24,6 +35,7 @@ import android.content.OperationApplicationException;
import android.net.Uri;
import android.os.RemoteException;
import android.util.Log;
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
import net.micode.notes.data.Notes;
import net.micode.notes.data.Notes.CallNote;
@ -34,16 +46,35 @@ import net.micode.notes.data.Notes.TextNote;
import java.util.ArrayList;
<<<<<<< HEAD
public class Note {//单个便签项
private ContentValues mNoteDiffValues;
//ContentValues 是Android SQLite库提供的一个类用于存储键值对。在SQLite中通常使用ContentValues来构建要插入到数据库中的行或用于更新现有行的数据。它基本上是一个HashMap其中键是字符串代表列名值是对应要插入或更新的数据。
private NoteData mNoteData;//见下方自定义的NoteData类用于记录便签内容
private static final String TAG = "Note";//定义一个初始化后不可改变的静态变量作为数据库的标记
=======
public class Note {
private ContentValues mNoteDiffValues;
private NoteData mNoteData;
private static final String TAG = "Note";
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
/**
* Create a new note id for adding a new note to databases
*/
public static synchronized long getNewNoteId(Context context, long folderId) {
// Create a new note in the database
ContentValues values = new ContentValues();
<<<<<<< HEAD
long createdTime = System.currentTimeMillis();//获取时间
values.put(NoteColumns.CREATED_DATE, createdTime);//设置创建日期
values.put(NoteColumns.MODIFIED_DATE, createdTime);//设置修改日期
values.put(NoteColumns.TYPE, Notes.TYPE_NOTE);//类型
values.put(NoteColumns.LOCAL_MODIFIED, 1);//通常用于存储与该记录相关的最后修改时间戳。这个时间戳通常是用来跟踪记录的版本或最后一次修改的时间,这样开发者就可以知道哪些记录是最新的,或者在数据同步时决定哪些记录需要更新。
values.put(NoteColumns.PARENT_ID, folderId);//设置ID
Uri uri = context.getContentResolver().insert(Notes.CONTENT_NOTE_URI, values);
//Uri统一资源标识符在Android中用于标识内容提供者中的数据
//将内容提供者对象中的数据插入到由uri指定的位置。
=======
long createdTime = System.currentTimeMillis();
values.put(NoteColumns.CREATED_DATE, createdTime);
values.put(NoteColumns.MODIFIED_DATE, createdTime);
@ -51,6 +82,7 @@ public class Note {
values.put(NoteColumns.LOCAL_MODIFIED, 1);
values.put(NoteColumns.PARENT_ID, folderId);
Uri uri = context.getContentResolver().insert(Notes.CONTENT_NOTE_URI, values);
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
long noteId = 0;
try {
@ -58,22 +90,62 @@ public class Note {
} catch (NumberFormatException e) {
Log.e(TAG, "Get note id error :" + e.toString());
noteId = 0;
<<<<<<< HEAD
}//验证noteID是否正确
/*
* try-catch
* uri.getPathSegments()uriURI(/)
* get(1)0
* Long.valueOf(...)Long
* LongnoteId
* catch (NumberFormatException e) tryNumberFormatExceptioncatch
* Log.e(TAG, "Get note id error :" + e.toString())使AndroidTAGe.toString()
*noteId0URIID
*/
if (noteId == -1) {
throw new IllegalStateException("Wrong note id:" + noteId);
}//如果验证失败抛出异常
=======
}
if (noteId == -1) {
throw new IllegalStateException("Wrong note id:" + noteId);
}
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
return noteId;
}
public Note() {
mNoteDiffValues = new ContentValues();
mNoteData = new NoteData();
<<<<<<< HEAD
}//构造函数
=======
}
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
public void setNoteValue(String key, String value) {
mNoteDiffValues.put(key, value);
mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1);
mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis());
<<<<<<< HEAD
}//设置数据库表格的标签属性数据
public void setTextData(String key, String value) {
mNoteData.setTextData(key, value);
}//设置数据库表格的标签文本内容的数据
public void setTextDataId(long id) {
mNoteData.setTextDataId(id);
}//设置文本数据的ID
public long getTextDataId() {
return mNoteData.mTextDataId;
}//设置电话号码数据的ID
public void setCallDataId(long id) {
mNoteData.setCallDataId(id);
}//得到电话号码数据的ID
=======
}
public void setTextData(String key, String value) {
@ -91,6 +163,7 @@ public class Note {
public void setCallDataId(long id) {
mNoteData.setCallDataId(id);
}
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
public void setCallData(String key, String value) {
mNoteData.setCallData(key, value);
@ -98,38 +171,72 @@ public class Note {
public boolean isLocalModified() {
return mNoteDiffValues.size() > 0 || mNoteData.isLocalModified();
<<<<<<< HEAD
}//判断是否是本地修改
public boolean syncNote(Context context, long noteId) {//同步
=======
}
public boolean syncNote(Context context, long noteId) {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
if (noteId <= 0) {
throw new IllegalArgumentException("Wrong note id:" + noteId);
}
if (!isLocalModified()) {
return true;
<<<<<<< HEAD
}//没修改不需要同步
/*
* In theory, once data changed, the note should be updated on {@link NoteColumns#LOCAL_MODIFIED} and
* {@link NoteColumns#MODIFIED_DATE}. For data safety, though update note fails, we also update thenote data info
* LOCAL_MODIFIEDMODIFIED_DATE使
=======
}
/**
* In theory, once data changed, the note should be updated on {@link NoteColumns#LOCAL_MODIFIED} and
* {@link NoteColumns#MODIFIED_DATE}. For data safety, though update note fails, we also update the
* note data info
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
*/
if (context.getContentResolver().update(
ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), mNoteDiffValues, null,
null) == 0) {
Log.e(TAG, "Update note error, should not happen");
// Do not return, fall through
<<<<<<< HEAD
}//如果笔记更新失败记录日志
mNoteDiffValues.clear();//清除数据库标签属性中的所有内容
=======
}
mNoteDiffValues.clear();
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
if (mNoteData.isLocalModified()
&& (mNoteData.pushIntoContentResolver(context, noteId) == null)) {
return false;
<<<<<<< HEAD
}//如果笔记内容在本地被修改把笔记内容推送到内容解析器如果失败则返回false
=======
}
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
return true;
}
<<<<<<< HEAD
private class NoteData {//定义一个基本的便签内容的数据类,主要包含文本数据和电话号码数据
private long mTextDataId;
private ContentValues mTextDataValues;//文本数据
private long mCallDataId;
private ContentValues mCallDataValues;////电话号码数据
=======
private class NoteData {
private long mTextDataId;
@ -138,6 +245,7 @@ public class Note {
private long mCallDataId;
private ContentValues mCallDataValues;
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private static final String TAG = "NoteData";
@ -146,11 +254,19 @@ public class Note {
mCallDataValues = new ContentValues();
mTextDataId = 0;
mCallDataId = 0;
<<<<<<< HEAD
}//构造函数
boolean isLocalModified() {
return mTextDataValues.size() > 0 || mCallDataValues.size() > 0;
}//判断是否是本地修改
=======
}
boolean isLocalModified() {
return mTextDataValues.size() > 0 || mCallDataValues.size() > 0;
}
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
void setTextDataId(long id) {
if(id <= 0) {
@ -178,12 +294,32 @@ public class Note {
mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis());
}
<<<<<<< HEAD
Uri pushIntoContentResolver(Context context, long noteId) {//将新的数据通过Uri的操作存储到数据库
=======
Uri pushIntoContentResolver(Context context, long noteId) {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
/**
* Check for safety
*/
if (noteId <= 0) {
throw new IllegalArgumentException("Wrong note id:" + noteId);
<<<<<<< HEAD
}//判断数据是否合法
ArrayList<ContentProviderOperation> operationList = new ArrayList<ContentProviderOperation>();
//定义了一个名为operationList的ArrayList这个ArrayList可以存储ContentProviderOperation对象初始化这个ArrayList。
//ContentProviderOperation是Android中用于表示内容提供者操作如插入、更新、删除等的类
ContentProviderOperation.Builder builder = null;
//Builder是Android框架中ContentProviderOperation类的一个内部类。Builder模式是一种设计模式它允许一个对象的构建与它的表示分离使得同样的构建过程可以创建不同的表示。
if(mTextDataValues.size() > 0) {//把文本数据存入DataColumns
mTextDataValues.put(DataColumns.NOTE_ID, noteId);
if (mTextDataId == 0) {//如果是首次插入数据
mTextDataValues.put(DataColumns.MIME_TYPE, TextNote.CONTENT_ITEM_TYPE);
Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI,
mTextDataValues);//向指定的URL插入数据
=======
}
ArrayList<ContentProviderOperation> operationList = new ArrayList<ContentProviderOperation>();
@ -195,6 +331,7 @@ public class Note {
mTextDataValues.put(DataColumns.MIME_TYPE, TextNote.CONTENT_ITEM_TYPE);
Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI,
mTextDataValues);
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
try {
setTextDataId(Long.valueOf(uri.getPathSegments().get(1)));
} catch (NumberFormatException e) {
@ -202,6 +339,18 @@ public class Note {
mTextDataValues.clear();
return null;
}
<<<<<<< HEAD
} else {//如果数据已经存在,更新数据
builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId(
Notes.CONTENT_DATA_URI, mTextDataId));
builder.withValues(mTextDataValues);
operationList.add(builder.build());//加入操作列表
}
mTextDataValues.clear();//清空
}
if(mCallDataValues.size() > 0) {//把电话号码数据存入DataColumns
=======
} else {
builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId(
Notes.CONTENT_DATA_URI, mTextDataId));
@ -212,6 +361,7 @@ public class Note {
}
if(mCallDataValues.size() > 0) {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
mCallDataValues.put(DataColumns.NOTE_ID, noteId);
if (mCallDataId == 0) {
mCallDataValues.put(DataColumns.MIME_TYPE, CallNote.CONTENT_ITEM_TYPE);
@ -236,6 +386,15 @@ public class Note {
if (operationList.size() > 0) {
try {
ContentProviderResult[] results = context.getContentResolver().applyBatch(
<<<<<<< HEAD
Notes.AUTHORITY, operationList);//执行操作列表中的多个操作
return (results == null || results.length == 0 || results[0] == null) ? null
: ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId);
} catch (RemoteException e) {//捕获RemoteException这是当尝试与远程服务如Content Provider通信或远程方法调用RPC时抛出表示远程对象调用失败。
Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
return null;
} catch (OperationApplicationException e) {//OperationApplicationException通常表示应用层操作失败。
=======
Notes.AUTHORITY, operationList);
return (results == null || results.length == 0 || results[0] == null) ? null
: ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId);
@ -243,6 +402,7 @@ public class Note {
Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
return null;
} catch (OperationApplicationException e) {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
return null;
}

@ -32,7 +32,11 @@ import net.micode.notes.data.Notes.TextNote;
import net.micode.notes.tool.ResourceParser.NoteBgResources;
<<<<<<< HEAD
public class WorkingNote {//当前活动便签项
=======
public class WorkingNote {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
// Note for the working note
private Note mNote;
// Note Id
@ -124,11 +128,21 @@ public class WorkingNote {
loadNote();
}
<<<<<<< HEAD
// 加载Note
private void loadNote() {
// 通过数据库调用query函数找到第一个条目
=======
private void loadNote() {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
Cursor cursor = mContext.getContentResolver().query(
ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, mNoteId), NOTE_PROJECTION, null,
null, null);
<<<<<<< HEAD
// 若存在,储存相应信息
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
if (cursor != null) {
if (cursor.moveToFirst()) {
mFolderId = cursor.getLong(NOTE_PARENT_ID_COLUMN);
@ -139,21 +153,41 @@ public class WorkingNote {
mModifiedDate = cursor.getLong(NOTE_MODIFIED_DATE_COLUMN);
}
cursor.close();
<<<<<<< HEAD
// 若不存在,报错
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
} else {
Log.e(TAG, "No note with id:" + mNoteId);
throw new IllegalArgumentException("Unable to find note with id " + mNoteId);
}
<<<<<<< HEAD
// 加载NoteData
loadNoteData();
}
// 加载NoteData
private void loadNoteData() {
// 通过数据库调用query函数找到第一个条目
=======
loadNoteData();
}
private void loadNoteData() {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
Cursor cursor = mContext.getContentResolver().query(Notes.CONTENT_DATA_URI, DATA_PROJECTION,
DataColumns.NOTE_ID + "=?", new String[] {
String.valueOf(mNoteId)
}, null);
<<<<<<< HEAD
// 查到信息不为空
if (cursor != null) {
if (cursor.moveToFirst()) {// 查看第一项是否存在
=======
if (cursor != null) {
if (cursor.moveToFirst()) {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
do {
String type = cursor.getString(DATA_MIME_TYPE_COLUMN);
if (DataConstants.NOTE.equals(type)) {
@ -165,15 +199,27 @@ public class WorkingNote {
} else {
Log.d(TAG, "Wrong note type with type:" + type);
}
<<<<<<< HEAD
} while (cursor.moveToNext());//查阅所有项,直到为空
}
cursor.close();
// 若不存在,报错
=======
} while (cursor.moveToNext());
}
cursor.close();
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
} else {
Log.e(TAG, "No data with id:" + mNoteId);
throw new IllegalArgumentException("Unable to find note's data with id " + mNoteId);
}
}
<<<<<<< HEAD
// 创建空的Note
// 传参context文件夹id小部件ID背景颜色
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
public static WorkingNote createEmptyNote(Context context, long folderId, int widgetId,
int widgetType, int defaultBgColorId) {
WorkingNote note = new WorkingNote(context, folderId);
@ -183,13 +229,24 @@ public class WorkingNote {
return note;
}
<<<<<<< HEAD
//构造函数是私有的。用load函数调用构造函数
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
public static WorkingNote load(Context context, long id) {
return new WorkingNote(context, id, 0);
}
<<<<<<< HEAD
// 保存Note
public synchronized boolean saveNote() {
if (isWorthSaving()) {//是否值得保存
if (!existInDatabase()) { // 是否存在数据库中
=======
public synchronized boolean saveNote() {
if (isWorthSaving()) {
if (!existInDatabase()) {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
if ((mNoteId = Note.getNewNoteId(mContext, mFolderId)) == 0) {
Log.e(TAG, "Create new note fail with id:" + mNoteId);
return false;
@ -212,11 +269,21 @@ public class WorkingNote {
}
}
<<<<<<< HEAD
// 是否在数据库中存在
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
public boolean existInDatabase() {
return mNoteId > 0;
}
<<<<<<< HEAD
// 是否值得保存
private boolean isWorthSaving() {
// 被删除,或(不在数据库中 内容为空),或本地已保存过
=======
private boolean isWorthSaving() {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
if (mIsDeleted || (!existInDatabase() && TextUtils.isEmpty(mContent))
|| (existInDatabase() && !mNote.isLocalModified())) {
return false;
@ -225,6 +292,10 @@ public class WorkingNote {
}
}
<<<<<<< HEAD
// 便签更新监视
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
public void setOnSettingStatusChangedListener(NoteSettingChangedListener l) {
mNoteSettingStatusListener = l;
}
@ -239,6 +310,10 @@ public class WorkingNote {
}
}
<<<<<<< HEAD
// 删除标记
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
public void markDeleted(boolean mark) {
mIsDeleted = mark;
if (mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID
@ -247,6 +322,10 @@ public class WorkingNote {
}
}
<<<<<<< HEAD
//背景颜色
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
public void setBgColorId(int id) {
if (id != mBgColorId) {
mBgColorId = id;
@ -267,6 +346,10 @@ public class WorkingNote {
}
}
<<<<<<< HEAD
//小部件类型
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
public void setWidgetType(int type) {
if (type != mWidgetType) {
mWidgetType = type;
@ -274,6 +357,10 @@ public class WorkingNote {
}
}
<<<<<<< HEAD
//小部件ID
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
public void setWidgetId(int id) {
if (id != mWidgetId) {
mWidgetId = id;
@ -342,6 +429,11 @@ public class WorkingNote {
return mWidgetType;
}
<<<<<<< HEAD
// 创建接口 NoteSettingChangedListener,便签更新监视
// 为NoteEditActivity提供接口
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
public interface NoteSettingChangedListener {
/**
* Called when the background color of current note has just changed

@ -0,0 +1,17 @@
# must be unique in a given SonarQube instance
sonar.projectKey=Notesmaster
# --- optional properties ---
# defaults to project key
sonar.projectName=Notesmaster
# defaults to 'not provided'
sonar.projectVersion=1.0
# Path is relative to the sonar-project.properties file. Defaults to .
sonar.sources=app/src/main/java
# Encoding of the source code. Default is default system encoding
sonar.sourceEncoding=UTF-8
sonar.java.binaries=test

@ -36,7 +36,11 @@ import java.io.IOException;
import java.io.PrintStream;
<<<<<<< HEAD
public class BackupUtils {//备份工具类,用于数据备份读取、显示
=======
public class BackupUtils {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private static final String TAG = "BackupUtils";
// Singleton stuff
private static BackupUtils sInstance;

@ -35,7 +35,11 @@ import java.util.ArrayList;
import java.util.HashSet;
<<<<<<< HEAD
public class DataUtils {//便签数据处理工具类,封装如查找、移动、删除数据等操作
=======
public class DataUtils {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
public static final String TAG = "DataUtils";
public static boolean batchDeleteNotes(ContentResolver resolver, HashSet<Long> ids) {
if (ids == null) {

@ -16,7 +16,11 @@
package net.micode.notes.tool;
<<<<<<< HEAD
public class GTaskStringUtils {//同步中使用的字符串工具类为了jsonObject提供string对象
=======
public class GTaskStringUtils {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
public final static String GTASK_JSON_ACTION_ID = "action_id";

@ -22,7 +22,11 @@ import android.preference.PreferenceManager;
import net.micode.notes.R;
import net.micode.notes.ui.NotesPreferenceActivity;
<<<<<<< HEAD
public class ResourceParser {//界面元素的解析工具类利用R.java这个类获取资源供程序调用
=======
public class ResourceParser {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
public static final int YELLOW = 0;
public static final int BLUE = 1;

@ -40,14 +40,81 @@ import net.micode.notes.tool.DataUtils;
import java.io.IOException;
<<<<<<< HEAD
public class AlarmAlertActivity extends Activity implements OnClickListener, OnDismissListener {//闹铃提醒界面
private long mNoteId;//文本在数据库存储中的ID号
private String mSnippet;//闹钟提示时出现的文本片段
=======
public class AlarmAlertActivity extends Activity implements OnClickListener, OnDismissListener {
private long mNoteId;
private String mSnippet;
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private static final int SNIPPET_PREW_MAX_LEN = 60;
MediaPlayer mPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
<<<<<<< HEAD
//onCreate 方法是 Activity 生命周期中的一个重要方法,当 Activity 第一次被创建时调用。
//Bundle类型的数据与Map类型的数据相似都是以key-value的形式存储数据的
// Bundle 类型的参数 savedInstanceState是用来保存之前该 Activity 的状态,如果 Activity 之前被销毁(例如由于屏幕旋转)并且现在重新创建,那么 savedInstanceState 将包含之前保存的状态数据。
super.onCreate(savedInstanceState);
//能从父类Activity的onCreate方法的参数savedInsanceState中获得状态数据
requestWindowFeature(Window.FEATURE_NO_TITLE);
//移除标题栏
//在Android应用中创建一个新的Activity时默认情况下该Activity会有一个标题栏它通常显示应用的名字和Activity的标题
//如果不想显示这个标题栏,需要在调用 setContentView() 方法之前,首先调用 requestWindowFeature() 方法。这是因为一旦你设置了内容视图,窗口的一些特性(包括标题栏)就已经被确定了,此时再更改它们将不会有任何效果。
final Window win = getWindow();
//getWindow(): 这是一个常用于Android的Activity类中的方法。它返回与当前Activity关联的Window对象。Window对象代表了Activity的视图层次结构的顶层容器它控制着如何显示这个视图。
win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
//addFlags(...): 这是Window类的一个方法用于给窗口添加特定的标志。这些标志会影响窗口的显示和行为。
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();
//Intent 是一个消息传递对象。当你从另一个 Activity 启动一个新的 Activity 时,你通常会创建一个 Intent 对象来指定你想要启动的目标 Activity 以及可能传递给它的一些数据
//getIntent() 方法允许你访问启动当前 Activity 的 Intent从而可以从中提取传递过来的数据或执行其他与 Intent 相关的操作。
try {
mNoteId = Long.valueOf(intent.getData().getPathSegments().get(1));
/*
*ActivityActivity使IntentsetData()Activity使getData()
*getPathSegments()UriUriList<String>
*get(1)List<String>1Java0get(1)
*Long.valueOf()LongLong
*/
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的长度超过SNIPPET_PREW_MAX_LEN则只保留其前SNIPPET_PREW_MAX_LEN个字符并在其后附加一个从资源文件中获取的字符串。
//如果mSnippet的长度没有超过SNIPPET_PREW_MAX_LEN则mSnippet的值不变。
} catch (IllegalArgumentException e) {
e.printStackTrace();
return;
}//当IllegalArgumentException异常被抛出时捕获它并打印出关于该异常的详细信息
//IllegalArgumentException 是一个用于指示方法调用者传递了不合法或不适当参数的异常
mPlayer = new MediaPlayer();
//MediaPlayer是Android中用于播放音频文件的类。
if (DataUtils.visibleInNoteDatabase(getContentResolver(), mNoteId, Notes.TYPE_NOTE)) {
showActionDialog();
//弹出对话框
playAlarmSound();
//闹钟提示音激发
} else {
finish();
//完成闹钟动作
=======
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
@ -80,15 +147,68 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD
playAlarmSound();
} else {
finish();
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
}
}
private boolean isScreenOn() {
<<<<<<< HEAD
//判断屏幕是否锁屏,调用系统函数判断,最后返回值是布尔类型
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
//PowerManager: 这是一个Android的系统级服务允许应用程序控制设备的电源状态例如使设备进入睡眠状态或唤醒设备
//getSystemService(): 这是一个Context类的方法用于获取系统级别的服务。在Android中许多核心功能如闹钟、通知、电源管理等都是通过这种方式提供的。
//Context.POWER_SERVICE: 这是一个常量,表示电源管理服务的名称
=======
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
return pm.isScreenOn();
}
private void playAlarmSound() {
<<<<<<< HEAD
////闹钟提示音激发
Uri url = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_ALARM);
//调用系统的铃声管理URI得到闹钟提示音
//URL是Internet上用来描述信息资源的字符串主要用在各种WWW客户程序和服务器程序上。采用URL可以用一种统一的格式来描述各种信息资源包括文件、服务器的地址和目录等。URL的格式由三部分组成第一部分是协议第二部分是存有该资源的主机IP地址有时也包括端口号第三部分是主机资源的具体地址如目录和文件名等。第一部分和第二部分之间用"://"符号隔开,第二部分和第三部分用"/"符号隔开。
int silentModeStreams = Settings.System.getInt(getContentResolver(),
Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0);
//从Android系统设置中获取“静音模式”会影响哪些声音流的设置
if ((silentModeStreams & (1 << AudioManager.STREAM_ALARM)) != 0) {
//如果静音并且静音影响闹钟
mPlayer.setAudioStreamType(silentModeStreams);
//将mPlayer这个MediaPlayer对象的音频流类型设置为静音
} else {
mPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
//将mPlayer这个MediaPlayer对象的音频流类型设置为闹钟
}
try {
mPlayer.setDataSource(this, url);
//设置媒体播放的数据源
mPlayer.prepare();
//加载媒体资源当你有一个媒体文件的路径或URI时你可以使用 setDataSource() 方法来设置这个资源。之后,调用 prepare() 方法会加载这个资源到 MediaPlayer 对象中。
//同步prepare() 方法是同步的,这意味着它会阻塞当前线程直到媒体资源准备完毕。
mPlayer.setLooping(true);
//设置是否循环播放
mPlayer.start();
//开始播放
} catch (IllegalArgumentException e) {
//当向方法传递了一个不合法或不适当的参数时,就会抛出 IllegalArgumentException
// TODO Auto-generated catch block
e.printStackTrace();
//这个方法的功能是打印异常的堆栈跟踪信息。当异常发生时,这个方法会输出异常的详细信息,包括异常的类型、异常发生的位置(类名、方法名、行号)以及异常发生时的调用栈信息。这对于调试和定位问题非常有帮助
} catch (SecurityException e) {
//种异常通常与Java的安全管理器有关当代码试图执行某些受保护的操作如访问文件、网络等而未被授权时会抛出这种异常。
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
//当一个对象处于某种状态,而此状态下该对象不应该被调用某些方法时,如果这些方法被调用了,那么就会抛出 IllegalStateException 异常。
//这种异常通常是由于编程错误或设计错误引起的,例如在多线程环境中,一个线程试图修改一个正在被另一个线程使用的对象。
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
//当Java程序无法正常读取或写入数据流时就会抛出IOException。IOException是一个广泛的异常类型它涵盖了各种文件和网络操作中可能出现的错误情况。例如当试图打开不存在的文件或目录或者无法访问文件或目录时会发生IOException。IOException类提供了一些方法来获取有关错误的详细信息例如getMessage()方法返回错误消息的详细描述getCause()方法返回导致IOException的根本原因。
=======
Uri url = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_ALARM);
int silentModeStreams = Settings.System.getInt(getContentResolver(),
@ -114,6 +234,7 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
// TODO Auto-generated catch block
e.printStackTrace();
}
@ -121,6 +242,22 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD
private void showActionDialog() {
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
<<<<<<< HEAD
//AlertDialog的构造方法全部是Protected的所以不能直接通过new一个AlertDialog来创建出一个AlertDialog。要创建一个AlertDialog就要用到AlertDialog.Builder中的create()方法
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);
//show() 是 Dialog 类的一个方法,用于显示对话框
//setOnDismissListener 是 Dialog 类的一个方法,用于设置对话框关闭时的监听器。
//this 通常指代当前的Activity或Fragment意味着当对话框关闭时会回调当前Activity或Fragment中实现的 onDismiss 方法。
=======
dialog.setTitle(R.string.app_name);
dialog.setMessage(mSnippet);
dialog.setPositiveButton(R.string.notealert_ok, this);
@ -128,30 +265,63 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD
dialog.setNegativeButton(R.string.notealert_enter, this);
}
dialog.show().setOnDismissListener(this);
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
}
public void onClick(DialogInterface dialog, int which) {
switch (which) {
<<<<<<< HEAD
//用which来选择click后下一步的操作
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:
//这是确定操作
=======
case DialogInterface.BUTTON_NEGATIVE:
Intent intent = new Intent(this, NoteEditActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.putExtra(Intent.EXTRA_UID, mNoteId);
startActivity(intent);
break;
default:
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
break;
}
}
public void onDismiss(DialogInterface dialog) {
<<<<<<< HEAD
//忽略
stopAlarmSound();
//停止闹钟声音
finish();
//完成该动作
=======
stopAlarmSound();
finish();
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
}
private void stopAlarmSound() {
if (mPlayer != null) {
mPlayer.stop();
<<<<<<< HEAD
//停止播放
mPlayer.release();
//释放MediaPlayer对象
=======
mPlayer.release();
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
mPlayer = null;
}
}

@ -28,12 +28,20 @@ import net.micode.notes.data.Notes;
import net.micode.notes.data.Notes.NoteColumns;
<<<<<<< HEAD
public class AlarmInitReceiver extends BroadcastReceiver {//闹铃提醒启动消息接收器
=======
public class AlarmInitReceiver extends BroadcastReceiver {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private static final String [] PROJECTION = new String [] {
NoteColumns.ID,
NoteColumns.ALERTED_DATE
};
<<<<<<< HEAD
//对数据库的操作调用标签ID和闹钟时间
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private static final int COLUMN_ID = 0;
private static final int COLUMN_ALERTED_DATE = 1;
@ -41,6 +49,38 @@ public class AlarmInitReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
long currentDate = System.currentTimeMillis();
<<<<<<< HEAD
//System.currentTimeMillis()产生一个当前的毫秒
//这个毫秒其实就是自1970年1月1日0时起的毫秒数
Cursor c = context.getContentResolver().query(Notes.CONTENT_NOTE_URI, PROJECTION,
NoteColumns.ALERTED_DATE + ">? AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE,
new String[] { String.valueOf(currentDate) },
null);
//将long变量currentDate转化为字符串
//Cursor在这里的作用是通过查找数据库中的标签内容找到和当前系统时间相等的标签
if (c != null) {
if (c.moveToFirst()) {
//moveToFirst()方法尝试将Cursor的定位移动到第一条记录。如果Cursor是空的即没有记录则此方法返回false。如果moveToFirst()返回true说明Cursor至少有一条记录那么将执行括号内的代码。
do {
long alertDate = c.getLong(COLUMN_ALERTED_DATE);
//从当前Cursor的记录中获取名为COLUMN_ALERTED_DATE的列的值并将其存储为long类型的alertDate。这通常是提醒的日期和时间。
Intent sender = new Intent(context, AlarmReceiver.class);
//创建一个新的Intent对象该对象用于启动名为AlarmReceiver的BroadcastReceiver。
sender.setData(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, c.getLong(COLUMN_ID)));
//设置Intent的数据。这通常用于标识与特定闹钟提醒相关联的笔记或记录
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, sender, 0);
//创建一个PendingIntent对象。这是一个可以被多次使用例如用于多次触发闹钟的Intent
AlarmManager alermManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
//获取AlarmManager服务的实例该服务用于设置、修改或删除闹钟提醒。
alermManager.set(AlarmManager.RTC_WAKEUP, alertDate, pendingIntent);
//使用AlarmManager的set方法设置一个闹钟提醒。AlarmManager.RTC_WAKEUP表示闹钟应该在系统时间到达alertDate时唤醒设备。pendingIntent是当闹钟触发时要执行的Intent
} while (c.moveToNext());//将Cursor的定位移动到下一条记录。如果Cursor还有下一条记录则循环继续
}
c.close();//关闭Cursor
}
//这段代码的主要目的是从某个数据库中读取一系列记录的提醒日期并为每个记录设置一个闹钟提醒。当这些日期到达时AlarmReceiver将被触发。
=======
Cursor c = context.getContentResolver().query(Notes.CONTENT_NOTE_URI,
PROJECTION,
NoteColumns.ALERTED_DATE + ">? AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE,
@ -61,5 +101,6 @@ public class AlarmInitReceiver extends BroadcastReceiver {
}
c.close();
}
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
}
}

@ -20,6 +20,20 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
<<<<<<< HEAD
public class AlarmReceiver extends BroadcastReceiver {//闹铃提醒接收器
@Override
public void onReceive(Context context, Intent intent) {
intent.setClass(context, AlarmAlertActivity.class);
//启动AlarmAlertActivity
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//activity要存在于activity的栈中而非activity的途径启动activity时必然不存在一个activity的栈所以要新起一个栈装入启动的activity
context.startActivity(intent);
}
}
//这是实现alarm这个功能最接近用户层的包基于上面的两个包
=======
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
@ -28,3 +42,4 @@ public class AlarmReceiver extends BroadcastReceiver {
context.startActivity(intent);
}
}
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0

@ -28,8 +28,13 @@ import android.view.View;
import android.widget.FrameLayout;
import android.widget.NumberPicker;
<<<<<<< HEAD
public class DateTimePicker extends FrameLayout {//设置提醒时间的部件
//FrameLayout是布局模板之一所有的子元素全部在屏幕的右上方
=======
public class DateTimePicker extends FrameLayout {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private static final boolean DEFAULT_ENABLE_STATE = true;
private static final int HOURS_IN_HALF_DAY = 12;
@ -45,13 +50,24 @@ 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;
<<<<<<< HEAD
//初始化控件
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private final NumberPicker mDateSpinner;
private final NumberPicker mHourSpinner;
private final NumberPicker mMinuteSpinner;
private final NumberPicker mAmPmSpinner;
<<<<<<< HEAD
//NumberPicker是数字选择器
//这里定义的四个变量全部是在设置闹钟时需要选择的变量(如日期、时、分、上午或者下午)
private Calendar mDate;
//定义了Calendar类型的变量mDate用于操作时间
=======
private Calendar mDate;
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private String[] mDateDisplayValues = new String[DAYS_IN_ALL_WEEK];
private boolean mIsAm;
@ -72,60 +88,115 @@ public class DateTimePicker extends FrameLayout {
onDateTimeChanged();
}
};
<<<<<<< HEAD
//OnValueChangeListener这是时间改变监听器这里主要是对日期的监听
//将现在日期的值传递给mDateupdateDateControl是同步操作
private NumberPicker.OnValueChangeListener mOnHourChangedListener = new NumberPicker.OnValueChangeListener() {
//这里是对 小时Hour 的监听
=======
private NumberPicker.OnValueChangeListener mOnHourChangedListener = new NumberPicker.OnValueChangeListener() {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
boolean isDateChanged = false;
Calendar cal = Calendar.getInstance();
<<<<<<< HEAD
//声明一个Calendar的变量cal便于后续的操作
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
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;
<<<<<<< HEAD
//这里是对于12小时制时晚上11点和12点交替时对日期的更改
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
} 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;
<<<<<<< HEAD
}//这里是对于12小时制时凌晨11点和12点交替时对日期的更改
=======
}
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
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();
<<<<<<< HEAD
}//这里是对于12小时制时中午11点和12点交替时对AM和PM的更改
=======
}
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
} else {
if (oldVal == HOURS_IN_ALL_DAY - 1 && newVal == 0) {
cal.setTimeInMillis(mDate.getTimeInMillis());
cal.add(Calendar.DAY_OF_YEAR, 1);
isDateChanged = true;
<<<<<<< HEAD
//这里是对于24小时制时晚上11点和12点交替时对日期的更改
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
} else if (oldVal == 0 && newVal == HOURS_IN_ALL_DAY - 1) {
cal.setTimeInMillis(mDate.getTimeInMillis());
cal.add(Calendar.DAY_OF_YEAR, -1);
isDateChanged = true;
<<<<<<< HEAD
}//这里是对于12小时制时凌晨11点和12点交替时对日期的更改
}
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();
//判断日期是否改变
=======
}
}
int newHour = mHourSpinner.getValue() % HOURS_IN_HALF_DAY + (mIsAm ? 0 : HOURS_IN_HALF_DAY);
mDate.set(Calendar.HOUR_OF_DAY, newHour);
onDateTimeChanged();
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
if (isDateChanged) {
setCurrentYear(cal.get(Calendar.YEAR));
setCurrentMonth(cal.get(Calendar.MONTH));
setCurrentDay(cal.get(Calendar.DAY_OF_MONTH));
<<<<<<< HEAD
}//更新日期
=======
}
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
}
};
private NumberPicker.OnValueChangeListener mOnMinuteChangedListener = new NumberPicker.OnValueChangeListener() {
@Override
<<<<<<< HEAD
//这里是对 分钟Minute改变的监听
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
int minValue = mMinuteSpinner.getMinValue();
int maxValue = mMinuteSpinner.getMaxValue();
int offset = 0;
<<<<<<< HEAD
//设置offset作为小时改变的一个记录数据
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
if (oldVal == maxValue && newVal == minValue) {
offset += 1;
} else if (oldVal == minValue && newVal == maxValue) {
offset -= 1;
}
<<<<<<< HEAD
//如果原值为59新值为0则offset加1
//如果原值为0新值为59则offset减1
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
if (offset != 0) {
mDate.add(Calendar.HOUR_OF_DAY, offset);
mHourSpinner.setValue(getCurrentHour());
@ -145,6 +216,10 @@ public class DateTimePicker extends FrameLayout {
};
private NumberPicker.OnValueChangeListener mOnAmPmChangedListener = new NumberPicker.OnValueChangeListener() {
<<<<<<< HEAD
//对AM和PM的监听
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
mIsAm = !mIsAm;
@ -166,6 +241,16 @@ public class DateTimePicker extends FrameLayout {
public DateTimePicker(Context context) {
this(context, System.currentTimeMillis());
}
<<<<<<< HEAD
//通过对数据库的访问,获取当前的系统时间
public DateTimePicker(Context context, long date) {
this(context, date, DateFormat.is24HourFormat(context));
}//上面函数的得到的是1970至今的秒数需要DateFormat将其变得有意义
public DateTimePicker(Context context, long date, boolean is24HourView) {
super(context);
//获取系统时间
=======
public DateTimePicker(Context context, long date) {
this(context, date, DateFormat.is24HourFormat(context));
@ -173,10 +258,26 @@ public class DateTimePicker extends FrameLayout {
public DateTimePicker(Context context, long date, boolean is24HourView) {
super(context);
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
mDate = Calendar.getInstance();
mInitialising = true;
mIsAm = getCurrentHourOfDay() >= HOURS_IN_HALF_DAY;
inflate(context, R.layout.datetime_picker, this);
<<<<<<< HEAD
//如果当前Activity里用到别的layout比如对话框layout
//还要设置这个layout上的其他组件的内容就必须用inflate()方法先将对话框的layout找出来
//然后再用findViewById()找到它上面的其它组件
mDateSpinner = (NumberPicker) findViewById(R.id.date);
//从 XML 布局文件中找到一个 ID 为 date 的 NumberPicker 控件,并将其引用赋值给 mDateSpinner
mDateSpinner.setMinValue(DATE_SPINNER_MIN_VAL);//最小
mDateSpinner.setMaxValue(DATE_SPINNER_MAX_VAL);//最大
mDateSpinner.setOnValueChangedListener(mOnDateChangedListener);//监听
mHourSpinner = (NumberPicker) findViewById(R.id.hour);
mHourSpinner.setOnValueChangedListener(mOnHourChangedListener);
=======
mDateSpinner = (NumberPicker) findViewById(R.id.date);
mDateSpinner.setMinValue(DATE_SPINNER_MIN_VAL);
@ -185,11 +286,17 @@ public class DateTimePicker extends FrameLayout {
mHourSpinner = (NumberPicker) findViewById(R.id.hour);
mHourSpinner.setOnValueChangedListener(mOnHourChangedListener);
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
mMinuteSpinner = (NumberPicker) findViewById(R.id.minute);
mMinuteSpinner.setMinValue(MINUT_SPINNER_MIN_VAL);
mMinuteSpinner.setMaxValue(MINUT_SPINNER_MAX_VAL);
mMinuteSpinner.setOnLongPressUpdateInterval(100);
mMinuteSpinner.setOnValueChangedListener(mOnMinuteChangedListener);
<<<<<<< HEAD
//这段代码是使用 Android 的 NumberPicker 控件来创建三个数字选择器:一个用于日期、一个用于小时、一个用于分钟。
//这些控件通常用于在一个预定义的范围内选择数字
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
String[] stringsForAmPm = new DateFormatSymbols().getAmPmStrings();
mAmPmSpinner = (NumberPicker) findViewById(R.id.amPm);
@ -198,32 +305,56 @@ public class DateTimePicker extends FrameLayout {
mAmPmSpinner.setDisplayedValues(stringsForAmPm);
mAmPmSpinner.setOnValueChangedListener(mOnAmPmChangedListener);
<<<<<<< HEAD
// update controls to initial state 将控件更新到初始状态
=======
// update controls to initial state
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
updateDateControl();
updateHourControl();
updateAmPmControl();
set24HourView(is24HourView);
<<<<<<< HEAD
// set to current time 设置为当前时间
=======
// set to current time
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
setCurrentDate(date);
setEnabled(isEnabled());
<<<<<<< HEAD
// set the content descriptions 设置内容描述
=======
// set the content descriptions
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
mInitialising = false;
}
@Override
<<<<<<< HEAD
public void setEnabled(boolean enabled) {//用于设置时间选择器的启用或禁用状态
if (mIsEnabled == enabled) {
return;
}
super.setEnabled(enabled);//这行代码调用了当前类的父类中的setEnabled方法并传递了enabled参数。这确保了父类的状态也被相应地设置。
=======
public void setEnabled(boolean enabled) {
if (mIsEnabled == enabled) {
return;
}
super.setEnabled(enabled);
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
mDateSpinner.setEnabled(enabled);
mMinuteSpinner.setEnabled(enabled);
mHourSpinner.setEnabled(enabled);
mAmPmSpinner.setEnabled(enabled);
<<<<<<< HEAD
//分别设置了四个不同的spinner的启用状态
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
mIsEnabled = enabled;
}
@ -240,7 +371,11 @@ public class DateTimePicker extends FrameLayout {
public long getCurrentDateInTimeMillis() {
return mDate.getTimeInMillis();
}
<<<<<<< HEAD
//实现函数——得到当前的秒数
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
/**
* Set the current date
*
@ -251,7 +386,11 @@ 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));
<<<<<<< HEAD
}//实现函数功能——设置当前的时间参数是date
=======
}
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
/**
* Set the current date
@ -269,7 +408,11 @@ public class DateTimePicker extends FrameLayout {
setCurrentDay(dayOfMonth);
setCurrentHour(hourOfDay);
setCurrentMinute(minute);
<<<<<<< HEAD
}//实现函数功能——设置当前的时间,参数是各详细的变量
=======
}
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
/**
* Get current year
@ -446,7 +589,11 @@ public class DateTimePicker extends FrameLayout {
mDateSpinner.setDisplayedValues(mDateDisplayValues);
mDateSpinner.setValue(DAYS_IN_ALL_WEEK / 2);
mDateSpinner.invalidate();
<<<<<<< HEAD
}// 对于星期几的算法
=======
}
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private void updateAmPmControl() {
if (mIs24HourView) {
@ -456,7 +603,11 @@ public class DateTimePicker extends FrameLayout {
mAmPmSpinner.setValue(index);
mAmPmSpinner.setVisibility(View.VISIBLE);
}
<<<<<<< HEAD
}// 对于上下午操作的算法
=======
}
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private void updateHourControl() {
if (mIs24HourView) {
@ -466,12 +617,20 @@ public class DateTimePicker extends FrameLayout {
mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_12_HOUR_VIEW);
mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_12_HOUR_VIEW);
}
<<<<<<< HEAD
}// 对与小时的算法
=======
}
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
/**
* Set the callback that indicates the 'Set' button has been pressed.
* @param callback the callback, if null will do nothing
*/
<<<<<<< HEAD
//设置一个回调函数该回调函数会在“Set”按钮被按下时触发。如果用户没有提供回调函数即传递了null则不会执行任何操作。
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
public void setOnDateTimeChangedListener(OnDateTimeChangedListener callback) {
mOnDateTimeChangedListener = callback;
}

@ -29,38 +29,79 @@ import android.content.DialogInterface.OnClickListener;
import android.text.format.DateFormat;
import android.text.format.DateUtils;
<<<<<<< HEAD
public class DateTimePickerDialog extends AlertDialog implements OnClickListener {//设置提醒时间的对话框界面
private Calendar mDate = Calendar.getInstance();
//创建一个Calendar类型的变量 mDate方便时间的操作
private boolean mIs24HourView;
private OnDateTimeSetListener mOnDateTimeSetListener;
//声明一个时间日期滚动选择控件 mOnDateTimeSetListener
private DateTimePicker mDateTimePicker;
//DateTimePicker控件控件一般用于让用户可以从日期列表中选择单个值。
//运行时,单击控件边上的下拉箭头,会显示为两个部分:一个下拉列表,一个用于选择日期的
=======
public class DateTimePickerDialog extends AlertDialog implements OnClickListener {
private Calendar mDate = Calendar.getInstance();
private boolean mIs24HourView;
private OnDateTimeSetListener mOnDateTimeSetListener;
private DateTimePicker mDateTimePicker;
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
public interface OnDateTimeSetListener {
void OnDateTimeSet(AlertDialog dialog, long date);
}
public DateTimePickerDialog(Context context, long date) {
<<<<<<< HEAD
//对该界面对话框的实例化
super(context);
//对数据库的操作
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) {
=======
super(context);
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) {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
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);
<<<<<<< HEAD
//将视图中的各选项设置为系统当前时间
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
updateTitle(mDate.getTimeInMillis());
}
});
mDate.setTimeInMillis(date);
<<<<<<< HEAD
//得到系统时间
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()));
//时间标准化打印
=======
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()));
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
updateTitle(mDate.getTimeInMillis());
}
@ -70,6 +111,18 @@ public class DateTimePickerDialog extends AlertDialog implements OnClickListener
public void setOnDateTimeSetListener(OnDateTimeSetListener callBack) {
mOnDateTimeSetListener = callBack;
<<<<<<< HEAD
}//将时间日期滚动选择控件实例化
private void updateTitle(long date) {
int flag =
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));
}//android开发中常见日期管理工具类DateUtils按照上下午显示时间
=======
}
private void updateTitle(long date) {
@ -80,11 +133,17 @@ public class DateTimePickerDialog extends AlertDialog implements OnClickListener
flag |= mIs24HourView ? DateUtils.FORMAT_24HOUR : DateUtils.FORMAT_24HOUR;
setTitle(DateUtils.formatDateTime(this.getContext(), date, flag));
}
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
public void onClick(DialogInterface arg0, int arg1) {
if (mOnDateTimeSetListener != null) {
mOnDateTimeSetListener.OnDateTimeSet(this, mDate.getTimeInMillis());
}
<<<<<<< HEAD
}//第一个参数arg0是接收到点击事件的对话框
//第二个参数arg1是该对话框上的按钮
=======
}
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
}

@ -27,7 +27,11 @@ import android.widget.PopupMenu.OnMenuItemClickListener;
import net.micode.notes.R;
<<<<<<< HEAD
public class DropdownMenu {//下拉菜单界面
=======
public class DropdownMenu {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private Button mButton;
private PopupMenu mPopupMenu;
private Menu mMenu;

@ -29,7 +29,11 @@ import net.micode.notes.data.Notes;
import net.micode.notes.data.Notes.NoteColumns;
<<<<<<< HEAD
public class FoldersListAdapter extends CursorAdapter {//文件夹列表链接器(链接数据库)
=======
public class FoldersListAdapter extends CursorAdapter {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
public static final String [] PROJECTION = {
NoteColumns.ID,
NoteColumns.SNIPPET

@ -73,7 +73,12 @@ import java.util.regex.Pattern;
public class NoteEditActivity extends Activity implements OnClickListener,
<<<<<<< HEAD
NoteSettingChangedListener, OnTextViewChangeListener {//便签编辑activity
//继承了点击监听和两个自定义的监听
=======
NoteSettingChangedListener, OnTextViewChangeListener {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private class HeadViewHolder {
public TextView tvModified;
@ -82,8 +87,13 @@ public class NoteEditActivity extends Activity implements OnClickListener,
public TextView tvAlertDate;
public ImageView ibSetBgColor;
<<<<<<< HEAD
}//TextView是Android中用于显示文本的一个控件ImageView是Android中用于显示图像的控件
//使用Map实现数据存储
=======
}
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private static final Map<Integer, Integer> sBgSelectorBtnsMap = new HashMap<Integer, Integer>();
static {
sBgSelectorBtnsMap.put(R.id.iv_bg_yellow, ResourceParser.YELLOW);
@ -91,7 +101,11 @@ public class NoteEditActivity extends Activity implements OnClickListener,
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);
<<<<<<< HEAD
}//put函数是将指定值和指定键相连
=======
}
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private static final Map<Integer, Integer> sBgSelectorSelectionMap = new HashMap<Integer, Integer>();
static {
@ -121,6 +135,28 @@ public class NoteEditActivity extends Activity implements OnClickListener,
private static final String TAG = "NoteEditActivity";
private HeadViewHolder mNoteHeaderHolder;
<<<<<<< HEAD
//View: 这是Android SDK中的一个核心类表示用户界面中的一个矩形区域能够绘制和响应事件。
// 基本上,一个 View 对象可以是一个按钮、一个文本字段、一个图片,或者其他任何可以出现在用户界面上的组件。
private View mHeadViewPanel;//表头
private View mNoteBgColorSelector;//背景颜色
private View mFontSizeSelector;//标签字体
//EditText这是Android SDK中的一个类代表一个用户可以输入文本的文本框控件。它通常用于表单输入、搜索字段等。
private EditText mNoteEditor;//文本编辑
private View mNoteEditorPanel;//文本编辑的控制板
private WorkingNote mWorkingNote;//对模板WorkingNote的初始化
//SharedPreferences是Android提供的一个轻量级存储类主要用于保存应用的一些常用配置例如用户的偏好设置等。
//它的本质是基于XML文件存储key-value键值对数据并且提供了简单的API来读取和写入数据。
//它的特点是简单、轻量,并且数据是持久的(即使应用被关闭或设备重启,数据也会保留)
private SharedPreferences mSharedPrefs;
private int mFontSizeId;//字体大小
=======
private View mHeadViewPanel;
@ -136,6 +172,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
private SharedPreferences mSharedPrefs;
private int mFontSizeId;
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private static final String PREFERENCE_FONT_SIZE = "pref_font_size";
@ -144,6 +181,24 @@ public class NoteEditActivity extends Activity implements OnClickListener,
public static final String TAG_CHECKED = String.valueOf('\u221A');
public static final String TAG_UNCHECKED = String.valueOf('\u25A1');
<<<<<<< HEAD
//LinearLayout: 这是Android SDK中的一个布局类用于创建线性布局。线性布局可以水平或垂直地排列其子视图。
private LinearLayout mEditTextList;
private String mUserQuery;//存储用户的查询或输入。
//Pattern: 这是Java的java.util.regex包中的一个类用于表示一个正则表达式的编译表示形式
private Pattern mPattern;
@Override
//onCreate()在Activity创建时调用通常做一些初始化设置
//savedInstanceState是一个Bundle对象它包含Activity之前保存的状态信息
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置Activity的UI布局。R.layout.note_edit是一个资源引用它指向一个XML布局文件该文件定义了Activity的UI。
this.setContentView(R.layout.note_edit);
//判断是否是首次创建不是首次创建从Intent中获取数据
=======
private LinearLayout mEditTextList;
private String mUserQuery;
@ -154,6 +209,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
super.onCreate(savedInstanceState);
this.setContentView(R.layout.note_edit);
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
if (savedInstanceState == null && !initActivityState(getIntent())) {
finish();
return;
@ -165,6 +221,17 @@ public class NoteEditActivity extends Activity implements OnClickListener,
* Current activity may be killed when the memory is low. Once it is killed, for another time
* user load this activity, we should restore the former state
*/
<<<<<<< HEAD
/*
AndroidActivity使
Android
ActivityActivityActivity
使onSaveInstanceStateonRestoreInstanceState
ActivityonSaveInstanceState
ActivityonRestoreInstanceState
*/
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
@ -184,6 +251,21 @@ public class NoteEditActivity extends Activity implements OnClickListener,
* If the user specified the {@link Intent#ACTION_VIEW} but not provided with id,
* then jump to the NotesListActivity
*/
<<<<<<< HEAD
//如果用户指定了{@link Intent#ACTION_VIEW}但未提供id则跳转到NotesListActivity。
mWorkingNote = null;
//TextUtils.equals() 是Android提供的一个工具方法用于安全地比较两个字符串是否相等。
//检查这个Intent的动作是否是ACTION_VIEW。
//Intent.ACTION_VIEW: 这是一个预定义的Intent操作常量通常用于表示一个查看某个数据的请求
if (TextUtils.equals(Intent.ACTION_VIEW, intent.getAction())) {
long noteId = intent.getLongExtra(Intent.EXTRA_UID, 0);
mUserQuery = "";
/**
* Starting from the searched result
*/
//根据键值查找ID
=======
mWorkingNote = null;
if (TextUtils.equals(Intent.ACTION_VIEW, intent.getAction())) {
long noteId = intent.getLongExtra(Intent.EXTRA_UID, 0);
@ -192,10 +274,24 @@ public class NoteEditActivity extends Activity implements OnClickListener,
/**
* Starting from the searched result
*/
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
if (intent.hasExtra(SearchManager.EXTRA_DATA_KEY)) {
noteId = Long.parseLong(intent.getStringExtra(SearchManager.EXTRA_DATA_KEY));
mUserQuery = intent.getStringExtra(SearchManager.USER_QUERY);
}
<<<<<<< HEAD
//如果ID在数据库中未找到
if (!DataUtils.visibleInNoteDatabase(getContentResolver(), noteId, Notes.TYPE_NOTE)) {
Intent jump = new Intent(this, NotesListActivity.class);
startActivity(jump);
//程序将跳转到上面声明的intent——jump
showToast(R.string.error_note_not_exist);
finish();
return false;
}
//ID在数据库中找到
else {
=======
if (!DataUtils.visibleInNoteDatabase(getContentResolver(), noteId, Notes.TYPE_NOTE)) {
Intent jump = new Intent(this, NotesListActivity.class);
@ -204,6 +300,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
finish();
return false;
} else {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
mWorkingNote = WorkingNote.load(this, noteId);
if (mWorkingNote == null) {
Log.e(TAG, "load note failed with note id" + noteId);
@ -211,10 +308,22 @@ public class NoteEditActivity extends Activity implements OnClickListener,
return false;
}
}
<<<<<<< HEAD
//getWindow().setSoftInputMode() 是 Android 开发中用来控制软键盘显示时窗口如何调整的一个方法。
//SOFT_INPUT_STATE_HIDDEN: 这个常量指定了当活动被创建时,软键盘应该被隐藏。也就是说,当这个活动启动时,输入法键盘不会自动弹出。
//SOFT_INPUT_ADJUST_RESIZE: 这个常量指定了当软键盘显示时,活动窗口应该调整大小,以确保活动的内容不会被软键盘遮挡。
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN
| WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
}
//Intent.ACTION_INSERT_OR_EDIT 是 Android 开发中的一个 action它用于启动一个 activity 来插入或编辑一个特定的数据项。
else if(TextUtils.equals(Intent.ACTION_INSERT_OR_EDIT, intent.getAction())) {
=======
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN
| WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
} else if(TextUtils.equals(Intent.ACTION_INSERT_OR_EDIT, intent.getAction())) {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
// New note
long folderId = intent.getLongExtra(Notes.INTENT_EXTRA_FOLDER_ID, 0);
int widgetId = intent.getIntExtra(Notes.INTENT_EXTRA_WIDGET_ID,
@ -245,7 +354,11 @@ public class NoteEditActivity extends Activity implements OnClickListener,
widgetType, bgResId);
mWorkingNote.convertToCallNote(phoneNumber, callDate);
}
<<<<<<< HEAD
} else {//创建一个新的WorkingNote
=======
} else {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
mWorkingNote = WorkingNote.createEmptyNote(this, folderId, widgetId, widgetType,
bgResId);
}
@ -263,12 +376,20 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
@Override
<<<<<<< HEAD
//onResume() Activity即将恢复到前台运行时被调用。Activity已可见可以响应用户的操作
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
protected void onResume() {
super.onResume();
initNoteScreen();
}
<<<<<<< HEAD
private void initNoteScreen() {//对界面的初始化操作
=======
private void initNoteScreen() {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
mNoteEditor.setTextAppearance(this, TextAppearanceResources
.getTexAppearanceResource(mFontSizeId));
if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) {
@ -295,12 +416,21 @@ public class NoteEditActivity extends Activity implements OnClickListener,
showAlertHeader();
}
<<<<<<< HEAD
private void showAlertHeader() {//闹钟的显示
if (mWorkingNote.hasClockAlert()) {
long time = System.currentTimeMillis();
if (time > mWorkingNote.getAlertDate()) {//如果系统时间大于了闹钟设置的时间,那么闹钟失效
mNoteHeaderHolder.tvAlertDate.setText(R.string.note_alert_expired);
} else {//显示闹钟开启的图标
=======
private void showAlertHeader() {
if (mWorkingNote.hasClockAlert()) {
long time = System.currentTimeMillis();
if (time > mWorkingNote.getAlertDate()) {
mNoteHeaderHolder.tvAlertDate.setText(R.string.note_alert_expired);
} else {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
mNoteHeaderHolder.tvAlertDate.setText(DateUtils.getRelativeTimeSpanString(
mWorkingNote.getAlertDate(), time, DateUtils.MINUTE_IN_MILLIS));
}
@ -313,6 +443,14 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
@Override
<<<<<<< HEAD
/*
Activity Activity
Activity Activity onNewIntent(Intent intent)
Intent Activity Intent Activity
*/
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
initActivityState(intent);
@ -329,26 +467,47 @@ public class NoteEditActivity extends Activity implements OnClickListener,
if (!mWorkingNote.existInDatabase()) {
saveNote();
}
<<<<<<< HEAD
//在创建一个新的标签时,先在数据库中匹配
//如果不存在,那么先在数据库中存储
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
outState.putLong(Intent.EXTRA_UID, mWorkingNote.getNoteId());
Log.d(TAG, "Save working note id: " + mWorkingNote.getNoteId() + " onSaveInstanceState");
}
@Override
<<<<<<< HEAD
//MotionEvent是对屏幕触控的传递机制
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
public boolean dispatchTouchEvent(MotionEvent ev) {
if (mNoteBgColorSelector.getVisibility() == View.VISIBLE
&& !inRangeOfView(mNoteBgColorSelector, ev)) {
mNoteBgColorSelector.setVisibility(View.GONE);
return true;
<<<<<<< HEAD
}//颜色选择器在屏幕上可见
=======
}
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
if (mFontSizeSelector.getVisibility() == View.VISIBLE
&& !inRangeOfView(mFontSizeSelector, ev)) {
mFontSizeSelector.setVisibility(View.GONE);
return true;
<<<<<<< HEAD
}//字体大小选择器在屏幕上可见
return super.dispatchTouchEvent(ev);
}
//对屏幕触控的坐标进行操作
=======
}
return super.dispatchTouchEvent(ev);
}
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private boolean inRangeOfView(View view, MotionEvent ev) {
int []location = new int[2];
view.getLocationOnScreen(location);
@ -364,6 +523,10 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
private void initResources() {
<<<<<<< HEAD
//对标签各项属性内容的初始化
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
mHeadViewPanel = findViewById(R.id.note_title);
mNoteHeaderHolder = new HeadViewHolder();
mNoteHeaderHolder.tvModified = (TextView) findViewById(R.id.tv_modified_date);
@ -374,13 +537,21 @@ public class NoteEditActivity extends Activity implements OnClickListener,
mNoteEditor = (EditText) findViewById(R.id.note_edit_view);
mNoteEditorPanel = findViewById(R.id.sv_note_edit);
mNoteBgColorSelector = findViewById(R.id.note_bg_color_selector);
<<<<<<< HEAD
for (int id : sBgSelectorBtnsMap.keySet()) {//背景颜色
=======
for (int id : sBgSelectorBtnsMap.keySet()) {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
ImageView iv = (ImageView) findViewById(id);
iv.setOnClickListener(this);
}
mFontSizeSelector = findViewById(R.id.font_size_selector);
<<<<<<< HEAD
for (int id : sFontSizeBtnsMap.keySet()) {//字体大小
=======
for (int id : sFontSizeBtnsMap.keySet()) {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
View view = findViewById(id);
view.setOnClickListener(this);
};
@ -398,6 +569,11 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
@Override
<<<<<<< HEAD
//onPause() 在当前Activity被其他Activity覆盖或锁屏时调用。
//表示Activity正在停止准备从前台返回至后台此时可以做一些停止动画数据存储等工作
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
protected void onPause() {
super.onPause();
if(saveNote()) {
@ -406,7 +582,11 @@ public class NoteEditActivity extends Activity implements OnClickListener,
clearSettingState();
}
<<<<<<< HEAD
private void updateWidget() {//和桌面小工具的同步
=======
private void updateWidget() {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
if (mWorkingNote.getWidgetType() == Notes.TYPE_WIDGET_2X) {
intent.setClass(this, NoteWidgetProvider_2x.class);
@ -430,7 +610,11 @@ public class NoteEditActivity extends Activity implements OnClickListener,
if (id == R.id.btn_set_bg_color) {
mNoteBgColorSelector.setVisibility(View.VISIBLE);
findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility(
<<<<<<< HEAD
View.VISIBLE);
=======
- View.VISIBLE);
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
} else if (sBgSelectorBtnsMap.containsKey(id)) {
findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility(
View.GONE);
@ -453,7 +637,11 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
@Override
<<<<<<< HEAD
public void onBackPressed() {//返回
=======
public void onBackPressed() {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
if(clearSettingState()) {
return;
}
@ -473,7 +661,11 @@ public class NoteEditActivity extends Activity implements OnClickListener,
return false;
}
<<<<<<< HEAD
public void onBackgroundColorChanged() {//背景颜色
=======
public void onBackgroundColorChanged() {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility(
View.VISIBLE);
mNoteEditorPanel.setBackgroundResource(mWorkingNote.getBgColorResId());
@ -481,7 +673,11 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
@Override
<<<<<<< HEAD
public boolean onPrepareOptionsMenu(Menu menu) {//准备选择菜单,在选项菜单被显示之前被调用
=======
public boolean onPrepareOptionsMenu(Menu menu) {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
if (isFinishing()) {
return true;
}
@ -506,6 +702,26 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
@Override
<<<<<<< HEAD
//动态改变菜单选项内容
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_new_note:
createNewNote();//创建一个新的便签
break;
case R.id.menu_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_note));
//添加“YES”按钮
builder.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {//建立按键监听器
=======
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_new_note:
@ -518,11 +734,37 @@ public class NoteEditActivity extends Activity implements OnClickListener,
builder.setMessage(getString(R.string.alert_message_delete_note));
builder.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
public void onClick(DialogInterface dialog, int which) {
deleteCurrentNote();
finish();
}
});
<<<<<<< HEAD
builder.setNegativeButton(android.R.string.cancel, null);//添加“NO”的按钮
builder.show();//显示对话框
break;
case R.id.menu_font_size://字体大小的编辑
mFontSizeSelector.setVisibility(View.VISIBLE);// 将字体选择器置为可见
// 通过id找到相应的大小
findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.VISIBLE);
break;
case R.id.menu_list_mode://选择列表模式
mWorkingNote.setCheckListMode(mWorkingNote.getCheckListMode() == 0 ?
TextNote.MODE_CHECK_LIST : 0);
break;
case R.id.menu_share://分享
getWorkingText();
sendTo(this, mWorkingNote.getContent());// 用sendto函数将运行文本发送到遍历的本文内
break;
case R.id.menu_send_to_desktop://发送到桌面
sendToDesktop();
break;
case R.id.menu_alert://创建提醒
setReminder();
break;
case R.id.menu_delete_remind://删除提醒
=======
builder.setNegativeButton(android.R.string.cancel, null);
builder.show();
break;
@ -545,6 +787,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
setReminder();
break;
case R.id.menu_delete_remind:
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
mWorkingNote.setAlertDate(0, false);
break;
default:
@ -553,20 +796,36 @@ public class NoteEditActivity extends Activity implements OnClickListener,
return true;
}
<<<<<<< HEAD
private void setReminder() {//创建提醒
// 建立修改时间日期的对话框
DateTimePickerDialog d = new DateTimePickerDialog(this, System.currentTimeMillis());
//选择提醒的日期
d.setOnDateTimeSetListener(new OnDateTimeSetListener() {//建立监听器
=======
private void setReminder() {
DateTimePickerDialog d = new DateTimePickerDialog(this, System.currentTimeMillis());
d.setOnDateTimeSetListener(new OnDateTimeSetListener() {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
public void OnDateTimeSet(AlertDialog dialog, long date) {
mWorkingNote.setAlertDate(date , true);
}
});
<<<<<<< HEAD
d.show();//显示对话框
=======
d.show();
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
}
/**
* Share note to apps that support {@link Intent#ACTION_SEND} action
* and {@text/plain} type
*/
<<<<<<< HEAD
//分享便签
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private void sendTo(Context context, String info) {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_TEXT, info);
@ -574,9 +833,16 @@ public class NoteEditActivity extends Activity implements OnClickListener,
context.startActivity(intent);
}
<<<<<<< HEAD
//创建新便签
private void createNewNote() {
// Firstly, save current editing notes
saveNote();//保存当前便签
=======
private void createNewNote() {
// Firstly, save current editing notes
saveNote();
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
// For safety, start a new NoteEditActivity
finish();
@ -586,6 +852,10 @@ public class NoteEditActivity extends Activity implements OnClickListener,
startActivity(intent);
}
<<<<<<< HEAD
//删除当前便签
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private void deleteCurrentNote() {
if (mWorkingNote.existInDatabase()) {
HashSet<Long> ids = new HashSet<Long>();
@ -595,6 +865,17 @@ public class NoteEditActivity extends Activity implements OnClickListener,
} else {
Log.d(TAG, "Wrong note id, should not happen");
}
<<<<<<< HEAD
// if (!isSyncMode()) {
// if (!DataUtils.batchDeleteNotes(getContentResolver(), ids)) {
// Log.e(TAG, "Delete Note error");
// }
// } else {
if (!DataUtils.batchMoveToFolder(getContentResolver(), ids, Notes.ID_TRASH_FOLER)) {
Log.e(TAG, "Move notes to trash folder error, should not happens");
}
// }
=======
if (!isSyncMode()) {
if (!DataUtils.batchDeleteNotes(getContentResolver(), ids)) {
Log.e(TAG, "Delete Note error");
@ -604,20 +885,47 @@ public class NoteEditActivity extends Activity implements OnClickListener,
Log.e(TAG, "Move notes to trash folder error, should not happens");
}
}
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
}
mWorkingNote.markDeleted(true);
}
<<<<<<< HEAD
//判断是否为同步模式
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private boolean isSyncMode() {
return NotesPreferenceActivity.getSyncAccountName(this).trim().length() > 0;
}
<<<<<<< HEAD
//设置提醒时间
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
public void onClockAlertChanged(long date, boolean set) {
/**
* User could set clock to an unsaved note, so before setting the
* alert clock, we should save the note first
*/
if (!mWorkingNote.existInDatabase()) {
<<<<<<< HEAD
saveNote();//保存便签
}
if (mWorkingNote.getNoteId() > 0) {
//若有有运行的便签建立链接器将标签id都存在uri中
Intent intent = new Intent(this, AlarmReceiver.class);
intent.setData(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, mWorkingNote.getNoteId()));
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
//设置提醒管理器
AlarmManager alarmManager = ((AlarmManager) getSystemService(ALARM_SERVICE));
showAlertHeader();
if(!set) {//取消设置
alarmManager.cancel(pendingIntent);
} else {//如果用户设置了时间,就通过提醒管理器设置一个监听事项
alarmManager.set(AlarmManager.RTC_WAKEUP, date, pendingIntent);
}
} else {//没有运行的便签就报错
=======
saveNote();
}
if (mWorkingNote.getNoteId() > 0) {
@ -632,6 +940,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
alarmManager.set(AlarmManager.RTC_WAKEUP, date, pendingIntent);
}
} else {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
/**
* There is the condition that user has input nothing (the note is
* not worthy saving), we have no note id, remind the user that he
@ -691,6 +1000,10 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
}
<<<<<<< HEAD
//切换至列表模式
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private void switchToListMode(String text) {
mEditTextList.removeAllViews();
String[] items = text.split("\n");
@ -725,6 +1038,10 @@ public class NoteEditActivity extends Activity implements OnClickListener,
return spannable;
}
<<<<<<< HEAD
//获取列表项
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private View getListItem(String item, int index) {
View view = LayoutInflater.from(this).inflate(R.layout.note_edit_list_item, null);
final NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text);
@ -805,6 +1122,10 @@ public class NoteEditActivity extends Activity implements OnClickListener,
return hasChecked;
}
<<<<<<< HEAD
//保存便签
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private boolean saveNote() {
getWorkingText();
boolean saved = mWorkingNote.saveNote();
@ -856,6 +1177,10 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
}
<<<<<<< HEAD
//编辑小图标的标题
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private String makeShortcutIconTitle(String content) {
content = content.replace(TAG_CHECKED, "");
content = content.replace(TAG_UNCHECKED, "");

@ -37,7 +37,11 @@ import net.micode.notes.R;
import java.util.HashMap;
import java.util.Map;
<<<<<<< HEAD
public class NoteEditText extends EditText {//便签的文本编辑界面
=======
public class NoteEditText extends EditText {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private static final String TAG = "NoteEditText";
private int mIndex;
private int mSelectionStartBeforeDelete;

@ -26,7 +26,11 @@ import net.micode.notes.data.Notes.NoteColumns;
import net.micode.notes.tool.DataUtils;
<<<<<<< HEAD
public class NoteItemData {//便签项数据
=======
public class NoteItemData {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
static final String [] PROJECTION = new String [] {
NoteColumns.ID,
NoteColumns.ALERTED_DATE,

@ -79,6 +79,10 @@ import java.io.InputStreamReader;
import java.util.HashSet;
public class NotesListActivity extends Activity implements OnClickListener, OnItemLongClickListener {
<<<<<<< HEAD
//主界面,用于实现处理文件夹列表的活动
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private static final int FOLDER_NOTE_LIST_QUERY_TOKEN = 0;
private static final int FOLDER_LIST_QUERY_TOKEN = 1;
@ -473,16 +477,25 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
new AsyncTask<Void, Void, HashSet<AppWidgetAttribute>>() {
protected HashSet<AppWidgetAttribute> doInBackground(Void... unused) {
HashSet<AppWidgetAttribute> widgets = mNotesListAdapter.getSelectedWidget();
<<<<<<< HEAD
if (mCurrentFolderId == Notes.ID_TRASH_FOLER){
// if in trash, really delete notes
=======
if (!isSyncMode()) {
// if not synced, delete notes directly
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
if (DataUtils.batchDeleteNotes(mContentResolver, mNotesListAdapter
.getSelectedItemIds())) {
} else {
Log.e(TAG, "Delete notes error, should not happens");
}
} else {
<<<<<<< HEAD
// move notes to trash
=======
// in sync mode, we'll move the deleted note into the trash
// folder
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
if (!DataUtils.batchMoveToFolder(mContentResolver, mNotesListAdapter
.getSelectedItemIds(), Notes.ID_TRASH_FOLER)) {
Log.e(TAG, "Move notes to trash folder error, should not happens");
@ -516,6 +529,9 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
ids.add(folderId);
HashSet<AppWidgetAttribute> widgets = DataUtils.getFolderNoteWidget(mContentResolver,
folderId);
<<<<<<< HEAD
DataUtils.batchDeleteNotes(mContentResolver, ids);
=======
if (!isSyncMode()) {
// if not synced, delete folder directly
DataUtils.batchDeleteNotes(mContentResolver, ids);
@ -523,6 +539,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
// in sync mode, we'll move the deleted folder into the trash folder
DataUtils.batchMoveToFolder(mContentResolver, ids, Notes.ID_TRASH_FOLER);
}
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
if (widgets != null) {
for (AppWidgetAttribute widget : widgets) {
if (widget.widgetId != AppWidgetManager.INVALID_APPWIDGET_ID
@ -812,12 +829,25 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
case R.id.menu_search:
onSearchRequested();
break;
<<<<<<< HEAD
case R.id.menu_recyclebin:
recycleBin();
break;
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
default:
break;
}
return true;
}
<<<<<<< HEAD
private void recycleBin() {
Intent intent=new Intent(NotesListActivity.this,RecycleBinActivity.class);
startActivity(intent);
}
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
@Override
public boolean onSearchRequested() {
startSearch(null, false, null /* appData */, false);

@ -31,7 +31,11 @@ import java.util.HashSet;
import java.util.Iterator;
<<<<<<< HEAD
public class NotesListAdapter extends CursorAdapter {//便签列表链接器(链接数据库)
=======
public class NotesListAdapter extends CursorAdapter {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
private static final String TAG = "NotesListAdapter";
private Context mContext;
private HashMap<Integer, Boolean> mSelectedIndex;

@ -48,7 +48,11 @@ import net.micode.notes.data.Notes.NoteColumns;
import net.micode.notes.gtask.remote.GTaskSyncService;
<<<<<<< HEAD
public class NotesPreferenceActivity extends PreferenceActivity {//便签同步的设置界面
=======
public class NotesPreferenceActivity extends PreferenceActivity {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
public static final String PREFERENCE_NAME = "notes_preferences";
public static final String PREFERENCE_SYNC_ACCOUNT_NAME = "pref_key_account_name";

@ -0,0 +1,264 @@
package net.micode.notes.ui;
import static android.widget.Toast.LENGTH_SHORT;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.AsyncQueryHandler;
import android.content.ContentResolver;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.Toast;
import net.micode.notes.R;
import net.micode.notes.data.Notes;
import net.micode.notes.data.Notes.NoteColumns;
import net.micode.notes.tool.DataUtils;
import java.io.File;
public class RecycleBinActivity extends Activity {
private static final int FOLDER_NOTE_LIST_QUERY_TOKEN = 0;
private BackgroundQueryHandler mBackgroundQueryHandler;
private NotesListAdapter mNotesListAdapter;
private ListView mNotesListView;
private long mCurrentFolderId;
private ContentResolver mContentResolver;
private static final String TAG = "RecycleActivity";
private MenuItem menuItem;
private static final String NORMAL_SELECTION = NoteColumns.PARENT_ID + "=?";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.recycle_bin);
initResources();
}
@Override
protected void onStart() {
super.onStart();
startAsyncNotesListQuery();//启动查询
}
/**
*
*/
@SuppressLint({"InflateParams", "WorldReadableFiles"})
private void initResources() {
mContentResolver = this.getContentResolver();
mBackgroundQueryHandler = new BackgroundQueryHandler(this.getContentResolver());
mCurrentFolderId = Notes.ID_TRASH_FOLER;
mNotesListView = findViewById(R.id.recycle_list);
mNotesListView.addFooterView(LayoutInflater.from(this).inflate(R.layout.note_list_footer, null),
null, false);
mNotesListView.setOnItemClickListener(new OnListItemClickListener());
mNotesListAdapter = new NotesListAdapter(this);
mNotesListAdapter.setChoiceMode(true);
mNotesListView.setAdapter(mNotesListAdapter);
}
/**
* 便,NoteListActivity
*/
private void startAsyncNotesListQuery() {
//查询便签列表,与NoteListActivity类似
mBackgroundQueryHandler.startQuery(FOLDER_NOTE_LIST_QUERY_TOKEN, null,
Notes.CONTENT_NOTE_URI, NoteItemData.PROJECTION, NORMAL_SELECTION, new String[]{
String.valueOf(mCurrentFolderId)
}, NoteColumns.TYPE + " DESC," + NoteColumns.MODIFIED_DATE + " DESC");
}
@SuppressLint("HandlerLeak")
private final class BackgroundQueryHandler extends AsyncQueryHandler {
public BackgroundQueryHandler(ContentResolver contentResolver) {
super(contentResolver);
}
@Override
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
if (token == FOLDER_NOTE_LIST_QUERY_TOKEN) {
mNotesListAdapter.changeCursor(cursor);
}
}
}
@Override
public void onBackPressed() {
super.onBackPressed();
finish();
}
/**
* ,
*/
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
//重置菜单
menu.clear();
//从自定义xml中获取样式
getMenuInflater().inflate(R.menu.recyclebin_options, menu);
//绑定全选按钮
menuItem = menu.findItem(R.id.select_all);
return true;
}
/**
* 便,便,
*/
private void batchDelete() {
//如果没有选中任何便签
if (mNotesListAdapter.getSelectedCount() == 0) {
Log.e(TAG, "Send to desktop error");
//小弹窗提醒
Toast.makeText(this, R.string.error_delete_or_recover, LENGTH_SHORT).show();
return;
}
// 构建确认弹窗
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_realdelete));
//设置积极选项
builder.setPositiveButton(android.R.string.ok,
(dialog, which) -> {//点击确认选项后的事件
if (!DataUtils.batchDeleteNotes(mContentResolver, mNotesListAdapter
.getSelectedItemIds())) {
Log.e(TAG, "Delete notes error, should not happens");
}
//重置所有便签的选择状态
mNotesListAdapter.selectAll(false);
});
//设置消极选项
builder.setNegativeButton(android.R.string.cancel, null);
//弹出弹窗
builder.show();
}
/**
* 便,便trash,
*/
void recover() {
//如果没有选中任何便签
if (mNotesListAdapter.getSelectedCount() == 0) {
Log.e(TAG, "Send to desktop error");
//小弹窗提醒
Toast.makeText(this, R.string.error_delete_or_recover, LENGTH_SHORT).show();
return;
}
//构建弹窗
AlertDialog.Builder builder = new AlertDialog.Builder(this);
//设置弹窗标题
builder.setTitle(getString(R.string.recover));
//设置弹窗图标
builder.setIcon(android.R.drawable.ic_dialog_alert);
//设置弹窗内消息
builder.setMessage(getString(R.string.alert_message_recover));
//设置积极选项
builder.setPositiveButton(android.R.string.ok,
(dialog, which) -> {//确认后执行的方法
if (mNotesListAdapter.getSelectedCount() != 0) {
//移动所选便签至根文件夹
DataUtils.batchMoveToFolder(mContentResolver,
mNotesListAdapter.getSelectedItemIds(), Notes.ID_ROOT_FOLDER);
//重置所有便签的选择状态
mNotesListAdapter.selectAll(false);
}
else//空选便签时执行
Log.e(TAG, "Recover error, no note was selected");
});
//设置消极选项
builder.setNegativeButton(android.R.string.cancel, null);
//显示弹窗
builder.show();
}
/**
*
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.recover) {//还原选项
//还原便签
recover();
} else if (item.getItemId() == R.id.realdelete) {//删除选项
//删除便签
batchDelete();
} else if (item.getItemId() == R.id.select_all) {//全选选项
//全选按钮状态切换
if (!mNotesListAdapter.isAllSelected()) {//若便签没有被全选的情况下点击全选按钮
//切换取消全选图标
item.setIcon(getResources().getDrawable(R.drawable.deselect_all));
//选择所有便签
mNotesListAdapter.selectAll(true);
} else {//如果便签已经被全选
//切换全选图标
item.setIcon(getResources().getDrawable(R.drawable.select_all));
//取消全选所有便签
mNotesListAdapter.selectAll(false);
}
}
return true;
}
/**
* 便,便
*/
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 (item.getType() == Notes.TYPE_NOTE) {
//定位
position = position - mNotesListView.getHeaderViewsCount();
//改变单个便签的被选择状态
mNotesListAdapter.setCheckedItem(position, !mNotesListAdapter.isSelectedItem(position));
//用于判断是否手动全选了便签
if (mNotesListAdapter.isAllSelected())
//切换取消全选图标
menuItem.setIcon(getResources().getDrawable(R.drawable.deselect_all));
else
//切换全选图标
menuItem.setIcon(getResources().getDrawable(R.drawable.select_all));
}
}
}
}
}

@ -32,7 +32,11 @@ import net.micode.notes.tool.ResourceParser;
import net.micode.notes.ui.NoteEditActivity;
import net.micode.notes.ui.NotesListActivity;
<<<<<<< HEAD
public abstract class NoteWidgetProvider extends AppWidgetProvider {//桌面挂件
=======
public abstract class NoteWidgetProvider extends AppWidgetProvider {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
public static final String [] PROJECTION = new String [] {
NoteColumns.ID,
NoteColumns.BG_COLOR_ID,

@ -24,7 +24,11 @@ import net.micode.notes.data.Notes;
import net.micode.notes.tool.ResourceParser;
<<<<<<< HEAD
public class NoteWidgetProvider_2x extends NoteWidgetProvider {//2倍大小的桌面挂件
=======
public class NoteWidgetProvider_2x extends NoteWidgetProvider {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
super.update(context, appWidgetManager, appWidgetIds);

@ -24,7 +24,11 @@ import net.micode.notes.data.Notes;
import net.micode.notes.tool.ResourceParser;
<<<<<<< HEAD
public class NoteWidgetProvider_4x extends NoteWidgetProvider {//4倍大小的桌面挂件
=======
public class NoteWidgetProvider_4x extends NoteWidgetProvider {
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
super.update(context, appWidgetManager, appWidgetIds);

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
tools:ignore="UselessParent">
<ListView
android:id="@+id/recycle_list"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:cacheColorHint="@null"
android:listSelector="@android:color/transparent"
android:divider="@null"
android:fadingEdge="none" />
</LinearLayout>
</FrameLayout>

@ -33,7 +33,14 @@
android:id="@+id/menu_setting"
android:title="@string/menu_setting" />
<<<<<<< HEAD
<item android:title="@string/menu_search" />
<item
android:id="@+id/menu_recyclebin"
android:title="@string/menu_recyclebin"/>
=======
<item
android:id="@+id/menu_search"
android:title="@string/menu_search"/>
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
</menu>

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/select_all"
android:title="@android:string/selectAll"
android:icon="@drawable/select_all"
android:showAsAction="always"/>
<item
android:id="@+id/recover"
android:title="@string/recover"
android:icon="@drawable/recover"
android:showAsAction="always" />
<item
android:id="@+id/realdelete"
android:title="@string/realdelete"
android:icon="@drawable/menu_delete"
android:showAsAction="always" />
</menu>

@ -110,6 +110,10 @@
<string name="preferences_toast_cannot_change_account">正在同步中,不能修改同步帐号</string>
<string name="preferences_toast_success_set_accout">同步帐号已设置为%1$s</string>
<string name="preferences_bg_random_appear_title">新建便签背景颜色随机</string>
<<<<<<< HEAD
<string name="menu_recyclebin">回收站</string>
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
<string name="button_delete">删除</string>
<string name="call_record_folder_name">通话便签</string>
<string name="hint_foler_name">请输入名称</string>

@ -15,8 +15,12 @@
limitations under the License.
-->
<<<<<<< HEAD
<resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
=======
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
<string name="app_name">Notes</string>
<string name="app_widget2x2">Notes 2x2</string>
<string name="app_widget4x4">Notes 4x4</string>
@ -115,7 +119,10 @@
<string name="preferences_toast_cannot_change_account">Cannot change the account because sync is in progress</string>
<string name="preferences_toast_success_set_accout">%1$s has been set as the sync account</string>
<string name="preferences_bg_random_appear_title">New note background color random</string>
<<<<<<< HEAD
=======
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
<string name="button_delete">Delete</string>
<string name="call_record_folder_name">Call notes</string>
<string name="hint_foler_name">Input name</string>
@ -127,9 +134,25 @@
<string name="datetime_dialog_ok">set</string>
<string name="datetime_dialog_cancel">cancel</string>
<plurals name="search_results_title">
<<<<<<< HEAD
<item quantity="one"><xliff:g example="1" id="number">%1$s</xliff:g> result for \"<xliff:g example="???" id="search">%2$s</xliff:g>\"</item>
<!-- Case of 0 or 2 or more results. -->
<item quantity="other"><xliff:g example="15" id="number">%1$s</xliff:g> results for \"<xliff:g example="???" id="search">%2$s</xliff:g>\"</item>
</plurals>
<string name="menu_recyclebin">RecycleBin</string>
<string name="recover">Recover</string>
<string name="realdelete">RealDelete</string>
<string name="error_delete_or_recover" />
<string name="alert_message_realdelete" />
<string name="alert_message_recover" />
=======
<item quantity="one"><xliff:g id="number" example="1">%1$s</xliff:g> result for \"<xliff:g id="search" example="???">%2$s</xliff:g>\"</item>
<!-- Case of 0 or 2 or more results. -->
<item quantity="other"><xliff:g id="number" example="15">%1$s</xliff:g> results for \"<xliff:g id="search" example="???">%2$s</xliff:g>\"</item>
</plurals>
>>>>>>> eb3503841352f4e0b24e8be753535ca4439360d0
</resources>

Loading…
Cancel
Save