From 7e3f9a8e447933582a8b4dccdf6eb6eb037930de Mon Sep 17 00:00:00 2001 From: HZXhuang Date: Sun, 29 Oct 2023 01:57:40 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=99ResourceParser.java=E5=92=8CGTaskStrin?= =?UTF-8?q?gUtils.java=E6=B7=BB=E5=8A=A0=E4=BB=A3=E7=A0=81=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../net/micode/notes/model/WorkingNote.java | 10 ++-- .../java/net/micode/notes/tool/DataUtils.java | 24 +++++++- .../micode/notes/tool/GTaskStringUtils.java | 6 ++ .../net/micode/notes/tool/ResourceParser.java | 56 ++++++++++++++++++ .../res/drawable-hdpi/edit_title_yellow.9.png | Bin 6000 -> 2933 bytes 5 files changed, 89 insertions(+), 7 deletions(-) diff --git a/src/mi_note/app/src/main/java/net/micode/notes/model/WorkingNote.java b/src/mi_note/app/src/main/java/net/micode/notes/model/WorkingNote.java index 714683d..9236f2b 100644 --- a/src/mi_note/app/src/main/java/net/micode/notes/model/WorkingNote.java +++ b/src/mi_note/app/src/main/java/net/micode/notes/model/WorkingNote.java @@ -56,10 +56,10 @@ public class WorkingNote { // 便签的背景颜色 private int mBgColorId; - // 便签的小组件ID + // 便签的小部件ID private int mWidgetId; - // 便签的小组件类型 + // 便签的小部件类型 private int mWidgetType; // 便签所处的文件夹ID @@ -461,12 +461,12 @@ public class WorkingNote { return mFolderId; } - // 获取小组件ID + // 获取小部件ID public int getWidgetId() { return mWidgetId; } - // 获取小组件类型 + // 获取小部件类型 public int getWidgetType() { return mWidgetType; } @@ -489,7 +489,7 @@ public class WorkingNote { /** * Call when user create note from widget - * 用户从小组件创建便签时被调用 + * 用户从小部件创建便签时被调用 */ void onWidgetChanged(); diff --git a/src/mi_note/app/src/main/java/net/micode/notes/tool/DataUtils.java b/src/mi_note/app/src/main/java/net/micode/notes/tool/DataUtils.java index 2a14982..28a7a9e 100644 --- a/src/mi_note/app/src/main/java/net/micode/notes/tool/DataUtils.java +++ b/src/mi_note/app/src/main/java/net/micode/notes/tool/DataUtils.java @@ -34,9 +34,21 @@ import net.micode.notes.ui.NotesListAdapter.AppWidgetAttribute; import java.util.ArrayList; import java.util.HashSet; - +/** + * @author hzx + * 版本:1.0 + * 创建日期:2023/10/29 + * 描述:DataUtils 数据处理工具类 + */ public class DataUtils { public static final String TAG = "DataUtils"; + + /** + * 批量删除便签 + * @param resolver 内容解析器 + * @param ids 便签ID集合 + * @return 是否成功 + */ public static boolean batchDeleteNotes(ContentResolver resolver, HashSet ids) { if (ids == null) { Log.d(TAG, "the ids is null"); @@ -47,19 +59,26 @@ public class DataUtils { return true; } + // 内容操作列表 ArrayList operationList = new ArrayList(); + // 遍历便签ID集合 for (long id : ids) { - if(id == Notes.ID_ROOT_FOLDER) { + 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; } @@ -67,6 +86,7 @@ public class DataUtils { } 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; diff --git a/src/mi_note/app/src/main/java/net/micode/notes/tool/GTaskStringUtils.java b/src/mi_note/app/src/main/java/net/micode/notes/tool/GTaskStringUtils.java index 666b729..2ee1a07 100644 --- a/src/mi_note/app/src/main/java/net/micode/notes/tool/GTaskStringUtils.java +++ b/src/mi_note/app/src/main/java/net/micode/notes/tool/GTaskStringUtils.java @@ -16,6 +16,12 @@ package net.micode.notes.tool; +/** + * @author hzx + * 版本:1.0 + * 创建日期:2023/10/29 + * 描述:GTaskStringUtils google账号同步的字符串工具类,封装一些字符串常量 + */ public class GTaskStringUtils { public final static String GTASK_JSON_ACTION_ID = "action_id"; diff --git a/src/mi_note/app/src/main/java/net/micode/notes/tool/ResourceParser.java b/src/mi_note/app/src/main/java/net/micode/notes/tool/ResourceParser.java index 1ad3ad6..b62f8eb 100644 --- a/src/mi_note/app/src/main/java/net/micode/notes/tool/ResourceParser.java +++ b/src/mi_note/app/src/main/java/net/micode/notes/tool/ResourceParser.java @@ -22,24 +22,43 @@ import android.preference.PreferenceManager; import net.micode.notes.R; import net.micode.notes.ui.NotesPreferenceActivity; +/** + * @author hzx + * 版本:1.0 + * 创建日期:2023/10/29 + * 描述:ResourceParser 资源解析器 + * 封装了一些颜色和字体大小常量,能够通过颜色或字体大小ID获取资源ID + */ 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; + // 默认的颜色 黄色 0 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; + // 默认的字体大小 中等 1 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, @@ -48,6 +67,7 @@ public class ResourceParser { R.drawable.edit_red }; + // 编辑标题背景资源数组 private final static int [] BG_EDIT_TITLE_RESOURCES = new int [] { R.drawable.edit_title_yellow, R.drawable.edit_title_blue, @@ -56,25 +76,39 @@ public class ResourceParser { R.drawable.edit_title_red }; + // 根据背景颜色ID获取便签背景资源ID public static int getNoteBgResource(int id) { return BG_EDIT_RESOURCES[id]; } + // 根据背景颜色ID获取便签标题背景资源ID public static int getNoteTitleBgResource(int id) { return BG_EDIT_TITLE_RESOURCES[id]; } } + /** + * 获取默认的背景颜色ID + * @param context 上下文 + * @return 背景颜色ID + */ public static int getDefaultBgId(Context context) { if (PreferenceManager.getDefaultSharedPreferences(context).getBoolean( NotesPreferenceActivity.PREFERENCE_SET_BG_COLOR_KEY, false)) { + // 设置了随机背景颜色 + // 返回一个随机背景颜色ID return (int) (Math.random() * NoteBgResources.BG_EDIT_RESOURCES.length); } else { + // 返回默认的背景颜色ID 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, @@ -83,6 +117,7 @@ public class ResourceParser { R.drawable.list_red_up }; + // 正常背景资源 private final static int [] BG_NORMAL_RESOURCES = new int [] { R.drawable.list_yellow_middle, R.drawable.list_blue_middle, @@ -91,6 +126,7 @@ public class ResourceParser { R.drawable.list_red_middle }; + // 结尾背景资源 private final static int [] BG_LAST_RESOURCES = new int [] { R.drawable.list_yellow_down, R.drawable.list_blue_down, @@ -99,6 +135,7 @@ public class ResourceParser { R.drawable.list_red_down, }; + // 单独的背景资源 private final static int [] BG_SINGLE_RESOURCES = new int [] { R.drawable.list_yellow_single, R.drawable.list_blue_single, @@ -107,28 +144,37 @@ public class ResourceParser { R.drawable.list_red_single }; + // 根据背景颜色ID获取开头背景资源ID public static int getNoteBgFirstRes(int id) { return BG_FIRST_RESOURCES[id]; } + // 根据背景颜色ID获取结尾背景资源ID public static int getNoteBgLastRes(int id) { return BG_LAST_RESOURCES[id]; } + // 根据背景颜色ID获取单独的背景资源ID public static int getNoteBgSingleRes(int id) { return BG_SINGLE_RESOURCES[id]; } + // 根据背景颜色ID获取普通背景资源ID public static int getNoteBgNormalRes(int id) { return BG_NORMAL_RESOURCES[id]; } + // 获取文件夹背景资源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, @@ -137,10 +183,12 @@ public class ResourceParser { R.drawable.widget_2x_red, }; + // 根据背景颜色ID获取小部件背景资源ID 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, @@ -149,12 +197,17 @@ public class ResourceParser { R.drawable.widget_4x_red }; + // 根据背景颜色ID获取小部件背景资源ID 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, @@ -162,18 +215,21 @@ public class ResourceParser { R.style.TextAppearanceSuper }; + // 根据字体大小ID获取字体资源ID 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; } diff --git a/src/mi_note/app/src/main/res/drawable-hdpi/edit_title_yellow.9.png b/src/mi_note/app/src/main/res/drawable-hdpi/edit_title_yellow.9.png index bf8f580aaf01a744d9e7ad6b1464883eb2ed2b60..3fb224f2e719046ceb59f0ac96554169b8118177 100644 GIT binary patch delta 2927 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 literal 6000 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