Skip to content

Commit 7309b6b

Browse files
committed
refactor: edit param compose screen 1/2
1 parent d592bb2 commit 7309b6b

21 files changed

Lines changed: 671 additions & 191 deletions

File tree

app/src/main/kotlin/com/androidvip/sysctlgui/ui/params/browse/BrowseParamsViewModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class BrowseParamsViewModel(
2727

2828
override fun createInitialState(): ParamBrowserViewState = ParamBrowserViewState()
2929

30-
override fun processEvent(event: ParamBrowserViewEvent) {
30+
override fun onEvent(event: ParamBrowserViewEvent) {
3131
when (event) {
3232
ParamBrowserViewEvent.RefreshRequested -> setPath(currentState.currentPath)
3333
is ParamBrowserViewEvent.DirectoryChanged -> onDirectoryChanged(event.dir)

app/src/main/kotlin/com/androidvip/sysctlgui/ui/params/browse/KernelParamBrowseFragment.kt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ class KernelParamBrowseFragment : BaseSearchFragment(), OnParamItemClickedListen
102102
super.onViewCreated(view, savedInstanceState)
103103

104104
lifecycleScope.launch {
105-
viewModel.processEvent(ParamBrowserViewEvent.DirectoryChanged(File(Consts.PROC_SYS)))
105+
viewModel.onEvent(ParamBrowserViewEvent.DirectoryChanged(File(Consts.PROC_SYS)))
106106
viewModel.effect.collect(::handleViewEffect)
107107
}
108108

@@ -141,10 +141,10 @@ class KernelParamBrowseFragment : BaseSearchFragment(), OnParamItemClickedListen
141141
override fun onOptionsItemSelected(item: MenuItem): Boolean {
142142
when (item.itemId) {
143143
R.id.action_documentation -> {
144-
viewModel.processEvent(ParamBrowserViewEvent.DocumentationMenuClicked)
144+
viewModel.onEvent(ParamBrowserViewEvent.DocumentationMenuClicked)
145145
}
146146
R.id.action_favorites -> {
147-
viewModel.processEvent(ParamBrowserViewEvent.FavoritesMenuClicked)
147+
viewModel.onEvent(ParamBrowserViewEvent.FavoritesMenuClicked)
148148
}
149149
else -> return false
150150
}
@@ -153,15 +153,15 @@ class KernelParamBrowseFragment : BaseSearchFragment(), OnParamItemClickedListen
153153
}
154154

155155
override fun onQueryTextChanged() {
156-
viewModel.processEvent(ParamBrowserViewEvent.SearchExpressionChanged(searchExpression))
156+
viewModel.onEvent(ParamBrowserViewEvent.SearchExpressionChanged(searchExpression))
157157
}
158158

159159
override fun onParamItemClicked(param: KernelParam, itemLayout: View) {
160-
viewModel.processEvent(ParamBrowserViewEvent.ParamClicked(param))
160+
viewModel.onEvent(ParamBrowserViewEvent.ParamClicked(param))
161161
}
162162

163163
private fun onDirectoryChanged(newDir: File) {
164-
viewModel.processEvent(ParamBrowserViewEvent.DirectoryChanged(newDir))
164+
viewModel.onEvent(ParamBrowserViewEvent.DirectoryChanged(newDir))
165165
resetSearchExpression()
166166
}
167167

@@ -186,7 +186,7 @@ class KernelParamBrowseFragment : BaseSearchFragment(), OnParamItemClickedListen
186186
}
187187

188188
private fun refresh() {
189-
viewModel.processEvent(ParamBrowserViewEvent.RefreshRequested)
189+
viewModel.onEvent(ParamBrowserViewEvent.RefreshRequested)
190190
}
191191

192192
@SuppressLint("SetJavaScriptEnabled")
@@ -270,10 +270,10 @@ class KernelParamBrowseFragment : BaseSearchFragment(), OnParamItemClickedListen
270270
itemsIndexed(params) { index, param ->
271271
ParamBrowseItem(
272272
onParamClick = {
273-
viewModel.processEvent(ParamBrowserViewEvent.ParamClicked(param))
273+
viewModel.onEvent(ParamBrowserViewEvent.ParamClicked(param))
274274
},
275275
onDirectoryChanged = {
276-
viewModel.processEvent(ParamBrowserViewEvent.DirectoryChanged(it))
276+
viewModel.onEvent(ParamBrowserViewEvent.DirectoryChanged(it))
277277
},
278278
param = param,
279279
paramFile = File(param.path)

app/src/main/kotlin/com/androidvip/sysctlgui/ui/params/edit/EditKernelParamActivity.kt

Lines changed: 18 additions & 172 deletions
Original file line numberDiff line numberDiff line change
@@ -3,37 +3,25 @@ package com.androidvip.sysctlgui.ui.params.edit
33
import android.app.Activity
44
import android.content.Intent
55
import android.os.Bundle
6-
import android.text.InputType
7-
import android.transition.Explode
8-
import android.transition.Slide
9-
import android.view.Menu
106
import android.view.MenuItem
11-
import android.view.Window
7+
import android.view.View
128
import androidx.appcompat.app.AlertDialog
139
import androidx.appcompat.app.AppCompatActivity
14-
import androidx.core.view.ViewCompat
1510
import androidx.lifecycle.lifecycleScope
1611
import com.androidvip.sysctlgui.R
1712
import com.androidvip.sysctlgui.data.models.KernelParam
18-
import com.androidvip.sysctlgui.databinding.ActivityEditKernelParamBinding
19-
import com.androidvip.sysctlgui.domain.repository.AppPrefs
2013
import com.androidvip.sysctlgui.domain.usecase.ApplyParamsUseCase
2114
import com.androidvip.sysctlgui.domain.usecase.UpdateUserParamUseCase
22-
import com.androidvip.sysctlgui.goAway
23-
import com.androidvip.sysctlgui.readLines
24-
import com.androidvip.sysctlgui.show
2515
import com.androidvip.sysctlgui.showAsLight
2616
import com.androidvip.sysctlgui.toast
2717
import com.androidvip.sysctlgui.ui.params.user.RemovableParamAdapter
2818
import com.google.android.material.snackbar.Snackbar
29-
import java.io.InputStream
3019
import kotlinx.coroutines.launch
3120
import org.koin.android.ext.android.inject
21+
import org.koin.androidx.viewmodel.ext.android.viewModel
3222

33-
// TODO: Improve by delegating any non-presentation logic to a view model
3423
class EditKernelParamActivity : AppCompatActivity() {
35-
private lateinit var binding: ActivityEditKernelParamBinding
36-
private val prefs: AppPrefs by inject()
24+
private val viewModel by viewModel<EditParamViewModel>()
3725
private val applyParamsUseCase: ApplyParamsUseCase by inject()
3826
private val updateUserParamUseCase: UpdateUserParamUseCase by inject()
3927

@@ -42,14 +30,9 @@ class EditKernelParamActivity : AppCompatActivity() {
4230
override fun onCreate(savedInstanceState: Bundle?) {
4331
super.onCreate(savedInstanceState)
4432

45-
window.requestFeature(Window.FEATURE_CONTENT_TRANSITIONS)
46-
window.enterTransition = Explode()
47-
window.exitTransition = Slide()
48-
49-
binding = ActivityEditKernelParamBinding.inflate(layoutInflater)
50-
setContentView(binding.root)
51-
setSupportActionBar(binding.toolbar)
52-
supportActionBar?.setDisplayHomeAsUpEnabled(true)
33+
lifecycleScope.launch {
34+
viewModel.effect.collect(::handleViewEffect)
35+
}
5336

5437
handleIntent(intent)
5538
}
@@ -59,39 +42,6 @@ class EditKernelParamActivity : AppCompatActivity() {
5942
handleIntent(intent ?: return)
6043
}
6144

62-
override fun onBackPressed() {
63-
supportFinishAfterTransition()
64-
}
65-
66-
override fun onCreateOptionsMenu(menu: Menu): Boolean {
67-
if (this::kernelParameter.isInitialized.not()) {
68-
return false
69-
}
70-
menuInflater.inflate(R.menu.menu_edit_params, menu)
71-
menu.findItem(R.id.action_favorite)?.let {
72-
if (kernelParameter.favorite) {
73-
it.setIcon(R.drawable.ic_favorite_selected)
74-
} else {
75-
it.setIcon(R.drawable.ic_favorite_unselected)
76-
}
77-
}
78-
79-
menu.findItem(R.id.action_tasker)?.let {
80-
if (isTaskerInstalled()) {
81-
it.isVisible = true
82-
if (kernelParameter.taskerParam) {
83-
it.setIcon(R.drawable.ic_action_tasker_remove)
84-
} else {
85-
it.setIcon(R.drawable.ic_action_tasker_add)
86-
}
87-
} else {
88-
it.isVisible = false
89-
}
90-
}
91-
92-
return true
93-
}
94-
9545
override fun onOptionsItemSelected(item: MenuItem): Boolean {
9646
when (item.itemId) {
9747
android.R.id.home -> onBackPressed()
@@ -135,43 +85,21 @@ class EditKernelParamActivity : AppCompatActivity() {
13585

13686
private fun handleIntent(intent: Intent) {
13787
val extraParam = RemovableParamAdapter.EXTRA_PARAM
138-
(intent.getParcelableExtra(extraParam) as? KernelParam)?.also {
139-
kernelParameter = it
140-
141-
if (!kernelParameter.hasValidPath() || !kernelParameter.hasValidName()) {
142-
showInvalidParamError()
143-
} else {
144-
defineInputTypeForValue(kernelParameter.value)
145-
binding.editParamInput.setText(kernelParameter.value)
146-
updateTextUi(kernelParameter)
147-
binding.editParamApply.setOnClickListener {
148-
lifecycleScope.launch {
149-
applyParam()
150-
}
151-
}
152-
}
153-
} ?: run {
154-
showInvalidParamError()
88+
val param = intent.getParcelableExtra(extraParam) as? KernelParam
89+
if (param != null) {
90+
viewModel.onEvent(EditParamViewEvent.ReceivedParam(param, this))
91+
} else {
92+
finishWithInvalidParamError()
15593
}
15694
}
15795

158-
private fun updateTextUi(param: KernelParam) {
159-
ViewCompat.setTransitionName(binding.editParamName, NAME_TRANSITION_NAME)
160-
ViewCompat.setTransitionName(binding.editParamInput, VALUE_TRANSITION_NAME)
161-
162-
val paramName = param.name.split(".").last()
163-
binding.editParamName.text = paramName
164-
binding.editParamSub.text = param.name.removeSuffix(paramName).removeSuffix(".")
165-
binding.editParamInfo.text = findInfoForParam(param)
166-
binding.editParamApply.show()
167-
168-
supportStartPostponedEnterTransition()
96+
private fun finishWithInvalidParamError() {
97+
toast(R.string.unexpected_error)
98+
finish()
16999
}
170100

171-
private fun showInvalidParamError() {
172-
binding.editParamErrorText.show()
173-
binding.editParamScroll.goAway()
174-
binding.editParamApply.hide()
101+
private fun handleViewEffect(effect: EditParamViewEffect) {
102+
175103
}
176104

177105
private fun selectTaskerListAsDialog(block: (Int) -> Unit) {
@@ -188,94 +116,13 @@ class EditKernelParamActivity : AppCompatActivity() {
188116
}
189117
}
190118

191-
private fun defineInputTypeForValue(paramValue: String) {
192-
if (!prefs.guessInputType) return
193-
194-
if (paramValue.length > 12) {
195-
binding.editParamInput.inputType =
196-
InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_MULTI_LINE
197-
binding.editParamInput.setLines(3)
198-
return
199-
}
200-
201-
try {
202-
paramValue.toInt()
203-
binding.editParamInput.inputType =
204-
InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_VARIATION_NORMAL
205-
} catch (e: Exception) {
206-
try {
207-
paramValue.toDouble()
208-
binding.editParamInput.inputType =
209-
InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL
210-
} catch (e: Exception) {
211-
binding.editParamInput.inputType =
212-
InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_NORMAL
213-
}
214-
}
215-
}
216-
217-
private fun findInfoForParam(kernelParam: KernelParam): String {
218-
val paramName = kernelParam.name.split(".").last()
219-
val resId = resources.getIdentifier(
220-
paramName.replace("-", "_"),
221-
"string",
222-
packageName
223-
)
224-
val stringRes: String? = if (resId != 0) {
225-
runCatching {
226-
getString(resId)
227-
}.getOrNull()
228-
} else {
229-
null
230-
}
231-
232-
// Prefer the documented string resource
233-
if (stringRes != null) return stringRes
234-
235-
if (!kernelParam.path.startsWith("/")) {
236-
return stringRes ?: getString(R.string.no_info_available)
237-
}
238-
239-
val subdirs = kernelParam.path.split("/")
240-
if (subdirs.isEmpty() || subdirs.size < 4) {
241-
return stringRes ?: getString(R.string.no_info_available)
242-
}
243-
244-
val rawInputStream: InputStream? = when (subdirs[3]) {
245-
"abi" -> resources.openRawResource(R.raw.abi)
246-
"fs" -> resources.openRawResource(R.raw.fs)
247-
"kernel" -> resources.openRawResource(R.raw.kernel)
248-
"net" -> resources.openRawResource(R.raw.net)
249-
"vm" -> resources.openRawResource(R.raw.vm)
250-
else -> null
251-
}
252-
253-
val documentationBuilder = StringBuilder()
254-
rawInputStream.readLines {
255-
documentationBuilder.append(it).append("\n")
256-
}
257-
258-
val documentation = documentationBuilder.toString()
259-
if (documentation.isEmpty()) {
260-
return stringRes ?: getString(R.string.no_info_available)
261-
}
262-
263-
val info: String? = runCatching {
264-
documentation.split("=+".toRegex()).last {
265-
it.contains("$paramName\n")
266-
}.split("$paramName\n").last()
267-
}.getOrNull()
268-
269-
return if (info.isNullOrEmpty()) getString(R.string.no_info_available) else info
270-
}
271-
272119
private suspend fun applyParam() {
273120
val isEditingSavedParam = intent.getBooleanExtra(
274121
RemovableParamAdapter.EXTRA_EDIT_SAVED_PARAM,
275122
false
276123
)
277124

278-
val newValue = binding.editParamInput.text.toString()
125+
val newValue = "binding.editParamInput.text.toString()"
279126
kernelParameter.value = newValue
280127

281128
val result = runCatching { applyParamsUseCase(kernelParameter) }
@@ -293,13 +140,12 @@ class EditKernelParamActivity : AppCompatActivity() {
293140
finish()
294141
} else {
295142
Snackbar.make(
296-
binding.editParamApply,
143+
View(this),
297144
feedback,
298145
Snackbar.LENGTH_LONG
299146
).setAction(R.string.undo) {
300147
lifecycleScope.launchWhenResumed {
301148
updateUserParamUseCase(kernelParameter)
302-
binding.editParamInput.setText(kernelParameter.value)
303149
}
304150
}.showAsLight()
305151
}

0 commit comments

Comments
 (0)