Prechádzať zdrojové kódy

feat 获取油枪和油品信息

RobinTan1024 4 rokov pred
rodič
commit
dada2bf176
21 zmenil súbory, kde vykonal 271 pridanie a 32 odobranie
  1. 20 1
      app/src/main/java/com/doverfuelingsolutions/issp/api/CloudApi.kt
  2. 104 0
      app/src/main/java/com/doverfuelingsolutions/issp/api/FuelInfoApi.kt
  3. 1 0
      app/src/main/java/com/doverfuelingsolutions/issp/api/WayneApiConfig.kt
  4. 18 0
      app/src/main/java/com/doverfuelingsolutions/issp/api/basic/AuthInterceptor.kt
  5. 18 0
      app/src/main/java/com/doverfuelingsolutions/issp/api/basic/LoggingInterceptor.kt
  6. 14 14
      app/src/main/java/com/doverfuelingsolutions/issp/api/basic/RetrofitUtil.kt
  7. 17 0
      app/src/main/java/com/doverfuelingsolutions/issp/api/dto/ResultBarcode.kt
  8. 7 0
      app/src/main/java/com/doverfuelingsolutions/issp/api/dto/ResultNozzleInfo.kt
  9. 7 0
      app/src/main/java/com/doverfuelingsolutions/issp/api/dto/ResultNozzleInfoItem.kt
  10. 5 0
      app/src/main/java/com/doverfuelingsolutions/issp/api/entity/DefaultParams.kt
  11. 8 0
      app/src/main/java/com/doverfuelingsolutions/issp/api/entity/NozzleInfo.kt
  12. 6 0
      app/src/main/java/com/doverfuelingsolutions/issp/api/entity/ParametersBean.kt
  13. 5 0
      app/src/main/java/com/doverfuelingsolutions/issp/api/service/ServiceBase.kt
  14. 15 0
      app/src/main/java/com/doverfuelingsolutions/issp/api/service/ServiceStation.kt
  15. 11 4
      app/src/main/java/com/doverfuelingsolutions/issp/fusion/FusionManager.kt
  16. 5 5
      app/src/main/java/com/doverfuelingsolutions/issp/utils/log/DFSLog.kt
  17. 3 5
      app/src/main/java/com/doverfuelingsolutions/issp/utils/log/DFSLogger.kt
  18. 2 0
      app/src/main/java/com/doverfuelingsolutions/issp/utils/sp/SPKeys.kt
  19. 2 2
      app/src/main/java/com/doverfuelingsolutions/issp/view/LoginActivity.kt
  20. 2 1
      app/src/main/java/com/doverfuelingsolutions/issp/view/MainActivity.kt
  21. 1 0
      app/src/main/res/values/keys.xml

+ 20 - 1
app/src/main/java/com/doverfuelingsolutions/issp/api/WayneApi.kt → app/src/main/java/com/doverfuelingsolutions/issp/api/CloudApi.kt

@@ -26,7 +26,7 @@ import java.io.File
 import kotlin.coroutines.resume
 import kotlin.coroutines.suspendCoroutine
 
-object WayneApi {
+object CloudApi {
 
     private val retrofit: Retrofit by lazyOf(RetrofitUtil.getGsonBuilder().baseUrl(WayneApiConfig.HOST_BASE).build())
     private val retrofitAuthBase: Retrofit by lazyOf(RetrofitUtil.getAuthBuilder().baseUrl(WayneApiConfig.HOST_BASE).build())
@@ -191,4 +191,23 @@ object WayneApi {
         }
         return DFSResult.fail(R.string.req_fail)
     }
+
+    suspend fun barcodeName(id: Int) = suspendCoroutine<DFSResult<ResultBarcode>> {
+        serviceBase.barcodeInfo(id).enqueue(object : Callback<ResultBarcode> {
+            override fun onResponse(call: Call<ResultBarcode>, response: Response<ResultBarcode>) {
+                val code = response.code()
+                val body = response.body()
+                if (code == 200 && body != null) {
+                    it.resume(DFSResult.success(body))
+                    return
+                }
+                it.resume(DFSResult.fail(R.string.req_fail))
+            }
+
+            override fun onFailure(call: Call<ResultBarcode>, t: Throwable) {
+                DFSLog.e(t)
+                it.resume(DFSResult.fail(t.message.toString()))
+            }
+        })
+    }
 }

