Przeglądaj źródła

重构网络请求响应处理;添加登录页

Frankensteinly 1 rok temu
rodzic
commit
55ae3673d0

+ 3 - 0
app/src/main/AndroidManifest.xml

@@ -21,6 +21,9 @@
         android:supportsRtl="true"
         android:theme="@style/Theme.ISCS"
         tools:targetApi="31">
+        <activity
+            android:name=".activity.LoginActivity"
+            android:exported="false" />
         <activity
             android:name=".activity.CreateTicketActivity"
             android:exported="false" />

+ 1 - 1
app/src/main/java/com/grkj/iscs/MyApplication.kt

@@ -24,7 +24,7 @@ class MyApplication : Application() {
         NetHttpManager.getInstance().initCtx(this)
         Token.clear(this)
         // TODO 方便调试,待删除
-        NetApi.login()
+//        NetApi.login("admin", "grkj8888") {}
     }
 
     override fun attachBaseContext(base: Context?) {

+ 52 - 0
app/src/main/java/com/grkj/iscs/activity/LoginActivity.kt

@@ -0,0 +1,52 @@
+package com.grkj.iscs.activity
+
+import android.content.Intent
+import com.grkj.iscs.BusinessManager
+import com.grkj.iscs.R
+import com.grkj.iscs.base.BaseMvpActivity
+import com.grkj.iscs.databinding.ActivityLoginBinding
+import com.grkj.iscs.iview.ILoginView
+import com.grkj.iscs.presenter.LoginPresenter
+import com.grkj.iscs.util.Executor
+import com.grkj.iscs.util.passwordStyle
+
+class LoginActivity : BaseMvpActivity<ILoginView, LoginPresenter, ActivityLoginBinding>() {
+
+    override val viewBinding: ActivityLoginBinding
+        get() = ActivityLoginBinding.inflate(layoutInflater)
+
+    override fun initView() {
+        mBinding?.btnConfirm?.setOnClickListener {
+            presenter?.login(this, mBinding?.etAccount?.text.toString(), mBinding?.etPassword?.text.toString()) {
+                if (it) {
+                    startActivity(Intent(this, HomeActivity::class.java))
+                }
+            }
+        }
+        mBinding?.ivEyes?.setOnClickListener {
+            passwordStyle(mBinding?.etPassword, mBinding?.ivEyes!!)
+        }
+
+        handleLoading(true, resources.getString(R.string.device_is_initializing))
+        BusinessManager.connectDock(1, true)
+        Executor.delayOnMain(2000) {
+            handleLoading(false)
+        }
+    }
+
+    override fun onResume() {
+        super.onResume()
+        mBinding?.etAccount?.setText("")
+        mBinding?.etPassword?.setText("")
+        presenter?.registerListener()
+    }
+
+    override fun onStop() {
+        super.onStop()
+        presenter?.unregisterListener()
+    }
+
+    override fun initPresenter(): LoginPresenter {
+        return LoginPresenter()
+    }
+}

+ 4 - 0
app/src/main/java/com/grkj/iscs/activity/MainActivity.kt

@@ -48,6 +48,10 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
             startActivity(Intent(this, PresentationLoginActivity::class.java))
         }
 
+        mBinding?.login?.setOnClickListener {
+            startActivity(Intent(this, LoginActivity::class.java))
+        }
+
         mBinding?.createTicket?.setOnClickListener {
             startActivity(Intent(this, CreateTicketActivity::class.java))
         }

+ 5 - 0
app/src/main/java/com/grkj/iscs/iview/ILoginView.kt

@@ -0,0 +1,5 @@
+package com.grkj.iscs.iview
+
+import com.grkj.iscs.base.IView
+
+interface ILoginView : IView {}

+ 101 - 0
app/src/main/java/com/grkj/iscs/presenter/LoginPresenter.kt

