diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt index b99a477056..81077544a8 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt @@ -6,8 +6,10 @@ import android.content.ClipData import android.content.ClipboardManager import android.content.Context import android.content.Intent +import android.graphics.Bitmap import android.graphics.Color import android.graphics.drawable.ColorDrawable +import android.graphics.drawable.Drawable import android.os.Build import android.os.Environment.* import android.os.Process @@ -27,6 +29,9 @@ import androidx.core.content.ContextCompat import androidx.core.view.MenuCompat import androidx.lifecycle.lifecycleScope import chassis.Chassis +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.bumptech.glide.request.target.Target import com.mogo.cloud.network.cronet.NetworkQualityListener import com.mogo.cloud.network.cronet.QuicConfig import com.mogo.cloud.passport.MoGoAiCloudClient @@ -73,6 +78,7 @@ import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.FUNC_FUSION_COLOR import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.FUNC_MODE_DEMO import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.FUNC_MODE_RAIN +import com.mogo.eagle.core.function.api.map.deva.IMoGoMapScreenListener import com.mogo.eagle.core.function.api.setting.ISopSettingListener import com.mogo.eagle.core.function.api.telematic.IReceivedMsgListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager @@ -90,6 +96,7 @@ import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManage import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager +import com.mogo.eagle.core.function.call.map.CallerMapScreenListenerManager import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager import com.mogo.eagle.core.function.call.obu.CallerObuApiManager @@ -115,6 +122,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.mogo.permissions.BackgrounderPermission import com.mogo.eagle.core.utilcode.mogo.toast.TipToast import com.mogo.eagle.core.utilcode.util.ActivityUtils +import com.mogo.eagle.core.utilcode.util.AppStateManager import com.mogo.eagle.core.utilcode.util.AppUtils import com.mogo.eagle.core.utilcode.util.BarUtils import com.mogo.eagle.core.utilcode.util.CommonUtils @@ -140,23 +148,17 @@ import com.mogo.support.device.DevicesManager import com.mogo.support.device.IBindStateChangeListener import com.mogo.tts.base.IMogoTTSCallback import com.zhjt.mogo.adas.data.AdasConstants -import com.zhjt.mogo_core_function_devatools.rviz.common.config.SSHAccountConfig -import com.zhjt.mogo_core_function_devatools.rviz.dialog.ChangeDefaultConfigDialog -import com.zhjt.mogo_core_function_devatools.rviz.ui.activity.AutopilotCheckAct -import com.zhjt.mogo_core_function_devatools.rviz.ui.activity.FmdAct import com.zhjt.service.chain.ChainLog import kotlinx.android.synthetic.main.view_debug_setting.view.appVersionInfoLayout import kotlinx.android.synthetic.main.view_debug_setting.view.brakeThresholdDivider import kotlinx.android.synthetic.main.view_debug_setting.view.btChangeEnv import kotlinx.android.synthetic.main.view_debug_setting.view.btnAppReboot -import kotlinx.android.synthetic.main.view_debug_setting.view.btnAutoCheck import kotlinx.android.synthetic.main.view_debug_setting.view.btnBrakeThreshold import kotlinx.android.synthetic.main.view_debug_setting.view.btnConnectServerIp import kotlinx.android.synthetic.main.view_debug_setting.view.btnDeleteDB import kotlinx.android.synthetic.main.view_debug_setting.view.btnDisconnectIpc import kotlinx.android.synthetic.main.view_debug_setting.view.btnDrawFusion import kotlinx.android.synthetic.main.view_debug_setting.view.btnEnsureMap -import kotlinx.android.synthetic.main.view_debug_setting.view.btnFmd import kotlinx.android.synthetic.main.view_debug_setting.view.btnHdVisualAdjust import kotlinx.android.synthetic.main.view_debug_setting.view.btnIpcReboot import kotlinx.android.synthetic.main.view_debug_setting.view.btnPointCloudColor @@ -195,7 +197,6 @@ import kotlinx.android.synthetic.main.view_debug_setting.view.changesight_top_bt import kotlinx.android.synthetic.main.view_debug_setting.view.clDebugContain import kotlinx.android.synthetic.main.view_debug_setting.view.commonLayout import kotlinx.android.synthetic.main.view_debug_setting.view.controlCenterLayout -import kotlinx.android.synthetic.main.view_debug_setting.view.debugCenterLayout import kotlinx.android.synthetic.main.view_debug_setting.view.deviceBindLayout import kotlinx.android.synthetic.main.view_debug_setting.view.domainControllerLayout import kotlinx.android.synthetic.main.view_debug_setting.view.eagleEyeControllerLayout @@ -214,6 +215,9 @@ import kotlinx.android.synthetic.main.view_debug_setting.view.etThreshold import kotlinx.android.synthetic.main.view_debug_setting.view.exportAllLogs import kotlinx.android.synthetic.main.view_debug_setting.view.hdMapControllerLayout import kotlinx.android.synthetic.main.view_debug_setting.view.hmiControllerLayout +import kotlinx.android.synthetic.main.view_debug_setting.view.ivScreenTest +import kotlinx.android.synthetic.main.view_debug_setting.view.ivScreenTestThree +import kotlinx.android.synthetic.main.view_debug_setting.view.ivScreenTestTwo import kotlinx.android.synthetic.main.view_debug_setting.view.logLoadingView import kotlinx.android.synthetic.main.view_debug_setting.view.logcatCenterLayout import kotlinx.android.synthetic.main.view_debug_setting.view.obuConnectStatusTv @@ -234,7 +238,6 @@ import kotlinx.android.synthetic.main.view_debug_setting.view.tbChangeCurrentSki import kotlinx.android.synthetic.main.view_debug_setting.view.tbControlCenter import kotlinx.android.synthetic.main.view_debug_setting.view.tbControlPassengerDriverMonitor import kotlinx.android.synthetic.main.view_debug_setting.view.tbCronet -import kotlinx.android.synthetic.main.view_debug_setting.view.tbDebugCenter import kotlinx.android.synthetic.main.view_debug_setting.view.tbDeviceBind import kotlinx.android.synthetic.main.view_debug_setting.view.tbDomainController import kotlinx.android.synthetic.main.view_debug_setting.view.tbDrawPointCloudData @@ -373,7 +376,7 @@ internal class DebugSettingView @JvmOverloads constructor( IMoGoSweeperFutianCleanSystemListener, IMoGoObuInfoListener, ISopSettingListener, IViewControlListener, IMoGoCloudListener, IBindStateChangeListener, - IReceivedMsgListener { + IReceivedMsgListener , IMoGoMapScreenListener { companion object { private const val TAG = "DebugSettingView" @@ -608,10 +611,6 @@ internal class DebugSettingView @JvmOverloads constructor( } } //动态配置鹰眼显示MAP版本 - if(AppConfigInfo.mapShowName.isEmpty()){ - AppConfigInfo.mapShowName = CallerAutoPilotStatusListenerManager.getDockerVersion()+"" - SPUtils.getInstance().put("mapShowName", AppConfigInfo.mapShowName) - } etMapShowName.setText(AppConfigInfo.mapShowName) etMapShowName.text?.let { etMapShowName.setSelection(it.length) } btnEnsureMap.setOnClickListener { @@ -635,6 +634,13 @@ internal class DebugSettingView @JvmOverloads constructor( //隐藏状态中心 statusCenterLayout.visibility = View.GONE } + + + //高精地图屏幕截图 + CallerMapScreenListenerManager.addListener(TAG,this) + //开启高精地图截图 + CallerMapUIServiceManager.getMapUIController()?.getMapScreenShot() + } /** @@ -812,41 +818,6 @@ internal class DebugSettingView @JvmOverloads constructor( } } - /** - * 调试中心 - */ - tbDebugCenter.setOnCheckedChangeListener { buttonView, isChecked -> - if (isChecked) { - buttonView.setCompoundDrawables(null, null, iconDown, null) - //展示调试中心 - debugCenterLayout.visibility = View.VISIBLE - } else { - buttonView.setCompoundDrawables(null, null, iconRight, null) - //隐藏日志中心 - debugCenterLayout.visibility = View.GONE - } - } - /** - * 故障诊断 - */ - btnFmd.onClick{ - ActivityUtils.startActivity(FmdAct::class.java) - } - /** - * 故障诊断 长按设置 - */ - btnFmd.setOnLongClickListener { - ChangeDefaultConfigDialog(ActivityUtils.getTopActivity()).show() - true - } - - /** - * 自动驾驶检测 - */ - btnAutoCheck.onClick { - ActivityUtils.startActivity(AutopilotCheckAct::class.java) - } - /** * 日志中心 */ @@ -1422,6 +1393,45 @@ internal class DebugSettingView @JvmOverloads constructor( } } + override fun onMapScreen(bitmap: Bitmap) { + super.onMapScreen(bitmap) +// //图片保存本地 +// val currentDay = millis2String(System.currentTimeMillis(), TimeUtils.getMdFormat()) +// val fileDir: String = Environment.getExternalStorageDirectory().absolutePath + File.separator+ +// "MapScreen" + File.separator+ currentDay + File.separator +// val fileName = "$takeOverBagId.png" +// val path = fileDir + fileName +// if (!File(fileDir).exists()) { +// File(fileDir).mkdirs() +// } +// RecordBitmapUtils.bitmap2Path(bitmap,path) + + val forBitmap = ScreenUtilsTest.captureWithStatusBar(AppStateManager.currentActivity()) + +// Log.i("xuxinchao","bitmap="+forBitmap) +// +// val result = ScreenUtilsTest.mergeBitmaps(bitmap,forBitmap) + + + val result = ScreenUtilsTest.compoundBitmap(forBitmap,bitmap) + + ThreadUtils.runOnUiThread { + ivScreenTest.setImageBitmap(forBitmap) + + ivScreenTestTwo.setImageBitmap(bitmap) + + ivScreenTestThree.setImageBitmap(result) + + + } + + + + + //注销高精地图截图监听回调 + CallerMapScreenListenerManager.removeListener(TAG) + } + /** * 设置鹰眼本地参数配置监听 */ @@ -1570,17 +1580,13 @@ internal class DebugSettingView @JvmOverloads constructor( */ @SuppressLint("SetTextI18n") private fun setDomainControllerCheckedChangeListener() { - val string = SharedPrefsMgr.getInstance() - .getString(SharedPrefsConstants.inputIpDomainController, "192.168.1.") - etAutopilotIP.setText(string) + etAutopilotIP.setText("192.168.1.") etAutopilotIP.text?.let { etAutopilotIP.setSelection(it.length) } //设置工控机IP btnSetAutopilotIP.setOnClickListener { val autoPilotIp = etAutopilotIP.text.toString() if (autoPilotIp.isNotEmpty()) { - SSHAccountConfig.setRosMasterIp(autoPilotIp.split(":", ":").first()) CallerAutoPilotControlManager.resetIpAddress(autoPilotIp) - SharedPrefsMgr.getInstance().putString(SharedPrefsConstants.inputIpDomainController,autoPilotIp) } else { ToastUtils.showShort("请输入正确的IP地址") } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/ScreenUtilsTest.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/ScreenUtilsTest.java new file mode 100644 index 0000000000..13dbb93baf --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/ScreenUtilsTest.java @@ -0,0 +1,183 @@ +package com.mogo.eagle.core.function.hmi.ui.setting; + +import android.app.Activity; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.util.Log; +import android.view.View; +import android.view.WindowManager; + +public class ScreenUtilsTest { + + /** + * 获取当前屏幕截图,包含状态栏 + * + * @param activity activity + * @return Bitmap + */ + public static Bitmap captureWithStatusBar(Activity activity) { + View view = activity.getWindow().getDecorView(); + view.setDrawingCacheEnabled(true); + view.buildDrawingCache(); + Bitmap bmp = view.getDrawingCache(); + int width = getScreenWidth(activity); + int height = getScreenHeight(activity); + Bitmap ret = Bitmap.createBitmap(bmp, 0, 0, width, height); + view.destroyDrawingCache(); + return ret; + } + + /** + * 获取当前屏幕截图,不包含状态栏 + * + * @param activity activity + * @return Bitmap + */ + public static Bitmap captureWithoutStatusBar(Activity activity) { + View view = activity.getWindow().getDecorView(); + view.setDrawingCacheEnabled(true); + view.buildDrawingCache(); + Bitmap bmp = view.getDrawingCache(); + int statusBarHeight = getStatusBarHeight(activity); + int width = getScreenWidth(activity); + int height = getScreenHeight(activity); + Bitmap ret = Bitmap.createBitmap(bmp, 0, statusBarHeight, width, height - statusBarHeight); + view.destroyDrawingCache(); + return ret; + } + + /** + * 得到屏幕的高 + * + * @param context + * @return + */ + public static int getScreenHeight(Context context) { + WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + int height = wm.getDefaultDisplay().getHeight(); + return height; + } + + /** + * 得到屏幕的宽 + * + * @param context + * @return + */ + public static int getScreenWidth(Context context) { + WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + int width = wm.getDefaultDisplay().getWidth(); + return width; + } + + /** + * 获取状态栏高度 + * + * @param context 上下文 + * @return 状态栏高度 + */ + public static int getStatusBarHeight(Context context) { + int result = 0; + int resourceId = context.getResources() + .getIdentifier("status_bar_height", "dimen", "android"); + if (resourceId > 0) { + result = context.getResources().getDimensionPixelSize(resourceId); + } + return result; + } + + + public static Bitmap mergeBitmaps(Bitmap background, Bitmap foreground) { + // 创建一个新的Bitmap,大小为两个Bitmap的最大宽度和最大高度 + int width = Math.max(background.getWidth(), foreground.getWidth()); + int height = Math.max(background.getHeight(), foreground.getHeight()); + Bitmap mergedBitmap = Bitmap.createBitmap(width, height, background.getConfig()); + + Canvas canvas = new Canvas(mergedBitmap); + // 绘制背景图 + canvas.drawBitmap(background, 0, 0, null); + // 绘制前景图,可以调整位置 + canvas.drawBitmap(foreground, 0, 0, null); // 根据需要调整位置 + + return mergedBitmap; + } + + + public static Bitmap overlayBitmaps(Bitmap bitmap1, Bitmap bitmap2, int xOffset, int yOffset) { + // 创建一个新的Bitmap,其大小足以容纳两个重叠的bitmap + int width = Math.max(bitmap1.getWidth(), bitmap2.getWidth()); + int height = bitmap1.getHeight() + bitmap2.getHeight(); // 假定重叠在垂直方向 + Bitmap result = Bitmap.createBitmap(width, height, bitmap1.getConfig()); + + // 使用Canvas绘制bitmap1和bitmap2 + Canvas canvas = new Canvas(result); + canvas.drawBitmap(bitmap1, 0, 0, null); // 首先绘制bitmap1 + canvas.drawBitmap(bitmap2, xOffset, bitmap1.getHeight() + yOffset, null); // 然后绘制bitmap2,根据需要调整xOffset和yOffset + + return result; + } + + + /** + * 将2张图片合成 + * @param downBitmap 底部图片 + * @param upBitmap 置顶的图片 + * @return + */ + public static Bitmap compoundBitmap(Bitmap downBitmap,Bitmap upBitmap) + { + Bitmap mBitmap = downBitmap.copy(Bitmap.Config.ARGB_8888, true); + //如果遇到黑色,则显示downBitmap里面的颜色值,如果不是则显示upBitmap里面的颜色值 + //循环获得bitmap所有像素点 + int mBitmapWidth = mBitmap.getWidth(); + int mBitmapHeight = mBitmap.getHeight(); + //首先保证downBitmap和 upBitmap是一致的高宽大小 + Log.i("xuxinchao","mBitmapWidth="+mBitmapWidth); + Log.i("xuxinchao","mBitmapHeight="+mBitmapHeight); + Log.i("xuxinchao","upBitmap.getWidth()="+upBitmap.getWidth()); + Log.i("xuxinchao","upBitmap.getHeight()="+upBitmap.getHeight()); +// if(mBitmapWidth==upBitmap.getWidth() && mBitmapHeight==upBitmap.getHeight()) +// { +// for (int i = 0; i < mBitmapHeight; i++) { +// for (int j = 0; j < mBitmapWidth; j++) { +// //获得Bitmap 图片中每一个点的color颜色值 +// //将需要填充的颜色值如果不是 +// //在这说明一下 如果color 是全透明 或者全黑 返回值为 0 +// //getPixel()不带透明通道 getPixel32()才带透明部分 所以全透明是0x00000000 +// //而不透明黑色是0xFF000000 如果不计算透明部分就都是0了 +// int color = upBitmap.getPixel(j, i); +// Log.i("xuxinchao","color="+color); +// //将颜色值存在一个数组中 方便后面修改 +// if (color != Color.BLACK) { +// mBitmap.setPixel(j, i, upBitmap.getPixel(j, i)); //将白色替换成透明色 +// } +// } +// } +// } + + for (int i = 0; i < mBitmapHeight; i++) { + for (int j = 0; j < mBitmapWidth; j++) { + //获得Bitmap 图片中每一个点的color颜色值 + //将需要填充的颜色值如果不是 + //在这说明一下 如果color 是全透明 或者全黑 返回值为 0 + //getPixel()不带透明通道 getPixel32()才带透明部分 所以全透明是0x00000000 + //而不透明黑色是0xFF000000 如果不计算透明部分就都是0了 + int color = upBitmap.getPixel(j, i); + Log.i("xuxinchao","color="+color); + //将颜色值存在一个数组中 方便后面修改 + if (color != Color.BLACK) { + mBitmap.setPixel(j, i, upBitmap.getPixel(j, i)); //将白色替换成透明色 + } + } + } + + +// downBitmap.recycle(); +// upBitmap.recycle(); + return mBitmap; + } + + +} diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml index c8dac5aab8..97a88feb4c 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml @@ -742,6 +742,22 @@ android:layout_height="1dp" android:background="#F0F0F0" /> + + + + + + diff --git a/core/function-impl/mogo-core-function-patch/build.gradle b/core/function-impl/mogo-core-function-patch/build.gradle index ba300f0ce0..de0a0dcab5 100644 --- a/core/function-impl/mogo-core-function-patch/build.gradle +++ b/core/function-impl/mogo-core-function-patch/build.gradle @@ -85,7 +85,7 @@ rootProject.gradle.taskGraph.whenReady { TaskExecutionGraph graph -> def packageTask = (PackageApplication) t2 def outDir = packageTask.outputDirectory def apkNames = packageTask.apkNames - if (apkNames != null && apkNames.size() > 0) { + if (false) { apkNames.forEach { apkName -> def apk = new File(outDir, apkName) def lp = new File(rootProject.rootDir, "local.properties")