+ 104 - 0
app/src/main/java/com/doverfuelingsolutions/issp/api/FuelInfoApi.kt

@@ -0,0 +1,104 @@
+package com.doverfuelingsolutions.issp.api
+
+import com.doverfuelingsolutions.issp.R
+import com.doverfuelingsolutions.issp.api.basic.RetrofitUtil
+import com.doverfuelingsolutions.issp.api.dto.DFSResult
+import com.doverfuelingsolutions.issp.api.dto.ResultNozzleInfo
+import com.doverfuelingsolutions.issp.api.entity.NozzleInfo
+import com.doverfuelingsolutions.issp.api.service.ServiceStation
+import com.doverfuelingsolutions.issp.utils.log.DFSLog
+import com.doverfuelingsolutions.issp.utils.sp.SPKeys
+import com.doverfuelingsolutions.issp.utils.sp.SPUtil
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.launch
+import retrofit2.Call
+import retrofit2.Callback
+import retrofit2.Response
+import retrofit2.Retrofit
+import kotlin.coroutines.resume
+import kotlin.coroutines.suspendCoroutine
+
+object FuelInfoApi {
+
+    private val retrofit: Retrofit by lazy {
+        val ip = SPUtil.getString(SPKeys.FUEL_IP)
+        val port = SPUtil.getString(SPKeys.FUEL_PORT)
+        val url = "http://$ip:$port"
+        RetrofitUtil.getGsonBuilder().baseUrl(url).build()
+    }
+    private val serviceStation: ServiceStation by lazyOf(retrofit.create(ServiceStation::class.java))
+
+    suspend fun getNozzleInfo() = suspendCoroutine<DFSResult<List<NozzleInfo>>> {
+        GlobalScope.launch(Dispatchers.IO) {
+            val resultNozzleList = getNozzleData()
+            if (!resultNozzleList.success || resultNozzleList.data == null) {
+                it.resume(DFSResult.fail(resultNozzleList.message))
+                return@launch
+            } else if (resultNozzleList.data.isEmpty()) {
+                it.resume(DFSResult.success(emptyList()))
+                return@launch
+            }
+
+            val localBarcodeMap = getLocalBarcodeMap().toMutableMap()
+            var isLocalAdd = false
+            val nozzleInfoList = arrayListOf<NozzleInfo>()
+            for (pump in resultNozzleList.data) {
+                for (nozzle in pump.Nozzles) {
+                    val localName = localBarcodeMap[nozzle.ProductBarcode]
+                    val name: String = if (localName != null && localName.isNotEmpty()) {
+                        localName
+                    } else {
+                        val resultBarcodeInfo = CloudApi.barcodeName(nozzle.ProductBarcode)
+                        if (resultBarcodeInfo.success && resultBarcodeInfo.data != null && resultBarcodeInfo.data.IsFuelItem) {
+                            localBarcodeMap[nozzle.ProductBarcode] = resultBarcodeInfo.data.ItemName
+                            isLocalAdd = true
+                            resultBarcodeInfo.data.ItemName
+                        } else {
+                            ""
+                        }
+                    }
+                    nozzleInfoList.add(NozzleInfo(pump.PumpId, nozzle.SiteLevelNozzleId, nozzle.ProductBarcode, name))
+                }
+            }
+            if (isLocalAdd) setLocalBarcodeMap(localBarcodeMap)
+
+            nozzleInfoList.sortBy { it.siteId }
+            it.resume(DFSResult.success(nozzleInfoList))
+        }
+    }
+
+    private fun getLocalBarcodeMap(): Map<Int, String> {
+        return mutableMapOf<Int, String>().apply {
+            val localBarcodeList = SPUtil.getString(SPKeys.FUEL_BARCODE)
+            localBarcodeList.split(",").forEach {
+                val kv = it.split("=")
+                if (kv.size == 2) put(kv[0].toInt(), kv[1])
+            }
+        }
+    }
+
+    private fun setLocalBarcodeMap(map: Map<Int, String>) {
+        SPUtil.putString(SPKeys.FUEL_BARCODE, map.entries.joinToString(",") { "${it.key}=${it.value}" })
+    }
+
+    private suspend fun getNozzleData() = suspendCoroutine<DFSResult<Array<ResultNozzleInfo>>> {
+        serviceStation.getNozzleInfo().enqueue(object : Callback<Array<ResultNozzleInfo>> {
+            override fun onResponse(call: Call<Array<ResultNozzleInfo>>, response: Response<Array<ResultNozzleInfo>>) {
+                val code = response.code()
+                val body = response.body()
+                DFSLog.v("FuelInfoApi.getNozzleData.onResponse", code, body.toString())
+                if (code == 200 && body != null) {
+                    it.resume(DFSResult.success(body))
+                    return
+                }
+                it.resume(DFSResult.fail(R.string.return_data_error))
+            }
+
+            override fun onFailure(call: Call<Array<ResultNozzleInfo>>, t: Throwable) {
+                DFSLog.e("FuelInfoApi.getNozzleData.onFailure", t)
+                it.resume(DFSResult.fail(t.message.toString()))
+            }
+        })
+    }
+}

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

