<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
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"
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;
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<>();
private MainPagePresenter(Context context) {
this.mContext = context;
//监听数据变化
+ executor = Executors.newSingleThreadExecutor();
+
HandlerThread handlerThread = new HandlerThread("ic:launcher.main.page");
//开启任务执行
handlerThread.start();
//监听网路广播
registerTimeDateReceiver();
updateTime(null);
- //TODO:
+ observerContent(context);
+ updateTemperature();
+ updateOxygen();
+ updateBlood();
+ updateHeartRate();
}
private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
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)) {
@Override
protected void onClean() {
super.onClean();
- handler.removeCallbacks(updateTimeTask);
mContext.unregisterReceiver(mIntentReceiver);
}
}
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);
+ }
+
+
}
+++ /dev/null
-package com.ic.launcher.loop.presenter;
-
-import android.content.Context;
-
-public class SimpleStatusBarPresenter extends StatusBarBasePresenter {
-
- public SimpleStatusBarPresenter(Context context) {
- super(context);
- }
-}
import androidx.lifecycle.MutableLiveData;
+import com.ic.iclooger.ICLogger;
import com.ic.launcher.loop.utils.SystemUtils;
import java.util.List;
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;
}
};
+
+ 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();
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;
}
}
- // ICLogger.d("level == > " + level);
- if (level != oldSignalLevel) {
- oldSignalLevel = level;
- signalLev.postValue(level);
- }
+ //ICLogger.d("level == > " + level);
+ signalLev.postValue(level);
}
//获取链接状态
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;
public class SignalView extends View {
- private Bitmap noSimCarPic;
+ private Bitmap defaultSgnalPic;
public String showText = "";
private int totalWidth;
private BitmapFactory.Options options;
private Bitmap bitmap;
private int width;
+ private int lastLev;
public SignalView(Context context) {
this(context, null);
//获取到图片的长宽
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();
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];
}
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;
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);
+ }
}
}
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;
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 {
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);
+ }
+ });
}
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;
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);
<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" />