重构了代码,把UI提示移到了UI层。
authorTrillGates <williamtrillgates@gmail.com>
Tue, 26 Oct 2021 09:03:51 +0000 (17:03 +0800)
committerTrillGates <williamtrillgates@gmail.com>
Tue, 26 Oct 2021 09:03:51 +0000 (17:03 +0800)
app/build.gradle
app/src/main/AndroidManifest.xml
app/src/main/java/com/ic/temperature/MainActivity.kt
app/src/main/java/com/ic/temperature/repository/TemperatureRepository.kt
app/src/main/java/com/ic/temperature/viewmodel/TemperatureViewModel.kt
app/src/main/res/values-fr/strings.xml [deleted file]
app/src/main/res/values-night/strings.xml [deleted file]
app/src/main/res/values-ru/strings.xml [deleted file]

index 523f052..dedd93e 100644 (file)
@@ -131,6 +131,7 @@ dependencies {
     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') {
index f693ae6..63072ff 100644 (file)
@@ -16,8 +16,7 @@
         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" />
index 3e6b4d6..ab7ce3b 100644 (file)
@@ -1,8 +1,12 @@
 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
@@ -10,6 +14,9 @@ import com.ic.temperature.databinding.ActivityMainBinding
 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
 
 /**
  * 这个是健康的界面,如果没有佩戴的话,不做检查。
@@ -28,6 +35,25 @@ import com.ic.temperature.viewmodel.TemperatureViewModel
  */
 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(
@@ -45,8 +71,11 @@ class MainActivity : AppCompatActivity() {
         super.onCreate(savedInstanceState)
         setContentView(binding.root)
         initObserver()
+    }
+
+    override fun onResume() {
+        super.onResume()
         initWakeLock()
-        viewModel.setActivity(this)
     }
 
     private var wakeLock: PowerManager.WakeLock? = null
@@ -154,6 +183,21 @@ class MainActivity : AppCompatActivity() {
                     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
index 50173f1..e72dd56 100644 (file)
@@ -1,22 +1,11 @@
 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) {
 
@@ -26,17 +15,10 @@ 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 {
@@ -54,12 +36,12 @@ class TemperatureRepository(context: Context) {
      *
      * @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),
@@ -69,111 +51,11 @@ class TemperatureRepository(context: Context) {
     }
 
 
-    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
-
-    }
 
     /**
      * 远程服务的回调
@@ -198,7 +80,6 @@ class TemperatureRepository(context: Context) {
 
     //加载温度内容
     fun getTemperature() {
-        mCallback?.onTesting()
         try {
             //调用开始查询温度,2表示用户主动测试,1
             //SERVER_CMD(0)/*服务端单次测量指令*/,
index 6e3d68c..78dc646 100644 (file)
@@ -1,6 +1,5 @@
 package com.ic.temperature.viewmodel
 
-import android.app.Activity
 import android.content.BroadcastReceiver
 import android.content.Context
 import android.content.Intent
@@ -14,13 +13,13 @@ import androidx.lifecycle.MutableLiveData
 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() {
@@ -35,6 +34,67 @@ 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
@@ -92,10 +152,6 @@ class TemperatureViewModel() : ViewModel() {
         checkWristWear()
     }
 
-    fun setActivity(context: Activity?) {
-        repository.setActivity(context)
-    }
-
     /**
      * 是否支持腕温检测
      */
@@ -138,44 +194,17 @@ 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) {
-            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)
@@ -188,6 +217,11 @@ class TemperatureViewModel() : ViewModel() {
         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 {
@@ -204,6 +238,11 @@ class TemperatureViewModel() : ViewModel() {
         mContext.getString(R.string.temperature_default_text)
     }
 
+
+    //Toast状态
+    val mToastState = MutableLiveData<Int>(DIALOG_STATE_NONE)
+
+
     //关心的数据=======================
     val mBodyTemp by lazy {
         val mutableLiveData = MutableLiveData<String>()
@@ -305,7 +344,11 @@ class TemperatureViewModel() : ViewModel() {
                 //停止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
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
deleted file mode 100644 (file)
index ebfcee0..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <string name="confirm_text">确定</string>
-</resources>
\ No newline at end of file
diff --git a/app/src/main/res/values-night/strings.xml b/app/src/main/res/values-night/strings.xml
deleted file mode 100644 (file)
index ebfcee0..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <string name="confirm_text">确定</string>
-</resources>
\ No newline at end of file
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
deleted file mode 100644 (file)
index ebfcee0..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <string name="confirm_text">确定</string>
-</resources>
\ No newline at end of file