@@ -12,6 +12,7 @@ class WayneApiConfig {
         const val PATH_TRX_TRANS = "api/Transactions"
         const val PATH_CONFIG_DESC = "api/Config/description"
         const val PATH_CONFIG_FILE = "api/Config/file"
+        const val PATH_BARCODE = "api/products/barcode/{id}"
 
         const val CONFIG_LOGO = "SiteLogo"
 

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

@@ -0,0 +1,18 @@
+package com.doverfuelingsolutions.issp.api.basic
+
+import com.doverfuelingsolutions.issp.data.DataStore
+import okhttp3.Interceptor
+import okhttp3.Response
+
+class AuthInterceptor : Interceptor {
+
+    override fun intercept(chain: Interceptor.Chain): Response {
+        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)
+        return chain.proceed(request.build())
+    }
+}

+ 18 - 0
app/src/main/java/com/doverfuelingsolutions/issp/api/basic/LoggingInterceptor.kt

@@ -0,0 +1,18 @@
+package com.doverfuelingsolutions.issp.api.basic
+
+import com.doverfuelingsolutions.issp.utils.log.DFSLog
+import okhttp3.Interceptor
+import okhttp3.Response
+
+class LoggingInterceptor : Interceptor {
+
+    override fun intercept(chain: Interceptor.Chain): Response {
+        val request = chain.request()
+        val response = chain.proceed(request)
+        DFSLog.v("==========>>>>>>>>>> request <<<<<<<<<<==========")
+        val body = response.body()
+        val stringBody = if (body == null) "null" else response.peekBody(Long.MAX_VALUE).string()
+        DFSLog.v("${request.method()} ${request.url()}", response.code(), stringBody)
+        return response
+    }
+}

+ 14 - 14
app/src/main/java/com/doverfuelingsolutions/issp/api/basic/RetrofitUtil.kt

@@ -1,31 +1,31 @@
 package com.doverfuelingsolutions.issp.api.basic
 
