diff --git a/OCH/mogo-och-common-module/build.gradle b/OCH/mogo-och-common-module/build.gradle index 24b27d9db3..3de8cdf00a 100644 --- a/OCH/mogo-och-common-module/build.gradle +++ b/OCH/mogo-och-common-module/build.gradle @@ -57,6 +57,8 @@ dependencies { implementation rootProject.ext.dependencies.arouter kapt rootProject.ext.dependencies.aroutercompiler + implementation rootProject.ext.dependencies.litezxing + if (Boolean.valueOf(USE_MAVEN_PACKAGE)) { api rootProject.ext.dependencies.mogoutils api rootProject.ext.dependencies.mogocommons diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/QRUtils.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/QRUtils.kt new file mode 100644 index 0000000000..c6c1b37c5a --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/QRUtils.kt @@ -0,0 +1,117 @@ +package com.mogo.och.common.module.utils + +import android.graphics.Bitmap +import android.graphics.Canvas +import com.google.zxing.BarcodeFormat +import com.google.zxing.EncodeHintType +import com.google.zxing.common.BitMatrix +import com.google.zxing.qrcode.QRCodeWriter +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel +import java.util.* + + +/** + * isDeleteWhite 是否删除白边 + */ +fun createQRCode(address: String, width: Int, height: Int,isDeleteWhite: Boolean): Bitmap? { + val hints = Hashtable() + hints[EncodeHintType.CHARACTER_SET] = "utf-8" + hints[EncodeHintType.ERROR_CORRECTION] = ErrorCorrectionLevel.H + hints[EncodeHintType.MARGIN] = if (isDeleteWhite) 1 else 0 + var bitMatrix = QRCodeWriter().encode( + address, + BarcodeFormat.QR_CODE, width, height, hints + ) + + if (isDeleteWhite) { + //删除白边 + bitMatrix = deleteWhite(bitMatrix) + } + val widthNew = bitMatrix.width + val heightNew = bitMatrix.height + + val pixels = IntArray(widthNew * heightNew) + //下面这里按照二维码的算法,逐个生成二维码的图片, + //两个for循环是图片横列扫描的结果 + for (y in 0 until heightNew) { + for (x in 0 until widthNew) { + if (bitMatrix.get(x, y)) { + pixels[y * widthNew + x] = -0x1000000 + } else { + pixels[y * widthNew + x] = -0x1 + } + } + } + //生成二维码图片的格式,使用ARGB_8888 + var bitmap = Bitmap.createBitmap(widthNew, heightNew, Bitmap.Config.ARGB_8888) + bitmap.setPixels(pixels, 0, widthNew, 0, 0, widthNew, heightNew) + return bitmap +} + +/** + * 删除白色边框 + * + * @param matrix matrix + * @return BitMatrix + */ +private fun deleteWhite(matrix: BitMatrix): BitMatrix? { + val rec = matrix.enclosingRectangle + val resWidth = rec[2] + 1 + val resHeight = rec[3] + 1 + val resMatrix = BitMatrix(resWidth, resHeight) + resMatrix.clear() + for (i in 0 until resWidth) { + for (j in 0 until resHeight) { + if (matrix[i + rec[0], j + rec[1]]) resMatrix[i] = j + } + } + return resMatrix +} + +fun createQRCodeWithPicture(bmCenter: Bitmap,address: String, width: Int, height: Int,isDeleteWhite: Boolean): Bitmap?{ + var qrCode = createQRCode(address,width,height,isDeleteWhite) + //8,创建一个bitmap对象用于作为其图标 + qrCode?.let { + val resultBitmap = addLogo(it,bmCenter) + if (resultBitmap != null){ + return resultBitmap + } + } + return null +} + +/** + * 用于向创建的二维码中添加一个logo + * @param bmQr + * @param bmCenter + * @return + */ +fun addLogo(bmQr: Bitmap, bmCenter:Bitmap) :Bitmap?{ + if (bmQr == null) { + return null + } + if (bmCenter == null) { + return bmQr + } + + //获取图片的宽高 + val bmQrWidth = bmQr.width + val bmQrHeight = bmQr.height + val bmCenterWidth = bmCenter.width + val bmCenterHeight = bmCenter.height + + var bitmap = Bitmap.createBitmap(bmQrWidth, bmQrHeight, Bitmap.Config.ARGB_8888) + try { + var canvas = Canvas(bitmap) + canvas.drawBitmap(bmQr, 0f, 0f, null) + canvas.drawBitmap(bmCenter, ((bmQrWidth-bmCenterWidth)/2-bmCenterWidth/2).toFloat(), + ((bmQrHeight-bmCenterHeight)/2-bmCenterHeight/2).toFloat(), null) + + canvas.save() + canvas.restore() + } catch (e: Exception) { + bitmap = null + e.stackTrace + } + return bitmap +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/BindQRCodeDialog.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/BindQRCodeDialog.kt new file mode 100644 index 0000000000..8648759758 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/BindQRCodeDialog.kt @@ -0,0 +1,76 @@ +package com.mogo.och.common.module.wigets + +import android.content.Context +import android.graphics.Bitmap +import androidx.appcompat.widget.AppCompatImageView +import androidx.appcompat.widget.AppCompatTextView +import androidx.lifecycle.LifecycleObserver +import com.mogo.eagle.core.function.hmi.dialog.BaseFloatDialog +import com.mogo.och.common.module.R + +/** + * 带有title, tip,confirm,cancel的dialog + */ +class BindQRCodeDialog: BaseFloatDialog, LifecycleObserver { + + private var qrBm : AppCompatImageView? = null + private var qrCancel: AppCompatTextView? = null + private var qrTitle: AppCompatTextView? = null + + private var clickListener: ClickListener? = null + + constructor(builder: Builder,context: Context) : super(context) { + qrTitle?.text = builder.titleStr + qrCancel?.text = builder.cancelStr + qrBm?.setImageBitmap(builder.qrBm) + } + + init{ + setContentView(R.layout.bind_driver_qr_view) + + setCanceledOnTouchOutside(true) + + qrTitle = findViewById(R.id.qr_title) + qrBm = findViewById(R.id.qr_bm) + qrCancel = findViewById(R.id.bind_qr_cancel) + + qrCancel?.setOnClickListener { + clickListener?.cancel() + dismiss() + } + } + + fun setClickListener(clickListener: ClickListener) { + this.clickListener = clickListener + } + + interface ClickListener{ + fun cancel() + } + + class Builder{ + var titleStr:String = "" + var cancelStr:String = "" + var qrBm: Bitmap? = null + + fun title(title: String) : Builder{ + this.titleStr = title + return this + } + + fun cancelStr(cancel: String) : Builder{ + this.cancelStr = cancel + return this + } + + fun qrBm(bm: Bitmap) : Builder{ + this.qrBm = bm + return this + } + + fun build(context: Context): BindQRCodeDialog? { + return BindQRCodeDialog(this,context) + } + } + +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/OCHCommitDialog.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/OCHCommitDialog.kt index a9a27faf36..835c82411a 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/OCHCommitDialog.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/OCHCommitDialog.kt @@ -49,13 +49,6 @@ class OCHCommitDialog: BaseFloatDialog, LifecycleObserver { this.clickListener = clickListener } - fun showUpgradeDialog(){ - if(isShowing){ - return - } - show() - } - interface ClickListener{ fun confirm() fun cancel() diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-xhdpi/icon_qr_center_logo.png b/OCH/mogo-och-common-module/src/main/res/drawable-xhdpi/icon_qr_center_logo.png new file mode 100644 index 0000000000..edce11b56b Binary files /dev/null and b/OCH/mogo-och-common-module/src/main/res/drawable-xhdpi/icon_qr_center_logo.png differ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable/bind_driver_qr_bg.xml b/OCH/mogo-och-common-module/src/main/res/drawable/bind_driver_qr_bg.xml new file mode 100644 index 0000000000..4255977875 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/res/drawable/bind_driver_qr_bg.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/res/layout/bind_driver_qr_view.xml b/OCH/mogo-och-common-module/src/main/res/layout/bind_driver_qr_view.xml new file mode 100644 index 0000000000..4707e43487 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/res/layout/bind_driver_qr_view.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/res/values/colors.xml b/OCH/mogo-och-common-module/src/main/res/values/colors.xml index 8db55d8e50..f4d8555616 100644 --- a/OCH/mogo-och-common-module/src/main/res/values/colors.xml +++ b/OCH/mogo-och-common-module/src/main/res/values/colors.xml @@ -11,4 +11,7 @@ #4D000000 #3B4577 + + #66B8BFE8 + #3B4577 \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/res/values/strings.xml b/OCH/mogo-och-common-module/src/main/res/values/strings.xml index 94cc6ad34a..9ca9718279 100644 --- a/OCH/mogo-och-common-module/src/main/res/values/strings.xml +++ b/OCH/mogo-och-common-module/src/main/res/values/strings.xml @@ -1,5 +1,5 @@ - + 欢迎您登录 登录 @@ -30,4 +30,7 @@ 感谢您体验\'蘑菇车联\'自动驾驶小巴车,本次旅程已结束,我们下次乘车再见 Thank you for experiencing the self-driving minibus. See you next time 자율주행 버스를 체험해 주셔서 감사합니다. 다음에 또 뵙겠습니다 + + 取消 + 扫描二维码完成车辆绑定 \ No newline at end of file diff --git a/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/constant/URLConst.kt b/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/constant/URLConst.kt deleted file mode 100644 index dce7719222..0000000000 --- a/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/constant/URLConst.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.mogo.och.bus.constant - -import com.mogo.commons.debug.DebugConfig - -/** - * Created on 2021/12/6 - */ -class URLConst { - companion object { - - } -} \ No newline at end of file diff --git a/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/fragment/BusFragment.java b/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/fragment/BusFragment.java index cd85e7eaa1..65a4763f31 100644 --- a/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/fragment/BusFragment.java +++ b/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/fragment/BusFragment.java @@ -1,8 +1,9 @@ package com.mogo.och.bus.fragment; import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS; - import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.os.Bundle; import android.view.View; import android.widget.TextView; @@ -13,7 +14,9 @@ import androidx.constraintlayout.widget.Group; import androidx.annotation.Nullable; import com.alibaba.android.arouter.launcher.ARouter; +import com.mogo.cloud.passport.MoGoAiCloudClientConfig; import com.mogo.commons.AbsMogoApplication; +import com.mogo.eagle.core.data.config.FunctionBuildConfig; import com.mogo.eagle.core.data.map.CenterLine; import com.mogo.eagle.core.data.temp.EventLogout; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; @@ -36,6 +39,8 @@ import com.mogo.och.common.module.biz.constant.OchCommonConst; import com.mogo.och.common.module.biz.provider.LoginService; import com.mogo.och.common.module.utils.BlinkAnimationUtil; import com.mogo.och.common.module.utils.OCHThreadPoolManager; +import com.mogo.och.common.module.utils.QRUtilsKt; +import com.mogo.och.common.module.wigets.BindQRCodeDialog; import com.mogo.och.common.module.wigets.MarqueeTextView; import com.mogo.och.common.module.wigets.OCHCommitDialog; @@ -45,6 +50,8 @@ import org.greenrobot.eventbus.ThreadMode; import java.util.List; import java.util.Objects; +import me.jessyan.autosize.utils.AutoSizeUtils; + /** * 网约车小巴界面 @@ -124,6 +131,22 @@ public class BusFragment extends BaseBusTabFragment if (eventLogout.getMessgae() == EventLogout.LOGOUT_TYPE){ CallerLogger.INSTANCE.d(M_BUS + TAG,"changeOverview Event消息去登出"); mPresenter.logout(); + }else if (eventLogout.getMessgae() == EventLogout.SHOW_QR_TYPE){ //显示二维码 + CallerLogger.INSTANCE.d(M_BUS + TAG,"changeOverview Event qrcode"); + String qrUrl = String.format(FunctionBuildConfig.urlJson.getBindDriverQRUrl(), + MoGoAiCloudClientConfig.getInstance().getSn()); + Bitmap bmQr = QRUtilsKt.createQRCodeWithPicture( + BitmapFactory.decodeResource(getResources(), R.drawable.icon_qr_center_logo) + ,qrUrl, AutoSizeUtils.dp2px(getContext(),340f), + AutoSizeUtils.dp2px(getContext(),340f),true); + if (bmQr != null){ + BindQRCodeDialog.Builder builder = new BindQRCodeDialog.Builder(); + builder.title(getString(R.string.bind_driver_qr_title)) + .cancelStr(getString(R.string.qr_cancel)) + .qrBm(bmQr).build(getContext()).show(); + }else { + CallerLogger.INSTANCE.d(M_BUS + TAG,"bmQr = null "); + } } } diff --git a/app/urlConfig.json b/app/urlConfig.json index f05fe5d46e..a767ba07c1 100644 --- a/app/urlConfig.json +++ b/app/urlConfig.json @@ -7,7 +7,8 @@ "socket_base_url": "", "socket_tech_url": "", "eagle_mis_url": "", - "eagle_dns_url": "" + "eagle_dns_url": "", + "bind_driver_qr_url": "" }, "online": { "och_url": "https://tech.zhidaohulian.com", @@ -16,7 +17,8 @@ "socket_base_url": "", "socket_tech_url": "", "eagle_mis_url": "", - "eagle_dns_url": "" + "eagle_dns_url": "", + "bind_driver_qr_url": "" }, "demo": { "och_url": "http://tech-dev.zhidaohulian.com", @@ -25,7 +27,8 @@ "socket_base_url": "", "socket_tech_url": "", "eagle_mis_url": "", - "eagle_dns_url": "" + "eagle_dns_url": "", + "bind_driver_qr_url": "" } }, "dali": { @@ -36,7 +39,8 @@ "socket_base_url": "https://och-a.zhidaozhixing.com/arch/push/", "socket_tech_url": "https://och-a.zhidaozhixing.com/arch/", "eagle_mis_url": "http://eagle-mis-a.zhidaozhixing.com/", - "eagle_dns_url": "http://eagle-dns-a.zhidaozhixing.com/" + "eagle_dns_url": "http://eagle-dns-a.zhidaozhixing.com/", + "bind_driver_qr_url": "https://tech.zhidaohulian.com?pipe=asafety&sn=%1$s" }, "online": { "och_url": "https://och-driver-eh.zhidaozhixing.com:18182", @@ -45,7 +49,8 @@ "socket_base_url": "https://och-driver-eh.zhidaozhixing.com:18182/arch/push/", "socket_tech_url": "https://och-driver-eh.zhidaozhixing.com:18182/arch/", "eagle_mis_url": "https://och-hailing-eh.zhidaozhixing.com:18182/", - "eagle_dns_url": "https://och-hailing-eh.zhidaozhixing.com:18182/" + "eagle_dns_url": "https://och-hailing-eh.zhidaozhixing.com:18182/", + "bind_driver_qr_url": "https://tech.zhidaohulian.com?pipe=ehsafety&sn=%1$s" }, "demo": { "och_url": "https://och-a.zhidaozhixing.com", @@ -54,7 +59,8 @@ "socket_base_url": "https://och-a.zhidaozhixing.com/arch/push/", "socket_tech_url": "https://och-a.zhidaozhixing.com/arch/", "eagle_mis_url": "http://och-hailing-eh.zhidaozhixing.com:18181/", - "eagle_dns_url": "http://och-hailing-eh.zhidaozhixing.com:18181/" + "eagle_dns_url": "http://och-hailing-eh.zhidaozhixing.com:18181/", + "bind_driver_qr_url": "https://tech.zhidaohulian.com?pipe=ehsafety&sn=%1$s" } }, "yantai": { @@ -65,7 +71,8 @@ "socket_base_url": "https://och-a.zhidaozhixing.com/arch/push/", "socket_tech_url": "https://och-a.zhidaozhixing.com/arch/", "eagle_mis_url": "http://eagle-mis-a.zhidaozhixing.com/", - "eagle_dns_url": "http://eagle-dns-a.zhidaozhixing.com/" + "eagle_dns_url": "http://eagle-dns-a.zhidaozhixing.com/", + "bind_driver_qr_url": "https://tech.zhidaohulian.com?pipe=asafety&sn=%1$s" }, "online": { "och_url": "https://och-driver-yt.zhidaozhixing.com", @@ -74,7 +81,8 @@ "socket_base_url": "https://och-driver-yt.zhidaozhixing.com/arch/push/", "socket_tech_url": "https://och-driver-yt.zhidaozhixing.com/arch/", "eagle_mis_url": "https://och-hailing-yt.zhidaozhixing.com/", - "eagle_dns_url": "https://och-hailing-yt.zhidaozhixing.com/" + "eagle_dns_url": "https://och-hailing-yt.zhidaozhixing.com/", + "bind_driver_qr_url": "https://tech.zhidaohulian.com?pipe=ytsafety&sn=%1$s" }, "demo": { "och_url": "https://och-a.zhidaozhixing.com", @@ -83,7 +91,8 @@ "socket_base_url": "https://och-a.zhidaozhixing.com/arch/push/", "socket_tech_url": "https://och-a.zhidaozhixing.com/arch/", "eagle_mis_url": "http://eagle-mis-a.zhidaozhixing.com/", - "eagle_dns_url": "http://eagle-dns-a.zhidaozhixing.com/" + "eagle_dns_url": "http://eagle-dns-a.zhidaozhixing.com/", + "bind_driver_qr_url": "https://tech.zhidaohulian.com?pipe=ytsafety&sn=%1$s" } } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/BusOperationView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/BusOperationView.kt index ce6bab6d96..a77c2a1970 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/BusOperationView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/BusOperationView.kt @@ -31,14 +31,27 @@ class BusOperationView @JvmOverloads constructor( actvAccountPhone.text = phoneMask(SharedPrefs.getInstance(it).getString("och_account","")) } clickPersonalRightView() + clickQRBtn() } + private fun clickQRBtn() { + actvAccountQR.onClick { + EventBus.getDefault().post(EventLogout(EventLogout.SHOW_QR_TYPE)) + } + } + private fun initPersonalIcon() { if(AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode)){ ivGotoPersonalInfo.visibility = VISIBLE }else{ ivGotoPersonalInfo.visibility = GONE } + + if (AppIdentityModeUtils.isShuttle(FunctionBuildConfig.appIdentityMode)) { + actvAccountQR.visibility = VISIBLE + }else{ + actvAccountQR.visibility = GONE + } } private fun clickPersonalRightView() { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_bind_driver_qrcode.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_bind_driver_qrcode.png new file mode 100755 index 0000000000..533c0a3caa Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_bind_driver_qrcode.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_och_bus_operation.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_och_bus_operation.xml index 7e19003a4d..af4a39dc8e 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_och_bus_operation.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_och_bus_operation.xml @@ -60,6 +60,16 @@ android:textColor="@android:color/white" android:layout_width="wrap_content" android:layout_height="wrap_content"/> + +