update icon.
authorTrillGates <williamtrillgates@gmail.com>
Fri, 18 Jun 2021 11:43:18 +0000 (19:43 +0800)
committerTrillGates <williamtrillgates@gmail.com>
Fri, 18 Jun 2021 11:43:18 +0000 (19:43 +0800)
13 files changed:
app/src/main/AndroidManifest.xml
app/src/main/java/com/ic/launcher/loop/presenter/MainPagePresenter.java
app/src/main/java/com/ic/launcher/loop/presenter/SimpleStatusBarPresenter.java [deleted file]
app/src/main/java/com/ic/launcher/loop/presenter/StatusBarBasePresenter.java
app/src/main/java/com/ic/launcher/loop/view/SignalView.java
app/src/main/java/com/ic/launcher/loop/view/SimpleStatusBarView.java
app/src/main/java/com/ic/launcher/loop/view/StatusBarView.java
app/src/main/res/layout/activity_main.xml
app/src/main/res/mipmap-mdpi/top_signal_0.png
app/src/main/res/mipmap-mdpi/top_signal_1.png
app/src/main/res/mipmap-mdpi/top_signal_2.png
app/src/main/res/mipmap-mdpi/top_signal_3.png
app/src/main/res/mipmap-mdpi/top_signal_4.png

index 09a7a36..b66c63a 100644 (file)
@@ -17,6 +17,7 @@
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
 
     <permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
+    <permission android:name="android.permission.READ_PHONE_STATE" />
 
     <uses-permission android:name="android.permission.VIBRATE" />
     <uses-permission
@@ -24,8 +25,8 @@
         tools:ignore="ProtectedPermissions" />
 
     <application
-        android:allowBackup="true"
         android:name=".App"
+        android:allowBackup="true"
         android:icon="@mipmap/ic_launcher"
         android:label="@string/app_name"
         android:roundIcon="@mipmap/ic_launcher_round"
index 28d77b7..0a9959f 100644 (file)
@@ -4,10 +4,14 @@ import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.database.ContentObserver;
+import android.database.Cursor;
+import android.net.Uri;
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.text.TextUtils;
 
+import androidx.annotation.NonNull;
 import androidx.lifecycle.MutableLiveData;
 
 import com.ic.iclooger.ICLogger;
