adjust ui for gator.
authorTrillGates <williamtrillgates@gmail.com>
Tue, 27 Jul 2021 07:57:51 +0000 (15:57 +0800)
committerTrillGates <williamtrillgates@gmail.com>
Tue, 27 Jul 2021 07:57:51 +0000 (15:57 +0800)
app/src/main/java/com/ic/blood/Gh301Activity.java
app/src/main/java/com/ic/blood/WelcomeActivity.java
app/src/main/java/com/ic/blood/fragment/HeartRateAndBloodOxygenFragment.java [new file with mode: 0644]
app/src/main/java/com/ic/blood/fragment/JustHeartRateFragment.java [moved from app/src/main/java/com/ic/blood/fragment/HeartRateFragment.java with 92% similarity]
app/src/main/res/layout/fragment_heart_rate_both.xml [new file with mode: 0644]

index 4cd7e98..ee8b273 100644 (file)
@@ -8,12 +8,16 @@ import androidx.fragment.app.Fragment;
 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);
@@ -24,10 +28,16 @@ public class Gh301Activity extends AppCompatActivity {
         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());
         }
     }
@@ -44,7 +54,9 @@ public class Gh301Activity extends AppCompatActivity {
     }
 
     public void showHeartRatePage() {
-        showFragment(HeartRateFragment.newInstance());
+        showFragment(Boolean.parseBoolean(isShowBothInfo) ?
+                HeartRateAndBloodOxygenFragment.newInstance() :
+                JustHeartRateFragment.newInstance());
     }
 
     @Override
index bfbc2cc..0c332d5 100644 (file)
@@ -18,7 +18,7 @@ public class WelcomeActivity extends AppCompatActivity {
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        //判断是不是gh301
+        //判断是不是gh301(gator)
         String isGh301 = SystemUtils
                 .getSystemPropertiesString("persist.sys.is_gh301",
                         "false");
diff --git a/app/src/main/java/com/ic/blood/fragment/HeartRateAndBloodOxygenFragment.java b/app/src/main/java/com/ic/blood/fragment/HeartRateAndBloodOxygenFragment.java
new file mode 100644 (file)
index 0000000..023b298
--- /dev/null
@@ -0,0 +1,213 @@
+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();
+            }
+        }
+    }
+}
@@ -33,9 +33,9 @@ import static android.content.Context.POWER_SERVICE;
 
 
 /**
- * 这个是只有心率和血氧的UI
+ * 这个是只有心率UI
  */
-public class HeartRateFragment extends Fragment {
+public class JustHeartRateFragment extends Fragment {
 
     private static final String TAG = "BloodFragment";
 
@@ -53,8 +53,8 @@ public class HeartRateFragment extends Fragment {
     private GifImageView gifImageView;
     private ImageView heartRateView;
 
-    public static HeartRateFragment newInstance() {
-        return new HeartRateFragment();
+    public static JustHeartRateFragment newInstance() {
+        return new JustHeartRateFragment();
     }
 
     @Override
@@ -73,6 +73,8 @@ public class HeartRateFragment extends Fragment {
     @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));
@@ -151,7 +153,7 @@ public class HeartRateFragment extends Fragment {
     @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");
         }
     }
@@ -193,16 +195,16 @@ public class HeartRateFragment extends Fragment {
     }
 
     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();
             }
diff --git a/app/src/main/res/layout/fragment_heart_rate_both.xml b/app/src/main/res/layout/fragment_heart_rate_both.xml
new file mode 100644 (file)
index 0000000..569f2f7
--- /dev/null
@@ -0,0 +1,180 @@
+<?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>