diff --git a/app_ipc_monitoring/src/main/AndroidManifest.xml b/app_ipc_monitoring/src/main/AndroidManifest.xml index 5da8d114a8..7b879c95e6 100644 --- a/app_ipc_monitoring/src/main/AndroidManifest.xml +++ b/app_ipc_monitoring/src/main/AndroidManifest.xml @@ -39,7 +39,7 @@ android:theme="@style/AppTheme"> @@ -49,7 +49,9 @@ - + diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/AutopilotConfigAdapter.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/AutopilotConfigAdapter.java new file mode 100644 index 0000000000..a5f2db2681 --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/AutopilotConfigAdapter.java @@ -0,0 +1,405 @@ +package com.zhidao.adas.client.adapter; + +import android.content.Context; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.zhidao.adas.client.R; +import com.zhidao.adas.client.bean.AutoPilotMode; + +import java.util.ArrayList; +import java.util.List; + +public class AutopilotConfigAdapter extends RecyclerView.Adapter { + + private List datas; + private Context mContext; + private OnHaveDataListener onHaveDataListener; + private boolean isShowDel = false; + + public AutopilotConfigAdapter(List datas) { + this.datas = datas; + if (datas == null) { + this.datas = new ArrayList<>(); + } + } + + public void setShowDel(boolean showDel) { + isShowDel = showDel; + notifyDataSetChanged(); + } + + public List getDatas() { + return datas; + } + + public interface OnHaveDataListener { + void onHaveData(boolean isHave); + } + + public void setOnItemClickListener(OnHaveDataListener l) { + this.onHaveDataListener = l; + } + + public void add() { + datas.add(new AutoPilotMode()); + notifyItemInserted(datas.size() - 1); + if (onHaveDataListener != null && datas.size() == 1) + onHaveDataListener.onHaveData(true); + } + + public void minus(int position) { + AutoPilotMode bean = datas.get(position); + bean.wayLatLons = null; + bean = null; + datas.remove(position); + notifyItemRemoved(position); + notifyItemRangeChanged(position, getItemCount()); + if (onHaveDataListener != null && datas.size() == 0) + onHaveDataListener.onHaveData(false); + } + + @Override + public int getItemViewType(int position) { + return position; + } + + //创建ViewHolder + @NonNull + @Override + public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + //实例化得到Item布局文件的View对象 + mContext = parent.getContext(); + View v = LayoutInflater.from(mContext).inflate(R.layout.item_autopilot_config, parent, false); + //返回MyViewHolder的对象 + return new MyViewHolder(v); + } + + //绑定数据 + @Override + public void onBindViewHolder(@NonNull MyViewHolder holder, int position) { + AutoPilotMode mode = datas.get(position); + if (!TextUtils.isEmpty(mode.name)) + holder.path_name.setText(mode.name); + if (mode.speedLimit != 0.0) + holder.speed.setText(String.valueOf(mode.speedLimit)); + if (!TextUtils.isEmpty(mode.startName)) + holder.start_name.setText(mode.startName); + if (!TextUtils.isEmpty(mode.endName)) + holder.end_name.setText(mode.endName); + if (mode.startLatLon != null) { + if (mode.startLatLon.longitude != 0.0) + holder.start_lon.setText(String.valueOf(mode.startLatLon.longitude)); + if (mode.startLatLon.latitude != 0.0) + holder.start_lat.setText(String.valueOf(mode.startLatLon.latitude)); + } + if (mode.endLatLon != null) { + if (mode.endLatLon.longitude != 0.0) + holder.end_lon.setText(String.valueOf(mode.endLatLon.longitude)); + if (mode.endLatLon.latitude != 0.0) + holder.end_lat.setText(String.valueOf(mode.endLatLon.latitude)); + } + holder.setViaData(); + holder.del.setVisibility(isShowDel ? View.VISIBLE : View.GONE); + } + + //返回Item的数量 + @Override + public int getItemCount() { + return datas == null ? 0 : datas.size(); + } + + //继承RecyclerView.ViewHolder抽象类的自定义ViewHolder + class MyViewHolder extends RecyclerView.ViewHolder { + RecyclerView recyclerView; + EditText path_name; + EditText speed; + EditText start_name; + EditText end_name; + EditText start_lon; + EditText start_lat; + EditText end_lon; + EditText end_lat; + TextView num; + TextView del; + ImageView add; + ImageView minus; + ViaPositionAdapter adapter; + + MyViewHolder(View itemView) { + super(itemView); + recyclerView = itemView.findViewById(R.id.RecyclerView); + path_name = itemView.findViewById(R.id.path_name); + speed = itemView.findViewById(R.id.speed); + start_name = itemView.findViewById(R.id.start_name); + end_name = itemView.findViewById(R.id.end_name); + start_lon = itemView.findViewById(R.id.start_lon); + start_lat = itemView.findViewById(R.id.start_lat); + end_lon = itemView.findViewById(R.id.end_lon); + end_lat = itemView.findViewById(R.id.end_lat); + num = itemView.findViewById(R.id.num); + del = itemView.findViewById(R.id.del); + add = itemView.findViewById(R.id.add); + minus = itemView.findViewById(R.id.minus); + initRecyclerView(); + minus.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + minus(); + } + }); + add.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + add(); + } + }); + del.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + AutopilotConfigAdapter.this.minus(getBindingAdapterPosition()); + } + }); + path_name.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + datas.get(getBindingAdapterPosition()).name = s.toString().trim(); + } + }); + speed.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + if (!TextUtils.isEmpty(s)) { + try { + datas.get(getBindingAdapterPosition()).speedLimit = Double.parseDouble(s.toString().trim()); + } catch (Exception e) { + e.printStackTrace(); + speed.setText(""); + Toast.makeText(mContext, "输入不合法", Toast.LENGTH_SHORT).show(); + } + } else { + datas.get(getBindingAdapterPosition()).speedLimit = 0.0; + } + + } + }); + start_name.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + datas.get(getBindingAdapterPosition()).startName = s.toString().trim(); + } + }); + end_name.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + datas.get(getBindingAdapterPosition()).endName = s.toString().trim(); + } + }); + start_lon.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + if (!TextUtils.isEmpty(s)) { + try { + if (datas.get(getBindingAdapterPosition()).startLatLon == null) + datas.get(getBindingAdapterPosition()).startLatLon = new AutoPilotMode.Location(); + datas.get(getBindingAdapterPosition()).startLatLon.longitude = Double.parseDouble(s.toString().trim()); + } catch (Exception e) { + e.printStackTrace(); + start_lon.setText(""); + Toast.makeText(mContext, "输入不合法", Toast.LENGTH_SHORT).show(); + } + } else { + if (datas.get(getBindingAdapterPosition()).startLatLon != null) { + datas.get(getBindingAdapterPosition()).startLatLon.longitude = 0.0; + } + } + } + }); + start_lat.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + if (!TextUtils.isEmpty(s)) { + try { + if (datas.get(getBindingAdapterPosition()).startLatLon == null) + datas.get(getBindingAdapterPosition()).startLatLon = new AutoPilotMode.Location(); + datas.get(getBindingAdapterPosition()).startLatLon.latitude = Double.parseDouble(s.toString().trim()); + } catch (Exception e) { + e.printStackTrace(); + start_lat.setText(""); + Toast.makeText(mContext, "输入不合法", Toast.LENGTH_SHORT).show(); + } + } else { + if (datas.get(getBindingAdapterPosition()).startLatLon != null) + datas.get(getBindingAdapterPosition()).startLatLon.latitude = 0.0; + } + } + }); + end_lon.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + if (!TextUtils.isEmpty(s)) { + try { + if (datas.get(getBindingAdapterPosition()).endLatLon == null) + datas.get(getBindingAdapterPosition()).endLatLon = new AutoPilotMode.Location(); + datas.get(getBindingAdapterPosition()).endLatLon.longitude = Double.parseDouble(s.toString().trim()); + } catch (Exception e) { + e.printStackTrace(); + end_lon.setText(""); + Toast.makeText(mContext, "输入不合法", Toast.LENGTH_SHORT).show(); + } + } else { + if (datas.get(getBindingAdapterPosition()).endLatLon != null) + datas.get(getBindingAdapterPosition()).endLatLon.longitude = 0.0; + } + + } + }); + end_lat.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + if (!TextUtils.isEmpty(s)) { + try { + if (datas.get(getBindingAdapterPosition()).endLatLon == null) + datas.get(getBindingAdapterPosition()).endLatLon = new AutoPilotMode.Location(); + datas.get(getBindingAdapterPosition()).endLatLon.latitude = Double.parseDouble(s.toString().trim()); + } catch (Exception e) { + e.printStackTrace(); + end_lat.setText(""); + Toast.makeText(mContext, "输入不合法", Toast.LENGTH_SHORT).show(); + } + } else { + if (datas.get(getBindingAdapterPosition()).endLatLon != null) + datas.get(getBindingAdapterPosition()).endLatLon.latitude = 0.0; + } + + } + }); + } + + private void initRecyclerView() { + LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mContext); + linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); + recyclerView.setLayoutManager(linearLayoutManager); + adapter = new ViaPositionAdapter(); + recyclerView.setAdapter(adapter); + + } + + private void minus() { + if (adapter.getItemCount() > 0) { + adapter.minus(); + num.setText(String.valueOf(adapter.getItemCount())); + } + } + + public void add() { + adapter.addHint(); + recyclerView.scrollToPosition(adapter.getItemCount() - 1); + num.setText(String.valueOf(adapter.getItemCount())); + } + + public void setViaData() { + if (adapter.getDatas() == null) { + List list = datas.get(getBindingAdapterPosition()).wayLatLons; + if (list == null) { + list = new ArrayList<>(); + datas.get(getBindingAdapterPosition()).wayLatLons = list; + } + adapter.setDatas(list); + } + } + } +} + diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/ConfigAdapter.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/ConfigAdapter.java similarity index 97% rename from app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/ConfigAdapter.java rename to app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/ConfigAdapter.java index 88dd8b7c35..7381bc5116 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/ConfigAdapter.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/ConfigAdapter.java @@ -1,4 +1,4 @@ -package com.zhidao.adas.client.ui.mian; +package com.zhidao.adas.client.adapter; import android.view.LayoutInflater; import android.view.View; diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/DataShowAdapter.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/DataShowAdapter.java similarity index 98% rename from app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/DataShowAdapter.java rename to app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/DataShowAdapter.java index b268d58d1b..1ef3a2366e 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/DataShowAdapter.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/DataShowAdapter.java @@ -1,4 +1,4 @@ -package com.zhidao.adas.client.ui.mian; +package com.zhidao.adas.client.adapter; import android.annotation.SuppressLint; import android.graphics.Color; diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/InfoTitleAdapter.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/InfoTitleAdapter.java similarity index 97% rename from app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/InfoTitleAdapter.java rename to app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/InfoTitleAdapter.java index 136277a6d6..354abc0b1d 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/InfoTitleAdapter.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/InfoTitleAdapter.java @@ -1,4 +1,4 @@ -package com.zhidao.adas.client.ui.mian; +package com.zhidao.adas.client.adapter; import android.view.LayoutInflater; import android.view.View; diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/LineAdapter.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/LineAdapter.java new file mode 100644 index 0000000000..657746c36a --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/LineAdapter.java @@ -0,0 +1,60 @@ +package com.zhidao.adas.client.adapter; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.zhidao.adas.client.R; +import com.zhidao.adas.client.base.BaseAdapter; +import com.zhidao.adas.client.base.BaseViewHolder; +import com.zhidao.adas.client.bean.AutoPilotMode; + +import java.util.List; + +/** + * @author song kenan + * @des 线路 + * @date 2021/8/13 + */ +public class LineAdapter extends BaseAdapter { + + + public LineAdapter(List data) { + super(data); + } + + @Override + public void setData(List mDatas) { + super.setData(mDatas); + } + + @Override + protected void onBindDataToItem(ViewHolder viewHolder, AutoPilotMode data, int position) { + viewHolder.title.setText(data.name + " " + data.startName + "->" + data.endName); + } + + @Override + protected View getItemViewResource(ViewGroup viewGroup) { + return LayoutInflater.from(mContext).inflate(R.layout.item_info, viewGroup, false); + } + + @Override + protected ViewHolder getViewHolder(View view) { + return new ViewHolder(view, this); + } + + class ViewHolder extends BaseViewHolder { + TextView title; + + public ViewHolder(View itemView, LineAdapter adapter) { + super(itemView, adapter); + ViewGroup.LayoutParams layoutParams = itemView.getLayoutParams(); + if (layoutParams != null) { + layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT; + + } + title = itemView.findViewById(R.id.tv_info_title); + } + } +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/ViaPositionAdapter.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/ViaPositionAdapter.java new file mode 100644 index 0000000000..10fea989e6 --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/ViaPositionAdapter.java @@ -0,0 +1,157 @@ +package com.zhidao.adas.client.adapter; + +import android.content.Context; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.zhidao.adas.client.R; +import com.zhidao.adas.client.bean.AutoPilotMode; + +import java.util.List; + + +public class ViaPositionAdapter extends RecyclerView.Adapter { + + private List datas; + private Context mContext; + + public void setDatas(List datas) { + this.datas = datas; + if (!this.datas.isEmpty()) { + for (int i = 0; i < this.datas.size(); i++) { + this.datas.get(i).name = "点" + (i + 1); + } + } + } + + public List getDatas() { + return datas; + } + + public void addHint() { + datas.add(new AutoPilotMode.Location("点" + (datas.size() + 1))); + notifyItemInserted(datas.size() - 1); + } + + public void minus() { + datas.remove(datas.size() - 1); + notifyItemRemoved(datas.size() - 1); + notifyItemRangeChanged(datas.size() - 1, getItemCount()); + } + + @Override + public int getItemViewType(int position) { + return position; + } + + //创建ViewHolder + @NonNull + @Override + public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + //实例化得到Item布局文件的View对象 + mContext = parent.getContext(); + View v = LayoutInflater.from(mContext).inflate(R.layout.item_via, parent, false); + //返回MyViewHolder的对象 + return new MyViewHolder(v); + } + + //绑定数据 + @Override + public void onBindViewHolder(@NonNull MyViewHolder holder, int position) { + AutoPilotMode.Location location = datas.get(position); + holder.title.setText(location.name); + if (location.longitude != 0.0) + holder.lon.setText(String.valueOf(location.longitude)); + if (location.latitude != 0.0) + holder.lat.setText(String.valueOf(location.latitude)); +// holder.input.setFocusable(true); +// holder.input.setFocusableInTouchMode(true); +// holder.input.requestFocus(); + + } + + //返回Item的数量 + @Override + public int getItemCount() { + return datas == null ? 0 : datas.size(); + } + + + //继承RecyclerView.ViewHolder抽象类的自定义ViewHolder + class MyViewHolder extends RecyclerView.ViewHolder { + TextView title; + EditText lon; + EditText lat; + + MyViewHolder(View itemView) { + super(itemView); + title = itemView.findViewById(R.id.title); + lon = itemView.findViewById(R.id.lon); + lat = itemView.findViewById(R.id.lat); + lon.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + if (!TextUtils.isEmpty(s)) { + try { + datas.get(getBindingAdapterPosition()).longitude = Double.parseDouble(s.toString().trim()); + } catch (Exception e) { + e.printStackTrace(); + lon.setText(""); + Toast.makeText(mContext, "输入不合法", Toast.LENGTH_SHORT).show(); + } + } else { + datas.get(getBindingAdapterPosition()).longitude = 0.0; + } + } + }); + lat.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + if (!TextUtils.isEmpty(s)) { + try { + datas.get(getBindingAdapterPosition()).latitude = Double.parseDouble(s.toString().trim()); + } catch (Exception e) { + e.printStackTrace(); + lat.setText(""); + Toast.makeText(mContext, "输入不合法", Toast.LENGTH_SHORT).show(); + } + } else { + datas.get(getBindingAdapterPosition()).latitude = 0.0; + } + } + }); + } + } + +} + diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/base/BaseActivity.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/base/BaseActivity.java new file mode 100644 index 0000000000..65e64c103e --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/base/BaseActivity.java @@ -0,0 +1,75 @@ +package com.zhidao.adas.client.base; + +import android.os.Handler; +import android.os.Message; + +import androidx.appcompat.app.AppCompatActivity; + +import java.lang.ref.WeakReference; + +public abstract class BaseActivity extends AppCompatActivity { + private BaseHandler mBaseHandler; + /** + * 初始化一个Handler,如果需要使用Handler,先调用此方法, + * 然后可以使用postRunnable(Runnable runnable), + * sendMessage在handleMessage(Message msg)中接收msg + */ + public void initHandler() { + mBaseHandler = new BaseHandler(this); + } + + /** + * 返回Handler,在此之前确定已经调用initHandler() + * + * @return Handler + */ + public Handler getHandler() { + return mBaseHandler; + } + + + /** + * 同Handler 的 handleMessage, + * getHandler.sendMessage,发送的Message在此接收 + * 在此之前确定已经调用initHandler() + * + * @param msg + */ + protected void handleMessage(Message msg) { + + } + + /** + * 同Handler的postRunnable + * 在此之前确定已经调用initHandler() + */ + protected void postRunnable(Runnable runnable) { + postRunnableDelayed(runnable, 0); + } + + /** + * 同Handler的postRunnableDelayed + * 在此之前确定已经调用initHandler() + */ + protected void postRunnableDelayed(Runnable runnable, long delayMillis) { + if (mBaseHandler == null) initHandler(); + mBaseHandler.postDelayed(runnable, delayMillis); + } + + + protected static class BaseHandler extends Handler { + private final WeakReference mObjects; + + public BaseHandler(BaseActivity mPresenter) { + mObjects = new WeakReference(mPresenter); + } + + @Override + public void handleMessage(Message msg) { + BaseActivity mPresenter = mObjects.get(); + if (mPresenter != null) + mPresenter.handleMessage(msg); + } + } + +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/AutoPilotMode.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/AutoPilotMode.java new file mode 100644 index 0000000000..6eff67cbed --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/AutoPilotMode.java @@ -0,0 +1,59 @@ +package com.zhidao.adas.client.bean; + +import android.text.TextUtils; + +import java.util.ArrayList; +import java.util.List; + +import mogo.telematics.pad.MessagePad; + +public class AutoPilotMode { + public String name; + public String startName; + public Location startLatLon; + public String endName; + public Location endLatLon; + public double speedLimit; + public List wayLatLons; + + public List getWayLatLons() { + if (wayLatLons == null || wayLatLons.isEmpty()) return null; + List list = new ArrayList<>(); + for (int i = 0; i < wayLatLons.size(); i++) { + MessagePad.Location.Builder builder = MessagePad.Location.newBuilder(); + builder.setLatitude(wayLatLons.get(i).latitude).setLongitude(wayLatLons.get(i).longitude); + list.add(builder.build()); + } + return list; + } + + public static class Location { + public String name; + public double longitude; + public double latitude; + + public Location() { + } + + public Location(String name) { + this.name = name; + } + + public boolean isNull() { + return longitude == 0.0 || latitude == 0.0; + } + } + + public boolean isNull() { + if (wayLatLons != null && !wayLatLons.isEmpty()) { + for (int i = 0; i < wayLatLons.size(); i++) { + if (wayLatLons.get(i).isNull()) { + return true; + } + } + } + return TextUtils.isEmpty(name) || TextUtils.isEmpty(startName) || TextUtils.isEmpty(endName) || + startLatLon == null || startLatLon.isNull() || endLatLon == null || endLatLon.isNull() || + speedLimit == 0.0; + } +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/UpdateDataEvent.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/UpdateDataEvent.java new file mode 100644 index 0000000000..9bc49dac5f --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/UpdateDataEvent.java @@ -0,0 +1,4 @@ +package com.zhidao.adas.client.bean; + +public class UpdateDataEvent { +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/AutoPilotModeDialog.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/AutoPilotModeDialog.java new file mode 100644 index 0000000000..bdd5149aa4 --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/AutoPilotModeDialog.java @@ -0,0 +1,141 @@ +package com.zhidao.adas.client.ui; + +import android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.os.Bundle; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.SimpleItemAnimator; + +import com.zhidao.adas.client.R; +import com.zhidao.adas.client.adapter.LineAdapter; +import com.zhidao.adas.client.base.BaseAdapter; +import com.zhidao.adas.client.bean.UpdateDataEvent; +import com.zhidao.adas.client.bean.AutoPilotMode; +import com.zhidao.adas.client.utils.Constants; +import com.zhidao.support.adas.high.AdasManager; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.util.List; + +import mogo.telematics.pad.MessagePad; + + +public class AutoPilotModeDialog extends Dialog { + private RecyclerView recyclerView; + private LineAdapter adapter; + private List list; + + public AutoPilotModeDialog(@NonNull Context context) { + super(context, R.style.CustomDialog); + + } + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_autopilot_mode); + //初始化界面控件 + initView(); + list = Constants.getPaths(getContext()); + initBtnRecyclerView(); + //初始化界面控件的事件 + initListener(); + setOnDismissListener(new OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + EventBus.getDefault().unregister(AutoPilotModeDialog.this); + } + }); + + } + + @Override + public void show() { + super.show(); + EventBus.getDefault().register(AutoPilotModeDialog.this); + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onUpdateDataEvent(UpdateDataEvent event) { + list = Constants.getPaths(getContext()); + if (adapter != null) { + adapter.setData(list); + } + } + + private void initBtnRecyclerView() { + //初始info-recycle + LinearLayoutManager nodLinearLayoutManage = new LinearLayoutManager(getContext()); + nodLinearLayoutManage.setOrientation(LinearLayoutManager.VERTICAL); + recyclerView.setLayoutManager(nodLinearLayoutManage); + //如果可以确定每个item的高度是固定的,设置这个选项可以提高性能 + recyclerView.setHasFixedSize(true); + //解决局部刷新闪屏问题 + SimpleItemAnimator animatorInfo = (SimpleItemAnimator) recyclerView.getItemAnimator(); + if (animatorInfo != null) + animatorInfo.setSupportsChangeAnimations(false); + //创建并设置Adapter + adapter = new LineAdapter(list); + recyclerView.setAdapter(adapter); + adapter.setOnItemClickListener(new BaseAdapter.OnItemClickListener() { + @Override + public void onItemClick(int position, AutoPilotMode data) { + MessagePad.Location startLocation = MessagePad.Location.newBuilder() + .setLatitude(data.startLatLon.latitude) + .setLongitude(data.startLatLon.longitude) + .build(); + MessagePad.Location endLocation = MessagePad.Location.newBuilder() + .setLatitude(data.endLatLon.latitude) + .setLongitude(data.endLatLon.longitude) + .build(); + MessagePad.RouteInfo.Builder builder = MessagePad.RouteInfo.newBuilder(); + builder.setStartLocation(startLocation); + builder.setStartName(data.startName); + builder.setEndLocation(endLocation); + builder.setEndName(data.endName); + List list = data.getWayLatLons(); + if (list != null) + builder.addAllWayPoints(list); + builder.setSpeedLimit(data.speedLimit); + builder.setVehicleType(9); + builder.setIsSpeakVoice(true); + AdasManager.getInstance().sendAutoPilotModeReq(1, 0, builder.build()); + AutoPilotModeDialog.this.dismiss(); + } + }); + } + + /** + * 初始化界面的确定和取消监听器 + */ + private void initListener() { + findViewById(R.id.settings).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + getContext().startActivity(new Intent(getContext(), AutopilotConfigActivity.class)); + } + }); + } + + + /** + * 初始化界面控件 + */ + private void initView() { + recyclerView = findViewById(R.id.recyclerView); + + + } + + +} \ No newline at end of file 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 new file mode 100644 index 0000000000..8ef6124f3c --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/AutopilotConfigActivity.java @@ -0,0 +1,312 @@ +package com.zhidao.adas.client.ui; + +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.os.Bundle; +import android.os.Message; +import android.view.KeyEvent; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.appcompat.widget.Toolbar; +import androidx.recyclerview.widget.DividerItemDecoration; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.zhidao.adas.client.R; +import com.zhidao.adas.client.adapter.AutopilotConfigAdapter; +import com.zhidao.adas.client.base.BaseActivity; +import com.zhidao.adas.client.bean.UpdateDataEvent; +import com.zhidao.adas.client.bean.AutoPilotMode; +import com.zhidao.adas.client.bean.GnssInfo; +import com.zhidao.adas.client.utils.Constants; +import com.zhidao.support.adas.high.common.ThreadPoolManager; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.util.List; + + +public class AutopilotConfigActivity extends BaseActivity { + private static final String TAG = "CreateActivity"; + private TextView toolbar_title; + private RecyclerView recyclerView; + private AutopilotConfigAdapter autopilotConfigAdapter; + private GridLayoutManager linearLayoutManager; + + private static final int WHAT_START = 0; + TextView no_date; + private TextView lonText; + private TextView latText; + private double lon = -1; + private double lat = -1; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_autopilot_cloud_config); + Toolbar toolbar = findViewById(R.id.toolbar); + recyclerView = findViewById(R.id.recyclerView); + no_date = findViewById(R.id.no_date); + setSupportActionBar(toolbar); + getSupportActionBar().setTitle(""); + toolbar_title = findViewById(R.id.toolbar_title); + toolbar_title.setText("创建线路"); + getSupportActionBar().setDisplayHomeAsUpEnabled(true);//左侧添加一个默认的返回图标 + getSupportActionBar().setHomeButtonEnabled(true); //设置返回键可用 + initHandler(); + EventBus.getDefault().register(this); + initRecyclerView(); + toolbar_title.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + Toast.makeText(AutopilotConfigActivity.this, "恭喜解锁隐藏技能", Toast.LENGTH_LONG).show(); + return true; + } + }); + + } + + @Override + protected void onResume() { + super.onResume(); + init(); + } + + private void init() { + if (autopilotConfigAdapter.getItemCount() == 0) { + recyclerView.setVisibility(View.GONE); + no_date.setVisibility(View.VISIBLE); + } else { + no_date.setVisibility(View.GONE); + recyclerView.setVisibility(View.VISIBLE); + } + + } + + private void initRecyclerView() { + linearLayoutManager = new GridLayoutManager(this, 2); + linearLayoutManager.setOrientation(GridLayoutManager.VERTICAL); + recyclerView.setLayoutManager(linearLayoutManager); + //添加Android自带的分割线 + recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL)); + recyclerView.addItemDecoration(new HorizontalDividerItemDecoration(this)); + autopilotConfigAdapter = new AutopilotConfigAdapter(Constants.getPaths(this)); + recyclerView.setAdapter(autopilotConfigAdapter); + autopilotConfigAdapter.setOnItemClickListener(new AutopilotConfigAdapter.OnHaveDataListener() { + @Override + public void onHaveData(boolean isHave) { + if (isHave) { + no_date.setVisibility(View.GONE); + recyclerView.setVisibility(View.VISIBLE); + } else { + recyclerView.setVisibility(View.GONE); + no_date.setVisibility(View.VISIBLE); + + } + } + }); + } + + + public void onSave() { + List list = autopilotConfigAdapter.getDatas(); + if (list == null || list.isEmpty()) { + Toast.makeText(AutopilotConfigActivity.this, "未找到可用数据,无法保存", Toast.LENGTH_SHORT).show(); + return; + } + Toast.makeText(AutopilotConfigActivity.this, "正在保存...", Toast.LENGTH_SHORT).show(); + Runnable runnable = new Runnable() { + @Override + public void run() { + boolean isNull = false; + for (int i = 0; i < list.size(); i++) { + if (list.get(i).isNull()) { + isNull = true; + break; + } + } + if (!isNull) { + Constants.setPath(AutopilotConfigActivity.this, list); + } + Message msg = Message.obtain(); + msg.what = WHAT_START; + msg.obj = !isNull; + + getHandler().sendMessage(msg); + } + }; + ThreadPoolManager.getsInstance().execute(runnable); + } + + + @Override + protected void onDestroy() { + super.onDestroy(); + EventBus.getDefault().post(new UpdateDataEvent()); + if (getHandler() != null) + getHandler().removeCallbacksAndMessages(null); + EventBus.getDefault().unregister(this); + } + + @Override + protected void handleMessage(Message msg) { + super.handleMessage(msg); + AlertDialog.Builder builder = new AlertDialog.Builder(this); + switch (msg.what) { + case WHAT_START: + if ((Boolean) msg.obj) { + builder.setTitle("保存成功") + .setMessage("配置保存成功啦") + .setNegativeButton("退出", + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + finish(); + } + }) + .setPositiveButton("确定", + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + } + }); + } else { + builder.setTitle("保存失败") + .setMessage("请输入必填项\n所有输入框均必填\uD83E\uDD2A") + .setPositiveButton("确认", + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + } + }); + } + break; + + } + AlertDialog dialog = builder.show(); +// dialog.setCancelable(false); +// dialog.setCanceledOnTouchOutside(false); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu; this adds items to the action bar if it is present. + getMenuInflater().inflate(R.menu.menu_create, menu); + MenuItem itemDel = menu.findItem(R.id.action_del_item); + CheckBox del = itemDel.getActionView().findViewById(R.id.action_del); + del.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (autopilotConfigAdapter != null) { + autopilotConfigAdapter.setShowDel(isChecked); + } + } + }); + + MenuItem itemLocation = menu.findItem(R.id.action_location_item); + Button btn_lon = itemLocation.getActionView().findViewById(R.id.btn_lon); + Button btn_lat = itemLocation.getActionView().findViewById(R.id.btn_lat); + lonText = itemLocation.getActionView().findViewById(R.id.lon); + latText = itemLocation.getActionView().findViewById(R.id.lat); + btn_lon.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (lon != -1) { + findEditText(lon); + } + } + }); + btn_lat.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (lat != -1) { + findEditText(lat); + } + } + }); + return true; + } + + private void findEditText(double value) { + View view = getWindow().getDecorView().findFocus(); + if (view instanceof EditText) { + EditText editText = ((EditText) view); + String content = String.valueOf(value); + editText.setText(content); + editText.setSelection(content.length()); + } + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onLocationEvent(GnssInfo info) { + if (info != null && info.bean != null) { + lon = info.bean.getLongitude(); + lat = info.bean.getLatitude(); + if (lonText != null) + lonText.setText("Lon:" + lon); + if (latText != null) + latText.setText("Lat:" + lat); + } + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // Handle action bar item clicks here. The action bar will + // automatically handle clicks on the Home/Up button, so long + // as you specify a parent activity in AndroidManifest.xml. + int id = item.getItemId(); + switch (id) { + case R.id.action_settings_item: + autopilotConfigAdapter.add(); +// linearLayoutManager.scrollToPositionWithOffset(dbAdapter.getItemCount() - 1, 0); + recyclerView.scrollToPosition(autopilotConfigAdapter.getItemCount() - 1); + return true; + case R.id.action_save_item: + onSave(); + return true; + case android.R.id.home: + onBack(); + return true; + default: + return super.onOptionsItemSelected(item); + } + } + + 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(); + } + + //返回键处理 + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK) { + onBack(); + return true; + } else { + return super.onKeyDown(keyCode, event); + } + } +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/HorizontalDividerItemDecoration.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/HorizontalDividerItemDecoration.java new file mode 100644 index 0000000000..932b4484e9 --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/HorizontalDividerItemDecoration.java @@ -0,0 +1,140 @@ +/* + * Copyright 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package com.zhidao.adas.client.ui; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.util.Log; +import android.view.View; +import android.widget.LinearLayout; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +/** + * DividerItemDecoration is a {@link RecyclerView.ItemDecoration} that can be used as a divider + * between items of a {@link LinearLayoutManager}. It supports both {@link #HORIZONTAL} and + * {@link #VERTICAL} orientations. + * + *
+ *     mDividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(),
+ *             mLayoutManager.getOrientation());
+ *     recyclerView.addItemDecoration(mDividerItemDecoration);
+ * 
+ */ +public class HorizontalDividerItemDecoration extends RecyclerView.ItemDecoration { + public static final int HORIZONTAL = LinearLayout.HORIZONTAL; + public static final int VERTICAL = LinearLayout.VERTICAL; + + private static final String TAG = "DividerItem"; + private static final int[] ATTRS = new int[]{android.R.attr.listDivider}; + + private Drawable mDivider; + + + private final Rect mBounds = new Rect(); + + /** + * Creates a divider {@link RecyclerView.ItemDecoration} that can be used with a + * {@link LinearLayoutManager}. + * + * @param context Current context, it will be used to access resources. + */ + public HorizontalDividerItemDecoration(Context context) { + final TypedArray a = context.obtainStyledAttributes(ATTRS); + mDivider = a.getDrawable(0); + if (mDivider == null) { + Log.w(TAG, "@android:attr/listDivider was not set in the theme used for this " + + "DividerItemDecoration. Please set that attribute all call setDrawable()"); + } + a.recycle(); + } + + + /** + * Sets the {@link Drawable} for this divider. + * + * @param drawable Drawable that should be used as a divider. + */ + public void setDrawable(@NonNull Drawable drawable) { + if (drawable == null) { + throw new IllegalArgumentException("Drawable cannot be null."); + } + mDivider = drawable; + } + + /** + * @return the {@link Drawable} for this divider. + */ + @Nullable + public Drawable getDrawable() { + return mDivider; + } + + @Override + public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { + if (parent.getLayoutManager() == null || mDivider == null) { + return; + } + drawHorizontal(c, parent); + } + + + private void drawHorizontal(Canvas canvas, RecyclerView parent) { + canvas.save(); + final int top; + final int bottom; + //noinspection AndroidLintNewApi - NewApi lint fails to handle overrides. + if (parent.getClipToPadding()) { + top = parent.getPaddingTop(); + bottom = parent.getHeight() - parent.getPaddingBottom(); + canvas.clipRect(parent.getPaddingLeft(), top, + parent.getWidth() - parent.getPaddingRight(), bottom); + } else { + top = 0; + bottom = parent.getHeight(); + } + + final int childCount = parent.getChildCount(); + for (int i = 0; i < childCount; ) { + final View child = parent.getChildAt(i); + parent.getLayoutManager().getDecoratedBoundsWithMargins(child, mBounds); + final int right = mBounds.right + Math.round(child.getTranslationX()); + final int left = right - mDivider.getIntrinsicWidth(); + mDivider.setBounds(left, top, right, bottom); + mDivider.draw(canvas); + i += 2; + } + canvas.restore(); + } + + @Override + public void getItemOffsets(Rect outRect, View view, RecyclerView parent, + RecyclerView.State state) { + if (mDivider == null) { + outRect.set(0, 0, 0, 0); + return; + } + outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0); + } +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/InfoFragment.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/InfoFragment.java similarity index 99% rename from app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/InfoFragment.java rename to app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/InfoFragment.java index 28898aa44d..77e290075d 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/InfoFragment.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/InfoFragment.java @@ -1,4 +1,4 @@ -package com.zhidao.adas.client.ui.mian; +package com.zhidao.adas.client.ui; import android.content.Context; import android.os.Bundle; @@ -14,6 +14,7 @@ import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.RecyclerView; import com.zhidao.adas.client.R; +import com.zhidao.adas.client.adapter.DataShowAdapter; import com.zhidao.adas.client.bean.ArrivalNotification; import com.zhidao.adas.client.bean.AutopilotState; import com.zhidao.adas.client.bean.ErrorData; @@ -27,7 +28,6 @@ import com.zhidao.adas.client.bean.VehicleState; import com.zhidao.adas.client.bean.Warn; import com.zhidao.adas.client.utils.MyLinearLayoutManager; import com.zhidao.support.adas.high.common.CupidLogUtils; -import com.zhidao.support.adas.high.msg.ReportMessage; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/MainActivity.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java similarity index 88% rename from app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/MainActivity.java rename to app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java index 8bea944df4..c84ef04749 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/MainActivity.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java @@ -1,8 +1,10 @@ -package com.zhidao.adas.client.ui.mian; +package com.zhidao.adas.client.ui; import static com.mogo.telematic.MogoProtocolMsg.NORMAL_DATA; import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; import android.content.res.Configuration; import android.os.Bundle; import android.text.Editable; @@ -20,6 +22,7 @@ import android.widget.Switch; import android.widget.TextView; import android.widget.Toast; +import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.AppCompatButton; import androidx.fragment.app.FragmentManager; @@ -37,8 +40,11 @@ import com.mogo.telematic.client.status.ConnectState; import com.mogo.telematic.server.netty.NettyServerListener; import com.zhidao.adas.client.BuildConfig; import com.zhidao.adas.client.R; +import com.zhidao.adas.client.adapter.InfoTitleAdapter; +import com.zhidao.adas.client.base.BaseActivity; import com.zhidao.adas.client.base.BaseAdapter; import com.zhidao.adas.client.bean.ArrivalNotification; +import com.zhidao.adas.client.bean.AutoPilotMode; import com.zhidao.adas.client.bean.AutopilotState; import com.zhidao.adas.client.bean.BasicInfoReq; import com.zhidao.adas.client.bean.CarConfigResp; @@ -66,19 +72,14 @@ import com.zhidao.support.adas.high.common.ProtocolStatus; import com.zhidao.support.recorder.RecordDataManager; import org.greenrobot.eventbus.EventBus; -import org.json.JSONException; -import org.json.JSONObject; import java.net.Inet4Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.ArrayList; -import java.util.Arrays; import java.util.Enumeration; import java.util.List; -import java.util.Timer; -import java.util.TimerTask; import java.util.concurrent.ScheduledExecutorService; import chassis.VehicleStateOuterClass; @@ -87,7 +88,7 @@ import mogo.telematics.pad.MessagePad; import mogo_msg.MogoReportMsg; import record_cache.RecordPanelOuterClass; -public class MainActivity extends AppCompatActivity implements OnAdasListener, OnAdasConnectStatusListener, BaseAdapter.OnItemClickListener { +public class MainActivity extends BaseActivity implements OnAdasListener, OnAdasConnectStatusListener, BaseAdapter.OnItemClickListener { private final static String TAG = MainActivity.class.getSimpleName(); private EditText etIp; private TextView role; @@ -106,7 +107,6 @@ public class MainActivity extends AppCompatActivity implements OnAdasListener, O private RecyclerView infoFragment; private TextView tvConnectState; private ScheduledExecutorService mExecutorServiceConfigTimer; - private Gson gson; private final List titleFragmentData = new ArrayList<>(); @@ -135,7 +135,7 @@ public class MainActivity extends AppCompatActivity implements OnAdasListener, O private long recordKey; private String recordFileName; private int connectStatus; - + private AutoPilotModeDialog autoPilotModeDialog; public interface TITLE { String RECEIVE_TRAJECTORY = "车前引导线"; @@ -175,7 +175,7 @@ public class MainActivity extends AppCompatActivity implements OnAdasListener, O getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); initView(); firstFragment(); - gson = new Gson(); + initAdas(); connectStatus = AdasManager.getInstance().getIpcConnectionStatus(); onUpdateConnectStateView(); @@ -341,15 +341,15 @@ public class MainActivity extends AppCompatActivity implements OnAdasListener, O titleFragmentData.add(TITLE.RECEIVE_ERROR); - titleBtnData.add("下发站点1"); - titleBtnData.add("下发站点2"); + titleBtnData.add("启动自动驾驶"); titleBtnData.add("自动驾驶路径查询"); titleBtnData.add("下发SN"); titleBtnData.add("数据采集5秒"); titleBtnData.add("数据采集start"); titleBtnData.add("数据采集end"); + titleBtnData.add("录音测试"); titleBtnData.add("发送信号灯"); - titleBtnData.add("速度设置"); + titleBtnData.add("自动驾驶限速"); titleBtnData.add("重启Docker"); titleBtnData.add("重启IPC"); titleBtnData.add("关机"); @@ -871,82 +871,51 @@ public class MainActivity extends AppCompatActivity implements OnAdasListener, O @Override public void onItemClick(int position, String data) { CupidLogUtils.w(TAG, "TitleAdapter===>name:" + data); - if (connectStatus == com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS.DISCONNECTED) { - toastMsg("IPC 未连接"); - return; - } - switch (data) { - case "下发站点1": - MessagePad.Location startLocation = MessagePad.Location.newBuilder() - .setLatitude(26.820319143036112) - .setLongitude(112.57770688564666) - .build(); - MessagePad.Location endLocation = MessagePad.Location.newBuilder() - .setLatitude(26.82355278566775) - .setLongitude(112.57001723522112) - .build(); - MessagePad.RouteInfo info = MessagePad.RouteInfo.newBuilder() - .setStartLocation(startLocation) - .setStartName("KXCNMZ") - .setEndLocation(endLocation) - .setEndName("SDYJKXCXMBZ") -// .addAllWayPoints(null) - .setSpeedLimit(0.0) - .setVehicleType(9) - .setIsSpeakVoice(true) - .build(); - AdasManager.getInstance().sendAutoPilotModeReq(1, 0, info); - //"{\"action\":\"aiCloudToStartAutopilot\",\"result\":{\"endLatLon\":{\"lat\":26.82355278566775,\"lon\":112.57001723522112},\"endName\":\"SDYJKXCXMBZ\",\"isSpeakVoice\":true,\"speedLimit\":0.0,\"startLatLon\":{\"lat\":26.820319143036112,\"lon\":112.57770688564666},\"startName\":\"KXCNMZ\",\"vehicleType\":9,\"wayLatLons\":null}}" -// " {\"action\":\"aiCloudToStartAutopilot\",\"result\":{\"endLatLon\":{\"lat\":26.819811964643154,\"lon\":112.57732459897345},\"endName\":\"KXCNMDM\",\"isSpeakVoice\":true,\"speedLimit\":0.0,\"startLatLon\":{\"lat\":26.823347858814472,\"lon\":112.56994205894226},\"startName\":\"SDYJKXCXMBDM\",\"vehicleType\":9,\"wayLatLons\":null}}" +// if (connectStatus == com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS.DISCONNECTED) { +// toastMsg("IPC 未连接"); +// return; +// } + switch (position) { + case 0: + if (autoPilotModeDialog == null) { + autoPilotModeDialog = new AutoPilotModeDialog(this); + } + if (!autoPilotModeDialog.isShowing()) { + autoPilotModeDialog.show(); + } + break; - case "下发站点2": - MessagePad.Location startLocation2 = MessagePad.Location.newBuilder() - .setLatitude(26.823347858814472) - .setLongitude(112.56994205894226) - .build(); - MessagePad.Location endLocation2 = MessagePad.Location.newBuilder() - .setLatitude(26.819811964643154) - .setLongitude(112.57732459897345) - .build(); - MessagePad.RouteInfo info2 = MessagePad.RouteInfo.newBuilder() - .setStartLocation(startLocation2) - .setStartName("SDYJKXCXMBDM") - .setEndLocation(endLocation2) - .setEndName("KXCNMDM") -// .addAllWayPoints(null) - .setSpeedLimit(0.0) - .setVehicleType(9) - .setIsSpeakVoice(true) - .build(); - AdasManager.getInstance().sendAutoPilotModeReq(1, 0, info2); -// "{\"action\":\"aiCloudToStartAutopilot\",\"result\":{\"endLatLon\":{\"lat\":26.82355278566775,\"lon\":112.57001723522112},\"endName\":\"SDYJKXCXMBZ\",\"isSpeakVoice\":true,\"speedLimit\":0.0,\"startLatLon\":{\"lat\":26.820319143036112,\"lon\":112.57770688564666},\"startName\":\"KXCNMZ\",\"vehicleType\":9,\"wayLatLons\":null}}" - //" {\"action\":\"aiCloudToStartAutopilot\",\"result\":{\"endLatLon\":{\"lat\":26.819811964643154,\"lon\":112.57732459897345},\"endName\":\"KXCNMDM\",\"isSpeakVoice\":true,\"speedLimit\":0.0,\"startLatLon\":{\"lat\":26.823347858814472,\"lon\":112.56994205894226},\"startName\":\"SDYJKXCXMBDM\",\"vehicleType\":9,\"wayLatLons\":null}}" - break; - case "自动驾驶路径查询": + case 1: + //自动驾驶路径查询 AdasManager.getInstance().sendGlobalPathReq(); break; - case "下发SN": + case 2: //发送sn AdasManager.getInstance().sendBasicInfoResp("X202021111192N41VY", 1); break; - case "数据采集5秒": + case 3: + //数据采集5秒 boolean b = AdasManager.getInstance().startRecordPackage(1, 5, 1); CupidLogUtils.w(TAG, "AutopilotRecord===>send:" + b); break; - case "数据采集start": + case 4: + //数据采集start boolean bStart = AdasManager.getInstance().startRecordPackage(1, 1); CupidLogUtils.w(TAG, "AutopilotRecord===>send:" + bStart); break; - case "数据采集end": + case 5: + //数据采集end boolean bEnd = AdasManager.getInstance().stopRecordPackage(1, 1); CupidLogUtils.w(TAG, "AutopilotRecord===>send:" + bEnd); break; - case "录音测试": + case 6: + //录音测试 CupidLogUtils.w(TAG, "录音测试"); RecordDataManager.getInstance().init(MainActivity.this, "1234567", "", 22, "", ""); RecordDataManager.getInstance().record(); break; - case "发送信号灯": + case 7: + //发送信号灯 MessagePad.TrafficLightStatus left = MessagePad.TrafficLightStatus.newBuilder() .setPhaseNo("1") .setColor("R") @@ -969,25 +938,55 @@ public class MainActivity extends AppCompatActivity implements OnAdasListener, O .build(); AdasManager.getInstance().sendTrafficLightData("10038", 26.848153, 112.574883, "180.0", "SN", 100413, -4, 201, 0, detail); break; - case "速度设置": - AdasManager.getInstance().sendAutopilotSpeedReq(28); + case 8: + //速度设置 + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle("自动驾驶限速"); + View view = getLayoutInflater().inflate(R.layout.dialog_speed, null); + final EditText et = (EditText) view.findViewById(R.id.et); + builder.setView(view);// + builder.setCancelable(false);// + builder.setPositiveButton("设置", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + Editable editable = et.getText(); + if (TextUtils.isEmpty(editable)) { + // 条件不成立不能关闭 AlertDialog 窗口 + Toast.makeText(MainActivity.this, "请输入速度", Toast.LENGTH_SHORT).show(); + return; + } + String temp = et.getText().toString().trim(); + double speed = Double.parseDouble(temp) / 3.6; + AdasManager.getInstance().sendAutopilotSpeedReq(speed); + } + }); + //设置反面按钮,并做事件处理 + builder.setNegativeButton("取消", null); + builder.show();//显示Dialog对话框 + break; - case "重启Docker": + case 9: + //重启Docker AdasManager.getInstance().rebootAPDocker(); break; - case "重启IPC": + case 10: + //重启IPC AdasManager.getInstance().rebootIPC(); break; - case "关机": + case 11: + //关机 AdasManager.getInstance().shutdownIPC(); break; - case "采集类型": + case 12: + //采集类型 AdasManager.getInstance().sendRecordCause(recordKey, recordFileName, "1", "变道有干扰"); break; - case "打开演示模式": + case 13: + //打开演示模式 AdasManager.getInstance().sendDemoModeReq(1); break; - case "关闭演示模式": + case 14: + //关闭演示模式 AdasManager.getInstance().sendDemoModeReq(0); break; } diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/UpgradeFragment.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/UpgradeFragment.java similarity index 98% rename from app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/UpgradeFragment.java rename to app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/UpgradeFragment.java index c3194b65e4..f2d0de4970 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/UpgradeFragment.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/UpgradeFragment.java @@ -1,4 +1,4 @@ -package com.zhidao.adas.client.ui.mian; +package com.zhidao.adas.client.ui; import android.content.Context; import android.graphics.Color; diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/VersionFragment.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/VersionFragment.java similarity index 98% rename from app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/VersionFragment.java rename to app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/VersionFragment.java index 66df8cc7cf..3c5e27e49f 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/VersionFragment.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/VersionFragment.java @@ -1,4 +1,4 @@ -package com.zhidao.adas.client.ui.mian; +package com.zhidao.adas.client.ui; import android.content.Context; import android.os.Bundle; @@ -21,6 +21,7 @@ import androidx.recyclerview.widget.SimpleItemAnimator; import com.zhidao.adas.client.BuildConfig; import com.zhidao.adas.client.R; +import com.zhidao.adas.client.adapter.ConfigAdapter; import com.zhidao.adas.client.bean.CarConfigResp; import com.zhidao.adas.client.bean.Config; import com.zhidao.support.adas.high.AdasManager; diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/autopilot/AiCloudToStartAutopilot.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/autopilot/AiCloudToStartAutopilot.java deleted file mode 100644 index e9d598dbd7..0000000000 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/autopilot/AiCloudToStartAutopilot.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.zhidao.adas.client.ui.autopilot; - -import java.util.List; - -public class AiCloudToStartAutopilot { - - private String action = "aiCloudToStartAutopilot"; - public ResultDTO result; - - public static class ResultDTO { - public EndLatLonDTO endLatLon; - public Integer speedLimit = 20; - public StartLatLonDTO startLatLon; - public List wayLatLons; - - public static class EndLatLonDTO { - public Double lat; - public Double lon; - } - - public static class StartLatLonDTO { - public Double lat; - public Double lon; - } - - public static class WayLatLonsDTO { - public Double lat; - public Double lon; - } - } -} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/autopilot/AutopilotConfigActivity.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/autopilot/AutopilotConfigActivity.java deleted file mode 100644 index 351dbe15c9..0000000000 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/autopilot/AutopilotConfigActivity.java +++ /dev/null @@ -1,305 +0,0 @@ -package com.zhidao.adas.client.ui.autopilot; - -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.text.TextUtils; -import android.util.Log; -import android.view.View; -import android.widget.Button; -import android.widget.CompoundButton; -import android.widget.EditText; -import android.widget.Switch; -import android.widget.Toast; - -import androidx.appcompat.app.AppCompatActivity; - -import com.google.gson.Gson; - -import com.google.gson.reflect.TypeToken; -import com.zhidao.support.adas.high.AdasManager; -import com.zhidao.adas.client.R; -import com.zhidao.adas.client.utils.Constants; -import com.zhidao.adas.client.utils.PreferencesUtils; - -import java.util.List; - - -public class AutopilotConfigActivity extends AppCompatActivity { - - public static void launch(Context context) { - Intent intent = new Intent(context,AutopilotConfigActivity.class); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - context.startActivity(intent); - } - - private Gson gson = new Gson(); - private EditText start_lon1; - private EditText start_lat1; - private EditText stop_lon1; - private EditText stop_lat1; - private EditText t_lon1; - private EditText t_lat1; - - private EditText start_lon2; - private EditText start_lat2; - private EditText stop_lon2; - private EditText stop_lat2; - private EditText t_lon2; - private EditText t_lat2; - - private EditText start_lon3; - private EditText start_lat3; - private EditText stop_lon3; - private EditText stop_lat3; - private EditText t_lon3; - private EditText t_lat3; - - private EditText start_lon4; - private EditText start_lat4; - private EditText stop_lon4; - private EditText stop_lat4; - private EditText t_lon4; - private EditText t_lat4; - private List list; - - AiCloudToStartAutopilot data1; - AiCloudToStartAutopilot data2; - AiCloudToStartAutopilot data3; - AiCloudToStartAutopilot data4; - private String init_all_path = "[\n" + - " {\n" + - " \"action\": \"aiCloudToStartAutopilot\",\n" + - " \"result\": {\n" + - " \"endLatLon\": {\n" + - " \"lat\": 26.82355278566775,\n" + - " \"lon\": 112.57001723522112\n" + - " },\n" + - " \"speedLimit\": 20,\n" + - " \"startLatLon\": {\n" + - " \"lat\": 26.820319143036112,\n" + - " \"lon\": 112.57770688564666\n" + - " },\n" + - " \"wayLatLons\": [{\n" + - " \"lat\": 40.1984044,\n" + - " \"lon\": 116.7323222\n" + - " }]\n" + - " }\n" + - " },\n" + - " {\n" + - " \"action\": \"aiCloudToStartAutopilot\",\n" + - " \"result\": {\n" + - " \"endLatLon\": {\n" + - " \"lat\": 40.1979005,\n" + - " \"lon\": 116.7261382\n" + - " },\n" + - " \"speedLimit\": 20,\n" + - " \"startLatLon\": {\n" + - " \"lat\": 40.1992337,\n" + - " \"lon\": 116.7386131\n" + - " },\n" + - " \"wayLatLons\": [{\n" + - " \"lat\": 40.1984044,\n" + - " \"lon\": 116.7323222\n" + - " }]\n" + - " }\n" + - " },\n" + - " {\n" + - " \"action\": \"aiCloudToStartAutopilot\",\n" + - " \"result\": {\n" + - " \"endLatLon\": {\n" + - " \"lat\": 40.1979005,\n" + - " \"lon\": 116.7261382\n" + - " },\n" + - " \"speedLimit\": 20,\n" + - " \"startLatLon\": {\n" + - " \"lat\": 40.1992337,\n" + - " \"lon\": 116.7386131\n" + - " },\n" + - " \"wayLatLons\": [{\n" + - " \"lat\": 40.1984044,\n" + - " \"lon\": 116.7323222\n" + - " }]\n" + - " }\n" + - " },\n" + - " {\n" + - " \"action\": \"aiCloudToStartAutopilot\",\n" + - " \"result\": {\n" + - " \"endLatLon\": {\n" + - " \"lat\": 40.1979005,\n" + - " \"lon\": 116.7261382\n" + - " },\n" + - " \"speedLimit\": 20,\n" + - " \"startLatLon\": {\n" + - " \"lat\": 40.1992337,\n" + - " \"lon\": 116.7386131\n" + - " },\n" + - " \"wayLatLons\": [{\n" + - " \"lat\": 40.1984044,\n" + - " \"lon\": 116.7323222\n" + - " }]\n" + - " }\n" + - " }\n" + - "]"; - - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_autopilot_cloud_config); - start_lon1 = findViewById(R.id.start_lon1); - start_lat1 = findViewById(R.id.start_lat1); - stop_lon1 = findViewById(R.id.stop_lon1); - stop_lat1 = findViewById(R.id.stop_lat1); - t_lon1 = findViewById(R.id.t_lon1); - t_lat1 = findViewById(R.id.t_lat1); - - start_lon2 = findViewById(R.id.start_lon2); - start_lat2 = findViewById(R.id.start_lat2); - stop_lon2 = findViewById(R.id.stop_lon2); - stop_lat2 = findViewById(R.id.stop_lat2); - t_lon2 = findViewById(R.id.t_lon2); - t_lat2 = findViewById(R.id.t_lat2); - - start_lon3 = findViewById(R.id.start_lon3); - start_lat3 = findViewById(R.id.start_lat3); - stop_lon3 = findViewById(R.id.stop_lon3); - stop_lat3 = findViewById(R.id.stop_lat3); - t_lon3 = findViewById(R.id.t_lon3); - t_lat3 = findViewById(R.id.t_lat3); - - start_lon4 = findViewById(R.id.start_lon4); - start_lat4 = findViewById(R.id.start_lat4); - stop_lon4 = findViewById(R.id.stop_lon4); - stop_lat4 = findViewById(R.id.stop_lat4); - t_lon4 = findViewById(R.id.t_lon4); - t_lat4 = findViewById(R.id.t_lat4); - //开始执行 - final Button button = findViewById(R.id.start); - button.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - String json = PreferencesUtils.getString(AutopilotConfigActivity.this, Constants.SEL_PATH, null); - if (TextUtils.isEmpty(json)) { - Toast.makeText(AutopilotConfigActivity.this, "请先选择路线", Toast.LENGTH_SHORT).show(); - return; - } - json = json.split("##")[1]; - Log.i("开始执行自动驾驶", json); -// AdasManager.getInstance().aiCloudToAdasData(json); - } - }); - findViewById(R.id.save).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - data1.result.startLatLon.lon = Double.parseDouble(start_lon1.getText().toString().trim()); - data1.result.startLatLon.lat = Double.parseDouble(start_lat1.getText().toString().trim()); - data1.result.endLatLon.lon = Double.parseDouble(stop_lon1.getText().toString().trim()); - data1.result.endLatLon.lat = Double.parseDouble(stop_lat1.getText().toString().trim()); - data1.result.wayLatLons.get(0).lon = Double.parseDouble(t_lon1.getText().toString().trim()); - data1.result.wayLatLons.get(0).lat = Double.parseDouble(t_lat1.getText().toString().trim()); - - - data2.result.startLatLon.lon = Double.parseDouble(start_lon2.getText().toString().trim()); - data2.result.startLatLon.lat = Double.parseDouble(start_lat2.getText().toString().trim()); - data2.result.endLatLon.lon = Double.parseDouble(stop_lon2.getText().toString().trim()); - data2.result.endLatLon.lat = Double.parseDouble(stop_lat2.getText().toString().trim()); - data2.result.wayLatLons.get(0).lon = Double.parseDouble(t_lon2.getText().toString().trim()); - data2.result.wayLatLons.get(0).lat = Double.parseDouble(t_lat2.getText().toString().trim()); - - - data3.result.startLatLon.lon = Double.parseDouble(start_lon3.getText().toString().trim()); - data3.result.startLatLon.lat = Double.parseDouble(start_lat3.getText().toString().trim()); - data3.result.endLatLon.lon = Double.parseDouble(stop_lon3.getText().toString().trim()); - data3.result.endLatLon.lat = Double.parseDouble(stop_lat3.getText().toString().trim()); - data3.result.wayLatLons.get(0).lon = Double.parseDouble(t_lon3.getText().toString().trim()); - data3.result.wayLatLons.get(0).lat = Double.parseDouble(t_lat3.getText().toString().trim()); - - - data4.result.startLatLon.lon = Double.parseDouble(start_lon4.getText().toString().trim()); - data4.result.startLatLon.lat = Double.parseDouble(start_lat4.getText().toString().trim()); - data4.result.endLatLon.lon = Double.parseDouble(stop_lon4.getText().toString().trim()); - data4.result.endLatLon.lat = Double.parseDouble(stop_lat4.getText().toString().trim()); - data4.result.wayLatLons.get(0).lon = Double.parseDouble(t_lon4.getText().toString().trim()); - data4.result.wayLatLons.get(0).lat = Double.parseDouble(t_lat4.getText().toString().trim()); - - - PreferencesUtils.putString(AutopilotConfigActivity.this, Constants.ALL_PATH, gson.toJson(list)); - } - }); - View path1 = findViewById(R.id.path1); - View path2 = findViewById(R.id.path2); - View path3 = findViewById(R.id.path3); - View path4 = findViewById(R.id.path4); - path1.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Toast.makeText(AutopilotConfigActivity.this, "已设置路线1", Toast.LENGTH_SHORT).show(); - PreferencesUtils.putString(AutopilotConfigActivity.this, Constants.SEL_PATH, "1##" + gson.toJson(list.get(0))); - button.setText("开始执行自动驾驶(路线1)"); - } - }); - path2.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Toast.makeText(AutopilotConfigActivity.this, "已设置路线2", Toast.LENGTH_SHORT).show(); - PreferencesUtils.putString(AutopilotConfigActivity.this, Constants.SEL_PATH, "2##" + gson.toJson(list.get(1))); - button.setText("开始执行自动驾驶(路线2)"); - } - }); - path3.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Toast.makeText(AutopilotConfigActivity.this, "已设置路线3", Toast.LENGTH_SHORT).show(); - PreferencesUtils.putString(AutopilotConfigActivity.this, Constants.SEL_PATH, "3##" + gson.toJson(list.get(2))); - button.setText("开始执行自动驾驶(路线3)"); - } - }); - path4.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Toast.makeText(AutopilotConfigActivity.this, "已设置路线4", Toast.LENGTH_SHORT).show(); - PreferencesUtils.putString(AutopilotConfigActivity.this, Constants.SEL_PATH, "4##" + gson.toJson(list.get(3))); - button.setText("开始执行自动驾驶(路线4)"); - } - }); - - String allPath = PreferencesUtils.getString(AutopilotConfigActivity.this, Constants.ALL_PATH, init_all_path); - list = gson.fromJson(allPath, new TypeToken>() { - }.getType()); - data1 = list.get(0); - data2 = list.get(1); - data3 = list.get(2); - data4 = list.get(3); - start_lon1.setText(String.valueOf(data1.result.startLatLon.lon)); - start_lat1.setText(String.valueOf(data1.result.startLatLon.lat)); - stop_lon1.setText(String.valueOf(data1.result.endLatLon.lon)); - stop_lat1.setText(String.valueOf(data1.result.endLatLon.lat)); - t_lon1.setText(String.valueOf(data1.result.wayLatLons.get(0).lon)); - t_lat1.setText(String.valueOf(data1.result.wayLatLons.get(0).lat)); - - start_lon2.setText(String.valueOf(data2.result.startLatLon.lon)); - start_lat2.setText(String.valueOf(data2.result.startLatLon.lat)); - stop_lon2.setText(String.valueOf(data2.result.endLatLon.lon)); - stop_lat2.setText(String.valueOf(data2.result.endLatLon.lat)); - t_lon2.setText(String.valueOf(data2.result.wayLatLons.get(0).lon)); - t_lat2.setText(String.valueOf(data2.result.wayLatLons.get(0).lat)); - - start_lon3.setText(String.valueOf(data3.result.startLatLon.lon)); - start_lat3.setText(String.valueOf(data3.result.startLatLon.lat)); - stop_lon3.setText(String.valueOf(data3.result.endLatLon.lon)); - stop_lat3.setText(String.valueOf(data3.result.endLatLon.lat)); - t_lon3.setText(String.valueOf(data3.result.wayLatLons.get(0).lon)); - t_lat3.setText(String.valueOf(data3.result.wayLatLons.get(0).lat)); - - start_lon4.setText(String.valueOf(data4.result.startLatLon.lon)); - start_lat4.setText(String.valueOf(data4.result.startLatLon.lat)); - stop_lon4.setText(String.valueOf(data4.result.endLatLon.lon)); - stop_lat4.setText(String.valueOf(data4.result.endLatLon.lat)); - t_lon4.setText(String.valueOf(data4.result.wayLatLons.get(0).lon)); - t_lat4.setText(String.valueOf(data4.result.wayLatLons.get(0).lat)); - - - } - -} \ No newline at end of file diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/Constants.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/Constants.java index 7764de93a4..a76e17f67a 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/Constants.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/Constants.java @@ -2,14 +2,58 @@ package com.zhidao.adas.client.utils; import android.content.Context; +import com.google.gson.reflect.TypeToken; +import com.zhidao.adas.client.bean.AutoPilotMode; +import com.zhidao.support.adas.high.common.JsonUtil; + +import java.util.ArrayList; +import java.util.List; + /** * @author song kenan * @des * @date 2021/10/8 */ public class Constants { - public static final String ALL_PATH = "all_path";//所有路线 - public static final String SEL_PATH = "sel_path";//选择的路线 + private static final String ALL_PATH = "all_path";//所有路线 + private static final String DEFAULT_PATH = "[{\"endLatLon\":{\"latitude\":40.19774,\"longitude\":116.72704},\"endName\":\"汇源果汁\",\"name\":\"北京市顺义区北小营镇\",\"speedLimit\":20.0,\"startLatLon\":{\"latitude\":40.20047,\"longitude\":116.73512},\"startName\":\"13号路口西\"},{\"endLatLon\":{\"latitude\":40.19996,\"longitude\":116.73584},\"endName\":\"13号路口(主路)\",\"name\":\"北京市顺义区北小营镇\",\"speedLimit\":20.0,\"startLatLon\":{\"latitude\":40.19763,\"longitude\":116.72686},\"startName\":\"汇源果汁\"}]"; + + public static List getPaths(Context context) { + String json = PreferencesUtils.getString(context, ALL_PATH, DEFAULT_PATH); + List list = JsonUtil.fromJson(json, new TypeToken>() { + }.getType()); + return list; + } + + public static boolean setPath(Context context, List list) { + if (list != null) { + return PreferencesUtils.putString(context, ALL_PATH, JsonUtil.toJson(list)); + } + return false; + } + + public static boolean addPath(Context context, List list, AutoPilotMode mode) { + if (list == null) + list = new ArrayList<>(); + if (!list.contains(mode)) { + list.add(mode); + return PreferencesUtils.putString(context, ALL_PATH, JsonUtil.toJson(list)); + } + return false; + } + + public static boolean delPath(Context context, List list, AutoPilotMode mode) { + if (list == null) { + return PreferencesUtils.delete(context, ALL_PATH); + } else { + if (list.contains(mode)) { + list.remove(mode); + return PreferencesUtils.putString(context, ALL_PATH, JsonUtil.toJson(list)); + } + } + return false; + } + /***********************是否使用固定IP******************/ // 0:固定IP 1:指定 2:UDP diff --git a/app_ipc_monitoring/src/main/res/drawable/bg_dialog.xml b/app_ipc_monitoring/src/main/res/drawable/bg_dialog.xml new file mode 100644 index 0000000000..470ebb3806 --- /dev/null +++ b/app_ipc_monitoring/src/main/res/drawable/bg_dialog.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/app_ipc_monitoring/src/main/res/drawable/ic_add_false.xml b/app_ipc_monitoring/src/main/res/drawable/ic_add_false.xml new file mode 100644 index 0000000000..76e20442b6 --- /dev/null +++ b/app_ipc_monitoring/src/main/res/drawable/ic_add_false.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app_ipc_monitoring/src/main/res/drawable/ic_add_true.xml b/app_ipc_monitoring/src/main/res/drawable/ic_add_true.xml new file mode 100644 index 0000000000..1b622a26f5 --- /dev/null +++ b/app_ipc_monitoring/src/main/res/drawable/ic_add_true.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app_ipc_monitoring/src/main/res/drawable/ic_minus_false.xml b/app_ipc_monitoring/src/main/res/drawable/ic_minus_false.xml new file mode 100644 index 0000000000..d32a9ba9f7 --- /dev/null +++ b/app_ipc_monitoring/src/main/res/drawable/ic_minus_false.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app_ipc_monitoring/src/main/res/drawable/ic_minus_true.xml b/app_ipc_monitoring/src/main/res/drawable/ic_minus_true.xml new file mode 100644 index 0000000000..5e3bf24a2c --- /dev/null +++ b/app_ipc_monitoring/src/main/res/drawable/ic_minus_true.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app_ipc_monitoring/src/main/res/drawable/selector_add.xml b/app_ipc_monitoring/src/main/res/drawable/selector_add.xml new file mode 100644 index 0000000000..b90c10de3e --- /dev/null +++ b/app_ipc_monitoring/src/main/res/drawable/selector_add.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app_ipc_monitoring/src/main/res/drawable/selector_minus.xml b/app_ipc_monitoring/src/main/res/drawable/selector_minus.xml new file mode 100644 index 0000000000..4d671adc0f --- /dev/null +++ b/app_ipc_monitoring/src/main/res/drawable/selector_minus.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app_ipc_monitoring/src/main/res/drawable/text.xml b/app_ipc_monitoring/src/main/res/drawable/text.xml new file mode 100644 index 0000000000..58c4db851b --- /dev/null +++ b/app_ipc_monitoring/src/main/res/drawable/text.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app_ipc_monitoring/src/main/res/layout/activity_autopilot_cloud_config.xml b/app_ipc_monitoring/src/main/res/layout/activity_autopilot_cloud_config.xml index 131a197495..a7b9a9c4ba 100644 --- a/app_ipc_monitoring/src/main/res/layout/activity_autopilot_cloud_config.xml +++ b/app_ipc_monitoring/src/main/res/layout/activity_autopilot_cloud_config.xml @@ -1,529 +1,38 @@ - + tools:context=".ui.AutopilotConfigActivity"> - - -