| *.iml | |||||
| .gradle | |||||
| /local.properties | |||||
| /.idea/caches | |||||
| /.idea/libraries | |||||
| /.idea/modules.xml | |||||
| /.idea/workspace.xml | |||||
| /.idea/navEditor.xml | |||||
| /.idea/assetWizardSettings.xml | |||||
| .DS_Store | |||||
| /build | |||||
| /captures | |||||
| .externalNativeBuild |
| <component name="ProjectCodeStyleConfiguration"> | |||||
| <code_scheme name="Project" version="173"> | |||||
| <option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="99" /> | |||||
| <option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="99" /> | |||||
| <option name="PACKAGES_TO_USE_IMPORT_ON_DEMAND"> | |||||
| <value /> | |||||
| </option> | |||||
| <option name="IMPORT_LAYOUT_TABLE"> | |||||
| <value> | |||||
| <package name="android" withSubpackages="true" static="false" /> | |||||
| <emptyLine /> | |||||
| <package name="com" withSubpackages="true" static="false" /> | |||||
| <emptyLine /> | |||||
| <package name="junit" withSubpackages="true" static="false" /> | |||||
| <emptyLine /> | |||||
| <package name="net" withSubpackages="true" static="false" /> | |||||
| <emptyLine /> | |||||
| <package name="org" withSubpackages="true" static="false" /> | |||||
| <emptyLine /> | |||||
| <package name="java" withSubpackages="true" static="false" /> | |||||
| <emptyLine /> | |||||
| <package name="javax" withSubpackages="true" static="false" /> | |||||
| <emptyLine /> | |||||
| <package name="" withSubpackages="true" static="false" /> | |||||
| <emptyLine /> | |||||
| <package name="" withSubpackages="true" static="true" /> | |||||
| <emptyLine /> | |||||
| </value> | |||||
| </option> | |||||
| <option name="RIGHT_MARGIN" value="100" /> | |||||
| <AndroidXmlCodeStyleSettings> | |||||
| <option name="USE_CUSTOM_SETTINGS" value="true" /> | |||||
| </AndroidXmlCodeStyleSettings> | |||||
| <JavaCodeStyleSettings> | |||||
| <option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="99" /> | |||||
| <option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="99" /> | |||||
| <option name="PACKAGES_TO_USE_IMPORT_ON_DEMAND"> | |||||
| <value /> | |||||
| </option> | |||||
| <option name="IMPORT_LAYOUT_TABLE"> | |||||
| <value> | |||||
| <package name="android" withSubpackages="true" static="false" /> | |||||
| <emptyLine /> | |||||
| <package name="com" withSubpackages="true" static="false" /> | |||||
| <emptyLine /> | |||||
| <package name="junit" withSubpackages="true" static="false" /> | |||||
| <emptyLine /> | |||||
| <package name="net" withSubpackages="true" static="false" /> | |||||
| <emptyLine /> | |||||
| <package name="org" withSubpackages="true" static="false" /> | |||||
| <emptyLine /> | |||||
| <package name="java" withSubpackages="true" static="false" /> | |||||
| <emptyLine /> | |||||
| <package name="javax" withSubpackages="true" static="false" /> | |||||
| <emptyLine /> | |||||
| <package name="" withSubpackages="true" static="false" /> | |||||
| <emptyLine /> | |||||
| <package name="" withSubpackages="true" static="true" /> | |||||
| <emptyLine /> | |||||
| </value> | |||||
| </option> | |||||
| </JavaCodeStyleSettings> | |||||
| <XML> | |||||
| <option name="XML_LEGACY_SETTINGS_IMPORTED" value="true" /> | |||||
| </XML> | |||||
| <codeStyleSettings language="XML"> | |||||
| <option name="FORCE_REARRANGE_MODE" value="1" /> | |||||
| <indentOptions> | |||||
| <option name="CONTINUATION_INDENT_SIZE" value="4" /> | |||||
| </indentOptions> | |||||
| <arrangement> | |||||
| <rules> | |||||
| <section> | |||||
| <rule> | |||||
| <match> | |||||
| <AND> | |||||
| <NAME>xmlns:android</NAME> | |||||
| <XML_NAMESPACE>Namespace:</XML_NAMESPACE> | |||||
| </AND> | |||||
| </match> | |||||
| </rule> | |||||
| </section> | |||||
| <section> | |||||
| <rule> | |||||
| <match> | |||||
| <AND> | |||||
| <NAME>xmlns:.*</NAME> | |||||
| <XML_NAMESPACE>Namespace:</XML_NAMESPACE> | |||||
| </AND> | |||||
| </match> | |||||
| <order>BY_NAME</order> | |||||
| </rule> | |||||
| </section> | |||||
| <section> | |||||
| <rule> | |||||
| <match> | |||||
| <AND> | |||||
| <NAME>.*:id</NAME> | |||||
| <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE> | |||||
| </AND> | |||||
| </match> | |||||
| </rule> | |||||
| </section> | |||||
| <section> | |||||
| <rule> | |||||
| <match> | |||||
| <AND> | |||||
| <NAME>.*:name</NAME> | |||||
| <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE> | |||||
| </AND> | |||||
| </match> | |||||
| </rule> | |||||
| </section> | |||||
| <section> | |||||
| <rule> | |||||
| <match> | |||||
| <AND> | |||||
| <NAME>name</NAME> | |||||
| <XML_NAMESPACE>^$</XML_NAMESPACE> | |||||
| </AND> | |||||
| </match> | |||||
| </rule> | |||||
| </section> | |||||
| <section> | |||||
| <rule> | |||||
| <match> | |||||
| <AND> | |||||
| <NAME>style</NAME> | |||||
| <XML_NAMESPACE>^$</XML_NAMESPACE> | |||||
| </AND> | |||||
| </match> | |||||
| </rule> | |||||
| </section> | |||||
| <section> | |||||
| <rule> | |||||
| <match> | |||||
| <AND> | |||||
| <NAME>.*</NAME> | |||||
| <XML_NAMESPACE>^$</XML_NAMESPACE> | |||||
| </AND> | |||||
| </match> | |||||
| <order>BY_NAME</order> | |||||
| </rule> | |||||
| </section> | |||||
| <section> | |||||
| <rule> | |||||
| <match> | |||||
| <AND> | |||||
| <NAME>.*:layout_width</NAME> | |||||
| <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE> | |||||
| </AND> | |||||
| </match> | |||||
| </rule> | |||||
| </section> | |||||
| <section> | |||||
| <rule> | |||||
| <match> | |||||
| <AND> | |||||
| <NAME>.*:layout_height</NAME> | |||||
| <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE> | |||||
| </AND> | |||||
| </match> | |||||
| </rule> | |||||
| </section> | |||||
| <section> | |||||
| <rule> | |||||
| <match> | |||||
| <AND> | |||||
| <NAME>.*:layout_.*</NAME> | |||||
| <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE> | |||||
| </AND> | |||||
| </match> | |||||
| <order>BY_NAME</order> | |||||
| </rule> | |||||
| </section> | |||||
| <section> | |||||
| <rule> | |||||
| <match> | |||||
| <AND> | |||||
| <NAME>.*:width</NAME> | |||||
| <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE> | |||||
| </AND> | |||||
| </match> | |||||
| <order>BY_NAME</order> | |||||
| </rule> | |||||
| </section> | |||||
| <section> | |||||
| <rule> | |||||
| <match> | |||||
| <AND> | |||||
| <NAME>.*:height</NAME> | |||||
| <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE> | |||||
| </AND> | |||||
| </match> | |||||
| <order>BY_NAME</order> | |||||
| </rule> | |||||
| </section> | |||||
| <section> | |||||
| <rule> | |||||
| <match> | |||||
| <AND> | |||||
| <NAME>.*</NAME> | |||||
| <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE> | |||||
| </AND> | |||||
| </match> | |||||
| <order>BY_NAME</order> | |||||
| </rule> | |||||
| </section> | |||||
| <section> | |||||
| <rule> | |||||
| <match> | |||||
| <AND> | |||||
| <NAME>.*</NAME> | |||||
| <XML_NAMESPACE>.*</XML_NAMESPACE> | |||||
| </AND> | |||||
| </match> | |||||
| <order>BY_NAME</order> | |||||
| </rule> | |||||
| </section> | |||||
| </rules> | |||||
| </arrangement> | |||||
| </codeStyleSettings> | |||||
| </code_scheme> | |||||
| </component> |
| <component name="ProjectCodeStyleConfiguration"> | |||||
| <state> | |||||
| <option name="PREFERRED_PROJECT_CODE_STYLE" value="Default (1)" /> | |||||
| </state> | |||||
| </component> |
| <?xml version="1.0" encoding="UTF-8"?> | |||||
| <project version="4"> | |||||
| <component name="CompilerConfiguration"> | |||||
| <bytecodeTargetLevel target="9" /> | |||||
| </component> | |||||
| </project> |
| <component name="ProjectDictionaryState"> | |||||
| <dictionary name="xing" /> | |||||
| </component> |
| <?xml version="1.0" encoding="UTF-8"?> | |||||
| <project version="4"> | |||||
| <component name="Encoding" defaultCharsetForPropertiesFiles="UTF-8" addBOMForNewFiles="with NO BOM"> | |||||
| <file url="PROJECT" charset="UTF-8" /> | |||||
| </component> | |||||
| </project> |
| <?xml version="1.0" encoding="UTF-8"?> | |||||
| <project version="4"> | |||||
| <component name="GradleSettings"> | |||||
| <option name="linkedExternalProjectsSettings"> | |||||
| <GradleProjectSettings> | |||||
| <option name="distributionType" value="DEFAULT_WRAPPED" /> | |||||
| <option name="externalProjectPath" value="$PROJECT_DIR$" /> | |||||
| <option name="modules"> | |||||
| <set> | |||||
| <option value="$PROJECT_DIR$" /> | |||||
| <option value="$PROJECT_DIR$/app" /> | |||||
| <option value="$PROJECT_DIR$/tpmslibrary" /> | |||||
| </set> | |||||
| </option> | |||||
| <option name="resolveModulePerSourceSet" value="false" /> | |||||
| </GradleProjectSettings> | |||||
| </option> | |||||
| </component> | |||||
| </project> |
| <?xml version="1.0" encoding="UTF-8"?> | |||||
| <project version="4"> | |||||
| <component name="CMakeSettings"> | |||||
| <configurations> | |||||
| <configuration PROFILE_NAME="Debug" CONFIG_NAME="Debug" /> | |||||
| </configurations> | |||||
| </component> | |||||
| <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK"> | |||||
| <output url="file://$PROJECT_DIR$/build/classes" /> | |||||
| </component> | |||||
| <component name="ProjectType"> | |||||
| <option name="id" value="Android" /> | |||||
| </component> | |||||
| </project> |
| <?xml version="1.0" encoding="UTF-8"?> | |||||
| <project version="4"> | |||||
| <component name="RunConfigurationProducerService"> | |||||
| <option name="ignoredProducers"> | |||||
| <set> | |||||
| <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" /> | |||||
| <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" /> | |||||
| <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" /> | |||||
| </set> | |||||
| </option> | |||||
| </component> | |||||
| </project> |
| <?xml version="1.0" encoding="UTF-8"?> | |||||
| <project version="4"> | |||||
| <component name="VcsDirectoryMappings"> | |||||
| <mapping directory="$PROJECT_DIR$" vcs="Git" /> | |||||
| </component> | |||||
| </project> |
| # TPMS SDK instructions-Android | |||||
| [](https://jitpack.io/#elinkthings/TmpsSDKRepositoryAndroid) | |||||
| [aar package download address](https://github.com/elinkthings/TmpsSDKRepositoryAndroid/releases) | |||||
| [key registered address](http://sdk.aicare.net.cn) | |||||
| [中文文档](README_CN.md) | |||||
| This document is to guide Android developers to integrate TPMS-SDK-Android in Android 4.4 and above systems. | |||||
| ## 1. Conditions of use: | |||||
| 1. Android SDK minimum version android4.4 (API 19). | |||||
| 2. The Bluetooth version used by the device requires 4.0 or above. | |||||
| 3. Configure java1.8 | |||||
| 4. The project depends on the androidx library | |||||
| ## Second, import the SDK | |||||
| ``` | |||||
| repositories { | |||||
| flatDir { | |||||
| dirs 'libs' | |||||
| } | |||||
| } | |||||
| 1. Add the JitPack repository to your build file | |||||
| Add it to the root build.gradle at the end of the repository: | |||||
| allprojects { | |||||
| repositories { | |||||
| ... | |||||
| maven {url 'https://jitpack.io'} | |||||
| } | |||||
| } | |||||
| 2. Add dependencies | |||||
| dependencies { | |||||
| implementation 'com.github.elinkthings: TmpsSDKRepositoryAndroid: 1.2.2' // Bluetooth library | |||||
| } | |||||
| 3. Configure java1.8 in gradle | |||||
| android { | |||||
| ... | |||||
| compileOptions { | |||||
| sourceCompatibility 1.8 | |||||
| targetCompatibility 1.8 | |||||
| } | |||||
| } | |||||
| You can also use the aar package dependency, please download it yourself and put it in the project's libs, the download address is at the top of the document | |||||
| ``` | |||||
| ## Second, permission settings | |||||
| ``` | |||||
| <!-In most cases, you need to ensure that the device supports BLE .--> | |||||
| <uses-feature | |||||
| android: name = "android.hardware.bluetooth_le" | |||||
| android: required = "true" /> | |||||
| <uses-permission android: name = "android.permission.BLUETOOTH" /> | |||||
| <uses-permission android: name = "android.permission.BLUETOOTH_ADMIN" /> | |||||
| <!-Android 6.0 and above. Bluetooth scanning requires one of the following two permissions. You need to apply at run time .--> | |||||
| <uses-permission android: name = "android.permission.ACCESS_COARSE_LOCATION" /> | |||||
| <uses-permission android: name = "android.permission.ACCESS_FINE_LOCATION" /> | |||||
| <!-Optional. If your app need dfu function .--> | |||||
| <uses-permission android: name = "android.permission.INTERNET" /> | |||||
| ``` | |||||
| > 6.0 and above systems must locate permissions and need to manually obtain permissions | |||||
| ## Three, start integration | |||||
| ### 1, Initialization, [key registered address](http://sdk.aicare.net.cn) | |||||
| ``` | |||||
| TpmsSDK.init(this, key, secret); | |||||
| ``` | |||||
| ### 2, Implement the TpmsScan.TpmsScanListener method | |||||
| ``` | |||||
| TpmsScan mTpmsScan = new TpmsScan (new TpmsScan.TpmsScanListener () { | |||||
| @Override | |||||
| public void onGetData (String mac, String deviceId, int rssi, float pressure, float battery, int temp, int status, float mcuVersion, int year, int month, int day, float bleVersion) { | |||||
| } | |||||
| }); | |||||
| ``` | |||||
| ### 3, search for TpmsScan.startScan (String [] deviceIdS); | |||||
| ``` | |||||
| / ** | |||||
| * Search device, search all devices by default and return through TpmsScanListener interface | |||||
| * / | |||||
| TpmsScan.startScan () | |||||
| / ** | |||||
| * Search for devices, search for devices in the incoming device id array and return through the TpmsScanListener interface | |||||
| * | |||||
| * / | |||||
| TpmsScan.startScan (String [] deviceIdS) | |||||
| The found devices will be returned in onGetData (...) in the TpmsScan.TpmsScanListener interface | |||||
| ``` | |||||
| ### 4, Data analysis returned by the TpmsScan.TpmsScanListener interface | |||||
| ``` | |||||
| public void onGetData (String mac, String deviceId, int rssi, float pressure, float battery, int temp, int status, float mcuVersion, int year, int month, int day, float bleVersion); | |||||
| mac: device mac address | |||||
| deviceId: device id | |||||
| rssi: signal value | |||||
| pressure: air pressure | |||||
| battery: voltage | |||||
| temp: temperature | |||||
| status: status | |||||
| / ** | |||||
| * device status | |||||
| * / | |||||
| public enum DeviceState { | |||||
| / ** | |||||
| * Normal | |||||
| * / | |||||
| NORMAL, | |||||
| / ** | |||||
| * Leakage | |||||
| * / | |||||
| LEAK, | |||||
| / ** | |||||
| * Inflatable | |||||
| * / | |||||
| INFLATE, | |||||
| / ** | |||||
| * start up | |||||
| * / | |||||
| START, | |||||
| / ** | |||||
| * Power-on | |||||
| * / | |||||
| POWER_ON, | |||||
| / ** | |||||
| * Wake up | |||||
| * / | |||||
| WEAK_UP, | |||||
| / ** | |||||
| * Abnormal temperature | |||||
| * / | |||||
| TEMP_ERROR, | |||||
| / ** | |||||
| * Abnormal battery | |||||
| * / | |||||
| BATTERY_ERROR, | |||||
| / ** | |||||
| * Unknown | |||||
| * / | |||||
| UNKNOWN | |||||
| } | |||||
| mcuVersion: mcu version number | |||||
| year, month, day: date | |||||
| bleVersion: Bluetooth version number | |||||
| / ** | |||||
| * Equipment installation location | |||||
| * / | |||||
| public enum DevicePosition { | |||||
| / ** | |||||
| * Front left | |||||
| * / | |||||
| LEFT_FRONT, | |||||
| / ** | |||||
| * Rear left | |||||
| * / | |||||
| LEFT_REAR, | |||||
| / ** | |||||
| * Front right | |||||
| * / | |||||
| RIGHT_FRONT, | |||||
| / ** | |||||
| * right back | |||||
| * / | |||||
| RIGHT_REAR | |||||
| } | |||||
| ``` | |||||
| ### 5, stop searching TpmsScan.stopScan (); |
| # TPMS SDK使用说明 - Android | |||||
| [](https://jitpack.io/#elinkthings/TmpsSDKRepositoryAndroid) | |||||
| [aar包下载地址](https://github.com/elinkthings/TmpsSDKRepositoryAndroid/releases) | |||||
| [key注册地址](http://sdk.aicare.net.cn) | |||||
| [English documentation](README.md) | |||||
| 该文档为指导Android开发人员在Android 4.4及以上系统中集成TPMS-SDK-Android,主要为一些关键的使用示例 | |||||
| ## 一、使用条件: | |||||
| 1.Android SDK最低版本android4.4(API 19)。 | |||||
| 2.设备所使用蓝牙版本需要4.0及以上。 | |||||
| 3.配置java1.8 | |||||
| 4.项目依赖androidx库 | |||||
| ## 二、导入SDK | |||||
| ``` | |||||
| repositories { | |||||
| flatDir { | |||||
| dirs 'libs' | |||||
| } | |||||
| } | |||||
| 1.将JitPack存储库添加到您的构建文件中 | |||||
| 将其添加到存储库末尾的root build.gradle中: | |||||
| allprojects { | |||||
| repositories { | |||||
| ... | |||||
| maven { url 'https://jitpack.io' } | |||||
| } | |||||
| } | |||||
| 2.添加依赖项 | |||||
| dependencies { | |||||
| implementation 'com.github.elinkthings:TmpsSDKRepositoryAndroid:1.2.2'//蓝牙库 | |||||
| } | |||||
| 3.在gradle中配置java1.8 | |||||
| android { | |||||
| ... | |||||
| compileOptions { | |||||
| sourceCompatibility 1.8 | |||||
| targetCompatibility 1.8 | |||||
| } | |||||
| } | |||||
| 也可以使用aar包依赖,请自行下载放到项目的libs中,下载地址在文档顶部 | |||||
| ``` | |||||
| ## 二、权限设置 | |||||
| ``` | |||||
| <!--In most cases, you need to ensure that the device supports BLE.--> | |||||
| <uses-feature | |||||
| android:name="android.hardware.bluetooth_le" | |||||
| android:required="true"/> | |||||
| <uses-permission android:name="android.permission.BLUETOOTH"/> | |||||
| <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> | |||||
| <!--Android 6.0 and above. Bluetooth scanning requires one of the following two permissions. You need to apply at run time.--> | |||||
| <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> | |||||
| <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> | |||||
| <!--Optional. If your app need dfu function.--> | |||||
| <uses-permission android:name="android.permission.INTERNET"/> | |||||
| ``` | |||||
| > 6.0及以上系统必须要定位权限,且需要手动获取权限 | |||||
| ## 三、开始集成 | |||||
| ### 1,初始化,[key注册地址](http://sdk.aicare.net.cn) | |||||
| ``` | |||||
| booTpmsSDK.init(this,key,secret); | |||||
| ``` | |||||
| ### 2,实现TpmsScan.TpmsScanListener方法 | |||||
| ``` | |||||
| TpmsScan mTpmsScan = new TpmsScan(new TpmsScan.TpmsScanListener() { | |||||
| @Override | |||||
| public void onGetData(String mac, String deviceId, int rssi, float pressure, float battery,int temp, int status, float mcuVersion, int year, int month, int day,float bleVersion){ | |||||
| } | |||||
| }); | |||||
| ``` | |||||
| ### 3,搜索 TpmsScan.startScan(String[] deviceIdS); | |||||
| ``` | |||||
| /** | |||||
| * 搜索设备,默认搜索所有的设备并通过TpmsScanListener接口返回 | |||||
| */ | |||||
| TpmsScan.startScan() | |||||
| /** | |||||
| * 搜索设备,搜索传入的设备id数组的设备并通过TpmsScanListener接口返回 | |||||
| * | |||||
| */ | |||||
| TpmsScan.startScan(String[] deviceIdS) | |||||
| 搜索到的设备会在TpmsScan.TpmsScanListener接口中的onGetData(...)返回 | |||||
| ``` | |||||
| ### 4,TpmsScan.TpmsScanListener接口返回的数据解析 | |||||
| ``` | |||||
| public void onGetData(String mac, String deviceId, int rssi, float pressure, float battery,int temp, int status, float mcuVersion, int year, int month, int day,float bleVersion); | |||||
| mac:设备mac地址 | |||||
| deviceId:设备id | |||||
| rssi:信号值 | |||||
| pressure:气压 | |||||
| battery:电压 | |||||
| temp:温度 | |||||
| status:状态 | |||||
| /** | |||||
| * 设备状态 | |||||
| */ | |||||
| public enum DeviceState { | |||||
| /** | |||||
| * 正常 | |||||
| */ | |||||
| NORMAL, | |||||
| /** | |||||
| * 漏气 | |||||
| */ | |||||
| LEAK, | |||||
| /** | |||||
| * 充气 | |||||
| */ | |||||
| INFLATE, | |||||
| /** | |||||
| * 启动 | |||||
| */ | |||||
| START, | |||||
| /** | |||||
| * 上电 | |||||
| */ | |||||
| POWER_ON, | |||||
| /** | |||||
| * 唤醒 | |||||
| */ | |||||
| WEAK_UP, | |||||
| /** | |||||
| * 温度异常 | |||||
| */ | |||||
| TEMP_ERROR, | |||||
| /** | |||||
| * 电量异常 | |||||
| */ | |||||
| BATTERY_ERROR, | |||||
| /** | |||||
| * 未知 | |||||
| */ | |||||
| UNKNOWN | |||||
| } | |||||
| mcuVersion:mcu版本号 | |||||
| year,month,day :日期 | |||||
| bleVersion:蓝牙版本号 | |||||
| /** | |||||
| * 设备安装位置 | |||||
| */ | |||||
| public enum DevicePosition { | |||||
| /** | |||||
| * 左前 | |||||
| */ | |||||
| LEFT_FRONT, | |||||
| /** | |||||
| * 左后 | |||||
| */ | |||||
| LEFT_REAR, | |||||
| /** | |||||
| * 右前 | |||||
| */ | |||||
| RIGHT_FRONT, | |||||
| /** | |||||
| * 右后 | |||||
| */ | |||||
| RIGHT_REAR | |||||
| } | |||||
| ``` | |||||
| ### 5,停止搜索TpmsScan.stopScan(); |
| /build |
| apply plugin: 'com.android.application' | |||||
| android { | |||||
| compileSdkVersion 29 | |||||
| buildToolsVersion "29.0.2" | |||||
| defaultConfig { | |||||
| applicationId "aicare.net.cn.sdk.tmpsrepositoryandroid" | |||||
| minSdkVersion 19 | |||||
| targetSdkVersion 29 | |||||
| versionCode 1 | |||||
| versionName "1.0" | |||||
| testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" | |||||
| } | |||||
| buildTypes { | |||||
| release { | |||||
| minifyEnabled false | |||||
| proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' | |||||
| } | |||||
| } | |||||
| compileOptions { | |||||
| sourceCompatibility '1.8' | |||||
| targetCompatibility '1.8' | |||||
| } | |||||
| } | |||||
| dependencies { | |||||
| implementation fileTree(dir: 'libs', include: ['*.jar']) | |||||
| implementation 'androidx.appcompat:appcompat:1.1.0' | |||||
| implementation 'androidx.constraintlayout:constraintlayout:1.1.3' | |||||
| testImplementation 'junit:junit:4.12' | |||||
| androidTestImplementation 'androidx.test:runner:1.2.0' | |||||
| androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' | |||||
| implementation project(path: ':tpmslibrary') | |||||
| } |
| # 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 |
| package aicare.net.cn.sdk.tmpsrepositoryandroid; | |||||
| import android.content.Context; | |||||
| import org.junit.Test; | |||||
| import org.junit.runner.RunWith; | |||||
| import androidx.test.InstrumentationRegistry; | |||||
| import androidx.test.runner.AndroidJUnit4; | |||||
| import static org.junit.Assert.assertEquals; | |||||
| /** | |||||
| * Instrumented test, which will execute on an Android device. | |||||
| * | |||||
| * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> | |||||
| */ | |||||
| @RunWith(AndroidJUnit4.class) | |||||
| public class ExampleInstrumentedTest { | |||||
| @Test | |||||
| public void useAppContext() { | |||||
| // Context of the app under test. | |||||
| Context appContext = InstrumentationRegistry.getTargetContext(); | |||||
| assertEquals("aicare.net.cn.sdk.tmpsrepositoryandroid", appContext.getPackageName()); | |||||
| } | |||||
| } |
| <?xml version="1.0" encoding="utf-8"?> | |||||
| <manifest package="aicare.net.cn.sdk.tmpsrepositoryandroid" | |||||
| xmlns:android="http://schemas.android.com/apk/res/android"> | |||||
| <uses-permission android:name="android.permission.BLUETOOTH"/> | |||||
| <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> | |||||
| <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> | |||||
| <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> | |||||
| <application | |||||
| android:allowBackup="true" | |||||
| android:icon="@mipmap/ic_launcher" | |||||
| android:label="@string/app_name" | |||||
| android:roundIcon="@mipmap/ic_launcher_round" | |||||
| android:supportsRtl="true" | |||||
| android:theme="@style/AppTheme"> | |||||
| <activity android:name=".MainActivity"> | |||||
| <intent-filter> | |||||
| <action android:name="android.intent.action.MAIN"/> | |||||
| <category android:name="android.intent.category.LAUNCHER"/> | |||||
| </intent-filter> | |||||
| </activity> | |||||
| </application> | |||||
| </manifest> |
| package aicare.net.cn.sdk.tmpsrepositoryandroid; | |||||
| import android.bluetooth.BluetoothAdapter; | |||||
| import android.content.Intent; | |||||
| import android.os.Bundle; | |||||
| import android.os.Handler; | |||||
| import android.os.Message; | |||||
| import android.text.TextUtils; | |||||
| import android.view.View; | |||||
| import android.widget.ArrayAdapter; | |||||
| import android.widget.Button; | |||||
| import android.widget.LinearLayout; | |||||
| import android.widget.ListView; | |||||
| import android.widget.TextView; | |||||
| import com.pingwang.tpmslibrary.TpmsSDK; | |||||
| import com.pingwang.tpmslibrary.TpmsScan; | |||||
| import java.util.ArrayList; | |||||
| import java.util.EnumMap; | |||||
| import java.util.List; | |||||
| import java.util.Set; | |||||
| import aicare.net.cn.sdk.tmpsrepositoryandroid.utils.Config; | |||||
| import aicare.net.cn.sdk.tmpsrepositoryandroid.utils.Configs; | |||||
| import aicare.net.cn.sdk.tmpsrepositoryandroid.utils.L; | |||||
| import aicare.net.cn.sdk.tmpsrepositoryandroid.utils.ParseData; | |||||
| import aicare.net.cn.sdk.tmpsrepositoryandroid.utils.SPUtils; | |||||
| import aicare.net.cn.sdk.tmpsrepositoryandroid.utils.T; | |||||
| import aicare.net.cn.sdk.tmpsrepositoryandroid.views.SetIdDialog; | |||||
| import androidx.appcompat.app.AppCompatActivity; | |||||
| public class MainActivity extends AppCompatActivity implements View.OnClickListener, | |||||
| TpmsScan.TpmsScanListener, OnIdSetListener { | |||||
| private Button btn_get_info, btn_clear_log, btn_stop_scan; | |||||
| private TextView tv_left_front, tv_right_front, tv_left_rear, tv_right_rear; | |||||
| private ListView lv_show_log; | |||||
| private LinearLayout ll_set_id; | |||||
| private String leftFront, rightFront, leftRear, rightRear; | |||||
| private List<String> infoList; | |||||
| private ArrayAdapter listAdapter; | |||||
| private TpmsScan mTpmsScan; | |||||
| private EnumMap<Config.DevicePosition, String> deviceIdMap; | |||||
| private String[] mDeviceIdS; | |||||
| @Override | |||||
| protected void onCreate(Bundle savedInstanceState) { | |||||
| super.onCreate(savedInstanceState); | |||||
| setContentView(R.layout.activity_main); | |||||
| TpmsSDK.init(this, "f36120b9dc0c042e", "00bb9f124ea3de327ed54cfa3e"); | |||||
| L.isDebug = true; | |||||
| initData(); | |||||
| initViews(); | |||||
| initEvents(); | |||||
| } | |||||
| @Override | |||||
| protected void onResume() { | |||||
| super.onResume(); | |||||
| if (mTpmsScan != null) { | |||||
| if (!BluetoothAdapter.getDefaultAdapter().isEnabled()) { | |||||
| showBLEDialog(); | |||||
| } | |||||
| } | |||||
| } | |||||
| private void initData() { | |||||
| infoList = new ArrayList<>(); | |||||
| deviceIdMap = new EnumMap<>(Config.DevicePosition.class); | |||||
| setDeviceIdMap(); | |||||
| mTpmsScan = new TpmsScan(MainActivity.this); | |||||
| } | |||||
| private void setDeviceIdMap() { | |||||
| leftFront = (String) SPUtils.get(this, Configs.LEFT_FRONT, ""); | |||||
| leftRear = (String) SPUtils.get(this, Configs.LEFT_REAR, ""); | |||||
| rightFront = (String) SPUtils.get(this, Configs.RIGHT_FRONT, ""); | |||||
| rightRear = (String) SPUtils.get(this, Configs.RIGHT_REAR, ""); | |||||
| deviceIdMap.put(Config.DevicePosition.LEFT_FRONT, leftFront); | |||||
| deviceIdMap.put(Config.DevicePosition.LEFT_REAR, leftRear); | |||||
| deviceIdMap.put(Config.DevicePosition.RIGHT_FRONT, rightFront); | |||||
| deviceIdMap.put(Config.DevicePosition.RIGHT_REAR, rightRear); | |||||
| } | |||||
| private void initViews() { | |||||
| btn_stop_scan = (Button) findViewById(R.id.btn_stop_scan); | |||||
| btn_get_info = (Button) findViewById(R.id.btn_get_info); | |||||
| btn_clear_log = (Button) findViewById(R.id.btn_clear_log); | |||||
| tv_left_front = (TextView) findViewById(R.id.tv_left_front); | |||||
| tv_right_front = (TextView) findViewById(R.id.tv_right_front); | |||||
| tv_left_rear = (TextView) findViewById(R.id.tv_left_rear); | |||||
| tv_right_rear = (TextView) findViewById(R.id.tv_right_rear); | |||||
| setTyreId(); | |||||
| ll_set_id = (LinearLayout) findViewById(R.id.ll_set_id); | |||||
| lv_show_log = (ListView) findViewById(R.id.lv_show_log); | |||||
| listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, infoList); | |||||
| lv_show_log.setAdapter(listAdapter); | |||||
| } | |||||
| private void setTyreId() { | |||||
| if (TextUtils.isEmpty(leftFront)) { | |||||
| tv_left_front.setText(R.string.please_set_id); | |||||
| } else { | |||||
| tv_left_front.setText(String | |||||
| .format(getResources().getString(R.string.left_front_id), leftFront)); | |||||
| } | |||||
| if (TextUtils.isEmpty(rightFront)) { | |||||
| tv_right_front.setText(R.string.please_set_id); | |||||
| } else { | |||||
| tv_right_front.setText(String | |||||
| .format(getResources().getString(R.string.right_front_id), rightFront)); | |||||
| } | |||||
| if (TextUtils.isEmpty(leftRear)) { | |||||
| tv_left_rear.setText(R.string.please_set_id); | |||||
| } else { | |||||
| tv_left_rear.setText(String | |||||
| .format(getResources().getString(R.string.left_rear_id), leftRear)); | |||||
| } | |||||
| if (TextUtils.isEmpty(rightRear)) { | |||||
| tv_right_rear.setText(R.string.please_set_id); | |||||
| } else { | |||||
| tv_right_rear.setText(String | |||||
| .format(getResources().getString(R.string.right_rear_id), rightRear)); | |||||
| } | |||||
| } | |||||
| private void initEvents() { | |||||
| btn_stop_scan.setOnClickListener(this); | |||||
| btn_get_info.setOnClickListener(this); | |||||
| btn_clear_log.setOnClickListener(this); | |||||
| ll_set_id.setOnClickListener(this); | |||||
| } | |||||
| private static final int REQUEST_ENABLE_BT = 2; | |||||
| private void showBLEDialog() { | |||||
| final Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); | |||||
| startActivityForResult(enableIntent, REQUEST_ENABLE_BT); | |||||
| } | |||||
| @Override | |||||
| protected void onDestroy() { | |||||
| super.onDestroy(); | |||||
| if (mTpmsScan != null) { | |||||
| mTpmsScan.stopScan(); | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onClick(View v) { | |||||
| switch (v.getId()) { | |||||
| case R.id.btn_stop_scan: | |||||
| if (mTpmsScan != null) { | |||||
| mTpmsScan.stopScan(); | |||||
| } | |||||
| break; | |||||
| case R.id.btn_get_info: | |||||
| if (deviceIdMap.isEmpty() || noId()) { | |||||
| T.showLong(this, R.string.please_set_id); | |||||
| } else { | |||||
| if (mTpmsScan != null && deviceIdMap != null) { | |||||
| mDeviceIdS = null; | |||||
| if (getUuidStrings()) { | |||||
| mTpmsScan.startScan(mDeviceIdS); | |||||
| } | |||||
| } | |||||
| } | |||||
| break; | |||||
| case R.id.btn_clear_log: | |||||
| infoList.clear(); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| break; | |||||
| case R.id.ll_set_id: | |||||
| new SetIdDialog(this, deviceIdMap, this).show(); | |||||
| break; | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onGetData(String mac, String deviceId, int rssi, float pressure, float battery, | |||||
| int temp, int status, float mcuVersion, int year, int month, int day, | |||||
| float bleVersion) { | |||||
| if (deviceIdMap != null) { | |||||
| for (Config.DevicePosition devicePosition : deviceIdMap.keySet()) { | |||||
| if (TextUtils.equals(deviceId, deviceIdMap.get(devicePosition))) { | |||||
| Config.DeviceState deviceState = Config.DeviceState.NORMAL; | |||||
| switch (status) { | |||||
| case 1: | |||||
| deviceState = Config.DeviceState.LEAK; | |||||
| break; | |||||
| case 2: | |||||
| deviceState = Config.DeviceState.INFLATE; | |||||
| break; | |||||
| case 3: | |||||
| deviceState = Config.DeviceState.START; | |||||
| break; | |||||
| case 4: | |||||
| deviceState = Config.DeviceState.POWER_ON; | |||||
| break; | |||||
| case 5: | |||||
| deviceState = Config.DeviceState.WEAK_UP; | |||||
| break; | |||||
| } | |||||
| StringBuffer buffer = new StringBuffer(); | |||||
| buffer.append("设备位置:"); | |||||
| buffer.append(getPosition(devicePosition)); | |||||
| buffer.append(", 设备id:"); | |||||
| buffer.append(deviceId); | |||||
| buffer.append(", 电压:"); | |||||
| buffer.append(battery); | |||||
| buffer.append(", 气压:"); | |||||
| buffer.append(pressure); | |||||
| buffer.append(", 温度:"); | |||||
| buffer.append(temp); | |||||
| buffer.append(", 状态:"); | |||||
| buffer.append(getState(deviceState)); | |||||
| buffer.append(", 时间:"); | |||||
| buffer.append(ParseData.getTime()); | |||||
| sendMsg(buffer.toString()); | |||||
| return; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| public void onStopScan() { | |||||
| sendMsg("停止扫描"); | |||||
| } | |||||
| public void onBluetoothStateOn() { | |||||
| T.showLong(this, "蓝牙已开启!"); | |||||
| } | |||||
| public void onBluetoothStateOff() { | |||||
| T.showLong(this, "蓝牙已关闭!"); | |||||
| } | |||||
| public void onBluetoothTurningOn() { | |||||
| T.showLong(this, "蓝牙开启中!"); | |||||
| } | |||||
| public void onBluetoothTurningOff() { | |||||
| T.showLong(this, "蓝牙关闭中!"); | |||||
| } | |||||
| private String getPosition(Config.DevicePosition devicePosition) { | |||||
| switch (devicePosition) { | |||||
| case LEFT_FRONT: | |||||
| return "左前"; | |||||
| case RIGHT_FRONT: | |||||
| return "右前"; | |||||
| case LEFT_REAR: | |||||
| return "左后"; | |||||
| case RIGHT_REAR: | |||||
| return "右后"; | |||||
| default: | |||||
| return ""; | |||||
| } | |||||
| } | |||||
| private String getState(Config.DeviceState deviceState) { | |||||
| switch (deviceState) { | |||||
| case NORMAL: | |||||
| return "正常"; | |||||
| case LEAK: | |||||
| return "漏气"; | |||||
| case INFLATE: | |||||
| return "充气"; | |||||
| case START: | |||||
| return "启动"; | |||||
| case POWER_ON: | |||||
| return "上电"; | |||||
| case WEAK_UP: | |||||
| return "唤醒"; | |||||
| case TEMP_ERROR: | |||||
| return "温度异常"; | |||||
| case BATTERY_ERROR: | |||||
| return "电量异常"; | |||||
| case UNKNOWN: | |||||
| return "未知"; | |||||
| default: | |||||
| return ""; | |||||
| } | |||||
| } | |||||
| @Override | |||||
| public void onIdSet() { | |||||
| setDeviceIdMap(); | |||||
| if (noId()) { | |||||
| if (mTpmsScan != null) { | |||||
| mTpmsScan.stopScan(); | |||||
| } | |||||
| } | |||||
| setTyreId(); | |||||
| } | |||||
| @Override | |||||
| public void cancel() { | |||||
| if (mTpmsScan != null) { | |||||
| mTpmsScan.stopScan(); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * 没有设置ID重新扫描 | |||||
| */ | |||||
| private boolean noId() { | |||||
| if (deviceIdMap != null && !deviceIdMap.isEmpty()) { | |||||
| if (TextUtils.isEmpty(deviceIdMap.get(Config.DevicePosition.LEFT_FRONT)) && TextUtils | |||||
| .isEmpty(deviceIdMap.get(Config.DevicePosition.LEFT_REAR)) && TextUtils | |||||
| .isEmpty(deviceIdMap.get(Config.DevicePosition.RIGHT_FRONT)) && TextUtils | |||||
| .isEmpty(deviceIdMap.get(Config.DevicePosition.RIGHT_REAR))) {//当所有ID都为空时,停止扫描 | |||||
| return true; | |||||
| } | |||||
| } | |||||
| return false; | |||||
| } | |||||
| private void showInfo(String str) { | |||||
| StringBuilder stringBuilder = new StringBuilder(); | |||||
| stringBuilder.append(infoList.size() + 1); | |||||
| stringBuilder.append(".\n"); | |||||
| stringBuilder.append(str); | |||||
| infoList.add(stringBuilder.toString()); | |||||
| listAdapter.notifyDataSetChanged(); | |||||
| lv_show_log.setSelection(infoList.size() - 1); | |||||
| } | |||||
| private Handler handler = new android.os.Handler() { | |||||
| @Override | |||||
| public void handleMessage(Message msg) { | |||||
| String result = msg.getData().getString(RESULT); | |||||
| if (!TextUtils.isEmpty(result)) { | |||||
| showInfo(result); | |||||
| } | |||||
| } | |||||
| }; | |||||
| private final static String RESULT = "RESULT"; | |||||
| private void sendMsg(String str) { | |||||
| Message msg = new Message(); | |||||
| Bundle bundle = new Bundle(); | |||||
| bundle.putString(RESULT, str); | |||||
| msg.setData(bundle); | |||||
| handler.sendMessage(msg); | |||||
| } | |||||
| private boolean getUuidStrings() { | |||||
| if (deviceIdMap != null) { | |||||
| Set<Config.DevicePosition> devicePositions = deviceIdMap.keySet(); | |||||
| mDeviceIdS = new String[devicePositions.size()]; | |||||
| int i = 0; | |||||
| for (Config.DevicePosition devicePosition : devicePositions) { | |||||
| mDeviceIdS[i] = deviceIdMap.get(devicePosition); | |||||
| i++; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| return false; | |||||
| } | |||||
| } |
| package aicare.net.cn.sdk.tmpsrepositoryandroid; | |||||
| /** | |||||
| * xing<br> | |||||
| * 2019/10/8<br> | |||||
| * java类作用描述 | |||||
| */ | |||||
| public interface OnIdSetListener { | |||||
| void onIdSet(); | |||||
| void cancel(); | |||||
| } |
| package aicare.net.cn.sdk.tmpsrepositoryandroid.adapter; | |||||
| import android.content.Context; | |||||
| import android.view.LayoutInflater; | |||||
| import android.view.View; | |||||
| import android.view.ViewGroup; | |||||
| import android.widget.BaseAdapter; | |||||
| import android.widget.TextView; | |||||
| import java.util.List; | |||||
| import aicare.net.cn.sdk.tmpsrepositoryandroid.R; | |||||
| import aicare.net.cn.sdk.tmpsrepositoryandroid.bean.DeviceId; | |||||
| /** | |||||
| * Created by Suzy on 2016/8/30. | |||||
| */ | |||||
| public class DeviceIdAdapter extends BaseAdapter { | |||||
| private List<DeviceId> deviceIds; | |||||
| private Context context; | |||||
| public DeviceIdAdapter(Context context, List<DeviceId> deviceIds) { | |||||
| this.context = context; | |||||
| this.deviceIds = deviceIds; | |||||
| } | |||||
| @Override | |||||
| public int getCount() { | |||||
| return deviceIds.size(); | |||||
| } | |||||
| @Override | |||||
| public Object getItem(int position) { | |||||
| return deviceIds.get(position); | |||||
| } | |||||
| @Override | |||||
| public long getItemId(int position) { | |||||
| return position; | |||||
| } | |||||
| @Override | |||||
| public View getView(int position, View convertView, ViewGroup parent) { | |||||
| ViewHolder viewHolder; | |||||
| if (convertView == null) { | |||||
| viewHolder = new ViewHolder(); | |||||
| convertView = LayoutInflater.from(context).inflate(R.layout.device_id_item, null); | |||||
| viewHolder.tv_device_id = (TextView) convertView.findViewById(R.id.tv_device_id); | |||||
| viewHolder.tv_count = (TextView) convertView.findViewById(R.id.tv_count); | |||||
| convertView.setTag(viewHolder); | |||||
| } | |||||
| viewHolder = (ViewHolder) convertView.getTag(); | |||||
| setValues(viewHolder, position); | |||||
| return convertView; | |||||
| } | |||||
| private void setValues(ViewHolder viewHolder, int position) { | |||||
| viewHolder.tv_device_id.setText("设备ID:" + deviceIds.get(position).getDeviceId()); | |||||
| viewHolder.tv_count.setText("次数:" + deviceIds.get(position).getCount()); | |||||
| } | |||||
| private class ViewHolder { | |||||
| private TextView tv_device_id; | |||||
| private TextView tv_count; | |||||
| } | |||||
| } |
| package aicare.net.cn.sdk.tmpsrepositoryandroid.bean; | |||||
| /** | |||||
| * Created by Suzy on 2016/8/30. | |||||
| */ | |||||
| public class DeviceId { | |||||
| private String deviceId; | |||||
| private int count; | |||||
| public DeviceId(String deviceId, int count) { | |||||
| this.deviceId = deviceId; | |||||
| this.count = count; | |||||
| } | |||||
| public DeviceId() { | |||||
| } | |||||
| public String getDeviceId() { | |||||
| return deviceId; | |||||
| } | |||||
| public void setDeviceId(String deviceId) { | |||||
| this.deviceId = deviceId; | |||||
| } | |||||
| public int getCount() { | |||||
| return count; | |||||
| } | |||||
| public void setCount(int count) { | |||||
| this.count = count; | |||||
| } | |||||
| @Override | |||||
| public String toString() { | |||||
| return "DeviceId{" + | |||||
| "deviceId='" + deviceId + '\'' + | |||||
| ", count=" + count + | |||||
| '}'; | |||||
| } | |||||
| } |
| package aicare.net.cn.sdk.tmpsrepositoryandroid.utils; | |||||
| /** | |||||
| * Created by Suzy on 2016/2/22. | |||||
| */ | |||||
| public class Config { | |||||
| /** | |||||
| * 设备安装位置 | |||||
| */ | |||||
| public enum DevicePosition { | |||||
| /** | |||||
| * 左前 | |||||
| */ | |||||
| LEFT_FRONT, | |||||
| /** | |||||
| * 左后 | |||||
| */ | |||||
| LEFT_REAR, | |||||
| /** | |||||
| * 右前 | |||||
| */ | |||||
| RIGHT_FRONT, | |||||
| /** | |||||
| * 右后 | |||||
| */ | |||||
| RIGHT_REAR | |||||
| } | |||||
| /** | |||||
| * 设备状态 | |||||
| */ | |||||
| public enum DeviceState { | |||||
| /** | |||||
| * 正常 | |||||
| */ | |||||
| NORMAL, | |||||
| /** | |||||
| * 漏气 | |||||
| */ | |||||
| LEAK, | |||||
| /** | |||||
| * 充气 | |||||
| */ | |||||
| INFLATE, | |||||
| /** | |||||
| * 启动 | |||||
| */ | |||||
| START, | |||||
| /** | |||||
| * 上电 | |||||
| */ | |||||
| POWER_ON, | |||||
| /** | |||||
| * 唤醒 | |||||
| */ | |||||
| WEAK_UP, | |||||
| /** | |||||
| * 温度异常 | |||||
| */ | |||||
| TEMP_ERROR, | |||||
| /** | |||||
| * 电量异常 | |||||
| */ | |||||
| BATTERY_ERROR, | |||||
| /** | |||||
| * 未知 | |||||
| */ | |||||
| UNKNOWN | |||||
| } | |||||
| } |
| package aicare.net.cn.sdk.tmpsrepositoryandroid.utils; | |||||
| /** | |||||
| * Created by Suzy on 2016/7/23. | |||||
| */ | |||||
| public class Configs { | |||||
| public final static String LEFT_FRONT = "LEFT_FRONT"; | |||||
| public final static String LEFT_REAR = "LEFT_REAR"; | |||||
| public final static String RIGHT_FRONT = "RIGHT_FRONT"; | |||||
| public final static String RIGHT_REAR = "RIGHT_REAR"; | |||||
| } |
| package aicare.net.cn.sdk.tmpsrepositoryandroid.utils; | |||||
| import android.util.Log; | |||||
| /** | |||||
| * Log统一管理类 | |||||
| * | |||||
| * @author way | |||||
| */ | |||||
| public class L { | |||||
| public static boolean isDebug = false;// 是否需要打印bug,可以在application的onCreate函数里面初始化 | |||||
| private static final String TAG = "iTpmsServices"; | |||||
| // 下面四个是默认tag的函数 | |||||
| public static void i(String msg) { | |||||
| if (isDebug) | |||||
| Log.i(TAG, msg); | |||||
| } | |||||
| public static void iAndTag(String tag, String msg) { | |||||
| if (isDebug) | |||||
| Log.i(tag, msg); | |||||
| } | |||||
| public static void d(String msg) { | |||||
| if (isDebug) | |||||
| Log.d(TAG, msg); | |||||
| } | |||||
| public static void e(String msg) { | |||||
| if (isDebug) | |||||
| Log.e(TAG, msg); | |||||
| } | |||||
| public static void v(String msg) { | |||||
| if (isDebug) | |||||
| Log.v(TAG, msg); | |||||
| } | |||||
| //下面是传入类名打印log | |||||
| public static void i(Class<?> _class, String msg) { | |||||
| if (isDebug) | |||||
| Log.i(_class.getName(), msg); | |||||
| } | |||||
| public static void d(Class<?> _class, String msg) { | |||||
| if (isDebug) | |||||
| Log.d(_class.getName(), msg); | |||||
| } | |||||
| public static void e(Class<?> _class, String msg) { | |||||
| if (isDebug) | |||||
| Log.e(_class.getName(), msg); | |||||
| } | |||||
| public static void v(Class<?> _class, String msg) { | |||||
| if (isDebug) | |||||
| Log.v(_class.getName(), msg); | |||||
| } | |||||
| // 下面是传入自定义tag的函数 | |||||
| public static void i(String tag, String msg) { | |||||
| if (isDebug) | |||||
| Log.i(tag, msg); | |||||
| } | |||||
| public static void d(String tag, String msg) { | |||||
| if (isDebug) | |||||
| Log.d(tag, msg); | |||||
| } | |||||
| public static void e(String tag, String msg) { | |||||
| if (isDebug) | |||||
| Log.e(tag, msg); | |||||
| } | |||||
| public static void v(String tag, String msg) { | |||||
| if (isDebug) | |||||
| Log.v(tag, msg); | |||||
| } | |||||
| } |
| package aicare.net.cn.sdk.tmpsrepositoryandroid.utils; | |||||
| import java.math.BigDecimal; | |||||
| import java.text.SimpleDateFormat; | |||||
| import java.util.Date; | |||||
| import java.util.regex.Matcher; | |||||
| import java.util.regex.Pattern; | |||||
| public class ParseData { | |||||
| private final static String TAG = ParseData.class.getSimpleName(); | |||||
| /** | |||||
| * byte转16进制 | |||||
| * | |||||
| * @param b | |||||
| * @return | |||||
| */ | |||||
| public static String binaryToHex(byte b) { | |||||
| String str = byteToBit(b); | |||||
| String hexStr = Integer.toHexString(Integer.parseInt(str, 2)); | |||||
| return hexStr.toUpperCase(); | |||||
| } | |||||
| /** | |||||
| * Byte转Bit | |||||
| */ | |||||
| public static String byteToBit(byte b) { | |||||
| return "" + (byte) ((b >> 7) & 0x1) + (byte) ((b >> 6) & 0x1) | |||||
| + (byte) ((b >> 5) & 0x1) + (byte) ((b >> 4) & 0x1) | |||||
| + (byte) ((b >> 3) & 0x1) + (byte) ((b >> 2) & 0x1) | |||||
| + (byte) ((b >> 1) & 0x1) + (byte) ((b >> 0) & 0x1); | |||||
| } | |||||
| /** | |||||
| * byte转十进制 | |||||
| * | |||||
| * @param b | |||||
| * @return | |||||
| */ | |||||
| public static int binaryToDecimal(byte b) { | |||||
| String str = byteToBit(b); | |||||
| return Integer.parseInt(str, 2); | |||||
| } | |||||
| /** | |||||
| * 字符串长度等于1的话,补0 | |||||
| * | |||||
| * @param str | |||||
| * @return | |||||
| */ | |||||
| public static String addZero(String str) { | |||||
| StringBuffer sBuffer = new StringBuffer(); | |||||
| if (str.length() == 1) { | |||||
| sBuffer.append("0"); | |||||
| sBuffer.append(str); | |||||
| return sBuffer.toString(); | |||||
| } else { | |||||
| return str; | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Bit转Byte | |||||
| */ | |||||
| public static byte bitToByte(String byteStr) { | |||||
| int re, len; | |||||
| if (null == byteStr) { | |||||
| return 0; | |||||
| } | |||||
| len = byteStr.length(); | |||||
| if (len != 4 && len != 8) { | |||||
| return 0; | |||||
| } | |||||
| if (len == 8) {// 8 bit处理 | |||||
| if (byteStr.charAt(0) == '0') {// 正数 | |||||
| re = Integer.parseInt(byteStr, 2); | |||||
| } else {// 负数 | |||||
| re = Integer.parseInt(byteStr, 2) - 256; | |||||
| } | |||||
| } else {//4 bit处理 | |||||
| re = Integer.parseInt(byteStr, 2); | |||||
| } | |||||
| return (byte) re; | |||||
| } | |||||
| // 获取系统时间 | |||||
| public static String getTime() { | |||||
| SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss"); | |||||
| Date curDate = new Date(System.currentTimeMillis()); | |||||
| String str = formatter.format(curDate); | |||||
| return str; | |||||
| } | |||||
| /** | |||||
| * 从一个byte[]数组中截取一部分 | |||||
| * @param src | |||||
| * @param begin | |||||
| * @param count | |||||
| * @return | |||||
| */ | |||||
| public static byte[] subBytes(byte[] src, int begin, int count) { | |||||
| byte[] bs = new byte[count]; | |||||
| for (int i=begin; i<begin+count; i++) bs[i-begin] = src[i]; | |||||
| return bs; | |||||
| } | |||||
| /** | |||||
| * 解析数据 | |||||
| * | |||||
| * @param b1 | |||||
| * @param b2 | |||||
| * @return | |||||
| */ | |||||
| public static int getData(byte b1, byte b2) { | |||||
| int data = ((b1 & 0xFF)) + (b2 & 0xFF); | |||||
| return data; | |||||
| } | |||||
| /** | |||||
| * 保留小数点后count位 | |||||
| * @param d | |||||
| * @param count | |||||
| * @return | |||||
| */ | |||||
| public static double keepDecimal(double d, int count) { | |||||
| BigDecimal decimal = new BigDecimal(d); | |||||
| return decimal.setScale(count, BigDecimal.ROUND_HALF_UP).doubleValue(); | |||||
| } | |||||
| /** | |||||
| * 判断是不是正确的设备ID | |||||
| * @param str | |||||
| * @return | |||||
| */ | |||||
| public static boolean isDeviceId(String str) { | |||||
| String upperCaseStr = str.toUpperCase(); | |||||
| switch (upperCaseStr.length()) { | |||||
| case 5: | |||||
| if (is0or1(upperCaseStr.substring(0, 1))) { | |||||
| if (isHex(upperCaseStr.substring(1, upperCaseStr.length()))) { | |||||
| return true; | |||||
| } | |||||
| } | |||||
| break; | |||||
| case 6: | |||||
| if (isHex(upperCaseStr)) { | |||||
| return true; | |||||
| } | |||||
| } | |||||
| return false; | |||||
| } | |||||
| /** | |||||
| * 验证是否为16进制数 | |||||
| * | |||||
| * @param hex | |||||
| * @return | |||||
| */ | |||||
| private static boolean isHex(String hex) { | |||||
| String str = "^[A-Fa-f0-9]+$"; | |||||
| Pattern p = Pattern.compile(str); | |||||
| Matcher m = p.matcher(hex); | |||||
| return m.matches(); | |||||
| } | |||||
| /** | |||||
| * 验证是否是0或1 | |||||
| * | |||||
| * @param numStr | |||||
| * @return | |||||
| */ | |||||
| private static boolean is0or1(String numStr) { | |||||
| String str = "^[0-1]*$"; | |||||
| Pattern p = Pattern.compile(str); | |||||
| Matcher m = p.matcher(numStr); | |||||
| return m.matches(); | |||||
| } | |||||
| /** | |||||
| * byte数组转string | |||||
| * | |||||
| * @param b | |||||
| * @return | |||||
| */ | |||||
| public static String arr2Str(byte[] b) { | |||||
| if (b == null) { | |||||
| return null; | |||||
| } | |||||
| if (b.length == 0) { | |||||
| return "[]"; | |||||
| } | |||||
| StringBuffer buffer = new StringBuffer(); | |||||
| buffer.append("["); | |||||
| for (int i = 0; i < b.length; i++) { | |||||
| buffer.append(binaryToHex(b[i])); | |||||
| if (i != b.length - 1) { | |||||
| buffer.append(", "); | |||||
| } | |||||
| } | |||||
| buffer.append("]"); | |||||
| return buffer.toString(); | |||||
| } | |||||
| } |
| package aicare.net.cn.sdk.tmpsrepositoryandroid.utils; | |||||
| import android.content.Context; | |||||
| import android.content.SharedPreferences; | |||||
| import java.lang.reflect.InvocationTargetException; | |||||
| import java.lang.reflect.Method; | |||||
| import java.util.Map; | |||||
| public class SPUtils { | |||||
| public SPUtils() { | |||||
| /* cannot be instantiated */ | |||||
| throw new UnsupportedOperationException("cannot be instantiated"); | |||||
| } | |||||
| /** | |||||
| * 保存在手机里面的文件名 | |||||
| */ | |||||
| public static final String FILE_NAME = "share_data"; | |||||
| /** | |||||
| * 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法 | |||||
| * | |||||
| * @param context | |||||
| * @param key | |||||
| * @param object | |||||
| */ | |||||
| public static void put(Context context, String key, Object object) { | |||||
| SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE); | |||||
| SharedPreferences.Editor editor = sp.edit(); | |||||
| if (object instanceof String) { | |||||
| editor.putString(key, (String) object); | |||||
| } else if (object instanceof Integer) { | |||||
| editor.putInt(key, (Integer) object); | |||||
| } else if (object instanceof Boolean) { | |||||
| editor.putBoolean(key, (Boolean) object); | |||||
| } else if (object instanceof Float) { | |||||
| editor.putFloat(key, (Float) object); | |||||
| } else if (object instanceof Long) { | |||||
| editor.putLong(key, (Long) object); | |||||
| } else { | |||||
| editor.putString(key, object.toString()); | |||||
| } | |||||
| SharedPreferencesCompat.apply(editor); | |||||
| } | |||||
| /** | |||||
| * 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值 | |||||
| * | |||||
| * @param context | |||||
| * @param key | |||||
| * @param defaultObject | |||||
| * @return | |||||
| */ | |||||
| public static Object get(Context context, String key, Object defaultObject) { | |||||
| SharedPreferences sp = context.getSharedPreferences(FILE_NAME, | |||||
| Context.MODE_PRIVATE); | |||||
| if (defaultObject instanceof String) { | |||||
| return sp.getString(key, (String) defaultObject); | |||||
| } else if (defaultObject instanceof Integer) { | |||||
| return sp.getInt(key, (Integer) defaultObject); | |||||
| } else if (defaultObject instanceof Boolean) { | |||||
| return sp.getBoolean(key, (Boolean) defaultObject); | |||||
| } else if (defaultObject instanceof Float) { | |||||
| return sp.getFloat(key, (Float) defaultObject); | |||||
| } else if (defaultObject instanceof Long) { | |||||
| return sp.getLong(key, (Long) defaultObject); | |||||
| } | |||||
| return null; | |||||
| } | |||||
| /** | |||||
| * 移除某个key值已经对应的值 | |||||
| * | |||||
| * @param context | |||||
| * @param key | |||||
| */ | |||||
| public static void remove(Context context, String key) { | |||||
| SharedPreferences sp = context.getSharedPreferences(FILE_NAME, | |||||
| Context.MODE_PRIVATE); | |||||
| SharedPreferences.Editor editor = sp.edit(); | |||||
| editor.remove(key); | |||||
| SharedPreferencesCompat.apply(editor); | |||||
| } | |||||
| /** | |||||
| * 清除所有数据 | |||||
| * | |||||
| * @param context | |||||
| */ | |||||
| public static void clear(Context context) { | |||||
| SharedPreferences sp = context.getSharedPreferences(FILE_NAME, | |||||
| Context.MODE_PRIVATE); | |||||
| SharedPreferences.Editor editor = sp.edit(); | |||||
| editor.clear(); | |||||
| SharedPreferencesCompat.apply(editor); | |||||
| } | |||||
| /** | |||||
| * 查询某个key是否已经存在 | |||||
| * | |||||
| * @param context | |||||
| * @param key | |||||
| * @return | |||||
| */ | |||||
| public static boolean contains(Context context, String key) { | |||||
| SharedPreferences sp = context.getSharedPreferences(FILE_NAME, | |||||
| Context.MODE_PRIVATE); | |||||
| return sp.contains(key); | |||||
| } | |||||
| /** | |||||
| * 返回所有的键值对 | |||||
| * | |||||
| * @param context | |||||
| * @return | |||||
| */ | |||||
| public static Map<String, ?> getAll(Context context) { | |||||
| SharedPreferences sp = context.getSharedPreferences(FILE_NAME, | |||||
| Context.MODE_PRIVATE); | |||||
| return sp.getAll(); | |||||
| } | |||||
| /** | |||||
| * 创建一个解决SharedPreferencesCompat.apply方法的一个兼容类 | |||||
| * | |||||
| * @author zhy | |||||
| * | |||||
| */ | |||||
| private static class SharedPreferencesCompat { | |||||
| private static final Method sApplyMethod = findApplyMethod(); | |||||
| /** | |||||
| * 反射查找apply的方法 | |||||
| * | |||||
| * @return | |||||
| */ | |||||
| @SuppressWarnings({ "unchecked", "rawtypes" }) | |||||
| private static Method findApplyMethod() { | |||||
| try { | |||||
| Class clz = SharedPreferences.Editor.class; | |||||
| return clz.getMethod("apply"); | |||||
| } catch (NoSuchMethodException e) { | |||||
| } | |||||
| return null; | |||||
| } | |||||
| /** | |||||
| * 如果找到则使用apply执行,否则使用commit | |||||
| * | |||||
| * @param editor | |||||
| */ | |||||
| public static void apply(SharedPreferences.Editor editor) { | |||||
| try { | |||||
| if (sApplyMethod != null) { | |||||
| sApplyMethod.invoke(editor); | |||||
| return; | |||||
| } | |||||
| } catch (IllegalArgumentException e) { | |||||
| } catch (IllegalAccessException e) { | |||||
| } catch (InvocationTargetException e) { | |||||
| } | |||||
| editor.commit(); | |||||
| } | |||||
| } | |||||
| } |
| package aicare.net.cn.sdk.tmpsrepositoryandroid.utils; | |||||
| import android.content.Context; | |||||
| import android.widget.Toast; | |||||
| //Toast统一管理类 | |||||
| public class T { | |||||
| private T() { | |||||
| /* cannot be instantiated */ | |||||
| throw new UnsupportedOperationException("cannot be instantiated"); | |||||
| } | |||||
| private static Toast mToast; | |||||
| /** | |||||
| * 短时间显示Toast | |||||
| * | |||||
| * @param context | |||||
| * @param message | |||||
| */ | |||||
| public static void showShort(Context context, CharSequence message) { | |||||
| if (mToast == null) { | |||||
| mToast = Toast.makeText(context, message, Toast.LENGTH_SHORT); | |||||
| } else { | |||||
| mToast.setText(message); | |||||
| mToast.setDuration(Toast.LENGTH_SHORT); | |||||
| } | |||||
| mToast.show(); | |||||
| } | |||||
| /** | |||||
| * 短时间显示Toast | |||||
| * | |||||
| * @param context | |||||
| * @param message | |||||
| */ | |||||
| public static void showShort(Context context, int message) { | |||||
| if (mToast == null) { | |||||
| mToast = Toast.makeText(context, message, Toast.LENGTH_SHORT); | |||||
| } else { | |||||
| mToast.setText(message); | |||||
| mToast.setDuration(Toast.LENGTH_SHORT); | |||||
| } | |||||
| mToast.show(); | |||||
| } | |||||
| /** | |||||
| * 长时间显示Toast | |||||
| * | |||||
| * @param context | |||||
| * @param message | |||||
| */ | |||||
| public static void showLong(Context context, CharSequence message) { | |||||
| if (mToast == null) { | |||||
| mToast = Toast.makeText(context, message, Toast.LENGTH_LONG); | |||||
| } else { | |||||
| mToast.setText(message); | |||||
| mToast.setDuration(Toast.LENGTH_LONG); | |||||
| } | |||||
| mToast.show(); | |||||
| } | |||||
| /** | |||||
| * 长时间显示Toast | |||||
| * | |||||
| * @param context | |||||
| * @param message | |||||
| */ | |||||
| public static void showLong(Context context, int message) { | |||||
| if (mToast == null) { | |||||
| mToast = Toast.makeText(context, message, Toast.LENGTH_LONG); | |||||
| } else { | |||||
| mToast.setText(message); | |||||
| mToast.setDuration(Toast.LENGTH_LONG); | |||||
| } | |||||
| mToast.show(); | |||||
| } | |||||
| /** | |||||
| * 自定义显示Toast时间 | |||||
| * | |||||
| * @param context | |||||
| * @param message | |||||
| * @param duration | |||||
| */ | |||||
| public static void show(Context context, CharSequence message, int duration) { | |||||
| if (mToast == null) { | |||||
| mToast = Toast.makeText(context, message, duration); | |||||
| } else { | |||||
| mToast.setText(message); | |||||
| mToast.setDuration(duration); | |||||
| } | |||||
| mToast.show(); | |||||
| } | |||||
| /** | |||||
| * 自定义显示Toast时间 | |||||
| * | |||||
| * @param context | |||||
| * @param message | |||||
| * @param duration | |||||
| */ | |||||
| public static void show(Context context, int message, int duration) { | |||||
| if (mToast == null) { | |||||
| mToast = Toast.makeText(context, message, duration); | |||||
| } else { | |||||
| mToast.setText(message); | |||||
| mToast.setDuration(duration); | |||||
| } | |||||
| mToast.show(); | |||||
| } | |||||
| } |
| package aicare.net.cn.sdk.tmpsrepositoryandroid.views; | |||||
| import android.content.Context; | |||||
| import android.content.res.TypedArray; | |||||
| import android.graphics.drawable.Drawable; | |||||
| import android.util.AttributeSet; | |||||
| import android.view.MotionEvent; | |||||
| import android.view.View; | |||||
| import android.widget.TextView; | |||||
| import aicare.net.cn.sdk.tmpsrepositoryandroid.R; | |||||
| import aicare.net.cn.sdk.tmpsrepositoryandroid.utils.L; | |||||
| /** | |||||
| * Created by Suzy on 2016/1/19. | |||||
| */ | |||||
| public class MyTextView extends TextView implements View.OnTouchListener{ | |||||
| private final static String TAG = "MyTextView"; | |||||
| private int mDrawableSize;// xml文件中设置的大小 | |||||
| public MyTextView(Context context) { | |||||
| this(context, null, 0); | |||||
| } | |||||
| public MyTextView(Context context, AttributeSet attrs) { | |||||
| this(context, attrs, 0); | |||||
| } | |||||
| public MyTextView(Context context, AttributeSet attrs, int defStyle) { | |||||
| super(context, attrs, defStyle); | |||||
| Drawable drawableLeft = null, drawableTop = null, drawableRight = null, drawableBottom = null; | |||||
| TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyTextView); | |||||
| int n = a.getIndexCount(); | |||||
| for (int i = 0; i < n; i++) { | |||||
| int attr = a.getIndex(i); | |||||
| L.i(TAG, "attr:" + attr); | |||||
| switch (attr) { | |||||
| case R.styleable.MyTextView_drawable_Size: | |||||
| mDrawableSize = a.getDimensionPixelSize(R.styleable.MyTextView_drawable_Size, 50); | |||||
| L.i(TAG, "mDrawableSize:" + mDrawableSize); | |||||
| break; | |||||
| case R.styleable.MyTextView_drawable_Top: | |||||
| drawableTop = a.getDrawable(attr); | |||||
| break; | |||||
| case R.styleable.MyTextView_drawable_Bottom: | |||||
| drawableRight = a.getDrawable(attr); | |||||
| break; | |||||
| case R.styleable.MyTextView_drawable_Right: | |||||
| drawableBottom = a.getDrawable(attr); | |||||
| break; | |||||
| case R.styleable.MyTextView_drawable_Left: | |||||
| drawableLeft = a.getDrawable(attr); | |||||
| break; | |||||
| default: | |||||
| break; | |||||
| } | |||||
| } | |||||
| a.recycle(); | |||||
| setCompoundDrawablesWithIntrinsicBounds(drawableLeft, drawableTop, drawableRight, drawableBottom); | |||||
| this.setOnTouchListener(this); | |||||
| } | |||||
| public void setCompoundDrawablesWithIntrinsicBounds(Drawable left, | |||||
| Drawable top, Drawable right, Drawable bottom) { | |||||
| if (left != null) { | |||||
| left.setBounds(0, 0, mDrawableSize, mDrawableSize); | |||||
| } | |||||
| if (right != null) { | |||||
| right.setBounds(0, 0, mDrawableSize, mDrawableSize); | |||||
| } | |||||
| if (top != null) { | |||||
| top.setBounds(0, 0, mDrawableSize, mDrawableSize); | |||||
| } | |||||
| if (bottom != null) { | |||||
| bottom.setBounds(0, 0, mDrawableSize, mDrawableSize); | |||||
| } | |||||
| setCompoundDrawables(left, top, right, bottom); | |||||
| } | |||||
| @Override | |||||
| public boolean onTouch(View v, MotionEvent event) { | |||||
| switch (event.getAction()) { | |||||
| case MotionEvent.ACTION_DOWN: | |||||
| v.setAlpha(0.5f); | |||||
| return true; | |||||
| case MotionEvent.ACTION_UP: | |||||
| case MotionEvent.ACTION_CANCEL: | |||||
| v.setAlpha(1f); | |||||
| return true; | |||||
| } | |||||
| return false; | |||||
| } | |||||
| } |
| package aicare.net.cn.sdk.tmpsrepositoryandroid.views; | |||||
| import android.app.Dialog; | |||||
| import android.content.Context; | |||||
| import android.os.Bundle; | |||||
| import android.text.TextUtils; | |||||
| import android.view.View; | |||||
| import android.widget.Button; | |||||
| import android.widget.EditText; | |||||
| import java.util.EnumMap; | |||||
| import java.util.Map; | |||||
| import aicare.net.cn.sdk.tmpsrepositoryandroid.OnIdSetListener; | |||||
| import aicare.net.cn.sdk.tmpsrepositoryandroid.R; | |||||
| import aicare.net.cn.sdk.tmpsrepositoryandroid.utils.Config; | |||||
| import aicare.net.cn.sdk.tmpsrepositoryandroid.utils.Configs; | |||||
| import aicare.net.cn.sdk.tmpsrepositoryandroid.utils.ParseData; | |||||
| import aicare.net.cn.sdk.tmpsrepositoryandroid.utils.SPUtils; | |||||
| import aicare.net.cn.sdk.tmpsrepositoryandroid.utils.T; | |||||
| /** | |||||
| * Created by Suzy on 2016/2/22. | |||||
| */ | |||||
| public class SetIdDialog extends Dialog implements View.OnClickListener { | |||||
| private Context context; | |||||
| private EnumMap<Config.DevicePosition, String> deviceIdMap; | |||||
| private EditText et_left_front, et_left_rear, et_right_front, et_right_rear; | |||||
| private Button btn_query; | |||||
| private OnIdSetListener onIdSetListener; | |||||
| public SetIdDialog(Context context, EnumMap<Config.DevicePosition, String> deviceIdMap, OnIdSetListener onIdSetListener) { | |||||
| super(context, R.style.MyDialog); | |||||
| this.context = context; | |||||
| this.deviceIdMap = deviceIdMap; | |||||
| this.onIdSetListener = onIdSetListener; | |||||
| } | |||||
| @Override | |||||
| protected void onCreate(Bundle savedInstanceState) { | |||||
| super.onCreate(savedInstanceState); | |||||
| initViews(); | |||||
| initEvents(); | |||||
| setInfo(); | |||||
| } | |||||
| private void setInfo() { | |||||
| if (deviceIdMap.size() != 0) { | |||||
| for (Map.Entry<Config.DevicePosition, String> entry : deviceIdMap.entrySet()) { | |||||
| switch (entry.getKey()) { | |||||
| case LEFT_FRONT: | |||||
| if (!TextUtils.isEmpty(entry.getValue())) { | |||||
| et_left_front.setText(entry.getValue()); | |||||
| } | |||||
| et_left_front.setSelection(entry.getValue().length()); | |||||
| break; | |||||
| case LEFT_REAR: | |||||
| if (!TextUtils.isEmpty(entry.getValue())) { | |||||
| et_left_rear.setText(entry.getValue()); | |||||
| } | |||||
| et_left_rear.setSelection(entry.getValue().length()); | |||||
| break; | |||||
| case RIGHT_FRONT: | |||||
| if (!TextUtils.isEmpty(entry.getValue())) { | |||||
| et_right_front.setText(entry.getValue()); | |||||
| } | |||||
| et_right_front.setSelection(entry.getValue().length()); | |||||
| break; | |||||
| case RIGHT_REAR: | |||||
| if (!TextUtils.isEmpty(entry.getValue())) { | |||||
| et_right_rear.setText(entry.getValue()); | |||||
| } | |||||
| et_right_rear.setSelection(entry.getValue().length()); | |||||
| break; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| private void initViews() { | |||||
| setContentView(R.layout.dialog_set_id); | |||||
| btn_query = (Button) findViewById(R.id.btn_query); | |||||
| et_left_front = (EditText) findViewById(R.id.et_left_front); | |||||
| et_left_rear = (EditText) findViewById(R.id.et_left_rear); | |||||
| et_right_front = (EditText) findViewById(R.id.et_right_front); | |||||
| et_right_rear = (EditText) findViewById(R.id.et_right_rear); | |||||
| } | |||||
| private void initEvents() { | |||||
| btn_query.setOnClickListener(this); | |||||
| } | |||||
| @Override | |||||
| public void onClick(View view) { | |||||
| switch (view.getId()) { | |||||
| case R.id.btn_query: | |||||
| if (onIdSetListener != null) { | |||||
| String leftFront = et_left_front.getText().toString().trim().toUpperCase(); | |||||
| String leftRear = et_left_rear.getText().toString().trim().toUpperCase(); | |||||
| String rightFront = et_right_front.getText().toString().trim().toUpperCase(); | |||||
| String rightRear = et_right_rear.getText().toString().trim().toUpperCase(); | |||||
| boolean isLfIdOk = setDeviceIdMap(Config.DevicePosition.LEFT_FRONT, leftFront); | |||||
| boolean isLrIdOk = setDeviceIdMap(Config.DevicePosition.LEFT_REAR, leftRear); | |||||
| boolean isRfIdOk = setDeviceIdMap(Config.DevicePosition.RIGHT_FRONT, rightFront); | |||||
| boolean isRrIdOk = setDeviceIdMap(Config.DevicePosition.RIGHT_REAR, rightRear); | |||||
| if (showToast(isLfIdOk, isLrIdOk, isRfIdOk, isRrIdOk)) { | |||||
| onIdSetListener.onIdSet(); | |||||
| dismiss(); | |||||
| } | |||||
| } | |||||
| break; | |||||
| } | |||||
| } | |||||
| private boolean setDeviceIdMap(Config.DevicePosition devicePosition, String id) { | |||||
| if (!TextUtils.isEmpty(id)) { | |||||
| if (!ParseData.isDeviceId(id)) { | |||||
| return false; | |||||
| } | |||||
| } | |||||
| switch (devicePosition) { | |||||
| case LEFT_FRONT: | |||||
| SPUtils.put(context, Configs.LEFT_FRONT, id); | |||||
| break; | |||||
| case LEFT_REAR: | |||||
| SPUtils.put(context, Configs.LEFT_REAR, id); | |||||
| break; | |||||
| case RIGHT_FRONT: | |||||
| SPUtils.put(context, Configs.RIGHT_FRONT, id); | |||||
| break; | |||||
| case RIGHT_REAR: | |||||
| SPUtils.put(context, Configs.RIGHT_REAR, id); | |||||
| break; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| private boolean showToast(boolean isLfIdOk, boolean isLrIdOk, boolean isRfIdOk, boolean isRrIdOk) { | |||||
| if (!isLfIdOk) { | |||||
| T.showShort(context, R.string.left_front_error); | |||||
| } else if (!isLrIdOk) { | |||||
| T.showShort(context, R.string.left_rear_error); | |||||
| } else if (!isRfIdOk) { | |||||
| T.showShort(context, R.string.right_front_error); | |||||
| } else if (!isRrIdOk) { | |||||
| T.showShort(context, R.string.right_rear_error); | |||||
| } else { | |||||
| T.showShort(context, R.string.set_id_success); | |||||
| return true; | |||||
| } | |||||
| return false; | |||||
| } | |||||
| } |
| <vector xmlns:aapt="http://schemas.android.com/aapt" | |||||
| xmlns:android="http://schemas.android.com/apk/res/android" | |||||
| android:width="108dp" | |||||
| android:height="108dp" | |||||
| android:viewportHeight="108" | |||||
| android:viewportWidth="108"> | |||||
| <path | |||||
| android:fillType="evenOdd" | |||||
| android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z" | |||||
| android:strokeColor="#00000000" | |||||
| android:strokeWidth="1"> | |||||
| <aapt:attr name="android:fillColor"> | |||||
| <gradient | |||||
| android:endX="78.5885" | |||||
| android:endY="90.9159" | |||||
| android:startX="48.7653" | |||||
| android:startY="61.0927" | |||||
| android:type="linear"> | |||||
| <item | |||||
| android:color="#44000000" | |||||
| android:offset="0.0"/> | |||||
| <item | |||||
| android:color="#00000000" | |||||
| android:offset="1.0"/> | |||||
| </gradient> | |||||
| </aapt:attr> | |||||
| </path> | |||||
| <path | |||||
| android:fillColor="#FFFFFF" | |||||
| android:fillType="nonZero" | |||||
| android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z" | |||||
| android:strokeColor="#00000000" | |||||
| android:strokeWidth="1"/> | |||||
| </vector> |
| <?xml version="1.0" encoding="utf-8"?> | |||||
| <shape xmlns:android="http://schemas.android.com/apk/res/android" | |||||
| android:shape="rectangle"> | |||||
| <solid android:color="@android:color/white"/> | |||||
| <stroke android:color="@android:color/darker_gray" android:width="3dp"/> | |||||
| </shape> |
| <?xml version="1.0" encoding="utf-8"?> | |||||
| <selector xmlns:android="http://schemas.android.com/apk/res/android"> | |||||
| <item android:alpha="125" | |||||
| android:color="@android:color/holo_red_light" | |||||
| android:state_pressed="true" /> | |||||
| <item android:alpha="125" | |||||
| android:color="@android:color/black" | |||||
| android:state_enabled="false" /> | |||||
| <item android:alpha="255" | |||||
| android:color="@android:color/black"/> | |||||
| </selector> |
| <?xml version="1.0" encoding="utf-8"?> | |||||
| <vector | |||||
| xmlns:android="http://schemas.android.com/apk/res/android" | |||||
| android:width="108dp" | |||||
| android:height="108dp" | |||||
| android:viewportHeight="108" | |||||
| android:viewportWidth="108"> | |||||
| <path | |||||
| android:fillColor="#008577" | |||||
| android:pathData="M0,0h108v108h-108z"/> | |||||
| <path | |||||
| android:fillColor="#00000000" | |||||
| android:pathData="M9,0L9,108" | |||||
| android:strokeColor="#33FFFFFF" | |||||
| android:strokeWidth="0.8"/> | |||||
| <path | |||||
| android:fillColor="#00000000" | |||||
| android:pathData="M19,0L19,108" | |||||
| android:strokeColor="#33FFFFFF" | |||||
| android:strokeWidth="0.8"/> | |||||
| <path | |||||
| android:fillColor="#00000000" | |||||
| android:pathData="M29,0L29,108" | |||||
| android:strokeColor="#33FFFFFF" | |||||
| android:strokeWidth="0.8"/> | |||||
| <path | |||||
| android:fillColor="#00000000" | |||||
| android:pathData="M39,0L39,108" | |||||
| android:strokeColor="#33FFFFFF" | |||||
| android:strokeWidth="0.8"/> | |||||
| <path | |||||
| android:fillColor="#00000000" | |||||
| android:pathData="M49,0L49,108" | |||||
| android:strokeColor="#33FFFFFF" | |||||
| android:strokeWidth="0.8"/> | |||||
| <path | |||||
| android:fillColor="#00000000" | |||||
| android:pathData="M59,0L59,108" | |||||
| android:strokeColor="#33FFFFFF" | |||||
| android:strokeWidth="0.8"/> | |||||
| <path | |||||
| android:fillColor="#00000000" | |||||
| android:pathData="M69,0L69,108" | |||||
| android:strokeColor="#33FFFFFF" | |||||
| android:strokeWidth="0.8"/> | |||||
| <path | |||||
| android:fillColor="#00000000" | |||||
| android:pathData="M79,0L79,108" | |||||
| android:strokeColor="#33FFFFFF" | |||||
| android:strokeWidth="0.8"/> | |||||
| <path | |||||
| android:fillColor="#00000000" | |||||
| android:pathData="M89,0L89,108" | |||||
| android:strokeColor="#33FFFFFF" | |||||
| android:strokeWidth="0.8"/> | |||||
| <path | |||||
| android:fillColor="#00000000" | |||||
| android:pathData="M99,0L99,108" | |||||
| android:strokeColor="#33FFFFFF" | |||||
| android:strokeWidth="0.8"/> | |||||
| <path | |||||
| android:fillColor="#00000000" | |||||
| android:pathData="M0,9L108,9" | |||||
| android:strokeColor="#33FFFFFF" | |||||
| android:strokeWidth="0.8"/> | |||||
| <path | |||||
| android:fillColor="#00000000" | |||||
| android:pathData="M0,19L108,19" | |||||
| android:strokeColor="#33FFFFFF" | |||||
| android:strokeWidth="0.8"/> | |||||
| <path | |||||
| android:fillColor="#00000000" | |||||
| android:pathData="M0,29L108,29" | |||||
| android:strokeColor="#33FFFFFF" | |||||
| android:strokeWidth="0.8"/> | |||||
| <path | |||||
| android:fillColor="#00000000" | |||||
| android:pathData="M0,39L108,39" | |||||
| android:strokeColor="#33FFFFFF" | |||||
| android:strokeWidth="0.8"/> | |||||
| <path | |||||
| android:fillColor="#00000000" | |||||
| android:pathData="M0,49L108,49" | |||||
| android:strokeColor="#33FFFFFF" | |||||
| android:strokeWidth="0.8"/> | |||||
| <path | |||||
| android:fillColor="#00000000" | |||||
| android:pathData="M0,59L108,59" | |||||
| android:strokeColor="#33FFFFFF" | |||||
| android:strokeWidth="0.8"/> | |||||
| <path | |||||
| android:fillColor="#00000000" | |||||
| android:pathData="M0,69L108,69" | |||||
| android:strokeColor="#33FFFFFF" | |||||
| android:strokeWidth="0.8"/> | |||||
| <path | |||||
| android:fillColor="#00000000" | |||||
| android:pathData="M0,79L108,79" | |||||
| android:strokeColor="#33FFFFFF" | |||||
| android:strokeWidth="0.8"/> | |||||
| <path | |||||
| android:fillColor="#00000000" | |||||
| android:pathData="M0,89L108,89" | |||||
| android:strokeColor="#33FFFFFF" | |||||
| android:strokeWidth="0.8"/> | |||||
| <path | |||||
| android:fillColor="#00000000" | |||||
| android:pathData="M0,99L108,99" | |||||
| android:strokeColor="#33FFFFFF" | |||||
| android:strokeWidth="0.8"/> | |||||
| <path | |||||
| android:fillColor="#00000000" | |||||
| android:pathData="M19,29L89,29" | |||||
| android:strokeColor="#33FFFFFF" | |||||
| android:strokeWidth="0.8"/> | |||||
| <path | |||||
| android:fillColor="#00000000" | |||||
| android:pathData="M19,39L89,39" | |||||
| android:strokeColor="#33FFFFFF" | |||||
| android:strokeWidth="0.8"/> | |||||
| <path | |||||
| android:fillColor="#00000000" | |||||
| android:pathData="M19,49L89,49" | |||||
| android:strokeColor="#33FFFFFF" | |||||
| android:strokeWidth="0.8"/> | |||||
| <path | |||||
| android:fillColor="#00000000" | |||||
| android:pathData="M19,59L89,59" | |||||
| android:strokeColor="#33FFFFFF" | |||||
| android:strokeWidth="0.8"/> | |||||
| <path | |||||
| android:fillColor="#00000000" | |||||
| android:pathData="M19,69L89,69" | |||||
| android:strokeColor="#33FFFFFF" | |||||
| android:strokeWidth="0.8"/> | |||||
| <path | |||||
| android:fillColor="#00000000" | |||||
| android:pathData="M19,79L89,79" | |||||
| android:strokeColor="#33FFFFFF" | |||||
| android:strokeWidth="0.8"/> | |||||
| <path | |||||
| android:fillColor="#00000000" | |||||
| android:pathData="M29,19L29,89" | |||||
| android:strokeColor="#33FFFFFF" | |||||
| android:strokeWidth="0.8"/> | |||||
| <path | |||||
| android:fillColor="#00000000" | |||||
| android:pathData="M39,19L39,89" | |||||
| android:strokeColor="#33FFFFFF" | |||||
| android:strokeWidth="0.8"/> | |||||
| <path | |||||
| android:fillColor="#00000000" | |||||
| android:pathData="M49,19L49,89" | |||||
| android:strokeColor="#33FFFFFF" | |||||
| android:strokeWidth="0.8"/> | |||||
| <path | |||||
| android:fillColor="#00000000" | |||||
| android:pathData="M59,19L59,89" | |||||
| android:strokeColor="#33FFFFFF" | |||||
| android:strokeWidth="0.8"/> | |||||
| <path | |||||
| android:fillColor="#00000000" | |||||
| android:pathData="M69,19L69,89" | |||||
| android:strokeColor="#33FFFFFF" | |||||
| android:strokeWidth="0.8"/> | |||||
| <path | |||||
| android:fillColor="#00000000" | |||||
| android:pathData="M79,19L79,89" | |||||
| android:strokeColor="#33FFFFFF" | |||||
| android:strokeWidth="0.8"/> | |||||
| </vector> |
| <?xml version="1.0" encoding="utf-8"?> | |||||
| <LinearLayout | |||||
| xmlns:android="http://schemas.android.com/apk/res/android" | |||||
| xmlns:app="http://schemas.android.com/apk/res-auto" | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="match_parent" | |||||
| android:orientation="vertical" | |||||
| android:paddingBottom="@dimen/activity_vertical_margin" | |||||
| android:paddingLeft="@dimen/activity_horizontal_margin" | |||||
| android:paddingRight="@dimen/activity_horizontal_margin" | |||||
| android:paddingTop="@dimen/activity_vertical_margin"> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:gravity="center" | |||||
| android:orientation="horizontal"> | |||||
| <Button | |||||
| android:id="@+id/btn_get_info" | |||||
| android:layout_width="0dp" | |||||
| android:layout_height="match_parent" | |||||
| android:layout_weight="1" | |||||
| android:text="扫描(获取胎压信息)"/> | |||||
| <Button | |||||
| android:id="@+id/btn_clear_log" | |||||
| android:layout_width="0dp" | |||||
| android:layout_height="match_parent" | |||||
| android:layout_weight="1" | |||||
| android:text="清空Log"/> | |||||
| <Button | |||||
| android:id="@+id/btn_stop_scan" | |||||
| android:layout_width="0dp" | |||||
| android:layout_height="match_parent" | |||||
| android:layout_weight="1" | |||||
| android:text="停止扫描"/> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:id="@+id/ll_set_id" | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:background="@drawable/bg" | |||||
| android:gravity="center" | |||||
| android:orientation="vertical"> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:orientation="horizontal"> | |||||
| <TextView | |||||
| android:id="@+id/tv_left_front" | |||||
| style="@style/TVTyreId" | |||||
| android:text="@string/left_front_id"/> | |||||
| <TextView | |||||
| android:id="@+id/tv_right_front" | |||||
| style="@style/TVTyreId" | |||||
| android:text="@string/right_front_id"/> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:orientation="horizontal"> | |||||
| <TextView | |||||
| android:id="@+id/tv_left_rear" | |||||
| style="@style/TVTyreId" | |||||
| android:text="@string/left_rear_id"/> | |||||
| <TextView | |||||
| android:id="@+id/tv_right_rear" | |||||
| style="@style/TVTyreId" | |||||
| android:text="@string/right_rear_id"/> | |||||
| </LinearLayout> | |||||
| </LinearLayout> | |||||
| <ListView | |||||
| android:id="@+id/lv_show_log" | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="match_parent"/> | |||||
| </LinearLayout> |
| <?xml version="1.0" encoding="utf-8"?> | |||||
| <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="match_parent" | |||||
| android:orientation="horizontal"> | |||||
| <TextView | |||||
| android:id="@+id/tv_device_id" | |||||
| android:layout_width="0dp" | |||||
| android:layout_height="match_parent" | |||||
| android:layout_weight="1" | |||||
| android:gravity="center" | |||||
| android:paddingBottom="5dp" | |||||
| android:paddingTop="5dp"/> | |||||
| <TextView | |||||
| android:id="@+id/tv_count" | |||||
| android:layout_width="0dp" | |||||
| android:layout_height="match_parent" | |||||
| android:layout_weight="1" | |||||
| android:gravity="center" | |||||
| android:paddingBottom="5dp" | |||||
| android:paddingTop="5dp"/> | |||||
| </LinearLayout> |
| <?xml version="1.0" encoding="utf-8"?> | |||||
| <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||||
| android:layout_width="300dp" | |||||
| android:layout_height="200dp" | |||||
| android:background="@drawable/bg" | |||||
| android:orientation="vertical"> | |||||
| <ListView | |||||
| android:id="@+id/lv_show_id" | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="0dp" | |||||
| android:layout_weight="1"/> | |||||
| <Button | |||||
| android:id="@+id/btn_query" | |||||
| style="@style/BtnQuery" | |||||
| android:text="@string/cancel"/> | |||||
| </LinearLayout> |
| <?xml version="1.0" encoding="utf-8"?> | |||||
| <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||||
| android:layout_width="300dp" | |||||
| android:layout_height="160dp" | |||||
| android:background="@drawable/bg" | |||||
| android:orientation="vertical"> | |||||
| <TextView | |||||
| style="@style/TvDialogTitle" | |||||
| android:text="@string/please_set_id"/> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="80dp" | |||||
| android:layout_marginLeft="5dp" | |||||
| android:layout_marginRight="5dp" | |||||
| android:layout_weight="2" | |||||
| android:orientation="vertical"> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="0dp" | |||||
| android:layout_weight="1" | |||||
| android:weightSum="2"> | |||||
| <TextView | |||||
| style="@style/TvSetId" | |||||
| android:text="@string/left_front_hint"/> | |||||
| <EditText | |||||
| android:id="@+id/et_left_front" | |||||
| style="@style/EtSetId"/> | |||||
| <TextView | |||||
| style="@style/TvSetId" | |||||
| android:text="@string/right_front_hint"/> | |||||
| <EditText | |||||
| android:id="@+id/et_right_front" | |||||
| style="@style/EtSetId"/> | |||||
| </LinearLayout> | |||||
| <LinearLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="0dp" | |||||
| android:layout_weight="1" | |||||
| android:weightSum="2"> | |||||
| <TextView | |||||
| style="@style/TvSetId" | |||||
| android:text="@string/left_rear_hint"/> | |||||
| <EditText | |||||
| android:id="@+id/et_left_rear" | |||||
| style="@style/EtSetId"/> | |||||
| <TextView | |||||
| style="@style/TvSetId" | |||||
| android:text="@string/right_rear_hint"/> | |||||
| <EditText | |||||
| android:id="@+id/et_right_rear" | |||||
| style="@style/EtSetId"/> | |||||
| </LinearLayout> | |||||
| </LinearLayout> | |||||
| <Button | |||||
| android:id="@+id/btn_query" | |||||
| android:text="@string/query" | |||||
| style="@style/BtnQuery"/> | |||||
| </LinearLayout> |
| <?xml version="1.0" encoding="utf-8"?> | |||||
| <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> | |||||
| <background android:drawable="@drawable/ic_launcher_background"/> | |||||
| <foreground android:drawable="@drawable/ic_launcher_foreground"/> | |||||
| </adaptive-icon> |
| <?xml version="1.0" encoding="utf-8"?> | |||||
| <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> | |||||
| <background android:drawable="@drawable/ic_launcher_background"/> | |||||
| <foreground android:drawable="@drawable/ic_launcher_foreground"/> | |||||
| </adaptive-icon> |
| <?xml version="1.0" encoding="utf-8"?> | |||||
| <resources> | |||||
| <declare-styleable name="MyTextView"> | |||||
| <attr name="drawable_Size" format="dimension"/> | |||||
| <attr name="drawable_Top" format="reference"/> | |||||
| <attr name="drawable_Left" format="reference"/> | |||||
| <attr name="drawable_Right" format="reference"/> | |||||
| <attr name="drawable_Bottom" format="reference"/> | |||||
| </declare-styleable> | |||||
| </resources> |
| <?xml version="1.0" encoding="utf-8"?> | |||||
| <resources> | |||||
| <color name="colorPrimary">#008577</color> | |||||
| <color name="colorPrimaryDark">#00574B</color> | |||||
| <color name="colorAccent">#D81B60</color> | |||||
| <color name="black">#000000</color> | |||||
| </resources> |
| <resources> | |||||
| <!-- Default screen margins, per the Android Design guidelines. --> | |||||
| <dimen name="activity_horizontal_margin">16dp</dimen> | |||||
| <dimen name="activity_vertical_margin">16dp</dimen> | |||||
| </resources> |
| <resources> | |||||
| <string name="app_name">TmpsRepositoryAndroid</string> | |||||
| <string name="left_front_id">左前:%1$s</string> | |||||
| <string name="right_front_id">右前:%1$s</string> | |||||
| <string name="left_rear_id">左后:%1$s</string> | |||||
| <string name="right_rear_id">右后:%1$s</string> | |||||
| <string name="please_set_id">请设置ID</string> | |||||
| <string name="left_front_hint">左前:</string> | |||||
| <string name="left_rear_hint">左后:</string> | |||||
| <string name="right_front_hint">右前:</string> | |||||
| <string name="right_rear_hint">右后:</string> | |||||
| <string name="left_front_error">左前ID错误</string> | |||||
| <string name="left_rear_error">左后ID错误</string> | |||||
| <string name="right_front_error">右前ID错误</string> | |||||
| <string name="right_rear_error">右后ID错误</string> | |||||
| <string name="set_id_success">设置成功</string> | |||||
| <string name="query">确定</string> | |||||
| <string name="cancel">退出</string> | |||||
| </resources> |
| <resources> | |||||
| <!-- Base application theme. --> | |||||
| <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> | |||||
| <!-- Customize your theme here. --> | |||||
| <item name="colorPrimary">@color/colorPrimary</item> | |||||
| <item name="colorPrimaryDark">@color/colorPrimaryDark</item> | |||||
| <item name="colorAccent">@color/colorAccent</item> | |||||
| </style> | |||||
| <style name="TVTyreId"> | |||||
| <item name="android:layout_width">0dp</item> | |||||
| <item name="android:layout_height">match_parent</item> | |||||
| <item name="android:gravity">center</item> | |||||
| <item name="android:layout_weight">1</item> | |||||
| <item name="android:paddingTop">10dp</item> | |||||
| <item name="android:paddingBottom">10dp</item> | |||||
| </style> | |||||
| <style name="MyDialog" parent="android:Theme.Dialog"> | |||||
| <item name="android:windowBackground">@android:color/transparent</item> | |||||
| <item name="android:colorBackgroundCacheHint">@null</item> | |||||
| <item name="android:background">@null</item> | |||||
| <item name="android:windowFrame">@null</item> | |||||
| <!-- 是否浮现在activity之上 --> | |||||
| <item name="android:windowIsFloating">true</item> | |||||
| <!-- 半透明 --> | |||||
| <item name="android:windowIsTranslucent">true</item> | |||||
| <!-- 无标题 --> | |||||
| <item name="android:windowNoTitle">true</item> | |||||
| <!-- 模糊 --> | |||||
| <item name="android:backgroundDimEnabled">true</item> | |||||
| </style> | |||||
| <style name="TvSetId"> | |||||
| <item name="android:layout_width">wrap_content</item> | |||||
| <item name="android:layout_height">match_parent</item> | |||||
| <item name="android:gravity">center</item> | |||||
| <item name="android:textColor">@color/black</item> | |||||
| </style> | |||||
| <style name="EtSetId"> | |||||
| <item name="android:layout_width">0dp</item> | |||||
| <item name="android:layout_height">match_parent</item> | |||||
| <item name="android:layout_weight">1</item> | |||||
| <item name="android:maxLength">6</item> | |||||
| <item name="android:textColor">@color/black</item> | |||||
| </style> | |||||
| <style name="BtnQuery"> | |||||
| <item name="android:layout_width">match_parent</item> | |||||
| <item name="android:layout_height">40dp</item> | |||||
| <item name="android:layout_marginLeft">40dp</item> | |||||
| <item name="android:layout_marginRight">40dp</item> | |||||
| <item name="android:textColor">@color/black</item> | |||||
| </style> | |||||
| <style name="TvDialogTitle"> | |||||
| <item name="android:layout_width">match_parent</item> | |||||
| <item name="android:layout_height">40dp</item> | |||||
| <item name="android:gravity">center</item> | |||||
| <item name="android:textColor">@color/black</item> | |||||
| <item name="android:textSize">20sp</item> | |||||
| </style> | |||||
| </resources> |
| package aicare.net.cn.sdk.tmpsrepositoryandroid; | |||||
| import org.junit.Test; | |||||
| import static org.junit.Assert.*; | |||||
| /** | |||||
| * Example local unit test, which will execute on the development machine (host). | |||||
| * | |||||
| * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> | |||||
| */ | |||||
| public class ExampleUnitTest { | |||||
| @Test | |||||
| public void addition_isCorrect() { | |||||
| assertEquals(4, 2 + 2); | |||||
| } | |||||
| } |
| // Top-level build file where you can add configuration options common to all sub-projects/modules. | |||||
| buildscript { | |||||
| repositories { | |||||
| google() | |||||
| jcenter() | |||||
| } | |||||
| dependencies { | |||||
| classpath 'com.android.tools.build:gradle:3.4.0' | |||||
| // NOTE: Do not place your application dependencies here; they belong | |||||
| // in the individual module build.gradle files | |||||
| } | |||||
| } | |||||
| allprojects { | |||||
| repositories { | |||||
| google() | |||||
| jcenter() | |||||
| } | |||||
| } | |||||
| task clean(type: Delete) { | |||||
| delete rootProject.buildDir | |||||
| } |
| # Project-wide Gradle settings. | |||||
| # IDE (e.g. Android Studio) users: | |||||
| # Gradle settings configured through the IDE *will override* | |||||
| # any settings specified in this file. | |||||
| # For more details on how to configure your build environment visit | |||||
| # http://www.gradle.org/docs/current/userguide/build_environment.html | |||||
| # Specifies the JVM arguments used for the daemon process. | |||||
| # The setting is particularly useful for tweaking memory settings. | |||||
| org.gradle.jvmargs=-Xmx1536m | |||||
| # When configured, Gradle will run in incubating parallel mode. | |||||
| # This option should only be used with decoupled projects. More details, visit | |||||
| # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects | |||||
| # org.gradle.parallel=true | |||||
| # AndroidX package structure to make it clearer which packages are bundled with the | |||||
| # Android operating system, and which are packaged with your app's APK | |||||
| # https://developer.android.com/topic/libraries/support-library/androidx-rn | |||||
| android.useAndroidX=true | |||||
| # Automatically convert third-party libraries to use AndroidX | |||||
| android.enableJetifier=true | |||||
| #Wed Apr 08 11:31:02 CST 2020 | |||||
| distributionBase=GRADLE_USER_HOME | |||||
| distributionPath=wrapper/dists | |||||
| zipStoreBase=GRADLE_USER_HOME | |||||
| zipStorePath=wrapper/dists | |||||
| distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip |
| #!/usr/bin/env sh | |||||
| ############################################################################## | |||||
| ## | |||||
| ## Gradle start up script for UN*X | |||||
| ## | |||||
| ############################################################################## | |||||
| # Attempt to set APP_HOME | |||||
| # Resolve links: $0 may be a link | |||||
| PRG="$0" | |||||
| # Need this for relative symlinks. | |||||
| while [ -h "$PRG" ] ; do | |||||
| ls=`ls -ld "$PRG"` | |||||
| link=`expr "$ls" : '.*-> \(.*\)$'` | |||||
| if expr "$link" : '/.*' > /dev/null; then | |||||
| PRG="$link" | |||||
| else | |||||
| PRG=`dirname "$PRG"`"/$link" | |||||
| fi | |||||
| done | |||||
| SAVED="`pwd`" | |||||
| cd "`dirname \"$PRG\"`/" >/dev/null | |||||
| APP_HOME="`pwd -P`" | |||||
| cd "$SAVED" >/dev/null | |||||
| APP_NAME="Gradle" | |||||
| APP_BASE_NAME=`basename "$0"` | |||||
| # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | |||||
| DEFAULT_JVM_OPTS="" | |||||
| # Use the maximum available, or set MAX_FD != -1 to use that value. | |||||
| MAX_FD="maximum" | |||||
| warn () { | |||||
| echo "$*" | |||||
| } | |||||
| die () { | |||||
| echo | |||||
| echo "$*" | |||||
| echo | |||||
| exit 1 | |||||
| } | |||||
| # OS specific support (must be 'true' or 'false'). | |||||
| cygwin=false | |||||
| msys=false | |||||
| darwin=false | |||||
| nonstop=false | |||||
| case "`uname`" in | |||||
| CYGWIN* ) | |||||
| cygwin=true | |||||
| ;; | |||||
| Darwin* ) | |||||
| darwin=true | |||||
| ;; | |||||
| MINGW* ) | |||||
| msys=true | |||||
| ;; | |||||
| NONSTOP* ) | |||||
| nonstop=true | |||||
| ;; | |||||
| esac | |||||
| CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar | |||||
| # Determine the Java command to use to start the JVM. | |||||
| if [ -n "$JAVA_HOME" ] ; then | |||||
| if [ -x "$JAVA_HOME/jre/sh/java" ] ; then | |||||
| # IBM's JDK on AIX uses strange locations for the executables | |||||
| JAVACMD="$JAVA_HOME/jre/sh/java" | |||||
| else | |||||
| JAVACMD="$JAVA_HOME/bin/java" | |||||
| fi | |||||
| if [ ! -x "$JAVACMD" ] ; then | |||||
| die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME | |||||
| Please set the JAVA_HOME variable in your environment to match the | |||||
| location of your Java installation." | |||||
| fi | |||||
| else | |||||
| JAVACMD="java" | |||||
| which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. | |||||
| Please set the JAVA_HOME variable in your environment to match the | |||||
| location of your Java installation." | |||||
| fi | |||||
| # Increase the maximum file descriptors if we can. | |||||
| if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then | |||||
| MAX_FD_LIMIT=`ulimit -H -n` | |||||
| if [ $? -eq 0 ] ; then | |||||
| if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then | |||||
| MAX_FD="$MAX_FD_LIMIT" | |||||
| fi | |||||
| ulimit -n $MAX_FD | |||||
| if [ $? -ne 0 ] ; then | |||||
| warn "Could not set maximum file descriptor limit: $MAX_FD" | |||||
| fi | |||||
| else | |||||
| warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" | |||||
| fi | |||||
| fi | |||||
| # For Darwin, add options to specify how the application appears in the dock | |||||
| if $darwin; then | |||||
| GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" | |||||
| fi | |||||
| # For Cygwin, switch paths to Windows format before running java | |||||
| if $cygwin ; then | |||||
| APP_HOME=`cygpath --path --mixed "$APP_HOME"` | |||||
| CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` | |||||
| JAVACMD=`cygpath --unix "$JAVACMD"` | |||||
| # We build the pattern for arguments to be converted via cygpath | |||||
| ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` | |||||
| SEP="" | |||||
| for dir in $ROOTDIRSRAW ; do | |||||
| ROOTDIRS="$ROOTDIRS$SEP$dir" | |||||
| SEP="|" | |||||
| done | |||||
| OURCYGPATTERN="(^($ROOTDIRS))" | |||||
| # Add a user-defined pattern to the cygpath arguments | |||||
| if [ "$GRADLE_CYGPATTERN" != "" ] ; then | |||||
| OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" | |||||
| fi | |||||
| # Now convert the arguments - kludge to limit ourselves to /bin/sh | |||||
| i=0 | |||||
| for arg in "$@" ; do | |||||
| CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` | |||||
| CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option | |||||
| if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition | |||||
| eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` | |||||
| else | |||||
| eval `echo args$i`="\"$arg\"" | |||||
| fi | |||||
| i=$((i+1)) | |||||
| done | |||||
| case $i in | |||||
| (0) set -- ;; | |||||
| (1) set -- "$args0" ;; | |||||
| (2) set -- "$args0" "$args1" ;; | |||||
| (3) set -- "$args0" "$args1" "$args2" ;; | |||||
| (4) set -- "$args0" "$args1" "$args2" "$args3" ;; | |||||
| (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; | |||||
| (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; | |||||
| (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; | |||||
| (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; | |||||
| (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; | |||||
| esac | |||||
| fi | |||||
| # Escape application args | |||||
| save () { | |||||
| for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done | |||||
| echo " " | |||||
| } | |||||
| APP_ARGS=$(save "$@") | |||||
| # Collect all arguments for the java command, following the shell quoting and substitution rules | |||||
| eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" | |||||
| # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong | |||||
| if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then | |||||
| cd "$(dirname "$0")" | |||||
| fi | |||||
| exec "$JAVACMD" "$@" |
| @if "%DEBUG%" == "" @echo off | |||||
| @rem ########################################################################## | |||||
| @rem | |||||
| @rem Gradle startup script for Windows | |||||
| @rem | |||||
| @rem ########################################################################## | |||||
| @rem Set local scope for the variables with windows NT shell | |||||
| if "%OS%"=="Windows_NT" setlocal | |||||
| set DIRNAME=%~dp0 | |||||
| if "%DIRNAME%" == "" set DIRNAME=. | |||||
| set APP_BASE_NAME=%~n0 | |||||
| set APP_HOME=%DIRNAME% | |||||
| @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | |||||
| set DEFAULT_JVM_OPTS= | |||||
| @rem Find java.exe | |||||
| if defined JAVA_HOME goto findJavaFromJavaHome | |||||
| set JAVA_EXE=java.exe | |||||
| %JAVA_EXE% -version >NUL 2>&1 | |||||
| if "%ERRORLEVEL%" == "0" goto init | |||||
| echo. | |||||
| echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. | |||||
| echo. | |||||
| echo Please set the JAVA_HOME variable in your environment to match the | |||||
| echo location of your Java installation. | |||||
| goto fail | |||||
| :findJavaFromJavaHome | |||||
| set JAVA_HOME=%JAVA_HOME:"=% | |||||
| set JAVA_EXE=%JAVA_HOME%/bin/java.exe | |||||
| if exist "%JAVA_EXE%" goto init | |||||
| echo. | |||||
| echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% | |||||
| echo. | |||||
| echo Please set the JAVA_HOME variable in your environment to match the | |||||
| echo location of your Java installation. | |||||
| goto fail | |||||
| :init | |||||
| @rem Get command-line arguments, handling Windows variants | |||||
| if not "%OS%" == "Windows_NT" goto win9xME_args | |||||
| :win9xME_args | |||||
| @rem Slurp the command line arguments. | |||||
| set CMD_LINE_ARGS= | |||||
| set _SKIP=2 | |||||
| :win9xME_args_slurp | |||||
| if "x%~1" == "x" goto execute | |||||
| set CMD_LINE_ARGS=%* | |||||
| :execute | |||||
| @rem Setup the command line | |||||
| set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar | |||||
| @rem Execute Gradle | |||||
| "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% | |||||
| :end | |||||
| @rem End local scope for the variables with windows NT shell | |||||
| if "%ERRORLEVEL%"=="0" goto mainEnd | |||||
| :fail | |||||
| rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of | |||||
| rem the _cmd.exe /c_ return code! | |||||
| if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 | |||||
| exit /b 1 | |||||
| :mainEnd | |||||
| if "%OS%"=="Windows_NT" endlocal | |||||
| :omega |
| include ':app', ':tpmslibrary' |
| /build |
| apply plugin: 'com.android.library' | |||||
| android { | |||||
| compileSdkVersion 29 | |||||
| buildToolsVersion "29.0.2" | |||||
| defaultConfig { | |||||
| minSdkVersion 19 | |||||
| targetSdkVersion 29 | |||||
| versionCode 1 | |||||
| versionName "1.0" | |||||
| testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" | |||||
| } | |||||
| buildTypes { | |||||
| release { | |||||
| minifyEnabled false | |||||
| proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' | |||||
| } | |||||
| } | |||||
| sourceSets { | |||||
| main { | |||||
| jniLibs.srcDirs = ['libs'] | |||||
| } | |||||
| } | |||||
| } | |||||
| dependencies { | |||||
| implementation fileTree(dir: 'libs', include: ['*.jar']) | |||||
| implementation 'androidx.appcompat:appcompat:1.1.0' | |||||
| testImplementation 'junit:junit:4.12' | |||||
| androidTestImplementation 'androidx.test:runner:1.2.0' | |||||
| androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' | |||||
| implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.41" | |||||
| api files('libs/tpmslib.jar') | |||||
| } |
| # 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 |
| package aicare.net.cn.sdk.tpmslibrary; | |||||
| import android.content.Context; | |||||
| import androidx.test.InstrumentationRegistry; | |||||
| import androidx.test.runner.AndroidJUnit4; | |||||
| import org.junit.Test; | |||||
| import org.junit.runner.RunWith; | |||||
| import static org.junit.Assert.*; | |||||
| /** | |||||
| * Instrumented test, which will execute on an Android device. | |||||
| * | |||||
| * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> | |||||
| */ | |||||
| @RunWith(AndroidJUnit4.class) | |||||
| public class ExampleInstrumentedTest { | |||||
| @Test | |||||
| public void useAppContext() { | |||||
| // Context of the app under test. | |||||
| Context appContext = InstrumentationRegistry.getTargetContext(); | |||||
| assertEquals("aicare.net.cn.sdk.tpmslibrary.test", appContext.getPackageName()); | |||||
| } | |||||
| } |
| <manifest package="aicare.net.cn.sdk.tpmslibrary" | |||||
| xmlns:android="http://schemas.android.com/apk/res/android"/> |
| <resources> | |||||
| <string name="app_name">TpmsLibrary</string> | |||||
| </resources> |
| package aicare.net.cn.sdk.tpmslibrary; | |||||
| import org.junit.Test; | |||||
| import static org.junit.Assert.*; | |||||
| /** | |||||
| * Example local unit test, which will execute on the development machine (host). | |||||
| * | |||||
| * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> | |||||
| */ | |||||
| public class ExampleUnitTest { | |||||
| @Test | |||||
| public void addition_isCorrect() { | |||||
| assertEquals(4, 2 + 2); | |||||
| } | |||||
| } |