Skip to content

Commit f78dc69

Browse files
author
Dmytro
committed
feat: implement grid view for assistant selector by dpi scaling and overridable column settings
1 parent 0e2915a commit f78dc69

File tree

16 files changed

+148
-16
lines changed

16 files changed

+148
-16
lines changed

app/src/main/java/com/wstxda/switchai/fragment/SettingsFragment.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ class SettingsFragment : PreferenceFragmentCompat() {
6868
findPreference<MultiSelectListPreference>(Constants.ASSISTANT_MANAGER_MANUAL_PREF_KEY)?.isVisible =
6969
!isDynamic
7070
}
71+
assistantSelectorViewModel.isGridViewEnabled.observe(this) { isGrid ->
72+
findPreference<ListPreference>(Constants.ASSISTANT_GRID_COLUMNS_PREF_KEY)?.isVisible = isGrid
73+
findPreference<ListPreference>(Constants.ASSISTANT_GRID_COLUMNS_LAND_PREF_KEY)?.isVisible = isGrid
74+
}
7175
}
7276

7377
override fun onResume() {

app/src/main/java/com/wstxda/switchai/ui/adapter/AssistantSelectorAdapter.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ class AssistantSelectorAdapter(
7676
}
7777

7878
is AssistantSelectorRecyclerView.ReorderTip -> (holder as ReorderTipViewHolder).bind(
79-
onDismissTipClicked
79+
onDismissTipClicked, isGridMode
8080
)
8181
}
8282
}