@@ -0,0 +1,101 @@
+package com.grkj.iscs.presenter
+
+import android.content.Context
+import android.content.Intent
+import android.view.View
+import com.google.gson.Gson
+import com.grkj.iscs.BusinessManager
+import com.grkj.iscs.R
+import com.grkj.iscs.base.BaseActivity
+import com.grkj.iscs.base.BasePresenter
+import com.grkj.iscs.extentions.removeLeadingZeros
+import com.grkj.iscs.extentions.toHexStrings
+import com.grkj.iscs.iview.ILoginView
+import com.grkj.iscs.modbus.ModBusController
+import com.grkj.iscs.model.DeviceConst.DEVICE_TYPE_CARD
+import com.grkj.iscs.model.DeviceConst.DEVICE_TYPE_KEY
+import com.grkj.iscs.model.DeviceConst.DEVICE_TYPE_LOCK
+import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_PORTABLE
+import com.grkj.iscs.model.WorkTicketStatusBean
+import com.grkj.iscs.presentation.LockerActivity
+import com.grkj.iscs.presentation.LockerTogetherActivity
+import com.grkj.iscs.presentation.PresentationManager
+import com.grkj.iscs.util.ActivityUtils
+import com.grkj.iscs.util.Executor
+import com.grkj.iscs.util.NetApi
+import com.grkj.iscs.util.ToastUtils
+
+class LoginPresenter : BasePresenter<ILoginView>() {
+
+    fun login(context: Context, account: String, pwd: String, callBack: (Boolean) -> Unit) {
+        if (account.isEmpty()) {
+            ToastUtils.tip(context.getString(R.string.please_input_account))
+            return
+        } else if (account.isEmpty()) {
+            ToastUtils.tip(context.getString(R.string.please_input_password))
+            return
+        }
+        NetApi.login(account, pwd) {
+            callBack.invoke(it!!)
+        }
+    }
+
+    fun registerListener() {
+        BusinessManager.registerStatusListener(this) { dockBean ->
+            dockBean.deviceList.forEach { deviceBean ->
+                if (!deviceBean.isExist) {
+                    return@forEach
+                }
+                when (deviceBean.type) {
+                    DEVICE_TYPE_CARD -> {
+                        ModBusController.readPortalCaseCardRfid(dockBean.addr.toInt() - 1) { res ->
+                            if (res.size >= 11) {
+                                val rfid = res.copyOfRange(3, 11).toHexStrings(false).removeLeadingZeros()
+                                println("卡片RFID : $rfid")
+                                // TODO 跳转页面处理
+                            }
+                        }
+                    }
+
+                    DEVICE_TYPE_KEY -> {
+                        // TODO 是否处理工作票
+//                        Executor.runOnMain {
+//                            BusinessManager.getTicketStatusBusiness(
+//                                PresentationManager.keyMac,
+//                                this
+//                            ) { b, s ->
+//                                (mvpView as BaseActivity<*>).handleLoading(b, s)
+//                                if (!s.isNullOrEmpty() && s.startsWith("工作票完成接收")) {
+//                                    val ticket = s.substring(7)
+//                                    val ticketStatusBean = Gson().fromJson(
+//                                        ticket,
+//                                        WorkTicketStatusBean::class.java
+//                                    )
+//                                    PresentationManager.updateWorkTicket(ticketStatusBean)
+//                                }
+//                            }
+//                        }
+                    }
+
+                    DEVICE_TYPE_LOCK -> {
+                        // TODO 是否处理
+//                        Executor.runOnMain {
+//                            ModBusController.readLockRfid(
+//                                dockBean.addr.toInt() - 1,
+//                                deviceBean.idx
+//                            ) { res ->
+//                                val rfid = res.copyOfRange(3, 11).toHexStrings(false)
+//                                    .removeLeadingZeros()
+//                                PresentationManager.updateLockReturnStatus(rfid)
+//                            }
+//                        }
+                    }
+                }
+            }
+        }
+    }
+
+    fun unregisterListener() {
+        ModBusController.unregisterListener(this)
+    }
+}

+ 23 - 0
app/src/main/java/com/grkj/iscs/util/Funcs.kt

@@ -2,6 +2,10 @@ package com.grkj.iscs.util
 
 import android.content.Context
 import android.os.Environment
+import android.text.method.HideReturnsTransformationMethod
+import android.text.method.PasswordTransformationMethod
+import android.widget.EditText
+import android.widget.ImageView
 import cn.zhxu.data.TypeRef
 import cn.zhxu.okhttps.HttpResult
 import com.google.gson.Gson
@@ -61,6 +65,25 @@ inline fun <reified T> getRef(): TypeRef<BaseVO<T>> {
     return object : TypeRef<BaseVO<T>>() {}
 }
 
+inline fun <reified T> getBaseVO(rst: HttpResult.Body): BaseVO<T>? {
+    return rst.toBean(getRef<T>())
+}
+
 inline fun <reified T> getRefBean(rst: HttpResult.Body): T? {
     return rst.toBean(getRef<T>()).data
+}
+
+/**
+ * 密码显示效果切换
+ * @param view:输入控件
+ * @param imageView:明文和密文icon控件。selected属性
+ */
+fun passwordStyle(view: EditText?, imageView: ImageView) {
+    if (imageView.isSelected) {
+        view?.transformationMethod = PasswordTransformationMethod.getInstance()
+    } else {
+        view?.transformationMethod = HideReturnsTransformationMethod.getInstance()
+    }
+    view?.setSelection(view.text.toString().length)
+    imageView.isSelected = !imageView.isSelected
 }

