Pārlūkot izejas kodu

feat 增加loading

RobinTan1024 4 gadi atpakaļ
vecāks
revīzija
57d6610ed1
36 mainītis faili ar 644 papildinājumiem un 664 dzēšanām
  1. 0 5
      app/build.gradle
  2. 4 2
      app/src/main/AndroidManifest.xml
  3. 11 11
      app/src/main/java/com/doverfuelingsolutions/issp/api/CloudApi.kt
  4. 1 1
      app/src/main/java/com/doverfuelingsolutions/issp/api/WayneApiConfig.kt
  5. 4 4
      app/src/main/java/com/doverfuelingsolutions/issp/api/basic/AuthInterceptor.kt
  6. 0 65
      app/src/main/java/com/doverfuelingsolutions/issp/data/DataStore.kt
  7. 25 0
      app/src/main/java/com/doverfuelingsolutions/issp/data/GlobalData.kt
  8. 4 5
      app/src/main/java/com/doverfuelingsolutions/issp/data/GlobalDataInitializer.kt
  9. 24 0
      app/src/main/java/com/doverfuelingsolutions/issp/data/GlobalDataProvider.kt
  10. 5 5
      app/src/main/java/com/doverfuelingsolutions/issp/fusion/FusionManager.kt
  11. 2 2
      app/src/main/java/com/doverfuelingsolutions/issp/utils/DeviceUtil.kt
  12. 4 4
      app/src/main/java/com/doverfuelingsolutions/issp/utils/sp/SPUtil.kt
  13. 81 0
      app/src/main/java/com/doverfuelingsolutions/issp/view/LoginActivity.kt
  14. 68 48
      app/src/main/java/com/doverfuelingsolutions/issp/view/MainActivity.kt
  15. 4 4
      app/src/main/java/com/doverfuelingsolutions/issp/view/PreferenceActivity.kt
  16. 38 0
      app/src/main/java/com/doverfuelingsolutions/issp/view/fragment/FragmentInit.kt
  17. 0 95
      app/src/main/java/com/doverfuelingsolutions/issp/view/fragment/FragmentLogin.kt
  18. 0 121
      app/src/main/java/com/doverfuelingsolutions/issp/view/fragment/FragmentMain.kt
  19. 0 10
      app/src/main/java/com/doverfuelingsolutions/issp/view/fragment/FragmentPreferenceWrapper.kt
  20. 4 7
      app/src/main/java/com/doverfuelingsolutions/issp/view/fragment/FragmentSelect.kt
  21. 0 45
      app/src/main/java/com/doverfuelingsolutions/issp/view/fragment/FragmentStart.kt
  22. 87 0
      app/src/main/res/layout/activity_login.xml
  23. 64 25
      app/src/main/res/layout/activity_main.xml
  24. 1 1
      app/src/main/res/layout/activity_preference.xml
  25. 64 0
      app/src/main/res/layout/fragment_init.xml
  26. 62 62
      app/src/main/res/layout/fragment_login.xml
  27. 57 58
      app/src/main/res/layout/fragment_main.xml
  28. 1 1
      app/src/main/res/layout/fragment_search_type.xml
  29. 0 27
      app/src/main/res/layout/fragment_start.xml
  30. 24 0
      app/src/main/res/layout/layout_loading.xml
  31. 0 20
      app/src/main/res/navigation/nav_business.xml
  32. 0 30
      app/src/main/res/navigation/nav_main.xml
  33. 1 1
      app/src/main/res/values-night/themes.xml
  34. 3 1
      app/src/main/res/values/strings.xml
  35. 1 1
      app/src/main/res/values/themes.xml
  36. 0 3
      build.gradle

+ 0 - 5
app/build.gradle