-import com.doverfuelingsolutions.issp.data.DataStore
 import okhttp3.OkHttpClient
 import retrofit2.Retrofit
 import retrofit2.converter.gson.GsonConverterFactory
 
 object RetrofitUtil {
 
-    private val mOkHttpClient = OkHttpClient.Builder().apply {
-        addInterceptor {
-            val request = it.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)
-            it.proceed(request.build())
-        }
+    private val loggingInterceptor: LoggingInterceptor by lazy { LoggingInterceptor() }
+    private val authInterceptor: AuthInterceptor by lazy { AuthInterceptor() }
+    private val basicHttpBuilder: OkHttpClient.Builder by lazy { OkHttpClient.Builder().addInterceptor(loggingInterceptor) }
+    private val authHttpBuilder: OkHttpClient.Builder by lazy {
+        OkHttpClient.Builder()
+            .addInterceptor(loggingInterceptor)
+            .addInterceptor(authInterceptor)
     }
 
+    private val mGsonConverterFactory: GsonConverterFactory by lazy { GsonConverterFactory.create() }
+
     fun getGsonBuilder(): Retrofit.Builder {
         return Retrofit.Builder()
-            .addConverterFactory(GsonConverterFactory.create())
+            .addConverterFactory(mGsonConverterFactory)
+            .client(basicHttpBuilder.build())
     }
 
     fun getAuthBuilder(): Retrofit.Builder {
-        return getGsonBuilder()
-            .client(mOkHttpClient.build())
+        return Retrofit.Builder()
+            .addConverterFactory(mGsonConverterFactory)
+            .client(authHttpBuilder.build())
     }
 }

+ 17 - 0
app/src/main/java/com/doverfuelingsolutions/issp/api/dto/ResultBarcode.kt

@@ -0,0 +1,17 @@
+package com.doverfuelingsolutions.issp.api.dto
+
+class ResultBarcode(
+    val Id: String,
+    val ItemId: String,
+    val BarCode: String,
+    val ItemName: String,
+    val UnitId: String,
+    val DateToActivate: String,
+    val DateToDeactivate: String,
+    val CreatedDateTime: String,
+    val TargetBusinessUnitId: String,
+    val IsFuelItem: Boolean,
+    val IsMarkedAsDeletion: Boolean,
+    val Status: Int,
+    val Price: Double
+)

+ 7 - 0
app/src/main/java/com/doverfuelingsolutions/issp/api/dto/ResultNozzleInfo.kt

@@ -0,0 +1,7 @@
+package com.doverfuelingsolutions.issp.api.dto
+
+data class ResultNozzleInfo(
+    val Name: String,
+    val PumpId: Int,
+    val Nozzles: List<ResultNozzleInfoItem>,
+)

+ 7 - 0
app/src/main/java/com/doverfuelingsolutions/issp/api/dto/ResultNozzleInfoItem.kt

@@ -0,0 +1,7 @@
+package com.doverfuelingsolutions.issp.api.dto
+
+data class ResultNozzleInfoItem(
+    val LogicalId: Int,
+    val SiteLevelNozzleId: Int,
+    val ProductBarcode: Int,
+)

+ 5 - 0
app/src/main/java/com/doverfuelingsolutions/issp/api/entity/DefaultParams.kt

@@ -0,0 +1,5 @@
+package com.doverfuelingsolutions.issp.api.entity
+
+data class DefaultParams(
+    val Parameters: List<ParametersBean>
+)

+ 8 - 0
app/src/main/java/com/doverfuelingsolutions/issp/api/entity/NozzleInfo.kt

@@ -0,0 +1,8 @@
+package com.doverfuelingsolutions.issp.api.entity
+
+data class NozzleInfo(
+    val pumpId: Int,
+    val siteId: Int,
+    val barcodeId: Int,
+    val barcodeName: String,
+)

+ 6 - 0
app/src/main/java/com/doverfuelingsolutions/issp/api/entity/ParametersBean.kt

@@ -0,0 +1,6 @@
+package com.doverfuelingsolutions.issp.api.entity
+
+class ParametersBean {
+    var name: String = "string"
+    var value: String = "string"
+}

+ 5 - 0
app/src/main/java/com/doverfuelingsolutions/issp/api/service/ServiceBase.kt

@@ -1,7 +1,9 @@
 package com.doverfuelingsolutions.issp.api.service
 
 import com.doverfuelingsolutions.issp.api.WayneApiConfig
+import com.doverfuelingsolutions.issp.api.dto.ResultBarcode
 import com.doverfuelingsolutions.issp.api.dto.ResultDeviceSessionInfo
+import okhttp3.ResponseBody
 import retrofit2.Call
 import retrofit2.http.*
 
