RobinTan1024 пре 4 година
родитељ
комит
f536c939b2

+ 8 - 0
app/src/main/java/com/doverfuelingsolutions/issp/fusion/FusionError.kt

@@ -0,0 +1,8 @@
+package com.doverfuelingsolutions.issp.fusion
+
+enum class FusionError(val value: Int) {
+    Success(0),
+    Timeout(1),
+    Login(2),
+    GetNozzleInfo(3),
+}

+ 22 - 10
app/src/main/java/com/doverfuelingsolutions/issp/fusion/FusionManager.kt

@@ -3,11 +3,12 @@ package com.doverfuelingsolutions.issp.fusion
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.LifecycleObserver
 import androidx.lifecycle.OnLifecycleEvent
+import com.doverfuelingsolutions.issp.R
 import com.doverfuelingsolutions.issp.api.FuelInfoApi
-import com.doverfuelingsolutions.issp.api.CloudApi
 import com.doverfuelingsolutions.issp.api.entity.NozzleInfo
 import com.doverfuelingsolutions.issp.data.DataStore
 import com.doverfuelingsolutions.issp.fusion.callback.OnFusionEvent
+import com.doverfuelingsolutions.issp.utils.StringUtil
 import com.doverfuelingsolutions.issp.utils.log.DFSLog
 import com.doverfuelingsolutions.issp.utils.sp.SPKeys
 import com.doverfuelingsolutions.issp.utils.sp.SPUtil
@@ -18,10 +19,7 @@ import com.wayne.www.waynelib.fdc.OnFdcServiceResponseReceivedListener
 import com.wayne.www.waynelib.fdc.message.FdcMessage
 import com.wayne.www.waynelib.fdc.message.ServiceResponse
 import com.wayne.www.waynelib.fdc.message.ServiceResponseLogOn
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.delay
-import kotlinx.coroutines.launch
+import kotlinx.coroutines.*
 import kotlin.coroutines.resume
 import kotlin.coroutines.suspendCoroutine
 
@@ -29,18 +27,21 @@ object FusionManager : LifecycleObserver, OnFdcClientStateChangedListener,
     OnFdcServiceResponseReceivedListener,
     OnFdcMessageReceivedListener {
 
-    private var stateFusion: FdcClient.FdcClientState = FdcClient.FdcClientState.Stopped
+    private var mStateFusion: FdcClient.FdcClientState = FdcClient.FdcClientState.Stopped
+    private var mIsLogin = false
     private val nozzleList = arrayListOf<NozzleInfo>()
 
     private val coroutineIO = CoroutineScope(Dispatchers.IO)
 
+    val stateFusion: FdcClient.FdcClientState get() = mStateFusion
+    val isLogin: Boolean get() = mIsLogin
     var onFusionEvent: OnFusionEvent? = null
 
     override fun onFdcClientStateChanged(sender: FdcClient?, state: FdcClient.FdcClientState?) {
         DFSLog.i("Fusion: state = ${state?.name}")
         if (sender == null || state == null) return
 
-        stateFusion = state
+        mStateFusion = state
         when (state) {
             FdcClient.FdcClientState.Connected -> loginFetchInfo()
             else -> {}
@@ -71,6 +72,13 @@ object FusionManager : LifecycleObserver, OnFdcClientStateChangedListener,
             SPUtil.getString(SPKeys.MIDDLE_WORKSTATION_ID).toInt(),
             null
         )
+
+        coroutineIO.launch {
+            delay(12000)
+            if (mStateFusion == FdcClient.FdcClientState.Stopped && !mIsLogin) {
+                onFusionEvent?.onFusionInit(FusionError.Timeout, StringUtil.get(R.string.connect_timeout))
+            }
+        }
     }
 
     @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
@@ -91,20 +99,24 @@ object FusionManager : LifecycleObserver, OnFdcClientStateChangedListener,
             val success = if (login()) true else {
                 DFSLog.d("Fusion: retry login after logout")
                 logout()
-                delay(10000)
+                delay(7000)
                 login()
             }
             if (!success) {
-                onFusionEvent?.onLogin(false)
+                mIsLogin = false
+                onFusionEvent?.onFusionInit(FusionError.Login, StringUtil.get(R.string.login_fail))
                 return@launch
             } else {
-                onFusionEvent?.onLogin(true)
+                mIsLogin = true
             }
 
             val resultNozzles = FuelInfoApi.getNozzleInfo()
             if (resultNozzles.success && resultNozzles.data != null) {
                 if (nozzleList.isNotEmpty()) nozzleList.clear()
                 nozzleList.addAll(resultNozzles.data)
+                onFusionEvent?.onFusionInit(FusionError.Success)
+            } else {
+                onFusionEvent?.onFusionInit(FusionError.GetNozzleInfo, StringUtil.get(R.string.fail_get_nozzle))
             }
         }
     }