app/src/main/java/com/wstxda/switchai/ui/component/AssistantSelectorBottomSheet.kt

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,12 +82,34 @@ class AssistantSelectorBottomSheet : BaseBottomSheet<FragmentAssistantDialogBind
8282
}, isGridMode = isGridMode)
8383
binding.assistantsRecyclerView.apply {
8484
if (isGridMode) {
85-
val gridLayoutManager = GridLayoutManager(context, Constants.GRID_SPAN_COUNT)
85+
val isLandscape = resources.configuration.orientation ==
86+
android.content.res.Configuration.ORIENTATION_LANDSCAPE
87+
val userPref = if (isLandscape) {
88+
preferenceHelper.getString(
89+
Constants.ASSISTANT_GRID_COLUMNS_LAND_PREF_KEY, "0"
90+
)?.toIntOrNull() ?: 0
91+
} else {
92+
preferenceHelper.getString(
93+
Constants.ASSISTANT_GRID_COLUMNS_PREF_KEY, "0"
94+
)?.toIntOrNull() ?: 0
95+
}
96+
val autoSpan = run {
97+
val isLowDensity = resources.displayMetrics.densityDpi <=
98+
android.util.DisplayMetrics.DENSITY_MEDIUM
99+
when {
100+
isLandscape && isLowDensity -> 3
101+
isLandscape -> 4
102+
isLowDensity -> 2
103+
else -> 3
104+
}
105+
}
106+
val spanCount = if (userPref > 0) userPref else autoSpan
107+
val gridLayoutManager = GridLayoutManager(context, spanCount)
86108
gridLayoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
87109
override fun getSpanSize(position: Int): Int {
88110
return when (assistantSelectorAdapter.getItemViewType(position)) {
89111
Constants.VIEW_TYPE_ASSISTANT_GRID_ITEM -> 1
90-
else -> Constants.GRID_SPAN_COUNT
112+
else -> spanCount
91113
}
92114
}
93115
}
@@ -97,6 +119,7 @@ class AssistantSelectorBottomSheet : BaseBottomSheet<FragmentAssistantDialogBind
97119
val itemMargin = (3 * resources.displayMetrics.density).toInt()
98120
val horizontalPadding = dialogPadding - itemMargin
99121
setPadding(horizontalPadding, 0, horizontalPadding, paddingBottom)
122+
scrollBarStyle = View.SCROLLBARS_OUTSIDE_INSET
100123
layoutManager = gridLayoutManager
101124
} else {
102125
layoutManager = LinearLayoutManager(context)

app/src/main/java/com/wstxda/switchai/ui/viewholder/ReorderTipViewHolder.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,15 @@ class ReorderTipViewHolder(
77
private val binding: ListItemReorderTipBinding
88
) : RecyclerView.ViewHolder(binding.root) {
99

10-
fun bind(onDismissClicked: () -> Unit) {
10+
fun bind(onDismissClicked: () -> Unit, isGridMode: Boolean = false) {
1111
binding.dismissButton.setOnClickListener {
1212
onDismissClicked()
1313
}
14+
if (isGridMode) {
15+
val lp = binding.root.layoutParams as? android.view.ViewGroup.MarginLayoutParams
16+
lp?.marginStart = 0
17+
lp?.marginEnd = 0
18+
binding.root.layoutParams = lp
19+
}
1420
}
1521
}

app/src/main/java/com/wstxda/switchai/utils/Constants.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ object Constants {
99
const val ASSISTANT_SELECTOR_DIALOG_PREF_KEY = "assistant_selector_dialog"
1010
const val ASSISTANT_SEARCH_BAR_PREF_KEY = "assistant_search_bar"
1111
const val ASSISTANT_GRID_VIEW_PREF_KEY = "assistant_grid_view"
12+
const val ASSISTANT_GRID_COLUMNS_PREF_KEY = "assistant_grid_columns"
13+
const val ASSISTANT_GRID_COLUMNS_LAND_PREF_KEY = "assistant_grid_columns_land"
1214
const val ASSISTANT_SELECTOR_TITLE_PREF_KEY = "assistant_selector_title"
1315
const val ASSISTANT_MANAGER_MANUAL_PREF_KEY = "assistant_manager_manual"
1416
const val ASSISTANT_MANAGER_DYNAMIC_PREF_KEY = "assistant_manager_dynamic"

app/src/main/java/com/wstxda/switchai/viewmodel/AssistantSelectorViewModel.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ class AssistantSelectorViewModel(application: Application) : AndroidViewModel(ap
4444
private val _isDynamicModeEnabled = MutableLiveData<Boolean>()
4545
val isDynamicModeEnabled: LiveData<Boolean> = _isDynamicModeEnabled
4646

47+
private val _isGridViewEnabled = MutableLiveData<Boolean>()
48+
val isGridViewEnabled: LiveData<Boolean> = _isGridViewEnabled
49+
4750
private val pinnedAssistantKeys = mutableListOf<String>()
4851
private val recentlyUsedAssistants = mutableListOf<Pair<String, Long>>()
4952

@@ -77,9 +80,15 @@ class AssistantSelectorViewModel(application: Application) : AndroidViewModel(ap
7780
Constants.ASSISTANT_MANAGER_DYNAMIC_PREF_KEY, false
7881
)
7982

83+
private val isGridView: Boolean
84+
get() = defaultSharedPreferences.getBoolean(
85+
Constants.ASSISTANT_GRID_VIEW_PREF_KEY, false
86+
)
87+
8088
init {
8189
defaultSharedPreferences.registerOnSharedPreferenceChangeListener(this)
8290
_isDynamicModeEnabled.value = isDynamicMode
91+
_isGridViewEnabled.value = isGridView
8392

8493
val intentFilter = IntentFilter().apply {
8594
addAction(Intent.ACTION_PACKAGE_ADDED)
@@ -347,6 +356,7 @@ class AssistantSelectorViewModel(application: Application) : AndroidViewModel(ap
347356
_isDynamicModeEnabled.value = isDynamicMode
348357
loadAssistants()
349358
}
359+
Constants.ASSISTANT_GRID_VIEW_PREF_KEY -> _isGridViewEnabled.value = isGridView
350360
}
351361
}
352362

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="24dp"
3+
android:height="24dp"
4+
android:viewportWidth="24"
5+
android:viewportHeight="24">
6+
<path
7+
android:fillColor="@android:color/white"
8+
android:pathData="M3,3h7v7H3zM14,3h7v7h-7zM3,14h7v7H3zM14,14h7v7h-7z" />
9+
</vector>

app/src/main/res/values-ar/strings.xml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,13 @@
8686
<string name="pref_assistant_grid_view">عرض الشبكة</string>
8787
<string name="pref_assistant_grid_view_summary">عرض المساعدين في تخطيط شبكي مدمج</string>
8888

89+
<string name="pref_assistant_grid_columns">أعمدة الشبكة</string>
90+
<string name="pref_assistant_grid_columns_summary">عدد الأعمدة في الشبكة</string>
91+
<string name="pref_assistant_grid_columns_land">أعمدة الشبكة (أفقي)</string>
92+
<string name="grid_columns_auto">تلقائي</string>
93+
8994
<string name="pref_assistant_selector_title">إظهار العنوان</string>
90-
<string name="pref_assistant_selector_title_summary">إظهار عنوان "اختر المساعد" في المحدد</string>
95+
<string name="pref_assistant_selector_title_summary">إظهار عنوان "حدد المساعد" في المحدد</string>
9196

9297
<string name="pref_assistant_manager_manual">إدارة المساعدين</string>
9398
<string name="pref_assistant_manager_manual_summary">اختر المساعدين الذين يظهرون في القائمة</string>

app/src/main/res/values-ko/strings.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,11 @@
8686
<string name="pref_assistant_grid_view">그리드 보기</string>
8787
<string name="pref_assistant_grid_view_summary">어시스턴트를 콤팩트한 그리드 레이아웃으로 표시합니다</string>
8888

89+
<string name="pref_assistant_grid_columns">그리드 열 수</string>
90+
<string name="pref_assistant_grid_columns_summary">그리드의 열 수</string>
91+
<string name="pref_assistant_grid_columns_land">그리드 열 수 (가로)</string>
92+
<string name="grid_columns_auto">자동</string>
93+
8994
<string name="pref_assistant_selector_title">제목 표시</string>
9095
<string name="pref_assistant_selector_title_summary">선택기에서 "어시스턴트 선택" 제목을 표시합니다</string>
9196

app/src/main/res/values-pt-rBR/strings.xml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,13 @@
8383
<string name="pref_assistant_grid_view">Visualização em grade</string>
8484
<string name="pref_assistant_grid_view_summary">Exibir assistentes em um layout de grade compacto</string>
8585

86+
<string name="pref_assistant_grid_columns">Colunas da grade</string>
87+
<string name="pref_assistant_grid_columns_summary">Número de colunas na grade</string>
88+
<string name="pref_assistant_grid_columns_land">Colunas da grade (paisagem)</string>
89+
<string name="grid_columns_auto">Automático</string>
90+
8691
<string name="pref_assistant_selector_title">Mostrar título</string>
87-
<string name="pref_assistant_selector_title_summary">Mostrar o título "Escolher assistente" no seletor</string>
92+
<string name="pref_assistant_selector_title_summary">Mostrar o título "Selecionar assistente" no seletor</string>
8893

8994
<string name="pref_assistant_selector">Usar seletor de assistente</string>
9095
<string name="pref_assistant_selector_summary">Se ativado, selecione um assistente toda vez que iniciar. Caso contrário, será usado a opção <b>Assistente digital</b></string>

0 commit comments

Comments
 (0)