test different type of heart rate or blood oxygen
authorTrillGates <williamtrillgates@gmail.com>
Mon, 21 Jun 2021 11:45:38 +0000 (19:45 +0800)
committerTrillGates <williamtrillgates@gmail.com>
Mon, 21 Jun 2021 11:45:38 +0000 (19:45 +0800)
26 files changed:
app/release/ICL02Blood_V76_202106031526_release.apk [moved from app/release/ICL02Blood_V74_202106031018_release.apk with 55% similarity]
app/release/output.json
app/src/main/AndroidManifest.xml
app/src/main/aidl/com/ic/work/IHeartRateSensorService.aidl
app/src/main/java/com/ic/blood/BloodActivity.java
app/src/main/java/com/ic/blood/Gh301Activity.java [new file with mode: 0644]
app/src/main/java/com/ic/blood/WelcomeActivity.java [new file with mode: 0644]
app/src/main/java/com/ic/blood/fragment/BloodFragment.java
app/src/main/java/com/ic/blood/fragment/HeartRateAndOxygenFragment.java [moved from app/src/main/java/com/ic/blood/fragment/HeartRateFragment.java with 90% similarity]
app/src/main/java/com/ic/blood/fragment/OxygenFragment.java [new file with mode: 0644]
app/src/main/java/com/ic/blood/fragment/SelectFragment.java [new file with mode: 0644]
app/src/main/java/com/ic/blood/model/BloodCheckModel.java
app/src/main/java/com/ic/blood/presenter/BloodPresenter.java
app/src/main/java/com/ic/blood/util/ServiceUtil.java [deleted file]
app/src/main/res/drawable/btn_green_bg_selector.xml [new file with mode: 0644]
app/src/main/res/drawable/btn_red_bg_selector.xml [new file with mode: 0644]
app/src/main/res/drawable/fzd_save_mode_normal.png [new file with mode: 0644]
app/src/main/res/drawable/fzd_save_mode_press.png [new file with mode: 0644]
app/src/main/res/drawable/fzd_shutdown_normal.png [new file with mode: 0644]
app/src/main/res/drawable/fzd_shutdown_press.png [new file with mode: 0644]
app/src/main/res/drawable/ic_launcher_foreground.xml [moved from app/src/main/res/drawable-v24/ic_launcher_foreground.xml with 100% similarity]
app/src/main/res/layout/activity_blood.xml
app/src/main/res/layout/activity_main.xml [deleted file]
app/src/main/res/layout/fragment_choose.xml [new file with mode: 0644]
app/src/main/res/layout/fragment_oxygen.xml [new file with mode: 0644]
app/version_code.properties

