diff --git a/src/Notes-master/src/net/micode/notes/data/Notes.java b/src/Notes-master/src/net/micode/notes/data/Notes.java index 52cd670..afb0840 100644 --- a/src/Notes-master/src/net/micode/notes/data/Notes.java +++ b/src/Notes-master/src/net/micode/notes/data/Notes.java @@ -90,7 +90,7 @@ public class Notes { // 查询数据表的URI public static final Uri CONTENT_DATA_URI = Uri.parse("content://" + AUTHORITY + "/data"); - /** + /** * Uri to query trash notes */ public static final Uri CONTENT_TRASH_URI = Uri.parse("content://" + AUTHORITY + "/trash"); @@ -153,13 +153,19 @@ public class Notes { // 版本号 public static final String VERSION = "version"; - /** + /** * Whether the note is encrypted *
Type : INTEGER (0 = not encrypted, 1 = encrypted)
*/ public static final String IS_ENCRYPTED = "is_encrypted"; + + /** + * Background image URI for the note + *Type : TEXT
+ */ + public static final String BACKGROUND_IMAGE_URI = "background_image_uri"; } - public interface TrashColumns extends NoteColumns { + public interface TrashColumns extends NoteColumns { /** * Deleted date for trash note *Type: INTEGER (long)
diff --git a/src/Notes-master/src/net/micode/notes/data/NotesDatabaseHelper.java b/src/Notes-master/src/net/micode/notes/data/NotesDatabaseHelper.java index 94dc63d..35c17b2 100644 --- a/src/Notes-master/src/net/micode/notes/data/NotesDatabaseHelper.java +++ b/src/Notes-master/src/net/micode/notes/data/NotesDatabaseHelper.java @@ -30,7 +30,7 @@ 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 = 8; + private static final int DB_VERSION = 9; public interface TABLE { public static final String NOTE = "note"; @@ -38,9 +38,9 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { public static final String DATA = "data"; public static final String TRASH = "trash_note"; - + public static final String TRASH_DATA = "trash_data"; - + public static final String ENCRYPTED_NOTE_PASSWORD = "encrypted_note_password"; } @@ -49,214 +49,216 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { private static NotesDatabaseHelper mInstance; 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," + - NoteColumns.IS_ENCRYPTED + " 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_ENCRYPTED + " INTEGER NOT NULL DEFAULT 0," + + NoteColumns.BACKGROUND_IMAGE_URI + " TEXT NOT NULL DEFAULT ''" + + ")"; 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 CREATE_TRASH_TABLE_SQL = - "CREATE TABLE " + TABLE.TRASH + "(" + - 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_ENCRYPTED + " INTEGER NOT NULL DEFAULT 0," + - "deleted_date INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)" + - ")"; + "CREATE TABLE " + TABLE.TRASH + "(" + + 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_ENCRYPTED + " INTEGER NOT NULL DEFAULT 0," + + NoteColumns.BACKGROUND_IMAGE_URI + " TEXT NOT NULL DEFAULT ''," + + "deleted_date INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)" + + ")"; private static final String CREATE_TRASH_DATA_TABLE_SQL = - "CREATE TABLE " + TABLE.TRASH_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.TRASH_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_ENCRYPTED_NOTE_PASSWORD_TABLE_SQL = - "CREATE TABLE " + TABLE.ENCRYPTED_NOTE_PASSWORD + "(" + - NoteColumns.ID + " INTEGER PRIMARY KEY," + - "password TEXT NOT NULL," + - "FOREIGN KEY(" + NoteColumns.ID + ") REFERENCES " + TABLE.NOTE + "(" + NoteColumns.ID + ") ON DELETE CASCADE" + - ")"; + "CREATE TABLE " + TABLE.ENCRYPTED_NOTE_PASSWORD + "(" + + NoteColumns.ID + " INTEGER PRIMARY KEY," + + "password TEXT NOT NULL," + + "FOREIGN KEY(" + NoteColumns.ID + ") REFERENCES " + TABLE.NOTE + "(" + NoteColumns.ID + ") ON DELETE CASCADE" + + ")"; /** * Increase folder's note count when move note to the folder */ 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"; /** * Decrease folder's note count when move note from folder */ 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"; /** * Increase folder's note count when insert new note to the folder */ 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"; /** * Decrease folder's note count when delete note from the folder */ 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"; /** * Update note's content when insert data with type {@link DataConstants#NOTE} */ 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"; /** * Update note's content when data with {@link DataConstants#NOTE} type has changed */ 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"; /** * Update note's content when data with {@link DataConstants#NOTE} type has deleted */ 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"; /** * Delete datas belong to note which has been deleted */ 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"; /** * Delete notes belong to folder which has been deleted */ 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"; /** * Move notes belong to folder which has been moved to trash folder */ 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); @@ -409,6 +411,11 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { oldVersion++; } + if (oldVersion == 8) { + upgradeToV9(db); + oldVersion++; + } + if (reCreateTriggers) { reCreateNoteTableTriggers(db); reCreateDataTableTriggers(db); @@ -474,13 +481,22 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { createTrashDataTable(db); Log.d(TAG, "Upgraded to version 7: created trash_data table"); } - + private void upgradeToV8(SQLiteDatabase db) { // 升级到版本8,添加标签支持 // 标签数据将存储在现有的data表中,使用新的MIME类型 Log.d(TAG, "Upgraded to version 8: added tag support"); } + private void upgradeToV9(SQLiteDatabase db) { + // 升级到版本9,添加背景图片URI字段 + db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.BACKGROUND_IMAGE_URI + + " TEXT NOT NULL DEFAULT ''"); + db.execSQL("ALTER TABLE " + TABLE.TRASH + " ADD COLUMN " + NoteColumns.BACKGROUND_IMAGE_URI + + " TEXT NOT NULL DEFAULT ''"); + Log.d(TAG, "Upgraded to version 9: added background_image_uri column"); + } + public void createEncryptedNotePasswordTable(SQLiteDatabase db) { db.execSQL(CREATE_ENCRYPTED_NOTE_PASSWORD_TABLE_SQL); Log.d(TAG, "encrypted_note_password table has been created"); diff --git a/src/Notes-master/src/net/micode/notes/model/WorkingNote.java b/src/Notes-master/src/net/micode/notes/model/WorkingNote.java index 471a0a7..7490046 100644 --- a/src/Notes-master/src/net/micode/notes/model/WorkingNote.java +++ b/src/Notes-master/src/net/micode/notes/model/WorkingNote.java @@ -58,6 +58,7 @@ public class WorkingNote { private NoteSettingChangedListener mNoteSettingStatusListener; // 笔记设置变化监听器 private String mPassword; // 密码(仅在创建时使用) private int mNoteType; // 笔记类型(普通笔记/清单) + private String mCustomBackgroundPath; // 自定义背景图片路径 @@ -81,7 +82,8 @@ public class WorkingNote { NoteColumns.BG_COLOR_ID, // 背景颜色ID NoteColumns.WIDGET_ID, // 小部件ID NoteColumns.WIDGET_TYPE, // 小部件类型 - NoteColumns.MODIFIED_DATE // 修改日期 + NoteColumns.MODIFIED_DATE, // 修改日期 + NoteColumns.BACKGROUND_IMAGE_URI // 背景图片URI }; // 数据查询结果列索引 @@ -97,6 +99,7 @@ public class WorkingNote { private static final int NOTE_WIDGET_ID_COLUMN = 3; // 小部件ID列索引 private static final int NOTE_WIDGET_TYPE_COLUMN = 4; // 小部件类型列索引 private static final int NOTE_MODIFIED_DATE_COLUMN = 5; // 修改日期列索引 + private static final int NOTE_BACKGROUND_IMAGE_URI_COLUMN = 6; // 背景图片URI列索引 @@ -151,6 +154,9 @@ public class WorkingNote { mWidgetType = cursor.getInt(NOTE_WIDGET_TYPE_COLUMN); mAlertDate = cursor.getLong(NOTE_ALERTED_DATE_COLUMN); mModifiedDate = cursor.getLong(NOTE_MODIFIED_DATE_COLUMN); + if (!cursor.isNull(NOTE_BACKGROUND_IMAGE_URI_COLUMN)) { + mCustomBackgroundPath = cursor.getString(NOTE_BACKGROUND_IMAGE_URI_COLUMN); + } } cursor.close(); } else { @@ -533,7 +539,26 @@ public class WorkingNote { } return encrypted; } - + + /** + * 设置自定义背景图片路径 + * @param path 背景图片路径 + */ + public void setCustomBackgroundPath(String path) { + if (!TextUtils.equals(mCustomBackgroundPath, path)) { + mCustomBackgroundPath = path; + mNote.setNoteValue(NoteColumns.BACKGROUND_IMAGE_URI, path); + } + } + + /** + * 获取自定义背景图片路径 + * @return 背景图片路径 + */ + public String getCustomBackgroundPath() { + return mCustomBackgroundPath; + } + /** * 添加标签 * @param tagName 标签名称 @@ -541,7 +566,7 @@ public class WorkingNote { public void addTag(String tagName) { mNote.addTagData(tagName); } - + /** * 清空所有标签 */ diff --git a/src/Notes-master/src/net/micode/notes/tool/BackgroundManager.java b/src/Notes-master/src/net/micode/notes/tool/BackgroundManager.java new file mode 100644 index 0000000..86aeb5e --- /dev/null +++ b/src/Notes-master/src/net/micode/notes/tool/BackgroundManager.java @@ -0,0 +1,263 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.tool; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.Environment; +import android.util.Log; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; + +/** + * 背景管理器类 + * 负责背景图片的选择、存储和应用 + */ +public class BackgroundManager { + private static final String TAG = "BackgroundManager"; + private static final String BACKGROUND_DIR = "note_backgrounds"; + private static final String IMAGE_DIR = "note_images"; + private Context mContext; + + /** + * 构造方法 + * @param context 上下文对象 + */ + public BackgroundManager(Context context) { + mContext = context; + // 初始化目录 + initDirectories(); + } + + /** + * 初始化目录 + */ + private void initDirectories() { + // 创建背景图片目录 + File backgroundDir = getBackgroundDir(); + if (!backgroundDir.exists()) { + if (!backgroundDir.mkdirs()) { + Log.e(TAG, "Failed to create background directory"); + } + } + + // 创建插入图片目录 + File imageDir = getImageDir(); + if (!imageDir.exists()) { + if (!imageDir.mkdirs()) { + Log.e(TAG, "Failed to create image directory"); + } + } + } + + /** + * 获取背景图片目录 + * @return 背景图片目录 + */ + public File getBackgroundDir() { + return new File(mContext.getFilesDir(), BACKGROUND_DIR); + } + + /** + * 获取插入图片目录 + * @return 插入图片目录 + */ + public File getImageDir() { + return new File(mContext.getFilesDir(), IMAGE_DIR); + } + + /** + * 保存背景图片并返回路径 + * @param sourceUri 源图片URI + * @return 保存后的图片路径 + */ + public String saveBackgroundImage(Uri sourceUri) { + try { + // 创建目标文件 + String fileName = generateUniqueFileName(); + File destFile = new File(getBackgroundDir(), fileName); + + // 复制文件 + copyFile(sourceUri, destFile); + + // 返回文件路径 + return destFile.getAbsolutePath(); + } catch (IOException e) { + Log.e(TAG, "Error saving background image: " + e.getMessage()); + return null; + } + } + + /** + * 保存插入的图片并返回路径 + * @param sourceUri 源图片URI + * @return 保存后的图片路径 + */ + public String saveInsertedImage(Uri sourceUri) { + try { + // 创建目标文件 + String fileName = generateUniqueFileName(); + File destFile = new File(getImageDir(), fileName); + + // 复制文件 + copyFile(sourceUri, destFile); + + // 返回文件路径 + return destFile.getAbsolutePath(); + } catch (IOException e) { + Log.e(TAG, "Error saving inserted image: " + e.getMessage()); + return null; + } + } + + /** + * 复制文件 + * @param sourceUri 源文件URI + * @param destFile 目标文件 + * @throws IOException IO异常 + */ + private void copyFile(Uri sourceUri, File destFile) throws IOException { + InputStream is = null; + OutputStream os = null; + try { + is = mContext.getContentResolver().openInputStream(sourceUri); + os = new FileOutputStream(destFile); + byte[] buffer = new byte[4096]; + int length; + while ((length = is.read(buffer)) > 0) { + os.write(buffer, 0, length); + } + } finally { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } + } + + /** + * 生成唯一文件名 + * @return 唯一文件名 + */ + private String generateUniqueFileName() { + String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date()); + return "IMG_" + timeStamp + ".jpg"; + } + + /** + * 根据路径加载背景图片 + * @param path 图片路径 + * @return 背景图片的Drawable对象 + */ + public Drawable loadBackground(String path) { + if (path == null || path.isEmpty()) { + return null; + } + + try { + File file = new File(path); + if (!file.exists()) { + Log.e(TAG, "Background image file not found: " + path); + return null; + } + + Bitmap bitmap = BitmapFactory.decodeFile(path); + if (bitmap == null) { + Log.e(TAG, "Failed to decode background image: " + path); + return null; + } + + return new BitmapDrawable(mContext.getResources(), bitmap); + } catch (Exception e) { + Log.e(TAG, "Error loading background: " + e.getMessage()); + return null; + } + } + + /** + * 清理背景图片文件 + * @param path 图片路径 + * @return 是否清理成功 + */ + public boolean cleanupBackgroundImage(String path) { + if (path == null || path.isEmpty()) { + return false; + } + + File file = new File(path); + if (file.exists()) { + if (file.delete()) { + Log.d(TAG, "Background image deleted: " + path); + return true; + } else { + Log.e(TAG, "Failed to delete background image: " + path); + return false; + } + } + return false; + } + + /** + * 清理插入的图片文件 + * @param path 图片路径 + * @return 是否清理成功 + */ + public boolean cleanupInsertedImage(String path) { + if (path == null || path.isEmpty()) { + return false; + } + + File file = new File(path); + if (file.exists()) { + if (file.delete()) { + Log.d(TAG, "Inserted image deleted: " + path); + return true; + } else { + Log.e(TAG, "Failed to delete inserted image: " + path); + return false; + } + } + return false; + } + + /** + * 检查图片文件是否存在 + * @param path 图片路径 + * @return 是否存在 + */ + public boolean isImageExists(String path) { + if (path == null || path.isEmpty()) { + return false; + } + File file = new File(path); + return file.exists() && file.isFile(); + } +} diff --git a/src/Notes-master/src/net/micode/notes/ui/NoteEditActivity.java b/src/Notes-master/src/net/micode/notes/ui/NoteEditActivity.java index 4d0e7b6..1f821d8 100644 --- a/src/Notes-master/src/net/micode/notes/ui/NoteEditActivity.java +++ b/src/Notes-master/src/net/micode/notes/ui/NoteEditActivity.java @@ -105,6 +105,7 @@ import net.micode.notes.model.WorkingNote.NoteSettingChangedListener; import net.micode.notes.tool.DataUtils; import net.micode.notes.tool.ResourceParser; import net.micode.notes.tool.ResourceParser.TextAppearanceResources; +import net.micode.notes.tool.BackgroundManager; import net.micode.notes.ui.DateTimePickerDialog.OnDateTimeSetListener; import net.micode.notes.ui.NoteEditText.OnTextViewChangeListener; import net.micode.notes.widget.NoteWidgetProvider_2x; @@ -140,6 +141,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, sBgSelectorBtnsMap.put(R.id.iv_bg_blue, ResourceParser.BLUE); sBgSelectorBtnsMap.put(R.id.iv_bg_green, ResourceParser.GREEN); sBgSelectorBtnsMap.put(R.id.iv_bg_white, ResourceParser.WHITE); + sBgSelectorBtnsMap.put(R.id.iv_bg_custom, -1); // 自定义背景 } /** @@ -153,6 +155,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, sBgSelectorSelectionMap.put(ResourceParser.BLUE, R.id.iv_bg_blue_select); sBgSelectorSelectionMap.put(ResourceParser.GREEN, R.id.iv_bg_green_select); sBgSelectorSelectionMap.put(ResourceParser.WHITE, R.id.iv_bg_white_select); + sBgSelectorSelectionMap.put(-1, R.id.iv_bg_custom_select); // 自定义背景 } /** @@ -180,8 +183,9 @@ public class NoteEditActivity extends Activity implements OnClickListener, } private static final String TAG = "NoteEditActivity"; // 日志标签 - private static final int REQUEST_CODE_PICK_IMAGE = 100; // 图片选择请求码 OMO - private static final int PHOTO_REQUEST = 100; // 请求照片 + private static final int REQUEST_CODE_PICK_IMAGE = 100; // 插入图片请求码 + private static final int REQUEST_CODE_PICK_BACKGROUND = 101; // 背景图片请求码 + private static final int PHOTO_REQUEST = REQUEST_CODE_PICK_IMAGE; // 保持兼容性 private HeadViewHolder mNoteHeaderHolder; // 头部视图持有者 private View mHeadViewPanel; // 头部视图面板 @@ -193,7 +197,8 @@ public class NoteEditActivity extends Activity implements OnClickListener, private WorkingNote mWorkingNote; // 工作笔记对象 private SharedPreferences mSharedPrefs; // 共享偏好设置 private int mFontSizeId; // 字体大小ID - private ImageButton mBtnInsertImage; // 插入图片按钮 OMO + private ImageButton mBtnInsertImage; // 插入图片按钮 + private BackgroundManager mBackgroundManager; // 背景管理器 private String mText; // 用于存储富文本内容 private int mNoteLength; // 文本长度 @@ -207,7 +212,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, private String mUserQuery; // 用户查询字符串 private Pattern mPattern; // 正则表达式模式(用于高亮查询结果) private ChecklistManager mChecklistManager; // 清单管理器(OMO) - + // 标签管理相关控件 private LinearLayout mTagManagementSection; // 标签管理区域 private LinearLayout mExistingTagsContainer; // 现有标签容器 @@ -215,7 +220,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, private EditText mTagInput; // 标签输入框 private Button mAddTagButton; // 添加标签按钮 private ArrayList