add config of function.
authorTrillGates <williamtrillgates@gmail.com>
Wed, 22 Sep 2021 03:34:17 +0000 (11:34 +0800)
committerTrillGates <williamtrillgates@gmail.com>
Wed, 22 Sep 2021 03:34:17 +0000 (11:34 +0800)
17 files changed:
app/release/ICL02Blood_V94_202109171032_release.apk [moved from app/release/ICL02Blood_V93_202109161706_release.apk with 54% similarity]
app/release/output.json
app/src/main/java/com/ic/blood/BloodActivity.java
app/src/main/java/com/ic/blood/Gh301Activity.java
app/src/main/java/com/ic/blood/LogManager.java [new file with mode: 0644]
app/src/main/java/com/ic/blood/LogUtil.java [new file with mode: 0644]
app/src/main/java/com/ic/blood/TestActivity.java [new file with mode: 0644]
app/src/main/java/com/ic/blood/WelcomeActivity.java
app/src/main/java/com/ic/blood/fragment/AllFragment.java [new file with mode: 0644]
app/src/main/java/com/ic/blood/fragment/HeartRateAndBloodPressureFragment.java [moved from app/src/main/java/com/ic/blood/fragment/HeartRateAndBloodOxygenFragment.java with 90% similarity]
app/src/main/java/com/ic/blood/fragment/JustOxygenFragment.java [moved from app/src/main/java/com/ic/blood/fragment/OxygenFragment.java with 94% similarity]
app/src/main/java/com/ic/blood/fragment/OxygenAndPressureFragment.java [moved from app/src/main/java/com/ic/blood/fragment/BloodFragment.java with 87% similarity]
app/src/main/java/com/ic/blood/fragment/SelectFragment.java
app/src/main/res/layout/fragment_heart_rate_pressure.xml [moved from app/src/main/res/layout/fragment_heart_rate_both.xml with 93% similarity]
app/src/main/res/layout/fragment_oxygen.xml
app/src/main/res/layout/fragment_oxygen_and_pressure.xml [new file with mode: 0644]
app/version_code.properties