similarity index 55%
rename from app/release/ICL02Blood_V74_202106031018_release.apk
rename to app/release/ICL02Blood_V76_202106031526_release.apk
index dbcf2e3..a43e427 100644 (file)
Binary files a/app/release/ICL02Blood_V74_202106031018_release.apk and b/app/release/ICL02Blood_V76_202106031526_release.apk differ
index 8445a0b..8472d0a 100644 (file)
@@ -1 +1 @@
-[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":74,"versionName":"202106031018","enabled":true,"outputFile":"ICL02Blood_V74_202106031018_release.apk","fullName":"release","baseName":"release"},"path":"ICL02Blood_V74_202106031018_release.apk","properties":{}}]
\ No newline at end of file
+[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":76,"versionName":"202106031526","enabled":true,"outputFile":"ICL02Blood_V76_202106031526_release.apk","fullName":"release","baseName":"release"},"path":"ICL02Blood_V76_202106031526_release.apk","properties":{}}]
\ No newline at end of file
index 9155c59..2941af2 100644 (file)
@@ -17,7 +17,7 @@
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
         android:theme="@style/AppTheme">
-        <activity android:name=".BloodActivity">
+        <activity android:name=".WelcomeActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="android.intent.action.VIEW" />
@@ -25,5 +25,7 @@
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
+        <activity android:name=".Gh301Activity" />
+        <activity android:name=".BloodActivity" />
     </application>
 </manifest>
\ No newline at end of file
index 70a7dd5..c0a30f6 100644 (file)
@@ -7,4 +7,7 @@ interface IHeartRateSensorService {
     void registerCallback(in IHeartRateSensorCallback callback,in String callbackTag);
     void unRegisterCallback(in IHeartRateSensorCallback callback);
     oneway void getHeartRateInfo(int from,in String callbackTag);
+    oneway void getJustOxygenInfo(in int from,in String callbackTag);
+    oneway void getJustHeartRateInfo(in int from,in String callbackTag);
+    oneway void stopCurrentWork(in int from,in String callbackTag);
 }
\ No newline at end of file
index fe46676..e1109dd 100644 (file)
@@ -1,22 +1,20 @@
 package com.ic.blood;
 
-import androidx.appcompat.app.AppCompatActivity;
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.FragmentTransaction;
-
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
-import android.net.wifi.aware.IdentityChangedListener;
 import android.os.Bundle;
-import android.text.TextUtils;
 import android.util.Log;
 import android.view.WindowManager;
 
+import androidx.appcompat.app.AppCompatActivity;
+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.HeartRateFragment;
+import com.ic.blood.fragment.HeartRateAndOxygenFragment;
 import com.ic.blood.util.IcLog;
 import com.ic.blood.util.SystemUtils;
 
@@ -37,9 +35,9 @@ public class BloodActivity extends AppCompatActivity {
                             "false");
             Log.d(TAG, "protocolCode == > " + noSupportBlood);
             if ("false".equals(noSupportBlood)) {
-                commitFragment(HeartRateFragment.newInstance());
-            } else {
                 commitFragment(BloodFragment.newInstance());
+            } else {
+                commitFragment(HeartRateAndOxygenFragment.newInstance());
             }
         } catch (Exception e) {
             e.printStackTrace();
@@ -58,6 +56,16 @@ public class BloodActivity extends AppCompatActivity {
         fragmentTransaction.commit();
     }
 
+    @Override
+    public void onBackPressed() {
+        FragmentManager supportFragmentManager = getSupportFragmentManager();
+        if (supportFragmentManager.getBackStackEntryCount() == 1) {
+            finish();
+        } else {
+            super.onBackPressed();
+        }
+    }
+
     @Override
     protected void onDestroy() {
         super.onDestroy();
diff --git a/app/src/main/java/com/ic/blood/Gh301Activity.java b/app/src/main/java/com/ic/blood/Gh301Activity.java
new file mode 100644 (file)
index 0000000..1ce54a5
--- /dev/null
@@ -0,0 +1,49 @@
+package com.ic.blood;
+
+import android.os.Bundle;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentTransaction;
+
+import com.ic.blood.fragment.HeartRateAndOxygenFragment;
+import com.ic.blood.fragment.OxygenFragment;
+import com.ic.blood.fragment.SelectFragment;
+
+public class Gh301Activity extends AppCompatActivity {
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_blood);
+        //先显示选择测试的UI
+        //切换Activity即可
+        showFragment(SelectFragment.newInstance());
+    }
+
+    private void showFragment(Fragment fragment) {
+        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
+        fragmentTransaction.replace(R.id.main_content_fl, fragment);
+        fragmentTransaction.addToBackStack(null);
+        fragmentTransaction.commit();
+    }
+
+    public void showOxygenPage() {
+        showFragment(OxygenFragment.newInstance());
+    }
+
+    public void showHeartRatePage() {
+        showFragment(HeartRateAndOxygenFragment.newInstance());
+    }
+
+    @Override
+    public void onBackPressed() {
+        FragmentManager supportFragmentManager = getSupportFragmentManager();
+        if (supportFragmentManager.getBackStackEntryCount() == 1) {
+            finish();
+        } else {
+            super.onBackPressed();
+        }
+    }
+}
diff --git a/app/src/main/java/com/ic/blood/WelcomeActivity.java b/app/src/main/java/com/ic/blood/WelcomeActivity.java
new file mode 100644 (file)
index 0000000..7d8cde8
--- /dev/null
@@ -0,0 +1,34 @@
+package com.ic.blood;
+
+import android.content.Intent;
+import android.os.Bundle;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.ic.blood.util.SystemUtils;
+
+/**
+ * 配置项:
+ * persist.sys.no_blood_pressure,没有血压,只有血氧和心率
+ * persist.sys.is_gh301,true表示为gh301的机器
+ */
+public class WelcomeActivity extends AppCompatActivity {
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        //判断是不是gh301
+        String isGh301 = SystemUtils
+                .getSystemPropertiesString("persist.sys.is_gh301",
+                        "false");
+        if (true) {
+            //如是果是gh301,那么就跳转到测量选项页面
+            startActivity(new Intent(this, Gh301Activity.class));
+        } else {
+            //跳转到以前的页面
+            startActivity(new Intent(this, BloodActivity.class));
+        }
+        finish();
+    }
+}
index f50a476..2f8f70e 100644 (file)
@@ -3,11 +3,6 @@ package com.ic.blood.fragment;
 import android.annotation.SuppressLint;
 import android.content.Context;
 import android.os.Bundle;
