-[{"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
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 {
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);
package com.ic.blood;
import android.os.Bundle;
+import android.text.TextUtils;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
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());
}
}
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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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");
+ }
+}
"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();
}
--- /dev/null
+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();
+ }
+ }
+}
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;
/**
* 这个是只有心率和血氧的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;
private GifImageView gifImageView;
private ImageView heartRateView;
- public static HeartRateAndBloodOxygenFragment newInstance() {
- return new HeartRateAndBloodOxygenFragment();
+ public static HeartRateAndBloodPressureFragment newInstance() {
+ return new HeartRateAndBloodPressureFragment();
}
@Override
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();
}
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();
}
/**
* 这个是只有血氧的UI
*/
-public class OxygenFragment extends Fragment {
+public class JustOxygenFragment extends Fragment {
private static final String TAG = "OxygenFragment";
private GifImageView gifImageView;
private ImageView heartRateView;
- public static OxygenFragment newInstance() {
- return new OxygenFragment();
+ public static JustOxygenFragment newInstance() {
+ return new JustOxygenFragment();
}
@Override
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();
}
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;
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;
private GifImageView gifImageView;
private ImageView heartRateView;
- public static BloodFragment newInstance() {
- return new BloodFragment();
+ public static OxygenAndPressureFragment newInstance() {
+ return new OxygenAndPressureFragment();
}
@Override
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();
//绑定远程服务
//观察状态的变化
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]);
}
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();
+ }
}
}
}
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
//界面创建了,就两个动作,切换到测心率,
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待处理
});
}
}
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"
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"
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"
--- /dev/null
+<?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>
-#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