顺义分支和dev分支合并
This commit is contained in:
@@ -6,6 +6,7 @@ import android.view.WindowManager;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.mogo.commons.debug.DebugConfig;
|
||||
import com.mogo.module.common.R;
|
||||
|
||||
/**
|
||||
@@ -20,7 +21,9 @@ public class BaseFloatDialog extends Dialog {
|
||||
|
||||
public BaseFloatDialog(@NonNull Context context, int themeResId) {
|
||||
super(context, themeResId);
|
||||
addFlag();
|
||||
if(DebugConfig.getCarMachineType() != DebugConfig.CAR_MACHINE_TYPE_BYD) {
|
||||
addFlag();
|
||||
}
|
||||
}
|
||||
|
||||
private void addFlag() {
|
||||
|
||||
@@ -16,6 +16,7 @@ public class MarkerCardResult extends BaseData {
|
||||
|
||||
private List<MarkerOnlineCar> onlineCar;
|
||||
private List<MarkerExploreWay> exploreWay;
|
||||
private long messageTime;
|
||||
|
||||
public List<MarkerCarChat> getCarChat() {
|
||||
return carChat;
|
||||
@@ -65,15 +66,11 @@ public class MarkerCardResult extends BaseData {
|
||||
this.dataType = dataType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "MarkerCardResult{" +
|
||||
"dataType=" + dataType +
|
||||
", carChat=" + carChat +
|
||||
", exploreWay=" + exploreWay +
|
||||
", onlineCar=" + onlineCar +
|
||||
", shareMusic=" + shareMusic +
|
||||
", noveltyInfo=" + noveltyInfo +
|
||||
'}';
|
||||
public long getMessageTime() {
|
||||
return messageTime;
|
||||
}
|
||||
|
||||
public void setMessageTime(long messageTime) {
|
||||
this.messageTime = messageTime;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@ public class MarkerExploreWay implements Serializable {
|
||||
|
||||
public String getAddr() {
|
||||
if (TextUtils.isEmpty(addr)) {
|
||||
return "";
|
||||
return "未知道路";
|
||||
}
|
||||
return addr;
|
||||
}
|
||||
|
||||
@@ -114,6 +114,14 @@ public class MarkerUserInfo implements Serializable {
|
||||
this.gender = gender;
|
||||
}
|
||||
|
||||
public void setGender(int gender) {
|
||||
if (gender == 0) {
|
||||
this.gender = "男";
|
||||
} else {
|
||||
this.gender = "女";
|
||||
}
|
||||
}
|
||||
|
||||
public String getSn() {
|
||||
if (TextUtils.isEmpty(sn)) {
|
||||
return "";
|
||||
|
||||
@@ -0,0 +1,131 @@
|
||||
package com.mogo.module.common.entity;
|
||||
|
||||
|
||||
import androidx.annotation.IntDef;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* author : donghongyu
|
||||
* e-mail : 1358506549@qq.com
|
||||
* date : 2020/3/11 4:25 PM
|
||||
* desc : V2X事件列表展示
|
||||
* version: 1.0
|
||||
*/
|
||||
public class V2XEventShowEntity implements Serializable {
|
||||
|
||||
// 0---默认展示详情,1--直播,
|
||||
@ViewType
|
||||
private int viewType;
|
||||
|
||||
// 道路事件详情
|
||||
private V2XRoadEventEntity v2XRoadEventEntity;
|
||||
// 直播车机 @see viewType = 1
|
||||
private V2XLiveCarInfoEntity v2XLiveCarInfoRes;
|
||||
// 直播车机列表
|
||||
private List<V2XLiveCarInfoEntity> v2XLiveCarList;
|
||||
// 推送信息,疲劳驾驶,他人发起故障求助
|
||||
private V2XPushMessageEntity v2XPushMessageEntity;
|
||||
// 违章停车
|
||||
private MarkerExploreWay v2XIllegalPark;
|
||||
|
||||
public int getViewType() {
|
||||
return viewType;
|
||||
}
|
||||
|
||||
public void setViewType(int viewType) {
|
||||
this.viewType = viewType;
|
||||
}
|
||||
|
||||
public V2XRoadEventEntity getV2XRoadEventEntity() {
|
||||
return v2XRoadEventEntity;
|
||||
}
|
||||
|
||||
public void setV2XRoadEventEntity(V2XRoadEventEntity v2XRoadEventEntity) {
|
||||
this.v2XRoadEventEntity = v2XRoadEventEntity;
|
||||
}
|
||||
|
||||
public V2XLiveCarInfoEntity getV2XLiveCarInfoRes() {
|
||||
return v2XLiveCarInfoRes;
|
||||
}
|
||||
|
||||
public void setV2XLiveCarInfoRes(V2XLiveCarInfoEntity v2XLiveCarInfoRes) {
|
||||
this.v2XLiveCarInfoRes = v2XLiveCarInfoRes;
|
||||
}
|
||||
|
||||
public List<V2XLiveCarInfoEntity> getV2XLiveCarList() {
|
||||
return v2XLiveCarList;
|
||||
}
|
||||
|
||||
public void setV2XLiveCarList(List<V2XLiveCarInfoEntity> v2XLiveCarList) {
|
||||
this.v2XLiveCarList = v2XLiveCarList;
|
||||
}
|
||||
|
||||
public V2XPushMessageEntity getV2XPushMessageEntity() {
|
||||
return v2XPushMessageEntity;
|
||||
}
|
||||
|
||||
public void setV2XPushMessageEntity(V2XPushMessageEntity v2XPushMessageEntity) {
|
||||
this.v2XPushMessageEntity = v2XPushMessageEntity;
|
||||
}
|
||||
|
||||
public MarkerExploreWay getV2XIllegalPark() {
|
||||
return v2XIllegalPark;
|
||||
}
|
||||
|
||||
public void setV2XIllegalPark(MarkerExploreWay v2XIllegalPark) {
|
||||
this.v2XIllegalPark = v2XIllegalPark;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) {
|
||||
return true;
|
||||
}
|
||||
if (o == null || getClass() != o.getClass()) {
|
||||
return false;
|
||||
}
|
||||
V2XEventShowEntity that = (V2XEventShowEntity) o;
|
||||
return viewType == that.viewType &&
|
||||
Objects.equals(v2XRoadEventEntity, that.v2XRoadEventEntity) &&
|
||||
Objects.equals(v2XLiveCarInfoRes, that.v2XLiveCarInfoRes) &&
|
||||
Objects.equals(v2XLiveCarList, that.v2XLiveCarList) &&
|
||||
Objects.equals(v2XPushMessageEntity, that.v2XPushMessageEntity) &&
|
||||
Objects.equals(v2XIllegalPark, that.v2XIllegalPark);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(viewType, v2XRoadEventEntity,
|
||||
v2XLiveCarInfoRes, v2XLiveCarList,
|
||||
v2XPushMessageEntity, v2XIllegalPark);
|
||||
}
|
||||
|
||||
|
||||
@IntDef(value = {
|
||||
V2XMessageEntity.V2XTypeEnum.ALERT_ROAD_WARNING,
|
||||
V2XMessageEntity.V2XTypeEnum.ALERT_SEEK_WARNING,
|
||||
V2XMessageEntity.V2XTypeEnum.ALERT_FATIGUE_DRIVING,
|
||||
V2XMessageEntity.V2XTypeEnum.ALERT_PUSH_WINDOW_WARNING,
|
||||
V2XMessageEntity.V2XTypeEnum.ALERT_PUSH_TOAST_WARNING,
|
||||
V2XMessageEntity.V2XTypeEnum.ALERT_PUSH_LIVE_CAR_WARNING,
|
||||
V2XMessageEntity.V2XTypeEnum.ALERT_ANIMATION_WARNING,
|
||||
V2XMessageEntity.V2XTypeEnum.ALERT_ROAD_LIVE_CAR_WARNING,
|
||||
V2XMessageEntity.V2XTypeEnum.ALERT_ILLEGAL_PARK_WARNING,
|
||||
V2XMessageEntity.V2XTypeEnum.ALERT_CAR_FOR_HELP,
|
||||
})
|
||||
@Target({
|
||||
ElementType.PARAMETER,
|
||||
ElementType.FIELD,
|
||||
ElementType.METHOD,
|
||||
}) //表示注解作用范围,参数注解,成员注解,方法注解
|
||||
@Retention(RetentionPolicy.SOURCE) //表示注解所存活的时间,在运行时,而不会存在 .class 文件中
|
||||
public @interface ViewType { //接口,定义新的注解类型
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
package com.mogo.module.common.entity;
|
||||
|
||||
import com.mogo.map.location.MogoLocation;
|
||||
import com.mogo.utils.sqlite.annotation.DbDatabase;
|
||||
import com.mogo.utils.sqlite.annotation.DbField;
|
||||
import com.mogo.utils.sqlite.annotation.DbTable;
|
||||
|
||||
/**
|
||||
* V2X 道路历史事件
|
||||
*
|
||||
* @author donghongyu
|
||||
*/
|
||||
@DbDatabase(dbName = "MoGoScenario.db")
|
||||
@DbTable(tableName = "tb_history_scenario")
|
||||
public class V2XHistoryScenarioData {
|
||||
|
||||
/**
|
||||
* 事件类型
|
||||
*/
|
||||
@DbField(fieldName = "scenarioType")
|
||||
public Integer scenarioType;
|
||||
|
||||
/**
|
||||
* 事件触发时间
|
||||
*/
|
||||
@DbField(fieldName = "triggerTime")
|
||||
public Long triggerTime;
|
||||
|
||||
/**
|
||||
* 事件json
|
||||
*/
|
||||
@DbField(fieldName = "eventJsonData")
|
||||
public String eventJsonData;
|
||||
|
||||
/**
|
||||
* 事件是否被处理过了,true-处理过了。false-未处理过
|
||||
*/
|
||||
@DbField(fieldName = "isDispose")
|
||||
public Boolean isDispose;
|
||||
|
||||
public Integer getScenarioType() {
|
||||
return scenarioType;
|
||||
}
|
||||
|
||||
public void setScenarioType(Integer scenarioType) {
|
||||
this.scenarioType = scenarioType;
|
||||
}
|
||||
|
||||
public String getEventJsonData() {
|
||||
return eventJsonData;
|
||||
}
|
||||
|
||||
public void setEventJsonData(String eventJsonData) {
|
||||
this.eventJsonData = eventJsonData;
|
||||
}
|
||||
|
||||
public Long getTriggerTime() {
|
||||
return triggerTime;
|
||||
}
|
||||
|
||||
public void setTriggerTime(Long triggerTime) {
|
||||
this.triggerTime = triggerTime;
|
||||
}
|
||||
|
||||
public Boolean isDispose() {
|
||||
return isDispose;
|
||||
}
|
||||
|
||||
public void setDispose(Boolean dispose) {
|
||||
isDispose = dispose;
|
||||
}
|
||||
|
||||
@Override
|
||||
public V2XHistoryScenarioData clone() throws CloneNotSupportedException {
|
||||
try {
|
||||
return (V2XHistoryScenarioData) super.clone();
|
||||
} catch (CloneNotSupportedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return this;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
package com.mogo.module.common.entity;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* 可直播车机基本信息,再通过 appDataService/integratedServices/app/push/no/livePush/v1
|
||||
* 获取直播信息
|
||||
* @author donghongyu
|
||||
*/
|
||||
public class V2XLiveCarInfoEntity {
|
||||
private String sn;
|
||||
private double lon;
|
||||
private double lat;
|
||||
|
||||
public String getSn() {
|
||||
return sn;
|
||||
}
|
||||
|
||||
public void setSn(String sn) {
|
||||
this.sn = sn;
|
||||
}
|
||||
|
||||
public double getLon() {
|
||||
return lon;
|
||||
}
|
||||
|
||||
public void setLon(double lon) {
|
||||
this.lon = lon;
|
||||
}
|
||||
|
||||
public double getLat() {
|
||||
return lat;
|
||||
}
|
||||
|
||||
public void setLat(double lat) {
|
||||
this.lat = lat;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) {
|
||||
return true;
|
||||
}
|
||||
if (o == null || getClass() != o.getClass()) {
|
||||
return false;
|
||||
}
|
||||
V2XLiveCarInfoEntity that = (V2XLiveCarInfoEntity) o;
|
||||
return Double.compare(that.lon, lon) == 0 &&
|
||||
Double.compare(that.lat, lat) == 0 &&
|
||||
Objects.equals(sn, that.sn);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(sn, lon, lat);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "V2XLiveCarEntity{" +
|
||||
"sn='" + sn + '\'' +
|
||||
", lon=" + lon +
|
||||
", lat=" + lat +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,127 @@
|
||||
package com.mogo.module.common.entity;
|
||||
|
||||
import androidx.annotation.IntDef;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* e-mail : 1358506549@qq.com
|
||||
* date : 2020/5/15 4:35 PM
|
||||
* desc : V2X 场景消息聚合
|
||||
* version: 1.0
|
||||
*
|
||||
* @author donghongyu
|
||||
*/
|
||||
public class V2XMessageEntity<T> implements Serializable {
|
||||
|
||||
/**
|
||||
* 场景类型
|
||||
*
|
||||
* @see V2XTypeEnum
|
||||
*/
|
||||
@MessageType
|
||||
int type;
|
||||
|
||||
/**
|
||||
* 是否展示对话框
|
||||
* true-展示,false-不展示
|
||||
*/
|
||||
boolean showState;
|
||||
|
||||
/**
|
||||
* 场景具体的数据内容
|
||||
*/
|
||||
T content;
|
||||
|
||||
public int getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public void setType(@MessageType int type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public boolean isShowState() {
|
||||
return showState;
|
||||
}
|
||||
|
||||
public void setShowState(boolean showState) {
|
||||
this.showState = showState;
|
||||
}
|
||||
|
||||
public T getContent() {
|
||||
return content;
|
||||
}
|
||||
|
||||
public void setContent(T content) {
|
||||
this.content = content;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
V2XMessageEntity<?> that = (V2XMessageEntity<?>) o;
|
||||
return type == that.type &&
|
||||
content.equals(that.content);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(type, content);
|
||||
}
|
||||
|
||||
/**
|
||||
* V2X 场景类型
|
||||
*/
|
||||
public interface V2XTypeEnum {
|
||||
// 默认展示详情
|
||||
int DEFAULT_WINDOW = 0;
|
||||
// 道路事件预警
|
||||
int ALERT_ROAD_WARNING = 1_000;
|
||||
// 他车求助预警
|
||||
int ALERT_SEEK_WARNING = 1_001;
|
||||
// 疲劳驾驶预警
|
||||
int ALERT_FATIGUE_DRIVING = 1_002;
|
||||
// 后台推送展示 Window
|
||||
int ALERT_PUSH_WINDOW_WARNING = 1_003;
|
||||
// 后台推送展示 Toast
|
||||
int ALERT_PUSH_TOAST_WARNING = 1_004;
|
||||
// 后台推送展示 展示的直播
|
||||
int ALERT_PUSH_LIVE_CAR_WARNING = 1_005;
|
||||
// V2X场景动画展示
|
||||
int ALERT_ANIMATION_WARNING = 1_006;
|
||||
// 道路事件直播预警
|
||||
int ALERT_ROAD_LIVE_CAR_WARNING = 1_007;
|
||||
// 道路事件违章停车
|
||||
int ALERT_ILLEGAL_PARK_WARNING = 1_008;
|
||||
// 自车求助
|
||||
int ALERT_CAR_FOR_HELP = 8_000;
|
||||
}
|
||||
|
||||
@IntDef(value = {
|
||||
V2XTypeEnum.ALERT_ROAD_WARNING,
|
||||
V2XTypeEnum.ALERT_SEEK_WARNING,
|
||||
V2XTypeEnum.ALERT_FATIGUE_DRIVING,
|
||||
V2XTypeEnum.ALERT_PUSH_WINDOW_WARNING,
|
||||
V2XTypeEnum.ALERT_PUSH_TOAST_WARNING,
|
||||
V2XTypeEnum.ALERT_PUSH_LIVE_CAR_WARNING,
|
||||
V2XTypeEnum.ALERT_ANIMATION_WARNING,
|
||||
V2XTypeEnum.ALERT_ROAD_LIVE_CAR_WARNING,
|
||||
V2XTypeEnum.ALERT_ILLEGAL_PARK_WARNING,
|
||||
V2XTypeEnum.ALERT_CAR_FOR_HELP,
|
||||
})
|
||||
@Target({
|
||||
ElementType.PARAMETER,
|
||||
ElementType.FIELD,
|
||||
ElementType.METHOD,
|
||||
}) //表示注解作用范围,参数注解,成员注解,方法注解
|
||||
@Retention(RetentionPolicy.SOURCE) //表示注解所存活的时间,在运行时,而不会存在 .class 文件中
|
||||
public @interface MessageType { //接口,定义新的注解类型
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package com.mogo.module.common.entity;
|
||||
|
||||
/**
|
||||
* author : donghongyu
|
||||
* e-mail : 1358506549@qq.com
|
||||
* date : 2020/3/31 4:53 PM
|
||||
* desc : V2X 道路事件类型
|
||||
* version: 1.0
|
||||
*/
|
||||
public interface V2XPoiTypeEnum extends MarkerPoiTypeEnum {
|
||||
// 前方静止or慢速车辆报警
|
||||
String ALERT_FRONT_CAR = "99999";
|
||||
// 限行管理
|
||||
String ALERT_TRAFFIC_CONTROL = "99998";
|
||||
// 红绿灯事件、是建议以多少速度驶过
|
||||
String ALERT_TRAFFIC_LIGHT_SUGGEST = "99997";
|
||||
// 红绿灯事件、一种是绿灯不足3秒
|
||||
String ALERT_TRAFFIC_LIGHT_WARNING = "99996";
|
||||
// 故障车辆
|
||||
int ALERT_CAR_TROUBLE_WARNING = 20007;
|
||||
// 疲劳驾驶
|
||||
String ALERT_FATIGUE_DRIVING = "99993";
|
||||
// 违章停车
|
||||
String ALERT_ILLEGAL_PARK = "99992";
|
||||
|
||||
// TODO 这里目前是演示DEMO会用到,想着是打算商用,先这么处理的
|
||||
// 取快递
|
||||
String ALERT_TRAFFIC_EXPRESS = "99995";
|
||||
// 顺风车
|
||||
String ALERT_TRAFFIC_TAXI = "99994";
|
||||
}
|
||||
@@ -0,0 +1,288 @@
|
||||
package com.mogo.module.common.entity;
|
||||
|
||||
import android.text.TextUtils;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* author : donghongyu
|
||||
* e-mail : 1358506549@qq.com
|
||||
* date : 2020-02-0315:49
|
||||
* desc : V2X警报数据
|
||||
* version: 1.0
|
||||
*/
|
||||
public class V2XPushMessageEntity implements Serializable {
|
||||
// 0---默认展示详情,1--直播,2--停车场,3--加油站,4--道路事件详情
|
||||
private int viewType;
|
||||
private String sceneId;
|
||||
private String sceneName;
|
||||
private short sceneCategory;
|
||||
private short sceneLevel;
|
||||
private String sceneDescription;
|
||||
private boolean zoom;
|
||||
private int zoomScale;
|
||||
private String alarmContent;
|
||||
private String tts;
|
||||
private String videoUrl;
|
||||
private String videoSn;
|
||||
private String videoChannel;
|
||||
private int expireTime;
|
||||
private long createTime;
|
||||
private double lat;
|
||||
private double lon;
|
||||
private String sn;
|
||||
private String headImgUrl;
|
||||
private String msgImgUrl;
|
||||
private String address;
|
||||
private double distance;
|
||||
private boolean isShowWindow;
|
||||
|
||||
private int age;
|
||||
private String displayName;
|
||||
private int sex;
|
||||
private long userId;
|
||||
|
||||
public int getViewType() {
|
||||
return viewType;
|
||||
}
|
||||
|
||||
public void setViewType(int viewType) {
|
||||
this.viewType = viewType;
|
||||
}
|
||||
|
||||
public String getSceneId() {
|
||||
return sceneId;
|
||||
}
|
||||
|
||||
public void setSceneId(String sceneId) {
|
||||
this.sceneId = sceneId;
|
||||
}
|
||||
|
||||
public String getSceneName() {
|
||||
return sceneName;
|
||||
}
|
||||
|
||||
public void setSceneName(String sceneName) {
|
||||
this.sceneName = sceneName;
|
||||
}
|
||||
|
||||
public short getSceneCategory() {
|
||||
return sceneCategory;
|
||||
}
|
||||
|
||||
public void setSceneCategory(short sceneCategory) {
|
||||
this.sceneCategory = sceneCategory;
|
||||
}
|
||||
|
||||
public short getSceneLevel() {
|
||||
return sceneLevel;
|
||||
}
|
||||
|
||||
public void setSceneLevel(short sceneLevel) {
|
||||
this.sceneLevel = sceneLevel;
|
||||
}
|
||||
|
||||
public String getSceneDescription() {
|
||||
return sceneDescription;
|
||||
}
|
||||
|
||||
public void setSceneDescription(String sceneDescription) {
|
||||
this.sceneDescription = sceneDescription;
|
||||
}
|
||||
|
||||
public boolean isZoom() {
|
||||
return zoom;
|
||||
}
|
||||
|
||||
public void setZoom(boolean zoom) {
|
||||
this.zoom = zoom;
|
||||
}
|
||||
|
||||
public String getAlarmContent() {
|
||||
if (TextUtils.isEmpty(alarmContent)) {
|
||||
return "";
|
||||
}
|
||||
return alarmContent;
|
||||
}
|
||||
|
||||
public void setAlarmContent(String alarmContent) {
|
||||
this.alarmContent = alarmContent;
|
||||
}
|
||||
|
||||
public String getTts() {
|
||||
if (TextUtils.isEmpty(tts)) {
|
||||
return "";
|
||||
}
|
||||
return tts;
|
||||
}
|
||||
|
||||
public void setTts(String tts) {
|
||||
this.tts = tts;
|
||||
}
|
||||
|
||||
public String getVideoUrl() {
|
||||
return videoUrl;
|
||||
}
|
||||
|
||||
public void setVideoUrl(String videoUrl) {
|
||||
this.videoUrl = videoUrl;
|
||||
}
|
||||
|
||||
public String getVideoSn() {
|
||||
return videoSn;
|
||||
}
|
||||
|
||||
public void setVideoSn(String videoSn) {
|
||||
this.videoSn = videoSn;
|
||||
}
|
||||
|
||||
public String getVideoChannel() {
|
||||
return videoChannel;
|
||||
}
|
||||
|
||||
public void setVideoChannel(String videoChannel) {
|
||||
this.videoChannel = videoChannel;
|
||||
}
|
||||
|
||||
public int getExpireTime() {
|
||||
return expireTime;
|
||||
}
|
||||
|
||||
public void setExpireTime(int expireTime) {
|
||||
this.expireTime = expireTime;
|
||||
}
|
||||
|
||||
public int getZoomScale() {
|
||||
return zoomScale;
|
||||
}
|
||||
|
||||
public void setZoomScale(int zoomScale) {
|
||||
this.zoomScale = zoomScale;
|
||||
}
|
||||
|
||||
|
||||
public double getLat() {
|
||||
return lat;
|
||||
}
|
||||
|
||||
public void setLat(double lat) {
|
||||
this.lat = lat;
|
||||
}
|
||||
|
||||
public double getLon() {
|
||||
return lon;
|
||||
}
|
||||
|
||||
public void setLon(double lon) {
|
||||
this.lon = lon;
|
||||
}
|
||||
|
||||
public String getSn() {
|
||||
return sn;
|
||||
}
|
||||
|
||||
public void setSn(String sn) {
|
||||
this.sn = sn;
|
||||
}
|
||||
|
||||
public String getHeadImgUrl() {
|
||||
return headImgUrl;
|
||||
}
|
||||
|
||||
public void setHeadImgUrl(String headImgUrl) {
|
||||
this.headImgUrl = headImgUrl;
|
||||
}
|
||||
|
||||
public String getMsgImgUrl() {
|
||||
return msgImgUrl;
|
||||
}
|
||||
|
||||
public void setMsgImgUrl(String msgImgUrl) {
|
||||
this.msgImgUrl = msgImgUrl;
|
||||
}
|
||||
|
||||
public String getAddress() {
|
||||
return address;
|
||||
}
|
||||
|
||||
public void setAddress(String address) {
|
||||
this.address = address;
|
||||
}
|
||||
|
||||
public double getDistance() {
|
||||
return distance;
|
||||
}
|
||||
|
||||
public void setDistance(double distance) {
|
||||
this.distance = distance;
|
||||
}
|
||||
|
||||
public boolean isShowWindow() {
|
||||
return isShowWindow;
|
||||
}
|
||||
|
||||
public void setShowWindow(boolean showWindow) {
|
||||
isShowWindow = showWindow;
|
||||
}
|
||||
|
||||
public long getCreateTime() {
|
||||
return createTime;
|
||||
}
|
||||
|
||||
public void setCreateTime(long createTime) {
|
||||
this.createTime = createTime;
|
||||
}
|
||||
|
||||
public int getAge() {
|
||||
return age;
|
||||
}
|
||||
|
||||
public void setAge(int age) {
|
||||
this.age = age;
|
||||
}
|
||||
|
||||
public String getDisplayName() {
|
||||
return displayName;
|
||||
}
|
||||
|
||||
public void setDisplayName(String displayName) {
|
||||
this.displayName = displayName;
|
||||
}
|
||||
|
||||
public int getSex() {
|
||||
return sex;
|
||||
}
|
||||
|
||||
public void setSex(int sex) {
|
||||
this.sex = sex;
|
||||
}
|
||||
|
||||
public long getUserId() {
|
||||
return userId;
|
||||
}
|
||||
|
||||
public void setUserId(long userId) {
|
||||
this.userId = userId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) {
|
||||
return true;
|
||||
}
|
||||
if (o == null || getClass() != o.getClass()) {
|
||||
return false;
|
||||
}
|
||||
V2XPushMessageEntity that = (V2XPushMessageEntity) o;
|
||||
return Objects.equals(sceneId, that.sceneId) &&
|
||||
Objects.equals(tts, that.tts);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(sceneId, tts);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,298 @@
|
||||
package com.mogo.module.common.entity;
|
||||
|
||||
import android.text.TextUtils;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* author : donghongyu
|
||||
* e-mail : 1358506549@qq.com
|
||||
* date : 2020/4/13 11:17 AM
|
||||
* desc : 道路事件的聚合,位置、详情,用于V2X情况下展示
|
||||
* version: 1.0
|
||||
*/
|
||||
public class V2XRoadEventEntity implements Serializable {
|
||||
/**
|
||||
* @see MarkerPoiTypeEnum
|
||||
*/
|
||||
// 事件类型
|
||||
private String poiType;
|
||||
// 事件位置
|
||||
private MarkerLocation location;
|
||||
// 具体的信息
|
||||
private MarkerExploreWay noveltyInfo;
|
||||
// tts 提示
|
||||
private String tts;
|
||||
// ADAS 展示文案
|
||||
private String alarmContent;
|
||||
// 距离当前车辆的距离
|
||||
private double distance;
|
||||
// 默认展示时间
|
||||
private int expireTime;
|
||||
// 展示Button
|
||||
private boolean isShowEventButton;
|
||||
// 绑定 MarkerView 的数据, 业务需要啥数据就传入啥数据
|
||||
private Object bindObj;
|
||||
|
||||
public MarkerLocation getLocation() {
|
||||
return location;
|
||||
}
|
||||
|
||||
public void setLocation(MarkerLocation location) {
|
||||
this.location = location;
|
||||
}
|
||||
|
||||
public String getPoiType() {
|
||||
if (TextUtils.isEmpty(poiType)) {
|
||||
return "";
|
||||
}
|
||||
return poiType;
|
||||
}
|
||||
|
||||
public void setPoiType(String poiType) {
|
||||
this.poiType = poiType;
|
||||
}
|
||||
|
||||
public String getTts(boolean haveLiveCar) {
|
||||
tts = "前方#" + (int) getDistance() + "米#";
|
||||
switch (getPoiType()) {
|
||||
// 停车场
|
||||
case V2XPoiTypeEnum.FOURS_PARKING:
|
||||
tts += "停车场";
|
||||
break;
|
||||
// 加油站
|
||||
case V2XPoiTypeEnum.GAS_STATION:
|
||||
tts += "加油站";
|
||||
break;
|
||||
// 交通检查
|
||||
case V2XPoiTypeEnum.TRAFFIC_CHECK:
|
||||
tts += "交通检查";
|
||||
break;
|
||||
// 封路
|
||||
case V2XPoiTypeEnum.ROAD_CLOSED:
|
||||
tts += "道路封路";
|
||||
break;
|
||||
// 施工
|
||||
case V2XPoiTypeEnum.FOURS_ROAD_WORK:
|
||||
tts += "道路施工";
|
||||
break;
|
||||
// 拥堵
|
||||
case V2XPoiTypeEnum.FOURS_BLOCK_UP:
|
||||
tts += "道路拥堵";
|
||||
break;
|
||||
// 积水
|
||||
case V2XPoiTypeEnum.FOURS_PONDING:
|
||||
tts += "道路积水";
|
||||
break;
|
||||
// 浓雾
|
||||
case V2XPoiTypeEnum.FOURS_FOG:
|
||||
tts += "出现浓雾";
|
||||
break;
|
||||
// 结冰
|
||||
case V2XPoiTypeEnum.FOURS_ICE:
|
||||
tts += "路面结冰";
|
||||
break;
|
||||
// 事故
|
||||
case V2XPoiTypeEnum.FOURS_ACCIDENT:
|
||||
tts += "交通事故";
|
||||
break;
|
||||
default:
|
||||
tts += "道路事件";
|
||||
break;
|
||||
}
|
||||
if (haveLiveCar) {
|
||||
tts += ",查看实况请说确定。";
|
||||
setShowEventButton(true);
|
||||
} else {
|
||||
tts += ",请注意躲避。";
|
||||
setShowEventButton(false);
|
||||
}
|
||||
return tts;
|
||||
}
|
||||
|
||||
/**
|
||||
* 检测到附近#道路施工#,确认该信息是否正确?您可以说“正确”或“错误”帮助其他车友。
|
||||
*/
|
||||
public String getTtsWithFeedback() {
|
||||
tts = "检测到附近";
|
||||
switch (getPoiType()) {
|
||||
// 停车场
|
||||
case V2XPoiTypeEnum.FOURS_PARKING:
|
||||
tts += "有停车场";
|
||||
break;
|
||||
// 加油站
|
||||
case V2XPoiTypeEnum.GAS_STATION:
|
||||
tts += "有加油站";
|
||||
break;
|
||||
// 交通检查
|
||||
case V2XPoiTypeEnum.TRAFFIC_CHECK:
|
||||
tts += "交通检查";
|
||||
break;
|
||||
// 封路
|
||||
case V2XPoiTypeEnum.ROAD_CLOSED:
|
||||
tts += "封路";
|
||||
break;
|
||||
// 施工
|
||||
case V2XPoiTypeEnum.FOURS_ROAD_WORK:
|
||||
tts += "施工";
|
||||
break;
|
||||
// 拥堵
|
||||
case V2XPoiTypeEnum.FOURS_BLOCK_UP:
|
||||
tts += "道路拥堵";
|
||||
break;
|
||||
// 积水
|
||||
case V2XPoiTypeEnum.FOURS_PONDING:
|
||||
tts += "道路积水";
|
||||
break;
|
||||
// 浓雾
|
||||
case V2XPoiTypeEnum.FOURS_FOG:
|
||||
tts += "出现浓雾";
|
||||
break;
|
||||
// 结冰
|
||||
case V2XPoiTypeEnum.FOURS_ICE:
|
||||
tts += "路面结冰";
|
||||
break;
|
||||
// 事故
|
||||
case V2XPoiTypeEnum.FOURS_ACCIDENT:
|
||||
tts += "交通事故";
|
||||
break;
|
||||
default:
|
||||
tts += "道路事件";
|
||||
break;
|
||||
}
|
||||
tts += ",确认该信息是否正确?您可以说“正确”或“错误”帮助其他车友。";
|
||||
return tts;
|
||||
}
|
||||
|
||||
public String getTts() {
|
||||
return tts;
|
||||
}
|
||||
|
||||
public void setTts(String tts) {
|
||||
this.tts = tts;
|
||||
}
|
||||
|
||||
public boolean isShowEventButton() {
|
||||
return isShowEventButton;
|
||||
}
|
||||
|
||||
public void setShowEventButton(boolean showEventButton) {
|
||||
isShowEventButton = showEventButton;
|
||||
}
|
||||
|
||||
public String getAlarmContent() {
|
||||
switch (getPoiType()) {
|
||||
// 停车场
|
||||
case V2XPoiTypeEnum.FOURS_PARKING:
|
||||
alarmContent = "停车场附近";
|
||||
break;
|
||||
// 加油站
|
||||
case V2XPoiTypeEnum.GAS_STATION:
|
||||
alarmContent = "加油站附近";
|
||||
break;
|
||||
// 交通检查
|
||||
case V2XPoiTypeEnum.TRAFFIC_CHECK:
|
||||
alarmContent = "前方交通检查";
|
||||
break;
|
||||
// 封路
|
||||
case V2XPoiTypeEnum.ROAD_CLOSED:
|
||||
alarmContent = "前方封路";
|
||||
break;
|
||||
// 施工
|
||||
case V2XPoiTypeEnum.FOURS_ROAD_WORK:
|
||||
alarmContent = "前方施工";
|
||||
break;
|
||||
// 拥堵
|
||||
case V2XPoiTypeEnum.FOURS_BLOCK_UP:
|
||||
alarmContent = "前方道路拥堵";
|
||||
break;
|
||||
// 积水
|
||||
case V2XPoiTypeEnum.FOURS_PONDING:
|
||||
alarmContent = "前方道路积水";
|
||||
break;
|
||||
// 浓雾
|
||||
case V2XPoiTypeEnum.FOURS_FOG:
|
||||
alarmContent = "前方出现浓雾";
|
||||
break;
|
||||
// 结冰
|
||||
case V2XPoiTypeEnum.FOURS_ICE:
|
||||
alarmContent = "前方路面结冰";
|
||||
break;
|
||||
// 事故
|
||||
case V2XPoiTypeEnum.FOURS_ACCIDENT:
|
||||
alarmContent = "前方交通事故";
|
||||
break;
|
||||
default:
|
||||
tts += "道路事件";
|
||||
break;
|
||||
}
|
||||
return alarmContent;
|
||||
}
|
||||
|
||||
public void setAlarmContent(String alarmContent) {
|
||||
this.alarmContent = alarmContent;
|
||||
}
|
||||
|
||||
public double getDistance() {
|
||||
return distance;
|
||||
}
|
||||
|
||||
public void setDistance(double distance) {
|
||||
this.distance = distance;
|
||||
}
|
||||
|
||||
public int getExpireTime() {
|
||||
return expireTime;
|
||||
}
|
||||
|
||||
public void setExpireTime(int expireTime) {
|
||||
this.expireTime = expireTime;
|
||||
}
|
||||
|
||||
public MarkerExploreWay getNoveltyInfo() {
|
||||
return noveltyInfo;
|
||||
}
|
||||
|
||||
public void setNoveltyInfo(MarkerExploreWay noveltyInfo) {
|
||||
this.noveltyInfo = noveltyInfo;
|
||||
}
|
||||
|
||||
public Object getBindObj() {
|
||||
return bindObj;
|
||||
}
|
||||
|
||||
public void setBindObj(Object bindObj) {
|
||||
this.bindObj = bindObj;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
V2XRoadEventEntity that = (V2XRoadEventEntity) o;
|
||||
return Objects.equals(noveltyInfo.getInfoId(), that.noveltyInfo.getInfoId()) &&
|
||||
Objects.equals(poiType, that.poiType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(poiType, noveltyInfo.getInfoId());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "V2XRoadEventEntity{" +
|
||||
"poiType='" + poiType + '\'' +
|
||||
", location=" + location +
|
||||
", noveltyInfo=" + noveltyInfo +
|
||||
", tts='" + tts + '\'' +
|
||||
", alarmContent='" + alarmContent + '\'' +
|
||||
", distance=" + distance +
|
||||
", expireTime=" + expireTime +
|
||||
", isShowEventButton=" + isShowEventButton +
|
||||
", bindObj=" + bindObj +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
@@ -38,13 +38,18 @@ class CustomNaviInterrupter implements Interrupter {
|
||||
|
||||
/**
|
||||
* 判断是否用自己的导航
|
||||
* 1. 项目是否强制使用自己的导航
|
||||
* 2. 是否安装了高德车机版地图
|
||||
* 3. 默认使用自己的导航
|
||||
*
|
||||
* @return true-用高德公版车机版地图 false-用Launcher自己的导航
|
||||
*/
|
||||
@Override
|
||||
public boolean interrupt() {
|
||||
if ( AppUtils.isAppInstalled( AbsMogoApplication.getApp(), "com.autonavi.amapauto" )
|
||||
|| !DebugConfig.isUseCustomNavi() ) {
|
||||
Logger.d( TAG, "do not use custom map function." );
|
||||
if ( DebugConfig.isUseCustomNavi() ) {
|
||||
return false;
|
||||
}
|
||||
if ( AppUtils.isAppInstalled( AbsMogoApplication.getApp(), "com.autonavi.amapauto" ) ) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
||||
@@ -22,16 +22,9 @@ public class MapCenterPointStrategy {
|
||||
|
||||
public static final MapCenterPoint DEFAULT = new MapCenterPoint( 0.677734D, 0.5733333D );
|
||||
|
||||
public static void init() {
|
||||
// 普通场景,使用高德内部值
|
||||
{
|
||||
Map< Integer, MapCenterPoint > common = new HashMap<>();
|
||||
common.put( CarSeries.CAR_SERIES_D80X, new MapCenterPoint( 0.5D, 0.666666666D ) );
|
||||
common.put( CarSeries.CAR_SERIES_E84X, new MapCenterPoint( 0.5D, 0.666666666D ) );
|
||||
common.put( CarSeries.CAR_SERIES_E84XCD, new MapCenterPoint( 0.5D, 0.666666666D ) );
|
||||
common.put( CarSeries.CAR_SERIES_F80X, new MapCenterPoint( 0.5D, 0.666666666D ) );
|
||||
sStrategies.put( Scene.COMMON, common );
|
||||
}
|
||||
private static MapCenterPoint sLastPoint = DEFAULT;
|
||||
|
||||
public static void init() {
|
||||
|
||||
{
|
||||
// 选点场景,定位中心点
|
||||
@@ -112,6 +105,22 @@ public class MapCenterPointStrategy {
|
||||
categoryV2XEvent.put( CarSeries.CAR_SERIES_F80X, new MapCenterPoint( 0.6963541D, 0.65D ) );
|
||||
sStrategies.put( Scene.CATEGORY_V2X_EVENT, categoryV2XEvent );
|
||||
}
|
||||
|
||||
try {
|
||||
sLastPoint = sStrategies.get( Scene.AIMLESS ).get( CarSeries.getSeries() );
|
||||
} catch ( Exception e ) {
|
||||
sLastPoint = DEFAULT;
|
||||
}
|
||||
}
|
||||
|
||||
public static void restoreLastScene( IMogoMapUIController controller ) {
|
||||
if ( sLastPoint == null ) {
|
||||
return;
|
||||
}
|
||||
if ( controller == null ) {
|
||||
return;
|
||||
}
|
||||
controller.setPointToCenter( sLastPoint.x, sLastPoint.y );
|
||||
}
|
||||
|
||||
public static void addScene( int scene, Map< Integer, MapCenterPoint > config ) {
|
||||
@@ -138,6 +147,7 @@ public class MapCenterPointStrategy {
|
||||
if ( !sStrategies.containsKey( scene ) ) {
|
||||
Logger.w( TAG, "no strategy for scene: %s, use DEFAULT", scene );
|
||||
controller.setPointToCenter( DEFAULT.x, DEFAULT.y );
|
||||
sLastPoint = DEFAULT;
|
||||
return;
|
||||
}
|
||||
Map< Integer, MapCenterPoint > points = sStrategies.get( scene );
|
||||
@@ -145,14 +155,17 @@ public class MapCenterPointStrategy {
|
||||
if ( !points.containsKey( car ) ) {
|
||||
Logger.w( TAG, "no strategy for series: %s, use DEFAULT", scene );
|
||||
controller.setPointToCenter( DEFAULT.x, DEFAULT.y );
|
||||
sLastPoint = DEFAULT;
|
||||
return;
|
||||
}
|
||||
MapCenterPoint point = points.get( car );
|
||||
if ( point == null ) {
|
||||
Logger.w( TAG, "no strategy config for series: %s, use DEFAULT", scene );
|
||||
controller.setPointToCenter( DEFAULT.x, DEFAULT.y );
|
||||
sLastPoint = DEFAULT;
|
||||
return;
|
||||
}
|
||||
sLastPoint = point;
|
||||
controller.setPointToCenter( point.x, point.y );
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
package com.mogo.module.common.wm;
|
||||
|
||||
|
||||
import android.app.Dialog;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import com.mogo.module.common.dialog.BaseFloatDialog;
|
||||
import com.mogo.utils.logger.Logger;
|
||||
|
||||
/**
|
||||
* 采用Dialog实现接口
|
||||
*/
|
||||
class DialogImpl implements IWindowManagerView {
|
||||
private Dialog dialog;
|
||||
private View contentView;
|
||||
|
||||
@Override
|
||||
public void init(WindowManagerView.WMViewParams params) {
|
||||
Logger.d("DialogImpl", "init====");
|
||||
dialog = new BaseFloatDialog(params.mContext);
|
||||
contentView = params.mContentView;
|
||||
Logger.d("DialogImpl", "params view : " + contentView);
|
||||
dialog.setContentView(contentView);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isShowing() {
|
||||
return dialog.isShowing();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleTouchEvent(OnViewClickListener listener) {
|
||||
// do nothings.
|
||||
}
|
||||
|
||||
@Override
|
||||
public void show() {
|
||||
dialog.show();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void hide() {
|
||||
/*
|
||||
* 取得view的父组件,然后移除view
|
||||
*/
|
||||
if (contentView != null) {
|
||||
((ViewGroup) contentView.getParent()).removeView(contentView);
|
||||
}
|
||||
dialog.dismiss();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package com.mogo.module.common.wm;
|
||||
|
||||
import android.view.View;
|
||||
|
||||
interface IWindowManagerView {
|
||||
/**
|
||||
* 初始化
|
||||
*
|
||||
* @param params contentView包装类
|
||||
*/
|
||||
void init( WindowManagerView.WMViewParams params );
|
||||
|
||||
/**
|
||||
* 是否显示
|
||||
*
|
||||
* @return true - 显示中
|
||||
*/
|
||||
boolean isShowing();
|
||||
|
||||
/**
|
||||
* 支持手势拖动,该操作只支持触发点击操作
|
||||
*/
|
||||
void handleTouchEvent(OnViewClickListener listener);
|
||||
|
||||
/**
|
||||
* 显示
|
||||
*/
|
||||
void show();
|
||||
|
||||
/**
|
||||
* 隐藏
|
||||
*/
|
||||
void hide();
|
||||
|
||||
interface OnViewClickListener {
|
||||
void onClick( View view );
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
package com.mogo.module.common.wm;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.PixelFormat;
|
||||
import android.os.Build;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.WindowManager;
|
||||
|
||||
/**
|
||||
* 采用windowManager实现接口
|
||||
*/
|
||||
class WindowManagerImpl implements IWindowManagerView {
|
||||
|
||||
private WindowManager mWindowManager;
|
||||
private WindowManager.LayoutParams mLayoutParams;
|
||||
private WindowManagerView.WMViewParams mParams;
|
||||
private boolean isShowing;
|
||||
|
||||
private float mLastX, mLastY;
|
||||
private int mOldOffsetX, mOldOffsetY;
|
||||
|
||||
@Override
|
||||
public void init( WindowManagerView.WMViewParams params ) {
|
||||
mParams = params;
|
||||
mWindowManager = ( WindowManager ) mParams.mContext.getApplicationContext().getSystemService( Context.WINDOW_SERVICE );
|
||||
mLayoutParams = new WindowManager.LayoutParams();
|
||||
if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ) {
|
||||
mLayoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
|
||||
} else {
|
||||
mLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
|
||||
}
|
||||
mLayoutParams.format = PixelFormat.TRANSLUCENT;
|
||||
mLayoutParams.gravity = mParams.mGravity;
|
||||
mLayoutParams.flags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
|
||||
|
||||
mLayoutParams.width = mParams.mWidth;
|
||||
mLayoutParams.height = mParams.mHeight;
|
||||
mOldOffsetX = mLayoutParams.x = mParams.mX;
|
||||
mOldOffsetY = mLayoutParams.y = mParams.mY;
|
||||
mLayoutParams.dimAmount = 0.5f;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isShowing() {
|
||||
return isShowing;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleTouchEvent(OnViewClickListener listener) {
|
||||
mParams.mContentView.setOnTouchListener( ( v, event ) -> {
|
||||
final int action = event.getAction();
|
||||
float x = event.getX();
|
||||
float y = event.getY();
|
||||
if ( action == MotionEvent.ACTION_DOWN ) {
|
||||
mLastX = x;
|
||||
mLastY = y;
|
||||
} else if ( action == MotionEvent.ACTION_MOVE ) {
|
||||
mLayoutParams.x += ( int ) ( x - mLastX ) / 3; // 减小偏移量,防止过度抖动
|
||||
mLayoutParams.y += ( int ) ( y - mLastY ) / 3; // 减小偏移量,防止过度抖动
|
||||
mWindowManager.updateViewLayout( mParams.mContentView, mLayoutParams );
|
||||
} else if ( action == MotionEvent.ACTION_UP ) {
|
||||
int newOffsetX = mLayoutParams.x;
|
||||
int newOffsetY = mLayoutParams.y;
|
||||
// 只要按钮一动位置不是很大,就认为是点击事件
|
||||
if ( Math.abs( mOldOffsetX - newOffsetX ) <= 20
|
||||
&& Math.abs( mOldOffsetY - newOffsetY ) <= 20 ) {
|
||||
listener.onClick( mParams.mContentView );
|
||||
}
|
||||
mOldOffsetX = newOffsetX;
|
||||
mOldOffsetY = newOffsetY;
|
||||
}
|
||||
return true;
|
||||
} );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void show() {
|
||||
if ( !isShowing ) {
|
||||
isShowing = true;
|
||||
mWindowManager.addView( mParams.mContentView, mLayoutParams );
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void hide() {
|
||||
if ( isShowing && mParams != null ) {
|
||||
mWindowManager.removeView( mParams.mContentView );
|
||||
isShowing = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,19 +1,12 @@
|
||||
package com.mogo.module.common.wm;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.PixelFormat;
|
||||
import android.os.Build;
|
||||
import android.view.Gravity;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.WindowManager;
|
||||
|
||||
import androidx.annotation.IdRes;
|
||||
import androidx.annotation.LayoutRes;
|
||||
|
||||
import com.mogo.module.common.utils.CarSeries;
|
||||
import com.mogo.utils.WindowUtils;
|
||||
|
||||
/**
|
||||
* @author congtaowang
|
||||
* @since 2020-05-21
|
||||
@@ -23,63 +16,33 @@ import com.mogo.utils.WindowUtils;
|
||||
public class WindowManagerView {
|
||||
|
||||
private WMViewParams mParams;
|
||||
private boolean mIsShowing;
|
||||
private WindowManager mWindowManager;
|
||||
private WindowManager.LayoutParams mLayoutParams;
|
||||
|
||||
private WindowManagerView( WMViewParams params ) {
|
||||
private IWindowManagerView mManagerView;
|
||||
|
||||
private WindowManagerView( WMViewParams params, IWindowManagerView view ) {
|
||||
this.mParams = params;
|
||||
init();
|
||||
}
|
||||
|
||||
private void init() {
|
||||
mWindowManager = ( WindowManager ) mParams.mContext.getApplicationContext().getSystemService( Context.WINDOW_SERVICE );
|
||||
mLayoutParams = new WindowManager.LayoutParams();
|
||||
if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ) {
|
||||
mLayoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
|
||||
} else {
|
||||
mLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
|
||||
}
|
||||
mLayoutParams.format = PixelFormat.TRANSLUCENT;
|
||||
mLayoutParams.gravity = Gravity.CENTER;
|
||||
mLayoutParams.flags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
|
||||
|
||||
if ( CarSeries.getSeries() == CarSeries.CAR_SERIES_F80X ) {
|
||||
mLayoutParams.width = 1920;
|
||||
mLayoutParams.height = 1080;
|
||||
} else {
|
||||
mLayoutParams.width = WindowUtils.getScreenWidth( mParams.mContext );
|
||||
mLayoutParams.height = WindowUtils.getScreenHeight( mParams.mContext );
|
||||
}
|
||||
mLayoutParams.dimAmount = 0.5f;
|
||||
mLayoutParams.x = 0;
|
||||
mLayoutParams.y = 0;
|
||||
mManagerView = view;
|
||||
view.init( params );
|
||||
}
|
||||
|
||||
public boolean isShowing() {
|
||||
return mIsShowing;
|
||||
return mManagerView.isShowing();
|
||||
}
|
||||
|
||||
public < T extends View > T findViewById( @IdRes int id ) {
|
||||
return mParams.mContentView.findViewById( id );
|
||||
}
|
||||
|
||||
public void attachTouchEvent( IWindowManagerView.OnViewClickListener listener ) {
|
||||
mManagerView.handleTouchEvent(listener);
|
||||
}
|
||||
|
||||
public void show() {
|
||||
if ( mIsShowing ) {
|
||||
return;
|
||||
}
|
||||
mIsShowing = true;
|
||||
mWindowManager.addView( mParams.mContentView, mLayoutParams );
|
||||
mManagerView.show();
|
||||
}
|
||||
|
||||
public void dismiss() {
|
||||
if ( !mIsShowing ) {
|
||||
return;
|
||||
}
|
||||
if ( mParams != null ) {
|
||||
mWindowManager.removeViewImmediate( mParams.mContentView );
|
||||
}
|
||||
mIsShowing = false;
|
||||
mManagerView.hide();
|
||||
}
|
||||
|
||||
public static class Builder {
|
||||
@@ -101,11 +64,44 @@ public class WindowManagerView {
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder size( int width, int height ) {
|
||||
mParams.mWidth = width;
|
||||
mParams.mHeight = height;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder position( int x, int y ) {
|
||||
mParams.mX = x;
|
||||
mParams.mY = y;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder gravity( int gravity ) {
|
||||
mParams.mGravity = gravity;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 默认dialog实现
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public WindowManagerView build() {
|
||||
return showInDialog();
|
||||
}
|
||||
|
||||
public WindowManagerView showInDialog() {
|
||||
if ( mParams.mContentView == null ) {
|
||||
throw new NullPointerException( "WMViewParams#mContentView must not be null." );
|
||||
}
|
||||
return new WindowManagerView( mParams );
|
||||
return new WindowManagerView( mParams, new DialogImpl() );
|
||||
}
|
||||
|
||||
public WindowManagerView showInWindowManager() {
|
||||
if ( mParams.mContentView == null ) {
|
||||
throw new NullPointerException( "WMViewParams#mContentView must not be null." );
|
||||
}
|
||||
return new WindowManagerView( mParams, new WindowManagerImpl() );
|
||||
}
|
||||
|
||||
}
|
||||
@@ -114,5 +110,10 @@ public class WindowManagerView {
|
||||
|
||||
public View mContentView;
|
||||
public Context mContext;
|
||||
public int mWidth;
|
||||
public int mHeight;
|
||||
public int mX;
|
||||
public int mY;
|
||||
public int mGravity;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user