@@ -18,11 +22,19 @@ import org.threeten.bp.LocalDateTime;
 import org.threeten.bp.ZoneId;
 import org.threeten.bp.format.DateTimeFormatter;
 
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
 public class MainPagePresenter extends BasePresenter {
 
+    public static final String PATH = "settings";
+    public static final String AUTHORITY = "com.ic.fzd.settings";
+    public static final String SETTINGS = "content://" + AUTHORITY + "/" + PATH;
+
+
     private static final DateTimeFormatter HH_MM = DateTimeFormatter.ofPattern("HH:mm");
     private static final DateTimeFormatter MM_DD = DateTimeFormatter.ofPattern("MM-dd");
-
+    private final ExecutorService executor;
     //所关心的数据
     //时间
     public MutableLiveData<String> timeValue = new MutableLiveData<>();
@@ -45,6 +57,8 @@ public class MainPagePresenter extends BasePresenter {
     private MainPagePresenter(Context context) {
         this.mContext = context;
         //监听数据变化
+        executor = Executors.newSingleThreadExecutor();
+
         HandlerThread handlerThread = new HandlerThread("ic:launcher.main.page");
         //开启任务执行
         handlerThread.start();
@@ -53,7 +67,11 @@ public class MainPagePresenter extends BasePresenter {
         //监听网路广播
         registerTimeDateReceiver();
         updateTime(null);
-        //TODO:
+        observerContent(context);
+        updateTemperature();
+        updateOxygen();
+        updateBlood();
+        updateHeartRate();
     }
 
     private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
@@ -78,17 +96,6 @@ public class MainPagePresenter extends BasePresenter {
         mContext.registerReceiver(mIntentReceiver, filter);
     }
 
-
-    private final Runnable updateTimeTask = new Runnable() {
-        @Override
-        public void run() {
-            //更新时间
-            updateTime(null);
-            //60秒更新一次
-            handler.postDelayed(this, 1000 * 60);
-        }
-    };
-
     private void updateTime(String timeZoom) {
         LocalDateTime currDateTime;
         if (!TextUtils.isEmpty(timeZoom)) {
@@ -134,7 +141,6 @@ public class MainPagePresenter extends BasePresenter {
     @Override
     protected void onClean() {
         super.onClean();
-        handler.removeCallbacks(updateTimeTask);
         mContext.unregisterReceiver(mIntentReceiver);
     }
 
@@ -146,4 +152,102 @@ public class MainPagePresenter extends BasePresenter {
         }
         return sInstance;
     }
+
+
+    private void observerContent(@NonNull Context context) {
+        //找到相关的控件,设置数值
+        //心率,体温,血氧,血压
+        context.getContentResolver().registerContentObserver(Uri.parse(SETTINGS + ".body_temperature"),
+                true, new ContentObserver(null) {
+                    @Override
+                    public void onChange(boolean selfChange) {
+                        //更新体温数据
+                        updateTemperature();
+                    }
+                });
+        context.getContentResolver().registerContentObserver(Uri.parse(SETTINGS + ".oxygen"),
+                true, new ContentObserver(null) {
+                    @Override
+                    public void onChange(boolean selfChange) {
+                        //更新血氧
+                        updateOxygen();
+                    }
+                });
+        context.getContentResolver().registerContentObserver(Uri.parse(SETTINGS + ".heart_rate"),
+                true, new ContentObserver(null) {
+                    @Override
+                    public void onChange(boolean selfChange) {
+                        //更新心率
+                        updateHeartRate();
+                    }
+                });
+        context.getContentResolver().registerContentObserver(Uri.parse(SETTINGS + ".blood_high"),
+                true, new ContentObserver(null) {
+                    @Override
+                    public void onChange(boolean selfChange) {
+                        //更新血压
+                        updateBlood();
+                    }
+                });
+    }
+
+    private void getValueByKey(String key) {
+        executor.submit(() -> {
+            if (mContext != null) {
+                Cursor cursor = mContext.getContentResolver().query(Uri.parse(SETTINGS),
+                        new String[]{"s_value"},
+                        "s_key=?", new String[]{key}, null);
+                if (cursor != null) {
+                    if (cursor.moveToNext()) {
+                        String value = cursor.getString(0);
+                        ICLogger.d(key + " == > " + value);
+                        handleResult(key, value);
+                    }
+                    cursor.close();
+                }
+            }
+        });
+    }
+
+    private void handleResult(String key, String value) {
+        switch (key) {
+            case KEY_ENV_TEMP:
+                envTempValue.postValue(value);
+                break;
+            case KEY_HEART_RATE:
+                heartRate.postValue(value);
+                break;
+            case KEY_OXYGEN:
+                oxygenValue.postValue(value);
+                break;
+            case KEY_TEMP:
+                bodyTempValue.postValue(value);
+                break;
+        }
+    }
+
+
+    public static final String KEY_OXYGEN = "oxygen";
+    public static final String KEY_HEART_RATE = "heart_rate";
+    public static final String KEY_ENV_TEMP = "env_temperature";
+    public static final String KEY_TEMP = "body_temperature";
+
+
+    private void updateTemperature() {
+        getValueByKey(KEY_TEMP);
+    }
+
+    private void updateOxygen() {
+        getValueByKey(KEY_OXYGEN);
+    }
+
+    private void updateBlood() {
+        getValueByKey(KEY_ENV_TEMP);
+    }
+
+    private void updateHeartRate() {
+        getValueByKey(KEY_HEART_RATE);
+    }
+
+
 }
diff --git a/app/src/main/java/com/ic/launcher/loop/presenter/SimpleStatusBarPresenter.java b/app/src/main/java/com/ic/launcher/loop/presenter/SimpleStatusBarPresenter.java
deleted file mode 100644 (file)
index be6db63..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.ic.launcher.loop.presenter;
-
-import android.content.Context;
-
-public class SimpleStatusBarPresenter extends StatusBarBasePresenter {
-
-    public SimpleStatusBarPresenter(Context context) {
-        super(context);
-    }
-}
index cb301d8..6c20bca 100644 (file)
@@ -16,6 +16,7 @@ import android.telephony.TelephonyManager;
 
 import androidx.lifecycle.MutableLiveData;
 
+import com.ic.iclooger.ICLogger;
 import com.ic.launcher.loop.utils.SystemUtils;
 
 import java.util.List;
@@ -31,10 +32,11 @@ public class StatusBarBasePresenter extends BasePresenter {
     public MutableLiveData<Integer> signalLev = new MutableLiveData<>();
     //连接状态
     public MutableLiveData<Boolean> isServerConnected = new MutableLiveData<>();
+    //网络类型
+    public MutableLiveData<String> networkTypeValue = new MutableLiveData<>();
 
     private Handler handler;
     private TelephonyManager mTelephony;
-    private int oldSignalLevel;
 
     public StatusBarBasePresenter(Context context) {
         this.mContext = context;
@@ -67,6 +69,39 @@ public class StatusBarBasePresenter extends BasePresenter {
         }
     };
 
+
+    private void queryPhoneNetworkTypeResId(TelephonyManager tm) {
+        int networkType = tm.getNetworkType();
+        String type = "";
+        switch (networkType) {
+            case TelephonyManager.NETWORK_TYPE_GPRS:
+            case TelephonyManager.NETWORK_TYPE_EDGE:
+            case TelephonyManager.NETWORK_TYPE_CDMA:
+            case TelephonyManager.NETWORK_TYPE_1xRTT:
+            case TelephonyManager.NETWORK_TYPE_IDEN:
+                type = "G";
+                break;
+            case TelephonyManager.NETWORK_TYPE_UMTS:
+            case TelephonyManager.NETWORK_TYPE_EVDO_0:
+            case TelephonyManager.NETWORK_TYPE_EVDO_A:
+            case TelephonyManager.NETWORK_TYPE_HSDPA:
+            case TelephonyManager.NETWORK_TYPE_HSUPA:
+            case TelephonyManager.NETWORK_TYPE_HSPA:
+            case TelephonyManager.NETWORK_TYPE_EVDO_B:
+            case TelephonyManager.NETWORK_TYPE_EHRPD:
+            case TelephonyManager.NETWORK_TYPE_HSPAP:
+                type = "3G";
+                break;
+            case TelephonyManager.NETWORK_TYPE_LTE:
+                type = "4G";
+                break;
+            default:
+                break;
+        }
+        //ICLogger.d("network type == > " + type);
+        networkTypeValue.postValue(type);
+    }
+
     private void getSignalLev() {
         HandlerThread handlerThread = new HandlerThread("ic:launcher-status-bar");
         handlerThread.start();
@@ -76,14 +111,55 @@ public class StatusBarBasePresenter extends BasePresenter {
         handler.post(new Runnable() {
             @Override
             public void run() {
-                getSignalStrength();
-                getConnectionState();
+                //判断卡的状态
+                if (querySimCardState()) {
+                    getSignalStrength();
+                    getConnectionState();
+                    queryPhoneNetworkTypeResId(mTelephony);
+                }
                 handler.postDelayed(this, 1000);
             }
         });
     }
 
 
+    private int mOldSimCardState = -1;
+
+
+    private boolean querySimCardState() {
+
+        if (mTelephony == null) {
+            return false;
+        }
+
+        int simState = mTelephony.getSimState();
+        if (simState == mOldSimCardState && simState == TelephonyManager.SIM_STATE_READY) {
+            return true;
+        }
+
+        boolean flag = false;
+        mOldSimCardState = simState;
+
+        switch (simState) {
+            case TelephonyManager.SIM_STATE_READY:
+                //sim卡准备好了
+                flag = true;
+                break;
+            case TelephonyManager.SIM_STATE_NETWORK_LOCKED:
+            case TelephonyManager.SIM_STATE_PUK_REQUIRED:
+            case TelephonyManager.SIM_STATE_PIN_REQUIRED:
+                //sim卡网络查找中
+                break;
+            default:
+                //sim卡没有/准备好
+                //TODO:
+                break;
+        }
+
+        return flag;
+    }
+
+
     public void getSignalStrength() {
         if (mTelephony == null) {
             return;
@@ -108,11 +184,8 @@ public class StatusBarBasePresenter extends BasePresenter {
             }
         }
 
-        // ICLogger.d("level == > " + level);
-        if (level != oldSignalLevel) {
-            oldSignalLevel = level;
-            signalLev.postValue(level);
-        }
+        //ICLogger.d("level == > " + level);
+        signalLev.postValue(level);
     }
 
     //获取链接状态
index 0ba4317..fd05cd2 100644 (file)
@@ -4,7 +4,10 @@ import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.Canvas;
+import android.graphics.Color;
 import android.graphics.Paint;
+import android.graphics.PaintFlagsDrawFilter;
+import android.graphics.Typeface;
 import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.view.View;
@@ -16,7 +19,7 @@ import com.ic.launcher.loop.R;
 
 public class SignalView extends View {
 
-    private Bitmap noSimCarPic;
+    private Bitmap defaultSgnalPic;
 
     public String showText = "";
     private int totalWidth;
@@ -27,6 +30,7 @@ public class SignalView extends View {
     private BitmapFactory.Options options;
     private Bitmap bitmap;
     private int width;
+    private int lastLev;
 
     public SignalView(Context context) {
         this(context, null);
@@ -43,12 +47,12 @@ public class SignalView extends View {
         //获取到图片的长宽
         textPaint = new Paint();
         textPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
-        textPaint.setStyle(Paint.Style.STROKE);
-        textPaint.setColor(getResources().getColor(R.color.white));
+        textPaint.setColor(Color.WHITE);
         textPaint.setTextSize(12.0f);
-        noSimCarPic = BitmapFactory.decodeResource(getResources(), R.mipmap.top_no_sim_card, options);
-        targetHeight = noSimCarPic.getHeight();
-        width = noSimCarPic.getWidth();
+        textPaint.setTypeface(Typeface.DEFAULT_BOLD);
+        defaultSgnalPic = BitmapFactory.decodeResource(getResources(), R.mipmap.top_signal_0, options);
+        targetHeight = defaultSgnalPic.getHeight();
+        width = defaultSgnalPic.getWidth();
         retestSize();
         //绘制图片的画笔
         picPaint = new Paint();
@@ -58,8 +62,8 @@ public class SignalView extends View {
 
     private void retestSize() {
         textWidth = textPaint.measureText(showText);
-        totalWidth = (int) (textWidth + width);
-        ICLogger.d("textWidth == > " + textWidth + " totalWidth == > " + totalWidth);
+        totalWidth = width;
+        //ICLogger.d("textWidth == > " + textWidth + " totalWidth == > " + totalWidth);
     }
 
     private final int[] picsResArray = new int[5];
@@ -94,13 +98,22 @@ public class SignalView extends View {
     }
 
     public void updateNetworkType(String text) {
+        if (!TextUtils.isEmpty(text) && currentPic == R.mipmap.top_no_sim_card) {
+            currentPic = R.mipmap.top_signal_0;
+        }
         this.isNoNetwork = false;
-        showText = text;
-        retestSize();
-        invalidate();
+        if (!showText.equals(text)) {
+            showText = text;
+            retestSize();
+            invalidate();
+        }
     }
 
     public void updateLev(int lev) {
+        if (lastLev == lev) {
+            return;
+        }
+        this.lastLev = lev;
         ICLogger.d("update level..." + lev);
         if (lev < 0 || lev > 5 || isNoNetwork) {
             return;
@@ -118,16 +131,21 @@ public class SignalView extends View {
         setMeasuredDimension(totalWidth, targetHeight);
     }
 
+    private PaintFlagsDrawFilter mPaintFlagsFilter = new PaintFlagsDrawFilter(0,
+            Paint.ANTI_ALIAS_FLAG
+                    | Paint.FILTER_BITMAP_FLAG);
+
     @Override
     protected void onDraw(Canvas canvas) {
-        if (!TextUtils.isEmpty(showText)) {
-            canvas.drawText(showText, totalWidth - textWidth,
-                    targetHeight / 2, textPaint);
-        }
         if (bitmap == null) {
             return;
         }
+        canvas.setDrawFilter(mPaintFlagsFilter);
         //判断状态
         canvas.drawBitmap(bitmap, 0, 0, picPaint);
+        if (!TextUtils.isEmpty(showText)) {
+            canvas.drawText(showText, totalWidth - textWidth - 6,
+                    targetHeight - 15, textPaint);
+        }
     }
 }
index 1a2f190..dd5f538 100644 (file)
@@ -1,6 +1,7 @@
 package com.ic.launcher.loop.view;
 
 import android.content.Context;
+import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.view.LayoutInflater;
 import android.widget.FrameLayout;
@@ -12,6 +13,7 @@ import androidx.lifecycle.LifecycleOwner;
 
 import com.ic.launcher.loop.R;
 import com.ic.launcher.loop.presenter.MainPagePresenter;
+import com.ic.launcher.loop.presenter.StatusBarPresenter;
 
 public class SimpleStatusBarView extends FrameLayout {
 
@@ -34,13 +36,32 @@ public class SimpleStatusBarView extends FrameLayout {
         signalView = findViewById(R.id.signal_view);
         signalView.noNetwork();
         timeText = findViewById(R.id.simple_status_bar_time_tv);
+
     }
 
     public void initViewModel(LifecycleOwner lifecycleOwner) {
         MainPagePresenter mainPresenter = MainPagePresenter.getInstance(getContext());
+        StatusBarPresenter statusBarPresenter = StatusBarPresenter.getInstance(getContext());
         mainPresenter.timeValue.observe(lifecycleOwner, timeValue -> {
             timeText.setText(timeValue);
         });
+        statusBarPresenter.networkTypeValue.observe(lifecycleOwner, type -> {
+            //ICLogger.d("type == > " + type);
+            if (TextUtils.isEmpty(type)) {
+                signalView.noNetwork();
+            } else {
+                signalView.updateNetworkType(type);
+            }
+        });
+        statusBarPresenter.signalLev.observe(lifecycleOwner, lev -> {
+            //ICLogger.d("lev == > " + lev);
+            //信号强度
+            if (lev == null) {
+                signalView.updateLev(0);
+            } else {
+                signalView.updateLev(lev);
+            }
+        });
     }
 
 
index 7966189..0287a83 100644 (file)
@@ -1,6 +1,7 @@
 package com.ic.launcher.loop.view;
 
 import android.content.Context;
+import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -117,7 +118,16 @@ public class StatusBarView extends FrameLayout {
                 batteryView.updateCurrentLev(0);
             }
         });
+        statusBarPresenter.networkTypeValue.observe(lifecycleOwner, type -> {
+            //ICLogger.d("type == > " + type);
+            if (TextUtils.isEmpty(type)) {
+                signalView.noNetwork();
+            } else {
+                signalView.updateNetworkType(type);
+            }
+        });
         statusBarPresenter.signalLev.observe(lifecycleOwner, lev -> {
+            //ICLogger.d("lev == > " + lev);
             //信号强度
             if (lev == null) {
                 signalView.updateLev(0);
index 03fdd58..2b48297 100644 (file)
@@ -20,7 +20,7 @@
     <com.ic.launcher.loop.view.StatusBarView
         android:id="@+id/status_bar"
         android:layout_width="match_parent"
-        android:layout_height="34dp"
+        android:layout_height="34px"
         android:visibility="gone"
         app:layout_constraintTop_toTopOf="parent" />
 
index bd05049..37977cf 100644 (file)
Binary files a/app/src/main/res/mipmap-mdpi/top_signal_0.png and b/app/src/main/res/mipmap-mdpi/top_signal_0.png differ
index 0a070d7..06c5af1 100644 (file)
Binary files a/app/src/main/res/mipmap-mdpi/top_signal_1.png and b/app/src/main/res/mipmap-mdpi/top_signal_1.png differ
index 9960bb6..4e2250d 100644 (file)
Binary files a/app/src/main/res/mipmap-mdpi/top_signal_2.png and b/app/src/main/res/mipmap-mdpi/top_signal_2.png differ
index 8b8abc2..c832208 100644 (file)
Binary files a/app/src/main/res/mipmap-mdpi/top_signal_3.png and b/app/src/main/res/mipmap-mdpi/top_signal_3.png differ
index 8e57c21..d536da0 100644 (file)
Binary files a/app/src/main/res/mipmap-mdpi/top_signal_4.png and b/app/src/main/res/mipmap-mdpi/top_signal_4.png differ