From 1a93e734bd264aa3d908a57f8423960660945b8c Mon Sep 17 00:00:00 2001
From: eazzy <1044745821@qq.com>
Date: Sun, 3 Dec 2023 17:40:33 +0800
Subject: [PATCH 01/13] Added comments to the data package
---
.../java/net/micode/notes/data/Notes.java | 19 +++--
.../notes/data/NotesDatabaseHelper.java | 54 ++++++-------
.../net/micode/notes/data/NotesProvider.java | 79 +++++++++++--------
3 files changed, 86 insertions(+), 66 deletions(-)
diff --git a/src/Notes/app/src/main/java/net/micode/notes/data/Notes.java b/src/Notes/app/src/main/java/net/micode/notes/data/Notes.java
index f727743..aba2dbb 100644
--- a/src/Notes/app/src/main/java/net/micode/notes/data/Notes.java
+++ b/src/Notes/app/src/main/java/net/micode/notes/data/Notes.java
@@ -17,9 +17,11 @@
package net.micode.notes.data;
import android.net.Uri;
+//Notes类就定义了很多常量,是小米便签的数据库
public class Notes {
public static final String AUTHORITY = "micode_notes";
public static final String TAG = "Notes";
+ //三个type
public static final int TYPE_NOTE = 0;
public static final int TYPE_FOLDER = 1;
public static final int TYPE_SYSTEM = 2;
@@ -30,6 +32,7 @@ public class Notes {
* {@link Notes#ID_TEMPARAY_FOLDER } is for notes belonging no folder
* {@link Notes#ID_CALL_RECORD_FOLDER} is to store call records
*/
+ //不同种类的文件夹
public static final int ID_ROOT_FOLDER = 0;
public static final int ID_TEMPARAY_FOLDER = -1;
public static final int ID_CALL_RECORD_FOLDER = -2;
@@ -45,12 +48,12 @@ public class Notes {
public static final int TYPE_WIDGET_INVALIDE = -1;
public static final int TYPE_WIDGET_2X = 0;
public static final int TYPE_WIDGET_4X = 1;
-
+ //数据常量 包括普通note和call_note
public static class DataConstants {
public static final String NOTE = TextNote.CONTENT_ITEM_TYPE;
public static final String CALL_NOTE = CallNote.CONTENT_ITEM_TYPE;
}
-
+ //两个指针,一个找便签和文件夹,一个用来找数据
/**
* Uri to query all notes and folders
*/
@@ -59,9 +62,11 @@ public class Notes {
/**
* Uri to query data
*/
- public static final Uri CONTENT_DATA_URI = Uri.parse("content://" + AUTHORITY + "/data");
+ public static final Uri CONTENT_DATA_URI = Uri.parse("content://" + AUTHORITY + "/data");
+ //Notecolumns类,用于创建数据库的表头
public interface NoteColumns {
+ //具体每一项都给了英文注释
/**
* The unique ID for a row
*
Type: INTEGER (long)
@@ -169,7 +174,7 @@ public class Notes {
public static final String PASSWORD = "password";
public static final String IMPORTANCE = "importance";
- }
+ }//便签的各种属性
/*
* 便签数据在数据库中的表头
*/
@@ -245,7 +250,7 @@ public class Notes {
*
Type: TEXT
*/
public static final String DATA5 = "data5";
- }
+ }//一个便签内部各种数据类型
public static final class TextNote implements DataColumns {
/**
@@ -261,7 +266,7 @@ public class Notes {
public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/text_note";
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/text_note");
- }
+ }//一种是文本textnote
public static final class CallNote implements DataColumns {
/**
@@ -281,5 +286,5 @@ public class Notes {
public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/call_note";
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/call_note");
- }
+ }//另一种是通话类型的callnote
}
diff --git a/src/Notes/app/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java b/src/Notes/app/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java
index ffe5d57..bedbf65 100644
--- a/src/Notes/app/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java
+++ b/src/Notes/app/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java
@@ -21,17 +21,17 @@ import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
-
+//引用了同一个包中的另一个子包Notes中一些接口
import net.micode.notes.data.Notes.DataColumns;
import net.micode.notes.data.Notes.DataConstants;
import net.micode.notes.data.Notes.NoteColumns;
-
+//数据库操作
public class NotesDatabaseHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "note.db";
private static final int DB_VERSION = 4;
-
+ //接口两部分一个Note一个DATA
public interface TABLE {
public static final String NOTE = "note";
@@ -41,7 +41,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
private static final String TAG = "NotesDatabaseHelper";
private static NotesDatabaseHelper mInstance;
-
+ //基于NoteColumn创建一个NOTE_TABLE表格,并附上初始数据
private static final String CREATE_NOTE_TABLE_SQL =
"CREATE TABLE " + TABLE.NOTE + "(" +
NoteColumns.ID + " INTEGER PRIMARY KEY," +
@@ -62,7 +62,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
NoteColumns.GTASK_ID + " TEXT NOT NULL DEFAULT ''," +
NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0" +
")";
-
+ //主要基于datacolumn来创建DATA_TABLE
private static final String CREATE_DATA_TABLE_SQL =
"CREATE TABLE " + TABLE.DATA + "(" +
DataColumns.ID + " INTEGER PRIMARY KEY," +
@@ -77,7 +77,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
DataColumns.DATA4 + " TEXT NOT NULL DEFAULT ''," +
DataColumns.DATA5 + " TEXT NOT NULL DEFAULT ''" +
")";
-
+ //这个数据是关于INDEX编号的
private static final String CREATE_DATA_NOTE_ID_INDEX_SQL =
"CREATE INDEX IF NOT EXISTS note_id_index ON " +
TABLE.DATA + "(" + DataColumns.NOTE_ID + ");";
@@ -93,7 +93,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
" SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" +
" WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" +
" END";
-
+ //移入note时触发,修改一系列数据,从哪来之类的
/**
* Decrease folder's note count when move note from folder
*/
@@ -106,7 +106,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
" WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID +
" AND " + NoteColumns.NOTES_COUNT + ">0" + ";" +
" END";
-
+ //移除Note时触发,与上面移入对应
/**
* Increase folder's note count when insert new note to the folder
*/
@@ -118,7 +118,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
" SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" +
" WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" +
" END";
-
+ //插入Note
/**
* Decrease folder's note count when delete note from the folder
*/
@@ -131,7 +131,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
" WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID +
" AND " + NoteColumns.NOTES_COUNT + ">0;" +
" END";
-
+ //删除note
/**
* Update note's content when insert data with type {@link DataConstants#NOTE}
*/
@@ -144,7 +144,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
" SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT +
" WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" +
" END";
-
+ //当给note插入新数据时触发
/**
* Update note's content when data with {@link DataConstants#NOTE} type has changed
*/
@@ -156,7 +156,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
" UPDATE " + TABLE.NOTE +
" SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT +
" WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" +
- " END";
+ " END";//note数据被修改update
/**
* Update note's content when data with {@link DataConstants#NOTE} type has deleted
@@ -169,7 +169,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
" UPDATE " + TABLE.NOTE +
" SET " + NoteColumns.SNIPPET + "=''" +
" WHERE " + NoteColumns.ID + "=old." + DataColumns.NOTE_ID + ";" +
- " END";
+ " END";//更新已经删除的便签的数据
/**
* Delete datas belong to note which has been deleted
@@ -180,7 +180,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
" BEGIN" +
" DELETE FROM " + TABLE.DATA +
" WHERE " + DataColumns.NOTE_ID + "=old." + NoteColumns.ID + ";" +
- " END";
+ " END";//删除 已经被删除的便签的数据
/**
* Delete notes belong to folder which has been deleted
@@ -191,7 +191,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
" BEGIN" +
" DELETE FROM " + TABLE.NOTE +
" WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" +
- " END";
+ " END";//删除 已删除folder文件夹 中的便签要修改的数据
/**
* Move notes belong to folder which has been moved to trash folder
@@ -204,12 +204,12 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
" UPDATE " + TABLE.NOTE +
" SET " + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER +
" WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" +
- " END";
+ " END";//移动trash_folder中的便签
public NotesDatabaseHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
-
+ //构造函数
public void createNoteTable(SQLiteDatabase db) {
db.execSQL(CREATE_NOTE_TABLE_SQL);
reCreateNoteTableTriggers(db);
@@ -233,7 +233,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
db.execSQL(NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER);
db.execSQL(FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER);
db.execSQL(FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER);
- }
+ }//数据库操作的API,重新创建
private void createSystemFolder(SQLiteDatabase db) {
ContentValues values = new ContentValues();
@@ -268,14 +268,14 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER);
values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
db.insert(TABLE.NOTE, null, values);
- }
+ }//创建系统文件夹
public void createDataTable(SQLiteDatabase db) {
db.execSQL(CREATE_DATA_TABLE_SQL);
reCreateDataTableTriggers(db);
db.execSQL(CREATE_DATA_NOTE_ID_INDEX_SQL);
Log.d(TAG, "data table has been created");
- }
+ }//创建数据表格
private void reCreateDataTableTriggers(SQLiteDatabase db) {
db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_insert");
@@ -285,20 +285,20 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER);
db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER);
db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER);
- }
+ }//类似于recreatenotetable,重新创建触发器
static synchronized NotesDatabaseHelper getInstance(Context context) {
if (mInstance == null) {
mInstance = new NotesDatabaseHelper(context);
}
return mInstance;
- }
+ }//sync同步,同一时刻只有一个线程执行
@Override
public void onCreate(SQLiteDatabase db) {
createNoteTable(db);
createDataTable(db);
- }
+ }//创建Note Data两个表格
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
@@ -331,14 +331,14 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
throw new IllegalStateException("Upgrade notes database to version " + newVersion
+ "fails");
}
- }
+ }//数据库版本更新
private void upgradeToV2(SQLiteDatabase db) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE.NOTE);
db.execSQL("DROP TABLE IF EXISTS " + TABLE.DATA);
createNoteTable(db);
createDataTable(db);
- }
+ }//更新到V2
private void upgradeToV3(SQLiteDatabase db) {
// drop unused triggers
@@ -353,10 +353,10 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER);
values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
db.insert(TABLE.NOTE, null, values);
- }
+ }//更新到V3
private void upgradeToV4(SQLiteDatabase db) {
db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.VERSION
+ " INTEGER NOT NULL DEFAULT 0");
- }
+ }//更新到V4
}
diff --git a/src/Notes/app/src/main/java/net/micode/notes/data/NotesProvider.java b/src/Notes/app/src/main/java/net/micode/notes/data/NotesProvider.java
index edb0a60..6897999 100644
--- a/src/Notes/app/src/main/java/net/micode/notes/data/NotesProvider.java
+++ b/src/Notes/app/src/main/java/net/micode/notes/data/NotesProvider.java
@@ -1,22 +1,5 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
package net.micode.notes.data;
-
import android.app.SearchManager;
import android.content.ContentProvider;
import android.content.ContentUris;
@@ -33,9 +16,15 @@ import net.micode.notes.R;
import net.micode.notes.data.Notes.DataColumns;
import net.micode.notes.data.Notes.NoteColumns;
import net.micode.notes.data.NotesDatabaseHelper.TABLE;
-
-
+//为存储和获取数据提供接口。可以在不同的应用程序之间共享数据
+//ContentProvider提供的方法
+//query:查询
+//insert:插入
+//update:更新
+//delete:删除
+//getType:得到数据类型
public class NotesProvider extends ContentProvider {
+ // UriMatcher用于匹配Uri
private static final UriMatcher mMatcher;
private NotesDatabaseHelper mHelper;
@@ -51,7 +40,9 @@ public class NotesProvider extends ContentProvider {
private static final int URI_SEARCH_SUGGEST = 6;
static {
+ // 创建UriMatcher时,调用UriMatcher(UriMatcher.NO_MATCH)表示不匹配任何路径的返回码
mMatcher = new UriMatcher(UriMatcher.NO_MATCH);
+ // 把需要匹配Uri路径全部给注册上
mMatcher.addURI(Notes.AUTHORITY, "note", URI_NOTE);
mMatcher.addURI(Notes.AUTHORITY, "note/#", URI_NOTE_ITEM);
mMatcher.addURI(Notes.AUTHORITY, "data", URI_DATA);
@@ -65,33 +56,40 @@ public class NotesProvider extends ContentProvider {
* x'0A' represents the '\n' character in sqlite. For title and content in the search result,
* we will trim '\n' and white space in order to show more information.
*/
+ // 声明 NOTES_SEARCH_PROJECTION
private static final String NOTES_SEARCH_PROJECTION = NoteColumns.ID + ","
- + NoteColumns.ID + " AS " + SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA + ","
- + "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_1 + ","
- + "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_2 + ","
- + R.drawable.search_result + " AS " + SearchManager.SUGGEST_COLUMN_ICON_1 + ","
- + "'" + Intent.ACTION_VIEW + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_ACTION + ","
- + "'" + Notes.TextNote.CONTENT_TYPE + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA;
-
+ + NoteColumns.ID + " AS " + SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA + ","
+ + "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_1 + ","
+ + "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_2 + ","
+ + R.drawable.search_result + " AS " + SearchManager.SUGGEST_COLUMN_ICON_1 + ","
+ + "'" + Intent.ACTION_VIEW + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_ACTION + ","
+ + "'" + Notes.TextNote.CONTENT_TYPE + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA;
+ // 声明NOTES_SNIPPET_SEARCH_QUERY
private static String NOTES_SNIPPET_SEARCH_QUERY = "SELECT " + NOTES_SEARCH_PROJECTION
- + " FROM " + TABLE.NOTE
- + " WHERE " + NoteColumns.SNIPPET + " LIKE ?"
- + " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER
- + " AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE;
+ + " FROM " + TABLE.NOTE
+ + " WHERE " + NoteColumns.SNIPPET + " LIKE ?"
+ + " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER
+ + " AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE;
@Override
+ // Context只有在onCreate()中才被初始化
+ // 对mHelper进行实例化
public boolean onCreate() {
mHelper = NotesDatabaseHelper.getInstance(getContext());
return true;
}
@Override
+ // 查询uri在数据库中对应的位置
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
- String sortOrder) {
+ String sortOrder) {
Cursor c = null;
+ // 获取可读数据库
SQLiteDatabase db = mHelper.getReadableDatabase();
String id = null;
+ // 匹配查找uri
switch (mMatcher.match(uri)) {
+ // 对于不同的匹配值,在数据库中查找相应的条目
case URI_NOTE:
c = db.query(TABLE.NOTE, projection, selection, selectionArgs, null, null,
sortOrder);
@@ -113,6 +111,7 @@ public class NotesProvider extends ContentProvider {
case URI_SEARCH:
case URI_SEARCH_SUGGEST:
if (sortOrder != null || projection != null) {
+ // 不合法的参数异常
throw new IllegalArgumentException(
"do not specify sortOrder, selection, selectionArgs, or projection" + "with this query");
}
@@ -120,6 +119,8 @@ public class NotesProvider extends ContentProvider {
String searchString = null;
if (mMatcher.match(uri) == URI_SEARCH_SUGGEST) {
if (uri.getPathSegments().size() > 1) {
+ // getPathSegments()方法得到一个String的List,
+ // 在uri.getPathSegments().get(1)为第2个元素
searchString = uri.getPathSegments().get(1);
}
} else {
@@ -139,6 +140,7 @@ public class NotesProvider extends ContentProvider {
}
break;
default:
+ // 抛出异常
throw new IllegalArgumentException("Unknown URI " + uri);
}
if (c != null) {
@@ -148,13 +150,17 @@ public class NotesProvider extends ContentProvider {
}
@Override
+ // 插入一个uri
public Uri insert(Uri uri, ContentValues values) {
+ // 获得可写的数据库
SQLiteDatabase db = mHelper.getWritableDatabase();
long dataId = 0, noteId = 0, insertedId = 0;
switch (mMatcher.match(uri)) {
+ // 新增一个条目
case URI_NOTE:
insertedId = noteId = db.insert(TABLE.NOTE, null, values);
break;
+ // 如果存在,查找NOTE_ID
case URI_DATA:
if (values.containsKey(DataColumns.NOTE_ID)) {
noteId = values.getAsLong(DataColumns.NOTE_ID);
@@ -167,6 +173,7 @@ public class NotesProvider extends ContentProvider {
throw new IllegalArgumentException("Unknown URI " + uri);
}
// Notify the note uri
+ // notifyChange获得一个ContextResolver对象并且更新里面的内容
if (noteId > 0) {
getContext().getContentResolver().notifyChange(
ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), null);
@@ -178,13 +185,17 @@ public class NotesProvider extends ContentProvider {
ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), null);
}
+ // 返回插入的uri的路径
return ContentUris.withAppendedId(uri, insertedId);
}
@Override
+ // 删除一个uri
public int delete(Uri uri, String selection, String[] selectionArgs) {
+ //Uri代表要操作的数据,Android上可用的每种资源 -包括 图像、视频片段、音频资源等都可以用Uri来表示。
int count = 0;
String id = null;
+ // 获得可写的数据库
SQLiteDatabase db = mHelper.getWritableDatabase();
boolean deleteData = false;
switch (mMatcher.match(uri)) {
@@ -228,6 +239,7 @@ public class NotesProvider extends ContentProvider {
}
@Override
+ // 更新一个uri
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
int count = 0;
String id = null;
@@ -267,10 +279,12 @@ public class NotesProvider extends ContentProvider {
return count;
}
+ // 将字符串解析成规定格式
private String parseSelection(String selection) {
return (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : "");
}
+ //增加一个noteVersion
private void increaseNoteVersion(long id, String selection, String[] selectionArgs) {
StringBuilder sql = new StringBuilder(120);
sql.append("UPDATE ");
@@ -293,6 +307,7 @@ public class NotesProvider extends ContentProvider {
sql.append(selectString);
}
+ // execSQL()方法可以执行insert、delete、update和CREATE TABLE之类有更改行为的SQL语句
mHelper.getWritableDatabase().execSQL(sql.toString());
}
@@ -302,4 +317,4 @@ public class NotesProvider extends ContentProvider {
return null;
}
-}
+}
\ No newline at end of file
From 8bbc3c1505eb2ee6f63ad2972d9e92dafed9dcb2 Mon Sep 17 00:00:00 2001
From: eazzy <1044745821@qq.com>
Date: Sun, 3 Dec 2023 20:12:44 +0800
Subject: [PATCH 02/13] widget
---
...泛读、标注和维护报告文档.docx | Bin 0 -> 22746 bytes
src/.idea/.gitignore | 0
src/.idea/modules.xml | 8 ++++
src/.idea/src.iml | 9 ++++
src/.idea/vcs.xml | 6 +++
src/.idea/workspace.xml | 41 ++++++++++++++++++
.../.gradle/8.0/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes
src/Notes/app/.idea/.gitignore | 3 ++
src/Notes/app/.idea/.name | 1 +
src/Notes/app/.idea/compiler.xml | 6 +++
src/Notes/app/.idea/gradle.xml | 19 ++++++++
src/Notes/app/.idea/jarRepositories.xml | 25 +++++++++++
src/Notes/app/.idea/misc.xml | 10 +++++
src/Notes/app/.idea/vcs.xml | 6 +++
14 files changed, 134 insertions(+)
create mode 100644 doc/小米便签泛读、标注和维护报告文档.docx
create mode 100644 src/.idea/.gitignore
create mode 100644 src/.idea/modules.xml
create mode 100644 src/.idea/src.iml
create mode 100644 src/.idea/vcs.xml
create mode 100644 src/.idea/workspace.xml
create mode 100644 src/Notes/app/.idea/.gitignore
create mode 100644 src/Notes/app/.idea/.name
create mode 100644 src/Notes/app/.idea/compiler.xml
create mode 100644 src/Notes/app/.idea/gradle.xml
create mode 100644 src/Notes/app/.idea/jarRepositories.xml
create mode 100644 src/Notes/app/.idea/misc.xml
create mode 100644 src/Notes/app/.idea/vcs.xml
diff --git a/doc/小米便签泛读、标注和维护报告文档.docx b/doc/小米便签泛读、标注和维护报告文档.docx
new file mode 100644
index 0000000000000000000000000000000000000000..b1f01e0511987176e8c08292b42f67599c2819e9
GIT binary patch
literal 22746
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