陈奇
2018-11-02 75e83be13a8c4ccf081c4dc07a262e4096783c7e
[*]修改电磁版本 配合电子修改bug
1 files added
26 files modified
562 ■■■■■ changed files
.gradle/4.1/fileHashes/fileHashes.bin patch | view | raw | blame | history
.gradle/4.1/fileHashes/fileHashes.lock patch | view | raw | blame | history
.gradle/4.1/fileHashes/resourceHashesCache.bin patch | view | raw | blame | history
.gradle/4.1/javaCompile/classAnalysis.bin patch | view | raw | blame | history
.gradle/4.1/javaCompile/jarAnalysis.bin patch | view | raw | blame | history
.gradle/4.1/javaCompile/javaCompile.lock patch | view | raw | blame | history
.gradle/4.1/javaCompile/taskHistory.bin patch | view | raw | blame | history
.gradle/4.1/javaCompile/taskJars.bin patch | view | raw | blame | history
.gradle/4.1/taskHistory/fileSnapshots.bin patch | view | raw | blame | history
.gradle/4.1/taskHistory/taskHistory.bin patch | view | raw | blame | history
.gradle/4.1/taskHistory/taskHistory.lock patch | view | raw | blame | history
FastBleLib/FastBleLib.iml 1 ●●●● patch | view | raw | blame | history
FastBleLib/src/main/java/com/clj/fastble/bluetooth/BleBluetooth.java 6 ●●●●● patch | view | raw | blame | history
FastBleLib/src/main/java/com/clj/fastble/conn/BleConnector.java 9 ●●●●● patch | view | raw | blame | history
andbrickslib/andbrickslib.iml 41 ●●●● patch | view | raw | blame | history
app/app.iml 27 ●●●●● patch | view | raw | blame | history
app/build.gradle 41 ●●●●● patch | view | raw | blame | history
app/src/main/AndroidManifest.xml 58 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/moral/yunfushao/activity/BLESearchActivity.java 5 ●●●● patch | view | raw | blame | history
app/src/main/java/com/moral/yunfushao/adapter/SongAdapter.java 1 ●●●● patch | view | raw | blame | history
app/src/main/java/com/moral/yunfushao/ble/BluetoothService.java 10 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/moral/yunfushao/common/AppConfig.java 1 ●●●● patch | view | raw | blame | history
app/src/main/java/com/moral/yunfushao/common/VersionConstants.java 12 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/moral/yunfushao/fragment/FragmentMonitor.java 138 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/moral/yunfushao/ui/PanelView.java 211 ●●●●● patch | view | raw | blame | history
app/src/main/res/values/strings.xml 1 ●●●● patch | view | raw | blame | history
gradlew patch | view | raw | blame | history
.gradle/4.1/fileHashes/fileHashes.bin
Binary files differ
.gradle/4.1/fileHashes/fileHashes.lock
Binary files differ
.gradle/4.1/fileHashes/resourceHashesCache.bin
Binary files differ
.gradle/4.1/javaCompile/classAnalysis.bin
Binary files differ
.gradle/4.1/javaCompile/jarAnalysis.bin
Binary files differ
.gradle/4.1/javaCompile/javaCompile.lock
Binary files differ
.gradle/4.1/javaCompile/taskHistory.bin
Binary files differ
.gradle/4.1/javaCompile/taskJars.bin
Binary files differ
.gradle/4.1/taskHistory/fileSnapshots.bin
Binary files differ
.gradle/4.1/taskHistory/taskHistory.bin
Binary files differ
.gradle/4.1/taskHistory/taskHistory.lock
Binary files differ
FastBleLib/FastBleLib.iml
@@ -87,6 +87,7 @@
      <sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/annotations" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/attr" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/check-manifest" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
FastBleLib/src/main/java/com/clj/fastble/bluetooth/BleBluetooth.java
@@ -399,7 +399,6 @@
        @Override
        public void onDisConnected(BluetoothGatt gatt, int status, BleException exception) {
            BleLog.i("BleGattCallback:onConnectFailure ");
            closeBluetoothGatt();
            bluetoothGatt = null;
            Iterator iterator = callbackHashMap.entrySet().iterator();
@@ -449,7 +448,7 @@
        @Override
        public void onServicesDiscovered(BluetoothGatt gatt, int status) {
            BleLog.i("BleGattCallback:onServicesDiscovered ");
            BleLog.i("BleGattCallback:onServicesDiscovered " + mtu);
            bluetoothGatt.requestMtu(mtu);
            connectionState = STATE_SERVICES_DISCOVERED;
            Iterator iterator = callbackHashMap.entrySet().iterator();
@@ -479,7 +478,6 @@
        @Override
        public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
            BleLog.i("BleGattCallback:onCharacteristicWrite ");
            Iterator iterator = callbackHashMap.entrySet().iterator();
            while (iterator.hasNext()) {
                Map.Entry entry = (Map.Entry) iterator.next();
@@ -492,7 +490,7 @@
        @Override
        public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
            BleLog.i("BleGattCallback:onCharacteristicChanged ");
            BleLog.i("BleGattCallback:onCharacteristicChanged " + characteristic.getValue().length);
            Iterator iterator = callbackHashMap.entrySet().iterator();
            while (iterator.hasNext()) {
                Map.Entry entry = (Map.Entry) iterator.next();
FastBleLib/src/main/java/com/clj/fastble/conn/BleConnector.java
@@ -361,15 +361,12 @@
                        handler.removeMessages(MSG_NOTIFY_CHA, this);
                    }
                    if (characteristic.getUuid().equals(UUID.fromString(uuid_notify))) {
                        System.out.println("chenqi Notify ->" + characteristic.getValue().length);
                        System.out.println("chenqi Notify Hex ->" + BleBluetooth.dumpHex(characteristic.getValue()));
                        bleCallback.onSuccess(characteristic);
                    }
                }
                @Override
                public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {
                    super.onMtuChanged(gatt, mtu, status);
                    System.out.println(String.format("onMtuChanged:mtu = %s", mtu));
                }
            });
andbrickslib/andbrickslib.iml
@@ -87,6 +87,7 @@
      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/annotations" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/attr" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/check-manifest" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
