package safeluck.drive.evaluation;
|
|
|
import android.Manifest;
|
import android.app.AlertDialog;
|
import com.anyun.basecommonlib.MyLog;
|
import android.content.DialogInterface;
|
import android.os.AsyncTask;
|
import android.os.Build;
|
import android.os.Bundle;
|
|
import android.os.Environment;
|
import android.text.TextUtils;
|
import android.util.Log;
|
import android.view.View;
|
import android.view.Window;
|
import android.view.WindowManager;
|
import android.widget.Button;
|
import android.widget.ImageView;
|
import android.widget.TextView;
|
import android.widget.Toast;
|
|
|
import androidx.annotation.NonNull;
|
import androidx.annotation.Nullable;
|
import androidx.lifecycle.Observer;
|
import androidx.lifecycle.ViewModelProviders;
|
import androidx.work.Data;
|
import androidx.work.OneTimeWorkRequest;
|
import androidx.work.WorkManager;
|
|
|
import me.yokeyword.fragmentation.SupportActivity;
|
import safeluck.drive.evaluation.DB.appstatusdb.AppStatus;
|
import safeluck.drive.evaluation.DB.appstatusdb.AppStatusViewModel;
|
import safeluck.drive.evaluation.DB.rtktb.RTKConfig;
|
import safeluck.drive.evaluation.DB.rtktb.RTKConfigUpdateWorker;
|
import safeluck.drive.evaluation.DB.rtktb.RTKConfigViewModel;
|
import safeluck.drive.evaluation.DB.signalConfigdb.SignalConfigViewModel;
|
import safeluck.drive.evaluation.bean.AbsInitialData;
|
import safeluck.drive.evaluation.bean.ExamPlatformData;
|
import safeluck.drive.evaluation.bean.SignalConfigRemote;
|
import safeluck.drive.evaluation.cEventCenter.CEventCenter;
|
import safeluck.drive.evaluation.cEventCenter.ICEventListener;
|
import safeluck.drive.evaluation.customview.MyDialog;
|
import safeluck.drive.evaluation.fragment.HomeFragment;
|
|
import com.anyun.exam.lib.AYSdk;
|
import com.anyun.im_lib.listener.IMSConnectStatusCallback;
|
import com.google.gson.Gson;
|
import com.safeluck.aykj.utils.BytesUtils;
|
|
import org.json.JSONException;
|
import org.json.JSONObject;
|
|
import java.io.File;
|
import java.util.ArrayList;
|
import java.util.List;
|
import java.util.concurrent.Executors;
|
import java.util.concurrent.ScheduledExecutorService;
|
import java.util.concurrent.TimeUnit;
|
|
import safeluck.drive.evaluation.im.IMSClientBootstrap;
|
import safeluck.drive.evaluation.im.MessageProcessor;
|
import safeluck.drive.evaluation.platformMessage.JKMessage0100;
|
import safeluck.drive.evaluation.platformMessage.JKMessage0101;
|
import safeluck.drive.evaluation.platformMessage.PlatFormConstant;
|
import safeluck.drive.evaluation.util.CThreadPoolExecutor;
|
import safeluck.drive.evaluation.util.DataInitKt;
|
import safeluck.drive.evaluation.util.FileUtil;
|
import safeluck.drive.evaluation.util.PermissionManager;
|
import safeluck.drive.evaluation.util.SPUtils;
|
import safeluck.drive.evaluation.util.Utils;
|
import safeluck.drive.evaluation.viewmodels.AuthMapViewmodel;
|
import safeluck.drive.evaluation.viewmodels.ExamPlatformModel;
|
import safeluck.drive.evaluation.viewmodels.TimeViewModel;
|
|
public class MainActivity extends SupportActivity implements IMSConnectStatusCallback, View.OnClickListener {
|
|
private static final int PERMISSIONS_REQUEST_CODE = 1001;
|
private String TAG = MainActivity.class.getCanonicalName();
|
SignalConfigViewModel signalConfigViewModel;
|
private PermissionManager mPermissionsManager;
|
private RTKConfig mRTKConfig;//RTK配置信息
|
private ImageView iv_rtk_status;
|
private Gson gson = new Gson();
|
String[] PERMISSIONS = new String[]{ Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.WRITE_EXTERNAL_STORAGE};
|
RTKConfigViewModel rtkConfigViewModel;
|
public ExamPlatformModel examPlatformModel;
|
|
private TextView tv_sat_num,tv_work_platform,tv_network_time,
|
tv_qf,tv_ble_status;
|
|
public Button btn_return;
|
public View viewtitle;
|
|
private ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
|
private AuthMapViewmodel authMapViewmodel;
|
String des ="蓝牙关闭";
|
private ICEventListener icEventListener = new ICEventListener() {
|
@Override
|
public void onCEvent(String topic, int msgCode, int resultCode, Object obj) {
|
|
if (msgCode == Constant.RTK_PLATFORM_REGISTER_STATUS) {
|
try {
|
JSONObject jsonObject = new JSONObject((String) obj);
|
String rtkLoginPwd = jsonObject.getString("password");
|
int reg_code = jsonObject.getInt("register_code");
|
if (mRTKConfig != null) {
|
|
mRTKConfig.setPassword(rtkLoginPwd);
|
mRTKConfig.setRegistered(reg_code);
|
rtkConfigViewModel.insertRTKConfig(mRTKConfig);
|
}else{
|
MyLog.i(TAG,"mRTKConfig == null");
|
}
|
} catch (JSONException e) {
|
e.printStackTrace();
|
}
|
}
|
if (msgCode == Constant.ID_SM_BLUETOOTH_BRIEF){
|
if (tv_ble_status != null){
|
try {
|
String str = (String) obj;
|
Log.i(TAG,"shou=="+str);
|
JSONObject jsonObject = new JSONObject(str);
|
int bleStatus = jsonObject.getInt("bluetooth_status");
|
|
|
switch (bleStatus){
|
case 0:
|
des ="蓝牙关闭";
|
break;
|
case 1:
|
des ="蓝牙打开";
|
|
break;
|
case 2:
|
des ="蓝牙未连接";
|
break;
|
case 3:
|
|
des ="蓝牙连接";
|
String mac = jsonObject.getString("bluetooth_addr");
|
SPUtils.put(getApplicationContext(),SPUtils.BLUETOOTH_MAC,mac);
|
break;
|
}
|
tv_ble_status.post(new Runnable() {
|
@Override
|
public void run() {
|
tv_ble_status.setText(des);
|
}
|
});
|
|
} catch (JSONException e) {
|
e.printStackTrace();
|
}
|
|
|
}
|
}
|
|
}
|
};
|
private boolean hasSendInitData;
|
private List<SignalConfigRemote> signalConfiglist = new ArrayList<>();
|
private int permissionCount = 0;
|
@Override
|
protected void onCreate(Bundle savedInstanceState) {
|
super.onCreate(savedInstanceState);
|
//全屏
|
requestWindowFeature(Window.FEATURE_NO_TITLE);
|
hideBottomUIMenu();
|
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
|
setContentView(R.layout.activity_main);
|
//初始化tts
|
ExamPlatformData.getInstance().initTTS(getApplicationContext());
|
viewtitle = findViewById(R.id.top_title);
|
btn_return = findViewById(R.id.btn_return);
|
|
|
btn_return.setOnClickListener(this);
|
iv_rtk_status = findViewById(R.id.iv_rtk_connect);
|
tv_work_platform = findViewById(R.id.platform);
|
|
tv_sat_num = findViewById(R.id.tv_sat_num_instatus);
|
tv_ble_status = findViewById(R.id.tv_ble_status);
|
tv_qf = findViewById(R.id.tv_qf);
|
iv_rtk_status.getDrawable().setLevel(0);
|
tv_network_time = findViewById(R.id.network_time);
|
|
|
tv_network_time.setText(Utils.getHHmm());
|
|
|
|
|
AppStatusViewModel appStatusViewModel = ViewModelProviders.of(this).get(AppStatusViewModel.class);
|
appStatusViewModel.getAppStatus().observe(this, new Observer<AppStatus>() {
|
@Override
|
public void onChanged(AppStatus appStatus) {
|
if (appStatus != null){
|
Log.i(TAG, "onChanged: "+appStatus.toString());
|
iv_rtk_status.getDrawable().setLevel(appStatus.getRtk_connect_status());
|
tv_work_platform.setText(getString(R.string.platform_status,ExamPlatformData.getInstance().getExamplatformStatusStr(
|
ExamPlatformData.getInstance().getExamplatformStatus()
|
)));
|
tv_sat_num.setText(String.valueOf(appStatus.getSat_num()).length()==1?"0"+appStatus.getSat_num():String.valueOf(appStatus.getSat_num()));
|
tv_qf.setText(getResources().getStringArray(R.array.qf_status)[appStatus.getQf()<5?appStatus.getQf():0]);
|
}
|
}
|
});
|
|
TimeViewModel timeViewModel = ViewModelProviders.of(this).get(TimeViewModel.class);
|
timeViewModel.getLiveDataTime().observe(this, new Observer<String>() {
|
@Override
|
public void onChanged(String s) {
|
tv_network_time.setText(s);
|
}
|
});
|
|
authMapViewmodel = ViewModelProviders.of(this).get(AuthMapViewmodel.class);
|
authMapViewmodel.getAuthValue().observe(this, new Observer<Integer>() {
|
|
|
@Override
|
public void onChanged(Integer integer) {
|
Log.i(TAG,"AuthMapViewmodel auth="+integer.intValue());
|
if (integer.intValue() == Constant.BLUETOOTH_CONNECT){
|
MyLog.i(TAG,"Bluetooth connected,auth permission and sn != null");
|
String sn = ExamPlatformData.getInstance().getMcuSN();
|
if (!TextUtils.isEmpty(sn)){
|
|
MyLog.i("权限允许,蓝牙已连接,获得到的sn="+sn+" sendInitData");
|
hasSendInitData = true;
|
AbsInitialData.getInstance().sendInitialData();
|
}else{
|
MyLog.i(TAG,"权限允许,蓝牙已连接,获得到的sn=null,不能发送初始数据");
|
hasSendInitData= false;
|
}
|
|
}
|
}
|
});
|
// TODO
|
// 进行tcp连接
|
final String userId = "100002";
|
final String token = "token_" + userId;
|
examPlatformModel= ViewModelProviders.of(this).get(ExamPlatformModel.class);
|
examPlatformModel.getDataChange().observe(this, new Observer<Integer>() {
|
@Override
|
public void onChanged(Integer integer) {
|
Log.i(TAG, "ExamPlatformModel onChanged: integer=="+integer);
|
if (integer == 1){
|
MyLog.i("重新连接考试平台");
|
}else{
|
|
}
|
|
|
String str = ExamPlatformData.getInstance().getPlatformIP();
|
String hosts = "[{\"host\":"+str+","+ "\"port\":"+ExamPlatformData.getInstance().getPlatformPort()+"}]";
|
MyLog.i("hosts="+hosts);
|
IMSClientBootstrap.getInstance().close();
|
IMSClientBootstrap.getInstance().init(userId,token,hosts,1,MainActivity.this);
|
}
|
});
|
|
scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
|
@Override
|
public void run() {
|
ExamPlatformData.getInstance().setTimeArrive_10s(true);
|
}
|
},10,10, TimeUnit.SECONDS);
|
|
|
rtkConfigViewModel = ViewModelProviders.of(this).get(RTKConfigViewModel.class);
|
rtkConfigViewModel.getRTKConfig().observe(this, new Observer<RTKConfig>() {
|
@Override
|
public void onChanged(RTKConfig rtkConfig) {
|
|
MyLog.i(TAG, "RTKConfig Changed: " + (rtkConfig != null ? rtkConfig.toString() : "null"));
|
|
if (rtkConfig != null)
|
mRTKConfig = rtkConfig;
|
|
synchronized (MainActivity.this){
|
if (ExamPlatformData.getInstance().isCanWriteSD()){
|
AbsInitialData.getInstance().resethasSendInitData();
|
AbsInitialData.getInstance().sendInitialData();
|
MyLog.i("rtkConfig 更新sn后发送初始数据");
|
}
|
// if (onlySendOnceRTKConfig){
|
// MyLog.i(TAG,"进入 synchronized (MainActivity.this)");
|
// onlySendOnceRTKConfig = false;
|
// sendRtkConfigInfo();
|
// }
|
}
|
|
}
|
});
|
|
|
|
mPermissionsManager = new PermissionManager(this) {
|
@Override
|
public void authorized(int requestCode) {
|
Log.d(TAG, "requestCode = " + requestCode+Build.VERSION.SDK_INT);
|
permissionCount++;
|
Log.i(TAG,"fingerPrint="+Build.FINGERPRINT);
|
if (Build.FINGERPRINT.contains(Constant.OUR_SYS_IMAGE)){
|
MyLog.i(TAG,"自己的系统");
|
setSDAuthAndSendJudgeArg();
|
return;
|
}
|
if (permissionCount == PERMISSIONS.length-1){
|
setSDAuthAndSendJudgeArg();
|
}
|
|
}
|
|
@Override
|
public void noAuthorization(int requestCode, String[] lackPermissions) {
|
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
|
builder.setTitle("提示");
|
builder.setMessage("缺少" + lackPermissions + "权限");
|
builder.setPositiveButton("设置权限", new DialogInterface.OnClickListener() {
|
@Override
|
public void onClick(DialogInterface dialog, int which) {
|
PermissionManager.startAppSettings(getApplicationContext());
|
}
|
});
|
builder.create().show();
|
}
|
|
@Override
|
public void ignore() {
|
Log.d(TAG, "requestCode ignore");
|
}
|
};
|
|
|
MyLog.i(TAG, "onCreate");
|
|
//加载根Fragment
|
if (findFragment(HomeFragment.class) == null) {
|
loadRootFragment(R.id.fl_container, HomeFragment.newInstance());
|
}
|
|
CEventCenter.onBindEvent(true, icEventListener, Constant.BIND_CONNECT_RTK_TOPIC);//收到rtk连接 登录结果
|
|
}
|
|
private void setSDAuthAndSendJudgeArg() {
|
ExamPlatformData.getInstance().setCanWriteSD(true);
|
//只要app不销毁(重启)只会请求一次,但是确保PERMISSIONS最后一个元素是writeSD
|
|
|
//需要延迟再发送,因为发送蓝牙已连接在前(先不判断蓝牙状态,只要有sn,12/10),收到sn在后,所以延迟发送3 ,可以取得sn
|
scheduledExecutorService.schedule(()->{ authMapViewmodel.setAuthValue(3);},2,TimeUnit.SECONDS);
|
}
|
|
@Override
|
protected void onDestroy() {
|
super.onDestroy();
|
|
CEventCenter.onBindEvent(false, icEventListener, Constant.BIND_CONNECT_RTK_TOPIC);
|
Log.i(TAG, "onDestroy: ");
|
}
|
|
|
@Override
|
protected void onResume() {
|
super.onResume();
|
Log.i(TAG,"mPermissionManager check");
|
mPermissionsManager.checkPermissions(PERMISSIONS_REQUEST_CODE, PERMISSIONS);
|
}
|
|
@Override
|
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
mPermissionsManager.recheckPermissions(PERMISSIONS_REQUEST_CODE, permissions, grantResults);
|
}
|
|
private boolean listContainsSameValue(List<Integer> indexs) {
|
for (int i = 0; i < indexs.size(); i++) {
|
//可以默认是0 0不判断是否有相同的index
|
if (indexs.get(i) == 0){
|
continue;
|
}
|
for (int j=i+1;j<indexs.size();j++){
|
|
if (indexs.get(i) == indexs.get(j)){
|
return true;
|
}
|
}
|
}
|
return false;
|
}
|
|
@Override
|
public void onConnecting() {
|
|
MyLog.i(TAG,"TCP onConnecting");
|
}
|
|
@Override
|
public void onConnected() {
|
ExamPlatformData.getInstance().setExamplatformStatus(ExamPlatformData.TCP_CONNECTED);
|
MyLog.i("TCP连接成功");
|
//TODO 判断SPUtils 是否保存有des密码;如果没有则进行注册JKMessage0100,如果有密码则进行鉴权JKMessage0101
|
String hexPwd = (String) SPUtils.get(this,SPUtils.DES_HEX_PWD,"");
|
hexPwd="";
|
MessageProcessor.getInstance().addBeatHeart(20);
|
if (TextUtils.isEmpty(hexPwd)){
|
|
MyLog.i(PlatFormConstant.TAG,"密码不存在,进行注册,发送注册消息");
|
|
JKMessage0100 jkRegisterMessage = new JKMessage0100();
|
if (mRTKConfig!=null){
|
jkRegisterMessage.proviceid = mRTKConfig.getProvince();
|
jkRegisterMessage.cityid = mRTKConfig.getCity();
|
jkRegisterMessage.imei = mRTKConfig.getImei();
|
jkRegisterMessage.model = mRTKConfig.getModel();
|
jkRegisterMessage.sn = mRTKConfig.getSn();
|
}
|
|
|
byte[] str = jkRegisterMessage.toBytes();
|
MessageProcessor.getInstance().sendMessage(jkRegisterMessage);
|
Log.i(TAG, "onClick: "+ BytesUtils.bytesToHexString(str)+" ============");
|
}else{
|
MyLog.i(PlatFormConstant.TAG,"密码存在,已注册过,直接发鉴权消息");
|
JKMessage0101 jkMessage0101 = new JKMessage0101();
|
String des = hexPwd;
|
long time = System.currentTimeMillis()/1000;
|
int unsignedInt = Utils.parseUnsignedInt(String.valueOf(time),10);
|
MyLog.i(String.format("总秒数(long)=%d,装换成unsigned int= %d",time,unsignedInt));
|
jkMessage0101.timestamp = unsignedInt;
|
|
|
byte[] miwen = Utils.encrypt(com.anyun.im_lib.util.ByteUtil.intGetBytes(unsignedInt),des);
|
MyLog.i(PlatFormConstant.TAG,"鉴权密文="+BytesUtils.bytesToHexString(miwen)+" time="+unsignedInt);
|
jkMessage0101.des = BytesUtils.bytesToHexString(miwen);
|
|
MessageProcessor.getInstance().sendMessage(jkMessage0101);
|
}
|
}
|
|
@Override
|
public void onConnectFailed() {
|
ExamPlatformData.getInstance().setExamplatformStatus(ExamPlatformData.TCP_DISCONNECT);
|
MyLog.i(TAG,"TCP连接失败");
|
}
|
/**
|
* 隐藏虚拟按键,并且全屏
|
*/
|
protected void hideBottomUIMenu() {
|
//隐藏虚拟按键,并且全屏
|
if (Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api
|
View v = this.getWindow().getDecorView();
|
v.setSystemUiVisibility(View.GONE);
|
} else if (Build.VERSION.SDK_INT >= 19) {
|
//for new api versions.
|
View decorView = getWindow().getDecorView();
|
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
|
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN;
|
decorView.setSystemUiVisibility(uiOptions);
|
}
|
}
|
|
@Override
|
public void onClick(View v) {
|
switch (v.getId()){
|
case R.id.btn_return:
|
onBackPressed();
|
break;
|
}
|
}
|
}
|