+ 3 - 1
app/src/main/java/com/doverfuelingsolutions/issp/fusion/callback/OnFusionEvent.kt

@@ -1,6 +1,8 @@
 package com.doverfuelingsolutions.issp.fusion.callback
 
+import com.doverfuelingsolutions.issp.fusion.FusionError
+
 interface OnFusionEvent {
 
-    fun onLogin(success: Boolean, msg: String = "")
+    fun onFusionInit(code: FusionError, msg: String = "")
 }

+ 4 - 2
app/src/main/java/com/doverfuelingsolutions/issp/view/MainActivity.kt

@@ -39,8 +39,6 @@ class MainActivity : AppCompatActivity(), NavController.OnDestinationChangedList
         mNavController.addOnDestinationChangedListener(this)
         val appBarConfiguration = AppBarConfiguration(mNavController.graph)
         materialToolbar.setupWithNavController(mNavController, appBarConfiguration)
-
-        // lifecycle.addObserver(FusionManager)
     }
 
     override fun onResume() {
@@ -54,6 +52,10 @@ class MainActivity : AppCompatActivity(), NavController.OnDestinationChangedList
         mNavController.removeOnDestinationChangedListener(this)
     }
 
+    override fun onNavigateUp(): Boolean {
+        return super.onNavigateUp()
+    }
+
     override fun onDestinationChanged(controller: NavController, destination: NavDestination, arguments: Bundle?) {
         if (destination.label == StringUtil.get(R.string.app_name)) {
             supportActionBar?.hide()

+ 1 - 1
app/src/main/java/com/doverfuelingsolutions/issp/view/fragment/FragmentLogin.kt

@@ -74,7 +74,7 @@ class FragmentLogin : Fragment(), View.OnClickListener {
                 accountName.isNullOrBlank() || password.isNullOrBlank() -> snackbar.setText(R.string.input_not_right).show()
                 else -> {
                     val result = CloudApi.login(accountName, password)
-                    if (!result.success) snackbar.setText(StringUtil.get(R.string.login_fail, result.message)).show()
+                    if (!result.success) snackbar.setText(StringUtil.get(R.string.login_fail_reason, result.message)).show()
                     else {
                         globalViewModel.isLogin.value = true
                         findNavController().previousBackStackEntry?.savedStateHandle?.set(KEY_LOGIN_RESULT, true)

+ 47 - 17
app/src/main/java/com/doverfuelingsolutions/issp/view/fragment/FragmentMain.kt

@@ -1,33 +1,44 @@
 package com.doverfuelingsolutions.issp.view.fragment
 
+import android.content.DialogInterface
 import android.net.Uri
 import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
+import androidx.appcompat.app.AlertDialog
 import androidx.databinding.DataBindingUtil
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.activityViewModels
 import androidx.fragment.app.viewModels
 import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.ViewModel
+import androidx.lifecycle.lifecycleScope
+import androidx.navigation.NavController
+import androidx.navigation.Navigation
 import androidx.navigation.fragment.findNavController
 import com.doverfuelingsolutions.issp.R
 import com.doverfuelingsolutions.issp.data.DataStore
 import com.doverfuelingsolutions.issp.databinding.FragmentMainBinding
-import com.doverfuelingsolutions.issp.utils.log.DFSLog
+import com.doverfuelingsolutions.issp.fusion.FusionError
+import com.doverfuelingsolutions.issp.fusion.FusionManager
+import com.doverfuelingsolutions.issp.fusion.callback.OnFusionEvent
+import com.doverfuelingsolutions.issp.utils.StringUtil
 import com.doverfuelingsolutions.issp.view.MainActivity
 import com.google.android.material.dialog.MaterialAlertDialogBuilder
 import com.youth.banner.adapter.BannerImageAdapter
 import com.youth.banner.holder.BannerImageHolder
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.launch
 import java.io.File
 
-class FragmentMain : Fragment() {
+class FragmentMain : Fragment(), OnFusionEvent {
 
     private val globalViewModel: MainActivity.GlobalViewModel by activityViewModels()
     private val mainViewModel: MainViewModel by viewModels()
 
     private lateinit var binding: FragmentMainBinding
+    private val controllerMain: NavController by lazy { Navigation.findNavController(binding.navMain) }
 
     override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
         binding = DataBindingUtil.inflate(inflater, R.layout.fragment_main, container, false)
@@ -44,34 +55,53 @@ class FragmentMain : Fragment() {
                     if (!it) {
                         findNavController().navigate(R.id.action_fragmentMain_to_fragmentLogin)
                     } else {
-                        initialize()
+                        initView()
+                        initFusion()
                     }
                 })
             }
             else -> {
-                context?.let {
-                    MaterialAlertDialogBuilder(it)
-                        .setTitle(resources.getString(R.string.login_tip))
-                        .setMessage(R.string.login_tip_detail)
-                        .setPositiveButton(resources.getString(R.string.confirm)) { _, _ ->
-                            findNavController().navigate(R.id.action_fragmentMain_to_fragmentLogin)
-                        }
-                        .setNegativeButton(R.string.cancel) { _, _ ->
-                            activity?.onBackPressed()
-                        }
-                        .setCancelable(false)
-                        .show()
-                }
+                MaterialAlertDialogBuilder(requireContext())
+                    .setTitle(resources.getString(R.string.login_tip))
+                    .setMessage(R.string.login_tip_detail)
+                    .setPositiveButton(resources.getString(R.string.confirm)) { _, _ ->
+                        findNavController().navigate(R.id.action_fragmentMain_to_fragmentLogin)
+                    }
+                    .setNegativeButton(R.string.cancel) { _, _ ->
+                        activity?.onBackPressed()
+                    }
+                    .setCancelable(false)
+                    .show()
             }
         }
     }
 
-    private fun initialize() {
+    override fun onFusionInit(code: FusionError, msg: String) {
+        lifecycleScope.launch {
+            if (code != FusionError.Success) {
+                MaterialAlertDialogBuilder(requireContext())
+                    .setTitle(R.string.tip_opt_fail)
+                    .setCancelable(false)
+                    .setMessage(StringUtil.get(R.string.tip_connect_fail_reason_config, msg))
+                    .setPositiveButton(R.string.go_check) { _, _ ->
+                        controllerMain.navigate(R.id.action_mainType_to_mainPreference)
+                    }
+                    .show()
+            }
+        }
+    }
+
+    private fun initView() {
         mainViewModel.stationName.value = DataStore.buName
         if (DataStore.stationLogoFile.isNotEmpty()) binding.stationLogo.setImageURI(Uri.fromFile(File(context?.filesDir, DataStore.stationLogoFile)))
         initBanner()
     }
 
+    private fun initFusion() {
+        FusionManager.onFusionEvent = this
+        lifecycle.addObserver(FusionManager)
+    }
+
     private fun initBanner() {
         binding.banner.run {
             addBannerLifecycleObserver(this@FragmentMain)

+ 1 - 0
app/src/main/res/layout/fragment_main.xml

@@ -78,6 +78,7 @@
                 android:layout_width="match_parent"
                 android:layout_height="0dp"
                 android:layout_weight="2"
+                app:defaultNavHost="true"
                 app:navGraph="@navigation/nav_business" />
         </LinearLayout>
     </LinearLayout>

+ 9 - 2
app/src/main/res/navigation/nav_business.xml

@@ -3,11 +3,18 @@
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:id="@+id/nav_main"
-    app:startDestination="@id/mainSelect">
+    app:startDestination="@id/mainType">
 
     <fragment
-        android:id="@+id/mainSelect"
+        android:id="@+id/mainType"
         android:name="com.doverfuelingsolutions.issp.view.fragment.FragmentSearchType"
         android:label="@string/app_name">
+        <action
+            android:id="@+id/action_mainType_to_mainPreference"
+            app:destination="@id/mainPreference" />
     </fragment>
+    <fragment
+        android:id="@+id/mainPreference"
+        android:name="com.doverfuelingsolutions.issp.view.fragment.FragmentPreferenceWrapper"
+        android:label="@string/preference" />
 </navigation>

+ 10 - 1
app/src/main/res/values/strings.xml

@@ -13,7 +13,8 @@
 
     <string name="in_login">登录中&#8230;</string>
     <string name="in_loading">加载中&#8230;</string>
-    <string name="login_fail">登录失败:%1$s</string>
+    <string name="login_fail_reason">登录失败:%1$s</string>
+    <string name="login_fail">登录失败</string>
     <string name="login_tip">登录提示</string>
     <string name="login_tip_detail">请先登录</string>
     <string name="input_not_right">填写数据不正确</string>
@@ -24,6 +25,8 @@
     <string name="bu_null">BU值为空</string>
     <string name="req_fail">请求失败</string>
     <string name="fail_save_file">保存文件失败</string>
+    <string name="tip_wait">请稍候</string>
+    <string name="tip_opt_fail">操作失败</string>
 
     <string name="device_info">设备信息</string>
     <string name="device_hardware_sn">设备硬件编码</string>
@@ -51,6 +54,12 @@
     <string name="device_num_is">设备编码:%1$s</string>
     <string name="version_is">版本号:%1$s</string>
 
+    <string name="in_connect_fusion">正在连接中控系统&#8230;</string>
+    <string name="tip_connect_fail_reason_config">连接中控系统异常信息:%1$s,请检查应用设置是否正确</string>
+    <string name="fail_get_nozzle">获取枪油品信息失败</string>
+    <string name="connect_timeout">连接中控超时</string>
+    <string name="go_check">前往检查</string>
+
     <string name="format_date">yyyy-MM-dd HH:mm:ss</string>
 
     <string name="example_format_date">2020–12–25 12:25:00</string>