-
-import androidx.annotation.NonNull;
-import androidx.fragment.app.Fragment;
-import androidx.lifecycle.ViewModelProvider;
-
 import android.os.Handler;
 import android.os.Message;
 import android.os.PowerManager;
@@ -16,13 +11,17 @@ 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 java.io.IOException;
 import java.lang.ref.WeakReference;
@@ -102,18 +101,18 @@ public class BloodFragment extends Fragment {
         heartRateView.setVisibility(View.VISIBLE);
         gifFromAssets.stop();
         releaseWakeLock();
-        IcLog.i(TAG, "finish");
-        ((BloodActivity) mContext).finish();
     }
 
     private void initBloodModel() {
         //观察状态的变化
         BloodCheckModel.Factory factory = new BloodCheckModel.Factory(mApp);
         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]);
@@ -18,9 +18,9 @@ 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.FragmentOxygenHeartRateBinding;
 import com.ic.blood.model.BloodCheckModel;
+import com.ic.blood.presenter.BloodPresenter;
 import com.ic.blood.util.IcLog;
 
 import java.io.IOException;
@@ -35,7 +35,7 @@ import static android.content.Context.POWER_SERVICE;
 /**
  * 这个是只有心率和血氧的UI
  */
-public class HeartRateFragment extends Fragment {
+public class HeartRateAndOxygenFragment 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 HeartRateAndOxygenFragment newInstance() {
+        return new HeartRateAndOxygenFragment();
     }
 
     @Override
@@ -102,14 +102,13 @@ public class HeartRateFragment extends Fragment {
         heartRateView.setVisibility(View.VISIBLE);
         gifFromAssets.stop();
         releaseWakeLock();
-        IcLog.i(TAG, "finish");
-        ((BloodActivity) mContext).finish();
     }
 
     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);