similarity index 54%
rename from app/release/ICL02Blood_V93_202109161706_release.apk
rename to app/release/ICL02Blood_V94_202109171032_release.apk
index 7266d3b..28f06bd 100644 (file)
Binary files a/app/release/ICL02Blood_V93_202109161706_release.apk and b/app/release/ICL02Blood_V94_202109171032_release.apk differ
index 79ab7f6..371ec6f 100644 (file)
@@ -1 +1 @@
-[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":93,"versionName":"202109161706","enabled":true,"outputFile":"ICL02Blood_V93_202109161706_release.apk","fullName":"release","baseName":"release"},"path":"ICL02Blood_V93_202109161706_release.apk","properties":{}}]
\ No newline at end of file
+[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":94,"versionName":"202109171032","enabled":true,"outputFile":"ICL02Blood_V94_202109171032_release.apk","fullName":"release","baseName":"release"},"path":"ICL02Blood_V94_202109171032_release.apk","properties":{}}]
\ No newline at end of file
index 85b5231..8ea1fa5 100644 (file)
@@ -12,7 +12,7 @@ import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentManager;
 import androidx.fragment.app.FragmentTransaction;
 
-import com.ic.blood.fragment.BloodFragment;
+import com.ic.blood.fragment.AllFragment;
 import com.ic.blood.util.IcLog;
 
 public class BloodActivity extends AppCompatActivity {
@@ -26,7 +26,7 @@ public class BloodActivity extends AppCompatActivity {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_blood);
         fragmentManager = getSupportFragmentManager();
-        commitFragment(BloodFragment.newInstance());
+        commitFragment(AllFragment.newInstance());
         IcLog.d("TAG", "onCreate...");
         IntentFilter intentFilter = new IntentFilter();
         intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
index d31fde8..580d2f8 100644 (file)
@@ -1,6 +1,7 @@
 package com.ic.blood;
 
 import android.os.Bundle;
+import android.text.TextUtils;
 
 import androidx.annotation.Nullable;
 import androidx.appcompat.app.AppCompatActivity;
@@ -8,37 +9,44 @@ import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentManager;
 import androidx.fragment.app.FragmentTransaction;
 
-import com.ic.blood.fragment.HeartRateAndBloodOxygenFragment;
+import com.ic.blood.fragment.AllFragment;
+import com.ic.blood.fragment.HeartRateAndBloodPressureFragment;
 import com.ic.blood.fragment.JustHeartRateFragment;
-import com.ic.blood.fragment.OxygenFragment;
+import com.ic.blood.fragment.JustOxygenFragment;
+import com.ic.blood.fragment.OxygenAndPressureFragment;
 import com.ic.blood.fragment.SelectFragment;
 import com.ic.blood.util.SystemUtils;
-import com.ic.iclooger.ICLogger;
 
 public class Gh301Activity extends AppCompatActivity {
 
-    private String isShowBothInfo;
-
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_blood);
-        //先显示选择测试的UI
-        //切换Activity即可
-
-        String isGh301 = SystemUtils
-                .getSystemPropertiesString("persist.sys.is_gh301",
-                        "false");
-        //hr:heart_rate,br:blood oxygen
-        isShowBothInfo = SystemUtils
-                .getSystemPropertiesString("persist.sys.hr_and_bo",
-                        "false");
-
-        String customName = SystemUtils.getSystemProperties("persist.sys.customname");
-        ICLogger.i("customName = "+customName);
-        if (Boolean.parseBoolean(isGh301) && !customName.equals("AA")) {
-            showFragment(JustHeartRateFragment.newInstance());
-        }else {
+        //UI显示,显示所有,显示选择列表
+        /**
+         * persist.sys.health.function=7
+         * 功能有:心率,血压,血氧
+         *
+         * 功能值有111-> 7 心率,血压,血氧
+         *             110-> 6 心率,血压
+         *             101-> 5 心率,血氧
+         *             100-> 4 心率
+         *             011-> 3 血压,血氧
+         *             010-> 2 血压
+         *             001-> 1 血氧
+         *             000-> 0 不支持
+         */
+        //persist.sys.health.display.all的值不为空,那么就显示所有,没有选项
+        //如果persist.sys.health.display.all为空,那么就显示列表
+        //进去之后,Instance可以判断功能项,有的话就显示,没有的的话就不显示
+        String displayTypeList1 = SystemUtils
+                .getSystemPropertiesString("persist.sys.health.display.List1",
+                        "");
+        //如果List1为空,或者两个都为空,那么就显示默认的
+        if (TextUtils.isEmpty(displayTypeList1)) {
+            showFragment(AllFragment.newInstance());
+        } else {
             showFragment(SelectFragment.newInstance());
         }
     }
@@ -50,14 +58,20 @@ public class Gh301Activity extends AppCompatActivity {
         fragmentTransaction.commit();
     }
 
-    public void showOxygenPage() {
-        showFragment(OxygenFragment.newInstance());
+    public void showOxygenAndPressurePage() {
+        showFragment(OxygenAndPressureFragment.newInstance());
+    }
+
+    public void showJustOxygenPage() {
+        showFragment(JustOxygenFragment.newInstance());
     }
 
     public void showHeartRatePage() {
-        showFragment(Boolean.parseBoolean(isShowBothInfo) ?
-                HeartRateAndBloodOxygenFragment.newInstance() :
-                JustHeartRateFragment.newInstance());
+        showFragment(JustHeartRateFragment.newInstance());
+    }
+
+    public void showHeartRateAndPressurePage() {
+        showFragment(HeartRateAndBloodPressureFragment.newInstance());
     }
 
     @Override
diff --git a/app/src/main/java/com/ic/blood/LogManager.java b/app/src/main/java/com/ic/blood/LogManager.java
new file mode 100644 (file)
index 0000000..47a32ea
--- /dev/null
@@ -0,0 +1,47 @@
+package com.ic.blood;
+
+import java.io.File;
+
+public class LogManager  {
+
+    private static volatile LogManager mInstance;
+    private String logFilePath;
+
+    private LogManager() {
+
+    }
+
+    public static LogManager getInstance() {
+        if (mInstance == null) {
+            synchronized (LogManager.class) {
+                if (mInstance == null) {
+                    mInstance = new LogManager();
+                }
+            }
+        }
+        return mInstance;
+    }
+
+    public void init(String logFilePath) {
+        this.logFilePath = logFilePath;
+        createLogFile();
+    }
+
+    private boolean createLogFile() {
+        boolean ret = false;
+        File file = new File(logFilePath);
+        try {
+            if (!file.getParentFile().exists()) {
+                file.getParentFile().mkdirs();
+            }
+            ret = file.createNewFile();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return ret;
+    }
+
+    String getLogFilePath() {
+        return logFilePath;
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/ic/blood/LogUtil.java b/app/src/main/java/com/ic/blood/LogUtil.java
new file mode 100644 (file)
index 0000000..3d498f1
--- /dev/null
@@ -0,0 +1,217 @@
+package com.ic.blood;
+
+import android.os.Environment;
+import android.util.Log;
+
+
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileWriter;
+import java.io.InputStream;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+import java.util.Properties;
+
+public class LogUtil {
+    private static final int VERBOSE = 0;
+    private static final int DEBUG = 1;
+    private static final int INFO = 2;
+    private static final int WARNING = 3;
+    private static final int ERROR = 4;
+    private static final int NO_LOG = 5;
+    private static final String LOG_FILE = LogManager.getInstance().getLogFilePath();
+    private static LogUtil mInstance = null;
+    private static int LOG_LEVEL = NO_LOG;
+    private static boolean logFileEnable = false;
+
+    static {
+        try {
+            // 通过SD卡配置文件启用日志
+            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
+                // path为配置文件的路径
+                String path = Environment.getExternalStorageDirectory() + "/config.properties";
+                if ((new File(path).exists())) {
+                    InputStream inputStream = new FileInputStream(path);
+                    Properties properties = new Properties();
+                    properties.load(inputStream);
+                    if ("true".equals(properties.getProperty("logcat"))) {
+                        LOG_LEVEL = VERBOSE;
+                    }
+                    if ("true".equals(properties.getProperty("filelog"))) {
+                        logFileEnable = true;
+                    }
+                    inputStream.close();
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    private static LogUtil getInstance() {
+        if (mInstance == null) {
+            synchronized (LogUtil.class) {
+                if (mInstance == null) {
+                    mInstance = new LogUtil();
+                }
+            }
+        }
+        return mInstance;
+    }
+
+    // verbose
+    public static void v(String tag, String msg) {
+        if (VERBOSE < LOG_LEVEL)
+            return;
+        if (msg == null)
+            return;
+        Log.v(tag, msg);
+        write("VERBOSE", getInstance().getPrefixName(), msg);
+    }
+
+    public static void v(String msg) {
+        if (DEBUG < LOG_LEVEL)
+            return;
+        if (msg == null)
+            return;
+        v(getInstance().getPrefixName(), msg);
+    }
+
+    // debug
+    public static void d(String tag, String msg) {
+        if (DEBUG < LOG_LEVEL)
+            return;
+        if (msg == null)
+            return;
+        Log.d(tag, msg);
+        write("DEBUG", getInstance().getPrefixName(), msg);
+    }
+
+    public static void d(String msg) {
+        if (DEBUG < LOG_LEVEL)
+            return;
+        if (msg == null)
+            return;
+        d(getInstance().getPrefixName(), msg);
+    }
+
+    // info
+    public static void i(String tag, String msg) {
+        if (INFO < LOG_LEVEL)
+            return;
+        if (msg == null)
+            return;
+        Log.i(tag, msg);
+        write("INFO", getInstance().getPrefixName(), msg);
+    }
+
+    public static void i(String msg) {
+        if (DEBUG < LOG_LEVEL)
+            return;
+        if (msg == null)
+            return;
+        i(getInstance().getPrefixName(), msg);
+    }
+
+    // warning
+    public static void w(String tag, String msg) {
+        if (WARNING < LOG_LEVEL)
+            return;
+        if (msg == null)
+            return;
+        Log.w(tag, msg);
+        write("WARNING", getInstance().getPrefixName(), msg);
+    }
+
+    public static void w(String msg) {
+        if (DEBUG < LOG_LEVEL)
+            return;
+        if (msg == null)
+            return;
+        w(getInstance().getPrefixName(), msg);
+    }
+
+    public static void w(String tag, String msg, Throwable tr) {
+        if (WARNING < LOG_LEVEL)
+            return;
+        if (msg == null)
+            return;
+        Log.w(tag, msg, tr);
+        write("WARNING", getInstance().getPrefixName(), msg);
+    }
+
+    // error
+    public static void e(String tag, String msg) {
+        if (ERROR < LOG_LEVEL)
+            return;
+        if (msg == null)
+            return;
+        Log.e(tag, msg);
+        write("ERROR", getInstance().getPrefixName(), msg);
+    }
+
+    public static void e(String msg) {
+        if (DEBUG < LOG_LEVEL)
+            return;
+        if (msg == null)
+            return;
+        e(getInstance().getPrefixName(), msg);
+    }
+
+    /**
+     * 写到文件中的log的前缀,如果因为混淆之类的原因而取不到,就返回"[ minify ]"
+     *
+     * @return prefix
+     */
+    private String getPrefixName() {
+        StackTraceElement[] sts = Thread.currentThread().getStackTrace();
+        if (sts == null || sts.length == 0) {
+            return "[ minify ]";
+        }
+        try {
+            for (StackTraceElement st : sts) {
+                if (st.isNativeMethod()) {
+                    continue;
+                }
+                if (st.getClassName().equals(Thread.class.getName())) {
+                    continue;
+                }
+                if (st.getClassName().equals(this.getClass().getName())) {
+                    continue;
+                }
+                if (st.getFileName() != null) {
+                    return "[ " + Thread.currentThread().getName() +
+                            ": " + st.getFileName() + ":" + st.getLineNumber() +
+                            " " + st.getMethodName() + " ]";
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return "[ minify ]";
+    }
+
+    /**
+     * 追加文件:使用FileWriter
+     *
+     * @param level   等级
+     * @param prefix  前缀
+     * @param content 内容
+     */
+    private static void write(String level, String prefix, String content) {
+        if (!logFileEnable)
+            return;
+        try {
+            // 打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件
+            FileWriter writer = new FileWriter(LOG_FILE, true);
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
+            String time = sdf.format(new Date());
+            writer.write(time + ": " + level + "/" + prefix + ": " + content + "\n");
+            writer.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/ic/blood/TestActivity.java b/app/src/main/java/com/ic/blood/TestActivity.java
new file mode 100644 (file)
index 0000000..a105da3
--- /dev/null
@@ -0,0 +1,40 @@
+package com.ic.blood;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.os.Environment;
+import android.util.Log;
+
+import java.text.SimpleDateFormat;
+
+
+public class TestActivity extends Activity {
+    /**
+     * 主路径
+     */
+    private static final String MAIN_DIR = Environment.getExternalStorageDirectory() + "/ChenJian/CsdnBlog/LogUtil";
+
+    /**
+     * 保存Log的文件
+     */
+    private static final String LOG_FILE = MAIN_DIR + "/log.txt";
+
+    private final static String LOG_FOR_QA = "[log4qa] ";
+    private final static String LOG_FOR_DADIAN = "[log4dadian]";
+
+
+
+    private final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_main);
+        simpleDateFormat.format()
+        LogUtil.d(LOG_FOR_QA, simpleDateFormat.format(time) + " Some place call acquire..." + Log.getStackTraceString(new Throwable()));
+        LogManager.getInstance().init(LOG_FILE);
+        LogUtil.d(LOG_FOR_QA, "发发恭子的博客");
+        LogUtil.e(LOG_FOR_DADIAN, "http://blog.csdn.net/qq_296216078");
+    }
+}
index e83434f..5b571ab 100644 (file)
@@ -27,10 +27,13 @@ public class WelcomeActivity extends AppCompatActivity {
                         "false");
         if (Boolean.parseBoolean(isGh301) || Boolean.parseBoolean(isGh3011)) {
             //如是果是gh301,那么就跳转到测量选项页面
-            startActivity(new Intent(this, Gh301Activity.class));
+            Intent intent = new Intent(this, Gh301Activity.class);
+            startActivity(intent);
         } else {
             //跳转到以前的页面
-            startActivity(new Intent(this, BloodActivity.class));
+            //跳转到以前的页面
+            Intent intent = new Intent(this, BloodActivity.class);
+            startActivity(intent);
         }
         finish();
     }
diff --git a/app/src/main/java/com/ic/blood/fragment/AllFragment.java b/app/src/main/java/com/ic/blood/fragment/AllFragment.java
new file mode 100644 (file)
index 0000000..377cb37
--- /dev/null
@@ -0,0 +1,240 @@
+package com.ic.blood.fragment;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.os.PowerManager;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+import androidx.lifecycle.ViewModelProvider;
+
+import com.ic.blood.BloodActivity;
+import com.ic.blood.BloodApp;
+import com.ic.blood.R;
+import com.ic.blood.databinding.FragmentBloodBinding;
+import com.ic.blood.model.BloodCheckModel;
+import com.ic.blood.presenter.BloodPresenter;
+import com.ic.blood.util.IcLog;
+import com.ic.blood.util.SystemUtils;
+import com.ic.iclooger.ICLogger;
+
+import java.io.IOException;
+import java.lang.ref.WeakReference;
+
+import pl.droidsonroids.gif.GifDrawable;
+import pl.droidsonroids.gif.GifImageView;
+
+import static android.content.Context.POWER_SERVICE;
+
+
+public class AllFragment extends Fragment {
+
+    private static final String TAG = "BloodFragment";
+
+    private Context mContext;
+    private BloodApp mApp;
+
+    private FragmentBloodBinding bloodBinding;
+
+    private PowerManager.WakeLock mWakeLock = null;
+    private BloodCheckModel bloodModel;
+
+    private GifDrawable gifFromAssets;
+
+    private DelayExecuteHandler delayHandler;
+    private GifImageView gifImageView;
+    private ImageView heartRateView;
+    private boolean supportBloodOxygen;
+    private boolean supportHeartRate;
+    private boolean supportBloodPressure;
+
+    public static AllFragment newInstance() {
+        return new AllFragment();
+    }
+
+    @Override
+    public void onAttach(@NonNull Context context) {
+        super.onAttach(context);
+        this.mContext = context;
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        //获取到配置值,默认显示所有内容
+        String functionValue = SystemUtils
+                .getSystemPropertiesString("persist.sys.health.display.all",
+                        "7");
+        ICLogger.e("functionValue ==> " + functionValue);
+        supportBloodOxygen = true;
+        supportHeartRate = true;
+        supportBloodPressure = true;
+        try {
+            int fv = Integer.parseInt(functionValue);
+            supportBloodOxygen = (fv & 1) == 1;
+            fv = fv >> 1;
+            supportBloodPressure = (fv & 1) == 1;
+            fv = fv >> 1;
+            supportHeartRate = (fv & 1) == 1;
+            ICLogger.e("supportTemperature==> " + supportBloodOxygen);
+            ICLogger.e("supportHeartRate==> " + supportHeartRate);
+            ICLogger.e("supportBloodPressure==> " + supportBloodPressure);
+        } catch (Exception e) {
+            ICLogger.e("parseFunction error...", e);
+        }
+        mApp = (BloodApp) mContext.getApplicationContext();
+        delayHandler = new DelayExecuteHandler(this);
+
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                             Bundle savedInstanceState) {
+        //TODO:根据显示方式去加载不同的布局
+        //显示所有的内容
+        //显示心率+血压
+        //显示血氧+血压
+        if (supportBloodPressure && supportHeartRate && supportBloodOxygen) {
+            bloodBinding = FragmentBloodBinding.inflate(inflater, container, false);
+        }
+        //TODO:其他的case
+        bloodBinding.setIsShowTips(true);
+        bloodBinding.setTopTips(getString(R.string.tips_quiet_please));
+        initBloodModel();
+        setGifDrawable();
+        //绑定远程服务
+        bloodModel.onCreateView();
+        bloodModel.setActivity(getActivity());
+        return bloodBinding.getRoot();
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        initWakeLock(mContext);
+        if (mWakeLock != null) {
+            mWakeLock.acquire();
+        }
+        gifImageView.setVisibility(View.VISIBLE);
+        heartRateView.setVisibility(View.GONE);
+        gifFromAssets.start();
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        gifImageView.setVisibility(View.GONE);
+        heartRateView.setVisibility(View.VISIBLE);
+        gifFromAssets.stop();
+        releaseWakeLock();
+    }
+
+    private void initBloodModel() {
+        //观察状态的变化
+        BloodCheckModel.Factory factory = new BloodCheckModel.Factory(requireContext());
+        bloodModel = new ViewModelProvider(this, factory).get(BloodCheckModel.class);
+        bloodModel.updateTestType(BloodPresenter.TestType.ALL);
+        bloodModel.getObsStateTips().observe(this, value -> {
+            bloodBinding.setFinishTips(value);
+            bloodBinding.setBottomTips(value);
+        });
+
+        bloodModel.getObsBloodValue().observe(getViewLifecycleOwner(), value -> {
+            bloodBinding.setIsShowTips(false);
+            bloodBinding.setHighValue(value[0]);
+            bloodBinding.setLowValue(value[1]);
+            bloodBinding.setHeartValue(value[2]);
+            bloodBinding.setOxygenValue(value[3]);
+            gifFromAssets.stop();
+            gifImageView.setVisibility(View.GONE);
+            heartRateView.setVisibility(View.VISIBLE);
+            delayHandler.sendMessageDelayed(new Message(), 1000 * 10);
+        });
+
+        bloodModel.getObsBloodTempValue().observe(getViewLifecycleOwner(), value -> {
+            bloodBinding.setIsShowTips(false);
+            bloodBinding.setHighValue(value[0]);
+            bloodBinding.setLowValue(value[1]);
+            bloodBinding.setHeartValue(value[2]);
+            bloodBinding.setOxygenValue(value[3]);
+        });
+
+        //bloodModel.getObsTipsInfo().observe(getViewLifecycleOwner(), tips -> {
+        //这里做法不好呀,连文字资源都由底层的ID来控制
+        //这样子耦合度非常高了,所以注释了,不使用这种方式更新提示。
+        //bloodBinding.setIsShowTips(true);
+        //bloodBinding.setTopTips(tips[0]);
+        //bloodBinding.setBottomTips(tips[1]);
+        //});
+
+        bloodModel.getObsCheckEnd().observe(getViewLifecycleOwner(), end -> {
+            IcLog.i(TAG, "finish");
+            ((BloodActivity) mContext).finish();
+        });
+    }
+
+    @SuppressLint("InvalidWakeLockTag")
+    private void initWakeLock(Context context) {
+        PowerManager powerManager = (PowerManager) context.getSystemService(POWER_SERVICE);
+        if (powerManager != null && mWakeLock == null) {
+            mWakeLock = powerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "BloodWakeLock");
+        }
+    }
+
+    private void releaseWakeLock() {
+        IcLog.i(TAG, "Release WakeLock");
+        if (mWakeLock != null) {
+            mWakeLock.release();
+        }
+        mWakeLock = null;
+    }
+
+    private void setGifDrawable() {
+        gifImageView = bloodBinding.icHeartGif;
+        heartRateView = bloodBinding.heartRateView;
+        gifImageView.setScaleType(ImageView.ScaleType.CENTER);
+        try {
+            gifFromAssets = new GifDrawable(mContext.getAssets(), "only_hr_check.gif");
+            gifImageView.setImageDrawable(gifFromAssets);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        IcLog.i(TAG, "onDestroy");
+
+        //取消广播注册,释放资源
+        bloodModel.onViewDestroy();
+        bloodModel = null;
+
+        if (gifFromAssets != null) {
+            gifFromAssets.recycle();
+        }
+
+        delayHandler = null;
+    }
+
+    private static class DelayExecuteHandler extends Handler {
+        private final WeakReference<AllFragment> mFragment;
+
+        public DelayExecuteHandler(AllFragment fragment) {
+            mFragment = new WeakReference<>(fragment);
+        }
+
+        @Override
+        public void dispatchMessage(@NonNull Message msg) {
+            super.dispatchMessage(msg);
+            mFragment.get().releaseWakeLock();
+        }
+    }
+}
@@ -18,7 +18,7 @@ import androidx.lifecycle.ViewModelProvider;
 import com.ic.blood.BloodActivity;
 import com.ic.blood.BloodApp;
 import com.ic.blood.R;
-import com.ic.blood.databinding.FragmentHeartRateBothBinding;
+import com.ic.blood.databinding.FragmentHeartRatePressureBinding;
 import com.ic.blood.model.BloodCheckModel;
 import com.ic.blood.presenter.BloodPresenter;
 import com.ic.blood.util.IcLog;
@@ -34,14 +34,14 @@ import static android.content.Context.POWER_SERVICE;
 /**
  * 这个是只有心率和血氧的UI
  */
-public class HeartRateAndBloodOxygenFragment extends Fragment {
+public class HeartRateAndBloodPressureFragment extends Fragment {
 
     private static final String TAG = "BloodFragment";
 
     private Context mContext;
     private BloodApp mApp;
 
-    private FragmentHeartRateBothBinding bloodBinding;
+    private FragmentHeartRatePressureBinding bloodBinding;
 
     private PowerManager.WakeLock mWakeLock = null;
     private BloodCheckModel bloodModel;
@@ -52,8 +52,8 @@ public class HeartRateAndBloodOxygenFragment extends Fragment {
     private GifImageView gifImageView;
     private ImageView heartRateView;
 
-    public static HeartRateAndBloodOxygenFragment newInstance() {
-        return new HeartRateAndBloodOxygenFragment();
+    public static HeartRateAndBloodPressureFragment newInstance() {
+        return new HeartRateAndBloodPressureFragment();
     }
 
     @Override
@@ -74,7 +74,7 @@ public class HeartRateAndBloodOxygenFragment extends Fragment {
                              Bundle savedInstanceState) {
         //判断是哪个,显示一个,还是显示两个数据
         
-        bloodBinding = FragmentHeartRateBothBinding.inflate(inflater, container, false);
+        bloodBinding = FragmentHeartRatePressureBinding.inflate(inflater, container, false);
         bloodBinding.setIsShowTips(true);
         bloodBinding.setTopTips(getString(R.string.tips_quiet_please));
         initBloodModel();
@@ -191,16 +191,16 @@ public class HeartRateAndBloodOxygenFragment extends Fragment {
     }
 
     private static class DelayExecuteHandler extends Handler {
-        private final WeakReference<HeartRateAndBloodOxygenFragment> mFragment;
+        private final WeakReference<HeartRateAndBloodPressureFragment> mFragment;
 
-        public DelayExecuteHandler(HeartRateAndBloodOxygenFragment fragment) {
+        public DelayExecuteHandler(HeartRateAndBloodPressureFragment fragment) {
             mFragment = new WeakReference<>(fragment);
         }
 
         @Override
         public void dispatchMessage(@NonNull Message msg) {
             super.dispatchMessage(msg);
-            HeartRateAndBloodOxygenFragment heartRateFragment = mFragment.get();
+            HeartRateAndBloodPressureFragment heartRateFragment = mFragment.get();
             if (heartRateFragment != null) {
                 heartRateFragment.releaseWakeLock();
             }
@@ -35,7 +35,7 @@ import static android.content.Context.POWER_SERVICE;
 /**
  * 这个是只有血氧的UI
  */
-public class OxygenFragment extends Fragment {
+public class JustOxygenFragment extends Fragment {
 
     private static final String TAG = "OxygenFragment";
 
@@ -53,8 +53,8 @@ public class OxygenFragment extends Fragment {
     private GifImageView gifImageView;
     private ImageView heartRateView;
 
-    public static OxygenFragment newInstance() {
-        return new OxygenFragment();
+    public static JustOxygenFragment newInstance() {
+        return new JustOxygenFragment();
     }
 
     @Override
@@ -194,16 +194,16 @@ public class OxygenFragment extends Fragment {
 
     private static class DelayExecuteHandler extends Handler {
 
-        private final WeakReference<OxygenFragment> mFragment;
+        private final WeakReference<JustOxygenFragment> mFragment;
 
-        public DelayExecuteHandler(OxygenFragment fragment) {
+        public DelayExecuteHandler(JustOxygenFragment fragment) {
             mFragment = new WeakReference<>(fragment);
         }
 
         @Override
         public void dispatchMessage(@NonNull Message msg) {
             super.dispatchMessage(msg);
-            OxygenFragment heartRateFragment = mFragment.get();
+            JustOxygenFragment heartRateFragment = mFragment.get();
             if (heartRateFragment != null) {
                 heartRateFragment.releaseWakeLock();
             }
@@ -18,7 +18,7 @@ import androidx.lifecycle.ViewModelProvider;
 import com.ic.blood.BloodActivity;
 import com.ic.blood.BloodApp;
 import com.ic.blood.R;
-import com.ic.blood.databinding.FragmentBloodBinding;
+import com.ic.blood.databinding.FragmentOxygenAndPressureBinding;
 import com.ic.blood.model.BloodCheckModel;
 import com.ic.blood.presenter.BloodPresenter;
 import com.ic.blood.util.IcLog;
@@ -32,14 +32,17 @@ import pl.droidsonroids.gif.GifImageView;
 import static android.content.Context.POWER_SERVICE;
 
 
-public class BloodFragment extends Fragment {
+/**
+ * 这个是只有血氧+血压的UI
+ */
+public class OxygenAndPressureFragment extends Fragment {
 
-    private static final String TAG = "BloodFragment";
+    private static final String TAG = "OxygenFragment";
 
     private Context mContext;
     private BloodApp mApp;
 
-    private FragmentBloodBinding bloodBinding;
+    private FragmentOxygenAndPressureBinding bloodBinding;
 
     private PowerManager.WakeLock mWakeLock = null;
     private BloodCheckModel bloodModel;
@@ -50,8 +53,8 @@ public class BloodFragment extends Fragment {
     private GifImageView gifImageView;
     private ImageView heartRateView;
 
-    public static BloodFragment newInstance() {
-        return new BloodFragment();
+    public static OxygenAndPressureFragment newInstance() {
+        return new OxygenAndPressureFragment();
     }
 
     @Override
@@ -64,18 +67,15 @@ public class BloodFragment extends Fragment {
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         mApp = (BloodApp) mContext.getApplicationContext();
-
         delayHandler = new DelayExecuteHandler(this);
     }
 
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
                              Bundle savedInstanceState) {
-        bloodBinding = FragmentBloodBinding.inflate(inflater, container, false);
-
+        bloodBinding = FragmentOxygenAndPressureBinding.inflate(inflater, container, false);
         bloodBinding.setIsShowTips(true);
         bloodBinding.setTopTips(getString(R.string.tips_quiet_please));
-
         initBloodModel();
         setGifDrawable();
         //绑定远程服务
@@ -109,12 +109,11 @@ public class BloodFragment extends Fragment {
         //观察状态的变化
         BloodCheckModel.Factory factory = new BloodCheckModel.Factory(requireContext());
         bloodModel = new ViewModelProvider(this, factory).get(BloodCheckModel.class);
-        bloodModel.updateTestType(BloodPresenter.TestType.ALL);
+        bloodModel.updateTestType(BloodPresenter.TestType.JUST_OXYGEN);
         bloodModel.getObsStateTips().observe(this, value -> {
             bloodBinding.setFinishTips(value);
             bloodBinding.setBottomTips(value);
         });
-
         bloodModel.getObsBloodValue().observe(getViewLifecycleOwner(), value -> {
             bloodBinding.setIsShowTips(false);
             bloodBinding.setHighValue(value[0]);
@@ -194,16 +193,20 @@ public class BloodFragment extends Fragment {
     }
 
     private static class DelayExecuteHandler extends Handler {
-        private final WeakReference<BloodFragment> mFragment;
 
-        public DelayExecuteHandler(BloodFragment fragment) {
+        private final WeakReference<OxygenAndPressureFragment> mFragment;
+
+        public DelayExecuteHandler(OxygenAndPressureFragment fragment) {
             mFragment = new WeakReference<>(fragment);
         }
 
         @Override
         public void dispatchMessage(@NonNull Message msg) {
             super.dispatchMessage(msg);
-            mFragment.get().releaseWakeLock();
+            OxygenAndPressureFragment heartRateFragment = mFragment.get();
+            if (heartRateFragment != null) {
+                heartRateFragment.releaseWakeLock();
+            }
         }
     }
 }
index ed5f4b3..6d54b4f 100644 (file)
@@ -11,16 +11,26 @@ import androidx.fragment.app.Fragment;
 
 import com.ic.blood.Gh301Activity;
 import com.ic.blood.R;
+import com.ic.blood.util.SystemUtils;
+import com.ic.iclooger.ICLogger;
 
 /**
  * 这个是选择测心率还是测血氧的UI
  */
 public class SelectFragment extends Fragment {
 
+    private boolean supportBloodOxygen;
+    private boolean supportHeartRate;
+    private boolean supportBloodPressure;
+
     public static Fragment newInstance() {
         return new SelectFragment();
     }
 
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+    }
 
     @Nullable
     @Override
@@ -33,15 +43,106 @@ public class SelectFragment extends Fragment {
         //界面创建了,就两个动作,切换到测心率,
         View oxygenTv = view.findViewById(R.id.blood_oxygen_tv);
         View heartRateTv = view.findViewById(R.id.heart_rate_tv);
+        //判断显示的组合
         //设置一下点击事件,跳转到对应的心率UI
         oxygenTv.setOnClickListener(v -> {
+            //根据支持的功能去打开对应的页面
+            //血氧自己,血氧+血压
             //跳转到血氧测试
-            ((Gh301Activity) getActivity()).showOxygenPage();
-
+            //获取到配置值
+            /**
+             * persist.sys.health.function=7
+             * 功能有:心率,血压,血氧
+             *
+             * 功能值有111-> 7 心率,血压,血氧
+             *                 110-> 6 心率,血压
+             *                 101-> 5 心率,血氧
+             *                 100-> 4 心率
+             *                 011-> 3 血压,血氧
+             *                 010-> 2 血压
+             *                 001-> 1 血氧
+             *                 000-> 0 不支持
+             */
+            //默认只支持血氧
+            String functionValue = SystemUtils
+                    .getSystemPropertiesString("persist.sys.health.function.list1",
+                            "1");
+            ICLogger.e("functionValue ==> " + functionValue);
+            supportBloodOxygen = true;
+            supportHeartRate = true;
+            supportBloodPressure = true;
+            try {
+                int fv = Integer.parseInt(functionValue);
+                supportBloodOxygen = (fv & 1) == 1;
+                fv = fv >> 1;
+                supportBloodPressure = (fv & 1) == 1;
+                fv = fv >> 1;
+                supportHeartRate = (fv & 1) == 1;
+                ICLogger.e("supportBloodOxygen==> " + supportBloodOxygen);
+                ICLogger.e("supportHeartRate==> " + supportHeartRate);
+                ICLogger.e("supportBloodPressure==> " + supportBloodPressure);
+            } catch (Exception e) {
+                ICLogger.e("parseFunction error...", e);
+            }
+            if (getActivity() == null) {
+                return;
+            }
+            //血氧自己,血氧+血压
+            if (supportBloodOxygen && !supportBloodPressure) {
+                //只显示血氧
+                ((Gh301Activity) getActivity()).showJustOxygenPage();
+            } else if (supportBloodOxygen && supportBloodPressure) {
+                //现实血氧+血压
+                ((Gh301Activity) getActivity()).showOxygenAndPressurePage();
+            }//其他的case待处理
         });
         heartRateTv.setOnClickListener(v -> {
+            /**
+             * persist.sys.health.function=7
+             * 功能有:心率,血压,血氧
+             *
+             * 功能值有111-> 7 心率,血压,血氧
+             *                 110-> 6 心率,血压
+             *                 101-> 5 心率,血氧
+             *                 100-> 4 心率
+             *                 011-> 3 血压,血氧
+             *                 010-> 2 血压
+             *                 001-> 1 血氧
+             *                 000-> 0 不支持
+             */
+            //获取到配置值
+            //默认只支持心率
+            String functionValue = SystemUtils
+                    .getSystemPropertiesString("persist.sys.health.function.list2",
+                            "4");
+            ICLogger.e("functionValue ==> " + functionValue);
+            supportBloodOxygen = true;
+            supportHeartRate = true;
+            supportBloodPressure = true;
+            try {
+                int fv = Integer.parseInt(functionValue);
+                supportBloodOxygen = (fv & 1) == 1;
+                fv = fv >> 1;
+                supportBloodPressure = (fv & 1) == 1;
+                fv = fv >> 1;
+                supportHeartRate = (fv & 1) == 1;
+                ICLogger.e("supportTemperature==> " + supportBloodOxygen);
+                ICLogger.e("supportHeartRate==> " + supportHeartRate);
+                ICLogger.e("supportBloodPressure==> " + supportBloodPressure);
+            } catch (Exception e) {
+                ICLogger.e("parseFunction error...", e);
+            }
+            if (getActivity() == null) {
+                return;
+            }
             //跳转到心率设置
-            ((Gh301Activity) getActivity()).showHeartRatePage();
+            //心率自己,心率+血压,
+            if (supportHeartRate && !supportBloodPressure) {
+                ((Gh301Activity) getActivity()).showHeartRatePage();
+            } else if (supportHeartRate && supportBloodPressure) {
+                ((Gh301Activity) getActivity()).showHeartRateAndPressurePage();
+            }
+            //其他的case待处理
         });
     }
 }
@@ -65,7 +65,7 @@
             android:layout_gravity="center_horizontal"
             android:layout_marginTop="30dp"
             android:text="@{topTips}"
-            android:visibility="@{isShowTips ? View.VISIBLE : View.GONE}" />
+            android:visibility="gone" />
 
         <TextView
             android:id="@+id/ic_tips_bottom"
@@ -79,8 +79,7 @@
             android:id="@+id/ic_heart_layout"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_gravity="left|top"
-            android:layout_marginLeft="30dp"
+            android:layout_gravity="top|center"
             android:layout_marginTop="36dp"
             android:visibility="@{isShowTips ? View.GONE : View.VISIBLE}">
 
             android:layout_margin="30dp"
             android:layout_marginTop="30dp"
             android:layout_marginRight="20dp"
-            android:visibility="@{isShowTips ? View.GONE : View.VISIBLE}">
+            android:visibility="gone">
 
             <TextView
                 android:id="@+id/ic_blood_oxygen_name"
             android:layout_height="wrap_content"
             android:layout_gravity="bottom"
             android:layout_marginStart="20dp"
-            android:layout_marginBottom="50dp"
-            android:visibility="gone">
+            android:layout_marginBottom="50dp">
 
             <TextView
                 android:id="@+id/ic_high_name"
             android:layout_height="wrap_content"
             android:layout_gravity="bottom|end"
             android:layout_marginEnd="20dp"
-            android:layout_marginBottom="50dp"
-            android:visibility="gone">
+            android:layout_marginBottom="50dp">
 
             <TextView
                 android:id="@+id/ic_low_name"
index 5ef4c9a..049691f 100644 (file)
             android:layout_height="wrap_content"
             android:layout_gravity="bottom"
             android:layout_marginStart="20dp"
-            android:layout_marginBottom="70dp">
+            android:layout_marginBottom="70dp"
+            android:visibility="gone">
 
             <TextView
                 android:id="@+id/ic_high_name"
             android:layout_height="wrap_content"
             android:layout_gravity="bottom|end"
             android:layout_marginEnd="20dp"
-            android:layout_marginBottom="70dp">
+            android:layout_marginBottom="70dp"
+            android:visibility="gone">
 
             <TextView
                 android:id="@+id/ic_low_name"
diff --git a/app/src/main/res/layout/fragment_oxygen_and_pressure.xml b/app/src/main/res/layout/fragment_oxygen_and_pressure.xml
new file mode 100644 (file)
index 0000000..5ef4c9a
--- /dev/null
@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools">
+
+    <data>
+
+        <import type="android.view.View" />
+
+        <variable
+            name="topTips"
+            type="String" />
+
+        <variable
+            name="bottomTips"
+            type="String" />
+
+        <variable
+            name="isShowTips"
+            type="boolean" />
+
+        <variable
+            name="heartValue"
+            type="String" />
+
+        <variable
+            name="oxygenValue"
+            type="String" />
+
+        <variable
+            name="highValue"
+            type="String" />
+
+        <variable
+            name="lowValue"
+            type="String" />
+
+        <variable
+            name="finishTips"
+            type="String" />
+    </data>
+
+    <FrameLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="#000000">
+
+        <pl.droidsonroids.gif.GifImageView
+            android:id="@+id/ic_heart_gif"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_gravity="center"
+            android:visibility="gone" />
+
+        <ImageView
+            android:id="@+id/heart_rate_view"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:src="@mipmap/default_heart_rate_icon" />
+
+
+        <TextView
+            android:id="@+id/ic_tips_top"
+            style="@style/bloodTextStyle"
+            android:layout_gravity="center_horizontal"
+            android:layout_marginTop="30dp"
+            android:text="@{topTips}"
+            android:visibility="@{isShowTips ? View.VISIBLE : View.GONE}" />
+
+        <TextView
+            android:id="@+id/ic_tips_bottom"
+            style="@style/bloodTextStyle"
+            android:layout_gravity="bottom|center_horizontal"
+            android:layout_marginBottom="30dp"
+            android:text="@{bottomTips}"
+            android:visibility="@{isShowTips ? View.VISIBLE : View.GONE}" />
+
+        <RelativeLayout
+            android:id="@+id/ic_heart_layout"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="left"
+            android:layout_marginLeft="20dp"
+            android:layout_marginTop="30dp"
+            android:visibility="gone">
+
+            <TextView
+                android:id="@+id/ic_heart_name"
+                style="@style/bloodTextStyle"
+                android:layout_centerHorizontal="true"
+                android:text="@string/ic_heart_rate" />
+
+            <TextView
+                android:id="@+id/ic_heart_value"
+                style="@style/bloodTextStyle"
+                android:layout_below="@id/ic_heart_name"
+                android:layout_centerHorizontal="true"
+                android:text="@{heartValue}" />
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/ic_oxygen_layout"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_horizontal"
+            android:layout_marginTop="36dp"
+            android:visibility="@{isShowTips ? View.GONE : View.VISIBLE}">
+
+            <TextView
+                android:id="@+id/ic_blood_oxygen_name"
+                style="@style/bloodTextStyle"
+                android:layout_centerHorizontal="true"
+                android:text="@string/ic_blood_oxygen" />
+
+            <TextView
+                android:id="@+id/ic_blood_oxygen"
+                style="@style/bloodTextStyle"
+                android:layout_below="@id/ic_blood_oxygen_name"
+                android:layout_centerHorizontal="true"
+                android:text="@{oxygenValue}" />
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/ic_high_layout"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="bottom"
+            android:layout_marginStart="20dp"
+            android:layout_marginBottom="70dp">
+
+            <TextView
+                android:id="@+id/ic_high_name"
+                style="@style/bloodTextStyle"
+                android:text="@string/ic_high_pressure" />
+
+            <TextView
+                android:id="@+id/ic_high_value"
+                style="@style/bloodTextStyle"
+                android:layout_below="@id/ic_high_name"
+                android:layout_centerHorizontal="true"
+                android:text="@{highValue}" />
+        </RelativeLayout>
+
+        <TextView
+            style="@style/bloodTextStyle"
+            android:layout_gravity="center|bottom"
+            android:layout_marginBottom="5dp"
+            android:gravity="center"
+            android:text="@{finishTips}"
+            android:visibility="@{isShowTips ? View.GONE : View.VISIBLE}" />
+
+        <RelativeLayout
+            android:id="@+id/ic_low_layout"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="bottom|end"
+            android:layout_marginEnd="20dp"
+            android:layout_marginBottom="70dp">
+
+            <TextView
+                android:id="@+id/ic_low_name"
+                style="@style/bloodTextStyle"
+                android:text="@string/ic_low_pressure" />
+
+            <TextView
+                android:id="@+id/ic_low_value"
+                style="@style/bloodTextStyle"
+                android:layout_below="@id/ic_low_name"
+                android:layout_centerHorizontal="true"
+                android:text="@{lowValue}" />
+        </RelativeLayout>
+
+    </FrameLayout>
+
+</layout>
index 2a9bb77..e7fa18f 100644 (file)
@@ -1,2 +1,2 @@
-#Thu Sep 16 17:06:11 CST 2021\r
-VERSION_CODE=93\r
+#Fri Sep 17 10:32:13 CST 2021\r
+VERSION_CODE=94\r