<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"
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
*/
class MainActivity : AppCompatActivity() {
private val viewModel by lazy {
- ViewModelProvider(this,
+ ViewModelProvider(
+ this,
ICViewModelFactory()
).get(TemperatureViewModel::class.java)
}
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()
}
/**
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
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
}
--- /dev/null
+package com.ic.temperature.domain
+
+data class Temperature(
+ val bodyOrWristTemp: Double,
+ val maybeBodyTemp: Double,
+ val envTemp: Double
+)
\ No newline at end of file
--- /dev/null
+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
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
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
checkWristWear()
}
-
/**
* 是否支持腕温检测
*/
);
}
+ 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)
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 {
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>()
mutableLiveData.value = isDisableEnvTemp
mutableLiveData
}
+ val isJustShowBodyTempView by lazy {
+ val mutableLiveData = MutableLiveData<Boolean>()
+ mutableLiveData.value = isDisableWristTemp && isDisableEnvTemp
+ mutableLiveData
+ }
+ //=================================
/**
* 注册广播接收者,主要是监听佩戴和一个Dialog的退出
//取消广播注册
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")
//脱落了,给出提示
//停止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
}
}
- 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() {
<?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>
--- /dev/null
+<?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
--- /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="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>
<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