From: kfl_614 Date: Tue, 8 Dec 2020 07:04:27 +0000 (+0800) Subject: add a single page for device which not support envTemp and wrist temp. X-Git-Url: http://git.snicker.com.cn/sitemap.xml?a=commitdiff_plain;h=95733cd3def43e602acb4fa3935d907123a2d040;p=IcTemperature.git add a single page for device which not support envTemp and wrist temp. --- diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 808da0d..d435d63 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,9 @@ + + + $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 index 0000000..868cdb9 --- /dev/null +++ b/app/src/main/java/com/ic/temperature/domain/Temperature.kt @@ -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 index 0000000..bb20ee3 --- /dev/null +++ b/app/src/main/java/com/ic/temperature/repository/ITemRepositoryCallback.kt @@ -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 diff --git a/app/src/main/java/com/ic/temperature/repository/TemperatureRepository.kt b/app/src/main/java/com/ic/temperature/repository/TemperatureRepository.kt index 7b6fc29..6737ae3 100644 --- a/app/src/main/java/com/ic/temperature/repository/TemperatureRepository.kt +++ b/app/src/main/java/com/ic/temperature/repository/TemperatureRepository.kt @@ -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 diff --git a/app/src/main/java/com/ic/temperature/viewmodel/TemperatureViewModel.kt b/app/src/main/java/com/ic/temperature/viewmodel/TemperatureViewModel.kt index ce98f65..a1cc75b 100644 --- a/app/src/main/java/com/ic/temperature/viewmodel/TemperatureViewModel.kt +++ b/app/src/main/java/com/ic/temperature/viewmodel/TemperatureViewModel.kt @@ -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? = 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() - val mWristTemp = MutableLiveData() - val mEnvTemp = MutableLiveData() + //关心的数据======================= + val mBodyTemp by lazy { + val mutableLiveData = MutableLiveData() + mutableLiveData.value = defaultTemperatureValue + mutableLiveData + } + val mWristTemp by lazy { + val mutableLiveData = MutableLiveData() + mutableLiveData.value = defaultTemperatureValue + mutableLiveData + } + val mEnvTemp by lazy { + val mutableLiveData = MutableLiveData() + mutableLiveData.value = defaultTemperatureValue + mutableLiveData + } val mCheckTips = MutableLiveData() val mShowLoading = MutableLiveData() val mFinishActivity = MutableLiveData() @@ -116,6 +213,12 @@ class TemperatureViewModel() : ViewModel() { mutableLiveData.value = isDisableEnvTemp mutableLiveData } + val isJustShowBodyTempView by lazy { + val mutableLiveData = MutableLiveData() + 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() { diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 238b22a..9cf8b23 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,6 +1,7 @@ @@ -42,141 +43,26 @@ android:background="@mipmap/qs_background" tools:context=".AnimalHeatActivity"> - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - - + app:layout_constraintTop_toTopOf="@+id/guideline10" /> - - - - - + app:startColor="@color/lime_A400" /> - + android:orientation="horizontal" + app:layout_constraintGuide_percent="0.75" /> - 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 index 0000000..69f1a8e --- /dev/null +++ b/app/src/main/res/layout/stub_view_just_body_temp.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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 index 0000000..bf4958c --- /dev/null +++ b/app/src/main/res/layout/stub_view_normal_temp.xml @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 406f9eb..fc564b8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -7,4 +7,5 @@ 未配戴设备 正在测量 测量完成 + "--.- " \ No newline at end of file