@@ -9,4 +11,7 @@ interface ServiceBase {
 
     @GET(WayneApiConfig.PATH_BASE_DEVICE_SESSION)
     fun deviceSessionInfo(@Query("deviceSN") sn: String): Call<ResultDeviceSessionInfo>
+
+    @GET(WayneApiConfig.PATH_BARCODE)
+    fun barcodeInfo(@Path("id") id: Int): Call<ResultBarcode>
 }

+ 15 - 0
app/src/main/java/com/doverfuelingsolutions/issp/api/service/ServiceStation.kt

@@ -0,0 +1,15 @@
+package com.doverfuelingsolutions.issp.api.service
+
+import com.doverfuelingsolutions.issp.api.dto.ResultNozzleInfo
+import com.doverfuelingsolutions.issp.api.entity.DefaultParams
+import okhttp3.ResponseBody
+import org.json.JSONObject
+import retrofit2.Call
+import retrofit2.http.Body
+import retrofit2.http.POST
+
+interface ServiceStation {
+
+    @POST("u/?mn=GetPumpsLayout&pn=fdcServerApp&en=Applications.FDC.FdcServerHostApp")
+    fun getNozzleInfo(@Body params: DefaultParams = DefaultParams(emptyList())): Call<Array<ResultNozzleInfo>>
+}

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

@@ -3,6 +3,9 @@ package com.doverfuelingsolutions.issp.fusion
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.LifecycleObserver
 import androidx.lifecycle.OnLifecycleEvent
+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.log.DFSLog
@@ -27,6 +30,7 @@ object FusionManager : LifecycleObserver, OnFdcClientStateChangedListener,
     OnFdcMessageReceivedListener {
 
     private var stateFusion: FdcClient.FdcClientState = FdcClient.FdcClientState.Stopped
+    private val nozzleList = arrayListOf<NozzleInfo>()
 
     private val coroutineIO = CoroutineScope(Dispatchers.IO)
 
@@ -46,13 +50,13 @@ object FusionManager : LifecycleObserver, OnFdcClientStateChangedListener,
     override fun onServiceResponseReceived(sender: FdcClient?, serviceResponse: ServiceResponse?) {
         if (sender == null || serviceResponse == null) return
 
-        DFSLog.v("onServiceResponseReceived")
+        // DFSLog.v("onServiceResponseReceived")
     }
 
     override fun onFdcMessageReceived(sender: FdcClient?, fdcMessage: FdcMessage?) {
         if (sender == null || fdcMessage == null) return
 
-        DFSLog.v("onFdcMessageReceived")
+        // DFSLog.v("onFdcMessageReceived")
     }
 
     @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
@@ -81,7 +85,6 @@ object FusionManager : LifecycleObserver, OnFdcClientStateChangedListener,
         }
     }
 
-    // TODO 获取油站相关信息
     private fun loginFetchInfo() {
         coroutineIO.launch {
             // retry if failed
@@ -98,7 +101,11 @@ object FusionManager : LifecycleObserver, OnFdcClientStateChangedListener,
                 onFusionEvent?.onLogin(true)
             }
 
-            // TODO station info
+            val resultNozzles = FuelInfoApi.getNozzleInfo()
+            if (resultNozzles.success && resultNozzles.data != null) {
+                if (nozzleList.isNotEmpty()) nozzleList.clear()
+                nozzleList.addAll(resultNozzles.data)
+            }
         }
     }
 

+ 5 - 5
app/src/main/java/com/doverfuelingsolutions/issp/utils/log/DFSLog.kt