+ 4 - 3
app/src/main/java/com/grkj/iscs/util/NetApi.kt

@@ -16,18 +16,19 @@ object NetApi {
     /**
      * 登录
      */
-    fun login() {
+    fun login(username: String, password: String, callBack: (Boolean?) -> Unit) {
         NetHttpManager.getInstance().doRequestNet(
             UrlConsts.SIGN_IN,
             false,
             mapOf(
-                "username" to "admin",
-                "password" to "grkj8888"
+                "username" to username,
+                "password" to password
             ),
             { res, errMsg, codeInt ->
                 res?.let {
                     val newToken = it.toBean(Token::class.java)
                     newToken.saveToSp(MyApplication.instance!!.applicationContext)
+                    callBack.invoke(true)
                 }
             }, isGet = false, isAuth = false)
     }

+ 16 - 1
app/src/main/java/com/grkj/iscs/util/NetHttpManager.kt

@@ -15,6 +15,7 @@ import com.grkj.iscs.model.Constants
 import com.grkj.iscs.model.Token
 import com.grkj.iscs.model.UrlConsts
 import com.grkj.iscs.model.UrlConsts.SIGN_IN
+import com.grkj.iscs.model.vo.BaseVO
 import com.grkj.iscs.util.log.LogUtil
 import okhttp3.logging.HttpLoggingInterceptor
 import java.io.IOException
@@ -137,7 +138,21 @@ class NetHttpManager {
                     MyApplication.instance?.applicationContext?.let { itCtx ->
                         Token.refresh(itCtx)
                     }
-                    callback(it.body, null, it.status)
+                    it.body.cache()
+                    val baseVO = getBaseVO<Any>(it.body)
+                    if (baseVO?.code in 200 until 300) {
+                        callback(it.body, null, it.status)
+                    } else {
+                        ToastUtils.tip(baseVO?.msg)
+                        var bobyStr = it.body.toString()
+                        callback(
+                            null, if (bobyStr.isNullOrEmpty()) {
+                                it.toString()
+                            } else {
+                                bobyStr
+                            }, it.status
+                        )
+                    }
                 } else {
                     var bobyStr = it.body.toString()
                     callback(

+ 6 - 0
app/src/main/res/drawable/login_btn_bg.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <corners android:radius="@dimen/login_btn_radius" />
+    <solid android:color="@color/main_color" />
+</shape>

+ 5 - 0
app/src/main/res/drawable/pwd_toggle_bg_selector.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_selected="true" android:drawable="@mipmap/icon_open_eyes"/>
+    <item android:state_selected="false" android:drawable="@mipmap/icon_close_eyes"/>
+</selector>

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

@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout 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/main"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    tools:context=".activity.LoginActivity"
+    android:background="@color/common_bg_black_30"
+    android:gravity="center">
+
+    <TextView
+        style="@style/CommonTextView"
+        android:text="@string/login_tip"
+        android:textColor="@color/main_color" />
+
+    <EditText
+        android:id="@+id/et_account"
+        style="@style/CommonEditNew"
+        android:layout_width="300dp"
+        android:hint="@string/please_input_account" />
+
+    <RelativeLayout
+        android:layout_width="300dp"
+        android:layout_height="wrap_content">
+
+        <EditText
+            android:id="@+id/et_password"
+            style="@style/CommonEditNew"
+            android:layout_width="match_parent"
+            android:inputType="textPassword"
+            android:layout_centerVertical="true"
+            android:hint="@string/please_input_password" />
+
+        <ImageView
+            android:id="@+id/iv_eyes"
+            android:layout_width="@dimen/close_eyes_width"
+            android:layout_height="wrap_content"
+            android:adjustViewBounds="true"
+            android:src="@drawable/pwd_toggle_bg_selector"
+            android:layout_alignParentRight="true"
+            android:layout_centerVertical="true" />
+    </RelativeLayout>
+
+    <TextView
+        android:id="@+id/btn_confirm"
+        android:layout_width="@dimen/login_btn_width"
+        android:layout_height="@dimen/login_btn_height"
+        android:background="@drawable/login_btn_bg"
+        android:text="@string/confirm"
+        android:gravity="center"
+        android:textSize="@dimen/login_btn_text_size"
+        android:textStyle="bold"
+        android:textColor="@color/white"
+        android:elevation="@dimen/common_common_btn_elevation"
+        android:layout_marginTop="@dimen/login_btn_margin_top"
+        android:layout_centerHorizontal="true"
+        android:layout_alignParentBottom="true" />
+</LinearLayout>

+ 10 - 0
app/src/main/res/layout/activity_main.xml

@@ -117,6 +117,16 @@
         android:layout_height="wrap_content"
         android:orientation="horizontal"
         android:gravity="center">
+        <Button
+            android:id="@+id/login"
+            android:layout_width="wrap_content"
+            android:layout_height="50dp"
+            android:minWidth="0dp"
+            android:minHeight="0dp"
+            android:text="Login"
+            android:textSize="10sp"
+            android:layout_margin="5dp"/>
+
         <Button
             android:id="@+id/create_ticket"
             android:layout_width="wrap_content"

BIN
app/src/main/res/mipmap/icon_close_eyes.png


BIN
app/src/main/res/mipmap/icon_open_eyes.png


+ 12 - 1
app/src/main/res/values/colors.xml

@@ -5,8 +5,19 @@
     <color name="aquamarine">#7FFFD4</color>
 
     <color name="main_color">#644bd8</color>
+    <color name="common_transparent">#00000000</color>
+    <color name="common_bg_white_10">#1affffff</color>
+    <color name="common_bg_white_20">#33ffffff</color>
+    <color name="common_bg_white_30">#4DFFFFFF</color>
+    <color name="common_bg_white_60">#99FFFFFF</color>
+    <color name="common_bg_white_70">#B3FFFFFF</color>
+
+    <color name="common_bg_black_30">#4D000000</color>
+
+    <color name="common_light_gray">#CCCCCC</color>
+    <color name="common_dlg_bg">#535B67</color>
+
     <color name="selectable_input_prefix">#bd3124</color>
     <color name="switch_track_on">#298EFF</color>
-    <color name="common_transparent">#00000000</color>
     <color name="switch_track_off">#E9E9E9</color>
 </resources>

+ 9 - 0
app/src/main/res/values/dimens.xml

@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
     <dimen name="common_text_size">15sp</dimen>
+    <dimen name="common_font_txt_size_page_title">14dp</dimen>
     <dimen name="common_radius">1dp</dimen>
 
     <dimen name="title_bar_height">50dp</dimen>
@@ -27,4 +28,12 @@
     <dimen name="selectable_input_edit_padding">3dp</dimen>
 
     <dimen name="rv_item_margin">1dp</dimen>
+
+    <dimen name="close_eyes_width">23dp</dimen>
+    <dimen name="login_btn_radius">20dp</dimen>
+    <dimen name="login_btn_width">157dp</dimen>
+    <dimen name="login_btn_height">40dp</dimen>
+    <dimen name="common_common_btn_elevation">10dp</dimen>
+    <dimen name="login_btn_margin_top">20dp</dimen>
+    <dimen name="login_btn_text_size">13dp</dimen>
 </resources>

+ 7 - 0
app/src/main/res/values/strings.xml

@@ -36,6 +36,13 @@
     <string name="sop_is_null">请选择SOP</string>
     <string name="ticket_type_is_null">请选择作业票类型</string>
 
+    <string name="login_tip">请输入用户名和密码或者刷卡进行登录</string>
+    <string name="please_input_account">请输入账户</string>
+    <string name="please_input_password">请输入密码</string>
+    <string name="account_or_password_error">账号或密码错误</string>
+    <string name="confirm">确定</string>
+    <string name="device_is_initializing">正在初始化设备……</string>
+
 
     <!--  演示页  -->
     <string name="presentation_select_sop">选择SOP</string>

+ 12 - 0
app/src/main/res/values/styles.xml

@@ -23,4 +23,16 @@
         <item name="android:thumb">@drawable/shape_thumb</item>
         <item name="android:track">@drawable/track_selector</item>
     </style>
+
+    <style name="CommonEditNew">
+        <item name="android:layout_width">wrap_content</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:textColor">@color/main_color</item>
+        <item name="android:textColorHint">@color/common_bg_black_30</item>
+        <item name="android:backgroundTint">@color/common_bg_black_30</item>
+        <item name="android:textSize">@dimen/common_font_txt_size_page_title</item>
+        <item name="android:maxLines">1</item>
+        <item name="android:singleLine">true</item>
+        <item name="android:ellipsize">end</item>
+    </style>
 </resources>