@@ -107,38 +108,38 @@
    <orderEntry type="sourceFolder" forTests="false" />
    <orderEntry type="library" name="Gradle: com.android.support:appcompat-v7-25.3.1" level="project" />
    <orderEntry type="library" name="Gradle: com.android.support:support-fragment-25.3.1" level="project" />
    <orderEntry type="library" name="Gradle: com.android.support:support-annotations:25.3.1@jar" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test.espresso:espresso-idling-resource-2.2.2" level="project" />
    <orderEntry type="library" name="Gradle: com.android.support:support-media-compat-25.3.1" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: javax.annotation:javax.annotation-api:1.2@jar" level="project" />
    <orderEntry type="library" name="Gradle: com.pnikosis:materialish-progress-1.0" level="project" />
    <orderEntry type="library" name="Gradle: com.lzy.net:okserver-1.1.3" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test.espresso:espresso-core-2.2.2" level="project" />
    <orderEntry type="library" name="Gradle: me.zhanghai.android.materialprogressbar:library-1.4.0" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: com.squareup:javawriter:2.1.1@jar" level="project" />
    <orderEntry type="library" name="Gradle: com.android.support:animated-vector-drawable-25.3.1" level="project" />
    <orderEntry type="library" name="Gradle: com.android.support:support-compat-25.3.1" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test:rules-0.5" level="project" />
    <orderEntry type="library" name="Gradle: com.google.code.gson:gson:2.8.0@jar" level="project" />
    <orderEntry type="library" name="Gradle: com.afollestad.material-dialogs:commons-0.9.4.4" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: com.google.code.findbugs:jsr305:2.0.1@jar" level="project" />
    <orderEntry type="library" name="Gradle: com.android.support:support-v13-25.3.1" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: javax.inject:javax.inject:1@jar" level="project" />
    <orderEntry type="library" name="Gradle: com.android.support:support-annotations:25.3.1@jar" level="project" />
    <orderEntry type="library" name="Gradle: com.afollestad.material-dialogs:core-0.9.4.4" level="project" />
    <orderEntry type="library" name="Gradle: com.android.support:support-v4-25.3.1" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: junit:junit:4.12@jar" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: org.hamcrest:hamcrest-core:1.3@jar" level="project" />
    <orderEntry type="library" name="Gradle: com.android.support:support-core-ui-25.3.1" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test:runner-0.5" level="project" />
    <orderEntry type="library" name="Gradle: com.android.support:support-media-compat-25.3.1" level="project" />
    <orderEntry type="library" name="Gradle: com.pnikosis:materialish-progress-1.0" level="project" />
    <orderEntry type="library" name="Gradle: com.alibaba:fastjson:1.1.56.android@jar" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test:exposed-instrumentation-api-publish-0.5" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: org.hamcrest:hamcrest-library:1.3@jar" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: org.hamcrest:hamcrest-integration:1.3@jar" level="project" />
    <orderEntry type="library" name="Gradle: com.lzy.net:okserver-1.1.3" level="project" />
    <orderEntry type="library" name="Gradle: me.zhanghai.android.materialprogressbar:library-1.4.0" level="project" />
    <orderEntry type="library" name="Gradle: com.android.support:animated-vector-drawable-25.3.1" level="project" />
    <orderEntry type="library" name="Gradle: com.android.support:support-compat-25.3.1" level="project" />
    <orderEntry type="library" name="Gradle: com.android.support:recyclerview-v7-25.3.1" level="project" />
    <orderEntry type="library" name="Gradle: com.lzy.net:okgo-2.1.4" level="project" />
    <orderEntry type="library" name="Gradle: com.squareup.okhttp3:okhttp:3.4.1@jar" level="project" />
    <orderEntry type="library" name="Gradle: com.android.support:support-vector-drawable-25.3.1" level="project" />
    <orderEntry type="library" name="Gradle: com.google.code.gson:gson:2.8.0@jar" level="project" />
    <orderEntry type="library" name="Gradle: com.android.support:support-core-utils-25.3.1" level="project" />
    <orderEntry type="library" name="Gradle: com.squareup.okio:okio:1.9.0@jar" level="project" />
    <orderEntry type="library" name="Gradle: com.afollestad.material-dialogs:commons-0.9.4.4" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test.espresso:espresso-idling-resource-2.2.2" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: javax.annotation:javax.annotation-api:1.2@jar" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test.espresso:espresso-core-2.2.2" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: com.squareup:javawriter:2.1.1@jar" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test:rules-0.5" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: com.google.code.findbugs:jsr305:2.0.1@jar" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: javax.inject:javax.inject:1@jar" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test:runner-0.5" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test:exposed-instrumentation-api-publish-0.5" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: org.hamcrest:hamcrest-library:1.3@jar" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: org.hamcrest:hamcrest-integration:1.3@jar" level="project" />
  </component>
</module>
app/app.iml
@@ -92,7 +92,9 @@
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/javaPrecompile" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/merged-not-compiled-resources" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/prebuild" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/proguard-rules" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/shaders" />
@@ -100,6 +102,7 @@
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/transforms" />
      <excludeFolder url="file://$MODULE_DIR$/build/outputs" />
      <excludeFolder url="file://$MODULE_DIR$/build/reports" />
      <excludeFolder url="file://$MODULE_DIR$/build/tmp" />
    </content>
    <orderEntry type="jdk" jdkName="Android API 25 Platform" jdkType="Android SDK" />
@@ -108,21 +111,14 @@
    <orderEntry type="library" name="Gradle: com.android.support:appcompat-v7-25.3.1" level="project" />
    <orderEntry type="library" name="Gradle: com.android.support:support-fragment-25.3.1" level="project" />
    <orderEntry type="library" name="Gradle: com.android.support:support-annotations:25.3.1@jar" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test.espresso:espresso-idling-resource-2.2.2" level="project" />
    <orderEntry type="library" name="Gradle: pub.devrel:easypermissions-0.4.0" level="project" />
    <orderEntry type="library" name="Gradle: com.android.support:support-media-compat-25.3.1" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: javax.annotation:javax.annotation-api:1.2@jar" level="project" />
    <orderEntry type="library" name="Gradle: com.pnikosis:materialish-progress-1.0" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test.espresso:espresso-core-2.2.2" level="project" />
    <orderEntry type="library" name="Gradle: me.zhanghai.android.materialprogressbar:library-1.4.0" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: com.squareup:javawriter:2.1.1@jar" level="project" />
    <orderEntry type="library" name="Gradle: com.android.support:animated-vector-drawable-25.3.1" level="project" />
    <orderEntry type="library" name="Gradle: com.android.support:support-compat-25.3.1" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test:rules-0.5" level="project" />
    <orderEntry type="library" name="Gradle: com.afollestad.material-dialogs:commons-0.9.4.4" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: com.google.code.findbugs:jsr305:2.0.1@jar" level="project" />
    <orderEntry type="library" name="Gradle: com.android.support:support-v13-25.3.1" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: javax.inject:javax.inject:1@jar" level="project" />
    <orderEntry type="library" name="Gradle: com.contrarywind:Android-PickerView-3.1.2" level="project" />
    <orderEntry type="library" name="Gradle: com.afollestad.material-dialogs:core-0.9.4.4" level="project" />
    <orderEntry type="library" name="Gradle: com.android.support:support-v4-25.3.1" level="project" />
@@ -130,14 +126,10 @@
    <orderEntry type="library" scope="TEST" name="Gradle: junit:junit:4.12@jar" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: org.hamcrest:hamcrest-core:1.3@jar" level="project" />
    <orderEntry type="library" name="Gradle: com.android.support:support-core-ui-25.3.1" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test:runner-0.5" level="project" />
    <orderEntry type="library" name="Gradle: com.android.support:cardview-v7-25.3.1" level="project" />
    <orderEntry type="library" name="Gradle: in.srain.cube:ultra-ptr-1.0.11" level="project" />
    <orderEntry type="library" name="Gradle: org.greenrobot:eventbus:3.0.0@jar" level="project" />
    <orderEntry type="library" name="Gradle: com.alibaba:fastjson:1.1.56.android@jar" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test:exposed-instrumentation-api-publish-0.5" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: org.hamcrest:hamcrest-library:1.3@jar" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: org.hamcrest:hamcrest-integration:1.3@jar" level="project" />
    <orderEntry type="library" name="Gradle: com.github.lecho:hellocharts-library-1.5.8" level="project" />
    <orderEntry type="library" name="Gradle: __local_aars__:/Users/chenqi/AndroidStudioProjects/pregnancy_guard_android/app/libs/BaiduLBS_Android.jar:unspecified@jar" level="project" />
    <orderEntry type="library" name="Gradle: com.daimajia.numberprogressbar:library-1.4" level="project" />
