diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..cb43220
--- /dev/null
+++ b/src/main/AndroidManifest.xml
@@ -0,0 +1,157 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/net/micode/notes/MainActivity.java b/src/main/java/net/micode/notes/MainActivity.java
new file mode 100644
index 0000000..8091753
--- /dev/null
+++ b/src/main/java/net/micode/notes/MainActivity.java
@@ -0,0 +1,24 @@
+package net.micode.notes;
+
+import android.os.Bundle;
+
+import androidx.activity.EdgeToEdge;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.core.graphics.Insets;
+import androidx.core.view.ViewCompat;
+import androidx.core.view.WindowInsetsCompat;
+
+public class MainActivity extends AppCompatActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ EdgeToEdge.enable(this);
+ setContentView(R.layout.activity_main);
+ ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
+ Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
+ v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
+ return insets;
+ });
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/net/micode/notes/data.zip b/src/main/java/net/micode/notes/data.zip
new file mode 100644
index 0000000..7399631
Binary files /dev/null and b/src/main/java/net/micode/notes/data.zip differ
diff --git a/src/net/micode/notes/data/Contact.java b/src/main/java/net/micode/notes/data/Contact.java
similarity index 100%
rename from src/net/micode/notes/data/Contact.java
rename to src/main/java/net/micode/notes/data/Contact.java
diff --git a/src/net/micode/notes/data/Notes.java b/src/main/java/net/micode/notes/data/Notes.java
similarity index 96%
rename from src/net/micode/notes/data/Notes.java
rename to src/main/java/net/micode/notes/data/Notes.java
index 913e2b1..1cf1b3f 100644
--- a/src/net/micode/notes/data/Notes.java
+++ b/src/main/java/net/micode/notes/data/Notes.java
@@ -28,12 +28,12 @@ public class Notes {
* ContentProvider的授权字符串,用于标识便签内容提供者
*/
public static final String AUTHORITY = "micode_notes";
-
+
/**
* 日志标签,用于在日志系统中标识本类的日志信息
*/
public static final String TAG = "Notes";
-
+
/**
* 便签类型常量
* - TYPE_NOTE:普通便签
@@ -211,6 +211,18 @@ public class Notes {
*
类型 : INTEGER (long)
*/
public static final String VERSION = "version";
+
+ /**
+ * 置顶状态,用于标识便签是否置顶
+ * 类型 : INTEGER (0: 未置顶, 1: 置顶)
+ */
+ public static final String IS_PINNED = "is_pinned";
+
+ /**
+ * 置顶优先级,用于排序置顶便签
+ * 类型 : INTEGER (long),值越大优先级越高
+ */
+ public static final String PIN_PRIORITY = "pin_priority";
}
/**
diff --git a/src/net/micode/notes/data/NotesDatabaseHelper.java b/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java
similarity index 64%
rename from src/net/micode/notes/data/NotesDatabaseHelper.java
rename to src/main/java/net/micode/notes/data/NotesDatabaseHelper.java
index 2a1c98e..7ff4ec2 100644
--- a/src/net/micode/notes/data/NotesDatabaseHelper.java
+++ b/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java
@@ -34,25 +34,25 @@ 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;
-
+ private static final int DB_VERSION = 5;
+
// 数据库表名定义
public interface TABLE {
// 笔记表:存储笔记和文件夹的基本信息
public static final String NOTE = "note";
-
+
// 数据表:存储笔记的详细内容,支持多种类型的笔记数据
public static final String DATA = "data";
}
-
+
// 日志标签
private static final String TAG = "NotesDatabaseHelper";
// 单例实例,确保整个应用只有一个数据库帮助类实例
private static NotesDatabaseHelper mInstance;
-
+
// 创建笔记表的SQL语句
// 笔记表存储笔记和文件夹的基本信息,包括:
// - ID:唯一标识符
@@ -73,25 +73,27 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
// - GTASK_ID:Google任务ID
// - VERSION:版本号
private static final String CREATE_NOTE_TABLE_SQL =
- "CREATE TABLE " + TABLE.NOTE + "(" +
- NoteColumns.ID + " INTEGER PRIMARY KEY," +
- NoteColumns.PARENT_ID + " INTEGER NOT NULL DEFAULT 0," +
- NoteColumns.ALERTED_DATE + " INTEGER NOT NULL DEFAULT 0," +
- NoteColumns.BG_COLOR_ID + " INTEGER NOT NULL DEFAULT 0," +
- NoteColumns.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," +
- NoteColumns.HAS_ATTACHMENT + " INTEGER NOT NULL DEFAULT 0," +
- NoteColumns.MODIFIED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," +
- NoteColumns.NOTES_COUNT + " INTEGER NOT NULL DEFAULT 0," +
- NoteColumns.SNIPPET + " TEXT NOT NULL DEFAULT ''," +
- NoteColumns.TYPE + " INTEGER NOT NULL DEFAULT 0," +
- NoteColumns.WIDGET_ID + " INTEGER NOT NULL DEFAULT 0," +
- NoteColumns.WIDGET_TYPE + " INTEGER NOT NULL DEFAULT -1," +
- NoteColumns.SYNC_ID + " INTEGER NOT NULL DEFAULT 0," +
- NoteColumns.LOCAL_MODIFIED + " INTEGER NOT NULL DEFAULT 0," +
- NoteColumns.ORIGIN_PARENT_ID + " INTEGER NOT NULL DEFAULT 0," +
- NoteColumns.GTASK_ID + " TEXT NOT NULL DEFAULT ''," +
- NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0" +
- ")";
+ "CREATE TABLE " + TABLE.NOTE + "(" +
+ NoteColumns.ID + " INTEGER PRIMARY KEY," +
+ NoteColumns.PARENT_ID + " INTEGER NOT NULL DEFAULT 0," +
+ NoteColumns.ALERTED_DATE + " INTEGER NOT NULL DEFAULT 0," +
+ NoteColumns.BG_COLOR_ID + " INTEGER NOT NULL DEFAULT 0," +
+ NoteColumns.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," +
+ NoteColumns.HAS_ATTACHMENT + " INTEGER NOT NULL DEFAULT 0," +
+ NoteColumns.MODIFIED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," +
+ NoteColumns.NOTES_COUNT + " INTEGER NOT NULL DEFAULT 0," +
+ NoteColumns.SNIPPET + " TEXT NOT NULL DEFAULT ''," +
+ NoteColumns.TYPE + " INTEGER NOT NULL DEFAULT 0," +
+ NoteColumns.WIDGET_ID + " INTEGER NOT NULL DEFAULT 0," +
+ NoteColumns.WIDGET_TYPE + " INTEGER NOT NULL DEFAULT -1," +
+ NoteColumns.SYNC_ID + " INTEGER NOT NULL DEFAULT 0," +
+ NoteColumns.LOCAL_MODIFIED + " INTEGER NOT NULL DEFAULT 0," +
+ NoteColumns.ORIGIN_PARENT_ID + " INTEGER NOT NULL DEFAULT 0," +
+ NoteColumns.GTASK_ID + " TEXT NOT NULL DEFAULT ''," +
+ NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0," +
+ NoteColumns.IS_PINNED + " INTEGER NOT NULL DEFAULT 0," +
+ NoteColumns.PIN_PRIORITY + " INTEGER NOT NULL DEFAULT 0" +
+ ")";
// 创建数据表的SQL语句
// 数据表存储笔记的详细内容,支持多种类型的笔记数据,包括:
@@ -103,147 +105,147 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
// - CONTENT:数据内容
// - DATA1, DATA2, DATA3, DATA4, DATA5:扩展字段,根据不同数据类型存储不同信息
private static final String CREATE_DATA_TABLE_SQL =
- "CREATE TABLE " + TABLE.DATA + "(" +
- DataColumns.ID + " INTEGER PRIMARY KEY," +
- DataColumns.MIME_TYPE + " TEXT NOT NULL," +
- DataColumns.NOTE_ID + " INTEGER NOT NULL DEFAULT 0," +
- NoteColumns.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," +
- NoteColumns.MODIFIED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," +
- DataColumns.CONTENT + " TEXT NOT NULL DEFAULT ''," +
- DataColumns.DATA1 + " INTEGER," +
- DataColumns.DATA2 + " INTEGER," +
- DataColumns.DATA3 + " TEXT NOT NULL DEFAULT ''," +
- DataColumns.DATA4 + " TEXT NOT NULL DEFAULT ''," +
- DataColumns.DATA5 + " TEXT NOT NULL DEFAULT ''" +
- ")";
+ "CREATE TABLE " + TABLE.DATA + "(" +
+ DataColumns.ID + " INTEGER PRIMARY KEY," +
+ DataColumns.MIME_TYPE + " TEXT NOT NULL," +
+ DataColumns.NOTE_ID + " INTEGER NOT NULL DEFAULT 0," +
+ NoteColumns.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," +
+ NoteColumns.MODIFIED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," +
+ DataColumns.CONTENT + " TEXT NOT NULL DEFAULT ''," +
+ DataColumns.DATA1 + " INTEGER," +
+ DataColumns.DATA2 + " INTEGER," +
+ DataColumns.DATA3 + " TEXT NOT NULL DEFAULT ''," +
+ DataColumns.DATA4 + " TEXT NOT NULL DEFAULT ''," +
+ DataColumns.DATA5 + " TEXT NOT NULL DEFAULT ''" +
+ ")";
private static final String CREATE_DATA_NOTE_ID_INDEX_SQL =
- "CREATE INDEX IF NOT EXISTS note_id_index ON " +
- TABLE.DATA + "(" + DataColumns.NOTE_ID + ");";
+ "CREATE INDEX IF NOT EXISTS note_id_index ON " +
+ TABLE.DATA + "(" + DataColumns.NOTE_ID + ");";
/**
* 当将笔记移动到文件夹时,增加文件夹的笔记计数
*/
private static final String NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER =
- "CREATE TRIGGER increase_folder_count_on_update "+
- " AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE +
- " BEGIN " +
- " UPDATE " + TABLE.NOTE +
- " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" +
- " WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" +
- " END";
+ "CREATE TRIGGER increase_folder_count_on_update "+
+ " AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE +
+ " BEGIN " +
+ " UPDATE " + TABLE.NOTE +
+ " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" +
+ " WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" +
+ " END";
/**
* 当将笔记从文件夹移出时,减少文件夹的笔记计数
*/
private static final String NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER =
- "CREATE TRIGGER decrease_folder_count_on_update " +
- " AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE +
- " BEGIN " +
- " UPDATE " + TABLE.NOTE +
- " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" +
- " WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID +
- " AND " + NoteColumns.NOTES_COUNT + ">0" + ";" +
- " END";
+ "CREATE TRIGGER decrease_folder_count_on_update " +
+ " AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE +
+ " BEGIN " +
+ " UPDATE " + TABLE.NOTE +
+ " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" +
+ " WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID +
+ " AND " + NoteColumns.NOTES_COUNT + ">0" + ";" +
+ " END";
/**
* 当向文件夹插入新笔记时,增加文件夹的笔记计数
*/
private static final String NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER =
- "CREATE TRIGGER increase_folder_count_on_insert " +
- " AFTER INSERT ON " + TABLE.NOTE +
- " BEGIN " +
- " UPDATE " + TABLE.NOTE +
- " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" +
- " WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" +
- " END";
+ "CREATE TRIGGER increase_folder_count_on_insert " +
+ " AFTER INSERT ON " + TABLE.NOTE +
+ " BEGIN " +
+ " UPDATE " + TABLE.NOTE +
+ " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" +
+ " WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" +
+ " END";
/**
* 当从文件夹删除笔记时,减少文件夹的笔记计数
*/
private static final String NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER =
- "CREATE TRIGGER decrease_folder_count_on_delete " +
- " AFTER DELETE ON " + TABLE.NOTE +
- " BEGIN " +
- " UPDATE " + TABLE.NOTE +
- " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" +
- " WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID +
- " AND " + NoteColumns.NOTES_COUNT + ">0;" +
- " END";
+ "CREATE TRIGGER decrease_folder_count_on_delete " +
+ " AFTER DELETE ON " + TABLE.NOTE +
+ " BEGIN " +
+ " UPDATE " + TABLE.NOTE +
+ " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" +
+ " WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID +
+ " AND " + NoteColumns.NOTES_COUNT + ">0;" +
+ " END";
/**
* 当插入类型为普通笔记的数据时,更新笔记内容
*/
private static final String DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER =
- "CREATE TRIGGER update_note_content_on_insert " +
- " AFTER INSERT ON " + TABLE.DATA +
- " WHEN new." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" +
- " BEGIN" +
- " UPDATE " + TABLE.NOTE +
- " SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT +
- " WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" +
- " END";
+ "CREATE TRIGGER update_note_content_on_insert " +
+ " AFTER INSERT ON " + TABLE.DATA +
+ " WHEN new." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" +
+ " BEGIN" +
+ " UPDATE " + TABLE.NOTE +
+ " SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT +
+ " WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" +
+ " END";
/**
* 当类型为普通笔记的数据发生变化时,更新笔记内容
*/
private static final String DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER =
- "CREATE TRIGGER update_note_content_on_update " +
- " AFTER UPDATE ON " + TABLE.DATA +
- " WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" +
- " BEGIN" +
- " UPDATE " + TABLE.NOTE +
- " SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT +
- " WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" +
- " END";
+ "CREATE TRIGGER update_note_content_on_update " +
+ " AFTER UPDATE ON " + TABLE.DATA +
+ " WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" +
+ " BEGIN" +
+ " UPDATE " + TABLE.NOTE +
+ " SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT +
+ " WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" +
+ " END";
/**
* 当类型为普通笔记的数据被删除时,更新笔记内容
*/
private static final String DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER =
- "CREATE TRIGGER update_note_content_on_delete " +
- " AFTER delete ON " + TABLE.DATA +
- " WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" +
- " BEGIN" +
- " UPDATE " + TABLE.NOTE +
- " SET " + NoteColumns.SNIPPET + "=''" +
- " WHERE " + NoteColumns.ID + "=old." + DataColumns.NOTE_ID + ";" +
- " END";
+ "CREATE TRIGGER update_note_content_on_delete " +
+ " AFTER delete ON " + TABLE.DATA +
+ " WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" +
+ " BEGIN" +
+ " UPDATE " + TABLE.NOTE +
+ " SET " + NoteColumns.SNIPPET + "=''" +
+ " WHERE " + NoteColumns.ID + "=old." + DataColumns.NOTE_ID + ";" +
+ " END";
/**
* 删除属于已删除笔记的数据
*/
private static final String NOTE_DELETE_DATA_ON_DELETE_TRIGGER =
- "CREATE TRIGGER delete_data_on_delete " +
- " AFTER DELETE ON " + TABLE.NOTE +
- " BEGIN" +
- " DELETE FROM " + TABLE.DATA +
- " WHERE " + DataColumns.NOTE_ID + "=old." + NoteColumns.ID + ";" +
- " END";
+ "CREATE TRIGGER delete_data_on_delete " +
+ " AFTER DELETE ON " + TABLE.NOTE +
+ " BEGIN" +
+ " DELETE FROM " + TABLE.DATA +
+ " WHERE " + DataColumns.NOTE_ID + "=old." + NoteColumns.ID + ";" +
+ " END";
/**
* 删除属于已删除文件夹的笔记
*/
private static final String FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER =
- "CREATE TRIGGER folder_delete_notes_on_delete " +
- " AFTER DELETE ON " + TABLE.NOTE +
- " BEGIN" +
- " DELETE FROM " + TABLE.NOTE +
- " WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" +
- " END";
+ "CREATE TRIGGER folder_delete_notes_on_delete " +
+ " AFTER DELETE ON " + TABLE.NOTE +
+ " BEGIN" +
+ " DELETE FROM " + TABLE.NOTE +
+ " WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" +
+ " END";
/**
* 将属于已移至回收站的文件夹的笔记也移至回收站
*/
private static final String FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER =
- "CREATE TRIGGER folder_move_notes_on_trash " +
- " AFTER UPDATE ON " + TABLE.NOTE +
- " WHEN new." + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER +
- " BEGIN" +
- " UPDATE " + TABLE.NOTE +
- " SET " + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER +
- " WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" +
- " END";
+ "CREATE TRIGGER folder_move_notes_on_trash " +
+ " AFTER UPDATE ON " + TABLE.NOTE +
+ " WHEN new." + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER +
+ " BEGIN" +
+ " UPDATE " + TABLE.NOTE +
+ " SET " + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER +
+ " WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" +
+ " END";
public NotesDatabaseHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
@@ -412,6 +414,12 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
oldVersion++;
}
+ // 从v4升级到v5
+ if (oldVersion == 4) {
+ upgradeToV5(db);
+ oldVersion++;
+ }
+
// 如果需要,重新创建触发器
if (reCreateTriggers) {
reCreateNoteTableTriggers(db);
@@ -469,4 +477,18 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.VERSION
+ " INTEGER NOT NULL DEFAULT 0");
}
+
+ /**
+ * 将数据库从v4升级到v5
+ * 此版本升级添加了置顶状态和置顶优先级字段,用于支持便签置顶功能
+ * @param db SQLite数据库实例
+ */
+ private void upgradeToV5(SQLiteDatabase db) {
+ // 为笔记表添加置顶状态字段
+ db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.IS_PINNED
+ + " INTEGER NOT NULL DEFAULT 0");
+ // 为笔记表添加置顶优先级字段
+ db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.PIN_PRIORITY
+ + " INTEGER NOT NULL DEFAULT 0");
+ }
}
diff --git a/src/net/micode/notes/data/NotesProvider.java b/src/main/java/net/micode/notes/data/NotesProvider.java
similarity index 100%
rename from src/net/micode/notes/data/NotesProvider.java
rename to src/main/java/net/micode/notes/data/NotesProvider.java
diff --git a/src/net/micode/notes/gtask/data/MetaData.java b/src/main/java/net/micode/notes/gtask/data/MetaData.java
similarity index 100%
rename from src/net/micode/notes/gtask/data/MetaData.java
rename to src/main/java/net/micode/notes/gtask/data/MetaData.java
diff --git a/src/net/micode/notes/gtask/data/Node.java b/src/main/java/net/micode/notes/gtask/data/Node.java
similarity index 100%
rename from src/net/micode/notes/gtask/data/Node.java
rename to src/main/java/net/micode/notes/gtask/data/Node.java
diff --git a/src/net/micode/notes/gtask/data/SqlData.java b/src/main/java/net/micode/notes/gtask/data/SqlData.java
similarity index 100%
rename from src/net/micode/notes/gtask/data/SqlData.java
rename to src/main/java/net/micode/notes/gtask/data/SqlData.java
diff --git a/src/net/micode/notes/gtask/data/SqlNote.java b/src/main/java/net/micode/notes/gtask/data/SqlNote.java
similarity index 100%
rename from src/net/micode/notes/gtask/data/SqlNote.java
rename to src/main/java/net/micode/notes/gtask/data/SqlNote.java
diff --git a/src/net/micode/notes/gtask/data/Task.java b/src/main/java/net/micode/notes/gtask/data/Task.java
similarity index 100%
rename from src/net/micode/notes/gtask/data/Task.java
rename to src/main/java/net/micode/notes/gtask/data/Task.java
diff --git a/src/net/micode/notes/gtask/data/TaskList.java b/src/main/java/net/micode/notes/gtask/data/TaskList.java
similarity index 100%
rename from src/net/micode/notes/gtask/data/TaskList.java
rename to src/main/java/net/micode/notes/gtask/data/TaskList.java
diff --git a/src/net/micode/notes/gtask/exception/ActionFailureException.java b/src/main/java/net/micode/notes/gtask/exception/ActionFailureException.java
similarity index 100%
rename from src/net/micode/notes/gtask/exception/ActionFailureException.java
rename to src/main/java/net/micode/notes/gtask/exception/ActionFailureException.java
diff --git a/src/net/micode/notes/gtask/exception/NetworkFailureException.java b/src/main/java/net/micode/notes/gtask/exception/NetworkFailureException.java
similarity index 100%
rename from src/net/micode/notes/gtask/exception/NetworkFailureException.java
rename to src/main/java/net/micode/notes/gtask/exception/NetworkFailureException.java
diff --git a/src/net/micode/notes/gtask/remote/GTaskASyncTask.java b/src/main/java/net/micode/notes/gtask/remote/GTaskASyncTask.java
similarity index 54%
rename from src/net/micode/notes/gtask/remote/GTaskASyncTask.java
rename to src/main/java/net/micode/notes/gtask/remote/GTaskASyncTask.java
index 5a0ac60..7f40bbd 100644
--- a/src/net/micode/notes/gtask/remote/GTaskASyncTask.java
+++ b/src/main/java/net/micode/notes/gtask/remote/GTaskASyncTask.java
@@ -29,53 +29,22 @@ import net.micode.notes.ui.NotesListActivity;
import net.micode.notes.ui.NotesPreferenceActivity;
-/**
- * Google Task 异步同步任务类
- * 继承自 AsyncTask,用于在后台执行 Google Task 同步操作,并通过通知向用户显示同步状态
- */
public class GTaskASyncTask extends AsyncTask {
- /**
- * Google Task 同步通知的唯一标识符
- */
private static int GTASK_SYNC_NOTIFICATION_ID = 5234235;
- /**
- * 同步完成监听器接口
- * 用于在同步完成时回调通知调用者
- */
public interface OnCompleteListener {
- /**
- * 同步完成时调用
- */
void onComplete();
}
- /**
- * 应用上下文
- */
private Context mContext;
- /**
- * 通知管理器,用于显示同步状态通知
- */
private NotificationManager mNotifiManager;
- /**
- * Google Task 管理器实例,用于执行实际的同步操作
- */
private GTaskManager mTaskManager;
- /**
- * 同步完成监听器
- */
private OnCompleteListener mOnCompleteListener;
- /**
- * 构造函数
- * @param context 应用上下文
- * @param listener 同步完成监听器
- */
public GTaskASyncTask(Context context, OnCompleteListener listener) {
mContext = context;
mOnCompleteListener = listener;
@@ -84,108 +53,84 @@ public class GTaskASyncTask extends AsyncTask {
mTaskManager = GTaskManager.getInstance();
}
- /**
- * 取消同步操作
- */
public void cancelSync() {
mTaskManager.cancelSync();
}
- /**
- * 发布同步进度
- * @param message 进度消息
- */
public void publishProgess(String message) {
publishProgress(new String[] {
message
});
}
- /**
- * 显示同步通知
- * @param tickerId 通知标题字符串资源ID
- * @param content 通知内容
- */
- private void showNotification(int tickerId, String content) {
- // 创建通知实例,设置图标、标题和时间
- Notification notification = new Notification(R.drawable.notification, mContext
- .getString(tickerId), System.currentTimeMillis());
- notification.defaults = Notification.DEFAULT_LIGHTS; // 使用默认灯光效果
- notification.flags = Notification.FLAG_AUTO_CANCEL; // 点击后自动取消
-
- // 根据通知类型设置不同的跳转意图
- PendingIntent pendingIntent;
- if (tickerId != R.string.ticker_success) {
- // 同步失败时跳转到设置页面
- pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,
- NotesPreferenceActivity.class), 0);
-
- } else {
- // 同步成功时跳转到笔记列表页面
- pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,
- NotesListActivity.class), 0);
- }
-
- // 设置通知的详细信息并显示
- notification.setLatestEventInfo(mContext, mContext.getString(R.string.app_name), content,
- pendingIntent);
- mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);
- }
-
- /**
- * 在后台执行同步操作
- * @param unused 无参数
- * @return 同步结果状态码
- */
+ // private void showNotification(int tickerId, String content) {
+ //Notification notification = new Notification(R.drawable.notification, mContext
+ // .getString(tickerId), System.currentTimeMillis());
+ //notification.defaults = Notification.DEFAULT_LIGHTS;
+ //notification.flags = Notification.FLAG_AUTO_CANCEL;
+ //PendingIntent pendingIntent;
+ //if (tickerId != R.string.ticker_success) {
+ // pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,
+ // NotesPreferenceActivity.class), 0);
+
+ //notification.setLatestEventInfo(mContext, mContext.getString(R.string.app_name), content,
+ // pendingIntent);
+ // } else {
+ // pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,
+ // NotesListActivity.class), 0);
+ // notification.setLatestEventInfo(mContext, mContext.getString(R.string.app_name), content,
+ // pendingIntent);
+ //}
+ //mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);
+ // }
+ private void showNotification(int tickerId, String content) {
+ PendingIntent pendingIntent;
+ if (tickerId != R.string.ticker_success) {
+ pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,
+ NotesPreferenceActivity.class), PendingIntent.FLAG_IMMUTABLE);
+ } else {
+ pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,
+ NotesListActivity.class), PendingIntent.FLAG_IMMUTABLE);
+ }
+ Notification.Builder builder = new Notification.Builder(mContext)
+ .setAutoCancel(true)
+ .setContentTitle(mContext.getString(R.string.app_name))
+ .setContentText(content)
+ .setContentIntent(pendingIntent)
+ .setWhen(System.currentTimeMillis())
+ .setOngoing(true);
+ Notification notification=builder.getNotification();
+ mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);
+ }
@Override
protected Integer doInBackground(Void... unused) {
- // 发布登录进度
publishProgess(mContext.getString(R.string.sync_progress_login, NotesPreferenceActivity
.getSyncAccountName(mContext)));
- // 调用任务管理器执行同步
return mTaskManager.sync(mContext, this);
}
- /**
- * 处理进度更新
- * @param progress 进度消息数组
- */
@Override
protected void onProgressUpdate(String... progress) {
- // 显示同步中通知
showNotification(R.string.ticker_syncing, progress[0]);
- // 如果上下文是同步服务,则发送广播通知进度
if (mContext instanceof GTaskSyncService) {
((GTaskSyncService) mContext).sendBroadcast(progress[0]);
}
}
- /**
- * 处理同步结果
- * @param result 同步结果状态码
- */
@Override
protected void onPostExecute(Integer result) {
- // 根据同步结果显示不同的通知
if (result == GTaskManager.STATE_SUCCESS) {
- // 同步成功
showNotification(R.string.ticker_success, mContext.getString(
R.string.success_sync_account, mTaskManager.getSyncAccount()));
- // 更新最后同步时间
NotesPreferenceActivity.setLastSyncTime(mContext, System.currentTimeMillis());
} else if (result == GTaskManager.STATE_NETWORK_ERROR) {
- // 网络错误
showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_network));
} else if (result == GTaskManager.STATE_INTERNAL_ERROR) {
- // 内部错误
showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_internal));
} else if (result == GTaskManager.STATE_SYNC_CANCELLED) {
- // 同步取消
showNotification(R.string.ticker_cancel, mContext
.getString(R.string.error_sync_cancelled));
}
-
- // 如果设置了完成监听器,则在新线程中调用
if (mOnCompleteListener != null) {
new Thread(new Runnable() {
diff --git a/src/net/micode/notes/gtask/remote/GTaskClient.java b/src/main/java/net/micode/notes/gtask/remote/GTaskClient.java
similarity index 100%
rename from src/net/micode/notes/gtask/remote/GTaskClient.java
rename to src/main/java/net/micode/notes/gtask/remote/GTaskClient.java
diff --git a/src/net/micode/notes/gtask/remote/GTaskManager.java b/src/main/java/net/micode/notes/gtask/remote/GTaskManager.java
similarity index 100%
rename from src/net/micode/notes/gtask/remote/GTaskManager.java
rename to src/main/java/net/micode/notes/gtask/remote/GTaskManager.java
diff --git a/src/net/micode/notes/gtask/remote/GTaskSyncService.java b/src/main/java/net/micode/notes/gtask/remote/GTaskSyncService.java
similarity index 100%
rename from src/net/micode/notes/gtask/remote/GTaskSyncService.java
rename to src/main/java/net/micode/notes/gtask/remote/GTaskSyncService.java
diff --git a/src/net/micode/notes/model/Note.java b/src/main/java/net/micode/notes/model/Note.java
similarity index 100%
rename from src/net/micode/notes/model/Note.java
rename to src/main/java/net/micode/notes/model/Note.java
diff --git a/src/net/micode/notes/model/WorkingNote.java b/src/main/java/net/micode/notes/model/WorkingNote.java
similarity index 100%
rename from src/net/micode/notes/model/WorkingNote.java
rename to src/main/java/net/micode/notes/model/WorkingNote.java
diff --git a/src/net/micode/notes/tool/BackupUtils.java b/src/main/java/net/micode/notes/tool/BackupUtils.java
similarity index 100%
rename from src/net/micode/notes/tool/BackupUtils.java
rename to src/main/java/net/micode/notes/tool/BackupUtils.java
diff --git a/src/net/micode/notes/tool/DataUtils.java b/src/main/java/net/micode/notes/tool/DataUtils.java
similarity index 100%
rename from src/net/micode/notes/tool/DataUtils.java
rename to src/main/java/net/micode/notes/tool/DataUtils.java
diff --git a/src/net/micode/notes/tool/GTaskStringUtils.java b/src/main/java/net/micode/notes/tool/GTaskStringUtils.java
similarity index 100%
rename from src/net/micode/notes/tool/GTaskStringUtils.java
rename to src/main/java/net/micode/notes/tool/GTaskStringUtils.java
diff --git a/src/net/micode/notes/tool/ResourceParser.java b/src/main/java/net/micode/notes/tool/ResourceParser.java
similarity index 100%
rename from src/net/micode/notes/tool/ResourceParser.java
rename to src/main/java/net/micode/notes/tool/ResourceParser.java
diff --git a/src/net/micode/notes/ui/AlarmAlertActivity.java b/src/main/java/net/micode/notes/ui/AlarmAlertActivity.java
similarity index 100%
rename from src/net/micode/notes/ui/AlarmAlertActivity.java
rename to src/main/java/net/micode/notes/ui/AlarmAlertActivity.java
diff --git a/src/net/micode/notes/ui/AlarmInitReceiver.java b/src/main/java/net/micode/notes/ui/AlarmInitReceiver.java
similarity index 100%
rename from src/net/micode/notes/ui/AlarmInitReceiver.java
rename to src/main/java/net/micode/notes/ui/AlarmInitReceiver.java
diff --git a/src/net/micode/notes/ui/AlarmReceiver.java b/src/main/java/net/micode/notes/ui/AlarmReceiver.java
similarity index 100%
rename from src/net/micode/notes/ui/AlarmReceiver.java
rename to src/main/java/net/micode/notes/ui/AlarmReceiver.java
diff --git a/src/net/micode/notes/ui/DateTimePicker.java b/src/main/java/net/micode/notes/ui/DateTimePicker.java
similarity index 100%
rename from src/net/micode/notes/ui/DateTimePicker.java
rename to src/main/java/net/micode/notes/ui/DateTimePicker.java
diff --git a/src/net/micode/notes/ui/DateTimePickerDialog.java b/src/main/java/net/micode/notes/ui/DateTimePickerDialog.java
similarity index 100%
rename from src/net/micode/notes/ui/DateTimePickerDialog.java
rename to src/main/java/net/micode/notes/ui/DateTimePickerDialog.java
diff --git a/src/net/micode/notes/ui/DropdownMenu.java b/src/main/java/net/micode/notes/ui/DropdownMenu.java
similarity index 100%
rename from src/net/micode/notes/ui/DropdownMenu.java
rename to src/main/java/net/micode/notes/ui/DropdownMenu.java
diff --git a/src/net/micode/notes/ui/FoldersListAdapter.java b/src/main/java/net/micode/notes/ui/FoldersListAdapter.java
similarity index 100%
rename from src/net/micode/notes/ui/FoldersListAdapter.java
rename to src/main/java/net/micode/notes/ui/FoldersListAdapter.java
diff --git a/src/net/micode/notes/ui/NoteEditActivity.java b/src/main/java/net/micode/notes/ui/NoteEditActivity.java
similarity index 95%
rename from src/net/micode/notes/ui/NoteEditActivity.java
rename to src/main/java/net/micode/notes/ui/NoteEditActivity.java
index b0325c3..34e2c8d 100644
--- a/src/net/micode/notes/ui/NoteEditActivity.java
+++ b/src/main/java/net/micode/notes/ui/NoteEditActivity.java
@@ -702,55 +702,41 @@ public class NoteEditActivity extends Activity implements OnClickListener,
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.menu_new_note:
- createNewNote();
- break;
- case R.id.menu_delete:
- // 显示删除确认对话框
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- builder.setTitle(getString(R.string.alert_title_delete));
- builder.setIcon(android.R.drawable.ic_dialog_alert);
- builder.setMessage(getString(R.string.alert_message_delete_note));
- builder.setPositiveButton(android.R.string.ok,
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- deleteCurrentNote();
- finish();
- }
- });
- builder.setNegativeButton(android.R.string.cancel, null);
- builder.show();
- break;
- case R.id.menu_font_size:
- // 显示字体大小选择器
- mFontSizeSelector.setVisibility(View.VISIBLE);
- findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.VISIBLE);
- break;
- case R.id.menu_list_mode:
- // 切换便签模式
- mWorkingNote.setCheckListMode(mWorkingNote.getCheckListMode() == 0 ?
- TextNote.MODE_CHECK_LIST : 0);
- break;
- case R.id.menu_share:
- // 分享便签
- getWorkingText();
- sendTo(this, mWorkingNote.getContent());
- break;
- case R.id.menu_send_to_desktop:
- // 发送到桌面
- sendToDesktop();
- break;
- case R.id.menu_alert:
- // 设置提醒
- setReminder();
- break;
- case R.id.menu_delete_remind:
- // 删除提醒
- mWorkingNote.setAlertDate(0, false);
- break;
- default:
- break;
+ int id = item.getItemId();
+
+ if (id == R.id.menu_new_note) {
+ createNewNote();
+ } else if (id == R.id.menu_delete) {
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ builder.setTitle(getString(R.string.alert_title_delete));
+ builder.setIcon(android.R.drawable.ic_dialog_alert);
+ builder.setMessage(getString(R.string.alert_message_delete_note));
+ builder.setPositiveButton(android.R.string.ok,
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ deleteCurrentNote();
+ finish();
+ }
+ });
+ builder.setNegativeButton(android.R.string.cancel, null);
+ builder.show();
+ } else if (id == R.id.menu_font_size) {
+ mFontSizeSelector.setVisibility(View.VISIBLE);
+ findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.VISIBLE);
+ } else if (id == R.id.menu_list_mode) {
+ mWorkingNote.setCheckListMode(mWorkingNote.getCheckListMode() == 0 ?
+ TextNote.MODE_CHECK_LIST : 0);
+ } else if (id == R.id.menu_share) {
+ getWorkingText();
+ sendTo(this, mWorkingNote.getContent());
+ } else if (id == R.id.menu_send_to_desktop) {
+ sendToDesktop();
+ } else if (id == R.id.menu_alert) {
+ setReminder();
+ } else if (id == R.id.menu_delete_remind) {
+ mWorkingNote.setAlertDate(0, false);
+ } else {
+ // 默认情况,什么也不做
}
return true;
}
diff --git a/src/net/micode/notes/ui/NoteEditText.java b/src/main/java/net/micode/notes/ui/NoteEditText.java
similarity index 100%
rename from src/net/micode/notes/ui/NoteEditText.java
rename to src/main/java/net/micode/notes/ui/NoteEditText.java
diff --git a/src/net/micode/notes/ui/NoteItemData.java b/src/main/java/net/micode/notes/ui/NoteItemData.java
similarity index 84%
rename from src/net/micode/notes/ui/NoteItemData.java
rename to src/main/java/net/micode/notes/ui/NoteItemData.java
index f69b433..d576ddb 100644
--- a/src/net/micode/notes/ui/NoteItemData.java
+++ b/src/main/java/net/micode/notes/ui/NoteItemData.java
@@ -34,18 +34,20 @@ public class NoteItemData {
* 查询投影,包括笔记的各种属性
*/
static final String [] PROJECTION = new String [] {
- 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,
- NoteColumns.TYPE,
- NoteColumns.WIDGET_ID,
- NoteColumns.WIDGET_TYPE,
+ NoteColumns.ID,
+ NoteColumns.ALERTED_DATE,
+ NoteColumns.BG_COLOR_ID,
+ NoteColumns.CREATED_DATE,
+ NoteColumns.HAS_ATTACHMENT,
+ NoteColumns.IS_PINNED,
+ NoteColumns.MODIFIED_DATE,
+ NoteColumns.NOTES_COUNT,
+ NoteColumns.PARENT_ID,
+ NoteColumns.PIN_PRIORITY,
+ NoteColumns.SNIPPET,
+ NoteColumns.TYPE,
+ NoteColumns.WIDGET_ID,
+ NoteColumns.WIDGET_TYPE,
};
/**
@@ -68,34 +70,42 @@ public class NoteItemData {
* 是否有附件列索引
*/
private static final int HAS_ATTACHMENT_COLUMN = 4;
+ /**
+ * 置顶状态列索引
+ */
+ private static final int IS_PINNED_COLUMN = 5;
/**
* 修改日期列索引
*/
- private static final int MODIFIED_DATE_COLUMN = 5;
+ private static final int MODIFIED_DATE_COLUMN = 6;
/**
* 笔记数量列索引
*/
- private static final int NOTES_COUNT_COLUMN = 6;
+ private static final int NOTES_COUNT_COLUMN = 7;
/**
* 父ID列索引
*/
- private static final int PARENT_ID_COLUMN = 7;
+ private static final int PARENT_ID_COLUMN = 8;
+ /**
+ * 置顶优先级列索引
+ */
+ private static final int PIN_PRIORITY_COLUMN = 9;
/**
* 摘要列索引
*/
- private static final int SNIPPET_COLUMN = 8;
+ private static final int SNIPPET_COLUMN = 10;
/**
* 类型列索引
*/
- private static final int TYPE_COLUMN = 9;
+ private static final int TYPE_COLUMN = 11;
/**
* 小部件ID列索引
*/
- private static final int WIDGET_ID_COLUMN = 10;
+ private static final int WIDGET_ID_COLUMN = 12;
/**
* 小部件类型列索引
*/
- private static final int WIDGET_TYPE_COLUMN = 11;
+ private static final int WIDGET_TYPE_COLUMN = 13;
/**
* 笔记ID
@@ -145,6 +155,14 @@ public class NoteItemData {
* 小部件类型
*/
private int mWidgetType;
+ /**
+ * 置顶状态
+ */
+ private boolean mIsPinned;
+ /**
+ * 置顶优先级
+ */
+ private long mPinPriority;
/**
* 联系人姓名
*/
@@ -186,9 +204,11 @@ public class NoteItemData {
mBgColorId = cursor.getInt(BG_COLOR_ID_COLUMN);
mCreatedDate = cursor.getLong(CREATED_DATE_COLUMN);
mHasAttachment = (cursor.getInt(HAS_ATTACHMENT_COLUMN) > 0) ? true : false;
+ mIsPinned = (cursor.getInt(IS_PINNED_COLUMN) > 0) ? true : false;
mModifiedDate = cursor.getLong(MODIFIED_DATE_COLUMN);
mNotesCount = cursor.getInt(NOTES_COUNT_COLUMN);
mParentId = cursor.getLong(PARENT_ID_COLUMN);
+ mPinPriority = cursor.getLong(PIN_PRIORITY_COLUMN);
mSnippet = cursor.getString(SNIPPET_COLUMN);
// 移除勾选标记
mSnippet = mSnippet.replace(NoteEditActivity.TAG_CHECKED, "").replace(
@@ -385,6 +405,22 @@ public class NoteItemData {
return mWidgetType;
}
+ /**
+ * 获取置顶状态
+ * @return 置顶状态
+ */
+ public boolean isPinned() {
+ return mIsPinned;
+ }
+
+ /**
+ * 获取置顶优先级
+ * @return 置顶优先级
+ */
+ public long getPinPriority() {
+ return mPinPriority;
+ }
+
/**
* 获取小部件ID
* @return 小部件ID
diff --git a/src/net/micode/notes/ui/NotesListActivity.java b/src/main/java/net/micode/notes/ui/NotesListActivity.java
similarity index 67%
rename from src/net/micode/notes/ui/NotesListActivity.java
rename to src/main/java/net/micode/notes/ui/NotesListActivity.java
index 75988da..68c768b 100644
--- a/src/net/micode/notes/ui/NotesListActivity.java
+++ b/src/main/java/net/micode/notes/ui/NotesListActivity.java
@@ -78,186 +78,145 @@ import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashSet;
-/**
- * 小米便签列表活动类
- * 显示便签列表,支持创建、查看、编辑、删除便签和文件夹
- * 支持多选操作、搜索功能和同步功能
- */
public class NotesListActivity extends Activity implements OnClickListener, OnItemLongClickListener {
- /**
- * 查询令牌常量
- */
- private static final int FOLDER_NOTE_LIST_QUERY_TOKEN = 0; // 文件夹便签列表查询令牌
- private static final int FOLDER_LIST_QUERY_TOKEN = 1; // 文件夹列表查询令牌
+ private static final int FOLDER_NOTE_LIST_QUERY_TOKEN = 0;
- /**
- * 文件夹上下文菜单常量
- */
- private static final int MENU_FOLDER_DELETE = 0; // 删除文件夹
- private static final int MENU_FOLDER_VIEW = 1; // 查看文件夹
- private static final int MENU_FOLDER_CHANGE_NAME = 2; // 修改文件夹名称
+ private static final int FOLDER_LIST_QUERY_TOKEN = 1;
- /**
- * SharedPreferences键常量
- */
- private static final String PREFERENCE_ADD_INTRODUCTION = "net.micode.notes.introduction"; // 是否添加过介绍便签
+ private static final int MENU_FOLDER_DELETE = 0;
+
+ private static final int MENU_FOLDER_VIEW = 1;
+
+ private static final int MENU_FOLDER_CHANGE_NAME = 2;
+
+ private static final String PREFERENCE_ADD_INTRODUCTION = "net.micode.notes.introduction";
- /**
- * 列表编辑状态枚举
- * - NOTE_LIST:便签列表状态
- * - SUB_FOLDER:子文件夹状态
- * - CALL_RECORD_FOLDER:通话记录文件夹状态
- */
private enum ListEditState {
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;
- /**
- * 原始触摸Y坐标
- */
private int mOriginY;
- /**
- * 分发触摸Y坐标
- */
private int mDispatchY;
- /**
- * 标题栏
- */
private TextView mTitleBar;
- /**
- * 当前文件夹ID
- */
private long mCurrentFolderId;
- /**
- * 内容解析器,用于操作ContentProvider
- */
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 "
+ NoteColumns.NOTES_COUNT + ">0)";
- /**
- * 请求码常量
- */
- private final static int REQUEST_CODE_OPEN_NODE = 102; // 打开便签请求码
- private final static int REQUEST_CODE_NEW_NODE = 103; // 新建便签请求码
+ private final static int REQUEST_CODE_OPEN_NODE = 102;
+ private final static int REQUEST_CODE_NEW_NODE = 103;
- /**
- * 活动创建时调用,初始化界面和资源
- * @param savedInstanceState 保存的实例状态
- */
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setContentView(R.layout.note_list); // 设置布局
- initResources(); // 初始化资源
+ setContentView(R.layout.note_list);
+ initResources();
/**
- * 当用户首次使用应用时插入介绍便签
+ * Insert an introduction when user firstly use this application
*/
setAppInfoFromRawRes();
}
- /**
- * 从其他活动返回时调用
- * @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)) {
- mNotesListAdapter.changeCursor(null); // 清空适配器游标,触发重新查询
+ mNotesListAdapter.changeCursor(null);
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
/**
- * 从原始资源文件中读取介绍信息并创建介绍便签
+ * 切换便签的置顶状态
*/
+ private void togglePinStatus() {
+ new AsyncTask() {
+ @Override
+ protected Boolean doInBackground(Void... unused) {
+ HashSet ids = mNotesListAdapter.getSelectedItemIds();
+ for (Long id : ids) {
+ // 查询当前便签的置顶状态
+ Cursor cursor = mContentResolver.query(Notes.CONTENT_NOTE_URI,
+ new String[] { NoteColumns.IS_PINNED },
+ NoteColumns.ID + "=?",
+ new String[] { String.valueOf(id) },
+ null);
+ if (cursor != null && cursor.moveToFirst()) {
+ boolean isPinned = cursor.getInt(0) > 0;
+ cursor.close();
+
+ // 更新置顶状态
+ ContentValues values = new ContentValues();
+ values.put(NoteColumns.IS_PINNED, isPinned ? 0 : 1);
+ values.put(NoteColumns.PIN_PRIORITY, isPinned ? 0 : System.currentTimeMillis());
+ values.put(NoteColumns.LOCAL_MODIFIED, 1);
+ values.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis());
+
+ mContentResolver.update(Notes.CONTENT_NOTE_URI, values,
+ NoteColumns.ID + "=?",
+ new String[] { String.valueOf(id) });
+ } else if (cursor != null) {
+ cursor.close();
+ }
+ }
+ return true;
+ }
+
+ @Override
+ protected void onPostExecute(Boolean result) {
+ if (result) {
+ startAsyncNotesListQuery();
+ mModeCallBack.finishActionMode();
+ }
+ }
+ }.execute();
+ }
+
private void setAppInfoFromRawRes() {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
- // 如果还没有添加过介绍便签,则创建
if (!sp.getBoolean(PREFERENCE_ADD_INTRODUCTION, false)) {
StringBuilder sb = new StringBuilder();
InputStream in = null;
try {
- in = getResources().openRawResource(R.raw.introduction); // 打开介绍资源文件
+ in = getResources().openRawResource(R.raw.introduction);
if (in != null) {
InputStreamReader isr = new InputStreamReader(in);
BufferedReader br = new BufferedReader(isr);
char [] buf = new char[1024];
int len = 0;
while ((len = br.read(buf)) > 0) {
- sb.append(buf, 0, len); // 读取文件内容
+ sb.append(buf, 0, len);
}
} else {
Log.e(TAG, "Read introduction file error");
@@ -269,7 +228,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
} finally {
if(in != null) {
try {
- in.close(); // 关闭输入流
+ in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
@@ -277,13 +236,12 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
}
}
- // 创建介绍便签
WorkingNote note = WorkingNote.createEmptyNote(this, Notes.ID_ROOT_FOLDER,
AppWidgetManager.INVALID_APPWIDGET_ID, Notes.TYPE_WIDGET_INVALIDE,
ResourceParser.RED);
- note.setWorkingText(sb.toString()); // 设置便签内容
+ note.setWorkingText(sb.toString());
if (note.saveNote()) {
- sp.edit().putBoolean(PREFERENCE_ADD_INTRODUCTION, true).commit(); // 标记已添加介绍便签
+ sp.edit().putBoolean(PREFERENCE_ADD_INTRODUCTION, true).commit();
} else {
Log.e(TAG, "Save introduction note error");
return;
@@ -291,45 +249,34 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
}
}
- /**
- * 活动启动时调用
- */
@Override
protected void onStart() {
super.onStart();
- startAsyncNotesListQuery(); // 异步查询便签列表
+ startAsyncNotesListQuery();
}
- /**
- * 初始化界面资源和变量
- */
private void initResources() {
- mContentResolver = this.getContentResolver(); // 获取内容解析器
- mBackgroundQueryHandler = new BackgroundQueryHandler(this.getContentResolver()); // 创建后台查询处理器
- mCurrentFolderId = Notes.ID_ROOT_FOLDER; // 设置当前文件夹为根文件夹
- mNotesListView = (ListView) findViewById(R.id.notes_list); // 获取便签列表视图
- // 添加列表底部视图
+ mContentResolver = this.getContentResolver();
+ mBackgroundQueryHandler = new BackgroundQueryHandler(this.getContentResolver());
+ mCurrentFolderId = Notes.ID_ROOT_FOLDER;
+ mNotesListView = (ListView) findViewById(R.id.notes_list);
mNotesListView.addFooterView(LayoutInflater.from(this).inflate(R.layout.note_list_footer, null),
null, false);
- mNotesListView.setOnItemClickListener(new OnListItemClickListener()); // 设置列表项点击监听器
- mNotesListView.setOnItemLongClickListener(this); // 设置列表项长按监听器
- mNotesListAdapter = new NotesListAdapter(this); // 创建便签列表适配器
- mNotesListView.setAdapter(mNotesListAdapter); // 设置适配器
- mAddNewNote = (Button) findViewById(R.id.btn_new_note); // 获取新建便签按钮
- mAddNewNote.setOnClickListener(this); // 设置点击监听器
- mAddNewNote.setOnTouchListener(new NewNoteOnTouchListener()); // 设置触摸监听器
- mDispatch = false; // 初始化触摸分发标志
- mDispatchY = 0; // 初始化分发Y坐标
- mOriginY = 0; // 初始化原始Y坐标
- mTitleBar = (TextView) findViewById(R.id.tv_title_bar); // 获取标题栏
- mState = ListEditState.NOTE_LIST; // 初始化状态为便签列表状态
- mModeCallBack = new ModeCallback(); // 创建多选模式回调
+ mNotesListView.setOnItemClickListener(new OnListItemClickListener());
+ mNotesListView.setOnItemLongClickListener(this);
+ mNotesListAdapter = new NotesListAdapter(this);
+ mNotesListView.setAdapter(mNotesListAdapter);
+ mAddNewNote = (Button) findViewById(R.id.btn_new_note);
+ mAddNewNote.setOnClickListener(this);
+ mAddNewNote.setOnTouchListener(new NewNoteOnTouchListener());
+ mDispatch = false;
+ mDispatchY = 0;
+ mOriginY = 0;
+ mTitleBar = (TextView) findViewById(R.id.tv_title_bar);
+ mState = ListEditState.NOTE_LIST;
+ mModeCallBack = new ModeCallback();
}
- /**
- * 列表多选模式回调类
- * 处理多选操作,如删除、移动便签等
- */
private class ModeCallback implements ListView.MultiChoiceModeListener, OnMenuItemClickListener {
private DropdownMenu mDropDownMenu;
private ActionMode mActionMode;
@@ -346,6 +293,16 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
mMoveMenu.setVisible(true);
mMoveMenu.setOnMenuItemClickListener(this);
}
+ // 添加置顶/取消置顶菜单项
+ MenuItem pinMenu = menu.findItem(R.id.pin);
+ if (pinMenu != null) {
+ if (mFocusNoteDataItem.isPinned()) {
+ pinMenu.setTitle(R.string.menu_unpin);
+ } else {
+ pinMenu.setTitle(R.string.menu_pin);
+ }
+ pinMenu.setOnMenuItemClickListener(this);
+ }
mActionMode = mode;
mNotesListAdapter.setChoiceMode(true);
mNotesListView.setLongClickable(false);
@@ -406,7 +363,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
}
public void onItemCheckedStateChanged(ActionMode mode, int position, long id,
- boolean checked) {
+ boolean checked) {
mNotesListAdapter.setCheckedItem(position, checked);
updateMenu();
}
@@ -418,37 +375,32 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
return true;
}
- switch (item.getItemId()) {
- case R.id.delete:
- AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this);
- builder.setTitle(getString(R.string.alert_title_delete));
- builder.setIcon(android.R.drawable.ic_dialog_alert);
- builder.setMessage(getString(R.string.alert_message_delete_notes,
- mNotesListAdapter.getSelectedCount()));
- builder.setPositiveButton(android.R.string.ok,
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog,
- int which) {
- batchDelete();
- }
- });
- builder.setNegativeButton(android.R.string.cancel, null);
- builder.show();
- break;
- case R.id.move:
- startQueryDestinationFolders();
- break;
- default:
- return false;
+ if (item.getItemId() == R.id.delete) {
+ AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this);
+ builder.setTitle(getString(R.string.alert_title_delete));
+ builder.setIcon(android.R.drawable.ic_dialog_alert);
+ builder.setMessage(getString(R.string.alert_message_delete_notes,
+ mNotesListAdapter.getSelectedCount()));
+ builder.setPositiveButton(android.R.string.ok,
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog,
+ int which) {
+ batchDelete();
+ }
+ });
+ builder.setNegativeButton(android.R.string.cancel, null);
+ builder.show();
+ } else if (item.getItemId() == R.id.move) {
+ startQueryDestinationFolders();
+ } else if (item.getItemId() == R.id.pin) {
+ togglePinStatus();
+ } else {
+ return false;
}
return true;
}
}
- /**
- * 新建便签按钮触摸监听器
- * 处理新建便签按钮的触摸事件,支持将透明区域的触摸事件分发给列表视图
- */
private class NewNoteOnTouchListener implements OnTouchListener {
public boolean onTouch(View v, MotionEvent event) {
@@ -460,17 +412,20 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
int start = screenHeight - newNoteViewHeight;
int eventY = start + (int) event.getY();
/**
- * 减去标题栏高度
+ * Minus TitleBar's height
*/
if (mState == ListEditState.SUB_FOLDER) {
eventY -= mTitleBar.getHeight();
start -= mTitleBar.getHeight();
}
/**
- * HACKME:当点击"新建便签"按钮的透明部分时,将事件分发给按钮后面的列表视图。
- * "新建便签"按钮的透明部分可以用公式y=-0.12x+94(单位:像素)和按钮顶部的线来表示。
- * 坐标基于"新建便签"按钮的左侧。94表示透明部分的最大高度。
- * 注意,如果按钮的背景发生变化,公式也应该变化。这是为了满足UI设计师的强烈要求。
+ * HACKME:When click the transparent part of "New Note" button, dispatch
+ * the event to the list view behind this button. The transparent part of
+ * "New Note" button could be expressed by formula y=-0.12x+94(Unit:pixel)
+ * and the line top of the button. The coordinate based on left of the "New
+ * Note" button. The 94 represents maximum height of the transparent part.
+ * Notice that, if the background of the button changes, the formula should
+ * also change. This is very bad, just for the UI designer's strong requirement.
*/
if (event.getY() < (event.getX() * (-0.12) + 94)) {
View view = mNotesListView.getChildAt(mNotesListView.getChildCount() - 1
@@ -508,48 +463,30 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
};
- /**
- * 异步查询便签列表
- */
private void startAsyncNotesListQuery() {
- // 根据当前文件夹ID选择查询条件
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");
+ String.valueOf(mCurrentFolderId)
+ }, NoteColumns.IS_PINNED + " DESC," + NoteColumns.PIN_PRIORITY + " DESC,"
+ + NoteColumns.TYPE + " DESC," + NoteColumns.MODIFIED_DATE + " DESC");
}
- /**
- * 后台查询处理器
- * 用于异步处理数据库查询操作
- */
private final class BackgroundQueryHandler extends AsyncQueryHandler {
- /**
- * 构造方法
- * @param contentResolver 内容解析器
- */
public BackgroundQueryHandler(ContentResolver contentResolver) {
super(contentResolver);
}
- /**
- * 查询完成时回调
- * @param token 查询令牌
- * @param cookie 查询时传递的额外数据
- * @param cursor 查询结果游标
- */
@Override
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
switch (token) {
- case FOLDER_NOTE_LIST_QUERY_TOKEN: // 文件夹便签列表查询完成
- mNotesListAdapter.changeCursor(cursor); // 更新适配器游标
+ case FOLDER_NOTE_LIST_QUERY_TOKEN:
+ mNotesListAdapter.changeCursor(cursor);
break;
- case FOLDER_LIST_QUERY_TOKEN: // 文件夹列表查询完成
+ case FOLDER_LIST_QUERY_TOKEN:
if (cursor != null && cursor.getCount() > 0) {
- showFolderListMenu(cursor); // 显示文件夹列表菜单
+ showFolderListMenu(cursor);
} else {
Log.e(TAG, "Query folder failed");
}
@@ -560,64 +497,48 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
}
}
- /**
- * 显示文件夹列表菜单
- * @param cursor 文件夹列表游标
- */
private void showFolderListMenu(Cursor cursor) {
AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this);
- builder.setTitle(R.string.menu_title_select_folder); // 设置对话框标题
- final FoldersListAdapter adapter = new FoldersListAdapter(this, cursor); // 创建文件夹列表适配器
+ builder.setTitle(R.string.menu_title_select_folder);
+ final FoldersListAdapter adapter = new FoldersListAdapter(this, cursor);
builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
- // 批量移动选中的便签到目标文件夹
DataUtils.batchMoveToFolder(mContentResolver,
mNotesListAdapter.getSelectedItemIds(), adapter.getItemId(which));
- // 显示移动成功提示
Toast.makeText(
NotesListActivity.this,
getString(R.string.format_move_notes_to_folder,
mNotesListAdapter.getSelectedCount(),
adapter.getFolderName(NotesListActivity.this, which)),
Toast.LENGTH_SHORT).show();
- mModeCallBack.finishActionMode(); // 结束多选模式
+ mModeCallBack.finishActionMode();
}
});
- builder.show(); // 显示对话框
+ builder.show();
}
- /**
- * 创建新便签
- */
private void createNewNote() {
- Intent intent = new Intent(this, NoteEditActivity.class); // 创建跳转到编辑活动的意图
- intent.setAction(Intent.ACTION_INSERT_OR_EDIT); // 设置动作
- intent.putExtra(Notes.INTENT_EXTRA_FOLDER_ID, mCurrentFolderId); // 设置文件夹ID
- this.startActivityForResult(intent, REQUEST_CODE_NEW_NODE); // 启动活动
+ Intent intent = new Intent(this, NoteEditActivity.class);
+ intent.setAction(Intent.ACTION_INSERT_OR_EDIT);
+ intent.putExtra(Notes.INTENT_EXTRA_FOLDER_ID, mCurrentFolderId);
+ this.startActivityForResult(intent, REQUEST_CODE_NEW_NODE);
}
- /**
- * 批量删除便签
- */
private void batchDelete() {
new AsyncTask>() {
- /**
- * 后台执行删除操作
- * @param unused 未使用的参数
- * @return 关联的小部件集合
- */
protected HashSet doInBackground(Void... unused) {
- HashSet widgets = mNotesListAdapter.getSelectedWidget(); // 获取选中便签关联的小部件
+ HashSet widgets = mNotesListAdapter.getSelectedWidget();
if (!isSyncMode()) {
- // 如果不是同步模式,直接删除便签
+ // if not synced, delete notes directly
if (DataUtils.batchDeleteNotes(mContentResolver, mNotesListAdapter
.getSelectedItemIds())) {
} else {
Log.e(TAG, "Delete notes error, should not happens");
}
} else {
- // 如果是同步模式,将便签移到回收站
+ // in sync mode, we'll move the deleted note into the trash
+ // folder
if (!DataUtils.batchMoveToFolder(mContentResolver, mNotesListAdapter
.getSelectedItemIds(), Notes.ID_TRASH_FOLER)) {
Log.e(TAG, "Move notes to trash folder error, should not happens");
@@ -626,13 +547,8 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
return widgets;
}
- /**
- * 后台操作完成后执行
- * @param widgets 关联的小部件集合
- */
@Override
protected void onPostExecute(HashSet widgets) {
- // 更新关联的小部件
if (widgets != null) {
for (AppWidgetAttribute widget : widgets) {
if (widget.widgetId != AppWidgetManager.INVALID_APPWIDGET_ID
@@ -641,17 +557,12 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
}
}
}
- mModeCallBack.finishActionMode(); // 结束多选模式
+ mModeCallBack.finishActionMode();
}
}.execute();
}
- /**
- * 删除文件夹
- * @param folderId 文件夹ID
- */
private void deleteFolder(long folderId) {
- // 根文件夹不能删除
if (folderId == Notes.ID_ROOT_FOLDER) {
Log.e(TAG, "Wrong folder id, should not happen " + folderId);
return;
@@ -659,17 +570,15 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
HashSet ids = new HashSet();
ids.add(folderId);
- // 获取文件夹中便签关联的小部件
HashSet widgets = DataUtils.getFolderNoteWidget(mContentResolver,
folderId);
if (!isSyncMode()) {
- // 如果不是同步模式,直接删除文件夹
+ // if not synced, delete folder directly
DataUtils.batchDeleteNotes(mContentResolver, ids);
} else {
- // 如果是同步模式,将文件夹移到回收站
+ // in sync mode, we'll move the deleted folder into the trash folder
DataUtils.batchMoveToFolder(mContentResolver, ids, Notes.ID_TRASH_FOLER);
}
- // 更新关联的小部件
if (widgets != null) {
for (AppWidgetAttribute widget : widgets) {
if (widget.widgetId != AppWidgetManager.INVALID_APPWIDGET_ID
@@ -680,56 +589,36 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
}
}
- /**
- * 打开便签进行查看或编辑
- * @param data 便签数据项
- */
private void openNode(NoteItemData data) {
- Intent intent = new Intent(this, NoteEditActivity.class); // 创建跳转到编辑活动的意图
- intent.setAction(Intent.ACTION_VIEW); // 设置动作为查看
- intent.putExtra(Intent.EXTRA_UID, data.getId()); // 设置便签ID
- this.startActivityForResult(intent, REQUEST_CODE_OPEN_NODE); // 启动活动
+ Intent intent = new Intent(this, NoteEditActivity.class);
+ intent.setAction(Intent.ACTION_VIEW);
+ intent.putExtra(Intent.EXTRA_UID, data.getId());
+ this.startActivityForResult(intent, REQUEST_CODE_OPEN_NODE);
}
- /**
- * 打开文件夹,显示文件夹中的便签
- * @param data 文件夹数据项
- */
private void openFolder(NoteItemData data) {
- mCurrentFolderId = data.getId(); // 设置当前文件夹ID
- startAsyncNotesListQuery(); // 异步查询文件夹中的便签
+ mCurrentFolderId = data.getId();
+ startAsyncNotesListQuery();
if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) {
- mState = ListEditState.CALL_RECORD_FOLDER; // 设置状态为通话记录文件夹
- mAddNewNote.setVisibility(View.GONE); // 隐藏新建便签按钮
+ mState = ListEditState.CALL_RECORD_FOLDER;
+ mAddNewNote.setVisibility(View.GONE);
} else {
- mState = ListEditState.SUB_FOLDER; // 设置状态为子文件夹
+ mState = ListEditState.SUB_FOLDER;
}
- // 设置标题栏文本
if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) {
mTitleBar.setText(R.string.call_record_folder_name);
} else {
mTitleBar.setText(data.getSnippet());
}
- mTitleBar.setVisibility(View.VISIBLE); // 显示标题栏
+ mTitleBar.setVisibility(View.VISIBLE);
}
- /**
- * 点击事件处理
- * @param v 点击的视图
- */
public void onClick(View v) {
- switch (v.getId()) {
- case R.id.btn_new_note: // 点击新建便签按钮
- createNewNote(); // 创建新便签
- break;
- default:
- break;
+ if (v.getId() == R.id.btn_new_note) {
+ createNewNote();
}
}
- /**
- * 显示输入法
- */
private void showSoftInput() {
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (inputMethodManager != null) {
@@ -737,92 +626,74 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
}
}
- /**
- * 隐藏输入法
- * @param view 视图对象
- */
private void hideSoftInput(View view) {
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
- /**
- * 显示创建或修改文件夹对话框
- * @param create 是否创建新文件夹,true为创建,false为修改
- */
private void showCreateOrModifyFolderDialog(final boolean create) {
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
- View view = LayoutInflater.from(this).inflate(R.layout.dialog_edit_text, null); // 加载对话框布局
- final EditText etName = (EditText) view.findViewById(R.id.et_foler_name); // 获取文件夹名称输入框
- showSoftInput(); // 显示输入法
-
- // 设置对话框标题和输入框内容
+ View view = LayoutInflater.from(this).inflate(R.layout.dialog_edit_text, null);
+ final EditText etName = (EditText) view.findViewById(R.id.et_foler_name);
+ showSoftInput();
if (!create) {
if (mFocusNoteDataItem != null) {
- etName.setText(mFocusNoteDataItem.getSnippet()); // 设置现有文件夹名称
- builder.setTitle(getString(R.string.menu_folder_change_name)); // 设置标题为修改文件夹名称
+ etName.setText(mFocusNoteDataItem.getSnippet());
+ builder.setTitle(getString(R.string.menu_folder_change_name));
} else {
Log.e(TAG, "The long click data item is null");
return;
}
} else {
- etName.setText(""); // 清空输入框
- builder.setTitle(this.getString(R.string.menu_create_folder)); // 设置标题为创建文件夹
+ etName.setText("");
+ builder.setTitle(this.getString(R.string.menu_create_folder));
}
- builder.setPositiveButton(android.R.string.ok, null); // 设置确定按钮
+ builder.setPositiveButton(android.R.string.ok, null);
builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
- hideSoftInput(etName); // 隐藏输入法
+ hideSoftInput(etName);
}
- }); // 设置取消按钮
+ });
- final Dialog dialog = builder.setView(view).show(); // 显示对话框
- final Button positive = (Button)dialog.findViewById(android.R.id.button1); // 获取确定按钮
+ final Dialog dialog = builder.setView(view).show();
+ final Button positive = (Button)dialog.findViewById(android.R.id.button1);
positive.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
- hideSoftInput(etName); // 隐藏输入法
- String name = etName.getText().toString(); // 获取输入的文件夹名称
-
- // 检查文件夹名称是否已存在
+ hideSoftInput(etName);
+ String name = etName.getText().toString();
if (DataUtils.checkVisibleFolderName(mContentResolver, name)) {
Toast.makeText(NotesListActivity.this, getString(R.string.folder_exist, name),
Toast.LENGTH_LONG).show();
- etName.setSelection(0, etName.length()); // 选中输入框内容
+ etName.setSelection(0, etName.length());
return;
}
-
if (!create) {
- // 修改现有文件夹
if (!TextUtils.isEmpty(name)) {
ContentValues values = new ContentValues();
- values.put(NoteColumns.SNIPPET, name); // 设置新名称
- values.put(NoteColumns.TYPE, Notes.TYPE_FOLDER); // 设置类型为文件夹
- values.put(NoteColumns.LOCAL_MODIFIED, 1); // 标记为本地修改
- // 更新数据库
+ values.put(NoteColumns.SNIPPET, name);
+ values.put(NoteColumns.TYPE, Notes.TYPE_FOLDER);
+ values.put(NoteColumns.LOCAL_MODIFIED, 1);
mContentResolver.update(Notes.CONTENT_NOTE_URI, values, NoteColumns.ID
+ "=?", new String[] {
- String.valueOf(mFocusNoteDataItem.getId())
+ String.valueOf(mFocusNoteDataItem.getId())
});
}
} else if (!TextUtils.isEmpty(name)) {
- // 创建新文件夹
ContentValues values = new ContentValues();
- values.put(NoteColumns.SNIPPET, name); // 设置文件夹名称
- values.put(NoteColumns.TYPE, Notes.TYPE_FOLDER); // 设置类型为文件夹
- // 插入数据库
+ values.put(NoteColumns.SNIPPET, name);
+ values.put(NoteColumns.TYPE, Notes.TYPE_FOLDER);
mContentResolver.insert(Notes.CONTENT_NOTE_URI, values);
}
- dialog.dismiss(); // 关闭对话框
+ dialog.dismiss();
}
});
- // 如果输入框为空,禁用确定按钮
if (TextUtils.isEmpty(etName.getText())) {
positive.setEnabled(false);
}
/**
- * 当文件夹名称输入框为空时,禁用确定按钮
+ * When the name edit text is null, disable the positive button
*/
etName.addTextChangedListener(new TextWatcher() {
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
@@ -832,9 +703,9 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (TextUtils.isEmpty(etName.getText())) {
- positive.setEnabled(false); // 输入框为空,禁用确定按钮
+ positive.setEnabled(false);
} else {
- positive.setEnabled(true); // 输入框不为空,启用确定按钮
+ positive.setEnabled(true);
}
}
@@ -845,42 +716,32 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
});
}
- /**
- * 处理返回键事件
- */
@Override
public void onBackPressed() {
switch (mState) {
- case SUB_FOLDER: // 子文件夹状态
- mCurrentFolderId = Notes.ID_ROOT_FOLDER; // 返回根文件夹
- mState = ListEditState.NOTE_LIST; // 设置状态为便签列表
- startAsyncNotesListQuery(); // 异步查询便签列表
- mTitleBar.setVisibility(View.GONE); // 隐藏标题栏
+ case SUB_FOLDER:
+ mCurrentFolderId = Notes.ID_ROOT_FOLDER;
+ mState = ListEditState.NOTE_LIST;
+ startAsyncNotesListQuery();
+ mTitleBar.setVisibility(View.GONE);
break;
- case CALL_RECORD_FOLDER: // 通话记录文件夹状态
- mCurrentFolderId = Notes.ID_ROOT_FOLDER; // 返回根文件夹
- mState = ListEditState.NOTE_LIST; // 设置状态为便签列表
- mAddNewNote.setVisibility(View.VISIBLE); // 显示新建便签按钮
- mTitleBar.setVisibility(View.GONE); // 隐藏标题栏
- startAsyncNotesListQuery(); // 异步查询便签列表
+ case CALL_RECORD_FOLDER:
+ mCurrentFolderId = Notes.ID_ROOT_FOLDER;
+ mState = ListEditState.NOTE_LIST;
+ mAddNewNote.setVisibility(View.VISIBLE);
+ mTitleBar.setVisibility(View.GONE);
+ startAsyncNotesListQuery();
break;
- case NOTE_LIST: // 便签列表状态
- super.onBackPressed(); // 执行默认返回操作
+ case NOTE_LIST:
+ super.onBackPressed();
break;
default:
break;
}
}
- /**
- * 更新小部件
- * @param appWidgetId 小部件ID
- * @param appWidgetType 小部件类型
- */
private void updateWidget(int appWidgetId, int appWidgetType) {
- Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE); // 创建小部件更新意图
-
- // 根据小部件类型设置相应的小部件提供者
+ Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
if (appWidgetType == Notes.TYPE_WIDGET_2X) {
intent.setClass(this, NoteWidgetProvider_2x.class);
} else if (appWidgetType == Notes.TYPE_WIDGET_4X) {
@@ -891,11 +752,11 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
}
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] {
- appWidgetId
- }); // 设置小部件ID
+ appWidgetId
+ });
- sendBroadcast(intent); // 发送广播更新小部件
- setResult(RESULT_OK, intent); // 设置结果
+ sendBroadcast(intent);
+ setResult(RESULT_OK, intent);
}
private final OnCreateContextMenuListener mFolderOnCreateContextMenuListener = new OnCreateContextMenuListener() {
@@ -971,40 +832,26 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
@Override
public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.menu_new_folder: {
- showCreateOrModifyFolderDialog(true);
- break;
- }
- case R.id.menu_export_text: {
- exportNoteToText();
- break;
- }
- case R.id.menu_sync: {
- if (isSyncMode()) {
- if (TextUtils.equals(item.getTitle(), getString(R.string.menu_sync))) {
- GTaskSyncService.startSync(this);
- } else {
- GTaskSyncService.cancelSync(this);
- }
+ if (item.getItemId() == R.id.menu_new_folder) {
+ showCreateOrModifyFolderDialog(true);
+ } else if (item.getItemId() == R.id.menu_export_text) {
+ exportNoteToText();
+ } else if (item.getItemId() == R.id.menu_sync) {
+ if (isSyncMode()) {
+ if (TextUtils.equals(item.getTitle(), getString(R.string.menu_sync))) {
+ GTaskSyncService.startSync(this);
} else {
- startPreferenceActivity();
+ GTaskSyncService.cancelSync(this);
}
- break;
- }
- case R.id.menu_setting: {
+ } else {
startPreferenceActivity();
- break;
}
- case R.id.menu_new_note: {
- createNewNote();
- break;
- }
- case R.id.menu_search:
- onSearchRequested();
- break;
- default:
- break;
+ } else if (item.getItemId() == R.id.menu_setting) {
+ startPreferenceActivity();
+ } else if (item.getItemId() == R.id.menu_new_note) {
+ createNewNote();
+ } else if (item.getItemId() == R.id.menu_search) {
+ onSearchRequested();
}
return true;
}
@@ -1111,7 +958,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
private void startQueryDestinationFolders() {
String selection = NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>? AND " + NoteColumns.ID + "<>?";
selection = (mState == ListEditState.NOTE_LIST) ? selection:
- "(" + selection + ") OR (" + NoteColumns.ID + "=" + Notes.ID_ROOT_FOLDER + ")";
+ "(" + selection + ") OR (" + NoteColumns.ID + "=" + Notes.ID_ROOT_FOLDER + ")";
mBackgroundQueryHandler.startQuery(FOLDER_LIST_QUERY_TOKEN,
null,
diff --git a/src/net/micode/notes/ui/NotesListAdapter.java b/src/main/java/net/micode/notes/ui/NotesListAdapter.java
similarity index 100%
rename from src/net/micode/notes/ui/NotesListAdapter.java
rename to src/main/java/net/micode/notes/ui/NotesListAdapter.java
diff --git a/src/net/micode/notes/ui/NotesListItem.java b/src/main/java/net/micode/notes/ui/NotesListItem.java
similarity index 92%
rename from src/net/micode/notes/ui/NotesListItem.java
rename to src/main/java/net/micode/notes/ui/NotesListItem.java
index 7afd3c3..21abae5 100644
--- a/src/net/micode/notes/ui/NotesListItem.java
+++ b/src/main/java/net/micode/notes/ui/NotesListItem.java
@@ -33,11 +33,15 @@ import net.micode.notes.tool.ResourceParser.NoteItemBgResources;
/**
* 笔记列表项,用于显示笔记列表中的单个笔记项
*/
-public class NotesListItem extends LinearLayout {
+public class NotesListItem extends LinearLayout {
/**
* 提醒图标
*/
private ImageView mAlert;
+ /**
+ * 置顶图标
+ */
+ private ImageView mPinned;
/**
* 标题文本
*/
@@ -69,6 +73,7 @@ public class NotesListItem extends LinearLayout {
inflate(context, R.layout.note_item, this);
// 初始化控件
mAlert = (ImageView) findViewById(R.id.iv_alert_icon);
+ mPinned = (ImageView) findViewById(R.id.iv_pinned_icon);
mTitle = (TextView) findViewById(R.id.tv_title);
mTime = (TextView) findViewById(R.id.tv_time);
mCallName = (TextView) findViewById(R.id.tv_name);
@@ -123,7 +128,7 @@ public class NotesListItem extends LinearLayout {
// 文件夹
mTitle.setText(data.getSnippet()
+ context.getString(R.string.format_folder_files_count,
- data.getNotesCount()));
+ data.getNotesCount()));
mAlert.setVisibility(View.GONE);
} else {
// 普通笔记
@@ -135,6 +140,12 @@ public class NotesListItem extends LinearLayout {
} else {
mAlert.setVisibility(View.GONE);
}
+ // 设置置顶图标
+ if (data.isPinned()) {
+ mPinned.setVisibility(View.VISIBLE);
+ } else {
+ mPinned.setVisibility(View.GONE);
+ }
}
}
// 设置修改时间
diff --git a/src/net/micode/notes/ui/NotesPreferenceActivity.java b/src/main/java/net/micode/notes/ui/NotesPreferenceActivity.java
similarity index 100%
rename from src/net/micode/notes/ui/NotesPreferenceActivity.java
rename to src/main/java/net/micode/notes/ui/NotesPreferenceActivity.java
diff --git a/src/main/java/net/micode/notes/widget.zip b/src/main/java/net/micode/notes/widget.zip
new file mode 100644
index 0000000..8a37adc
Binary files /dev/null and b/src/main/java/net/micode/notes/widget.zip differ
diff --git a/src/net/micode/notes/widget/NoteWidgetProvider.java b/src/main/java/net/micode/notes/widget/NoteWidgetProvider.java
similarity index 100%
rename from src/net/micode/notes/widget/NoteWidgetProvider.java
rename to src/main/java/net/micode/notes/widget/NoteWidgetProvider.java
diff --git a/src/net/micode/notes/widget/NoteWidgetProvider_2x.java b/src/main/java/net/micode/notes/widget/NoteWidgetProvider_2x.java
similarity index 100%
rename from src/net/micode/notes/widget/NoteWidgetProvider_2x.java
rename to src/main/java/net/micode/notes/widget/NoteWidgetProvider_2x.java
diff --git a/src/net/micode/notes/widget/NoteWidgetProvider_4x.java b/src/main/java/net/micode/notes/widget/NoteWidgetProvider_4x.java
similarity index 100%
rename from src/net/micode/notes/widget/NoteWidgetProvider_4x.java
rename to src/main/java/net/micode/notes/widget/NoteWidgetProvider_4x.java
diff --git a/src/main/res/color/primary_text_dark.xml b/src/main/res/color/primary_text_dark.xml
new file mode 100644
index 0000000..7c85459
--- /dev/null
+++ b/src/main/res/color/primary_text_dark.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/color/secondary_text_dark.xml b/src/main/res/color/secondary_text_dark.xml
new file mode 100644
index 0000000..c1c2384
--- /dev/null
+++ b/src/main/res/color/secondary_text_dark.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/drawable-hdpi/bg_btn_set_color.png b/src/main/res/drawable-hdpi/bg_btn_set_color.png
new file mode 100644
index 0000000..5eb5d44
Binary files /dev/null and b/src/main/res/drawable-hdpi/bg_btn_set_color.png differ
diff --git a/src/main/res/drawable-hdpi/bg_color_btn_mask.png b/src/main/res/drawable-hdpi/bg_color_btn_mask.png
new file mode 100644
index 0000000..100db77
Binary files /dev/null and b/src/main/res/drawable-hdpi/bg_color_btn_mask.png differ
diff --git a/src/main/res/drawable-hdpi/call_record.png b/src/main/res/drawable-hdpi/call_record.png
new file mode 100644
index 0000000..fb88ca4
Binary files /dev/null and b/src/main/res/drawable-hdpi/call_record.png differ
diff --git a/src/main/res/drawable-hdpi/clock.png b/src/main/res/drawable-hdpi/clock.png
new file mode 100644
index 0000000..5f2ae9a
Binary files /dev/null and b/src/main/res/drawable-hdpi/clock.png differ
diff --git a/src/main/res/drawable-hdpi/delete.png b/src/main/res/drawable-hdpi/delete.png
new file mode 100644
index 0000000..643de3e
Binary files /dev/null and b/src/main/res/drawable-hdpi/delete.png differ
diff --git a/src/main/res/drawable-hdpi/dropdown_icon.9.png b/src/main/res/drawable-hdpi/dropdown_icon.9.png
new file mode 100644
index 0000000..5525025
Binary files /dev/null and b/src/main/res/drawable-hdpi/dropdown_icon.9.png differ
diff --git a/src/main/res/drawable-hdpi/edit_blue.9.png b/src/main/res/drawable-hdpi/edit_blue.9.png
new file mode 100644
index 0000000..55a1856
Binary files /dev/null and b/src/main/res/drawable-hdpi/edit_blue.9.png differ
diff --git a/src/main/res/drawable-hdpi/edit_green.9.png b/src/main/res/drawable-hdpi/edit_green.9.png
new file mode 100644
index 0000000..2cb2d60
Binary files /dev/null and b/src/main/res/drawable-hdpi/edit_green.9.png differ
diff --git a/src/main/res/drawable-hdpi/edit_red.9.png b/src/main/res/drawable-hdpi/edit_red.9.png
new file mode 100644
index 0000000..bae944a
Binary files /dev/null and b/src/main/res/drawable-hdpi/edit_red.9.png differ
diff --git a/src/main/res/drawable-hdpi/edit_title_blue.9.png b/src/main/res/drawable-hdpi/edit_title_blue.9.png
new file mode 100644
index 0000000..96e6092
Binary files /dev/null and b/src/main/res/drawable-hdpi/edit_title_blue.9.png differ
diff --git a/src/main/res/drawable-hdpi/edit_title_green.9.png b/src/main/res/drawable-hdpi/edit_title_green.9.png
new file mode 100644
index 0000000..08d8644
Binary files /dev/null and b/src/main/res/drawable-hdpi/edit_title_green.9.png differ
diff --git a/src/main/res/drawable-hdpi/edit_title_red.9.png b/src/main/res/drawable-hdpi/edit_title_red.9.png
new file mode 100644
index 0000000..9c430e5
Binary files /dev/null and b/src/main/res/drawable-hdpi/edit_title_red.9.png differ
diff --git a/src/main/res/drawable-hdpi/edit_title_white.9.png b/src/main/res/drawable-hdpi/edit_title_white.9.png
new file mode 100644
index 0000000..19e8d95
Binary files /dev/null and b/src/main/res/drawable-hdpi/edit_title_white.9.png differ
diff --git a/src/main/res/drawable-hdpi/edit_title_yellow.9.png b/src/main/res/drawable-hdpi/edit_title_yellow.9.png
new file mode 100644
index 0000000..bf8f580
Binary files /dev/null and b/src/main/res/drawable-hdpi/edit_title_yellow.9.png differ
diff --git a/src/main/res/drawable-hdpi/edit_white.9.png b/src/main/res/drawable-hdpi/edit_white.9.png
new file mode 100644
index 0000000..918f7a6
Binary files /dev/null and b/src/main/res/drawable-hdpi/edit_white.9.png differ
diff --git a/src/main/res/drawable-hdpi/edit_yellow.9.png b/src/main/res/drawable-hdpi/edit_yellow.9.png
new file mode 100644
index 0000000..10cb642
Binary files /dev/null and b/src/main/res/drawable-hdpi/edit_yellow.9.png differ
diff --git a/src/main/res/drawable-hdpi/font_large.png b/src/main/res/drawable-hdpi/font_large.png
new file mode 100644
index 0000000..78cf2e6
Binary files /dev/null and b/src/main/res/drawable-hdpi/font_large.png differ
diff --git a/src/main/res/drawable-hdpi/font_normal.png b/src/main/res/drawable-hdpi/font_normal.png
new file mode 100644
index 0000000..9de7ced
Binary files /dev/null and b/src/main/res/drawable-hdpi/font_normal.png differ
diff --git a/src/main/res/drawable-hdpi/font_size_selector_bg.9.png b/src/main/res/drawable-hdpi/font_size_selector_bg.9.png
new file mode 100644
index 0000000..be8e64c
Binary files /dev/null and b/src/main/res/drawable-hdpi/font_size_selector_bg.9.png differ
diff --git a/src/main/res/drawable-hdpi/font_small.png b/src/main/res/drawable-hdpi/font_small.png
new file mode 100644
index 0000000..d3ff104
Binary files /dev/null and b/src/main/res/drawable-hdpi/font_small.png differ
diff --git a/src/main/res/drawable-hdpi/font_super.png b/src/main/res/drawable-hdpi/font_super.png
new file mode 100644
index 0000000..85b13a1
Binary files /dev/null and b/src/main/res/drawable-hdpi/font_super.png differ
diff --git a/src/main/res/drawable-hdpi/icon_app.png b/src/main/res/drawable-hdpi/icon_app.png
new file mode 100644
index 0000000..418aadc
Binary files /dev/null and b/src/main/res/drawable-hdpi/icon_app.png differ
diff --git a/src/main/res/drawable-hdpi/list_background.png b/src/main/res/drawable-hdpi/list_background.png
new file mode 100644
index 0000000..087e1f9
Binary files /dev/null and b/src/main/res/drawable-hdpi/list_background.png differ
diff --git a/src/main/res/drawable-hdpi/list_blue_down.9.png b/src/main/res/drawable-hdpi/list_blue_down.9.png
new file mode 100644
index 0000000..b88eebf
Binary files /dev/null and b/src/main/res/drawable-hdpi/list_blue_down.9.png differ
diff --git a/src/main/res/drawable-hdpi/list_blue_middle.9.png b/src/main/res/drawable-hdpi/list_blue_middle.9.png
new file mode 100644
index 0000000..96b1c8b
Binary files /dev/null and b/src/main/res/drawable-hdpi/list_blue_middle.9.png differ
diff --git a/src/main/res/drawable-hdpi/list_blue_single.9.png b/src/main/res/drawable-hdpi/list_blue_single.9.png
new file mode 100644
index 0000000..d7e7206
Binary files /dev/null and b/src/main/res/drawable-hdpi/list_blue_single.9.png differ
diff --git a/src/main/res/drawable-hdpi/list_blue_up.9.png b/src/main/res/drawable-hdpi/list_blue_up.9.png
new file mode 100644
index 0000000..632e88c
Binary files /dev/null and b/src/main/res/drawable-hdpi/list_blue_up.9.png differ
diff --git a/src/main/res/drawable-hdpi/list_folder.9.png b/src/main/res/drawable-hdpi/list_folder.9.png
new file mode 100644
index 0000000..829f61b
Binary files /dev/null and b/src/main/res/drawable-hdpi/list_folder.9.png differ
diff --git a/src/main/res/drawable-hdpi/list_footer_bg.9.png b/src/main/res/drawable-hdpi/list_footer_bg.9.png
new file mode 100644
index 0000000..5325c25
Binary files /dev/null and b/src/main/res/drawable-hdpi/list_footer_bg.9.png differ
diff --git a/src/main/res/drawable-hdpi/list_green_down.9.png b/src/main/res/drawable-hdpi/list_green_down.9.png
new file mode 100644
index 0000000..64a39d9
Binary files /dev/null and b/src/main/res/drawable-hdpi/list_green_down.9.png differ
diff --git a/src/main/res/drawable-hdpi/list_green_middle.9.png b/src/main/res/drawable-hdpi/list_green_middle.9.png
new file mode 100644
index 0000000..897325a
Binary files /dev/null and b/src/main/res/drawable-hdpi/list_green_middle.9.png differ
diff --git a/src/main/res/drawable-hdpi/list_green_single.9.png b/src/main/res/drawable-hdpi/list_green_single.9.png
new file mode 100644
index 0000000..c83405f
Binary files /dev/null and b/src/main/res/drawable-hdpi/list_green_single.9.png differ
diff --git a/src/main/res/drawable-hdpi/list_green_up.9.png b/src/main/res/drawable-hdpi/list_green_up.9.png
new file mode 100644
index 0000000..141f9e1
Binary files /dev/null and b/src/main/res/drawable-hdpi/list_green_up.9.png differ
diff --git a/src/main/res/drawable-hdpi/list_red_down.9.png b/src/main/res/drawable-hdpi/list_red_down.9.png
new file mode 100644
index 0000000..4224309
Binary files /dev/null and b/src/main/res/drawable-hdpi/list_red_down.9.png differ
diff --git a/src/main/res/drawable-hdpi/list_red_middle.9.png b/src/main/res/drawable-hdpi/list_red_middle.9.png
new file mode 100644
index 0000000..9988f17
Binary files /dev/null and b/src/main/res/drawable-hdpi/list_red_middle.9.png differ
diff --git a/src/main/res/drawable-hdpi/list_red_single.9.png b/src/main/res/drawable-hdpi/list_red_single.9.png
new file mode 100644
index 0000000..587c348
Binary files /dev/null and b/src/main/res/drawable-hdpi/list_red_single.9.png differ
diff --git a/src/main/res/drawable-hdpi/list_red_up.9.png b/src/main/res/drawable-hdpi/list_red_up.9.png
new file mode 100644
index 0000000..46b4757
Binary files /dev/null and b/src/main/res/drawable-hdpi/list_red_up.9.png differ
diff --git a/src/main/res/drawable-hdpi/list_white_down.9.png b/src/main/res/drawable-hdpi/list_white_down.9.png
new file mode 100644
index 0000000..29f9d8c
Binary files /dev/null and b/src/main/res/drawable-hdpi/list_white_down.9.png differ
diff --git a/src/main/res/drawable-hdpi/list_white_middle.9.png b/src/main/res/drawable-hdpi/list_white_middle.9.png
new file mode 100644
index 0000000..77a4ab4
Binary files /dev/null and b/src/main/res/drawable-hdpi/list_white_middle.9.png differ
diff --git a/src/main/res/drawable-hdpi/list_white_single.9.png b/src/main/res/drawable-hdpi/list_white_single.9.png
new file mode 100644
index 0000000..3e79189
Binary files /dev/null and b/src/main/res/drawable-hdpi/list_white_single.9.png differ
diff --git a/src/main/res/drawable-hdpi/list_white_up.9.png b/src/main/res/drawable-hdpi/list_white_up.9.png
new file mode 100644
index 0000000..e23cd5c
Binary files /dev/null and b/src/main/res/drawable-hdpi/list_white_up.9.png differ
diff --git a/src/main/res/drawable-hdpi/list_yellow_down.9.png b/src/main/res/drawable-hdpi/list_yellow_down.9.png
new file mode 100644
index 0000000..31cfc1e
Binary files /dev/null and b/src/main/res/drawable-hdpi/list_yellow_down.9.png differ
diff --git a/src/main/res/drawable-hdpi/list_yellow_middle.9.png b/src/main/res/drawable-hdpi/list_yellow_middle.9.png
new file mode 100644
index 0000000..b6549b2
Binary files /dev/null and b/src/main/res/drawable-hdpi/list_yellow_middle.9.png differ
diff --git a/src/main/res/drawable-hdpi/list_yellow_single.9.png b/src/main/res/drawable-hdpi/list_yellow_single.9.png
new file mode 100644
index 0000000..3faf507
Binary files /dev/null and b/src/main/res/drawable-hdpi/list_yellow_single.9.png differ
diff --git a/src/main/res/drawable-hdpi/list_yellow_up.9.png b/src/main/res/drawable-hdpi/list_yellow_up.9.png
new file mode 100644
index 0000000..4ae791c
Binary files /dev/null and b/src/main/res/drawable-hdpi/list_yellow_up.9.png differ
diff --git a/src/main/res/drawable-hdpi/menu_delete.png b/src/main/res/drawable-hdpi/menu_delete.png
new file mode 100644
index 0000000..ccdfc4b
Binary files /dev/null and b/src/main/res/drawable-hdpi/menu_delete.png differ
diff --git a/src/main/res/drawable-hdpi/menu_move.png b/src/main/res/drawable-hdpi/menu_move.png
new file mode 100644
index 0000000..1140b71
Binary files /dev/null and b/src/main/res/drawable-hdpi/menu_move.png differ
diff --git a/src/main/res/drawable-hdpi/new_note_normal.png b/src/main/res/drawable-hdpi/new_note_normal.png
new file mode 100644
index 0000000..e24e0d1
Binary files /dev/null and b/src/main/res/drawable-hdpi/new_note_normal.png differ
diff --git a/src/main/res/drawable-hdpi/new_note_pressed.png b/src/main/res/drawable-hdpi/new_note_pressed.png
new file mode 100644
index 0000000..c748936
Binary files /dev/null and b/src/main/res/drawable-hdpi/new_note_pressed.png differ
diff --git a/src/main/res/drawable-hdpi/note_edit_color_selector_panel.png b/src/main/res/drawable-hdpi/note_edit_color_selector_panel.png
new file mode 100644
index 0000000..fc49552
Binary files /dev/null and b/src/main/res/drawable-hdpi/note_edit_color_selector_panel.png differ
diff --git a/src/main/res/drawable-hdpi/notification.png b/src/main/res/drawable-hdpi/notification.png
new file mode 100644
index 0000000..b13ab4a
Binary files /dev/null and b/src/main/res/drawable-hdpi/notification.png differ
diff --git a/src/main/res/drawable-hdpi/search_result.png b/src/main/res/drawable-hdpi/search_result.png
new file mode 100644
index 0000000..ff2befd
Binary files /dev/null and b/src/main/res/drawable-hdpi/search_result.png differ
diff --git a/src/main/res/drawable-hdpi/selected.png b/src/main/res/drawable-hdpi/selected.png
new file mode 100644
index 0000000..b889bef
Binary files /dev/null and b/src/main/res/drawable-hdpi/selected.png differ
diff --git a/src/main/res/drawable-hdpi/title_alert.png b/src/main/res/drawable-hdpi/title_alert.png
new file mode 100644
index 0000000..544ee9c
Binary files /dev/null and b/src/main/res/drawable-hdpi/title_alert.png differ
diff --git a/src/main/res/drawable-hdpi/title_bar_bg.9.png b/src/main/res/drawable-hdpi/title_bar_bg.9.png
new file mode 100644
index 0000000..eb6bff0
Binary files /dev/null and b/src/main/res/drawable-hdpi/title_bar_bg.9.png differ
diff --git a/src/main/res/drawable-hdpi/widget_2x_blue.png b/src/main/res/drawable-hdpi/widget_2x_blue.png
new file mode 100644
index 0000000..a1707f4
Binary files /dev/null and b/src/main/res/drawable-hdpi/widget_2x_blue.png differ
diff --git a/src/main/res/drawable-hdpi/widget_2x_green.png b/src/main/res/drawable-hdpi/widget_2x_green.png
new file mode 100644
index 0000000..f86886c
Binary files /dev/null and b/src/main/res/drawable-hdpi/widget_2x_green.png differ
diff --git a/src/main/res/drawable-hdpi/widget_2x_red.png b/src/main/res/drawable-hdpi/widget_2x_red.png
new file mode 100644
index 0000000..0e66c29
Binary files /dev/null and b/src/main/res/drawable-hdpi/widget_2x_red.png differ
diff --git a/src/main/res/drawable-hdpi/widget_2x_white.png b/src/main/res/drawable-hdpi/widget_2x_white.png
new file mode 100644
index 0000000..5f0619a
Binary files /dev/null and b/src/main/res/drawable-hdpi/widget_2x_white.png differ
diff --git a/src/main/res/drawable-hdpi/widget_2x_yellow.png b/src/main/res/drawable-hdpi/widget_2x_yellow.png
new file mode 100644
index 0000000..12d1c2b
Binary files /dev/null and b/src/main/res/drawable-hdpi/widget_2x_yellow.png differ
diff --git a/src/main/res/drawable-hdpi/widget_4x_blue.png b/src/main/res/drawable-hdpi/widget_4x_blue.png
new file mode 100644
index 0000000..9183738
Binary files /dev/null and b/src/main/res/drawable-hdpi/widget_4x_blue.png differ
diff --git a/src/main/res/drawable-hdpi/widget_4x_green.png b/src/main/res/drawable-hdpi/widget_4x_green.png
new file mode 100644
index 0000000..fa8b452
Binary files /dev/null and b/src/main/res/drawable-hdpi/widget_4x_green.png differ
diff --git a/src/main/res/drawable-hdpi/widget_4x_red.png b/src/main/res/drawable-hdpi/widget_4x_red.png
new file mode 100644
index 0000000..62de074
Binary files /dev/null and b/src/main/res/drawable-hdpi/widget_4x_red.png differ
diff --git a/src/main/res/drawable-hdpi/widget_4x_white.png b/src/main/res/drawable-hdpi/widget_4x_white.png
new file mode 100644
index 0000000..a37d67c
Binary files /dev/null and b/src/main/res/drawable-hdpi/widget_4x_white.png differ
diff --git a/src/main/res/drawable-hdpi/widget_4x_yellow.png b/src/main/res/drawable-hdpi/widget_4x_yellow.png
new file mode 100644
index 0000000..d7c5fa4
Binary files /dev/null and b/src/main/res/drawable-hdpi/widget_4x_yellow.png differ
diff --git a/src/main/res/drawable/ic_launcher_background.xml b/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/res/drawable/ic_launcher_foreground.xml b/src/main/res/drawable/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/src/main/res/drawable/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/drawable/ic_pinned.xml b/src/main/res/drawable/ic_pinned.xml
new file mode 100644
index 0000000..f392502
--- /dev/null
+++ b/src/main/res/drawable/ic_pinned.xml
@@ -0,0 +1,10 @@
+
+
+
\ No newline at end of file
diff --git a/src/main/res/drawable/new_note.xml b/src/main/res/drawable/new_note.xml
new file mode 100644
index 0000000..2154ebc
--- /dev/null
+++ b/src/main/res/drawable/new_note.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
diff --git a/src/main/res/layout/account_dialog_title.xml b/src/main/res/layout/account_dialog_title.xml
new file mode 100644
index 0000000..7717112
--- /dev/null
+++ b/src/main/res/layout/account_dialog_title.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/layout/activity_main.xml b/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..86a5d97
--- /dev/null
+++ b/src/main/res/layout/activity_main.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/layout/add_account_text.xml b/src/main/res/layout/add_account_text.xml
new file mode 100644
index 0000000..c799178
--- /dev/null
+++ b/src/main/res/layout/add_account_text.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/layout/datetime_picker.xml b/src/main/res/layout/datetime_picker.xml
new file mode 100644
index 0000000..f10d592
--- /dev/null
+++ b/src/main/res/layout/datetime_picker.xml
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/layout/dialog_edit_text.xml b/src/main/res/layout/dialog_edit_text.xml
new file mode 100644
index 0000000..361b39a
--- /dev/null
+++ b/src/main/res/layout/dialog_edit_text.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/layout/folder_list_item.xml b/src/main/res/layout/folder_list_item.xml
new file mode 100644
index 0000000..77e8148
--- /dev/null
+++ b/src/main/res/layout/folder_list_item.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/layout/note_edit.xml b/src/main/res/layout/note_edit.xml
new file mode 100644
index 0000000..ac3cad0
--- /dev/null
+++ b/src/main/res/layout/note_edit.xml
@@ -0,0 +1,402 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/res/layout/note_edit_list_item.xml b/src/main/res/layout/note_edit_list_item.xml
new file mode 100644
index 0000000..a885f9c
--- /dev/null
+++ b/src/main/res/layout/note_edit_list_item.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/res/layout/note_item.xml b/src/main/res/layout/note_item.xml
new file mode 100644
index 0000000..3c7e739
--- /dev/null
+++ b/src/main/res/layout/note_item.xml
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/res/layout/note_list.xml b/src/main/res/layout/note_list.xml
new file mode 100644
index 0000000..f8fd0ce
--- /dev/null
+++ b/src/main/res/layout/note_list.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/res/layout/note_list_dropdown_menu.xml b/src/main/res/layout/note_list_dropdown_menu.xml
new file mode 100644
index 0000000..3fa271d
--- /dev/null
+++ b/src/main/res/layout/note_list_dropdown_menu.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/layout/note_list_footer.xml b/src/main/res/layout/note_list_footer.xml
new file mode 100644
index 0000000..5ca7b22
--- /dev/null
+++ b/src/main/res/layout/note_list_footer.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/layout/settings_header.xml b/src/main/res/layout/settings_header.xml
new file mode 100644
index 0000000..5eb8c50
--- /dev/null
+++ b/src/main/res/layout/settings_header.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/layout/widget_2x.xml b/src/main/res/layout/widget_2x.xml
new file mode 100644
index 0000000..55970ce
--- /dev/null
+++ b/src/main/res/layout/widget_2x.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
diff --git a/src/main/res/layout/widget_4x.xml b/src/main/res/layout/widget_4x.xml
new file mode 100644
index 0000000..dc9bb51
--- /dev/null
+++ b/src/main/res/layout/widget_4x.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/res/menu/call_note_edit.xml b/src/main/res/menu/call_note_edit.xml
new file mode 100644
index 0000000..02c0528
--- /dev/null
+++ b/src/main/res/menu/call_note_edit.xml
@@ -0,0 +1,48 @@
+
+
+
+
+
diff --git a/src/main/res/menu/call_record_folder.xml b/src/main/res/menu/call_record_folder.xml
new file mode 100644
index 0000000..c664346
--- /dev/null
+++ b/src/main/res/menu/call_record_folder.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
diff --git a/src/main/res/menu/note_edit.xml b/src/main/res/menu/note_edit.xml
new file mode 100644
index 0000000..35cacd1
--- /dev/null
+++ b/src/main/res/menu/note_edit.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/menu/note_list.xml b/src/main/res/menu/note_list.xml
new file mode 100644
index 0000000..42ea736
--- /dev/null
+++ b/src/main/res/menu/note_list.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
diff --git a/src/main/res/menu/note_list_dropdown.xml b/src/main/res/menu/note_list_dropdown.xml
new file mode 100644
index 0000000..7cbaadc
--- /dev/null
+++ b/src/main/res/menu/note_list_dropdown.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/menu/note_list_options.xml b/src/main/res/menu/note_list_options.xml
new file mode 100644
index 0000000..109bbba
--- /dev/null
+++ b/src/main/res/menu/note_list_options.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/menu/sub_folder.xml b/src/main/res/menu/sub_folder.xml
new file mode 100644
index 0000000..b00de26
--- /dev/null
+++ b/src/main/res/menu/sub_folder.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/mipmap-anydpi/ic_launcher.xml b/src/main/res/mipmap-anydpi/ic_launcher.xml
new file mode 100644
index 0000000..6f3b755
--- /dev/null
+++ b/src/main/res/mipmap-anydpi/ic_launcher.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/mipmap-anydpi/ic_launcher_round.xml b/src/main/res/mipmap-anydpi/ic_launcher_round.xml
new file mode 100644
index 0000000..6f3b755
--- /dev/null
+++ b/src/main/res/mipmap-anydpi/ic_launcher_round.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/mipmap-hdpi/ic_launcher.webp b/src/main/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 0000000..c209e78
Binary files /dev/null and b/src/main/res/mipmap-hdpi/ic_launcher.webp differ
diff --git a/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/src/main/res/mipmap-hdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..b2dfe3d
Binary files /dev/null and b/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ
diff --git a/src/main/res/mipmap-mdpi/ic_launcher.webp b/src/main/res/mipmap-mdpi/ic_launcher.webp
new file mode 100644
index 0000000..4f0f1d6
Binary files /dev/null and b/src/main/res/mipmap-mdpi/ic_launcher.webp differ
diff --git a/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/src/main/res/mipmap-mdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..62b611d
Binary files /dev/null and b/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ
diff --git a/src/main/res/mipmap-xhdpi/ic_launcher.webp b/src/main/res/mipmap-xhdpi/ic_launcher.webp
new file mode 100644
index 0000000..948a307
Binary files /dev/null and b/src/main/res/mipmap-xhdpi/ic_launcher.webp differ
diff --git a/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..1b9a695
Binary files /dev/null and b/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ
diff --git a/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/src/main/res/mipmap-xxhdpi/ic_launcher.webp
new file mode 100644
index 0000000..28d4b77
Binary files /dev/null and b/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ
diff --git a/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..9287f50
Binary files /dev/null and b/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ
diff --git a/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
new file mode 100644
index 0000000..aa7d642
Binary files /dev/null and b/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ
diff --git a/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..9126ae3
Binary files /dev/null and b/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ
diff --git a/src/main/res/raw-zh-rCN/introduction b/src/main/res/raw-zh-rCN/introduction
new file mode 100644
index 0000000..7188359
--- /dev/null
+++ b/src/main/res/raw-zh-rCN/introduction
@@ -0,0 +1,7 @@
+欢迎使用MIUI便签!
+
+ 无论从软件中直接添加,还是从桌面拖出widget,MIUI便签能让你快速建立和保存便签;
+
+ 除了调整文字大小、便签背景、文件夹等基础功能外,你会发现MIUI便签也提供了清单模式、便签提醒、软件加密、导出到SD卡、同步google task的高级功能,让你的生活记录更加美好和安全;
+
+ 来分享你的使用体验吧:http://www.miui.com/index.php
diff --git a/src/main/res/raw/introduction b/src/main/res/raw/introduction
new file mode 100644
index 0000000..269cf7b
--- /dev/null
+++ b/src/main/res/raw/introduction
@@ -0,0 +1 @@
+Welcome to use MIUI notes!
\ No newline at end of file
diff --git a/src/main/res/values-night/themes.xml b/src/main/res/values-night/themes.xml
new file mode 100644
index 0000000..d2c68d1
--- /dev/null
+++ b/src/main/res/values-night/themes.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/values-zh-rCN/arrays.xml b/src/main/res/values-zh-rCN/arrays.xml
new file mode 100644
index 0000000..a092386
--- /dev/null
+++ b/src/main/res/values-zh-rCN/arrays.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+ - 短信
+ - 邮件
+
+
\ No newline at end of file
diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..09f75ed
--- /dev/null
+++ b/src/main/res/values-zh-rCN/strings.xml
@@ -0,0 +1,126 @@
+
+
+
+
+
+ 便签
+ 便签2x2
+ 便签4x4
+ 没有关联内容,点击新建便签。
+ 访客模式下,便签内容不可见
+ ...
+ 新建便签
+ 成功删除提醒
+ 创建提醒
+ 已过期
+ yyyyMMdd
+ MM月dd日 kk:mm
+ 知道了
+ 查看
+ 呼叫电话
+ 发送邮件
+ 浏览网页
+ 打开地图
+
+ 新建文件夹
+ 导出文本
+ 同步
+ 取消同步
+ 设置
+ 搜索
+ 删除
+ 移动到文件夹
+ 选中了 %d 项
+ 没有选中项,操作无效
+ 全选
+ 取消全选
+ 文字大小
+ 小
+ 正常
+ 大
+ 超大
+ 进入清单模式
+ 退出清单模式
+ 查看文件夹
+ 刪除文件夹
+ 修改文件夹名称
+ 文件夹 %1$s 已存在,请重新命名
+ 分享
+ 发送到桌面
+ 提醒我
+ 删除提醒
+ 选择文件夹
+ 上一级文件夹
+ 已添加到桌面
+ 删除
+ 确认要删除所选的 %d 条便签吗?
+ 确认要删除该条便签吗?
+ 确认删除文件夹及所包含的便签吗?
+ 已将所选 %1$d 条便签移到 %2$s 文件夹
+
+ SD卡被占用,不能操作
+ 导出文本时发生错误,请检查SD卡
+ 要查看的便签不存在
+ 不能为空便签设置闹钟提醒
+ 不能将空便签发送到桌面
+ 导出成功
+ 导出失败
+ 已将文本文件(%1$s)输出至SD卡(%2$s)目录
+
+ 同步便签...
+ 同步成功
+ 同步失败
+ 同步已取消
+ 与%1$s同步成功
+ 同步失败,请检查网络和帐号设置
+ 同步失败,发生内部错误
+ 同步已取消
+ 登录%1$s...
+ 正在获取服务器便签列表...
+ 正在同步本地便签...
+
+ 设置
+ 同步账号
+ 与google task同步便签记录
+ 上次同步于 %1$s
+ 添加账号
+ 更换账号
+ 删除账号
+ 取消
+ 立即同步
+ 取消同步
+ 当前帐号 %1$s
+ 如更换同步帐号,过去的帐号同步信息将被清空,再次切换的同时可能会造成数据重复
+ 同步便签
+ 请选择google帐号,便签将与该帐号的google task内容同步。
+ 正在同步中,不能修改同步帐号
+ 同步帐号已设置为%1$s
+ 新建便签背景颜色随机
+ 删除
+ 通话便签
+ 请输入名称
+ 正在搜索便签
+ 搜索便签
+ 便签中的文字
+ 便签
+ 设置
+ 取消
+
+ - %1$s 条符合“%2$s”的搜索结果
+
+
+
diff --git a/src/main/res/values-zh-rTW/arrays.xml b/src/main/res/values-zh-rTW/arrays.xml
new file mode 100644
index 0000000..5297209
--- /dev/null
+++ b/src/main/res/values-zh-rTW/arrays.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+ - 短信
+ - 郵件
+
+
\ No newline at end of file
diff --git a/src/main/res/values-zh-rTW/strings.xml b/src/main/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..3c41894
--- /dev/null
+++ b/src/main/res/values-zh-rTW/strings.xml
@@ -0,0 +1,127 @@
+
+
+
+
+
+ 便簽
+ 便簽2x2
+ 便簽4x4
+ 沒有關聯內容,點擊新建便簽。
+ 訪客模式下,便籤內容不可見
+ ...
+ 新建便簽
+ 成功刪除提醒
+ 創建提醒
+ 已過期
+ yyyyMMdd
+ MM月dd日 kk:mm
+ 知道了
+ 查看
+ 呼叫電話
+ 發送郵件
+ 浏覽網頁
+ 打開地圖
+ 已將所選 %1$d 便籤移到 %2$s 文件夾
+
+ 新建文件夾
+ 導出文本
+ 同步
+ 取消同步
+ 設置
+ 搜尋
+ 刪除
+ 移動到文件夾
+ 選中了 %d 項
+ 沒有選中項,操作無效
+ 全選
+ 取消全選
+ 文字大小
+ 小
+ 正常
+ 大
+ 超大
+ 進入清單模式
+ 退出清單模式
+ 查看文件夾
+ 刪除文件夾
+ 修改文件夾名稱
+ 文件夾 %1$s 已存在,請重新命名
+ 分享
+ 發送到桌面
+ 提醒我
+ 刪除提醒
+ 選擇文件夾
+ 上一級文件夾
+ 已添加到桌面
+ 刪除
+ 确认要刪除所選的 %d 條便籤嗎?
+ 确认要删除該條便籤嗎?
+ 確認刪除檔夾及所包含的便簽嗎?
+ SD卡被佔用,不能操作
+ 導出TXT時發生錯誤,請檢查SD卡
+ 要查看的便籤不存在
+ 不能爲空便籤設置鬧鐘提醒
+ 不能將空便籤發送到桌面
+ 導出成功
+ 導出失敗
+ 已將文本文件(%1$s)導出至SD(%2$s)目錄
+
+ 同步便簽...
+ 同步成功
+ 同步失敗
+ 同步已取消
+ 與%1$s同步成功
+ 同步失敗,請檢查網絡和帳號設置
+ 同步失敗,發生內部錯誤
+ 同步已取消
+ 登陸%1$s...
+ 正在獲取服務器便籤列表...
+ 正在同步本地便籤...
+
+ 設置
+ 同步賬號
+ 与google task同步便簽記錄
+ 上次同步于 %1$s
+ 添加賬號
+ 更換賬號
+ 刪除賬號
+ 取消
+ 立即同步
+ 取消同步
+ 當前帳號 %1$s
+ 如更換同步帳號,過去的帳號同步信息將被清空,再次切換的同時可能會造成數據重復
+ 同步便簽
+ 請選擇google帳號,便簽將與該帳號的google task內容同步。
+ 正在同步中,不能修改同步帳號
+ 同步帳號已設置為%1$s
+ 新建便籤背景顏色隨機
+
+ 刪除
+ 通話便籤
+ 請輸入名稱
+
+ 正在搜索便籤
+ 搜索便籤
+ 便籤中的文字
+ 便籤
+ 設置
+ 取消
+
+ - %1$s 條符合”%2$s“的搜尋結果
+
+
+
diff --git a/src/main/res/values/arrays.xml b/src/main/res/values/arrays.xml
new file mode 100644
index 0000000..e00210b
--- /dev/null
+++ b/src/main/res/values/arrays.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+ - -%s
+ - --%s
+ - --%s
+ - --%s
+
+
+
+ - Messaging
+ - Email
+
+
\ No newline at end of file
diff --git a/src/main/res/values/colors.xml b/src/main/res/values/colors.xml
new file mode 100644
index 0000000..123ffbf
--- /dev/null
+++ b/src/main/res/values/colors.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+ #335b5b5b
+
diff --git a/src/main/res/values/dimens.xml b/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..194e84f
--- /dev/null
+++ b/src/main/res/values/dimens.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+ 33sp
+ 26sp
+ 20sp
+ 17sp
+ 14sp
+
\ No newline at end of file
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
new file mode 100644
index 0000000..4929a71
--- /dev/null
+++ b/src/main/res/values/strings.xml
@@ -0,0 +1,137 @@
+
+
+
+
+
+ Notes
+ Notes 2x2
+ Notes 4x4
+ No associated note found, click to create associated note.
+ Privacy mode,can not see note content
+ ...
+ Add note
+ Delete reminder successfully
+ Set reminder
+ Expired
+ yyyyMMdd
+ MMMd kk:mm
+ Got it
+ Take a look
+ Call
+ Send email
+ Browse web
+ Open map
+
+ /MIUI/notes/
+ notes_%s.txt
+
+ (%d)
+ New Folder
+ Export text
+ Sync
+ Cancel syncing
+ Settings
+ Search
+ Delete
+ Move to folder
+ Pin
+ Unpin
+ %d selected
+ Nothing selected, the operation is invalid
+ Select all
+ Deselect all
+ Font size
+ Small
+ Medium
+ Large
+ Super
+ Enter check list
+ Leave check list
+ View folder
+ Delete folder
+ Change folder name
+ The folder %1$s exist, please rename
+ Share
+ Send to home
+ Remind me
+ Delete reminder
+ Select folder
+ Parent folder
+ Note added to home
+ Confirm to delete folder and its notes?
+ Delete selected notes
+ Confirm to delete the selected %d notes?
+ Confirm to delete this note?
+ Have moved selected %1$d notes to %2$s folder
+
+ SD card busy, not available now
+ Export failed, please check SD card
+ The note is not exist
+ Sorry, can not set clock on empty note
+ Sorry, can not send and empty note to home
+ Export successful
+ Export fail
+ Export text file (%1$s) to SD (%2$s) directory
+
+ Syncing notes...
+ Sync is successful
+ Sync is failed
+ Sync is canceled
+ Sync is successful with account %1$s
+ Sync failed, please check network and account settings
+ Sync failed, internal error occurs
+ Sync is canceled
+ Logging into %1$s...
+ Getting remote note list...
+ Synchronize local notes with Google Task...
+
+ Settings
+ Sync account
+ Sync notes with google task
+ Last sync time %1$s
+ yyyy-MM-dd hh:mm:ss
+ Add account
+ Change sync account
+ Remove sync account
+ Cancel
+ Sync immediately
+ Cancel syncing
+ Current account %1$s
+ All sync related information will be deleted, which may result in duplicated items sometime
+ Sync notes
+ Please select a google account. Local notes will be synced with google task.
+ Cannot change the account because sync is in progress
+ %1$s has been set as the sync account
+ New note background color random
+
+ Delete
+ Call notes
+ Input name
+
+ Searching Notes
+ Search notes
+ Text in your notes
+ Notes
+ set
+ cancel
+
+ - %1$s result for \"%2$s\"
+
+ - %1$s results for \"%2$s\"
+
+
+
diff --git a/src/main/res/values/styles.xml b/src/main/res/values/styles.xml
new file mode 100644
index 0000000..65a6dec
--- /dev/null
+++ b/src/main/res/values/styles.xml
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/values/themes.xml b/src/main/res/values/themes.xml
new file mode 100644
index 0000000..7c616ff
--- /dev/null
+++ b/src/main/res/values/themes.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/xml/backup_rules.xml b/src/main/res/xml/backup_rules.xml
new file mode 100644
index 0000000..4df9255
--- /dev/null
+++ b/src/main/res/xml/backup_rules.xml
@@ -0,0 +1,13 @@
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/xml/data_extraction_rules.xml b/src/main/res/xml/data_extraction_rules.xml
new file mode 100644
index 0000000..9ee9997
--- /dev/null
+++ b/src/main/res/xml/data_extraction_rules.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/xml/preferences.xml b/src/main/res/xml/preferences.xml
new file mode 100644
index 0000000..fe58f8f
--- /dev/null
+++ b/src/main/res/xml/preferences.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/res/xml/searchable.xml b/src/main/res/xml/searchable.xml
new file mode 100644
index 0000000..bf74f14
--- /dev/null
+++ b/src/main/res/xml/searchable.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
diff --git a/src/main/res/xml/widget_2x_info.xml b/src/main/res/xml/widget_2x_info.xml
new file mode 100644
index 0000000..ac8b225
--- /dev/null
+++ b/src/main/res/xml/widget_2x_info.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
diff --git a/src/main/res/xml/widget_4x_info.xml b/src/main/res/xml/widget_4x_info.xml
new file mode 100644
index 0000000..cf79f9c
--- /dev/null
+++ b/src/main/res/xml/widget_4x_info.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
diff --git a/src/net/micode/notes/.idea/misc.xml b/src/net/micode/notes/.idea/misc.xml
deleted file mode 100644
index f03c948..0000000
--- a/src/net/micode/notes/.idea/misc.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/net/micode/notes/.idea/modules.xml b/src/net/micode/notes/.idea/modules.xml
deleted file mode 100644
index c6dc8de..0000000
--- a/src/net/micode/notes/.idea/modules.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/net/micode/notes/.idea/vcs.xml b/src/net/micode/notes/.idea/vcs.xml
deleted file mode 100644
index 4fce1d8..0000000
--- a/src/net/micode/notes/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/net/micode/notes/.idea/workspace.xml b/src/net/micode/notes/.idea/workspace.xml
deleted file mode 100644
index f5db70a..0000000
--- a/src/net/micode/notes/.idea/workspace.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {
- "associatedIndex": 1
-}
-
-
-
-
-
- {
- "keyToString": {
- "ModuleVcsDetector.initialDetectionPerformed": "true",
- "RunOnceActivity.ShowReadmeOnStart": "true",
- "RunOnceActivity.git.unshallow": "true",
- "git-widget-placeholder": "master",
- "kotlin-language-version-configured": "true",
- "last_opened_file_path": "D:/自用/self/word/dasan/软件工程/git-test/src/net/micode/notes",
- "node.js.detected.package.eslint": "true",
- "node.js.detected.package.tslint": "true",
- "node.js.selected.package.eslint": "(autodetect)",
- "node.js.selected.package.tslint": "(autodetect)",
- "nodejs_package_manager_path": "npm",
- "project.structure.last.edited": "模块",
- "project.structure.proportion": "0.0",
- "project.structure.side.proportion": "0.0",
- "settings.editor.selected.configurable": "reference.settings.ide.settings.uml",
- "vue.rearranger.settings.migration": "true"
- }
-}
-
-
-
-
-
-
-
-
-
-
-
- 1764689658197
-
-
- 1764689658197
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/net/micode/notes/notes.iml b/src/net/micode/notes/notes.iml
deleted file mode 100644
index d542a26..0000000
--- a/src/net/micode/notes/notes.iml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file