add a single page for device which not support envTemp and wrist temp.
authorkfl_614 <kfl_614@163.com>
Tue, 8 Dec 2020 07:04:27 +0000 (15:04 +0800)
committerkfl_614 <kfl_614@163.com>
Tue, 8 Dec 2020 07:04:27 +0000 (15:04 +0800)
app/src/main/AndroidManifest.xml
app/src/main/java/com/ic/temperature/MainActivity.kt
app/src/main/java/com/ic/temperature/domain/Temperature.kt [new file with mode: 0644]
app/src/main/java/com/ic/temperature/repository/ITemRepositoryCallback.kt [new file with mode: 0644]
app/src/main/java/com/ic/temperature/repository/TemperatureRepository.kt
app/src/main/java/com/ic/temperature/viewmodel/TemperatureViewModel.kt
app/src/main/res/layout/activity_main.xml
app/src/main/res/layout/stub_view_just_body_temp.xml [new file with mode: 0644]
app/src/main/res/layout/stub_view_normal_temp.xml [new file with mode: 0644]
app/src/main/res/values/strings.xml

index 808da0d..d435d63 100644 (file)
@@ -2,6 +2,9 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.ic.temperature">
 
+
+    <uses-permission android:name="android.permission.WAKE_LOCK" />
+
     <application
         android:name=".App"
         android:allowBackup="true"
index 5279193..0ddaa1f 100644 (file)
@@ -1,6 +1,9 @@
 package com.ic.temperature
 
+import android.annotation.SuppressLint
+import android.content.Context
 import android.os.Bundle
+import android.os.PowerManager
 import androidx.appcompat.app.AppCompatActivity
 import androidx.lifecycle.ViewModelProvider
 import com.ic.temperature.databinding.ActivityMainBinding
