@@ -3,37 +3,25 @@ package com.androidvip.sysctlgui.ui.params.edit
33import android.app.Activity
44import android.content.Intent
55import android.os.Bundle
6- import android.text.InputType
7- import android.transition.Explode
8- import android.transition.Slide
9- import android.view.Menu
106import android.view.MenuItem
11- import android.view.Window
7+ import android.view.View
128import androidx.appcompat.app.AlertDialog
139import androidx.appcompat.app.AppCompatActivity
14- import androidx.core.view.ViewCompat
1510import androidx.lifecycle.lifecycleScope
1611import com.androidvip.sysctlgui.R
1712import com.androidvip.sysctlgui.data.models.KernelParam
18- import com.androidvip.sysctlgui.databinding.ActivityEditKernelParamBinding
19- import com.androidvip.sysctlgui.domain.repository.AppPrefs
2013import com.androidvip.sysctlgui.domain.usecase.ApplyParamsUseCase
2114import com.androidvip.sysctlgui.domain.usecase.UpdateUserParamUseCase
22- import com.androidvip.sysctlgui.goAway
23- import com.androidvip.sysctlgui.readLines
24- import com.androidvip.sysctlgui.show
2515import com.androidvip.sysctlgui.showAsLight
2616import com.androidvip.sysctlgui.toast
2717import com.androidvip.sysctlgui.ui.params.user.RemovableParamAdapter
2818import com.google.android.material.snackbar.Snackbar
29- import java.io.InputStream
3019import kotlinx.coroutines.launch
3120import 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
3423class 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