<option name="name" value="Google" />
<option name="url" value="https://dl.google.com/dl/android/maven2/" />
</remote-repository>
+ <remote-repository>
+ <option name="id" value="maven" />
+ <option name="name" value="maven" />
+ <option name="url" value="https://jitpack.io" />
+ </remote-repository>
</component>
</project>
\ No newline at end of file
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
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'
+ implementation ('com.squareup.okhttp3:logging-interceptor:4.10.0-RC1') {
+ exclude group: 'com.squareup.okio', module: 'okio'
+ }
+ implementation 'com.github.xuexiangjys:XUI:1.1.7'
+ implementation files('libs/ICLoger-release.aar')
}
\ No newline at end of file
-keep class com.android.** { *; }
-keep class android.** { *; }
--dontwarn android.**
\ No newline at end of file
+-dontwarn android.**
+
+
+-keep class com.ic.iclooger.CrashHandler
+-keep class com.ic.iclooger.ICLogger
+
+-keepclassmembers class com.ic.iclooger.StorageUtils {
+ public static <fields>;
+ public static <methods>;
+ public <methods>;
+}
+
+-keepclassmembers class com.ic.iclooger.SystemUtils {
+ public static <fields>;
+ public static <methods>;
+ public <methods>;
+}
+
+-keep class com.facebook.** { *; }
+-keep class com.mediatek.** { *; }
+-keep class org.apache.** { *; }
+-keep class okio.Okio.** { *; }
+-keep class java.nio.** { *; }
+-keep class com.android.** { *; }
+-keep class android.** { *; }
+-keep class android.ddm.** { *; }
+-keep class com.alibaba.fastjson.** { *; }
+-keep class com.eqc.watch.launcher.WatchApplication { *; }
+#-keep class com.enqualcomm.support.EqcAlgorithmNative { *; }
+
+-dontwarn com.facebook.**
+-dontwarn com.mediatek.**
+-dontwarn java.nio.**
+-dontwarn com.alibaba.fastjson.**
+-dontwarn android.**
+-dontwarn com.android.**
+-dontwarn rx.internal.**
+
+-keep class com.ic.** { *; }
\ No newline at end of file
<uses-permission android:name="android.permission.WAKE_LOCK" />
+ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+ <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:name=".App"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
- <activity android:name=".MainActivity">
+ <activity android:name=".MainActivity"
+ android:theme="@style/AppTheme"
+ >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
import android.app.Application
import android.content.Context
+import com.ic.iclooger.CrashHandler
+import com.ic.iclooger.ICLogger
+import com.xuexiang.xui.XUI
+
class App : Application() {
instance = this
}
+ override fun onCreate() {
+ super.onCreate()
+ val crashHandler = CrashHandler.getInstance()
+ crashHandler.init(applicationContext, getString(R.string.program_abnormal))
+ ICLogger.init(applicationContext, "IcTemperature")
+
+ XUI.init(this)
+ XUI.debug(true)
+ }
+
companion object {
private var instance: App? = null
import android.os.PowerManager
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModelProvider
+import com.ic.iclooger.ICLogger
import com.ic.temperature.databinding.ActivityMainBinding
import com.ic.temperature.utils.DisplayType
import com.ic.temperature.utils.ICViewModelFactory
setContentView(binding.root)
initObserver()
initWakeLock()
+ viewModel.setActivity(this)
}
private var wakeLock: PowerManager.WakeLock? = null
binding.wristTemp = it
}
mEnvTemp.observe(that) {
- println("env temp is == > $it")
//环境温度
binding.envTemp = it
}
println("mShowLoading == > $it")
//显示Loading
binding.showLoading = it
+ //如果没有Loading就是检查完了
+ //10秒钟后灭屏幕
+ if (!it) {
+ binding.dotProgressBar.postDelayed({
+ if (wakeLock != null) {
+ ICLogger.d("release wake Lock...")
+ wakeLock?.release()
+ }
+ }, 1000 * 10)
+ }
}
mDisableWristTemp.observe(that) {
println("mDisableWristTemp == > $it")
package com.ic.temperature.repository
+import android.app.Activity
+import android.app.Dialog
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.ServiceConnection
+import android.os.Handler
import android.os.IBinder
+import android.os.Looper
+import android.os.Message
+import android.widget.Toast
+import com.ic.temperature.R
import com.ic.temperature.utils.Constants
import com.ic.temperature.utils.IcLog
+import com.ic.temperature.widget.CustomDialogStrategy
import com.ic.work.ITempSensorCallback
import com.ic.work.ITempSensorService
import com.ic.work.domain.Temperature
+import com.xuexiang.xui.widget.dialog.DialogLoader
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
+
+ fun setActivity(mContext: Activity?) {
+ mActivity = mContext
+ }
fun release() {
try {
+ temperature.envTemp
)
//最后的结果
+ if (dialog != null) {
+ dialog!!.dismiss();
+ }
mCallback?.onTempFinal(temperature.wristTemp, temperature.bodyTemp, temperature.envTemp)
}
override fun onGetingData() {
//正在获取
+ IcLog.d(TAG, "正在获取 ...")
+ if (mUiRefreshHandler != null) {
+ mUiRefreshHandler.sendEmptyMessage(RUNING_TASK_TYPE)
+ }
}
override fun onWaiting() {
//
+ IcLog.d(TAG, "任务正在等待...")
+ //updateTipsInfo(mTipsSpares.get(top), mTipsSpares.get(bottom));
+ //让UI显示保持安静,准备测试的玩意
+ if (mUiRefreshHandler != null) {
+ 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 mDialogLoader = DialogLoader.getInstance().setIDialogStrategy(CustomDialogStrategy())
+ dialog = mDialogLoader.showTipDialog(
+ mActivity,
+ R.mipmap.warn,
+ mContext.getString(R.string.dialog_warn),
+ mContext.getString(R.string.background_wait),
+ mContext.getString(R.string.dialog_confirm)
+ ) { dialogInterface, i ->
+ dialogInterface?.dismiss()
+ if (mActivity != null) {
+ mActivity!!.onBackPressed()
+ }
}
}
object Constants {
const val ACTION_ANTI_OFF0: String = "com.ic.ACTION_ANTIOFF"
-
//integer eventID =1 脱落, eventID =0 佩戴
const val KEY_ANTI_EVENT = "eventID"
const val STATE_ANTI_ON = 0
package com.ic.temperature.viewmodel
+import android.app.Activity
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
+import android.media.AudioManager
+import android.media.AudioManager.FX_FOCUS_NAVIGATION_DOWN
import android.os.Handler
import android.os.Looper
import android.os.Message
import java.lang.ref.WeakReference
class TemperatureViewModel() : ViewModel() {
-
+
lateinit var mContext: Context
private val repository by lazy {
checkWristWear()
}
+ fun setActivity(context: Activity?) {
+ repository.setActivity(context)
+ }
+
/**
* 是否支持腕温检测
*/
inner class WristWearStateReceiver : BroadcastReceiver() {
+ private var audioManager: AudioManager? = null;
+
override fun onReceive(context: Context, intent: Intent?) {
+ if (audioManager == null) {
+ audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager?
+ }
//如果来了佩戴的广播,判断到没有绑定远程服务的话,那么就绑定吧
val state = intent!!.getIntExtra(KEY_ANTI_EVENT, STATE_ANTI_NONE)
IcLog.i(TAG, "on AntiStateChange....$state")
IcLog.i(TAG, "state error === > $state")
return
}
-
+ //播放按键音
+ if (audioManager != null) {
+ audioManager?.playSoundEffect(FX_FOCUS_NAVIGATION_DOWN)
+ }
if (state == STATE_ANTI_OFF) {
mCheckTips.value = context!!.getString(R.string.no_wearing_device_tips_text)
//脱落了,给出提示
--- /dev/null
+package com.ic.temperature.widget;
+
+import android.annotation.SuppressLint;
+import android.app.Dialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.graphics.Color;
+
+import androidx.annotation.NonNull;
+
+import com.ic.temperature.R;
+import com.xuexiang.xui.widget.dialog.materialdialog.DialogAction;
+import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog;
+import com.xuexiang.xui.widget.dialog.strategy.IDialogStrategy;
+import com.xuexiang.xui.widget.dialog.strategy.InputCallback;
+import com.xuexiang.xui.widget.dialog.strategy.InputInfo;
+
+/**
+ * @author: k.liang
+ * @date: 2021/7/17
+ */
+public class CustomDialogStrategy implements IDialogStrategy {
+
+ @SuppressLint("ResourceType")
+ @Override
+ public Dialog showTipDialog(Context context, int icon, String title, String content, String submitText, DialogInterface.OnClickListener listener) {
+ MaterialDialog.Builder builder = new MaterialDialog.Builder(context);
+ builder.backgroundColor(Color.parseColor("#F2F2F2"));
+ builder.title(title);
+ builder.titleColor(Color.BLACK);
+ builder.content(content);
+ builder.contentColor(Color.BLACK);
+ builder.positiveText(submitText);
+ builder.positiveColor(Color.BLACK);
+ builder.onPositive(new MaterialDialog.SingleButtonCallback() {
+ @Override
+ public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
+ if (listener != null) {
+ listener.onClick(dialog, which.ordinal());
+ } else {
+ dialog.dismiss();
+ }
+ }
+ });
+ builder.cancelable(false);
+ builder.autoDismiss(false);
+ CustomMaterialDialog customMaterialDialog = new CustomMaterialDialog(builder);
+ customMaterialDialog.setTitleSize(24);
+ customMaterialDialog.setContentSize(22);
+ customMaterialDialog.setButtonSize(24);
+ customMaterialDialog.show();
+ return customMaterialDialog;
+ }
+
+ @Override
+ public Dialog showTipDialog(Context context, String title, String content, String submitText) {
+ return new CustomMaterialDialog.Builder(context)
+ .title(title)
+ .content(content)
+ .positiveText(submitText)
+ .show();
+ }
+
+ @Override
+ public Dialog showConfirmDialog(Context context, String title, String content, String submitText, DialogInterface.OnClickListener submitListener, String cancelText, DialogInterface.OnClickListener cancelListener) {
+ return null;
+ }
+
+ @Override
+ public Dialog showConfirmDialog(Context context, String content, String submitText, DialogInterface.OnClickListener submitListener, String cancelText, DialogInterface.OnClickListener cancelListener) {
+ return null;
+ }
+
+ @Override
+ public Dialog showConfirmDialog(Context context, String content, String submitText, DialogInterface.OnClickListener submitListener, String cancelText) {
+ return null;
+ }
+
+ @Override
+ public Dialog showInputDialog(Context context, int icon, String title, String content, InputInfo inputInfo, InputCallback inputCallback, String submitText, DialogInterface.OnClickListener submitListener, String cancelText, DialogInterface.OnClickListener cancelListener) {
+ return null;
+ }
+
+ @Override
+ public Dialog showContextMenuDialog(Context context, String title, String[] items, DialogInterface.OnClickListener listener) {
+ return null;
+ }
+
+ @Override
+ public Dialog showContextMenuDialog(Context context, String title, int itemsId, DialogInterface.OnClickListener listener) {
+ return null;
+ }
+
+ @Override
+ public Dialog showSingleChoiceDialog(Context context, String title, String[] items, int selectedIndex, DialogInterface.OnClickListener listener, String submitText, String cancelText) {
+ return null;
+ }
+
+ @Override
+ public Dialog showSingleChoiceDialog(Context context, String title, int itemsId, int selectedIndex, DialogInterface.OnClickListener listener, String submitText, String cancelText) {
+ return null;
+ }
+}
--- /dev/null
+package com.ic.temperature.widget;
+
+import com.xuexiang.xui.widget.dialog.materialdialog.DialogAction;
+import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog;
+
+/**
+ * @author: k.liang
+ * @date: 2021/7/17
+ */
+public class CustomMaterialDialog extends MaterialDialog {
+
+ protected CustomMaterialDialog(Builder builder) {
+ super(builder);
+ }
+
+ public void setTitleSize(float size){
+ getTitleView().setTextSize(size);
+ }
+
+ public void setContentSize(float size){
+ getContentView().setTextSize(size);
+ }
+
+ public void setButtonSize(float size){
+ getActionButton(DialogAction.POSITIVE).setTextSize(size);
+ }
+}
<?xml version="1.0" encoding="utf-8"?>
<resources>
-
+
<dimen name="status_bar_height_dm">48dp</dimen>
<dimen name="viewpager_next_item_visible">26dp</dimen>
<dimen name="app_current_item_horizontal_margin">42dp</dimen>
<dimen name="app_list_name_text_size">62sp</dimen>
+ <dimen name="temperature_left_text_size">22sp</dimen>
</resources>
\ No newline at end of file
<string name="no_wearing_device_tips_text">Not wearing a device</string>
<string name="activity_temp_tips_wear_too_short">Wear to short\nMay be not right</string>
<string name="temperature_default_text">"--.- "</string>
+ <string name="program_abnormal">Application Error</string>
+
+ <string name="background_test">Program is exist in backstage,wait...</string>
+ <string name="background_wait">Have other tests in background,Please try again later!</string>
+ <string name="dialog_warn">Warn</string>
+ <string name="dialog_confirm">Yes</string>
</resources>
<string name="activity_temp_unit">℃</string>
<string name="activity_temp_tips_wear_too_short">時間が短すぎる\n結果に影響を与える可能性があります</string>
<string name="temperature_default_text">"--.- "</string>
+ <string name="program_abnormal">Error</string>
+
+ <string name="background_test">舞台裏では心拍数を調べています…</string>
+ <string name="background_wait">測定できません、しばらく置いてからお試しください!</string>
+ <string name="dialog_warn">注意</string>
+ <string name="dialog_confirm">確認</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
- <string name="app_name">Temperature</string>
+ <string name="app_name">เทมเพอแรนส์</string>
<string name="activity_temp_str">คน</string>
<string name="activity_temp_wrist_str">ข้อมือ</string>
<string name="activity_temp_unit">℃</string>
<string name="activity_temp_outside">สภาพแวดล้อม</string>
<string name="activity_temp_tips_wear_too_short">เวลาสวมใส่สั้นเกินไป\nอาจส่งผลต่อผลลัพธ์</string>
<string name="temperature_default_text">"--.- "</string>
+ <string name="program_abnormal">ผิดพลาด</string>
+
+ <string name="background_test">กำลังทดสอบอัตราการเต้นของหัวใจ ที่หลังเวที…</string>
+ <string name="background_wait">บริการตรวจสอบเบื้องหลังไม่ว่า งโปรดลองอีกครั้งในภายหลัง</string>
+ <string name="dialog_warn">เตือนความจำ</string>
+ <string name="dialog_confirm">ยืนยัน</string>
</resources>
<string name="activity_temp_tips_end">测量完成</string>
<string name="activity_temp_tips_wear_too_short">佩戴时间过短\n可能影响结果</string>
<string name="temperature_default_text">"--.- "</string>
+ <string name="program_abnormal">App发生异常</string>
+
+ <string name="background_test">后台正在测试心率,直接监听测试结果...</string>
+ <string name="background_wait">后台测试服务繁忙,请稍后再试!</string>
+ <string name="dialog_warn">提醒</string>
+ <string name="dialog_confirm">确认</string>
</resources>
\ No newline at end of file
<string name="activity_temp_tips_wear_too_short">佩戴時間過短\n可能影響結果</string>
<string name="temperature_default_text">"--.- "</string>
<string name="no_wearing_device_tips_text">未配戴設備</string>
+ <string name="program_abnormal">App发生异常</string>
+
+ <string name="background_test">後臺正在測試心率,直接監聽測試結果...</string>
+ <string name="background_wait">後臺測試服務繁忙,請稍後再試!</string>
+ <string name="dialog_warn">提醒</string>
+ <string name="dialog_confirm">確認</string>
</resources>
\ No newline at end of file
<string name="activity_temp_tips_wear_too_short">佩戴時間過短\n可能影響結果</string>
<string name="temperature_default_text">"--.- "</string>
<string name="no_wearing_device_tips_text">未配戴設備</string>
+ <string name="program_abnormal">App发生异常</string>
+
+ <string name="background_test">後臺正在測試心率,直接監聽測試結果...</string>
+ <string name="background_wait">後臺測試服務繁忙,請稍後再試!</string>
+ <string name="dialog_warn">提醒</string>
+ <string name="dialog_confirm">確認</string>
</resources>
\ No newline at end of file
<dimen name="app_current_item_horizontal_margin">42dp</dimen>
<dimen name="app_list_name_text_size">62sp</dimen>
+ <dimen name="temperature_left_text_size">26sp</dimen>
</resources>
\ No newline at end of file
<string name="activity_temp_tips_end">测量完成</string>
<string name="activity_temp_tips_wear_too_short">佩戴时间过短\n可能影响结果</string>
<string name="temperature_default_text">"--.- "</string>
+ <string name="program_abnormal">App发生异常</string>
+
+ <string name="background_test">后台正在测试心率,直接监听测试结果...</string>
+ <string name="background_wait">后台测试服务繁忙,请稍后再试!</string>
+ <string name="dialog_warn">提醒</string>
+ <string name="dialog_confirm">确认</string>
</resources>
\ No newline at end of file
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
- <style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
+ <style name="AppTheme" parent="XUITheme.Phone">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
repositories {
google()
jcenter()
+ maven { url "https://jitpack.io" }
}
dependencies {
classpath "com.android.tools.build:gradle:4.1.0"
repositories {
google()
jcenter()
+ maven { url "https://jitpack.io" }
}
}