期中测评的报告以及代码上传

期中测评的报告以及代码上传
pull/10/head
mth9uq3ve 2 years ago
commit 6a75eafbfe

@ -1,2 +0,0 @@
# xiaomi_mini

@ -71,9 +71,9 @@ public class SqlData {
private ContentValues mDiffDataValues;
public SqlData(Context context) {//初始化对象,用于存储数据
public SqlData(Context context) {
mContentResolver = context.getContentResolver();
mIsCreate = true;//一类型的变量为true
mIsCreate = true;
mDataId = INVALID_ID;
mDataMimeType = DataConstants.NOTE;
mDataContent = "";
@ -82,14 +82,14 @@ public class SqlData {
mDiffDataValues = new ContentValues();
}
public SqlData(Context context, Cursor c) {//同样是存储数据另外定义支持冲cursor读入
public SqlData(Context context, Cursor c) {
mContentResolver = context.getContentResolver();
mIsCreate = false;//二类型的变量为false
mIsCreate = false;
loadFromCursor(c);
mDiffDataValues = new ContentValues();
}
private void loadFromCursor(Cursor c) {//上面用到的从cursor读取的函数从存储的各个列获取数据
private void loadFromCursor(Cursor c) {
mDataId = c.getLong(DATA_ID_COLUMN);
mDataMimeType = c.getString(DATA_MIME_TYPE_COLUMN);
mDataContent = c.getString(DATA_CONTENT_COLUMN);
@ -97,9 +97,9 @@ public class SqlData {
mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN);
}
public void setContent(@androidx.annotation.NonNull JSONObject js) throws JSONException {//获取json类型的参数并且根据它更新自定义的数据单元中的值
long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID;//如果有id直接赋值没有则需要在获取
if (mIsCreate || mDataId != dataId) {//初始未设置的数据单元通过它设置内容通过cursor产生的数据元可通过它完成更新
public void setContent(JSONObject js) throws JSONException {
long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID;
if (mIsCreate || mDataId != dataId) {
mDiffDataValues.put(DataColumns.ID, dataId);
}
mDataId = dataId;
@ -131,7 +131,7 @@ public class SqlData {
}
public JSONObject getContent() throws JSONException {
if (mIsCreate) {//同样的只有通过cursor产生的数据单元可通过这个函数获取数据
if (mIsCreate) {
Log.e(TAG, "it seems that we haven't created this in database yet");
return null;
}
@ -144,7 +144,7 @@ public class SqlData {
return js;
}
public void commit(long noteId, boolean validateVersion, long version) {//提交数据,并且打上类似于标签的版本号以及验证值
public void commit(long noteId, boolean validateVersion, long version) {
if (mIsCreate) {
if (mDataId == INVALID_ID && mDiffDataValues.containsKey(DataColumns.ID)) {
@ -162,12 +162,12 @@ public class SqlData {
} else {
if (mDiffDataValues.size() > 0) {
int result = 0;
if (!validateVersion) { // 不验证版本的情况下直接使用ContentResolver更新指定ID的数据
if (!validateVersion) {
result = mContentResolver.update(ContentUris.withAppendedId(
Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, null, null);
} else { // 需要验证版本的情况下使用ContentResolver进行条件更新操作
} else {
result = mContentResolver.update(ContentUris.withAppendedId(
Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues,
Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues,
" ? in (SELECT " + NoteColumns.ID + " FROM " + TABLE.NOTE
+ " WHERE " + NoteColumns.VERSION + "=?)", new String[] {
String.valueOf(noteId), String.valueOf(version)

@ -122,7 +122,7 @@ public class SqlNote {
private ArrayList<SqlData> mDataList;
public SqlNote(Context context) {//定义数据单元存储数据
public SqlNote(Context context) {
mContext = context;
mContentResolver = context.getContentResolver();
mIsCreate = true;
@ -135,7 +135,7 @@ public class SqlNote {
mParentId = 0;
mSnippet = "";
mType = Notes.TYPE_NOTE;
mWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;//直接从设置的属性中获取值
mWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
mWidgetType = Notes.TYPE_WIDGET_INVALIDE;
mOriginParent = 0;
mVersion = 0;
@ -147,14 +147,14 @@ public class SqlNote {
mContext = context;
mContentResolver = context.getContentResolver();
mIsCreate = false;
loadFromCursor(c);//从cursor中直接获取变量值
loadFromCursor(c);
mDataList = new ArrayList<SqlData>();
if (mType == Notes.TYPE_NOTE)
loadDataContent();
mDiffNoteValues = new ContentValues();
}
public SqlNote(Context context, long id) {//根据id初始化数据单元
public SqlNote(Context context, long id) {
mContext = context;
mContentResolver = context.getContentResolver();
mIsCreate = false;
@ -175,7 +175,7 @@ public class SqlNote {
}, null);
if (c != null) {
c.moveToNext();
loadFromCursor(c);//通过调用减少重复代码编写
loadFromCursor(c);
} else {
Log.w(TAG, "loadFromCursor: cursor = null");
}
@ -185,7 +185,7 @@ public class SqlNote {
}
}
private void loadFromCursor(Cursor c) {//直接使用get获得变量值
private void loadFromCursor(Cursor c) {
mId = c.getLong(ID_COLUMN);
mAlertDate = c.getLong(ALERTED_DATE_COLUMN);
mBgColorId = c.getInt(BG_COLOR_ID_COLUMN);
@ -200,7 +200,7 @@ public class SqlNote {
mVersion = c.getLong(VERSION_COLUMN);
}
private void loadDataContent() {//这个函数判别查询的数据是否存在,并且读取到数据列表中存储
private void loadDataContent() {
Cursor c = null;
mDataList.clear();
try {
@ -210,12 +210,12 @@ public class SqlNote {
}, null);
if (c != null) {
if (c.getCount() == 0) {
Log.w(TAG, "it seems that the note has not data");//遇到文件为空抛出对应的异常
Log.w(TAG, "it seems that the note has not data");
return;
}
while (c.moveToNext()) {
SqlData data = new SqlData(mContext, c);
mDataList.add(data);//向Datalist中加入读取到的数据
mDataList.add(data);
}
} else {
Log.w(TAG, "loadDataContent: cursor = null");
@ -226,8 +226,7 @@ public class SqlNote {
}
}
public boolean setContent(JSONObject js) {//设置数据单元中变量的值
//如果所需的值存在,直接赋值使用,否则再先进行一步读取
public boolean setContent(JSONObject js) {
try {
JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);
if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) {
@ -360,7 +359,7 @@ public class SqlNote {
return true;
}
public JSONObject getContent() {//直接读取的方式将所需的数据读到对应变量
public JSONObject getContent() {
try {
JSONObject js = new JSONObject();
@ -413,7 +412,6 @@ public class SqlNote {
mDiffNoteValues.put(NoteColumns.PARENT_ID, id);
}
//定义一些简单的获取取值的方法
public void setGtaskId(String gid) {
mDiffNoteValues.put(NoteColumns.GTASK_ID, gid);
}
@ -442,7 +440,7 @@ public class SqlNote {
return mType == Notes.TYPE_NOTE;
}
public void commit(boolean validateVersion) {//将数据做一定修改提交
public void commit(boolean validateVersion) {
if (mIsCreate) {
if (mId == INVALID_ID && mDiffNoteValues.containsKey(NoteColumns.ID)) {
mDiffNoteValues.remove(NoteColumns.ID);

@ -32,7 +32,7 @@ import org.json.JSONException;
import org.json.JSONObject;
public class Task extends Node {//继承Node类的属性
public class Task extends Node {
private static final String TAG = Task.class.getSimpleName();
private boolean mCompleted;
@ -54,7 +54,7 @@ public class Task extends Node {//继承Node类的属性
mMetaInfo = null;
}
public JSONObject getCreateAction(int actionId) {//创建一个初始的任务对象,并对它赋初值
public JSONObject getCreateAction(int actionId) {
JSONObject js = new JSONObject();
try {
@ -103,7 +103,7 @@ public class Task extends Node {//继承Node类的属性
return js;
}
public JSONObject getUpdateAction(int actionId) {//更新任务
public JSONObject getUpdateAction(int actionId) {
JSONObject js = new JSONObject();
try {
@ -120,7 +120,7 @@ public class Task extends Node {//继承Node类的属性
// entity_delta
JSONObject entity = new JSONObject();
entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName());
if (getNotes() != null) {//如果笔记不为空,更新笔记
if (getNotes() != null) {
entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes());
}
entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted());
@ -135,11 +135,11 @@ public class Task extends Node {//继承Node类的属性
return js;
}
public void setContentByRemoteJSON(JSONObject js) {//通过远端的json设置内容的值
public void setContentByRemoteJSON(JSONObject js) {
if (js != null) {
try {
// id
if (js.has(GTaskStringUtils.GTASK_JSON_ID)) {//如果值已经被json对象所具备则直接进行设置
if (js.has(GTaskStringUtils.GTASK_JSON_ID)) {
setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID));
}
@ -175,7 +175,7 @@ public class Task extends Node {//继承Node类的属性
}
}
public void setContentByLocalJSON(JSONObject js) {//通过本地的json文件来设置内容
public void setContentByLocalJSON(JSONObject js) {
if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE)
|| !js.has(GTaskStringUtils.META_HEAD_DATA)) {
Log.w(TAG, "setContentByLocalJSON: nothing is avaiable");
@ -204,7 +204,7 @@ public class Task extends Node {//继承Node类的属性
}
}
public JSONObject getLocalJSONFromContent() {//通过本地的内容生成json文件
public JSONObject getLocalJSONFromContent() {
String name = getName();
try {
if (mMetaInfo == null) {
@ -216,7 +216,7 @@ public class Task extends Node {//继承Node类的属性
JSONObject js = new JSONObject();
JSONObject note = new JSONObject();
JSONArray dataArray = new JSONArray();//声明所有所要用到的变量
JSONArray dataArray = new JSONArray();
JSONObject data = new JSONObject();
data.put(DataColumns.CONTENT, name);
dataArray.put(data);
@ -227,7 +227,7 @@ public class Task extends Node {//继承Node类的属性
} else {
// synced task
JSONObject note = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);
JSONArray dataArray = mMetaInfo.getJSONArray(GTaskStringUtils.META_HEAD_DATA);//提取出所有的信息
JSONArray dataArray = mMetaInfo.getJSONArray(GTaskStringUtils.META_HEAD_DATA);
for (int i = 0; i < dataArray.length(); i++) {
JSONObject data = dataArray.getJSONObject(i);
@ -258,11 +258,11 @@ public class Task extends Node {//继承Node类的属性
}
}
public int getSyncAction(Cursor c) {//同步缓存
public int getSyncAction(Cursor c) {
try {
JSONObject noteInfo = null;
if (mMetaInfo != null && mMetaInfo.has(GTaskStringUtils.META_HEAD_NOTE)) {
noteInfo = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);//更新到最新的笔记信息
noteInfo = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);
}
if (noteInfo == null) {
@ -311,14 +311,14 @@ public class Task extends Node {//继承Node类的属性
return SYNC_ACTION_ERROR;
}
public boolean isWorthSaving() {//只要有信息就认为是值得保存的返回true
public boolean isWorthSaving() {
return mMetaInfo != null || (getName() != null && getName().trim().length() > 0)
|| (getNotes() != null && getNotes().trim().length() > 0);
}
public void setCompleted(boolean completed) {
this.mCompleted = completed;
}//进行前面使用过的调用函数返回值的对应
}
public void setNotes(String notes) {
this.mNotes = notes;

@ -30,17 +30,17 @@ import org.json.JSONObject;
import java.util.ArrayList;
public class TaskList extends Node {//同Task一样继承了Node
public class TaskList extends Node {
private static final String TAG = TaskList.class.getSimpleName();
private int mIndex;
private ArrayList<Task> mChildren;//内部含有一个Task的列是任务的序列
private ArrayList<Task> mChildren;
public TaskList() {
super();
mChildren = new ArrayList<Task>();
mIndex = 1;//初始化
mIndex = 1;
}
public JSONObject getCreateAction(int actionId) {
@ -74,7 +74,7 @@ public class TaskList extends Node {//同Task一样继承了Node
return js;
}
public JSONObject getUpdateAction(int actionId) {//更新行动与Task中定义的基本一样
public JSONObject getUpdateAction(int actionId) {
JSONObject js = new JSONObject();
try {
@ -104,7 +104,7 @@ public class TaskList extends Node {//同Task一样继承了Node
}
public void setContentByRemoteJSON(JSONObject js) {
if (js != null) {//类似的通过远端更新内容
if (js != null) {
try {
// id
if (js.has(GTaskStringUtils.GTASK_JSON_ID)) {
@ -129,7 +129,7 @@ public class TaskList extends Node {//同Task一样继承了Node
}
}
public void setContentByLocalJSON(JSONObject js) {//通过本地文件更新内容
public void setContentByLocalJSON(JSONObject js) {
if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE)) {
Log.w(TAG, "setContentByLocalJSON: nothing is avaiable");
}
@ -215,26 +215,26 @@ public class TaskList extends Node {//同Task一样继承了Node
return SYNC_ACTION_ERROR;
}
//以上都与task定义类似
public int getChildTaskCount() {
return mChildren.size();
}
public boolean addChildTask(Task task) {
boolean ret = false;
if (task != null && !mChildren.contains(task)) {//任务不为空,并且还不在列表中,则将其加入
if (task != null && !mChildren.contains(task)) {
ret = mChildren.add(task);
if (ret) {//成功加入以后继续设置关系
if (ret) {
// need to set prior sibling and parent
task.setPriorSibling(mChildren.isEmpty() ? null : mChildren
.get(mChildren.size() - 1));
task.setParent(this);//设置任务的父子关系
task.setParent(this);
}
}
return ret;
}
public boolean addChildTask(Task task, int index) {//更进一步的实现在指定索引位置插入任务
public boolean addChildTask(Task task, int index) {
if (index < 0 || index > mChildren.size()) {
Log.e(TAG, "add child task: invalid index");
return false;
@ -260,9 +260,9 @@ public class TaskList extends Node {//同Task一样继承了Node
return true;
}
public boolean removeChildTask(Task task) {//移除子任务
public boolean removeChildTask(Task task) {
boolean ret = false;
int index = mChildren.indexOf(task);//查找其索引
int index = mChildren.indexOf(task);
if (index != -1) {
ret = mChildren.remove(task);
@ -281,7 +281,7 @@ public class TaskList extends Node {//同Task一样继承了Node
return ret;
}
public boolean moveChildTask(Task task, int index) {//定向移除对应位置的任务
public boolean moveChildTask(Task task, int index) {
if (index < 0 || index >= mChildren.size()) {
Log.e(TAG, "move child task: invalid index");
@ -299,7 +299,7 @@ public class TaskList extends Node {//同Task一样继承了Node
return (removeChildTask(task) && addChildTask(task, index));
}
public Task findChildTaskByGid(String gid) {//通过Gid查找任务
public Task findChildTaskByGid(String gid) {
for (int i = 0; i < mChildren.size(); i++) {
Task t = mChildren.get(i);
if (t.getGid().equals(gid)) {
@ -309,7 +309,7 @@ public class TaskList extends Node {//同Task一样继承了Node
return null;
}
public int getChildTaskIndex(Task task) {//获取任务对应的索引
public int getChildTaskIndex(Task task) {
return mChildren.indexOf(task);
}
@ -323,7 +323,7 @@ public class TaskList extends Node {//同Task一样继承了Node
public Task getChilTaskByGid(String gid) {
for (Task task : mChildren) {
if (task.getGid().equals(gid))//找到一个gid相符的即为所要的任务
if (task.getGid().equals(gid))
return task;
}
return null;

@ -39,4 +39,3 @@ public class ActionFailureException extends RuntimeException {
super(paramString, paramThrowable);
}
}

@ -42,3 +42,4 @@ public class NetworkFailureException extends Exception {
super(paramString, paramThrowable);
}
}

@ -59,7 +59,12 @@ import java.util.List;
import java.util.zip.GZIPInputStream;
import java.util.zip.Inflater;
import java.util.zip.InflaterInputStream;
/**
* @classname: GTaskClient
* @description:GTASKGTASK
* @date: 2024/1/4 11:21
* @author: wangrunze
*/
public class GTaskClient {
private static final String TAG = GTaskClient.class.getSimpleName();
@ -101,17 +106,32 @@ public class GTaskClient {
mAccount = null;
mUpdateArray = null;
}
/**
* @classname: GTaskClient
* @methodname: getInstance
* @description:
* @date: 2024/1/4 11:22
* @author: wangrunze
*/
public static synchronized GTaskClient getInstance() {
if (mInstance == null) {
mInstance = new GTaskClient();
}
return mInstance;
}
/**
* @classname: GTaskClient
* @methodname: login
* @description:
* @date: 2024/1/4 11:22
* @author: wangrunze
* @param:Activity activity
* @return:true/false
*/
public boolean login(Activity activity) {
// we suppose that the cookie would expire after 5 minutes
// then we need to re-login
//判断距离最后一次登录操作是否超过5分钟
final long interval = 1000 * 60 * 5;
if (mLastLoginTime + interval < System.currentTimeMillis()) {
mLoggedin = false;
@ -126,6 +146,7 @@ public class GTaskClient {
if (mLoggedin) {
Log.d(TAG, "already logged in");
//如果没超过时间,则不需要重新登录
return true;
}
@ -135,7 +156,7 @@ public class GTaskClient {
Log.e(TAG, "login google account failed");
return false;
}
//使用用户自己的域名登录
// login with custom domain if necessary
if (!(mAccount.name.toLowerCase().endsWith("gmail.com") || mAccount.name.toLowerCase()
.endsWith("googlemail.com"))) {
@ -151,6 +172,7 @@ public class GTaskClient {
}
}
//如果用户账户无法登录则使用谷歌官方的URI进行登录
// try to login with google official url
if (!mLoggedin) {
mGetUrl = GTASK_GET_URL;
@ -163,7 +185,16 @@ public class GTaskClient {
mLoggedin = true;
return true;
}
/**
* @classname: GTaskClient
* @methodname: loginGoogleAccount
* @description:使
* @date: 2024/1/4 11:24
* @author: wangrunze
* @param:Activity activity
* @param:boolean invalidateToken
* @return:
*/
private String loginGoogleAccount(Activity activity, boolean invalidateToken) {
String authToken;
AccountManager accountManager = AccountManager.get(activity);
@ -188,7 +219,7 @@ public class GTaskClient {
Log.e(TAG, "unable to get an account with the same name in the settings");
return null;
}
//获取选中账号的令牌
// get the token now
AccountManagerFuture<Bundle> accountManagerFuture = accountManager.getAuthToken(account,
"goanna_mobile", null, activity, null, null);
@ -206,7 +237,16 @@ public class GTaskClient {
return authToken;
}
/**
* @classname: GTaskClient
* @methodname: tryToLoginGtask
* @description:GTask
* @date: 2024/1/4 11:25
* @author: wangrunze
* @param:Activity activity
* @param:String authToken
* @return:true/false
*/
private boolean tryToLoginGtask(Activity activity, String authToken) {
if (!loginGtask(authToken)) {
// maybe the auth token is out of date, now let's invalidate the
@ -224,7 +264,14 @@ public class GTaskClient {
}
return true;
}
/**
* @classname: GTaskClient
* @methodname: loginGtask
* @description:GTask
* @date: 2024/1/4 11:26
* @author: wangrunze
* @param:String authToken
*/
private boolean loginGtask(String authToken) {
int timeoutConnection = 10000;
int timeoutSocket = 15000;
@ -238,11 +285,11 @@ public class GTaskClient {
// login gtask
try {
String loginUrl = mGetUrl + "?auth=" + authToken;
HttpGet httpGet = new HttpGet(loginUrl);
String loginUrl = mGetUrl + "?auth=" + authToken;//设置登录的url
HttpGet httpGet = new HttpGet(loginUrl);//通过登录的uri实例化网页上资源的查找
HttpResponse response = null;
response = mHttpClient.execute(httpGet);
//获取CookieStore里存放的cookie
// get the cookie now
List<Cookie> cookies = mHttpClient.getCookieStore().getCookies();
boolean hasAuthCookie = false;
@ -254,7 +301,7 @@ public class GTaskClient {
if (!hasAuthCookie) {
Log.w(TAG, "it seems that there is no auth cookie");
}
//获取client的内容
// get the client version
String resString = getResponseContent(response.getEntity());
String jsBegin = "_setup(";
@ -283,14 +330,29 @@ public class GTaskClient {
private int getActionId() {
return mActionId++;
}
/**
* @classname: GTaskClient
* @methodname: createHttpPost
* @description:
* @date: 2024/1/4 11:28
* @author: wangrunze
* @return:httpPost
*/
private HttpPost createHttpPost() {
HttpPost httpPost = new HttpPost(mPostUrl);
httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
httpPost.setHeader("AT", "1");
return httpPost;
}
/**
* @classname: GTaskClient
* @methodname: getResponseContent
* @description:
* @date: 2024/1/4 11:29
* @author: wangrunze
* @param:HttpEntity entity
* @return:
*/
private String getResponseContent(HttpEntity entity) throws IOException {
String contentEncoding = null;
if (entity.getContentEncoding() != null) {
@ -322,7 +384,15 @@ public class GTaskClient {
input.close();
}
}
/**
* @classname: GTaskClient
* @methodname: postRequest
* @description: JSON
* @date: 2024/1/4 11:30
* @author: wangrunze
* @param:JSONObject js
* @return:JSONObject
*/
private JSONObject postRequest(JSONObject js) throws NetworkFailureException {
if (!mLoggedin) {
Log.e(TAG, "please login first");
@ -359,7 +429,14 @@ public class GTaskClient {
throw new ActionFailureException("error occurs when posting request");
}
}
/**
* @classname: GTaskClient
* @methodname: createTask
* @description:
* @date: 2024/1/4 11:31
* @author: wangrunze
* @param:Task task
*/
public void createTask(Task task) throws NetworkFailureException {
commitUpdate();
try {
@ -385,7 +462,14 @@ public class GTaskClient {
throw new ActionFailureException("create task: handing jsonobject failed");
}
}
/**
* @classname: GTaskClient
* @methodname: createTaskList
* @description:
* @date: 2024/1/4 11:31
* @author: wangrunze
* @param:TaskList tasklist
*/
public void createTaskList(TaskList tasklist) throws NetworkFailureException {
commitUpdate();
try {
@ -411,7 +495,13 @@ public class GTaskClient {
throw new ActionFailureException("create tasklist: handing jsonobject failed");
}
}
/**
* @classname: GTaskClient
* @methodname: commitUpdate
* @description:
* @date: 2024/1/4 11:32
* @author: wangrunze
*/
public void commitUpdate() throws NetworkFailureException {
if (mUpdateArray != null) {
try {
@ -432,7 +522,14 @@ public class GTaskClient {
}
}
}
/**
* @classname: GTaskClient
* @methodname: addUpdateNode
* @description:
* @date: 2024/1/4 11:32
* @author: wangrunze
* @param:Node node
*/
public void addUpdateNode(Node node) throws NetworkFailureException {
if (node != null) {
// too many update items may result in an error
@ -446,7 +543,16 @@ public class GTaskClient {
mUpdateArray.put(node.getUpdateAction(getActionId()));
}
}
/**
* @classname: GTaskClient
* @methodname: moveTask
* @description:task
* @date: 2024/1/4 11:32
* @author: wangrunze
* @param:Task task
* @param:TaskList preParent
* @param:TaskList curParent
*/
public void moveTask(Task task, TaskList preParent, TaskList curParent)
throws NetworkFailureException {
commitUpdate();
@ -485,7 +591,14 @@ public class GTaskClient {
throw new ActionFailureException("move task: handing jsonobject failed");
}
}
/**
* @classname: GTaskClient
* @methodname: deleteNode
* @description:
* @date: 2024/1/4 11:33
* @author: wangrunze
* @param:Node node
*/
public void deleteNode(Node node) throws NetworkFailureException {
commitUpdate();
try {
@ -508,7 +621,13 @@ public class GTaskClient {
throw new ActionFailureException("delete node: handing jsonobject failed");
}
}
/**
* @classname: GTaskClient
* @methodname: getTaskLists
* @description:
* @date: 2024/1/4 11:34
* @author: wangrunze
*/
public JSONArray getTaskLists() throws NetworkFailureException {
if (!mLoggedin) {
Log.e(TAG, "please login first");
@ -546,7 +665,14 @@ public class GTaskClient {
throw new ActionFailureException("get task lists: handing jasonobject failed");
}
}
/**
* @classname: GTaskClient
* @methodname: getTaskList
* @description:
* @date: 2024/1/4 11:34
* @author: wangrunze
* @param:String listGid
*/
public JSONArray getTaskList(String listGid) throws NetworkFailureException {
commitUpdate();
try {

@ -47,7 +47,12 @@ import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
/**
* @classname: GTaskManager
* @description:gtask
* @date: 2024/1/4 11:36
* @author: wangrunze
*/
public class GTaskManager {
private static final String TAG = GTaskManager.class.getSimpleName();
@ -87,7 +92,7 @@ public class GTaskManager {
private HashMap<Long, String> mNidToGid;
private GTaskManager() {
private GTaskManager() {//对象初始化函数
mSyncing = false;
mCancelled = false;
mGTaskListHashMap = new HashMap<String, TaskList>();
@ -98,19 +103,41 @@ public class GTaskManager {
mGidToNid = new HashMap<String, Long>();
mNidToGid = new HashMap<Long, String>();
}
/**
* @classname: GTaskManager
* @methodname: getInstance
* @description:
* @date: 2024/1/4 11:37
* @author: wangrunze
*/
public static synchronized GTaskManager getInstance() {
if (mInstance == null) {
mInstance = new GTaskManager();
}
return mInstance;
}
/**
* @classname: GTaskManager
* @methodname: setActivityContext
* @description:线
* @date: 2024/1/4 11:38
* @author: wangrunze
* @param:Activity activity
*/
public synchronized void setActivityContext(Activity activity) {
// used for getting authtoken
mActivity = activity;
}
/**
* @classname: GTaskManager
* @methodname: sync
* @description:
* @date: 2024/1/4 11:38
* @author: wangrunze
* @param:Context context
* @param:GTaskASyncTask asyncTask
*/
public int sync(Context context, GTaskASyncTask asyncTask) {
if (mSyncing) {
Log.d(TAG, "Sync is in progress");
@ -128,14 +155,14 @@ public class GTaskManager {
mNidToGid.clear();
try {
GTaskClient client = GTaskClient.getInstance();
GTaskClient client = GTaskClient.getInstance();//getInstance即为创建一个实例
client.resetUpdateArray();
// login google task
if (!mCancelled) {
if (!client.login(mActivity)) {
throw new NetworkFailureException("login google task failed");
}
}//获取Google上的JSONtasklist转为本地TaskList
}
// get the task list from google
@ -167,7 +194,13 @@ public class GTaskManager {
return mCancelled ? STATE_SYNC_CANCELLED : STATE_SUCCESS;
}
/**
* @classname: GTaskManager
* @methodname: initGTaskList
* @description:GtaskList
* @date: 2024/1/4 11:41
* @author: wangrunze
*/
private void initGTaskList() throws NetworkFailureException {
if (mCancelled)
return;
@ -246,7 +279,13 @@ public class GTaskManager {
throw new ActionFailureException("initGTaskList: handing JSONObject failed");
}
}
/**
* @classname: GTaskManager
* @methodname: syncContent
* @description:
* @date: 2024/1/4 11:41
* @author: wangrunze
*/
private void syncContent() throws NetworkFailureException {
int syncType;
Cursor c = null;
@ -350,7 +389,13 @@ public class GTaskManager {
}
}
/**
* @classname: GTaskManager
* @methodname: syncFolder
* @description:
* @date: 2024/1/4 11:42
* @author: wangrunze
*/
private void syncFolder() throws NetworkFailureException {
Cursor c = null;
String gid;
@ -475,7 +520,16 @@ public class GTaskManager {
if (!mCancelled)
GTaskClient.getInstance().commitUpdate();
}
/**
* @classname: GTaskManager
* @methodname: doContentSync
* @description:syncType
* @date: 2024/1/4 11:43
* @author: wangrunze
* @param:int syncType
* @param:Node node
* @param: Cursor c
*/
private void doContentSync(int syncType, Node node, Cursor c) throws NetworkFailureException {
if (mCancelled) {
return;
@ -521,7 +575,14 @@ public class GTaskManager {
throw new ActionFailureException("unkown sync action type");
}
}
/**
* @classname: GTaskManager
* @methodname: addLocalNode
* @description:Node
* @date: 2024/1/4 11:43
* @author: wangrunze
* @param:Node node
*/
private void addLocalNode(Node node) throws NetworkFailureException {
if (mCancelled) {
return;
@ -595,7 +656,15 @@ public class GTaskManager {
// update meta
updateRemoteMeta(node.getGid(), sqlNote);
}
/**
* @classname: GTaskManager
* @methodname: updateLocalNode
* @description:node
* @date: 2024/1/4 11:44
* @author: wangrunze
* @param:Node node
* @param:Cursor cCursor c
*/
private void updateLocalNode(Node node, Cursor c) throws NetworkFailureException {
if (mCancelled) {
return;
@ -618,7 +687,15 @@ public class GTaskManager {
// update meta info
updateRemoteMeta(node.getGid(), sqlNote);
}
/**
* @classname: GTaskManager
* @methodname: addRemoteNode
* @description:Node
* @date: 2024/1/4 11:44
* @author: wangrunze
* @param:Node node
* @param:Cursor c
*/
private void addRemoteNode(Node node, Cursor c) throws NetworkFailureException {
if (mCancelled) {
return;
@ -691,7 +768,15 @@ public class GTaskManager {
mGidToNid.put(n.getGid(), sqlNote.getId());
mNidToGid.put(sqlNote.getId(), n.getGid());
}
/**
* @classname: GTaskManager
* @methodname: updateRemoteNode
* @description:Node
* @date: 2024/1/4 11:45
* @author: wangrunze
* @param:Node node
* @param:Cursor c
*/
private void updateRemoteNode(Node node, Cursor c) throws NetworkFailureException {
if (mCancelled) {
return;
@ -729,7 +814,15 @@ public class GTaskManager {
sqlNote.resetLocalModified();
sqlNote.commit(true);
}
/**
* @classname: GTaskManager
* @methodname: updateRemoteMeta
* @description:meta
* @date: 2024/1/4 11:45
* @author: wangrunze
* @param:String gid
* @param:SqlNote sqlNote
*/
private void updateRemoteMeta(String gid, SqlNote sqlNote) throws NetworkFailureException {
if (sqlNote != null && sqlNote.isNoteType()) {
MetaData metaData = mMetaHashMap.get(gid);
@ -745,7 +838,13 @@ public class GTaskManager {
}
}
}
/**
* @classname: GTaskManager
* @methodname: refreshLocalSyncId
* @description:
* @date: 2024/1/4 11:46
* @author: wangrunze
*/
private void refreshLocalSyncId() throws NetworkFailureException {
if (mCancelled) {
return;
@ -789,11 +888,23 @@ public class GTaskManager {
}
}
}
/**
* @classname: GTaskManager
* @methodname: getSyncAccount
* @description:
* @date: 2024/1/4 11:47
* @author: wangrunze
*/
public String getSyncAccount() {
return GTaskClient.getInstance().getSyncAccount().name;
}
/**
* @classname: GTaskManager
* @methodname: cancelSync
* @description:
* @date: 2024/1/4 11:48
* @author: wangrunze
*/
public void cancelSync() {
mCancelled = true;
}

@ -22,7 +22,12 @@ import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.IBinder;
/**
* @classname: GTaskSyncService
* @description:
* @date: 2024/1/4 11:50
* @author: wangrunze
*/
public class GTaskSyncService extends Service {
public final static String ACTION_STRING_NAME = "sync_action_type";
@ -41,7 +46,13 @@ public class GTaskSyncService extends Service {
private static GTaskASyncTask mSyncTask = null;
private static String mSyncProgress = "";
/**
* @classname: GTaskSyncService
* @methodname: startSync
* @description:
* @date: 2024/1/4 11:52
* @author: wangrunze
*/
private void startSync() {
if (mSyncTask == null) {
mSyncTask = new GTaskASyncTask(this, new GTaskASyncTask.OnCompleteListener() {
@ -55,18 +66,36 @@ public class GTaskSyncService extends Service {
mSyncTask.execute();
}
}
/**
* @classname: GTaskSyncService
* @methodname: cancelSync
* @description:
* @date: 2024/1/4 11:53
* @author: wangrunze
*/
private void cancelSync() {
if (mSyncTask != null) {
mSyncTask.cancelSync();
}
}
/**
* @classname: GTaskSyncService
* @methodname: onCreate
* @description:service
* @date: 2024/1/4 11:53
* @author: wangrunze
*/
@Override
public void onCreate() {
mSyncTask = null;
}
/**
* @classname: GTaskSyncService
* @methodname: onStartCommand
* @description:service
* @date: 2024/1/4 11:54
* @author: wangrunze
*/
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Bundle bundle = intent.getExtras();
@ -85,7 +114,13 @@ public class GTaskSyncService extends Service {
}
return super.onStartCommand(intent, flags, startId);
}
/**
* @classname: GTaskSyncService
* @methodname: onLowMemory
* @description:
* @date: 2024/1/4 11:54
* @author: wangrunze
*/
@Override
public void onLowMemory() {
if (mSyncTask != null) {
@ -96,7 +131,14 @@ public class GTaskSyncService extends Service {
public IBinder onBind(Intent intent) {
return null;
}
/**
* @classname: GTaskSyncService
* @methodname: sendBroadcast
* @description:广
* @date: 2024/1/4 11:55
* @author: wangrunze
* @param:String msg
*/
public void sendBroadcast(String msg) {
mSyncProgress = msg;
Intent intent = new Intent(GTASK_SERVICE_BROADCAST_NAME);
@ -105,13 +147,28 @@ public class GTaskSyncService extends Service {
sendBroadcast(intent);
}
/**
* @classname: GTaskSyncService
* @methodname: startSync
* @description:service
* @date: 2024/1/4 11:56
* @author: wangrunze
* @param:Activity activity
*/
public static void startSync(Activity activity) {
GTaskManager.getInstance().setActivityContext(activity);
Intent intent = new Intent(activity, GTaskSyncService.class);
intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_START_SYNC);
activity.startService(intent);
}
/**
* @classname: GTaskSyncService
* @methodname: cancelSync
* @description:service
* @date: 2024/1/4 11:56
* @author: wangrunze
* @param:Context context
*/
public static void cancelSync(Context context) {
Intent intent = new Intent(context, GTaskSyncService.class);
intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_CANCEL_SYNC);

@ -33,78 +33,102 @@ import net.micode.notes.data.Notes.TextNote;
import java.util.ArrayList;
/**
* @classname: Note
* @description:便便
* 便
* @date: 2024/1/2 21:31
* @author: Xia Yanbo
*/
public class Note {
private ContentValues mNoteDiffValues;
private NoteData mNoteData;
private static final String TAG = "Note";
/**
* Create a new note id for adding a new note to databases
* @classname: Note
* @description:便
* @date: 2024/1/2 20:36
* @author: Xia Yanbo
* @param:context
* @param:folderId id
* @return:noteIDid
*/
public static synchronized long getNewNoteId(Context context, long folderId) {
public static synchronized long getNewNoteId(Context context, long folderId) {//控制类的所有实例的并发访问
// Create a new note in the database
//初始化变量的信息
ContentValues values = new ContentValues();
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);
Uri uri = context.getContentResolver().insert(Notes.CONTENT_NOTE_URI, values);
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);//插入新的便签记录(标记)
long noteId = 0;
try {
noteId = Long.valueOf(uri.getPathSegments().get(1));
} catch (NumberFormatException e) {
noteId = Long.valueOf(uri.getPathSegments().get(1));//获取新笔记纪录的id
} catch (NumberFormatException e) {//获取失败报错
Log.e(TAG, "Get note id error :" + e.toString());
noteId = 0;
}
//如果noteid为-1抛出id错误的信息
if (noteId == -1) {
throw new IllegalStateException("Wrong note id:" + noteId);
}
return noteId;
}
//初始化定义两个变量用来存储便签的数据,一个是存储便签属性、一个是存储便签内容
public Note() {
mNoteDiffValues = new ContentValues();
mNoteData = new NoteData();
mNoteDiffValues = new ContentValues();//便签属性
mNoteData = new NoteData();//便签内容
}
//设置便签的属性
public void setNoteValue(String key, String value) {
mNoteDiffValues.put(key, value);
mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1);
mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis());
mNoteDiffValues.put(key, value);//键值id
mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1);//本地编辑修改位
mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis());//修改日期
}
//设置文本数据(标记)
public void setTextData(String key, String value) {
mNoteData.setTextData(key, value);
}
//设置文本数据的id
public void setTextDataId(long id) {
mNoteData.setTextDataId(id);
}
//获取文本数据的id
public long getTextDataId() {
return mNoteData.mTextDataId;
}
//设置通话数据的id
public void setCallDataId(long id) {
mNoteData.setCallDataId(id);
}
//设置通话数据
public void setCallData(String key, String value) {
mNoteData.setCallData(key, value);
}
//判断本地的文件有没有被修改
public boolean isLocalModified() {
return mNoteDiffValues.size() > 0 || mNoteData.isLocalModified();
}
/**
* @classname: Note
* @methodname syncNote
* @description:便
* @date: 2024/1/2 20:54
* @author: Xia Yanbo
* @param:context
* @param:noteid便id
* @return:boolean
*/
public boolean syncNote(Context context, long noteId) {
if (noteId <= 0) {
throw new IllegalArgumentException("Wrong note id:" + noteId);
}
//没有修改过则不需要更新
if (!isLocalModified()) {
return true;
}
@ -112,7 +136,7 @@ public class Note {
/**
* 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
* note data info
*/
if (context.getContentResolver().update(
ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), mNoteDiffValues, null,
@ -120,8 +144,8 @@ public class Note {
Log.e(TAG, "Update note error, should not happen");
// Do not return, fall through
}
mNoteDiffValues.clear();
mNoteDiffValues.clear();//清除属性
//如果笔记在本地被修改过并且推送至ContentResolver失败则返回false
if (mNoteData.isLocalModified()
&& (mNoteData.pushIntoContentResolver(context, noteId) == null)) {
return false;
@ -131,86 +155,97 @@ public class Note {
}
private class NoteData {
private long mTextDataId;
private ContentValues mTextDataValues;
private long mTextDataId;//文本数据的id
private long mCallDataId;
private ContentValues mTextDataValues;//存储文本数据的键值对
private ContentValues mCallDataValues;
private long mCallDataId;//通话数据的id
private static final String TAG = "NoteData";
private ContentValues mCallDataValues;//存储通话数据
private static final String TAG = "NoteData";//记录标签,为日志记录打上标签。
//给新来的见证便签的键值以及id
public NoteData() {
mTextDataValues = new ContentValues();
mCallDataValues = new ContentValues();
mTextDataId = 0;
mCallDataId = 0;
}
//比较文本大小,确定是否被修改过
boolean isLocalModified() {
return mTextDataValues.size() > 0 || mCallDataValues.size() > 0;
}
//设置文本数据的id
void setTextDataId(long id) {
if(id <= 0) {
throw new IllegalArgumentException("Text data id should larger than 0");
}
mTextDataId = id;
}
//设置通话数据的id
void setCallDataId(long id) {
if (id <= 0) {
throw new IllegalArgumentException("Call data id should larger than 0");
}
mCallDataId = id;
}
//设置通话数据的id
void setCallData(String key, String value) {
mCallDataValues.put(key, value);
mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1);
mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis());
}
//设置文本数据
void setTextData(String key, String value) {
mTextDataValues.put(key, value);
mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1);
mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis());
}
/**
* @classname: NoteData
* @methodname pushIntoContentResolver
* @description:
* @date: 2024/1/2 21:10
* @author: Xia Yanbo
* @param:noteId便id
* @param:context
* @return:uri
*/
Uri pushIntoContentResolver(Context context, long noteId) {
/**
* Check for safety
*/
//检查笔记的id是否正确
if (noteId <= 0) {
throw new IllegalArgumentException("Wrong note id:" + noteId);
}
//创建行动列表
ArrayList<ContentProviderOperation> operationList = new ArrayList<ContentProviderOperation>();
ContentProviderOperation.Builder builder = null;
//如果文本数据不为空,进行更新操作
if(mTextDataValues.size() > 0) {
mTextDataValues.put(DataColumns.NOTE_ID, noteId);
// 如果文本数据ID为0说明是新插入的数据
if (mTextDataId == 0) {
mTextDataValues.put(DataColumns.MIME_TYPE, TextNote.CONTENT_ITEM_TYPE);
Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI,
mTextDataValues);
mTextDataValues);//设置对应的关键键值,插入新的文本数据
try {
setTextDataId(Long.valueOf(uri.getPathSegments().get(1)));
} catch (NumberFormatException e) {
setTextDataId(Long.valueOf(uri.getPathSegments().get(1)));//获取数据的id
} catch (NumberFormatException e) {//获取失败打印错误信息
Log.e(TAG, "Insert new text data fail with noteId" + noteId);
mTextDataValues.clear();
return null;
}
} else {
} else {//创建一个更新操作,并设置更新的数据和条件
builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId(
Notes.CONTENT_DATA_URI, mTextDataId));
builder.withValues(mTextDataValues);
operationList.add(builder.build());
operationList.add(builder.build());//将更新操作添加到操作列表中
}
mTextDataValues.clear();
}
//同理如果通信数据不为空,进行更新操作
if(mCallDataValues.size() > 0) {
mCallDataValues.put(DataColumns.NOTE_ID, noteId);
if (mCallDataId == 0) {
@ -232,19 +267,19 @@ public class Note {
}
mCallDataValues.clear();
}
//行动列表非空
if (operationList.size() > 0) {
try {
try { // 使用内容解析器ContentResolver的applyBatch方法来批量执行操作列表中的操作
ContentProviderResult[] results = context.getContentResolver().applyBatch(
Notes.AUTHORITY, operationList);
return (results == null || results.length == 0 || results[0] == null) ? null
: ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId);
: ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId);//返回操作完成后的结果
} catch (RemoteException e) {
Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
return null;
} catch (OperationApplicationException e) {
Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
return null;
return null;//报错反馈
}
}
return null;

@ -31,37 +31,43 @@ import net.micode.notes.data.Notes.NoteColumns;
import net.micode.notes.data.Notes.TextNote;
import net.micode.notes.tool.ResourceParser.NoteBgResources;
/**
* @classname: WorkingNote
* @description:便便便
* 便
* @date: 2024/1/4 11:03
* @author: Xia Yanbo
*/
public class WorkingNote {
// Note for the working note
private Note mNote;
private Note mNote;//便签对象
// Note Id
private long mNoteId;
private long mNoteId;//便签的id
// Note content
private String mContent;
private String mContent;//内容字符串
// Note mode
private int mMode;
private long mAlertDate;
private int mMode;//便签所处的模式(任务清单/普通)
private long mModifiedDate;
private long mAlertDate;//提醒时间
private int mBgColorId;
private long mModifiedDate;//修改日期
private int mWidgetId;
private int mBgColorId;//背景颜色
private int mWidgetType;
private int mWidgetId;//小插件的id号
private long mFolderId;
private int mWidgetType;//小插件的类型
private Context mContext;
private long mFolderId;//所属便签包的id号
private static final String TAG = "WorkingNote";
private Context mContext;//便签的上下文
private boolean mIsDeleted;
private static final String TAG = "WorkingNote";//用于接收日志的标签
private NoteSettingChangedListener mNoteSettingStatusListener;
private boolean mIsDeleted;//表示是否已经被删除
private NoteSettingChangedListener mNoteSettingStatusListener;//设置一个监听器,监听便签设置的改变
//定义数据的字段
public static final String[] DATA_PROJECTION = new String[] {
DataColumns.ID,
DataColumns.CONTENT,
@ -71,7 +77,7 @@ public class WorkingNote {
DataColumns.DATA3,
DataColumns.DATA4,
};
//定义便签的字段
public static final String[] NOTE_PROJECTION = new String[] {
NoteColumns.PARENT_ID,
NoteColumns.ALERTED_DATE,
@ -80,7 +86,7 @@ public class WorkingNote {
NoteColumns.WIDGET_TYPE,
NoteColumns.MODIFIED_DATE
};
//数据相关的参数
private static final int DATA_ID_COLUMN = 0;
private static final int DATA_CONTENT_COLUMN = 1;
@ -88,7 +94,7 @@ public class WorkingNote {
private static final int DATA_MIME_TYPE_COLUMN = 2;
private static final int DATA_MODE_COLUMN = 3;
//便签相关的参数
private static final int NOTE_PARENT_ID_COLUMN = 0;
private static final int NOTE_ALERTED_DATE_COLUMN = 1;
@ -102,19 +108,38 @@ public class WorkingNote {
private static final int NOTE_MODIFIED_DATE_COLUMN = 5;
// New note construct
/**
* @classname: WorkingNote
* @methodname WorkingNote
* @description:便
* @date: 2024/1/3 19:26
* @author: Xia Yanbo
* @param:context
* @param:folderIdid
*/
private WorkingNote(Context context, long folderId) {
mContext = context;
mAlertDate = 0;
mModifiedDate = System.currentTimeMillis();
mFolderId = folderId;
mNote = new Note();
mNoteId = 0;
mNoteId = 0;//初始化笔记id为0
mIsDeleted = false;
mMode = 0;
mWidgetType = Notes.TYPE_WIDGET_INVALIDE;
}
// Existing note construct
/**
* @classname: WorkingNote
* @methodname WorkingNote
* @description:使
* @date: 2024/1/3 21:33
* @author: Xia Yanbo
* @param:context
* @param:noteIdid
* @param:folderIdid
*/
private WorkingNote(Context context, long noteId, long folderId) {
mContext = context;
mNoteId = noteId;
@ -123,14 +148,23 @@ public class WorkingNote {
mNote = new Note();
loadNote();
}
/**
* @classname: WorkingNote
* @methodname loadNote
* @description:/便
* @date: 2024/1/3 21:34
* @author: Xia Yanbo
*/
private void loadNote() {
//查询数据库获取与给定笔记id关联的笔记
Cursor cursor = mContext.getContentResolver().query(
ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, mNoteId), NOTE_PROJECTION, null,
null, null);
if (cursor != null) {
//如果cursor不为空移动到结果集的第一行
if (cursor.moveToFirst()) {
//从结果集获取各个属性值
mFolderId = cursor.getLong(NOTE_PARENT_ID_COLUMN);
mBgColorId = cursor.getInt(NOTE_BG_COLOR_ID_COLUMN);
mWidgetId = cursor.getInt(NOTE_WIDGET_ID_COLUMN);
@ -139,33 +173,43 @@ public class WorkingNote {
mModifiedDate = cursor.getLong(NOTE_MODIFIED_DATE_COLUMN);
}
cursor.close();
} else {
} else {//如果找不到关联的笔记抛出异常
Log.e(TAG, "No note with id:" + mNoteId);
throw new IllegalArgumentException("Unable to find note with id " + mNoteId);
}
// 调用loadNoteData方法继续加载与笔记相关的其他数据标记
loadNoteData();
}
/**
* @classname: WorkingNote
* @methodname loadNoteData
* @description:便
* @date: 2024/1/3 21:48
* @author: Xia Yanbo
*/
private void loadNoteData() {
//查询数据库获取与给定笔记id关联的笔记
Cursor cursor = mContext.getContentResolver().query(Notes.CONTENT_DATA_URI, DATA_PROJECTION,
DataColumns.NOTE_ID + "=?", new String[] {
String.valueOf(mNoteId)
}, null);
if (cursor != null) {
//光标移动到查询结果的第一行
if (cursor.moveToFirst()) {
do {
String type = cursor.getString(DATA_MIME_TYPE_COLUMN);
String type = cursor.getString(DATA_MIME_TYPE_COLUMN);//获取当前笔记的类型
//如果笔记是普通的笔记获取笔记内容、模式、id等参数完成赋值
if (DataConstants.NOTE.equals(type)) {
mContent = cursor.getString(DATA_CONTENT_COLUMN);
mMode = cursor.getInt(DATA_MODE_COLUMN);
mNote.setTextDataId(cursor.getLong(DATA_ID_COLUMN));
} else if (DataConstants.CALL_NOTE.equals(type)) {
} else if (DataConstants.CALL_NOTE.equals(type)) {//如果数据是通话数据从数据行中直接获取数据id
mNote.setCallDataId(cursor.getLong(DATA_ID_COLUMN));
} else {
Log.d(TAG, "Wrong note type with type:" + type);
}
} while (cursor.moveToNext());
} while (cursor.moveToNext());//光标移动到下一行
}
cursor.close();
} else {
@ -173,7 +217,7 @@ public class WorkingNote {
throw new IllegalArgumentException("Unable to find note's data with id " + mNoteId);
}
}
//创建一个空的便签设置属性以及资源的id号等等信息
public static WorkingNote createEmptyNote(Context context, long folderId, int widgetId,
int widgetType, int defaultBgColorId) {
WorkingNote note = new WorkingNote(context, folderId);
@ -182,15 +226,17 @@ public class WorkingNote {
note.setWidgetType(widgetType);
return note;
}
//读取便签的内容
public static WorkingNote load(Context context, long id) {
return new WorkingNote(context, id, 0);
}
public synchronized boolean saveNote() {
//检查笔记是否有保存的价值
if (isWorthSaving()) {
if (!existInDatabase()) {
if ((mNoteId = Note.getNewNoteId(mContext, mFolderId)) == 0) {
// 如果不在数据库里根据包的id和上下文获取一个新的笔记ID如果获取失败则返回false并记录日志
if ((mNoteId = Note.getNewNoteId(mContext, mFolderId)) == 0) {//获取失败返回的id是0
Log.e(TAG, "Create new note fail with id:" + mNoteId);
return false;
}
@ -200,6 +246,7 @@ public class WorkingNote {
/**
* Update widget content if there exist any widget of this note
*
*/
if (mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID
&& mWidgetType != Notes.TYPE_WIDGET_INVALIDE
@ -211,12 +258,13 @@ public class WorkingNote {
return false;
}
}
//检查是否位于数据库中
public boolean existInDatabase() {
return mNoteId > 0;
}
//检查便签是否具有保存的价值
private boolean isWorthSaving() {
//如果在数据库中已经存在而本地没有修改,或者便签已被删除了,或者便签为空,不值得保存
if (mIsDeleted || (!existInDatabase() && TextUtils.isEmpty(mContent))
|| (existInDatabase() && !mNote.isLocalModified())) {
return false;
@ -224,11 +272,11 @@ public class WorkingNote {
return true;
}
}
//设置笔记设置状态的监听器为工作状态
public void setOnSettingStatusChangedListener(NoteSettingChangedListener l) {
mNoteSettingStatusListener = l;
}
//设置提醒的日期
public void setAlertDate(long date, boolean set) {
if (date != mAlertDate) {
mAlertDate = date;
@ -238,7 +286,7 @@ public class WorkingNote {
mNoteSettingStatusListener.onClockAlertChanged(date, set);
}
}
//删除标记值
public void markDeleted(boolean mark) {
mIsDeleted = mark;
if (mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID
@ -247,6 +295,7 @@ public class WorkingNote {
}
}
//设置背景的颜色id
public void setBgColorId(int id) {
if (id != mBgColorId) {
mBgColorId = id;
@ -256,9 +305,10 @@ public class WorkingNote {
mNote.setNoteValue(NoteColumns.BG_COLOR_ID, String.valueOf(id));
}
}
//设置任务清单模式
public void setCheckListMode(int mode) {
if (mMode != mode) {
//进行任务清单模式必要组件的的设置
if (mNoteSettingStatusListener != null) {
mNoteSettingStatusListener.onCheckListModeChanged(mMode, mode);
}
@ -266,7 +316,7 @@ public class WorkingNote {
mNote.setTextData(TextNote.MODE, String.valueOf(mMode));
}
}
//设定组件相关的类型id等信息
public void setWidgetType(int type) {
if (type != mWidgetType) {
mWidgetType = type;
@ -280,24 +330,25 @@ public class WorkingNote {
mNote.setNoteValue(NoteColumns.WIDGET_ID, String.valueOf(mWidgetId));
}
}
//设置当前工作便签的文本
public void setWorkingText(String text) {
if (!TextUtils.equals(mContent, text)) {
mContent = text;
mContent = text;//文本不一样时更新内容
mNote.setTextData(DataColumns.CONTENT, mContent);
}
}
//将便签转化为通话便签
public void convertToCallNote(String phoneNumber, long callDate) {
mNote.setCallData(CallNote.CALL_DATE, String.valueOf(callDate));
mNote.setCallData(CallNote.PHONE_NUMBER, phoneNumber);
mNote.setNoteValue(NoteColumns.PARENT_ID, String.valueOf(Notes.ID_CALL_RECORD_FOLDER));
}
//获取是否设置有提醒
public boolean hasClockAlert() {
return (mAlertDate > 0 ? true : false);
}
//根据需要,返回对应的参数值
public String getContent() {
return mContent;
}
@ -341,7 +392,13 @@ public class WorkingNote {
public int getWidgetType() {
return mWidgetType;
}
/**
* @classname: WorkingNote
* @description:便
*
* @date: 2024/1/4 9:22
* @author: Xia Yanbo
*/
public interface NoteSettingChangedListener {
/**
* Called when the background color of current note has just changed
@ -355,6 +412,7 @@ public class WorkingNote {
/**
* Call when user create note from widget
*
*/
void onWidgetChanged();

@ -14,200 +14,199 @@
* limitations under the License.
*/
package net.micode.notes.ui;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.PowerManager;
import android.provider.Settings;
import android.view.Window;
import android.view.WindowManager;
import net.micode.notes.R;
import net.micode.notes.data.Notes;
import net.micode.notes.tool.DataUtils;
import java.io.IOException;
/**
* @classname: AlarmAlertActivity
* @description:
* @date: 2023/12/28 11:18
* @author: wangrunze
*/
public class AlarmAlertActivity extends Activity implements OnClickListener, OnDismissListener {
private long mNoteId;//文本在数据库存储中的ID号
private String mSnippet;//闹钟提示时出现的文本片段
private static final int SNIPPET_PREW_MAX_LEN = 60;
MediaPlayer mPlayer;
//Bundle类型的数据与Map类型的数据相似都是以key-value的形式存储数据的
//onsaveInstanceState方法是用来保存Activity的状态的,能从onCreate的参数savedInsanceState中获得状态数据
/**
* @classname: AlarmAlertActivity
* @methodname onCreate
* @description:
* @date: 2023/12/28 11:27
* @author: wangrunze
* @param: Bundle savedInstanceState
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);//界面显示——无标题
final Window win = getWindow();
win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
if (!isScreenOn()) {
win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON//保持窗体点亮
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON//将窗体点亮
| WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON//允许窗体点亮时锁屏
| WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR);//在手机锁屏后如果到了闹钟提示时间,点亮屏幕
}
Intent intent = getIntent();
try {
mNoteId = Long.valueOf(intent.getData().getPathSegments().get(1));
mSnippet = DataUtils.getSnippetById(this.getContentResolver(), mNoteId);//根据ID从数据库中获取标签的内容
mSnippet = mSnippet.length() > SNIPPET_PREW_MAX_LEN ? mSnippet.substring(0,
SNIPPET_PREW_MAX_LEN) + getResources().getString(R.string.notelist_string_info)//判断标签片段是否达到符合长度
: mSnippet;
} catch (IllegalArgumentException e) {
e.printStackTrace();
return;
}
mPlayer = new MediaPlayer();
if (DataUtils.visibleInNoteDatabase(getContentResolver(), mNoteId, Notes.TYPE_NOTE)) {
showActionDialog();//弹出对话框
playAlarmSound();//闹钟提示音激发
} else {
finish();
}
}
/**
* @classname: AlarmAlertActivity
* @methodname isScreenOn
* @description:
* @date: 2023/12/28 11:28
* @author: wangrunze
* @return: pm.isScreenOn()
*/
private boolean isScreenOn() {
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
return pm.isScreenOn();
}
/**
* @classname: AlarmAlertActivity
* @methodname playAlarmSound
* @description:
* @date: 2023/12/28 11:29
* @author: wangrunze
*/
private void playAlarmSound() {
Uri url = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_ALARM);
int silentModeStreams = Settings.System.getInt(getContentResolver(),
Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0); //调用系统的铃声管理URI得到闹钟提示音
if ((silentModeStreams & (1 << AudioManager.STREAM_ALARM)) != 0) {
mPlayer.setAudioStreamType(silentModeStreams);
} else {
mPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
}
try {
mPlayer.setDataSource(this, url);//无返回值,设置多媒体数据来源
mPlayer.prepare();//准备同步
mPlayer.setLooping(true);//设置是否循环播放
mPlayer.start();//开始播放
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();//抛出异常, 还将显示出更深的调用信息
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @classname: AlarmAlertActivity
* @methodname showActionDialog
* @description:
* @date: 2023/12/28 11:30
* @author: wangrunze
*/
private void showActionDialog() {
AlertDialog.Builder dialog = new AlertDialog.Builder(this);//用到AlertDialog.Builder中的create()新建了一个AlertDialog
dialog.setTitle(R.string.app_name);//为对话框设置标题
dialog.setMessage(mSnippet);//为对话框设置内容
dialog.setPositiveButton(R.string.notealert_ok, this);//给对话框添加"Yes"按钮
if (isScreenOn()) {
dialog.setNegativeButton(R.string.notealert_enter, this);//给对话框添加"no"按钮
}
dialog.show().setOnDismissListener(this);
}
//DialogInterface dialog为对话框which为选择按钮,功能为选择各种操作
public void onClick(DialogInterface dialog, int which) {
switch (which) {
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:
break;
}
}
/**
* @classname: AlarmAlertActivity
* @methodname onDismiss
* @description:
* @date: 2023/12/28 11:30
* @author: wangrunze
* @param:DialogInterface dialog
*/
public void onDismiss(DialogInterface dialog) {
stopAlarmSound();
finish();
}
/**
* @classname: AlarmAlertActivity
* @methodname: stopAlarmSound
* @description:
* @date: 2023/12/28 11:31
* @author: wangrunze
*/
private void stopAlarmSound() {
if (mPlayer != null) {
mPlayer.stop();
mPlayer.release();
mPlayer = null;
}
}
}
package net.micode.notes.ui;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.PowerManager;
import android.provider.Settings;
import android.view.Window;
import android.view.WindowManager;
import net.micode.notes.R;
import net.micode.notes.data.Notes;
import net.micode.notes.tool.DataUtils;
import java.io.IOException;
/**
* @classname: AlarmAlertActivity
* @description:
* @date: 2023/12/28 11:18
* @author: wangrunze
*/
public class AlarmAlertActivity extends Activity implements OnClickListener, OnDismissListener {
private long mNoteId;//文本在数据库存储中的ID号
private String mSnippet;//闹钟提示时出现的文本片段
private static final int SNIPPET_PREW_MAX_LEN = 60;
MediaPlayer mPlayer;
//Bundle类型的数据与Map类型的数据相似都是以key-value的形式存储数据的
//onsaveInstanceState方法是用来保存Activity的状态的,能从onCreate的参数savedInsanceState中获得状态数据
/**
* @classname: AlarmAlertActivity
* @methodname onCreate
* @description:
* @date: 2023/12/28 11:27
* @author: wangrunze
* @param: Bundle savedInstanceState
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);//界面显示——无标题
final Window win = getWindow();
win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
if (!isScreenOn()) {
win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON//保持窗体点亮
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON//将窗体点亮
| WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON//允许窗体点亮时锁屏
| WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR);//在手机锁屏后如果到了闹钟提示时间,点亮屏幕
}
Intent intent = getIntent();
try {
mNoteId = Long.valueOf(intent.getData().getPathSegments().get(1));
mSnippet = DataUtils.getSnippetById(this.getContentResolver(), mNoteId);//根据ID从数据库中获取标签的内容
mSnippet = mSnippet.length() > SNIPPET_PREW_MAX_LEN ? mSnippet.substring(0,
SNIPPET_PREW_MAX_LEN) + getResources().getString(R.string.notelist_string_info)//判断标签片段是否达到符合长度
: mSnippet;
} catch (IllegalArgumentException e) {
e.printStackTrace();
return;
}
mPlayer = new MediaPlayer();
if (DataUtils.visibleInNoteDatabase(getContentResolver(), mNoteId, Notes.TYPE_NOTE)) {
showActionDialog();//弹出对话框
playAlarmSound();//闹钟提示音激发
} else {
finish();
}
}
/**
* @classname: AlarmAlertActivity
* @methodname isScreenOn
* @description:
* @date: 2023/12/28 11:28
* @author: wangrunze
* @return: pm.isScreenOn()
*/
private boolean isScreenOn() {
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
return pm.isScreenOn();
}
/**
* @classname: AlarmAlertActivity
* @methodname playAlarmSound
* @description:
* @date: 2023/12/28 11:29
* @author: wangrunze
*/
private void playAlarmSound() {
Uri url = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_ALARM);
int silentModeStreams = Settings.System.getInt(getContentResolver(),
Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0); //调用系统的铃声管理URI得到闹钟提示音
if ((silentModeStreams & (1 << AudioManager.STREAM_ALARM)) != 0) {
mPlayer.setAudioStreamType(silentModeStreams);
} else {
mPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
}
try {
mPlayer.setDataSource(this, url);//无返回值,设置多媒体数据来源
mPlayer.prepare();//准备同步
mPlayer.setLooping(true);//设置是否循环播放
mPlayer.start();//开始播放
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();//抛出异常, 还将显示出更深的调用信息
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @classname: AlarmAlertActivity
* @methodname showActionDialog
* @description:
* @date: 2023/12/28 11:30
* @author: wangrunze
*/
private void showActionDialog() {
AlertDialog.Builder dialog = new AlertDialog.Builder(this);//用到AlertDialog.Builder中的create()新建了一个AlertDialog
dialog.setTitle(R.string.app_name);//为对话框设置标题
dialog.setMessage(mSnippet);//为对话框设置内容
dialog.setPositiveButton(R.string.notealert_ok, this);//给对话框添加"Yes"按钮
if (isScreenOn()) {
dialog.setNegativeButton(R.string.notealert_enter, this);//给对话框添加"no"按钮
}
dialog.show().setOnDismissListener(this);
}
//DialogInterface dialog为对话框which为选择按钮,功能为选择各种操作
public void onClick(DialogInterface dialog, int which) {
switch (which) {
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:
break;
}
}
/**
* @classname: AlarmAlertActivity
* @methodname onDismiss
* @description:
* @date: 2023/12/28 11:30
* @author: wangrunze
* @param:DialogInterface dialog
*/
public void onDismiss(DialogInterface dialog) {
stopAlarmSound();
finish();
}
/**
* @classname: AlarmAlertActivity
* @methodname: stopAlarmSound
* @description:
* @date: 2023/12/28 11:31
* @author: wangrunze
*/
private void stopAlarmSound() {
if (mPlayer != null) {
mPlayer.stop();
mPlayer.release();
mPlayer = null;
}
}
}

@ -27,20 +27,34 @@ import android.database.Cursor;
import net.micode.notes.data.Notes;
import net.micode.notes.data.Notes.NoteColumns;
/**
* @classname: AlarmInitReceiver
* @description:
* @date: 2023/12/29 11:17
* @author: wangrunze
*/
public class AlarmInitReceiver extends BroadcastReceiver {
private static final String [] PROJECTION = new String [] {
NoteColumns.ID,
NoteColumns.ALERTED_DATE
};
//对数据库的操作调用标签ID和闹钟时间
private static final int COLUMN_ID = 0;
private static final int COLUMN_ALERTED_DATE = 1;
/**
* @classname: AlarmInitReceiver
* @methodname: onReceive
* @description:
* @date: 2023/12/29 11:23
* @author: wangrunze
* @param:Context context
* @param:Intent intent
*/
@Override
public void onReceive(Context context, Intent intent) {
long currentDate = System.currentTimeMillis();
long currentDate = System.currentTimeMillis();//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,

@ -19,8 +19,23 @@ package net.micode.notes.ui;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
/**
* @classname: AlarmReceiver
* @description:alarm
* @date: 2023/12/29 11:28
* @author: wangrunze
*/
public class AlarmReceiver extends BroadcastReceiver {
/**
* @classname: AlarmReceiver
* @methodname: onReceive
* @description:AlarmAlertActivity
* @date: 2023/12/29 11:29
* @author: wangrunze
* @param:Context context
* @param:Intent intent
*/
@Override
public void onReceive(Context context, Intent intent) {
intent.setClass(context, AlarmAlertActivity.class);

@ -28,6 +28,12 @@ import android.view.View;
import android.widget.FrameLayout;
import android.widget.NumberPicker;
/**
* @classname: DateTimePicker
* @description:
* @date: 2023/12/29 11:40
* @author: wangrunze
*/
public class DateTimePicker extends FrameLayout {
private static final boolean DEFAULT_ENABLE_STATE = true;
@ -65,6 +71,16 @@ public class DateTimePicker extends FrameLayout {
private OnDateTimeChangedListener mOnDateTimeChangedListener;
private NumberPicker.OnValueChangeListener mOnDateChangedListener = new NumberPicker.OnValueChangeListener() {
/**
* @classname: DateTimePicker
* @methodname: onValueChange
* @description:
* @date: 2023/12/29 11:41
* @author: wangrunze
* @param:NumberPicker picker
* @param:int oldVal
* @param: int newVal
*/
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
mDate.add(Calendar.DAY_OF_YEAR, newVal - oldVal);
@ -74,6 +90,16 @@ public class DateTimePicker extends FrameLayout {
};
private NumberPicker.OnValueChangeListener mOnHourChangedListener = new NumberPicker.OnValueChangeListener() {
/**
* @classname: DateTimePicker
* @methodname: onValueChange
* @description:Hour
* @date: 2023/12/29 11:42
* @author: wangrunze
* @param:NumberPicker picker
* @param:int oldVal
* @param:int newVal
*/
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
boolean isDateChanged = false;
@ -116,6 +142,16 @@ public class DateTimePicker extends FrameLayout {
};
private NumberPicker.OnValueChangeListener mOnMinuteChangedListener = new NumberPicker.OnValueChangeListener() {
/**
* @classname: DateTimePicker
* @methodname: onValueChange
* @description:
* @date: 2023/12/29 11:43
* @author: wangrunze
* @param:NumberPicker picker
* @param:int oldVal
* @param:int newVal
*/
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
int minValue = mMinuteSpinner.getMinValue();
@ -146,6 +182,16 @@ public class DateTimePicker extends FrameLayout {
private NumberPicker.OnValueChangeListener mOnAmPmChangedListener = new NumberPicker.OnValueChangeListener() {
@Override
/**
* @classname: DateTimePicker
* @methodname: onValueChange
* @description: AMPM
* @date: 2023/12/29 11:43
* @author: wangrunze
* @param:NumberPicker picker
* @param:int oldVal
* @param: int newVal
*/
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
mIsAm = !mIsAm;
if (mIsAm) {
@ -157,12 +203,20 @@ public class DateTimePicker extends FrameLayout {
onDateTimeChanged();
}
};
public interface OnDateTimeChangedListener {
void onDateTimeChanged(DateTimePicker view, int year, int month,
int dayOfMonth, int hourOfDay, int minute);
}
/**
* @classname: DateTimePicker
* @methodname: DateTimePicker
* @description:
* @date: 2023/12/29 11:45
* @author: wangrunze
* @param:Context context
*/
public DateTimePicker(Context context) {
this(context, System.currentTimeMillis());
}
@ -171,6 +225,16 @@ public class DateTimePicker extends FrameLayout {
this(context, date, DateFormat.is24HourFormat(context));
}
/**
* @classname: DateTimePicker
* @methodname: DateTimePicker
* @description:
* @date: 2023/12/29 11:47
* @author: wangrunze
* @param:Context context
* @param:long date
* @param:boolean is24HourView
*/
public DateTimePicker(Context context, long date, boolean is24HourView) {
super(context);
mDate = Calendar.getInstance();
@ -214,6 +278,14 @@ public class DateTimePicker extends FrameLayout {
mInitialising = false;
}
/**
* @classname: DateTimePicker
* @methodname: setEnabled
* @description:
* @date: 2023/12/29 11:49
* @author: wangrunze
* @param:boolean enabled
*/
@Override
public void setEnabled(boolean enabled) {
if (mIsEnabled == enabled) {
@ -246,6 +318,14 @@ public class DateTimePicker extends FrameLayout {
*
* @param date The current date in millis
*/
/**
* @classname: DateTimePicker
* @methodname: setCurrentDate
* @description:
* @date: 2023/12/29 11:51
* @author: wangrunze
* @param:long date
*/
public void setCurrentDate(long date) {
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(date);
@ -262,6 +342,14 @@ public class DateTimePicker extends FrameLayout {
* @param hourOfDay The current hourOfDay
* @param minute The current minute
*/
/**
* @classname: DateTimePicker
* @methodname: setCurrentDate
* @description:
* @date: 2023/12/29 11:51
* @author: wangrunze
* @param:long date
*/
public void setCurrentDate(int year, int month,
int dayOfMonth, int hourOfDay, int minute) {
setCurrentYear(year);
@ -285,6 +373,14 @@ public class DateTimePicker extends FrameLayout {
*
* @param year The current year
*/
/**
* @classname: DateTimePicker
* @methodname: setCurrentYear
* @description:Set current year
* @date: 2024/1/7 9:53
* @author: wangrunze
* @param:year
*/
public void setCurrentYear(int year) {
if (!mInitialising && year == getCurrentYear()) {
return;
@ -293,12 +389,19 @@ public class DateTimePicker extends FrameLayout {
updateDateControl();
onDateTimeChanged();
}
/**
* Get current month in the year
*
* @return The current month in the year
*/
/**
* @classname: DateTimePicker
* @methodname: getCurrentMonth
* @description:Get current month in the year
* @date: 2024/1/7 9:54
* @author: wangrunze
* @return:current month
*/
public int getCurrentMonth() {
return mDate.get(Calendar.MONTH);
}
@ -308,6 +411,14 @@ public class DateTimePicker extends FrameLayout {
*
* @param month The month in the year
*/
/**
* @classname: DateTimePicker
* @methodname: setCurrentMonth
* @description:Set current month in the year
* @date: 2024/1/7 9:56
* @author: wangrunze
* @param:current month
*/
public void setCurrentMonth(int month) {
if (!mInitialising && month == getCurrentMonth()) {
return;
@ -322,6 +433,14 @@ public class DateTimePicker extends FrameLayout {
*
* @return The day of the month
*/
/**
* @classname: DateTimePicker
* @methodname: getCurrentDay
* @description:Get current day of the month
* @date: 2024/1/7 9:57
* @author: wangrunze
* @return:current day
*/
public int getCurrentDay() {
return mDate.get(Calendar.DAY_OF_MONTH);
}
@ -331,6 +450,14 @@ public class DateTimePicker extends FrameLayout {
*
* @param dayOfMonth The day of the month
*/
/**
* @classname: DateTimePicker
* @methodname: setCurrentDay
* @description:Set current day of the month
* @date: 2024/1/7 9:57
* @author: wangrunze
* @param:The day of the month
*/
public void setCurrentDay(int dayOfMonth) {
if (!mInitialising && dayOfMonth == getCurrentDay()) {
return;
@ -344,10 +471,26 @@ public class DateTimePicker extends FrameLayout {
* Get current hour in 24 hour mode, in the range (0~23)
* @return The current hour in 24 hour mode
*/
/**
* @classname: DateTimePicker
* @methodname: getCurrentHourOfDay
* @description:Get current hour in 24 hour mode
* @date: 2024/1/7 9:58
* @author: wangrunze
* @return:The current hour in 24 hour mode
*/
public int getCurrentHourOfDay() {
return mDate.get(Calendar.HOUR_OF_DAY);
}
/**
* @classname: DateTimePicker
* @methodname: getCurrentHour
* @description:Get current hour
* @date: 2024/1/7 9:58
* @author: wangrunze
* @return:The current hour
*/
private int getCurrentHour() {
if (mIs24HourView){
return getCurrentHourOfDay();
@ -366,6 +509,14 @@ public class DateTimePicker extends FrameLayout {
*
* @param hourOfDay
*/
/**
* @classname: DateTimePicker
* @methodname: setCurrentHour
* @description:Set current hour in 24 hour mode
* @date: 2024/1/7 9:59
* @author: wangrunze
* @param:hourOfDay
*/
public void setCurrentHour(int hourOfDay) {
if (!mInitialising && hourOfDay == getCurrentHourOfDay()) {
return;
@ -394,6 +545,14 @@ public class DateTimePicker extends FrameLayout {
*
* @return The Current Minute
*/
/**
* @classname: DateTimePicker
* @methodname: getCurrentMinute
* @description: Get currentMinute
* @date: 2024/1/7 9:59
* @author: wangrunze
* @return:The Current Minute
*/
public int getCurrentMinute() {
return mDate.get(Calendar.MINUTE);
}
@ -401,6 +560,14 @@ public class DateTimePicker extends FrameLayout {
/**
* Set current minute
*/
/**
* @classname: DateTimePicker
* @methodname: setCurrentMinute
* @description:Set current minute
* @date: 2024/1/7 9:59
* @author: wangrunze
* @param:int minute
*/
public void setCurrentMinute(int minute) {
if (!mInitialising && minute == getCurrentMinute()) {
return;
@ -413,6 +580,14 @@ public class DateTimePicker extends FrameLayout {
/**
* @return true if this is in 24 hour view else false.
*/
/**
* @classname: DateTimePicker
* @methodname: is24HourView
* @description:24Hour
* @date: 2024/1/7 10:00
* @author: wangrunze
* @return:true if this is in 24 hour view else false.
*/
public boolean is24HourView () {
return mIs24HourView;
}
@ -422,6 +597,14 @@ public class DateTimePicker extends FrameLayout {
*
* @param is24HourView True for 24 hour mode. False for AM/PM mode.
*/
/**
* @classname: DateTimePicker
* @methodname: set24HourView
* @description:Set whether in 24 hour or AM/PM mode
* @date: 2024/1/7 10:01
* @author: wangrunze
* @param:is24HourView True for 24 hour mode
*/
public void set24HourView(boolean is24HourView) {
if (mIs24HourView == is24HourView) {
return;
@ -434,6 +617,13 @@ public class DateTimePicker extends FrameLayout {
updateAmPmControl();
}
/**
* @classname: DateTimePicker
* @methodname: updateDateControl
* @description:
* @date: 2023/12/29 11:53
* @author: wangrunze
*/
private void updateDateControl() {
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(mDate.getTimeInMillis());
@ -448,6 +638,13 @@ public class DateTimePicker extends FrameLayout {
mDateSpinner.invalidate();
}
/**
* @classname: DateTimePicker
* @methodname: updateDateControl
* @description:ampm
* @date: 2023/12/29 11:53
* @author: wangrunze
*/
private void updateAmPmControl() {
if (mIs24HourView) {
mAmPmSpinner.setVisibility(View.GONE);
@ -458,6 +655,13 @@ public class DateTimePicker extends FrameLayout {
}
}
/**
* @classname: DateTimePicker
* @methodname: updateDateControl
* @description:
* @date: 2023/12/29 11:53
* @author: wangrunze
*/
private void updateHourControl() {
if (mIs24HourView) {
mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW);
@ -476,6 +680,13 @@ public class DateTimePicker extends FrameLayout {
mOnDateTimeChangedListener = callback;
}
/**
* @classname: DateTimePicker
* @methodname: onDateTimeChanged
* @description:
* @date: 2023/12/29 11:54
* @author: wangrunze
*/
private void onDateTimeChanged() {
if (mOnDateTimeChangedListener != null) {
mOnDateTimeChangedListener.onDateTimeChanged(this, getCurrentYear(),

@ -29,17 +29,31 @@ import android.content.DialogInterface.OnClickListener;
import android.text.format.DateFormat;
import android.text.format.DateUtils;
/**
* @classname: DateTimePickerDialog
* @description:
* @date: 2024/1/4 10:19
* @author: wangrunze
*/
public class DateTimePickerDialog extends AlertDialog implements OnClickListener {
private Calendar mDate = Calendar.getInstance();
private boolean mIs24HourView;
private OnDateTimeSetListener mOnDateTimeSetListener;
private DateTimePicker mDateTimePicker;
private DateTimePicker mDateTimePicker;//DateTimePicker控件控件一般用于让用户可以从日期列表中选择单个值。
public interface OnDateTimeSetListener {
void OnDateTimeSet(AlertDialog dialog, long date);
}
/**
* @classname: DateTimePickerDialog
* @methodname: DateTimePickerDialog
* @description:
* @date: 2024/1/4 10:26
* @author: wangrunze
* @param:Context context
* @param:long date
*/
public DateTimePickerDialog(Context context, long date) {
super(context);
mDateTimePicker = new DateTimePicker(context);
@ -64,14 +78,35 @@ public class DateTimePickerDialog extends AlertDialog implements OnClickListener
updateTitle(mDate.getTimeInMillis());
}
/**
* @classname: DateTimePickerDialog
* @methodname: set24HourView
* @description:24
* @date: 2024/1/4 10:34
* @author: wangrunze
*/
public void set24HourView(boolean is24HourView) {
mIs24HourView = is24HourView;
}
/**
* @classname: DateTimePickerDialog
* @methodname: setOnDateTimeSetListener
* @description:
* @date: 2024/1/4 10:43
* @author: wangrunze
* @param:OnDateTimeSetListener callBack
*/
public void setOnDateTimeSetListener(OnDateTimeSetListener callBack) {
mOnDateTimeSetListener = callBack;
}
/**
* @classname: DateTimePickerDialog
* @methodname: updateTitle
* @description:
* @date: 2024/1/4 10:55
* @author: wangrunze
* @param:long date
*/
private void updateTitle(long date) {
int flag =
DateUtils.FORMAT_SHOW_YEAR |
@ -80,7 +115,15 @@ public class DateTimePickerDialog extends AlertDialog implements OnClickListener
flag |= mIs24HourView ? DateUtils.FORMAT_24HOUR : DateUtils.FORMAT_24HOUR;
setTitle(DateUtils.formatDateTime(this.getContext(), date, flag));
}
/**
* @classname: DateTimePickerDialog
* @methodname: onClick
* @description:
* @date: 2024/1/4 10:58
* @author: wangrunze
* @param:DialogInterface arg0
* @param:int arg1
*/
public void onClick(DialogInterface arg0, int arg1) {
if (mOnDateTimeSetListener != null) {
mOnDateTimeSetListener.OnDateTimeSet(this, mDate.getTimeInMillis());

@ -26,12 +26,26 @@ import android.widget.PopupMenu;
import android.widget.PopupMenu.OnMenuItemClickListener;
import net.micode.notes.R;
/**
* @classname: DropdownMenu
* @description:
* @date: 2024/1/4 11:00
* @author: wangrunze
*/
public class DropdownMenu {
private Button mButton;
private PopupMenu mPopupMenu;
private Menu mMenu;
/**
* @classname: DropdownMenu
* @methodname: DropdownMenu
* @description:
* @date: 2024/1/4 11:02
* @author: wangrunze
* @param:Context context
* @param:Button button
* @param:int menuId
*/
public DropdownMenu(Context context, Button button, int menuId) {
mButton = button;
mButton.setBackgroundResource(R.drawable.dropdown_icon);
@ -44,17 +58,38 @@ public class DropdownMenu {
}
});
}
/**
* @classname: DropdownMenu
* @methodname: setOnDropdownMenuItemClickListener
* @description:
* @date: 2024/1/4 11:03
* @author: wangrunze
* @param:OnMenuItemClickListener listener
*/
public void setOnDropdownMenuItemClickListener(OnMenuItemClickListener listener) {
if (mPopupMenu != null) {
mPopupMenu.setOnMenuItemClickListener(listener);
}
}
/**
* @classname: DropdownMenu
* @methodname: findItem
* @description:
* @date: 2024/1/4 11:04
* @author: wangrunze
* @param:int id
*/
public MenuItem findItem(int id) {
return mMenu.findItem(id);
}
/**
* @classname: DropdownMenu
* @methodname: setTitle
* @description:
* @date: 2024/1/4 11:05
* @author: wangrunze
* @param:CharSequence title
*/
public void setTitle(CharSequence title) {
mButton.setText(title);
}

@ -28,26 +28,57 @@ import net.micode.notes.R;
import net.micode.notes.data.Notes;
import net.micode.notes.data.Notes.NoteColumns;
/**
* @classname: FoldersListAdapter
* @description:便
* @date: 2024/1/4 11:07
* @author: wangrunze
*/
public class FoldersListAdapter extends CursorAdapter {
public static final String [] PROJECTION = {
NoteColumns.ID,
NoteColumns.SNIPPET
};
};//调用数据库中便签的ID和片段
public static final int ID_COLUMN = 0;
public static final int NAME_COLUMN = 1;
/**
* @classname: FoldersListAdapter
* @methodname: FoldersListAdapter
* @description:
* @date: 2024/1/4 11:08
* @author: wangrunze
* @param:Context context
* @param: Cursor c
*/
public FoldersListAdapter(Context context, Cursor c) {
super(context, c);
// TODO Auto-generated constructor stub
}
/**
* @classname: FoldersListAdapter
* @methodname: newView
* @description:
* @date: 2024/1/4 11:09
* @author: wangrunze
* @param:Context context
* @param:Cursor cursor
* @param:ViewGroup parent
*/
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return new FolderListItem(context);
}
/**
* @classname: FoldersListAdapter
* @methodname: bindView
* @description:
* @date: 2024/1/4 11:10
* @author: wangrunze
* @param:View view
* @param:Context context
* @param:Cursor cursor
*/
@Override
public void bindView(View view, Context context, Cursor cursor) {
if (view instanceof FolderListItem) {
@ -56,22 +87,49 @@ public class FoldersListAdapter extends CursorAdapter {
((FolderListItem) view).bind(folderName);
}
}
/**
* @classname: FoldersListAdapter
* @methodname: getFolderName
* @description:
* @date: 2024/1/4 11:10
* @author: wangrunze
* @param:Context context
* @param:int position
*/
public String getFolderName(Context context, int position) {
Cursor cursor = (Cursor) getItem(position);
return (cursor.getLong(ID_COLUMN) == Notes.ID_ROOT_FOLDER) ? context
.getString(R.string.menu_move_parent_folder) : cursor.getString(NAME_COLUMN);
}
/**
* @classname: FoldersListAdapter
* @description:
* @date: 2024/1/4 11:11
* @author: wangrunze
*/
private class FolderListItem extends LinearLayout {
private TextView mName;
/**
* @classname: FolderListItem
* @methodname: FolderListItem
* @description:
* @date: 2024/1/4 11:12
* @author: wangrunze
* @param:Context context
*/
public FolderListItem(Context context) {
super(context);
inflate(context, R.layout.folder_list_item, this);
mName = (TextView) findViewById(R.id.tv_folder_name);
}
/**
* @classname: FolderListItem
* @methodname: bind
* @description:
* @date: 2024/1/4 11:13
* @author: wangrunze
* @param:String name
*/
public void bind(String name) {
mName.setText(name);
}

@ -78,6 +78,7 @@ import java.util.regex.Pattern;
* @date: 2023/12/27 0:08
* @author: Xia Yanbo
*/
public class NoteEditActivity extends Activity implements OnClickListener,
NoteSettingChangedListener, OnTextViewChangeListener {
//定义视图组件的基本数据(后面出现在了操作菜可选项里)
@ -604,6 +605,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
} else {
menu.findItem(R.id.menu_delete_remind).setVisible(false);
}
return true;
}
/**
@ -652,6 +654,15 @@ public class NoteEditActivity extends Activity implements OnClickListener,
mWorkingNote.setCheckListMode(mWorkingNote.getCheckListMode() == 0 ?
TextNote.MODE_CHECK_LIST : 0);
}
// else if(item.getItemId()== R.id.menu_secret)
// {
// mWorkingNote.setSecretMode();
//
// }
// else if(item.getItemId()== R.id.menu_quit_secret)
// {
// mWorkingNote.setSecretMode();
// }
//分享
else if(item.getItemId()== R.id.menu_share)
{
@ -748,10 +759,6 @@ public class NoteEditActivity extends Activity implements OnClickListener,
* @description:
* @date: 2023/12/25 21:34
* @author: Xia Yanbo
* @param:
* @param:
* @param:
* @return:
*/
public void onClockAlertChanged(long date, boolean set) {
/**
@ -847,7 +854,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
int index = 0;
for (String item : items) {
if(!TextUtils.isEmpty(item)) {
mEditTextList.addView(getListItem(item, index));//添加列表项标记实现的关键步骤addView
mEditTextList.addView(getListItem(item, index));//添加列表项标记实现的关键步骤addViewgetlistitem
index++;
}
}

@ -95,38 +95,28 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
NOTE_LIST, SUB_FOLDER, CALL_RECORD_FOLDER
};
private ListEditState mState;
private BackgroundQueryHandler mBackgroundQueryHandler;
private NotesListAdapter mNotesListAdapter;
private ListView mNotesListView;
private Button mAddNewNote;
private boolean mDispatch;
private int mOriginY;
private int mDispatchY;
private TextView mTitleBar;
private long mCurrentFolderId;
private ContentResolver mContentResolver;
private ModeCallback mModeCallBack;
// 声明一些私有成员变量。
private ListEditState mState; // 当前列表的编辑状态
private BackgroundQueryHandler mBackgroundQueryHandler; // 用于在后台执行查询的处理程序
private NotesListAdapter mNotesListAdapter; // 笔记列表的适配器
private ListView mNotesListView; // 显示笔记列表的视图
private Button mAddNewNote; // 添加新笔记的按钮
private boolean mDispatch; // 一个标志,可能用于控制事件分发
private int mOriginY; // 原始Y坐标可能用于触摸事件处理
private int mDispatchY; // 分发的Y坐标也可能用于触摸事件处理
private TextView mTitleBar; // 标题栏文本视图
private long mCurrentFolderId; // 当前文件夹的ID
private ContentResolver mContentResolver; // 内容解析器,用于访问应用的数据
private ModeCallback mModeCallBack; // 模式回调接口的实现,可能用于在不同的操作模式之间切换
private static final String TAG = "NotesListActivity";
public static final int NOTES_LISTVIEW_SCROLL_RATE = 30;
//正在关注的笔记数据对象
private NoteItemData mFocusNoteDataItem;
private static final String NORMAL_SELECTION = NoteColumns.PARENT_ID + "=?";
//拼接访问串
private static final String ROOT_FOLDER_SELECTION = "(" + NoteColumns.TYPE + "<>"
+ Notes.TYPE_SYSTEM + " AND " + NoteColumns.PARENT_ID + "=?)" + " OR ("
+ NoteColumns.ID + "=" + Notes.ID_CALL_RECORD_FOLDER + " AND "
@ -134,10 +124,21 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
private final static int REQUEST_CODE_OPEN_NODE = 102;
private final static int REQUEST_CODE_NEW_NODE = 103;
//表示是否在私密模式
public static int secret_mode = 0;
/**
* @classname: NotesListActivity
* @methodname onCreate
* @description:
* @date: 2024/1/4 11:47
* @author: Xia Yanbo
* @param:savedInstanceState
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//根据布局文件呈现菜单视图
setContentView(R.layout.note_list);
initResources();
@ -146,13 +147,25 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
*/
setAppInfoFromRawRes();
}
/**
* @classname: NotesListActivity
* @methodname onActivityResult
* @description:
* @date: 2024/1/4 11:49
* @author: Xia Yanbo
* @param:requestCode
* @param:resultCode
* @param:data
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK
&& (requestCode == REQUEST_CODE_OPEN_NODE || requestCode == REQUEST_CODE_NEW_NODE)) {
// 根据请求的代码类型进行相应的处理
if (resultCode == RESULT_OK // 如果返回的结果码是RESULT_OK表示操作成功
&& (requestCode == REQUEST_CODE_OPEN_NODE || requestCode == REQUEST_CODE_NEW_NODE)) { // 并且请求码是打开节点或新建节点
// 清空笔记列表的适配器游标(可能是在执行打开或新建节点操作后,刷新或重置列表)
mNotesListAdapter.changeCursor(null);
} else {
} else { // 其他情况
// 调用父类的onActivityResult方法将结果传递给上层处理。
super.onActivityResult(requestCode, resultCode, data);
}
}
@ -412,10 +425,35 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
private void startAsyncNotesListQuery() {
String selection = (mCurrentFolderId == Notes.ID_ROOT_FOLDER) ? ROOT_FOLDER_SELECTION
: NORMAL_SELECTION;
mBackgroundQueryHandler.startQuery(FOLDER_NOTE_LIST_QUERY_TOKEN, null,
Notes.CONTENT_NOTE_URI, NoteItemData.PROJECTION, selection, new String[] {
String.valueOf(mCurrentFolderId)
}, NoteColumns.TYPE + " DESC," + NoteColumns.MODIFIED_DATE + " DESC");
if(secret_mode == 0) {
mBackgroundQueryHandler.startQuery(FOLDER_NOTE_LIST_QUERY_TOKEN, null,
Notes.CONTENT_NOTE_URI, NoteItemData.PROJECTION, selection, new String[]{
String.valueOf(mCurrentFolderId)
}, NoteColumns.TYPE + " DESC," + NoteColumns.MODIFIED_DATE + " DESC");
}
else{
String str1 = "520";
String [] PROJECTION = new String [] { //定义一个新的PROJECTION数组只换掉SNIPPET
NoteColumns.ID,
NoteColumns.ALERTED_DATE,
NoteColumns.BG_COLOR_ID,
NoteColumns.CREATED_DATE,
NoteColumns.HAS_ATTACHMENT,
NoteColumns.MODIFIED_DATE,
NoteColumns.NOTES_COUNT,
NoteColumns.PARENT_ID,
// NoteColumns.SNIPPET,
str1,
NoteColumns.TYPE,
NoteColumns.WIDGET_ID,
NoteColumns.WIDGET_TYPE,
};
mBackgroundQueryHandler.startQuery(FOLDER_NOTE_LIST_QUERY_TOKEN, null,
Notes.CONTENT_NOTE_URI, PROJECTION, selection, new String[]{
String.valueOf(mCurrentFolderId)
}, NoteColumns.TYPE + " DESC," + NoteColumns.MODIFIED_DATE + " DESC");
}
}
private final class BackgroundQueryHandler extends AsyncQueryHandler {
@ -772,6 +810,10 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
} else {
Log.e(TAG, "Wrong state:" + mState);
}
if(secret_mode == 1)
menu.findItem(R.id.menu_secret).setVisible(false);
else
menu.findItem(R.id.menu_quit_secret).setVisible(false);
return true;
}
@ -804,6 +846,50 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
else if(item.getItemId()==R.id.menu_search) {
onSearchRequested();
}
else if(item.getItemId()==R.id.menu_secret)
{//进入私密模式
secret_mode = 1;
AlertDialog.Builder dialog = new AlertDialog.Builder(NotesListActivity.this);
dialog.setTitle("重要提醒");
dialog.setMessage("您确认进入私密模式吗?");
dialog.setCancelable(false);
dialog.setPositiveButton("确认", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
startAsyncNotesListQuery();
Toast.makeText(NotesListActivity.this,"您已进入私密模式",Toast.LENGTH_SHORT).show();
}
});
dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which){}
});
dialog.show();
startAsyncNotesListQuery();
Toast.makeText(this,"您已进入私密模式",Toast.LENGTH_SHORT).show();
}
else if(item.getItemId()==R.id.menu_quit_secret)
{ //退出私密模式
secret_mode = 0;
AlertDialog.Builder dialog = new AlertDialog.Builder(NotesListActivity.this);
dialog.setTitle("重要提醒");
dialog.setMessage("您确认退出私密模式吗?");
dialog.setCancelable(false);
dialog.setPositiveButton("确认", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
startAsyncNotesListQuery();
Toast.makeText(NotesListActivity.this,"您已退出私密模式",Toast.LENGTH_SHORT).show();
}
});
dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which){}
});
dialog.show();
}
return true;
}
@ -941,4 +1027,16 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
}
return false;
}
public static void setSecretMode() {
if(secret_mode==0)
{
secret_mode=1;
}
else{
secret_mode=0;
}
}
}

@ -31,7 +31,12 @@ import net.micode.notes.data.Notes.NoteColumns;
import net.micode.notes.tool.ResourceParser;
import net.micode.notes.ui.NoteEditActivity;
import net.micode.notes.ui.NotesListActivity;
/**
* @classname: NoteWidgetProvider
* @description:
* @date: 2024/1/7 10:22
* @author: wangrunze
*/
public abstract class NoteWidgetProvider extends AppWidgetProvider {
public static final String [] PROJECTION = new String [] {
NoteColumns.ID,
@ -45,6 +50,15 @@ public abstract class NoteWidgetProvider extends AppWidgetProvider {
private static final String TAG = "NoteWidgetProvider";
/**
* @classname: NoteWidgetProvider
* @methodname: onDeleted
* @description:
* @date: 2024/1/7 10:23
* @author: wangrunze
* @param:Context context
* @param:int[] appWidgetIds
*/
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
ContentValues values = new ContentValues();
@ -56,7 +70,15 @@ public abstract class NoteWidgetProvider extends AppWidgetProvider {
new String[] { String.valueOf(appWidgetIds[i])});
}
}
/**
* @classname: NoteWidgetProvider
* @methodname: getNoteWidgetInfo
* @description:
* @date: 2024/1/7 10:23
* @author: wangrunze
* @param:Context context
* @param:int widgetId
*/
private Cursor getNoteWidgetInfo(Context context, int widgetId) {
return context.getContentResolver().query(Notes.CONTENT_NOTE_URI,
PROJECTION,
@ -64,11 +86,30 @@ public abstract class NoteWidgetProvider extends AppWidgetProvider {
new String[] { String.valueOf(widgetId), String.valueOf(Notes.ID_TRASH_FOLER) },
null);
}
/**
* @classname: NoteWidgetProvider
* @methodname: update
* @description:
* @date: 2024/1/7 10:24
* @author: wangrunze
* @param:Context context
* @param:AppWidgetManager appWidgetManager
* @param:int[] appWidgetIds
*/
protected void update(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
update(context, appWidgetManager, appWidgetIds, false);
}
/**
* @classname: NoteWidgetProvider
* @methodname: update
* @description:
* @date: 2024/1/7 10:24
* @author: wangrunze
* @param:Context context
* @param:AppWidgetManager appWidgetManager
* @param:int[] appWidgetIds
* @param:boolean privacyMode
*/
private void update(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds,
boolean privacyMode) {
for (int i = 0; i < appWidgetIds.length; i++) {

@ -23,24 +23,61 @@ import net.micode.notes.R;
import net.micode.notes.data.Notes;
import net.micode.notes.tool.ResourceParser;
/**
* @classname: NoteWidgetProvider_2x
* @description:2*2
* @date: 2024/1/7 10:27
* @author: wangrunze
*/
public class NoteWidgetProvider_2x extends NoteWidgetProvider {
@Override
/**
* @classname: NoteWidgetProvider_2x
* @methodname: onUpdate
* @description:
* @date: 2024/1/7 10:29
* @author: wangrunze
* @param:Context context
* @param:AppWidgetManager appWidgetManager
* @param:int[] appWidgetIds
*/
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
super.update(context, appWidgetManager, appWidgetIds);
}
@Override
/**
* @classname: NoteWidgetProvider_2x
* @methodname: getLayoutId
* @description:ID
* @date: 2024/1/7 10:30
* @author: wangrunze
*/
protected int getLayoutId() {
return R.layout.widget_2x;
}
@Override
/**
* @classname: NoteWidgetProvider_2x
* @methodname: getBgResourceId
* @description:2ID
* @date: 2024/1/7 10:31
* @author: wangrunze
* @param:int bgId
*/
protected int getBgResourceId(int bgId) {
return ResourceParser.WidgetBgResources.getWidget2xBgResource(bgId);
}
@Override
/**
* @classname: NoteWidgetProvider_2x
* @methodname: getWidgetType
* @description:
* @date: 2024/1/7 10:31
* @author: wangrunze
*/
protected int getWidgetType() {
return Notes.TYPE_WIDGET_2X;
}

@ -23,23 +23,59 @@ import net.micode.notes.R;
import net.micode.notes.data.Notes;
import net.micode.notes.tool.ResourceParser;
/**
* @classname: NoteWidgetProvider_4x
* @description:4*1
* @date: 2024/1/7 10:32
* @author: wangrunze
*/
public class NoteWidgetProvider_4x extends NoteWidgetProvider {
@Override
/**
* @classname: NoteWidgetProvider_4x
* @methodname: onUpdate
* @description:
* @date: 2024/1/7 10:32
* @author: wangrunze
* @param:Context context
* @param:AppWidgetManager appWidgetManager
* @param: int[] appWidgetIds
*/
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
super.update(context, appWidgetManager, appWidgetIds);
}
/**
* @classname: NoteWidgetProvider_4x
* @methodname: getLayoutId
* @description:ID
* @date: 2024/1/7 10:33
* @author: wangrunze
*/
protected int getLayoutId() {
return R.layout.widget_4x;
}
@Override
/**
* @classname: NoteWidgetProvider_4x
* @methodname: getBgResourceId
* @description:4ID
* @date: 2024/1/7 10:33
* @author: wangrunze
* @param:int bgId
*/
protected int getBgResourceId(int bgId) {
return ResourceParser.WidgetBgResources.getWidget4xBgResource(bgId);
}
@Override
/**
* @classname: NoteWidgetProvider_4x
* @methodname: getWidgetType
* @description:
* @date: 2024/1/7 10:34
* @author: wangrunze
*/
protected int getWidgetType() {
return Notes.TYPE_WIDGET_4X;
}

@ -36,4 +36,12 @@
<item
android:id="@+id/menu_search"
android:title="@string/menu_search"/>
<item
android:id="@+id/menu_secret"
android:title="@string/menu_secret"/>
<item
android:id="@+id/menu_quit_secret"
android:title="@string/menu_quit_secret"/>
</menu>

@ -21,4 +21,11 @@
<item
android:id="@+id/menu_new_note"
android:title="@string/notelist_menu_new"/>
<item
android:id="@+id/menu_secret"
android:title="@string/menu_secret"/>
<item
android:id="@+id/menu_quit_secret"
android:title="@string/menu_quit_secret"/>
</menu>

@ -71,6 +71,8 @@
<string name="alert_message_delete_note">确认要删除该条便签吗?</string>
<string name="alert_message_delete_folder">确认删除文件夹及所包含的便签吗?</string>
<string name="format_move_notes_to_folder">已将所选 %1$d 条便签移到 %2$s 文件夹</string>
<string name="menu_secret">私密模式</string>
<string name="menu_quit_secret">退出私密模式</string>
<!-- export text -->
<string name="error_sdcard_unmounted">SD卡被占用不能操作</string>
<string name="error_sdcard_export">导出文本时发生错误请检查SD卡</string>

@ -75,6 +75,8 @@
<string name="alert_message_delete_notes">Confirm to delete the selected %d notes?</string>
<string name="alert_message_delete_note">Confirm to delete this note?</string>
<string name="format_move_notes_to_folder">Have moved selected %1$d notes to %2$s folder</string>
<string name="menu_secret">secret model</string>
<string name="menu_quit_secret">quit secret model</string>
<!-- Error information -->
<string name="error_sdcard_unmounted">SD card busy, not available now</string>
<string name="error_sdcard_export">Export failed, please check SD card</string>

@ -64,6 +64,6 @@
<style name="NoteActionBarStyle" parent="@android:style/Widget.Holo.Light.ActionBar.Solid">
<item name="android:displayOptions" />
<item name="android:visibility">gone</item>
<item name="android:visibility">visible</item>
</style>
</resources>
Loading…
Cancel
Save