From 586849dac948767f24b319ff23d0063105444116 Mon Sep 17 00:00:00 2001 From: xinfengkun Date: Mon, 19 Dec 2022 18:55:06 +0800 Subject: [PATCH] =?UTF-8?q?[opt3.0][adas-other]=20=E7=A7=BB=E9=99=A4lib-ad?= =?UTF-8?q?as-other?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app_ipc_monitoring/build.gradle | 3 +- .../mogo-adas-connect-status/.gitignore | 1 - .../mogo-adas-connect-status/README.md | 2 - .../mogo-adas-connect-status/build.gradle | 106 ----- .../consumer-rules.pro | 0 .../gradle.properties | 3 - .../proguard-rules.pro | 26 -- .../src/main/AndroidManifest.xml | 3 - .../adas/high/AdasConnectStatusManager.java | 66 --- .../adas/high/bean/IPCConnectState.java | 16 - .../adas/high/common/ConnectStatusTask.java | 382 ------------------ .../high/widget/ConnectStatusAdapter.java | 86 ---- .../high/widget/ConnectStatusFloatWindow.java | 195 --------- .../high/widget/MyLinearLayoutManager.java | 36 -- .../src/main/res/drawable/ic_clear_false.xml | 9 - .../src/main/res/drawable/ic_clear_true.xml | 9 - .../src/main/res/drawable/ic_close_false.xml | 9 - .../src/main/res/drawable/ic_close_true.xml | 9 - .../src/main/res/drawable/ic_drag_false.xml | 9 - .../src/main/res/drawable/ic_drag_true.xml | 9 - .../src/main/res/drawable/ic_help_false.xml | 15 - .../src/main/res/drawable/ic_help_true.xml | 15 - .../src/main/res/drawable/ic_save_false.xml | 9 - .../src/main/res/drawable/ic_save_true.xml | 9 - .../src/main/res/drawable/selector_clear.xml | 5 - .../src/main/res/drawable/selector_close.xml | 5 - .../src/main/res/drawable/selector_drag.xml | 5 - .../src/main/res/drawable/selector_help.xml | 5 - .../src/main/res/drawable/selector_save.xml | 5 - .../src/main/res/layout/item_status.xml | 31 -- .../src/main/res/layout/layout_float.xml | 64 --- .../src/main/res/values/colors.xml | 8 - .../src/main/res/values/strings.xml | 3 - app_ipc_monitoring/other.zip | Bin 0 -> 48915 bytes .../src/main/AndroidManifest.xml | 13 +- .../permission/BackgrounderPermission.java | 3 +- .../permission/OnAdasPermissionListener.java | 2 +- ...PermissionLongBackgroundRunningDialog.java | 12 +- .../other/router/PlaceholderFragment.java | 4 +- .../client}/other/router/RouterActivity.java | 4 +- .../other/router/SectionsPagerAdapter.java | 3 +- .../zhidao/adas/client/ui/MainActivity.java | 6 +- .../src/main/res/drawable/bg_adas_dialog.xml | 0 .../src/main/res/layout/activity_router.xml | 0 ...das_permission_long_background_running.xml | 35 ++ .../src/main/res/layout/fragment_router.xml | 0 .../src/main/res/values/styles.xml | 23 ++ app_mogo_magic_ring/build.gradle | 2 - .../mogo-core-function-hmi/build.gradle | 1 - .../hmi/ui/setting/DebugSettingView.kt | 2 +- .../src/main/AndroidManifest.xml | 8 +- .../permissions/BackgrounderPermission.java | 143 +++++++ .../permissions/OnAdasPermissionListener.java | 10 + ...PermissionLongBackgroundRunningDialog.java | 80 ++++ .../src/main/res/drawable/bg_adas_dialog.xml | 6 +- ...das_permission_long_background_running.xml | 0 .../src/main/res/values/styles.xml | 17 + libraries/mogo-adas-other/.gitignore | 1 - libraries/mogo-adas-other/README.md | 7 - libraries/mogo-adas-other/build.gradle | 37 -- libraries/mogo-adas-other/consumer-rules.pro | 0 libraries/mogo-adas-other/gradle.properties | 3 - libraries/mogo-adas-other/proguard-rules.pro | 26 -- .../src/main/AndroidManifest.xml | 19 - .../src/main/res/anim/dialog_in.xml | 14 - .../src/main/res/anim/dialog_out.xml | 14 - .../src/main/res/values/strings.xml | 3 - .../src/main/res/values/styles.xml | 25 -- settings.gradle | 1 - 69 files changed, 345 insertions(+), 1337 deletions(-) delete mode 100644 app_ipc_monitoring/mogo-adas-connect-status/.gitignore delete mode 100644 app_ipc_monitoring/mogo-adas-connect-status/README.md delete mode 100644 app_ipc_monitoring/mogo-adas-connect-status/build.gradle delete mode 100644 app_ipc_monitoring/mogo-adas-connect-status/consumer-rules.pro delete mode 100644 app_ipc_monitoring/mogo-adas-connect-status/gradle.properties delete mode 100644 app_ipc_monitoring/mogo-adas-connect-status/proguard-rules.pro delete mode 100644 app_ipc_monitoring/mogo-adas-connect-status/src/main/AndroidManifest.xml delete mode 100644 app_ipc_monitoring/mogo-adas-connect-status/src/main/java/com/zhidao/support/adas/high/AdasConnectStatusManager.java delete mode 100644 app_ipc_monitoring/mogo-adas-connect-status/src/main/java/com/zhidao/support/adas/high/bean/IPCConnectState.java delete mode 100644 app_ipc_monitoring/mogo-adas-connect-status/src/main/java/com/zhidao/support/adas/high/common/ConnectStatusTask.java delete mode 100644 app_ipc_monitoring/mogo-adas-connect-status/src/main/java/com/zhidao/support/adas/high/widget/ConnectStatusAdapter.java delete mode 100644 app_ipc_monitoring/mogo-adas-connect-status/src/main/java/com/zhidao/support/adas/high/widget/ConnectStatusFloatWindow.java delete mode 100644 app_ipc_monitoring/mogo-adas-connect-status/src/main/java/com/zhidao/support/adas/high/widget/MyLinearLayoutManager.java delete mode 100644 app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_clear_false.xml delete mode 100644 app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_clear_true.xml delete mode 100644 app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_close_false.xml delete mode 100644 app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_close_true.xml delete mode 100644 app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_drag_false.xml delete mode 100644 app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_drag_true.xml delete mode 100644 app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_help_false.xml delete mode 100644 app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_help_true.xml delete mode 100644 app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_save_false.xml delete mode 100644 app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_save_true.xml delete mode 100644 app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/selector_clear.xml delete mode 100644 app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/selector_close.xml delete mode 100644 app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/selector_drag.xml delete mode 100644 app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/selector_help.xml delete mode 100644 app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/selector_save.xml delete mode 100644 app_ipc_monitoring/mogo-adas-connect-status/src/main/res/layout/item_status.xml delete mode 100644 app_ipc_monitoring/mogo-adas-connect-status/src/main/res/layout/layout_float.xml delete mode 100644 app_ipc_monitoring/mogo-adas-connect-status/src/main/res/values/colors.xml delete mode 100644 app_ipc_monitoring/mogo-adas-connect-status/src/main/res/values/strings.xml create mode 100644 app_ipc_monitoring/other.zip rename {libraries/mogo-adas-other/src/main/java/com/zhidao/support/adas/high => app_ipc_monitoring/src/main/java/com/zhidao/adas/client}/other/permission/BackgrounderPermission.java (98%) rename {libraries/mogo-adas-other/src/main/java/com/zhidao/support/adas/high => app_ipc_monitoring/src/main/java/com/zhidao/adas/client}/other/permission/OnAdasPermissionListener.java (81%) rename {libraries/mogo-adas-other/src/main/java/com/zhidao/support/adas/high => app_ipc_monitoring/src/main/java/com/zhidao/adas/client}/other/permission/PermissionLongBackgroundRunningDialog.java (90%) rename {libraries/mogo-adas-other/src/main/java/com/zhidao/support/adas/high => app_ipc_monitoring/src/main/java/com/zhidao/adas/client}/other/router/PlaceholderFragment.java (98%) rename {libraries/mogo-adas-other/src/main/java/com/zhidao/support/adas/high => app_ipc_monitoring/src/main/java/com/zhidao/adas/client}/other/router/RouterActivity.java (97%) rename {libraries/mogo-adas-other/src/main/java/com/zhidao/support/adas/high => app_ipc_monitoring/src/main/java/com/zhidao/adas/client}/other/router/SectionsPagerAdapter.java (95%) rename {libraries/mogo-adas-other => app_ipc_monitoring}/src/main/res/drawable/bg_adas_dialog.xml (100%) rename {libraries/mogo-adas-other => app_ipc_monitoring}/src/main/res/layout/activity_router.xml (100%) create mode 100644 app_ipc_monitoring/src/main/res/layout/dialog_adas_permission_long_background_running.xml rename {libraries/mogo-adas-other => app_ipc_monitoring}/src/main/res/layout/fragment_router.xml (100%) create mode 100644 core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/permissions/BackgrounderPermission.java create mode 100644 core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/permissions/OnAdasPermissionListener.java create mode 100644 core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/permissions/PermissionLongBackgroundRunningDialog.java rename app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/bg_float.xml => core/mogo-core-utils/src/main/res/drawable/bg_adas_dialog.xml (63%) rename {libraries/mogo-adas-other => core/mogo-core-utils}/src/main/res/layout/dialog_adas_permission_long_background_running.xml (100%) delete mode 100644 libraries/mogo-adas-other/.gitignore delete mode 100644 libraries/mogo-adas-other/README.md delete mode 100644 libraries/mogo-adas-other/build.gradle delete mode 100644 libraries/mogo-adas-other/consumer-rules.pro delete mode 100644 libraries/mogo-adas-other/gradle.properties delete mode 100644 libraries/mogo-adas-other/proguard-rules.pro delete mode 100644 libraries/mogo-adas-other/src/main/AndroidManifest.xml delete mode 100644 libraries/mogo-adas-other/src/main/res/anim/dialog_in.xml delete mode 100644 libraries/mogo-adas-other/src/main/res/anim/dialog_out.xml delete mode 100644 libraries/mogo-adas-other/src/main/res/values/strings.xml delete mode 100644 libraries/mogo-adas-other/src/main/res/values/styles.xml diff --git a/app_ipc_monitoring/build.gradle b/app_ipc_monitoring/build.gradle index 5b806618c1..ec986aca15 100644 --- a/app_ipc_monitoring/build.gradle +++ b/app_ipc_monitoring/build.gradle @@ -6,7 +6,7 @@ android { compileSdkVersion rootProject.ext.android.compileSdkVersion defaultConfig { applicationId "com.zhidao.adas.client" - minSdkVersion 21 + minSdkVersion rootProject.ext.android.minSdkVersion targetSdkVersion 25 multiDexEnabled true versionCode 1 @@ -87,7 +87,6 @@ dependencies { implementation rootProject.ext.dependencies.gson implementation project(':libraries:mogo-adas') implementation project(':libraries:mogo-adas-data') - implementation project(':libraries:mogo-adas-other') // implementation 'com.zhidao.support.adas:high:2.8.0.0' // implementation 'com.zhjt.mogo.adas.data:adas-data:2.6.6.0' // compileOnly project(':core:mogo-core-data') diff --git a/app_ipc_monitoring/mogo-adas-connect-status/.gitignore b/app_ipc_monitoring/mogo-adas-connect-status/.gitignore deleted file mode 100644 index 796b96d1c4..0000000000 --- a/app_ipc_monitoring/mogo-adas-connect-status/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/app_ipc_monitoring/mogo-adas-connect-status/README.md b/app_ipc_monitoring/mogo-adas-connect-status/README.md deleted file mode 100644 index 64f679824d..0000000000 --- a/app_ipc_monitoring/mogo-adas-connect-status/README.md +++ /dev/null @@ -1,2 +0,0 @@ -#### 说明 -# ADAS 连接状态 LIB diff --git a/app_ipc_monitoring/mogo-adas-connect-status/build.gradle b/app_ipc_monitoring/mogo-adas-connect-status/build.gradle deleted file mode 100644 index 1090744871..0000000000 --- a/app_ipc_monitoring/mogo-adas-connect-status/build.gradle +++ /dev/null @@ -1,106 +0,0 @@ -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 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/app_ipc_monitoring/mogo-adas-connect-status/gradle.properties b/app_ipc_monitoring/mogo-adas-connect-status/gradle.properties deleted file mode 100644 index 0d60ce4aee..0000000000 --- a/app_ipc_monitoring/mogo-adas-connect-status/gradle.properties +++ /dev/null @@ -1,3 +0,0 @@ -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 deleted file mode 100644 index f10712073b..0000000000 --- a/app_ipc_monitoring/mogo-adas-connect-status/proguard-rules.pro +++ /dev/null @@ -1,26 +0,0 @@ -# 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 deleted file mode 100644 index 9c1d6e5204..0000000000 --- a/app_ipc_monitoring/mogo-adas-connect-status/src/main/AndroidManifest.xml +++ /dev/null @@ -1,3 +0,0 @@ - - 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 deleted file mode 100644 index 81f6e1ae55..0000000000 --- a/app_ipc_monitoring/mogo-adas-connect-status/src/main/java/com/zhidao/support/adas/high/AdasConnectStatusManager.java +++ /dev/null @@ -1,66 +0,0 @@ -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 deleted file mode 100644 index b416ec0531..0000000000 --- a/app_ipc_monitoring/mogo-adas-connect-status/src/main/java/com/zhidao/support/adas/high/bean/IPCConnectState.java +++ /dev/null @@ -1,16 +0,0 @@ -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 deleted file mode 100644 index daa5818a8c..0000000000 --- a/app_ipc_monitoring/mogo-adas-connect-status/src/main/java/com/zhidao/support/adas/high/common/ConnectStatusTask.java +++ /dev/null @@ -1,382 +0,0 @@ -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 deleted file mode 100644 index 55c5bd4cd4..0000000000 --- a/app_ipc_monitoring/mogo-adas-connect-status/src/main/java/com/zhidao/support/adas/high/widget/ConnectStatusAdapter.java +++ /dev/null @@ -1,86 +0,0 @@ -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 deleted file mode 100644 index 3e28199f85..0000000000 --- a/app_ipc_monitoring/mogo-adas-connect-status/src/main/java/com/zhidao/support/adas/high/widget/ConnectStatusFloatWindow.java +++ /dev/null @@ -1,195 +0,0 @@ -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() - BarUtils.getStatusBarHeight(); - mInScreenX = motionEvent.getRawX(); - mInScreenY = motionEvent.getRawY() - BarUtils.getStatusBarHeight(); - btn_drag.setSelected(true); - break; - case MotionEvent.ACTION_MOVE: - // 更新浮动窗口位置参数 - mInScreenX = motionEvent.getRawX(); - mInScreenY = motionEvent.getRawY() - BarUtils.getStatusBarHeight(); - 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; - -} 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 deleted file mode 100644 index b6e1846c84..0000000000 --- a/app_ipc_monitoring/mogo-adas-connect-status/src/main/java/com/zhidao/support/adas/high/widget/MyLinearLayoutManager.java +++ /dev/null @@ -1,36 +0,0 @@ -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/ic_clear_false.xml b/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_clear_false.xml deleted file mode 100644 index b4eee2bcdc..0000000000 --- a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_clear_false.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - 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 deleted file mode 100644 index 46f8b43ede..0000000000 --- a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_clear_true.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - 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 deleted file mode 100644 index 82d38b39b2..0000000000 --- a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_close_false.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - 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 deleted file mode 100644 index 56376ad184..0000000000 --- a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_close_true.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - 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 deleted file mode 100644 index 74a5841e78..0000000000 --- a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_drag_false.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - 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 deleted file mode 100644 index b57b9765f2..0000000000 --- a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_drag_true.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - 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 deleted file mode 100644 index 1bec997e8b..0000000000 --- a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_help_false.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - 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 deleted file mode 100644 index 4b6ea31cbd..0000000000 --- a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_help_true.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - 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 deleted file mode 100644 index cfcde358d0..0000000000 --- a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_save_false.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - 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 deleted file mode 100644 index 4f5899e1b9..0000000000 --- a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/ic_save_true.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - 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 deleted file mode 100644 index 93ce351569..0000000000 --- a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/selector_clear.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - 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 deleted file mode 100644 index c0b211a4be..0000000000 --- a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/selector_close.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - 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 deleted file mode 100644 index e5f0d0ed7b..0000000000 --- a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/selector_drag.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - 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 deleted file mode 100644 index f873bd66ce..0000000000 --- a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/selector_help.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - 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 deleted file mode 100644 index f818021ab3..0000000000 --- a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/drawable/selector_save.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - 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 deleted file mode 100644 index a4cfdf3b81..0000000000 --- a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/layout/item_status.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - 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 deleted file mode 100644 index 4215ac80e8..0000000000 --- a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/layout/layout_float.xml +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - \ 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 deleted file mode 100644 index 1f6228713d..0000000000 --- a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/values/colors.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - #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 deleted file mode 100644 index 54d97e6cde..0000000000 --- a/app_ipc_monitoring/mogo-adas-connect-status/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - adas-status - diff --git a/app_ipc_monitoring/other.zip b/app_ipc_monitoring/other.zip new file mode 100644 index 0000000000000000000000000000000000000000..9bfec749b2e389683c0324b006dd846ee7338efb GIT binary patch literal 48915 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 + + + + - @@ -20,9 +23,7 @@ - - @@ -63,6 +64,12 @@ android:theme="@style/AppTheme.NoActionBar"> + + + + + + + + +