@@ -12,22 +12,22 @@ class DFSLog {
         @Suppress("DEPRECATION")
         var folder = "${Environment.getExternalStorageDirectory().absolutePath}/dfs/log"
 
-        fun v(vararg contents: Any) {
+        fun v(vararg contents: Any?) {
             DFSLogger.log(DFSLogType.Verbose, *contents)
         }
-        fun d(vararg contents: Any) {
+        fun d(vararg contents: Any?) {
             DFSLogger.log(DFSLogType.Debug, *contents)
         }
 
-        fun i(vararg contents: Any) {
+        fun i(vararg contents: Any?) {
             DFSLogger.log(DFSLogType.Info, *contents)
         }
 
-        fun w(vararg contents: Any) {
+        fun w(vararg contents: Any?) {
             DFSLogger.log(DFSLogType.Warn, *contents)
         }
 
-        fun e(vararg contents: Any) {
+        fun e(vararg contents: Any?) {
             DFSLogger.log(DFSLogType.Error, *contents)
         }
     }

+ 3 - 5
app/src/main/java/com/doverfuelingsolutions/issp/utils/log/DFSLogger.kt

@@ -19,16 +19,14 @@ object DFSLogger {
 
     private val threadPoolExecutor = ThreadPoolExecutor(1, 1, 10, TimeUnit.SECONDS, LinkedBlockingQueue(50))
 
-    fun log(type: DFSLogType, vararg contents: Any) {
+    fun log(type: DFSLogType, vararg contents: Any?) {
         val string = when (contents.size) {
             0 -> ""
             1 -> stringify(contents[0])
             else -> {
                 contents.mapIndexed { index, obj ->
                     "[$index] = ${stringify(obj)}"
-                }.joinToString(LINE_BR) {
-                    stringify(it)
-                }
+                }.joinToString(LINE_BR)
             }
         }
         if (DFSLog.console) console(type, string)
@@ -69,7 +67,7 @@ object DFSLogger {
         }
     }
 
-    private fun stringify(content: Any): String = when (content) {
+    private fun stringify(content: Any?): String = when (content) {
         is Iterable<*> -> content.joinToString { it.toString() }
         is Throwable -> getFullStackTrace(content)
         else -> content.toString()

+ 2 - 0
app/src/main/java/com/doverfuelingsolutions/issp/utils/sp/SPKeys.kt

@@ -30,5 +30,7 @@ class SPKeys {
         val MIDDLE_WORKSTATION_ID: String = StringUtil.get(R.string.sp_middle_workstation_id)
         val FUEL_IP: String = StringUtil.get(R.string.sp_fuel_ip)
         val FUEL_PORT: String = StringUtil.get(R.string.sp_fuel_port)
+
+        val FUEL_BARCODE: String = StringUtil.get(R.string.sp_fuel_barcode)
     }
 }

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

@@ -8,7 +8,7 @@ import androidx.databinding.DataBindingUtil
 import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.ViewModel
 import com.doverfuelingsolutions.issp.R
-import com.doverfuelingsolutions.issp.api.WayneApi
+import com.doverfuelingsolutions.issp.api.CloudApi
 import com.doverfuelingsolutions.issp.data.DataStore
 import com.doverfuelingsolutions.issp.databinding.ActivityLoginBinding
 import com.doverfuelingsolutions.issp.utils.PermissionUtil
@@ -78,7 +78,7 @@ class LoginActivity : AppCompatActivity(), View.OnClickListener {
             when {
                 accountName.isNullOrBlank() || password.isNullOrBlank() -> snackbar.setText(R.string.input_not_right).show()
                 else -> {
-                    val result = WayneApi.login(accountName, password)
+                    val result = CloudApi.login(accountName, password)
                     if (!result.success) snackbar.setText(StringUtil.get(R.string.login_fail, result.message)).show()
                     else {
                         MainActivity.start(this@LoginActivity)

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

@@ -16,7 +16,8 @@ import com.doverfuelingsolutions.issp.fusion.FusionManager
 import com.doverfuelingsolutions.issp.utils.ActivityUtil
 import com.youth.banner.adapter.BannerImageAdapter
 import com.youth.banner.holder.BannerImageHolder
-import kotlinx.coroutines.*
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
 import java.io.File
 
 class MainActivity : AppCompatActivity(), View.OnClickListener {

+ 1 - 0
app/src/main/res/values/keys.xml

@@ -20,4 +20,5 @@
     <string name="sp_middle_workstation_id">middle_workstation_id</string>
     <string name="sp_fuel_ip">fuel_ip</string>
     <string name="sp_fuel_port">fuel_port</string>
+    <string name="sp_fuel_barcode">fuel_barcode</string>
 </resources>