-[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":66,"versionName":"202102011414","enabled":true,"outputFile":"ICL02Blood_V66_202102011414_release.apk","fullName":"release","baseName":"release"},"path":"ICL02Blood_V66_202102011414_release.apk","properties":{}}]
\ No newline at end of file
+[{"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
oneway void onHeartRateUpdate(in HeartRate heartRate);
oneway void onGettingData();
oneway void onWaiting();
+ oneway void onNoWear();
}
\ No newline at end of file
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 com.ic.blood.fragment.BloodFragment;
+import com.ic.blood.fragment.HeartRateFragment;
+import com.ic.blood.util.IcLog;
+import com.ic.blood.util.SystemUtils;
public class BloodActivity extends AppCompatActivity {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_blood);
fragmentManager = getSupportFragmentManager();
- commitFragment(BloodFragment.newInstance());
-
+ try {
+ String noSupportBlood = SystemUtils
+ .getSystemPropertiesString("persist.sys.no_blood_pressure",
+ "false");
+ Log.d(TAG, "protocolCode == > " + noSupportBlood);
+ if ("false".equals(noSupportBlood)) {
+ commitFragment(HeartRateFragment.newInstance());
+ } else {
+ commitFragment(BloodFragment.newInstance());
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ commitFragment(BloodFragment.newInstance());
+ }
+ IcLog.d("TAG", "onCreate...");
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
registerReceiver(screenOnOffReceiver, intentFilter);
import com.ic.blood.databinding.FragmentBloodBinding;
import com.ic.blood.model.BloodCheckModel;
import com.ic.blood.util.IcLog;
+import com.ic.blood.util.SystemUtils;
import java.io.IOException;
import java.lang.ref.WeakReference;
private GifDrawable gifFromAssets;
private DelayExecuteHandler delayHandler;
+ private GifImageView gifImageView;
+ private ImageView heartRateView;
public static BloodFragment newInstance() {
return new BloodFragment();
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();
IcLog.i(TAG, "finish");
((BloodActivity) mContext).finish();
bloodBinding.setHeartValue(value[2]);
bloodBinding.setOxygenValue(value[3]);
gifFromAssets.stop();
+ gifImageView.setVisibility(View.GONE);
+ heartRateView.setVisibility(View.VISIBLE);
delayHandler.sendMessageDelayed(new Message(), 1000 * 10);
});
}
private void setGifDrawable() {
- GifImageView gifImageView = bloodBinding.icHeartGif;
+ gifImageView = bloodBinding.icHeartGif;
+ heartRateView = bloodBinding.heartRateView;
gifImageView.setScaleType(ImageView.ScaleType.CENTER);
try {
gifFromAssets = new GifDrawable(mContext.getAssets(), "only_hr_check.gif");
--- /dev/null
+package com.ic.blood.fragment;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.os.PowerManager;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+import androidx.lifecycle.ViewModelProvider;
+
+import com.ic.blood.BloodActivity;
+import com.ic.blood.BloodApp;
+import com.ic.blood.R;
+import com.ic.blood.databinding.FragmentBloodBinding;
+import com.ic.blood.databinding.FragmentOxygenHeartRateBinding;
+import com.ic.blood.model.BloodCheckModel;
+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 HeartRateFragment extends Fragment {
+
+ private static final String TAG = "BloodFragment";
+
+ private Context mContext;
+ private BloodApp mApp;
+
+ private FragmentOxygenHeartRateBinding bloodBinding;
+
+ private PowerManager.WakeLock mWakeLock = null;
+ private BloodCheckModel bloodModel;
+
+ private GifDrawable gifFromAssets;
+
+ private DelayExecuteHandler delayHandler;
+ private GifImageView gifImageView;
+ private ImageView heartRateView;
+
+ public static HeartRateFragment newInstance() {
+ return new HeartRateFragment();
+ }
+
+ @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 = FragmentOxygenHeartRateBinding.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();
+ 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.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<HeartRateFragment> mFragment;
+
+ public DelayExecuteHandler(HeartRateFragment fragment) {
+ mFragment = new WeakReference<HeartRateFragment>(fragment);
+ }
+
+ @Override
+ public void dispatchMessage(@NonNull Message msg) {
+ super.dispatchMessage(msg);
+ mFragment.get().releaseWakeLock();
+ }
+ }
+}
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.os.IBinder;
+import android.os.RemoteException;
import android.util.SparseArray;
import androidx.lifecycle.LiveData;
//让UI显示保持安静,准备测试的玩意
}
+ @Override
+ public void onNoWear() {
+
+ }
+
};
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"
- tools:context=".MainActivity">
+ android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
xmlns:tools="http://schemas.android.com/tools">
<data>
- <import type="android.view.View"/>
+
+ <import type="android.view.View" />
<variable
name="topTips"
<variable
name="oxygenValue"
type="String" />
+
<variable
name="highValue"
type="String" />
<variable
name="lowValue"
type="String" />
-
+
<variable
name="finishTips"
type="String" />
android:id="@+id/ic_heart_gif"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:layout_gravity="center" />
-
- <TextView
- style="@style/bloodTextStyle"
- android:text="@{finishTips}"
android:layout_gravity="center"
- android:visibility="@{isShowTips ? View.GONE : View.VISIBLE}"/>
+ 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"
android:layout_gravity="center_horizontal"
android:layout_marginTop="30dp"
android:text="@{topTips}"
- android:visibility="@{isShowTips ? View.VISIBLE : View.GONE}"/>
+ android:visibility="@{isShowTips ? View.VISIBLE : View.GONE}" />
<TextView
android:id="@+id/ic_tips_bottom"
android:layout_gravity="bottom|center_horizontal"
android:layout_marginBottom="50dp"
android:text="@{bottomTips}"
- android:visibility="@{isShowTips ? View.VISIBLE : View.GONE}"/>
+ 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="center_horizontal"
- android:layout_marginTop="40dp"
- android:visibility="@{isShowTips ? View.GONE : View.VISIBLE}">
+ android:id="@+id/ic_heart_layout"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:layout_marginTop="40dp"
+ android:visibility="@{isShowTips ? View.GONE : View.VISIBLE}">
<TextView
android:id="@+id/ic_heart_name"
android:layout_marginEnd="10dp"
android:text="@string/ic_heart_rate" />
- <TextView
- style="@style/bloodTextStyle"
- android:id="@+id/ic_heart_value"
- android:layout_marginStart="10dp"
- android:layout_toEndOf="@id/ic_heart_name"
- android:text="@{heartValue}"/>
- </RelativeLayout>
+ <TextView
+ android:id="@+id/ic_heart_value"
+ style="@style/bloodTextStyle"
+ android:layout_marginStart="10dp"
+ android:layout_toEndOf="@id/ic_heart_name"
+ android:text="@{heartValue}" />
+ </RelativeLayout>
+
<RelativeLayout
android:id="@+id/ic_oxygen_layout"
android:layout_width="wrap_content"
android:text="@string/ic_blood_oxygen" />
<TextView
- style="@style/bloodTextStyle"
android:id="@+id/ic_blood_oxygen"
+ style="@style/bloodTextStyle"
android:layout_marginStart="10dp"
android:layout_toEndOf="@id/ic_blood_oxygen_name"
- android:text="@{oxygenValue}"/>
+ android:text="@{oxygenValue}" />
</RelativeLayout>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
- android:layout_marginStart="40dp"
+ android:layout_marginStart="20dp"
android:layout_marginBottom="50dp"
android:visibility="@{isShowTips ? View.GONE : View.VISIBLE}">
style="@style/bloodTextStyle"
android:layout_below="@id/ic_high_name"
android:layout_centerHorizontal="true"
- android:text="@{highValue}"/>
+ android:text="@{highValue}" />
</RelativeLayout>
+
+ <TextView
+ style="@style/bloodTextStyle"
+ android:layout_gravity="center|bottom"
+ android:layout_marginBottom="20dp"
+ 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="40dp"
+ android:layout_marginEnd="20dp"
android:layout_marginBottom="50dp"
android:visibility="@{isShowTips ? View.GONE : View.VISIBLE}">
style="@style/bloodTextStyle"
android:layout_below="@id/ic_low_name"
android:layout_centerHorizontal="true"
- android:text="@{lowValue}"/>
+ android:text="@{lowValue}" />
</RelativeLayout>
</FrameLayout>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools">
+
+ <data>
+
+ <import type="android.view.View" />
+
+ <variable
+ name="topTips"
+ type="String" />
+
+ <variable
+ name="bottomTips"
+ type="String" />
+
+ <variable
+ name="isShowTips"
+ type="boolean" />
+
+ <variable
+ name="heartValue"
+ type="String" />
+
+ <variable
+ name="oxygenValue"
+ type="String" />
+
+ <variable
+ name="highValue"
+ type="String" />
+
+ <variable
+ name="lowValue"
+ type="String" />
+
+ <variable
+ name="finishTips"
+ type="String" />
+ </data>
+
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="#000000">
+
+ <pl.droidsonroids.gif.GifImageView
+ android:id="@+id/ic_heart_gif"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="center"
+ android:visibility="gone" />
+
+ <ImageView
+ android:id="@+id/heart_rate_view"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:src="@mipmap/default_heart_rate_icon" />
+
+
+ <TextView
+ android:id="@+id/ic_tips_top"
+ style="@style/bloodTextStyle"
+ android:layout_gravity="center_horizontal"
+ android:layout_marginTop="30dp"
+ android:text="@{topTips}"
+ android:visibility="@{isShowTips ? View.VISIBLE : View.GONE}" />
+
+ <TextView
+ android:id="@+id/ic_tips_bottom"
+ style="@style/bloodTextStyle"
+ android:layout_gravity="bottom|center_horizontal"
+ android:layout_marginBottom="30dp"
+ android:text="@{bottomTips}"
+ android:visibility="@{isShowTips ? View.VISIBLE : View.GONE}" />
+
+ <RelativeLayout
+ android:id="@+id/ic_heart_layout"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="left"
+ android:layout_marginLeft="20dp"
+ android:layout_marginTop="30dp"
+ android:visibility="@{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>
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textColor">#FFFFFF</item>
+ <item name="android:textStyle">bold</item>
<item name="android:textSize">32sp</item>
</style>
</resources>
-#Mon Feb 01 14:14:33 CST 2021
-VERSION_CODE=66
+#Thu Jun 03 10:18:21 CST 2021
+VERSION_CODE=74