Skip to content

Commit

Permalink
[fix|build] Fix issue with not catching exceptions when checking for …
Browse files Browse the repository at this point in the history
…update; add upload Mapping file for GitHub Action
  • Loading branch information
SkyD666 committed Dec 10, 2023
1 parent 2613c42 commit 9bba588
Show file tree
Hide file tree
Showing 12 changed files with 103 additions and 10 deletions.
6 changes: 6 additions & 0 deletions .github/workflows/pre_release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,12 @@ jobs:
with:
name: Pre-Release Apk
path: app/build/outputs/apk/GitHub/release/*.apk
# 上传 mapping
- name: Upload Pre-Release Mapping
uses: actions/upload-artifact@v3
with:
name: Pre-Release Mapping
path: app/build/outputs/mapping/GitHubRelease/mapping.txt
# 获取 apk 路径
- name: Get Pre-Release Apk File Path
run: |
Expand Down
6 changes: 3 additions & 3 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ android {
minSdk 24
targetSdk 34
versionCode 54
versionName "2.0-alpha08"
versionName "2.0-alpha09"
flavorDimensions = ["versionName"]

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
Expand Down Expand Up @@ -164,8 +164,8 @@ dependencies {
implementation "com.google.mlkit:text-recognition-chinese:$mlkit_recognition_version"
implementation "com.google.mlkit:text-recognition-japanese:$mlkit_recognition_version"
implementation "com.google.mlkit:text-recognition-korean:$mlkit_recognition_version"
implementation 'com.google.mlkit:image-labeling-custom:17.0.2'
implementation 'com.google.mlkit:segmentation-selfie:16.0.0-beta4'
implementation "com.google.mlkit:image-labeling-custom:17.0.2"
implementation "com.google.mlkit:segmentation-selfie:16.0.0-beta4"

// TF Lite
implementation 'org.tensorflow:tensorflow-lite:2.14.0'
Expand Down
6 changes: 5 additions & 1 deletion app/src/main/java/com/skyd/rays/ui/activity/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,11 @@ class MainActivity : AppCompatActivity() {
}

if (openUpdateDialog) {
UpdateDialog(silence = true, onClosed = { openUpdateDialog = false })
UpdateDialog(
silence = true,
onClosed = { openUpdateDialog = false },
onError = { openUpdateDialog = false },
)
}
}
}
Expand Down
26 changes: 25 additions & 1 deletion app/src/main/java/com/skyd/rays/ui/screen/about/AboutScreen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,16 @@ import androidx.compose.material3.Icon
import androidx.compose.material3.ListItem
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.SnackbarHost
import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
Expand Down Expand Up @@ -81,17 +84,22 @@ import com.skyd.rays.ui.screen.about.license.LICENSE_SCREEN_ROUTE
import com.skyd.rays.ui.screen.about.update.UpdateDialog
import com.skyd.rays.util.CommonUtil
import com.skyd.rays.util.CommonUtil.openBrowser
import kotlinx.coroutines.launch

const val ABOUT_SCREEN_ROUTE = "aboutScreen"

@Composable
fun AboutScreen() {
val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior()
val navController = LocalNavController.current
val context = LocalContext.current
val scope = rememberCoroutineScope()
val snackbarHostState = remember { SnackbarHostState() }
var openUpdateDialog by rememberSaveable { mutableStateOf(false) }
var openSponsorDialog by rememberSaveable { mutableStateOf(false) }

Scaffold(
snackbarHost = { SnackbarHost(hostState = snackbarHostState) },
topBar = {
RaysTopBar(
style = RaysTopBarStyle.Large,
Expand Down Expand Up @@ -170,8 +178,24 @@ fun AboutScreen() {
}
}

var isRetry by rememberSaveable { mutableStateOf(false) }

if (openUpdateDialog) {
UpdateDialog(onClosed = { openUpdateDialog = false })
UpdateDialog(
isRetry = isRetry,
onClosed = { openUpdateDialog = false },
onSuccess = { isRetry = false },
onError = { msg ->
isRetry = true
openUpdateDialog = false
scope.launch {
snackbarHostState.showSnackbar(
message = context.getString(R.string.update_check_failed, msg),
withDismissAction = true,
)
}
}
)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
Expand All @@ -46,12 +47,22 @@ import okhttp3.internal.toLongOrDefault
@Composable
fun UpdateDialog(
silence: Boolean = false,
isRetry: Boolean = false,
onSuccess: () -> Unit = {},
onClosed: () -> Unit = {},
onError: (String) -> Unit = {},
viewModel: UpdateViewModel = hiltViewModel()
) {
val uiState by viewModel.viewState.collectAsStateWithLifecycle()
val uiEvent by viewModel.singleEvent.collectAsStateWithLifecycle(initialValue = null)

val dispatch = viewModel.getDispatcher(startWith = UpdateIntent.CheckUpdate)
val dispatch = viewModel.getDispatcher(startWith = UpdateIntent.CheckUpdate(isRetry = false))

LaunchedEffect(Unit) {
if (isRetry) {
dispatch(UpdateIntent.CheckUpdate(isRetry = true))
}
}

WaitingDialog(visible = uiState.loadingDialog && !silence)

Expand Down Expand Up @@ -83,6 +94,15 @@ fun UpdateDialog(
)
}
}

when (val event = uiEvent) {
is UpdateEvent.CheckError -> LaunchedEffect(event) {
onError(event.msg)
}

is UpdateEvent.CheckSuccess -> onSuccess()
null -> Unit
}
}

@Composable
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.skyd.rays.ui.screen.about.update

import com.skyd.rays.base.mvi.MviSingleEvent
import kotlin.random.Random

sealed interface UpdateEvent : MviSingleEvent {
data class CheckError(
val msg: String,
private val random: Long = Random.nextLong() + System.currentTimeMillis(),
) : UpdateEvent

data class CheckSuccess(private val random: Long = Random.nextLong() + System.currentTimeMillis()) :
UpdateEvent
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ import com.skyd.rays.base.mvi.MviIntent

sealed interface UpdateIntent : MviIntent {
data object CloseDialog : UpdateIntent
data object CheckUpdate : UpdateIntent
data class CheckUpdate(val isRetry: Boolean) : UpdateIntent
data class Update(val url: String?) : UpdateIntent
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ import com.skyd.rays.model.bean.UpdateBean
internal sealed interface UpdatePartialStateChange {
fun reduce(oldState: UpdateState): UpdateState

data class Error(val msg: String) : UpdatePartialStateChange {
override fun reduce(oldState: UpdateState) = oldState.copy(loadingDialog = false)
}

data object LoadingDialog : UpdatePartialStateChange {
override fun reduce(oldState: UpdateState) = oldState.copy(loadingDialog = true)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ package com.skyd.rays.ui.screen.about.update

import androidx.lifecycle.viewModelScope
import com.skyd.rays.base.mvi.AbstractMviViewModel
import com.skyd.rays.base.mvi.MviSingleEvent
import com.skyd.rays.config.GITHUB_REPO
import com.skyd.rays.ext.catchMap
import com.skyd.rays.ext.startWith
import com.skyd.rays.model.respository.UpdateRepository
import com.skyd.rays.util.CommonUtil.getAppVersionCode
Expand All @@ -13,11 +13,13 @@ import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.filterIsInstance
import kotlinx.coroutines.flow.filterNot
import kotlinx.coroutines.flow.flatMapConcat
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.merge
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.scan
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.flow.take
Expand All @@ -29,20 +31,22 @@ import javax.inject.Inject

@HiltViewModel
class UpdateViewModel @Inject constructor(private var updateRepo: UpdateRepository) :
AbstractMviViewModel<UpdateIntent, UpdateState, MviSingleEvent>() {
AbstractMviViewModel<UpdateIntent, UpdateState, UpdateEvent>() {

override val viewState: StateFlow<UpdateState>

init {
val initialVS = UpdateState.initial()

viewState = merge(
intentSharedFlow.filterIsInstance<UpdateIntent.CheckUpdate>().take(1),
intentSharedFlow.filter { it is UpdateIntent.CheckUpdate && !it.isRetry }.take(1),
intentSharedFlow.filter { it is UpdateIntent.CheckUpdate && it.isRetry },
intentSharedFlow.filterNot { it is UpdateIntent.CheckUpdate }
)
.shareWhileSubscribed()
.toUpdatePartialStateChangeFlow()
.debugLog("UpdatePartialStateChange")
.sendSingleEvent()
.scan(initialVS) { vs, change -> change.reduce(vs) }
.debugLog("ViewState")
.stateIn(
Expand All @@ -52,6 +56,19 @@ class UpdateViewModel @Inject constructor(private var updateRepo: UpdateReposito
)
}

private fun Flow<UpdatePartialStateChange>.sendSingleEvent(): Flow<UpdatePartialStateChange> {
return onEach { change ->
val event = when (change) {
is UpdatePartialStateChange.Error -> UpdateEvent.CheckError(change.msg)
is UpdatePartialStateChange.CheckUpdate.NoUpdate,
is UpdatePartialStateChange.CheckUpdate.HasUpdate -> UpdateEvent.CheckSuccess()

else -> return@onEach
}
sendEvent(event)
}
}

private fun SharedFlow<UpdateIntent>.toUpdatePartialStateChangeFlow(): Flow<UpdatePartialStateChange> {
return merge(
filterIsInstance<UpdateIntent.CheckUpdate>().flatMapConcat {
Expand All @@ -76,6 +93,7 @@ class UpdateViewModel @Inject constructor(private var updateRepo: UpdateReposito
UpdatePartialStateChange.CheckUpdate.NoUpdate
}
}.startWith(UpdatePartialStateChange.LoadingDialog)
.catchMap { UpdatePartialStateChange.Error(it.message.orEmpty()) }
},

filterIsInstance<UpdateIntent.Update>().map { intent ->
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values-zh-rCN/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,7 @@
<string name="update_newer_text">新版本:%1$s\n发布时间:%2$s\n下载数:%3$s\n</string>
<string name="download_update">下载</string>
<string name="update_ignore">忽略本次更新</string>
<string name="update_check_failed">检查更新失败:%s</string>
<string name="search_result_sort_create_time">创建时间</string>
<string name="search_result_sort_modify_time">修改时间</string>
<string name="search_result_sort_tag_count">标签数量</string>
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values-zh-rTW/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,7 @@
<string name="data_screen_name">數據</string>
<string name="dialog_warning">警告</string>
<string name="update_ignore">忽略此更新</string>
<string name="update_check_failed">檢查更新失敗:%s</string>
<string name="detail_screen_sticker_info_uuid">UUID</string>
<string name="dialog_close">關閉</string>
<string name="import_files_screen_progress_checking_backup_format">檢查備份文件格式中…</string>
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,7 @@
<string name="update_newer_text">New version: %1$s\nPublished on: %2$s\nDownloads: %3$s\n</string>
<string name="download_update">Download</string>
<string name="update_ignore">Ignore this update</string>
<string name="update_check_failed">Check for update failed: %s</string>
<string name="search_result_sort_create_time">Create time</string>
<string name="search_result_sort_modify_time">Modify time</string>
<string name="search_result_sort_tag_count">Number of tags</string>
Expand Down

0 comments on commit 9bba588

Please sign in to comment.