@@ -24,7 +27,8 @@ import com.ic.temperature.viewmodel.TemperatureViewModel
  */
 class MainActivity : AppCompatActivity() {
     private val viewModel by lazy {
-        ViewModelProvider(this,
+        ViewModelProvider(
+            this,
             ICViewModelFactory()
         ).get(TemperatureViewModel::class.java)
     }
@@ -37,6 +41,29 @@ class MainActivity : AppCompatActivity() {
         super.onCreate(savedInstanceState)
         setContentView(binding.root)
         initObserver()
+        initWakeLock()
+    }
+
+    private val wakeLock by lazy {
+        val powerManager: PowerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
+        powerManager.newWakeLock(
+            PowerManager.ACQUIRE_CAUSES_WAKEUP or PowerManager.SCREEN_DIM_WAKE_LOCK,
+            "ic:temperatureWakeLock"
+        )
+    }
+
+    @SuppressLint("InvalidWakeLockTag")
+    private fun initWakeLock() {
+        wakeLock.acquire(10 * 60)
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+        releaseWakeLock()
+    }
+
+    private fun releaseWakeLock() {
+        wakeLock.release()
     }
 
     /**
@@ -45,6 +72,17 @@ class MainActivity : AppCompatActivity() {
     private fun initObserver() {
         val that = this
         viewModel.apply {
+            println("initObserver...")
+            isJustShowBodyTempView.observe(that) {
+                if (it) {
+                    if (!binding.justTempView.isInflated)
+                        binding.justTempView.viewStub?.inflate()
+
+                } else {
+                    if (!binding.normalView.isInflated)
+                        binding.normalView.viewStub?.inflate()
+                }
+            }
             mBodyTemp.observe(that) {
                 //体温
                 binding.bodyTemp = it
@@ -62,14 +100,17 @@ class MainActivity : AppCompatActivity() {
                 binding.checkTips = it
             }
             mShowLoading.observe(that) {
+                println("mShowLoading == > $it")
                 //显示Loading
                 binding.showLoading = it
             }
             mDisableWristTemp.observe(that) {
+                println("mDisableWristTemp == > $it")
                 //是否开启腕部温度
                 binding.disableWristTemp = it
             }
             mDisableEnvTemp.observe(that) {
+                println("mDisableEnvTemp == > $it")
                 //是否开启环境温度
                 binding.disableEnvTemp = it
             }
diff --git a/app/src/main/java/com/ic/temperature/domain/Temperature.kt b/app/src/main/java/com/ic/temperature/domain/Temperature.kt
new file mode 100644 (file)
index 0000000..868cdb9
--- /dev/null
@@ -0,0 +1,7 @@
+package com.ic.temperature.domain
+
+data class Temperature(
+    val bodyOrWristTemp: Double,
+    val maybeBodyTemp: Double,
+    val envTemp: Double
+)
\ No newline at end of file
diff --git a/app/src/main/java/com/ic/temperature/repository/ITemRepositoryCallback.kt b/app/src/main/java/com/ic/temperature/repository/ITemRepositoryCallback.kt
new file mode 100644 (file)
index 0000000..bb20ee3
--- /dev/null
@@ -0,0 +1,18 @@
+package com.ic.temperature.repository
+
+interface ITemRepositoryCallback {
+    fun onTempUpdate(
+        bodyOrWristTemp: Double,
+        maybeBodyTemp: Double,
+        envTemp: Double
+    )
+
+    fun onTempFinal(
+        bodyOrWristTemp: Double,
+        maybeBodyTemp: Double,
+        envTemp: Double
+    )
+
+    fun onTesting()
+
+}
\ No newline at end of file
index 7b6fc29..6737ae3 100644 (file)
@@ -1,5 +1,134 @@
 package com.ic.temperature.repository
 
-class TemperatureRepository {
+import android.content.ComponentName
+import android.content.Context
+import android.content.ServiceConnection
+import android.os.IBinder
+import android.os.RemoteException
+import com.ic.aidl.temp.ITempAidlInterface
+import com.ic.aidl.temp.ITempRemoteService
+import com.ic.temperature.utils.Constants
+import com.ic.temperature.utils.IcLog
+import com.ic.temperature.utils.ServiceUtil
+import com.ic.temperature.viewmodel.TemperatureViewModel
+
+class TemperatureRepository(context: Context) {
+
+    private var mContext: Context = context
+
+    private var mService: ITempRemoteService? = null
+
+    private var mCallback: ITemRepositoryCallback? = null
+
+
+    fun release() {
+        ServiceUtil.unBindServiceUtil(mContext, mRemoteConnection)
+    }
+
+    /**
+     * 绑定远程服务
+     *
+     * @param context
+     */
+    fun bindWorkService(context: Context, callback: ITemRepositoryCallback) {
+        if (mService != null) {
+            println("has bind...")
+            return
+        }
+        this.mCallback = callback
+        IcLog.i(TemperatureViewModel.TAG, "bind remote service..")
+        ServiceUtil.bindServiceUtil(
+            context,
+            Constants.ACTION_REMOTE_WORK_SERVICE,
+            mRemoteConnection,
+            Constants.PACKAGE_REMOTE_WORK_SERVICE
+        )
+    }
+
+
+    private val remoteDataCallback by lazy {
+        Callback4Remote()
+    }
+
+
+    private val mRemoteConnection by lazy {
+        RemoteServiceConnection()
+    }
+
+    inner class Callback4Remote : ITempAidlInterface.Stub() {
+        @Throws(RemoteException::class)
+        /**
+         * bodyOrWristTemp:体温或者腕温(当不支持腕温的时候,就是体温)
+         * maybeBodyTemp:可能是体温(如果支持腕温的时候)
+         * envTemp:环境温度
+         */
+        override fun updateCurrTempValue(
+            bodyOrWristTemp: Double,
+            maybeBodyTemp: Double,
+            envTemp: Double
+        ) {
+            IcLog.d(
+                TemperatureViewModel.TAG,
+                "updateCurrTempValue... "
+                        + bodyOrWristTemp +
+                        " maybeBodyTemp --> "
+                        + maybeBodyTemp +
+                        " envTemp + >  "
+                        + envTemp
+            )
+            mCallback?.onTempUpdate(bodyOrWristTemp, maybeBodyTemp, envTemp)
+        }
+
+        /**
+         * bodyOrWristTemp:体温或者腕温(当不支持腕温的时候,就是体温)
+         * maybeBodyTemp:可能是体温(如果支持腕温的时候)
+         * envTemp:环境温度
+         */
+        @Throws(RemoteException::class)
+        override fun updateResultTempValue(
+            bodyOrWristTemp: Double,
+            maybeBodyTemp: Double,
+            envTemp: Double
+        ) {
+            IcLog.d(
+                TemperatureViewModel.TAG,
+                "final ... "
+                        + bodyOrWristTemp +
+                        " maybeBodyTemp --> "
+                        + maybeBodyTemp +
+                        " envTemp + >  "
+                        + envTemp
+            )
+            //最后的结果
+            mCallback?.onTempFinal(bodyOrWristTemp, maybeBodyTemp, envTemp)
+        }
+    }
+
+    /**
+     * 远程服务的回调
+     */
+    inner class RemoteServiceConnection : ServiceConnection {
+        override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
+            mService = ITempRemoteService.Stub.asInterface(service)
+            //把回调接口设置给对方
+            mService?.registerCallback(remoteDataCallback)
+            getTemperature()
+        }
+
+        override fun onServiceDisconnected(name: ComponentName?) {
+            mService = null
+        }
+    }
+
+    //加载温度内容
+    fun getTemperature() {
+        mCallback?.onTesting()
+        try {
+            //调用开始查询温度
+            mService?.onStartQueryTemp()
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    }
 
 }
\ No newline at end of file
index ce98f65..a1cc75b 100644 (file)
@@ -1,28 +1,85 @@
 package com.ic.temperature.viewmodel
 
-import android.content.*
-import android.os.IBinder
-import android.os.RemoteException
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.content.IntentFilter
+import android.os.Handler
+import android.os.Looper
+import android.os.Message
 import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.ViewModel
-import androidx.lifecycle.viewModelScope
-import com.ic.aidl.temp.ITempAidlInterface
-import com.ic.aidl.temp.ITempRemoteService
 import com.ic.temperature.R
-import com.ic.temperature.utils.*
-import com.ic.temperature.utils.Constants.ACTION_REMOTE_WORK_SERVICE
+import com.ic.temperature.domain.Temperature
+import com.ic.temperature.repository.ITemRepositoryCallback
+import com.ic.temperature.repository.TemperatureRepository
+import com.ic.temperature.utils.Constants
 import com.ic.temperature.utils.Constants.KEY_ANTI_EVENT
-import com.ic.temperature.utils.Constants.PACKAGE_REMOTE_WORK_SERVICE
 import com.ic.temperature.utils.Constants.STATE_ANTI_NONE
 import com.ic.temperature.utils.Constants.STATE_ANTI_OFF
 import com.ic.temperature.utils.Constants.STATE_ANTI_ON
-import kotlinx.coroutines.launch
+import com.ic.temperature.utils.IcLog
+import com.ic.temperature.utils.StringUtils
+import com.ic.temperature.utils.SystemUtils
+import java.lang.ref.WeakReference
 
 class TemperatureViewModel() : ViewModel() {
 
 
     lateinit var mContext: Context
 
+    private val repository by lazy {
+        TemperatureRepository(mContext)
+    }
+
+    private val resultHandler by lazy {
+        ResultHandler(this)
+    }
+
+    class ResultHandler(viewModel: TemperatureViewModel) : Handler(Looper.getMainLooper()) {
+
+        private var viewModel: WeakReference<TemperatureViewModel>? = null
+
+        init {
+            this.viewModel = WeakReference(viewModel)
+        }
+
+        override fun handleMessage(msg: Message) {
+            val viewModelValue = this.viewModel?.get() ?: return
+            when (msg.what) {
+                UPDATE_TEMPERATURE_FINAL_DATA -> {
+                    println("UPDATE_TEMPERATURE_FINAL_DATA...")
+                    //最终结果
+                    //结束一些loading和文字提示
+                    viewModelValue.mShowLoading.postValue(false)
+                    viewModelValue.mCheckTips.postValue(viewModelValue.mContext.getString(R.string.activity_temp_tips_end))
+                    val temperature = msg.obj as Temperature
+                    viewModelValue.updateUIData(temperature)
+                }
+                UPDATE_TEMPERATURE_NORMAL_DATA -> {
+                    println("UPDATE_TEMPERATURE_NORMAL_DATA...")
+                    //更新的结果
+                    val temperature = msg.obj as Temperature
+                    viewModelValue.updateUIData(temperature)
+                }
+            }
+        }
+    }
+
+    private fun updateUIData(temperature: Temperature) {
+        println("isDisableWristTemp $isDisableWristTemp")
+        //数据更新
+        if (isDisableWristTemp) {
+            mBodyTemp.value = StringUtils.formatTem(temperature.bodyOrWristTemp)
+        } else {
+            mBodyTemp.value = StringUtils.formatTem(temperature.maybeBodyTemp)
+            mWristTemp.value = StringUtils.formatTem(temperature.bodyOrWristTemp)
+        }
+        println("update body tem")
+        mEnvTemp.value = StringUtils.formatTem(temperature.envTemp)
+    }
+
+
     constructor(context: Context) : this() {
         println("context == > $context")
         this.mContext = context
@@ -31,7 +88,6 @@ class TemperatureViewModel() : ViewModel() {
         checkWristWear()
     }
 
-
     /**
      * 是否支持腕温检测
      */
@@ -62,13 +118,44 @@ class TemperatureViewModel() : ViewModel() {
         );
     }
 
+    private val mTemCallback = object : ITemRepositoryCallback {
+        override fun onTempUpdate(
+            bodyOrWristTemp: Double,
+            maybeBodyTemp: Double,
+            envTemp: Double
+        ) {
+            sendMsg(
+                bodyOrWristTemp, maybeBodyTemp,
+                envTemp, UPDATE_TEMPERATURE_NORMAL_DATA
+            )
+        }
+
+        override fun onTempFinal(
+            bodyOrWristTemp: Double,
+            maybeBodyTemp: Double,
+            envTemp: Double
+        ) {
+            sendMsg(
+                bodyOrWristTemp, maybeBodyTemp,
+                envTemp, UPDATE_TEMPERATURE_FINAL_DATA
+            )
+        }
+
+        override fun onTesting() {
+            //展示Loading,也 就是进度条那个
+            mShowLoading.postValue(true)
+            //设置UI正在检测中
+            mCheckTips.postValue(mContext.getString(R.string.activity_temp_tips_check))
+        }
+    }
+
     /**
      * 一进来就检查一下是否有佩戴,如果已经佩戴了,那么就绑定远程服务
      * 如果没有戴表,那么就不绑定服务,接收到佩戴的广播以后再绑定。
      */
     private fun checkWristWear() {
-        if (!isWristWear && mService == null) {
-            bindWorkService(mContext)
+        if (!isWristWear) {
+            repository.bindWorkService(mContext, mTemCallback)
         } else {
             //给出提示:未正确佩戴设备
             mCheckTips.value = mContext.getString(R.string.no_wearing_device_tips_text)
@@ -79,6 +166,8 @@ class TemperatureViewModel() : ViewModel() {
 
     companion object {
         const val TAG = "TemperatureViewModel"
+        const val UPDATE_TEMPERATURE_NORMAL_DATA = 1
+        const val UPDATE_TEMPERATURE_FINAL_DATA = 2
     }
 
     private val mIntentReceiver by lazy {
@@ -89,20 +178,28 @@ class TemperatureViewModel() : ViewModel() {
     private val mAntiStateReceiver by lazy {
         WristWearStateReceiver()
     }
-    private val mRemoteConnection by lazy {
-        RemoteServiceConnection()
-    }
 
-    private val remoteDataCallback by lazy {
-        Callback4Remote()
-    }
 
-    private var mService: ITempRemoteService? = null
+    private val defaultTemperatureValue by lazy {
+        mContext.getString(R.string.temperature_default_text)
+    }
 
-    //关心的数据
-    val mBodyTemp = MutableLiveData<String>()
-    val mWristTemp = MutableLiveData<String>()
-    val mEnvTemp = MutableLiveData<String>()
+    //关心的数据=======================
+    val mBodyTemp by lazy {
+        val mutableLiveData = MutableLiveData<String>()
+        mutableLiveData.value = defaultTemperatureValue
+        mutableLiveData
+    }
+    val mWristTemp by lazy {
+        val mutableLiveData = MutableLiveData<String>()
+        mutableLiveData.value = defaultTemperatureValue
+        mutableLiveData
+    }
+    val mEnvTemp by lazy {
+        val mutableLiveData = MutableLiveData<String>()
+        mutableLiveData.value = defaultTemperatureValue
+        mutableLiveData
+    }
     val mCheckTips = MutableLiveData<String>()
     val mShowLoading = MutableLiveData<Boolean>()
     val mFinishActivity = MutableLiveData<Boolean>()
@@ -116,6 +213,12 @@ class TemperatureViewModel() : ViewModel() {
         mutableLiveData.value = isDisableEnvTemp
         mutableLiveData
     }
+    val isJustShowBodyTempView by lazy {
+        val mutableLiveData = MutableLiveData<Boolean>()
+        mutableLiveData.value = isDisableWristTemp && isDisableEnvTemp
+        mutableLiveData
+    }
+    //=================================
 
     /**
      * 注册广播接收者,主要是监听佩戴和一个Dialog的退出
@@ -136,58 +239,17 @@ class TemperatureViewModel() : ViewModel() {
         //取消广播注册
         mContext.unregisterReceiver(mIntentReceiver)
         mContext.unregisterReceiver(mAntiStateReceiver)
-        ServiceUtil.unBindServiceUtil(mContext, mRemoteConnection)
-    }
-
-    /**
-     * 绑定远程服务
-     *
-     * @param context
-     */
-    private fun bindWorkService(context: Context) {
-        IcLog.i(TAG, "bind remote service..")
-        ServiceUtil.bindServiceUtil(
-            context,
-            ACTION_REMOTE_WORK_SERVICE,
-            mRemoteConnection,
-            PACKAGE_REMOTE_WORK_SERVICE
-        )
-    }
-
-    /**
-     * 远程服务的回调
-     */
-    inner class RemoteServiceConnection : ServiceConnection {
-        override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
-            mService = ITempRemoteService.Stub.asInterface(service)
-            //把回调接口设置给对方
-            mService?.registerCallback(remoteDataCallback)
-            getRemoteData()
-        }
-
-        override fun onServiceDisconnected(name: ComponentName?) {
-            mService = null
-        }
+        repository.release()
     }
 
     private fun getRemoteData() {
-        //展示Loading,也 就是进度条那个
-        mShowLoading.postValue(true)
-        //设置UI正在检测中
-        mCheckTips.postValue(mContext.getString(R.string.activity_temp_tips_check))
         IcLog.d(TAG, "getRemoteData...")
-        try {
-            viewModelScope.launch {
-                //调用开始查询温度
-                mService?.onStartQueryTemp()
-            }
-        } catch (e: Exception) {
-            e.printStackTrace()
-        }
+        repository.getTemperature()
     }
 
     inner class WristWearStateReceiver : BroadcastReceiver() {
-        override fun onReceive(context: Context?, intent: Intent?) {
+
+        override fun onReceive(context: Context, intent: Intent?) {
             //如果来了佩戴的广播,判断到没有绑定远程服务的话,那么就绑定吧
             val state = intent!!.getIntExtra(KEY_ANTI_EVENT, STATE_ANTI_NONE)
             IcLog.i(TAG, "on AntiStateChange....$state")
@@ -201,8 +263,8 @@ class TemperatureViewModel() : ViewModel() {
                 //脱落了,给出提示
                 //停止Loading
                 mShowLoading.value = false
-            } else if (state == STATE_ANTI_ON && mService == null) {
-                bindWorkService(context!!)
+            } else if (state == STATE_ANTI_ON) {
+                repository.bindWorkService(context, mTemCallback)
             }
 
             mHasWear = state == STATE_ANTI_ON
@@ -216,72 +278,16 @@ class TemperatureViewModel() : ViewModel() {
         }
     }
 
-    inner class Callback4Remote : ITempAidlInterface.Stub() {
-        @Throws(RemoteException::class)
-        /**
-         * bodyOrWristTemp:体温或者腕温(当不支持腕温的时候,就是体温)
-         * maybeBodyTemp:可能是体温(如果支持腕温的时候)
-         * envTemp:环境温度
-         */
-        override fun updateCurrTempValue(
-            bodyOrWristTemp: Double,
-            maybeBodyTemp: Double,
-            envTemp: Double
-        ) {
-            IcLog.d(
-                TAG,
-                "updateCurrTempValue... "
-                        + bodyOrWristTemp +
-                        " maybeBodyTemp --> "
-                        + maybeBodyTemp +
-                        " envTemp + >  "
-                        + envTemp
-            )
-            updateUiData(bodyOrWristTemp, maybeBodyTemp, envTemp)
-        }
 
-        /**
-         * bodyOrWristTemp:体温或者腕温(当不支持腕温的时候,就是体温)
-         * maybeBodyTemp:可能是体温(如果支持腕温的时候)
-         * envTemp:环境温度
-         */
-        @Throws(RemoteException::class)
-        override fun updateResultTempValue(
-            bodyOrWristTemp: Double,
-            maybeBodyTemp: Double,
-            envTemp: Double
-        ) {
-            IcLog.d(
-                TAG,
-                "final ... "
-                        + bodyOrWristTemp +
-                        " maybeBodyTemp --> "
-                        + maybeBodyTemp +
-                        " envTemp + >  "
-                        + envTemp
-            )
-            //最后的结果
-            updateUiData(bodyOrWristTemp, maybeBodyTemp, envTemp)
-            //结束一些loading和文字提示
-            mShowLoading.postValue(false)
-            mCheckTips.postValue(mContext.getString(R.string.activity_temp_tips_end))
-        }
-    }
-
-    private fun updateUiData(
+    private fun sendMsg(
         bodyOrWristTemp: Double,
         maybeBodyTemp: Double,
-        envTemp: Double
+        envTemp: Double, what: Int
     ) {
-        mDisableWristTemp.value = isDisableWristTemp
-        //数据更新
-        if (isDisableWristTemp) {
-            mBodyTemp.value = StringUtils.formatTem(bodyOrWristTemp)
-        } else {
-            mBodyTemp.value = StringUtils.formatTem(maybeBodyTemp)
-            mWristTemp.value = StringUtils.formatTem(bodyOrWristTemp)
-        }
-        mEnvTemp.value = StringUtils.formatTem(envTemp)
+        val obtainMessage = resultHandler.obtainMessage()
+        obtainMessage.what = what
+        obtainMessage.obj = Temperature(bodyOrWristTemp, maybeBodyTemp, envTemp)
+        resultHandler.sendMessage(obtainMessage)
     }
 
     inner class DialogDismissReceiver : BroadcastReceiver() {
index 238b22a..9cf8b23 100644 (file)
@@ -1,6 +1,7 @@
 <?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:ic="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools">
 
     <data>
         android:background="@mipmap/qs_background"
         tools:context=".AnimalHeatActivity">
 
-        <androidx.constraintlayout.widget.Guideline
-            android:id="@+id/guideline"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:orientation="horizontal"
-            app:layout_constraintGuide_percent="0.25" />
-
-        <ImageView
-            android:id="@+id/imageView2"
-            android:layout_width="50dp"
-            android:layout_height="50dp"
-            android:layout_marginTop="10dp"
-            android:layout_marginEnd="20dp"
-            android:background="@android:color/transparent"
-            android:src="@drawable/ic_temp_human"
-            app:layout_constraintEnd_toStartOf="@+id/guideline7"
-            app:layout_constraintTop_toTopOf="parent" />
-
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:background="@android:color/transparent"
-            android:text="@string/activity_temp_unit"
-            android:textColor="#FFFFFF"
-            android:textSize="38sp"
-            android:visibility="@{disableWristTemp ? View.GONE : View.VISIBLE}"
-            app:layout_constraintBottom_toTopOf="@+id/guideline6"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toStartOf="@+id/guideline8"
-            app:layout_constraintTop_toTopOf="@+id/guideline5" />
-
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:background="@android:color/transparent"
-            android:text="@string/activity_temp_str"
-            android:textColor="#FFFFFF"
-            android:textSize="26sp"
-            app:layout_constraintBottom_toTopOf="@+id/guideline"
-            app:layout_constraintEnd_toStartOf="@+id/imageView2"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="parent" />
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:background="@android:color/transparent"
-            android:text="@string/activity_temp_wrist_str"
-            android:textColor="#FFFFFF"
-            android:textSize="26sp"
-            android:visibility="@{disableWristTemp ? View.GONE : View.VISIBLE}"
-            app:layout_constraintBottom_toTopOf="@+id/guideline5"
-            app:layout_constraintEnd_toStartOf="@+id/imageView"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="@+id/guideline" />
-
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:background="@android:color/transparent"
-            android:text="@string/activity_temp_unit"
-            android:textColor="#FFFFFF"
-            android:textSize="38sp"
-            android:visibility="@{disableWristTemp ? View.GONE : View.VISIBLE}"
-            app:layout_constraintBottom_toTopOf="@+id/guideline5"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toStartOf="@+id/guideline8"
-            app:layout_constraintTop_toTopOf="@+id/guideline" />
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:background="@android:color/transparent"
-            android:text="@string/activity_temp_unit"
-            android:textColor="#FFFFFF"
-            android:textSize="38sp"
-            app:layout_constraintBottom_toTopOf="@+id/guideline"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toStartOf="@+id/guideline8"
-            app:layout_constraintTop_toTopOf="parent" />
-
-        <androidx.constraintlayout.widget.Guideline
-            android:id="@+id/guideline5"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:orientation="horizontal"
-            app:layout_constraintGuide_percent="0.5" />
-
-        <ImageView
-            android:id="@+id/imageView"
-            android:layout_width="50dp"
-            android:layout_height="50dp"
-            android:layout_marginTop="10dp"
-            android:layout_marginEnd="20dp"
-            android:background="@android:color/transparent"
-            android:src="@drawable/ic_temp_wrist"
-            android:visibility="@{disableWristTemp ? View.GONE : View.VISIBLE}"
-            app:layout_constraintEnd_toStartOf="@+id/guideline7"
-            app:layout_constraintTop_toTopOf="@+id/guideline" />
-
-        <ImageView
-            android:id="@+id/imageView3"
-            android:layout_width="50dp"
-            android:layout_height="50dp"
-            android:layout_marginEnd="20dp"
-            android:background="@android:color/transparent"
-            android:src="@mipmap/outtemp"
-            android:visibility="@{disableEnvTemp ? View.GONE : View.VISIBLE}"
-            app:layout_constraintBottom_toTopOf="@+id/guideline6"
-            app:layout_constraintEnd_toStartOf="@+id/guideline7"
-            app:layout_constraintTop_toTopOf="@+id/guideline5" />
-
-        <androidx.constraintlayout.widget.Guideline
-            android:id="@+id/guideline6"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:orientation="horizontal"
-            app:layout_constraintGuide_percent="0.75" />
+        <!--只有体温的时候显示,也就是只支持体温,不支持腕温和环境温度-->
+        <ViewStub
+            android:id="@+id/justTempView"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout="@layout/stub_view_just_body_temp"
+            ic:bodyTemp="@{bodyTemp}" />
 
-        <androidx.constraintlayout.widget.Guideline
-            android:id="@+id/guideline9"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:orientation="horizontal"
-            app:layout_constraintGuide_percent="0.90" />
 
-        <androidx.constraintlayout.widget.Guideline
-            android:id="@+id/guideline7"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:orientation="vertical"
-            app:layout_constraintGuide_percent="0.49" />
+        <!--支持体温,腕温,环境温度时的UI-->
+        <ViewStub
+            android:id="@+id/normalView"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout="@layout/stub_view_normal_temp"
+            ic:bodyTemp="@{bodyTemp}"
+            ic:disableEnvTemp="@{disableEnvTemp}"
+            ic:disableWristTemp="@{disableWristTemp}"
+            ic:envTemp="@{envTemp}"
+            ic:wristTemp="@{wristTemp}" />
 
         <TextView
             android:layout_width="wrap_content"
             android:text="@{checkTips}"
             android:textColor="#FFFFFF"
             android:textSize="28sp"
-            app:layout_constraintBottom_toTopOf="@+id/guideline9"
+            app:layout_constraintBottom_toTopOf="@+id/dot_progress_bar"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="@+id/guideline6" />
-
-        <androidx.constraintlayout.widget.Guideline
-            android:id="@+id/guideline8"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:orientation="vertical"
-            app:layout_constraintGuide_percent="0.8" />
+            app:layout_constraintTop_toTopOf="@+id/guideline10" />
 
         <com.github.silvestrpredko.dotprogressbar.DotProgressBar
             android:id="@+id/dot_progress_bar"
             app:duration="@android:integer/config_mediumAnimTime"
             app:endColor="@color/teal_A200"
             app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintTop_toTopOf="@+id/guideline9"
-            app:startColor="@color/lime_A400"
-            tools:layout_editor_absoluteX="4dp" />
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:background="@android:color/transparent"
-            android:text="@string/activity_temp_outside"
-            android:textColor="#FFFFFF"
-            android:textSize="26sp"
-            android:visibility="@{disableEnvTemp ? View.GONE : View.VISIBLE}"
-            app:layout_constraintBottom_toTopOf="@+id/guideline6"
-            app:layout_constraintEnd_toStartOf="@+id/imageView3"
+            app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="@+id/guideline5" />
-
-
-        <TextView
-            android:id="@+id/textView2"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:background="@android:color/transparent"
-            android:text="@{envTemp}"
-            android:textColor="#FFFFFF"
-            android:textSize="50sp"
-            android:visibility="@{disableEnvTemp ? View.GONE : View.VISIBLE}"
-            app:layout_constraintBottom_toTopOf="@+id/guideline6"
-            app:layout_constraintEnd_toStartOf="@+id/guideline8"
-            app:layout_constraintTop_toTopOf="@+id/guideline5" />
+            app:startColor="@color/lime_A400" />
 
-        <TextView
-            android:id="@+id/textView"
+        <androidx.constraintlayout.widget.Guideline
+            android:id="@+id/guideline10"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:background="@android:color/transparent"
-            android:text="@{bodyTemp}"
-            android:textColor="#FFFFFF"
-            android:textSize="50sp"
-            android:visibility="@{disableEnvTemp ? View.GONE : View.VISIBLE}"
-            app:layout_constraintBottom_toTopOf="@+id/guideline"
-            app:layout_constraintEnd_toStartOf="@+id/guideline8"
-            app:layout_constraintTop_toTopOf="parent" />
+            android:orientation="horizontal"
+            app:layout_constraintGuide_percent="0.75" />
 
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:background="@android:color/transparent"
-            android:text="@{wristTemp}"
-            android:textColor="#FFFFFF"
-            android:textSize="50sp"
-            android:visibility="@{disableEnvTemp ? View.GONE : View.VISIBLE}"
-            app:layout_constraintBottom_toTopOf="@+id/guideline5"
-            app:layout_constraintEnd_toStartOf="@+id/guideline8"
-            app:layout_constraintTop_toTopOf="@+id/guideline" />
 
     </androidx.constraintlayout.widget.ConstraintLayout>
 </layout>
diff --git a/app/src/main/res/layout/stub_view_just_body_temp.xml b/app/src/main/res/layout/stub_view_just_body_temp.xml
new file mode 100644 (file)
index 0000000..69f1a8e
--- /dev/null
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:tools="http://schemas.android.com/tools"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <data>
+
+        <variable
+            name="bodyTemp"
+            type="String" />
+    </data>
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginEnd="8dp"
+            android:background="@android:color/transparent"
+            android:text="@string/activity_temp_str"
+            android:textColor="#FFFFFF"
+            android:textSize="36sp"
+            app:layout_constraintBottom_toTopOf="@+id/guideline2"
+            app:layout_constraintEnd_toStartOf="@+id/guideline4" />
+
+
+        <ImageView
+            android:id="@+id/imageView2"
+            android:layout_width="80dp"
+            android:layout_height="80dp"
+            android:layout_marginStart="8dp"
+            android:background="@android:color/transparent"
+            android:src="@drawable/ic_temp_human"
+            app:layout_constraintBottom_toTopOf="@+id/guideline2"
+            app:layout_constraintStart_toStartOf="@+id/guideline4" />
+
+        <androidx.constraintlayout.widget.Guideline
+            android:id="@+id/guideline2"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            app:layout_constraintGuide_percent="0.3" />
+
+        <androidx.constraintlayout.widget.Guideline
+            android:id="@+id/guideline3"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            app:layout_constraintGuide_percent="0.7" />
+
+        <androidx.constraintlayout.widget.Guideline
+            android:id="@+id/guideline4"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            app:layout_constraintGuide_percent="0.5" />
+
+        <TextView
+            android:id="@+id/textView3"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:background="@android:color/transparent"
+            android:text="@string/activity_temp_unit"
+            android:textColor="#FFFFFF"
+            android:textSize="58sp"
+            app:layout_constraintBottom_toTopOf="@+id/guideline3"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="@+id/guideline4"
+            app:layout_constraintTop_toTopOf="@+id/guideline2" />
+
+        <TextView
+            android:id="@+id/textView"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginEnd="32dp"
+            android:background="@android:color/transparent"
+            android:text="@{bodyTemp}"
+            android:textColor="#FFFFFF"
+            android:textSize="60sp"
+            app:layout_constraintBottom_toTopOf="@+id/guideline3"
+            app:layout_constraintEnd_toStartOf="@+id/textView3"
+            app:layout_constraintTop_toTopOf="@+id/guideline2" />
+
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+</layout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/stub_view_normal_temp.xml b/app/src/main/res/layout/stub_view_normal_temp.xml
new file mode 100644 (file)
index 0000000..bf4958c
--- /dev/null
@@ -0,0 +1,242 @@
+<?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="bodyTemp"
+            type="String" />
+
+        <variable
+            name="wristTemp"
+            type="String" />
+
+        <variable
+            name="envTemp"
+            type="String" />
+
+        <variable
+            name="checkTips"
+            type="String" />
+
+        <variable
+            name="showLoading"
+            type="boolean" />
+
+        <variable
+            name="disableWristTemp"
+            type="boolean" />
+
+        <variable
+            name="disableEnvTemp"
+            type="boolean" />
+    </data>
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@mipmap/qs_background"
+        tools:context=".AnimalHeatActivity">
+
+        <androidx.constraintlayout.widget.Guideline
+            android:id="@+id/guideline"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            app:layout_constraintGuide_percent="0.25" />
+
+        <ImageView
+            android:id="@+id/imageView2"
+            android:layout_width="50dp"
+            android:layout_height="50dp"
+            android:layout_marginTop="10dp"
+            android:layout_marginEnd="20dp"
+            android:background="@android:color/transparent"
+            android:src="@drawable/ic_temp_human"
+            app:layout_constraintEnd_toStartOf="@+id/guideline7"
+            app:layout_constraintTop_toTopOf="parent" />
+
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:background="@android:color/transparent"
+            android:text="@string/activity_temp_unit"
+            android:textColor="#FFFFFF"
+            android:textSize="38sp"
+            android:visibility="@{disableWristTemp ? View.GONE : View.VISIBLE}"
+            app:layout_constraintBottom_toTopOf="@+id/guideline6"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="@+id/guideline8"
+            app:layout_constraintTop_toTopOf="@+id/guideline5" />
+
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:background="@android:color/transparent"
+            android:text="@string/activity_temp_str"
+            android:textColor="#FFFFFF"
+            android:textSize="26sp"
+            app:layout_constraintBottom_toTopOf="@+id/guideline"
+            app:layout_constraintEnd_toStartOf="@+id/imageView2"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:background="@android:color/transparent"
+            android:text="@string/activity_temp_wrist_str"
+            android:textColor="#FFFFFF"
+            android:textSize="26sp"
+            android:visibility="@{disableWristTemp ? View.GONE : View.VISIBLE}"
+            app:layout_constraintBottom_toTopOf="@+id/guideline5"
+            app:layout_constraintEnd_toStartOf="@+id/imageView"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="@+id/guideline" />
+
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:background="@android:color/transparent"
+            android:text="@string/activity_temp_unit"
+            android:textColor="#FFFFFF"
+            android:textSize="38sp"
+            android:visibility="@{disableWristTemp ? View.GONE : View.VISIBLE}"
+            app:layout_constraintBottom_toTopOf="@+id/guideline5"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="@+id/guideline8"
+            app:layout_constraintTop_toTopOf="@+id/guideline" />
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:background="@android:color/transparent"
+            android:text="@string/activity_temp_unit"
+            android:textColor="#FFFFFF"
+            android:textSize="38sp"
+            app:layout_constraintBottom_toTopOf="@+id/guideline"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="@+id/guideline8"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <androidx.constraintlayout.widget.Guideline
+            android:id="@+id/guideline5"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            app:layout_constraintGuide_percent="0.5" />
+
+        <ImageView
+            android:id="@+id/imageView"
+            android:layout_width="50dp"
+            android:layout_height="50dp"
+            android:layout_marginTop="10dp"
+            android:layout_marginEnd="20dp"
+            android:background="@android:color/transparent"
+            android:src="@drawable/ic_temp_wrist"
+            android:visibility="@{disableWristTemp ? View.GONE : View.VISIBLE}"
+            app:layout_constraintEnd_toStartOf="@+id/guideline7"
+            app:layout_constraintTop_toTopOf="@+id/guideline" />
+
+        <ImageView
+            android:id="@+id/imageView3"
+            android:layout_width="50dp"
+            android:layout_height="50dp"
+            android:layout_marginEnd="20dp"
+            android:background="@android:color/transparent"
+            android:src="@mipmap/outtemp"
+            android:visibility="@{disableEnvTemp ? View.GONE : View.VISIBLE}"
+            app:layout_constraintBottom_toTopOf="@+id/guideline6"
+            app:layout_constraintEnd_toStartOf="@+id/guideline7"
+            app:layout_constraintTop_toTopOf="@+id/guideline5" />
+
+        <androidx.constraintlayout.widget.Guideline
+            android:id="@+id/guideline6"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            app:layout_constraintGuide_percent="0.75" />
+
+        <androidx.constraintlayout.widget.Guideline
+            android:id="@+id/guideline9"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            app:layout_constraintGuide_percent="0.90" />
+
+        <androidx.constraintlayout.widget.Guideline
+            android:id="@+id/guideline7"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            app:layout_constraintGuide_percent="0.49" />
+
+
+
+        <androidx.constraintlayout.widget.Guideline
+            android:id="@+id/guideline8"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            app:layout_constraintGuide_percent="0.8" />
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:background="@android:color/transparent"
+            android:text="@string/activity_temp_outside"
+            android:textColor="#FFFFFF"
+            android:textSize="26sp"
+            android:visibility="@{disableEnvTemp ? View.GONE : View.VISIBLE}"
+            app:layout_constraintBottom_toTopOf="@+id/guideline6"
+            app:layout_constraintEnd_toStartOf="@+id/imageView3"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="@+id/guideline5" />
+
+
+        <TextView
+            android:id="@+id/textView2"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:background="@android:color/transparent"
+            android:text="@{envTemp}"
+            android:textColor="#FFFFFF"
+            android:textSize="50sp"
+            android:visibility="@{disableEnvTemp ? View.GONE : View.VISIBLE}"
+            app:layout_constraintBottom_toTopOf="@+id/guideline6"
+            app:layout_constraintEnd_toStartOf="@+id/guideline8"
+            app:layout_constraintTop_toTopOf="@+id/guideline5" />
+
+        <TextView
+            android:id="@+id/textView"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:background="@android:color/transparent"
+            android:text="@{bodyTemp}"
+            android:textColor="#FFFFFF"
+            android:textSize="50sp"
+            app:layout_constraintBottom_toTopOf="@+id/guideline"
+            app:layout_constraintEnd_toStartOf="@+id/guideline8"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:background="@android:color/transparent"
+            android:text="@{wristTemp}"
+            android:textColor="#FFFFFF"
+            android:textSize="50sp"
+            android:visibility="@{disableWristTemp ? View.GONE : View.VISIBLE}"
+            app:layout_constraintBottom_toTopOf="@+id/guideline5"
+            app:layout_constraintEnd_toStartOf="@+id/guideline8"
+            app:layout_constraintTop_toTopOf="@+id/guideline" />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+</layout>
index 406f9eb..fc564b8 100644 (file)
@@ -7,4 +7,5 @@
     <string name="no_wearing_device_tips_text">未配戴设备</string>
     <string name="activity_temp_tips_check">正在测量</string>
     <string name="activity_temp_tips_end">测量完成</string>
+    <string name="temperature_default_text">"--.- "</string>
 </resources>
\ No newline at end of file