diable/enable loop fixed, reversal sale records removed after settelement
This commit is contained in:
parent
1d132c481f
commit
83047648b4
1
.gitignore
vendored
1
.gitignore
vendored
@ -14,7 +14,6 @@
|
||||
.cxx
|
||||
local.properties
|
||||
/.idea
|
||||
/.idea
|
||||
/sunmiui-lib
|
||||
/paysdk-lib
|
||||
/app/uat
|
||||
|
||||
3
.idea/.gitignore
vendored
3
.idea/.gitignore
vendored
@ -1,3 +0,0 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
@ -4,10 +4,10 @@
|
||||
<selectionStates>
|
||||
<SelectionState runConfigName="app">
|
||||
<option name="selectionMode" value="DROPDOWN" />
|
||||
<DropdownSelection timestamp="2026-05-07T16:25:07.233027800Z">
|
||||
<DropdownSelection timestamp="2026-09-15T06:58:26.019801800Z">
|
||||
<Target type="DEFAULT_BOOT">
|
||||
<handle>
|
||||
<DeviceId pluginId="PhysicalDevice" identifier="serial=PB0219AQ60954" />
|
||||
<DeviceId pluginId="PhysicalDevice" identifier="serial=PB13216J53652" />
|
||||
</handle>
|
||||
</Target>
|
||||
</DropdownSelection>
|
||||
|
||||
@ -1,62 +0,0 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<profile version="1.0">
|
||||
<option name="myName" value="Project Default" />
|
||||
<inspection_tool class="ComposePreviewDimensionRespectsLimit" enabled="true" level="WARNING" enabled_by_default="true">
|
||||
<option name="composableFile" value="true" />
|
||||
<option name="previewFile" value="true" />
|
||||
</inspection_tool>
|
||||
<inspection_tool class="ComposePreviewMustBeTopLevelFunction" enabled="true" level="ERROR" enabled_by_default="true">
|
||||
<option name="composableFile" value="true" />
|
||||
<option name="previewFile" value="true" />
|
||||
</inspection_tool>
|
||||
<inspection_tool class="ComposePreviewNeedsComposableAnnotation" enabled="true" level="ERROR" enabled_by_default="true">
|
||||
<option name="composableFile" value="true" />
|
||||
<option name="previewFile" value="true" />
|
||||
</inspection_tool>
|
||||
<inspection_tool class="ComposePreviewNotSupportedInUnitTestFiles" enabled="true" level="ERROR" enabled_by_default="true">
|
||||
<option name="composableFile" value="true" />
|
||||
<option name="previewFile" value="true" />
|
||||
</inspection_tool>
|
||||
<inspection_tool class="GlancePreviewDimensionRespectsLimit" enabled="true" level="WARNING" enabled_by_default="true">
|
||||
<option name="composableFile" value="true" />
|
||||
</inspection_tool>
|
||||
<inspection_tool class="GlancePreviewMustBeTopLevelFunction" enabled="true" level="ERROR" enabled_by_default="true">
|
||||
<option name="composableFile" value="true" />
|
||||
</inspection_tool>
|
||||
<inspection_tool class="GlancePreviewNeedsComposableAnnotation" enabled="true" level="ERROR" enabled_by_default="true">
|
||||
<option name="composableFile" value="true" />
|
||||
</inspection_tool>
|
||||
<inspection_tool class="GlancePreviewNotSupportedInUnitTestFiles" enabled="true" level="ERROR" enabled_by_default="true">
|
||||
<option name="composableFile" value="true" />
|
||||
</inspection_tool>
|
||||
<inspection_tool class="PreviewAnnotationInFunctionWithParameters" enabled="true" level="ERROR" enabled_by_default="true">
|
||||
<option name="composableFile" value="true" />
|
||||
<option name="previewFile" value="true" />
|
||||
</inspection_tool>
|
||||
<inspection_tool class="PreviewApiLevelMustBeValid" enabled="true" level="ERROR" enabled_by_default="true">
|
||||
<option name="composableFile" value="true" />
|
||||
<option name="previewFile" value="true" />
|
||||
</inspection_tool>
|
||||
<inspection_tool class="PreviewDeviceShouldUseNewSpec" enabled="true" level="WEAK WARNING" enabled_by_default="true">
|
||||
<option name="composableFile" value="true" />
|
||||
<option name="previewFile" value="true" />
|
||||
</inspection_tool>
|
||||
<inspection_tool class="PreviewFontScaleMustBeGreaterThanZero" enabled="true" level="ERROR" enabled_by_default="true">
|
||||
<option name="composableFile" value="true" />
|
||||
<option name="previewFile" value="true" />
|
||||
</inspection_tool>
|
||||
<inspection_tool class="PreviewMultipleParameterProviders" enabled="true" level="ERROR" enabled_by_default="true">
|
||||
<option name="composableFile" value="true" />
|
||||
<option name="previewFile" value="true" />
|
||||
</inspection_tool>
|
||||
<inspection_tool class="PreviewParameterProviderOnFirstParameter" enabled="true" level="ERROR" enabled_by_default="true">
|
||||
<option name="composableFile" value="true" />
|
||||
<option name="previewFile" value="true" />
|
||||
</inspection_tool>
|
||||
<inspection_tool class="PreviewPickerAnnotation" enabled="true" level="ERROR" enabled_by_default="true">
|
||||
<option name="composableFile" value="true" />
|
||||
<option name="previewFile" value="true" />
|
||||
</inspection_tool>
|
||||
<inspection_tool class="UsePropertyAccessSyntax" enabled="true" level="WEAK WARNING" enabled_by_default="true" />
|
||||
</profile>
|
||||
</component>
|
||||
@ -1,10 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="temurin-21" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/build/classes" />
|
||||
</component>
|
||||
<component name="ProjectType">
|
||||
<option name="id" value="Android" />
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="temurin-21" project-jdk-type="JavaSDK" />
|
||||
</project>
|
||||
@ -168,6 +168,7 @@ fun AppNavGraph(
|
||||
|
||||
LaunchedEffect(tmsSetupUiState.isTerminalDisabled) {
|
||||
if (tmsSetupUiState.isTerminalDisabled) {
|
||||
tmsSetupViewModel.clearTerminalDisabledState()
|
||||
navController.navigate(Routes.TmsSetup.route) {
|
||||
popUpTo(Routes.Dashboard.route) {
|
||||
inclusive = true
|
||||
|
||||
@ -44,6 +44,10 @@ fun TmsSetupRoute(
|
||||
) {
|
||||
val state by viewModel.uiState.collectAsState()
|
||||
|
||||
LaunchedEffect(viewModel) {
|
||||
viewModel.initialize()
|
||||
}
|
||||
|
||||
LaunchedEffect(viewModel) {
|
||||
viewModel.navigateToDashboard.collect { onNavigateDashboard() }
|
||||
}
|
||||
|
||||
@ -49,7 +49,7 @@ class TmsSetupViewModel @Inject constructor(
|
||||
private val emvParamOperation: EmvParamOperation,
|
||||
@ApplicationContext private val context: Context
|
||||
) : ViewModel() {
|
||||
private val TAG = TmsSetupViewModel::class.simpleName;
|
||||
private val TAG = TmsSetupViewModel::class.simpleName
|
||||
private val _uiState = MutableStateFlow(TmsSetupUiState())
|
||||
private val _dashboardUiState = MutableStateFlow(DashboardUiState())
|
||||
val uiState: StateFlow<TmsSetupUiState> = _uiState.asStateFlow()
|
||||
@ -65,8 +65,14 @@ class TmsSetupViewModel @Inject constructor(
|
||||
|
||||
private val disposables = CompositeDisposable()
|
||||
private val tmsSetups = TMSSetupsImpl()
|
||||
private var requestInProgress = false
|
||||
|
||||
private var initialized = false
|
||||
|
||||
fun initialize() {
|
||||
if (initialized) return
|
||||
initialized = true
|
||||
|
||||
init {
|
||||
viewModelScope.launch {
|
||||
waitForHardware()
|
||||
TMSUtil.getInstance().generateFinalVersion()
|
||||
@ -75,20 +81,29 @@ class TmsSetupViewModel @Inject constructor(
|
||||
}
|
||||
|
||||
fun downloadConfigs(onSuccess: () -> Unit = {}) {
|
||||
// Do not use isLoading here because it also covers the hardware startup phase.
|
||||
if (requestInProgress) return
|
||||
requestInProgress = true
|
||||
|
||||
_uiState.update {
|
||||
it.copy(isLoading = true, isError = false, statusText = "Connecting to TMS server...")
|
||||
it.copy(
|
||||
isLoading = true,
|
||||
isError = false,
|
||||
isTerminalDisabled = false,
|
||||
statusText = "Connecting to TMS server..."
|
||||
)
|
||||
}
|
||||
|
||||
val disposable = repository.getParams(buildRequest())
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.doFinally { requestInProgress = false }
|
||||
.subscribe(
|
||||
{ response ->
|
||||
_uiState.update { it.copy(
|
||||
statusText = "Applying configuration...")
|
||||
}
|
||||
|
||||
|
||||
val appResponse = SiriusResponse(
|
||||
serial = response.serial.orEmpty(),
|
||||
ecrKey = response.ecrKey.orEmpty(),
|
||||
@ -111,7 +126,6 @@ class TmsSetupViewModel @Inject constructor(
|
||||
"Empty error response (${error.code()})"
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
// Server returned non-JSON (HTML 404 page, plain text, etc.)
|
||||
"Server error: ${error.code()}"
|
||||
}
|
||||
} else {
|
||||
@ -138,7 +152,6 @@ class TmsSetupViewModel @Inject constructor(
|
||||
delay(500.milliseconds)
|
||||
elapsed += 500
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private fun onConfigApplied(onSuccess: () -> Unit) {
|
||||
@ -148,6 +161,7 @@ class TmsSetupViewModel @Inject constructor(
|
||||
LogUtil.d(TAG, "isActive ${ops.isActive}")
|
||||
val msg = ops.disabledMsg.takeIf { it.isNotEmpty() }
|
||||
?: "This terminal has been disabled. Please contact your administrator."
|
||||
|
||||
_uiState.update {
|
||||
it.copy(
|
||||
isLoading = false,
|
||||
@ -157,6 +171,11 @@ class TmsSetupViewModel @Inject constructor(
|
||||
errorMessage = msg
|
||||
)
|
||||
}
|
||||
|
||||
// FIX 2: Actually trigger the navigation event so the UI leaves this screen
|
||||
viewModelScope.launch {
|
||||
_navigateToDisable.emit(msg)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
@ -188,6 +207,10 @@ class TmsSetupViewModel @Inject constructor(
|
||||
viewModelScope.launch { _navigateToDashboard.emit(Unit) }
|
||||
}
|
||||
|
||||
fun clearTerminalDisabledState() {
|
||||
_uiState.update { it.copy(isTerminalDisabled = false) }
|
||||
}
|
||||
|
||||
@SuppressLint("MissingPermission")
|
||||
private fun buildRequest(): SiriusRequest {
|
||||
return try {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user