@@ -150,5 +142,18 @@
    <orderEntry type="library" name="Gradle: com.android.support:support-core-utils-25.3.1" level="project" />
    <orderEntry type="module" module-name="andbrickslib" />
    <orderEntry type="module" module-name="FastBleLib" />
    <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test.espresso:espresso-idling-resource-2.2.2" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: javax.annotation:javax.annotation-api:1.2@jar" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test.espresso:espresso-core-2.2.2" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: com.squareup:javawriter:2.1.1@jar" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test:rules-0.5" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: com.google.code.findbugs:jsr305:2.0.1@jar" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: javax.inject:javax.inject:1@jar" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test:runner-0.5" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test:exposed-instrumentation-api-publish-0.5" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: org.hamcrest:hamcrest-library:1.3@jar" level="project" />
    <orderEntry type="library" scope="TEST" name="Gradle: org.hamcrest:hamcrest-integration:1.3@jar" level="project" />
    <orderEntry type="module" module-name="andbrickslib" />
    <orderEntry type="module" module-name="FastBleLib" />
  </component>
</module>
app/build.gradle
@@ -7,31 +7,44 @@
        applicationId "com.moral.yunfushao"
        minSdkVersion 21
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        versionCode 2
        versionName "1.0.2_sp3"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        signingConfig signingConfigs.debug
    }
//    signingConfigs {
//        // your debug keystore
////        debug {
////            keyAlias 'chenqi'
////            keyPassword '123456'
////            storeFile file('/Users/chenqi/chenqi.jks')
////            storePassword '123456'
////        }
//    }
    signingConfigs {
        key {
            keyAlias 'qxpc'
            keyPassword '123456'
            storeFile file('../pregnancy_guard_android/qixingpiaochong')
            storePassword '123456'
        }
    }
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
    //自定义名字
    //3.0版本
    android.applicationVariants.all { variant ->
        variant.outputs.all {
            if (buildType.name == "debug")
                outputFileName = "Dev_yfs_v.${variant.versionName}.apk"
            else outputFileName = "yfs_v.${variant.versionName}.apk"
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            zipAlignEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            manifestPlaceholders = [app_name: "@string/app_name"]//配置渠道
        }
        debug {
            minifyEnabled false
            manifestPlaceholders = [app_name: "@string/app_name_text"]
        }
    }
}
@@ -53,7 +66,7 @@
    compile 'com.github.bumptech.glide:glide:3.7.0'
    //网络请求
    compile 'com.lzy.net:okgo:2.1.4'
     compile files('libs/BaiduLBS_Android.jar')
    compile files('libs/BaiduLBS_Android.jar')
    compile 'pub.devrel:easypermissions:0.4.0'
    compile 'com.daimajia.numberprogressbar:library:1.4@aar'
    compile 'org.greenrobot:eventbus:3.0.0'
app/src/main/AndroidManifest.xml
@@ -34,39 +34,58 @@
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
    <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <!-- 用于开启 debug 版本的应用在6.0 系统上 层叠窗口权限 -->
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <application
        android:allowBackup="true"
        android:name="com.moral.yunfushao.MainApp"
        android:allowBackup="true"
        android:icon="@mipmap/icon"
        tools:replace="android:icon"
        android:label="@string/app_name"
        android:label="${app_name}"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".activity.SplashActivity"
        android:theme="@style/AppTheme"
        tools:replace="android:icon,android:label">
        <activity
            android:name=".activity.SplashActivity"
            android:theme="@style/AppWelcomeTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="com.moral.yunfushao.MainActivity" android:screenOrientation="portrait"/>
        <activity android:name="com.moral.yunfushao.activity.ForgetPasswordActivity" android:screenOrientation="portrait"/>
        <activity android:name="com.moral.yunfushao.activity.LoginActivity" android:screenOrientation="portrait"/>
        <activity android:name="com.moral.yunfushao.activity.RegisterActivity" android:screenOrientation="portrait"/>
        <activity android:name="com.moral.yunfushao.activity.BLESearchActivity" android:screenOrientation="portrait"/>
        <activity android:name="com.moral.yunfushao.activity.VoiceSetActivity" android:screenOrientation="portrait"/>
        <activity android:name="com.moral.yunfushao.activity.ChartActivity" android:screenOrientation="portrait"/>
        <activity android:name="com.moral.yunfushao.activity.ChooseSongActivity" android:screenOrientation="portrait"/>
        <activity android:name="com.moral.yunfushao.activity.TestActivity" android:screenOrientation="portrait"/>
        <activity
            android:name="com.moral.yunfushao.MainActivity"
            android:screenOrientation="portrait" />
        <activity
            android:name="com.moral.yunfushao.activity.ForgetPasswordActivity"
            android:screenOrientation="portrait" />
        <activity
            android:name="com.moral.yunfushao.activity.LoginActivity"
            android:screenOrientation="portrait" />
        <activity
            android:name="com.moral.yunfushao.activity.RegisterActivity"
            android:screenOrientation="portrait" />
        <activity
            android:name="com.moral.yunfushao.activity.BLESearchActivity"
            android:screenOrientation="portrait" />
        <activity
            android:name="com.moral.yunfushao.activity.VoiceSetActivity"
            android:screenOrientation="portrait" />
        <activity
            android:name="com.moral.yunfushao.activity.ChartActivity"
            android:screenOrientation="portrait" />
        <activity
            android:name="com.moral.yunfushao.activity.ChooseSongActivity"
            android:screenOrientation="portrait" />
        <activity
            android:name="com.moral.yunfushao.activity.TestActivity"
            android:screenOrientation="portrait" />
        <service android:name=".ble.BluetoothService" />
        <meta-data
@@ -75,8 +94,7 @@
        <service
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote" >
        </service>
            android:process=":remote"></service>
    </application>
</manifest>
app/src/main/java/com/moral/yunfushao/activity/BLESearchActivity.java
@@ -105,7 +105,10 @@
                    if (MainApp.theApp.bleManager != null) {
                        MainApp.theApp.bleManager.closeBluetoothGatt();
                    }
                    mBluetoothService.scanAndConnect5(scanResultList.get(position).getDevice().getAddress());
                    EventMessage eventMessage = new EventMessage();
                    eventMessage.setType(AppConfig.BLUETOOCH_CHANGE_CONNECT);
                    EventBus.getDefault().post(eventMessage);
                    mBluetoothService.connectDevice(scanResultList.get(position));
                }
            }
