diff --git a/app_ipc_monitoring/build.gradle b/app_ipc_monitoring/build.gradle index a023efe6fa..c72bbeb32c 100644 --- a/app_ipc_monitoring/build.gradle +++ b/app_ipc_monitoring/build.gradle @@ -69,8 +69,8 @@ dependencies { androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' implementation rootProject.ext.dependencies.gson implementation project(':libraries:mogo-adas') - implementation project(':libraries:mogo-adas-backgrounder-permission') -// implementation 'com.zhidao.support.adas:high:2.6.6.0' + implementation project(':libraries:mogo-adas-other') +// implementation 'com.zhidao.support.adas:high:2.7.0.0' // implementation 'com.zhjt.mogo.adas.data:adas-data:2.6.6.0' compileOnly project(':core:mogo-core-data') implementation project(':core:mogo-core-utils') diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/AutopilotConfigActivity.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/AutopilotConfigActivity.java index c49b03a313..925e539745 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/AutopilotConfigActivity.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/AutopilotConfigActivity.java @@ -309,22 +309,23 @@ public class AutopilotConfigActivity extends BaseActivity { } private void onBack() { - new AlertDialog.Builder(this) - .setTitle("退出提示") - .setMessage("是否配置页面") - .setNegativeButton("取消", - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.cancel(); - } - }) - .setPositiveButton("确认", - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int whichButton) { - finish(); - } - }).show(); + finish(); +// new AlertDialog.Builder(this) +// .setTitle("退出提示") +// .setMessage("是否配置页面") +// .setNegativeButton("取消", +// new DialogInterface.OnClickListener() { +// @Override +// public void onClick(DialogInterface dialog, int which) { +// dialog.cancel(); +// } +// }) +// .setPositiveButton("确认", +// new DialogInterface.OnClickListener() { +// public void onClick(DialogInterface dialog, int whichButton) { +// finish(); +// } +// }).show(); } //返回键处理 diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java index a87b053975..1ba98d69a3 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java @@ -89,6 +89,9 @@ import com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS; import com.zhidao.support.adas.high.common.CupidLogUtils; import com.zhidao.support.adas.high.common.ProtocolStatus; import com.zhidao.support.adas.high.common.ReceiveTimeoutManager; +import com.zhidao.support.adas.high.other.permission.BackgrounderPermission; +import com.zhidao.support.adas.high.other.permission.OnAdasPermissionListener; +import com.zhidao.support.adas.high.other.router.RouterActivity; import java.net.Inet4Address; import java.net.InetAddress; @@ -282,7 +285,12 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas tvConnectState = findViewById(R.id.tv_connect_state); ipcIp = findViewById(R.id.ipc_ip); localIp = findViewById(R.id.local_ip); - + findViewById(R.id.btn_router).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + RouterActivity.newInstance(MainActivity.this, false); + } + }); role.setSelected(BuildConfig.IS_CLIENT); if (BuildConfig.IS_CLIENT) { @@ -527,21 +535,25 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas } }); -// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { -// String str = "后台运行:" + (AdasManager.getInstance().isPermissionLongBackgroundRunning(this) ? "已优化" : "未优化"); -// background.setText(Html.fromHtml(str, Html.FROM_HTML_MODE_LEGACY)); -// background.setOnClickListener(new View.OnClickListener() { -// @Override -// public void onClick(View v) { -// -//// Permission.requestAddDataSaverWhite(MainActivity.this); -//// AdasManager.getInstance().requestIgnoreBatteryOptimizations(MainActivity.this); -// AdasManager.getInstance().showPermissionLongBackgroundRunningDialog(MainActivity.this); -// } -// }); -// } else { -// background.setVisibility(View.GONE); -// } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + String str = "后台运行:" + (BackgrounderPermission.getInstance().isPermissionLongBackgroundRunning(this) ? "已优化" : "未优化"); + background.setText(Html.fromHtml(str, Html.FROM_HTML_MODE_LEGACY)); + background.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + BackgrounderPermission.getInstance().showPermissionLongBackgroundRunningDialog(MainActivity.this); + } + }); + BackgrounderPermission.getInstance().setListener(new OnAdasPermissionListener() { + @Override + public void onBackgrounderPermission(boolean isAllow) { + String str = "后台运行:" + (isAllow ? "已优化" : "未优化"); + background.setText(Html.fromHtml(str, Html.FROM_HTML_MODE_LEGACY)); + } + }); + } else { + background.setVisibility(View.GONE); + } } private void showListPopupWindow() { diff --git a/app_ipc_monitoring/src/main/res/drawable/icon_dev_status_net_disable.png b/app_ipc_monitoring/src/main/res/drawable/icon_dev_status_net_disable.png new file mode 100644 index 0000000000..885b4603f0 Binary files /dev/null and b/app_ipc_monitoring/src/main/res/drawable/icon_dev_status_net_disable.png differ diff --git a/app_ipc_monitoring/src/main/res/drawable/icon_dev_status_net_enable.png b/app_ipc_monitoring/src/main/res/drawable/icon_dev_status_net_enable.png new file mode 100644 index 0000000000..ea9f95dfa3 Binary files /dev/null and b/app_ipc_monitoring/src/main/res/drawable/icon_dev_status_net_enable.png differ diff --git a/app_ipc_monitoring/src/main/res/drawable/selector_router.xml b/app_ipc_monitoring/src/main/res/drawable/selector_router.xml new file mode 100644 index 0000000000..6d820136c1 --- /dev/null +++ b/app_ipc_monitoring/src/main/res/drawable/selector_router.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app_ipc_monitoring/src/main/res/layout/item_main.xml b/app_ipc_monitoring/src/main/res/layout/item_main.xml index 2c33569728..4f3acb94c9 100644 --- a/app_ipc_monitoring/src/main/res/layout/item_main.xml +++ b/app_ipc_monitoring/src/main/res/layout/item_main.xml @@ -283,6 +283,14 @@ android:layout_marginStart="-42dp" android:scaleType="centerInside" android:src="@drawable/selector_history_ip" /> + + \ No newline at end of file diff --git a/libraries/mogo-adas-backgrounder-permission/README.md b/libraries/mogo-adas-backgrounder-permission/README.md deleted file mode 100644 index 2014927e77..0000000000 --- a/libraries/mogo-adas-backgrounder-permission/README.md +++ /dev/null @@ -1,463 +0,0 @@ -#### 说明 -# ADAS LIB -## 与工控机交互LIB - -# 使用方法参见【app_ipc_monitoring】中的代码 - -## 可用接口 -~~~java - /** - * 设置多设备监听 - * - * @param l 监听 - */ - AdasManager.getInstance().setOnMultiDeviceListener(OnMultiDeviceListener l); -~~~ -~~~java - /** - * 设置工控机数据监听 - * - * @param l 监听 - */ - AdasManager.getInstance().setOnAdasListener(OnAdasListener l); -~~~ -~~~java - /** - * 创建一个连接 - * - * @param options 连接参数 - * @param onAdasConnectStatusListener 连接状态监听 - */ - AdasManager.getInstance().create(AdasOptions options, OnAdasConnectStatusListener onAdasConnectStatusListener); -~~~ -~~~java - /** - * ADAS LIB 版本 - * - * @return 版本 - */ - AdasManager.getInstance().getAdasVersion(); -~~~ -~~~java - /** - * 获取协议版本 - * - * @return 版本 - */ - AdasManager.getInstance().getProtocolVersion(); -~~~ -~~~java - /** - * 获取工控机配置信息 - * - * @return 配置信息 未连接为null 断开连接会清空 - */ - AdasManager.getInstance().getCarConfig(); -~~~ -~~~java - /** - * 连接工控机 - */ - AdasManager.getInstance().connect(); -~~~ -~~~java - /** - * 与工控机断开连接 - */ - AdasManager.getInstance().disconnect(); -~~~ -~~~java - /** - * 获取当前工控机的链接状态 - * - * @return {@link Constants.IPC_CONNECTION_STATUS} - */ - AdasManager.getInstance().getIpcConnectionStatus(); -~~~ -~~~java - - /** - * Log是否开启打印 - */ - AdasManager.getInstance().setEnableLog(boolean isEnableLog); -~~~ -~~~java - /** - * 系统命令请求, 比如系统重启,启用新镜像 - * - * @param type SystemCmdType。SYSTEMCMD_REBOOT 重启所有节点 - * SystemCmdType。SYSTEMCMD_EMPLOY_NEW_IMAGE 使用新镜像(推镜像) - * SystemCmdType。SYSTEMCMD_SHUT_DOWN 关机 - * @return boolean - */ - AdasManager.getInstance().sendSystemCmdReq(@NonNull MessagePad.SystemCmdType type); -~~~ -~~~java - /** - * 解析工控机发送过来的数据 - * 多设备时使用 - * - * @param bytes 数据 - */ - AdasManager.getInstance().parseIPCData(byte[] bytes); -~~~ -~~~java - /** - * 获取工控机链接配置 - * - * @return 工控机链接参数 - */ - AdasManager.getInstance().getAdasOptions(); -~~~ -~~~java - /** - * 获取已经链接成功的工控机IP 未连接为null - * - * @return ip null:表示未连接 - */ - AdasManager.getInstance().getIpcConnectedIp(); -~~~ -~~~java - /** - * 获取已经链接成功的工控机端口 - * - * @return 端口 未连接为默认端口 - */ - AdasManager.getInstance().getIpcConnectedPort(); -~~~ -~~~java - - /** - * 自动驾驶设备基础信息应答 - * - * @param sn SN - * @param environment 1: 研发环境, 2:测试环境, 3:生产环境 4:演示环境 - * @return - */ - AdasManager.getInstance().sendBasicInfoResp(@NonNull String sn, int environment); -~~~ -~~~java - /** - * 设置自动驾驶模式 启动自动驾驶 - * - * @param mode 1: enter autopilot mode, 0: quit autopilot mode - * @param source 命令来源: 0: pad模拟(模拟时routeInfo传null), 1: AICloud业务 - * @param routeInfo 自动驾驶路径信息 - * @return - */ - AdasManager.getInstance().sendAutoPilotModeReq(int mode, int source, MessagePad.RouteInfo routeInfo); -~~~ -~~~java - /** - * 设置演示模式 - * - * @param enable 1: enable, 0: disable - * @return - */ - AdasManager.getInstance().sendDemoModeReq(int enable); -~~~ -~~~java - /** - * 车机基础信息请求 - * - * @return - */ - AdasManager.getInstance().sendCarConfigReq(); -~~~ -~~~java - /** - * 记录人工接管原因 - * - * @param key bag key 唯一标识 - * @param filename 文件路径 - * @param reasonID 接管原因id - * @param reason 接管原因 - * @return - */ - AdasManager.getInstance().sendRecordCause(long key, @NonNull String filename, @NonNull String reasonID, @NonNull String reason); -~~~ -~~~java - /** - * 同下 - * - * @param id - * @param type - * @return - */ - AdasManager.getInstance().startRecordPackage(int id, int type); -~~~ -~~~java - /** - * 同下 - * - * @param id - * @param type - * @return - */ - AdasManager.getInstance().startRecordPackage(int id, int duration, int type); -~~~ -~~~java - /** - * 同下 - * - * @param id - * @param type - * @return - */ - - AdasManager.getInstance().stopRecordPackage(int id, int type); -~~~ -~~~java - /** - * 数据采集请求 主动录制Bag包 - * - * @param id 采集id - * @param duration 采集时间长 - * @param type 采集类型, 1:badcase, 2: map; 3: rests - * @param isRecord 采集指令, true: 采集, false: 停止采集 - * @param sustain 是否持续采集 - * @return - */ - - AdasManager.getInstance().sendRecordData(int id, int duration, int type, boolean isRecord); -~~~ -~~~java - /** - * 设置自动驾驶最大速度 - * - * @param speedLimit 最大车辆速度 m/s - * @return - */ - AdasManager.getInstance().sendAutopilotSpeedReq(double speedLimit); -~~~ -~~~java - /** - * 发送红绿灯数据到工控机 - * - * @param crossID roadID - * @param latitude - * @param longitude - * @param heading 红绿灯方向 - * @param direction 路的航向角 - * @param lightId 红绿灯ID - * @param laneNo 车道号 - * @param arrowNo 当前车道对应地面要素转向 - * @param flashYellow 黄灯总时间 - * @param laneDetail 灯态具体信息 - * @return - */ - AdasManager.getInstance().sendTrafficLightData(@NonNull String crossID, double latitude, double longitude, @NonNull String heading, @NonNull String direction, int lightId, int laneNo, int arrowNo, int flashYellow, MessagePad.TrafficLightDetail laneDetail); -~~~ -~~~java - /** - * 自动驾驶路径请求 - * - * @return - */ - AdasManager.getInstance().sendGlobalPathReq(); -~~~ -~~~java - /** - * 获取工控机固定IP列表 - * - * @return 返回默认工控机IP列表 - */ - AdasManager.getInstance().getIPCFixationIPList(Context context); -~~~ -~~~java - /** - * 增加工控机固定IP - * - * @param ipcIP IP - */ - AdasManager.getInstance().addIPCFixationIP(Context context, String ipcIP); -~~~ -~~~java - /** - * 删除指定的工控机固定IP - * - * @param ipcIP IP - */ - AdasManager.getInstance().delIPCFixationIP(Context context, String ipcIP); -~~~ -~~~java - /** - * 删除所有工控机固定IP - */ - AdasManager.getInstance().delIPCFixationIP(Context context); -~~~ - - -## OnAdasListener -### 工控机数据回调 -#### 回调中对象的字段详情参见各个proto文件 -~~~java - /** - * 自动驾驶局部轨迹 前车引导线 - * - * @param header 头 - * @param trajectory 数据 - */ - void onTrajectory(MessagePad.Header header, MessagePad.Trajectory trajectory); -~~~ -~~~java - /** - * 障碍物 他车数据 - * - * @param header 头 - * @param trackedObjects 数据 - */ - void onTrackedObjects(MessagePad.Header header, MessagePad.TrackedObjects trackedObjects); -~~~ -~~~java - /** - * 惯导信息 - * - * @param header 头 - * @param gnssInfo 数据 - */ - void onGnssInfo(MessagePad.Header header, MessagePad.GnssInfo gnssInfo); -~~~ -~~~java - /** - * 底盘信息, 透传底盘状态,pb参考底盘 - * - * @param header 头 - * @param vehicleState 数据 - */ - void onVehicleState(MessagePad.Header header, VehicleStateOuterClass.VehicleState vehicleState); -~~~ -~~~java - /** - * 自动驾驶状态 - * - * @param header 头 - * @param autopilotState 数据 - */ - void onAutopilotState(MessagePad.Header header, MessagePad.AutopilotState autopilotState); -~~~ -~~~java - /** - * 监控事件报告 - * - * @param header 头 - * @param mogoReportMessage 数据 - */ - void onReportMessage(MessagePad.Header header, MogoReportMsg.MogoReportMessage mogoReportMessage); -~~~ -~~~java - /** - * 感知红绿灯 - * - * @param header 头 - * @param trafficLights 感知红绿灯 - */ - void onPerceptionTrafficLight(MessagePad.Header header, TrafficLightOuterClass.TrafficLights trafficLights); -~~~ -~~~java - /** - * 他车轨迹预测 - * - * @param header 头 - * @param predictionObjects 他车轨迹预测数据 - */ - void onPredictionObstacleTrajectory(MessagePad.Header header, Prediction.mPredictionObjects predictionObjects); -~~~ -~~~java - /** - * 自动驾驶设备基础信息请求 - * - * @param header 头 - * @param basicInfoReq 数据 目前没有任何参数 - */ - void onBasicInfoReq(MessagePad.Header header, MessagePad.BasicInfoReq basicInfoReq); -~~~ -~~~java - /** - * 车机基础信息应答 - * - * @param header 头 - * @param carConfigResp 数据 - */ - void onCarConfigResp(MessagePad.Header header, MessagePad.CarConfigResp carConfigResp); -~~~ -~~~java - /** - * 数据采集结果 - * - * @param header 头 - * @param recordPanel 数据 - */ - void onRecordResult(MessagePad.Header header, RecordPanelOuterClass.RecordPanel recordPanel); -~~~ -~~~java - /** - * 自动驾驶路径应答 - * - * @param header 头 - * @param globalPathResp 数据 - */ - void onGlobalPathResp(MessagePad.Header header, MessagePad.GlobalPathResp globalPathResp); -~~~ -~~~java - /** - * 报警信息 - * 暂时保留,目前没有使用 - * - * @param header 头 - * @param warn 数据 - */ - @Deprecated - void onWarn(MessagePad.Header header, MessagePad.Warn warn); -~~~ -~~~java - /** - * 到站提醒 自动驾驶站点 - * - * @param header 头 - * @param arrivalNotification 数据 - */ - void onArrivalNotification(MessagePad.Header header, MessagePad.ArrivalNotification arrivalNotification); -~~~ -~~~java - /** - * 向IPC发送命令返回结果 - * - * @param info - */ - void onSSHResult(SSHResult info); -~~~ -~~~java - /** - * 数据错误 - * - * @param status 错误原因 - * @param bytes 原始数据 - */ - void onError(ProtocolStatus status, byte[] bytes); -~~~ - -## OnAdasConnectStatusListener -### 连接状态监听 -~~~java - /** - * 与工控机链接状态变化 - * - * @param ipcConnectionStatus {@link Constants.IPC_CONNECTION_STATUS} - * @param reason 连接信息 需要判null - * 如果ipcConnectionStatus==Constants.IPC_CONNECTION_STATUS.DISCONNECTED&&reason==null 表示主动断开连接 - */ - void onConnectionIPCStatus(@Define.IPCConnectionStatus int ipcConnectionStatus, @Nullable String reason); -~~~ - -## OnMultiDeviceListener -### 多设备链接监听 -~~~java - /** - * 转发工控机消息 - * 如果是客户端此回调不会被调用 - * - * @param bytes 数据 - */ - void onForwardingIPCMessage(byte[] bytes); -~~~ \ No newline at end of file diff --git a/libraries/mogo-adas-backgrounder-permission/src/main/java/com/zhidao/support/adas/high/permission/dialog/PermissionLongBackgroundRunningDialog.java b/libraries/mogo-adas-backgrounder-permission/src/main/java/com/zhidao/support/adas/high/permission/dialog/PermissionLongBackgroundRunningDialog.java deleted file mode 100644 index 853c043a76..0000000000 --- a/libraries/mogo-adas-backgrounder-permission/src/main/java/com/zhidao/support/adas/high/permission/dialog/PermissionLongBackgroundRunningDialog.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.zhidao.support.adas.high.permission.dialog; - -import android.os.Bundle; - -import androidx.annotation.Nullable; -import androidx.appcompat.app.AppCompatActivity; - -import com.zhidao.support.adas.high.permission.R; - -/** - * 数据用量及电池优化 权限申请 - * 高版本Android系统会针对熄屏、休眠或后台 对电池WiFi等进行优化,长时间网络可能会断开连接 - */ -public class PermissionLongBackgroundRunningDialog extends AppCompatActivity { - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - overridePendingTransition(R.anim.dialog_in, R.anim.dialog_out); - setContentView(R.layout.dialog_adas_permission_long_background_running); -// //设置弹出窗口与屏幕对齐 -// Window win = this.getWindow(); -// int density = (int) (getResources().getDisplayMetrics().density + 0.5f); -////设置内边距,这里设置为10dp -// win.getDecorView().setPadding(10 * density, 10 * density, 10 * density, 10 * density); -// WindowManager.LayoutParams lp = win.getAttributes(); -////设置窗口宽度 -// lp.width = WindowManager.LayoutParams.MATCH_PARENT; -////设置窗口高度 -// lp.height = WindowManager.LayoutParams.WRAP_CONTENT; -////设置Dialog位置 -// lp.gravity = Gravity.TOP; -// win.setAttributes(lp); - } - - @Override - public void finish() { - super.finish(); - //在此时设置转场动画 - overridePendingTransition(R.anim.dialog_out, R.anim.dialog_in); - } -} diff --git a/libraries/mogo-adas-backgrounder-permission/src/main/res/layout/dialog_adas_permission_long_background_running.xml b/libraries/mogo-adas-backgrounder-permission/src/main/res/layout/dialog_adas_permission_long_background_running.xml deleted file mode 100644 index 63b16efa72..0000000000 --- a/libraries/mogo-adas-backgrounder-permission/src/main/res/layout/dialog_adas_permission_long_background_running.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - \ No newline at end of file diff --git a/libraries/mogo-adas-backgrounder-permission/.gitignore b/libraries/mogo-adas-other/.gitignore similarity index 100% rename from libraries/mogo-adas-backgrounder-permission/.gitignore rename to libraries/mogo-adas-other/.gitignore diff --git a/libraries/mogo-adas-other/README.md b/libraries/mogo-adas-other/README.md new file mode 100644 index 0000000000..e4603dc5bb --- /dev/null +++ b/libraries/mogo-adas-other/README.md @@ -0,0 +1,7 @@ +#### 说明 +# ADAS LIB 其他功能 +## 与工控机交互LIB + +# 申请后台运行权限《关闭电池优化》 + +# 路由器管理 \ No newline at end of file diff --git a/libraries/mogo-adas-backgrounder-permission/build.gradle b/libraries/mogo-adas-other/build.gradle similarity index 95% rename from libraries/mogo-adas-backgrounder-permission/build.gradle rename to libraries/mogo-adas-other/build.gradle index c58c14698e..aabf73fe53 100644 --- a/libraries/mogo-adas-backgrounder-permission/build.gradle +++ b/libraries/mogo-adas-other/build.gradle @@ -32,5 +32,6 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation rootProject.ext.dependencies.androidxappcompat + implementation rootProject.ext.dependencies.material } diff --git a/libraries/mogo-adas-backgrounder-permission/consumer-rules.pro b/libraries/mogo-adas-other/consumer-rules.pro similarity index 100% rename from libraries/mogo-adas-backgrounder-permission/consumer-rules.pro rename to libraries/mogo-adas-other/consumer-rules.pro diff --git a/libraries/mogo-adas-backgrounder-permission/gradle.properties b/libraries/mogo-adas-other/gradle.properties similarity index 100% rename from libraries/mogo-adas-backgrounder-permission/gradle.properties rename to libraries/mogo-adas-other/gradle.properties diff --git a/libraries/mogo-adas-backgrounder-permission/proguard-rules.pro b/libraries/mogo-adas-other/proguard-rules.pro similarity index 100% rename from libraries/mogo-adas-backgrounder-permission/proguard-rules.pro rename to libraries/mogo-adas-other/proguard-rules.pro diff --git a/libraries/mogo-adas-backgrounder-permission/src/main/AndroidManifest.xml b/libraries/mogo-adas-other/src/main/AndroidManifest.xml similarity index 50% rename from libraries/mogo-adas-backgrounder-permission/src/main/AndroidManifest.xml rename to libraries/mogo-adas-other/src/main/AndroidManifest.xml index da52cf04c3..b58604c1e6 100644 --- a/libraries/mogo-adas-backgrounder-permission/src/main/AndroidManifest.xml +++ b/libraries/mogo-adas-other/src/main/AndroidManifest.xml @@ -1,14 +1,19 @@ + package="com.zhidao.support.adas.high.other"> + - + - + diff --git a/libraries/mogo-adas-backgrounder-permission/src/main/java/com/zhidao/support/adas/high/permission/BackgrounderPermission.java b/libraries/mogo-adas-other/src/main/java/com/zhidao/support/adas/high/other/permission/BackgrounderPermission.java similarity index 71% rename from libraries/mogo-adas-backgrounder-permission/src/main/java/com/zhidao/support/adas/high/permission/BackgrounderPermission.java rename to libraries/mogo-adas-other/src/main/java/com/zhidao/support/adas/high/other/permission/BackgrounderPermission.java index 8f3436b394..c6481e3306 100644 --- a/libraries/mogo-adas-backgrounder-permission/src/main/java/com/zhidao/support/adas/high/permission/BackgrounderPermission.java +++ b/libraries/mogo-adas-other/src/main/java/com/zhidao/support/adas/high/other/permission/BackgrounderPermission.java @@ -1,22 +1,43 @@ -package com.zhidao.support.adas.high.permission; +package com.zhidao.support.adas.high.other.permission; +import android.app.Activity; import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; import android.net.Uri; +import android.os.Build; import android.os.PowerManager; import android.provider.Settings; import android.util.Log; -import com.zhidao.support.adas.high.permission.dialog.PermissionLongBackgroundRunningDialog; +import androidx.annotation.RequiresApi; /** * 长时间后台运行权限检查 */ +@RequiresApi(api = Build.VERSION_CODES.N) public class BackgrounderPermission { + private static volatile BackgrounderPermission INSTANCE; + private OnAdasPermissionListener listener; + private BackgrounderPermission() { + } + public static BackgrounderPermission getInstance() { + if (INSTANCE == null) { + synchronized (BackgrounderPermission.class) { + if (INSTANCE == null) { + INSTANCE = new BackgrounderPermission(); + } + } + } + return INSTANCE; + } + + public void setListener(OnAdasPermissionListener listener) { + this.listener = listener; + } public void showPermissionLongBackgroundRunningDialog(Context context) { Intent intent = new Intent(context, PermissionLongBackgroundRunningDialog.class); @@ -24,6 +45,12 @@ public class BackgrounderPermission { } + void onBackgrounderPermission(boolean isBackgrounderPermission) { + if (listener != null) { + listener.onBackgrounderPermission(isBackgrounderPermission); + } + } + /** * 获取当前是否开启电池优化 @@ -31,7 +58,7 @@ public class BackgrounderPermission { * @param context 上下文 * @return 否在设备的电源白名单上 true 表示未优化 */ - public boolean isIgnoringBatteryOptimizations(Context context) { + boolean isIgnoringBatteryOptimizations(Context context) { boolean isIgnoring = false; PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); if (powerManager != null) { @@ -45,10 +72,11 @@ public class BackgrounderPermission { * * @param context */ - public void requestIgnoreBatteryOptimizations(Context context) { + + void requestIgnoreBatteryOptimizations(Activity context) { Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS); intent.setData(Uri.parse("package:" + context.getPackageName())); - context.startActivity(intent); + context.startActivityForResult(intent, PermissionLongBackgroundRunningDialog.REQUEST_CODE_BATTERY_OPTIMIZATIONS); } /** @@ -59,7 +87,7 @@ public class BackgrounderPermission { * @return */ - public boolean isIgnoringMeteredNetworkRestrictions(Context context) { + private boolean isIgnoringMeteredNetworkRestrictions(Context context) { ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); // 检查设备是否在计费网络 // if (connMgr.isActiveNetworkMetered()) { @@ -90,7 +118,7 @@ public class BackgrounderPermission { /** * 除非应用的核心功能受到不利影响,否则 Google Play 政策禁止应用请求直接豁免 Android 6.0+ 中的电源管理功能(低电耗模式和应用待机模式) */ - public static void requestAddDataSaverWhite(Context context) { + private static void requestAddDataSaverWhite(Context context) { // ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); // if (connMgr != null && connMgr.getRestrictBackgroundStatus() == ConnectivityManager.RESTRICT_BACKGROUND_STATUS_ENABLED) { Intent intent = new Intent(Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS); @@ -101,11 +129,15 @@ public class BackgrounderPermission { /** * 是否允许长时间后台运行 + * 目前测试得出:电池优化会影响后台运行 * * @param context 上下文 * @return */ public boolean isPermissionLongBackgroundRunning(Context context) { - return isIgnoringBatteryOptimizations(context) && isIgnoringMeteredNetworkRestrictions(context); +// return isIgnoringBatteryOptimizations(context) && isIgnoringMeteredNetworkRestrictions(context); + return isIgnoringBatteryOptimizations(context); } + + } diff --git a/libraries/mogo-adas-other/src/main/java/com/zhidao/support/adas/high/other/permission/OnAdasPermissionListener.java b/libraries/mogo-adas-other/src/main/java/com/zhidao/support/adas/high/other/permission/OnAdasPermissionListener.java new file mode 100644 index 0000000000..5fd7a694bd --- /dev/null +++ b/libraries/mogo-adas-other/src/main/java/com/zhidao/support/adas/high/other/permission/OnAdasPermissionListener.java @@ -0,0 +1,10 @@ +package com.zhidao.support.adas.high.other.permission; + +public interface OnAdasPermissionListener { + /** + * 是否允许后台运行 + * 目前只检查了是否关闭电池优化 + * @param isAllow 是否允许后台运行 + */ + void onBackgrounderPermission(boolean isAllow); +} diff --git a/libraries/mogo-adas-other/src/main/java/com/zhidao/support/adas/high/other/permission/PermissionLongBackgroundRunningDialog.java b/libraries/mogo-adas-other/src/main/java/com/zhidao/support/adas/high/other/permission/PermissionLongBackgroundRunningDialog.java new file mode 100644 index 0000000000..7af0a7296b --- /dev/null +++ b/libraries/mogo-adas-other/src/main/java/com/zhidao/support/adas/high/other/permission/PermissionLongBackgroundRunningDialog.java @@ -0,0 +1,87 @@ +package com.zhidao.support.adas.high.other.permission; + +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.text.Html; +import android.view.View; +import android.widget.Button; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; +import androidx.appcompat.app.AppCompatActivity; + +import com.zhidao.support.adas.high.other.R; + + +/** + * 数据用量及电池优化 权限申请 + * 高版本Android系统会针对熄屏、休眠或后台 对电池WiFi等进行优化,长时间网络可能会断开连接 + */ +@RequiresApi(api = Build.VERSION_CODES.N) +public class PermissionLongBackgroundRunningDialog extends AppCompatActivity { + public static final int REQUEST_CODE_BATTERY_OPTIMIZATIONS = 0x01; + private TextView hint_battery; + private Button btn_close_battery_optimizations; + private BackgrounderPermission listener; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + overridePendingTransition(R.anim.dialog_in, R.anim.dialog_out); + setContentView(R.layout.dialog_adas_permission_long_background_running); + initView(); + setBatteryHint(); +// //设置弹出窗口与屏幕对齐 +// Window win = this.getWindow(); +// int density = (int) (getResources().getDisplayMetrics().density + 0.5f); +////设置内边距,这里设置为10dp +// win.getDecorView().setPadding(10 * density, 10 * density, 10 * density, 10 * density); +// WindowManager.LayoutParams lp = win.getAttributes(); +////设置窗口宽度 +// lp.width = WindowManager.LayoutParams.MATCH_PARENT; +////设置窗口高度 +// lp.height = WindowManager.LayoutParams.WRAP_CONTENT; +////设置Dialog位置 +// lp.gravity = Gravity.TOP; +// win.setAttributes(lp); + } + + private void initView() { + hint_battery = findViewById(R.id.hint_battery); + btn_close_battery_optimizations = findViewById(R.id.btn_close_battery_optimizations); + btn_close_battery_optimizations.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + BackgrounderPermission.getInstance().requestIgnoreBatteryOptimizations(PermissionLongBackgroundRunningDialog.this); + } + }); + } + + + private boolean setBatteryHint() { + boolean isIgnoringBatteryOptimizations = BackgrounderPermission.getInstance().isIgnoringBatteryOptimizations(this); + btn_close_battery_optimizations.setVisibility(isIgnoringBatteryOptimizations ? View.INVISIBLE : View.VISIBLE); + String str = "电池优化:" + (isIgnoringBatteryOptimizations ? "不优化" : "优化"); + hint_battery.setText(Html.fromHtml(str, Html.FROM_HTML_MODE_LEGACY)); + return isIgnoringBatteryOptimizations; + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK) { + if (requestCode == REQUEST_CODE_BATTERY_OPTIMIZATIONS) { + BackgrounderPermission.getInstance().onBackgrounderPermission(setBatteryHint()); + } + } + } + + @Override + public void finish() { + super.finish(); + //在此时设置转场动画 + overridePendingTransition(R.anim.dialog_out, R.anim.dialog_in); + } +} diff --git a/libraries/mogo-adas-other/src/main/java/com/zhidao/support/adas/high/other/router/PlaceholderFragment.java b/libraries/mogo-adas-other/src/main/java/com/zhidao/support/adas/high/other/router/PlaceholderFragment.java new file mode 100644 index 0000000000..eb24783f71 --- /dev/null +++ b/libraries/mogo-adas-other/src/main/java/com/zhidao/support/adas/high/other/router/PlaceholderFragment.java @@ -0,0 +1,190 @@ +package com.zhidao.support.adas.high.other.router; + +import android.content.Context; +import android.content.SharedPreferences; +import android.graphics.Bitmap; +import android.os.Bundle; +import android.text.TextUtils; +import android.util.Log; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.webkit.CookieManager; +import android.webkit.JsResult; +import android.webkit.WebChromeClient; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import android.widget.ProgressBar; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.Fragment; + +import com.zhidao.support.adas.high.other.R; + + +/** + * A placeholder fragment containing a simple view. + */ +public class PlaceholderFragment extends Fragment { + private static final String TAG = PlaceholderFragment.class.getSimpleName(); + private static final String ROUTER_URL = "router_url"; + private static final String ROUTER_COOKIE = "router_cookie"; + private String url; + private ProgressBar progressBar; + private WebView webView; + private CookieManager cookieManager; + + private SharedPreferences sharedPreferences; + + public static PlaceholderFragment newInstance(String url) { + PlaceholderFragment fragment = new PlaceholderFragment(); + Bundle bundle = new Bundle(); + bundle.putString(ROUTER_URL, url); + fragment.setArguments(bundle); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (getArguments() != null) { + url = getArguments().getString(ROUTER_URL); + } + } + + @Override + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_router, container, false); + webView = view.findViewById(R.id.web_view); + progressBar = view.findViewById(R.id.progressbar);//进度条 + if (getActivity() != null) + sharedPreferences = getActivity().getSharedPreferences("adas_config", Context.MODE_PRIVATE); + cookieManager = CookieManager.getInstance(); + cookieManager.setAcceptCookie(true); + initWebView(); + return view; + } + + public void onRefresh() { + webView.reload(); + } + + private void initWebView() { + String cokkie = null; + if (sharedPreferences != null) + cokkie = sharedPreferences.getString(ROUTER_COOKIE, null); + if (cokkie != null && cokkie.length() > 0 && cokkie.contains(url)) { + int index = cokkie.indexOf("##"); + cookieManager.setCookie(this.url, cokkie.substring(index)); + } + webView.loadUrl(url);//加载url + webView.addJavascriptInterface(this, "android");//添加js监听 这样html就能调用客户端 + webView.setWebChromeClient(webChromeClient); + webView.setWebViewClient(webViewClient); + WebSettings webSettings = webView.getSettings(); + webSettings.setJavaScriptEnabled(true);//允许使用js + + /** + * LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据 + * LOAD_DEFAULT: (默认)根据cache-control决定是否从网络上取数据。 + * LOAD_NO_CACHE: 不使用缓存,只从网络获取数据. + * LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。 + */ + webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);//不使用缓存,只从网络获取数据. + //支持屏幕缩放 + webSettings.setSupportZoom(true); + webSettings.setBuiltInZoomControls(true); + //不显示webview缩放按钮 + webSettings.setDisplayZoomControls(false); +// webSettings.setUseWideViewPort(true);//自适应屏幕 + webSettings.setLoadWithOverviewMode(true); + webSettings.setAllowFileAccess(true); + webSettings.setAppCacheEnabled(true); + webSettings.setDomStorageEnabled(true); + webSettings.setDatabaseEnabled(true); + + } + + //WebViewClient主要帮助WebView处理各种通知、请求事件 + private final WebViewClient webViewClient = new WebViewClient() { + @Override + public void onPageFinished(WebView view, String url) {//页面加载完成 + progressBar.setVisibility(View.GONE); + String oldCookie = cookieManager.getCookie(url); + if (!TextUtils.isEmpty(oldCookie)) { + String cokkie = null; + if (sharedPreferences != null) + cokkie = sharedPreferences.getString(ROUTER_COOKIE, null); + if (!TextUtils.equals(cokkie, oldCookie)) { + sharedPreferences.edit().putString(url + "##" + ROUTER_COOKIE, oldCookie).apply(); + } + } + } + + @Override + public void onPageStarted(WebView view, String url, Bitmap favicon) {//页面开始加载 + progressBar.setVisibility(View.VISIBLE); + } + + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + //返回true 拦截 + return super.shouldOverrideUrlLoading(view, url); + } + + }; + + //WebChromeClient主要辅助WebView处理Javascript的对话框、网站图标、网站title、加载进度等 + private final WebChromeClient webChromeClient = new WebChromeClient() { + //不支持js的alert弹窗,需要自己监听然后通过dialog弹窗 + @Override + public boolean onJsAlert(WebView webView, String url, String message, JsResult result) { + AlertDialog.Builder localBuilder = new AlertDialog.Builder(webView.getContext()); + localBuilder.setMessage(message).setPositiveButton("确定", null); + localBuilder.setCancelable(false); + localBuilder.create().show(); + + //注意: + //必须要这一句代码:result.confirm()表示: + //处理结果为确定状态同时唤醒WebCore线程 + //否则不能继续点击按钮 + result.confirm(); + return true; + } + + //获取网页标题 + @Override + public void onReceivedTitle(WebView view, String title) { + super.onReceivedTitle(view, title); + Log.i(TAG, "网页标题:" + title); + } + + //加载进度回调 + @Override + public void onProgressChanged(WebView view, int newProgress) { + progressBar.setProgress(newProgress); + } + }; + + public boolean onKeyDownChild(int keyCode) { + Log.i(TAG, "是否有上一个页面:" + webView.canGoBack()); + if (webView.canGoBack() && keyCode == KeyEvent.KEYCODE_BACK) {//点击返回按钮的时候判断有没有上一页 + webView.goBack(); // goBack()表示返回webView的上一页面 + return true; + } + return false; + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + //释放资源 + webView.destroy(); + webView = null; + } + + +} \ No newline at end of file diff --git a/libraries/mogo-adas-other/src/main/java/com/zhidao/support/adas/high/other/router/RouterActivity.java b/libraries/mogo-adas-other/src/main/java/com/zhidao/support/adas/high/other/router/RouterActivity.java new file mode 100644 index 0000000000..d4e7bda46a --- /dev/null +++ b/libraries/mogo-adas-other/src/main/java/com/zhidao/support/adas/high/other/router/RouterActivity.java @@ -0,0 +1,108 @@ +package com.zhidao.support.adas.high.other.router; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; +import android.view.KeyEvent; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; +import androidx.viewpager2.widget.ViewPager2; + +import com.google.android.material.tabs.TabLayout; +import com.google.android.material.tabs.TabLayoutMediator; +import com.zhidao.support.adas.high.other.R; + + +public class RouterActivity extends AppCompatActivity { + private static final String[] TAB_TITLES = new String[]{"Bus", "Taxi"}; + private boolean isBus; + private int currentPosition = 0;//默认选中bus + + public static void newInstance(Context context, boolean isBus) { + Intent intent = new Intent(context, RouterActivity.class); + intent.putExtra("is_bus", isBus); + context.startActivity(intent); + + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_router); + SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(this, TAB_TITLES); + ViewPager2 viewPager = findViewById(R.id.view_pager); + + viewPager.setAdapter(sectionsPagerAdapter); + TabLayout tabs = findViewById(R.id.tabs); + viewPager.setOffscreenPageLimit(1); + TabLayoutMediator mediator = new TabLayoutMediator(tabs, viewPager, new TabLayoutMediator.TabConfigurationStrategy() { + @Override + public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) { + tab.setText(TAB_TITLES[position]); + } + }); + mediator.attach(); + viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + super.onPageScrolled(position, positionOffset, positionOffsetPixels); + } + + @Override + public void onPageSelected(int position) { + super.onPageSelected(position); + currentPosition = position; + Log.i("dddd", "当前 Pos=" + currentPosition); + } + }); + findViewById(R.id.close).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (!isClose(KeyEvent.KEYCODE_BACK)) + finish(); + } + }); + findViewById(R.id.refresh).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + PlaceholderFragment fragment = (PlaceholderFragment) getViewPagerFragment(currentPosition); + if (fragment != null) { + fragment.onRefresh(); + } + } + }); + + Intent intent = getIntent(); + if (intent != null) { + isBus = intent.getBooleanExtra("is_bus", true); + } + currentPosition = isBus ? 0 : 1; + viewPager.setCurrentItem(currentPosition, false); + } + + /** + * @param position fragment 的位置 + * @return + */ + private Fragment getViewPagerFragment(int position) { + return getSupportFragmentManager().findFragmentByTag("f" + position); + } + + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + return isClose(keyCode) || super.onKeyDown(keyCode, event); + } + + private boolean isClose(int keyCode) { + PlaceholderFragment fragment = (PlaceholderFragment) getViewPagerFragment(currentPosition); + if (fragment != null) { + return fragment.onKeyDownChild(keyCode); + } + return false; + } +} \ No newline at end of file diff --git a/libraries/mogo-adas-other/src/main/java/com/zhidao/support/adas/high/other/router/SectionsPagerAdapter.java b/libraries/mogo-adas-other/src/main/java/com/zhidao/support/adas/high/other/router/SectionsPagerAdapter.java new file mode 100644 index 0000000000..4e01e40871 --- /dev/null +++ b/libraries/mogo-adas-other/src/main/java/com/zhidao/support/adas/high/other/router/SectionsPagerAdapter.java @@ -0,0 +1,41 @@ +package com.zhidao.support.adas.high.other.router; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; +import androidx.viewpager2.adapter.FragmentStateAdapter; + +import java.util.HashMap; +import java.util.Map; + + +public class SectionsPagerAdapter extends FragmentStateAdapter { + + private final String[] TAB_TITLES; + public final Map fragments = new HashMap<>(); + private final FragmentActivity fragmentActivity; + + public SectionsPagerAdapter(@NonNull FragmentActivity fragmentActivity, String[] TAB_TITLES) { + super(fragmentActivity); + this.fragmentActivity = fragmentActivity; + this.TAB_TITLES = TAB_TITLES; + } + + + @NonNull + @Override + public Fragment createFragment(int position) { + String url = "192.168.1.1"; + if ("Bus".equals(TAB_TITLES[position])) { + url = "192.168.8.1"; + } + return PlaceholderFragment.newInstance(url); + } + + + @Override + public int getItemCount() { + return TAB_TITLES.length; + } + +} \ No newline at end of file diff --git a/libraries/mogo-adas-backgrounder-permission/src/main/res/anim/dialog_in.xml b/libraries/mogo-adas-other/src/main/res/anim/dialog_in.xml similarity index 100% rename from libraries/mogo-adas-backgrounder-permission/src/main/res/anim/dialog_in.xml rename to libraries/mogo-adas-other/src/main/res/anim/dialog_in.xml diff --git a/libraries/mogo-adas-backgrounder-permission/src/main/res/anim/dialog_out.xml b/libraries/mogo-adas-other/src/main/res/anim/dialog_out.xml similarity index 100% rename from libraries/mogo-adas-backgrounder-permission/src/main/res/anim/dialog_out.xml rename to libraries/mogo-adas-other/src/main/res/anim/dialog_out.xml diff --git a/libraries/mogo-adas-backgrounder-permission/src/main/res/drawable/bg_adas_dialog.xml b/libraries/mogo-adas-other/src/main/res/drawable/bg_adas_dialog.xml similarity index 100% rename from libraries/mogo-adas-backgrounder-permission/src/main/res/drawable/bg_adas_dialog.xml rename to libraries/mogo-adas-other/src/main/res/drawable/bg_adas_dialog.xml diff --git a/libraries/mogo-adas-other/src/main/res/layout/activity_router.xml b/libraries/mogo-adas-other/src/main/res/layout/activity_router.xml new file mode 100644 index 0000000000..0abd4797e8 --- /dev/null +++ b/libraries/mogo-adas-other/src/main/res/layout/activity_router.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + +