implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
+ implementation "com.google.android.material:material:1.3.0-alpha01"
implementation 'com.github.silvestrpredko:dot-progress-bar:1.1'
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
implementation ('com.squareup.okhttp3:logging-interceptor:4.10.0-RC1') {
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
- android:theme="@style/AppTheme"
- >
+ android:theme="@style/AppTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
package com.ic.temperature
import android.content.Context
+import android.content.DialogInterface
import android.os.Bundle
import android.os.PowerManager
+import android.widget.TextView
+import android.widget.Toast
+import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModelProvider
import com.ic.iclooger.ICLogger
import com.ic.temperature.utils.DisplayType
import com.ic.temperature.utils.ICViewModelFactory
import com.ic.temperature.viewmodel.TemperatureViewModel
+import com.ic.temperature.viewmodel.TemperatureViewModel.Companion.DIALOG_STATE_GETTING
+import com.ic.temperature.viewmodel.TemperatureViewModel.Companion.DIALOG_STATE_NONE
+import com.ic.temperature.viewmodel.TemperatureViewModel.Companion.DIALOG_STATE_WAITING
/**
* 这个是健康的界面,如果没有佩戴的话,不做检查。
*/
class MainActivity : AppCompatActivity() {
+ private fun showDialog() {
+ //弹窗提示,确定后才重置设备
+ val builder = AlertDialog.Builder(this)
+ builder.setMessage(getString(R.string.background_wait))
+ .setPositiveButton(getString(R.string.confirm_text)) { dialog, id ->
+ dialog.dismiss()
+ onBackPressed()
+ }
+ val alertDialog = builder.create()
+ alertDialog.show()
+ val yesBtn = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE)
+ yesBtn.textSize = 24.0f
+ ICLogger.d("yesBtn==> $yesBtn")
+ val viewById = alertDialog.findViewById<TextView>(android.R.id.message)
+ viewById!!.setPadding(10, 10, 10, 10)
+ viewById!!.textSize = 24.0f
+
+ }
+
private val viewModel by lazy {
ViewModelProvider(
super.onCreate(savedInstanceState)
setContentView(binding.root)
initObserver()
+ }
+
+ override fun onResume() {
+ super.onResume()
initWakeLock()
- viewModel.setActivity(this)
}
private var wakeLock: PowerManager.WakeLock? = null
finish()
}
}
+ mToastState.observe(that) {
+ when (it) {
+ DIALOG_STATE_NONE -> {
+
+ }
+ DIALOG_STATE_WAITING -> {
+ showDialog()
+ }
+ DIALOG_STATE_GETTING -> {
+ Toast.makeText(that, R.string.background_wait, Toast.LENGTH_SHORT)
+ .show()
+
+ }
+ }
+ }
}
}
}
\ No newline at end of file
package com.ic.temperature.repository
-import android.app.Activity
-import android.app.Dialog
import android.content.*
-import android.os.Handler
import android.os.IBinder
-import android.os.Looper
-import android.os.Message
-import android.widget.TextView
-import android.widget.Toast
-import androidx.appcompat.app.AlertDialog
-import com.ic.iclooger.ICLogger
-import com.ic.temperature.R
import com.ic.temperature.utils.Constants
import com.ic.temperature.utils.IcLog
import com.ic.work.ITempSensorCallback
import com.ic.work.ITempSensorService
-import com.ic.work.domain.Temperature
class TemperatureRepository(context: Context) {
private var mContext: Context = context
- private var mActivity: Activity? = null
-
private var mService: ITempSensorService? = null
- private var mCallback: ITemRepositoryCallback? = null
-
- private var dialog: Dialog? = null
+ private var remoteDataCallback: ITempSensorCallback.Stub? = null
- fun setActivity(mContext: Activity?) {
- mActivity = mContext
- }
fun release() {
try {
*
* @param context
*/
- fun bindWorkService(context: Context, callback: ITemRepositoryCallback) {
+ fun bindWorkService(context: Context, callback: ITempSensorCallback.Stub) {
if (mService != null) {
println("has bind...")
return
}
- this.mCallback = callback
+ this.remoteDataCallback = callback
IcLog.i(TAG, "bind remote service..")
context.bindService(
Intent(Constants.ACTION_TEMPERATURE),
}
- private val remoteDataCallback by lazy {
- Callback4Remote()
- }
private val mRemoteConnection by lazy {
RemoteServiceConnection()
}
- inner class Callback4Remote : ITempSensorCallback.Stub() {
- override fun onTemperatureTestError(message: String?, code: Int) {
- IcLog.d(TAG, "message ==> $message code ==> $code")
- //UI上做出提示
- }
-
- /**
- * bodyOrWristTemp:体温或者腕温(当不支持腕温的时候,就是体温)
- * maybeBodyTemp:可能是体温(如果支持腕温的时候)
- * envTemp:环境温度
- */
- override fun onTemperatureGet(temperature: Temperature?) {
- if (temperature == null) {
- IcLog.d(TAG, "result is null")
- return
- }
- IcLog.d(TAG, "temperature is == > $temperature")
- IcLog.d(
- TAG,
- "final ... "
- + temperature.wristTemp +
- " maybeBodyTemp --> "
- + temperature.bodyTemp +
- " envTemp + > "
- + temperature.envTemp
- )
- //最后的结果
- if (dialog != null) {
- dialog!!.dismiss();
- }
- mCallback?.onTempFinal(temperature.wristTemp, temperature.bodyTemp, temperature.envTemp)
- }
-
- override fun onTemperatureUpdating(temperature: Temperature) {
- //温度更新中...
- mCallback?.onTempUpdate(
- temperature.wristTemp,
- temperature.bodyTemp,
- temperature.envTemp
- )
- }
-
- override fun onGettingData() {
- //正在获取
- IcLog.d(TAG, "正在获取 ...")
- mUiRefreshHandler.sendEmptyMessage(RUNING_TASK_TYPE)
- }
-
- override fun onWaiting() {
- //
- IcLog.d(TAG, "任务正在等待...")
- //updateTipsInfo(mTipsSpares.get(top), mTipsSpares.get(bottom));
- //让UI显示保持安静,准备测试的玩意
- mUiRefreshHandler.sendEmptyMessage(WAITING_TASK_TYPE)
- }
- }
-
- private val RUNING_TASK_TYPE = 0x01
- private val WAITING_TASK_TYPE = 0x02
- private val mUiRefreshHandler: Handler = object : Handler(Looper.getMainLooper()) {
- override fun handleMessage(msg: Message) {
- super.handleMessage(msg)
- when (msg.what) {
- RUNING_TASK_TYPE -> Toast.makeText(
- mContext,
- mContext.getString(R.string.background_test),
- Toast.LENGTH_SHORT
- ).show()
- WAITING_TASK_TYPE -> showDialog()
- }
- }
- }
-
- private fun showDialog() {
- //弹窗提示,确定后才重置设备
- val builder = AlertDialog.Builder(mContext)
- builder.setMessage(mContext.getString(R.string.background_wait))
- .setPositiveButton(mContext.getString(R.string.confirm_text)) { dialog, id ->
- dialog.dismiss()
- //删除内容
- if (mActivity != null) {
- mActivity!!.onBackPressed()
- }
- }
- val alertDialog = builder.create()
- alertDialog.show()
- val yesBtn = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE)
- val noBtn = alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE)
- yesBtn.textSize = 24.0f
- noBtn.textSize = 24.0f
- ICLogger.d("yesBtn==> $yesBtn")
- ICLogger.d("noBtn==> $noBtn")
- val viewById = alertDialog.findViewById<TextView>(android.R.id.message)
- viewById!!.setPadding(10, 10, 10, 10)
- viewById!!.textSize = 24.0f
-
- }
/**
* 远程服务的回调
//加载温度内容
fun getTemperature() {
- mCallback?.onTesting()
try {
//调用开始查询温度,2表示用户主动测试,1
//SERVER_CMD(0)/*服务端单次测量指令*/,
package com.ic.temperature.viewmodel
-import android.app.Activity
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import androidx.lifecycle.ViewModel
import com.ic.temperature.R
import com.ic.temperature.domain.Temperature
-import com.ic.temperature.repository.ITemRepositoryCallback
import com.ic.temperature.repository.TemperatureRepository
import com.ic.temperature.utils.*
import com.ic.temperature.utils.Constants.KEY_ANTI_EVENT
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 com.ic.work.ITempSensorCallback
import java.lang.ref.WeakReference
class TemperatureViewModel() : ViewModel() {
ResultHandler(this)
}
+ private val remoteDataCallback by lazy {
+ Callback4Remote()
+ }
+
+
+ inner class Callback4Remote : ITempSensorCallback.Stub() {
+ override fun onTemperatureTestError(message: String?, code: Int) {
+ IcLog.d(TemperatureRepository.TAG, "message ==> $message code ==> $code")
+ //UI上做出提示
+ }
+
+ /**
+ * bodyOrWristTemp:体温或者腕温(当不支持腕温的时候,就是体温)
+ * maybeBodyTemp:可能是体温(如果支持腕温的时候)
+ * envTemp:环境温度
+ */
+ override fun onTemperatureGet(temperature: com.ic.work.domain.Temperature?) {
+ if (temperature == null) {
+ IcLog.d(TemperatureRepository.TAG, "result is null")
+ return
+ }
+ mToastState.postValue(DIALOG_STATE_NONE)
+ IcLog.d(TemperatureRepository.TAG, "temperature is == > $temperature")
+ IcLog.d(
+ TemperatureRepository.TAG,
+ "final ... "
+ + temperature.wristTemp +
+ " maybeBodyTemp --> "
+ + temperature.bodyTemp +
+ " envTemp + > "
+ + temperature.envTemp
+ )
+ sendMsg(
+ temperature.wristTemp, temperature.bodyTemp,
+ temperature.envTemp, UPDATE_TEMPERATURE_FINAL_DATA
+ )
+ }
+
+ override fun onTemperatureUpdating(temperature: com.ic.work.domain.Temperature) {
+ //温度更新中...
+ sendMsg(
+ temperature.wristTemp, temperature.bodyTemp,
+ temperature.envTemp, UPDATE_TEMPERATURE_NORMAL_DATA
+ )
+ }
+
+ override fun onGettingData() {
+ //正在获取
+ IcLog.d(TemperatureRepository.TAG, "正在获取 ...")
+ mToastState.postValue(DIALOG_STATE_GETTING)
+ }
+
+ override fun onWaiting() {
+ //
+ IcLog.d(TemperatureRepository.TAG, "任务正在等待...")
+ //updateTipsInfo(mTipsSpares.get(top), mTipsSpares.get(bottom));
+ //让UI显示保持安静,准备测试的玩意
+ mToastState.postValue(DIALOG_STATE_WAITING)
+ }
+ }
+
class ResultHandler(viewModel: TemperatureViewModel) : Handler(Looper.getMainLooper()) {
private var viewModel: WeakReference<TemperatureViewModel>? = null
checkWristWear()
}
- fun setActivity(context: Activity?) {
- repository.setActivity(context)
- }
-
/**
* 是否支持腕温检测
*/
);
}
- 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) {
- repository.bindWorkService(mContext, mTemCallback)
+ //展示Loading,也 就是进度条那个
+ mShowLoading.postValue(true)
+ //设置UI正在检测中
+ mCheckTips.postValue(mContext.getString(R.string.activity_temp_tips_check))
+ repository.bindWorkService(mContext, remoteDataCallback)
} else {
//给出提示:未正确佩戴设备
mCheckTips.value = mContext.getString(R.string.no_wearing_device_tips_text)
const val TAG = "TemperatureViewModel"
const val UPDATE_TEMPERATURE_NORMAL_DATA = 1
const val UPDATE_TEMPERATURE_FINAL_DATA = 2
+
+ const val DIALOG_STATE_NONE = -1
+ const val DIALOG_STATE_WAITING = 0
+ const val DIALOG_STATE_GETTING = 1
+
}
private val mIntentReceiver by lazy {
mContext.getString(R.string.temperature_default_text)
}
+
+ //Toast状态
+ val mToastState = MutableLiveData<Int>(DIALOG_STATE_NONE)
+
+
//关心的数据=======================
val mBodyTemp by lazy {
val mutableLiveData = MutableLiveData<String>()
//停止Loading
mShowLoading.value = false
} else if (state == STATE_ANTI_ON) {
- repository.bindWorkService(context, mTemCallback)
+ //展示Loading,也 就是进度条那个
+ mShowLoading.postValue(true)
+ //设置UI正在检测中
+ mCheckTips.postValue(mContext.getString(R.string.activity_temp_tips_check))
+ repository.bindWorkService(context, remoteDataCallback)
}
mHasWear = state == STATE_ANTI_ON
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
- <string name="confirm_text">确定</string>
-</resources>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
- <string name="confirm_text">确定</string>
-</resources>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
- <string name="confirm_text">确定</string>
-</resources>
\ No newline at end of file