From 826be213d42fed87bf736af06f88255a71f90d7c Mon Sep 17 00:00:00 2001 From: yuantao Date: Mon, 3 Nov 2025 14:48:48 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BC=98=E5=8C=96=20=E5=A2=9E=E5=BC=BA?= =?UTF-8?q?=E5=BA=94=E7=94=A8=E7=9A=84=E7=A6=BB=E7=BA=BF=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 185 ++-- package.json | 82 +- src/App.vue | 65 +- src/pages/NoteEditorPage.vue | 92 +- src/pages/NoteListPage.vue | 857 +++++++++-------- src/pages/SettingsPage.vue | 232 +++-- src/stores/useAppStore.js | 97 +- src/sw.js | 1690 +++++++++++++++++++++++++++++++++ src/utils/indexedDBStorage.js | 114 +-- src/utils/networkUtils.js | 236 +++++ vite.config.js | 186 ++-- 11 files changed, 2917 insertions(+), 919 deletions(-) create mode 100644 src/sw.js create mode 100644 src/utils/networkUtils.js diff --git a/README.md b/README.md index b98f0c4..788054e 100644 --- a/README.md +++ b/README.md @@ -1,109 +1,130 @@ -# 锤子便签(重制版) +# Smartisan Note 离线支持说明 -这是一个基于 Vue 3、Vite 和 Pinia 的移动端现代化 Web 应用,旨在重现并改进经典的锤子便签应用体验。该项目采用 PWA(渐进式 Web 应用)技术,支持离线使用和安装到主屏幕。 +## 离线功能特性 -## 主要特性 +Smartisan Note 应用支持完整的离线工作模式,确保用户在没有网络连接的情况下也能正常使用所有功能。 -- **便签管理**: 创建、编辑、删除、置顶、加星便签 -- **文件夹管理**: 将便签分类到不同的文件夹中 -- **搜索功能**: 按标题或内容搜索便签 -- **回收站**: 临时存储已删除的便签,支持彻底删除 -- **多种排序方式**: 按更新时间、标题、星标状态排序 -- **PWA 支持**: 可安装为独立应用,支持离线使用 -- **本地存储**: 所有数据存储在浏览器的 IndexedDB 中 -- **富文本编辑**: 支持标题、待办事项、列表、加粗、引用、图片等多种格式 -- **动画效果**: 使用 Oku Motion 实现流畅的动画效果 -- **拖拽排序**: 支持图片拖拽排序 +### 核心离线功能 -## 技术栈 +1. **完整的离线编辑** + - 所有便签的创建、编辑、删除操作都可以在离线状态下完成 + - 支持富文本编辑器的所有功能(标题、待办事项、列表、加粗、引用、图片等) + - 便签数据实时保存到本地 IndexedDB 数据库 -- **框架**: Vue 3 (Composition API) -- **构建工具**: Vite -- **状态管理**: Pinia -- **路由**: Vue Router -- **UI 组件库**: Ionic Vue (部分使用) -- **PWA 支持**: vite-plugin-pwa -- **本地存储**: IndexedDB (通过 `src/utils/indexedDBStorage.js` 封装) -- **CSS 预处理器**: Less -- **动画库**: @oku-ui/motion -- **拖拽库**: vue-draggable-plus +2. **智能数据同步** + - 网络恢复时自动同步离线期间的操作 + - 离线操作队列管理,确保数据一致性 + - 冲突解决机制(时间戳优先) -## 项目结构 +3. **资源缓存** + - 核心静态资源(CSS、JS、图片)缓存到浏览器缓存 + - 应用界面在离线状态下完全可用 + - 字体和图标资源本地缓存 -``` -. -├── android/ # Capacitor Android 项目文件 -├── public/ # 静态资源目录 (图标等) -├── src/ # 源代码目录 -│ ├── App.vue # 根组件 -│ ├── main.js # 应用入口文件 -│ ├── common/ # 通用样式 -│ ├── components/ # 可复用的 UI 组件 -│ ├── pages/ # 页面组件 -│ ├── stores/ # Pinia 状态管理 -│ └── utils/ # 工具函数 -├── index.html # 应用入口 HTML 文件 -├── package.json # 项目依赖和脚本 -├── vite.config.js # Vite 配置文件 -└── capacitor.config.json # Capacitor 配置文件 -``` +4. **网络状态感知** + - 实时检测网络连接状态 + - 离线/在线状态切换时的用户提示 + - 网络类型识别(2G/3G/4G/WiFi) -## 开发与构建 +## 技术实现 -### 前置条件 +### Service Worker -确保已安装 Node.js (>=14) 和 npm。 +应用使用自定义 Service Worker (`src/sw.js`) 实现以下功能: -### 安装依赖 - -```bash -npm install -``` - -### 开发 - -启动开发服务器: +- **缓存策略**: + - 静态资源:缓存优先 + - 数据请求:网络优先,失败时回退到缓存 + - API 请求:网络优先,失败时返回离线响应 + +- **后台同步**: + - 支持后台数据同步 + - 离线操作队列处理 + +### IndexedDB 存储 + +使用 IndexedDB 作为本地数据存储: + +- **数据结构**: + - 便签存储 (`notes`) + - 文件夹存储 (`folders`) + - 设置存储 (`settings`) + +- **离线队列**: + - 操作记录到本地存储队列 + - 网络恢复时自动处理队列 + +### 网络状态管理 + +- 实时网络状态检测 +- 网络类型识别 +- 在线/离线状态切换处理 + +## 使用说明 + +### 离线使用 + +1. 应用首次加载时会缓存核心资源 +2. 断网后应用仍可正常使用所有功能 +3. 离线期间的所有操作都会保存到本地 + +### 数据同步 + +1. 网络恢复时自动开始同步 +2. 可在设置中查看同步状态 +3. 支持手动触发同步(未来版本) + +## 开发说明 + +### 构建命令 ```bash +# 开发模式 npm run dev -``` -这将在 `http://localhost:3000` 启动应用。 - -### 构建 - -构建标准 Web 应用: - -```bash +# 构建标准版本 npm run build -``` -构建 PWA 应用: - -```bash +# 构建PWA版本(支持离线) npm run build:pwa -``` -构建所有版本 (标准 + PWA): - -```bash +# 构建所有版本 npm run build:all -``` -### 部署 PWA - -构建 PWA 并上传到服务器: - -```bash +# 部署PWA版本 npm run deploy:pwa ``` -这将执行 `vite build --mode pwa` 并运行 `upload-pwa.js` 脚本。 +### 目录结构 -### Android 应用 +``` +src/ +├── sw.js # Service Worker 实现 +├── utils/ +│ ├── indexedDBStorage.js # IndexedDB 存储管理 +│ ├── networkUtils.js # 网络状态工具 +│ └── dateUtils.js # 日期工具 +├── stores/ +│ └── useAppStore.js # 应用状态管理 +├── components/ +│ └── ... # UI 组件 +└── pages/ + ├── NoteListPage.vue # 便签列表页面 + ├── NoteEditorPage.vue # 便签编辑页面 + └── SettingsPage.vue # 设置页面 +``` -运行 Android 应用: +## 测试离线功能 -```bash -npm run android -``` \ No newline at end of file +1. 使用浏览器开发者工具的 Network Throttling 功能模拟离线环境 +2. 在离线状态下创建、编辑、删除便签 +3. 恢复网络连接,观察数据同步过程 +4. 检查离线期间的操作是否正确同步 + +## 未来改进 + +1. 添加手动同步按钮 +2. 增强冲突解决机制 +3. 支持多设备数据同步 +4. 添加数据导出/导入功能 +5. 增强离线状态下的用户提示 \ No newline at end of file diff --git a/package.json b/package.json index 241562c..6637953 100644 --- a/package.json +++ b/package.json @@ -1,40 +1,42 @@ -{ - "name": "smartisannote.re", - "version": "1.0.0", - "description": "锤子便签(重制版)", - "main": "index.js", - "scripts": { - "android": "npx cap run android", - "build:all": "vite build && vite build --mode pwa", - "deploy:pwa": "vite build --mode pwa && node upload-pwa.js", - "dev": "vite" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "module", - "dependencies": { - "@capacitor/android": "^5.7.2", - "@capacitor/cli": "^5.7.2", - "@capacitor/core": "^5.7.2", - "@capacitor/ios": "^5.7.2", - "@ionic/vue": "^8.7.6", - "@oku-ui/motion": "^0.4.3", - "@vue/cli-service": "^5.0.9", - "@vue/compiler-sfc": "^3.5.22", - "basic-ftp": "^5.0.5", - "ionicons": "^7.4.0", - "moment": "^2.30.1", - "pinia": "^3.0.3", - "vue": "^3.5.22", - "vue-router": "^4.5.1" - }, - "devDependencies": { - "@rollup/plugin-terser": "^0.4.4", - "@vitejs/plugin-vue": "^5.1.4", - "less": "^4.4.2", - "terser": "^5.44.0", - "vite": "^5.4.8", - "vite-plugin-pwa": "^1.0.3" - } -} +{ + "name": "smartisannote.re", + "version": "1.0.0", + "description": "锤子便签(重制版)", + "main": "index.js", + "scripts": { + "android": "npx cap run android", + "build": "vite build", + "build:pwa": "vite build --mode pwa", + "build:all": "vite build && vite build --mode pwa", + "deploy:pwa": "vite build --mode pwa && node upload-pwa.js", + "dev": "vite" + }, + "keywords": [], + "author": "", + "license": "ISC", + "type": "module", + "dependencies": { + "@capacitor/android": "^5.7.2", + "@capacitor/cli": "^5.7.2", + "@capacitor/core": "^5.7.2", + "@capacitor/ios": "^5.7.2", + "@ionic/vue": "^8.7.6", + "@oku-ui/motion": "^0.4.3", + "@vue/cli-service": "^5.0.9", + "@vue/compiler-sfc": "^3.5.22", + "basic-ftp": "^5.0.5", + "ionicons": "^7.4.0", + "moment": "^2.30.1", + "pinia": "^3.0.3", + "vue": "^3.5.22", + "vue-router": "^4.5.1" + }, + "devDependencies": { + "@rollup/plugin-terser": "^0.4.4", + "@vitejs/plugin-vue": "^5.1.4", + "less": "^4.4.2", + "terser": "^5.44.0", + "vite": "^5.4.8", + "vite-plugin-pwa": "^1.0.3" + } +} diff --git a/src/App.vue b/src/App.vue index c735b4f..d7f932d 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,5 +1,13 @@ @@ -87,6 +116,38 @@ onMounted(() => { background-color: #f5f5f5; // 设置默认背景色,防止闪烁 } +// 网络状态指示器 +.network-status { + position: fixed; + top: 0; + left: 0; + right: 0; + z-index: 10000; + display: flex; + justify-content: center; + pointer-events: none; +} + +.offline-indicator { + background-color: #ff6b6b; + color: white; + padding: 8px 16px; + border-radius: 0 0 4px 4px; + font-size: 14px; + display: flex; + align-items: center; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + pointer-events: auto; +} + +.offline-icon { + margin-right: 8px; +} + +.offline-text { + font-weight: 500; +} + // 背景页面样式 .background-page { position: absolute; diff --git a/src/pages/NoteEditorPage.vue b/src/pages/NoteEditorPage.vue index 680b951..9dac095 100644 --- a/src/pages/NoteEditorPage.vue +++ b/src/pages/NoteEditorPage.vue @@ -1,6 +1,13 @@ - - + + + + diff --git a/src/pages/SettingsPage.vue b/src/pages/SettingsPage.vue index d906a28..96d9677 100644 --- a/src/pages/SettingsPage.vue +++ b/src/pages/SettingsPage.vue @@ -1,102 +1,130 @@ - - - - - + + + + + diff --git a/src/stores/useAppStore.js b/src/stores/useAppStore.js index 7e7bacd..f8c08e3 100644 --- a/src/stores/useAppStore.js +++ b/src/stores/useAppStore.js @@ -1,7 +1,7 @@ import { defineStore } from 'pinia' import * as storage from '../utils/indexedDBStorage' import { getCurrentDateTime, getPastDate } from '../utils/dateUtils' - +import { isOnline, testOnline } from '../utils/networkUtils' /** * 应用状态管理Store * 使用Pinia进行状态管理,包含便签、文件夹和设置数据 @@ -12,11 +12,13 @@ export const useAppStore = defineStore('app', { * 包含应用的核心数据:便签列表、文件夹列表和设置 */ state: () => ({ - notes: [], // 便签列表 - folders: [], // 文件夹列表 + notes: [], // 便签列表 + folders: [], // 文件夹列表 settings: { cloudSync: false, darkMode: false }, // 应用设置 + isOnline: navigator.onLine, // 网络状态 + syncStatus: 'idle', // 同步状态:idle, syncing, error + lastSyncTime: null, // 最后同步时间 }), - /** * 计算属性 * 基于状态派生的计算值 @@ -30,7 +32,6 @@ export const useAppStore = defineStore('app', { starredNotesCount: state => { return state.notes.filter(note => note.isStarred).length }, - /** * 计算所有便签数量 * @param {Object} state - 当前状态对象 @@ -40,7 +41,6 @@ export const useAppStore = defineStore('app', { return state.notes.length }, }, - /** * 状态变更操作 * 包含所有修改状态的方法 @@ -58,7 +58,6 @@ export const useAppStore = defineStore('app', { const loadedNotes = await storage.getNotes() const loadedFolders = await storage.getFolders() const loadedSettings = await storage.getSettings() - // 如果没有数据,则加载mock数据 if (loadedNotes.length === 0 && loadedFolders.length === 0) { this.loadMockData() @@ -68,11 +67,50 @@ export const useAppStore = defineStore('app', { this.folders = loadedFolders this.settings = loadedSettings } + // 添加网络状态监听 + this.addNetworkListeners() } catch (error) { console.error('Error loading data:', error) } }, - + /** + * 添加网络状态监听器 + */ + addNetworkListeners() { + const handleOnline = () => { + this.isOnline = true + console.log('网络已连接') + // 网络连接时尝试同步数据 + this.syncOfflineData() + } + const handleOffline = () => { + this.isOnline = false + console.log('网络已断开') + } + window.addEventListener('online', handleOnline) + window.addEventListener('offline', handleOffline) + }, + /** + * 同步离线数据 + * 当网络连接恢复时同步离线期间的操作 + */ + async syncOfflineData() { + if (!this.settings.cloudSync) { + return + } + this.syncStatus = 'syncing' + try { + // 这里应该实现与云服务同步的逻辑 + // 暂时使用模拟同步 + await new Promise(resolve => setTimeout(resolve, 1000)) + this.syncStatus = 'idle' + this.lastSyncTime = new Date().toISOString() + console.log('离线数据同步完成') + } catch (error) { + console.error('离线数据同步失败:', error) + this.syncStatus = 'error' + } + }, /** * 加载预设的mock数据 * 用于开发和演示目的,提供示例便签、文件夹和设置 @@ -80,47 +118,42 @@ export const useAppStore = defineStore('app', { */ async loadMockData() { // Mock notes - 使用固定的日期值以避免每次运行时变化 - const fixedCurrentDate = '2025-10-12T10:00:00.000Z'; - + const fixedCurrentDate = '2025-10-12T10:00:00.000Z' // 预设的便签示例数据 - 仅保留一条关于应用功能介绍和示例的便签 const mockNotes = [ { id: '1', title: '欢迎使用锤子便签', - content: '

这是一个功能强大的便签应用,您可以在这里记录您的想法、待办事项等。


功能介绍

1. 创建和编辑便签
2. 为便签加星和置顶
3. 将便签分类到文件夹
4. 搜索便签内容
5. 回收站功能


编辑器功能演示


标题格式

点击标题按钮可创建居中的标题


待办事项

这是一个待办事项
这是一个已完成的待办事项

列表格式


文本格式

加粗文本


引用格式

这是一段引用文本
可以用来引用他人的话语

图片

点击图片按钮可以插入图片,长按图片可以拖拽排序

', + content: + '

这是一个功能强大的便签应用,您可以在这里记录您的想法、待办事项等。


功能介绍

1. 创建和编辑便签
2. 为便签加星和置顶
3. 将便签分类到文件夹
4. 搜索便签内容
5. 回收站功能


编辑器功能演示


标题格式

点击标题按钮可创建居中的标题


待办事项

这是一个待办事项
这是一个已完成的待办事项

列表格式


文本格式

加粗文本


引用格式

这是一段引用文本
可以用来引用他人的话语

图片

点击图片按钮可以插入图片,长按图片可以拖拽排序