@@ -3,7 +3,6 @@ plugins {
     id 'kotlin-android'
     id 'kotlin-android-extensions'
     id 'kotlin-kapt'
-    id 'androidx.navigation.safeargs.kotlin'
 }
 
 android {
@@ -52,10 +51,6 @@ dependencies {
     androidTestImplementation 'androidx.test.ext:junit:1.1.2'
     androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
 
-    def nav_version = "2.3.2"
-    implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
-    implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
-
     implementation project(':waynelib_')
 
     def retrofitVersion = '2.9.0'

+ 4 - 2
app/src/main/AndroidManifest.xml

@@ -17,13 +17,15 @@
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
         android:theme="@style/Theme.Issp">
-        <activity android:name=".view.MainActivity">
+        <activity android:name=".view.LoginActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
 
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
+        <activity android:name=".view.MainActivity" />
+        <activity android:name=".view.PreferenceActivity" android:label="@string/preference" />
 
         <provider
             android:name="androidx.startup.InitializationProvider"
@@ -31,7 +33,7 @@
             android:exported="false"
             tools:node="merge">
             <meta-data
-                android:name="com.doverfuelingsolutions.issp.data.DataStoreInitializer"
+                android:name="com.doverfuelingsolutions.issp.data.GlobalDataInitializer"
                 android:value="androidx.startup" />
         </provider>
     </application>

+ 11 - 11
app/src/main/java/com/doverfuelingsolutions/issp/api/CloudApi.kt

@@ -9,7 +9,7 @@ import com.doverfuelingsolutions.issp.api.service.ServiceBase
 import com.doverfuelingsolutions.issp.api.service.ServiceConfig
 import com.doverfuelingsolutions.issp.api.service.ServiceLogin
 import com.doverfuelingsolutions.issp.api.service.ServiceTrx
-import com.doverfuelingsolutions.issp.data.DataStore
+import com.doverfuelingsolutions.issp.data.GlobalData
 import com.doverfuelingsolutions.issp.utils.StringUtil
 import com.doverfuelingsolutions.issp.utils.log.DFSLog
 import com.wayne.www.waynelib.webservice.entity.ClientPosTrx
@@ -72,10 +72,10 @@ object CloudApi {
                     it.resume(DFSResult.fail(R.string.account_name_password_error))
                     return
                 } else if (body != null) {
-                    DataStore.accountName = accountName
-                    DataStore.password = password
-                    DataStore.accessToken = body.access_token
-                    DataStore.accessTokenExpire = System.currentTimeMillis() + body.expires_in.toLong() * 1000
+                    GlobalData.accountName.set(accountName)
+                    GlobalData.password.set(password)
+                    GlobalData.accessToken.set(body.access_token)
+                    GlobalData.accessTokenExpire.set((System.currentTimeMillis() + body.expires_in.toLong() * 1000).toString())
                     // [{\"Id\":\"dfc5cc2d-a5ef-4bc4-b1b0-4aa0c82a73de\",\"Name\":\"GlobalUnit\"}]
                     if (body.BusinessUnits.isNotBlank()) {
                         val jsonArray = JSONArray(body.BusinessUnits)
@@ -84,8 +84,8 @@ object CloudApi {
                             if (!obj.isNull("Id") && !obj.isNull("Name")) {
                                 val buId = obj.optString("Id")
                                 val buName = obj.optString("Name")
-                                DataStore.buId = buId
-                                DataStore.buName = buName
+                                GlobalData.businessId.set(buId)
+                                GlobalData.businessName.set(buName)
                                 it.resume(DFSResult.success(body))
                                 return
                             }
@@ -121,14 +121,14 @@ object CloudApi {
     }
 
     private suspend fun deviceSessionInfo() = suspendCoroutine<DFSResult<ResultDeviceSessionInfo>> {
-        serviceBase.deviceSessionInfo(DataStore.sn).enqueue(object : Callback<ResultDeviceSessionInfo> {
+        serviceBase.deviceSessionInfo(GlobalData.serialNumber.get()).enqueue(object : Callback<ResultDeviceSessionInfo> {
             override fun onResponse(call: Call<ResultDeviceSessionInfo>, response: Response<ResultDeviceSessionInfo>) {
                 val code = response.code()
                 val body = response.body()
                 if (code != 200 || body == null) {
                     it.resume(DFSResult.fail(R.string.return_data_error))
                 } else {
-                    DataStore.stationTel = body.phoneNumber
+                    GlobalData.stationTel.set(body.phoneNumber)
                     it.resume(DFSResult.success(body))
                 }
             }
@@ -141,7 +141,7 @@ object CloudApi {
     }
 
     private suspend fun config(type: String) = suspendCoroutine<DFSResult<ResultConfigDescItem>> {
-        serviceConfig.config(DataStore.buId, type).enqueue(object : Callback<Array<ResultConfig>> {
+        serviceConfig.config(GlobalData.businessId.get(), type).enqueue(object : Callback<Array<ResultConfig>> {
             override fun onResponse(call: Call<Array<ResultConfig>>, response: Response<Array<ResultConfig>>) {
                 val code = response.code()
                 val body = response.body()
@@ -198,7 +198,7 @@ object CloudApi {
         if (resultConfig.success && resultConfig.data!!.id.isNotEmpty()) {
             val resultFile = file(resultConfig.data.id)
             if (resultFile.success) {
-                DataStore.stationLogoFile = resultFile.data!!
+                GlobalData.stationLogoFileName.set(resultFile.data!!)
                 return DFSResult.success(resultFile.data)
             }
         }

+ 1 - 1
app/src/main/java/com/doverfuelingsolutions/issp/api/WayneApiConfig.kt

@@ -29,7 +29,7 @@ class WayneApiConfig {
         const val MIDDLE_PORT_DEFAULT = "4711"
         const val MIDDLE_WORKSTATION_ID = "8888"
         // 默认值 - 加油信息
-        const val FUEL_IP_DEFAULT = "192.168.1.88"
+        const val FUEL_IP_DEFAULT = "192.168.1.80"
         const val FUEL_PORT_DEFAULT = "8384"
 
         // 实时值

+ 4 - 4
app/src/main/java/com/doverfuelingsolutions/issp/api/basic/AuthInterceptor.kt

@@ -1,6 +1,6 @@
 package com.doverfuelingsolutions.issp.api.basic
 
-import com.doverfuelingsolutions.issp.data.DataStore
+import com.doverfuelingsolutions.issp.data.GlobalData
 import okhttp3.Interceptor
 import okhttp3.Response
 
@@ -10,9 +10,9 @@ class AuthInterceptor : Interceptor {
         val request = chain.request().newBuilder()
             .addHeader("Content-Type", "application/json")
             .addHeader("Accept", "application/json")
-            .addHeader("DeviceSN", DataStore.sn)
-        if (DataStore.accessToken.isNotBlank()) request.header("Authorization", "Bearer ${DataStore.accessToken}")
-        if (DataStore.buId.isNotBlank()) request.header("CurrentBuId", DataStore.buId)
+            .addHeader("DeviceSN", GlobalData.serialNumber.get())
+        if (GlobalData.accessToken.get().isNotBlank()) request.header("Authorization", "Bearer ${GlobalData.accessToken.get()}")
+        if (GlobalData.businessId.get().isNotBlank()) request.header("CurrentBuId", GlobalData.businessId.get())
         return chain.proceed(request.build())
     }
 }

+ 0 - 65
app/src/main/java/com/doverfuelingsolutions/issp/data/DataStore.kt

@@ -1,65 +0,0 @@
-package com.doverfuelingsolutions.issp.data
-
-import com.doverfuelingsolutions.issp.utils.DeviceUtil
-import com.doverfuelingsolutions.issp.utils.log.DFSLog
-import com.doverfuelingsolutions.issp.utils.sp.SPKeys
-import com.doverfuelingsolutions.issp.utils.sp.SPUtil
-import kotlin.properties.ObservableProperty
-
-object DataStore {
-
-    val sn = DeviceUtil.querySN()
-    val snRaw = DeviceUtil.rawSN()
-
-    var accountName = ""
-        set(value) {
-            field = value
-            SPUtil.putString(SPKeys.ACCOUNT_NAME, value)
-        }
-    var password = ""
-        set(value) {
-            field = value
-            SPUtil.putString(SPKeys.PASSWORD, value)
-        }
-    var accessToken = ""
-        set(value) {
-            field = value
-            SPUtil.putString(SPKeys.ACCESS_TOKEN, value)
-        }
-    var accessTokenExpire = 0L
-        set(value) {
-            field = value
-            SPUtil.putLong(SPKeys.ACCESS_TOKEN_EXPIRE, value)
-        }
-    var buId = ""
-        set(value) {
-            field = value
-            SPUtil.putString(SPKeys.BU_ID, value)
-        }
-    var buName = ""
-        set(value) {
-            field = value
-            SPUtil.putString(SPKeys.BU_NAME, value)
-        }
-    var stationTel = ""
-        set(value) {
-            field = value
-            SPUtil.putString(SPKeys.STATION_TEL, value)
-        }
-    var stationLogoFile = ""
-        set(value) {
-            field = value
-            SPUtil.putString(SPKeys.STATION_LOGO_FILE, value)
-        }
-
-    fun init() {
-        accountName = SPUtil.getString(SPKeys.ACCOUNT_NAME, "")
-        password = SPUtil.getString(SPKeys.PASSWORD, "")
-        accessToken = SPUtil.getString(SPKeys.ACCESS_TOKEN, "")
-        buId = SPUtil.getString(SPKeys.BU_ID, "")
-        buName = SPUtil.getString(SPKeys.BU_NAME, "")
-        accessTokenExpire = SPUtil.getLong(SPKeys.ACCESS_TOKEN_EXPIRE)
-        stationTel = SPUtil.getString(SPKeys.STATION_TEL, "")
-        stationLogoFile = SPUtil.getString(SPKeys.STATION_LOGO_FILE, "")
-    }
-}

+ 25 - 0
app/src/main/java/com/doverfuelingsolutions/issp/data/GlobalData.kt

@@ -0,0 +1,25 @@
+package com.doverfuelingsolutions.issp.data
+
+import com.doverfuelingsolutions.issp.utils.DeviceUtil
+import com.doverfuelingsolutions.issp.utils.sp.SPKeys
+import com.doverfuelingsolutions.issp.utils.sp.SPUtil
+
+object GlobalData {
+
+    val serialNumber = GlobalDataProvider(DeviceUtil.generateSerialNumber(), SPKeys.SN)
+
+    var isLogin = false
+    val accountName = GlobalDataProvider("", SPKeys.ACCOUNT_NAME)
+    val password = GlobalDataProvider("", SPKeys.PASSWORD)
+    val accessToken = GlobalDataProvider("", SPKeys.ACCESS_TOKEN)
+    val accessTokenExpire = GlobalDataProvider("0", SPKeys.ACCESS_TOKEN_EXPIRE)
+
+    val businessId = GlobalDataProvider("", SPKeys.BU_ID)
+    val businessName = GlobalDataProvider("", SPKeys.BU_NAME)
+    val stationTel = GlobalDataProvider("", SPKeys.STATION_TEL)
+    val stationLogoFileName = GlobalDataProvider("", SPKeys.STATION_LOGO_FILE)
+
+    fun init() {
+        isLogin = System.currentTimeMillis() < accessTokenExpire.get().toLong()
+    }
+}

+ 4 - 5
app/src/main/java/com/doverfuelingsolutions/issp/data/DataStoreInitializer.kt → app/src/main/java/com/doverfuelingsolutions/issp/data/GlobalDataInitializer.kt

@@ -3,13 +3,12 @@ package com.doverfuelingsolutions.issp.data
 import android.content.Context
 import androidx.startup.Initializer
 import com.doverfuelingsolutions.issp.utils.DFSUtilsInitializer
-import com.doverfuelingsolutions.issp.utils.log.DFSLog
 
-class DataStoreInitializer : Initializer<DataStore> {
+class GlobalDataInitializer : Initializer<GlobalData> {
 
-    override fun create(context: Context): DataStore {
-        DataStore.init()
-        return DataStore
+    override fun create(context: Context): GlobalData {
+        GlobalData.init()
+        return GlobalData
     }
 
     override fun dependencies(): MutableList<Class<out Initializer<*>>> {

+ 24 - 0
app/src/main/java/com/doverfuelingsolutions/issp/data/GlobalDataProvider.kt

@@ -0,0 +1,24 @@
+package com.doverfuelingsolutions.issp.data
+
+import com.doverfuelingsolutions.issp.utils.sp.SPUtil
+
+class GlobalDataProvider(defaultValue: String, private val sp: String = "") {
+
+    private var value = defaultValue
+    private var isInit = false
+
+    fun get(): String {
+        if (sp.isNotEmpty() && !isInit) {
+            isInit = true
+            value = SPUtil.getString(sp, value)
+        }
+        return value
+    }
+
+    fun set(v: String) {
+        value = v
+        if (sp.isNotEmpty()) {
+            SPUtil.putString(sp, v)
+        }
+    }
+}

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

@@ -6,7 +6,7 @@ import androidx.lifecycle.OnLifecycleEvent
 import com.doverfuelingsolutions.issp.R
 import com.doverfuelingsolutions.issp.api.FuelInfoApi
 import com.doverfuelingsolutions.issp.api.entity.NozzleInfo
-import com.doverfuelingsolutions.issp.data.DataStore
+import com.doverfuelingsolutions.issp.data.GlobalData
 import com.doverfuelingsolutions.issp.fusion.callback.OnFusionEvent
 import com.doverfuelingsolutions.issp.utils.StringUtil
 import com.doverfuelingsolutions.issp.utils.log.DFSLog
@@ -43,7 +43,7 @@ object FusionManager : LifecycleObserver, OnFdcClientStateChangedListener,
 
         mStateFusion = state
         when (state) {
-            FdcClient.FdcClientState.Connected -> loginFetchInfo()
+            FdcClient.FdcClientState.Connected, FdcClient.FdcClientState.MyAddReConnect -> loginFetchInfo()
             else -> {}
         }
     }
@@ -68,7 +68,7 @@ object FusionManager : LifecycleObserver, OnFdcClientStateChangedListener,
         FdcClient.getDefault().start(
             SPUtil.getString(SPKeys.MIDDLE_IP),
             SPUtil.getString(SPKeys.MIDDLE_PORT).toInt(),
-            DataStore.sn,
+            GlobalData.serialNumber.get(),
             SPUtil.getString(SPKeys.MIDDLE_WORKSTATION_ID).toInt(),
             null
         )
@@ -140,9 +140,9 @@ object FusionManager : LifecycleObserver, OnFdcClientStateChangedListener,
 
     private suspend fun logout() = suspendCoroutine<Boolean> {
         FdcClient.getDefault().sendLogOffRequestAsync({ _, response ->
-            val status = response.singleFdcData.fdcStatus
+            val status = response?.singleFdcData?.fdcStatus
             DFSLog.d("Fusion: try logout response = $status")
-            if (status.equals(FusionConstants.CODE_SUCCESS, true)) {
+            if (status != null && status.equals(FusionConstants.CODE_SUCCESS, true)) {
                 DFSLog.d("Fusion: logout succeeded")
                 it.resume(true)
             } else {

+ 2 - 2
app/src/main/java/com/doverfuelingsolutions/issp/utils/DeviceUtil.kt

@@ -10,7 +10,7 @@ class DeviceUtil {
         private const val SN_PREFIX = "QJ_"
         private var sn = ""
 
-        fun querySN(): String {
+        fun generateSerialNumber(): String {
             if (sn.isEmpty()) {
                 // val deviceSN = rawSN()
                 val deviceSN = "4f49a5dbfbf7c6a6" // FIXME 测试代码
@@ -25,6 +25,6 @@ class DeviceUtil {
 
         @SuppressLint("HardwareIds")
         @Suppress("DEPRECATION")
-        fun rawSN(): String = Build.SERIAL
+        fun hardwareSerialNumber(): String = Build.SERIAL
     }
 }

+ 4 - 4
app/src/main/java/com/doverfuelingsolutions/issp/utils/sp/SPUtil.kt

@@ -2,10 +2,10 @@ package com.doverfuelingsolutions.issp.utils.sp
 
 import android.content.Context
 import android.content.SharedPreferences
-import androidx.core.content.edit
 import androidx.preference.PreferenceManager
 import com.doverfuelingsolutions.issp.api.WayneApiConfig
-import com.doverfuelingsolutions.issp.data.DataStore
+import com.doverfuelingsolutions.issp.data.GlobalData
+import com.doverfuelingsolutions.issp.utils.DeviceUtil
 
 object SPUtil {
 
@@ -50,8 +50,8 @@ object SPUtil {
         sp.edit().run {
             putBoolean(SPKeys.FIRST_LAUNCH, false)
 
-            putString(SPKeys.SN, DataStore.sn)
-            putString(SPKeys.SN_RAW, DataStore.snRaw)
+            putString(SPKeys.SN, DeviceUtil.generateSerialNumber())
+            putString(SPKeys.SN_RAW, DeviceUtil.hardwareSerialNumber())
 
             putString(SPKeys.SERVER_DOMAIN, WayneApiConfig.DOMAIN_DEFAULT)
             putString(SPKeys.SERVER_PORT_BASE, WayneApiConfig.PORT_BASE_DEFAULT)

+ 81 - 0
app/src/main/java/com/doverfuelingsolutions/issp/view/LoginActivity.kt

@@ -0,0 +1,81 @@
+package com.doverfuelingsolutions.issp.view
+
+import androidx.appcompat.app.AppCompatActivity
+import android.os.Bundle
+import android.view.View
+import androidx.activity.viewModels
+import androidx.databinding.DataBindingUtil
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.lifecycleScope
+import com.doverfuelingsolutions.issp.R
+import com.doverfuelingsolutions.issp.api.CloudApi
+import com.doverfuelingsolutions.issp.data.GlobalData
+import com.doverfuelingsolutions.issp.databinding.ActivityLoginBinding
+import com.doverfuelingsolutions.issp.utils.PermissionUtil
+import com.doverfuelingsolutions.issp.utils.StringUtil
+import com.google.android.material.snackbar.Snackbar
+import kotlinx.coroutines.launch
+
+class LoginActivity : AppCompatActivity(),
+    View.OnClickListener {
+
+    private val loginViewModel: LoginViewModel by viewModels()
+    private val binding: ActivityLoginBinding by lazy { DataBindingUtil.setContentView(this, R.layout.activity_login) }
+    private val snackbar: Snackbar by lazy {
+        Snackbar.make(binding.loginForm, "", 4000)
+            .apply { anchorView = binding.loginForm }
+    }
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        binding.lifecycleOwner = this
+        binding.loginViewModel = loginViewModel
+        binding.buttonLogin.setOnClickListener(this)
+        binding.buttonPreference.setOnClickListener(this)
+
+        PermissionUtil.requestPermissions(this)
+
+        if (GlobalData.isLogin) startMain()
+    }
+
+    override fun onClick(v: View?) {
+        when (v) {
+            binding.buttonLogin -> submit()
+            binding.buttonPreference -> PreferenceActivity.start(this)
+        }
+    }
+
+    private fun submit() {
+        if (loginViewModel.submitting.value == true) return
+
+        lifecycleScope.launch {
+            loginViewModel.submitting.value = true
+            val accountName = loginViewModel.accountName.value
+            val password = loginViewModel.password.value
+            when {
+                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_reason, result.message)).show()
+                    else {
+                        GlobalData.isLogin = true
+                        startMain()
+                    }
+                }
+            }
+            loginViewModel.submitting.value = false
+        }
+    }
+
+    private fun startMain() {
+        MainActivity.start(this@LoginActivity)
+        finish()
+    }
+
+    class LoginViewModel : ViewModel() {
+        val accountName = MutableLiveData(GlobalData.accountName.get())
+        val password = MutableLiveData(GlobalData.password.get())
+        val submitting = MutableLiveData(false)
+    }
+}

+ 68 - 48
app/src/main/java/com/doverfuelingsolutions/issp/view/MainActivity.kt

@@ -1,49 +1,50 @@
 package com.doverfuelingsolutions.issp.view
 
 import android.content.Context
+import android.content.Intent
+import android.net.Uri
 import android.os.Bundle
-import android.view.inputmethod.InputMethodManager
+import androidx.activity.viewModels
 import androidx.appcompat.app.AppCompatActivity
-import androidx.appcompat.widget.Toolbar
 import androidx.databinding.DataBindingUtil
 import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.ViewModel
-import androidx.navigation.NavController
-import androidx.navigation.NavDestination
-import androidx.navigation.findNavController
-import androidx.navigation.fragment.NavHostFragment
-import androidx.navigation.fragment.findNavController
-import androidx.navigation.ui.AppBarConfiguration
-import androidx.navigation.ui.setupWithNavController
+import androidx.lifecycle.lifecycleScope
 import com.doverfuelingsolutions.issp.R
-import com.doverfuelingsolutions.issp.data.DataStore
+import com.doverfuelingsolutions.issp.data.GlobalData
 import com.doverfuelingsolutions.issp.databinding.ActivityMainBinding
+import com.doverfuelingsolutions.issp.fusion.FusionError
+import com.doverfuelingsolutions.issp.fusion.FusionManager
+import com.doverfuelingsolutions.issp.fusion.callback.OnFusionEvent
 import com.doverfuelingsolutions.issp.utils.ActivityUtil
-import com.doverfuelingsolutions.issp.utils.PermissionUtil
 import com.doverfuelingsolutions.issp.utils.StringUtil
-import com.doverfuelingsolutions.issp.utils.log.DFSLog
-
-class MainActivity : AppCompatActivity(), NavController.OnDestinationChangedListener {
-
-    private val globalViewModel = GlobalViewModel()
-
-    private val mNavController: NavController by lazy {
-        val navHostFragment = supportFragmentManager.findFragmentById(R.id.navActivity) as NavHostFragment
-        navHostFragment.navController
+import com.doverfuelingsolutions.issp.view.fragment.FragmentInit
+import com.doverfuelingsolutions.issp.view.fragment.FragmentSelect
+import com.google.android.material.dialog.MaterialAlertDialogBuilder
+import com.youth.banner.adapter.BannerImageAdapter
+import com.youth.banner.holder.BannerImageHolder
+import kotlinx.coroutines.launch
+import java.io.File
+
+class MainActivity : AppCompatActivity(), OnFusionEvent {
+
+    companion object {
+        fun start(context: Context) {
+            Intent(context, MainActivity::class.java).let { context.startActivity(it) }
+        }
     }
 
-    private lateinit var binding: ActivityMainBinding
+    private val binding: ActivityMainBinding by lazy { DataBindingUtil.setContentView(this, R.layout.activity_main) }
+    private val mainViewModel: MainViewModel by viewModels()
+
+    private val fragmentInit = FragmentInit()
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
-
-        PermissionUtil.requestPermissions(this)
-
-        setSupportActionBar(binding.materialToolbar)
-        mNavController.addOnDestinationChangedListener(this)
-        val appBarConfiguration = AppBarConfiguration(mNavController.graph)
-        binding.materialToolbar.setupWithNavController(mNavController, appBarConfiguration)
+        binding.lifecycleOwner = this
+        binding.mainViewModel = mainViewModel
+        initView()
+        initFusion()
     }
 
     override fun onResume() {
@@ -51,31 +52,50 @@ class MainActivity : AppCompatActivity(), NavController.OnDestinationChangedList
         ActivityUtil.setFullscreen(this)
     }
 
-    override fun onDestroy() {
-        super.onDestroy()
-
-        mNavController.removeOnDestinationChangedListener(this)
+    override fun onFusionInit(code: FusionError, msg: String) {
+        lifecycleScope.launch {
+            if (code != FusionError.Success) {
+                fragmentInit.fail(msg)
+                return@launch
+                MaterialAlertDialogBuilder(this@MainActivity)
+                    .setTitle(R.string.tip_opt_fail)
+                    .setCancelable(false)
+                    .setMessage(StringUtil.get(R.string.tip_connect_fail_reason_config, msg))
+                    .setPositiveButton(R.string.go_check) { _, _ ->
+                        PreferenceActivity.start(this@MainActivity)
+                    }
+                    .show()
+            }
+        }
     }
 
-    override fun onNavigateUp(): Boolean {
-        return super.onNavigateUp()
+    private fun initView() {
+        supportActionBar?.hide()
+        mainViewModel.stationName.value = GlobalData.businessName.get()
+        if (GlobalData.stationLogoFileName.get().isNotEmpty())
+            binding.stationLogo.setImageURI(Uri.fromFile(File(filesDir, GlobalData.stationLogoFileName.get())))
+        binding.banner.run {
+            addBannerLifecycleObserver(this@MainActivity)
+            scrollTime = 500
+            adapter =
+                object : BannerImageAdapter<Int>(listOf(R.mipmap.banner_1, R.mipmap.banner_2)) {
+                    override fun onBindView(holder: BannerImageHolder, data: Int, position: Int, size: Int) {
+                        holder.imageView.setImageResource(data)
+                    }
+                }
+        }
     }
 
-    override fun onDestinationChanged(controller: NavController, destination: NavDestination, arguments: Bundle?) {
-        if (destination.label == StringUtil.get(R.string.app_name)) {
-            supportActionBar?.hide()
-        } else {
-            supportActionBar?.show()
-        }
+    private fun initFusion() {
+        supportFragmentManager.beginTransaction()
+            .add(R.id.fragmentBox, fragmentInit)
+            .commit()
 
-        val inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
-        if (inputMethodManager.isActive) {
-            inputMethodManager.hideSoftInputFromWindow(binding.root.windowToken, 0)
-        }
+        FusionManager.onFusionEvent = this
+        lifecycle.addObserver(FusionManager)
     }
 
-    class GlobalViewModel : ViewModel() {
-
-        val isLogin = MutableLiveData(System.currentTimeMillis() < DataStore.accessTokenExpire)
+    class MainViewModel : ViewModel() {
+        val stationName = MutableLiveData("")
     }
 }

+ 4 - 4
app/src/main/java/com/doverfuelingsolutions/issp/view/SettingsActivity.kt → app/src/main/java/com/doverfuelingsolutions/issp/view/PreferenceActivity.kt

@@ -8,23 +8,23 @@ import androidx.appcompat.app.AppCompatActivity
 import com.doverfuelingsolutions.issp.R
 import com.doverfuelingsolutions.issp.view.fragment.FragmentPreference
 
-class SettingsActivity : AppCompatActivity() {
+class PreferenceActivity : AppCompatActivity() {
 
     companion object {
 
         fun start(context: Context) {
-            Intent(context, SettingsActivity::class.java).let { context.startActivity(it) }
+            Intent(context, PreferenceActivity::class.java).let { context.startActivity(it) }
         }
     }
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-        setContentView(R.layout.settings_activity)
+        setContentView(R.layout.activity_preference)
         supportActionBar?.setDisplayHomeAsUpEnabled(true)
         if (savedInstanceState == null) {
             supportFragmentManager
                 .beginTransaction()
-                .replace(R.id.settings, FragmentPreference())
+                .replace(R.id.container, FragmentPreference())
                 .commit()
         }
     }

+ 38 - 0
app/src/main/java/com/doverfuelingsolutions/issp/view/fragment/FragmentInit.kt

@@ -0,0 +1,38 @@
+package com.doverfuelingsolutions.issp.view.fragment
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.databinding.DataBindingUtil
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.viewModels
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import com.doverfuelingsolutions.issp.R
+import com.doverfuelingsolutions.issp.databinding.FragmentInitBinding
+import com.doverfuelingsolutions.issp.utils.StringUtil
+
+class FragmentInit : Fragment() {
+
+    private lateinit var binding: FragmentInitBinding
+    private val initViewModel: FragmentInitViewModel by viewModels()
+
+    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
+        binding = DataBindingUtil.inflate(inflater, R.layout.fragment_init, container, false)
+        binding.lifecycleOwner = viewLifecycleOwner
+        binding.viewModel = initViewModel
+        return binding.root
+    }
+
+    fun fail(msg: String) {
+        initViewModel.isLoading.value = false
+        initViewModel.failTip.value = StringUtil.get(R.string.tip_connect_fail_reason_config, msg)
+    }
+
+    class FragmentInitViewModel : ViewModel() {
+        val isLoading = MutableLiveData(true)
+        val loadingTip = MutableLiveData(StringUtil.get(R.string.in_connect_fusion))
+        val failTip = MutableLiveData(StringUtil.get(R.string.connect_timeout))
+    }
+}

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

@@ -1,95 +0,0 @@
-package com.doverfuelingsolutions.issp.view.fragment
-
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-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.fragment.findNavController
-import com.doverfuelingsolutions.issp.R
-import com.doverfuelingsolutions.issp.api.CloudApi
-import com.doverfuelingsolutions.issp.data.DataStore
-import com.doverfuelingsolutions.issp.databinding.FragmentLoginBinding
-import com.doverfuelingsolutions.issp.utils.StringUtil
-import com.doverfuelingsolutions.issp.view.MainActivity
-import com.google.android.material.snackbar.Snackbar
-import kotlinx.coroutines.launch
-
-class FragmentLogin : Fragment(), View.OnClickListener {
-
-    companion object {
-
-        const val KEY_LOGIN_RESULT = "loginResult"
-    }
-
-    private val globalViewModel: MainActivity.GlobalViewModel by activityViewModels()
-    private val loginViewModel: LoginViewModel by viewModels()
-
-    private lateinit var binding: FragmentLoginBinding
-    private val snackbar: Snackbar by lazy {
-        Snackbar.make(binding.loginForm, "", 4000)
-            .apply { anchorView = binding.loginForm }
-    }
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-
-        findNavController().previousBackStackEntry?.savedStateHandle?.set(KEY_LOGIN_RESULT, false)
-    }
-
-    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
-        if (!this::binding.isInitialized) {
-            binding = DataBindingUtil.inflate(inflater, R.layout.fragment_login, container, false)
-            binding.lifecycleOwner = this
-            binding.viewModel = loginViewModel
-
-            loginViewModel.accountName.value = DataStore.accountName
-            loginViewModel.password.value = DataStore.password
-            binding.buttonLogin.setOnClickListener(this)
-            binding.buttonPreference.setOnClickListener(this)
-        }
-        return binding.root
-    }
-
-    override fun onClick(v: View?) {
-        when (v) {
-            binding.buttonLogin -> submit()
-            binding.buttonPreference -> findNavController().navigate(R.id.action_fragmentLogin_to_fragmentPreference)
-        }
-    }
-
-    private fun submit() {
-        if (loginViewModel.submitting.value == true) return
-
-        lifecycleScope.launch {
-            loginViewModel.submitting.value = true
-            val accountName = loginViewModel.accountName.value?.trim()
-            val password = loginViewModel.password.value?.trim()
-            when {
-                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_reason, result.message)).show()
-                    else {
-                        globalViewModel.isLogin.value = true
-                        findNavController().previousBackStackEntry?.savedStateHandle?.set(KEY_LOGIN_RESULT, true)
-                        findNavController().popBackStack()
-                    }
-                }
-            }
-            loginViewModel.submitting.value = false
-        }
-    }
-
-    class LoginViewModel : ViewModel() {
-        val accountName = MutableLiveData("")
-        val password = MutableLiveData("")
-        val submitting = MutableLiveData(false)
-    }
-}

+ 0 - 121
app/src/main/java/com/doverfuelingsolutions/issp/view/fragment/FragmentMain.kt

@@ -1,121 +0,0 @@
-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.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(), 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)
-        binding.lifecycleOwner = this
-        binding.mainViewModel = mainViewModel
-
-        return binding.root
-    }
-
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-        when (findNavController().currentBackStackEntry?.savedStateHandle?.get<Boolean>(FragmentLogin.KEY_LOGIN_RESULT)) {
-            null, true -> {
-                globalViewModel.isLogin.observe(viewLifecycleOwner, {
-                    if (!it) {
-                        findNavController().navigate(R.id.action_fragmentMain_to_fragmentLogin)
-                    } else {
-                        initView()
-                        initFusion()
-                    }
-                })
-            }
-            else -> {
-                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()
-            }
-        }
-    }
-
-    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)
-            scrollTime = 500
-            adapter =
-                object : BannerImageAdapter<Int>(listOf(R.mipmap.banner_1, R.mipmap.banner_2)) {
-                    override fun onBindView(holder: BannerImageHolder, data: Int, position: Int, size: Int) {
-                        holder.imageView.setImageResource(data)
-                    }
-                }
-        }
-    }
-
-    class MainViewModel : ViewModel() {
-        val stationName = MutableLiveData("")
-    }
-}

+ 0 - 10
app/src/main/java/com/doverfuelingsolutions/issp/view/fragment/FragmentPreferenceWrapper.kt

@@ -1,16 +1,6 @@
 package com.doverfuelingsolutions.issp.view.fragment
 
-import android.os.Bundle
-import android.text.InputType
-import android.widget.EditText
 import androidx.fragment.app.Fragment
-import androidx.preference.EditTextPreference
-import androidx.preference.Preference
-import androidx.preference.PreferenceFragmentCompat
 import com.doverfuelingsolutions.issp.R
-import com.doverfuelingsolutions.issp.utils.ValidateUtil
-import com.doverfuelingsolutions.issp.utils.log.DFSLog
-import com.doverfuelingsolutions.issp.utils.sp.SPKeys
-import com.google.android.material.snackbar.Snackbar
 
 class FragmentPreferenceWrapper : Fragment(R.layout.fragment_preference_wrapper)

+ 4 - 7
app/src/main/java/com/doverfuelingsolutions/issp/view/fragment/FragmentSearchType.kt → app/src/main/java/com/doverfuelingsolutions/issp/view/fragment/FragmentSelect.kt

@@ -12,14 +12,13 @@ import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.ViewModel
 import com.doverfuelingsolutions.issp.DFSApplication
 import com.doverfuelingsolutions.issp.R
-import com.doverfuelingsolutions.issp.data.DataStore
+import com.doverfuelingsolutions.issp.data.GlobalData
 import com.doverfuelingsolutions.issp.databinding.FragmentSearchTypeBinding
 import com.doverfuelingsolutions.issp.utils.log.DFSLog
 import com.doverfuelingsolutions.issp.view.MainActivity
 
-class FragmentSearchType : Fragment(), View.OnClickListener, View.OnLongClickListener {
+class FragmentSelect : Fragment(), View.OnClickListener, View.OnLongClickListener {
 
-    private val globalViewModel: MainActivity.GlobalViewModel by activityViewModels()
     private val viewModel: SearchTypeViewModel by viewModels()
 
     private lateinit var binding: FragmentSearchTypeBinding
@@ -28,13 +27,11 @@ class FragmentSearchType : Fragment(), View.OnClickListener, View.OnLongClickLis
         binding = DataBindingUtil.inflate(inflater, R.layout.fragment_search_type, container, false)
         binding.lifecycleOwner = this
         binding.viewModel = viewModel
-        return binding.root
-    }
 
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         binding.chooseOil.setOnClickListener(this)
         binding.chooseNozzle.setOnClickListener(this)
         binding.versionNum.setOnLongClickListener(this)
+        return binding.root
     }
 
     override fun onClick(v: View?) {
@@ -54,7 +51,7 @@ class FragmentSearchType : Fragment(), View.OnClickListener, View.OnLongClickLis
     }
 
     class SearchTypeViewModel : ViewModel() {
-        val deviceNum = MutableLiveData(DataStore.sn)
+        val deviceNum = MutableLiveData(GlobalData.serialNumber)
         val version: MutableLiveData<String> by lazy {
             val pm = DFSApplication.instance.applicationContext.packageManager
             val info = pm.getPackageInfo(DFSApplication.instance.applicationContext.packageName, android.content.pm.PackageManager.GET_ACTIVITIES)

+ 0 - 45
app/src/main/java/com/doverfuelingsolutions/issp/view/fragment/FragmentStart.kt

@@ -1,45 +0,0 @@
-package com.doverfuelingsolutions.issp.view.fragment
-
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.fragment.app.Fragment
-import androidx.fragment.app.activityViewModels
-import androidx.navigation.fragment.findNavController
-import com.doverfuelingsolutions.issp.R
-import com.doverfuelingsolutions.issp.utils.log.DFSLog
-import com.doverfuelingsolutions.issp.view.MainActivity
-import kotlinx.android.synthetic.main.fragment_start.*
-
-class FragmentStart : Fragment() {
-
-    private val globalViewModel: MainActivity.GlobalViewModel by activityViewModels()
-
-    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
-        return inflater.inflate(R.layout.fragment_start, container, false)
-    }
-
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-        val loginResult = findNavController().currentBackStackEntry?.savedStateHandle?.get<Boolean>(FragmentLogin.KEY_LOGIN_RESULT)
-        when {
-            loginResult == null -> {
-                globalViewModel.isLogin.observe(viewLifecycleOwner, {
-                })
-            }
-            loginResult -> {
-                initialize()
-            }
-            else -> {
-                // TODO 提示必须登录
-                DFSLog.w("先登录OK?")
-            }
-        }
-
-    }
-
-    private fun initialize() {
-        DFSLog.i("action_fragmentStart_to_fragmentMain")
-        // TODO: init data and Fusion
-    }
-}

+ 87 - 0
app/src/main/res/layout/activity_login.xml

@@ -0,0 +1,87 @@
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools">
+
+    <data>
+
+        <variable
+            name="loginViewModel"
+            type="com.doverfuelingsolutions.issp.view.LoginActivity.LoginViewModel" />
+    </data>
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        style="@style/match"
+        android:background="@mipmap/activity_background"
+        android:focusableInTouchMode="true"
+        android:focusable="true"
+        tools:context=".view.LoginActivity">
+
+        <LinearLayout
+            android:id="@+id/loginForm"
+            style="@style/fullWidth"
+            android:layout_marginStart="200dp"
+            android:layout_marginEnd="200dp"
+            android:gravity="center"
+            android:orientation="vertical"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent">
+
+            <com.google.android.material.textfield.TextInputLayout
+                android:id="@+id/fieldAccount"
+                style="@style/fullWidth"
+                android:hint="@string/account_name"
+                app:boxBackgroundColor="@color/white"
+                app:startIconCheckable="true"
+                app:startIconDrawable="@drawable/ic_user"
+                app:startIconTint="@color/input_icon">
+
+                <com.google.android.material.textfield.TextInputEditText
+                    style="@style/fullWidth"
+                    android:enabled="@{ !loginViewModel.submitting }"
+                    android:inputType="text"
+                    android:text="@={ loginViewModel.accountName }" />
+
+            </com.google.android.material.textfield.TextInputLayout>
+
+            <com.google.android.material.textfield.TextInputLayout
+                android:id="@+id/fieldPassword"
+                style="@style/fullWidth"
+                android:layout_marginTop="40dp"
+                android:layout_marginBottom="80dp"
+                android:hint="@string/password"
+                app:boxBackgroundColor="@color/white"
+                app:startIconDrawable="@drawable/ic_password"
+                app:startIconTint="@color/input_icon">
+
+                <com.google.android.material.textfield.TextInputEditText
+                    style="@style/fullWidth"
+                    android:enabled="@{ !loginViewModel.submitting }"
+                    android:inputType="textPassword"
+                    android:text="@={ loginViewModel.password }" />
+
+            </com.google.android.material.textfield.TextInputLayout>
+
+            <Button
+                android:id="@+id/buttonLogin"
+                style="@style/Widget.MaterialComponents.Button"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:enabled="@{ !loginViewModel.submitting }"
+                android:text="@{ loginViewModel.submitting ? @string/in_login : @string/login }" />
+        </LinearLayout>
+
+        <Button
+            android:id="@+id/buttonPreference"
+            style="@style/Widget.MaterialComponents.Button"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="40dp"
+            android:layout_marginEnd="40dp"
+            android:enabled="@{!loginViewModel.submitting}"
+            android:text="@string/preference"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+    </androidx.constraintlayout.widget.ConstraintLayout>
+</layout>

+ 64 - 25
app/src/main/res/layout/activity_main.xml

@@ -5,39 +5,78 @@
 
     <data>
 
+        <variable
+            name="mainViewModel"
+            type="com.doverfuelingsolutions.issp.view.MainActivity.MainViewModel" />
     </data>
 
-    <androidx.appcompat.widget.LinearLayoutCompat
+    <LinearLayout
         style="@style/match"
-        android:weightSum="1"
         android:background="@mipmap/activity_background"
+        android:focusable="true"
+        android:focusableInTouchMode="true"
         android:orientation="vertical"
+        android:paddingTop="4dp"
         tools:context=".view.MainActivity">
 
-        <com.google.android.material.appbar.AppBarLayout
+        <LinearLayout
             style="@style/fullWidth"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="parent">
+            android:layout_marginStart="30dp"
+            android:layout_marginEnd="30dp"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            android:weightSum="1">
 
-            <com.google.android.material.appbar.MaterialToolbar
-                android:id="@+id/materialToolbar"
-                style="@style/Widget.MaterialComponents.Toolbar.Primary"
+            <ImageView
+                android:id="@+id/stationLogo"
+                android:layout_width="100dp"
+                android:layout_height="100dp"
+                android:contentDescription="@string/app_name"
+                android:src="@mipmap/launcher" />
+
+            <TextView
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="30dp"
+                android:layout_weight="1"
+                android:text="@{mainViewModel.stationName, default=@string/example_company_name}"
+                android:textColor="@color/color333"
+                android:textSize="32sp" />
+
+            <ImageView
+                android:layout_width="32dp"
+                android:layout_height="32dp"
+                android:background="@drawable/ic_time"
+                android:contentDescription="@string/app_name" />
+
+            <TextClock
+                android:id="@+id/textClock"
+                style="@style/wrap"
+                android:layout_marginStart="8dp"
+                android:format12Hour="@string/format_date"
+                android:format24Hour="@string/format_date"
+                android:text="@string/example_format_date"
+                android:textColor="@color/color555"
+                android:textSize="26sp" />
+        </LinearLayout>
+
+        <LinearLayout
+            style="@style/match"
+            android:orientation="vertical"
+            android:weightSum="3">
+
+            <com.youth.banner.Banner
+                android:id="@+id/banner"
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_weight="1"
+                app:banner_loop_time="7000" />
+
+            <androidx.fragment.app.FragmentContainerView
+                android:id="@+id/fragmentBox"
                 android:layout_width="match_parent"
-                android:layout_height="?attr/actionBarSize" />
-
-        </com.google.android.material.appbar.AppBarLayout>
-
-        <androidx.fragment.app.FragmentContainerView
-            android:id="@+id/navActivity"
-            android:name="androidx.navigation.fragment.NavHostFragment"
-            android:layout_width="match_parent"
-            android:layout_height="0dp"
-            android:layout_weight="1"
-            app:defaultNavHost="true"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="parent"
-            app:navGraph="@navigation/nav_main" />
-    </androidx.appcompat.widget.LinearLayoutCompat>
+                android:layout_height="0dp"
+                android:layout_weight="2" />
+        </LinearLayout>
+    </LinearLayout>
 </layout>

+ 1 - 1
app/src/main/res/layout/settings_activity.xml → app/src/main/res/layout/activity_preference.xml

@@ -2,6 +2,6 @@
     style="@style/match">
 
     <FrameLayout
-        android:id="@+id/settings"
+        android:id="@+id/container"
         style="@style/match" />
 </LinearLayout>

+ 64 - 0
app/src/main/res/layout/fragment_init.xml

@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <data>
+
+        <import type="android.view.View" />
+
+        <variable
+            name="viewModel"
+            type="com.doverfuelingsolutions.issp.view.fragment.FragmentInit.FragmentInitViewModel" />
+    </data>
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        style="@style/match">
+
+        <!--loading-->
+        <androidx.appcompat.widget.LinearLayoutCompat
+            android:visibility="@{viewModel.isLoading ? View.VISIBLE : View.GONE}"
+            style="@style/wrap"
+            android:gravity="center"
+            android:orientation="vertical"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent">
+
+            <androidx.core.widget.ContentLoadingProgressBar
+                style="@android:style/Widget.Material.Light.ProgressBar"
+                android:layout_width="52dp"
+                android:layout_height="52dp"
+                android:layout_marginBottom="20dp" />
+
+            <androidx.appcompat.widget.AppCompatTextView
+                style="@style/wrap"
+                android:text="@{viewModel.loadingTip, default=@string/in_loading}"
+                android:textSize="18sp" />
+        </androidx.appcompat.widget.LinearLayoutCompat>
+
+        <!--go preference-->
+        <androidx.appcompat.widget.LinearLayoutCompat
+            android:visibility="@{!viewModel.isLoading ? View.VISIBLE : View.GONE}"
+            style="@style/wrap"
+            android:gravity="center"
+            android:orientation="vertical"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent">
+
+            <androidx.appcompat.widget.AppCompatTextView
+                style="@style/wrap"
+                android:layout_marginBottom="60dp"
+                android:text="@{viewModel.loadingTip, default=@string/tip_connect_fail_reason_config}"
+                android:textSize="26sp" />
+
+            <Button
+                style="@style/Widget.MaterialComponents.Button"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/go_check" />
+        </androidx.appcompat.widget.LinearLayoutCompat>
+    </androidx.constraintlayout.widget.ConstraintLayout>
+</layout>

+ 62 - 62
app/src/main/res/layout/fragment_login.xml

@@ -5,9 +5,9 @@
 
     <data>
 
-        <variable
-            name="viewModel"
-            type="com.doverfuelingsolutions.issp.view.fragment.FragmentLogin.LoginViewModel" />
+<!--        <variable-->
+<!--            name="viewModel"-->
+<!--            type="com.doverfuelingsolutions.issp.view.fragment.FragmentLogin.LoginViewModel" />-->
     </data>
 
     <androidx.constraintlayout.widget.ConstraintLayout
@@ -17,72 +17,72 @@
         android:focusable="true"
         tools:context=".view.LoginActivity">
 
-        <LinearLayout
-            android:id="@+id/loginForm"
-            style="@style/fullWidth"
-            android:layout_marginStart="200dp"
-            android:layout_marginEnd="200dp"
-            android:gravity="center"
-            android:orientation="vertical"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="parent">
+<!--        <LinearLayout-->
+<!--            android:id="@+id/loginForm"-->
+<!--            style="@style/fullWidth"-->
+<!--            android:layout_marginStart="200dp"-->
+<!--            android:layout_marginEnd="200dp"-->
+<!--            android:gravity="center"-->
+<!--            android:orientation="vertical"-->
+<!--            app:layout_constraintBottom_toBottomOf="parent"-->
+<!--            app:layout_constraintEnd_toEndOf="parent"-->
+<!--            app:layout_constraintStart_toStartOf="parent"-->
+<!--            app:layout_constraintTop_toTopOf="parent">-->
 
-            <com.google.android.material.textfield.TextInputLayout
-                android:id="@+id/fieldAccount"
-                style="@style/fullWidth"
-                android:hint="@string/account_name"
-                app:boxBackgroundColor="@color/white"
-                app:startIconCheckable="true"
-                app:startIconDrawable="@drawable/ic_user"
-                app:startIconTint="@color/input_icon">
+<!--            <com.google.android.material.textfield.TextInputLayout-->
+<!--                android:id="@+id/fieldAccount"-->
+<!--                style="@style/fullWidth"-->
+<!--                android:hint="@string/account_name"-->
+<!--                app:boxBackgroundColor="@color/white"-->
+<!--                app:startIconCheckable="true"-->
+<!--                app:startIconDrawable="@drawable/ic_user"-->
+<!--                app:startIconTint="@color/input_icon">-->
 
-                <com.google.android.material.textfield.TextInputEditText
-                    style="@style/fullWidth"
-                    android:enabled="@{ !viewModel.submitting }"
-                    android:inputType="text"
-                    android:text="@={ viewModel.accountName }" />
+<!--                <com.google.android.material.textfield.TextInputEditText-->
+<!--                    style="@style/fullWidth"-->
+<!--                    android:enabled="@{ !viewModel.submitting }"-->
+<!--                    android:inputType="text"-->
+<!--                    android:text="@={ viewModel.accountName }" />-->
 
-            </com.google.android.material.textfield.TextInputLayout>
+<!--            </com.google.android.material.textfield.TextInputLayout>-->
 
-            <com.google.android.material.textfield.TextInputLayout
-                android:id="@+id/fieldPassword"
-                style="@style/fullWidth"
-                android:layout_marginTop="40dp"
-                android:layout_marginBottom="80dp"
-                android:hint="@string/password"
-                app:boxBackgroundColor="@color/white"
-                app:startIconDrawable="@drawable/ic_password"
-                app:startIconTint="@color/input_icon">
+<!--            <com.google.android.material.textfield.TextInputLayout-->
+<!--                android:id="@+id/fieldPassword"-->
+<!--                style="@style/fullWidth"-->
+<!--                android:layout_marginTop="40dp"-->
+<!--                android:layout_marginBottom="80dp"-->
+<!--                android:hint="@string/password"-->
+<!--                app:boxBackgroundColor="@color/white"-->
+<!--                app:startIconDrawable="@drawable/ic_password"-->
+<!--                app:startIconTint="@color/input_icon">-->
 
-                <com.google.android.material.textfield.TextInputEditText
-                    style="@style/fullWidth"
-                    android:enabled="@{ !viewModel.submitting }"
-                    android:inputType="textPassword"
-                    android:text="@={ viewModel.password }" />
+<!--                <com.google.android.material.textfield.TextInputEditText-->
+<!--                    style="@style/fullWidth"-->
+<!--                    android:enabled="@{ !viewModel.submitting }"-->
+<!--                    android:inputType="textPassword"-->
+<!--                    android:text="@={ viewModel.password }" />-->
 
-            </com.google.android.material.textfield.TextInputLayout>
+<!--            </com.google.android.material.textfield.TextInputLayout>-->
 
-            <Button
-                android:id="@+id/buttonLogin"
-                style="@style/Widget.MaterialComponents.Button"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:enabled="@{ !viewModel.submitting }"
-                android:text="@{ viewModel.submitting ? @string/in_login : @string/login }" />
-        </LinearLayout>
+<!--            <Button-->
+<!--                android:id="@+id/buttonLogin"-->
+<!--                style="@style/Widget.MaterialComponents.Button"-->
+<!--                android:layout_width="wrap_content"-->
+<!--                android:layout_height="wrap_content"-->
+<!--                android:enabled="@{ !viewModel.submitting }"-->
+<!--                android:text="@{ viewModel.submitting ? @string/in_login : @string/login }" />-->
+<!--        </LinearLayout>-->
 
-        <Button
-            android:id="@+id/buttonPreference"
-            style="@style/Widget.MaterialComponents.Button"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="40dp"
-            android:layout_marginEnd="40dp"
-            android:enabled="@{!viewModel.submitting}"
-            android:text="@string/preference"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintTop_toTopOf="parent" />
+<!--        <Button-->
+<!--            android:id="@+id/buttonPreference"-->
+<!--            style="@style/Widget.MaterialComponents.Button"-->
+<!--            android:layout_width="wrap_content"-->
+<!--            android:layout_height="wrap_content"-->
+<!--            android:layout_marginTop="40dp"-->
+<!--            android:layout_marginEnd="40dp"-->
+<!--            android:enabled="@{!viewModel.submitting}"-->
+<!--            android:text="@string/preference"-->
+<!--            app:layout_constraintEnd_toEndOf="parent"-->
+<!--            app:layout_constraintTop_toTopOf="parent" />-->
     </androidx.constraintlayout.widget.ConstraintLayout>
 </layout>

+ 57 - 58
app/src/main/res/layout/fragment_main.xml

@@ -5,9 +5,9 @@
 
     <data>
 
-        <variable
-            name="mainViewModel"
-            type="com.doverfuelingsolutions.issp.view.fragment.FragmentMain.MainViewModel" />
+<!--        <variable-->
+<!--            name="mainViewModel"-->
+<!--            type="com.doverfuelingsolutions.issp.view.fragment.FragmentMain.MainViewModel" />-->
     </data>
 
     <LinearLayout
@@ -19,67 +19,66 @@
         android:paddingTop="4dp"
         tools:context=".view.MainActivity">
 
-        <LinearLayout
-            style="@style/fullWidth"
-            android:layout_marginStart="30dp"
-            android:layout_marginEnd="30dp"
-            android:gravity="center_vertical"
-            android:orientation="horizontal"
-            android:weightSum="1">
+<!--        <LinearLayout-->
+<!--            style="@style/fullWidth"-->
+<!--            android:layout_marginStart="30dp"-->
+<!--            android:layout_marginEnd="30dp"-->
+<!--            android:gravity="center_vertical"-->
+<!--            android:orientation="horizontal"-->
+<!--            android:weightSum="1">-->
 
-            <ImageView
-                android:id="@+id/stationLogo"
-                android:layout_width="100dp"
-                android:layout_height="100dp"
-                android:contentDescription="@string/app_name"
-                android:src="@mipmap/launcher" />
+<!--            <ImageView-->
+<!--                android:id="@+id/stationLogo"-->
+<!--                android:layout_width="100dp"-->
+<!--                android:layout_height="100dp"-->
+<!--                android:contentDescription="@string/app_name"-->
+<!--                android:src="@mipmap/launcher" />-->
 
-            <TextView
-                android:layout_width="0dp"
-                android:layout_height="wrap_content"
-                android:layout_marginStart="30dp"
-                android:layout_weight="1"
-                android:text="@{mainViewModel.stationName, default=@string/example_company_name}"
-                android:textColor="@color/color333"
-                android:textSize="32sp" />
+<!--            <TextView-->
+<!--                android:layout_width="0dp"-->
+<!--                android:layout_height="wrap_content"-->
+<!--                android:layout_marginStart="30dp"-->
+<!--                android:layout_weight="1"-->
+<!--                android:text="@{mainViewModel.stationName, default=@string/example_company_name}"-->
+<!--                android:textColor="@color/color333"-->
+<!--                android:textSize="32sp" />-->
 
-            <ImageView
-                android:layout_width="32dp"
-                android:layout_height="32dp"
-                android:background="@drawable/ic_time"
-                android:contentDescription="@string/app_name" />
+<!--            <ImageView-->
+<!--                android:layout_width="32dp"-->
+<!--                android:layout_height="32dp"-->
+<!--                android:background="@drawable/ic_time"-->
+<!--                android:contentDescription="@string/app_name" />-->
 
-            <TextClock
-                android:id="@+id/textClock"
-                style="@style/wrap"
-                android:layout_marginStart="8dp"
-                android:format12Hour="@string/format_date"
-                android:format24Hour="@string/format_date"
-                android:text="@string/example_format_date"
-                android:textColor="@color/color555"
-                android:textSize="26sp" />
-        </LinearLayout>
+<!--            <TextClock-->
+<!--                android:id="@+id/textClock"-->
+<!--                style="@style/wrap"-->
+<!--                android:layout_marginStart="8dp"-->
+<!--                android:format12Hour="@string/format_date"-->
+<!--                android:format24Hour="@string/format_date"-->
+<!--                android:text="@string/example_format_date"-->
+<!--                android:textColor="@color/color555"-->
+<!--                android:textSize="26sp" />-->
+<!--        </LinearLayout>-->
 
-        <LinearLayout
-            style="@style/match"
-            android:orientation="vertical"
-            android:weightSum="3">
+<!--        <LinearLayout-->
+<!--            style="@style/match"-->
+<!--            android:orientation="vertical"-->
+<!--            android:weightSum="3">-->
 
-            <com.youth.banner.Banner
-                android:id="@+id/banner"
-                android:layout_width="match_parent"
-                android:layout_height="0dp"
-                android:layout_weight="1"
-                app:banner_loop_time="7000" />
+<!--            <com.youth.banner.Banner-->
+<!--                android:id="@+id/banner"-->
+<!--                android:layout_width="match_parent"-->
+<!--                android:layout_height="0dp"-->
+<!--                android:layout_weight="1"-->
+<!--                app:banner_loop_time="7000" />-->
 
-            <androidx.fragment.app.FragmentContainerView
-                android:id="@+id/navMain"
-                android:name="androidx.navigation.fragment.NavHostFragment"
-                android:layout_width="match_parent"
-                android:layout_height="0dp"
-                android:layout_weight="2"
-                app:defaultNavHost="true"
-                app:navGraph="@navigation/nav_business" />
-        </LinearLayout>
+<!--            <androidx.fragment.app.FragmentContainerView-->
+<!--                android:id="@+id/navMain"-->
+<!--                android:name="androidx.navigation.fragment.NavHostFragment"-->
+<!--                android:layout_width="match_parent"-->
+<!--                android:layout_height="0dp"-->
+<!--                android:layout_weight="2"-->
+<!--                app:navGraph="@navigation/nav_business" />-->
+<!--        </LinearLayout>-->
     </LinearLayout>
 </layout>

+ 1 - 1
app/src/main/res/layout/fragment_search_type.xml

@@ -6,7 +6,7 @@
 
         <variable
             name="viewModel"
-            type="com.doverfuelingsolutions.issp.view.fragment.FragmentSearchType.SearchTypeViewModel" />
+            type="com.doverfuelingsolutions.issp.view.fragment.FragmentSelect.SearchTypeViewModel" />
     </data>
 
     <androidx.constraintlayout.widget.ConstraintLayout

+ 0 - 27
app/src/main/res/layout/fragment_start.xml

@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    style="@style/match">
-
-    <androidx.appcompat.widget.LinearLayoutCompat
-        style="@style/wrap"
-        android:gravity="center"
-        android:orientation="horizontal"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent">
-
-        <androidx.core.widget.ContentLoadingProgressBar
-            android:id="@+id/progressBar"
-            style="@android:style/Widget.Material.Light.ProgressBar"
-            android:layout_marginEnd="20dp"
-            android:layout_width="40dp"
-            android:layout_height="40dp" />
-
-        <androidx.appcompat.widget.AppCompatTextView
-            style="@style/wrap"
-            android:textSize="26sp"
-            android:text="@string/in_loading" />
-    </androidx.appcompat.widget.LinearLayoutCompat>
-</androidx.constraintlayout.widget.ConstraintLayout>

+ 24 - 0
app/src/main/res/layout/layout_loading.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    style="@style/wrap"
+    android:gravity="center"
+    android:orientation="vertical"
+    app:layout_constraintBottom_toBottomOf="parent"
+    app:layout_constraintEnd_toEndOf="parent"
+    app:layout_constraintStart_toStartOf="parent"
+    app:layout_constraintTop_toTopOf="parent">
+
+    <androidx.core.widget.ContentLoadingProgressBar
+        android:id="@+id/progressBar"
+        style="@android:style/Widget.Material.Light.ProgressBar"
+        android:layout_width="48dp"
+        android:layout_height="48dp"
+        android:layout_marginBottom="10dp" />
+
+    <androidx.appcompat.widget.AppCompatTextView
+        style="@style/wrap"
+        android:text="@string/in_loading"
+        android:textSize="16sp" />
+</androidx.appcompat.widget.LinearLayoutCompat>

+ 0 - 20
app/src/main/res/navigation/nav_business.xml

@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<navigation xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:id="@+id/nav_main"
-    app:startDestination="@id/mainType">
-
-    <fragment
-        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>

+ 0 - 30
app/src/main/res/navigation/nav_main.xml

@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<navigation xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:id="@+id/nav_main"
-    app:startDestination="@id/fragmentMain">
-
-    <fragment
-        android:id="@+id/fragmentMain"
-        android:name="com.doverfuelingsolutions.issp.view.fragment.FragmentMain"
-        android:label="@string/app_name" >
-        <action
-            android:id="@+id/action_fragmentMain_to_fragmentLogin"
-            app:destination="@id/fragmentLogin" />
-    </fragment>
-
-    <fragment
-        android:id="@+id/fragmentLogin"
-        android:name="com.doverfuelingsolutions.issp.view.fragment.FragmentLogin"
-        android:label="@string/login">
-        <action
-            android:id="@+id/action_fragmentLogin_to_fragmentPreference"
-            app:destination="@id/fragmentPreferenceWrapper" />
-    </fragment>
-
-    <fragment
-        android:id="@+id/fragmentPreferenceWrapper"
-        android:name="com.doverfuelingsolutions.issp.view.fragment.FragmentPreferenceWrapper"
-        android:label="@string/preference" />
-</navigation>

+ 1 - 1
app/src/main/res/values-night/themes.xml

@@ -1,6 +1,6 @@
 <resources xmlns:tools="http://schemas.android.com/tools">
     <!-- Base application theme. -->
-    <style name="Theme.Issp" parent="Theme.MaterialComponents.DayNight.NoActionBar">
+    <style name="Theme.Issp" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
         <!-- Primary brand color. -->
         <item name="colorPrimary">@color/colorPrimaryNight</item>
         <item name="colorPrimaryVariant">@color/colorPrimaryVariant</item>

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

@@ -10,6 +10,8 @@
     <string name="start">开始</string>
     <string name="confirm">确认</string>
     <string name="cancel">取消</string>
+    <string name="go">前往</string>
+    <string name="exit">退出</string>
 
     <string name="in_login">登录中&#8230;</string>
     <string name="in_loading">加载中&#8230;</string>
@@ -56,7 +58,7 @@
     <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="tip_connect_fail_reason_config">连接中控系统异常:%1$s,请检查应用设置是否正确</string>
     <string name="fail_get_nozzle">获取枪油品信息失败</string>
     <string name="connect_timeout">连接中控超时</string>
     <string name="go_check">前往检查</string>

+ 1 - 1
app/src/main/res/values/themes.xml

@@ -1,6 +1,6 @@
 <resources xmlns:tools="http://schemas.android.com/tools">
     <!-- Base application theme. -->
-    <style name="Theme.Issp" parent="Theme.MaterialComponents.DayNight.NoActionBar">
+    <style name="Theme.Issp" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
         <!-- Primary brand color. -->
         <item name="colorPrimary">@color/colorPrimary</item>
         <item name="colorPrimaryVariant">@color/colorPrimaryVariant</item>

+ 0 - 3
build.gradle

@@ -10,9 +10,6 @@ buildscript {
         classpath "com.android.tools.build:gradle:4.1.0"
         classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
 
-        def nav_version = "2.3.2"
-        classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
-
         // NOTE: Do not place your application dependencies here; they belong
         // in the individual module build.gradle files
     }