diff --git a/app_ipc_monitoring/mogo-adas-connect-status/.gitignore b/app_ipc_monitoring/mogo-adas-connect-status/.gitignore new file mode 100644 index 0000000000..796b96d1c4 --- /dev/null +++ b/app_ipc_monitoring/mogo-adas-connect-status/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app_ipc_monitoring/mogo-adas-connect-status/README.md b/app_ipc_monitoring/mogo-adas-connect-status/README.md new file mode 100644 index 0000000000..64f679824d --- /dev/null +++ b/app_ipc_monitoring/mogo-adas-connect-status/README.md @@ -0,0 +1,2 @@ +#### 说明 +# ADAS 连接状态 LIB diff --git a/app_ipc_monitoring/mogo-adas-connect-status/build.gradle b/app_ipc_monitoring/mogo-adas-connect-status/build.gradle new file mode 100644 index 0000000000..1090744871 --- /dev/null +++ b/app_ipc_monitoring/mogo-adas-connect-status/build.gradle @@ -0,0 +1,106 @@ +plugins { + id 'com.android.library' + id 'maven' +} +//ext { +// //自动驾驶产品版本号 +// AP_VERSION = "2.6.0" +//} +android { + compileSdkVersion rootProject.ext.android.compileSdkVersion + // buildToolsVersion rootProject.ext.android.buildToolsVersion + + defaultConfig { + minSdkVersion rootProject.ext.android.minSdkVersion + targetSdkVersion rootProject.ext.android.targetSdkVersion +// versionCode Integer.valueOf(VERSION_CODE) +// versionName getValueFromRootProperties("${project.name.replace("-", "_").toUpperCase()}_VERSION") +// +// buildConfigField "String", "AP_VERSION", "\"${AP_VERSION}\"" + versionCode rootProject.versionCode as int + versionName rootProject.versionName + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles 'consumer-rules.pro' + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + sourceSets { + main { + jniLibs.srcDirs = ['libs'] +// java { +// srcDir 'src/main/java' +// } +// +// proto { +// srcDir 'src/main/proto' +// include '**/*.proto' +// } + } + } +// +// protobuf { +// protoc { +// artifact = 'com.google.protobuf:protoc:3.6.1' +// } +// +// generateProtoTasks { +// all().each { task -> +// task.builtins { +// remove java +// } +// task.builtins { +// java {} +// } +// } +// } +// } + +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation project(':libraries:mogo-adas') + implementation rootProject.ext.dependencies.androidxrecyclerview +} + +task androidSourcesJar(type: Jar) { + classifier = 'sources' + from android.sourceSets.main.java.srcDirs +} +//配置需要上传到maven仓库的文件 +artifacts { + archives androidSourcesJar +} + +uploadArchives { + repositories.mavenDeployer { + repository(url: RELEASE_REPOSITORY_URL) { + authentication(userName: USERNAME, password: PASSWORD) + } + snapshotRepository(url: SNAPSHOT_REPOSITORY_URL) { + authentication(userName: USERNAME, password: PASSWORD) + } + pom.groupId = ADAS_LIB_GROUP + pom.artifactId = ADAS_LIB_POM_ARTIFACT_ID + pom.version = versionName + ADAS_LIB_CHILD_VERSION + pom.whenConfigured { pom -> + pom.dependencies.forEach { dep -> + if (dep.getVersion() == "unspecified") { + println("--修改pom.xml中的dependies模块--->>" + dep.getArtifactId()) + if (dep.getArtifactId() == ADAS_DATA_LIB_POM_ARTIFACT_ID) { + dep.setGroupId(ADAS_DATA_LIB_GROUP) + dep.setVersion(versionName + ADAS_DATA_LIB_CHILD_VERSION) + } + } + + } + + } + } +} \ No newline at end of file diff --git a/app_ipc_monitoring/mogo-adas-connect-status/consumer-rules.pro b/app_ipc_monitoring/mogo-adas-connect-status/consumer-rules.pro new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app_ipc_monitoring/mogo-adas-connect-status/gradle.properties b/app_ipc_monitoring/mogo-adas-connect-status/gradle.properties new file mode 100644 index 0000000000..0d60ce4aee --- /dev/null +++ b/app_ipc_monitoring/mogo-adas-connect-status/gradle.properties @@ -0,0 +1,3 @@ +GROUP=com.mogo.adas +POM_ARTIFACT_ID=mogo-adas +VERSION_CODE=1 \ No newline at end of file diff --git a/app_ipc_monitoring/mogo-adas-connect-status/proguard-rules.pro b/app_ipc_monitoring/mogo-adas-connect-status/proguard-rules.pro new file mode 100644 index 0000000000..f10712073b --- /dev/null +++ b/app_ipc_monitoring/mogo-adas-connect-status/proguard-rules.pro @@ -0,0 +1,26 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile + +#-----MogoMap----- +-keep class com.mogo.map.MogoNavi{ + private (); +} diff --git a/app_ipc_monitoring/mogo-adas-connect-status/src/main/AndroidManifest.xml b/app_ipc_monitoring/mogo-adas-connect-status/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..9c1d6e5204 --- /dev/null +++ b/app_ipc_monitoring/mogo-adas-connect-status/src/main/AndroidManifest.xml @@ -0,0 +1,3 @@ + + diff --git a/app_ipc_monitoring/mogo-adas-connect-status/src/main/java/com/zhidao/support/adas/high/AdasConnectStatusManager.java b/app_ipc_monitoring/mogo-adas-connect-status/src/main/java/com/zhidao/support/adas/high/AdasConnectStatusManager.java new file mode 100644 index 0000000000..81f6e1ae55 --- /dev/null +++ b/app_ipc_monitoring/mogo-adas-connect-status/src/main/java/com/zhidao/support/adas/high/AdasConnectStatusManager.java @@ -0,0 +1,66 @@ +package com.zhidao.support.adas.high; + +import android.app.Activity; + +import com.zhidao.support.adas.high.common.ConnectStatusTask; +import com.zhidao.support.adas.high.widget.ConnectStatusFloatWindow; + +/** + * @ProjectName: lib-adas-fpga + * @Package: com.zhidao.lib.adas.high + * @ClassName: AdasManager + * @Description: java类作用描述 + * @Author: fenghl + * @CreateDate: 2020/2/7 13:13 + * @UpdateUser: 更新者: + * @UpdateDate: 2020/2/7 13:13 + * @UpdateRemark: 更新说明: + * @Version: 1.0 + */ +public class AdasConnectStatusManager { + private static volatile AdasConnectStatusManager ourInstance; + + private ConnectStatusFloatWindow floatWindow; + + public static AdasConnectStatusManager getInstance() { + if (ourInstance == null) { + synchronized (AdasConnectStatusManager.class) { + if (ourInstance == null) { + ourInstance = new AdasConnectStatusManager(); + } + } + } + return ourInstance; + } + + private AdasConnectStatusManager() { + + } + + + /** + * 展示连接历史 + * + * @param activity + */ + public void showConnectStatusFloatWindow(Activity activity) { + if (floatWindow == null) { + floatWindow = new ConnectStatusFloatWindow(activity, ConnectStatusTask.getInstance().getList(), new ConnectStatusFloatWindow.OnConnectStatusFloatWindowListener() { + @Override + public void onClose() { + closeConnectStatusFloatWindow(); + } + }); + floatWindow.showFloatWindow(); + } else { + closeConnectStatusFloatWindow(); + } + } + + private void closeConnectStatusFloatWindow() { + floatWindow.hideFloatWindow(); + floatWindow = null; + } + + +} diff --git a/app_ipc_monitoring/mogo-adas-connect-status/src/main/java/com/zhidao/support/adas/high/bean/IPCConnectState.java b/app_ipc_monitoring/mogo-adas-connect-status/src/main/java/com/zhidao/support/adas/high/bean/IPCConnectState.java new file mode 100644 index 0000000000..b416ec0531 --- /dev/null +++ b/app_ipc_monitoring/mogo-adas-connect-status/src/main/java/com/zhidao/support/adas/high/bean/IPCConnectState.java @@ -0,0 +1,16 @@ +package com.zhidao.support.adas.high.bean; + +import androidx.annotation.ColorRes; + +public class IPCConnectState { + public final String status; + @ColorRes + public final int color; + + public IPCConnectState(String status, @ColorRes int color) { + this.status = status; + this.color = color; + } + + +} diff --git a/app_ipc_monitoring/mogo-adas-connect-status/src/main/java/com/zhidao/support/adas/high/common/ConnectStatusTask.java b/app_ipc_monitoring/mogo-adas-connect-status/src/main/java/com/zhidao/support/adas/high/common/ConnectStatusTask.java new file mode 100644 index 0000000000..daa5818a8c --- /dev/null +++ b/app_ipc_monitoring/mogo-adas-connect-status/src/main/java/com/zhidao/support/adas/high/common/ConnectStatusTask.java @@ -0,0 +1,382 @@ +package com.zhidao.support.adas.high.common; + +import android.os.Environment; +import android.text.TextUtils; + +import com.zhidao.support.adas.high.bean.IPCConnectState; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.LineNumberReader; +import java.io.RandomAccessFile; +import java.nio.charset.StandardCharsets; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Locale; +import java.util.concurrent.Future; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * 连接状态存储任务 + */ +public class ConnectStatusTask { + private static final String TAG = ConnectStatusTask.class.getSimpleName(); + public static final String ROOT_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "mogo" + File.separator + "adas" + File.separator;//程序外部存储跟目录 + private static final String LOG_FILE_NAME = "ipc_connect_status.log";//文件名称 + private volatile static ConnectStatusTask INSTANCE; + private static final int MAX_LINES = 1000;//最大存储行数 + private static final int DEL_LINES = 500;//超过最大存储行数删除的行数 + private static final int EVERY_TIME_READ_LINES = 200;//每次读取最大行数 + private LinkedBlockingQueue queue; + private BufferedWriter buff = null; + private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.getDefault()); + private File file; + //是否写入本地 + private final AtomicBoolean isSave = new AtomicBoolean(false); + private Future future; + private final AtomicBoolean isInitRead = new AtomicBoolean(false);//是否已经读取过本地文件 + private final List onReadListeners = new ArrayList<>(); + private final List listLog = new ArrayList<>(); + + private ConnectStatusTask() { + queue = new LinkedBlockingQueue<>(); + init(false); + ThreadPoolManager.getsInstance().submit(new ReadThread()); + } + + public static ConnectStatusTask getInstance() { + if (INSTANCE == null) { + synchronized (ConnectStatusTask.class) { + if (INSTANCE == null) { + INSTANCE = new ConnectStatusTask(); + } + } + } + return INSTANCE; + } + + public List getList() { + return listLog; + } + + public void clear() { + init(true); + listLog.clear(); + if (onReadListeners.size() != 0) { + for (int i = 0; i < onReadListeners.size(); i++) { + onReadListeners.get(i).onRefresh(); + } + } + } + + + public void setIsLogSwitch(boolean isLogSwitch) { + this.isLogSwitch = isLogSwitch; + } + + public boolean isLogSwitch() { + return isLogSwitch; + } + + + public boolean isSdcardUse() { + boolean bl = false; + if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { + bl = true; + } + return bl; + } + + private void init(boolean isClear) { + if (isSdcardUse()) { + try { + file = new File(ROOT_PATH + LOG_FILE_NAME); + if (isClear && file.exists()) { + file.delete(); + } + if (!file.exists()) { + if (!file.getParentFile().exists()) { + file.getParentFile().mkdirs(); + } + file.createNewFile(); + } + FileWriter fw = new FileWriter(file, true); + buff = new BufferedWriter(fw); + } catch (IOException e) { + e.printStackTrace(); + } + } + start(); + } + + public void start() { + if (future == null) { + future = ThreadPoolManager.getsInstance().submit(new WriteThread()); + } + } + + public void stop() { + queue.clear(); + if (future != null && !future.isCancelled()) { + future.cancel(true); + } + future = null; + closeBufferedWriter(); + } + + private void closeBufferedWriter() { + if (buff != null) { + try { + buff.flush(); + buff.close(); + } catch (IOException e) { + e.printStackTrace(); + } + buff = null; + } + + } + + public void save(String status) { + if (isLogSwitch) { + String time = sdf.format(new Date(System.currentTimeMillis())); + queue.add(time + "##" + status); + } + } + + private int getStatusColor(String connectStatus) { + if (connectStatus.contains("已连接")) { + return R.color.connect_status_connected; + } else if (connectStatus.contains("连接中") || connectStatus.contains("重连中")) { + return R.color.connect_status_connecting; + } else if (connectStatus.contains("正在搜索IP")) { + return R.color.connect_status_search_address; + } else if (connectStatus.contains("地址不可用或不合法")) { + return R.color.connect_status_disconnecting; + } else { + return R.color.connect_status_disconnected; + } + } + + + private synchronized void addList(String status) { + listLog.add(0, onParse(status)); + if (onReadListeners.size() != 0) { + for (OnReadListener listener : onReadListeners) { + listener.onRefresh(); + } + } + } + + private IPCConnectState onParse(String status) { + status = status.replace("##", "\n"); + return new IPCConnectState(status, getStatusColor(status)); + } + + //写入 + public class WriteThread implements Runnable { + int lineNum = -1; + + @Override + public void run() { +// L.i(TAG, "是否是主线程=" + Utils.isMainThread()); + if (lineNum == -1) { + lineNum = lineNumber(); + } + CupidLogUtils.i(TAG, "初始化获得的行数=" + lineNum); + synchronized (this) { + while (!Thread.currentThread().isInterrupted()) { + try { + String data = queue.take(); + data = data == null ? "主动断开连接" : data; +// addList(data, true); +// L.i(TAG, "写入Log---" + data); + if (buff != null && !TextUtils.isEmpty(data)) { + buff.write(data); + buff.newLine(); + buff.flush(); + lineNum++; + if (lineNum == MAX_LINES + 1 + DEL_LINES) { + List delLines = readAndRemoveFirstLines(); + for (String str : delLines) { + CupidLogUtils.i(TAG, "被删除的数据=" + str); + } + lineNum = lineNum - DEL_LINES; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + } + } + + + private List readAndRemoveFirstLines() { + List strList = new ArrayList<>(); + RandomAccessFile raf = null; + try { + raf = new RandomAccessFile(file, "rw"); + //Initial write position + long writePosition = raf.getFilePointer(); + for (int i = 0; i < DEL_LINES; i++) { + String line = raf.readLine(); + if (line == null) { + break; + } + strList.add(new String(line.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8)); + } + // Shift the next lines upwards. + long readPosition = raf.getFilePointer(); + + byte[] buff = new byte[1024]; + int n; + while (-1 != (n = raf.read(buff))) { + raf.seek(writePosition); + raf.write(buff, 0, n); + readPosition += n; + writePosition += n; + raf.seek(readPosition); + } + raf.setLength(writePosition); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (raf != null) { + raf.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + return strList; + } + + + //获取文件总行数 + private int lineNumber() { + int lineNumber = 0; + if (file != null) + try { + LineNumberReader lineNumberReader = new LineNumberReader(new FileReader(file)); + lineNumberReader.skip(Long.MAX_VALUE); + //注意加1,实际上是读取换行符,所以需要+1 + lineNumber = lineNumberReader.getLineNumber() + 1; + } catch (IOException e) { + e.printStackTrace(); + } + return lineNumber; + } + + + //读取日志 + public void registerReadListener(OnReadListener onReadListener) { + if (onReadListener != null) { + if (!onReadListeners.contains(onReadListener)) { + onReadListeners.add(onReadListener); + } + + } + } + + public void unRegisterReadListener(OnReadListener onReadListener) { + if (onReadListener != null) + onReadListeners.remove(onReadListener); + } + + + public interface OnReadListener { + void onRefresh(); + } + + //读取 + public class ReadThread implements Runnable { + RandomAccessFile rf = null; + long len; + long start; + long nextend; + long readLine = 0; + boolean isRead = true; + int lineNum = -1; + + @Override + public void run() { +// L.i(TAG, "是否是主线程=" + Utils.isMainThread()); + if (lineNum == -1) { + lineNum = lineNumber(); + } + synchronized (this) { + try { + if (rf == null && file != null) { + rf = new RandomAccessFile(file, "r"); + len = rf.length(); + start = rf.getFilePointer(); + nextend = start + len - 1; + rf.seek(nextend); + } +// L.i(TAG, "len=" + len); +// L.i(TAG, "start=" + start); +// L.i(TAG, "nextend=" + nextend); + String line; + int c = -1; + while (isRead && nextend > start) { + c = rf.read(); + if (c == '\n' || c == '\r') { + line = rf.readLine(); + if (!TextUtils.isEmpty(line)) { + String log = new String(line.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); + listLog.add(onParse(log)); + } + nextend--; + readLine++; + } + nextend--; + rf.seek(nextend); + if (nextend == 0) {// 当文件指针退至文件开始处,输出第一行 + String log = new String(rf.readLine().getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); + listLog.add(onParse(log)); + readLine++; + } + if (readLine == EVERY_TIME_READ_LINES + 1) { + isRead = false; + } +// L.i(TAG, "readLine=" + readLine); + } + Collections.reverse(listLog); + if (onReadListeners.size() != 0) { + for (int i = 0; i < onReadListeners.size(); i++) { + onReadListeners.get(i).onRefresh(); + } + + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (rf != null) + rf.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + isInitRead.set(true); + } + + } + + + } + + +} \ No newline at end of file diff --git a/app_ipc_monitoring/mogo-adas-connect-status/src/main/java/com/zhidao/support/adas/high/widget/ConnectStatusAdapter.java b/app_ipc_monitoring/mogo-adas-connect-status/src/main/java/com/zhidao/support/adas/high/widget/ConnectStatusAdapter.java new file mode 100644 index 0000000000..55c5bd4cd4 --- /dev/null +++ b/app_ipc_monitoring/mogo-adas-connect-status/src/main/java/com/zhidao/support/adas/high/widget/ConnectStatusAdapter.java @@ -0,0 +1,86 @@ +package com.zhidao.support.adas.high.widget; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.EditText; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.zhidao.support.adas.high.R; +import com.zhidao.support.adas.high.bean.IPCConnectState; + +import java.util.List; +import java.util.Locale; + + +/** + * 连接状态 + */ +public class ConnectStatusAdapter extends RecyclerView.Adapter { + private static final String POS = "%03d. "; + private List mDatas; + private Context mContext; + + public void setData(List mDatas) { + this.mDatas = mDatas; + } + + public void refreshView() { +// notifyItemChanged(mDatas.size()-1,0); + notifyItemRangeChanged(0, getItemCount()); + } + + @Override + public long getItemId(int position) { + return position; + } + + + @NonNull + @Override + public InfoViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) { + mContext = viewGroup.getContext(); + View remoteView = LayoutInflater.from(mContext).inflate(R.layout.item_status, viewGroup, false); + return new InfoViewHolder(remoteView); + + } + + @Override + public void onBindViewHolder(@NonNull InfoViewHolder viewHolder, int position) { + if (mDatas != null) { + IPCConnectState data = mDatas.get(position); + viewHolder.id.setText(String.format(Locale.getDefault(), POS, getItemCount() - position)); + viewHolder.editText.setText(data.status); + viewHolder.editText.setTextColor(mContext.getResources().getColor(data.color)); + } + + } + + + @Override + public int getItemCount() { + return mDatas == null ? 0 : mDatas.size(); + } + + + class InfoViewHolder extends RecyclerView.ViewHolder { + EditText editText; + TextView id; + + public InfoViewHolder(View itemView) { + super(itemView); + editText = itemView.findViewById(R.id.log); + id = itemView.findViewById(R.id.id); + itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + } + }); + } + } +} \ No newline at end of file diff --git a/app_ipc_monitoring/mogo-adas-connect-status/src/main/java/com/zhidao/support/adas/high/widget/ConnectStatusFloatWindow.java b/app_ipc_monitoring/mogo-adas-connect-status/src/main/java/com/zhidao/support/adas/high/widget/ConnectStatusFloatWindow.java new file mode 100644 index 0000000000..eeaf0dcf5c --- /dev/null +++ b/app_ipc_monitoring/mogo-adas-connect-status/src/main/java/com/zhidao/support/adas/high/widget/ConnectStatusFloatWindow.java @@ -0,0 +1,216 @@ +package com.zhidao.support.adas.high.widget; + +import android.app.Activity; +import android.content.Context; +import android.graphics.PixelFormat; +import android.os.Build; +import android.util.DisplayMetrics; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.WindowManager; +import android.widget.ImageView; +import android.widget.Toast; + +import androidx.recyclerview.widget.RecyclerView; + +import com.zhidao.support.adas.high.R; +import com.zhidao.support.adas.high.bean.IPCConnectState; + +import java.lang.reflect.Field; +import java.util.List; + +/** + * @author xuxinchao + * @description + * @since: 2022/4/20 + */ +public class ConnectStatusFloatWindow implements View.OnTouchListener { + + + private final Activity mContext; + private WindowManager.LayoutParams mWindowParams; + private WindowManager mWindowManager; + + private View mFloatLayout; + private ImageView btn_drag; + private float mInViewX; + private float mInViewY; + private float mDownInScreenX; + private float mDownInScreenY; + private float mInScreenX; + private float mInScreenY; + private RecyclerView rv_status; + private ConnectStatusAdapter adapter; + private List list; + private OnConnectStatusFloatWindowListener listener; + + public interface OnConnectStatusFloatWindowListener { + void onClose(); + } + + public ConnectStatusFloatWindow(Activity context, List list, OnConnectStatusFloatWindowListener listener) { + this.mContext = context; + this.list = list; + this.listener = listener; + initFloatWindow(); + } + + public void refreshView() { + if (adapter != null) { + adapter.refreshView(); + } + } + + private void initRV() { + //创建默认的线性LayoutManager 横向的GridLayoutManager + MyLinearLayoutManager linearLayoutManager = new MyLinearLayoutManager(mContext); +// linearLayoutManager.setStackFromEnd(true);//列表再底部开始展示,反转后由上面开始展示 +// linearLayoutManager.setReverseLayout(true);//列表翻转 + rv_status.setLayoutManager(linearLayoutManager); + //如果可以确定每个item的高度是固定的,设置这个选项可以提高性能 + rv_status.setHasFixedSize(false); + rv_status.setNestedScrollingEnabled(false); + adapter = new ConnectStatusAdapter(); + adapter.setHasStableIds(true); + rv_status.setAdapter(adapter); + adapter.setData(list); + } + + private void initFloatWindow() { + LayoutInflater inflater = LayoutInflater.from(mContext); + if (inflater == null) + return; + mFloatLayout = inflater.inflate(R.layout.layout_float, null); + rv_status = mFloatLayout.findViewById(R.id.rv_status); + View btn_close = mFloatLayout.findViewById(R.id.btn_close); + View btn_help = mFloatLayout.findViewById(R.id.btn_help); + View btn_save = mFloatLayout.findViewById(R.id.btn_save); + btn_drag = mFloatLayout.findViewById(R.id.btn_drag); + btn_close.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (listener != null) + listener.onClose(); + } + }); + btn_help.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Toast.makeText(v.getContext(), "功能提示\n1.将数连接状态写入本地;\n2.清空列表以及保存到本地的数据;\n3.拖拽;\n4.帮助;\n5.关闭此窗口;", Toast.LENGTH_LONG).show(); + } + }); + btn_save.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + } + }); + mFloatLayout.setOnTouchListener(this); + initRV(); + mWindowParams = new WindowManager.LayoutParams(); + mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); + if (Build.VERSION.SDK_INT >= 26) {//8.0新特性 + mWindowParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; + } else { + mWindowParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; + } + + mWindowManager = mContext.getWindowManager(); + + mWindowParams.format = PixelFormat.RGBA_8888; + mWindowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; + mWindowParams.gravity = Gravity.START | Gravity.TOP; + mWindowParams.width = WindowManager.LayoutParams.WRAP_CONTENT; + mWindowParams.height = WindowManager.LayoutParams.WRAP_CONTENT; + mWindowParams.alpha = 0.82F; + } + + @Override + public boolean onTouch(View view, MotionEvent motionEvent) { + return floatLayoutTouch(motionEvent); + } + + private boolean floatLayoutTouch(MotionEvent motionEvent) { + switch (motionEvent.getAction()) { + case MotionEvent.ACTION_DOWN: + // 获取相对View的坐标,即以此View左上角为原点 + mInViewX = motionEvent.getX(); + mInViewY = motionEvent.getY(); + // 获取相对屏幕的坐标,即以屏幕左上角为原点 + mDownInScreenX = motionEvent.getRawX(); + mDownInScreenY = motionEvent.getRawY() - getSysBarHeight(mContext); + mInScreenX = motionEvent.getRawX(); + mInScreenY = motionEvent.getRawY() - getSysBarHeight(mContext); + btn_drag.setSelected(true); + break; + case MotionEvent.ACTION_MOVE: + // 更新浮动窗口位置参数 + mInScreenX = motionEvent.getRawX(); + mInScreenY = motionEvent.getRawY() - getSysBarHeight(mContext); + mWindowParams.x = (int) (mInScreenX - mInViewX); + mWindowParams.y = (int) (mInScreenY - mInViewY); + // 手指移动的时候更新小悬浮窗的位置 + mWindowManager.updateViewLayout(mFloatLayout, mWindowParams); + break; + case MotionEvent.ACTION_UP: + btn_drag.setSelected(false); + // 如果手指离开屏幕时,xDownInScreen和xInScreen相等,且yDownInScreen和yInScreen相等,则视为触发了单击事件。 + if (mDownInScreenX == mInScreenX && mDownInScreenY == mInScreenY) { + + } + break; + } + return true; + } + + + public void showFloatWindow() { + if (mFloatLayout.getParent() == null) { + DisplayMetrics metrics = new DisplayMetrics(); + // 默认固定位置,靠屏幕右边缘的中间 + mWindowManager.getDefaultDisplay().getMetrics(metrics); + mWindowParams.x = metrics.widthPixels; + mWindowParams.y = metrics.heightPixels; + mWindowManager.addView(mFloatLayout, mWindowParams); + } + } + + + public void hideFloatWindow() { + if (mFloatLayout.getParent() != null) + mWindowManager.removeView(mFloatLayout); + } + + public void setFloatLayoutAlpha(boolean alpha) { + if (alpha) + mFloatLayout.setAlpha((float) 0.5); + else + mFloatLayout.setAlpha(1); + } + + private int sbar = -1; + + // 获取系统状态栏高度 + public int getSysBarHeight(Context contex) { + if (sbar == -1) { + Class c; + Object obj; + Field field; + int x; + sbar = 0; + try { + c = Class.forName("com.android.internal.R$dimen"); + obj = c.newInstance(); + field = c.getField("status_bar_height"); + x = Integer.parseInt(field.get(obj).toString()); + sbar = contex.getResources().getDimensionPixelSize(x); + } catch (Exception e1) { + e1.printStackTrace(); + } + } + return sbar; + } + +} diff --git a/app_ipc_monitoring/mogo-adas-connect-status/src/main/java/com/zhidao/support/adas/high/widget/MyLinearLayoutManager.java b/app_ipc_monitoring/mogo-adas-connect-status/src/main/java/com/zhidao/support/adas/high/widget/MyLinearLayoutManager.java new file mode 100644 index 0000000000..b6e1846c84 --- /dev/null +++ b/app_ipc_monitoring/mogo-adas-connect-status/src/main/java/com/zhidao/support/adas/high/widget/MyLinearLayoutManager.java @@ -0,0 +1,36 @@ +package com.zhidao.support.adas.high.widget; + +import android.content.Context; +import android.util.AttributeSet; + +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +public class MyLinearLayoutManager extends LinearLayoutManager { + public MyLinearLayoutManager(Context context) { + super(context); + } + + public MyLinearLayoutManager(Context context, int orientation, boolean reverseLayout) { + super(context, orientation, reverseLayout); + } + + public MyLinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + @Override + public boolean supportsPredictiveItemAnimations() { + return false; + } + + @Override + public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) { + //override this method and implement code as below + try { + super.onLayoutChildren(recycler, state); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/bg_float.xml b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/bg_float.xml new file mode 100644 index 0000000000..9a0d977f97 --- /dev/null +++ b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/bg_float.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_clear_false.xml b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_clear_false.xml new file mode 100644 index 0000000000..b4eee2bcdc --- /dev/null +++ b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_clear_false.xml @@ -0,0 +1,9 @@ + + + diff --git a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_clear_true.xml b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_clear_true.xml new file mode 100644 index 0000000000..46f8b43ede --- /dev/null +++ b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_clear_true.xml @@ -0,0 +1,9 @@ + + + diff --git a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_close_false.xml b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_close_false.xml new file mode 100644 index 0000000000..82d38b39b2 --- /dev/null +++ b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_close_false.xml @@ -0,0 +1,9 @@ + + + diff --git a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_close_true.xml b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_close_true.xml new file mode 100644 index 0000000000..56376ad184 --- /dev/null +++ b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_close_true.xml @@ -0,0 +1,9 @@ + + + diff --git a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_drag_false.xml b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_drag_false.xml new file mode 100644 index 0000000000..74a5841e78 --- /dev/null +++ b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_drag_false.xml @@ -0,0 +1,9 @@ + + + diff --git a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_drag_true.xml b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_drag_true.xml new file mode 100644 index 0000000000..b57b9765f2 --- /dev/null +++ b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_drag_true.xml @@ -0,0 +1,9 @@ + + + diff --git a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_help_false.xml b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_help_false.xml new file mode 100644 index 0000000000..1bec997e8b --- /dev/null +++ b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_help_false.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_help_true.xml b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_help_true.xml new file mode 100644 index 0000000000..4b6ea31cbd --- /dev/null +++ b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_help_true.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_save_false.xml b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_save_false.xml new file mode 100644 index 0000000000..cfcde358d0 --- /dev/null +++ b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_save_false.xml @@ -0,0 +1,9 @@ + + + diff --git a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_save_true.xml b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_save_true.xml new file mode 100644 index 0000000000..4f5899e1b9 --- /dev/null +++ b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_save_true.xml @@ -0,0 +1,9 @@ + + + diff --git a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/selector_clear.xml b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/selector_clear.xml new file mode 100644 index 0000000000..93ce351569 --- /dev/null +++ b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/selector_clear.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/selector_close.xml b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/selector_close.xml new file mode 100644 index 0000000000..c0b211a4be --- /dev/null +++ b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/selector_close.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/selector_drag.xml b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/selector_drag.xml new file mode 100644 index 0000000000..e5f0d0ed7b --- /dev/null +++ b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/selector_drag.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/selector_help.xml b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/selector_help.xml new file mode 100644 index 0000000000..f873bd66ce --- /dev/null +++ b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/selector_help.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/selector_save.xml b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/selector_save.xml new file mode 100644 index 0000000000..f818021ab3 --- /dev/null +++ b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/selector_save.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/layout/item_status.xml b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/layout/item_status.xml new file mode 100644 index 0000000000..a4cfdf3b81 --- /dev/null +++ b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/layout/item_status.xml @@ -0,0 +1,31 @@ + + + + + + + + + + diff --git a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/layout/layout_float.xml b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/layout/layout_float.xml new file mode 100644 index 0000000000..4215ac80e8 --- /dev/null +++ b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/layout/layout_float.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/values/colors.xml b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/values/colors.xml new file mode 100644 index 0000000000..1f6228713d --- /dev/null +++ b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/values/colors.xml @@ -0,0 +1,8 @@ + + + #32CD32 + #DC143C + #FF00FF + #DAA520 + #1E90FF + diff --git a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/values/strings.xml b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/values/strings.xml new file mode 100644 index 0000000000..54d97e6cde --- /dev/null +++ b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + adas-status +