From: TrillGates Date: Wed, 22 Sep 2021 03:34:17 +0000 (+0800) Subject: add config of function. X-Git-Url: http://git.snicker.com.cn/sitemap.xml?a=commitdiff_plain;h=291b732d5d428c19226da9eaa7928eeac6de1554;p=IcBlood.git add config of function. --- diff --git a/app/release/ICL02Blood_V93_202109161706_release.apk b/app/release/ICL02Blood_V94_202109171032_release.apk 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 Binary files a/app/release/ICL02Blood_V93_202109161706_release.apk and b/app/release/ICL02Blood_V94_202109171032_release.apk differ diff --git a/app/release/output.json b/app/release/output.json index 79ab7f6..371ec6f 100644 --- a/app/release/output.json +++ b/app/release/output.json @@ -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 diff --git a/app/src/main/java/com/ic/blood/BloodActivity.java b/app/src/main/java/com/ic/blood/BloodActivity.java index 85b5231..8ea1fa5 100644 --- a/app/src/main/java/com/ic/blood/BloodActivity.java +++ b/app/src/main/java/com/ic/blood/BloodActivity.java @@ -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); diff --git a/app/src/main/java/com/ic/blood/Gh301Activity.java b/app/src/main/java/com/ic/blood/Gh301Activity.java index d31fde8..580d2f8 100644 --- a/app/src/main/java/com/ic/blood/Gh301Activity.java +++ b/app/src/main/java/com/ic/blood/Gh301Activity.java @@ -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 index 0000000..47a32ea --- /dev/null +++ b/app/src/main/java/com/ic/blood/LogManager.java @@ -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 index 0000000..3d498f1 --- /dev/null +++ b/app/src/main/java/com/ic/blood/LogUtil.java @@ -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 index 0000000..a105da3 --- /dev/null +++ b/app/src/main/java/com/ic/blood/TestActivity.java @@ -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"); + } +} diff --git a/app/src/main/java/com/ic/blood/WelcomeActivity.java b/app/src/main/java/com/ic/blood/WelcomeActivity.java index e83434f..5b571ab 100644 --- a/app/src/main/java/com/ic/blood/WelcomeActivity.java +++ b/app/src/main/java/com/ic/blood/WelcomeActivity.java @@ -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 index 0000000..377cb37 --- /dev/null +++ b/app/src/main/java/com/ic/blood/fragment/AllFragment.java @@ -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 mFragment; + + public DelayExecuteHandler(AllFragment fragment) { + mFragment = new WeakReference<>(fragment); + } + + @Override + public void dispatchMessage(@NonNull Message msg) { + super.dispatchMessage(msg); + mFragment.get().releaseWakeLock(); + } + } +} diff --git a/app/src/main/java/com/ic/blood/fragment/HeartRateAndBloodOxygenFragment.java b/app/src/main/java/com/ic/blood/fragment/HeartRateAndBloodPressureFragment.java similarity index 90% rename from app/src/main/java/com/ic/blood/fragment/HeartRateAndBloodOxygenFragment.java rename to app/src/main/java/com/ic/blood/fragment/HeartRateAndBloodPressureFragment.java index 25213bd..cd3bbb0 100644 --- a/app/src/main/java/com/ic/blood/fragment/HeartRateAndBloodOxygenFragment.java +++ b/app/src/main/java/com/ic/blood/fragment/HeartRateAndBloodPressureFragment.java @@ -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 mFragment; + private final WeakReference 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(); } diff --git a/app/src/main/java/com/ic/blood/fragment/OxygenFragment.java b/app/src/main/java/com/ic/blood/fragment/JustOxygenFragment.java similarity index 94% rename from app/src/main/java/com/ic/blood/fragment/OxygenFragment.java rename to app/src/main/java/com/ic/blood/fragment/JustOxygenFragment.java index 06e3d0f..8498d98 100644 --- a/app/src/main/java/com/ic/blood/fragment/OxygenFragment.java +++ b/app/src/main/java/com/ic/blood/fragment/JustOxygenFragment.java @@ -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 mFragment; + private final WeakReference 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(); } diff --git a/app/src/main/java/com/ic/blood/fragment/BloodFragment.java b/app/src/main/java/com/ic/blood/fragment/OxygenAndPressureFragment.java similarity index 87% rename from app/src/main/java/com/ic/blood/fragment/BloodFragment.java rename to app/src/main/java/com/ic/blood/fragment/OxygenAndPressureFragment.java index 6f9617b..5ee50f8 100644 --- a/app/src/main/java/com/ic/blood/fragment/BloodFragment.java +++ b/app/src/main/java/com/ic/blood/fragment/OxygenAndPressureFragment.java @@ -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 mFragment; - public DelayExecuteHandler(BloodFragment fragment) { + private final WeakReference 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(); + } } } } diff --git a/app/src/main/java/com/ic/blood/fragment/SelectFragment.java b/app/src/main/java/com/ic/blood/fragment/SelectFragment.java index ed5f4b3..6d54b4f 100644 --- a/app/src/main/java/com/ic/blood/fragment/SelectFragment.java +++ b/app/src/main/java/com/ic/blood/fragment/SelectFragment.java @@ -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待处理 }); } } diff --git a/app/src/main/res/layout/fragment_heart_rate_both.xml b/app/src/main/res/layout/fragment_heart_rate_pressure.xml similarity index 93% rename from app/src/main/res/layout/fragment_heart_rate_both.xml rename to app/src/main/res/layout/fragment_heart_rate_pressure.xml index 569f2f7..c13367b 100644 --- a/app/src/main/res/layout/fragment_heart_rate_both.xml +++ b/app/src/main/res/layout/fragment_heart_rate_pressure.xml @@ -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" /> @@ -106,7 +105,7 @@ android:layout_margin="30dp" android:layout_marginTop="30dp" android:layout_marginRight="20dp" - android:visibility="@{isShowTips ? View.GONE : View.VISIBLE}"> + android:visibility="gone"> + android:layout_marginBottom="50dp"> + android:layout_marginBottom="50dp"> + android:layout_marginBottom="70dp" + android:visibility="gone"> + android:layout_marginBottom="70dp" + android:visibility="gone"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/version_code.properties b/app/version_code.properties index 2a9bb77..e7fa18f 100644 --- a/app/version_code.properties +++ b/app/version_code.properties @@ -1,2 +1,2 @@ -#Thu Sep 16 17:06:11 CST 2021 -VERSION_CODE=93 +#Fri Sep 17 10:32:13 CST 2021 +VERSION_CODE=94