Skip to content

Commit 066dcb2

Browse files
committed
refactor: updated import params feature
1 parent aa3ac8f commit 066dcb2

14 files changed

Lines changed: 210 additions & 136 deletions

File tree

app/src/main/kotlin/com/androidvip/sysctlgui/ui/main/MainActivity.kt

Lines changed: 35 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,16 @@ import com.androidvip.sysctlgui.R
1515
import com.androidvip.sysctlgui.data.models.HomeItem
1616
import com.androidvip.sysctlgui.data.utils.RootUtils
1717
import com.androidvip.sysctlgui.databinding.ActivityMainBinding
18-
import com.androidvip.sysctlgui.domain.models.param.DomainKernelParam
19-
import com.androidvip.sysctlgui.domain.usecase.AddUserParamsUseCase
20-
import com.androidvip.sysctlgui.domain.usecase.ApplyParamsUseCase
21-
import com.androidvip.sysctlgui.domain.usecase.ClearUserParamUseCase
18+
import com.androidvip.sysctlgui.domain.exceptions.EmptyFileException
19+
import com.androidvip.sysctlgui.domain.exceptions.InvalidFileExtensionException
20+
import com.androidvip.sysctlgui.domain.exceptions.MalformedLineException
21+
import com.androidvip.sysctlgui.domain.exceptions.NoValidParamException
22+
import com.androidvip.sysctlgui.domain.usecase.ImportParamsUseCase
2223
import com.androidvip.sysctlgui.toast
2324
import com.androidvip.sysctlgui.ui.params.browse.KernelParamBrowserActivity
2425
import com.androidvip.sysctlgui.ui.params.list.KernelParamListActivity
2526
import com.androidvip.sysctlgui.ui.params.user.ManageFavoritesParamsActivity
2627
import com.androidvip.sysctlgui.ui.settings.SettingsActivity
27-
import com.androidvip.sysctlgui.utils.KernelParamUtils
2828
import com.google.gson.JsonParseException
2929
import com.google.gson.JsonSyntaxException
3030
import kotlinx.coroutines.launch
@@ -35,9 +35,7 @@ class MainActivity : AppCompatActivity(), HomeItemAdapter.OnHomeItemClickedListe
3535
private lateinit var binding: ActivityMainBinding
3636
private val rootUtils: RootUtils by inject()
3737

38-
private val applyParamsUseCase: ApplyParamsUseCase by inject()
39-
private val clearUserParamUseCase: ClearUserParamUseCase by inject()
40-
private val addUserParamsUseCase: AddUserParamsUseCase by inject()
38+
private val importParamsUseCase: ImportParamsUseCase by inject()
4139

4240
private val viewModel: MainViewModel by viewModel()
4341

@@ -114,22 +112,9 @@ class MainActivity : AppCompatActivity(), HomeItemAdapter.OnHomeItemClickedListe
114112
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
115113
when (requestCode) {
116114
OPEN_FILE_REQUEST_CODE -> {
117-
if (resultCode != Activity.RESULT_OK) return
118-
119-
data?.data?.let { uri ->
120-
val fileExtension = uri.lastPathSegment
121-
122-
fileExtension?.let { extension ->
123-
if (extension.endsWith(".json") or extension.endsWith(".conf")) {
124-
lifecycleScope.launch {
125-
applyParamsFromUri(uri, extension)
126-
}
127-
} else {
128-
toast(R.string.import_error_invalid_file_type)
129-
return
130-
}
131-
}
132-
}
115+
if (resultCode != Activity.RESULT_OK) return toast(R.string.import_error)
116+
val uri = data?.data ?: return toast(R.string.import_error)
117+
importParams(uri)
133118
}
134119
}
135120
super.onActivityResult(requestCode, resultCode, data)
@@ -144,8 +129,9 @@ class MainActivity : AppCompatActivity(), HomeItemAdapter.OnHomeItemClickedListe
144129
}
145130
}
146131