@@ -193,16 +192,19 @@ public class HeartRateFragment extends Fragment {
     }
 
     private static class DelayExecuteHandler extends Handler {
-        private final WeakReference<HeartRateFragment> mFragment;
+        private final WeakReference<HeartRateAndOxygenFragment> mFragment;
 
-        public DelayExecuteHandler(HeartRateFragment fragment) {
-            mFragment = new WeakReference<HeartRateFragment>(fragment);
+        public DelayExecuteHandler(HeartRateAndOxygenFragment fragment) {
+            mFragment = new WeakReference<>(fragment);
         }
 
         @Override
         public void dispatchMessage(@NonNull Message msg) {
             super.dispatchMessage(msg);
-            mFragment.get().releaseWakeLock();
+            HeartRateAndOxygenFragment 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/OxygenFragment.java
new file mode 100644 (file)
index 0000000..dff8c62
--- /dev/null
@@ -0,0 +1,211 @@
+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.FragmentOxygenBinding;
+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 OxygenFragment extends Fragment {
+
+    private static final String TAG = "OxygenFragment";
+
+    private Context mContext;
+    private BloodApp mApp;
+
+    private FragmentOxygenBinding bloodBinding;
+
+    private PowerManager.WakeLock mWakeLock = null;
+    private BloodCheckModel bloodModel;
+
+    private GifDrawable gifFromAssets;
+
+    private DelayExecuteHandler delayHandler;
+    private GifImageView gifImageView;
+    private ImageView heartRateView;
+
+    public static OxygenFragment newInstance() {
+        return new OxygenFragment();
+    }
+
+    @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();
+        initWakeLock(mContext);
+        delayHandler = new DelayExecuteHandler(this);
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                             Bundle savedInstanceState) {
+        bloodBinding = FragmentOxygenBinding.inflate(inflater, container, false);
+        bloodBinding.setIsShowTips(true);
+        bloodBinding.setTopTips(getString(R.string.tips_quiet_please));
+        initBloodModel();
+        setGifDrawable();
+        //绑定远程服务
+        bloodModel.onCreateView();
+        return bloodBinding.getRoot();
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        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_OXYGEN);
+        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 = 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<OxygenFragment> mFragment;
+
+        public DelayExecuteHandler(OxygenFragment fragment) {
+            mFragment = new WeakReference<>(fragment);
+        }
+
+        @Override
+        public void dispatchMessage(@NonNull Message msg) {
+            super.dispatchMessage(msg);
+            OxygenFragment 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
new file mode 100644 (file)
index 0000000..ed5f4b3
--- /dev/null
@@ -0,0 +1,47 @@
+package com.ic.blood.fragment;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.ic.blood.Gh301Activity;
+import com.ic.blood.R;
+
+/**
+ * 这个是选择测心率还是测血氧的UI
+ */
+public class SelectFragment extends Fragment {
+
+    public static Fragment newInstance() {
+        return new SelectFragment();
+    }
+
+
+    @Nullable
+    @Override
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        return inflater.inflate(R.layout.fragment_choose, container, false);
+    }
+
+    @Override
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+        //界面创建了,就两个动作,切换到测心率,
+        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();
+
+        });
+        heartRateTv.setOnClickListener(v -> {
+            //跳转到心率设置
+            ((Gh301Activity) getActivity()).showHeartRatePage();
+        });
+    }
+}
index ce69b6f..094437f 100644 (file)
@@ -32,6 +32,9 @@ public class BloodCheckModel extends AndroidViewModel {
         mObsBloodTempValue = bloodPresenter.getObsBloodTempValue();
     }
 
