get step count auto when watch face in active time.
authorTrillGates <williamtrillgates@gmail.com>
Sun, 20 Jun 2021 08:14:18 +0000 (16:14 +0800)
committerTrillGates <williamtrillgates@gmail.com>
Sun, 20 Jun 2021 08:14:18 +0000 (16:14 +0800)
app/src/main/java/com/ic/work/SensorDataService.java
app/src/main/java/com/ic/work/WorkService.java

index 32f7b34..ddf4835 100644 (file)
@@ -3,7 +3,11 @@ package com.ic.work;
 import android.app.Service;
 import android.content.ContentValues;
 import android.content.Intent;
+import android.database.ContentObserver;
+import android.database.Cursor;
 import android.net.Uri;
+import android.os.Handler;
+import android.os.HandlerThread;
 import android.os.IBinder;
 import android.os.PowerManager;
 import android.os.RemoteCallbackList;
@@ -20,15 +24,19 @@ import com.ic.work.event.TestTaskEvent;
 import com.ic.work.hardware.BloodInfoHelper;
 import com.ic.work.hardware.BloodSensorManager;
 import com.ic.work.hardware.TemperatureHelper;
+import com.ic.work.utils.HardwareUtils;
 import com.ic.work.utils.ICLogger;
 import com.ic.work.utils.ICWorkConstants;
 import com.ic.work.utils.IcLog;
 import com.ic.work.utils.IcSystemProperty;
+import com.ic.work.utils.PedUtil;
+import com.ic.work.utils.SPUtils;
 
 import org.greenrobot.eventbus.EventBus;
 import org.greenrobot.eventbus.Subscribe;
 import org.greenrobot.eventbus.ThreadMode;
 
+import java.math.BigDecimal;
 import java.util.concurrent.LinkedBlockingDeque;
 
 import static com.ic.work.utils.ICWorkConstants.Jx.ACTION_AEE_HEART_RATE;
@@ -66,6 +74,8 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp
     private final Object mLock = new Object();
     private PowerManager powerManager;
     private PowerManager.WakeLock wakeLock;
+    private HandlerThread handlerThread;
+    private Handler handler;
 
     @Nullable
     @Override
@@ -95,8 +105,85 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp
         //那么就取出下一个任务
         TemperatureHelper.getInstance().setTemperatureChangeListener(this);
         BloodInfoHelper.getInstance().setHeartRateInfoChangeListener(this);
+        //监听表盘活跃状态
+        //如果改为了true,那么就每2秒种更新一次步数到数据库里
+        //如果为false,则停止任务的执行
+        handlerThread = new HandlerThread("ic:sensor:handler");
+        handlerThread.start();
+        handler = new Handler(handlerThread.getLooper());
+        observerWatchFaceActiveState();
+    }
+
+    private void observerWatchFaceActiveState() {
+        ICLogger.d("observerWatchFaceActiveState...");
+        getContentResolver().registerContentObserver(
+                Uri.parse(SETTINGS + ".watch_face_active_state"),
+                true,
+                contentObserver
+        );
     }
 
+    private final ContentObserver contentObserver = new ContentObserver(null) {
+        @Override
+        public void onChange(boolean selfChange) {
+            handler.post(() -> {
+                handleWatchFaceActiveTask();
+            });
+        }
+    };
+
+    private void handleWatchFaceActiveTask() {
+        ICLogger.d("handleWatchFaceActiveTask...");
+        //获取到状态
+        Cursor cursor = getContentResolver().query(Uri.parse(SETTINGS),
+                new String[]{"s_value"}, "s_key=?",
+                new String[]{"watch_face_active_state"}, null);
+        if (cursor != null) {
+            try {
+                if (cursor.moveToNext()) {
+                    String isActive = cursor.getString(0);
+                    boolean isActiveValue = Boolean.parseBoolean(isActive);
+                    //判断是否活跃
+                    ICLogger.d("isActiveValue == > " + isActiveValue);
+                    if (isActiveValue) {
+                        handler.post(checkPetCountTask);
+                    } else {
+                        handler.removeCallbacks(checkPetCountTask);
+                    }
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            } finally {
+                cursor.close();
+            }
+        }
+    }
+
+    private final Runnable checkPetCountTask = new Runnable() {
+        @Override
+        public void run() {
+            int count = HardwareUtils.getNdkStepCountValue();
+            //把count写到数据库里
+            ContentValues contentValues = new ContentValues();
+            contentValues.put("s_key", "sport_step_count");
+            contentValues.put("s_value", count);
+            getContentResolver().insert(
+                    Uri.parse(SensorDataService.SETTINGS), contentValues
+            );
+            ICLogger.d("count == > " + count);
+            //更新卡路里
+            BigDecimal bg = new BigDecimal(PedUtil.calcConsumeEnergy(SPUtils.getPedHeightSP(getBaseContext()),
+                    SPUtils.getPedWighttSP(getBaseContext()), count));
+            String value = String.valueOf(bg.setScale(2, BigDecimal.ROUND_HALF_UP).floatValue());
+            //保存一份到数据库中
+            ContentValues contentValuesCalorie = new ContentValues();
+            contentValuesCalorie.put("s_key", "sport_calorie_value");
+            contentValuesCalorie.put("s_value", value);
+            getContentResolver().insert(Uri.parse(SensorDataService.SETTINGS), contentValues);
+            //获取步数,然后入库
+            handler.postDelayed(this, 2000);
+        }
+    };
 
     /**
      * 此方法已经是子线程了,不可以再开子线程,包括结果的处理。
@@ -173,6 +260,7 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp
         );
     }
 
+
     /**
      * 分发温度数据
      *
@@ -213,6 +301,8 @@ public class SensorDataService extends Service implements TemperatureHelper.Temp
     public void onDestroy() {
         super.onDestroy();
         mTaskList.clear();
+        //不再监听表盘活跃状态的变化
+        getContentResolver().unregisterContentObserver(contentObserver);
         powerManager = null;
         EventBus.getDefault().unregister(this);
         TemperatureHelper.getInstance().setTemperatureChangeListener(null);
index 4d16d5b..4005260 100644 (file)
@@ -114,22 +114,16 @@ public class WorkService extends Service {
     public void onCreate() {
         super.onCreate();
         mApp = (WorkServiceApp) getApplication();
-
         weatherProcess = new WeatherProcess();
         bloodProcess = new BloodProcess();
         pedProcess = new PedProcess();
         tempProcess = new TempProcess();
         akProcess = new AkProcess();
-
         mWeatherHelper = new WeatherHelper(mApp.getWeatherRepository(), this);
-
         EventBus.getDefault().register(this);
-
         registerBroadcast();
-
         coreService = new MessengerCoreService();
         coreService.bindCoreService(getApplicationContext());
-
         IcLog.i(TAG, "work service is start");
     }