', createdAt: fixedCurrentDate, updatedAt: fixedCurrentDate, folderId: null, - isStarred: true, // 加星便签 - isTop: true, // 置顶便签 - hasImage: true, // 包含图片 - isDeleted: false, // 未删除 + isStarred: true, // 加星便签 + isTop: true, // 置顶便签 + hasImage: true, // 包含图片 + isDeleted: false, // 未删除 deletedAt: null, - } + }, ] - // Mock folders - 使用固定的日期值 // 预设的文件夹示例数据 const mockFolders = [] - // Mock settings // 预设的设置示例数据 const mockSettings = { - cloudSync: false, // 云同步关闭 - darkMode: false, // 深色模式关闭 + cloudSync: false, // 云同步关闭 + darkMode: false, // 深色模式关闭 } - // 更新store状态 this.notes = mockNotes this.folders = mockFolders this.settings = mockSettings - // 保存到Storage await storage.saveNotes(mockNotes) await storage.saveFolders(mockFolders) await storage.saveSettings(mockSettings) }, - /** * 保存便签数据到Storage * @returns {Promise} @@ -132,7 +165,6 @@ export const useAppStore = defineStore('app', { console.error('Error saving notes:', error) } }, - /** * 保存文件夹数据到Storage * @returns {Promise} @@ -144,7 +176,6 @@ export const useAppStore = defineStore('app', { console.error('Error saving folders:', error) } }, - /** * 保存设置数据到Storage * @returns {Promise} @@ -156,11 +187,9 @@ export const useAppStore = defineStore('app', { console.error('Error saving settings:', error) } }, - /** * 便签操作函数 */ - /** * 添加新便签 * @param {Object} note - 便签对象 @@ -170,14 +199,12 @@ export const useAppStore = defineStore('app', { try { const newNote = await storage.addNote(note) this.notes.push(newNote) - return newNote } catch (error) { console.error('Error adding note:', error) throw error } }, - /** * 更新便签 * @param {string} id - 便签ID @@ -199,7 +226,6 @@ export const useAppStore = defineStore('app', { throw error } }, - /** * 删除便签 * @param {string} id - 要删除的便签ID @@ -217,7 +243,6 @@ export const useAppStore = defineStore('app', { throw error } }, - /** * 将便签移至回收站 * 将便签标记为已删除状态,并记录删除时间 @@ -239,7 +264,6 @@ export const useAppStore = defineStore('app', { throw error } }, - /** * 永久删除便签 * 从便签列表中彻底移除便签 @@ -258,11 +282,9 @@ export const useAppStore = defineStore('app', { throw error } }, - /** * 文件夹操作函数 */ - /** * 添加新文件夹 * @param {Object} folder - 文件夹对象 @@ -278,7 +300,6 @@ export const useAppStore = defineStore('app', { throw error } }, - /** * 更新文件夹 * @param {string} id - 文件夹ID @@ -300,7 +321,6 @@ export const useAppStore = defineStore('app', { throw error } }, - /** * 删除文件夹 * @param {string} id - 要删除的文件夹ID @@ -315,7 +335,6 @@ export const useAppStore = defineStore('app', { for (const note of notesInFolder) { await this.updateNote(note.id, { folderId: null }) } - // 从文件夹列表中移除文件夹 this.folders = this.folders.filter(folder => folder.id !== id) } @@ -325,11 +344,9 @@ export const useAppStore = defineStore('app', { throw error } }, - /** * 设置操作函数 */ - /** * 更新设置 * @param {Object} newSettings - 新的设置对象 @@ -345,7 +362,6 @@ export const useAppStore = defineStore('app', { throw error } }, - /** * 切换云同步设置 * 开启或关闭云同步功能 @@ -354,7 +370,6 @@ export const useAppStore = defineStore('app', { async toggleCloudSync() { await this.updateSettings({ cloudSync: !this.settings.cloudSync }) }, - /** * 切换深色模式设置 * 开启或关闭深色模式 diff --git a/src/sw.js b/src/sw.js new file mode 100644 index 0000000..c357ea6 --- /dev/null +++ b/src/sw.js @@ -0,0 +1,1690 @@ +// Smartisan Note - Enhanced Service Worker for Offline Support +const CACHE_NAME = 'smartisan-note-v1'; +const DATA_CACHE_NAME = 'smartisan-note-data-v1'; + +// 需要缓存的重要资源 +const urlsToCache = [ + // 页面和资源 + '/', + '/index.html', + + // PWA图标资源 + '/icons/icon-192.png', + '/icons/icon-512.png', + + // 背景图片 + '/assets/icons/drawable-xxhdpi/note_background.png', + '/assets/icons/drawable-xxhdpi/note_setting_bg.png', + '/assets/icons/drawable-xxhdpi/action_bar_default.png', + '/assets/icons/drawable-xxhdpi/activity_bg.png', + '/assets/icons/drawable-xxhdpi/editor_bg_bottom.9.png', + '/assets/icons/drawable-xxhdpi/editor_bg_middle.9.png', + '/assets/icons/drawable-xxhdpi/editor_bg_single.9.png', + '/assets/icons/drawable-xxhdpi/editor_bg_top.9.png', + '/assets/icons/drawable-xxhdpi/win_background.png', + '/assets/icons/drawable-xxhdpi/bg_setting_banner.9.png', + '/assets/icons/drawable-xxhdpi/bg_vip_expiry.9.png', + '/assets/icons/drawable-xxhdpi/detail_note_image_bg.9.png', + '/assets/icons/drawable-xxhdpi/editor_banner_bg.9.png', + '/assets/icons/drawable-xxhdpi/preview_bg.9.png', + '/assets/icons/drawable-xxhdpi/note_round_corner.9.png', + '/assets/icons/drawable-xxhdpi/header_shadow.png', + '/assets/icons/drawable-xxhdpi/header.png', + '/assets/icons/drawable-xxhdpi/common_bg_vip_upgrade.png', + '/assets/icons/drawable-xxhdpi/common_list_header.png', + '/assets/icons/drawable-xxhdpi/mixed_view_dark_footer_bg.9.png', + '/assets/icons/drawable-xxhdpi/mixed_view_dark_header_bg.9.png', + '/assets/icons/drawable-xxhdpi/mixed_view_dark_item_bg.9.png', + '/assets/icons/drawable-xxhdpi/mixed_view_darkest_footer_bg.9.png', + '/assets/icons/drawable-xxhdpi/mixed_view_darkest_header_bg.9.png', + '/assets/icons/drawable-xxhdpi/mixed_view_darkest_item_bg.9.png', + '/assets/icons/drawable-xxhdpi/mixed_view_footer_bg.9.png', + '/assets/icons/drawable-xxhdpi/mixed_view_header_bg.9.png', + '/assets/icons/drawable-xxhdpi/mixed_view_item_bg.9.png', + '/assets/icons/drawable-xxhdpi/mixed_view_light_footer_bg.9.png', + '/assets/icons/drawable-xxhdpi/mixed_view_light_header_bg.9.png', + '/assets/icons/drawable-xxhdpi/mixed_view_light_item_bg.9.png', + '/assets/icons/drawable-xxhdpi/note_detail_keyboard_splash.9.png', + '/assets/icons/drawable-xxhdpi/note_weibo_keyboard_splash.9.png', + '/assets/icons/drawable-xxhdpi/secondary_bar.9.png', + '/assets/icons/drawable-xxhdpi/secondary_bar_shadow.9.png', + '/assets/icons/drawable-xxhdpi/setting_titlebar.png', + '/assets/icons/drawable-xxhdpi/setting_titlebar_shadow.png', + '/assets/icons/drawable-xxhdpi/setting_markdown_titlebar_shadow.png', + '/assets/icons/drawable-xxhdpi/switch_bar_title_bar_bg.png', + '/assets/icons/drawable-xxhdpi/switch_bar_title_bar_lower_shadow.png', + '/assets/icons/drawable-xxhdpi/switch_bar_title_bar_upper_shadow.png', + '/assets/icons/drawable-xxhdpi/time_picker_widget_bg.9.png', + '/assets/icons/drawable-xxhdpi/time_picker_widget_bg_ex_new.9.png', + '/assets/icons/drawable-xxhdpi/time_picker_widget_bottom.png', + '/assets/icons/drawable-xxhdpi/time_picker_widget_lens.9.png', + '/assets/icons/drawable-xxhdpi/time_picker_shadow.png', + '/assets/icons/drawable-xxhdpi/common_edittext_cursor_bbackground.9.png', + '/assets/icons/drawable-xxhdpi/common_edit_text_bottom.9.png', + '/assets/icons/drawable-xxhdpi/common_edit_text_middle.9.png', + '/assets/icons/drawable-xxhdpi/common_edit_text_top.9.png', + '/assets/icons/drawable-xxhdpi/edit_text_bg.9.png', + '/assets/icons/drawable-xxhdpi/password_input_text_bg.9.png', + '/assets/icons/drawable-xxhdpi/common_search_edit_bg.9.png', + '/assets/icons/drawable-xxhdpi/common_search_edit_bg_disable.9.png', + '/assets/icons/drawable-xxhdpi/edit_text_verification_code.9.png', + '/assets/icons/drawable-xxhdpi/preview_rtf_icon_gtasks.png', + '/assets/icons/drawable-xxhdpi/preview_rtf_icon_gtasks_light.png', + '/assets/icons/drawable-xxhdpi/rag_chat_bg.png', + '/assets/icons/drawable-xxhdpi/rag_publish_bg.png', + '/assets/icons/drawable-xxhdpi/rag_progress.png', + '/assets/icons/drawable-xxhdpi/rag_kb_cover.png', + '/assets/icons/drawable-xxhdpi/ai_bottom_btn_blur.9.png', + '/assets/icons/drawable-xxhdpi/bg_btn_menu_mode.png', + '/assets/icons/drawable-xxhdpi/bg_btn_record.png', + '/assets/icons/drawable-xxhdpi/bg_buy_btn.png', + '/assets/icons/drawable-xxhdpi/bg_kb_controller_title.png', + '/assets/icons/drawable-xxhdpi/bg_rag_submit.png', + '/assets/icons/drawable-xxhdpi/bg_retry.png', + '/assets/icons/drawable-xxhdpi/bg_slide_recycle.png', + '/assets/icons/drawable-xxhdpi/note_quote_editing_sign.9.png', + '/assets/icons/drawable-xxhdpi/note_quote_preview_sign.9.png', + '/assets/icons/drawable-xxhdpi/insert_bubble_shadow.9.png', + '/assets/icons/drawable-xxhdpi/share_weibo_insert_bubble.9.png', + '/assets/icons/drawable-xxhdpi/share_weibo_insert_bar.9.png', + '/assets/icons/drawable-xxhdpi/share_weibo_insert_shadow.png', + '/assets/icons/drawable-xxhdpi/abc_ab_share_pack_mtrl_alpha.9.png', + '/assets/icons/drawable-xxhdpi/abc_btn_switch_to_on_mtrl_00001.9.png', + '/assets/icons/drawable-xxhdpi/abc_btn_switch_to_on_mtrl_00012.9.png', + '/assets/icons/drawable-xxhdpi/abc_cab_background_top_mtrl_alpha.9.png', + '/assets/icons/drawable-xxhdpi/abc_list_divider_mtrl_alpha.9.png', + '/assets/icons/drawable-xxhdpi/abc_menu_hardkey_panel_mtrl_mult.9.png', + '/assets/icons/drawable-xxhdpi/abc_popup_background_mtrl_mult.9.png', + '/assets/icons/drawable-xxhdpi/abc_scrubber_primary_mtrl_alpha.9.png', + '/assets/icons/drawable-xxhdpi/abc_scrubber_track_mtrl_alpha.9.png', + '/assets/icons/drawable-xxhdpi/abc_spinner_mtrl_am_alpha.9.png', + '/assets/icons/drawable-xxhdpi/abc_switch_track_mtrl_alpha.9.png', + '/assets/icons/drawable-xxhdpi/abc_tab_indicator_mtrl_alpha.9.png', + '/assets/icons/drawable-xxhdpi/action_menu_grid_bg.9.png', + '/assets/icons/drawable-xxhdpi/action_menu_grid_bg_pressed.9.png', + '/assets/icons/drawable-xxhdpi/ai_cursor_drawable.png', + '/assets/icons/drawable-xxhdpi/ai_result_cancel_icon.png', + '/assets/icons/drawable-xxhdpi/ai_result_edit_icon.png', + '/assets/icons/drawable-xxhdpi/ai_result_tone_icon.png', + '/assets/icons/drawable-xxhdpi/ai_stop_ic.png', + '/assets/icons/drawable-xxhdpi/bg_buy_btn.png', + '/assets/icons/drawable-xxhdpi/bg_rag_submit.png', + '/assets/icons/drawable-xxhdpi/bhm_list_view_bg_normal.9.png', + '/assets/icons/drawable-xxhdpi/bottom_bar.9.png', + '/assets/icons/drawable-xxhdpi/bottom_bar_shadow.9.png', + '/assets/icons/drawable-xxhdpi/bottom_sheet_title_bar_bg.png', + '/assets/icons/drawable-xxhdpi/bottom_sheet_title_bar_lower_shadow.png', + '/assets/icons/drawable-xxhdpi/bottom_sheet_title_bar_upper_shadow.png', + '/assets/icons/drawable-xxhdpi/bottom_sheet_title_line.png', + '/assets/icons/drawable-xxhdpi/chips_error.9.png', + '/assets/icons/drawable-xxhdpi/chips_error_pressed.9.png', + '/assets/icons/drawable-xxhdpi/chips_large_grey.9.png', + '/assets/icons/drawable-xxhdpi/chips_large_grey_pressed.9.png', + '/assets/icons/drawable-xxhdpi/chips_large_light.9.png', + '/assets/icons/drawable-xxhdpi/chips_large_light_pressed.9.png', + '/assets/icons/drawable-xxhdpi/chips_large_red.9.png', + '/assets/icons/drawable-xxhdpi/chips_large_red_pressed.9.png', + '/assets/icons/drawable-xxhdpi/chips_large_yellow.9.png', + '/assets/icons/drawable-xxhdpi/chips_large_yellow_pressed.9.png', + '/assets/icons/drawable-xxhdpi/chips_normal.9.png', + '/assets/icons/drawable-xxhdpi/chips_normal_pressed.9.png', + '/assets/icons/drawable-xxhdpi/chips_normal_unidentified.9.png', + '/assets/icons/drawable-xxhdpi/chips_remove.9.png', + '/assets/icons/drawable-xxhdpi/chips_remove_error.9.png', + '/assets/icons/drawable-xxhdpi/chips_remove_error_pressed.9.png', + '/assets/icons/drawable-xxhdpi/chips_remove_pressed.9.png', + '/assets/icons/drawable-xxhdpi/chips_remove_unidentified.9.png', + '/assets/icons/drawable-xxhdpi/chips_view_layout_bg.9.png', + '/assets/icons/drawable-xxhdpi/chips_vip.9.png', + '/assets/icons/drawable-xxhdpi/chips_vip_error.9.png', + '/assets/icons/drawable-xxhdpi/chips_vip_error_pressed.9.png', + '/assets/icons/drawable-xxhdpi/chips_vip_pressed.9.png', + '/assets/icons/drawable-xxhdpi/chips_vip_unidentified.9.png', + '/assets/icons/drawable-xxhdpi/common_cloud_logo.9.png', + '/assets/icons/drawable-xxhdpi/common_edit_text_bottom.9.png', + '/assets/icons/drawable-xxhdpi/common_edit_text_middle.9.png', + '/assets/icons/drawable-xxhdpi/common_edit_text_top.9.png', + '/assets/icons/drawable-xxhdpi/common_searchbar_background.9.png', + '/assets/icons/drawable-xxhdpi/common_searchbar_shadow.9.png', + '/assets/icons/drawable-xxhdpi/commonres_dailog_content_bg.9.png', + '/assets/icons/drawable-xxhdpi/commonres_dailog_single_button_n.9.png', + '/assets/icons/drawable-xxhdpi/commonres_dailog_single_button_p.9.png', + '/assets/icons/drawable-xxhdpi/commonres_dailog_title_bg.9.png', + '/assets/icons/drawable-xxhdpi/commonres_dialog_bg_shadow.9.png', + '/assets/icons/drawable-xxhdpi/commonres_dialog_btn_left_normal.9.png', + '/assets/icons/drawable-xxhdpi/commonres_dialog_btn_left_pressed.9.png', + '/assets/icons/drawable-xxhdpi/commonres_dialog_btn_mid_normal.9.png', + '/assets/icons/drawable-xxhdpi/commonres_dialog_btn_mid_pressed.9.png', + '/assets/icons/drawable-xxhdpi/commonres_dialog_btn_right_normal.9.png', + '/assets/icons/drawable-xxhdpi/commonres_dialog_btn_right_pressed.9.png', + '/assets/icons/drawable-xxhdpi/commonres_dialog_btn_single_normal.9.png', + '/assets/icons/drawable-xxhdpi/commonres_dialog_btn_single_pressed.9.png', + '/assets/icons/drawable-xxhdpi/commonres_dialog_titlebar_bg.9.png', + '/assets/icons/drawable-xxhdpi/confirm_dialog_bg2.9.png', + '/assets/icons/drawable-xxhdpi/dialog_bottom_panel.9.png', + '/assets/icons/drawable-xxhdpi/dialog_btn_left_normal.9.png', + '/assets/icons/drawable-xxhdpi/dialog_btn_left_pressed.9.png', + '/assets/icons/drawable-xxhdpi/dialog_btn_right_normal.9.png', + '/assets/icons/drawable-xxhdpi/dialog_btn_right_pressed.9.png', + '/assets/icons/drawable-xxhdpi/dialog_btn_single_normal.9.png', + '/assets/icons/drawable-xxhdpi/dialog_btn_single_pressed.9.png', + '/assets/icons/drawable-xxhdpi/dialog_content_bg.9.png', + '/assets/icons/drawable-xxhdpi/dialog_top_panel.9.png', + '/assets/icons/drawable-xxhdpi/dialog_title_bg.9.png', + '/assets/icons/drawable-xxhdpi/dslv_item_shadow.9.png', + '/assets/icons/drawable-xxhdpi/editor_left_icon_bg_bottom.9.png', + '/assets/icons/drawable-xxhdpi/editor_left_icon_bg_middle.9.png', + '/assets/icons/drawable-xxhdpi/editor_left_icon_bg_single.9.png', + '/assets/icons/drawable-xxhdpi/editor_left_icon_bg_top.9.png', + '/assets/icons/drawable-xxhdpi/feedback_edit_text.9.png', + '/assets/icons/drawable-xxhdpi/feedback_popup_bg.9.png', + '/assets/icons/drawable-xxhdpi/feedback_title_btn_back.9.png', + '/assets/icons/drawable-xxhdpi/feedback_title_btn_back_highlight.9.png', + '/assets/icons/drawable-xxhdpi/feedback_title_btn_back_light_normal.9.png', + '/assets/icons/drawable-xxhdpi/feedback_title_btn_back_light_normal_down.9.png', + '/assets/icons/drawable-xxhdpi/feedback_title_btn_ok.9.png', + '/assets/icons/drawable-xxhdpi/feedback_title_btn_ok_both_disabled.9.png', + '/assets/icons/drawable-xxhdpi/feedback_title_btn_ok_highlight.9.png', + '/assets/icons/drawable-xxhdpi/feedback_title_btn_ok_light.9.png', + '/assets/icons/drawable-xxhdpi/feedback_title_btn_ok_light_down.9.png', + '/assets/icons/drawable-xxhdpi/filter_btn_left.9.png', + '/assets/icons/drawable-xxhdpi/filter_btn_left_pressed.9.png', + '/assets/icons/drawable-xxhdpi/filter_btn_middle.9.png', + '/assets/icons/drawable-xxhdpi/filter_btn_middle_pressed.9.png', + '/assets/icons/drawable-xxhdpi/filter_btn_right.9.png', + '/assets/icons/drawable-xxhdpi/filter_btn_right_pressed.9.png', + '/assets/icons/drawable-xxhdpi/folder_bottom_button_normal.9.png', + '/assets/icons/drawable-xxhdpi/folder_bottom_button_pressed.9.png', + '/assets/icons/drawable-xxhdpi/footer_smartisan.9.png', + '/assets/icons/drawable-xxhdpi/group_list_bottom.9.png', + '/assets/icons/drawable-xxhdpi/group_list_bottom_pressed.9.png', + '/assets/icons/drawable-xxhdpi/group_list_mid.9.png', + '/assets/icons/drawable-xxhdpi/group_list_mid_pressed.9.png', + '/assets/icons/drawable-xxhdpi/group_list_single.9.png', + '/assets/icons/drawable-xxhdpi/group_list_single_pressed.9.png', + '/assets/icons/drawable-xxhdpi/group_list_top.9.png', + '/assets/icons/drawable-xxhdpi/group_list_top_pressed.9.png', + '/assets/icons/drawable-xxhdpi/header_btn.9.png', + '/assets/icons/drawable-xxhdpi/header_btn_press.9.png', + '/assets/icons/drawable-xxhdpi/header_btn_non_clickable.9.png', + '/assets/icons/drawable-xxhdpi/import_search_bar_background.9.png', + '/assets/icons/drawable-xxhdpi/letters_bar_background.9.png', + '/assets/icons/drawable-xxhdpi/letters_bar_background_shadow.9.png', + '/assets/icons/drawable-xxhdpi/list_board_section_title_divider.9.png', + '/assets/icons/drawable-xxhdpi/list_content_item_bottom_shadow.9.png', + '/assets/icons/drawable-xxhdpi/list_content_item_middle_shadow.9.png', + '/assets/icons/drawable-xxhdpi/list_content_item_single_shadow.9.png', + '/assets/icons/drawable-xxhdpi/list_content_item_top_shadow.9.png', + '/assets/icons/drawable-xxhdpi/list_item.9.png', + '/assets/icons/drawable-xxhdpi/list_item_bg.9.png', + '/assets/icons/drawable-xxhdpi/list_item_bg_down.9.png', + '/assets/icons/drawable-xxhdpi/list_item_bottom_normal.9.png', + '/assets/icons/drawable-xxhdpi/list_item_bottom_highlight.9.png', + '/assets/icons/drawable-xxhdpi/list_item_middle_normal.9.png', + '/assets/icons/drawable-xxhdpi/list_item_middle_highlight.9.png', + '/assets/icons/drawable-xxhdpi/list_item_pressed.9.png', + '/assets/icons/drawable-xxhdpi/list_item_top_normal.9.png', + '/assets/icons/drawable-xxhdpi/list_item_top_highlight.9.png', + '/assets/icons/drawable-xxhdpi/list_section_title.9.png', + '/assets/icons/drawable-xxhdpi/long_btn_gray_normal.9.png', + '/assets/icons/drawable-xxhdpi/long_btn_gray_pressed.9.png', + '/assets/icons/drawable-xxhdpi/long_btn_gray_disabled.9.png', + '/assets/icons/drawable-xxhdpi/long_btn_highlight_normal.9.png', + '/assets/icons/drawable-xxhdpi/long_btn_highlight_pressed.9.png', + '/assets/icons/drawable-xxhdpi/long_btn_highlight_disabled.9.png', + '/assets/icons/drawable-xxhdpi/long_btn_red_normal.9.png', + '/assets/icons/drawable-xxhdpi/long_btn_red_pressed.9.png', + '/assets/icons/drawable-xxhdpi/long_btn_red_disabled.9.png', + '/assets/icons/drawable-xxhdpi/long_btn_red_shrinked_normal.9.png', + '/assets/icons/drawable-xxhdpi/long_btn_red_shrinked_pressed.9.png', + '/assets/icons/drawable-xxhdpi/long_btn_red_shrinked_disabled.9.png', + '/assets/icons/drawable-xxhdpi/long_btn_shadow_normal.9.png', + '/assets/icons/drawable-xxhdpi/long_btn_white_normal.9.png', + '/assets/icons/drawable-xxhdpi/long_btn_white_pressed.9.png', + '/assets/icons/drawable-xxhdpi/long_btn_white_disabled.9.png', + '/assets/icons/drawable-xxhdpi/longlength_weibo_image_bg.9.png', + '/assets/icons/drawable-xxhdpi/md_bg_normal_center.9.png', + '/assets/icons/drawable-xxhdpi/md_bg_normal_left.9.png', + '/assets/icons/drawable-xxhdpi/md_bg_normal_right.9.png', + '/assets/icons/drawable-xxhdpi/md_bg_pressed.9.png', + '/assets/icons/drawable-xxhdpi/menu_dialog_button_gray_normal.9.png', + '/assets/icons/drawable-xxhdpi/menu_dialog_button_gray_pressed.9.png', + '/assets/icons/drawable-xxhdpi/menu_dialog_button_red_normal.9.png', + '/assets/icons/drawable-xxhdpi/menu_dialog_button_red_pressed.9.png', + '/assets/icons/drawable-xxhdpi/menu_dialog_multi_list_bg.9.png', + '/assets/icons/drawable-xxhdpi/mixed_view_item_bg_transparent.9.png', + '/assets/icons/drawable-xxhdpi/more_item_middle_normal.9.png', + '/assets/icons/drawable-xxhdpi/more_item_middle_highlight.9.png', + '/assets/icons/drawable-xxhdpi/more_item_middle_disable.9.png', + '/assets/icons/drawable-xxhdpi/notes_base_search_field.9.png', + '/assets/icons/drawable-xxhdpi/notes_base_search_field_disabled.9.png', + '/assets/icons/drawable-xxhdpi/notes_detail_scrollbar.9.png', + '/assets/icons/drawable-xxhdpi/pop_option_btn_normal.9.png', + '/assets/icons/drawable-xxhdpi/pop_option_btn_pressed.9.png', + '/assets/icons/drawable-xxhdpi/pop_up_menu_bg.9.png', + '/assets/icons/drawable-xxhdpi/popup_menu_bg_shadow.9.png', + '/assets/icons/drawable-xxhdpi/popup_window_bg.9.png', + '/assets/icons/drawable-xxhdpi/popup_window_mask_top.9.png', + '/assets/icons/drawable-xxhdpi/popup_window_mode_bg.9.png', + '/assets/icons/drawable-xxhdpi/popup_window_mode_bg_pressed.9.png', + '/assets/icons/drawable-xxhdpi/preview_btn.9.png', + '/assets/icons/drawable-xxhdpi/preview_btn_down.9.png', + '/assets/icons/drawable-xxhdpi/progress_disabled_smartisanos.9.png', + '/assets/icons/drawable-xxhdpi/progress_error_smartisanos.9.png', + '/assets/icons/drawable-xxhdpi/progress_smartisanos.9.png', + '/assets/icons/drawable-xxhdpi/progress_track_disabled_smartisanos.9.png', + '/assets/icons/drawable-xxhdpi/progress_track_smartisanos.9.png', + '/assets/icons/drawable-xxhdpi/progress_unfocused_smartisanos.9.png', + '/assets/icons/drawable-xxhdpi/rag_unselected.png', + '/assets/icons/drawable-xxhdpi/remind_calendar_month_view_day_focused.9.png', + '/assets/icons/drawable-xxhdpi/remind_calendar_month_view_day_unfocused.9.png', + '/assets/icons/drawable-xxhdpi/remind_calendar_month_view_today_focused.9.png', + '/assets/icons/drawable-xxhdpi/remind_month_content_frame.9.png', + '/assets/icons/drawable-xxhdpi/remind_month_grid_body_for_drop.9.png', + '/assets/icons/drawable-xxhdpi/remind_time_picker_widget_5_bg.9.png', + '/assets/icons/drawable-xxhdpi/remind_time_picker_widget_bg.9.png', + '/assets/icons/drawable-xxhdpi/revone_dialog_bg_main.9.png', + '/assets/icons/drawable-xxhdpi/revone_dialog_bg_title.9.png', + '/assets/icons/drawable-xxhdpi/revone_smartisan_list_popup_menu_pressed.9.png', + '/assets/icons/drawable-xxhdpi/search_bar_secondary_filter_btn.png', + '/assets/icons/drawable-xxhdpi/search_bar_secondary_filter_divider.png', + '/assets/icons/drawable-xxhdpi/search_cancel_button_normal.9.png', + '/assets/icons/drawable-xxhdpi/search_cancel_button_pressed.9.png', + '/assets/icons/drawable-xxhdpi/search_down.9.png', + '/assets/icons/drawable-xxhdpi/search_field.9.png', + '/assets/icons/drawable-xxhdpi/search_field_disabled.9.png', + '/assets/icons/drawable-xxhdpi/search_normal.9.png', + '/assets/icons/drawable-xxhdpi/secondary_progress_smartisanos.9.png', + '/assets/icons/drawable-xxhdpi/select_image_folder_arrow.png', + '/assets/icons/drawable-xxhdpi/select_image_tab_bg.9.png', + '/assets/icons/drawable-xxhdpi/select_image_title_bar_bg.9.png', + '/assets/icons/drawable-xxhdpi/setting_item_arrow.png', + '/assets/icons/drawable-xxhdpi/setting_item_arrow_highlight.png', + '/assets/icons/drawable-xxhdpi/setting_item_down_disable.9.png', + '/assets/icons/drawable-xxhdpi/setting_item_down_highlight.9.png', + '/assets/icons/drawable-xxhdpi/setting_item_down_normal.9.png', + '/assets/icons/drawable-xxhdpi/setting_item_up_disable.9.png', + '/assets/icons/drawable-xxhdpi/setting_item_up_highlight.9.png', + '/assets/icons/drawable-xxhdpi/setting_item_up_normal.9.png', + '/assets/icons/drawable-xxhdpi/setting_next_arrow.png', + '/assets/icons/drawable-xxhdpi/setting_next_arrow_down.png', + '/assets/icons/drawable-xxhdpi/setting_single_disable.9.png', + '/assets/icons/drawable-xxhdpi/setting_single_highlight.9.png', + '/assets/icons/drawable-xxhdpi/setting_single_normal.9.png', + '/assets/icons/drawable-xxhdpi/setting_titlebar_back_arrow_normal.9.png', + '/assets/icons/drawable-xxhdpi/setting_titlebar_back_arrow_normal_down.9.png', + '/assets/icons/drawable-xxhdpi/setting_titlebar_back_normal.9.png', + '/assets/icons/drawable-xxhdpi/setting_titlebar_back_normal_down.9.png', + '/assets/icons/drawable-xxhdpi/share_weibo_9pic_bg.9.png', + '/assets/icons/drawable-xxhdpi/share_weibo_insert_bar.9.png', + '/assets/icons/drawable-xxhdpi/share_weibo_insert_bubble.9.png', + '/assets/icons/drawable-xxhdpi/share_weibo_insert_shadow.9.png', + '/assets/icons/drawable-xxhdpi/sinaweibo_list_item_bg.9.png', + '/assets/icons/drawable-xxhdpi/sinaweibo_preview.9.png', + '/assets/icons/drawable-xxhdpi/smartisan_progress_dialog_bg.9.png', + '/assets/icons/drawable-xxhdpi/smartisan_secondary_bar_shadow.9.png', + '/assets/icons/drawable-xxhdpi/smartisan_tab_bar.9.png', + '/assets/icons/drawable-xxhdpi/smartisan_tab_bar_lite.9.png', + '/assets/icons/drawable-xxhdpi/smartisan_tab_bar_lite_pressed.9.png', + '/assets/icons/drawable-xxhdpi/smartisan_tab_bar_pressed.9.png', + '/assets/icons/drawable-xxhdpi/snack_button_normal.9.png', + '/assets/icons/drawable-xxhdpi/snack_button_pressed.9.png', + '/assets/icons/drawable-xxhdpi/sub_item_back_ground_bottom.9.png', + '/assets/icons/drawable-xxhdpi/sub_item_back_ground_bottom_disabled.9.png', + '/assets/icons/drawable-xxhdpi/sub_item_back_ground_bottom_highlight.9.png', + '/assets/icons/drawable-xxhdpi/sub_item_back_ground_middle.9.png', + '/assets/icons/drawable-xxhdpi/sub_item_back_ground_middle_disabled.9.png', + '/assets/icons/drawable-xxhdpi/sub_item_back_ground_middle_highlight.9.png', + '/assets/icons/drawable-xxhdpi/sub_item_back_ground_single.9.png', + '/assets/icons/drawable-xxhdpi/sub_item_back_ground_single_disabled.9.png', + '/assets/icons/drawable-xxhdpi/sub_item_back_ground_single_highlight.9.png', + '/assets/icons/drawable-xxhdpi/sub_item_back_ground_top.9.png', + '/assets/icons/drawable-xxhdpi/sub_item_back_ground_top_disabled.9.png', + '/assets/icons/drawable-xxhdpi/sub_item_back_ground_top_highlight.9.png', + '/assets/icons/drawable-xxhdpi/surname_mask_bottom.png', + '/assets/icons/drawable-xxhdpi/surname_mask_top.png', + '/assets/icons/drawable-xxhdpi/surname_popup_arrow_bottom.png', + '/assets/icons/drawable-xxhdpi/surname_popup_arrow_up.png', + '/assets/icons/drawable-xxhdpi/surname_popup_background.9.png', + '/assets/icons/drawable-xxhdpi/surname_popup_bottom_arrow.png', + '/assets/icons/drawable-xxhdpi/surname_popup_item_left_normal.9.png', + '/assets/icons/drawable-xxhdpi/surname_popup_item_middle_normal.9.png', + '/assets/icons/drawable-xxhdpi/surname_popup_item_press.9.png', + '/assets/icons/drawable-xxhdpi/surname_popup_item_right_normal.9.png', + '/assets/icons/drawable-xxhdpi/surname_second_popup_bg.9.png', + '/assets/icons/drawable-xxhdpi/surname_second_popup_ex_bg.9.png', + '/assets/icons/drawable-xxhdpi/tab_bar_shadow.9.png', + '/assets/icons/drawable-xxhdpi/thin_progress_disabled_smartisanos.9.png', + '/assets/icons/drawable-xxhdpi/thin_progress_error_smartisanos.9.png', + '/assets/icons/drawable-xxhdpi/thin_progress_smartisanos.9.png', + '/assets/icons/drawable-xxhdpi/thin_progress_track_disabled_smartisanos.9.png', + '/assets/icons/drawable-xxhdpi/thin_progress_track_smartisanos.9.png', + '/assets/icons/drawable-xxhdpi/thin_progress_unfocused_smartisanos.9.png', + '/assets/icons/drawable-xxhdpi/thin_secondary_progress_smartisanos.9.png', + '/assets/icons/drawable-xxhdpi/thin_timer_progress_bridge.9.png', + '/assets/icons/drawable-xxhdpi/thin_timer_progress_end.9.png', + '/assets/icons/drawable-xxhdpi/thin_timer_progress_start.9.png', + '/assets/icons/drawable-xxhdpi/thin_timer_track_end.9.png', + '/assets/icons/drawable-xxhdpi/time_picker_widget_bg.9.png', + '/assets/icons/drawable-xxhdpi/time_picker_widget_bg_ex_new.9.png', + '/assets/icons/drawable-xxhdpi/time_picker_widget_bottom.png', + '/assets/icons/drawable-xxhdpi/time_picker_widget_lens.9.png', + '/assets/icons/drawable-xxhdpi/timer_progress_bridge.9.png', + '/assets/icons/drawable-xxhdpi/timer_track.9.png', + '/assets/icons/drawable-xxhdpi/timer_track_end.9.png', + '/assets/icons/drawable-xxhdpi/tip_toast_bg_dark.9.png', + '/assets/icons/drawable-xxhdpi/tip_toast_bg_light.9.png', + '/assets/icons/drawable-xxhdpi/title_bar_background.9.png', + '/assets/icons/drawable-xxhdpi/title_bar_background_round_corner.9.png', + '/assets/icons/drawable-xxhdpi/title_bar_bg.9.png', + '/assets/icons/drawable-xxhdpi/title_bar_bg.9.png', + '/assets/icons/drawable-xxhdpi/title_bar_button_wide_normal.9.png', + '/assets/icons/drawable-xxhdpi/title_bar_button_wide_press.9.png', + '/assets/icons/drawable-xxhdpi/title_bar_shadow.9.png', + '/assets/icons/drawable-xxhdpi/title_bar_shadow_short.9.png', + '/assets/icons/drawable-xxhdpi/title_btn_ok_blue_frame_backgournd.9.png', + '/assets/icons/drawable-xxhdpi/title_btn_ok_blue_frame_backgournd_actived.9.png', + '/assets/icons/drawable-xxhdpi/titlebar_light.9.png', + '/assets/icons/drawable-xxhdpi/toast_action_dismiss.png', + '/assets/icons/drawable-xxhdpi/toast_frame_smartisanos.9.png', + '/assets/icons/drawable-xxhdpi/topbar_bottom_line.9.png', + '/assets/icons/drawable-xxhdpi/weibo_background.9.png', + '/assets/icons/drawable-xxhdpi/weibo_background_nosignature.9.png', + '/assets/icons/drawable-xxhdpi/weibo_bg_preview.9.png', + '/assets/icons/drawable-xxhdpi/weibo_from_other_bg_preview.9.png', + '/assets/icons/drawable-xxhdpi/abc_btn_check_to_on_mtrl_000.png', + '/assets/icons/drawable-xxhdpi/abc_btn_check_to_on_mtrl_015.png', + '/assets/icons/drawable-xxhdpi/abc_btn_radio_to_on_mtrl_000.png', + '/assets/icons/drawable-xxhdpi/abc_btn_radio_to_on_mtrl_015.png', + '/assets/icons/drawable-xxhdpi/abc_scrubber_control_off_mtrl_alpha.png', + '/assets/icons/drawable-xxhdpi/abc_scrubber_control_to_pressed_mtrl_000.png', + '/assets/icons/drawable-xxhdpi/abc_scrubber_control_to_pressed_mtrl_005.png', + '/assets/icons/drawable-xxhdpi/abc_text_select_handle_left_mtrl.png', + '/assets/icons/drawable-xxhdpi/abc_text_select_handle_middle_mtrl.png', + '/assets/icons/drawable-xxhdpi/abc_text_select_handle_right_mtrl.png', + '/assets/icons/drawable-xxhdpi/abc_textfield_activated_mtrl_alpha.9.png', + '/assets/icons/drawable-xxhdpi/abc_textfield_default_mtrl_alpha.9.png', + '/assets/icons/drawable-xxhdpi/abc_textfield_search_activated_mtrl_alpha.9.png', + '/assets/icons/drawable-xxhdpi/abc_textfield_search_default_mtrl_alpha.9.png', + '/assets/icons/drawable-xxhdpi/account_sync_icon.webp', + '/assets/icons/drawable-xxhdpi/action_icon_ai_rag.png', + '/assets/icons/drawable-xxhdpi/add_doc.png', + '/assets/icons/drawable-xxhdpi/add_round_s_btn_disabled.png', + '/assets/icons/drawable-xxhdpi/add_round_s_btn_normal.png', + '/assets/icons/drawable-xxhdpi/add_round_s_btn_pressed.png', + '/assets/icons/drawable-xxhdpi/ai_close_icon.png', + '/assets/icons/drawable-xxhdpi/ai_detail_icon_ai_report.png', + '/assets/icons/drawable-xxhdpi/ai_free_icon.png', + '/assets/icons/drawable-xxhdpi/ai_input_close_ic.png', + '/assets/icons/drawable-xxhdpi/ai_input_go_icon.png', + '/assets/icons/drawable-xxhdpi/ai_input_go_icon_disable.png', + '/assets/icons/drawable-xxhdpi/ai_rag_icon.png', + '/assets/icons/drawable-xxhdpi/ai_result_apply_icon.png', + '/assets/icons/drawable-xxhdpi/ai_result_delete_icon.png', + '/assets/icons/drawable-xxhdpi/ai_result_refresh_icon.png', + '/assets/icons/drawable-xxhdpi/ai_select_handle.png', + '/assets/icons/drawable-xxhdpi/app_operation.png', + '/assets/icons/drawable-xxhdpi/app_operation_press.png', + '/assets/icons/drawable-xxhdpi/arrow.png', + '/assets/icons/drawable-xxhdpi/arrow_icon.png', + '/assets/icons/drawable-xxhdpi/arrow_round_s_btn_disabled.png', + '/assets/icons/drawable-xxhdpi/arrow_round_s_btn_normal.png', + '/assets/icons/drawable-xxhdpi/arrow_round_s_btn_pressed.png', + '/assets/icons/drawable-xxhdpi/back_btn_disabled.9.png', + '/assets/icons/drawable-xxhdpi/back_btn_normal.9.png', + '/assets/icons/drawable-xxhdpi/back_btn_pressed.9.png', + '/assets/icons/drawable-xxhdpi/benefit_list_create_icon.png', + '/assets/icons/drawable-xxhdpi/benefit_list_optimize_icon.png', + '/assets/icons/drawable-xxhdpi/benefit_list_summary_icon.png', + '/assets/icons/drawable-xxhdpi/bg_btn_menu_mode.png', + '/assets/icons/drawable-xxhdpi/bg_btn_record.png', + '/assets/icons/drawable-xxhdpi/bg_buy_btn.png', + '/assets/icons/drawable-xxhdpi/bg_kb_controller_title.png', + '/assets/icons/drawable-xxhdpi/bg_rag_submit.png', + '/assets/icons/drawable-xxhdpi/bg_retry.png', + '/assets/icons/drawable-xxhdpi/bg_slide_recycle.png', + '/assets/icons/drawable-xxhdpi/bhm_header_view_bg.png', + '/assets/icons/drawable-xxhdpi/bhm_item_view.png', + '/assets/icons/drawable-xxhdpi/bhm_item_view_ic_alert.png', + '/assets/icons/drawable-xxhdpi/bhm_item_view_pressed.png', + '/assets/icons/drawable-xxhdpi/bhm_num_blue.9.png', + '/assets/icons/drawable-xxhdpi/bhm_num_grey.9.png', + '/assets/icons/drawable-xxhdpi/bhm_num_red.9.png', + '/assets/icons/drawable-xxhdpi/blank_icon_large.png', + '/assets/icons/drawable-xxhdpi/blank_icon_small.png', + '/assets/icons/drawable-xxhdpi/blank_option_btn.png', + '/assets/icons/drawable-xxhdpi/blank_option_btn_disabled.png', + '/assets/icons/drawable-xxhdpi/blank_option_btn_pressed.png', + '/assets/icons/drawable-xxhdpi/bottom_bar_shadow.9.png', + '/assets/icons/drawable-xxhdpi/bottom_sheet_title_bar_bg.png', + '/assets/icons/drawable-xxhdpi/bottom_sheet_title_bar_lower_shadow.png', + '/assets/icons/drawable-xxhdpi/bottom_sheet_title_bar_upper_shadow.png', + '/assets/icons/drawable-xxhdpi/bottom_sheet_title_line.png', + '/assets/icons/drawable-xxhdpi/btn_add_folder.png', + '/assets/icons/drawable-xxhdpi/btn_ai.png', + '/assets/icons/drawable-xxhdpi/btn_back.png', + '/assets/icons/drawable-xxhdpi/btn_back_black.png', + '/assets/icons/drawable-xxhdpi/btn_check_off_disabled_smartisanos_light.png', + '/assets/icons/drawable-xxhdpi/btn_check_off_normal_smartisanos_light.png', + '/assets/icons/drawable-xxhdpi/btn_check_off_pressed_smartisanos_light.png', + '/assets/icons/drawable-xxhdpi/btn_check_off_smartisanos_light.png', + '/assets/icons/drawable-xxhdpi/btn_check_on_disabled_smartisanos_light.png', + '/assets/icons/drawable-xxhdpi/btn_check_on_pressed_smartisanos_light.png', + '/assets/icons/drawable-xxhdpi/btn_check_on_smartisanos_light.png', + '/assets/icons/drawable-xxhdpi/btn_create.png', + '/assets/icons/drawable-xxhdpi/btn_delete_notes.png', + '/assets/icons/drawable-xxhdpi/btn_edit_folder.png', + '/assets/icons/drawable-xxhdpi/btn_load_error.png', + '/assets/icons/drawable-xxhdpi/btn_pic.png', + '/assets/icons/drawable-xxhdpi/btn_refresh_normal.webp', + '/assets/icons/drawable-xxhdpi/btn_refresh_pressed.webp', + '/assets/icons/drawable-xxhdpi/btn_restore.png', + '/assets/icons/drawable-xxhdpi/btn_save_notes.png', + '/assets/icons/drawable-xxhdpi/btn_save_pic.png', + '/assets/icons/drawable-xxhdpi/btn_selected_on_disabled_smartisanos_light.png', + '/assets/icons/drawable-xxhdpi/btn_selected_on_pressed_smartisanos_light.png', + '/assets/icons/drawable-xxhdpi/btn_selected_on_smartisanos_light.png', + '/assets/icons/drawable-xxhdpi/btn_settings.png', + '/assets/icons/drawable-xxhdpi/btn_share_notes.png', + '/assets/icons/drawable-xxhdpi/btn_share.png', + '/assets/icons/drawable-xxhdpi/btn_slide_delete_complete.png', + '/assets/icons/drawable-xxhdpi/btn_slide_delete_normal.png', + '/assets/icons/drawable-xxhdpi/btn_slide_delete_pressed.png', + '/assets/icons/drawable-xxhdpi/btn_slide_restore.png', + '/assets/icons/drawable-xxhdpi/btn_sort_down.png', + '/assets/icons/drawable-xxhdpi/btn_sort_up.png', + '/assets/icons/drawable-xxhdpi/button_back_down.9.png', + '/assets/icons/drawable-xxhdpi/button_back_normal.9.png', + '/assets/icons/drawable-xxhdpi/button_blue_down.9.png', + '/assets/icons/drawable-xxhdpi/button_blue_normal.9.png', + '/assets/icons/drawable-xxhdpi/button_cancel_normal.9.png', + '/assets/icons/drawable-xxhdpi/button_cancel_press.9.png', + '/assets/icons/drawable-xxhdpi/button_confirm_normal.9.png', + '/assets/icons/drawable-xxhdpi/button_confirm_press.9.png', + '/assets/icons/drawable-xxhdpi/button_down.9.png', + '/assets/icons/drawable-xxhdpi/button_normal.9.png', + '/assets/icons/drawable-xxhdpi/calendar.png', + '/assets/icons/drawable-xxhdpi/cancel_btn_pressed.9.png', + '/assets/icons/drawable-xxhdpi/cancel_btn.9.png', + '/assets/icons/drawable-xxhdpi/cb_buy_vip_checked.png', + '/assets/icons/drawable-xxhdpi/cb_buy_vip_uncheck.png', + '/assets/icons/drawable-xxhdpi/check_box_off_disabled.png', + '/assets/icons/drawable-xxhdpi/check_box_off.png', + '/assets/icons/drawable-xxhdpi/check_box_on_disabled.png', + '/assets/icons/drawable-xxhdpi/check_box_on_pressed.png', + '/assets/icons/drawable-xxhdpi/check_box_on.png', + '/assets/icons/drawable-xxhdpi/circle_mask.png', + '/assets/icons/drawable-xxhdpi/circle.png', + '/assets/icons/drawable-xxhdpi/circular_progress_download.png', + '/assets/icons/drawable-xxhdpi/circular_progress_pause.png', + '/assets/icons/drawable-xxhdpi/circular_progress_processing.png', + '/assets/icons/drawable-xxhdpi/circular_progress_redo.png', + '/assets/icons/drawable-xxhdpi/clear_intput_nickname.png', + '/assets/icons/drawable-xxhdpi/clock.png', + '/assets/icons/drawable-xxhdpi/com_sina_weibo_icon.png', + '/assets/icons/drawable-xxhdpi/common_add_city_header_shadow.png', + '/assets/icons/drawable-xxhdpi/common_avatar_overcover.png', + '/assets/icons/drawable-xxhdpi/common_bg_vip_upgrade.png', + '/assets/icons/drawable-xxhdpi/common_blue_long_button_down.9.png', + '/assets/icons/drawable-xxhdpi/common_blue_long_button.9.png', + '/assets/icons/drawable-xxhdpi/common_btn_check_off_normal_smartisanos_light.png', + '/assets/icons/drawable-xxhdpi/common_btn_check_on_smartisanos_light.png', + '/assets/icons/drawable-xxhdpi/common_code_refresh.png', + '/assets/icons/drawable-xxhdpi/common_code_refresh_down.png', + '/assets/icons/drawable-xxhdpi/common_correct_sign.png', + '/assets/icons/drawable-xxhdpi/common_default_header.png', + '/assets/icons/drawable-xxhdpi/common_error_sign.png', + '/assets/icons/drawable-xxhdpi/common_list_header.png', + '/assets/icons/drawable-xxhdpi/common_loading_dark.png', + '/assets/icons/drawable-xxhdpi/common_mask.png', + '/assets/icons/drawable-xxhdpi/common_mover_launcher.png', + '/assets/icons/drawable-xxhdpi/common_my_number.9.png', + '/assets/icons/drawable-xxhdpi/common_pressed_top.9.png', + '/assets/icons/drawable-xxhdpi/common_red_long_button_down.9.png', + '/assets/icons/drawable-xxhdpi/common_red_long_button.9.png', + '/assets/icons/drawable-xxhdpi/common_search_cancel_button.9.png', + '/assets/icons/drawable-xxhdpi/common_search_cancel_button_down.9.png', + '/assets/icons/drawable-xxhdpi/common_search_text_clear.png', + '/assets/icons/drawable-xxhdpi/common_search_text_clear_down.png', + '/assets/icons/drawable-xxhdpi/common_select_sign.png', + '/assets/icons/drawable-xxhdpi/common_sub_item_back_ground_bottom.9.png', + '/assets/icons/drawable-xxhdpi/common_sub_item_back_ground_bottom_disabled.9.png', + '/assets/icons/drawable-xxhdpi/common_sub_item_back_ground_bottom_highlight.9.png', + '/assets/icons/drawable-xxhdpi/common_sub_item_back_ground_single.9.png', + '/assets/icons/drawable-xxhdpi/common_sub_item_back_ground_single_disabled.9.png', + '/assets/icons/drawable-xxhdpi/common_sub_item_back_ground_single_highlight.9.png', + '/assets/icons/drawable-xxhdpi/common_sub_item_back_ground_top.9.png', + '/assets/icons/drawable-xxhdpi/common_sub_item_back_ground_top_disabled.9.png', + '/assets/icons/drawable-xxhdpi/common_sub_item_back_ground_top_highlight.9.png', + '/assets/icons/drawable-xxhdpi/commonres_dialog_titlebar_bg.9.png', + '/assets/icons/drawable-xxhdpi/commonres_dailog_single_button_selector.xml', + '/assets/icons/drawable-xxhdpi/confirm_dialog_bg2.9.png', + '/assets/icons/drawable-xxhdpi/conflict_warning.png', + '/assets/icons/drawable-xxhdpi/contact_icon_pressed.png', + '/assets/icons/drawable-xxhdpi/contact_icon.png', + '/assets/icons/drawable-xxhdpi/delete_all_button_disabled.9.png', + '/assets/icons/drawable-xxhdpi/delete_all_button_down_bg.9.png', + '/assets/icons/drawable-xxhdpi/delete_all_button_nomal_bg.9.png', + '/assets/icons/drawable-xxhdpi/delete_btn_disabled.9.png', + '/assets/icons/drawable-xxhdpi/delete_btn_normal.9.png', + '/assets/icons/drawable-xxhdpi/delete_btn_pressed.9.png', + '/assets/icons/drawable-xxhdpi/detail_all_folder_btn_bg_normal.9.png', + '/assets/icons/drawable-xxhdpi/detail_all_folder_btn_bg_pressed.9.png', + '/assets/icons/drawable-xxhdpi/detail_call_folder_btn_bg_normal.9.png', + '/assets/icons/drawable-xxhdpi/detail_call_folder_btn_bg_pressed.9.png', + '/assets/icons/drawable-xxhdpi/detail_delete_folder_btn_disable.9.png', + '/assets/icons/drawable-xxhdpi/detail_note_image_cover.9.png', + '/assets/icons/drawable-xxhdpi/detail_note_img_indicator.png', + '/assets/icons/drawable-xxhdpi/detail_note_item_image_move.png', + '/assets/icons/drawable-xxhdpi/detail_other_folder_btn_bg_normal.9.png', + '/assets/icons/drawable-xxhdpi/detail_other_folder_btn_bg_pressed.9.png', + '/assets/icons/drawable-xxhdpi/detail_star_folder_btn_bg_normal.9.png', + '/assets/icons/drawable-xxhdpi/detail_star_folder_btn_bg_pressed.9.png', + '/assets/icons/drawable-xxhdpi/dialog_btn_left_normal.9.png', + '/assets/icons/drawable-xxhdpi/dialog_btn_left_pressed.9.png', + '/assets/icons/drawable-xxhdpi/dialog_btn_right_normal.9.png', + '/assets/icons/drawable-xxhdpi/dialog_btn_right_pressed.9.png', + '/assets/icons/drawable-xxhdpi/dialog_btn_single_normal.9.png', + '/assets/icons/drawable-xxhdpi/dialog_btn_single_pressed.9.png', + '/assets/icons/drawable-xxhdpi/dialog_content_bg.9.png', + '/assets/icons/drawable-xxhdpi/dialog_next.png', + '/assets/icons/drawable-xxhdpi/dialog_title_back_icon.png', + '/assets/icons/drawable-xxhdpi/dialog_title_bg.9.png', + '/assets/icons/drawable-xxhdpi/dialog_title_close_icon.png', + '/assets/icons/drawable-xxhdpi/drag_image_note_background.png', + '/assets/icons/drawable-xxhdpi/drop_down_arrow_pressed.png', + '/assets/icons/drawable-xxhdpi/drop_down_arrow.png', + '/assets/icons/drawable-xxhdpi/dslv_item_shadow.9.png', + '/assets/icons/drawable-xxhdpi/easy_password_dot_empty.png', + '/assets/icons/drawable-xxhdpi/easy_password_dot_error.png', + '/assets/icons/drawable-xxhdpi/easy_password_dot_full.png', + '/assets/icons/drawable-xxhdpi/edit_text_bg.9.png', + '/assets/icons/drawable-xxhdpi/edit_text_verification_code.9.png', + '/assets/icons/drawable-xxhdpi/editor_banner_bg.9.png', + '/assets/icons/drawable-xxhdpi/editor_bg_bottom.9.png', + '/assets/icons/drawable-xxhdpi/editor_bg_middle.9.png', + '/assets/icons/drawable-xxhdpi/editor_bg_single.9.png', + '/assets/icons/drawable-xxhdpi/editor_bg_top.9.png', + '/assets/icons/drawable-xxhdpi/editor_left_icon_bg_bottom.9.png', + '/assets/icons/drawable-xxhdpi/editor_left_icon_bg_middle.9.png', + '/assets/icons/drawable-xxhdpi/editor_left_icon_bg_single.9.png', + '/assets/icons/drawable-xxhdpi/editor_left_icon_bg_top.9.png', + '/assets/icons/drawable-xxhdpi/email.png', + '/assets/icons/drawable-xxhdpi/eye_icon_0001.png', + '/assets/icons/drawable-xxhdpi/eye_icon_0002.png', + '/assets/icons/drawable-xxhdpi/eye_icon_0003.png', + '/assets/icons/drawable-xxhdpi/eye_icon_0004.png', + '/assets/icons/drawable-xxhdpi/eye_icon_0005.png', + '/assets/icons/drawable-xxhdpi/eye_icon_0006.png', + '/assets/icons/drawable-xxhdpi/eye_icon_0007.png', + '/assets/icons/drawable-xxhdpi/eye_icon_0008.png', + '/assets/icons/drawable-xxhdpi/eye_icon_0009.png', + '/assets/icons/drawable-xxhdpi/eye_icon_0010.png', + '/assets/icons/drawable-xxhdpi/eye_icon_0011.png', + '/assets/icons/drawable-xxhdpi/eye_icon_0012.png', + '/assets/icons/drawable-xxhdpi/eye_icon_0013.png', + '/assets/icons/drawable-xxhdpi/eye_icon_0014.png', + '/assets/icons/drawable-xxhdpi/eye_icon_0015.png', + '/assets/icons/drawable-xxhdpi/eye_icon_0016.png', + '/assets/icons/drawable-xxhdpi/fb_invail.png', + '/assets/icons/drawable-xxhdpi/fb.png', + '/assets/icons/drawable-xxhdpi/feedback_add_down.png', + '/assets/icons/drawable-xxhdpi/feedback_add.png', + '/assets/icons/drawable-xxhdpi/feedback_background_light_bg.png', + '/assets/icons/drawable-xxhdpi/feedback_delete_down.png', + '/assets/icons/drawable-xxhdpi/feedback_delete.png', + '/assets/icons/drawable-xxhdpi/feedback_popup_bg.9.png', + '/assets/icons/drawable-xxhdpi/feedback_title_btn_back.9.png', + '/assets/icons/drawable-xxhdpi/feedback_title_btn_back_highlight.9.png', + '/assets/icons/drawable-xxhdpi/feedback_title_btn_back_light_normal.9.png', + '/assets/icons/drawable-xxhdpi/feedback_title_btn_back_light_normal_down.9.png', + '/assets/icons/drawable-xxhdpi/feedback_title_btn_ok.9.png', + '/assets/icons/drawable-xxhdpi/feedback_title_btn_ok_both_disabled.9.png', + '/assets/icons/drawable-xxhdpi/feedback_title_btn_ok_highlight.9.png', + '/assets/icons/drawable-xxhdpi/feedback_title_btn_ok_light.9.png', + '/assets/icons/drawable-xxhdpi/feedback_title_btn_ok_light_down.9.png', + '/assets/icons/drawable-xxhdpi/fg_attention.webp', + '/assets/icons/drawable-xxhdpi/fg_loading.webp', + '/assets/icons/drawable-xxhdpi/filter_btn_left_pressed.9.png', + '/assets/icons/drawable-xxhdpi/filter_btn_left.9.png', + '/assets/icons/drawable-xxhdpi/filter_btn_middle_pressed.9.png', + '/assets/icons/drawable-xxhdpi/filter_btn_middle.9.png', + '/assets/icons/drawable-xxhdpi/filter_btn_right_pressed.9.png', + '/assets/icons/drawable-xxhdpi/filter_btn_right.9.png', + '/assets/icons/drawable-xxhdpi/folder_bottom_button_normal.9.png', + '/assets/icons/drawable-xxhdpi/folder_bottom_button_pressed.9.png', + '/assets/icons/drawable-xxhdpi/folder_delete_disable.9.png', + '/assets/icons/drawable-xxhdpi/folder_delete_normal.9.png', + '/assets/icons/drawable-xxhdpi/folder_delete_pressed.9.png', + '/assets/icons/drawable-xxhdpi/folder_item_pressed_bg.9.png', + '/assets/icons/drawable-xxhdpi/folder_selected_disable.png', + '/assets/icons/drawable-xxhdpi/folder_selected.png', + '/assets/icons/drawable-xxhdpi/folder_title_arrow_normal.png', + '/assets/icons/drawable-xxhdpi/folder_title_arrow_pressed.png', + '/assets/icons/drawable-xxhdpi/footer_item_bg_bottom.9.png', + '/assets/icons/drawable-xxhdpi/footer_item_bg_top.9.png', + '/assets/icons/drawable-xxhdpi/footer_sender_smartisan.png', + '/assets/icons/drawable-xxhdpi/footer_sender_some.png', + '/assets/icons/drawable-xxhdpi/footer_smartisan.9.png', + '/assets/icons/drawable-xxhdpi/footer_switch.png', + '/assets/icons/drawable-xxhdpi/gdt_ic_express_pause.png', + '/assets/icons/drawable-xxhdpi/gdt_ic_express_play.png', + '/assets/icons/drawable-xxhdpi/grid_wide_bg_down.png', + '/assets/icons/drawable-xxhdpi/grid_wide_bg.png', + '/assets/icons/drawable-xxhdpi/group_list_bottom_pressed.9.png', + '/assets/icons/drawable-xxhdpi/group_list_bottom.9.png', + '/assets/icons/drawable-xxhdpi/group_list_mid_pressed.9.png', + '/assets/icons/drawable-xxhdpi/group_list_mid.9.png', + '/assets/icons/drawable-xxhdpi/group_list_single_pressed.9.png', + '/assets/icons/drawable-xxhdpi/group_list_single.9.png', + '/assets/icons/drawable-xxhdpi/group_list_top_pressed.9.png', + '/assets/icons/drawable-xxhdpi/group_list_top.9.png', + '/assets/icons/drawable-xxhdpi/hamburger_round_m_btn_disabled.png', + '/assets/icons/drawable-xxhdpi/hamburger_round_m_btn_normal.png', + '/assets/icons/drawable-xxhdpi/hamburger_round_m_btn_pressed.png', + '/assets/icons/drawable-xxhdpi/header_btn_non_clickable.9.png', + '/assets/icons/drawable-xxhdpi/header_btn_press.9.png', + '/assets/icons/drawable-xxhdpi/header_btn.9.png', + '/assets/icons/drawable-xxhdpi/header_shadow.png', + '/assets/icons/drawable-xxhdpi/header.png', + '/assets/icons/drawable-xxhdpi/highlight_btn_disabled.9.png', + '/assets/icons/drawable-xxhdpi/highlight_btn_normal.9.png', + '/assets/icons/drawable-xxhdpi/highlight_btn_pressed.9.png', + '/assets/icons/drawable-xxhdpi/ic_call_answer_low.png', + '/assets/icons/drawable-xxhdpi/ic_call_answer_video_low.png', + '/assets/icons/drawable-xxhdpi/ic_call_answer_video.png', + '/assets/icons/drawable-xxhdpi/ic_call_answer.png', + '/assets/icons/drawable-xxhdpi/ic_call_decline_low.png', + '/assets/icons/drawable-xxhdpi/ic_call_decline.png', + '/assets/icons/drawable-xxhdpi/ic_err_common.png', + '/assets/icons/drawable-xxhdpi/ic_err_network.png', + '/assets/icons/drawable-xxhdpi/ic_list_load_more_refresh_white.png', + '/assets/icons/drawable-xxhdpi/ic_list_load_more_refresh.png', + '/assets/icons/drawable-xxhdpi/ic_more_disabled.png', + '/assets/icons/drawable-xxhdpi/ic_more_normal.png', + '/assets/icons/drawable-xxhdpi/ic_more_pressed.png', + '/assets/icons/drawable-xxhdpi/ic_rag_share_disabled.png', + '/assets/icons/drawable-xxhdpi/ic_rag_share_pressed.png', + '/assets/icons/drawable-xxhdpi/ic_rag_share.png', + '/assets/icons/drawable-xxhdpi/ic_rag_tip_close.png', + '/assets/icons/drawable-xxhdpi/ic_red_dot.png', + '/assets/icons/drawable-xxhdpi/ic_shortcut_create_note.png', + '/assets/icons/drawable-xxhdpi/ic_shortcut_recent_note.png', + '/assets/icons/drawable-xxhdpi/ic_shortcut_search_note.png', + '/assets/icons/drawable-xxhdpi/ic_stat_bd_notif_download.png', + '/assets/icons/drawable-xxhdpi/ic_sv_empty_white_bg.png', + '/assets/icons/drawable-xxhdpi/ic_sv_empty_white.png', + '/assets/icons/drawable-xxhdpi/ic_sv_empty.png', + '/assets/icons/drawable-xxhdpi/ic_sv_wifi_white.png', + '/assets/icons/drawable-xxhdpi/ic_sv_wifi.png', + '/assets/icons/drawable-xxhdpi/icon_add_shortcut.png', + '/assets/icons/drawable-xxhdpi/icon_ai_feat_ad.png', + '/assets/icons/drawable-xxhdpi/icon_ai_feat_brainstorm.png', + '/assets/icons/drawable-xxhdpi/icon_ai_feat_expand.png', + '/assets/icons/drawable-xxhdpi/icon_ai_feat_free_prompt.png', + '/assets/icons/drawable-xxhdpi/icon_ai_feat_ideas.png', + '/assets/icons/drawable-xxhdpi/icon_ai_feat_keypoint.png', + '/assets/icons/drawable-xxhdpi/icon_ai_feat_make_longer.png', + '/assets/icons/drawable-xxhdpi/icon_ai_feat_make_shorter.png', + '/assets/icons/drawable-xxhdpi/icon_ai_feat_outline.png', + '/assets/icons/drawable-xxhdpi/icon_ai_feat_polish.png', + '/assets/icons/drawable-xxhdpi/icon_ai_feat_rectify.png', + '/assets/icons/drawable-xxhdpi/icon_ai_feat_typesetting.png', + '/assets/icons/drawable-xxhdpi/icon_ai_report.png', + '/assets/icons/drawable-xxhdpi/icon_chat.png', + '/assets/icons/drawable-xxhdpi/icon_delete_btn_disabled.png', + '/assets/icons/drawable-xxhdpi/icon_delete_btn_normal.png', + '/assets/icons/drawable-xxhdpi/icon_delete_btn_pressed.png', + '/assets/icons/drawable-xxhdpi/icon_detail_mode_arrow_normal.png', + '/assets/icons/drawable-xxhdpi/icon_detail_mode_arrow_pressed.png', + '/assets/icons/drawable-xxhdpi/icon_detail_mode_md.png', + '/assets/icons/drawable-xxhdpi/icon_detail_mode_rtf.png', + '/assets/icons/drawable-xxhdpi/icon_detail_star_checked.png', + '/assets/icons/drawable-xxhdpi/icon_detail_star_unchecked.png', + '/assets/icons/drawable-xxhdpi/icon_edit_rag_shortcut.png', + '/assets/icons/drawable-xxhdpi/icon_folder_all.png', + '/assets/icons/drawable-xxhdpi/icon_folder_checked.png', + '/assets/icons/drawable-xxhdpi/icon_folder_document.png', + '/assets/icons/drawable-xxhdpi/icon_folder_favorite.png', + '/assets/icons/drawable-xxhdpi/icon_folder_rename.png', + '/assets/icons/drawable-xxhdpi/icon_folder_selected.png', + '/assets/icons/drawable-xxhdpi/icon_folder_sort_name.png', + '/assets/icons/drawable-xxhdpi/icon_folder_sort_time.png', + '/assets/icons/drawable-xxhdpi/icon_folder_trash.png', + '/assets/icons/drawable-xxhdpi/icon_folder_unchecked.png', + '/assets/icons/drawable-xxhdpi/icon_kb_controller_close.png', + '/assets/icons/drawable-xxhdpi/icon_mode_markdown.png', + '/assets/icons/drawable-xxhdpi/icon_mode_normal.png', + '/assets/icons/drawable-xxhdpi/icon_mode_rtf.png', + '/assets/icons/drawable-xxhdpi/icon_mode_switch_quiz.png', + '/assets/icons/drawable-xxhdpi/icon_mode_switch_record.png', + '/assets/icons/drawable-xxhdpi/icon_polish.png', + '/assets/icons/drawable-xxhdpi/icon_publish_state_publish_failed.png', + '/assets/icons/drawable-xxhdpi/icon_publish_state_publishing.png', + '/assets/icons/drawable-xxhdpi/icon_remove_shortcut.png', + '/assets/icons/drawable-xxhdpi/icon_search_btn_disabled.png', + '/assets/icons/drawable-xxhdpi/icon_search_btn_normal.png', + '/assets/icons/drawable-xxhdpi/icon_search_btn_pressed.png', + '/assets/icons/drawable-xxhdpi/icon_setting_btn_disabled.png', + '/assets/icons/drawable-xxhdpi/icon_setting_btn_normal.png', + '/assets/icons/drawable-xxhdpi/icon_setting_btn_pressed.png', + '/assets/icons/drawable-xxhdpi/icon_settings.png', + '/assets/icons/drawable-xxhdpi/icon_shortcut_rag.png', + '/assets/icons/drawable-xxhdpi/icon_slide_seperator_recycle.png', + '/assets/icons/drawable-xxhdpi/icon_top_checked.png', + '/assets/icons/drawable-xxhdpi/icon_top_normal.png', + '/assets/icons/drawable-xxhdpi/image_preview_mask_bottom.png', + '/assets/icons/drawable-xxhdpi/img_load_error.png', + '/assets/icons/drawable-xxhdpi/import_icon_checked.png', + '/assets/icons/drawable-xxhdpi/import_icon_folder.png', + '/assets/icons/drawable-xxhdpi/import_icon_note.png', + '/assets/icons/drawable-xxhdpi/import_icon_unchecked.png', + '/assets/icons/drawable-xxhdpi/import_knb_add_icon.png', + '/assets/icons/drawable-xxhdpi/import_search_bar_background.9.png', + '/assets/icons/drawable-xxhdpi/import_search_bar_clear.png', + '/assets/icons/drawable-xxhdpi/import_search_bar_left_icon.png', + '/assets/icons/drawable-xxhdpi/import_select.png', + '/assets/icons/drawable-xxhdpi/import_unselect.png', + '/assets/icons/drawable-xxhdpi/indicator_highlight.png', + '/assets/icons/drawable-xxhdpi/indicator.png', + '/assets/icons/drawable-xxhdpi/insert_bubble_shadow.9.png', + '/assets/icons/drawable-xxhdpi/item_bg_without_line_down.png', + '/assets/icons/drawable-xxhdpi/item_bg_without_line_normal.png', + '/assets/icons/drawable-xxhdpi/item_image_btn_unbrella_delete.png', + '/assets/icons/drawable-xxhdpi/item_image_btn_unbrella_download_image.png', + '/assets/icons/drawable-xxhdpi/item_image_btn_unbrella_edit_detail.png', + '/assets/icons/drawable-xxhdpi/item_image_btn_unbrella_edit_image_disable.png', + '/assets/icons/drawable-xxhdpi/item_image_btn_unbrella_edit_image.png', + '/assets/icons/drawable-xxhdpi/item_image_btn_unbrella_preview_image.png', + '/assets/icons/drawable-xxhdpi/language_switch_icon.png', + '/assets/icons/drawable-xxhdpi/large_progress_indeterminate.png', + '/assets/icons/drawable-xxhdpi/launcher.png', + '/assets/icons/drawable-xxhdpi/lcok_pattern_background_alp.png', + '/assets/icons/drawable-xxhdpi/lcok_pattern_background.png', + '/assets/icons/drawable-xxhdpi/letter_bar_unfold_btn_pressed.png', + '/assets/icons/drawable-xxhdpi/letter_bar_unfold_btn.png', + '/assets/icons/drawable-xxhdpi/letters_bar_background_shadow.9.png', + '/assets/icons/drawable-xxhdpi/letters_bar_background.9.png', + '/assets/icons/drawable-xxhdpi/letters_bar_dot.png', + '/assets/icons/drawable-xxhdpi/letters_bar_highlight_icon.png', + '/assets/icons/drawable-xxhdpi/list_arrow_highlight.png', + '/assets/icons/drawable-xxhdpi/list_arrow.png', + '/assets/icons/drawable-xxhdpi/list_board_section_title_divider.9.png', + '/assets/icons/drawable-xxhdpi/list_content_item_bottom_shadow.9.png', + '/assets/icons/drawable-xxhdpi/list_content_item_middle_shadow.9.png', + '/assets/icons/drawable-xxhdpi/list_content_item_single_shadow.9.png', + '/assets/icons/drawable-xxhdpi/list_content_item_top_shadow.9.png', + '/assets/icons/drawable-xxhdpi/list_item_bg_down.9.png', + '/assets/icons/drawable-xxhdpi/list_item_bg.9.png', + '/assets/icons/drawable-xxhdpi/list_item_bottom_highlight.9.png', + '/assets/icons/drawable-xxhdpi/list_item_bottom_normal.9.png', + '/assets/icons/drawable-xxhdpi/list_item_image_icon.png', + '/assets/icons/drawable-xxhdpi/list_item_middle_highlight.9.png', + '/assets/icons/drawable-xxhdpi/list_item_middle_normal.9.png', + '/assets/icons/drawable-xxhdpi/list_item_pressed.9.png', + '/assets/icons/drawable-xxhdpi/list_item_top_highlight.9.png', + '/assets/icons/drawable-xxhdpi/list_item_top_normal.9.png', + '/assets/icons/drawable-xxhdpi/list_item.9.png', + '/assets/icons/drawable-xxhdpi/list_section_title.9.png', + '/assets/icons/drawable-xxhdpi/lite_tick_mark_track_bridge.png', + '/assets/icons/drawable-xxhdpi/lite_tick_mark_track_end.png', + '/assets/icons/drawable-xxhdpi/lite_tick_mark_track_mid.png', + '/assets/icons/drawable-xxhdpi/lite_tick_mark_track_start.png', + '/assets/icons/drawable-xxhdpi/loading_ic.png', + '/assets/icons/drawable-xxhdpi/long_btn_gray_disabled.9.png', + '/assets/icons/drawable-xxhdpi/long_btn_gray_normal.9.png', + '/assets/icons/drawable-xxhdpi/long_btn_gray_pressed.9.png', + '/assets/icons/drawable-xxhdpi/long_btn_highlight_disabled.9.png', + '/assets/icons/drawable-xxhdpi/long_btn_highlight_normal.9.png', + '/assets/icons/drawable-xxhdpi/long_btn_highlight_pressed.9.png', + '/assets/icons/drawable-xxhdpi/long_btn_red_disabled.9.png', + '/assets/icons/drawable-xxhdpi/long_btn_red_normal.9.png', + '/assets/icons/drawable-xxhdpi/long_btn_red_pressed.9.png', + '/assets/icons/drawable-xxhdpi/long_btn_red_shrinked_disabled.9.png', + '/assets/icons/drawable-xxhdpi/long_btn_red_shrinked_normal.9.png', + '/assets/icons/drawable-xxhdpi/long_btn_red_shrinked_pressed.9.png', + '/assets/icons/drawable-xxhdpi/long_btn_shadow_normal.9.png', + '/assets/icons/drawable-xxhdpi/long_btn_white_disabled.9.png', + '/assets/icons/drawable-xxhdpi/long_btn_white_normal.9.png', + '/assets/icons/drawable-xxhdpi/long_btn_white_pressed.9.png', + '/assets/icons/drawable-xxhdpi/longlength_weibo_image_bg.9.png', + '/assets/icons/drawable-xxhdpi/md_bg_normal_center.9.png', + '/assets/icons/drawable-xxhdpi/md_bg_normal_left.9.png', + '/assets/icons/drawable-xxhdpi/md_bg_normal_right.9.png', + '/assets/icons/drawable-xxhdpi/md_bg_pressed.9.png', + '/assets/icons/drawable-xxhdpi/menu_dialog_button_gray_normal.9.png', + '/assets/icons/drawable-xxhdpi/menu_dialog_button_gray_pressed.9.png', + '/assets/icons/drawable-xxhdpi/menu_dialog_button_red_normal.9.png', + '/assets/icons/drawable-xxhdpi/menu_dialog_button_red_pressed.9.png', + '/assets/icons/drawable-xxhdpi/menu_dialog_multi_item_bg_down.png', + '/assets/icons/drawable-xxhdpi/menu_dialog_multi_item_bg_normal.png', + '/assets/icons/drawable-xxhdpi/menu_dialog_multi_list_bg.9.png', + '/assets/icons/drawable-xxhdpi/menu_item_close_icon_pressed.png', + '/assets/icons/drawable-xxhdpi/menu_item_close_icon.png', + '/assets/icons/drawable-xxhdpi/mixed_view_dark_footer_bg.9.png', + '/assets/icons/drawable-xxhdpi/mixed_view_dark_header_bg.9.png', + '/assets/icons/drawable-xxhdpi/mixed_view_dark_item_bg.9.png', + '/assets/icons/drawable-xxhdpi/mixed_view_darkest_footer_bg.9.png', + '/assets/icons/drawable-xxhdpi/mixed_view_darkest_header_bg.9.png', + '/assets/icons/drawable-xxhdpi/mixed_view_darkest_item_bg.9.png', + '/assets/icons/drawable-xxhdpi/mixed_view_footer_bg.9.png', + '/assets/icons/drawable-xxhdpi/mixed_view_header_bg.9.png', + '/assets/icons/drawable-xxhdpi/mixed_view_item_bg_transparent.9.png', + '/assets/icons/drawable-xxhdpi/mixed_view_item_bg.9.png', + '/assets/icons/drawable-xxhdpi/mixed_view_light_footer_bg.9.png', + '/assets/icons/drawable-xxhdpi/mixed_view_light_header_bg.9.png', + '/assets/icons/drawable-xxhdpi/mixed_view_light_item_bg.9.png', + '/assets/icons/drawable-xxhdpi/more_item_middle_disable.9.png', + '/assets/icons/drawable-xxhdpi/more_item_middle_highlight.9.png', + '/assets/icons/drawable-xxhdpi/more_item_middle_normal.9.png', + '/assets/icons/drawable-xxhdpi/move_handle_disabled.png', + '/assets/icons/drawable-xxhdpi/move_handle_pressed.png', + '/assets/icons/drawable-xxhdpi/move_handle.png', + '/assets/icons/drawable-xxhdpi/mover.png', + '/assets/icons/drawable-xxhdpi/network_error.webp', + '/assets/icons/drawable-xxhdpi/new_dialog_title_bg.png', + '/assets/icons/drawable-xxhdpi/next_page_arrow_pressed.png', + '/assets/icons/drawable-xxhdpi/next_page_arrow.png', + '/assets/icons/drawable-xxhdpi/no_wifi_icon.png', + '/assets/icons/drawable-xxhdpi/note_background.png', + '/assets/icons/drawable-xxhdpi/note_detail_keyboard_splash.9.png', + '/assets/icons/drawable-xxhdpi/note_empty.png', + '/assets/icons/drawable-xxhdpi/note_item_clip_normal.png', + '/assets/icons/drawable-xxhdpi/note_item_clip_up.png', + '/assets/icons/drawable-xxhdpi/note_item_star_fav.png', + '/assets/icons/drawable-xxhdpi/note_item_star_invalid.png', + '/assets/icons/drawable-xxhdpi/note_more_bg.png', + '/assets/icons/drawable-xxhdpi/note_quote_editing_sign.9.png', + '/assets/icons/drawable-xxhdpi/note_quote_preview_sign.9.png', + '/assets/icons/drawable-xxhdpi/note_round_corner.9.png', + '/assets/icons/drawable-xxhdpi/note_setting_bg.png', + '/assets/icons/drawable-xxhdpi/note_weibo_keyboard_splash.9.png', + '/assets/icons/drawable-xxhdpi/notes_base_search_bar_left_icon_disabled.png', + '/assets/icons/drawable-xxhdpi/notes_base_search_bar_left_icon.png', + '/assets/icons/drawable-xxhdpi/notes_base_search_field_disabled.9.png', + '/assets/icons/drawable-xxhdpi/notes_base_search_field.9.png', + '/assets/icons/drawable-xxhdpi/notes_detail_scrollbar.9.png', + '/assets/icons/drawable-xxhdpi/notes_launcher.png', + '/assets/icons/drawable-xxhdpi/notes.png', + '/assets/icons/drawable-xxhdpi/order_copy_icon.png', + '/assets/icons/drawable-xxhdpi/password_input_text_bg.9.png', + '/assets/icons/drawable-xxhdpi/photo_mask.png', + '/assets/icons/drawable-xxhdpi/photo_selected_large.png', + '/assets/icons/drawable-xxhdpi/photo_unselected_large_bg.png', + '/assets/icons/drawable-xxhdpi/photo_unselected_large.png', + '/assets/icons/drawable-xxhdpi/plaza_search_bar_clear.png', + '/assets/icons/drawable-xxhdpi/pop_option_btn_normal.9.png', + '/assets/icons/drawable-xxhdpi/pop_option_btn_pressed.9.png', + '/assets/icons/drawable-xxhdpi/pop_up_menu_arrow_bottom.png', + '/assets/icons/drawable-xxhdpi/pop_up_menu_arrow_left.png', + '/assets/icons/drawable-xxhdpi/pop_up_menu_arrow_right.png', + '/assets/icons/drawable-xxhdpi/pop_up_menu_arrow_top.png', + '/assets/icons/drawable-xxhdpi/pop_up_menu_bg.9.png', + '/assets/icons/drawable-xxhdpi/popup_menu_bg_shadow.9.png', + '/assets/icons/drawable-xxhdpi/popup_window_bg.9.png', + '/assets/icons/drawable-xxhdpi/popup_window_mask_top.9.png', + '/assets/icons/drawable-xxhdpi/popup_window_mode_bg_pressed.9.png', + '/assets/icons/drawable-xxhdpi/popup_window_mode_bg.9.png', + '/assets/icons/drawable-xxhdpi/pre_page_arrow_pressed.png', + '/assets/icons/drawable-xxhdpi/pre_page_arrow.png', + '/assets/icons/drawable-xxhdpi/preview_bg.9.png', + '/assets/icons/drawable-xxhdpi/preview_btn_down.png', + '/assets/icons/drawable-xxhdpi/preview_btn.png', + '/assets/icons/drawable-xxhdpi/preview_close_icon.png', + '/assets/icons/drawable-xxhdpi/preview_placeholder_icon.png', + '/assets/icons/drawable-xxhdpi/preview_rtf_icon_gtasks_light.png', + '/assets/icons/drawable-xxhdpi/preview_rtf_icon_gtasks.png', + '/assets/icons/drawable-xxhdpi/product_titlebar_black.9.png', + '/assets/icons/drawable-xxhdpi/product_titlebar_white.9.png', + '/assets/icons/drawable-xxhdpi/progress_control_disabled.png', + '/assets/icons/drawable-xxhdpi/progress_control.png', + '/assets/icons/drawable-xxhdpi/progress_disabled_smartisanos.9.png', + '/assets/icons/drawable-xxhdpi/progress_error_smartisanos.9.png', + '/assets/icons/drawable-xxhdpi/progress_smartisanos.9.png', + '/assets/icons/drawable-xxhdpi/progress_static_material.png', + '/assets/icons/drawable-xxhdpi/progress_static.png', + '/assets/icons/drawable-xxhdpi/progress_track_disabled_smartisanos.9.png', + '/assets/icons/drawable-xxhdpi/progress_track_smartisanos.9.png', + '/assets/icons/drawable-xxhdpi/progress_unfocused_smartisanos.9.png', + '/assets/icons/drawable-xxhdpi/progress_unfocused_smartisanos.9.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_01.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_02.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_03.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_04.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_05.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_06.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_07.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_08.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_09.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_10.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_11.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_12.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_13.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_14.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_15.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_16.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_17.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_18.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_19.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_20.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_21.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_22.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_23.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_24.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_25.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_26.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_27.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_28.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_29.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_30.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_31.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_32.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_33.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_34.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_35.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_36.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_37.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_38.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_39.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_40.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_41.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_42.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_43.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_44.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_45.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_46.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_47.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_48.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_49.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_50.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_51.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_52.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_53.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_54.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_55.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_56.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_57.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_58.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_59.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_60.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_61.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_62.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_63.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_64.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_65.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_66.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_67.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_68.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_69.png', + '/assets/icons/drawable-xxhdpi/pull_refresh_anim_70.png', + '/assets/icons/drawable-xxhdpi/pyq_invail.png', + '/assets/icons/drawable-xxhdpi/pyq.png', + '/assets/icons/drawable-xxhdpi/quick_icon_delete_normal.png', + '/assets/icons/drawable-xxhdpi/quick_icon_delete_pressed.png', + '/assets/icons/drawable-xxhdpi/quickbar_bg_down.9.png', + '/assets/icons/drawable-xxhdpi/quickbar_bg.9.png', + '/assets/icons/drawable-xxhdpi/quickbar_dot.png', + '/assets/icons/drawable-xxhdpi/quickbar_highlight.png', + '/assets/icons/drawable-xxhdpi/qzone_invail.png', + '/assets/icons/drawable-xxhdpi/qzone.png', + '/assets/icons/drawable-xxhdpi/rag_ai_loading.gif', + '/assets/icons/drawable-xxhdpi/rag_back.png', + '/assets/icons/drawable-xxhdpi/rag_cancel.png', + '/assets/icons/drawable-xxhdpi/rag_chat_bg.png', + '/assets/icons/drawable-xxhdpi/rag_chat_question_error.png', + '/assets/icons/drawable-xxhdpi/rag_create_knb_icon.png', + '/assets/icons/drawable-xxhdpi/rag_delete.png', + '/assets/icons/drawable-xxhdpi/rag_edit_knowledge_info.png', + '/assets/icons/drawable-xxhdpi/rag_ic_doc_refresh_err.png', + '/assets/icons/drawable-xxhdpi/rag_ic_doc_refresh_vip.png', + '/assets/icons/drawable-xxhdpi/rag_ic_snote_sync.png', + '/assets/icons/drawable-xxhdpi/rag_icon_doc_mime_type_docx.png', + '/assets/icons/drawable-xxhdpi/rag_icon_doc_mime_type_folder.png', + '/assets/icons/drawable-xxhdpi/rag_icon_doc_mime_type_note.png', + '/assets/icons/drawable-xxhdpi/rag_icon_doc_mime_type_pdf.png', + '/assets/icons/drawable-xxhdpi/rag_icon_doc_mime_type_txt.png', + '/assets/icons/drawable-xxhdpi/rag_icon_doc_mime_type_unknown.png', + '/assets/icons/drawable-xxhdpi/rag_icon_doc_mime_type_word.png', + '/assets/icons/drawable-xxhdpi/rag_kb_cover.png', + '/assets/icons/drawable-xxhdpi/rag_knowledge_list_detail.png', + '/assets/icons/drawable-xxhdpi/rag_plaza_list_subscribe.png', + '/assets/icons/drawable-xxhdpi/rag_plaza_list_un_subscribe.png', + '/assets/icons/drawable-xxhdpi/rag_plaza_search_bg.png', + '/assets/icons/drawable-xxhdpi/rag_plaza_search_icon.png', + '/assets/icons/drawable-xxhdpi/rag_plaza_talk_icon.png', + '/assets/icons/drawable-xxhdpi/rag_progress.png', + '/assets/icons/drawable-xxhdpi/rag_publish_bg.png', + '/assets/icons/drawable-xxhdpi/rag_quote.png', + '/assets/icons/drawable-xxhdpi/rag_read_more_collapse.png', + '/assets/icons/drawable-xxhdpi/rag_read_more_expand.png', + '/assets/icons/drawable-xxhdpi/rag_refresh.png', + '/assets/icons/drawable-xxhdpi/rag_refs.png', + '/assets/icons/drawable-xxhdpi/rag_selected.png', + '/assets/icons/drawable-xxhdpi/rag_shortcut_close.png', + '/assets/icons/drawable-xxhdpi/rag_tag_selected.png', + '/assets/icons/drawable-xxhdpi/rag_unable_edit_knowledge_info.png', + '/assets/icons/drawable-xxhdpi/rag_unselected.png', + '/assets/icons/drawable-xxhdpi/reader.png', + '/assets/icons/drawable-xxhdpi/recent_call_button_gray_normal.9.png', + '/assets/icons/drawable-xxhdpi/recent_call_button_gray_pressed.9.png', + '/assets/icons/drawable-xxhdpi/recent_call_multi_item_bg_normal.9.png', + '/assets/icons/drawable-xxhdpi/recent_call_multi_item_bg_pressed.9.png', + '/assets/icons/drawable-xxhdpi/recommend_card_close.png', + '/assets/icons/drawable-xxhdpi/recommend_card_placeholder.png', + '/assets/icons/drawable-xxhdpi/recyclebin_delete_10.png', + '/assets/icons/drawable-xxhdpi/recyclebin_delete_20.png', + '/assets/icons/drawable-xxhdpi/recyclebin_delete_30.png', + '/assets/icons/drawable-xxhdpi/red_check_box_disabled.png', + '/assets/icons/drawable-xxhdpi/red_check_box_off_disabled.png', + '/assets/icons/drawable-xxhdpi/red_check_box_off.png', + '/assets/icons/drawable-xxhdpi/red_check_box_pressed.png', + '/assets/icons/drawable-xxhdpi/red_check_box.png', + '/assets/icons/drawable-xxhdpi/relogin_code_fail.png', + '/assets/icons/drawable-xxhdpi/relogin_code_refresh_down.png', + '/assets/icons/drawable-xxhdpi/relogin_code_refresh.png', + '/assets/icons/drawable-xxhdpi/remind_calendar_month_view_day_focused.9.png', + '/assets/icons/drawable-xxhdpi/remind_calendar_month_view_day_unfocused.9.png', + '/assets/icons/drawable-xxhdpi/remind_calendar_month_view_today_focused.9.png', + '/assets/icons/drawable-xxhdpi/remind_month_content_frame.9.png', + '/assets/icons/drawable-xxhdpi/remind_month_grid_body_for_drop.9.png', + '/assets/icons/drawable-xxhdpi/remind_next_arrow_down.png', + '/assets/icons/drawable-xxhdpi/remind_next_arrow.png', + '/assets/icons/drawable-xxhdpi/remind_previous_arrow_down.png', + '/assets/icons/drawable-xxhdpi/remind_previous_arrow.png', + '/assets/icons/drawable-xxhdpi/remind_time_picker_widget_5_bg.9.png', + '/assets/icons/drawable-xxhdpi/remind_time_picker_widget_bg.9.png', + '/assets/icons/drawable-xxhdpi/revone_arrow_down.png', + '/assets/icons/drawable-xxhdpi/revone_arrow_up.png', + '/assets/icons/drawable-xxhdpi/revone_dialog_bg_main.9.png', + '/assets/icons/drawable-xxhdpi/revone_dialog_bg_title.9.png', + '/assets/icons/drawable-xxhdpi/revone_smartisan_list_popup_menu_pressed.9.png', + '/assets/icons/drawable-xxhdpi/revone_smartisan_list_popup_menu_separator.png', + '/assets/icons/drawable-xxhdpi/ring_android_toast_press.png', + '/assets/icons/drawable-xxhdpi/ring_android_toast.png', + '/assets/icons/drawable-xxhdpi/rtf_bold_active.9.png', + '/assets/icons/drawable-xxhdpi/rtf_bold_disabled.9.png', + '/assets/icons/drawable-xxhdpi/rtf_bold_normal.9.png', + '/assets/icons/drawable-xxhdpi/rtf_center_active.9.png', + '/assets/icons/drawable-xxhdpi/rtf_center_disabled.9.png', + '/assets/icons/drawable-xxhdpi/rtf_center_normal.9.png', + '/assets/icons/drawable-xxhdpi/rtf_gtasks_active.9.png', + '/assets/icons/drawable-xxhdpi/rtf_gtasks_disabled.9.png', + '/assets/icons/drawable-xxhdpi/rtf_gtasks_normal.9.png', + '/assets/icons/drawable-xxhdpi/rtf_header_active.9.png', + '/assets/icons/drawable-xxhdpi/rtf_header_disabled.9.png', + '/assets/icons/drawable-xxhdpi/rtf_header_normal.9.png', + '/assets/icons/drawable-xxhdpi/rtf_icon_gtasks_light.png', + '/assets/icons/drawable-xxhdpi/rtf_icon_gtasks.png', + '/assets/icons/drawable-xxhdpi/rtf_list_active.9.png', + '/assets/icons/drawable-xxhdpi/rtf_list_disabled.9.png', + '/assets/icons/drawable-xxhdpi/rtf_list_normal.9.png', + '/assets/icons/drawable-xxhdpi/rtf_quot_active.9.png', + '/assets/icons/drawable-xxhdpi/rtf_quot_disabled.9.png', + '/assets/icons/drawable-xxhdpi/rtf_quot_normal.9.png', + '/assets/icons/drawable-xxhdpi/sb_tabbar_bg_down.png', + '/assets/icons/drawable-xxhdpi/sb_tabbar_bg.png', + '/assets/icons/drawable-xxhdpi/search_bar_cancel_btn_disabled.9.png', + '/assets/icons/drawable-xxhdpi/search_bar_cancel_btn_normal.9.png', + '/assets/icons/drawable-xxhdpi/search_bar_cancel_btn_pressed.9.png', + '/assets/icons/drawable-xxhdpi/search_bar_clear_btn.png', + '/assets/icons/drawable-xxhdpi/search_bar_left_icon_disabled.png', + '/assets/icons/drawable-xxhdpi/search_bar_left_icon.png', + '/assets/icons/drawable-xxhdpi/search_bar_secondary_filter_btn.png', + '/assets/icons/drawable-xxhdpi/search_bar_secondary_filter_divider.png', + '/assets/icons/drawable-xxhdpi/search_cancel_button_normal.9.png', + '/assets/icons/drawable-xxhdpi/search_cancel_button_pressed.9.png', + '/assets/icons/drawable-xxhdpi/search_clear_down.png', + '/assets/icons/drawable-xxhdpi/search_clear_normal.png', + '/assets/icons/drawable-xxhdpi/search_down.9.png', + '/assets/icons/drawable-xxhdpi/search_field_disabled.9.png', + '/assets/icons/drawable-xxhdpi/search_field.9.png', + '/assets/icons/drawable-xxhdpi/search_normal.9.png', + '/assets/icons/drawable-xxhdpi/secondary_bar_disabled.9.png', + '/assets/icons/drawable-xxhdpi/secondary_bar_shadow.9.png', + '/assets/icons/drawable-xxhdpi/secondary_bar.9.png', + '/assets/icons/drawable-xxhdpi/secondary_progress_smartisanos.9.png', + '/assets/icons/drawable-xxhdpi/securitycenter_blue_status_bar_bg.png', + '/assets/icons/drawable-xxhdpi/select_image_folder_arrow.png', + '/assets/icons/drawable-xxhdpi/select_image_tab_bg.9.png', + '/assets/icons/drawable-xxhdpi/select_image_title_bar_bg.9.png', + '/assets/icons/drawable-xxhdpi/selected_highlight.png', + '/assets/icons/drawable-xxhdpi/selected_normal.png', + '/assets/icons/drawable-xxhdpi/setting_back_arrow_normal_down.9.png', + '/assets/icons/drawable-xxhdpi/setting_back_arrow_normal.9.png', + '/assets/icons/drawable-xxhdpi/setting_back_normal_down.9.png', + '/assets/icons/drawable-xxhdpi/setting_back_normal.9.png', + '/assets/icons/drawable-xxhdpi/setting_item_arrow_highlight.png', + '/assets/icons/drawable-xxhdpi/setting_item_arrow.png', + '/assets/icons/drawable-xxhdpi/setting_item_down_disable.9.png', + '/assets/icons/drawable-xxhdpi/setting_item_down_highlight.9.png', + '/assets/icons/drawable-xxhdpi/setting_item_down_normal.9.png', + '/assets/icons/drawable-xxhdpi/setting_item_up_disable.9.png', + '/assets/icons/drawable-xxhdpi/setting_item_up_highlight.9.png', + '/assets/icons/drawable-xxhdpi/setting_item_up_normal.9.png', + '/assets/icons/drawable-xxhdpi/setting_markdown_titlebar_shadow.png', + '/assets/icons/drawable-xxhdpi/setting_next_arrow_down.png', + '/assets/icons/drawable-xxhdpi/setting_next_arrow.png', + '/assets/icons/drawable-xxhdpi/setting_single_disable.9.png', + '/assets/icons/drawable-xxhdpi/setting_single_highlight.9.png', + '/assets/icons/drawable-xxhdpi/setting_single_normal.9.png', + '/assets/icons/drawable-xxhdpi/setting_titlebar_back_arrow_normal_down.9.png', + '/assets/icons/drawable-xxhdpi/setting_titlebar_back_arrow_normal.9.png', + '/assets/icons/drawable-xxhdpi/setting_titlebar_back_normal_down.9.png', + '/assets/icons/drawable-xxhdpi/setting_titlebar_back_normal.9.png', + '/assets/icons/drawable-xxhdpi/setting_titlebar_bg.png', + '/assets/icons/drawable-xxhdpi/setting_titlebar_shadow.png', + '/assets/icons/drawable-xxhdpi/setting_titlebar.png', + '/assets/icons/drawable-xxhdpi/share_bg.png', + '/assets/icons/drawable-xxhdpi/share_cancel_down.9.png', + '/assets/icons/drawable-xxhdpi/share_cancel.9.png', + '/assets/icons/drawable-xxhdpi/share_logo.jpg', + '/assets/icons/drawable-xxhdpi/share_title_bar.png', + '/assets/icons/drawable-xxhdpi/share_twitter_icon.png', + '/assets/icons/drawable-xxhdpi/share_weibo_9pic_bg.png', + '/assets/icons/drawable-xxhdpi/share_weibo_camera_icon_p.png', + '/assets/icons/drawable-xxhdpi/share_weibo_camera_icon.png', + '/assets/icons/drawable-xxhdpi/share_weibo_insert_bar.9.png', + '/assets/icons/drawable-xxhdpi/share_weibo_insert_bubble.9.png', + '/assets/icons/drawable-xxhdpi/share_weibo_insert_shadow.9.png', + '/assets/icons/drawable-xxhdpi/sidebar_folder_icon_all.png', + '/assets/icons/drawable-xxhdpi/sidebar_folder_icon_document.png', + '/assets/icons/drawable-xxhdpi/sidebar_folder_icon_favorite.png', + '/assets/icons/drawable-xxhdpi/sidebar_folder_icon_trash.png', + '/assets/icons/drawable-xxhdpi/sidebar_text_bg.9.png', + '/assets/icons/drawable-xxhdpi/sinaweibo_avatar.png', + '/assets/icons/drawable-xxhdpi/sinaweibo_list_item_bg.9.png', + '/assets/icons/drawable-xxhdpi/sinaweibo_preview.9.png', + '/assets/icons/drawable-xxhdpi/sinaweibo_remove.png', + '/assets/icons/drawable-xxhdpi/sinaweibo_settingicon.png', + '/assets/icons/drawable-xxhdpi/sm_keypad_shadow.png', + '/assets/icons/drawable-xxhdpi/smartisan_progress_dialog_bg.9.png', + '/assets/icons/drawable-xxhdpi/smartisan_secondary_bar_shadow.9.png', + '/assets/icons/drawable-xxhdpi/smartisan_tab_bar_icon_pressed.png', + '/assets/icons/drawable-xxhdpi/smartisan_tab_bar_icon.png', + '/assets/icons/drawable-xxhdpi/smartisan_tab_bar_lite_pressed.9.png', + '/assets/icons/drawable-xxhdpi/smartisan_tab_bar_lite.9.png', + '/assets/icons/drawable-xxhdpi/smartisan_tab_bar_pressed.9.png', + '/assets/icons/drawable-xxhdpi/smartisan_tab_bar.9.png', + '/assets/icons/drawable-xxhdpi/snack_button_normal.9.png', + '/assets/icons/drawable-xxhdpi/snack_button_pressed.9.png', + '/assets/icons/drawable-xxhdpi/sorting_icon_pressed.png', + '/assets/icons/drawable-xxhdpi/sorting_icon.png', + '/assets/icons/drawable-xxhdpi/spinner_48_outer_smartisanos_dark.png', + '/assets/icons/drawable-xxhdpi/spinner_icon_pressed.png', + '/assets/icons/drawable-xxhdpi/spinner_icon.png', + '/assets/icons/drawable-xxhdpi/spinner_lite_icon_pressed.png', + '/assets/icons/drawable-xxhdpi/spinner_lite_icon.png', + '/assets/icons/drawable-xxhdpi/splash_logo.png', + '/assets/icons/drawable-xxhdpi/standard_btn_disabled.9.png', + '/assets/icons/drawable-xxhdpi/standard_btn_normal.9.png', + '/assets/icons/drawable-xxhdpi/standard_btn_pressed.9.png', + '/assets/icons/drawable-xxhdpi/stat_done.png', + '/assets/icons/drawable-xxhdpi/stat_failed.png', + '/assets/icons/drawable-xxhdpi/stat_save.png', + '/assets/icons/drawable-xxhdpi/stat_send.png', + '/assets/icons/drawable-xxhdpi/status_bar_bg.png', + '/assets/icons/drawable-xxhdpi/sub_item_back_ground_bottom_disabled.9.png', + '/assets/icons/drawable-xxhdpi/sub_item_back_ground_bottom_highlight.9.png', + '/assets/icons/drawable-xxhdpi/sub_item_back_ground_bottom.9.png', + '/assets/icons/drawable-xxhdpi/sub_item_back_ground_middle_disabled.9.png', + '/assets/icons/drawable-xxhdpi/sub_item_back_ground_middle_highlight.9.png', + '/assets/icons/drawable-xxhdpi/sub_item_back_ground_middle.9.png', + '/assets/icons/drawable-xxhdpi/sub_item_back_ground_single_disabled.9.png', + '/assets/icons/drawable-xxhdpi/sub_item_back_ground_single_highlight.9.png', + '/assets/icons/drawable-xxhdpi/sub_item_back_ground_single.9.png', + '/assets/icons/drawable-xxhdpi/sub_item_back_ground_top_disabled.9.png', + '/assets/icons/drawable-xxhdpi/sub_item_back_ground_top_highlight.9.png', + '/assets/icons/drawable-xxhdpi/sub_item_back_ground_top.9.png', + '/assets/icons/drawable-xxhdpi/surname_mask_bottom.png', + '/assets/icons/drawable-xxhdpi/surname_mask_top.png', + '/assets/icons/drawable-xxhdpi/surname_popup_arrow_bottom.png', + '/assets/icons/drawable-xxhdpi/surname_popup_arrow_up.png', + '/assets/icons/drawable-xxhdpi/surname_popup_background.9.png', + '/assets/icons/drawable-xxhdpi/surname_popup_bottom_arrow.png', + '/assets/icons/drawable-xxhdpi/surname_popup_item_left_normal.9.png', + '/assets/icons/drawable-xxhdpi/surname_popup_item_middle_normal.9.png', + '/assets/icons/drawable-xxhdpi/surname_popup_item_press.9.png', + '/assets/icons/drawable-xxhdpi/surname_popup_item_right_normal.9.png', + '/assets/icons/drawable-xxhdpi/surname_second_popup_bg.9.png', + '/assets/icons/drawable-xxhdpi/surname_second_popup_ex_bg.9.png', + '/assets/icons/drawable-xxhdpi/switch_bar_title_bar_bg.png', + '/assets/icons/drawable-xxhdpi/switch_bar_title_bar_lower_shadow.png', + '/assets/icons/drawable-xxhdpi/switch_bar_title_bar_upper_shadow.png', + '/assets/icons/drawable-xxhdpi/switch_ex_bottom.png', + '/assets/icons/drawable-xxhdpi/switch_ex_frame.png', + '/assets/icons/drawable-xxhdpi/switch_ex_frame_pressed.png', + '/assets/icons/drawable-xxhdpi/switch_ex_mask.png', + '/assets/icons/drawable-xxhdpi/switch_ex_pressed.png', + '/assets/icons/drawable-xxhdpi/switch_ex_unpressed.png', + '/assets/icons/drawable-xxhdpi/tab_bar_shadow.9.png', + '/assets/icons/drawable-xxhdpi/text_clear_btn_disabled.png', + '/assets/icons/drawable-xxhdpi/text_clear_btn_pressed.png', + '/assets/icons/drawable-xxhdpi/text_clear_btn.png', + '/assets/icons/drawable-xxhdpi/thin_lite_tick_mark_track_bridge.png', + '/assets/icons/drawable-xxhdpi/thin_lite_tick_mark_track_end.png', + '/assets/icons/drawable-xxhdpi/thin_lite_tick_mark_track_mid.png', + '/assets/icons/drawable-xxhdpi/thin_lite_tick_mark_track_start.png', + '/assets/icons/drawable-xxhdpi/thin_progress_control_disabled.png', + '/assets/icons/drawable-xxhdpi/thin_progress_control.png', + '/assets/icons/drawable-xxhdpi/thin_progress_disabled_smartisanos.9.png', + '/assets/icons/drawable-xxhdpi/thin_progress_error_smartisanos.9.png', + '/assets/icons/drawable-xxhdpi/thin_progress_smartisanos.9.png', + '/assets/icons/drawable-xxhdpi/thin_progress_track_disabled_smartisanos.9.png', + '/assets/icons/drawable-xxhdpi/thin_progress_track_smartisanos.9.png', + '/assets/icons/drawable-xxhdpi/thin_progress_unfocused_smartisanos.9.png', + '/assets/icons/drawable-xxhdpi/thin_secondary_progress_smartisanos.9.png', + '/assets/icons/drawable-xxhdpi/thin_tick_mark_track_bridge.png', + '/assets/icons/drawable-xxhdpi/thin_tick_mark_track_end.png', + '/assets/icons/drawable-xxhdpi/thin_tick_mark_track_mid.png', + '/assets/icons/drawable-xxhdpi/thin_tick_mark_track_start.png', + '/assets/icons/drawable-xxhdpi/thin_timer_progress_bridge.9.png', + '/assets/icons/drawable-xxhdpi/thin_timer_progress_end.9.png', + '/assets/icons/drawable-xxhdpi/thin_timer_progress_start.9.png', + '/assets/icons/drawable-xxhdpi/thin_timer_track_end.9.png', + '/assets/icons/drawable-xxhdpi/tick_mark_progress_control.png', + '/assets/icons/drawable-xxhdpi/tick_mark_track_bridge.png', + '/assets/icons/drawable-xxhdpi/tick_mark_track_end.png', + '/assets/icons/drawable-xxhdpi/tick_mark_track_mid.png', + '/assets/icons/drawable-xxhdpi/tick_mark_track_start.png', + '/assets/icons/drawable-xxhdpi/time_picker_shadow.png', + '/assets/icons/drawable-xxhdpi/time_picker_widget_bg_ex_new.9.png', + '/assets/icons/drawable-xxhdpi/time_picker_widget_bg.9.png', + '/assets/icons/drawable-xxhdpi/time_picker_widget_bottom.png', + '/assets/icons/drawable-xxhdpi/time_picker_widget_lens.9.png', + '/assets/icons/drawable-xxhdpi/timer_progress_bridge.9.png', + '/assets/icons/drawable-xxhdpi/timer_progress_control.png', + '/assets/icons/drawable-xxhdpi/timer_progress_end.png', + '/assets/icons/drawable-xxhdpi/timer_progress_start.png', + '/assets/icons/drawable-xxhdpi/timer_track_end.png', + '/assets/icons/drawable-xxhdpi/timer_track.9.png', + '/assets/icons/drawable-xxhdpi/tip_ai.png', + '/assets/icons/drawable-xxhdpi/tip_toast_bg_dark.9.png', + '/assets/icons/drawable-xxhdpi/tip_toast_bg_light.9.png', + '/assets/icons/drawable-xxhdpi/title_back_button_down.9.png', + '/assets/icons/drawable-xxhdpi/title_back_button_normal.9.png', + '/assets/icons/drawable-xxhdpi/title_bar_account.png', + '/assets/icons/drawable-xxhdpi/title_bar_background_round_corner.png', + '/assets/icons/drawable-xxhdpi/title_bar_background.png', + '/assets/icons/drawable-xxhdpi/title_bar_bg_blue_securitycenter_corner.png', + '/assets/icons/drawable-xxhdpi/title_bar_bg_blue_securitycenter.png', + '/assets/icons/drawable-xxhdpi/title_bar_bg_shadow_blue_securitycenter.9.png', + '/assets/icons/drawable-xxhdpi/title_bar_bg.9.png', + '/assets/icons/drawable-xxhdpi/title_bar_button_boom.png', + '/assets/icons/drawable-xxhdpi/title_bar_button_wide_normal.9.png', + '/assets/icons/drawable-xxhdpi/title_bar_button_wide_press.9.png', + '/assets/icons/drawable-xxhdpi/title_bar_del_btn_mov_0001.png', + '/assets/icons/drawable-xxhdpi/title_bar_del_btn_mov_0006.png', + '/assets/icons/drawable-xxhdpi/title_bar_del_btn_mov_0009.png', + '/assets/icons/drawable-xxhdpi/title_bar_del_btn_mov_0010.png', + '/assets/icons/drawable-xxhdpi/title_bar_del_btn_mov_0013.png', + '/assets/icons/drawable-xxhdpi/title_bar_del_btn_mov_0016.png', + '/assets/icons/drawable-xxhdpi/title_bar_del_btn_mov_0019.png', + '/assets/icons/drawable-xxhdpi/title_bar_del_btn_mov_0021.png', + '/assets/icons/drawable-xxhdpi/title_bar_del_btn_mov_0023.png', + '/assets/icons/drawable-xxhdpi/title_bar_del_btn_mov_0025.png', + '/assets/icons/drawable-xxhdpi/title_bar_del_btn_mov_0026.png', + '/assets/icons/drawable-xxhdpi/title_bar_del_btn_mov_0027.png', + '/assets/icons/drawable-xxhdpi/title_bar_del_btn_mov_0028.png', + '/assets/icons/drawable-xxhdpi/title_bar_del_btn_mov_0029.png', + '/assets/icons/drawable-xxhdpi/title_bar_del_btn_mov_0030.png', + '/assets/icons/drawable-xxhdpi/title_bar_delete_complete_icon.png', + '/assets/icons/drawable-xxhdpi/title_bar_shadow_short.9.png', + '/assets/icons/drawable-xxhdpi/title_bar_shadow.9.png', + '/assets/icons/drawable-xxhdpi/title_bar_trash_icon.png', + '/assets/icons/drawable-xxhdpi/title_btn_back_blue_securitycenter_down.9.png', + '/assets/icons/drawable-xxhdpi/title_btn_back_blue_securitycenter.9.png', + '/assets/icons/drawable-xxhdpi/title_btn_ok_blue_frame_backgournd_actived.9.png', + '/assets/icons/drawable-xxhdpi/title_btn_ok_blue_frame_backgournd.9.png', + '/assets/icons/drawable-xxhdpi/title_dot.png', + '/assets/icons/drawable-xxhdpi/title_light_shadow.png', + '/assets/icons/drawable-xxhdpi/titlebar_back_normal_black.9.png', + '/assets/icons/drawable-xxhdpi/titlebar_back_normal_down_black.9.png', + '/assets/icons/drawable-xxhdpi/titlebar_back_normal_down_white.9.png', + '/assets/icons/drawable-xxhdpi/titlebar_back_normal_white.9.png', + '/assets/icons/drawable-xxhdpi/titlebar_light.9.png', + '/assets/icons/drawable-xxhdpi/titlebar_shadow_black.png', + '/assets/icons/drawable-xxhdpi/titlebar_shadow_white.png', + '/assets/icons/drawable-xxhdpi/toast_action_dismiss.png', + '/assets/icons/drawable-xxhdpi/toast_frame_smartisanos.9.png', + '/assets/icons/drawable-xxhdpi/topbar_bottom_line.9.png', + '/assets/icons/drawable-xxhdpi/ttdownloader_icon_back_arrow.png', + '/assets/icons/drawable-xxhdpi/ttdownloader_icon_download.png', + '/assets/icons/drawable-xxhdpi/ttdownloader_icon_yes.png', + '/assets/icons/drawable-xxhdpi/vip_expiry_close.png', + '/assets/icons/drawable-xxhdpi/webpage_copylink.png', + '/assets/icons/drawable-xxhdpi/webpage_weichat_friends.png', + '/assets/icons/drawable-xxhdpi/win_background.png', + '/assets/icons/drawable-xxhdpi/wx_invail.png', + '/assets/icons/drawable-xxhdpi/wx.png', + '/assets/icons/drawable-xxhdpi/abc_btn_radio_to_on_mtrl_000.png', + '/assets/icons/drawable-xxhdpi/abc_btn_radio_to_on_mtrl_015.png', + '/assets/icons/drawable-xxhdpi/abc_btn_switch_to_on_mtrl_00001.9.png', + '/assets/icons/drawable-xxhdpi/abc_btn_switch_to_on_mtrl_00012.9.png', + '/assets/icons/drawable-xxhdpi/abc_scrubber_control_to_pressed_mtrl_000.png', + '/assets/icons/drawable-xxhdpi/abc_scrubber_control_to_pressed_mtrl_005.png', + '/assets/icons/drawable-xxhdpi/abc_spinner_mtrl_am_alpha.9.png', + '/assets/icons/drawable-xxhdpi/abc_switch_track_mtrl_alpha.9.png', + '/assets/icons/drawable-xxhdpi/abc_tab_indicator_mtrl_alpha.9.png', + '/assets/icons/drawable-xxhdpi/abc_text_select_handle_left_mtrl.png', + '/assets/icons/drawable-xxhdpi/abc_text_select_handle_right_mtrl.png', + '/assets/icons/drawable-xxhdpi/action_icon_ai_rag.png', + '/assets/icons/drawable-xxhdpi/add_doc.png', + '/assets/icons/drawable-xxhdpi/ai_cursor_drawable.png', + '/assets/icons/drawable-xxhdpi/ai_result_cancel_icon.png', + '/assets/icons/drawable-xxhdpi/ai_result_edit_icon.png', + '/assets/icons/drawable-xxhdpi/ai_result_tone_icon.png', + '/assets/icons/drawable-xxhdpi/ai_stop_ic.png', + '/assets/icons/drawable-xxhdpi/bg_buy_btn.png', + '/assets/icons/drawable-xxhdpi/bg_rag_submit.png', + '/assets/icons/drawable-xxhdpi/cb_buy_vip_checked.png', + '/assets/icons/drawable-xxhdpi/cb_buy_vip_uncheck.png', + '/assets/icons/drawable-xxhdpi/ic_call_answer_low.png', + '/assets/icons/drawable-xxhdpi/ic_call_answer_video_low.png', + '/assets/icons/drawable-xxhdpi/ic_call_answer_video.png', + '/assets/icons/drawable-xxhdpi/ic_call_answer.png', + '/assets/icons/drawable-xxhdpi/ic_call_decline_low.png', + '/assets/icons/drawable-xxhdpi/ic_call_decline.png', + '/assets/icons/drawable-xxhdpi/ic_err_common.png', + '/assets/icons/drawable-xxhdpi/ic_err_network.png', + '/assets/icons/drawable-xxhdpi/ic_list_load_more_refresh_white.png', + '/assets/icons/drawable-xxhdpi/ic_list_load_more_refresh.png', + '/assets/icons/drawable-xxhdpi/ic_more_disabled.png', + '/assets/icons/drawable-xxhdpi/ic_more_normal.png', + '/assets/icons/drawable-xxhdpi/ic_more_pressed.png', + '/assets/icons/drawable-xxhdpi/ic_stat_bd_notif_download.png', + '/assets/icons/drawable-xxhdpi/ic_sv_empty_white.png', + '/assets/icons/drawable-xxhdpi/ic_sv_empty.png', + '/assets/icons/drawable-xxhdpi/ic_sv_wifi_white.png', + '/assets/icons/drawable-xxhdpi/ic_sv_wifi.png', + '/assets/icons/drawable-xxhdpi/import_knb_add_icon.png', + '/assets/icons/drawable-xxhdpi/order_copy_icon.png', + '/assets/icons/drawable-xxhdpi/progress_static_material.png', + '/assets/icons/drawable-xxhdpi/progress_static.png', + '/assets/icons/drawable-xxhdpi/rag_cancel.png', + '/assets/icons/drawable-xxhdpi/rag_chat_bg.png', + '/assets/icons/drawable-xxhdpi/rag_delete.png', + '/assets/icons/drawable-xxhdpi/rag_ic_doc_refresh_err.png', + '/assets/icons/drawable-xxhdpi/rag_ic_doc_refresh_vip.png', + '/assets/icons/drawable-xxhdpi/rag_ic_snote_sync.png', + '/assets/icons/drawable-xxhdpi/rag_publish_bg.png', + '/assets/icons/drawable-xxhdpi/rag_refresh.png', + '/assets/icons/drawable-xxhdpi/rag_refs.png', + '/assets/icons/drawable-xxhdpi/ttdownloader_icon_back_arrow.png', + '/assets/icons/drawable-xxhdpi/ttdownloader_icon_download.png', + '/assets/icons/drawable-xxhdpi/ttdownloader_icon_yes.png', + + // drawable-xxxhdpi 目录中的图标 + '/assets/icons/drawable-xxxhdpi/abc_btn_check_to_on_mtrl_000.png', + '/assets/icons/drawable-xxxhdpi/abc_btn_check_to_on_mtrl_015.png', + '/assets/icons/drawable-xxxhdpi/abc_btn_radio_to_on_mtrl_000.png', + '/assets/icons/drawable-xxxhdpi/abc_btn_radio_to_on_mtrl_015.png', + '/assets/icons/drawable-xxxhdpi/abc_btn_switch_to_on_mtrl_00001.9.png', + '/assets/icons/drawable-xxxhdpi/abc_btn_switch_to_on_mtrl_00012.9.png', + '/assets/icons/drawable-xxxhdpi/abc_scrubber_control_to_pressed_mtrl_000.png', + '/assets/icons/drawable-xxxhdpi/abc_scrubber_control_to_pressed_mtrl_005.png', + '/assets/icons/drawable-xxxhdpi/abc_spinner_mtrl_am_alpha.9.png', + '/assets/icons/drawable-xxxhdpi/abc_switch_track_mtrl_alpha.9.png', + '/assets/icons/drawable-xxxhdpi/abc_tab_indicator_mtrl_alpha.9.png', + '/assets/icons/drawable-xxxhdpi/abc_text_select_handle_left_mtrl.png', + '/assets/icons/drawable-xxxhdpi/abc_text_select_handle_right_mtrl.png', + '/assets/icons/drawable-xxxhdpi/action_icon_ai_rag.png', + '/assets/icons/drawable-xxxhdpi/add_doc.png', + '/assets/icons/drawable-xxxhdpi/ai_cursor_drawable.png', + '/assets/icons/drawable-xxxhdpi/ai_result_cancel_icon.png', + '/assets/icons/drawable-xxxhdpi/ai_result_edit_icon.png', + '/assets/icons/drawable-xxxhdpi/ai_result_tone_icon.png', + '/assets/icons/drawable-xxxhdpi/ai_stop_ic.png', + '/assets/icons/drawable-xxxhdpi/bg_buy_btn.png', + '/assets/icons/drawable-xxxhdpi/bg_rag_submit.png', + '/assets/icons/drawable-xxxhdpi/cb_buy_vip_checked.png', + '/assets/icons/drawable-xxxhdpi/cb_buy_vip_uncheck.png', + '/assets/icons/drawable-xxxhdpi/ic_call_answer_low.png', + '/assets/icons/drawable-xxxhdpi/ic_call_answer_video_low.png', + '/assets/icons/drawable-xxxhdpi/ic_call_answer_video.png', + '/assets/icons/drawable-xxxhdpi/ic_call_answer.png', + '/assets/icons/drawable-xxxhdpi/ic_call_decline_low.png', + '/assets/icons/drawable-xxxhdpi/ic_call_decline.png', + '/assets/icons/drawable-xxxhdpi/ic_err_common.png', + '/assets/icons/drawable-xxxhdpi/ic_err_network.png', + '/assets/icons/drawable-xxxhdpi/ic_list_load_more_refresh_white.png', + '/assets/icons/drawable-xxxhdpi/ic_list_load_more_refresh.png', + '/assets/icons/drawable-xxxhdpi/ic_more_disabled.png', + '/assets/icons/drawable-xxxhdpi/ic_more_normal.png', + '/assets/icons/drawable-xxxhdpi/ic_more_pressed.png', + '/assets/icons/drawable-xxxhdpi/ic_stat_bd_notif_download.png', + '/assets/icons/drawable-xxxhdpi/ic_sv_empty_white.png', + '/assets/icons/drawable-xxxhdpi/ic_sv_empty.png', + '/assets/icons/drawable-xxxhdpi/ic_sv_wifi_white.png', + '/assets/icons/drawable-xxxhdpi/ic_sv_wifi.png', + '/assets/icons/drawable-xxxhdpi/import_knb_add_icon.png', + '/assets/icons/drawable-xxxhdpi/order_copy_icon.png', + '/assets/icons/drawable-xxxhdpi/progress_static_material.png', + '/assets/icons/drawable-xxxhdpi/progress_static.png', + '/assets/icons/drawable-xxxhdpi/rag_cancel.png', + '/assets/icons/drawable-xxxhdpi/rag_chat_bg.png', + '/assets/icons/drawable-xxxhdpi/rag_delete.png', + '/assets/icons/drawable-xxxhdpi/rag_ic_doc_refresh_err.png', + '/assets/icons/drawable-xxxhdpi/rag_ic_doc_refresh_vip.png', + '/assets/icons/drawable-xxxhdpi/rag_ic_snote_sync.png', + '/assets/icons/drawable-xxxhdpi/rag_publish_bg.png', + '/assets/icons/drawable-xxxhdpi/rag_refresh.png', + '/assets/icons/drawable-xxxhdpi/rag_refs.png', + '/assets/icons/drawable-xxxhdpi/ttdownloader_icon_back_arrow.png', + '/assets/icons/drawable-xxxhdpi/ttdownloader_icon_download.png', + '/assets/icons/drawable-xxxhdpi/ttdownloader_icon_yes.png' +];; + +// This is required for workbox-injectManifest to inject the manifest +self.__WB_MANIFEST; + +// IndexedDB数据库名称和版本 +const DB_NAME = 'SmartisanNoteDB'; +const DB_VERSION = 2; + +// 安装事件 - 缓存核心资源 +self.addEventListener('install', (event) => { + console.log('Service Worker installing...'); + event.waitUntil( + caches.open(CACHE_NAME) + .then((cache) => { + console.log('Caching core assets'); + return cache.addAll(urlsToCache); + }) + .then(() => self.skipWaiting()) + ); +}); + +// 激活事件 - 清理旧缓存 +self.addEventListener('activate', (event) => { + console.log('Service Worker activating...'); + event.waitUntil( + caches.keys().then((cacheNames) => { + return Promise.all( + cacheNames.map((cacheName) => { + if (cacheName !== CACHE_NAME && cacheName !== DATA_CACHE_NAME) { + console.log('Deleting old cache:', cacheName); + return caches.delete(cacheName); + } + }) + ); + }).then(() => self.clients.claim()) + ); +}); + +// 获取事件 - 实现缓存策略 +self.addEventListener('fetch', (event) => { + const { request } = event; + const url = new URL(request.url); + + // 对于API请求或数据请求,使用网络优先策略 + if (request.headers.get('Accept').includes('application/json') || + url.pathname.includes('/api/') || + isDataRequest(request)) { + event.respondWith(handleDataRequest(request)); + return; + } + + // 对于静态资源,使用缓存优先策略 + if (isStaticAsset(request)) { + event.respondWith(handleStaticAssetRequest(request)); + return; + } + + // 对于其他请求,使用网络优先策略 + event.respondWith(handleOtherRequest(request)); +}); + +// 判断是否为数据请求 +function isDataRequest(request) { + const url = new URL(request.url); + return ( + request.method === 'POST' && + (url.pathname.includes('notes') || url.pathname.includes('folders') || url.pathname.includes('settings')) + ); +} + +// 判断是否为静态资源 +function isStaticAsset(request) { + return ( + request.destination === 'script' || + request.destination === 'style' || + request.destination === 'image' || + request.destination === 'font' + ); +} + +// 处理静态资源请求 - 缓存优先 +async function handleStaticAssetRequest(request) { + try { + // 首先尝试从缓存中获取 + const cachedResponse = await caches.match(request); + if (cachedResponse) { + return cachedResponse; + } + + // 如果缓存中没有,从网络获取 + const networkResponse = await fetch(request); + + // 将响应克隆一份存入缓存 + if (networkResponse.ok) { + const cache = await caches.open(CACHE_NAME); + cache.put(request, networkResponse.clone()); + } + + return networkResponse; + } catch (error) { + console.error('Static asset request failed:', error); + // 如果网络请求失败,返回缓存中的内容 + return caches.match(request); + } +} + +// 处理数据请求 - 网络优先 +async function handleDataRequest(request) { + try { + // 首先尝试从网络获取 + const networkResponse = await fetch(request); + + // 如果网络请求成功,更新缓存 + if (networkResponse.ok) { + const cache = await caches.open(DATA_CACHE_NAME); + cache.put(request, networkResponse.clone()); + + // 如果是POST/PUT/DELETE请求,同时更新IndexedDB + if (['POST', 'PUT', 'DELETE'].includes(request.method)) { + await syncDataToIndexedDB(request); + } + } + + return networkResponse; + } catch (error) { + console.error('Data request failed, falling back to cache:', error); + // 如果网络请求失败,尝试从缓存中获取 + const cachedResponse = await caches.match(request); + if (cachedResponse) { + return cachedResponse; + } + + // 如果缓存中也没有,返回离线响应 + return new Response(JSON.stringify({ + error: 'Network error', + message: 'You are currently offline. Please check your connection and try again.' + }), { + status: 503, + headers: { 'Content-Type': 'application/json' } + }); + } +} + +// 处理其他请求 - 网络优先 +async function handleOtherRequest(request) { + try { + // 首先尝试从网络获取 + const networkResponse = await fetch(request); + + // 如果是GET请求且响应成功,缓存响应 + if (request.method === 'GET' && networkResponse.ok) { + const cache = await caches.open(CACHE_NAME); + cache.put(request, networkResponse.clone()); + } + + return networkResponse; + } catch (error) { + console.error('Request failed, falling back to cache:', error); + // 如果网络请求失败,尝试从缓存中获取 + const cachedResponse = await caches.match(request); + if (cachedResponse) { + return cachedResponse; + } + + // 对于HTML文档请求,返回离线页面 + if (request.headers.get('Accept').includes('text/html')) { + return caches.match('/index.html'); + } + + // 其他情况返回基本的离线响应 + return new Response('Network error - please check your connection', { + status: 503, + headers: { 'Content-Type': 'text/plain' } + }); + } +} + +// 同步数据到IndexedDB +async function syncDataToIndexedDB(request) { + // 这个函数将在后续实现数据同步机制时完善 + console.log('Syncing data to IndexedDB for request:', request.url); +} + +// 监听消息事件 - 处理来自主线程的消息 +self.addEventListener('message', (event) => { + if (event.data && event.data.type === 'CACHE_URL') { + const { url } = event.data; + caches.open(CACHE_NAME).then((cache) => { + cache.add(url).then(() => { + event.ports[0].postMessage({ success: true }); + }).catch((error) => { + event.ports[0].postMessage({ success: false, error: error.message }); + }); + }); + } + + if (event.data && event.data.type === 'GET_CACHE_STATUS') { + caches.keys().then((cacheNames) => { + event.ports[0].postMessage({ cacheNames }); + }); + } +}); + +// 后台同步事件 +self.addEventListener('sync', (event) => { + if (event.tag === 'sync-notes-data') { + event.waitUntil(syncNotesData()); + } +}); + +// 同步便签数据 +async function syncNotesData() { + // 这个函数将在后续实现数据同步机制时完善 + console.log('Syncing notes data in background'); +} \ No newline at end of file diff --git a/src/utils/indexedDBStorage.js b/src/utils/indexedDBStorage.js index 954c82d..48369be 100644 --- a/src/utils/indexedDBStorage.js +++ b/src/utils/indexedDBStorage.js @@ -1,14 +1,14 @@ import { getCurrentDateTime, getTimestamp } from './dateUtils' - +import { OfflineQueue } from './networkUtils' // 数据库配置 const DB_NAME = 'SmartisanNoteDB' const DB_VERSION = 2 // 更新版本号以确保数据库重新创建 const NOTES_STORE = 'notes' const FOLDERS_STORE = 'folders' const SETTINGS_STORE = 'settings' - let db = null - +// 创建离线队列实例 +const offlineQueue = new OfflineQueue() /** * 打开数据库连接 * @returns {Promise} 数据库实例 @@ -18,21 +18,16 @@ const openDB = () => { if (db) { return resolve(db) } - const request = indexedDB.open(DB_NAME, DB_VERSION) - request.onerror = () => { reject(new Error('无法打开数据库')) } - request.onsuccess = () => { db = request.result resolve(db) } - - request.onupgradeneeded = (event) => { + request.onupgradeneeded = event => { const database = event.target.result - // 删除现有的对象存储(如果版本已更改) if (event.oldVersion > 0) { if (database.objectStoreNames.contains(NOTES_STORE)) { @@ -45,7 +40,6 @@ const openDB = () => { database.deleteObjectStore(SETTINGS_STORE) } } - // 创建便签存储对象 const notesStore = database.createObjectStore(NOTES_STORE, { keyPath: 'id' }) notesStore.createIndex('folderId', 'folderId', { unique: false }) @@ -53,38 +47,32 @@ const openDB = () => { notesStore.createIndex('isDeleted', 'isDeleted', { unique: false }) notesStore.createIndex('createdAt', 'createdAt', { unique: false }) notesStore.createIndex('updatedAt', 'updatedAt', { unique: false }) - // 创建文件夹存储对象 database.createObjectStore(FOLDERS_STORE, { keyPath: 'id' }) - // 创建设置存储对象 database.createObjectStore(SETTINGS_STORE) } }) } - /** * 从存储中获取数据 * @param {string} storeName - 存储名称 * @returns {Promise} 数据数组 */ -const getAllFromStore = async (storeName) => { +const getAllFromStore = async storeName => { const database = await openDB() const transaction = database.transaction([storeName], 'readonly') const store = transaction.objectStore(storeName) const request = store.getAll() - return new Promise((resolve, reject) => { request.onsuccess = () => { resolve(request.result || []) } - request.onerror = () => { reject(new Error(`获取 ${storeName} 数据失败`)) } }) } - /** * 保存数据到存储 * @param {string} storeName - 存储名称 @@ -95,14 +83,12 @@ const saveToStore = async (storeName, data) => { const database = await openDB() const transaction = database.transaction([storeName], 'readwrite') const store = transaction.objectStore(storeName) - // 清除现有数据 await new Promise((resolve, reject) => { const clearRequest = store.clear() clearRequest.onsuccess = () => resolve() clearRequest.onerror = () => reject(new Error(`清除 ${storeName} 数据失败`)) }) - // 添加新数据 for (const item of data) { await new Promise((resolve, reject) => { @@ -112,7 +98,6 @@ const saveToStore = async (storeName, data) => { }) } } - /** * 从存储中获取单个项 * @param {string} storeName - 存储名称 @@ -124,18 +109,15 @@ const getFromStore = async (storeName, id) => { const transaction = database.transaction([storeName], 'readonly') const store = transaction.objectStore(storeName) const request = store.get(id) - return new Promise((resolve, reject) => { request.onsuccess = () => { resolve(request.result || null) } - request.onerror = () => { reject(new Error(`获取 ${storeName} 项失败`)) } }) } - /** * 向存储中添加项 * @param {string} storeName - 存储名称 @@ -147,18 +129,15 @@ const addToStore = async (storeName, item) => { const transaction = database.transaction([storeName], 'readwrite') const store = transaction.objectStore(storeName) const request = store.add(item) - return new Promise((resolve, reject) => { request.onsuccess = () => { resolve(item) } - request.onerror = () => { reject(new Error(`添加 ${storeName} 项失败`)) } }) } - /** * 更新存储中的项 * @param {string} storeName - 存储名称 @@ -169,24 +148,20 @@ const addToStore = async (storeName, item) => { const updateInStore = async (storeName, id, updates) => { const item = await getFromStore(storeName, id) if (!item) return null - const updatedItem = { ...item, ...updates } const database = await openDB() const transaction = database.transaction([storeName], 'readwrite') const store = transaction.objectStore(storeName) const request = store.put(updatedItem) - return new Promise((resolve, reject) => { request.onsuccess = () => { resolve(updatedItem) } - request.onerror = () => { reject(new Error(`更新 ${storeName} 项失败`)) } }) } - /** * 从存储中删除项 * @param {string} storeName - 存储名称 @@ -198,21 +173,17 @@ const deleteFromStore = async (storeName, id) => { const transaction = database.transaction([storeName], 'readwrite') const store = transaction.objectStore(storeName) const request = store.delete(id) - return new Promise((resolve, reject) => { request.onsuccess = () => { resolve(true) } - request.onerror = () => { reject(new Error(`删除 ${storeName} 项失败`)) } }) } - // 便签操作函数 // 提供便签的增删改查功能 - /** * 获取所有便签数据 * 从IndexedDB中读取便签数据 @@ -227,28 +198,26 @@ export const getNotes = async () => { return [] } } - /** * 保存便签数据 * 将便签数组保存到IndexedDB * @param {Array} notes - 便签数组 * @returns {Promise} */ -export const saveNotes = async (notes) => { +export const saveNotes = async notes => { try { await saveToStore(NOTES_STORE, notes) } catch (error) { console.error('Error saving notes:', error) } } - /** * 添加新便签 * 创建一个新的便签对象并添加到便签列表中 * @param {Object} note - 便签对象,包含便签内容和其他属性 * @returns {Promise} 新创建的便签对象 */ -export const addNote = async (note) => { +export const addNote = async note => { try { // 创建新的便签对象,添加必要的属性 const newNote = { @@ -263,18 +232,18 @@ export const addNote = async (note) => { isDeleted: note.isDeleted || false, // 是否已删除 deletedAt: note.deletedAt || null, // 删除时间 folderId: note.folderId || null, // 文件夹ID - ...note + ...note, } - // 添加到存储 await addToStore(NOTES_STORE, newNote) + // 添加到离线队列(用于同步) + offlineQueue.addOperation('add', NOTES_STORE, newNote) return newNote } catch (error) { console.error('Error adding note:', error) throw error } } - /** * 更新便签 * 根据ID查找并更新便签信息 @@ -287,36 +256,40 @@ export const updateNote = async (id, updates) => { // 更新便签并保存 const updatedNote = await updateInStore(NOTES_STORE, id, { ...updates, - updatedAt: getCurrentDateTime() // 更新最后修改时间 + updatedAt: getCurrentDateTime(), // 更新最后修改时间 }) - + if (updatedNote) { + // 添加到离线队列(用于同步) + offlineQueue.addOperation('update', NOTES_STORE, updatedNote) + } return updatedNote } catch (error) { console.error('Error updating note:', error) throw error } } - /** * 删除便签 * 根据ID从便签列表中移除便签 * @param {string} id - 要删除的便签ID * @returns {Promise} 删除成功返回true,未找到便签返回false */ -export const deleteNote = async (id) => { +export const deleteNote = async id => { try { // 从存储中删除 const result = await deleteFromStore(NOTES_STORE, id) + if (result) { + // 添加到离线队列(用于同步) + offlineQueue.addOperation('delete', NOTES_STORE, { id }) + } return result } catch (error) { console.error('Error deleting note:', error) return false } } - // 文件夹操作函数 // 提供文件夹的增删改查功能 - /** * 获取所有文件夹数据 * 从IndexedDB中读取文件夹数据 @@ -331,46 +304,44 @@ export const getFolders = async () => { return [] } } - /** * 保存文件夹数据 * 将文件夹数组保存到IndexedDB * @param {Array} folders - 文件夹数组 * @returns {Promise} */ -export const saveFolders = async (folders) => { +export const saveFolders = async folders => { try { await saveToStore(FOLDERS_STORE, folders) } catch (error) { console.error('Error saving folders:', error) } } - /** * 添加新文件夹 * 创建一个新的文件夹对象并添加到文件夹列表中 * @param {Object} folder - 文件夹对象,包含文件夹名称等属性 * @returns {Promise} 新创建的文件夹对象 */ -export const addFolder = async (folder) => { +export const addFolder = async folder => { try { // 创建新的文件夹对象,添加必要的属性 const newFolder = { name: folder.name || '', id: folder.id || getTimestamp().toString(), // 使用时间戳生成唯一ID createdAt: folder.createdAt || getCurrentDateTime(), // 创建时间 - ...folder + ...folder, } - // 添加到存储 await addToStore(FOLDERS_STORE, newFolder) + // 添加到离线队列(用于同步) + offlineQueue.addOperation('add', FOLDERS_STORE, newFolder) return newFolder } catch (error) { console.error('Error adding folder:', error) throw error } } - /** * 更新文件夹 * 根据ID查找并更新文件夹信息 @@ -382,33 +353,38 @@ export const updateFolder = async (id, updates) => { try { // 更新文件夹并保存 const updatedFolder = await updateInStore(FOLDERS_STORE, id, updates) + if (updatedFolder) { + // 添加到离线队列(用于同步) + offlineQueue.addOperation('update', FOLDERS_STORE, updatedFolder) + } return updatedFolder } catch (error) { console.error('Error updating folder:', error) throw error } } - /** * 删除文件夹 * 根据ID从文件夹列表中移除文件夹 * @param {string} id - 要删除的文件夹ID * @returns {Promise} 删除成功返回true,未找到文件夹返回false */ -export const deleteFolder = async (id) => { +export const deleteFolder = async id => { try { // 从存储中删除 const result = await deleteFromStore(FOLDERS_STORE, id) + if (result) { + // 添加到离线队列(用于同步) + offlineQueue.addOperation('delete', FOLDERS_STORE, { id }) + } return result } catch (error) { console.error('Error deleting folder:', error) return false } } - // 设置操作函数 // 提供应用设置的读取和保存功能 - /** * 获取应用设置 * 从IndexedDB中读取设置数据 @@ -420,17 +396,14 @@ export const getSettings = async () => { const transaction = database.transaction([SETTINGS_STORE], 'readonly') const store = transaction.objectStore(SETTINGS_STORE) const request = store.get('settings') - const settings = await new Promise((resolve, reject) => { request.onsuccess = () => { resolve(request.result || { cloudSync: false, darkMode: false }) } - request.onerror = () => { reject(new Error('获取设置失败')) } }) - return settings } catch (error) { console.error('Error getting settings:', error) @@ -438,35 +411,34 @@ export const getSettings = async () => { return { cloudSync: false, darkMode: false } } } - /** * 保存应用设置 * 将设置对象保存到IndexedDB * @param {Object} settings - 设置对象 * @returns {Promise} */ -export const saveSettings = async (settings) => { +export const saveSettings = async settings => { try { const database = await openDB() const transaction = database.transaction([SETTINGS_STORE], 'readwrite') const store = transaction.objectStore(SETTINGS_STORE) const request = store.put(settings, 'settings') - await new Promise((resolve, reject) => { request.onsuccess = () => resolve() request.onerror = () => reject(new Error('保存设置失败')) }) + // 添加到离线队列(用于同步) + offlineQueue.addOperation('update', SETTINGS_STORE, settings) } catch (error) { console.error('Error saving settings:', error) } } - /** * 确保数据有默认值 * @param {Array} notes - 便签数组 * @returns {Array} 处理后的便签数组 */ -const ensureNotesDefaults = (notes) => { +const ensureNotesDefaults = notes => { return notes.map(note => ({ title: note.title || '', content: note.content || '', @@ -479,24 +451,22 @@ const ensureNotesDefaults = (notes) => { isDeleted: note.isDeleted || false, deletedAt: note.deletedAt || null, folderId: note.folderId || null, - ...note + ...note, })) } - /** * 确保文件夹数据有默认值 * @param {Array} folders - 文件夹数组 * @returns {Array} 处理后的文件夹数组 */ -const ensureFoldersDefaults = (folders) => { +const ensureFoldersDefaults = folders => { return folders.map(folder => ({ name: folder.name || '', id: folder.id, createdAt: folder.createdAt, - ...folder + ...folder, })) } - /** * 初始化数据库 * @returns {Promise} @@ -507,4 +477,4 @@ export const initDB = async () => { } catch (error) { console.error('Error initializing database:', error) } -} \ No newline at end of file +} diff --git a/src/utils/networkUtils.js b/src/utils/networkUtils.js new file mode 100644 index 0000000..30428d6 --- /dev/null +++ b/src/utils/networkUtils.js @@ -0,0 +1,236 @@ +/** + * 网络状态检测和离线功能支持工具 + */ + +/** + * 检查网络连接状态 + * @returns {boolean} 网络是否连接 + */ +export const isOnline = () => { + return navigator.onLine; +}; + +/** + * 监听网络状态变化 + * @param {Function} onlineCallback - 网络连接时的回调 + * @param {Function} offlineCallback - 网络断开时的回调 + */ +export const addNetworkListener = (onlineCallback, offlineCallback) => { + window.addEventListener('online', onlineCallback); + window.addEventListener('offline', offlineCallback); +}; + +/** + * 移除网络状态监听 + * @param {Function} onlineCallback - 网络连接时的回调 + * @param {Function} offlineCallback - 网络断开时的回调 + */ +export const removeNetworkListener = (onlineCallback, offlineCallback) => { + window.removeEventListener('online', onlineCallback); + window.removeEventListener('offline', offlineCallback); +}; + +/** + * 检测网络类型和速度 + * @returns {Object} 网络信息对象 + */ +export const getNetworkInfo = () => { + const connection = navigator.connection || navigator.mozConnection || navigator.webkitConnection; + + if (connection) { + return { + effectiveType: connection.effectiveType, // 'slow-2g', '2g', '3g', '4g' + downlink: connection.downlink, // 下行速度 (Mbps) + rtt: connection.rtt, // 往返时间 (ms) + saveData: connection.saveData, // 是否开启了数据保护模式 + }; + } + + return { + effectiveType: 'unknown', + downlink: null, + rtt: null, + saveData: false, + }; +}; + +/** + * 检查是否为慢速网络 + * @returns {boolean} 是否为慢速网络 + */ +export const isSlowNetwork = () => { + const networkInfo = getNetworkInfo(); + return networkInfo.effectiveType === 'slow-2g' || networkInfo.effectiveType === '2g'; +}; + +/** + * 在线测试 - 发送一个请求来测试网络连接 + * @param {string} url - 测试URL,默认为当前域名 + * @returns {Promise} 网络是否可用 + */ +export const testOnline = async (url = null) => { + if (!isOnline()) { + return false; + } + + try { + const testUrl = url || `${window.location.protocol}//${window.location.host}/`; + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), 5000); // 5秒超时 + + const response = await fetch(testUrl, { + method: 'HEAD', + cache: 'no-cache', + signal: controller.signal, + }); + + clearTimeout(timeoutId); + return response.ok; + } catch (error) { + console.warn('Online test failed:', error.message); + return false; + } +}; + +/** + * 检查 IndexedDB 可用性 + * @returns {Promise} IndexedDB 是否可用 + */ +export const isIndexedDBAvailable = async () => { + if (!window.indexedDB) { + return false; + } + + try { + const name = 'test-db'; + const version = 1; + const request = window.indexedDB.open(name, version); + + return new Promise((resolve) => { + request.onsuccess = () => { + const db = request.result; + db.close(); + window.indexedDB.deleteDatabase(name); // 清理测试数据库 + resolve(true); + }; + + request.onerror = () => { + resolve(false); + }; + + // 超时处理 + setTimeout(() => { + resolve(false); + }, 5000); + }); + } catch (error) { + console.error('IndexedDB availability check failed:', error); + return false; + } +}; + +/** + * 检查存储配额 + * @returns {Promise} 存储配额信息 + */ +export const getStorageQuota = async () => { + if (navigator.storage && navigator.storage.estimate) { + try { + const quota = await navigator.storage.estimate(); + return { + quota: quota.quota, + usage: quota.usage, + usageDetails: quota.usageDetails, + percentage: quota.quota ? (quota.usage / quota.quota) * 100 : 0, + }; + } catch (error) { + console.error('Storage quota estimation failed:', error); + return null; + } + } + return null; +}; + +/** + * 检查存储空间是否充足 + * @param {number} requiredSpace - 需要的存储空间(字节) + * @returns {Promise} 是否有足够存储空间 + */ +export const hasSufficientStorage = async (requiredSpace = 10 * 1024 * 1024) => { // 默认10MB + const storageInfo = await getStorageQuota(); + if (!storageInfo) { + // 无法获取存储信息时假设空间充足 + return true; + } + + return (storageInfo.quota - storageInfo.usage) > requiredSpace; +}; + +/** + * 离线数据操作队列 + */ +export class OfflineQueue { + constructor() { + this.queue = JSON.parse(localStorage.getItem('offlineQueue') || '[]'); + } + + /** + * 添加操作到离线队列 + * @param {string} type - 操作类型 (add, update, delete) + * @param {string} storeName - 存储名 + * @param {Object} data - 数据 + */ + addOperation(type, storeName, data) { + const operation = { + id: Date.now() + Math.random(), + type, + storeName, + data, + timestamp: Date.now(), + }; + + this.queue.push(operation); + this.saveQueue(); + } + + /** + * 获取所有待处理的操作 + * @returns {Array} 操作队列 + */ + getOperations() { + return this.queue; + } + + /** + * 处理操作队列 + * @param {Function} processFn - 处理函数 + */ + async processQueue(processFn) { + for (const operation of [...this.queue]) { + try { + await processFn(operation); + // 从队列中移除已处理的操作 + this.queue = this.queue.filter(op => op.id !== operation.id); + this.saveQueue(); + } catch (error) { + console.error('Failed to process offline operation:', error); + // 如果处理失败,保留操作在队列中以备后续重试 + } + } + } + + /** + * 保存队列到本地存储 + */ + saveQueue() { + localStorage.setItem('offlineQueue', JSON.stringify(this.queue)); + } + + /** + * 清空队列 + */ + clear() { + this.queue = []; + this.saveQueue(); + } +} \ No newline at end of file diff --git a/vite.config.js b/vite.config.js index fe66c17..2e536ff 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,106 +1,80 @@ -import { defineConfig } from 'vite' -import vue from '@vitejs/plugin-vue' -import { VitePWA } from 'vite-plugin-pwa' - -// https://vitejs.dev/config/ -export default defineConfig(({ mode }) => { - const isPwaMode = mode === 'pwa' - - const plugins = [vue()] - - // 只在PWA模式下添加PWA插件 - if (isPwaMode) { - plugins.push( - VitePWA({ - registerType: 'autoUpdate', - devOptions: { - enabled: false, - }, - manifest: { - name: '锤子便签', - short_name: '便签', - description: '锤子便签(重制版)', - theme_color: '#42b883', - start_url: '/', - display: 'standalone', - background_color: '#ffffff', - icons: [ - { - src: 'icons/icon-192.png', - sizes: '192x192', - type: 'image/png', - }, - { - src: 'icons/icon-512.png', - sizes: '512x512', - type: 'image/png', - }, - ], - }, - workbox: { - globPatterns: ['**/*.{js,css,html,wasm,png,jpg,jpeg,svg,ico}'], - runtimeCaching: [ - { - urlPattern: /^https:\/\/fonts\.googleapis\.com\/.*/i, - handler: 'CacheFirst', - options: { - cacheName: 'google-fonts-cache', - expiration: { - maxEntries: 10, - maxAgeSeconds: 60 * 60 * 24 * 365, // <== 365 days - }, - cacheableResponse: { - statuses: [0, 200], - }, - }, - }, - { - urlPattern: /^https:\/\/fonts\.gstatic\.com\/.*/i, - handler: 'CacheFirst', - options: { - cacheName: 'gstatic-fonts-cache', - expiration: { - maxEntries: 10, - maxAgeSeconds: 60 * 60 * 24 * 365, // <== 365 days - }, - cacheableResponse: { - statuses: [0, 200], - }, - }, - }, - ], - }, - }) - ) - } - - return { - plugins, - resolve: { - alias: { - '@': '/src', - }, - }, - server: { - port: 3000, - }, - build: { - outDir: isPwaMode ? 'dist/offline' : 'dist/standard', - minify: 'terser', - terserOptions: { - compress: { - drop_console: true, - drop_debugger: true, - }, - }, - rollupOptions: { - output: { - // 为CSS和JS文件添加哈希后缀 - entryFileNames: 'assets/[name].[hash].js', - chunkFileNames: 'assets/[name].[hash].js', - assetFileNames: 'assets/[name].[hash].[ext]', - }, - }, - }, - } -}) +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import { VitePWA } from 'vite-plugin-pwa' + +// https://vitejs.dev/config/ +export default defineConfig(({ mode }) => { + const isPwaMode = mode === 'pwa' + + const plugins = [vue()] + + // 只在PWA模式下添加PWA插件 + if (isPwaMode) { + plugins.push( + VitePWA({ + strategies: 'injectManifest', + srcDir: 'src', + filename: 'sw.js', + registerType: 'autoUpdate', + devOptions: { + enabled: false, + type: 'module', + }, + manifest: { + name: '锤子便签', + short_name: '便签', + description: '锤子便签(重制版)', + theme_color: '#42b883', + start_url: '/', + display: 'standalone', + background_color: '#ffffff', + icons: [ + { + src: 'icons/icon-192.png', + sizes: '192x192', + type: 'image/png', + }, + { + src: 'icons/icon-512.png', + sizes: '512x512', + type: 'image/png', + }, + ], + }, + injectManifest: { + globPatterns: ['**/*.{js,css,html,wasm,png,jpg,jpeg,svg,ico}'], + }, + }) + ) + } + + return { + plugins, + resolve: { + alias: { + '@': '/src', + }, + }, + server: { + port: 3000, + }, + build: { + outDir: isPwaMode ? 'dist/offline' : 'dist/standard', + minify: 'terser', + terserOptions: { + compress: { + drop_console: true, + drop_debugger: true, + }, + }, + rollupOptions: { + output: { + // 为CSS和JS文件添加哈希后缀 + entryFileNames: 'assets/[name].[hash].js', + chunkFileNames: 'assets/[name].[hash].js', + assetFileNames: 'assets/[name].[hash].[ext]', + }, + }, + }, + } +}) -- 2.49.1 From 7088747dee1dda4af1cb8ab03334f3efff0ee0c3 Mon Sep 17 00:00:00 2001 From: yuantao Date: Mon, 3 Nov 2025 15:23:25 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BC=98=E5=8C=96=20=E7=BC=96=E8=AF=91?= =?UTF-8?q?=E7=AD=96=E7=95=A5=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vite.config.js | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/vite.config.js b/vite.config.js index 2e536ff..26b431a 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,20 +1,15 @@ import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import { VitePWA } from 'vite-plugin-pwa' - // https://vitejs.dev/config/ export default defineConfig(({ mode }) => { const isPwaMode = mode === 'pwa' - const plugins = [vue()] - // 只在PWA模式下添加PWA插件 if (isPwaMode) { plugins.push( VitePWA({ - strategies: 'injectManifest', - srcDir: 'src', - filename: 'sw.js', + strategies: 'generateSW', registerType: 'autoUpdate', devOptions: { enabled: false, @@ -41,13 +36,23 @@ export default defineConfig(({ mode }) => { }, ], }, - injectManifest: { - globPatterns: ['**/*.{js,css,html,wasm,png,jpg,jpeg,svg,ico}'], + workbox: { + globPatterns: ['**/*.{js,css,html,ico,png,jpg,jpeg,svg,woff,woff2,ttf,eot}'], + // 预缓存我们指定的静态资源 + additionalManifestEntries: [ + { url: '/', revision: null }, + { url: '/index.html', revision: null }, + { url: '/icons/icon-192.png', revision: null }, + { url: '/icons/icon-512.png', revision: null }, + // 添加更多需要预缓存的静态资源 + { url: '/assets/icons/drawable-xxhdpi/note_background.png', revision: null }, + { url: '/assets/icons/drawable-xxhdpi/note_setting_bg.png', revision: null }, + { url: '/assets/icons/drawable-xxhdpi/action_bar_default.png', revision: null }, + ], }, }) ) } - return { plugins, resolve: { -- 2.49.1