diff --git a/Notes-master2/src/net/micode/notes/tool/BackupUtils.java b/Notes-master2/src/net/micode/notes/tool/BackupUtils.java index 39f6ec4..c539b26 100644 --- a/Notes-master2/src/net/micode/notes/tool/BackupUtils.java +++ b/Notes-master2/src/net/micode/notes/tool/BackupUtils.java @@ -36,309 +36,393 @@ import java.io.IOException; import java.io.PrintStream; +/** + +备份工具类,单例模式 +*/ public class BackupUtils { - private static final String TAG = "BackupUtils"; - // Singleton stuff - private static BackupUtils sInstance; - - public static synchronized BackupUtils getInstance(Context context) { - if (sInstance == null) { - sInstance = new BackupUtils(context); - } - return sInstance; - } - - /** - * Following states are signs to represents backup or restore - * status - */ - // Currently, the sdcard is not mounted - public static final int STATE_SD_CARD_UNMOUONTED = 0; - // The backup file not exist - public static final int STATE_BACKUP_FILE_NOT_EXIST = 1; - // The data is not well formated, may be changed by other programs - public static final int STATE_DATA_DESTROIED = 2; - // Some run-time exception which causes restore or backup fails - public static final int STATE_SYSTEM_ERROR = 3; - // Backup or restore success - public static final int STATE_SUCCESS = 4; - - private TextExport mTextExport; - - private BackupUtils(Context context) { - mTextExport = new TextExport(context); - } - - private static boolean externalStorageAvailable() { - return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()); - } - - public int exportToText() { - return mTextExport.exportToText(); - } - - public String getExportedTextFileName() { - return mTextExport.mFileName; - } - - public String getExportedTextFileDir() { - return mTextExport.mFileDirectory; - } - - private static class TextExport { - private static final String[] NOTE_PROJECTION = { - NoteColumns.ID, - NoteColumns.MODIFIED_DATE, - NoteColumns.SNIPPET, - NoteColumns.TYPE - }; - - private static final int NOTE_COLUMN_ID = 0; - - private static final int NOTE_COLUMN_MODIFIED_DATE = 1; - - private static final int NOTE_COLUMN_SNIPPET = 2; - - private static final String[] DATA_PROJECTION = { - DataColumns.CONTENT, - DataColumns.MIME_TYPE, - DataColumns.DATA1, - DataColumns.DATA2, - DataColumns.DATA3, - DataColumns.DATA4, - }; - - private static final int DATA_COLUMN_CONTENT = 0; - - private static final int DATA_COLUMN_MIME_TYPE = 1; - - private static final int DATA_COLUMN_CALL_DATE = 2; - - private static final int DATA_COLUMN_PHONE_NUMBER = 4; - - private final String [] TEXT_FORMAT; - private static final int FORMAT_FOLDER_NAME = 0; - private static final int FORMAT_NOTE_DATE = 1; - private static final int FORMAT_NOTE_CONTENT = 2; - - private Context mContext; - private String mFileName; - private String mFileDirectory; - - public TextExport(Context context) { - TEXT_FORMAT = context.getResources().getStringArray(R.array.format_for_exported_note); - mContext = context; - mFileName = ""; - mFileDirectory = ""; - } - - private String getFormat(int id) { - return TEXT_FORMAT[id]; - } - - /** - * Export the folder identified by folder id to text - */ - private void exportFolderToText(String folderId, PrintStream ps) { - // Query notes belong to this folder - Cursor notesCursor = mContext.getContentResolver().query(Notes.CONTENT_NOTE_URI, - NOTE_PROJECTION, NoteColumns.PARENT_ID + "=?", new String[] { - folderId - }, null); - - if (notesCursor != null) { - if (notesCursor.moveToFirst()) { - do { - // Print note's last modified date - ps.println(String.format(getFormat(FORMAT_NOTE_DATE), DateFormat.format( - mContext.getString(R.string.format_datetime_mdhm), - notesCursor.getLong(NOTE_COLUMN_MODIFIED_DATE)))); - // Query data belong to this note - String noteId = notesCursor.getString(NOTE_COLUMN_ID); - exportNoteToText(noteId, ps); - } while (notesCursor.moveToNext()); - } - notesCursor.close(); - } - } - - /** - * Export note identified by id to a print stream - */ - private void exportNoteToText(String noteId, PrintStream ps) { - Cursor dataCursor = mContext.getContentResolver().query(Notes.CONTENT_DATA_URI, - DATA_PROJECTION, DataColumns.NOTE_ID + "=?", new String[] { - noteId - }, null); - - if (dataCursor != null) { - if (dataCursor.moveToFirst()) { - do { - String mimeType = dataCursor.getString(DATA_COLUMN_MIME_TYPE); - if (DataConstants.CALL_NOTE.equals(mimeType)) { - // Print phone number - String phoneNumber = dataCursor.getString(DATA_COLUMN_PHONE_NUMBER); - long callDate = dataCursor.getLong(DATA_COLUMN_CALL_DATE); - String location = dataCursor.getString(DATA_COLUMN_CONTENT); - - if (!TextUtils.isEmpty(phoneNumber)) { - ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), - phoneNumber)); - } - // Print call date - ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), DateFormat - .format(mContext.getString(R.string.format_datetime_mdhm), - callDate))); - // Print call attachment location - if (!TextUtils.isEmpty(location)) { - ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), - location)); - } - } else if (DataConstants.NOTE.equals(mimeType)) { - String content = dataCursor.getString(DATA_COLUMN_CONTENT); - if (!TextUtils.isEmpty(content)) { - ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), - content)); - } - } - } while (dataCursor.moveToNext()); - } - dataCursor.close(); - } - // print a line separator between note - try { - ps.write(new byte[] { - Character.LINE_SEPARATOR, Character.LETTER_NUMBER - }); - } catch (IOException e) { - Log.e(TAG, e.toString()); - } - } - - /** - * Note will be exported as text which is user readable - */ - public int exportToText() { - if (!externalStorageAvailable()) { - Log.d(TAG, "Media was not mounted"); - return STATE_SD_CARD_UNMOUONTED; - } - - PrintStream ps = getExportToTextPrintStream(); - if (ps == null) { - Log.e(TAG, "get print stream error"); - return STATE_SYSTEM_ERROR; - } - // First export folder and its notes - Cursor folderCursor = mContext.getContentResolver().query( - Notes.CONTENT_NOTE_URI, - NOTE_PROJECTION, - "(" + NoteColumns.TYPE + "=" + Notes.TYPE_FOLDER + " AND " - + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + ") OR " - + NoteColumns.ID + "=" + Notes.ID_CALL_RECORD_FOLDER, null, null); - - if (folderCursor != null) { - if (folderCursor.moveToFirst()) { - do { - // Print folder's name - String folderName = ""; - if(folderCursor.getLong(NOTE_COLUMN_ID) == Notes.ID_CALL_RECORD_FOLDER) { - folderName = mContext.getString(R.string.call_record_folder_name); - } else { - folderName = folderCursor.getString(NOTE_COLUMN_SNIPPET); - } - if (!TextUtils.isEmpty(folderName)) { - ps.println(String.format(getFormat(FORMAT_FOLDER_NAME), folderName)); - } - String folderId = folderCursor.getString(NOTE_COLUMN_ID); - exportFolderToText(folderId, ps); - } while (folderCursor.moveToNext()); - } - folderCursor.close(); - } - - // Export notes in root's folder - Cursor noteCursor = mContext.getContentResolver().query( - Notes.CONTENT_NOTE_URI, - NOTE_PROJECTION, - NoteColumns.TYPE + "=" + +Notes.TYPE_NOTE + " AND " + NoteColumns.PARENT_ID - + "=0", null, null); - - if (noteCursor != null) { - if (noteCursor.moveToFirst()) { - do { - ps.println(String.format(getFormat(FORMAT_NOTE_DATE), DateFormat.format( - mContext.getString(R.string.format_datetime_mdhm), - noteCursor.getLong(NOTE_COLUMN_MODIFIED_DATE)))); - // Query data belong to this note - String noteId = noteCursor.getString(NOTE_COLUMN_ID); - exportNoteToText(noteId, ps); - } while (noteCursor.moveToNext()); - } - noteCursor.close(); - } - ps.close(); - - return STATE_SUCCESS; - } - - /** - * Get a print stream pointed to the file {@generateExportedTextFile} - */ - private PrintStream getExportToTextPrintStream() { - File file = generateFileMountedOnSDcard(mContext, R.string.file_path, - R.string.file_name_txt_format); - if (file == null) { - Log.e(TAG, "create file to exported failed"); - return null; - } - mFileName = file.getName(); - mFileDirectory = mContext.getString(R.string.file_path); - PrintStream ps = null; - try { - FileOutputStream fos = new FileOutputStream(file); - ps = new PrintStream(fos); - } catch (FileNotFoundException e) { - e.printStackTrace(); - return null; - } catch (NullPointerException e) { - e.printStackTrace(); - return null; - } - return ps; - } - } - - /** - * Generate the text file to store imported data - */ - private static File generateFileMountedOnSDcard(Context context, int filePathResId, int fileNameFormatResId) { - StringBuilder sb = new StringBuilder(); - sb.append(Environment.getExternalStorageDirectory()); - sb.append(context.getString(filePathResId)); - File filedir = new File(sb.toString()); - sb.append(context.getString( - fileNameFormatResId, - DateFormat.format(context.getString(R.string.format_date_ymd), - System.currentTimeMillis()))); - File file = new File(sb.toString()); - - try { - if (!filedir.exists()) { - filedir.mkdir(); - } - if (!file.exists()) { - file.createNewFile(); - } - return file; - } catch (SecurityException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - - return null; - } + +// 日志标签 +private static final String TAG = "BackupUtils"; + +// 单例实例 +private static BackupUtils sInstance; + +/** + +获取单例实例 +@param context 上下文 +@return 单例实例 +*/ +public static synchronized BackupUtils getInstance(Context context) { +if (sInstance == null) { +sInstance = new BackupUtils(context); +} +return sInstance; +} +/** + +下面的状态表示备份或还原的状态 +*/ +// 当前SD卡未挂载 +public static final int STATE_SD_CARD_UNMOUONTED = 0; +// 备份文件不存在 +public static final int STATE_BACKUP_FILE_NOT_EXIST = 1; +// 数据格式不正确,可能被其他程序改变 +public static final int STATE_DATA_DESTROIED = 2; +// 运行时异常导致备份或还原失败 +public static final int STATE_SYSTEM_ERROR = 3; +// 备份或还原成功 +public static final int STATE_SUCCESS = 4; +// 文本导出对象 +private TextExport mTextExport; + +/** + +私有构造方法 +@param context 上下文 +*/ +private BackupUtils(Context context) { +mTextExport = new TextExport(context); +} +/** + +判断外部存储是否可用 +@return 外部存储是否可用 +*/ +private static boolean externalStorageAvailable() { +return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()); +} +/** + +导出到文本 +@return 备份状态 +*/ +public int exportToText() { +return mTextExport.exportToText(); +} +/** + +获取导出文本文件名 +@return 导出文本文件名 +*/ +public String getExportedTextFileName() { +return mTextExport.mFileName; +} +/** + +获取导出文本文件目录 +@return 导出文本文件目录 +*/ +public String getExportedTextFileDir() { +return mTextExport.mFileDirectory; +} +} +/** + +Note应用中的文本导出类 +*/ +private static class TextExport { + +// 定义查询Note时需要使用的列的名字 +private static final String[] NOTE_PROJECTION = { +NoteColumns.ID, +NoteColumns.MODIFIED_DATE, +NoteColumns.SNIPPET, +NoteColumns.TYPE +}; + +// 定义查询结果中各列的索引 +private static final int NOTE_COLUMN_ID = 0; +private static final int NOTE_COLUMN_MODIFIED_DATE = 1; +private static final int NOTE_COLUMN_SNIPPET = 2; + +// 定义查询Data时需要使用的列的名字 +private static final String[] DATA_PROJECTION = { +DataColumns.CONTENT, +DataColumns.MIME_TYPE, +DataColumns.DATA1, +DataColumns.DATA2, +DataColumns.DATA3, +DataColumns.DATA4, +}; + +// 定义查询结果中各列的索引 +private static final int DATA_COLUMN_CONTENT = 0; +private static final int DATA_COLUMN_MIME_TYPE = 1; +private static final int DATA_COLUMN_CALL_DATE = 2; +private static final int DATA_COLUMN_PHONE_NUMBER = 4; + +// 定义文本格式的数组 +private final String [] TEXT_FORMAT; + +// 相关变量 +private Context mContext; +private String mFileName; +private String mFileDirectory; + +/** + +构造函数,初始化相关变量 + +@param context 应用上下文 +*/ +public TextExport(Context context) { +// 获取文本格式数组 +TEXT_FORMAT = context.getResources().getStringArray(R.array.format_for_exported_note); + +mContext = context; +mFileName = ""; +mFileDirectory = ""; + +} + +/** + +获取文本格式数组中指定下标的元素 +@param id 要获取元素的下标 +@return 文本格式数组中指定下标的元素 +*/ +private String getFormat(int id) { +return TEXT_FORMAT[id]; +} +/** + +将指定id的文件夹及其子note导出为文本 +@param folderId 要导出的文件夹的id +@param ps 输出文本的PrintStream +*/ +private void exportFolderToText(String folderId, PrintStream ps) { +// 查询属于指定文件夹的note +Cursor notesCursor = mContext.getContentResolver().query( +Notes.CONTENT_NOTE_URI, +NOTE_PROJECTION, +NoteColumns.PARENT_ID + "=?", +new String[] { folderId }, +null); +if (notesCursor != null) { +if (notesCursor.moveToFirst()) { +do { +// 输出note的最后修改日期 +ps.println(String.format(getFormat(FORMAT_NOTE_DATE), DateFormat.format( +mContext.getString(R.string.format_datetime_mdhm), +notesCursor.getLong(NOTE_COLUMN_MODIFIED_DATE)))); +// 查询属于指定note的data +String noteId = notesCursor.getString(NOTE_COLUMN_ID); +exportNoteToText(noteId, ps); +} while (notesCursor.moveToNext()); +} +notesCursor.close(); +} +} + +/** + +将指定id的note导出为文本 +@param noteId 要导出的note的id +@param ps 输出文本的PrintStream +*/ +private void exportNoteToText(String noteId, PrintStream ps) { +Cursor dataCursor = mContext.getContentResolver().query( +Notes.CONTENT_DATA_URI, +DATA_PROJECTION, +DataColumns.NOTE_ID + "=?", +new String[] { noteId }, +null); +if (dataCursor != null) { +if (dataCursor.moveToFirst()) { +do { +String mimeType = dataCursor.getString(DATA_COLUMN_MIME_TYPE); +if (DataConstants.CALL_NOTE.equals(mimeType)) { +// 如果是Call Note,则输出电话号码、通话日期和附件位置 +String phoneNumber = dataCursor.getString(DATA_COLUMN_PHONE_NUMBER); +long callDate = dataCursor.getLong(DATA_COLUMN_CALL_DATE); +String location = dataCursor.getString(DATA_COLUMN_CONTENT); + +// 如果电话号码不为空,则输出 +if (!TextUtils.isEmpty(phoneNumber)) { +ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), +phoneNumber)); +} +// 输出通话日期 +ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), DateFormat +.format(mContext.getString(R.string.format_datetime_mdhm), +callDate))); +// 如果附件位置不为空,则输出 +if (!TextUtils.isEmpty(location)) { +ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), +location)); +} +} else if (DataConstants.NOTE.equals(mimeType)) { +// 如果是普通Note,则输出内容 +String content = dataCursor.getString(DATA_COLUMN_CONTENT); +if (!TextUtils.isEmpty(content)) { +ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), +content)); +} +} +} while (dataCursor.moveToNext()); +} +dataCursor.close(); +} +// 在不同note之间输出一个空行 +try { +ps.write(new byte[] { Character.LINE_SEPARATOR, Character.LETTER_NUMBER }); +} catch (IOException e) { +Log.e(TAG, e.toString()); +} +} + +/** + +将所有note导出为文本 + +@return 导出状态 +*/ +public int exportToText() { +if (!externalStorageAvailable()) { +// 检查外部存储是否挂载,未挂载则返回错误 +Log.d(TAG, "Media was not mounted"); +return STATE_SD_CARD_UNMOUONTED; +} + +// 获取输出流 +PrintStream ps = getExportToTextPrintStream(); +if (ps == null) { +Log.e(TAG, "get print stream error"); +return STATE_SYSTEM_ERROR; +} + +// 首先导出各个文件夹及其子note +Cursor folderCursor = mContext.getContentResolver().query( +Notes.CONTENT_NOTE_URI, +NOTE_PROJECTION, +"(" + NoteColumns.TYPE + "=" + Notes.TYPE_FOLDER + " AND " ++ NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + ") OR " ++ NoteColumns.ID + "=" + Notes.ID_CALL_RECORD_FOLDER, +null, +null); +if (folderCursor != null) { +if (folderCursor.moveToFirst()) { +do { +// 输出文件夹的名称 +String folderName = ""; +if(folderCursor.getLong(NOTE_COLUMN_ID) == Notes.ID_CALL_RECORD_FOLDER) { +folderName = mContext.getString(R.string.call_record_folder_name); +} else { +folderName = folderCursor.getString(NOTE_COLUMN_SNIPPET); +} +if (!TextUtils.isEmpty(folderName)) { +ps.println(String.format(getFormat(FORMAT_FOLDER_NAME), folderName)); +} +String folderId = folderCursor.getString(NOTE_COLUMN_ID); +exportFolderToText(folderId, ps); +} while (folderCursor.moveToNext()); +} +folderCursor.close(); +} + +// 导出Root文件夹中的note +Cursor noteCursor = mContext.getContentResolver().query( +Notes.CONTENT_NOTE_URI, +NOTE_PROJECTION, +NoteColumns.TYPE + "=" + +Notes.TYPE_NOTE + " AND " + NoteColumns.PARENT_ID ++ "=0", +null, +null); +if (noteCursor != null) { +if (noteCursor.moveToFirst()) { +do { +// 输出note的最后修改日期 +ps.println(String.format(getFormat(FORMAT_NOTE_DATE), DateFormat.format( +mContext.getString(R.string.format_datetime_mdhm), +noteCursor.getLong(NOTE_COLUMN_MODIFIED_DATE)))); +// 查询属于指定note的data +String noteId = noteCursor.getString(NOTE_COLUMN_ID); +exportNoteToText(noteId, ps); +} while (noteCursor.moveToNext()); +} +noteCursor.close(); +} + +ps.close(); + +return STATE_SUCCESS; + +} + +/** + +获取输出流,指向SD卡上的文件 + +@return 输出流PrintStream +*/ +private PrintStream getExportToTextPrintStream() { +File file = generateFileMountedOnSDcard( +mContext, +R.string.file_path, +R.string.file_name_txt_format); +if (file == null) { +Log.e(TAG, "create file to exported failed"); +return null; +} + +mFileName = file.getName(); +mFileDirectory = mContext.getString(R.string.file_path); +PrintStream ps = null; +try { +FileOutputStream fos = new FileOutputStream(file); +ps = new PrintStream(fos); +} catch (FileNotFoundException e) { +e.printStackTrace(); +return null; +} catch (NullPointerException e) { +e.printStackTrace(); +return null; +} +return ps; + +} + +} + +/** + +生成文本文件以存储导入的数据 +*/ +private static File generateFileMountedOnSDcard(Context context, int filePathResId, int fileNameFormatResId) { +// 使用StringBuilder的效率更高 +StringBuilder sb = new StringBuilder(); +// 获取SD卡目录并添加文件路径 +sb.append(Environment.getExternalStorageDirectory()); +sb.append(context.getString(filePathResId)); +// 创建目录 +File filedir = new File(sb.toString()); +// 添加文件名 +sb.append(context.getString( +fileNameFormatResId, +DateFormat.format(context.getString(R.string.format_date_ymd), +System.currentTimeMillis()))); +// 创建文件 +File file = new File(sb.toString()); + +try { +// 判断目录是否存在,如不存在则创建该目录 +if (!filedir.exists()) { +filedir.mkdir(); +} +// 判断文件是否存在,如不存在则创建该文件 +if (!file.exists()) { +file.createNewFile(); +} +return file; +} catch (SecurityException e) { +e.printStackTrace(); +} catch (IOException e) { +e.printStackTrace(); +} +return null; + } diff --git a/Notes-master2/src/net/micode/notes/tool/DataUtils.java b/Notes-master2/src/net/micode/notes/tool/DataUtils.java index 2a14982..3d3ed8e 100644 --- a/Notes-master2/src/net/micode/notes/tool/DataUtils.java +++ b/Notes-master2/src/net/micode/notes/tool/DataUtils.java @@ -36,260 +36,269 @@ import java.util.HashSet; public class DataUtils { - public static final String TAG = "DataUtils"; - public static boolean batchDeleteNotes(ContentResolver resolver, HashSet ids) { - if (ids == null) { - Log.d(TAG, "the ids is null"); - return true; - } - if (ids.size() == 0) { - Log.d(TAG, "no id is in the hashset"); - return true; - } - - ArrayList operationList = new ArrayList(); - for (long id : ids) { - if(id == Notes.ID_ROOT_FOLDER) { - Log.e(TAG, "Don't delete system folder root"); - continue; - } - ContentProviderOperation.Builder builder = ContentProviderOperation - .newDelete(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id)); - operationList.add(builder.build()); - } - try { - ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList); - if (results == null || results.length == 0 || results[0] == null) { - Log.d(TAG, "delete notes failed, ids:" + ids.toString()); - return false; - } - return true; - } catch (RemoteException e) { - Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); - } catch (OperationApplicationException e) { - Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); - } - return false; - } - - public static void moveNoteToFoler(ContentResolver resolver, long id, long srcFolderId, long desFolderId) { - ContentValues values = new ContentValues(); - values.put(NoteColumns.PARENT_ID, desFolderId); - values.put(NoteColumns.ORIGIN_PARENT_ID, srcFolderId); - values.put(NoteColumns.LOCAL_MODIFIED, 1); - resolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id), values, null, null); - } - - public static boolean batchMoveToFolder(ContentResolver resolver, HashSet ids, - long folderId) { - if (ids == null) { - Log.d(TAG, "the ids is null"); - return true; - } - - ArrayList operationList = new ArrayList(); - for (long id : ids) { - ContentProviderOperation.Builder builder = ContentProviderOperation - .newUpdate(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id)); - builder.withValue(NoteColumns.PARENT_ID, folderId); - builder.withValue(NoteColumns.LOCAL_MODIFIED, 1); - operationList.add(builder.build()); - } - - try { - ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList); - if (results == null || results.length == 0 || results[0] == null) { - Log.d(TAG, "delete notes failed, ids:" + ids.toString()); - return false; - } - return true; - } catch (RemoteException e) { - Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); - } catch (OperationApplicationException e) { - Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); - } - return false; - } - - /** - * Get the all folder count except system folders {@link Notes#TYPE_SYSTEM}} - */ - public static int getUserFolderCount(ContentResolver resolver) { - Cursor cursor =resolver.query(Notes.CONTENT_NOTE_URI, - new String[] { "COUNT(*)" }, - NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>?", - new String[] { String.valueOf(Notes.TYPE_FOLDER), String.valueOf(Notes.ID_TRASH_FOLER)}, - null); - - int count = 0; - if(cursor != null) { - if(cursor.moveToFirst()) { - try { - count = cursor.getInt(0); - } catch (IndexOutOfBoundsException e) { - Log.e(TAG, "get folder count failed:" + e.toString()); - } finally { - cursor.close(); - } - } - } - return count; - } - - public static boolean visibleInNoteDatabase(ContentResolver resolver, long noteId, int type) { - Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), - null, - NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER, - new String [] {String.valueOf(type)}, - null); - - boolean exist = false; - if (cursor != null) { - if (cursor.getCount() > 0) { - exist = true; - } - cursor.close(); - } - return exist; - } - - public static boolean existInNoteDatabase(ContentResolver resolver, long noteId) { - Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), - null, null, null, null); - - boolean exist = false; - if (cursor != null) { - if (cursor.getCount() > 0) { - exist = true; - } - cursor.close(); - } - return exist; - } - - public static boolean existInDataDatabase(ContentResolver resolver, long dataId) { - Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), - null, null, null, null); - - boolean exist = false; - if (cursor != null) { - if (cursor.getCount() > 0) { - exist = true; - } - cursor.close(); - } - return exist; - } - - public static boolean checkVisibleFolderName(ContentResolver resolver, String name) { - Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, null, - NoteColumns.TYPE + "=" + Notes.TYPE_FOLDER + - " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + - " AND " + NoteColumns.SNIPPET + "=?", - new String[] { name }, null); - boolean exist = false; - if(cursor != null) { - if(cursor.getCount() > 0) { - exist = true; - } - cursor.close(); - } - return exist; - } - - public static HashSet getFolderNoteWidget(ContentResolver resolver, long folderId) { - Cursor c = resolver.query(Notes.CONTENT_NOTE_URI, - new String[] { NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE }, - NoteColumns.PARENT_ID + "=?", - new String[] { String.valueOf(folderId) }, - null); - - HashSet set = null; - if (c != null) { - if (c.moveToFirst()) { - set = new HashSet(); - do { - try { - AppWidgetAttribute widget = new AppWidgetAttribute(); - widget.widgetId = c.getInt(0); - widget.widgetType = c.getInt(1); - set.add(widget); - } catch (IndexOutOfBoundsException e) { - Log.e(TAG, e.toString()); - } - } while (c.moveToNext()); - } - c.close(); - } - return set; - } - - public static String getCallNumberByNoteId(ContentResolver resolver, long noteId) { - Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI, - new String [] { CallNote.PHONE_NUMBER }, - CallNote.NOTE_ID + "=? AND " + CallNote.MIME_TYPE + "=?", - new String [] { String.valueOf(noteId), CallNote.CONTENT_ITEM_TYPE }, - null); - - if (cursor != null && cursor.moveToFirst()) { - try { - return cursor.getString(0); - } catch (IndexOutOfBoundsException e) { - Log.e(TAG, "Get call number fails " + e.toString()); - } finally { - cursor.close(); - } - } - return ""; - } - - public static long getNoteIdByPhoneNumberAndCallDate(ContentResolver resolver, String phoneNumber, long callDate) { - Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI, - new String [] { CallNote.NOTE_ID }, - CallNote.CALL_DATE + "=? AND " + CallNote.MIME_TYPE + "=? AND PHONE_NUMBERS_EQUAL(" - + CallNote.PHONE_NUMBER + ",?)", - new String [] { String.valueOf(callDate), CallNote.CONTENT_ITEM_TYPE, phoneNumber }, - null); - - if (cursor != null) { - if (cursor.moveToFirst()) { - try { - return cursor.getLong(0); - } catch (IndexOutOfBoundsException e) { - Log.e(TAG, "Get call note id fails " + e.toString()); - } - } - cursor.close(); - } - return 0; - } +public static final String TAG = "DataUtils"; //静态常量,日志标记 +//批量删除笔记,返回操作成功与否的布尔值 +public static boolean batchDeleteNotes(ContentResolver resolver, HashSet ids) { +if (ids == null) { //如果id集合为空,记录日志并返回true +Log.d(TAG, "the ids is null"); +return true; +} +if (ids.size() == 0) { //如果集合中没有id,记录日志并返回true +Log.d(TAG, "no id is in the hashset"); +return true; +} +//创建操作列表 +ArrayList operationList = new ArrayList(); +//遍历id集合,为每个id创建一个对应的删除操作,并添加到操作列表中 +for (long id : ids) { +if(id == Notes.ID_ROOT_FOLDER) { //如果是系统文件夹根目录,记录日志并跳过 +Log.e(TAG, "Don't delete system folder root"); +continue; +} +ContentProviderOperation.Builder builder = ContentProviderOperation +.newDelete(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id)); +operationList.add(builder.build()); +} +try { //调用applyBatch方法执行操作 +ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList); +//检查是否操作成功,如不成功记录日志并返回false,成功返回true +if (results == null || results.length == 0 || results[0] == null) { +Log.d(TAG, "delete notes failed, ids:" + ids.toString()); +return false; +} +return true; +} catch (RemoteException e) { //捕获异常并记录日志,返回false +Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); +} catch (OperationApplicationException e) { //同上 +Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); +} +return false; +} +//移动某个笔记到指定文件夹 +public static void moveNoteToFoler(ContentResolver resolver, long id, long srcFolderId, long desFolderId) { +//设置更新值 +ContentValues values = new ContentValues(); +values.put(NoteColumns.PARENT_ID, desFolderId); +values.put(NoteColumns.ORIGIN_PARENT_ID, srcFolderId); +values.put(NoteColumns.LOCAL_MODIFIED, 1); +resolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id), values, null, null); +} +//批量移动笔记到指定文件夹 +public static boolean batchMoveToFolder(ContentResolver resolver, HashSet ids, long folderId) { +if (ids == null) { //同上,判断id集合是否合法 +Log.d(TAG, "the ids is null"); +return true; +} +ArrayList operationList = new ArrayList(); +//遍历id集合,为每个id创建一个对应的更新操作,添加到操作列表中 +for (long id : ids) { +ContentProviderOperation.Builder builder = ContentProviderOperation +.newUpdate(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id)); +builder.withValue(NoteColumns.PARENT_ID, folderId); +builder.withValue(NoteColumns.LOCAL_MODIFIED, 1); +operationList.add(builder.build()); +} +try { //同上,批量执行操作,并检查是否成功 +ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList); +if (results == null || results.length == 0 || results[0] == null) { +Log.d(TAG, "delete notes failed, ids:" + ids.toString()); +return false; +} +return true; +} catch (RemoteException e) { +Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); +} catch (OperationApplicationException e) { +Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); +} +return false; +} +//获取用户文件夹数量(除系统文件夹) +public static int getUserFolderCount(ContentResolver resolver) { +Cursor cursor =resolver.query(Notes.CONTENT_NOTE_URI, +new String[] { "COUNT(*)" }, //查询总数 +NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>?", +new String[] { String.valueOf(Notes.TYPE_FOLDER), String.valueOf(Notes.ID_TRASH_FOLER)}, +null); +int count = 0; +if(cursor != null) { //如果返回的游标不为空 +if(cursor.moveToFirst()) { +try { +count = cursor.getInt(0); +} catch (IndexOutOfBoundsException e) { +Log.e(TAG, "get folder count failed:" + e.toString()); +} finally { +cursor.close(); +} +} +} +return count; +} +//判断指定类型笔记是否在数据库中可见(不在回收站) +public static boolean visibleInNoteDatabase(ContentResolver resolver, long noteId, int type) { +Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), +null, +NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER, +new String [] {String.valueOf(type)}, +null); +boolean exist = false; +if (cursor != null) { +if (cursor.getCount() > 0) { +exist = true; +} +cursor.close(); +} +return exist; +} +//判断指定id的笔记是否存在于数据库中 +public static boolean existInNoteDatabase(ContentResolver resolver, long noteId) { +Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), +null, null, null, null); +boolean exist = false; +if (cursor != null) { +if (cursor.getCount() > 0) { +exist = true; +} +cursor.close(); +} +return exist; +} +//判断指定id的数据是否存在于数据库中 +public static boolean existInDataDatabase(ContentResolver resolver, long dataId) { +Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), +null, null, null, null); +boolean exist = false; +if (cursor != null) { +if (cursor.getCount() > 0) { +exist = true; +} +cursor.close(); +} +return exist; +} +//判断指定文件夹名称是否已存在于已有的文件夹名称中 +public static boolean checkVisibleFolderName(ContentResolver resolver, String name) { +Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, null, +NoteColumns.TYPE + "=" + Notes.TYPE_FOLDER + " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + " AND " + NoteColumns.SNIPPET + "=?", +new String[] { name }, null); +boolean exist = false; +if(cursor != null) { +if(cursor.getCount() > 0) { +exist = true; +} +cursor.close(); +} +return exist; +} +//获取某个文件夹内的所有笔记的小部件属性 +public static HashSet getFolderNoteWidget(ContentResolver resolver, long folderId) { +Cursor c = resolver.query(Notes.CONTENT_NOTE_URI, +new String[] { NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE }, +NoteColumns.PARENT_ID + "=?", +new String[] { String.valueOf(folderId) }, +null); +HashSet set = null; +if (c != null) { +if (c.moveToFirst()) { +set = new HashSet(); +do { +try { +AppWidgetAttribute widget = new AppWidgetAttribute(); +widget.widgetId = c.getInt(0); +widget.widgetType = c.getInt(1); +set.add(widget); +} catch (IndexOutOfBoundsException e) { +Log.e(TAG, e.toString()); +} +} while (c.moveToNext()); +} +c.close(); +} +return set; +} + // 获取通话笔记中的电话号码 +public static String getCallNumberByNoteId(ContentResolver resolver, long noteId) { +// 构建查询参数 +Cursor cursor = resolver.query( +Notes.CONTENT_DATA_URI, // 数据URI +new String[]{CallNote.PHONE_NUMBER}, // 返回的列 +// 查询条件 +CallNote.NOTE_ID + "=? AND " + CallNote.MIME_TYPE + "=?", +// 查询参数 +new String[]{String.valueOf(noteId), CallNote.CONTENT_ITEM_TYPE}, +null // 排序 +); +if (cursor != null && cursor.moveToFirst()) { +try { +return cursor.getString(0); // 返回电话号码 +} catch (IndexOutOfBoundsException e) { +Log.e(TAG, "获取电话号码失败 " + e.toString()); +} finally { +cursor.close(); +} +} +return ""; // 没查到电话号码,返回空字符串 +} - public static String getSnippetById(ContentResolver resolver, long noteId) { - Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, - new String [] { NoteColumns.SNIPPET }, - NoteColumns.ID + "=?", - new String [] { String.valueOf(noteId)}, - null); +// 根据电话号码和通话时间,获取通话笔记的ID +public static long getNoteIdByPhoneNumberAndCallDate(ContentResolver resolver, String phoneNumber, long callDate) { +// 构建查询参数 +Cursor cursor = resolver.query( +Notes.CONTENT_DATA_URI, // 数据URI +new String[]{CallNote.NOTE_ID}, // 返回的列 +// 查询条件 +CallNote.CALL_DATE + "=? AND " + CallNote.MIME_TYPE + "=? AND PHONE_NUMBERS_EQUAL(" ++ CallNote.PHONE_NUMBER + ",?)", +// 查询参数 +new String[]{String.valueOf(callDate), CallNote.CONTENT_ITEM_TYPE, phoneNumber}, +null // 排序 +); +if (cursor != null) { +if (cursor.moveToFirst()) { +try { +return cursor.getLong(0); // 返回通话笔记的ID +} catch (IndexOutOfBoundsException e) { +Log.e(TAG, "获取通话笔记ID失败 " + e.toString()); +} +} +cursor.close(); +} +return 0; // 没查到通话笔记,返回0 +} - if (cursor != null) { - String snippet = ""; - if (cursor.moveToFirst()) { - snippet = cursor.getString(0); - } - cursor.close(); - return snippet; - } - throw new IllegalArgumentException("Note is not found with id: " + noteId); - } +// 根据笔记ID获取笔记片段 +public static String getSnippetById(ContentResolver resolver, long noteId) { +// 构建查询参数 +Cursor cursor = resolver.query( +Notes.CONTENT_NOTE_URI, // 笔记URI +new String[]{NoteColumns.SNIPPET}, // 返回的列 +// 查询条件 +NoteColumns.ID + "=?", +// 查询参数 +new String[]{String.valueOf(noteId)}, +null // 排序 +); +if (cursor != null) { +String snippet = ""; +if (cursor.moveToFirst()) { +snippet = cursor.getString(0); // 返回笔记片段 +} +cursor.close(); +return snippet; +} +// 没查到笔记,抛出异常 +throw new IllegalArgumentException("未找到ID为" + noteId + "的笔记"); +} - public static String getFormattedSnippet(String snippet) { - if (snippet != null) { - snippet = snippet.trim(); - int index = snippet.indexOf('\n'); - if (index != -1) { - snippet = snippet.substring(0, index); - } - } - return snippet; - } +// 获取格式化后的笔记片段 +public static String getFormattedSnippet(String snippet) { +if (snippet != null) { +// 去掉首尾空格 +snippet = snippet.trim(); +// 找到第一个换行符 +int index = snippet.indexOf('\n'); +if (index != -1) { +snippet = snippet.substring(0, index); // 截取第一个换行符之前的片段 +} +} +return snippet; } diff --git a/Notes-master2/src/net/micode/notes/tool/GTaskStringUtils.java b/Notes-master2/src/net/micode/notes/tool/GTaskStringUtils.java index 666b729..bdc517d 100644 --- a/Notes-master2/src/net/micode/notes/tool/GTaskStringUtils.java +++ b/Notes-master2/src/net/micode/notes/tool/GTaskStringUtils.java @@ -17,97 +17,63 @@ package net.micode.notes.tool; public class GTaskStringUtils { - - public final static String GTASK_JSON_ACTION_ID = "action_id"; - - public final static String GTASK_JSON_ACTION_LIST = "action_list"; - - public final static String GTASK_JSON_ACTION_TYPE = "action_type"; - - public final static String GTASK_JSON_ACTION_TYPE_CREATE = "create"; - - public final static String GTASK_JSON_ACTION_TYPE_GETALL = "get_all"; - - public final static String GTASK_JSON_ACTION_TYPE_MOVE = "move"; - - public final static String GTASK_JSON_ACTION_TYPE_UPDATE = "update"; - - public final static String GTASK_JSON_CREATOR_ID = "creator_id"; - - public final static String GTASK_JSON_CHILD_ENTITY = "child_entity"; - - public final static String GTASK_JSON_CLIENT_VERSION = "client_version"; - - public final static String GTASK_JSON_COMPLETED = "completed"; - - public final static String GTASK_JSON_CURRENT_LIST_ID = "current_list_id"; - - public final static String GTASK_JSON_DEFAULT_LIST_ID = "default_list_id"; - - public final static String GTASK_JSON_DELETED = "deleted"; - - public final static String GTASK_JSON_DEST_LIST = "dest_list"; - - public final static String GTASK_JSON_DEST_PARENT = "dest_parent"; - - public final static String GTASK_JSON_DEST_PARENT_TYPE = "dest_parent_type"; - - public final static String GTASK_JSON_ENTITY_DELTA = "entity_delta"; - - public final static String GTASK_JSON_ENTITY_TYPE = "entity_type"; - - public final static String GTASK_JSON_GET_DELETED = "get_deleted"; - - public final static String GTASK_JSON_ID = "id"; - - public final static String GTASK_JSON_INDEX = "index"; - - public final static String GTASK_JSON_LAST_MODIFIED = "last_modified"; - - public final static String GTASK_JSON_LATEST_SYNC_POINT = "latest_sync_point"; - - public final static String GTASK_JSON_LIST_ID = "list_id"; - - public final static String GTASK_JSON_LISTS = "lists"; - - public final static String GTASK_JSON_NAME = "name"; - - public final static String GTASK_JSON_NEW_ID = "new_id"; - - public final static String GTASK_JSON_NOTES = "notes"; - - public final static String GTASK_JSON_PARENT_ID = "parent_id"; - - public final static String GTASK_JSON_PRIOR_SIBLING_ID = "prior_sibling_id"; - - public final static String GTASK_JSON_RESULTS = "results"; - - public final static String GTASK_JSON_SOURCE_LIST = "source_list"; - - public final static String GTASK_JSON_TASKS = "tasks"; - - public final static String GTASK_JSON_TYPE = "type"; - - public final static String GTASK_JSON_TYPE_GROUP = "GROUP"; - - public final static String GTASK_JSON_TYPE_TASK = "TASK"; - - public final static String GTASK_JSON_USER = "user"; - - public final static String MIUI_FOLDER_PREFFIX = "[MIUI_Notes]"; - - public final static String FOLDER_DEFAULT = "Default"; - - public final static String FOLDER_CALL_NOTE = "Call_Note"; - - public final static String FOLDER_META = "METADATA"; - - public final static String META_HEAD_GTASK_ID = "meta_gid"; - - public final static String META_HEAD_NOTE = "meta_note"; - - public final static String META_HEAD_DATA = "meta_data"; - - public final static String META_NOTE_NAME = "[META INFO] DON'T UPDATE AND DELETE"; - -} +// Google Tasks JSON中的键 +public final static String GTASK_JSON_ACTION_ID = "action_id"; // 动作id +public final static String GTASK_JSON_ACTION_LIST = "action_list"; // 动作列表 +public final static String GTASK_JSON_ACTION_TYPE = "action_type"; // 动作类型 +public final static String GTASK_JSON_ACTION_TYPE_CREATE = "create"; // 创建动作 +public final static String GTASK_JSON_ACTION_TYPE_GETALL = "get_all"; // 获取所有动作 +public final static String GTASK_JSON_ACTION_TYPE_MOVE = "move"; // 移动动作 +public final static String GTASK_JSON_ACTION_TYPE_UPDATE = "update"; // 更新动作 +public final static String GTASK_JSON_CREATOR_ID = "creator_id"; // 创建者id +public final static String GTASK_JSON_CHILD_ENTITY = "child_entity"; // 子实体 +public final static String GTASK_JSON_CLIENT_VERSION = "client_version"; // 客户端版本 +public final static String GTASK_JSON_COMPLETED = "completed"; // 完成标志 +public final static String GTASK_JSON_CURRENT_LIST_ID = "current_list_id"; // 当前列表id +public final static String GTASK_JSON_DEFAULT_LIST_ID = "default_list_id"; // 默认列表id +public final static String GTASK_JSON_DELETED = "deleted"; // 删除标志 +public final static String GTASK_JSON_DEST_LIST = "dest_list"; // 目标列表 +public final static String GTASK_JSON_DEST_PARENT = "dest_parent"; // 目标父节点 +public final static String GTASK_JSON_DEST_PARENT_TYPE = "dest_parent_type"; // 目标父节点类型 +public final static String GTASK_JSON_ENTITY_DELTA = "entity_delta"; // 实体差异 +public final static String GTASK_JSON_ENTITY_TYPE = "entity_type"; // 实体类型 +public final static String GTASK_JSON_GET_DELETED = "get_deleted"; // 获取删除的实体 +public final static String GTASK_JSON_ID = "id"; // 实体id +public final static String GTASK_JSON_INDEX = "index"; // 序号 +public final static String GTASK_JSON_LAST_MODIFIED = "last_modified"; // 最后修改时间 +public final static String GTASK_JSON_LATEST_SYNC_POINT = "latest_sync_point"; // 最新同步时间点 +public final static String GTASK_JSON_LIST_ID = "list_id"; // 列表id +public final static String GTASK_JSON_LISTS = "lists"; // 列表 +public final static String GTASK_JSON_NAME = "name"; // 名称 +public final static String GTASK_JSON_NEW_ID = "new_id"; // 新的实体id +public final static String GTASK_JSON_NOTES = "notes"; // 备注 +public final static String GTASK_JSON_PARENT_ID = "parent_id"; // 父节点id +public final static String GTASK_JSON_PRIOR_SIBLING_ID = "prior_sibling_id"; // 前置兄弟节点id +public final static String GTASK_JSON_RESULTS = "results"; // 结果 +public final static String GTASK_JSON_SOURCE_LIST = "source_list"; // 源列表 +public final static String GTASK_JSON_TASKS = "tasks"; // 任务 +public final static String GTASK_JSON_TYPE = "type"; // 类型 +public final static String GTASK_JSON_TYPE_GROUP = "GROUP"; // 分组类型 +public final static String GTASK_JSON_TYPE_TASK = "TASK"; // 任务类型 +public final static String GTASK_JSON_USER = "user"; // 用户 + +// MIUI备忘录文件夹前缀 +public final static String MIUI_FOLDER_PREFFIX = "[MIUI_Notes]"; + +// 默认文件夹名 +public final static String FOLDER_DEFAULT = "Default"; + +// 呼叫备忘录文件夹名 +public final static String FOLDER_CALL_NOTE = "Call_Note"; + +// 元数据文件夹名 +public final static String FOLDER_META = "METADATA"; + +// 元数据键名 +public final static String META_HEAD_GTASK_ID = "meta_gid"; // Google Tasks id +public final static String META_HEAD_NOTE = "meta_note"; // 备注 +public final static String META_HEAD_DATA = "meta_data"; // 数据 + +// 元数据备注名 +public final static String META_NOTE_NAME = "[META INFO] DON'T UPDATE AND DELETE"; // 不要更新和删除的元数据备注 +} \ No newline at end of file diff --git a/Notes-master2/src/net/micode/notes/tool/ResourceParser.java b/Notes-master2/src/net/micode/notes/tool/ResourceParser.java index 1ad3ad6..aca7ccd 100644 --- a/Notes-master2/src/net/micode/notes/tool/ResourceParser.java +++ b/Notes-master2/src/net/micode/notes/tool/ResourceParser.java @@ -22,160 +22,200 @@ import android.preference.PreferenceManager; import net.micode.notes.R; import net.micode.notes.ui.NotesPreferenceActivity; +/** + +资源解析器 +*/ public class ResourceParser { - public static final int YELLOW = 0; - public static final int BLUE = 1; - public static final int WHITE = 2; - public static final int GREEN = 3; - public static final int RED = 4; - - public static final int BG_DEFAULT_COLOR = YELLOW; - - public static final int TEXT_SMALL = 0; - public static final int TEXT_MEDIUM = 1; - public static final int TEXT_LARGE = 2; - public static final int TEXT_SUPER = 3; - - public static final int BG_DEFAULT_FONT_SIZE = TEXT_MEDIUM; - - public static class NoteBgResources { - private final static int [] BG_EDIT_RESOURCES = new int [] { - R.drawable.edit_yellow, - R.drawable.edit_blue, - R.drawable.edit_white, - R.drawable.edit_green, - R.drawable.edit_red - }; - - private final static int [] BG_EDIT_TITLE_RESOURCES = new int [] { - R.drawable.edit_title_yellow, - R.drawable.edit_title_blue, - R.drawable.edit_title_white, - R.drawable.edit_title_green, - R.drawable.edit_title_red - }; - - public static int getNoteBgResource(int id) { - return BG_EDIT_RESOURCES[id]; - } - - public static int getNoteTitleBgResource(int id) { - return BG_EDIT_TITLE_RESOURCES[id]; - } - } - - public static int getDefaultBgId(Context context) { - if (PreferenceManager.getDefaultSharedPreferences(context).getBoolean( - NotesPreferenceActivity.PREFERENCE_SET_BG_COLOR_KEY, false)) { - return (int) (Math.random() * NoteBgResources.BG_EDIT_RESOURCES.length); - } else { - return BG_DEFAULT_COLOR; - } - } - - public static class NoteItemBgResources { - private final static int [] BG_FIRST_RESOURCES = new int [] { - R.drawable.list_yellow_up, - R.drawable.list_blue_up, - R.drawable.list_white_up, - R.drawable.list_green_up, - R.drawable.list_red_up - }; - - private final static int [] BG_NORMAL_RESOURCES = new int [] { - R.drawable.list_yellow_middle, - R.drawable.list_blue_middle, - R.drawable.list_white_middle, - R.drawable.list_green_middle, - R.drawable.list_red_middle - }; - - private final static int [] BG_LAST_RESOURCES = new int [] { - R.drawable.list_yellow_down, - R.drawable.list_blue_down, - R.drawable.list_white_down, - R.drawable.list_green_down, - R.drawable.list_red_down, - }; - - private final static int [] BG_SINGLE_RESOURCES = new int [] { - R.drawable.list_yellow_single, - R.drawable.list_blue_single, - R.drawable.list_white_single, - R.drawable.list_green_single, - R.drawable.list_red_single - }; - - public static int getNoteBgFirstRes(int id) { - return BG_FIRST_RESOURCES[id]; - } - - public static int getNoteBgLastRes(int id) { - return BG_LAST_RESOURCES[id]; - } - - public static int getNoteBgSingleRes(int id) { - return BG_SINGLE_RESOURCES[id]; - } - - public static int getNoteBgNormalRes(int id) { - return BG_NORMAL_RESOURCES[id]; - } - - public static int getFolderBgRes() { - return R.drawable.list_folder; - } - } - - public static class WidgetBgResources { - private final static int [] BG_2X_RESOURCES = new int [] { - R.drawable.widget_2x_yellow, - R.drawable.widget_2x_blue, - R.drawable.widget_2x_white, - R.drawable.widget_2x_green, - R.drawable.widget_2x_red, - }; - - public static int getWidget2xBgResource(int id) { - return BG_2X_RESOURCES[id]; - } - - private final static int [] BG_4X_RESOURCES = new int [] { - R.drawable.widget_4x_yellow, - R.drawable.widget_4x_blue, - R.drawable.widget_4x_white, - R.drawable.widget_4x_green, - R.drawable.widget_4x_red - }; - - public static int getWidget4xBgResource(int id) { - return BG_4X_RESOURCES[id]; - } - } - - public static class TextAppearanceResources { - private final static int [] TEXTAPPEARANCE_RESOURCES = new int [] { - R.style.TextAppearanceNormal, - R.style.TextAppearanceMedium, - R.style.TextAppearanceLarge, - R.style.TextAppearanceSuper - }; - - public static int getTexAppearanceResource(int id) { - /** - * HACKME: Fix bug of store the resource id in shared preference. - * The id may larger than the length of resources, in this case, - * return the {@link ResourceParser#BG_DEFAULT_FONT_SIZE} - */ - if (id >= TEXTAPPEARANCE_RESOURCES.length) { - return BG_DEFAULT_FONT_SIZE; - } - return TEXTAPPEARANCE_RESOURCES[id]; - } - - public static int getResourcesSize() { - return TEXTAPPEARANCE_RESOURCES.length; - } - } +//定义颜色常量 +public static final int YELLOW = 0; +public static final int BLUE = 1; +public static final int WHITE = 2; +public static final int GREEN = 3; +public static final int RED = 4; + +//设置默认背景颜色和字体大小 +public static final int BG_DEFAULT_COLOR = YELLOW; +public static final int TEXT_SMALL = 0; +public static final int TEXT_MEDIUM = 1; +public static final int TEXT_LARGE = 2; +public static final int TEXT_SUPER = 3; +public static final int BG_DEFAULT_FONT_SIZE = TEXT_MEDIUM; + +/** + +记事本背景资源 +*/ +public static class NoteBgResources { + +//编辑背景资源 +private final static int [] BG_EDIT_RESOURCES = new int [] { +R.drawable.edit_yellow, +R.drawable.edit_blue, +R.drawable.edit_white, +R.drawable.edit_green, +R.drawable.edit_red +}; + +//编辑标题背景资源 +private final static int [] BG_EDIT_TITLE_RESOURCES = new int [] { +R.drawable.edit_title_yellow, +R.drawable.edit_title_blue, +R.drawable.edit_title_white, +R.drawable.edit_title_green, +R.drawable.edit_title_red +}; + +//获取背景资源 +public static int getNoteBgResource(int id) { +return BG_EDIT_RESOURCES[id]; +} + +//获取标题背景资源 +public static int getNoteTitleBgResource(int id) { +return BG_EDIT_TITLE_RESOURCES[id]; +} + +} + +/** + +记事列表项背景资源 +*/ +public static class NoteItemBgResources { + +//列表项第一个背景资源 +private final static int [] BG_FIRST_RESOURCES = new int [] { +R.drawable.list_yellow_up, +R.drawable.list_blue_up, +R.drawable.list_white_up, +R.drawable.list_green_up, +R.drawable.list_red_up +}; + +//列表项中间背景资源 +private final static int [] BG_NORMAL_RESOURCES = new int [] { +R.drawable.list_yellow_middle, +R.drawable.list_blue_middle, +R.drawable.list_white_middle, +R.drawable.list_green_middle, +R.drawable.list_red_middle +}; + +//列表项最后一个背景资源 +private final static int [] BG_LAST_RESOURCES = new int [] { +R.drawable.list_yellow_down, +R.drawable.list_blue_down, +R.drawable.list_white_down, +R.drawable.list_green_down, +R.drawable.list_red_down +}; + +//单选列表项背景资源 +private final static int [] BG_SINGLE_RESOURCES = new int [] { +R.drawable.list_yellow_single, +R.drawable.list_blue_single, +R.drawable.list_white_single, +R.drawable.list_green_single, +R.drawable.list_red_single +}; + +//获取列表项第一个背景资源 +public static int getNoteBgFirstRes(int id) { +return BG_FIRST_RESOURCES[id]; +} + +//获取列表项最后一个背景资源 +public static int getNoteBgLastRes(int id) { +return BG_LAST_RESOURCES[id]; +} + +//获取单选列表项背景资源 +public static int getNoteBgSingleRes(int id) { +return BG_SINGLE_RESOURCES[id]; +} + +//获取列表项中间背景资源 +public static int getNoteBgNormalRes(int id) { +return BG_NORMAL_RESOURCES[id]; +} + +//获取文件夹背景资源 +public static int getFolderBgRes() { +return R.drawable.list_folder; +} + } + +/** + +桌面小部件背景资源 +*/ +public static class WidgetBgResources { + +//2x桌面小部件背景资源 +private final static int [] BG_2X_RESOURCES = new int [] { +R.drawable.widget_2x_yellow, +R.drawable.widget_2x_blue, +R.drawable.widget_2x_white, +R.drawable.widget_2x_green, +R.drawable.widget_2x_red +}; + +//获取2x桌面小部件背景资源 +public static int getWidget2xBgResource(int id) { +return BG_2X_RESOURCES[id]; +} + +//4x桌面小部件背景资源 +private final static int [] BG_4X_RESOURCES = new int [] { +R.drawable.widget_4x_yellow, +R.drawable.widget_4x_blue, +R.drawable.widget_4x_white, +R.drawable.widget_4x_green, +R.drawable.widget_4x_red +}; + +//获取4x桌面小部件背景资源 +public static int getWidget4xBgResource(int id) { +return BG_4X_RESOURCES[id]; +} + +} + +/** + +文字外观资源 +*/ +public static class TextAppearanceResources { + +//文字外观资源 +private final static int [] TEXTAPPEARANCE_RESOURCES = new int [] { +R.style.TextAppearanceNormal, +R.style.TextAppearanceMedium, +R.style.TextAppearanceLarge, +R.style.TextAppearanceSuper +}; + +//获取文字外观资源 +public static int getTexAppearanceResource(int id) { + +/** + * HACKME: 修复在共享偏好设置中存储资源id的错误。 + * 如果id大于资源长度,则返回{@link ResourceParser#BG_DEFAULT_FONT_SIZE} + */ + if (id >= TEXTAPPEARANCE_RESOURCES.length) { + return BG_DEFAULT_FONT_SIZE; + } + return TEXTAPPEARANCE_RESOURCES[id]; +} + +//获取资源大小 +public static int getResourcesSize() { +return TEXTAPPEARANCE_RESOURCES.length; +} + +} + +} \ No newline at end of file