app/src/main/java/com/moral/yunfushao/adapter/SongAdapter.java
@@ -9,7 +9,6 @@
import com.moral.andbrickslib.baseadapter.recyclerview.base.ViewHolder;
import com.moral.yunfushao.R;
import com.moral.yunfushao.model.Song;
import com.moral.yunfushao.model.VoiceBean;
import java.util.List;
app/src/main/java/com/moral/yunfushao/ble/BluetoothService.java
@@ -154,24 +154,23 @@
            mCallback.onConnecting();
        }
        System.out.println("BleGattCallback setting " + scanResult.getDevice().getAddress());
        System.out.println("Ble onconnectSuccess");
        bleManager.connectDevice(scanResult, false, new BleGattCallback() {
            @Override
            public void onFoundDevice(ScanResult scanResult) {
                System.out.println("chenqi blueTooth connect state -> onFoundDevice");
                BluetoothService.this.name = scanResult.getDevice().getName();
                BluetoothService.this.mac = scanResult.getDevice().getAddress();
            }
            @Override
            public void onConnecting(BluetoothGatt gatt, int status) {
                System.out.println("chenqi blueTooth connect state -> onConnecting");
            }
            @Override
            public void onConnectError(BleException exception) {
                System.out.println("chenqi blueTooth connect state -> onConnectError");
                runOnMainThread(new Runnable() {
                    @Override
                    public void run() {
@@ -184,12 +183,14 @@
            @Override
            public void onConnectSuccess(BluetoothGatt gatt, int status) {
                System.out.println("chenqi blueTooth connect state -> onConnectSuccess");
                //保存最近连接的蓝牙设备MAC
                MainApp.theApp.sharedPreferencesUtil.saveBLE(gatt.getDevice().getAddress());
            }
            @Override
            public void onServicesDiscovered(final BluetoothGatt gatt, int status) {
                System.out.println("chenqi blueTooth connect state -> onServicesDiscovered");
                BluetoothService.this.gatt = gatt;
                runOnMainThread(new Runnable() {
                    @Override
@@ -203,6 +204,7 @@
            @Override
            public void onDisConnected(BluetoothGatt gatt, int status, BleException exception) {
                System.out.println("chenqi blueTooth connect state -> onDisConnected");
                runOnMainThread(new Runnable() {
                    @Override
                    public void run() {
app/src/main/java/com/moral/yunfushao/common/AppConfig.java
@@ -11,6 +11,7 @@
    public static final int CHANGE_SETTING = 3;
    public static final int SET_MAIN_CALL = 4;
    public static final int SET_VOICE = 5;
    public static final int BLUETOOCH_CHANGE_CONNECT = 6;
    public static String voideUrl1 = "http://yfsapi.7drlb.com/video/boy/music.mp3";
    public static String voideUrl2 = "http://yfsapi.7drlb.com/video/boy/music1.mp3";
    public static String voideUrl3 = "http://yfsapi.7drlb.com/video/boy/music2.mp3";
app/src/main/java/com/moral/yunfushao/common/VersionConstants.java
New file
@@ -0,0 +1,12 @@
package com.moral.yunfushao.common;
/**
 * @author : chenqi.
 * @e_mail : 1650699704@163.com.
 * @create_time : 2018/11/2.
 * @Package_name: pregnancy_guard_android
 */
public class VersionConstants {
    public static final String DEBUG = "debug";
    public static final String RELEASE = "release";
}
app/src/main/java/com/moral/yunfushao/fragment/FragmentMonitor.java
@@ -35,6 +35,7 @@
import com.moral.andbrickslib.utils.TimeUtil;
import com.moral.andbrickslib.utils.dialog.MaterialDialogUtils;
import com.moral.andbrickslib.utils.log.XLog;
import com.moral.yunfushao.BuildConfig;
import com.moral.yunfushao.MainActivity;
import com.moral.yunfushao.MainApp;
import com.moral.yunfushao.R;
@@ -45,6 +46,7 @@
import com.moral.yunfushao.ble.BluetoothService;
import com.moral.yunfushao.common.API;
import com.moral.yunfushao.common.AppConfig;
import com.moral.yunfushao.common.VersionConstants;
import com.moral.yunfushao.httputils.HttpCallBack;
import com.moral.yunfushao.httputils.HttpUtils;
import com.moral.yunfushao.imageload.ImageLoader;
@@ -90,6 +92,7 @@
    private ArrayList<RecData> submitResult = new ArrayList<>();
    private StringBuilder stringResult = new StringBuilder();
    private String deviceName = "";//当前连接的设备名称
    //临时存储上传数据
    private ArrayList<RecData> submitTempResult = new ArrayList<>();
@@ -120,8 +123,10 @@
            handler.removeCallbacks(runnable);
            checkTimeCount = 0;
            result = result.substring(14);
            doHandleData(result);
            if (result.length() > 14) {
                result = result.substring(14);
                doHandleData(result);
            }
        }
        if (result.startsWith("3A")) {
@@ -151,7 +156,6 @@
            if (result.length() >= 76) {
                DebugUtils.sendData("data", result);
                parseHoutData(result.substring(0, 76));
                mBluetoothService.write(mBluetoothService.getWirteCharacteristic().getService().getUuid().toString(), mBluetoothService.getWirteCharacteristic().getUuid().toString(), BLECommon.BLE_SEND_7A, null);
                result = result.substring(76);
                doHandleData(result);
            } else {
@@ -167,6 +171,7 @@
     */
    @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
    public void eventComing(EventMessage msg) {
        System.out.println("chenqi msge -> " + msg.getType());
        if (msg.getType() == AppConfig.GET_BLE_SERVICE) {
            if (chonglianTimer != null) {
                chonglianTimer.cancel();
@@ -190,7 +195,6 @@
                    for (BluetoothGattCharacteristic characteristic : mBluetoothService.getService().getCharacteristics()) {
                        int charaProp = characteristic.getProperties();
                        if ((charaProp & BluetoothGattCharacteristic.PROPERTY_READ) > 0) {
                        }
                        if ((charaProp & BluetoothGattCharacteristic.PROPERTY_WRITE) > 0 || (charaProp & BluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE) > 0) {
                            mBluetoothService.setWirteCharacteristic(characteristic);
@@ -199,6 +203,7 @@
                            mBluetoothService.setCharacteristic(characteristic);
                        }
                    }
                }
                /**
@@ -252,10 +257,6 @@
        } else if (msg.getType() == AppConfig.GET_BLE_DISCONNECT) {
            preLevel = -1;
            showStatus(-1);
            pv.setStatusStr("未连接");
            pv.setPercent(0);
            tv_ljjl.setText("0");
            tv_shishi.setText("0");
            chonglian();
            stop();
            isVirating = false;
@@ -294,7 +295,8 @@
                voiceBean.setName("严重铃声");
                voiceList.add(voiceBean);
            }
        } else if (msg.getType() == AppConfig.BLUETOOCH_CHANGE_CONNECT) {
            showStatus(-1);
        }
    }
@@ -382,14 +384,17 @@
        iv_dianliang.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FlipAnimatorXViewShow(iv_dianliang, tv_dianliang2, 200);
                if (BuildConfig.BUILD_TYPE.equals(VersionConstants.DEBUG)) {
                    FlipAnimatorXViewShow(iv_dianliang, tv_dianliang2, 200);
                }
            }
        });
        tv_dianliang2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FlipAnimatorXViewShow(tv_dianliang2, iv_dianliang, 200);
                if (BuildConfig.BUILD_TYPE.equals(VersionConstants.DEBUG)) {
                    FlipAnimatorXViewShow(tv_dianliang2, iv_dianliang, 200);
                }
            }
        });
        showStatus(-1);
@@ -605,16 +610,18 @@
        int danger = R.mipmap.icon_danger;
        if (type == 1) {
            //电离
            yanzhang = R.mipmap.dianliyanyang;
            danger = R.mipmap.dianlidanger;
            lv_ljjl.setVisibility(View.VISIBLE);
            tvShishiTitle.setText("实时计量(uSv/h)");
        } else if (type == 2) {
            //电磁
            yanzhang = R.mipmap.icon_yanzhong;
            danger = R.mipmap.icon_danger;
            tvShishiTitle.setText("实时计量(V/m)");
            lv_ljjl.setVisibility(View.GONE);
            tvLijiTitle.setText("累计计量(uSv)");
            tvShishiTitle.setText("实时计量(uSv/h)");
            iv_dianliang.setEnabled(false);
        } else if (type == 2) {
            //电磁
            yanzhang = R.mipmap.dianliyanyang;
            danger = R.mipmap.dianlidanger;
            tvLijiTitle.setText("磁场辐射");
            tvShishiTitle.setText("电场辐射");
            iv_dianliang.setEnabled(true);
        }
        if (level == 0) {
@@ -662,6 +669,22 @@
            tv_status.setText("离线");
            tv_status.setTextColor(getResources().getColor(R.color.gray_txt));
            ll_status.setBackgroundResource(R.mipmap.bg_corner_gray);
            pv.setStatusStr("未连接");
            pv.setPercent(0);
            tv_ljjl.setText("0");
            tv_shishi.setText("0");
            showPower(2, 0);
        } else if (level == -2) {
            tv_tishi.setText("当前设备充电中");
            tv_tishi.setBackgroundResource(R.mipmap.bt_green);
            tv_desc.setText("您当前设备在线!");
            iv_status.setVisibility(View.GONE);
            tv_status.setText("充电中");
            ll_status.setBackgroundResource(R.mipmap.bg_corner_gray);
            pv.setPercent(0);
            pv.setStatusStr("连接中");
            tv_ljjl.setText("0");
            tv_shishi.setText("0");
        }
    }
@@ -672,7 +695,6 @@
     */
    private int preLevel = -1;
    /**
     * data : 5A160000FA1C0400004100E7000700000071005B
     * format : 20个字节,5A开头  5B结尾
@@ -682,6 +704,7 @@
     */
    //todo 解析实时数据
    private void parseCurrentData(String nowResult) {
        System.out.println("chenqi nowResult parseCurrentData");
        type = 1;
        if (!TextUtils.isEmpty(nowResult) && nowResult.length() == 40 && nowResult.startsWith("5A") && nowResult.endsWith("5B")) {
            int real = Integer.parseInt(nowResult.substring(24, 26), 16) * 256 + Integer.parseInt(nowResult.substring(26, 28), 16);
@@ -701,10 +724,6 @@
            data.setTime(TimeUtil.getCurrentDate("yyyy-MM-dd HH:mm:ss"));
            data.setType(0);
            /**
             * 显示电量
             */
            showPower(b1, b2);
            if (realValue < 0.16) {
                data.setIs_warn(0);
@@ -748,7 +767,10 @@
                    AudioUtils.vibrate(getActivity(), new long[]{1000, 1000, 1000, 1000}, 0);
                }
            }
            /**
             * 显示电量
             */
            showPower(b1, b2);
            submitResult.add(data);
//            realResult.clear();
        }
@@ -760,6 +782,7 @@
     * 电磁辐射显示
     */
    private void parseHoutData(String nowResult) {
        System.out.println("chenqi elec parseHoutData" + nowResult);
        if (TextUtils.isEmpty(nowResult)) {
            return;
        }
@@ -767,33 +790,41 @@
        String[] strings = StringUtils.splitString(nowResult, 2);
        if (strings[0].startsWith("7A") && strings[35].endsWith("7B")) {
            String realString = StringUtils.subStrings(strings, 21, 23);
            int real = Integer.parseInt(realString, 16);
            int electric_field = Integer.parseInt(realString, 16);
            int b1 = Integer.parseInt(strings[24], 16);
            int b2 = Integer.parseInt(strings[25], 16);
            double realValue = NumberUtils.getBigDecimalValue((real) / 100.0, 3);
            int baojing = Integer.parseInt(strings[29], 16);
            int elec = Integer.parseInt(StringUtils.subStrings(strings, 13, 15));
//            T.show("bl = " + strings[24] + " -- b2 = " + strings[25]);
//
//            System.out.println("bl = " + b1 + " -- b2 = " + b2);
            double electricFieldValue = (electric_field) / 100.0;
            double elecValue = (elec) / 100.0;
            String power = StringUtils.subStrings(strings, 26, 27);
            double textPower = Integer.parseInt(power, 16) / 1000.0;
            tv_shishi.setText(electricFieldValue + "(V/m)");
            tv_dianliang2.setText(textPower + "V");
            tv_shishi.setText(realValue + "");
            tv_ljjl.setText(elecValue + "(μT)");
            /**
             * 保存数据至内存
             */
            RecData data = new RecData();
            data.setValue(realValue);
            data.setValue(electricFieldValue);
            data.setTime(TimeUtil.getCurrentDate("yyyy-MM-dd HH:mm:ss"));
            data.setType(0);
            /**
             * 电量显示
             */
            showPower(b1, b2);
            showStatus(Integer.parseInt(strings[21], 16));
            if (realValue < 0.16) {
                data.setIs_warn(0);
                pv.setPercent((float) (realValue * (0.25 / 0.16)));
            if (baojing == 0) {
                pv.setPercent((float) (0.125));
                showStatus(0);
                stop();
                if (isVirating) {
@@ -801,40 +832,50 @@
                    AudioUtils.virateCancle(getActivity());
                }
                preLevel = -1;
            } else if (realValue >= 0.16 && realValue < 0.8) {
            } else if (baojing == 1) {
                data.setIs_warn(1);
                pv.setPercent((float) (0.25 + realValue * (0.25 / 0.8)));
                pv.setPercent((float) (0.375));
                showStatus(1);
                play(0);
                if (!isVirating) {
                    isVirating = true;
                    AudioUtils.vibrate(getActivity(), new long[]{1000, 1000, 1000, 1000}, 0);
                }
            } else if (realValue >= 0.8 && realValue < 2) {
            } else if (baojing == 2) {
                data.setIs_warn(1);
                showStatus(2);
                pv.setPercent((float) (0.5 + realValue * (0.25 / 2)));
                pv.setPercent((float) (0.625));
                play(1);
                if (!isVirating) {
                    isVirating = true;
                    AudioUtils.vibrate(getActivity(), new long[]{1000, 1000, 1000, 1000}, 0);
                }
            } else if (realValue >= 2) {
            } else if (baojing == 3) {
                data.setIs_warn(1);
                showStatus(3);
                if ((0.75 + realValue / 30) < 1.0) {
                    pv.setPercent((float) (0.75 + realValue / 30));
                } else {
                    pv.setPercent(1.0f);
                pv.setPercent((float) (0.875));
                play(2);
                if (!isVirating) {
                    isVirating = true;
                    AudioUtils.vibrate(getActivity(), new long[]{1000, 1000, 1000, 1000}, 0);
                }
            } else if (baojing == 4) {
                data.setIs_warn(1);
                showStatus(3);
                pv.setPercent((float) (1.00));
                play(2);
                if (!isVirating) {
                    isVirating = true;
                    AudioUtils.vibrate(getActivity(), new long[]{1000, 1000, 1000, 1000}, 0);
                }
            }
            System.out.println("chenqi elec B-- " + b2);
            /**
             * 电量显示
             */
            showPower(b1, b2);
            submitResult.add(data);
//            realResult.clear();
            //            realResult.clear();
        }
    }
@@ -868,7 +909,6 @@
            ArrayList<RecData> temp = new ArrayList<>();
            temp.add(data);
            Log.d("hourdata", "=====hourdata=====" + FastJsonTools.toJson(temp));
            test(nowResult, time.toString());
            submitHourData(temp);
        }
@@ -880,6 +920,7 @@
    private void showPower(int b1, int b2) {
        if (b1 == 1) {
            ImageLoader.setGIFByUrl(getActivity(), R.mipmap.icon_chong, iv_dianliang);
            showStatus(-2);
        } else if (b1 == 2) {
            ImageLoader.setImageViewById(getActivity(), R.mipmap.icon_full, iv_dianliang);
        } else {
@@ -1065,7 +1106,6 @@
    }
    public static void FlipAnimatorXViewShow(final View oldView, final View newView, final long time) {
        ObjectAnimator animator1 = ObjectAnimator.ofFloat(oldView, "rotationX", 0, 90);
        final ObjectAnimator animator2 = ObjectAnimator.ofFloat(newView, "rotationX", -90, 0);
        animator2.setInterpolator(new OvershootInterpolator(2.0f));
app/src/main/java/com/moral/yunfushao/ui/PanelView.java
@@ -1,5 +1,6 @@
package com.moral.yunfushao.ui;
import android.animation.ValueAnimator;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
@@ -28,11 +29,11 @@
    private int mmHeight;
    //绘制渐变圆弧的画笔
    private Paint mShaderPaint;
    private int[] mshaderColor = new int[]{0xfff70e17,0xfff70e17,0xfff70e17,0xffff5c92,0xff00c44a,0xff00d062,0xff00f5af,0xff00f6cb,0xff00ccff,0xff179fff,0xffa054ff,0xffa53aff,0xffd74bff,0xfff64da5,0xfff70e17};
    private int[] mshaderRedColor = new int[]{0xfff70e17,0xffff5c92};
    private int[] mshaderZiseColor = new int[]{0xffa53aff,0xffd74bff,0xfff64da5};
    private int[] mshaderBlueColor = new int[]{0xff00f6cb,0xff00ccff,0xff179fff,0xffa054ff};
    private int[] mshaderGreenColor = new int[]{0xff00c44a,0xff00d062,0xff00f5af};
    private int[] mshaderColor = new int[]{0xfff70e17, 0xfff70e17, 0xfff70e17, 0xffff5c92, 0xff00c44a, 0xff00d062, 0xff00f5af, 0xff00f6cb, 0xff00ccff, 0xff179fff, 0xffa054ff, 0xffa53aff, 0xffd74bff, 0xfff64da5, 0xfff70e17};
    private int[] mshaderRedColor = new int[]{0xfff70e17, 0xffff5c92};
    private int[] mshaderZiseColor = new int[]{0xffa53aff, 0xffd74bff, 0xfff64da5};
    private int[] mshaderBlueColor = new int[]{0xff00f6cb, 0xff00ccff, 0xff179fff, 0xffa054ff};
    private int[] mshaderGreenColor = new int[]{0xff00c44a, 0xff00d062, 0xff00f5af};
    //环形渐变色值渲染
    private SweepGradient mSweepGradient;
    private int mShaderWidth = 70;
@@ -59,7 +60,7 @@
    private Paint drawTextPaint;
    private int textColor = Color.GRAY;
    private int textSize = 36;
    private String[] level = {"绝对安全","建议回避","及时闪躲","紧急撤离"};
    private String[] level = {"绝对安全", "建议回避", "及时闪躲", "紧急撤离"};
    //内进度圆
    private Paint mCirclePaint;
@@ -75,17 +76,26 @@
    private Bitmap mBitmap;
    private float percent = 0;//百分比数据
    private float percent2 = (float) 0.27;//百分比数据
    private String statusStr = "未连接";
    private ValueAnimator anim;
    public void setStatusStr(String statusStr){
    public void setStatusStr(String statusStr) {
        this.statusStr = statusStr;
        postInvalidate();
    }
    public void setPercent(float percent){
    public void setPercent(float percent) {
        this.percent = percent;
//        this.percent2 = percent;
        postInvalidate();
//        if (anim.isStarted() || anim.isRunning()) {
//            anim.end();
//            anim.cancel();
//        }
//        anim.start();
    }
    public PanelView(Context context) {
@@ -106,15 +116,15 @@
    private void init(Context mContext) {
        this.mContext = mContext;
        //初始化
        mShaderWidth = dip2px(mContext,24);
        line1Length = dip2px(mContext,14);
        line2Length = dip2px(mContext,22);
        lineWidth = dip2px(mContext,2);
        widthInner = dip2px(mContext,40);
        paddingKedu = dip2px(mContext,10);
        mCircleWidth = dip2px(mContext,24);
        innerPadding = dip2px(mContext,8);
        textSize = dip2px(mContext,12);
        mShaderWidth = dip2px(mContext, 24);
        line1Length = dip2px(mContext, 14);
        line2Length = dip2px(mContext, 22);
        lineWidth = dip2px(mContext, 2);
        widthInner = dip2px(mContext, 40);
        paddingKedu = dip2px(mContext, 10);
        mCircleWidth = dip2px(mContext, 24);
        innerPadding = dip2px(mContext, 8);
        textSize = dip2px(mContext, 12);
        //渐变圆环
        mShaderPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
@@ -123,7 +133,7 @@
        mShaderPaint.setStrokeCap(Paint.Cap.ROUND);
        paintGapLine = new Paint(Paint.ANTI_ALIAS_FLAG);
        paintGapLine.setColor(Color.WHITE);
        paintGapLine.setStrokeWidth(dip2px(mContext,3));
        paintGapLine.setStrokeWidth(dip2px(mContext, 3));
        //刻度
        mLinePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mLinePaint.setStyle(Paint.Style.STROKE);
@@ -149,7 +159,8 @@
        mBitPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mBitPaint.setFilterBitmap(true);
        mBitPaint.setDither(true);
        mBitmap = ((BitmapDrawable)mContext.getResources().getDrawable(R.mipmap.zhizhen)).getBitmap();
        mBitmap = ((BitmapDrawable) mContext.getResources().getDrawable(R.mipmap.zhizhen)).getBitmap();
//        startAnimation();
    }
    @Override
@@ -169,50 +180,78 @@
        } else {
            mmHeight = dip2px(mContext, 300);
        }
        mWidth = mmWidth<mmHeight?mmWidth:mmHeight;
        mWidth = mmWidth < mmHeight ? mmWidth : mmHeight;
        setMeasuredDimension(mmWidth, mmHeight);
    }
//    private void startAnimation() {
//        anim = ValueAnimator.ofObject(new CustomPointEvaluator(),(float)0, percent2);
//        anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
//            @Override
//            public void onAnimationUpdate(ValueAnimator animation) {
//                percent = (float) animation.getAnimatedValue();
//                System.out.println("chenqi rotato " + percent + " all -> " + percent2 * 300);
////                invalidate();
//            }
//        });
//        anim.setDuration(3000L);
//        anim.setRepeatCount(Animation.INFINITE);
//    }
//
//    private class CustomPointEvaluator implements TypeEvaluator<Float> {
//        @Override
//        public Float evaluate(float fraction, Float startValue, Float endValue) {
//            System.out.println("chenqi2 rotato " + fraction + " all -> " + endValue);
//            float y = fraction * endValue;
//            return y;
//        }
//    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
         //画刻度
        //画刻度
        drawKedu(canvas);
        //画刻度文字
        drawTextKedu(canvas);
        //画渐变圆环
        drawJianbianCircle(canvas);
        //画内圆
        RectF cirlcleRect = new RectF(mShaderWidth + widthInner+mCircleWidth+innerPadding, mShaderWidth + widthInner+mCircleWidth+innerPadding, mWidth - mShaderWidth - widthInner-mCircleWidth-innerPadding, mWidth - mShaderWidth - widthInner-mCircleWidth-innerPadding);
        RectF cirlcleRect = new RectF(mShaderWidth + widthInner + mCircleWidth + innerPadding, mShaderWidth + widthInner + mCircleWidth + innerPadding, mWidth - mShaderWidth - widthInner - mCircleWidth - innerPadding, mWidth - mShaderWidth - widthInner - mCircleWidth - innerPadding);
        canvas.drawArc(cirlcleRect, 0, 360, false, mCirclePaint);
        //画指针
        float circleR = (cirlcleRect.right - cirlcleRect.left)/2;
        float circleR = (cirlcleRect.right - cirlcleRect.left) / 2;
        float bitH = circleR;
        float bitW = bitH*0.448f;
        float bitW = bitH * 0.448f;
        canvas.save();
        canvas.rotate(percent*300-150,mWidth/2,mWidth/2);
        RectF btmRect = new RectF((float) (cirlcleRect.left+bitH-bitW*0.535), (float) (cirlcleRect.top+mCircleWidth*0.68),(float) (cirlcleRect.left+bitH+bitW*0.465), (float) (cirlcleRect.top+bitH+mCircleWidth*0.68));
        System.out.println("chenqi percent connect" + percent);
        canvas.rotate(percent * 300 - 150, mWidth / 2, mWidth / 2);
        RectF btmRect = new RectF((float) (cirlcleRect.left + bitH - bitW * 0.535), (float) (cirlcleRect.top + mCircleWidth * 0.68), (float) (cirlcleRect.left + bitH + bitW * 0.465), (float) (cirlcleRect.top + bitH + mCircleWidth * 0.68));
//        Log.d("haijiang","left="+btmRect.left);
//        Log.d("haijiang","right="+btmRect.right);
//        Log.d("haijiang","top="+btmRect.top);
//        Log.d("haijiang","bottom="+btmRect.bottom);
//        Log.d("haijiang","宽高比例="+(btmRect.right-btmRect.left)/(btmRect.bottom-btmRect.top));
        canvas.drawBitmap(mBitmap,null,btmRect,mBitPaint);
        canvas.drawBitmap(mBitmap, null, btmRect, mBitPaint);
        canvas.restore();
        drawTextPaint.setColor(line3Color);
        drawTextPaint.setTextSize(textSize);
        int statusStrWidth = (int) drawTextPaint.measureText(this.statusStr);
        canvas.drawText(this.statusStr,mWidth / 2-statusStrWidth/2, mWidth/2+(btmRect.bottom-btmRect.top)/2,drawTextPaint);
       if(percent>0)
          canvas.drawArc(new RectF(mShaderWidth + widthInner+mCircleWidth+innerPadding, mShaderWidth + widthInner+mCircleWidth+innerPadding, mWidth - mShaderWidth - widthInner-mCircleWidth-innerPadding, mWidth - mShaderWidth - widthInner-mCircleWidth-innerPadding), 120, 300*percent, false, mProgressPaint);
        canvas.drawText(this.statusStr, mWidth / 2 - statusStrWidth / 2, mWidth / 2 + (btmRect.bottom - btmRect.top) / 2, drawTextPaint);
        if (percent > 0)
            canvas.drawArc(new RectF(mShaderWidth + widthInner + mCircleWidth + innerPadding, mShaderWidth + widthInner + mCircleWidth + innerPadding, mWidth - mShaderWidth - widthInner - mCircleWidth - innerPadding, mWidth - mShaderWidth - widthInner - mCircleWidth - innerPadding),
                    120, 300 * percent, false, mProgressPaint);
    }
    /**
     * 画刻度
     *
     * @param canvas
     */
    private void drawKedu(Canvas canvas){
    private void drawKedu(Canvas canvas) {
        //画右边刻度
        for (int i = 0; i <= 50; i++) {
            canvas.save();
@@ -245,85 +284,86 @@
    /**
     * 画刻度文字
     *
     * @param canvas
     */
    private void drawTextKedu(Canvas canvas){
        for(int i=0;i<level.length;i++){
    private void drawTextKedu(Canvas canvas) {
        for (int i = 0; i < level.length; i++) {
            float textWidth = drawTextPaint.measureText(level[i]);
            if(percent<0.25){
                if(i==0){
            if (percent < 0.25) {
                if (i == 0) {
                    drawTextPaint.setColor(line3Color);
                }else{
                } else {
                    drawTextPaint.setColor(Color.GRAY);
                }
                canvas.save();
                if(i==0){
                    canvas.rotate(-120,mWidth/2,mWidth/2);
                }else if(i==1){
                    canvas.rotate(-45,mWidth/2,mWidth/2);
                }else if(i==2){
                    canvas.rotate(45,mWidth/2,mWidth/2);
                }else if(i==3){
                    canvas.rotate(120,mWidth/2,mWidth/2);
                if (i == 0) {
                    canvas.rotate(-120, mWidth / 2, mWidth / 2);
                } else if (i == 1) {
                    canvas.rotate(-45, mWidth / 2, mWidth / 2);
                } else if (i == 2) {
                    canvas.rotate(45, mWidth / 2, mWidth / 2);
                } else if (i == 3) {
                    canvas.rotate(120, mWidth / 2, mWidth / 2);
                }
                canvas.drawText(level[i],mWidth / 2-textWidth/2, paddingKedu+line2Length+textSize,drawTextPaint);
                canvas.drawText(level[i], mWidth / 2 - textWidth / 2, paddingKedu + line2Length + textSize, drawTextPaint);
                canvas.restore();
            }else if(percent>=0.25&&percent<0.5){
                if(i==1){
            } else if (percent >= 0.25 && percent < 0.5) {
                if (i == 1) {
                    drawTextPaint.setColor(line3Color);
                }else{
                } else {
                    drawTextPaint.setColor(Color.GRAY);
                }
                canvas.save();
//                canvas.rotate(-120+i*75,mWidth/2,mWidth/2);
                if(i==0){
                    canvas.rotate(-120,mWidth/2,mWidth/2);
                }else if(i==1){
                    canvas.rotate(-45,mWidth/2,mWidth/2);
                }else if(i==2){
                    canvas.rotate(45,mWidth/2,mWidth/2);
                }else if(i==3){
                    canvas.rotate(120,mWidth/2,mWidth/2);
                if (i == 0) {
                    canvas.rotate(-120, mWidth / 2, mWidth / 2);
                } else if (i == 1) {
                    canvas.rotate(-45, mWidth / 2, mWidth / 2);
                } else if (i == 2) {
                    canvas.rotate(45, mWidth / 2, mWidth / 2);
                } else if (i == 3) {
                    canvas.rotate(120, mWidth / 2, mWidth / 2);
                }
                canvas.drawText(level[i],mWidth / 2-textWidth/2, paddingKedu+line2Length+textSize,drawTextPaint);
                canvas.drawText(level[i], mWidth / 2 - textWidth / 2, paddingKedu + line2Length + textSize, drawTextPaint);
                canvas.restore();
            }else if(percent>=0.5&&percent<0.75){
                if(i==2){
            } else if (percent >= 0.5 && percent < 0.75) {
                if (i == 2) {
                    drawTextPaint.setColor(line3Color);
                }else{
                } else {
                    drawTextPaint.setColor(Color.GRAY);
                }
                canvas.save();
//                canvas.rotate(-120+i*75,mWidth/2,mWidth/2);
                if(i==0){
                    canvas.rotate(-120,mWidth/2,mWidth/2);
                }else if(i==1){
                    canvas.rotate(-45,mWidth/2,mWidth/2);
                }else if(i==2){
                    canvas.rotate(45,mWidth/2,mWidth/2);
                }else if(i==3){
                    canvas.rotate(120,mWidth/2,mWidth/2);
                if (i == 0) {
                    canvas.rotate(-120, mWidth / 2, mWidth / 2);
                } else if (i == 1) {
                    canvas.rotate(-45, mWidth / 2, mWidth / 2);
                } else if (i == 2) {
                    canvas.rotate(45, mWidth / 2, mWidth / 2);
                } else if (i == 3) {
                    canvas.rotate(120, mWidth / 2, mWidth / 2);
                }
                canvas.drawText(level[i],mWidth / 2-textWidth/2, paddingKedu+line2Length+textSize,drawTextPaint);
                canvas.drawText(level[i], mWidth / 2 - textWidth / 2, paddingKedu + line2Length + textSize, drawTextPaint);
                canvas.restore();
            }else if(percent>=0.75){
                if(i==3){
            } else if (percent >= 0.75) {
                if (i == 3) {
                    drawTextPaint.setColor(line3Color);
                }else{
                } else {
                    drawTextPaint.setColor(Color.GRAY);
                }
                canvas.save();
//                canvas.rotate(-105+i*75,mWidth/2,mWidth/2);
                if(i==0){
                    canvas.rotate(-120,mWidth/2,mWidth/2);
                }else if(i==1){
                    canvas.rotate(-45,mWidth/2,mWidth/2);
                }else if(i==2){
                    canvas.rotate(45,mWidth/2,mWidth/2);
                }else if(i==3){
                    canvas.rotate(120,mWidth/2,mWidth/2);
                if (i == 0) {
                    canvas.rotate(-120, mWidth / 2, mWidth / 2);
                } else if (i == 1) {
                    canvas.rotate(-45, mWidth / 2, mWidth / 2);
                } else if (i == 2) {
                    canvas.rotate(45, mWidth / 2, mWidth / 2);
                } else if (i == 3) {
                    canvas.rotate(120, mWidth / 2, mWidth / 2);
                }
                canvas.drawText(level[i],mWidth / 2-textWidth/2, paddingKedu+line2Length+textSize,drawTextPaint);
                canvas.drawText(level[i], mWidth / 2 - textWidth / 2, paddingKedu + line2Length + textSize, drawTextPaint);
                canvas.restore();
            }
        }
@@ -331,24 +371,25 @@
    /**
     * 画渐变圆环
     *
     * @param canvas
     */
    private void drawJianbianCircle(Canvas canvas){
    private void drawJianbianCircle(Canvas canvas) {
        mSweepGradient = new SweepGradient(mWidth / 2, mWidth / 2, mshaderColor, null);
        mShaderPaint.setShader(mSweepGradient);
        canvas.drawArc(new RectF(mShaderWidth + widthInner, mShaderWidth + widthInner, mWidth - mShaderWidth - widthInner, mWidth - mShaderWidth - widthInner), 120, 300, false, mShaderPaint);
        //画圆环分隔
        canvas.save();
        canvas.rotate(75, mWidth / 2, mWidth / 2);
        canvas.drawLine(mWidth / 2, line2Length + paddingKedu*3, mWidth / 2, (float) (line2Length + paddingKedu*0.65+mShaderWidth*2), paintGapLine);
        canvas.drawLine(mWidth / 2, line2Length + paddingKedu * 3, mWidth / 2, (float) (line2Length + paddingKedu * 0.65 + mShaderWidth * 2), paintGapLine);
        canvas.restore();
        canvas.save();
        canvas.rotate(0, mWidth / 2, mWidth / 2);
        canvas.drawLine(mWidth / 2, line2Length + paddingKedu*3, mWidth / 2, (float) (line2Length + paddingKedu*0.65+mShaderWidth*2), paintGapLine);
        canvas.drawLine(mWidth / 2, line2Length + paddingKedu * 3, mWidth / 2, (float) (line2Length + paddingKedu * 0.65 + mShaderWidth * 2), paintGapLine);
        canvas.restore();
        canvas.save();
        canvas.rotate(-75, mWidth / 2, mWidth / 2);
        canvas.drawLine(mWidth / 2, line2Length + paddingKedu*3, mWidth / 2, (float) (line2Length + paddingKedu*0.65+mShaderWidth*2), paintGapLine);
        canvas.drawLine(mWidth / 2, line2Length + paddingKedu * 3, mWidth / 2, (float) (line2Length + paddingKedu * 0.65 + mShaderWidth * 2), paintGapLine);
        canvas.restore();
    }
app/src/main/res/values/strings.xml
@@ -1,5 +1,6 @@
<resources>
    <string name="app_name">孕妇哨</string>
    <string name="app_name_text">孕妇哨Text</string>
    <string name="action_settings">Settings</string>
    <string name="soft_update_no">已经是最新版本</string>
gradlew
old mode 100644 new mode 100755