import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
-import com.ic.blood.fragment.HeartRateFragment;
+import com.ic.blood.fragment.HeartRateAndBloodOxygenFragment;
+import com.ic.blood.fragment.JustHeartRateFragment;
import com.ic.blood.fragment.OxygenFragment;
import com.ic.blood.fragment.SelectFragment;
import com.ic.blood.util.SystemUtils;
public class Gh301Activity extends AppCompatActivity {
+
+ private String isShowBothInfo;
+
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String isGh301 = SystemUtils
.getSystemPropertiesString("persist.sys.is_gh301",
"false");
+ //hr:heart_rate,br:blood oxygen
+ isShowBothInfo = SystemUtils
+ .getSystemPropertiesString("persist.sys.hr_and_bo",
+ "false");
+
if (Boolean.parseBoolean(isGh301)) {
- showFragment(HeartRateFragment.newInstance());
- }else {
+ showFragment(Boolean.parseBoolean(isShowBothInfo) ? HeartRateAndBloodOxygenFragment.newInstance() :
+ JustHeartRateFragment.newInstance());
+ } else {
showFragment(SelectFragment.newInstance());
}
}
}
public void showHeartRatePage() {
- showFragment(HeartRateFragment.newInstance());
+ showFragment(Boolean.parseBoolean(isShowBothInfo) ?
+ HeartRateAndBloodOxygenFragment.newInstance() :
+ JustHeartRateFragment.newInstance());
}
@Override
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- //判断是不是gh301
+ //判断是不是gh301(gator)
String isGh301 = SystemUtils
.getSystemPropertiesString("persist.sys.is_gh301",
"false");
--- /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.FragmentHeartRateBothBinding;
+import com.ic.blood.model.BloodCheckModel;
+import com.ic.blood.presenter.BloodPresenter;
+import com.ic.blood.util.IcLog;
+
+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;
+
+
+/**
+ * 这个是只有心率和血氧的UI
+ */
+public class HeartRateAndBloodOxygenFragment extends Fragment {
+
+ private static final String TAG = "BloodFragment";
+
+ private Context mContext;
+ private BloodApp mApp;
+
+ private FragmentHeartRateBothBinding bloodBinding;
+
+ private PowerManager.WakeLock mWakeLock = null;
+ private BloodCheckModel bloodModel;
+
+ private GifDrawable gifFromAssets;
+
+ private DelayExecuteHandler delayHandler;
+ private GifImageView gifImageView;
+ private ImageView heartRateView;
+
+ public static HeartRateAndBloodOxygenFragment newInstance() {
+ return new HeartRateAndBloodOxygenFragment();
+ }
+
+ @Override
+ public void onAttach(@NonNull Context context) {
+ super.onAttach(context);
+ this.mContext = context;
+ }
+
+ @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 = FragmentHeartRateBothBinding.inflate(inflater, container, false);
+ 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(mApp);
+ bloodModel = new ViewModelProvider(this, factory).get(BloodCheckModel.class);
+ bloodModel.updateTestType(BloodPresenter.TestType.JUST_HEART_RATE);
+ 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<HeartRateAndBloodOxygenFragment> mFragment;
+
+ public DelayExecuteHandler(HeartRateAndBloodOxygenFragment fragment) {
+ mFragment = new WeakReference<>(fragment);
+ }
+
+ @Override
+ public void dispatchMessage(@NonNull Message msg) {
+ super.dispatchMessage(msg);
+ HeartRateAndBloodOxygenFragment heartRateFragment = mFragment.get();
+ if (heartRateFragment != null) {
+ heartRateFragment.releaseWakeLock();
+ }
+ }
+ }
+}
/**
- * 这个是只有心率和血氧的UI
+ * 这个是只有心率UI
*/
-public class HeartRateFragment extends Fragment {
+public class JustHeartRateFragment extends Fragment {
private static final String TAG = "BloodFragment";
private GifImageView gifImageView;
private ImageView heartRateView;
- public static HeartRateFragment newInstance() {
- return new HeartRateFragment();
+ public static JustHeartRateFragment newInstance() {
+ return new JustHeartRateFragment();
}
@Override
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
+ //判断是哪个,显示一个,还是显示两个数据
+
bloodBinding = FragmentHeartRateBinding.inflate(inflater, container, false);
bloodBinding.setIsShowTips(true);
bloodBinding.setTopTips(getString(R.string.tips_quiet_please));
@SuppressLint("InvalidWakeLockTag")
private void initWakeLock(Context context) {
PowerManager powerManager = (PowerManager) context.getSystemService(POWER_SERVICE);
- if (powerManager != null && mWakeLock==null) {
+ if (powerManager != null && mWakeLock == null) {
mWakeLock = powerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "BloodWakeLock");
}
}
}
private static class DelayExecuteHandler extends Handler {
- private final WeakReference<HeartRateFragment> mFragment;
+ private final WeakReference<JustHeartRateFragment> mFragment;
- public DelayExecuteHandler(HeartRateFragment fragment) {
+ public DelayExecuteHandler(JustHeartRateFragment fragment) {
mFragment = new WeakReference<>(fragment);
}
@Override
public void dispatchMessage(@NonNull Message msg) {
super.dispatchMessage(msg);
- HeartRateFragment heartRateFragment = mFragment.get();
+ JustHeartRateFragment heartRateFragment = mFragment.get();
if (heartRateFragment != null) {
heartRateFragment.releaseWakeLock();
}
--- /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|top"
+ android:layout_marginLeft="30dp"
+ android:layout_marginTop="36dp"
+ android:visibility="@{isShowTips ? View.GONE : View.VISIBLE}">
+
+ <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="right|top"
+ android:layout_margin="30dp"
+ android:layout_marginTop="30dp"
+ android:layout_marginRight="20dp"
+ 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="50dp"
+ android:visibility="gone">
+
+ <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="30dp"
+ 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="50dp"
+ android:visibility="gone">
+
+ <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>