package com.adayo.service.atsmode.atsview;
/**
* Copyright (c) 2015 FORYOU GENERAL ELECTRONICS CO.,LTD. All Rights Reserved.
*/
import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.graphics.RectF;
import android.hardware.fgecomservice.V1_0.EMessageID;
import android.hardware.fgecomservice.V1_0.IFgeComService;
import android.hardware.fgecomservice.V1_0.Message;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Handler;
import android.os.RemoteException;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.LinearInterpolator;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.VideoView;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.lifecycle.LifecycleRegistry;
import com.adayo.proxy.infrastructure.sourcemng.Beans.AppConfigType;
import com.adayo.proxy.infrastructure.sourcemng.Beans.SourceInfo;
import com.adayo.proxy.infrastructure.sourcemng.Control.SrcMngAudioSwitchManager;
import com.adayo.proxy.infrastructure.sourcemng.Control.SrcMngSwitchManager;
import com.adayo.proxy.infrastructure.sourcemng.Interface.IAdayoAudioFocusChange;
import com.adayo.proxy.setting.system.utils.LogUtil;
import com.adayo.service.atsmode.R;
import com.adayo.service.atsmode.atsconfig.ATSConfig;
import com.airbnb.lottie.LottieAnimationView;
import com.jakewharton.rxbinding4.view.RxView;
import com.jeremyliao.liveeventbus.LiveEventBus;
import org.jetbrains.annotations.NotNull;
import org.json.JSONObject;
import java.io.IOException;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import autodispose2.AutoDispose;
import autodispose2.androidx.lifecycle.AndroidLifecycleScopeProvider;
import static com.adayo.service.atsmode.atsconfig.ATSConfig.ATS_MODE_WADE;
import static com.adayo.service.atsmode.atsconfig.ATSConfig.ATS_TAG;
import static com.adayo.service.atsmode.atsconfig.ATSConfig.CONFIG_CAR_MODEL_B41V;
import static com.adayo.service.atsmode.atsconfig.ATSConfig.CONFIG_CAR_MODEL_B41VS;
import static com.adayo.service.atsmode.atsconfig.ATSConfig.CONFIG_CAR_MODEL_B60VS;
import static com.adayo.service.atsmode.atsconfig.ATSConfig.EVENT_ATS_RESET_COUNTER;
import static com.adayo.service.atsmode.atsconfig.ATSConfig.FLAG_OPERATE_UPDATE;
import static com.adayo.service.atsmode.atsconfig.ATSConfig.MODEL_CONFIGURATION_VERSION_C;
import static com.adayo.service.atsmode.atsconfig.ATSConfig.MODEL_CONFIGURATION_VERSION_P;
/**
* @ClassName: ATSContainerView
* @Description: ATS驾驶模式容器view
* @Author: yongqiang.wen@foryouge.com.cn
* @CreateDate: 2022/12/13 14:03
*/
public class ATSContainerView extends ConstraintLayout {
SvgPathView svgPathView = null;
VideoView videoView = null;
TextView atsModeName = null;
View atsToastTipsContainer = null;
View atsToastIconContainer = null;
ImageView atsLoadingView = null;
ImageView atsErrorIcon = null;
TextView atsToastTips = null;
LottieAnimationView lottieAnimationView = null;
String currentPathName = "";
String requestedModeName = "";
String confirmModeName = "";
private OnATSViewCloseListener closeListener = null;
// 生命周期感知注册
private LifecycleRegistry lifecycleRegistry = null;
// ATS驾驶模式ID对应关系表
private HashMap<Integer, String> pathIds = new HashMap<>();
// 用于查找驾驶模式中英文对照
// private HashMap<String, String> pathMaps = new HashMap<>();
// 加载下一个模式,用于判断是否播放剩余的50%动效
private boolean notYetSwitchNext = false;
// 信号值标记,用于记录是否有信号过来
private int operateFlag;
// 上一个模式记录
private String previousModePathName;
// ATS驾驶模式关闭按钮
private ImageView atsClose;
// 型号配置字
int carModelConfig = -1;
// 模式配置字
int configuration = -1;
// 是否有效信号
private boolean isValidSignal = false;
private IFgeComService mIFgeComService = null;
private MediaPlayer mediaPlayer;
public ATSContainerView(Context context) {
this(context, null);
}
public ATSContainerView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ATSContainerView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void initATSView() {
// 初始化子View
initChildView();
// 初始化视频播放器
initVideoView();
// 初始化连接服务
initComService();
}
private void initComService() {
if (mIFgeComService == null) {
try {
mIFgeComService = IFgeComService.getService();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
public int getCarModelConfig() {
return carModelConfig;
}
public void setCarModelConfig(int carModelConfig) {
this.carModelConfig = carModelConfig;
initATSSrcData(carModelConfig);
if (svgPathView != null && !svgPathView.hasInitialize()) {
svgPathView.init();
}
LogUtil.e(ATSConfig.ATS_TAG, "ATSContainerView init carModelConfig byte value is ====>>" + carModelConfig);
}
public void initATSSrcData(int carModelConfig) {
if (carModelConfig == CONFIG_CAR_MODEL_B41V) {
// 生成41V模式数据
genAtsModeData();
} else if (carModelConfig == CONFIG_CAR_MODEL_B60VS || carModelConfig == CONFIG_CAR_MODEL_B41VS) {
// 生成60VS模式数据
gen60VAtsModeData();
}
}
public int getConfiguration() {
return configuration;
}
public void setConfiguration(int configuration) {
this.configuration = configuration;
LogUtil.e(ATSConfig.ATS_TAG, "ATSContainerView init configuration byte value is ====>>" + configuration);
}
private void initChildView() {
svgPathView = getRootView().findViewById(R.id.svg_view);
videoView = getRootView().findViewById(R.id.video_view);
atsModeName = getRootView().findViewById(R.id.tv_ats_mode_name);
atsClose = getRootView().findViewById(R.id.iv_ats_close);
atsToastTipsContainer = getRootView().findViewById(R.id.toast_ats_mode_enter_tips);
atsToastIconContainer = getRootView().findViewById(R.id.view_icon_container);
atsLoadingView = getRootView().findViewById(R.id.iv_toast_loading);
atsErrorIcon = getRootView().findViewById(R.id.iv_toast_icon);
atsToastTips = getRootView().findViewById(R.id.tv_toast_msg);
RxView.clicks(atsClose)
.throttleFirst(500, TimeUnit.MILLISECONDS)
.to(AutoDispose.autoDisposable(AndroidLifecycleScopeProvider.from(lifecycleRegistry)))
.subscribe(unit -> closeListener.onClose());
}
public OnATSViewCloseListener getCloseListener() {
return closeListener;
}
public void setCloseListener(OnATSViewCloseListener closeListener) {
this.closeListener = closeListener;
}
int showMode = -1;
private void initVideoView() {
videoView.setOnCompletionListener(MediaPlayer::stop);
videoView.setOnPreparedListener(mp -> {
// 设置MediaPlayer不需要音频焦点
// mp.setAudioAttributes(new AudioAttributes.Builder()
// .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION)
// .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
// .build());
// 判断切换模式动效View是否显示,进行隐藏
if (lottieAnimationView.getVisibility() == View.VISIBLE) {
lottieAnimationView.setVisibility(View.INVISIBLE);
atsModeName.setVisibility(View.VISIBLE);
atsModeName.setText(getATSModeName(currentPathName));
}
});
}
private void handlingSpecialModeSignals() {
showMode = -1;
switch (currentPathName) {
case "wad":
if (carModelConfig == CONFIG_CAR_MODEL_B41V) {
showMode = ATSConfig.ATS_MODE_WADE;
} else if (carModelConfig == CONFIG_CAR_MODEL_B60VS || carModelConfig == CONFIG_CAR_MODEL_B41VS) {
showMode = ATSConfig.ATS60_MODE_WAD;
}
break;
case "rock":
if (carModelConfig == CONFIG_CAR_MODEL_B41V) {
showMode = ATSConfig.ATS_MODE_ROCK;
} else if (carModelConfig == CONFIG_CAR_MODEL_B60VS || carModelConfig == CONFIG_CAR_MODEL_B41VS) {
showMode = ATSConfig.ATS60_MODE_ROCK;
}
break;
}
if (showMode == ATSConfig.ATS_MODE_ROCK) {
LogUtil.e(ATS_TAG, "ready to send enter rock mode signal to QNX");
}
LiveEventBus.get(EVENT_ATS_RESET_COUNTER, Integer.class).post(showMode);
// postDelayed(() -> {
// if (showMode == ATSConfig.ATS_MODE_WADE && isValidSignal) {
// String wadeTips = getContext().getString(R.string.tips_enter_the_water_depth_detection);
// showModeEnterToast(wadeTips, true);
// } else if (showMode == ATSConfig.ATS_MODE_ROCK && isValidSignal) {
// String rockTips = getContext().getString(R.string.tips_enter_the_transparent_chassis);
// showModeEnterToast(rockTips, true);
// }
// removeCallbacks(hideCustomToastRunnable);
// postDelayed(hideCustomToastRunnable, 3000);
// }, 2000);
}
private void hideCustomToast() {
if (atsToastTipsContainer.getVisibility() == VISIBLE) {
atsToastTipsContainer.setVisibility(GONE);
}
}
private ObjectAnimator rotationAnimator = null;
public void showModeEnterToast(String tips, boolean showLoading) {
if (atsToastTipsContainer.getVisibility() == GONE) {
atsToastTipsContainer.setVisibility(VISIBLE);
}
if (showLoading) {
atsToastIconContainer.setVisibility(VISIBLE);
atsLoadingView.setVisibility(VISIBLE);
atsErrorIcon.setVisibility(GONE);
// 创建旋转动画
if (rotationAnimator == null) {
rotationAnimator = ObjectAnimator.ofFloat(atsLoadingView, "rotation", 0f, 360f);
rotationAnimator.setDuration(1000); // 动画持续时间,单位为毫秒
rotationAnimator.setRepeatCount(ObjectAnimator.INFINITE); // 无限重复
rotationAnimator.setInterpolator(new LinearInterpolator()); // 线性插值器,使旋转平滑
// 启动动画
rotationAnimator.start();
}
} else {
atsToastIconContainer.setVisibility(GONE);
atsLoadingView.setVisibility(GONE);
}
atsToastTipsContainer.setBackground(getResources().getDrawable(R.drawable.customize_toast_bg));
atsToastTips.setTextColor(getResources().getColor(R.color.drawable_dialog_text_color));
atsToastTips.setText(tips);
}
public void showErrorToast() {
removeCallbacks(hideCustomToastRunnable);
if (atsToastTipsContainer.getVisibility() == GONE) {
atsToastTipsContainer.setVisibility(VISIBLE);
}
atsToastIconContainer.setVisibility(VISIBLE);
atsErrorIcon.setVisibility(VISIBLE);
atsLoadingView.setVisibility(GONE);
atsToastTips.setText(getContext().getString(R.string.fail));
}
/**
* @param
* @return void
* @method observeRequestedModeDisplay
* @description 切换模式回调
* @date: 2022/12/13 14:56
* @author: yongqiang.wen@foryouge.com.cn
*/
public void observeRequestedModeDisplay(int signal) {
if (videoView != null && videoView.isPlaying()) {
videoView.stopPlayback();
videoView.setBackground(getBackground());
setVideoViewVisibility(GONE);
}
setSvgPathViewVisibility(VISIBLE);
requestedModeName = pathIds.get(signal);
isValidSignal = false;
if (checkInvalidSignal(signal)) return;
isValidSignal = true;
LogUtil.e(ATS_TAG, "The ATS mode requested signal has been received, current signal ===>> " + signal);
requestedModeName = pathIds.get(signal);
currentPathName = requestedModeName;
// 如果上一个模式记录为空,则记录本次切换的模式路径
if (TextUtils.isEmpty(previousModePathName)) previousModePathName = currentPathName;
LogUtil.d(ATS_TAG, "The ATS mode requested signal has been received, current mode ===>> " + currentPathName);
atsModeName.setText("");
if (videoView.isPlaying()) {
videoView.pause();
}
atsModeName.setVisibility(View.GONE);
if (lottieAnimationView != null && lottieAnimationView.isAnimating()) { // 处理当动效未结束,快速切换的问题
notYetSwitchNext = false;
if (svgPathView.getSelect() != null) {
previousModePathName = svgPathView.getSelect().getId();
}
}
if (signal >= 0 && signal < 12 || signal == 15) { // 由于目前41和60都是同样的模式范围,如果后续有变动,此处需要变更
showSwitchTips();
}
removeCallbacks(hideCustomToastRunnable);
switchNextMode(currentPathName);
}
private void showSwitchTips() {
// atsToastTips.setVisibility(VISIBLE);
String modeName = getATSModeName(currentPathName);
String tipsTxt = getContext().getString(R.string.tips_switch_mode_txt, modeName);
LogUtil.e(ATS_TAG, "The ATS mode requested signal has been received, current mode ===>> " + currentPathName);
LogUtil.e(ATS_TAG, "The ATS mode requested signal has been received, current mode ===>> " + modeName + ", tipsTxt ===>>" + tipsTxt);
showModeEnterToast(tipsTxt, false);
// atsModeEnterTips.setText(tipsTxt);
}
/**
* ATS岩石模式切换 发送给qnx
*
* @param rockModeState state
*/
public void updateRockModeStatus(int rockModeState) {
LogUtil.i(ATS_TAG, "rockModeState = " + rockModeState);
String id = "atsstatus";
String sub = "";
//装入json
try {
JSONObject command = new JSONObject();
command.put("id", id);
command.put("sub", sub);
JSONObject content = new JSONObject();
content.put("status", rockModeState);
JSONObject all = new JSONObject();
all.put("command", command);
all.put("content", content);
String all_message = all.toString();
// LogUtil.i(ATS_TAG, "all_message = " + all_message);
Message msg = new Message();
//看协议ID:device_070,然后看源码文件types.hal查看ID
msg.id = EMessageID.MSG_DEVICE_ATSSTATUS;
msg.content = all_message;
LogUtil.i(ATS_TAG, "msg send = " + msg.content);
if (mIFgeComService != null) {
mIFgeComService.fgeSendMessage2ComService(msg);
}
} catch (Exception e) {
LogUtil.e(ATS_TAG, "e = " + e.toString());
}
}
/**
* @param
* @return void
* @method observeConfirmedModeDisplay
* @description 确认模式回调
* @date: 2022/12/13 14:57
* @author: yongqiang.wen@foryouge.com.cn
*/
public boolean observeConfirmedModeDisplay(int signal) {
if (checkInvalidSignal(signal)) return false;
confirmModeName = pathIds.get(signal);
atsModeName.setVisibility(View.GONE);
LogUtil.d(ATS_TAG, "The ATS mode confirmation signal has been received,current mode ===>>" + getATSModeName(currentPathName));
if (TextUtils.equals(requestedModeName, confirmModeName)) {
post(() -> runSwitchModeDisplayVideo(confirmModeName));
// atsClose.setVisibility(VISIBLE);
String modeName = getATSModeName(confirmModeName);
LogUtil.e(ATS_TAG, "setting current modeName ==>> " + modeName);
atsModeName.setText(modeName);
atsModeName.setVisibility(View.VISIBLE);
queryOtherCMD();
return true;
}
return false;
}
public void setSvgPathViewVisibility(int visibility) {
LogUtil.e(ATS_TAG, "setSvgPathViewVisibility called, visibility = " + visibility);
if (svgPathView != null) {
svgPathView.setVisibility(visibility);
}
if (atsClose != null) {
atsClose.setVisibility(visibility);
}
if (atsModeName != null && atsModeName.getVisibility() == VISIBLE) {
atsModeName.setVisibility(INVISIBLE);
}
}
public void setVideoViewVisibility(int visibility) {
LogUtil.e(ATS_TAG, "setVideoViewVisibility called, visibility = " + visibility);
if (videoView != null) {
videoView.setVisibility(visibility);
}
if (atsClose != null) {
atsClose.setVisibility(visibility);
}
if (atsModeName != null) {
atsModeName.setVisibility(visibility);
}
}
private boolean checkInvalidSignal(int signal) {
if (videoView.getVisibility() == VISIBLE) {
setVideoViewVisibility(GONE);
}
if (carModelConfig == CONFIG_CAR_MODEL_B41V) {
return signal == ATSConfig.ATS_MODE_RESERVED1 || signal == ATSConfig.ATS_MODE_RESERVED2;
// if (signal == ATSConfig.ATS_MODE_FAULT || signal == ATSConfig.ATS_MODE_NOT_INITIALIZED) {
// showErrorToast();
// return true;
// }
} else if (carModelConfig == CONFIG_CAR_MODEL_B60VS || carModelConfig == CONFIG_CAR_MODEL_B41VS) {
return signal == ATSConfig.ATS60_MODE_SINGLE_PEDAL
|| signal == ATSConfig.ATS60_MODE_RAPIDLY
|| signal == ATSConfig.ATS60_MODE_RESERVED1
|| signal == ATSConfig.ATS60_MODE_NOT_INITIALIZED;
// if (signal == ATSConfig.ATS60_MODE_FAULT || signal == ATSConfig.ATS60_MODE_NOT_INITIALIZED) {
// showErrorToast();
// return true;
// }
}
return false;
}
/**
* 特定模式下需要额外处理开启某功能,比如涉水模式要切换到涉水信息界面
*/
private void queryOtherCMD() {
if (!TextUtils.equals(currentPathName, pathIds.get(ATSConfig.ATS_MODE_ROCK))) {
// 非岩石模式需要给QNX发送退出岩石模式信号
LogUtil.e(ATS_TAG, "ready to send exit rock mode signal to QNX");
updateRockModeStatus(ATSConfig.EXTRA_ROCK_STATE_EXIT);
}
// if (TextUtils.equals(currentPathName, pathIds.get(ATS_MODE_WADE))) { // 涉水模式 需要打开涉水页面
// Map<String, String> map = new HashMap<>();
// map.put("source", "carsetting");
// map.put("dest", "wddc");
// SourceInfo sourceInfo = new SourceInfo("com.adayo.app.bcm", map,
// AppConfigType.SourceSwitch.APP_ON.getValue(),
// AppConfigType.SourceType.UI_AUDIO.getValue());
// SrcMngSwitchManager.getInstance().requestSwitchApp(sourceInfo);
// }
}
public void resetPreviousModePathName() {
previousModePathName = "";
}
/**
* 获取当前模式
* @param currentMode
*/
private String getATSModeName(String currentMode) {
if (carModelConfig == CONFIG_CAR_MODEL_B60VS) { // 北汽B60VS车型
if (currentMode.equals("snow")) {
currentMode = "snow_60";
}
}
int modeRes = getResources().getIdentifier(currentMode, "string", getContext().getPackageName());
String currentName = "";
if (modeRes != 0) {
currentName = getContext().getString(modeRes);
}
return currentName;
}
/**
* @param
* @return void
* @method genAtsModeData
* @description 生成ATS驾驶模式数据关系表,用于切换不同模式定位path
* @date: 2022/11/28 9:43
* @author: yongqiang.wen@foryouge.com.cn
*/
private void genAtsModeData() {
// 生成ATSMode映射关系表
pathIds.clear();
pathIds.put(ATSConfig.ATS_MODE_ECO, "eco");
pathIds.put(ATSConfig.ATS_MODE_COMFORT, "conf");
pathIds.put(ATSConfig.ATS_MODE_AUTO, "auto");
pathIds.put(ATSConfig.ATS_MODE_SNOW, "snow");
pathIds.put(ATSConfig.ATS_MODE_DEEP_SNOW, "deep_snow");
pathIds.put(ATSConfig.ATS_MODE_CROSS, "cross");
pathIds.put(ATSConfig.ATS_MODE_SAND, "sand");
pathIds.put(ATSConfig.ATS_MODE_MUD, "mud");
pathIds.put(ATSConfig.ATS_MODE_SLIP_MUD, "mud");
pathIds.put(ATSConfig.ATS_MODE_ROCK, "rock");
pathIds.put(ATSConfig.ATS_MODE_WADE, "wad");
pathIds.put(ATSConfig.ATS_MODE_SPORT, "sport");
// 系统未初始化的时候不显示任何模式
pathIds.put(ATSConfig.ATS_MODE_NOT_INITIALIZED, "");
// 当系统连接失败或者错误时,默认显示‘舒适’模式
pathIds.put(ATSConfig.ATS_MODE_FAULT, "conf");
}
/**
* @param
* @return void
* @method genAtsModeData
* @description 生成ATS驾驶模式数据关系表,用于切换不同模式定位path
* @date: 2023/6/12 9:43
* @author: yongqiang.wen@foryouge.com.cn
*/
private void gen60VAtsModeData() {
// 生成ATSMode映射关系表
pathIds.clear();
pathIds.put(ATSConfig.ATS60_MODE_ECO, "eco");
pathIds.put(ATSConfig.ATS60_MODE_COMFORT, "conf");
pathIds.put(ATSConfig.ATS60_MODE_LIGHT_SNOW, "snow");
pathIds.put(ATSConfig.ATS60_MODE_DEEP_SNOW, "snow");
// pathIds.put(ATSConfig.ATS60_MODE_SINGLE_PEDAL, "single_pedal");
pathIds.put(ATSConfig.ATS60_MODE_RAPIDLY, "rapidly");
pathIds.put(ATSConfig.ATS60_MODE_THROUGH, "cross");
pathIds.put(ATSConfig.ATS60_MODE_SAND, "sand");
pathIds.put(ATSConfig.ATS60_MODE_DEEP_MUD, "mud");
pathIds.put(ATSConfig.ATS60_MODE_SHALLOW_MUD, "mud");
pathIds.put(ATSConfig.ATS60_MODE_ROCK, "rock");
pathIds.put(ATSConfig.ATS60_MODE_WAD, "wad");
pathIds.put(ATSConfig.ATS60_MODE_SPORT, "sport");
// 系统未初始化的时候不显示任何模式
pathIds.put(ATSConfig.ATS_MODE_NOT_INITIALIZED, "");
// 当系统连接失败或者错误时,默认显示‘舒适’模式
pathIds.put(ATSConfig.ATS_MODE_FAULT, "conf");
}
private void switchNextMode(String pathName) {
if (TextUtils.isEmpty(pathName)) return;
if (lottieAnimationView == null) {
ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
lottieAnimationView = new LottieAnimationView(getContext());
// lottieAnimationView.addAnimatorListener(animatorListener);
lottieAnimationView.addAnimatorUpdateListener(animation -> lottieAnimationView.setProgress(0.5f));
addView(lottieAnimationView, layoutParams);
}
lottieAnimationView.setVisibility(View.VISIBLE);
runLottieAnim(pathName);
}
private final Animator.AnimatorListener animatorListener = new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
LogUtil.d(ATS_TAG, "animation start!" + animation.toString());
}
@Override
public void onAnimationEnd(Animator animation) {
// 当上一个记录的模式路径与当前不一致时代表模式已经切换,
// 需要先播放上一个路径消失的动效再播放新模式的加载动效
// if (!TextUtils.equals(currentPathName, previousModePathName)) {
// previousModePathName = currentPathName;
// switchNextMode(currentPathName);
// } else if (notYetSwitchNext) {
// lottieAnimationView.setMinAndMaxProgress(0.5f, 1);
// notYetSwitchNext = false;
// }
LogUtil.d(ATS_TAG, "animation end!");
}
@Override
public void onAnimationCancel(Animator animation) {
LogUtil.d(ATS_TAG, "animation cancel!");
}
@Override
public void onAnimationRepeat(Animator animation) {
LogUtil.d(ATS_TAG, "animation repeat!");
}
};
private void runSwitchModeDisplayVideo(String pathName) {
// 切换模式需要让未播放的视频暂停
videoView.pause();
String currentPathName = "";
if (carModelConfig == CONFIG_CAR_MODEL_B41V) { // 北汽B41V车型
currentPathName = getB41VModelPath(pathName);
} else if (carModelConfig == CONFIG_CAR_MODEL_B41VS) { // 北汽B41VS车型
currentPathName = getB41VSModelPath(pathName);
} else if (carModelConfig == CONFIG_CAR_MODEL_B60VS) { // 北汽B60VS车型
currentPathName = getB60VSModelPath(pathName);
}
if (TextUtils.isEmpty(currentPathName)) return;
svgPathView.setPathSelect(pathName);
// 根据path name通过资源文件获取对应的动效视频路径
int videoSrc = getResources().getIdentifier(currentPathName, "raw", getContext().getPackageName());
String videoPath = "android.resource://" + getContext().getPackageName() + "/" + videoSrc;
post(() -> videoView.setVideoPath(videoPath));
LogUtil.d(ATS_TAG, "current Video path is " + videoPath + ",currentPathName is " + currentPathName);
if (videoSrc == 0) {
return;
}
post(() -> {
String tipsStr = getTipsStringByConfig();
if (!TextUtils.equals(confirmModeName, pathIds.get(ATSConfig.ATS60_MODE_RAPIDLY))) { // 极速模式没有提示文案
showModeEnterToast(tipsStr, false);
removeCallbacks(hideCustomToastRunnable);
postDelayed(hideCustomToastRunnable, 5000);
} else {
hideCustomToast();
}
videoView.setAudioFocusRequest(AudioManager.AUDIOFOCUS_NONE);
// SrcMngAudioSwitchManager.getInstance().requestAdayoAudioFocus(3, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT, "com.adayo.service.atsmode", mFocusChange,getContext());
videoView.setBackground(null);
//设置音频策略跟随ktv通道
videoView.setAudioAttributes(new AudioAttributes.Builder()
.setUsage(43)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build());
// videoView.setAudioAttributes(new AudioAttributes.Builder()
// .setLegacyStreamType(3)
// .build());
videoView.start();
setSvgPathViewVisibility(INVISIBLE);
setVideoViewVisibility(VISIBLE);
handlingSpecialModeSignals();
// mediaPlayer = new MediaPlayer();
// int videoSrc2 = getResources().getIdentifier("deepsnow", "raw", getContext().getPackageName());
// try {
// mediaPlayer.setDataSource(getContext(), Uri.parse("android.resource://" + getContext().getPackageName() + "/" + videoSrc2));
// } catch (IOException e) {
// e.printStackTrace();
// }
//
// mediaPlayer.setAudioAttributes(new AudioAttributes.Builder()
// .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION)
// .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
// .build());
//
// mediaPlayer.prepareAsync();
// mediaPlayer.setLooping(true);
// mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
// @Override
// public void onPrepared(MediaPlayer mediaPlayer) {
// mediaPlayer.start();
// }
// });
//
//
//
// new Handler().postDelayed(new Runnable() {
// @Override
// public void run() {
// mediaPlayer.stop();
// mediaPlayer.reset();
// }
// },7000);
});
}
private String getTipsStringByConfig() {
int tipsRes = 0;
String tipsStr = "";
if (carModelConfig == CONFIG_CAR_MODEL_B41V) { // 北汽B41V车型
tipsRes = getResources().getIdentifier("tips41_" + confirmModeName, "string", getContext().getPackageName());
} else if (carModelConfig == CONFIG_CAR_MODEL_B41VS) {
if (TextUtils.equals(confirmModeName, pathIds.get(ATSConfig.ATS60_MODE_RAPIDLY))) {
return "";
}
// tipsRes = getResources().getIdentifier("tips41vs_" + confirmModeName, "string", getContext().getPackageName());
tipsRes = getResources().getIdentifier("tips60_" + confirmModeName, "string", getContext().getPackageName());
} else if (carModelConfig == CONFIG_CAR_MODEL_B60VS) {
if (TextUtils.equals(confirmModeName, pathIds.get(ATSConfig.ATS60_MODE_RAPIDLY))) {
return "";
}
tipsRes = getResources().getIdentifier("tips60_" + confirmModeName, "string", getContext().getPackageName());
}
tipsStr = getContext().getString(tipsRes);
return tipsStr;
}
@NotNull
private String getB41VModelPath(String pathName) {
String currentPathName;
// 根据配置字来匹配展示的动效文件
if (configuration == MODEL_CONFIGURATION_VERSION_C) {
LogUtil.d(ATS_TAG, "current model configuration is C Version");
currentPathName = pathName + "_c";
} else if (configuration == MODEL_CONFIGURATION_VERSION_P) {
LogUtil.d(ATS_TAG, "current model configuration is P Version");
currentPathName = pathName + "_p";
} else {
LogUtil.d(ATS_TAG, "can not require current model configuration");
currentPathName = pathName + "_p";
}
return currentPathName;
}
@NotNull
private String getB60VSModelPath(String pathName) {
String currentPathName;
// 根据配置字来匹配展示的动效文件
currentPathName = pathName + "_60vs";
return currentPathName;
}
@NotNull
private String getB41VSModelPath(String pathName) {
String currentPathName;
// 鏍规嵁閰嶇疆瀛楁潵鍖归厤灞曠ず鐨勫姩鏁堟枃浠?
currentPathName = pathName + "_41vs";
return currentPathName;
}
private final Runnable hideCustomToastRunnable = this::hideCustomToast;
private void runLottieAnim(String pathName) {
// 播放切换动效
RectF rectF = svgPathView.getSelectRectF(pathName);
if (lottieAnimationView != null && rectF != null) {
// // 切换其他模式要先播放之前模式的隐藏动效
// if (!TextUtils.equals(previousModePathName, pathName) && lottieAnimationView.getVisibility() == VISIBLE) {
// lottieAnimationView.playAnimation();
// return;
// }
// 设置lottieView宽高
lottieAnimationView.getLayoutParams().width = (int) rectF.width();
lottieAnimationView.getLayoutParams().height = (int) rectF.height();
// 设置lottieView对应的位置坐标
lottieAnimationView.setX(rectF.centerX() - rectF.width() / 2);
lottieAnimationView.setY(rectF.centerY() - rectF.height() / 2);
String animSrc = getStringLottiePathSrc(pathName);
if (TextUtils.isEmpty(animSrc)) return;
LogUtil.d(ATS_TAG, "lottie res file path :" + animSrc);
lottieAnimationView.setAnimation(animSrc);
lottieAnimationView.setRepeatCount(0);
lottieAnimationView.setSpeed(0f);
lottieAnimationView.setFrame(16);
// if (!notYetSwitchNext) {
// // 由于UI给的动效文件是完整的动画过程,50%是动效加载并显示的过程,剩余的50%
// lottieAnimationView.setMinAndMaxProgress(0.5f, 0.5f);
// notYetSwitchNext = true;
// }
lottieAnimationView.playAnimation();
operateFlag = FLAG_OPERATE_UPDATE;
}
}
@NotNull
private String getStringLottiePathSrc(String pathName) {
// 处理多语言的情况,目前只有中英文
Locale locale = getResources().getConfiguration().locale;
String language = locale.getLanguage();
LogUtil.d(ATS_TAG, "current system language is: " + language);
String animSrc = null;
if (carModelConfig == CONFIG_CAR_MODEL_B41V) {
// 根据path加载对应的Lottie动画资源文件
if (TextUtils.equals(language, "en")) {
animSrc = pathName + "41_en.json";
} else {
animSrc = pathName + "41.json";
}
} else if (carModelConfig == CONFIG_CAR_MODEL_B41VS) {
// 根据path加载对应的Lottie动效资源文件
if (TextUtils.equals(language, "en")) {
animSrc = pathName + "60_en.json";
} else {
animSrc = pathName + "60.json";
}
} else if (carModelConfig == CONFIG_CAR_MODEL_B60VS) {
// 根据path加载对应的Lottie动画资源文件
if (TextUtils.equals(language, "en")) {
animSrc = pathName + "60_en.json";
} else {
animSrc = pathName + "60.json";
}
}
return animSrc;
}
public LifecycleRegistry getLifecycleRegistry() {
return lifecycleRegistry;
}
public void setLifecycleRegistry(LifecycleRegistry lifecycleRegistry) {
this.lifecycleRegistry = lifecycleRegistry;
}
public interface OnATSViewCloseListener {
void onClose();
}
private static IAdayoAudioFocusChange mFocusChange = new IAdayoAudioFocusChange() {
@Override
public void onAdayoAudioOnGain() {
}
@Override
public void onAdayoAudioOnLoss() {
}
@Override
public void onAdayoAudioLossTransient() {
}
@Override
public void onAdayoAudioLossTransientCanDuck() {
}
};
}
最新发布