+    public void updateTestType(BloodPresenter.TestType testType) {
+        bloodPresenter.setTestType(testType);
+    }
 
     public LiveData<String> getObsStateTips() {
         return mObsStateTips;
index 6d3760c..06347a8 100644 (file)
@@ -8,7 +8,6 @@ import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.ServiceConnection;
 import android.os.IBinder;
-import android.os.RemoteException;
 import android.util.SparseArray;
 
 import androidx.lifecycle.LiveData;
@@ -42,7 +41,12 @@ public class BloodPresenter {
     private SparseArray<String> mTipsSpares;
     //判断有没有配戴的,如果没有配戴的话,就不更新数据了
     private boolean mHasWear = false;
-    private boolean mBind;
+
+    private TestType testType = TestType.ALL;
+
+    public enum TestType {
+        ALL, JUST_OXYGEN, JUST_HEART_RATE
+    }
 
     public BloodPresenter(Context context) {
         this.mContext = context;
@@ -101,6 +105,15 @@ public class BloodPresenter {
         }
     }
 
+    /**
+     * 测量之前要先设置
+     *
+     * @param testType
+     */
+    public void setTestType(TestType testType) {
+        this.testType = testType;
+    }
+
     //integer  eventID =1 脱落, eventID =0 佩戴
     public static String KEY_ANTI_EVENT = "eventID";
     public static final int STATE_ANTI_ON = 0;
@@ -138,15 +151,21 @@ public class BloodPresenter {
      * 绑定远程服务
      */
     private void bindRemoteService() {
-        Intent intent = new Intent();
-        intent.setAction(ACTION_HEART_RATE);
-        mBind = mContext.bindService(intent, connection, Context.BIND_AUTO_CREATE);
+        try {
+            Intent intent = new Intent();
+            intent.setAction(ACTION_HEART_RATE);
+            mContext.bindService(intent, connection, Context.BIND_AUTO_CREATE);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
     }
 
     public void release() {
         try {
             if (mService != null) {
                 IcLog.d(TAG, "unRegister blood remote callback...");
+                //停止测试
+                mService.stopCurrentWork(2, BloodPresenter.class.getName());
                 mService.unRegisterCallback(bloodInterface);
             }
             mContext.unbindService(connection);
@@ -174,7 +193,15 @@ public class BloodPresenter {
                  *  ALARM_CMD(1)定时的测试指,
                  *  CLIENT_CMD(2)用户UI主动的指令;
                  */
-                mService.getHeartRateInfo(2, BloodPresenter.class.getName());
+                //判断类型
+                IcLog.d(TAG, "startCheckBlood == > " + testType);
+                if (testType == TestType.JUST_HEART_RATE) {
+                    mService.getJustHeartRateInfo(2, BloodPresenter.class.getName());
+                } else if (testType == TestType.JUST_OXYGEN) {
+                    mService.getJustOxygenInfo(2, BloodPresenter.class.getName());
+                } else {
+                    mService.getHeartRateInfo(2, BloodPresenter.class.getName());
+                }
             } catch (Exception e) {
                 IcLog.e(TAG, "startCheckBlood", e);
             }
@@ -212,6 +239,7 @@ public class BloodPresenter {
             try {
                 mService = IHeartRateSensorService.Stub.asInterface(service);
                 mService.registerCallback(bloodInterface, BloodPresenter.class.getName());
+                //判断任务类型
                 startCheckBlood();
             } catch (Exception e) {
                 IcLog.e(TAG, "ServiceConnection", e);
diff --git a/app/src/main/java/com/ic/blood/util/ServiceUtil.java b/app/src/main/java/com/ic/blood/util/ServiceUtil.java
deleted file mode 100644 (file)
index f20c9cc..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.ic.blood.util;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.content.pm.ResolveInfo;
-import android.content.pm.ServiceInfo;
-
-import java.util.List;
-
-public class ServiceUtil {
-
-    public static void startServiceUtil(Context context, String serviceAction, String packageName) {
-        Intent intent = getExplicitIntent(context, new Intent(serviceAction));
-        if (intent != null) {
-            intent.setPackage(packageName);
-            context.startService(intent);
-        }
-    }
-
-    public static void bindServiceUtil(Context context, String action, ServiceConnection connection, String pck) {
-        Intent in = getExplicitIntent(context, new Intent(action));
-        if (in != null) {
-            in.setPackage(pck);
-            context.bindService(in, connection, Context.BIND_AUTO_CREATE);
-        }
-    }
-
-    public static void unBindServiceUtil(Context context, ServiceConnection connection) {
-        context.unbindService(connection);
-    }
-
-    private static Intent getExplicitIntent(Context context, Intent impl) {
-        List<ResolveInfo> resolveInfo = context.getPackageManager().queryIntentServices(impl, 0);
-
-        if (resolveInfo.size() != 1) return null;
-
-        Intent intent = new Intent(impl);
-        ServiceInfo info = resolveInfo.get(0).serviceInfo;
-        if (info == null) return null;
-        intent.setComponent(new ComponentName(info.packageName, info.name));
-
-        return intent;
-    }
-}
diff --git a/app/src/main/res/drawable/btn_green_bg_selector.xml b/app/src/main/res/drawable/btn_green_bg_selector.xml
new file mode 100644 (file)
index 0000000..f26e694
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@drawable/fzd_save_mode_press" android:state_pressed="true" />
+    <item android:drawable="@drawable/fzd_save_mode_normal" />
+
+</selector>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/btn_red_bg_selector.xml b/app/src/main/res/drawable/btn_red_bg_selector.xml
new file mode 100644 (file)
index 0000000..b9a9feb
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@drawable/fzd_shutdown_press" android:state_pressed="true" />
+    <item android:drawable="@drawable/fzd_shutdown_normal" />
+
+</selector>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/fzd_save_mode_normal.png b/app/src/main/res/drawable/fzd_save_mode_normal.png
new file mode 100644 (file)
index 0000000..aa652f0
Binary files /dev/null and b/app/src/main/res/drawable/fzd_save_mode_normal.png differ
diff --git a/app/src/main/res/drawable/fzd_save_mode_press.png b/app/src/main/res/drawable/fzd_save_mode_press.png
new file mode 100644 (file)
index 0000000..836970f
Binary files /dev/null and b/app/src/main/res/drawable/fzd_save_mode_press.png differ
diff --git a/app/src/main/res/drawable/fzd_shutdown_normal.png b/app/src/main/res/drawable/fzd_shutdown_normal.png
new file mode 100644 (file)
index 0000000..2c549cd
Binary files /dev/null and b/app/src/main/res/drawable/fzd_shutdown_normal.png differ
diff --git a/app/src/main/res/drawable/fzd_shutdown_press.png b/app/src/main/res/drawable/fzd_shutdown_press.png
new file mode 100644 (file)
index 0000000..28e7298
Binary files /dev/null and b/app/src/main/res/drawable/fzd_shutdown_press.png differ
index 1f5824c..c9e2ca4 100644 (file)
@@ -1,8 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <FrameLayout 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"
     android:id="@+id/main_content_fl"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    tools:context=".BloodActivity" />
\ No newline at end of file
+    android:background="@android:color/black" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
deleted file mode 100644 (file)
index 737dd14..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout 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"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <TextView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="Hello World!"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintLeft_toLeftOf="parent"
-        app:layout_constraintRight_toRightOf="parent"
-        app:layout_constraintTop_toTopOf="parent" />
-
-</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_choose.xml b/app/src/main/res/layout/fragment_choose.xml
new file mode 100644 (file)
index 0000000..ac74d96
--- /dev/null
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        android:padding="20dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent">
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginBottom="10dp"
+            android:background="@drawable/btn_green_bg_selector"
+            android:id="@+id/heart_rate_tv"
+            android:gravity="center"
+            android:text="心率"
+            android:textColor="@android:color/white"
+            android:textSize="30sp" />
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="10dp"
+            android:id="@+id/blood_oxygen_tv"
+            android:background="@drawable/btn_red_bg_selector"
+            android:gravity="center"
+            android:text="血氧"
+            android:textColor="@android:color/white"
+            android:textSize="30sp" />
+
+
+    </LinearLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_oxygen.xml b/app/src/main/res/layout/fragment_oxygen.xml
new file mode 100644 (file)
index 0000000..c486ca9
--- /dev/null
@@ -0,0 +1,179 @@
+<?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="@{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"
+            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>
index a91baa2..fd2c3f4 100644 (file)
@@ -1,2 +1,2 @@
-#Thu Jun 03 10:18:21 CST 2021
-VERSION_CODE=74
+#Thu Jun 03 15:26:59 CST 2021
+VERSION_CODE=76