-[{"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
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" />
<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
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
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;
"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();
fragmentTransaction.commit();
}
+ @Override
+ public void onBackPressed() {
+ FragmentManager supportFragmentManager = getSupportFragmentManager();
+ if (supportFragmentManager.getBackStackEntryCount() == 1) {
+ finish();
+ } else {
+ super.onBackPressed();
+ }
+ }
+
@Override
protected void onDestroy() {
super.onDestroy();
--- /dev/null
+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();
+ }
+ }
+}
--- /dev/null
+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();
+ }
+}
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;
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;
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]);
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;
/**
* 这个是只有心率和血氧的UI
*/
-public class HeartRateFragment extends Fragment {
+public class HeartRateAndOxygenFragment extends Fragment {
private static final String TAG = "BloodFragment";
private GifImageView gifImageView;
private ImageView heartRateView;
- public static HeartRateFragment newInstance() {
- return new HeartRateFragment();
+ public static HeartRateAndOxygenFragment newInstance() {
+ return new HeartRateAndOxygenFragment();
}
@Override
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);
}
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();
+ }
}
}
}
--- /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.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();
+ }
+ }
+ }
+}
--- /dev/null
+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();
+ });
+ }
+}
mObsBloodTempValue = bloodPresenter.getObsBloodTempValue();
}
+ public void updateTestType(BloodPresenter.TestType testType) {
+ bloodPresenter.setTestType(testType);
+ }
public LiveData<String> getObsStateTips() {
return mObsStateTips;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.os.IBinder;
-import android.os.RemoteException;
import android.util.SparseArray;
import androidx.lifecycle.LiveData;
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;
}
}
+ /**
+ * 测量之前要先设置
+ *
+ * @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;
* 绑定远程服务
*/
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);
* 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);
}
try {
mService = IHeartRateSensorService.Stub.asInterface(service);
mService.registerCallback(bloodInterface, BloodPresenter.class.getName());
+ //判断任务类型
startCheckBlood();
} catch (Exception e) {
IcLog.e(TAG, "ServiceConnection", e);
+++ /dev/null
-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;
- }
-}
--- /dev/null
+<?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
--- /dev/null
+<?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
<?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
+++ /dev/null
-<?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
--- /dev/null
+<?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
--- /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>
-#Thu Jun 03 10:18:21 CST 2021
-VERSION_CODE=74
+#Thu Jun 03 15:26:59 CST 2021
+VERSION_CODE=76