Merge pull request '针对背景修改疑修' (#26) from wangjiaqi_branch into master

pull/32/head
p82feo7wg 2 months ago
commit c9993b00ee

@ -90,7 +90,7 @@ public class Notes {
// 查询数据表的URI // 查询数据表的URI
public static final Uri CONTENT_DATA_URI = Uri.parse("content://" + AUTHORITY + "/data"); public static final Uri CONTENT_DATA_URI = Uri.parse("content://" + AUTHORITY + "/data");
/** /**
* Uri to query trash notes * Uri to query trash notes
*/ */
public static final Uri CONTENT_TRASH_URI = Uri.parse("content://" + AUTHORITY + "/trash"); 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"; public static final String VERSION = "version";
/** /**
* Whether the note is encrypted * Whether the note is encrypted
* <P> Type : INTEGER (0 = not encrypted, 1 = encrypted) </P> * <P> Type : INTEGER (0 = not encrypted, 1 = encrypted) </P>
*/ */
public static final String IS_ENCRYPTED = "is_encrypted"; public static final String IS_ENCRYPTED = "is_encrypted";
/**
* Background image URI for the note
* <P> Type : TEXT </P>
*/
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 * Deleted date for trash note
* <P> Type: INTEGER (long) </P> * <P> Type: INTEGER (long) </P>

@ -30,7 +30,7 @@ import net.micode.notes.data.Notes.NoteColumns;
public class NotesDatabaseHelper extends SQLiteOpenHelper { public class NotesDatabaseHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "note.db"; 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 interface TABLE {
public static final String NOTE = "note"; public static final String NOTE = "note";
@ -49,214 +49,216 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
private static NotesDatabaseHelper mInstance; private static NotesDatabaseHelper mInstance;
private static final String CREATE_NOTE_TABLE_SQL = private static final String CREATE_NOTE_TABLE_SQL =
"CREATE TABLE " + TABLE.NOTE + "(" + "CREATE TABLE " + TABLE.NOTE + "(" +
NoteColumns.ID + " INTEGER PRIMARY KEY," + NoteColumns.ID + " INTEGER PRIMARY KEY," +
NoteColumns.PARENT_ID + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.PARENT_ID + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.ALERTED_DATE + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.ALERTED_DATE + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.BG_COLOR_ID + " 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.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," +
NoteColumns.HAS_ATTACHMENT + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.HAS_ATTACHMENT + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.MODIFIED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," + NoteColumns.MODIFIED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," +
NoteColumns.NOTES_COUNT + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.NOTES_COUNT + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.SNIPPET + " TEXT NOT NULL DEFAULT ''," + NoteColumns.SNIPPET + " TEXT NOT NULL DEFAULT ''," +
NoteColumns.TYPE + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.TYPE + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.WIDGET_ID + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.WIDGET_ID + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.WIDGET_TYPE + " INTEGER NOT NULL DEFAULT -1," + NoteColumns.WIDGET_TYPE + " INTEGER NOT NULL DEFAULT -1," +
NoteColumns.SYNC_ID + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.SYNC_ID + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.LOCAL_MODIFIED + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.LOCAL_MODIFIED + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.ORIGIN_PARENT_ID + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.ORIGIN_PARENT_ID + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.GTASK_ID + " TEXT NOT NULL DEFAULT ''," + NoteColumns.GTASK_ID + " TEXT NOT NULL DEFAULT ''," +
NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.IS_ENCRYPTED + " 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 = private static final String CREATE_DATA_TABLE_SQL =
"CREATE TABLE " + TABLE.DATA + "(" + "CREATE TABLE " + TABLE.DATA + "(" +
DataColumns.ID + " INTEGER PRIMARY KEY," + DataColumns.ID + " INTEGER PRIMARY KEY," +
DataColumns.MIME_TYPE + " TEXT NOT NULL," + DataColumns.MIME_TYPE + " TEXT NOT NULL," +
DataColumns.NOTE_ID + " INTEGER NOT NULL DEFAULT 0," + DataColumns.NOTE_ID + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," + NoteColumns.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," +
NoteColumns.MODIFIED_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.CONTENT + " TEXT NOT NULL DEFAULT ''," +
DataColumns.DATA1 + " INTEGER," + DataColumns.DATA1 + " INTEGER," +
DataColumns.DATA2 + " INTEGER," + DataColumns.DATA2 + " INTEGER," +
DataColumns.DATA3 + " TEXT NOT NULL DEFAULT ''," + DataColumns.DATA3 + " TEXT NOT NULL DEFAULT ''," +
DataColumns.DATA4 + " TEXT NOT NULL DEFAULT ''," + DataColumns.DATA4 + " TEXT NOT NULL DEFAULT ''," +
DataColumns.DATA5 + " TEXT NOT NULL DEFAULT ''" + DataColumns.DATA5 + " TEXT NOT NULL DEFAULT ''" +
")"; ")";
private static final String CREATE_DATA_NOTE_ID_INDEX_SQL = private static final String CREATE_DATA_NOTE_ID_INDEX_SQL =
"CREATE INDEX IF NOT EXISTS note_id_index ON " + "CREATE INDEX IF NOT EXISTS note_id_index ON " +
TABLE.DATA + "(" + DataColumns.NOTE_ID + ");"; TABLE.DATA + "(" + DataColumns.NOTE_ID + ");";
private static final String CREATE_TRASH_TABLE_SQL = private static final String CREATE_TRASH_TABLE_SQL =
"CREATE TABLE " + TABLE.TRASH + "(" + "CREATE TABLE " + TABLE.TRASH + "(" +
NoteColumns.ID + " INTEGER PRIMARY KEY," + NoteColumns.ID + " INTEGER PRIMARY KEY," +
NoteColumns.PARENT_ID + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.PARENT_ID + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.ALERTED_DATE + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.ALERTED_DATE + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.BG_COLOR_ID + " 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.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," +
NoteColumns.HAS_ATTACHMENT + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.HAS_ATTACHMENT + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.MODIFIED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," + NoteColumns.MODIFIED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," +
NoteColumns.NOTES_COUNT + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.NOTES_COUNT + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.SNIPPET + " TEXT NOT NULL DEFAULT ''," + NoteColumns.SNIPPET + " TEXT NOT NULL DEFAULT ''," +
NoteColumns.TYPE + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.TYPE + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.WIDGET_ID + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.WIDGET_ID + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.WIDGET_TYPE + " INTEGER NOT NULL DEFAULT -1," + NoteColumns.WIDGET_TYPE + " INTEGER NOT NULL DEFAULT -1," +
NoteColumns.SYNC_ID + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.SYNC_ID + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.LOCAL_MODIFIED + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.LOCAL_MODIFIED + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.ORIGIN_PARENT_ID + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.ORIGIN_PARENT_ID + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.GTASK_ID + " TEXT NOT NULL DEFAULT ''," + NoteColumns.GTASK_ID + " TEXT NOT NULL DEFAULT ''," +
NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.IS_ENCRYPTED + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.IS_ENCRYPTED + " INTEGER NOT NULL DEFAULT 0," +
"deleted_date INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)" + 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 = private static final String CREATE_TRASH_DATA_TABLE_SQL =
"CREATE TABLE " + TABLE.TRASH_DATA + "(" + "CREATE TABLE " + TABLE.TRASH_DATA + "(" +
DataColumns.ID + " INTEGER PRIMARY KEY," + DataColumns.ID + " INTEGER PRIMARY KEY," +
DataColumns.MIME_TYPE + " TEXT NOT NULL," + DataColumns.MIME_TYPE + " TEXT NOT NULL," +
DataColumns.NOTE_ID + " INTEGER NOT NULL DEFAULT 0," + DataColumns.NOTE_ID + " INTEGER NOT NULL DEFAULT 0," +
NoteColumns.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," + NoteColumns.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," +
NoteColumns.MODIFIED_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.CONTENT + " TEXT NOT NULL DEFAULT ''," +
DataColumns.DATA1 + " INTEGER," + DataColumns.DATA1 + " INTEGER," +
DataColumns.DATA2 + " INTEGER," + DataColumns.DATA2 + " INTEGER," +
DataColumns.DATA3 + " TEXT NOT NULL DEFAULT ''," + DataColumns.DATA3 + " TEXT NOT NULL DEFAULT ''," +
DataColumns.DATA4 + " TEXT NOT NULL DEFAULT ''," + DataColumns.DATA4 + " TEXT NOT NULL DEFAULT ''," +
DataColumns.DATA5 + " TEXT NOT NULL DEFAULT ''" + DataColumns.DATA5 + " TEXT NOT NULL DEFAULT ''" +
")"; ")";
private static final String CREATE_ENCRYPTED_NOTE_PASSWORD_TABLE_SQL = private static final String CREATE_ENCRYPTED_NOTE_PASSWORD_TABLE_SQL =
"CREATE TABLE " + TABLE.ENCRYPTED_NOTE_PASSWORD + "(" + "CREATE TABLE " + TABLE.ENCRYPTED_NOTE_PASSWORD + "(" +
NoteColumns.ID + " INTEGER PRIMARY KEY," + NoteColumns.ID + " INTEGER PRIMARY KEY," +
"password TEXT NOT NULL," + "password TEXT NOT NULL," +
"FOREIGN KEY(" + NoteColumns.ID + ") REFERENCES " + TABLE.NOTE + "(" + NoteColumns.ID + ") ON DELETE CASCADE" + "FOREIGN KEY(" + NoteColumns.ID + ") REFERENCES " + TABLE.NOTE + "(" + NoteColumns.ID + ") ON DELETE CASCADE" +
")"; ")";
/** /**
* Increase folder's note count when move note to the folder * Increase folder's note count when move note to the folder
*/ */
private static final String NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER = private static final String NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER =
"CREATE TRIGGER increase_folder_count_on_update "+ "CREATE TRIGGER increase_folder_count_on_update "+
" AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE + " AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE +
" BEGIN " + " BEGIN " +
" UPDATE " + TABLE.NOTE + " UPDATE " + TABLE.NOTE +
" SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" + " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" +
" WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" + " WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" +
" END"; " END";
/** /**
* Decrease folder's note count when move note from folder * Decrease folder's note count when move note from folder
*/ */
private static final String NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER = private static final String NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER =
"CREATE TRIGGER decrease_folder_count_on_update " + "CREATE TRIGGER decrease_folder_count_on_update " +
" AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE + " AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE +
" BEGIN " + " BEGIN " +
" UPDATE " + TABLE.NOTE + " UPDATE " + TABLE.NOTE +
" SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" + " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" +
" WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID + " WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID +
" AND " + NoteColumns.NOTES_COUNT + ">0" + ";" + " AND " + NoteColumns.NOTES_COUNT + ">0" + ";" +
" END"; " END";
/** /**
* Increase folder's note count when insert new note to the folder * Increase folder's note count when insert new note to the folder
*/ */
private static final String NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER = private static final String NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER =
"CREATE TRIGGER increase_folder_count_on_insert " + "CREATE TRIGGER increase_folder_count_on_insert " +
" AFTER INSERT ON " + TABLE.NOTE + " AFTER INSERT ON " + TABLE.NOTE +
" BEGIN " + " BEGIN " +
" UPDATE " + TABLE.NOTE + " UPDATE " + TABLE.NOTE +
" SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" + " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" +
" WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" + " WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" +
" END"; " END";
/** /**
* Decrease folder's note count when delete note from the folder * Decrease folder's note count when delete note from the folder
*/ */
private static final String NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER = private static final String NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER =
"CREATE TRIGGER decrease_folder_count_on_delete " + "CREATE TRIGGER decrease_folder_count_on_delete " +
" AFTER DELETE ON " + TABLE.NOTE + " AFTER DELETE ON " + TABLE.NOTE +
" BEGIN " + " BEGIN " +
" UPDATE " + TABLE.NOTE + " UPDATE " + TABLE.NOTE +
" SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" + " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" +
" WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID + " WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID +
" AND " + NoteColumns.NOTES_COUNT + ">0;" + " AND " + NoteColumns.NOTES_COUNT + ">0;" +
" END"; " END";
/** /**
* Update note's content when insert data with type {@link DataConstants#NOTE} * Update note's content when insert data with type {@link DataConstants#NOTE}
*/ */
private static final String DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER = private static final String DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER =
"CREATE TRIGGER update_note_content_on_insert " + "CREATE TRIGGER update_note_content_on_insert " +
" AFTER INSERT ON " + TABLE.DATA + " AFTER INSERT ON " + TABLE.DATA +
" WHEN new." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" + " WHEN new." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" +
" BEGIN" + " BEGIN" +
" UPDATE " + TABLE.NOTE + " UPDATE " + TABLE.NOTE +
" SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT + " SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT +
" WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" + " WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" +
" END"; " END";
/** /**
* Update note's content when data with {@link DataConstants#NOTE} type has changed * Update note's content when data with {@link DataConstants#NOTE} type has changed
*/ */
private static final String DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER = private static final String DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER =
"CREATE TRIGGER update_note_content_on_update " + "CREATE TRIGGER update_note_content_on_update " +
" AFTER UPDATE ON " + TABLE.DATA + " AFTER UPDATE ON " + TABLE.DATA +
" WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" + " WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" +
" BEGIN" + " BEGIN" +
" UPDATE " + TABLE.NOTE + " UPDATE " + TABLE.NOTE +
" SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT + " SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT +
" WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" + " WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" +
" END"; " END";
/** /**
* Update note's content when data with {@link DataConstants#NOTE} type has deleted * Update note's content when data with {@link DataConstants#NOTE} type has deleted
*/ */
private static final String DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER = private static final String DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER =
"CREATE TRIGGER update_note_content_on_delete " + "CREATE TRIGGER update_note_content_on_delete " +
" AFTER delete ON " + TABLE.DATA + " AFTER delete ON " + TABLE.DATA +
" WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" + " WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" +
" BEGIN" + " BEGIN" +
" UPDATE " + TABLE.NOTE + " UPDATE " + TABLE.NOTE +
" SET " + NoteColumns.SNIPPET + "=''" + " SET " + NoteColumns.SNIPPET + "=''" +
" WHERE " + NoteColumns.ID + "=old." + DataColumns.NOTE_ID + ";" + " WHERE " + NoteColumns.ID + "=old." + DataColumns.NOTE_ID + ";" +
" END"; " END";
/** /**
* Delete datas belong to note which has been deleted * Delete datas belong to note which has been deleted
*/ */
private static final String NOTE_DELETE_DATA_ON_DELETE_TRIGGER = private static final String NOTE_DELETE_DATA_ON_DELETE_TRIGGER =
"CREATE TRIGGER delete_data_on_delete " + "CREATE TRIGGER delete_data_on_delete " +
" AFTER DELETE ON " + TABLE.NOTE + " AFTER DELETE ON " + TABLE.NOTE +
" BEGIN" + " BEGIN" +
" DELETE FROM " + TABLE.DATA + " DELETE FROM " + TABLE.DATA +
" WHERE " + DataColumns.NOTE_ID + "=old." + NoteColumns.ID + ";" + " WHERE " + DataColumns.NOTE_ID + "=old." + NoteColumns.ID + ";" +
" END"; " END";
/** /**
* Delete notes belong to folder which has been deleted * Delete notes belong to folder which has been deleted
*/ */
private static final String FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER = private static final String FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER =
"CREATE TRIGGER folder_delete_notes_on_delete " + "CREATE TRIGGER folder_delete_notes_on_delete " +
" AFTER DELETE ON " + TABLE.NOTE + " AFTER DELETE ON " + TABLE.NOTE +
" BEGIN" + " BEGIN" +
" DELETE FROM " + TABLE.NOTE + " DELETE FROM " + TABLE.NOTE +
" WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" + " WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" +
" END"; " END";
/** /**
* Move notes belong to folder which has been moved to trash folder * Move notes belong to folder which has been moved to trash folder
*/ */
private static final String FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER = private static final String FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER =
"CREATE TRIGGER folder_move_notes_on_trash " + "CREATE TRIGGER folder_move_notes_on_trash " +
" AFTER UPDATE ON " + TABLE.NOTE + " AFTER UPDATE ON " + TABLE.NOTE +
" WHEN new." + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER + " WHEN new." + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER +
" BEGIN" + " BEGIN" +
" UPDATE " + TABLE.NOTE + " UPDATE " + TABLE.NOTE +
" SET " + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER + " SET " + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER +
" WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" + " WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" +
" END"; " END";
public NotesDatabaseHelper(Context context) { public NotesDatabaseHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION); super(context, DB_NAME, null, DB_VERSION);
@ -409,6 +411,11 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
oldVersion++; oldVersion++;
} }
if (oldVersion == 8) {
upgradeToV9(db);
oldVersion++;
}
if (reCreateTriggers) { if (reCreateTriggers) {
reCreateNoteTableTriggers(db); reCreateNoteTableTriggers(db);
reCreateDataTableTriggers(db); reCreateDataTableTriggers(db);
@ -481,6 +488,15 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
Log.d(TAG, "Upgraded to version 8: added tag support"); 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) { public void createEncryptedNotePasswordTable(SQLiteDatabase db) {
db.execSQL(CREATE_ENCRYPTED_NOTE_PASSWORD_TABLE_SQL); db.execSQL(CREATE_ENCRYPTED_NOTE_PASSWORD_TABLE_SQL);
Log.d(TAG, "encrypted_note_password table has been created"); Log.d(TAG, "encrypted_note_password table has been created");

@ -58,6 +58,7 @@ public class WorkingNote {
private NoteSettingChangedListener mNoteSettingStatusListener; // 笔记设置变化监听器 private NoteSettingChangedListener mNoteSettingStatusListener; // 笔记设置变化监听器
private String mPassword; // 密码(仅在创建时使用) private String mPassword; // 密码(仅在创建时使用)
private int mNoteType; // 笔记类型(普通笔记/清单) private int mNoteType; // 笔记类型(普通笔记/清单)
private String mCustomBackgroundPath; // 自定义背景图片路径
@ -81,7 +82,8 @@ public class WorkingNote {
NoteColumns.BG_COLOR_ID, // 背景颜色ID NoteColumns.BG_COLOR_ID, // 背景颜色ID
NoteColumns.WIDGET_ID, // 小部件ID NoteColumns.WIDGET_ID, // 小部件ID
NoteColumns.WIDGET_TYPE, // 小部件类型 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_ID_COLUMN = 3; // 小部件ID列索引
private static final int NOTE_WIDGET_TYPE_COLUMN = 4; // 小部件类型列索引 private static final int NOTE_WIDGET_TYPE_COLUMN = 4; // 小部件类型列索引
private static final int NOTE_MODIFIED_DATE_COLUMN = 5; // 修改日期列索引 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); mWidgetType = cursor.getInt(NOTE_WIDGET_TYPE_COLUMN);
mAlertDate = cursor.getLong(NOTE_ALERTED_DATE_COLUMN); mAlertDate = cursor.getLong(NOTE_ALERTED_DATE_COLUMN);
mModifiedDate = cursor.getLong(NOTE_MODIFIED_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(); cursor.close();
} else { } else {
@ -534,6 +540,25 @@ public class WorkingNote {
return encrypted; 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 * @param tagName

@ -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();
}
}

@ -105,6 +105,7 @@ import net.micode.notes.model.WorkingNote.NoteSettingChangedListener;
import net.micode.notes.tool.DataUtils; import net.micode.notes.tool.DataUtils;
import net.micode.notes.tool.ResourceParser; import net.micode.notes.tool.ResourceParser;
import net.micode.notes.tool.ResourceParser.TextAppearanceResources; 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.DateTimePickerDialog.OnDateTimeSetListener;
import net.micode.notes.ui.NoteEditText.OnTextViewChangeListener; import net.micode.notes.ui.NoteEditText.OnTextViewChangeListener;
import net.micode.notes.widget.NoteWidgetProvider_2x; 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_blue, ResourceParser.BLUE);
sBgSelectorBtnsMap.put(R.id.iv_bg_green, ResourceParser.GREEN); sBgSelectorBtnsMap.put(R.id.iv_bg_green, ResourceParser.GREEN);
sBgSelectorBtnsMap.put(R.id.iv_bg_white, ResourceParser.WHITE); 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.BLUE, R.id.iv_bg_blue_select);
sBgSelectorSelectionMap.put(ResourceParser.GREEN, R.id.iv_bg_green_select); sBgSelectorSelectionMap.put(ResourceParser.GREEN, R.id.iv_bg_green_select);
sBgSelectorSelectionMap.put(ResourceParser.WHITE, R.id.iv_bg_white_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 String TAG = "NoteEditActivity"; // 日志标签
private static final int REQUEST_CODE_PICK_IMAGE = 100; // 图片选择请求码 OMO private static final int REQUEST_CODE_PICK_IMAGE = 100; // 插入图片请求码
private static final int PHOTO_REQUEST = 100; // 请求照片 private static final int REQUEST_CODE_PICK_BACKGROUND = 101; // 背景图片请求码
private static final int PHOTO_REQUEST = REQUEST_CODE_PICK_IMAGE; // 保持兼容性
private HeadViewHolder mNoteHeaderHolder; // 头部视图持有者 private HeadViewHolder mNoteHeaderHolder; // 头部视图持有者
private View mHeadViewPanel; // 头部视图面板 private View mHeadViewPanel; // 头部视图面板
@ -193,7 +197,8 @@ public class NoteEditActivity extends Activity implements OnClickListener,
private WorkingNote mWorkingNote; // 工作笔记对象 private WorkingNote mWorkingNote; // 工作笔记对象
private SharedPreferences mSharedPrefs; // 共享偏好设置 private SharedPreferences mSharedPrefs; // 共享偏好设置
private int mFontSizeId; // 字体大小ID private int mFontSizeId; // 字体大小ID
private ImageButton mBtnInsertImage; // 插入图片按钮 OMO private ImageButton mBtnInsertImage; // 插入图片按钮
private BackgroundManager mBackgroundManager; // 背景管理器
private String mText; // 用于存储富文本内容 private String mText; // 用于存储富文本内容
private int mNoteLength; // 文本长度 private int mNoteLength; // 文本长度
@ -514,9 +519,22 @@ public class NoteEditActivity extends Activity implements OnClickListener,
findViewById(sBgSelectorSelectionMap.get(id)).setVisibility(View.GONE); findViewById(sBgSelectorSelectionMap.get(id)).setVisibility(View.GONE);
} }
// 设置头部视图和编辑器面板的背景 // 加载自定义背景图片
String backgroundPath = mWorkingNote.getCustomBackgroundPath();
if (backgroundPath != null && !backgroundPath.isEmpty()) {
Drawable background = mBackgroundManager.loadBackground(backgroundPath);
if (background != null) {
mNoteEditorPanel.setBackground(background);
} else {
// 如果背景图片加载失败,使用默认背景颜色
mNoteEditorPanel.setBackgroundResource(mWorkingNote.getBgColorResId());
}
} else {
// 如果没有自定义背景,使用默认背景颜色
mNoteEditorPanel.setBackgroundResource(mWorkingNote.getBgColorResId());
}
// 设置头部视图的背景
mHeadViewPanel.setBackgroundResource(mWorkingNote.getTitleBgResId()); mHeadViewPanel.setBackgroundResource(mWorkingNote.getTitleBgResId());
mNoteEditorPanel.setBackgroundResource(mWorkingNote.getBgColorResId());
// 设置最后修改时间 // 设置最后修改时间
mNoteHeaderHolder.tvModified.setText(DateUtils.formatDateTime(this, mNoteHeaderHolder.tvModified.setText(DateUtils.formatDateTime(this,
@ -838,6 +856,9 @@ public class NoteEditActivity extends Activity implements OnClickListener,
// 初始化富文本功能按钮 // 初始化富文本功能按钮
initRichEditorButtons(); initRichEditorButtons();
// 初始化背景管理器
mBackgroundManager = new BackgroundManager(this);
} }
/** /**
@ -892,10 +913,18 @@ public class NoteEditActivity extends Activity implements OnClickListener,
View.VISIBLE); View.VISIBLE);
} else if (sBgSelectorBtnsMap.containsKey(id)) { } else if (sBgSelectorBtnsMap.containsKey(id)) {
// 处理背景颜色选择 // 处理背景颜色选择
findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility( Integer bgColorId = sBgSelectorBtnsMap.get(id);
View.GONE); if (bgColorId == -1) {
mWorkingNote.setBgColorId(sBgSelectorBtnsMap.get(id)); // 处理自定义背景图片选择
mNoteBgColorSelector.setVisibility(View.GONE); mNoteBgColorSelector.setVisibility(View.GONE);
pickBackgroundImageFromGallery();
} else {
// 处理普通背景颜色选择
findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility(
View.GONE);
mWorkingNote.setBgColorId(bgColorId);
mNoteBgColorSelector.setVisibility(View.GONE);
}
} else if (sFontSizeBtnsMap.containsKey(id)) { } else if (sFontSizeBtnsMap.containsKey(id)) {
// 处理字体大小选择 // 处理字体大小选择
findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.GONE); findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.GONE);
@ -913,7 +942,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
} }
mFontSizeSelector.setVisibility(View.GONE); mFontSizeSelector.setVisibility(View.GONE);
} else if (id == R.id.btn_insert_image) { } else if (id == R.id.btn_insert_image) {
// 处理插入图片按钮点击事件 OMO // 处理插入图片按钮点击事件
pickImageFromGallery(); pickImageFromGallery();
} }
} }
@ -1627,13 +1656,44 @@ public class NoteEditActivity extends Activity implements OnClickListener,
// 意图:打开系统相册选择图片 // 意图:打开系统相册选择图片
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setType("image/*"); // 只显示图片类型 intent.setType("image/*"); // 只显示图片类型
startActivityForResult(intent, PHOTO_REQUEST); // 启动相册,等待返回结果 startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE); // 启动相册,等待返回结果
} catch (ActivityNotFoundException e) {
// 如果没有相册应用,尝试使用通用选择器
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
try {
startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE);
} catch (ActivityNotFoundException ex) {
showToast(R.string.error_permission_denied);
Log.e(TAG, "No image picker available", ex);
}
}
}
/**
*
*/
private void pickBackgroundImageFromGallery() {
// 检查运行时权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
// 请求权限
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE_PERMISSION_STORAGE);
return;
}
}
try {
// 意图:打开系统相册选择图片
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setType("image/*"); // 只显示图片类型
startActivityForResult(intent, REQUEST_CODE_PICK_BACKGROUND); // 启动相册,等待返回结果
} catch (ActivityNotFoundException e) { } catch (ActivityNotFoundException e) {
// 如果没有相册应用,尝试使用通用选择器 // 如果没有相册应用,尝试使用通用选择器
Intent intent = new Intent(Intent.ACTION_GET_CONTENT); Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*"); intent.setType("image/*");
try { try {
startActivityForResult(intent, PHOTO_REQUEST); startActivityForResult(intent, REQUEST_CODE_PICK_BACKGROUND);
} catch (ActivityNotFoundException ex) { } catch (ActivityNotFoundException ex) {
showToast(R.string.error_permission_denied); showToast(R.string.error_permission_denied);
Log.e(TAG, "No image picker available", ex); Log.e(TAG, "No image picker available", ex);
@ -1662,79 +1722,103 @@ public class NoteEditActivity extends Activity implements OnClickListener,
@Override @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PHOTO_REQUEST && resultCode == RESULT_OK && data != null) { if (resultCode == RESULT_OK && data != null) {
Uri uri = data.getData(); if (requestCode == PHOTO_REQUEST || requestCode == REQUEST_CODE_PICK_IMAGE) {
String imageBase64 = saveImageToBase64(uri); Uri uri = data.getData();
if (imageBase64 == null) return; // 转换失败就退出 String imageBase64 = saveImageToBase64(uri);
if (imageBase64 == null) return; // 转换失败就退出
// 1. 拼接RichEditor支持的<img>标签使用Base64编码的图片数据
String imgHtmlTag = "<img src=\"" + imageBase64 + "\" width=\"200\" height=\"200\"/><br/>"; // 1. 拼接RichEditor支持的<img>标签使用Base64编码的图片数据
String imgHtmlTag = "<img src=\"" + imageBase64 + "\" width=\"200\" height=\"200\"/><br/>";
// 2. 直接保存到笔记内容中(结合原有插入逻辑)
String originalContent = mWorkingNote.getContent() == null ? "" : mWorkingNote.getContent(); // 2. 直接保存到笔记内容中(结合原有插入逻辑)
Log.d(TAG, "Original note content: " + originalContent); String originalContent = mWorkingNote.getContent() == null ? "" : mWorkingNote.getContent();
Log.d(TAG, "Original note content: " + originalContent);
// 3. 插入图片到RichEditor兼容空内容情况
String curHtml = mNoteEditor.getHtml(); // 3. 插入图片到RichEditor兼容空内容情况
if (curHtml == null || curHtml.isEmpty()) { String curHtml = mNoteEditor.getHtml();
// 对于空内容,直接使用图片标签 if (curHtml == null || curHtml.isEmpty()) {
mNoteEditor.setHtml(imgHtmlTag); // 对于空内容,直接使用图片标签
} else { mNoteEditor.setHtml(imgHtmlTag);
// 对于已有内容,追加图片标签
String newHtml = curHtml + imgHtmlTag;
mNoteEditor.setHtml(newHtml);
}
// 4. 同时更新工作笔记内容,确保新建笔记也能正确保存
String updatedHtml = mNoteEditor.getHtml();
mWorkingNote.setWorkingText(updatedHtml);
// 弹窗依然保留
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("图片选择成功!");
ImageView imageView = new ImageView(this);
imageView.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT)); // 加布局参数,避免图片显示不全
imageView.setImageURI(uri); // 弹窗显示原始图片
imageView.setScaleType(ImageView.ScaleType.FIT_CENTER); // 适配图片大小
builder.setView(imageView);
builder.setPositiveButton("确认", (dialog, which) -> {
// 保存HTML内容包含Base64编码的图片
String currentHtml = mNoteEditor.getHtml();
Log.d("NoteDebug", "准备保存的HTML内容" + currentHtml);
// 执行保存操作
mWorkingNote.setWorkingText(currentHtml);
boolean isSaved = mWorkingNote.saveNote();
// 根据保存结果提示(更友好)
if (isSaved) {
Toast.makeText(this, "图片信息已保存!", Toast.LENGTH_SHORT).show();
} else { } else {
// 如果保存返回false可能是因为内容未变化而不是真正的失败 // 对于已有内容,追加图片标签
Toast.makeText(this, "图片信息已保存!", Toast.LENGTH_SHORT).show(); String newHtml = curHtml + imgHtmlTag;
Log.d(TAG, "Note save returned false, but image was successfully inserted"); mNoteEditor.setHtml(newHtml);
} }
});
builder.setNegativeButton("取消", (dialog, which) -> { // 4. 同时更新工作笔记内容,确保新建笔记也能正确保存
// 如果用户取消,移除刚才插入的图片 String updatedHtml = mNoteEditor.getHtml();
String currentHtml = mNoteEditor.getHtml(); mWorkingNote.setWorkingText(updatedHtml);
if (currentHtml != null && currentHtml.endsWith(imgHtmlTag)) {
String cancelNewHtml = currentHtml.substring(0, currentHtml.length() - imgHtmlTag.length()); // 弹窗依然保留
mNoteEditor.setHtml(cancelNewHtml); AlertDialog.Builder builder = new AlertDialog.Builder(this);
// 同时更新工作笔记 builder.setTitle("图片选择成功!");
mWorkingNote.setWorkingText(cancelNewHtml);
} else if (currentHtml != null && currentHtml.equals(imgHtmlTag)) { ImageView imageView = new ImageView(this);
// 如果只有这一张图片,取消后清空内容 imageView.setLayoutParams(new ViewGroup.LayoutParams(
mNoteEditor.setHtml(""); ViewGroup.LayoutParams.MATCH_PARENT,
mWorkingNote.setWorkingText(""); ViewGroup.LayoutParams.WRAP_CONTENT)); // 加布局参数,避免图片显示不全
imageView.setImageURI(uri); // 弹窗显示原始图片
imageView.setScaleType(ImageView.ScaleType.FIT_CENTER); // 适配图片大小
builder.setView(imageView);
builder.setPositiveButton("确认", (dialog, which) -> {
// 保存HTML内容包含Base64编码的图片
String currentHtml = mNoteEditor.getHtml();
Log.d("NoteDebug", "准备保存的HTML内容" + currentHtml);
// 执行保存操作
mWorkingNote.setWorkingText(currentHtml);
boolean isSaved = mWorkingNote.saveNote();
// 根据保存结果提示(更友好)
if (isSaved) {
Toast.makeText(this, "图片信息已保存!", Toast.LENGTH_SHORT).show();
} else {
// 如果保存返回false可能是因为内容未变化而不是真正的失败
Toast.makeText(this, "图片信息已保存!", Toast.LENGTH_SHORT).show();
Log.d(TAG, "Note save returned false, but image was successfully inserted");
}
});
builder.setNegativeButton("取消", (dialog, which) -> {
// 如果用户取消,移除刚才插入的图片
String currentHtml = mNoteEditor.getHtml();
if (currentHtml != null && currentHtml.endsWith(imgHtmlTag)) {
String cancelNewHtml = currentHtml.substring(0, currentHtml.length() - imgHtmlTag.length());
mNoteEditor.setHtml(cancelNewHtml);
// 同时更新工作笔记
mWorkingNote.setWorkingText(cancelNewHtml);
} else if (currentHtml != null && currentHtml.equals(imgHtmlTag)) {
// 如果只有这一张图片,取消后清空内容
mNoteEditor.setHtml("");
mWorkingNote.setWorkingText("");
}
});
builder.show();
}
else if (requestCode == REQUEST_CODE_PICK_BACKGROUND) {
// 处理背景图片选择的情况
Uri uri = data.getData();
String backgroundPath = mBackgroundManager.saveBackgroundImage(uri);
if (backgroundPath != null) {
// 设置自定义背景路径
mWorkingNote.setCustomBackgroundPath(backgroundPath);
// 应用背景图片
Drawable background = mBackgroundManager.loadBackground(backgroundPath);
if (background != null) {
mNoteEditorPanel.setBackground(background);
mHeadViewPanel.setBackground(background);
}
// 隐藏背景选择器
mNoteBgColorSelector.setVisibility(View.GONE);
// 显示保存成功提示
Toast.makeText(this, "背景图片设置成功!", Toast.LENGTH_SHORT).show();
} else {
// 显示保存失败提示
Toast.makeText(this, "背景图片设置失败!", Toast.LENGTH_SHORT).show();
} }
}); }
builder.show();
} }
} }
@ -2073,6 +2157,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
mNoteEditor.setPadding(10, 10, 10, 10); // 内边距 mNoteEditor.setPadding(10, 10, 10, 10); // 内边距
mNoteEditor.setPlaceholder("请输入笔记内容..."); // 占位提示 mNoteEditor.setPlaceholder("请输入笔记内容..."); // 占位提示
mNoteEditor.setInputEnabled(true); // 允许输入 mNoteEditor.setInputEnabled(true); // 允许输入
mNoteEditor.setEditorBackgroundColor(0x00000000); // 设置背景透明
} }
// 添加富文本功能按钮初始化方法 // 添加富文本功能按钮初始化方法

@ -373,7 +373,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
}); });
// 搜索输入框编辑器动作监听器(处理虚拟键盘上的搜索按钮) // 搜索输入框编辑器动作监听器(处理虚拟键盘上的搜索按钮)
mSearchEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() { mSearchEditText.setOnEditorActionListener(new OnEditorActionListener() {
@Override @Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
// 检查是否是搜索动作 // 检查是否是搜索动作

Loading…
Cancel
Save