147-
private suspend fun applyParamsFromUri(uri: Uri, fileExtension: String) {
148-
val successfulParams: MutableList<DomainKernelParam> = mutableListOf()
132+
private fun importParams(uri: Uri) {
133+
val extension = uri.lastPathSegment.orEmpty()
134+
val stream = contentResolver.openInputStream(uri) ?: return toast(R.string.import_error)
149135

150136
fun showResultDialog(message: String, success: Boolean) {
151137
val dialog = AlertDialog.Builder(this)
@@ -159,44 +145,33 @@ class MainActivity : AppCompatActivity(), HomeItemAdapter.OnHomeItemClickedListe
159145
}
160146
}
161147

162-
try {
163-
val params: MutableList<DomainKernelParam>? = when {
164-
fileExtension.endsWith(".json") -> {
165-
KernelParamUtils.getParamsFromJsonUri(this, uri)
166-
}
167-
fileExtension.endsWith(".conf") -> {
168-
KernelParamUtils.getParamsFromConfUri(this, uri)
169-
}
170-
else -> mutableListOf()
171-
}?.toMutableList()
172-
173-
if (params.isNullOrEmpty()) {
174-
toast(R.string.no_parameters_found)
175-
return
176-
}
177-
178-
params.forEach {
179-
// Apply the param to check if valid
180-
val result = applyParamsUseCase.execute(it)
181-
if (result.isSuccess) {
182-
successfulParams.add(it)
183-
}
184-
}
185-
186-
clearUserParamUseCase.execute()
187-
addUserParamsUseCase.execute(successfulParams)
188-
val msg = "${
189-
getString(R.string.import_success_message, successfulParams.size)
190-
}\n\n ${successfulParams.joinToString()}"
191-
showResultDialog(msg, true)
192-
toast(R.string.done, Toast.LENGTH_LONG)
193-
} catch (e: Exception) {
194-
e.printStackTrace()
195-
when (e) {
148+
lifecycleScope.launch {
149+
val result = importParamsUseCase.execute(stream, extension)
150+
when (result.exceptionOrNull()) {
196151
is JsonParseException,
197152
is JsonSyntaxException -> {
198153
showResultDialog(getString(R.string.import_error_invalid_json), false)
199154
}
155+
is InvalidFileExtensionException -> showResultDialog(
156+
getString(R.string.import_error_invalid_file_type), false
157+
)
158+
is EmptyFileException -> showResultDialog(
159+
getString(R.string.import_error_empty_file), false
160+
)
161+
is MalformedLineException -> showResultDialog(
162+
getString(R.string.import_error_malformed_line), false
163+
)
164+
is NoValidParamException -> showResultDialog(
165+
getString(R.string.no_parameters_found), false
166+
)
167+
null -> {
168+
val successfulParams = result.getOrNull().orEmpty()
169+
val msg = "${
170+
getString(R.string.import_success_message, successfulParams.size)
171+
}\n\n ${successfulParams.joinToString()}"
172+
showResultDialog(msg, true)
173+
toast(R.string.done, Toast.LENGTH_LONG)
174+
}
200175
else -> {
201176
showResultDialog(getString(R.string.import_error), false)
202177
}

app/src/main/kotlin/com/androidvip/sysctlgui/utils/KernelParamUtils.kt

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -32,34 +32,4 @@ object KernelParamUtils {
3232
}
3333
}
3434

35-
fun getParamsFromJsonUri(context: Context, uri: Uri): List<DomainKernelParam>? {
36-
val sb = StringBuilder()
37-
uri.readLines(context) { sb.append(it) }
38-
39-
val type: Type = object : TypeToken<List<DomainKernelParam>>() {}.type
40-
return Gson().fromJson(sb.toString(), type)
41-
}
42-
43-
fun getParamsFromConfUri(context: Context, uri: Uri): List<DomainKernelParam> {
44-
val readParams = mutableListOf<DomainKernelParam>()
45-
46-
var cont = 0
47-
uri.readLines(context) { line ->
48-
if (!line.startsWith("#") && !line.startsWith(";") && line.isNotEmpty()) {
49-
runCatching {
50-
readParams.add(
51-
DomainKernelParam(
52-
id = ++cont,
53-
name = line.split("=").first().trim(),
54-
value = line.split("=")[1].trim()
55-
).apply {
56-
setPathFromName(this.name)
57-
}
58-
)
59-
}
60-
}
61-
}
62-
63-
return readParams
64-
}
6535
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@
5050
<string name="export_parameters">Exportar parâmetros</string>
5151
<string name="export_parameters_sum">Exportar os parâmetros que serão aplicados na inicialização</string>
5252
<string name="import_error_invalid_file_type">Não foi possível abrir o arquivo: tipo de arquivo inválido.</string>
53+
<string name="import_error_malformed_line">Não foi possível importar os parâmetros: existem erros de formatação no arquivo.</string>
54+
<string name="import_error_empty_file">Não foi possível importar os parâmetros: o arquivo está vazio.</string>
5355
<string name="restore_parameters">Tentando restaurar parâmetros</string>
5456
<string name="import_error_invalid_json">Arquivo JSON inválido ou mal formado</string>
5557
<string name="import_error">Falha ao importar parâmetros</string>
@@ -83,4 +85,8 @@
8385
<string name="undo">Desfazer</string>
8486
<string name="splash_status_performing_migration">Migrando banco de dados</string>
8587
<string name="splash_status_checking_migration">Verificando esquema de banco de dados antigo</string>
88+
<string name="tile_toggle_start_up_no_root_access_toast">Acesso root necessário</string>
89+
<string name="tile_toggle_start_up_no_root_access_label">Requer acesso root</string>
90+
<string name="tile_toggle_start_up_label">Executar o SysctlGUI na inicialização</string>
91+
<string name="tile_start_app_label">Iniciar o SysctlGUI</string>
8692
</resources>

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@
5858
<string name="import_error">Failed to import parameters</string>
5959
<string name="import_error_invalid_json">Invalid or malformed JSON file</string>
6060
<string name="import_error_invalid_file_type">Can\'t open file: invalid file type.</string>
61+
<string name="import_error_empty_file">Can\'t import params: empty file.</string>
62+
<string name="import_error_malformed_line">Can\'t import params: there is a formatting error in the file.</string>
6163
<string name="import_success_message">%d parameter(s) applied</string>
6264
<string name="open_documentation">Open documentation</string>
6365
<string name="edit">Edit</string>

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ buildscript {
99
}
1010

1111
dependencies {
12-
classpath("com.android.tools.build:gradle:7.0.2")
12+
classpath("com.android.tools.build:gradle:7.0.3")
1313
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion")
1414
// NOTE: Do not place your application dependencies here; they belong
1515
// in the individual module build.gradle files

data/src/main/AndroidManifest.xml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,4 @@
33
package="com.androidvip.sysctlgui.data">
44

55

6-
7-
</manifest>
6+
</manifest>

data/src/main/java/com/androidvip/sysctlgui/data/datasource/RuntimeParamDataSource.kt

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,15 @@ class RuntimeParamDataSource(
1717
): Result<Unit> = runCatching {
1818
val commitResult = commitChanges(param, commitMode, useBusybox, allowBlank)
1919

20-
if (commitMode == "sysctl") {
21-
if (commitResult == "error" || !commitResult.contains(param.name)) {
22-
throw Exception("Value refused to apply. Try using 'echo' mode.")
20+
when {
21+
commitMode == "sysctl" -> {
22+
if (commitResult == "error" || !commitResult.contains(param.name)) {
23+
throw Exception("Value refused to apply. Try using 'echo' mode.")
24+
}
25+
}
26+
commitResult == "error" -> {
27+
throw Exception("Value refused to apply")
2328
}
24-
} else if (commitResult == "error") {
25-
throw Exception("Value refused to apply")
2629
}
2730
}
2831

0 commit comments

Comments
 (0)