Skip to content

Commit fa4dbbb

Browse files
committed
refactor(ui): improve code logic in ColorPickerDialog
1 parent 96ed341 commit fa4dbbb

File tree

2 files changed

+44
-57
lines changed

2 files changed

+44
-57
lines changed

app/src/main/java/com/osfans/trime/data/Config.java

+7-22
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,15 @@
3030
import android.graphics.drawable.GradientDrawable;
3131
import android.graphics.drawable.NinePatchDrawable;
3232
import android.util.TypedValue;
33-
3433
import androidx.annotation.NonNull;
3534
import androidx.annotation.Nullable;
36-
3735
import com.osfans.trime.core.Rime;
3836
import com.osfans.trime.ime.enums.PositionType;
3937
import com.osfans.trime.ime.enums.SymbolKeyboardType;
4038
import com.osfans.trime.ime.keyboard.Key;
4139
import com.osfans.trime.ime.keyboard.Sound;
4240
import com.osfans.trime.ime.symbol.TabManager;
4341
import com.osfans.trime.util.ConfigGetter;
44-
4542
import java.io.File;
4643
import java.io.FileInputStream;
4744
import java.io.FileOutputStream;
@@ -55,7 +52,7 @@
5552
import java.util.Map;
5653
import java.util.Objects;
5754
import java.util.regex.Pattern;
58-
55+
import java.util.stream.Collectors;
5956
import timber.log.Timber;
6057

6158
/** 解析 YAML 配置文件 */
@@ -734,24 +731,12 @@ public Integer getCurrentColor(String key) {
734731
return parseColor(o);
735732
}
736733

737-
public String[] getColorKeys() {
738-
if (presetColorSchemes == null) return null;
739-
final Object[] keys = new String[presetColorSchemes.size()];
740-
presetColorSchemes.keySet().toArray(keys);
741-
return (String[]) keys;
742-
}
743-
744-
@Nullable
745-
public String[] getColorNames(String[] keys) {
746-
if (keys == null) return null;
747-
final int n = keys.length;
748-
final String[] names = new String[n];
749-
for (int i = 0; i < n; i++) {
750-
final Map<?, ?> m = (Map<?, ?>) presetColorSchemes.get(keys[i]);
751-
assert m != null;
752-
names[i] = Objects.requireNonNull(m.get("name")).toString();
753-
}
754-
return names;
734+
@NonNull
735+
public List<String[]> getPresetColorSchemes() {
736+
if (presetColorSchemes == null) return new ArrayList<>();
737+
return presetColorSchemes.entrySet().stream()
738+
.map(e -> new String[] {e.getKey(), Objects.requireNonNull(e.getValue().get("name"))})
739+
.collect(Collectors.toList());
755740
}
756741

757742
private Map<String, String> mEnterLabels;
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,62 @@
11
package com.osfans.trime.ui.components
22

33
import android.content.Context
4-
import android.os.Build
5-
import android.view.WindowManager
64
import androidx.appcompat.app.AlertDialog
75
import com.osfans.trime.R
86
import com.osfans.trime.data.AppPrefs
97
import com.osfans.trime.data.Config
108
import com.osfans.trime.ime.core.Trime
119
import com.osfans.trime.util.popup
10+
import kotlinx.coroutines.CoroutineScope
11+
import kotlinx.coroutines.MainScope
12+
import kotlinx.coroutines.launch
1213
import timber.log.Timber
1314

1415
/** 顯示配色方案列表
1516
* Show Color Scheme List
1617
* **/
1718
class ColorPickerDialog(
18-
context: Context
19-
) {
20-
val config: Config = Config.get(context)
21-
private val prefs get() = AppPrefs.defaultInstance()
22-
private var colorKeys: Array<String>
23-
private var checkedColorKey: Int = 0
24-
val pickerDialog: AlertDialog
19+
private val context: Context
20+
) : CoroutineScope by MainScope() {
2521

26-
init {
27-
val colorScheme = prefs.looks.selectedColor
28-
colorKeys = config.colorKeys
29-
colorKeys.sort()
30-
val colorNames = config.getColorNames(colorKeys)
31-
checkedColorKey = colorKeys.binarySearch(colorScheme)
22+
private val prefs get() = AppPrefs.defaultInstance()
23+
private lateinit var allColorKeys: Array<String>
24+
private lateinit var allColorNames: Array<String>
25+
private var checkedItem: Int = -1
3226

33-
pickerDialog = AlertDialog.Builder(context, R.style.Theme_AppCompat_DayNight_Dialog_Alert).apply {
34-
setTitle(R.string.looks__selected_color_title)
35-
setCancelable(true)
36-
setNegativeButton(android.R.string.cancel, null)
37-
setPositiveButton(android.R.string.ok) { _, _ ->
38-
selectColor()
27+
private fun buildAndShowDialog() {
28+
AlertDialog.Builder(context, R.style.Theme_AppCompat_DayNight_Dialog_Alert)
29+
.setTitle(R.string.looks__selected_color_title)
30+
.setNegativeButton(android.R.string.cancel, null)
31+
.setSingleChoiceItems(
32+
allColorNames, checkedItem
33+
) { _, id -> checkedItem = id }
34+
.setPositiveButton(android.R.string.ok) { _, _ ->
35+
if (checkedItem in allColorKeys.indices) {
36+
launch {
37+
Timber.i("Applying color scheme ...")
38+
prefs.looks.selectedColor = allColorKeys[checkedItem]
39+
Timber.i("Initializing keyboard ...")
40+
Trime.getServiceOrNull()?.initKeyboard() // 立刻重初始化键盘生效
41+
Timber.i("Applying done")
42+
}
43+
}
3944
}
40-
setSingleChoiceItems(
41-
colorNames, checkedColorKey
42-
) { _, id -> checkedColorKey = id }
43-
}.create()
45+
.create().popup()
4446
}
4547

46-
private fun selectColor() {
47-
Timber.i("select")
48-
if (checkedColorKey !in colorKeys.indices) return
49-
val colorKey = colorKeys[checkedColorKey]
50-
prefs.looks.selectedColor = colorKey
51-
Timber.i("initKeyboard")
52-
Trime.getServiceOrNull()?.initKeyboard() // 立刻重初始化键盘生效
53-
Timber.i("done")
48+
private fun init() {
49+
val allColors = Config.get(context).presetColorSchemes.toTypedArray()
50+
allColorKeys = allColors.map { a -> a[0] }.toTypedArray()
51+
allColorNames = allColors.map { a -> a[1] }.toTypedArray()
52+
val activeColor = prefs.looks.selectedColor
53+
Timber.d("activeColor = $activeColor")
54+
checkedItem = allColorKeys.indexOf(activeColor)
5455
}
5556

5657
/** 调用该方法显示对话框 **/
57-
fun show() {
58-
pickerDialog.popup()
58+
fun show() = launch {
59+
init()
60+
buildAndShowDialog()
5961
}
6062
}

0 commit comments

Comments
 (0)