Skip to content

Commit

Permalink
Merge pull request #236 from GuoXiCheng/dev
Browse files Browse the repository at this point in the history
add custom config
  • Loading branch information
GuoXiCheng authored Sep 18, 2024
2 parents d82b9e6 + 64f467c commit 81ddcf6
Show file tree
Hide file tree
Showing 15 changed files with 442 additions and 3 deletions.
2 changes: 2 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@ dependencies {
implementation(libs.androidx.activity.compose)
implementation(libs.androidx.ui)
implementation(libs.androidx.runtime.livedata)
implementation(libs.androidx.datastore.core.android)
implementation(libs.androidx.datastore.preferences)
kapt(libs.hilt.android.compiler)
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/java/com/android/skip/MyApp.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.android.skip
import android.annotation.SuppressLint
import android.app.Application
import android.content.Context
import com.android.skip.util.DataStoreUtils
import com.blankj.utilcode.util.LogUtils
import com.blankj.utilcode.util.Utils
import dagger.hilt.android.HiltAndroidApp
Expand All @@ -13,6 +14,8 @@ class MyApp : Application() {
super.onCreate()
context = this

DataStoreUtils.init(this)

Utils.init(this)
LogUtils.getConfig()
.setLogSwitch(true) // 是否输出日志开关
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,17 @@ package com.android.skip.data.config
import android.graphics.Rect
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.android.skip.R
import com.android.skip.data.network.MyApiNetwork
import com.android.skip.dataclass.ConfigLoadSchema
import com.android.skip.dataclass.ConfigReadSchema
import com.android.skip.dataclass.LoadSkipBound
import com.android.skip.dataclass.LoadSkipId
import com.android.skip.dataclass.LoadSkipText
import com.android.skip.dataclass.ReadClick
import com.android.skip.util.DataStoreUtils
import com.blankj.utilcode.util.ScreenUtils
import com.blankj.utilcode.util.StringUtils.getString
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import kotlinx.coroutines.Dispatchers
Expand All @@ -30,7 +33,12 @@ class ConfigReadRepository @Inject constructor(
private lateinit var configReadSchemaList: List<ConfigReadSchema>

suspend fun readConfig(): String = withContext(Dispatchers.IO) {
val configV3 = myApiNetwork.fetchSkipConfigV3()
// val configV3 = myApiNetwork.fetchSkipConfigV3()
val url = DataStoreUtils.getSyncData(
getString(R.string.store_custom_config),
getString(R.string.store_default_config)
)
val configV3 = myApiNetwork.fetchConfigFromUrl(url)
val yamlContent = Yaml().load<List<ConfigReadSchema>>(configV3)

val gson = Gson()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,15 @@ class MyApiNetwork @Inject constructor() {

suspend fun fetchSkipConfigV3() = myApiService.getSkipConfigV3().await()

suspend fun fetchConfigFromUrl(url: String): String {
val response = myApiService.getConfigFromUrl(url)
if (response.isSuccessful) {
return response.body() ?: throw RuntimeException("Response body is null")
} else {
throw RuntimeException("Failed with error code: ${response.code()}")
}
}

private suspend fun <T> Call<T>.await(): T{
return suspendCoroutine { continuation->
enqueue(object: Callback<T> {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
package com.android.skip.data.network.api

import retrofit2.Call
import retrofit2.Response
import retrofit2.http.GET
import retrofit2.http.Url

interface MyApiService {
@GET("/skip_config_v3.yaml")
fun getSkipConfigV3(): Call<String>

@GET
suspend fun getConfigFromUrl(@Url url: String): Response<String>
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ import androidx.activity.compose.setContent
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import com.android.skip.R
import com.android.skip.data.config.ConfigViewModel
import com.android.skip.ui.components.ScaffoldPage
import com.android.skip.ui.settings.custom.CustomButton
import com.android.skip.ui.settings.strict.StrictButton
import com.android.skip.ui.settings.strict.StrictViewModel
import com.android.skip.ui.settings.tip.TipButton
Expand All @@ -18,15 +20,19 @@ class SettingsActivity : AppCompatActivity() {

private val tipViewModel by viewModels<TipViewModel>()

private val strictViewModel by viewModels<StrictViewModel> ()
private val strictViewModel by viewModels<StrictViewModel>()

private val configViewModel by viewModels<ConfigViewModel>()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

setContent {
AppTheme {
ScaffoldPage(R.string.settings, { finish() }, {
TipButton(tipViewModel)
StrictButton(strictViewModel)
CustomButton(configViewModel)
})
}
}
Expand Down
102 changes: 102 additions & 0 deletions app/src/main/java/com/android/skip/ui/settings/custom/CustomButton.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
package com.android.skip.ui.settings.custom

import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog
import com.android.skip.R
import com.android.skip.data.config.ConfigViewModel
import com.android.skip.ui.components.FlatButton
import com.android.skip.ui.components.ResourceIcon
import com.android.skip.ui.components.RowContent
import com.android.skip.util.DataStoreUtils
import com.blankj.utilcode.util.StringUtils.getString

@Composable
fun CustomButton(configViewModel: ConfigViewModel) {
val showDialog = remember {
mutableStateOf(false)
}

var text by rememberSaveable {
mutableStateOf(
DataStoreUtils.getSyncData(getString(R.string.store_custom_config), "")
)
}

FlatButton(content = {
RowContent(
title = R.string.settings_custom,
subTitle = R.string.settings_custom_subtitle,
icon = {
ResourceIcon(
iconResource = R.drawable.tune
)
})
}, onClick = {
showDialog.value = true
})

if (showDialog.value) {
Dialog(onDismissRequest = { showDialog.value = false }) {
Column(
modifier = Modifier
.background(MaterialTheme.colorScheme.background)
.padding(16.dp),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally,
) {
Text(stringResource(id = R.string.dialog_edit_custom_config))
OutlinedTextField(value = text, onValueChange = {
text = it
}, minLines = 3)
Row(
modifier = Modifier
.fillMaxWidth(),
horizontalArrangement = Arrangement.Center,
) {
TextButton(
onClick = { showDialog.value = false },
modifier = Modifier.padding(8.dp),
) {
Text(stringResource(id = R.string.dialog_dismiss))
}
TextButton(
onClick = {
showDialog.value = false
if (text.isEmpty()) {
DataStoreUtils.removeSync(getString(R.string.store_custom_config))
} else {
DataStoreUtils.putSyncData(
getString(R.string.store_custom_config),
text
)
}
configViewModel.readConfig()
},
modifier = Modifier.padding(8.dp),
) {
Text(stringResource(id = R.string.dialog_confirm))
}
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ fun StrictButton(
RowContent(
R.string.settings_strict,
stringResource(id = strictText),
{ ResourceIcon(iconResource = R.drawable.notifications) },
{ ResourceIcon(iconResource = R.drawable.point_scan) },
enable.value, {
strictViewModel.changeEnable(it)
})
Expand Down
Loading

0 comments on commit 81ddcf6

Please sign in to comment.