Compare commits
12 Commits
70e727fdb7
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3a65b3f43d | ||
|
|
c018243116 | ||
|
|
acf4d39892 | ||
|
|
ea2ec19dc8 | ||
|
|
d10524c597 | ||
|
|
63415e1fde | ||
|
|
affe08c8b4 | ||
|
|
bab447c23f | ||
|
|
066cea19df | ||
|
|
673b4491d7 | ||
|
|
a1fbc6417f | ||
|
|
c1a80dd4cf |
13
.claude/settings.local.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"permissions": {
|
||||||
|
"allow": [
|
||||||
|
"Bash(dir:*)",
|
||||||
|
"Bash(powershell:*)",
|
||||||
|
"Bash(find /d/Test/MyApplication/app/src/main/assets -name \"vocab.txt\" -exec wc -l {} ;)",
|
||||||
|
"WebSearch",
|
||||||
|
"Bash(grep:*)",
|
||||||
|
"Bash(find:*)",
|
||||||
|
"Bash(ls:*)"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
.gitignore
vendored
16
.idea/deploymentTargetSelector.xml
generated
@@ -4,6 +4,22 @@
|
|||||||
<selectionStates>
|
<selectionStates>
|
||||||
<SelectionState runConfigName="app">
|
<SelectionState runConfigName="app">
|
||||||
<option name="selectionMode" value="DROPDOWN" />
|
<option name="selectionMode" value="DROPDOWN" />
|
||||||
|
<DropdownSelection timestamp="2026-01-19T05:47:34.214081500Z">
|
||||||
|
<Target type="DEFAULT_BOOT">
|
||||||
|
<handle>
|
||||||
|
<DeviceId pluginId="PhysicalDevice" identifier="serial=3B15A70100N00000" />
|
||||||
|
</handle>
|
||||||
|
</Target>
|
||||||
|
</DropdownSelection>
|
||||||
|
<DialogSelection>
|
||||||
|
<targets>
|
||||||
|
<Target type="DEFAULT_BOOT">
|
||||||
|
<handle>
|
||||||
|
<DeviceId pluginId="PhysicalDevice" identifier="serial=7PRDU19930003674" />
|
||||||
|
</handle>
|
||||||
|
</Target>
|
||||||
|
</targets>
|
||||||
|
</DialogSelection>
|
||||||
</SelectionState>
|
</SelectionState>
|
||||||
</selectionStates>
|
</selectionStates>
|
||||||
</component>
|
</component>
|
||||||
|
|||||||
128
CLAUDE.md
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
# CLAUDE.md
|
||||||
|
|
||||||
|
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
||||||
|
|
||||||
|
## 项目概述
|
||||||
|
|
||||||
|
Android 输入法应用(IME),包含自定义键盘和社交圈(Circle)功能模块。Kotlin 开发,Jetpack Compose + XML 混合 UI。
|
||||||
|
|
||||||
|
- **包名**: `com.boshan.key.of.love`
|
||||||
|
- **命名空间**: `com.example.myapplication`
|
||||||
|
- **编译配置**: compileSdk 34, minSdk 21, targetSdk 34
|
||||||
|
|
||||||
|
## 构建命令
|
||||||
|
|
||||||
|
```bash
|
||||||
|
gradlew assembleDebug # 构建 Debug APK
|
||||||
|
gradlew assembleRelease # 构建 Release APK
|
||||||
|
gradlew installDebug # 安装到设备
|
||||||
|
gradlew clean # 清理
|
||||||
|
gradlew lint # Lint 检查
|
||||||
|
```
|
||||||
|
|
||||||
|
## 核心架构
|
||||||
|
|
||||||
|
### 应用入口流程
|
||||||
|
```
|
||||||
|
SplashActivity → GuideActivity/ImeGuideActivity → OnboardingActivity → MainActivity
|
||||||
|
```
|
||||||
|
|
||||||
|
### 键盘模块 (keyboard/)
|
||||||
|
|
||||||
|
**继承体系**:
|
||||||
|
```
|
||||||
|
BaseKeyboard (抽象基类,提供震动、主题应用、递归设置文字颜色)
|
||||||
|
├── MainKeyboard (主键盘,拼音/英文输入)
|
||||||
|
├── AiKeyboard (AI 辅助键盘)
|
||||||
|
├── EmojiKeyboard (表情/颜文字键盘)
|
||||||
|
├── NumberKeyboard (数字键盘)
|
||||||
|
└── SymbolKeyboard (符号键盘)
|
||||||
|
```
|
||||||
|
|
||||||
|
**核心服务 `MyInputMethodService.kt`**:
|
||||||
|
- 键盘懒加载 + 缓存机制(`ensureMainKeyboard()` 等)
|
||||||
|
- 智能联想流程:`commitKey()` → `updateCompletionsAndRender()` → 后台计算候选词 → `showCompletionSuggestions()`
|
||||||
|
- 特殊交互:Emoji 按 Unicode 代码点删除、长按连删 + 上滑清空、回填功能
|
||||||
|
|
||||||
|
### 语言模型 (data/)
|
||||||
|
|
||||||
|
**N-gram 模型架构**(`LanguageModel.kt` + `LanguageModelLoader.kt`):
|
||||||
|
- 词表:`assets/vocab.txt`(每行一词,行号=词ID,按频率降序)
|
||||||
|
- Unigram:`assets/uni_logp.bin`(u16 分数数组,0-1000,越高越常用)
|
||||||
|
- Bigram:`assets/bi_rowptr.bin`([u32 offset, u16 length]) + `bi_data.bin`([u32 next_id, u16 score])
|
||||||
|
- Trigram:`assets/tri_ctx.bin`([u32 ctx1, u32 ctx2]) + `tri_rowptr.bin` + `tri_data.bin`
|
||||||
|
|
||||||
|
**预测算法**:3-gram → 2-gram → 1-gram 回退机制,结合用户点击学习排序
|
||||||
|
|
||||||
|
**Trie 优化**(`Trie.kt`):
|
||||||
|
- 每个节点记录 `maxFreq`(子树最高词频)
|
||||||
|
- 优先级队列遍历快速获取 top-K
|
||||||
|
- 用户点击权重 1000,远超静态词频
|
||||||
|
|
||||||
|
### 网络层 (network/)
|
||||||
|
|
||||||
|
**双客户端架构**:
|
||||||
|
- `RetrofitClient.kt`:常规 HTTP(30s 超时)
|
||||||
|
- `NetworkClient.kt`:SSE 流式响应(无超时,用于 AI 聊天)
|
||||||
|
|
||||||
|
**请求签名机制**(`HttpInterceptors.kt`):
|
||||||
|
1. 生成 timestamp + nonce(UUID 前 16 位)
|
||||||
|
2. 合并参数(appId + timestamp + nonce + query + body 扁平化)
|
||||||
|
3. 按 key 字典序拼接,HMAC-SHA256 签名
|
||||||
|
4. 添加 Header:X-App-Id, X-Timestamp, X-Nonce, X-Sign
|
||||||
|
|
||||||
|
**SSE 解析**(`NetworkClient.kt`):支持 JSON 和纯文本 chunk,自动识别 `[done]` 结束标记
|
||||||
|
|
||||||
|
**Token 过期处理**:响应拦截器检测 code=40102/40103 → 清除本地 token → `AuthEventBus.emit(TokenExpired)`
|
||||||
|
|
||||||
|
### 社交圈 Repository (ui/circle/)
|
||||||
|
|
||||||
|
**缓存策略**(`CircleChatRepository.kt`):
|
||||||
|
- 自适应 LRU 缓存大小(根据设备内存 32-120 页)
|
||||||
|
- 预加载当前页前后 N 页
|
||||||
|
- 防重加载机制(`inFlight`、`pageInFlight` HashSet)
|
||||||
|
|
||||||
|
### 主题系统 (theme/)
|
||||||
|
|
||||||
|
- `ThemeManager.kt`:观察者模式通知主题变更
|
||||||
|
- 各键盘实现 `applyKeyBackgroundsForTheme()` 应用主题
|
||||||
|
- `ThemeDownloadWorker.kt`:WorkManager 后台下载
|
||||||
|
|
||||||
|
### UI 模块 (ui/)
|
||||||
|
|
||||||
|
| 模块 | 说明 |
|
||||||
|
|------|------|
|
||||||
|
| `circle/` | 社交圈:AI 角色聊天、评论系统 |
|
||||||
|
| `shop/` | 主题商店 |
|
||||||
|
| `mine/` | 个人中心 |
|
||||||
|
| `login/` | 登录注册 |
|
||||||
|
| `recharge/` | 充值 |
|
||||||
|
| `home/` | 首页 |
|
||||||
|
|
||||||
|
导航图:`res/navigation/circle_graph.xml`
|
||||||
|
|
||||||
|
## 关键配置
|
||||||
|
|
||||||
|
**build.gradle.kts**:
|
||||||
|
```kotlin
|
||||||
|
androidResources {
|
||||||
|
noCompress += listOf("bin") // 禁止压缩 .bin,允许 FileChannel 内存映射
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**输入法配置**:`res/xml/method.xml`
|
||||||
|
**网络安全**:`res/xml/network_security_config.xml`
|
||||||
|
|
||||||
|
## 辅助脚本
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python scripts/clean_vocab.py <输入文件> <输出文件> # 词表清洗(过滤无效词)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 开发注意事项
|
||||||
|
|
||||||
|
- 输入法服务需用户在系统设置中手动启用
|
||||||
|
- 语言模型使用 `FileChannel.map()` 内存映射加载,修改 .bin 文件需重新生成
|
||||||
|
- 网络请求签名使用 Body 扁平化(支持嵌套 JSON 和数组)
|
||||||
|
- `NetworkClient.init(context)` 必须在使用 SSE 前调用(通常在 Application.onCreate)
|
||||||
|
- 项目当前无单元测试配置
|
||||||
@@ -8,6 +8,11 @@ android {
|
|||||||
namespace = "com.example.myapplication"
|
namespace = "com.example.myapplication"
|
||||||
compileSdk = 34
|
compileSdk = 34
|
||||||
|
|
||||||
|
// 禁止压缩 .bin 文件,允许内存映射加载
|
||||||
|
androidResources {
|
||||||
|
noCompress += listOf("bin")
|
||||||
|
}
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId = "com.boshan.key.of.love"
|
applicationId = "com.boshan.key.of.love"
|
||||||
minSdk = 21
|
minSdk = 21
|
||||||
@@ -55,6 +60,7 @@ dependencies {
|
|||||||
implementation("com.google.android.material:material:1.12.0")
|
implementation("com.google.android.material:material:1.12.0")
|
||||||
implementation("de.hdodenhof:circleimageview:3.1.0")
|
implementation("de.hdodenhof:circleimageview:3.1.0")
|
||||||
implementation("com.google.android.flexbox:flexbox:3.0.0")
|
implementation("com.google.android.flexbox:flexbox:3.0.0")
|
||||||
|
implementation("com.github.Dimezis:BlurView:version-2.0.2")
|
||||||
|
|
||||||
// Jetpack Compose
|
// Jetpack Compose
|
||||||
implementation("androidx.activity:activity-compose:1.8.0")
|
implementation("androidx.activity:activity-compose:1.8.0")
|
||||||
@@ -77,6 +83,7 @@ dependencies {
|
|||||||
// lifecycle
|
// lifecycle
|
||||||
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.0")
|
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.0")
|
||||||
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.0")
|
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.0")
|
||||||
|
implementation("androidx.work:work-runtime-ktx:2.9.0")
|
||||||
// 加密 SharedPreferences
|
// 加密 SharedPreferences
|
||||||
implementation("androidx.security:security-crypto:1.1.0-alpha06")
|
implementation("androidx.security:security-crypto:1.1.0-alpha06")
|
||||||
// Glide for image loading
|
// Glide for image loading
|
||||||
|
|||||||
@@ -2,9 +2,10 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.VIBRATE" />
|
<uses-permission android:name="android.permission.VIBRATE" />
|
||||||
|
<uses-permission android:name="android.permission.CAMERA" />
|
||||||
|
<uses-permission android:name="android.permission.RECORD_AUDIO" />
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
@@ -20,6 +21,7 @@
|
|||||||
<activity
|
<activity
|
||||||
android:name=".SplashActivity"
|
android:name=".SplashActivity"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
|
android:screenOrientation="portrait"
|
||||||
android:theme="@style/Theme.MyApp.Splash">
|
android:theme="@style/Theme.MyApp.Splash">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
@@ -30,23 +32,28 @@
|
|||||||
<!-- 输入法激活页(强烈建议增加) -->
|
<!-- 输入法激活页(强烈建议增加) -->
|
||||||
<activity
|
<activity
|
||||||
android:name=".ImeGuideActivity"
|
android:name=".ImeGuideActivity"
|
||||||
|
android:screenOrientation="portrait"
|
||||||
android:exported="true"/>
|
android:exported="true"/>
|
||||||
|
|
||||||
<!-- 输入法体验页 -->
|
<!-- 输入法体验页 -->
|
||||||
<activity
|
<activity
|
||||||
android:name=".GuideActivity"
|
android:name=".GuideActivity"
|
||||||
|
android:screenOrientation="portrait"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
android:windowSoftInputMode="stateHidden|adjustNothing" />
|
android:windowSoftInputMode="stateHidden|adjustNothing" />
|
||||||
|
|
||||||
<!-- 引导页 -->
|
<!-- 引导页 -->
|
||||||
<activity
|
<activity
|
||||||
android:name=".OnboardingActivity"
|
android:name=".OnboardingActivity"
|
||||||
|
android:screenOrientation="portrait"
|
||||||
android:exported="false"/>
|
android:exported="false"/>
|
||||||
|
|
||||||
<!-- 主界面 -->
|
<!-- 主界面 -->
|
||||||
<activity
|
<activity
|
||||||
android:name=".MainActivity"
|
android:name=".MainActivity"
|
||||||
android:exported="true">
|
android:screenOrientation="portrait"
|
||||||
|
android:exported="true"
|
||||||
|
android:windowSoftInputMode="stateHidden|adjustResize">
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<!-- 输入法服务 -->
|
<!-- 输入法服务 -->
|
||||||
@@ -54,8 +61,7 @@
|
|||||||
android:name=".MyInputMethodService"
|
android:name=".MyInputMethodService"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:exported="false"
|
android:exported="false"
|
||||||
android:permission="android.permission.BIND_INPUT_METHOD"
|
android:permission="android.permission.BIND_INPUT_METHOD">
|
||||||
android:foregroundServiceType="connectedDevice">
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.view.InputMethod" />
|
<action android:name="android.view.InputMethod" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
@@ -63,5 +69,16 @@
|
|||||||
android:name="android.view.im"
|
android:name="android.view.im"
|
||||||
android:resource="@xml/method" />
|
android:resource="@xml/method" />
|
||||||
</service>
|
</service>
|
||||||
|
|
||||||
|
<!-- FileProvider for camera image capture -->
|
||||||
|
<provider
|
||||||
|
android:name="androidx.core.content.FileProvider"
|
||||||
|
android:authorities="${applicationId}.fileprovider"
|
||||||
|
android:exported="false"
|
||||||
|
android:grantUriPermissions="true">
|
||||||
|
<meta-data
|
||||||
|
android:name="android.support.FILE_PROVIDER_PATHS"
|
||||||
|
android:resource="@xml/file_paths" />
|
||||||
|
</provider>
|
||||||
</application>
|
</application>
|
||||||
</manifest>
|
</manifest>
|
||||||
|
|||||||
BIN
app/src/main/assets/bi_data.bin
Normal file
|
Before Width: | Height: | Size: 945 B After Width: | Height: | Size: 791 B |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 8.4 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 8.4 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 9.7 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 8.4 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 8.9 KiB After Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 8.1 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 8.1 KiB After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 8.5 KiB After Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 8.4 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 9.0 KiB After Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 8.0 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 8.0 KiB After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 8.8 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 9.1 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 8.4 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 6.7 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 7.7 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 9.5 KiB After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 9.6 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 8.0 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 8.4 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 8.4 KiB After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 8.5 KiB After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 9.3 KiB After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 8.8 KiB After Width: | Height: | Size: 2.2 KiB |
BIN
app/src/main/assets/keyboard_themes/default/key_emoji.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 7.7 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 9.6 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 9.5 KiB After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 9.6 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 8.2 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 8.0 KiB After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 8.0 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 8.0 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 7.9 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 8.0 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 9.0 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 8.9 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 9.3 KiB After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 8.1 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 8.2 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 8.0 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 9.1 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 8.8 KiB After Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 8.1 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 9.8 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 7.9 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 8.2 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 8.5 KiB After Width: | Height: | Size: 2.7 KiB |
BIN
app/src/main/assets/keyboard_themes/default/key_revoke.png
Normal file
|
After Width: | Height: | Size: 6.8 KiB |
|
Before Width: | Height: | Size: 9.1 KiB After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 9.3 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 9.7 KiB After Width: | Height: | Size: 2.4 KiB |