Просмотр исходного кода

1,重构首页布局便于后续维护和查找入口

master
陈福行 1 год назад
Родитель
Сommit
280c1dfe9f
47 измененных файлов: 2938 добавлений и 1862 удалений
  1. 6
    5
      app/build.gradle
  2. 5
    3
      app/src/main/AndroidManifest.xml
  3. 82
    27
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BleCmdActivity.java
  4. 0
    209
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BloodGlucoseActivity.java
  5. 28
    11
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/EightBodyfatActivity.java
  6. 2
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/HeightCmdActivity.java
  7. 0
    656
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/MainActivity.java
  8. 20
    198
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ShowBleActivity.java
  9. 2
    3
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TestCmdActivity.java
  10. 0
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/WeightScaleBleActivity.java
  11. 11
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/MyApplication.java
  12. 0
    21
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/config/AppConfig.java
  13. 24
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/config/BleDeviceConfig.java
  14. 0
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/WifiDialog.java
  15. 206
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/home/HomeDataManager.java
  16. 91
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/home/HomeListAdapter.java
  17. 85
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/home/JumpBean.java
  18. 296
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/home/MainActivity.java
  19. 1
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/BleDemoActivity.java
  20. 2
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/PublicBleNetworkCmdActivity.java
  21. 528
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/PublicWifiBleOtaActivity.java
  22. 0
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/barometric_temp_humidity/EditParamsDialog.java
  23. 1
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/blood_glucose/BloodGlucoseActivity.java
  24. 1
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/meat_probe_charger/MeatProbeChargerActivity.java
  25. 1
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/toothbrush/ToothBrushWifiBleActivity.java
  26. 5
    5
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/weight_scale/WeightScaleActivity.java
  27. 9
    9
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/wifi_ble_scale/WeightScaleWifiBleActivity.java
  28. 6
    6
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/wifible_sphy/WifiBleSphyActivity.java
  29. 343
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/AppPhoneInfoUtils.java
  30. 182
    56
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/L.java
  31. 171
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/MyDiskLogStrategy.java
  32. 5
    0
      app/src/main/res/drawable/ic_baseline_share_24.xml
  33. 12
    0
      app/src/main/res/drawable/ic_info.xml
  34. 1
    1
      app/src/main/res/layout/activity_ble.xml
  35. 0
    70
      app/src/main/res/layout/activity_eight_body_fat.xml
  36. 3
    499
      app/src/main/res/layout/activity_main.xml
  37. 509
    0
      app/src/main/res/layout/activity_main_old.xml
  38. 1
    1
      app/src/main/res/layout/activity_skateboard_data.xml
  39. 1
    1
      app/src/main/res/layout/activity_skateboard_data_user.xml
  40. 0
    65
      app/src/main/res/layout/activity_tooth_brush_ble.xml
  41. 4
    4
      app/src/main/res/layout/activity_weight_scale_wifi_ble.xml
  42. 128
    0
      app/src/main/res/layout/activity_wifi_ble_ota.xml
  43. 25
    0
      app/src/main/res/layout/item_home_list.xml
  44. 11
    0
      app/src/main/res/menu/toolbar_menu.xml
  45. 11
    0
      app/src/main/res/menu/toolbar_menu_share.xml
  46. 60
    0
      app/src/main/res/values-zh/strings.xml
  47. 59
    0
      app/src/main/res/values/strings.xml

+ 6
- 5
app/build.gradle Просмотреть файл

@@ -4,9 +4,9 @@ android {
compileSdkVersion 33
defaultConfig {
applicationId "aicare.net.cn.sdk.ailinksdkdemoandroid"
minSdkVersion 19
minSdkVersion 21
targetSdkVersion 33
versionName "1.11.11"
versionName "1.11.14"
versionCode getVersionCodeNumber(versionName)
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
@@ -66,9 +66,10 @@ dependencies {
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'androidx.cardview:cardview:1.0.0'
testImplementation 'junit:junit:4.12'
implementation 'com.github.elinkthings:AILinkSDKRepositoryAndroid:1.14.5'//蓝牙核心库
// implementation 'com.github.elinkthings:AILinkSDKOtaLibraryAndroid:1.1.4'//OTA库,需要依赖核心库
implementation 'com.github.elinkthings:AILinkSDKParsingLibraryAndroid:1.9.3'//蓝牙解析库
implementation 'com.github.elinkthings:AILinkSDKRepositoryAndroid:1.14.6'//蓝牙核心库
//OTA库,需要依赖核心库
// implementation 'com.github.elinkthings:AILinkSDKOtaLibraryAndroid:1.1.6'
implementation 'com.github.elinkthings:AILinkSDKParsingLibraryAndroid:1.9.4'//蓝牙解析库
implementation 'androidx.recyclerview:recyclerview:1.3.2'
implementation 'com.jakewharton:butterknife:10.2.3'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3'

+ 5
- 3
app/src/main/AndroidManifest.xml Просмотреть файл

@@ -32,8 +32,8 @@
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true"
tools:targetApi="q">
<activity android:name=".ClearShakeHandsActivity" />
<activity android:name=".MainActivity"
<activity android:name=".home.MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
@@ -42,6 +42,9 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>


<activity android:name=".ClearShakeHandsActivity" />
<activity android:name=".ShowBleActivity" />
<activity android:name=".BabyCmdActivity" />
<activity android:name=".TempGunCmdActivity" />
@@ -54,7 +57,6 @@
<activity android:name=".ConnectBleTestActivity" />
<activity android:name=".ADWeightScaleCmdActivity" />
<activity android:name=".ADWeightScaleUserActivity" />
<activity android:name=".WeightScaleWifiBleActivity" />
<activity android:name=".WeightScaleBleActivity" />
<activity android:name=".WifiConfigActivity" />
<activity android:name=".EightBodyfatActivity" />

+ 82
- 27
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BleCmdActivity.java Просмотреть файл

@@ -1,11 +1,15 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import android.widget.ArrayAdapter;
@@ -16,7 +20,9 @@ import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.bean.SupportUnitBean;
import com.pingwang.bluetoothlib.config.BleConfig;
import com.pingwang.bluetoothlib.config.CmdConfig;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.BleSendCmdUtil;
@@ -38,11 +44,15 @@ import com.pingwang.bluetoothlib.utils.BleDataUtils;
import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.AppPhoneInfoUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.FileProvider7;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;


@@ -63,7 +73,10 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On
private BleSendCmdUtil mBleSendCmdUtil;
private BleDataUtils bleDataUtils;
private BleDevice mBleDevice;
private int type;
private int mCid;
private int mVid;
private int mPid;
private String mDeviceVersion;
/**
* 是否暂停显示数据
*/
@@ -84,7 +97,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On

private void addShowData(String data) {
mId++;
mList.add("ID:" +mId+" " + TimeUtils.getTimeSSS() + data);
mList.add("ID:" + mId + " " + TimeUtils.getTimeSSS() + data);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@@ -95,9 +108,12 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
mContext = this;
mAddress = getIntent().getStringExtra("mac");
type = getIntent().getIntExtra("type", -1);
mCid = getIntent().getIntExtra("cid", -1);
mVid = getIntent().getIntExtra("vid", -1);
mPid = getIntent().getIntExtra("pid", -1);
mBleSendCmdUtil = BleSendCmdUtil.getInstance();
init();
BleConfig.setHandshakeStatus((int[]) null, mAddress, true);
}

private void init() {
@@ -153,7 +169,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On
addShowData("断开连接");
break;
case R.id.btnConnect:
mAILinkBleManager.connectDevice(mAddress);
mAILinkBleManager.connectDevice(new BleValueBean(mAddress, mCid, mVid, mPid));
addShowData("连接设备");
break;
case R.id.btnClear:
@@ -175,27 +191,18 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On
case R.id.btnVersion:

if (mBleDevice != null) {
String version = mBleDevice.getVersion();
if (TextUtils.isEmpty(version)) {
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getBleVersion());
sendData(sendBleBean);
addShowData("正在获取版本号.");

return;
}
addShowData("版本号:" + version);
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getBleVersion());
sendData(sendBleBean);
addShowData("正在获取版本号.");

}
break;
case R.id.btnBattery:
for (int i = 0; i < 10; i++) {
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus());
sendData(sendBleBean);
}
sendBleBean = new SendBleBean();
sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus());
sendData(sendBleBean);
addShowData("读取电量");

break;
case R.id.btnTimeRead:
sendBleBean = new SendBleBean();
@@ -411,7 +418,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On
public void unbindServices() {
CallbackDisIm.getInstance().removeListener(this);
mAILinkBleManager.disconnectAll();
if (mAILinkBleManager !=null) {
if (mAILinkBleManager != null) {
mAILinkBleManager.removeOnCallbackBle(this);
}
}
@@ -423,13 +430,13 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On
@Override
public void onConnecting(@NonNull String mac) {
//TODO 连接中
BleLog.i(TAG, "连接中");
L.iw(TAG, "连接中");
}

@Override
public void onDisConnected(@NonNull String mac, int code) {
//TODO 连接断开
BleLog.i(TAG, "连接断开");
L.iw(TAG, "连接断开");
if (mAddress.equals(mac)) {
Toast.makeText(mContext, "连接断开:" + code, Toast.LENGTH_SHORT).show();
mBleDevice = null;
@@ -440,7 +447,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On
@Override
public void onServicesDiscovered(@NonNull String mac) {
//TODO 连接成功(获取服务成功)
BleLog.i(TAG, "连接成功(获取服务成功)");
L.iw(TAG, "连接成功(获取服务成功):" + mac);
connectSuccess();
}

@@ -452,7 +459,8 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On

@Override
public void bleClose() {
BleLog.i(TAG, "蓝牙未开启,可请求开启");
L.iw(TAG, "蓝牙未开启,可请求开启");
addShowData("蓝牙未开启");
}


@@ -460,7 +468,8 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On


@Override
public void onNotifyOtherData(byte[] data) {
public void onNotifyOtherData(String uuid, byte[] data) {
L.iw(TAG, "透传数据(完整):" + BleStrUtils.byte2HexStr(data));
if (mPauseShowCmd) {
return;
}
@@ -469,7 +478,8 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On
}

@Override
public void onNotifyDataA6(byte[] hex) {
public void onNotifyDataA6(String uuid, byte[] hex) {
L.iw(TAG, "收到A6(payload):" + BleStrUtils.byte2HexStr(hex));
if (hex != null && hex.length > 0) {
switch (hex[0]) {
case CmdConfig.SET_DEVICE_INFO: {
@@ -500,6 +510,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On

@Override
public void onNotifyData(String uuid, byte[] hex, int type) {
L.iw(TAG, "收到A7:\nCID:" + type + "\npayload:" + BleStrUtils.byte2HexStr(hex));
if (mPauseShowCmd) {
return;
}
@@ -516,12 +527,14 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On

@Override
public void onHandshake(boolean status) {
L.iw(TAG, "握手:" + status);
addShowData("握手:" + status);

}

@Override
public void onBmVersion(String version) {
mDeviceVersion = version;
addShowData("版本号:" + version);

}
@@ -662,4 +675,46 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On
super.onDestroy();
BleLog.i(TAG, "onDestroy");
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.toolbar_menu_share, menu);
return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (item.getItemId() == R.id.toolbar_right_menu) {
shareData();
return true;
}
return super.onOptionsItemSelected(item);
}


private void shareData() {

int systemBattery = AppPhoneInfoUtils.getSystemBattery(mContext);
String appData = "包名:" + BuildConfig.APPLICATION_ID +
"\nApp版本:" + AppPhoneInfoUtils.getVersionName(mContext) +
"\n设备版本:" + mDeviceVersion +
"\n设备:CID=0x" + Integer.toHexString(mCid) + " VID=0x" + Integer.toHexString(mVid) + " PID=0x" + Integer.toHexString(mPid) +
"\n手机型号:" + AppPhoneInfoUtils.getPhoneInfo() + " " + AppPhoneInfoUtils.getBrand() +
"\n手机系统:" + AppPhoneInfoUtils.getSystemVersionString()+
"\n手机电量:" + systemBattery;
L.iw(appData);

String logPath = L.getDefaultLogPath(mContext);
String logName = L.getDefaultLogName();
File file = new File(logPath, logName);
Uri uriForFile = FileProvider7.getUriForFile(mContext, file);
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
sendIntent.putExtra(Intent.EXTRA_STREAM, uriForFile);
sendIntent.setType("*/*");
startActivity(sendIntent);
}

}

+ 0
- 209
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BloodGlucoseActivity.java Просмотреть файл

@@ -1,209 +0,0 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid;

import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.ListView;
import android.widget.RadioButton;

import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.bean.SupportUnitBean;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.OnCallbackBle;

import java.util.ArrayList;
import java.util.List;

import cn.net.aicare.modulelibrary.module.BloodGlucose.BloodGlucoseBleDeviceData;
import cn.net.aicare.modulelibrary.module.BloodGlucose.BloodGlucoseUtil;

public class BloodGlucoseActivity extends aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity implements OnCallbackBle ,BloodGlucoseBleDeviceData.BloodGlucoseCallback{

private Button support_unit, quest_status,showdata;
private RadioButton mmol, mg;
private ListView log_list;

private List<String> mLogList;
private ArrayAdapter listAdapter;
private String mAddress;
private boolean isShowData=false;
private BloodGlucoseBleDeviceData mBloodGlucoseBleDeviceData;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_blood_glucose);
mAddress = getIntent().getStringExtra("mac");
support_unit = findViewById(R.id.support_unit);
quest_status = findViewById(R.id.quest_status);
showdata=findViewById(R.id.showdata);
mmol = findViewById(R.id.mmol);
mg = findViewById(R.id.mg);
log_list = findViewById(R.id.log_list);
mLogList = new ArrayList<>();
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mLogList);
log_list.setAdapter(listAdapter);
mmol.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked)
if (mBloodGlucoseBleDeviceData != null)
mBloodGlucoseBleDeviceData.setUnit(BloodGlucoseUtil.UNIT_MMOL_L);
}
});
mg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked)
if (mBloodGlucoseBleDeviceData != null)
mBloodGlucoseBleDeviceData.setUnit(BloodGlucoseUtil.UNIT_MG_DL);
}
});
showdata.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!isShowData){
showdata.setText("隐藏Data数据");
isShowData=true;
}else {
showdata.setText("显示Data数据");
isShowData=false;
}
}
});
quest_status.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mBloodGlucoseBleDeviceData != null)
mBloodGlucoseBleDeviceData.queryStatus();
}
});

}

@Override
public void onServiceSuccess() {
mLogList.add(0, "绑定服务成功");
listAdapter.notifyDataSetChanged();
if (mAILinkBleManager != null) {
mAILinkBleManager.setOnCallbackBle(this);
BleDevice bleDevice = mAILinkBleManager.getBleDevice(mAddress);
if (bleDevice != null) {
mBloodGlucoseBleDeviceData = new BloodGlucoseBleDeviceData(bleDevice);
mBloodGlucoseBleDeviceData.setBloodGlucoseCallback(this);
}
}
}

@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {

}


@Override
public void onVersion(String version) {
mLogList.add(0, "版本号:"+version);
listAdapter.notifyDataSetChanged();
}

@Override
public void onSupportUnit(List<SupportUnitBean> list) {
mLogList.add(0, "支持单位:");
for (SupportUnitBean supportUnitBean:list) {
mLogList.add(0, supportUnitBean.toString());
}
listAdapter.notifyDataSetChanged();
}

@Override
public void onDeviceStatus(int status) {
switch (status){
case BloodGlucoseUtil.STATUS_STATELESS:
mLogList.add(0,status+" 无状态");
break;
case BloodGlucoseUtil.STATUS_WAIT_TEST_PAPER:
mLogList.add(0,status+" 设备等待插入试纸");
break;
case BloodGlucoseUtil.STATUS_WAIT_BLOOD_SAMPLES:
mLogList.add(0,status+" 设备已插入试纸,等待获取血样");
break;
case BloodGlucoseUtil.STATUS_ANALYSIS_BLOOD_SAMPLES:
mLogList.add(0,status+" 血样已获取,分析血样中");
break;

case BloodGlucoseUtil.STATUS_TEST_FINISH:
mLogList.add(0,status+" 上发数据完成,测量完成");
break;
}
listAdapter.notifyDataSetChanged();
}

@Override
public void onResult(int originalValue, float value, int unit, int decimal) {
mLogList.add(0,"原始数据:"+originalValue+" 值:"+value+" 单位:"+unit+" 小数点位:"+decimal);
listAdapter.notifyDataSetChanged();
}

@Override
public void onErrorCode(int code) {
switch (code){
case BloodGlucoseUtil.ERROR_CODE_NO_ELECTRICITY:
mLogList.add(0,code+" 电池没电");
break;
case BloodGlucoseUtil.ERROR_CODE_USED_TEST_PAPER:
mLogList.add(0,code+" 已使用过的试纸");
break;
case BloodGlucoseUtil.ERROR_CODE_TEMPERATURE_OUT_OF_RANGE:
mLogList.add(0,code+" 环境温度超出使用范围");
break;
case BloodGlucoseUtil.ERROR_CODE_WITHDRAWN_TEST_PAPER:
mLogList.add(0,code+" 试纸施加血样后测试未完成,被退出试纸");
break;
case BloodGlucoseUtil.ERROR_CODE_SELF_CHECK_FAIL:
mLogList.add(0,code+" 机器自检未通过");
break;
case BloodGlucoseUtil.ERROR_CODE_RESULT_LOWER:
mLogList.add(0,code+" 测量结果过低,超出测量范围");
break;
case BloodGlucoseUtil.ERROR_CODE_RESULT_OVERTOP:
mLogList.add(0,code+" 测量结果过高,超出测量范围");
break;
default:
mLogList.add(0,"错误码:"+code);
break;
}
listAdapter.notifyDataSetChanged();
}

@Override
public void onSetUnitResult(int result) {
switch (result){
case BloodGlucoseUtil.SUCCESS:
mLogList.add(0,result+" 成功");
break;
case BloodGlucoseUtil.FAILED:
mLogList.add(0,result+" 失败");
break;
case BloodGlucoseUtil.NONSUPPORT:
mLogList.add(0,result+" 不支持");
break;
}
listAdapter.notifyDataSetChanged();

}

@Override
public void onData(String data) {
if (isShowData)
mLogList.add(0,data);
}
}

+ 28
- 11
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/EightBodyfatActivity.java Просмотреть файл

@@ -19,6 +19,7 @@ import java.util.List;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.EightBodyFatAlgorithms;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.EightBodyFatBean;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L;
import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatBleDeviceData;
import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatUtil;

@@ -43,6 +44,21 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic
loglist = new ArrayList<>();
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, loglist);
log_list.setAdapter(listAdapter);

weight = 60;
if (mEightBodyfatAdc == null) {
mEightBodyfatAdc = new EightBodyfatAdc();
}
mEightBodyfatAdc.setAdcFoot(5784349);
mEightBodyfatAdc.setAdcHand(5121114);
mEightBodyfatAdc.setAdcLeftHand(12854746);
mEightBodyfatAdc.setAdcRightHand(15738341);
mEightBodyfatAdc.setAdcLeftFoot(1074604);
mEightBodyfatAdc.setAdcRightFoot(13046299);
mEightBodyfatAdc.setAdcLeftBody(7480094);
mEightBodyfatAdc.setAdcRightBody(7480094);
kaimengJieMi(mEightBodyfatAdc);

}


@@ -135,7 +151,7 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic

@Override
public void unbindServices() {
if (mAILinkBleManager !=null) {
if (mAILinkBleManager != null) {
mAILinkBleManager.removeOnCallbackBle(this);
}
}
@@ -243,7 +259,9 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic
case EightBodyFatUtil.MEASUREMENT_END:
loglist.add(0, "测量完成");
//测量完成
if (mEightBodyfatAdc!=null)kaimengJieMi(mEightBodyfatAdc);
if (mEightBodyfatAdc != null) {
kaimengJieMi(mEightBodyfatAdc);
}

break;
case EightBodyFatUtil.MUC_CALL_BACK_RESULT:
@@ -300,7 +318,7 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic
} else if (state == EightBodyFatUtil.WEIGHT_STABILIZATION_WEIGHT) {
stateStr = "稳定体重";
}
this.weight=weight;
this.weight = weight;
if (unit == EightBodyFatUtil.ST) {
loglist.add(0, "测量状态:" + state + stateStr + " 体重:" + EightBodyFatUtil.lbtostlb(weight) + " 体重单位:" + unit + " 小数点位" + decimal);
} else {
@@ -311,7 +329,7 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic
@Override
public void onImpedance(int adc, int part, int arithmetic) {
loglist.add(0, "阻抗:" + adc + " 部位: " + part + " 算法" + arithmetic);
kaimeng(part,adc,arithmetic);
kaimeng(part, adc, arithmetic);
}

@Override
@@ -347,7 +365,7 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic

private EightBodyfatAdc mEightBodyfatAdc;

private void kaimeng(int part, int adc,int algorithms) {
private void kaimeng(int part, int adc, int algorithms) {
if (mEightBodyfatAdc == null) {
mEightBodyfatAdc = new EightBodyfatAdc();
}
@@ -412,16 +430,15 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic
}

private void kaimengJieMi(EightBodyfatAdc mEightBodyfatAdc) {
loglist.add(0,mEightBodyfatAdc.toString());
loglist.add(0, "默认传入用户: 性别:男,身高:180,年龄27,"+"weight "+weight+"kg");
EightBodyFatBean algorithmsData =
EightBodyFatAlgorithms.getInstance().getAlgorithmsData(mEightBodyfatAdc.getAlgorithms(), 1, 180, weight, 27, mEightBodyfatAdc);
loglist.add(0, mEightBodyfatAdc.toString());
loglist.add(0, "默认传入用户: 性别:男,身高:180,年龄27," + "weight " + weight + "kg");
EightBodyFatBean algorithmsData = EightBodyFatAlgorithms.getInstance()
.getAlgorithmsData(mEightBodyfatAdc.getAlgorithms(), 1, 180, weight, 27, mEightBodyfatAdc);
// EightBodyFatBean algorithmsData =
// EightBodyFatAlgorithms.getInstance().getAlgorithmsData(2, 0, 165, weight, 27, mEightBodyfatAdc);
loglist.add(0, algorithmsData.toString());
L.i("算法结果" + algorithmsData.toString());
}



}

+ 2
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/HeightCmdActivity.java Просмотреть файл

@@ -26,12 +26,12 @@ import com.pingwang.bluetoothlib.listener.OnMcuParameterListener;
import com.pingwang.bluetoothlib.utils.BleDensityUtil;
import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;

import java.util.ArrayList;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import cn.net.aicare.modulelibrary.module.height.HeightDeviceData;



+ 0
- 656
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/MainActivity.java Просмотреть файл

@@ -1,656 +0,0 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid;

import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.view.View;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import com.besthealth.bhBodyComposition120.BhBodyComposition;
import com.pingwang.bluetoothlib.AILinkBleManager;
import com.pingwang.bluetoothlib.AILinkSDK;
import com.pingwang.bluetoothlib.bean.AilinkLicenseBean;
import com.pingwang.bluetoothlib.utils.BleLog;

import java.util.ArrayList;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.config.AppConfig;
import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.find.FindDeviceNewActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.body_scale_4g.BodyScale4GActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.broadcast_height.BroadcastHeightActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.broadcast_nutrition.BroadNutritionActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.broadcast_weight_sacle.BroadcastWeightScaleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.leaone_broadcast.LeaOneBroadcastActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ropeskipping.RopeSkippingSetActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.AppStart;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.SP;


public class MainActivity extends AppCompatActivity {


private static String TAG = MainActivity.class.getName();
private List<View> mList = new ArrayList<>();
private Context mContext;
private Handler mHandler = new Handler(Looper.getMainLooper());

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = this;
initView();
initData();
initListener();
int bodyComposition = new BhBodyComposition().getBodyComposition();
L.i("bodyComposition:" + bodyComposition);

// Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:10086"));
// Method setDefaultSim = null;
// try {
// setDefaultSim = TelephonyManager.class.getDeclaredMethod("setDefaultSim", Context.class, int.class, int.class);
// setDefaultSim.invoke(null, this, 0, 0);
// } catch (NoSuchMethodException e) {
// e.printStackTrace();
// } catch (IllegalAccessException e) {
// e.printStackTrace();
// } catch (InvocationTargetException e) {
// e.printStackTrace();
// }
// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// startActivity(intent);
}


protected void initListener() {
String version = getString(R.string.version) + ":" + BuildConfig.VERSION_NAME;
((TextView) findViewById(R.id.tv_app_version)).setText(version);
ActionBar supportActionBar = getSupportActionBar();
if (supportActionBar != null)
supportActionBar.setTitle(getString(R.string.app_name) + BuildConfig.VERSION_NAME);
findViewById(R.id.btn_about).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(mContext, AboutActivity.class));
}
});


MyListener listener = new MyListener();

// Button btn_shpy = findViewById(R.id.btn_sphy);
// Button btn_tempgun = findViewById(R.id.btn_tempgun);
// Button btn_temp = findViewById(R.id.btn_temp);
// Button btn_baby = findViewById(R.id.btn_baby);
// Button btn_height = findViewById(R.id.btn_height);
// Button btn_ble = findViewById(R.id.btn_ble);
// Button btn_weightScale = findViewById(R.id.btn_lock);
// Button btn_ble_test = findViewById(R.id.btn_ble_test);
// Button btnConnectTest = findViewById(R.id.btnConnectTest);
// Button btn_ad_weight = findViewById(R.id.btn_ad_weight);
// Button btn_ble_weight = findViewById(R.id.btn_ble_weight);
// Button btn_wifi_ble_tooth = findViewById(R.id.btn_wifi_ble_tooth);
// Button wifi_config = findViewById(R.id.wifi_config);
// Button eight_scale = findViewById(R.id.eight_scale);
// Button btn_ota = findViewById(R.id.btn_ota);
// Button btn_wristband = findViewById(R.id.btn_wristband);
// Button glucometer = findViewById(R.id.glucometer);
// Button btn_broadcast_scale = findViewById(R.id.btn_broadcast_scale);
// Button btn_broadcast_blood_oxygen = findViewById(R.id.btn_broadcast_blood_oxygen);
// Button btn_smart_mask = findViewById(R.id.btn_smart_mask);
// Button btn_bld = findViewById(R.id.btn_bld);
// Button btn_bleBo = findViewById(R.id.btn_bleBo);
// Button btn_coffeeScale = findViewById(R.id.btn_coffeeScale);
// Button btn_scooter = findViewById(R.id.btn_scooter);
// Button btn_shareCharger = findViewById(R.id.btn_shareCharger);
// Button btn_transmission = findViewById(R.id.btn_transmission);
// Button btn_wifi_ble_weight = findViewById(R.id.btn_wifi_ble_weight);
// Button btn_baby_body_fat = findViewById(R.id.btn_baby_body_fat);
mList.add(findViewById(R.id.btn_sphy));
mList.add(findViewById(R.id.btn_sphy_wifi_ble));
mList.add(findViewById(R.id.btn_tempgun));
mList.add(findViewById(R.id.btn_temp));
mList.add(findViewById(R.id.btn_baby));
mList.add(findViewById(R.id.btn_height));
mList.add(findViewById(R.id.btn_ble));
// mList.add(findViewById(R.id.btn_lock));
mList.add(findViewById(R.id.btn_ble_test));
mList.add(findViewById(R.id.btnConnectTest));
mList.add(findViewById(R.id.btn_ad_weight));
mList.add(findViewById(R.id.btn_ble_weight));
mList.add(findViewById(R.id.btn_wifi_ble_tooth));
mList.add(findViewById(R.id.wifi_config));
mList.add(findViewById(R.id.eight_scale));
mList.add(findViewById(R.id.btn_ota));
mList.add(findViewById(R.id.glucometer));
mList.add(findViewById(R.id.btn_broadcast_scale));
mList.add(findViewById(R.id.btn_broadcast_blood_oxygen));
mList.add(findViewById(R.id.btn_smart_mask));
mList.add(findViewById(R.id.btn_bld));
mList.add(findViewById(R.id.btn_bleBo));
mList.add(findViewById(R.id.btn_coffeeScale));
mList.add(findViewById(R.id.btn_scooter));
mList.add(findViewById(R.id.btn_shareCharger));
mList.add(findViewById(R.id.btn_share_socket));
mList.add(findViewById(R.id.btn_transmission));
mList.add(findViewById(R.id.btn_wifi_ble_weight));
mList.add(findViewById(R.id.btn_baby_body_fat));
mList.add(findViewById(R.id.btn_broadcast_height));
mList.add(findViewById(R.id.btn_hbfs));
mList.add(findViewById(R.id.btn_find));
mList.add(findViewById(R.id.btn_4g_bs));
mList.add(findViewById(R.id.btn_clear_shake_hands));
mList.add(findViewById(R.id.btn_food_temp));
mList.add(findViewById(R.id.btn_temp_humidity));
mList.add(findViewById(R.id.btn_share_condom));
mList.add(findViewById(R.id.btn_rope_skip));
mList.add(findViewById(R.id.btn_broadcast_nutrition));
mList.add(findViewById(R.id.btn_ble_nutrition));
mList.add(findViewById(R.id.btn_toothbrush_test));
mList.add(findViewById(R.id.btn_leaone_broadcast));
mList.add(findViewById(R.id.btn_fascia_gun));
mList.add(findViewById(R.id.btn_blood_pressure_tc));
mList.add(findViewById(R.id.btn_body_scale_4g));
mList.add(findViewById(R.id.btn_scooter_cm02));
mList.add(findViewById(R.id.btn_temp_instrument));
mList.add(findViewById(R.id.btn_public_ble_network));
mList.add(findViewById(R.id.btn_rope_skipping_set_mode));
mList.add(findViewById(R.id.btn_air_detector));
mList.add(findViewById(R.id.btn_mqtt_air_detector));
mList.add(findViewById(R.id.btn_mqtt));
mList.add(findViewById(R.id.btn_wifi_ble_noise_meter));
mList.add(findViewById(R.id.btn_ble_noise_meter));
mList.add(findViewById(R.id.btn_meat_probe_charger));
mList.add(findViewById(R.id.btn_weight_scale));
mList.add(findViewById(R.id.btn_broadcast_scale_weight));
mList.add(findViewById(R.id.btn_meat_probe));
mList.add(findViewById(R.id.btn_barometric_temp_humidity));
for (View view : mList) {
view.setOnClickListener(listener);
}
List<Integer> showViewId = AppConfig.SHOW_VIEW_ID;
if (showViewId != null) {
for (View view : mList) {
view.setVisibility(View.GONE);
}
for (Integer integer : showViewId) {
findViewById(integer).setVisibility(View.VISIBLE);
}
}
findViewById(R.id.btn_rope_skipping_set_mode).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(mContext, RopeSkippingSetActivity.class));


// Intent intent = new Intent();
// intent.setAction("android.media.action.STILL_IMAGE_CAMERA");
// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// startActivity(intent);
//
// mHandler.postDelayed(new Runnable() {
// @Override
// public void run() {
// try {
// L.i("按下音量+ start");
// String keyCommand = "input keyevent " + KeyEvent.KEYCODE_VOLUME_UP;
// Runtime runtime = Runtime.getRuntime();
// Process proc = runtime.exec(keyCommand);
// L.i("按下音量+ stop"+proc.toString());
// } catch (IOException e) {
// e.printStackTrace();
// }
//
// }
// }, 5000);

}
});

// AILinkBleManager.getInstance().init(mContext, new AILinkBleManager.onInitListener() {
// @Override
// public void onInitSuccess() {
// L.i("初始化成功");
// AILinkBleManager.getInstance().startScan(1000);
// AILinkBleManager.getInstance().setOnCallbackBle(new OnCallbackBle() {
// @Override
// public void onScanning(BleValueBean data) {
// L.i("当前搜索到的设备:"+data.getName()+" mac="+data.getMac());
// AILinkBleManager.getInstance().stopScan();
// AILinkBleManager.getInstance().connectDevice(data);
// }
//
// @Override
// public void onServicesDiscovered(String mac) {
// L.i("连接成功:"+mac);
// }
// });
//
// }
//
// @Override
// public void onInitFailure() {
// L.i("初始化失败");
// }
// });

}

protected void initData() {
initPermissions();
List<AilinkLicenseBean> list = new ArrayList<>();
list.add(new AilinkLicenseBean(0x2F, 0x03, 0x09));
AILinkSDK.getInstance().initLicense(list);
}

protected void initView() {
BleLog.init(true);
//connectDevice(BleValueBean bleValueBean);连接的时候需要传广播对象,否则返回的cid,vid,pid始终都是0
//sdk
AILinkSDK.getInstance().init(mContext);
AILinkBleManager.getInstance().init(mContext, new AILinkBleManager.onInitListener() {
@Override
public void onInitSuccess() {
AILinkBleManager.getInstance().startScan(0);
}

@Override
public void onInitFailure() {

}
});
SP.init(this);
}

private class MyListener implements View.OnClickListener {
@Override
public void onClick(View v) {
// boolean onClick= initPermissions();
// if (!onClick){
// return;
// }
int type = 0;
switch (v.getId()) {

case R.id.btn_clear_shake_hands:
type = BleDeviceConfig.CLEAR_SHAKE_HANDS;
break;

case R.id.btn_sphy:
type = BleDeviceConfig.BLOOD_PRESSURE;
break;
case R.id.btn_sphy_wifi_ble:
type = BleDeviceConfig.SPHY_WIFI_BLE;
break;
case R.id.btn_tempgun:
type = BleDeviceConfig.INFRARED_THERMOMETER;
break;
case R.id.btn_temp:
type = BleDeviceConfig.THERMOMETER;
break;
case R.id.btn_baby:
type = BleDeviceConfig.BABY_SCALE;
break;
case R.id.btn_height:
type = BleDeviceConfig.HEIGHT_METER;
break;
case R.id.btn_lock:
type = BleDeviceConfig.SMART_LOCK;
break;
case R.id.btn_ad_weight:
type = BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_AD;
break;
case R.id.btn_wifi_ble_weight:
type = BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_WIFI_BLE;
break;
case R.id.btn_wifi_ble_tooth:
type = BleDeviceConfig.TOOTHBRUSH_WIFI_BLE;
break;
case R.id.btn_ble_weight:
type = BleDeviceConfig.WEIGHT_BODY_FAT_SCALE;
break;
case R.id.glucometer:
type = BleDeviceConfig.BLOOD_GLUCOSE;
break;
case R.id.btn_baby_body_fat:
type = BleDeviceConfig.BABY_BODY_FAT;
break;
case R.id.btn_temp_instrument:
type = BleDeviceConfig.TEMP_INSTRUMENT;
break;
case R.id.btn_mqtt_air_detector:
type = BleDeviceConfig.MQTT_AIR_DETECTOR;
break;
case R.id.btn_air_detector:
type = BleDeviceConfig.AIR_DETECTOR;
break;
case R.id.btn_broadcast_scale:
Intent intentBroadcast = new Intent(MainActivity.this, BroadcastScaleActivity.class);
startActivity(intentBroadcast);
return;
case R.id.btn_broadcast_scale_weight:
Intent intentBroadcastWeight = new Intent(MainActivity.this, BroadcastWeightScaleActivity.class);
startActivity(intentBroadcastWeight);
return;
case R.id.btn_broadcast_blood_oxygen:
Intent intentBloodOxygen = new Intent(MainActivity.this, BroadcastBloodOxygenActivity.class);
startActivity(intentBloodOxygen);
return;

case R.id.btn_smart_mask:
type = BleDeviceConfig.SMART_MASK;
break;
case R.id.btn_bleBo:
type = BleDeviceConfig.BLE_BOOLD_OXYGEN;
break;
// case R.id.btn_bld:
// type = BleDeviceConfig.BLD_WEIGHT;
// break;
case R.id.btn_ble:
type = -1;
break;
case R.id.btn_ble_test:
type = -2;
break;
case R.id.btn_ota:
type = -3;
break;

case R.id.btn_transmission:
type = -4;
break;
case R.id.btn_blood_pressure_tc:
// 血压计透传
type = -10;
break;
case R.id.eight_scale:
type = BleDeviceConfig.EIGHT_BODY_FAT_SCALE;
break;
case R.id.btnConnectTest:
Intent intent = new Intent(MainActivity.this, ConnectBleTestActivity.class);
startActivity(intent);
return;
case R.id.wifi_config:
Intent intent1 = new Intent(MainActivity.this, WifiConfigActivity.class);
startActivity(intent1);
return;
case R.id.btn_coffeeScale:
// 咖啡秤
type = BleDeviceConfig.COFFEE_SCALE;
break;
case R.id.btn_scooter:
type = BleDeviceConfig.SMART_SCOOTER;
break;
case R.id.btn_shareCharger:
// 共享充电器
type = BleDeviceConfig.SHARE_CHARGER;
break;
case R.id.btn_share_socket:
// 共享插座
type = BleDeviceConfig.SHARE_SOCKET;
break;
case R.id.btn_share_condom:
// 共享插座
type = BleDeviceConfig.SHARE_CONDOM;
break;
case R.id.btn_find:
// 寻物器
Intent findDeviceActivity = new Intent(MainActivity.this, FindDeviceNewActivity.class);
startActivity(findDeviceActivity);
return;

case R.id.btn_broadcast_height:
// 广播身高仪
Intent intentBroadcastHeight = new Intent(MainActivity.this, BroadcastHeightActivity.class);
startActivity(intentBroadcastHeight);
return;
case R.id.btn_4g_bs:
// 4G 血糖仪
Intent bloodSugar4GIntent = new Intent(MainActivity.this, BloodSugar4GActivity.class);
startActivity(bloodSugar4GIntent);
return;
case R.id.btn_food_temp:
// 食品温度计
type = BleDeviceConfig.FOOD_TEMP;
break;
case R.id.btn_hbfs:
type = BleDeviceConfig.HEIGHT_BODY_FAT;
break;
case R.id.btn_temp_humidity:
type = BleDeviceConfig.TEMP_Humidity;
break;
case R.id.btn_rope_skip:
type = BleDeviceConfig.ROPE_SKIPPING;
break;
case R.id.btn_broadcast_nutrition:
// 广播营养秤
Intent broadcastNutritionIntent = new Intent(MainActivity.this, BroadNutritionActivity.class);
startActivity(broadcastNutritionIntent);
return;
case R.id.btn_ble_nutrition:
// 蓝牙营养秤
type = BleDeviceConfig.BLE_NUTRITION_SCALE;
break;
case R.id.btn_toothbrush_test:
// 牙刷测试
type = BleDeviceConfig.TOOTHBRUSH_TEST;
break;
case R.id.btn_leaone_broadcast:
// LeaOne 广播秤
Intent broadcastLeaOneIntent = new Intent(MainActivity.this, LeaOneBroadcastActivity.class);
startActivity(broadcastLeaOneIntent);
return;
case R.id.btn_fascia_gun:
// 筋膜枪
type = BleDeviceConfig.FASCIA_GUN;
break;
case R.id.btn_scooter_cm02:
type = BleDeviceConfig.SMART_SCOOTER_CM02;
break;
case R.id.btn_body_scale_4g:
// 4G 体脂秤
Intent bodyScaleIntent = new Intent(MainActivity.this, BodyScale4GActivity.class);
startActivity(bodyScaleIntent);
return;

case R.id.btn_public_ble_network:
// BLE通用配网
type = BleDeviceConfig.PUBLIC_BLE_NETWORK;
break;

case R.id.btn_wifi_ble_noise_meter:
// wifi+ble噪音计
type = BleDeviceConfig.WIFI_BLE_NOISE_METER;
break;
case R.id.btn_ble_noise_meter:
// ble噪音计
type = BleDeviceConfig.BLE_NOISE_METER;
break;
case R.id.btn_meat_probe_charger:
//食物探针充电盒
type = BleDeviceConfig.MEAT_PROBE_CHARGER;
break;
case R.id.btn_weight_scale:
//体重秤
type = BleDeviceConfig.WEIGHT_SCALE;
break;
case R.id.btn_meat_probe:
// 食物探针
type = BleDeviceConfig.MEAT_PROBE;
break;
case R.id.btn_barometric_temp_humidity:
type = BleDeviceConfig.BAROMETRIC_TEMP_HUMIDITY;
break;
case R.id.btn_mqtt:

return;
default:
return;
}
startActivity(type);
}
}


private void startActivity(int type) {
Intent intent = new Intent(this, ShowBleActivity.class);
intent.putExtra("type", type);
startActivity(intent);
}

@Override
protected void onResume() {
super.onResume();

}

@Override
protected void onDestroy() {
super.onDestroy();
BleLog.quit();
}


//-----------------------权限----------------------------------------
/**
* 需要申请的权限
*/
private String[] LOCATION_PERMISSION = new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.WRITE_EXTERNAL_STORAGE};
private final static String[] BLUETOOTH_PERMISSION = new String[]{Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.BLUETOOTH_ADVERTISE, Manifest.permission.BLUETOOTH_CONNECT};
/**
* 权限请求返回
*/
private final int PERMISSION = 101;
/**
* 定位服务返回
*/
protected final int LOCATION_SERVER = 102;
private HintDataDialogFragment mHintDataDialog = null;

protected void initPermissions() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
onPermissionsOk();
return;
}

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
if (ContextCompat.checkSelfPermission(this, LOCATION_PERMISSION[0]) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, LOCATION_PERMISSION, PERMISSION);
} else {
boolean bleStatus = AppStart.isLocServiceEnable(mContext);
if (!bleStatus) {
//没有开启定位服务
mHintDataDialog = HintDataDialogFragment.newInstance()
.setTitle("提示", 0)
.setCancel("取消", 0)
.setOk("确定", 0)
.setContent("请求开启定位服务", true)
.setOnDialogListener(new HintDataDialogFragment.onDialogListener() {
@Override
public void onSucceedListener(View v) {
startLocationActivity();
}
});
mHintDataDialog.show(getSupportFragmentManager());


} else {
onPermissionsOk();
}
}
} else {
if (ContextCompat.checkSelfPermission(this, BLUETOOTH_PERMISSION[0]) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, BLUETOOTH_PERMISSION, PERMISSION);
}
}


}


@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);

//请求权限被拒绝
if (requestCode != PERMISSION)
return;

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
initPermissions();
} else {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, LOCATION_PERMISSION[0])) {
//权限请求失败,但未选中“不再提示”选项,再次请求
ActivityCompat.requestPermissions(this, LOCATION_PERMISSION, PERMISSION);
} else {
//权限请求失败,选中“不再提示”选项
mHintDataDialog = HintDataDialogFragment.newInstance()
.setTitle("提示", 0)
.setCancel("取消", 0)
.setOk("确定", 0)
.setContent("请求开启定位权限", true)
.setOnDialogListener(new HintDataDialogFragment.onDialogListener() {
@Override
public void onSucceedListener(View v) {
AppStart.startUseSetActivity(mContext);
}
});
mHintDataDialog.show(getSupportFragmentManager());

}

}
} else {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
initPermissions();
}
}


}


/**
* 启动去设置定位服务
*/
protected void startLocationActivity() {

AppStart.startLocationActivity(this, LOCATION_SERVER);

}


/**
* 权限ok
*/
protected void onPermissionsOk() {

}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == LOCATION_SERVER) {
//定位服务页面返回
initPermissions();
}
}

}

+ 20
- 198
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ShowBleActivity.java Просмотреть файл

@@ -34,7 +34,6 @@ import com.pingwang.bluetoothlib.config.BleConfig;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import com.pingwang.bluetoothlib.listener.OnScanFilterListener;
import com.pingwang.bluetoothlib.server.ELinkBleServer;
import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;

@@ -47,28 +46,9 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.LoadingIosDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.find.FindDeviceNewActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.PublicBleNetworkCmdActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.TempInstrument.TempInstrumentActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.airdetector.AirDetectorActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.barometric_temp_humidity.BarometricTempHygrometerActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_nutrition.BleNutritionActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.blood_pressure_tc.BloodPressureTcActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.coffee_scale.CoffeeScaleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.fascia_gun.FasciaGunActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.food_temp.FoodTempActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.meat_probe.MeatProbeActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.meat_probe_charger.MeatProbeChargerActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.noise_meter.BleNoiseMeterActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.noise_meter.WifiBleNoiseMeterActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ropeskipping.RopeSkippingActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_charger.ShareChargerActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_condom.ShareCondomActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_socket.ShareSocketActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.home.HomeDataManager;
import aicare.net.cn.sdk.ailinksdkdemoandroid.home.MainActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.toothbrush.ToothBrushWifiBleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.toothbrush_test.ToothbrushTestActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.weight_scale.WeightScaleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.wifible_sphy.WifiBleSphyActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.CheckPermissionUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.view.MyItemDecoration;
import cn.net.aicare.modulelibrary.module.RopeSkipping.RopeSkippingBleData;
@@ -103,6 +83,7 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O
private int mPid;
private int mScanCid = 0;
private String mBleName;
private Class<?> targetClass;
private Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
@@ -126,26 +107,29 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show_ble);
ActionBar supportActionBar = getSupportActionBar();
if (supportActionBar != null)
if (supportActionBar != null) {
supportActionBar.setTitle(getString(R.string.app_name) + BuildConfig.VERSION_NAME);
Intent mUserService = new Intent(this.getApplicationContext(), ELinkBleServer.class);
//核心用户服务
startService(mUserService);
}
mContext = this;
mType = getIntent().getIntExtra("type", 0);
mCid = getIntent().getIntExtra("cid", 0);
if (0 == mType) {
finish();
return;
}
mScanCid = mType;
mScanCid = mCid;
targetClass = HomeDataManager.getTargetActivityClass(mType);
if (targetClass == null) {
return;
}
init();
initData();

// 如果是蓝牙牙刷,就弹个框提醒
if (mType == BleDeviceConfig.TOOTHBRUSH_TEST) {
if (mCid == BleDeviceConfig.TOOTHBRUSH_TEST) {
new AlertDialog.Builder(mContext).setMessage("启动牙刷,工作10秒钟,然后关闭牙刷(让牙刷处于广播状态),然后点击搜索,选中列表中的牙刷,开始测试")
.setPositiveButton("确认", null)
.show();
.setPositiveButton("确认", null)
.show();
}
}

@@ -269,8 +253,10 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O
}
} else if (mCid == BleDeviceConfig.MEAT_PROBE_CHARGER) {
//探针充电盒握手
BleConfig.setHandshakeStatus(mac, true, mCid, mVid, mPid);
mNoEncryptionMac = mac;
if (mVid == 0x54) {
BleConfig.setHandshakeStatus(mac, true, mCid, mVid, mPid);
mNoEncryptionMac = mac;
}
}
if (mAILinkBleManager != null) {
mAILinkBleManager.stopScan();
@@ -383,172 +369,8 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O
dismissLoading();
Intent intent = new Intent();
int type = mType;//默认婴儿秤
switch (type) {
case BleDeviceConfig.BABY_SCALE:
intent.setClass(ShowBleActivity.this, BabyCmdActivity.class);
break;
case BleDeviceConfig.INFRARED_THERMOMETER:
intent.setClass(ShowBleActivity.this, TempGunCmdActivity.class);
break;
case BleDeviceConfig.BLOOD_PRESSURE:
intent.setClass(ShowBleActivity.this, SphyCmdActivity.class);
break;
case BleDeviceConfig.SPHY_WIFI_BLE:
intent.setClass(ShowBleActivity.this, WifiBleSphyActivity.class);
break;
case BleDeviceConfig.THERMOMETER:
intent.setClass(ShowBleActivity.this, TempCmdActivity.class);
break;
case BleDeviceConfig.HEIGHT_METER:
intent.setClass(ShowBleActivity.this, HeightCmdActivity.class);
break;
case BleDeviceConfig.WEIGHT_BODY_FAT_SCALE:
intent.setClass(ShowBleActivity.this, WeightScaleBleActivity.class);
break;
case BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_AD:
intent.setClass(ShowBleActivity.this, ADWeightScaleCmdActivity.class);
break;
case BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_WIFI_BLE:
intent.setClass(ShowBleActivity.this, WeightScaleWifiBleActivity.class);
break;
case BleDeviceConfig.TOOTHBRUSH_WIFI_BLE:
intent.setClass(ShowBleActivity.this, ToothBrushWifiBleActivity.class);
break;
case BleDeviceConfig.EIGHT_BODY_FAT_SCALE:
intent.setClass(ShowBleActivity.this, EightBodyfatActivity.class);
break;
case BleDeviceConfig.BLOOD_GLUCOSE:
intent.setClass(ShowBleActivity.this, BloodGlucoseActivity.class);
break;
case BleDeviceConfig.BABY_BODY_FAT:
intent.setClass(ShowBleActivity.this, BabyBodyFatCmdActivity.class);
break;
case BleDeviceConfig.SMART_MASK:
intent.setClass(ShowBleActivity.this, SmartMaskActivity.class);
break;

case BleDeviceConfig.SMART_SCOOTER_CM02:
intent.setClass(ShowBleActivity.this, AiLinkScooterActivity.class);
break;

case BleDeviceConfig.BLE_BOOLD_OXYGEN:
intent.setClass(ShowBleActivity.this, BloodOxygenActivity.class);
break;
case BleDeviceConfig.COFFEE_SCALE:
// 咖啡秤
intent.setClass(ShowBleActivity.this, CoffeeScaleActivity.class);
break;
case BleDeviceConfig.SHARE_CHARGER:
// 共享充电器
intent.setClass(ShowBleActivity.this, ShareChargerActivity.class);
break;
case BleDeviceConfig.SHARE_SOCKET:
// 共享插座
intent.setClass(ShowBleActivity.this, ShareSocketActivity.class);
break;
case BleDeviceConfig.SHARE_CONDOM:
// 共享套套机
intent.setClass(ShowBleActivity.this, ShareCondomActivity.class);
break;
case BleDeviceConfig.FIND_DEVICE:
// 寻物器
// intent.setClass(ShowBleActivity.this, FindDeviceActivity.class);
intent.setClass(ShowBleActivity.this, FindDeviceNewActivity.class);
BleConfig.setHandshakeStatus(mac, false);
break;
case BleDeviceConfig.FOOD_TEMP:
// 食品温度计
intent.setClass(ShowBleActivity.this, FoodTempActivity.class);
break;
case BleDeviceConfig.HEIGHT_BODY_FAT:
intent.setClass(ShowBleActivity.this, HeightWeightScaleActivity.class);
break;
case BleDeviceConfig.TEMP_Humidity:
case BleDeviceConfig.TEMP_Humidity_wifi:
intent.setClass(ShowBleActivity.this, TempHumidityActivity.class);
break;
case BleDeviceConfig.ROPE_SKIPPING:
intent.setClass(ShowBleActivity.this, RopeSkippingActivity.class);
break;
case BleDeviceConfig.BLE_NUTRITION_SCALE:
// 蓝牙营养秤
intent.setClass(ShowBleActivity.this, BleNutritionActivity.class);
break;
case BleDeviceConfig.TOOTHBRUSH_TEST:
// 牙刷测试
intent.setClass(ShowBleActivity.this, ToothbrushTestActivity.class);
break;
case BleDeviceConfig.FASCIA_GUN:
// 筋膜枪
intent.setClass(ShowBleActivity.this, FasciaGunActivity.class);
break;
case BleDeviceConfig.TEMP_INSTRUMENT:
// 测温仪
intent.setClass(ShowBleActivity.this, TempInstrumentActivity.class);
break;

case BleDeviceConfig.PUBLIC_BLE_NETWORK:
// 通用配网
intent.setClass(ShowBleActivity.this, PublicBleNetworkCmdActivity.class);
break;
case BleDeviceConfig.AIR_DETECTOR:
case BleDeviceConfig.MQTT_AIR_DETECTOR:
intent.setClass(ShowBleActivity.this, AirDetectorActivity.class);
break;
//wifi+ble噪音计
case BleDeviceConfig.WIFI_BLE_NOISE_METER:
intent.setClass(ShowBleActivity.this, WifiBleNoiseMeterActivity.class);
break;
//ble噪音计
case BleDeviceConfig.BLE_NOISE_METER:
intent.setClass(ShowBleActivity.this, BleNoiseMeterActivity.class);
break;
//探针充电盒
case BleDeviceConfig.MEAT_PROBE_CHARGER:
intent.setClass(ShowBleActivity.this, MeatProbeChargerActivity.class);
break;
//体脂秤
case BleDeviceConfig.WEIGHT_SCALE:
intent.setClass(ShowBleActivity.this, WeightScaleActivity.class);
break;
// case BleDeviceConfig.BLD_WEIGHT:
// intent.setClass(ShowBleActivity.this, BLDWeightScaleBle.class);
// break;
case -1:
intent.setClass(ShowBleActivity.this, BleCmdActivity.class);
break;
case -2:
intent.setClass(ShowBleActivity.this, TestCmdActivity.class);
break;
case -3:
// intent.setClass(ShowBleActivity.this, TestOtaActivity.class);
break;
case -4:
intent.setClass(ShowBleActivity.this, TransmissionActivity.class);
break;
case -10:
// 血压计透传
intent.setClass(ShowBleActivity.this, BloodPressureTcActivity.class);
break;
case BleDeviceConfig.CLEAR_SHAKE_HANDS:
//验证不握手不加密的界面
intent.setClass(ShowBleActivity.this, ClearShakeHandsActivity.class);
break;
//食物探针
case BleDeviceConfig.MEAT_PROBE:
intent.setClass(ShowBleActivity.this, MeatProbeActivity.class);
break;
case BleDeviceConfig.BAROMETRIC_TEMP_HUMIDITY:
// 气压温湿度计
intent.setClass(ShowBleActivity.this, BarometricTempHygrometerActivity.class);
break;
default:

break;

}


intent.setClass(ShowBleActivity.this, targetClass);
mAILinkBleManager.removeOnCallbackBle(this);
intent.putExtra("type", type);
intent.putExtra("mac", mac);
intent.putExtra("cid", mCid);

+ 2
- 3
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/TestCmdActivity.java Просмотреть файл

@@ -25,15 +25,14 @@ import com.pingwang.bluetoothlib.listener.OnCallbackDis;
import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;
import com.pingwang.bluetoothlib.utils.UuidUtils;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.UUID;

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;


/**
* xing<br>

+ 0
- 1
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/WeightScaleBleActivity.java Просмотреть файл

@@ -462,7 +462,6 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl

}


@Override
public void onIpData(String ip) {


+ 11
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/MyApplication.java Просмотреть файл

@@ -2,6 +2,9 @@ package aicare.net.cn.sdk.ailinksdkdemoandroid.base;

import android.app.Application;

import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L;


public class MyApplication extends Application {

private static MyApplication sInstance;
@@ -10,6 +13,14 @@ public class MyApplication extends Application {
public void onCreate() {
super.onCreate();
sInstance = this;
initLog();
}

private void initLog() {
String logPath = L.getDefaultLogPath(this);
String fileName = L.getDefaultLogName();
L.init(logPath, fileName, true);

}

public static MyApplication getInstance(){

+ 0
- 21
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/config/AppConfig.java Просмотреть файл

@@ -1,21 +0,0 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.config;

import java.util.List;

/**
* xing<br>
* 2021/3/5<br>
* java类作用描述
*/
public class AppConfig {

/**
* 是否为客户专用OTA
*/
public static boolean APP_TYPE_OTA=false;
/**
* 支持显示的ID,null表示所有的都显示,ID是按钮的ID不是CID
*/
public static List<Integer> SHOW_VIEW_ID = null;

}

+ 24
- 1
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/config/BleDeviceConfig.java Просмотреть файл

@@ -259,7 +259,22 @@ public class BleDeviceConfig {
public static final int BAROMETRIC_TEMP_HUMIDITY = 0x005C;

//------------------特殊

/**
* Ble通用设置
*/
public static final int BLE_GENERAL_SETTINGS = -1;
/**
* Ble test
*/
public static final int BLE_TEST = -2;
/**
* OTA通用
*/
public static final int OTA = -3;
/**
* 透传
*/
public static final int PENETRATE = -4;

/**
* 验证不握手不加密的id
@@ -269,4 +284,12 @@ public class BleDeviceConfig {
* 通用配网
*/
public final static int PUBLIC_BLE_NETWORK = -7;
/**
* 血压计透传
*/
public static final int SPHYGMOMETER_PENETRATE = -10;
/**
* wifi_ble_OTA
*/
public final static int WIFI_BLE_OTA = -11;
}

+ 0
- 1
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/WifiDialog.java Просмотреть файл

@@ -19,7 +19,6 @@ import androidx.fragment.app.FragmentManager;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;


public class WifiDialog extends DialogFragment implements View.OnClickListener {

/**

+ 206
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/home/HomeDataManager.java Просмотреть файл

@@ -0,0 +1,206 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.home;


import java.util.ArrayList;

import aicare.net.cn.sdk.ailinksdkdemoandroid.ADWeightScaleCmdActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.AiLinkScooterActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.BabyBodyFatCmdActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.BabyCmdActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.BleCmdActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.BloodOxygenActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.BloodSugar4GActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.BroadcastBloodOxygenActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.BroadcastScaleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.ClearShakeHandsActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.ConnectBleTestActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.EightBodyfatActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.HeightCmdActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.HeightWeightScaleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.SmartMaskActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.SphyCmdActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.TempCmdActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.TempGunCmdActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.TempHumidityActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.TestCmdActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.TransmissionActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.WeightScaleBleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.WifiConfigActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig;
import aicare.net.cn.sdk.ailinksdkdemoandroid.find.FindDeviceNewActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.PublicBleNetworkCmdActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.TempInstrument.TempInstrumentActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.airdetector.AirDetectorActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.barometric_temp_humidity.BarometricTempHygrometerActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_nutrition.BleNutritionActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.blood_glucose.BloodGlucoseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.blood_pressure_tc.BloodPressureTcActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.body_scale_4g.BodyScale4GActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.broadcast_height.BroadcastHeightActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.broadcast_nutrition.BroadNutritionActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.broadcast_weight_sacle.BroadcastWeightScaleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.coffee_scale.CoffeeScaleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.fascia_gun.FasciaGunActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.food_temp.FoodTempActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.leaone_broadcast.LeaOneBroadcastActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.meat_probe.MeatProbeActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.meat_probe_charger.MeatProbeChargerActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.noise_meter.BleNoiseMeterActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.noise_meter.WifiBleNoiseMeterActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ropeskipping.RopeSkippingActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ropeskipping.RopeSkippingSetActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_charger.ShareChargerActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_condom.ShareCondomActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_socket.ShareSocketActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.toothbrush.ToothBrushWifiBleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.toothbrush_test.ToothbrushTestActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.weight_scale.WeightScaleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.wifi_ble_scale.WeightScaleWifiBleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.wifible_sphy.WifiBleSphyActivity;

/**
* 说明:
*
* @author yesp
* 2024/1/5
*/
public class HomeDataManager {

public static final int IGNORE_TYPE = -1000;

/**
* 获取 item 集合
*/
public static ArrayList<JumpBean> getHomeDataList() {
ArrayList<JumpBean> beanList = new ArrayList<>();
// Ble通用设置
beanList.add(new JumpBean(BleDeviceConfig.BLE_GENERAL_SETTINGS, R.string.item_ble_general_settings, null, BleCmdActivity.class));
// BLE通用配网
beanList.add(new JumpBean(BleDeviceConfig.PUBLIC_BLE_NETWORK, R.string.item_ble_universal_distribution_network, null, PublicBleNetworkCmdActivity.class));
// Ble test
beanList.add(new JumpBean(BleDeviceConfig.BLE_TEST, R.string.item_ble_test, null, TestCmdActivity.class));
// Ble connect test
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_ble_connect_test, ConnectBleTestActivity.class, null));
// 透传
beanList.add(new JumpBean(BleDeviceConfig.PENETRATE, R.string.item_penetrate, null, TransmissionActivity.class));
// 广播秤
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_body_fat_scale_broadcast, BroadcastScaleActivity.class, null));
// Ble体脂秤
beanList.add(new JumpBean(BleDeviceConfig.WEIGHT_BODY_FAT_SCALE, R.string.item_body_fat_scale_ble, null, WeightScaleBleActivity.class));
// 4G体脂秤
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_body_fat_scale_4g, BodyScale4GActivity.class, null));
// WiFi+Ble体脂秤
beanList.add(new JumpBean(BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_WIFI_BLE, R.string.item_body_fat_scale_wifi_ble, null, WeightScaleWifiBleActivity.class));
// 八极秤
beanList.add(new JumpBean(BleDeviceConfig.EIGHT_BODY_FAT_SCALE, R.string.item_body_fat_scale_eight, null, EightBodyfatActivity.class));
// 艾迪体脂秤
beanList.add(new JumpBean(BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_AD, R.string.item_body_fat_scale_aidi, null, ADWeightScaleCmdActivity.class));
// 婴儿秤
beanList.add(new JumpBean(BleDeviceConfig.BABY_SCALE, R.string.item_baby_scale, null, BabyCmdActivity.class));
// 婴儿体脂两用秤
beanList.add(new JumpBean(BleDeviceConfig.BABY_BODY_FAT, R.string.item_baby_body_fat_scale, null, BabyBodyFatCmdActivity.class));
// Ble体重秤
beanList.add(new JumpBean(BleDeviceConfig.WEIGHT_SCALE, R.string.item_weight_scale_ble, null, WeightScaleActivity.class));
// 广播体重秤
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_weight_scale_broadcast, BroadcastWeightScaleActivity.class, null));
// 蓝牙营养秤
beanList.add(new JumpBean(BleDeviceConfig.BLE_NUTRITION_SCALE, R.string.item_nutritional_scale_ble, null, BleNutritionActivity.class));
// 广播营养秤
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_nutritional_scale_broadcast, BroadNutritionActivity.class, null));
// 咖啡秤
beanList.add(new JumpBean(BleDeviceConfig.COFFEE_SCALE, R.string.item_coffee_scale, null, CoffeeScaleActivity.class));
// 身高体脂秤
beanList.add(new JumpBean(BleDeviceConfig.HEIGHT_BODY_FAT, R.string.item_height_body_fat_scale, null, HeightWeightScaleActivity.class));
// 身高仪
beanList.add(new JumpBean(BleDeviceConfig.HEIGHT_METER, R.string.item_height_measuring_ble, null, HeightCmdActivity.class));
// 广播身高仪
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_height_measuring_broadcast, BroadcastHeightActivity.class, null));
// BLE血压计
beanList.add(new JumpBean(BleDeviceConfig.BLOOD_PRESSURE, R.string.item_sphygmometer_ble, null, SphyCmdActivity.class));
// wifi血压计
beanList.add(new JumpBean(BleDeviceConfig.SPHY_WIFI_BLE, R.string.item_sphygmometer_wifi, null, WifiBleSphyActivity.class));
// 血压计透传
beanList.add(new JumpBean(BleDeviceConfig.SPHYGMOMETER_PENETRATE, R.string.item_sphygmometer_penetrate, null, BloodPressureTcActivity.class));
// 血糖仪
beanList.add(new JumpBean(BleDeviceConfig.BLOOD_GLUCOSE, R.string.item_blood_glucose_meter_ble, null, BloodGlucoseActivity.class));
// 4G血糖仪
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_blood_glucose_meter_4g, BloodSugar4GActivity.class, null));
// 血氧仪(广播)
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_oximeter_broadcast, BroadcastBloodOxygenActivity.class, null));
// 血氧(连接)
beanList.add(new JumpBean(BleDeviceConfig.BLE_BOOLD_OXYGEN, R.string.item_oximeter_ble, null, BloodOxygenActivity.class));
// 额温枪
beanList.add(new JumpBean(BleDeviceConfig.INFRARED_THERMOMETER, R.string.item_infrared_thermometer, null, TempGunCmdActivity.class));
// 体温计
beanList.add(new JumpBean(BleDeviceConfig.THERMOMETER, R.string.item_thermometer, null, TempCmdActivity.class));
// 测温仪
beanList.add(new JumpBean(BleDeviceConfig.TEMP_INSTRUMENT, R.string.item_auto_thermometer, null, TempInstrumentActivity.class));
// 食品温度计
beanList.add(new JumpBean(BleDeviceConfig.FOOD_TEMP, R.string.item_food_thermometer, null, FoodTempActivity.class));
// 食物探针
beanList.add(new JumpBean(BleDeviceConfig.MEAT_PROBE, R.string.item_meat_probe, null, MeatProbeActivity.class));
// 探针充电盒
beanList.add(new JumpBean(BleDeviceConfig.MEAT_PROBE_CHARGER, R.string.item_probe_charging_box, null, MeatProbeChargerActivity.class));
// 牙刷(wifi+ble)
beanList.add(new JumpBean(BleDeviceConfig.TOOTHBRUSH_WIFI_BLE, R.string.item_toothbrush_wifi_ble, null, ToothBrushWifiBleActivity.class));
// 牙刷测试
beanList.add(new JumpBean(BleDeviceConfig.TOOTHBRUSH_TEST, R.string.item_toothbrush_test, null, ToothbrushTestActivity.class));
// 口罩
beanList.add(new JumpBean(BleDeviceConfig.SMART_MASK, R.string.item_smart_mask, null, SmartMaskActivity.class));
// 筋膜枪
beanList.add(new JumpBean(BleDeviceConfig.FASCIA_GUN, R.string.item_fascia_gun, null, FasciaGunActivity.class));
// 跳绳
beanList.add(new JumpBean(BleDeviceConfig.ROPE_SKIPPING, R.string.item_rope_skipping, null, RopeSkippingActivity.class));
// 跳绳设置模式
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_rope_skipping_set_mode, RopeSkippingSetActivity.class, null));
// 温湿度计
beanList.add(new JumpBean(BleDeviceConfig.TEMP_Humidity, R.string.item_hygrothermograph, null, TempHumidityActivity.class));
// 气压温湿度计
beanList.add(new JumpBean(BleDeviceConfig.BAROMETRIC_TEMP_HUMIDITY, R.string.item_barothermohygrograph, null, BarometricTempHygrometerActivity.class));
// ble噪音计
beanList.add(new JumpBean(BleDeviceConfig.BLE_NOISE_METER, R.string.item_noise_meter_ble, null, BleNoiseMeterActivity.class));
// wifi+ble噪音计
beanList.add(new JumpBean(BleDeviceConfig.WIFI_BLE_NOISE_METER, R.string.item_noise_meter_wifi_ble, null, WifiBleNoiseMeterActivity.class));
// 空气检测仪
beanList.add(new JumpBean(BleDeviceConfig.MQTT_AIR_DETECTOR, R.string.item_air_Detector, null, AirDetectorActivity.class));
// 电滑板Cm02
beanList.add(new JumpBean(BleDeviceConfig.SMART_SCOOTER_CM02, R.string.item_scooter_cm02, null, AiLinkScooterActivity.class));
// 共享充电器
beanList.add(new JumpBean(BleDeviceConfig.SHARE_CHARGER, R.string.item_shared_charger, null, ShareChargerActivity.class));
// 共享插座
beanList.add(new JumpBean(BleDeviceConfig.SHARE_SOCKET, R.string.item_shared_socket, null, ShareSocketActivity.class));
// 共享套套机
beanList.add(new JumpBean(BleDeviceConfig.SHARE_CONDOM, R.string.item_condom, null, ShareCondomActivity.class));
// 寻物器
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_finder, FindDeviceNewActivity.class, null));
// LeaOne测试
beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_leaone, LeaOneBroadcastActivity.class, null));

return beanList;
}

public static ArrayList<JumpBean> getHideDataList() {
ArrayList<JumpBean> hideList = new ArrayList<>();
// 不握手不加密
hideList.add(new JumpBean(BleDeviceConfig.CLEAR_SHAKE_HANDS, R.string.item_no_handshake_encryption, null, ClearShakeHandsActivity.class));
// wifi 配置
hideList.add(new JumpBean(IGNORE_TYPE, R.string.item_wifi_config, WifiConfigActivity.class, null));
return hideList;
}

/**
* 要跳转的目标Activity
* @param type
* @return
*/
public static Class<?> getTargetActivityClass(int type) {
ArrayList<JumpBean> dataList = getHomeDataList();
for (JumpBean bean : dataList) {
if (bean.getItemType() == type) {
return bean.getTargetActivityClass();
}
}
return null;
}
}

+ 91
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/home/HomeListAdapter.java Просмотреть файл

@@ -0,0 +1,91 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.home;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;

/**
* 说明:
*
* @author yesp
* 2024/1/5
*/
public class HomeListAdapter extends RecyclerView.Adapter<HomeListAdapter.MyHolder> {

private Context context;
private ArrayList<JumpBean> list;

private ItemClickListener itemClickListener;

public HomeListAdapter(Context context, ArrayList<JumpBean> list) {
this.context = context;
this.list = list;
}

public void setList(ArrayList<JumpBean> list) {
this.list = list;
}

public void setItemClickListener(ItemClickListener itemClickListener) {
this.itemClickListener = itemClickListener;
}

@NonNull
@Override
public MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
MyHolder holder = new MyHolder(LayoutInflater.from(context).inflate(R.layout.item_home_list, parent, false));
holder.itemView.setOnClickListener(v -> {
if (itemClickListener != null) {
int position = holder.getBindingAdapterPosition();
if (position < 0 || position >= list.size()) {
return;
}
itemClickListener.onItemClick(list.get(position));
}
});
return holder;
}

@Override
public void onBindViewHolder(@NonNull MyHolder holder, int position) {
holder.tvContent.setText(context.getString(list.get(position).getItemNameResId()));
}

@Override
public int getItemCount() {
if (list != null && list.size() > 0) {
return list.size();
} else {
return 0;
}
}

class MyHolder extends RecyclerView.ViewHolder {
private TextView tvContent;

public MyHolder(@NonNull View itemView) {
super(itemView);
tvContent = itemView.findViewById(R.id.tv_content);
}

}

public interface ItemClickListener {

/**
* item 点击
*
* @param bean bean
*/
void onItemClick(JumpBean bean);
}
}

+ 85
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/home/JumpBean.java Просмотреть файл

@@ -0,0 +1,85 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.home;

/**
* 说明:
*
* @author yesp
* 2024/1/5
*/
public class JumpBean {

private int itemType;
/**
* cid
*/
private int cid;
/**
* 显示名称
*/
private int itemNameResId;
/**
* 需要单独跳转的 Activity
*/
private Class<?> jumpActivityClass;

/**
* 目的跳转的 Activity
*/
private Class<?> targetActivityClass;

public JumpBean(int itemType, int itemNameResId, Class<?> jumpActivityClass, Class<?> targetActivityClass) {
this.itemType = itemType;
this.cid = itemType;
this.itemNameResId = itemNameResId;
this.jumpActivityClass = jumpActivityClass;
this.targetActivityClass = targetActivityClass;
}

public JumpBean(int itemType, int cid, int itemNameResId, Class<?> jumpActivityClass, Class<?> targetActivityClass) {
this.itemType = itemType;
this.cid = cid;
this.itemNameResId = itemNameResId;
this.jumpActivityClass = jumpActivityClass;
this.targetActivityClass = targetActivityClass;
}

public int getItemType() {
return itemType;
}

public void setItemType(int itemType) {
this.itemType = itemType;
}

public int getItemNameResId() {
return itemNameResId;
}

public void setItemNameResId(int itemNameResId) {
this.itemNameResId = itemNameResId;
}

public Class<?> getJumpActivityClass() {
return jumpActivityClass;
}

public void setJumpActivityClass(Class<?> jumpActivityClass) {
this.jumpActivityClass = jumpActivityClass;
}

public Class<?> getTargetActivityClass() {
return targetActivityClass;
}

public void setTargetActivityClass(Class<?> targetActivityClass) {
this.targetActivityClass = targetActivityClass;
}

public int getCid() {
return cid;
}

public void setCid(int cid) {
this.cid = cid;
}
}

+ 296
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/home/MainActivity.java Просмотреть файл

@@ -0,0 +1,296 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.home;

import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.os.Build;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.besthealth.bhBodyComposition120.BhBodyComposition;
import com.pingwang.bluetoothlib.AILinkBleManager;
import com.pingwang.bluetoothlib.AILinkSDK;
import com.pingwang.bluetoothlib.bean.AilinkLicenseBean;
import com.pingwang.bluetoothlib.utils.BleLog;

import java.util.ArrayList;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.AboutActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.BuildConfig;
import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.ShowBleActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.AppStart;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.SP;


public class MainActivity extends AppCompatActivity {


private Context mContext;
private RecyclerView rvList;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = this;
initView();
initData();
initListener();
int bodyComposition = new BhBodyComposition().getBodyComposition();
L.i("bodyComposition:" + bodyComposition);

}


protected void initListener() {
ActionBar supportActionBar = getSupportActionBar();
if (supportActionBar != null) {
supportActionBar.setTitle(getString(R.string.app_name) + BuildConfig.VERSION_NAME);
}
}

protected void initData() {
initPermissions();
List<AilinkLicenseBean> list = new ArrayList<>();
list.add(new AilinkLicenseBean(0x2F, 0x03, 0x09));
list.add(new AilinkLicenseBean(0x2F, 0x03, 0x01));
list.add(new AilinkLicenseBean(65544, 103, 0));
AILinkSDK.getInstance().initLicense(list);


}

protected void initView() {
BleLog.init(true);
//connectDevice(BleValueBean bleValueBean);连接的时候需要传广播对象,否则返回的cid,vid,pid始终都是0
//sdk
AILinkSDK.getInstance().init(mContext);
AILinkBleManager.getInstance().init(mContext, new AILinkBleManager.onInitListener() {
@Override
public void onInitSuccess() {
AILinkBleManager.getInstance().startScan(0);
}

@Override
public void onInitFailure() {

}
});
SP.init(this);

rvList = findViewById(R.id.rv_list);
rvList.setLayoutManager(new LinearLayoutManager(this));
HomeListAdapter adapter = new HomeListAdapter(this, HomeDataManager.getHomeDataList());
rvList.setAdapter(adapter);
adapter.setItemClickListener(new HomeListAdapter.ItemClickListener() {
@Override
public void onItemClick(JumpBean bean) {
if (bean.getJumpActivityClass() != null) {
startActivity(bean.getJumpActivityClass());
} else {
startActivity(bean.getItemType(),bean.getCid());
}
}
});
rvList.addItemDecoration(new RecyclerView.ItemDecoration() {
@Override
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
if (parent.getChildAdapterPosition(view) == 0) {
outRect.set(0, 30, 0, 0);
}
}

@Override
public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
super.onDraw(c, parent, state);
}
});
}

private void startActivity(int type,int cid) {
Intent intent = new Intent(this, ShowBleActivity.class);
intent.putExtra("type", type);
intent.putExtra("cid", cid);
startActivity(intent);
}

private void startActivity(Class<?> activityClass) {
Intent intent = new Intent(this, activityClass);
startActivity(intent);
}

@Override
protected void onResume() {
super.onResume();

}

@Override
protected void onDestroy() {
super.onDestroy();
BleLog.quit();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.toolbar_menu, menu);
return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (item.getItemId() == R.id.toolbar_right_menu) {
startActivity(new Intent(mContext, AboutActivity.class));
return true;
}
return super.onOptionsItemSelected(item);
}


//-----------------------权限----------------------------------------
/**
* 需要申请的权限
*/
private String[] LOCATION_PERMISSION = new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.WRITE_EXTERNAL_STORAGE};
private final static String[] BLUETOOTH_PERMISSION = new String[]{Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.BLUETOOTH_ADVERTISE, Manifest.permission.BLUETOOTH_CONNECT};
/**
* 权限请求返回
*/
private final int PERMISSION = 101;
/**
* 定位服务返回
*/
protected final int LOCATION_SERVER = 102;
private HintDataDialogFragment mHintDataDialog = null;

protected void initPermissions() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
onPermissionsOk();
return;
}

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
if (ContextCompat.checkSelfPermission(this, LOCATION_PERMISSION[0]) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, LOCATION_PERMISSION, PERMISSION);
} else {
boolean bleStatus = AppStart.isLocServiceEnable(mContext);
if (!bleStatus) {
//没有开启定位服务
mHintDataDialog = HintDataDialogFragment.newInstance()
.setTitle("提示", 0)
.setCancel("取消", 0)
.setOk("确定", 0)
.setContent("请求开启定位服务", true)
.setOnDialogListener(new HintDataDialogFragment.onDialogListener() {
@Override
public void onSucceedListener(View v) {
startLocationActivity();
}
});
mHintDataDialog.show(getSupportFragmentManager());


} else {
onPermissionsOk();
}
}
} else {
if (ContextCompat.checkSelfPermission(this, BLUETOOTH_PERMISSION[0]) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, BLUETOOTH_PERMISSION, PERMISSION);
}
}


}


@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);

//请求权限被拒绝
if (requestCode != PERMISSION) {
return;
}

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
initPermissions();
} else {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, LOCATION_PERMISSION[0])) {
//权限请求失败,但未选中“不再提示”选项,再次请求
ActivityCompat.requestPermissions(this, LOCATION_PERMISSION, PERMISSION);
} else {
//权限请求失败,选中“不再提示”选项
mHintDataDialog = HintDataDialogFragment.newInstance()
.setTitle("提示", 0)
.setCancel("取消", 0)
.setOk("确定", 0)
.setContent("请求开启定位权限", true)
.setOnDialogListener(new HintDataDialogFragment.onDialogListener() {
@Override
public void onSucceedListener(View v) {
AppStart.startUseSetActivity(mContext);
}
});
mHintDataDialog.show(getSupportFragmentManager());

}

}
} else {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
initPermissions();
}
}


}


/**
* 启动去设置定位服务
*/
protected void startLocationActivity() {

AppStart.startLocationActivity(this, LOCATION_SERVER);

}


/**
* 权限ok
*/
protected void onPermissionsOk() {

}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == LOCATION_SERVER) {
//定位服务页面返回
initPermissions();
}
}

}

+ 1
- 1
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/BleDemoActivity.java Просмотреть файл

@@ -19,7 +19,7 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
*
* @author xing
*/
public class BleDemoActivity extends BleBaseActivity {
public class BleDemoActivity extends BleBaseActivity {

private ListView list_view;


+ 2
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/PublicBleNetworkCmdActivity.java Просмотреть файл

@@ -362,7 +362,7 @@ public class PublicBleNetworkCmdActivity extends BleBaseActivity implements OnCa
mHandler.sendEmptyMessage(REFRESH_DATA);

}
if (type == CmdConfig.SET_WIFI_PAW) {
if (type == CmdConfig.SET_WIFI_PWD) {
mList.add("设置的密码状态 " + status);
mHandler.sendEmptyMessage(REFRESH_DATA);
if (status == BodyFatDataUtil.STATUS_SUCCESS && issetMac) {
@@ -533,7 +533,7 @@ public class PublicBleNetworkCmdActivity extends BleBaseActivity implements OnCa
if (password != null) {
length = password.length + 1;
bytes1 = new byte[length + 1];
bytes1[0] = (byte) CmdConfig.SET_WIFI_PAW;
bytes1[0] = (byte) CmdConfig.SET_WIFI_PWD;
bytes1[1] = (byte) subpackage;
System.arraycopy(password, 0, bytes1, 2, password.length);


+ 528
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/PublicWifiBleOtaActivity.java Просмотреть файл

@@ -0,0 +1,528 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules;

import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.text.TextUtils;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.device.BleSendCmdUtil;
import com.pingwang.bluetoothlib.device.SendBleBean;
import com.pingwang.bluetoothlib.listener.CallbackDisIm;
import com.pingwang.bluetoothlib.listener.OnBleCompanyListener;
import com.pingwang.bluetoothlib.listener.OnBleDeviceDataListener;
import com.pingwang.bluetoothlib.listener.OnBleVersionListener;
import com.pingwang.bluetoothlib.listener.OnCallbackDis;
import com.pingwang.bluetoothlib.listener.OnMcuParameterListener;
import com.pingwang.bluetoothlib.utils.BleLog;

import java.util.ArrayList;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.DialogStringImageBean;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.MoveDataDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.ShowListDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.SP;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils;
import cn.net.aicare.modulelibrary.module.wifibleDevice.WifiBleDeviceData;
import cn.net.aicare.modulelibrary.module.wifibleDevice.WifiBleInfoBean;


/**
* wifi ble 血压计界面
*
* @author xing
* @date 2023/10/07
*/
public class PublicWifiBleOtaActivity extends BleBaseActivity implements OnCallbackDis, OnBleVersionListener, OnMcuParameterListener, OnBleCompanyListener, View.OnClickListener {

private static String TAG = PublicWifiBleOtaActivity.class.getName();

private final String WIFI_BLE_SSID = "WIFI_BLE_SSID_KEY";
private final String WIFI_BLE_SSID_MAC = "WIFI_BLE_SSID_MAC";
private final String WIFI_BLE_PWD = "WIFI_BLE_PWD";

private final int REFRESH_DATA = 3;
private List<String> mList;
private ArrayAdapter listAdapter;
private TextView tv_wifi_ssid, tv_wifi_status, tv_wifi_info;
private Context mContext;
private WifiBleDeviceData mWifiBleDeviceData;
private List<DialogStringImageBean> mWifiList = new ArrayList<>();
private String mAddress;
private int mType;
private int mCid;
private byte unit = 0;

private String mSsid = "";
private String mMac = "";
private String mPwd = "";

private Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
if (msg.what == REFRESH_DATA) {
if (listAdapter != null)
listAdapter.notifyDataSetChanged();
}
}
};

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wifi_ble_ota);
mContext = this;
mAddress = getIntent().getStringExtra("mac");
mType = getIntent().getIntExtra("type", -1);
mCid = getIntent().getIntExtra("cid", -1);
mSsid = (String) SP.getInstance().get(WIFI_BLE_SSID, "");
mMac = (String) SP.getInstance().get(WIFI_BLE_SSID_MAC, "");
mPwd = (String) SP.getInstance().get(WIFI_BLE_PWD, "");
init();
}

private void init() {
mList = new ArrayList<>();
ListView listView = findViewById(R.id.listview);
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList);
listView.setAdapter(listAdapter);

Button clear = findViewById(R.id.clear);
clear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mList != null)
mList.clear();
mHandler.sendEmptyMessage(REFRESH_DATA);
}
});

tv_wifi_ssid = findViewById(R.id.tv_wifi_ssid);
tv_wifi_info = findViewById(R.id.tv_wifi_info);
tv_wifi_status = findViewById(R.id.tv_wifi_status);

findViewById(R.id.clear).setOnClickListener(this);
findViewById(R.id.btn_wifi).setOnClickListener(this);
findViewById(R.id.btn_read_wifi_status).setOnClickListener(this);
findViewById(R.id.btn_start_ota).setOnClickListener(this);


if (tv_wifi_info != null) {
tv_wifi_info.setText(mSsid + "\n" + mPwd);
}

}


@Override
public void onClick(View v) {
switch (v.getId()) {

case R.id.clear:
if (mList != null)
mList.clear();
mHandler.sendEmptyMessage(REFRESH_DATA);
SP.getInstance().put(WIFI_BLE_SSID, "");
SP.getInstance().put(WIFI_BLE_SSID_MAC, "");
SP.getInstance().put(WIFI_BLE_PWD, "");
mSsid = "";
mMac = "";
mPwd = "";
if (tv_wifi_info != null) {
tv_wifi_info.setText("");
}
break;


case R.id.btn_read_wifi_status:
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.getWifiCurrentState();
}
break;
case R.id.btn_start_ota:
if (mWifiBleDeviceData != null) {
setConnectWifi(mMac, mPwd);
}
break;
case R.id.btn_wifi:
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.getWifiList();
mList.add(TimeUtils.getTime() + "正在扫描附近可用的wifi...");
mHandler.sendEmptyMessage(REFRESH_DATA);
}
showWifiList();
break;


default:
break;
}
}


private ShowListDialogFragment mShowListDialogFragment;

private void showWifiList() {
if (mShowListDialogFragment == null) {
mShowListDialogFragment = ShowListDialogFragment.newInstance();
mShowListDialogFragment.setList(mWifiList);
mShowListDialogFragment.setTitle("选择WIFI");
mShowListDialogFragment.setCancel("取消", 0);
mShowListDialogFragment.setOnDialogListener(new ShowListDialogFragment.onDialogListener() {
@Override
public void onItemListener(int position) {
WifiBleInfoBean wifiBleInfoBean = mWifiBleInfoBeanList.get(position);
mSsid = wifiBleInfoBean.getSsid();
MoveDataDialogFragment.newInstance()
.setTitle(mSsid, "")
.setContent("", "请输入密码", MoveDataDialogFragment.NAME)
.setOk("OK", 0)
.setCancel("取消", 0)
.setOnDialogListener(new MoveDataDialogFragment.OnDialogListener() {
@Override
public void onSucceedListener(View v, String data) {
mMac = wifiBleInfoBean.getMac();
mPwd = data.trim();
SP.getInstance().put(WIFI_BLE_SSID, mSsid);
SP.getInstance().put(WIFI_BLE_SSID_MAC, mMac);
SP.getInstance().put(WIFI_BLE_PWD, mPwd);
setConnectWifi(mMac, mPwd);

}
})
.show(getSupportFragmentManager());
}

@Override
public void onCancelListener(View v) {

}
});
}
mShowListDialogFragment.show(getSupportFragmentManager());
}

//-------------------BLE send---------------

/**
* 设置连接wifi
*
* @param mac mac
* @param pwd 密码
*/
private void setConnectWifi(String mac, String pwd) {
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.setConnectWifiMac(mac, pwd);
mList.add(TimeUtils.getTime() + "正在连接wifi...");
mHandler.sendEmptyMessage(REFRESH_DATA);
}
if (tv_wifi_info != null) {
tv_wifi_info.setText(mSsid + "\n" + mPwd);
}
}


//---------------------------------服务---------------------------------------------------


@Override
public void onServiceSuccess() {
CallbackDisIm.getInstance().addListListener(this);
BleLog.i(TAG, "服务与界面建立连接成功");
//与服务建立连接
if (mAILinkBleManager != null) {
BleDevice bleDevice = mAILinkBleManager.getBleDevice(mAddress);
if (bleDevice != null) {
mWifiBleDeviceData = WifiBleDeviceData.getInstance(bleDevice);
mWifiBleDeviceData.setOnWiFiBleCallback(new WifiBleDeviceListener());

bleDevice.setOnBleDeviceDataListener(new OnBleDeviceDataListener() {
@Override
public void onNotifyDataA6(String uuid, byte[] hex) {
int cmd = hex[0] & 0xff;
if (cmd == 0x91) {
int status = hex[1] & 0xff;
if (status == 0) {
mList.add(TimeUtils.getTime() + "WIFI OTA成功");
} else if (status == 1) {
mList.add(TimeUtils.getTime() + "WIFI OTA失败");
} else if (status == 2) {
mList.add(TimeUtils.getTime() + "不支持WIFI OTA");
} else {
mList.add(TimeUtils.getTime() + "模块主动开始 WIFI OTA");
}
mHandler.sendEmptyMessage(REFRESH_DATA);
}
}
});
bleDevice.setOnBleVersionListener(this);
//获取版本号
bleDevice.sendData(new SendBleBean(BleSendCmdUtil.getInstance().getBleVersion()));
mWifiBleDeviceData.getWifiCurrentState();
mList.add(TimeUtils.getTime() + "获取版本号指令");
mHandler.sendEmptyMessage(REFRESH_DATA);
}
}
}

@Override
public void onServiceErr() {
BleLog.i(TAG, "服务与界面连接断开");
//与服务断开连接
mAILinkBleManager = null;
}


@Override
public void unbindServices() {
CallbackDisIm.getInstance().removeListener(this);
mAILinkBleManager.disconnect(mAddress);
}


private void startOta() {
mList.add(TimeUtils.getTime() + "发送开始OTA指令");
mHandler.sendEmptyMessage(REFRESH_DATA);
SendBleBean sendBleBean = new SendBleBean();
sendBleBean.setHex(new byte[]{(byte) 0x91, 0x01});
mWifiBleDeviceData.getBleDevice().sendData(sendBleBean);
}


//-----------------状态-------------------


@Override
public void onConnecting(@NonNull String mac) {
//TODO 连接中
if (mAddress.equals(mac)) {
BleLog.i(TAG, "连接中");
}
}

@Override
public void onDisConnected(@NonNull String mac, int code) {
//TODO 连接断开
if (mAddress.equals(mac)) {
BleLog.i(TAG, "连接断开");
finish();
}
}

@Override
public void onServicesDiscovered(@NonNull String mac) {
//TODO 连接成功(获取服务成功)
if (mAddress.equals(mac))
BleLog.i(TAG, "连接成功(获取服务成功)");
}


@Override
public void bleOpen() {

}

@Override
public void bleClose() {
BleLog.i(TAG, "蓝牙未开启,可请求开启");
finish();
}


//-----------------通知-------------------


private List<WifiBleInfoBean> mWifiBleInfoBeanList;

private class WifiBleDeviceListener implements WifiBleDeviceData.OnWiFiBleCallback {
/**
* 在ble和wifi状态
*
* @param bleStatus ble状态
* @param wifiStatus wifi状态
* @param workStatus 工作状态
*/
@Override
public void onBleAndWifiStatus(int bleStatus, int wifiStatus, int workStatus) {

String wifiStatusStr = "";
switch (wifiStatus) {
case 0:
wifiStatusStr = "未配置AP";
break;
case 1:
wifiStatusStr = "连接AP失败";
break;
case 2:
wifiStatusStr = "连接的AP信号不好";
break;
case 3:
wifiStatusStr = "成功连接上AP";
break;
case 4:
wifiStatusStr = "正在连接AP";
break;

}
mList.add(TimeUtils.getTime() + "蓝牙状态:" + bleStatus + "\nwifi状态:" + wifiStatusStr + "\n工作状态:" + workStatus);
mHandler.sendEmptyMessage(REFRESH_DATA);

if (tv_wifi_status != null) {
tv_wifi_status.setText(wifiStatusStr);
}
if (wifiStatus == 3) {
startOta();
}

}

@Override
public void onWifiScanStatus(int status) {

}

@Override
public void onConnectWifiName(String name) {
if (tv_wifi_ssid != null) {
tv_wifi_ssid.setText(name);
}
}

@Override
public void onWifiScanBean(WifiBleInfoBean wifiBleInfoBean) {
L.i("扫描到的wifi信息:" + wifiBleInfoBean.toString());
}

@Override
public void onWifiScanFinish(List<WifiBleInfoBean> list) {
if (mWifiBleInfoBeanList == null) {
mWifiBleInfoBeanList = new ArrayList<>();
}
mWifiBleInfoBeanList.clear();
mWifiList.clear();
for (WifiBleInfoBean wifiBleInfoBean : list) {
String ssid = wifiBleInfoBean.getSsid();
if (TextUtils.isEmpty(ssid)) {
continue;
}
mWifiList.add(new DialogStringImageBean(ssid, wifiBleInfoBean.getType()));
mWifiBleInfoBeanList.add(wifiBleInfoBean);
}
if (mShowListDialogFragment != null) {
mShowListDialogFragment.setList(mWifiList);
}
}

/**
* 设置wifi名字或密码的状态回调
*
* @param type 类型
* @param status 状态
*/
@Override
public void onSetWifiNameOrPwdOrConnectCallback(int type, int status) {

}

@Override
public void onWifiConnecting(int status) {
L.i("wifi正在连接中:" + status);
mList.add(TimeUtils.getTime() + "wifi正在连接中...");
mHandler.sendEmptyMessage(REFRESH_DATA);
}

/**
* 当前连接的wifi mac地址
*
* @param mac mac
*/
@Override
public void onConnectWifiMac(String mac) {

}

@Override
public void onConnectWifiPwd(String pwd) {

}

@Override
public void onDeviceSn(long sn) {
//主要用于查询设备是否在服务器注册成功
mList.add(TimeUtils.getTime() + "设备SN号:" + sn);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onServerIp(String ip) {
mList.add(TimeUtils.getTime() + "设备ip地址:" + ip);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onServerPort(int port) {
mList.add(TimeUtils.getTime() + "设备端口:" + port);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onServerPath(String path) {
mList.add(TimeUtils.getTime() + "设备路径地址:" + path);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onServerSettingInfo(boolean status) {
mList.add(TimeUtils.getTime() + "服务器配置:" + (status ? "成功" : "失败"));
mHandler.sendEmptyMessage(REFRESH_DATA);
}
}


@Override
public void onBmVersion(String version) {
mList.add(TimeUtils.getTime() + "版本号:" + version);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void OnDID(int cid, int vid, int pid) {
String didStr = "cid:" + cid + "||vid:" + vid + "||pid:" + pid;
mList.add(TimeUtils.getTime() + "ID:" + didStr);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onMcuBatteryStatus(int status, int battery) {
mList.add(TimeUtils.getTime() + "电量:" + battery + "%");
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onSysTime(int status, int[] times) {
String time = times[0] + "-" + times[1] + "-" + times[2] + " " + times[3] + ":" + times[4] + ":" + times[5];
mList.add(TimeUtils.getTime() + "系统时间:" + time);
mHandler.sendEmptyMessage(REFRESH_DATA);
}


@Override
protected void onDestroy() {
super.onDestroy();
BleLog.i(TAG, "onDestroy");
}
}

+ 0
- 1
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/barometric_temp_humidity/EditParamsDialog.java Просмотреть файл

@@ -20,7 +20,6 @@ import androidx.fragment.app.FragmentManager;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;


public class EditParamsDialog extends DialogFragment implements View.OnClickListener {

/**

+ 1
- 1
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/blood_glucose/BloodGlucoseActivity.java Просмотреть файл

@@ -52,7 +52,7 @@ public class BloodGlucoseActivity extends BleBaseActivity implements OnCallbackB
log_list = findViewById(R.id.log_list);
mLogList = new ArrayList<>();
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mLogList);
log_list.setAdapter(listAdapter);
log_list.setAdapter(listAdapter);
mmol.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

+ 1
- 1
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/meat_probe_charger/MeatProbeChargerActivity.java Просмотреть файл

@@ -283,7 +283,7 @@ public class MeatProbeChargerActivity extends BleBaseActivity implements View.On
btn_probe_version.postDelayed(new Runnable() {
@Override
public void run() {
mBleDevice.setMtu(247);
mBleDevice.setMtu(517);
}
}, 200);
}

+ 1
- 1
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/toothbrush/ToothBrushWifiBleActivity.java Просмотреть файл

@@ -236,7 +236,7 @@ public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.O
mMHandler.sendEmptyMessage(ConnectWifi);
}
}
if (type == CmdConfig.DISCONNECT_WIFI) {
if (type == CmdConfig.DIS_OR_CON_WIFI) {
mList.add(0, "发起连接 " + status);
mMHandler.sendEmptyMessage(ToRefreUi);
}

+ 5
- 5
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/weight_scale/WeightScaleActivity.java Просмотреть файл

@@ -290,11 +290,11 @@ public class WeightScaleActivity extends BleBaseActivity implements WeightScaleD
addText("版本号:" + version);
}

/**
* 请求同步时间
*
* @param quest 1-请求同步时间
*/
// /**
// * 请求同步时间
// *
// * @param quest 1-请求同步时间
// */
// @Override
// public void onSyncTime(int quest) {
// if (quest == 1) {

app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/WeightScaleWifiBleActivity.java → app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/wifi_ble_scale/WeightScaleWifiBleActivity.java Просмотреть файл

@@ -1,4 +1,4 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid;
package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.wifi_ble_scale;


import android.content.Intent;
@@ -33,6 +33,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.DialogStringImageBean;
@@ -69,16 +70,11 @@ public class WeightScaleWifiBleActivity extends BleBaseActivity implements View.
private EditText et_ip, et_path, et_port;
private TextView tv_path;

private byte[] testIp = new byte[]{0x74, 0x65, 0x73, 0x74, 0x2e, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x72, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x61, 0x69, 0x63, 0x61, 0x72, 0x65, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x63, 0x6e};

private byte[] productIp = new byte[]{0x61, 0x69, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x69, 0x6f, 0x74, 0x2e, 0x61, 0x69, 0x63, 0x61, 0x72, 0x65, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x63, 0x6e};

private byte[] IpUrl = new byte[]{0x2f, 0x64, 0x65, 0x76, 0x69, 0x76, 0x63, 0x64, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x64, 0x72, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x2f};
private boolean isTest = false;
private ArrayList<DialogStringImageBean> mDialogList;

private ActivityResultLauncher<Boolean> launcher;
private WifiBleDeviceData mWifiBleDeviceData;
private User selectUser;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -161,6 +157,7 @@ public class WeightScaleWifiBleActivity extends BleBaseActivity implements View.
FileUtils.init();
mDialogList = new ArrayList<>();
initLauncher();
selectUser = getDefault();
}


@@ -454,6 +451,9 @@ public class WeightScaleWifiBleActivity extends BleBaseActivity implements View.
break;
case BodyFatDataUtil.MUC_REQUEST_USER_INFO:
mList.add(0, getString(R.string.measurement_status) + status + "\n" + getString(R.string.request_user_information));
if (bodyFatBleUtilsData != null) {
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setUserInfo(selectUser, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE));
}
break;
default:
mList.add(0, getString(R.string.measurement_status) + status);
@@ -756,7 +756,7 @@ public class WeightScaleWifiBleActivity extends BleBaseActivity implements View.
mMHandler.sendEmptyMessage(REFRESH_DATA);

}
if (type == CmdConfig.SET_WIFI_PAW) {
if (type == CmdConfig.SET_WIFI_PWD) {
mList.add(0, getString(R.string.get_set_password_status) + status);
mMHandler.sendEmptyMessage(REFRESH_DATA);
}
@@ -787,7 +787,7 @@ public class WeightScaleWifiBleActivity extends BleBaseActivity implements View.
}

@Override
public void onDeviceSn(String sn) {
public void onDeviceSn(long sn) {
L.i(TAG, "设备sn: " + sn);
mList.add(0, "sn: " + sn);
mMHandler.sendEmptyMessage(REFRESH_DATA);

+ 6
- 6
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/wifible_sphy/WifiBleSphyActivity.java Просмотреть файл

@@ -576,11 +576,6 @@ public class WifiBleSphyActivity extends BleBaseActivity implements OnCallbackDi
}
}

@Override
public void onConnectWifiPwd(String pwd) {

}

@Override
public void onWifiScanBean(WifiBleInfoBean wifiBleInfoBean) {
L.i("扫描到的wifi信息:" + wifiBleInfoBean.toString());
@@ -635,7 +630,12 @@ public class WifiBleSphyActivity extends BleBaseActivity implements OnCallbackDi
}

@Override
public void onDeviceSn(String sn) {
public void onConnectWifiPwd(String pwd) {

}

@Override
public void onDeviceSn(long sn) {
//主要用于查询设备是否在服务器注册成功
mList.add("设备SN号:" + sn);
mHandler.sendEmptyMessage(REFRESH_DATA);

+ 343
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/AppPhoneInfoUtils.java Просмотреть файл

@@ -0,0 +1,343 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.utils;

import android.annotation.SuppressLint;
import android.app.ActivityManager;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.telephony.TelephonyManager;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;

/**
* APP和手机信息获取工具类
*/
public class AppPhoneInfoUtils {

private AppPhoneInfoUtils() {
/* cannot be instantiated */
throw new UnsupportedOperationException("cannot be instantiated");

}

/**
* 版本名--给用户看
*/
public static String getVersionName(Context context) {
PackageInfo mPackageInfo = getPackageInfo(context.getApplicationContext());
if (mPackageInfo != null) {
return mPackageInfo.versionName;
}
return "1.0.0";

}

/**
* 版本号---主要用于程序升级检测
*/
public static int getVersionCode(Context context) {
PackageInfo mPackageInfo = getPackageInfo(context.getApplicationContext());
if (mPackageInfo != null) {
return mPackageInfo.versionCode;
}
return 1;
}


private static PackageInfo getPackageInfo(Context context) {
PackageInfo pi = null;
try {
PackageManager pm = context.getPackageManager();
pi = pm.getPackageInfo(context.getPackageName(), PackageManager.GET_CONFIGURATIONS);
return pi;
} catch (Exception e) {
e.printStackTrace();
}
return pi;
}

public static String getSystemVersion() {
try {
if (getPhoneBrand().toLowerCase().equalsIgnoreCase("xiaomi")) {
return getMIUI();
} else if (getPhoneBrand().toLowerCase().equalsIgnoreCase("huawei") || getPhoneBrand().toLowerCase().equals("honor")) {
return getEMUI();
} else if (getPhoneBrand().toLowerCase().equalsIgnoreCase("vivo")) {
String[] vivo = getVivo();
if (vivo != null && vivo.length > 1) {
return vivo[0] + "_" + vivo[1];
}
return "";
} else if (getPhoneBrand().toLowerCase().equalsIgnoreCase("oppo")) {
return getOppo();
}
} catch (Exception e) {
e.printStackTrace();
return "解析错误";
}
return "不是HMOV,没有做解析";
}

public static String getSystemVersionString() {
try {
if (getPhoneBrand().toLowerCase().equalsIgnoreCase("xiaomi")) {
return getSystemProperty("ro.miui.ui.version.name");
} else if (getPhoneBrand().toLowerCase().equalsIgnoreCase("huawei") || getPhoneBrand().toLowerCase().equals("honor")) {
return getSystemProperty("ro.build.version.emui");
} else if (getPhoneBrand().toLowerCase().equalsIgnoreCase("vivo")) {
return getSystemProperty("ro.vivo.os.build.display.id");
} else if (getPhoneBrand().toLowerCase().equalsIgnoreCase("oppo") || getPhoneBrand().toLowerCase().equals("realme")) {
return getSystemProperty("ro.build.version.opporom");
}
} catch (Exception e) {
e.printStackTrace();
return "解析错误";
}
return "不是HMOV,没有做解析";
}


/**
* 获取华为手机emui版本
*
* @return String
*/
public static String getEMUI() {
String systemProperty = "";
try {
systemProperty = getSystemProperty("ro.build.version.emui");
//EmotionUI_11.1.0=harmonyOS2.0
return systemProperty != null ? systemProperty.substring(systemProperty.indexOf("_") + 1).trim() : "";
} catch (Exception e) {
e.printStackTrace();
}
return systemProperty;
}

/**
* 获取小米手机版本
*
* @return String
*/
public static String getMIUI() {
String systemProperty = "";
try {
systemProperty = getSystemProperty("ro.miui.ui.version.name");
return systemProperty != null ? systemProperty.substring(systemProperty.indexOf("V") + 1).trim() : "";
} catch (Exception e) {
e.printStackTrace();
}
return systemProperty;
}

/**
* 获取vivo手机版本
*
* @return String
*/
public static String[] getVivo() {
try {
String systemProperty = getSystemProperty("ro.vivo.os.build.display.id");
if (systemProperty != null) {
if (!systemProperty.contains("_")) {
systemProperty = systemProperty.replace(" ", "_");
}
return systemProperty.split("_");
}
} catch (Exception e) {
e.printStackTrace();
}
//OriginOS 1.0
//Funtouch OS
return null;
}

public static String getOppo() {
//ro.build.version.opporom
String systemProperty = "";
try {
systemProperty = getSystemProperty("ro.build.version.opporom");
return systemProperty != null ? systemProperty.substring(systemProperty.indexOf("V") + 1).trim() : "";
} catch (Exception e) {
e.printStackTrace();
}
return systemProperty;
}


public static String getSystemProperty(String propName) {
String line;
BufferedReader input = null;
try {
Process p = Runtime.getRuntime().exec("getprop " + propName);
input = new BufferedReader(new InputStreamReader(p.getInputStream()), 1024);
line = input.readLine();
input.close();
} catch (IOException ex) {
return null;
} finally {
if (input != null) {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return line;
}

public static String getPhoneInfo() {
return Build.MANUFACTURER +//手机厂商
" " + Build.MODEL; //手机型号
}


public static String getBrand() {
return Build.BRAND;
}

public static String getPhoneBrand() {
return Build.MANUFACTURER;//手机厂商
}

/**
* 返回手机型号
*/
public static String getPhoneModel() {
return Build.MODEL;
}


/**
* 返回手机系统版本
*/
public static String getPhoneVersion() {
return "android " + Build.VERSION.RELEASE;//系统版本;
}


/**
* 读取手机电话号码
*
* @param context context
* @return 手机号, 空代表读取失败
*/
@SuppressLint({"MissingPermission", "HardwareIds"})
public static String getPhoneNumber(Context context) {
String phoneNumber = "";
try {
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
phoneNumber = telephonyManager.getLine1Number();
if (phoneNumber.startsWith("+86")) {
phoneNumber = phoneNumber.substring(3);
}
} catch (Exception e) {
e.printStackTrace();
return phoneNumber;
}
return phoneNumber;
}


/**
* 检测应用是否安装
*
* @param context Context
* @param packagename 包名
* @return boolean
*/
public static boolean checkMapAppsIsExist(Context context, String packagename) {
PackageInfo packageInfo;
try {
packageInfo = context.getPackageManager().getPackageInfo(packagename, 0);
} catch (Exception e) {
packageInfo = null;
e.printStackTrace();
}
return packageInfo != null;
}


/**
* 安装apk
*/
public static void install(Context mContext, Uri uri) {
Intent install = new Intent(Intent.ACTION_VIEW);
install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
install.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
install.setDataAndType(uri, "application/vnd.android.package-archive");
mContext.startActivity(install);
}


/**
* 获取进程名
*
* @param context 上下文
* @return 进程名
*/
public static String getProcessName(Context context) {
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> runningApps = am.getRunningAppProcesses();
if (runningApps == null) {
return null;
}
for (ActivityManager.RunningAppProcessInfo proInfo : runningApps) {
if (proInfo.pid == android.os.Process.myPid()) {
if (proInfo.processName != null) {
return proInfo.processName;
}
}
}
return null;
}


/**
* 用来判断服务是否运行.
*
* @param className 判断的服务名字
* @return true 在运行 false 不在运行
*/
public static boolean isServiceRunning(Context context, String className) {
boolean isRunning = false;
try {
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningServiceInfo> serviceList = activityManager.getRunningServices(2000);
if (!(serviceList.size() > 0)) {
return false;
}
for (int i = 0; i < serviceList.size(); i++) {
if (serviceList.get(i).service.getClassName().equals(className)) {
isRunning = true;
break;
}
}
} catch (SecurityException e) {
e.printStackTrace();
}
return isRunning;
}


public static int getSystemBattery(Context context) {
int level = 0;
Intent batteryInfoIntent = context.getApplicationContext().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
level = batteryInfoIntent.getIntExtra("level", 0);
int batterySum = batteryInfoIntent.getIntExtra("scale", 100);
int percentBattery = 100 * level / batterySum;
return percentBattery;
}


}

+ 182
- 56
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/L.java Просмотреть файл

@@ -1,9 +1,16 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.utils;

import android.content.Context;
import android.os.Handler;
import android.os.HandlerThread;
import android.text.TextUtils;
import android.util.Log;

import androidx.annotation.NonNull;

import com.google.gson.Gson;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
@@ -15,16 +22,51 @@ public class L {
/**
* 是否开启log日志
*/
private static boolean isLog = true;
private static boolean isLog = false;
private static String TAG = "TagOther";
private static MyDiskLogStrategy myDiskLogStrategy;
private static int MAX_BYTES = 2048 * 1024;//2M
/**
* 缓存行数量
*/
private static int CACHE_NUMBER_LINES = 100;//list大小
private static HandlerThread mHandlerThread;
private static Gson mGson;
private static long mId = 0;

/**
* 获取默认日志路径,不是以/ 结尾
*
* @param context 上下文
* @return {@link String}
*/
public static String getDefaultLogPath(Context context) {
if (myDiskLogStrategy!=null) {
myDiskLogStrategy.saveCache();
}
return context.getFilesDir().getPath() + File.separatorChar + "logger";
}

public static String getDefaultLogName() {
return "logs.txt";
}

/**
* 日志初始化
* 注意:路径只能是内置缓存路径,否则可能会导致写入失败
*
* @param isShowLog 是否打印日志
* @param diskPath 磁盘路径
* @param fileName 文件名称
*/
public static void init(boolean isShowLog) {
public static void init(String diskPath, String fileName, boolean isShowLog) {
isLog = isShowLog;
mGson = new Gson();
mHandlerThread = new HandlerThread(TAG);
mHandlerThread.start();

Handler mHandler = new MyDiskLogStrategy.WriteHandler(mHandlerThread.getLooper(), diskPath, fileName, MAX_BYTES,CACHE_NUMBER_LINES);
myDiskLogStrategy = new MyDiskLogStrategy(mHandler);
}

/**
@@ -37,7 +79,7 @@ public class L {
}

public static void v(String msg) {
v(TAG, msg);
v("", msg);
}

/**
@@ -47,11 +89,19 @@ public class L {
if (isLog) {
logContent(tag, msg, 1);
}
L.write(msg);
}

/**
* 错误日志
*/
public static void eJson(String tag, String msg, Class c) {
e(tag, mGson.toJson(msg, c));
}


public static void e(String msg) {
e(TAG, msg);
e("", msg);
}

/**
@@ -64,9 +114,12 @@ public class L {
}

public static void w(String msg) {
w(TAG, msg);
w("", msg);
}

public static void iJson(String msg, Class c) {
i("", mGson.toJson(msg, c));
}

/**
* 信息日志
@@ -77,9 +130,48 @@ public class L {
}
}

/**
* 信息日志
*/
public static void iw(String msg) {
iw("", msg);
}

/**
* 信息日志
*/
public static void iw(String tag, String msg) {
if (isLog) {
logContent(tag, msg, 0);
}
L.write(msg);
}

/**
* 信息日志
*/
public static void iwJson(String tag, Object msg, Class c) {
if (isLog) {
logContent(tag, mGson.toJson(msg, c), 0);
}
L.writeJson(msg, c);
}

public static void write(String msg) {
logContent(msg);
}

public static void writeJson(Object msg, Class c) {
write(mGson.toJson(msg, c));
}

public static void iNoCode(Object msg) {
String newMsg = "未识别的指令:" + msg;
i("", newMsg);
}

public static void i(String msg) {
i(TAG, msg);
i("", msg);
}

/**
@@ -92,12 +184,29 @@ public class L {
}

public static void d(String msg) {
d(TAG, msg);
d("", msg);
}


/**
* 退出写文件线程
*/
public static void quit() {
if (mHandlerThread != null)
mHandlerThread.quit();
}


private static void logContent(String msg) {
logContent("", msg, 0);
logContent("", msg, 0, true);
}

/**
* @param msg 内容
* @param level 0=i;1=e;2=d;3=w;
*/
private static void logContent(String tag, String msg, int level) {
logContent(tag, msg, level, false);
}


@@ -105,65 +214,73 @@ public class L {
* @param tag tag
* @param msg 内容
* @param level 0=i;1=e;2=d;3=w;其他=v;
* @param isW 是否写入文件
*/
private static void logContent(String tag, String msg, int level) {
StackTraceElement[] trace = Thread.currentThread().getStackTrace();
int methodCount = 1;
int stackOffset = getStackOffset(trace);
if (methodCount + stackOffset > trace.length) {
methodCount = trace.length - stackOffset - 1;
}
for (int i = methodCount; i > 0; i--) {
int stackIndex = i + stackOffset;
if (stackIndex >= trace.length) {
continue;
}
StackTraceElement element = trace[stackIndex];
switch (level) {
case 0:
Log.i(tag, getLogContent(msg, element));
break;
case 1:
Log.e(tag, getLogContent(msg, element));
break;
case 2:
Log.d(tag, getLogContent(msg, element));
break;
case 3:
Log.w(tag, getLogContent(msg, element));
break;
default:
Log.v(tag, msg);
break;
private static void logContent(String tag, String msg, int level, boolean isW) {
try {
StackTraceElement[] trace = Thread.currentThread().getStackTrace();
int methodCount = 1;
int stackOffset = getStackOffset(trace);
if (methodCount + stackOffset > trace.length) {
methodCount = trace.length - stackOffset - 1;
}
for (int i = methodCount; i > 0; i--) {
int stackIndex = i + stackOffset;
if (stackIndex >= trace.length) {
continue;
}

StackTraceElement element = trace[stackIndex];
if (isW) {
if (myDiskLogStrategy != null) {
myDiskLogStrategy.log(getLogContent(msg, element));
}
return;
}
if (TextUtils.isEmpty(tag)) {
tag = getTag(element);
}
switch (level) {
case 0:
Log.i(tag, getLogContent(msg, element));
break;
case 1:
Log.e(tag, getLogContent(msg, element));
break;
case 2:
Log.d(tag, getLogContent(msg, element));
break;
case 3:
Log.w(tag, getLogContent(msg, element));
break;
default:
Log.v(tag, msg);
break;
}


}
} catch (Exception e) {
e.printStackTrace();
}
}

private static String getTag(StackTraceElement element) {
String tag = "Tag_" + getModuleName(element.getClassName()) + "_" + getSimpleClassName(element.getClassName());
return tag;
}


private static String getLogContent(String msg, StackTraceElement element) {
StringBuilder builder = new StringBuilder();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
String time = sdf.format(new Date());
builder.append("\n")
.append("-------------------------------------------------------\n")
.append("|")
.append(time)
.append("\n")
.append("|")
.append(getSimpleClassName(element.getClassName()))
.append(".")
.append(element.getMethodName())
.append(" ")
.append(" (")
.append(element.getFileName())
.append(":")
.append(element.getLineNumber())
.append(")")
.append("\n")
.append("||==>")
.append(msg)
.append("\n")
builder.append("-------------------------------------------------------\n")
.append("|").append(" ID:").append(mId++).append("\n")
.append("|").append(time).append("\n")
.append("|").append(getSimpleClassName(element.getClassName())).append(".").append(element.getMethodName()).append(" ").append(" (").append(element.getFileName()).append(":")
.append(element.getLineNumber()).append(")").append("\n")
.append("||==>").append(msg).append("\n")
.append("-------------------------------------------------------\n");
return builder.toString();
}
@@ -186,4 +303,13 @@ public class L {
return name.substring(lastIndex + 1);
}

private static String getModuleName(@NonNull String name) {
String[] split = name.split("\\.");
String moduleName = "";
if (split.length > 2) {
moduleName = split[2];
}
return moduleName;
}

}

+ 171
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/MyDiskLogStrategy.java Просмотреть файл

@@ -0,0 +1,171 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.utils;

import android.os.Handler;
import android.os.Looper;
import android.os.Message;

import androidx.annotation.NonNull;

import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.List;


/**
* Abstract class that takes care of background threading the file log operation on Android.
* implementing classes are free to directly perform I/O operations there.
* <p>
* Writes all logs to the disk with CSV format.
*/
public class MyDiskLogStrategy {

@NonNull
private final Handler handler;

public MyDiskLogStrategy(@NonNull Handler handler) {
this.handler = checkNotNull(handler);
}

public void log(@NonNull String message) {
checkNotNull(message);
handler.sendMessage(handler.obtainMessage(1, message));
}

/**
* 保存缓存
*/
public void saveCache() {
//通知直接将缓存数据写入保存
handler.sendMessage(handler.obtainMessage(2, "saveCache"));
}

static class WriteHandler extends Handler {

@NonNull
private final String folder;
private final int maxFileSize;
private final String fileName;
private volatile List<String> mList;
private final int mListMax;

WriteHandler(@NonNull Looper looper, @NonNull String folder, String fileName, int maxFileSize,int listMax) {
super(checkNotNull(looper));
this.folder = checkNotNull(folder);
this.maxFileSize = maxFileSize;
this.fileName = fileName;
mList=new ArrayList<>();
mListMax=listMax;
}

@SuppressWarnings("checkstyle:emptyblock")
@Override
public void handleMessage(@NonNull Message msg) {

if (msg.what==1) {
//普通的保存数据,先判断缓存
String content = (String) msg.obj;
mList.add(content);
if (mList.size()<mListMax){
return;
}
}

FileWriter fileWriter = null;
File logFile = getLogFile(folder, fileName);
try {
fileWriter = new FileWriter(logFile, true);
// fileWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(logFile, true), StandardCharsets.UTF_8));
writeLog(fileWriter, mList);
// writeLog(fileWriter, content);
fileWriter.flush();
fileWriter.close();
} catch (IOException e) {
if (fileWriter != null) {
try {
fileWriter.flush();
fileWriter.close();
} catch (IOException e1) { /* fail silently */ }
}
}

}
private void writeLog(@NonNull OutputStreamWriter fileWriter, List<String> list) throws IOException {
if (list!=null) {
StringBuilder newStr= new StringBuilder();
for (String s : list) {
newStr.append(s);
}
writeLog(fileWriter,newStr.toString());
list.clear();
}
}

/**
* This is always called on a single background thread.
* Implementing classes must ONLY write to the fileWriter and nothing more.
* The abstract class takes care of everything else including close the stream and catching IOException
*
* @param fileWriter an instance of FileWriter already initialised to the correct file
*/
private void writeLog(@NonNull OutputStreamWriter fileWriter, @NonNull String content) throws IOException {
checkNotNull(fileWriter);
checkNotNull(content);
fileWriter.append(content);
}

private File getLogFile(@NonNull String folderName, @NonNull String fileName) {
checkNotNull(folderName);
checkNotNull(fileName);

File folder = new File(folderName);
if (!folder.exists()) {
//TODO: What if folder is not created, what happens then?
folder.mkdirs();
}

File newFile;
newFile = new File(folder, fileName);

if (newFile.exists()) {
long length=newFile.length();
if (length > maxFileSize) {
try {
byte[] fileByte=new byte[maxFileSize>>1];
RandomAccessFile randomAccessFileIn=new RandomAccessFile(newFile,"rw");
randomAccessFileIn.seek((length-fileByte.length));
randomAccessFileIn.read(fileByte);
randomAccessFileIn.close();
FileOutputStream fileOutputStream=new FileOutputStream(newFile);
fileOutputStream.write(fileByte);
fileOutputStream.flush();
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} else {
try {
newFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
return newFile;

}
}

public static <T> T checkNotNull(T obj) {
if (obj == null) {
throw new NullPointerException();
}
return obj;
}


}

+ 5
- 0
app/src/main/res/drawable/ic_baseline_share_24.xml Просмотреть файл

@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M18,16.08c-0.76,0 -1.44,0.3 -1.96,0.77L8.91,12.7c0.05,-0.23 0.09,-0.46 0.09,-0.7s-0.04,-0.47 -0.09,-0.7l7.05,-4.11c0.54,0.5 1.25,0.81 2.04,0.81 1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3 -3,1.34 -3,3c0,0.24 0.04,0.47 0.09,0.7L8.04,9.81C7.5,9.31 6.79,9 6,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c0.79,0 1.5,-0.31 2.04,-0.81l7.12,4.16c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.61 1.31,2.92 2.92,2.92 1.61,0 2.92,-1.31 2.92,-2.92s-1.31,-2.92 -2.92,-2.92z"/>
</vector>

+ 12
- 0
app/src/main/res/drawable/ic_info.xml Просмотреть файл

@@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="48dp"
android:height="48dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M512,981.3C253.9,981.3 42.7,770.1 42.7,512S253.9,42.7 512,42.7s469.3,211.2 469.3,469.3 -211.2,469.3 -469.3,469.3zM512,136.5c-206.5,0 -375.5,169 -375.5,375.5S305.5,887.5 512,887.5s375.5,-169 375.5,-375.5S718.5,136.5 512,136.5z"
android:fillColor="#ffffff"/>
<path
android:pathData="M512,796.7a46.1,46.1 0,0 1,-46.9 -46.9V480.6A46.1,46.1 0,0 1,512 433.8a46.1,46.1 0,0 1,46.9 46.9v269.1a46.1,46.1 0,0 1,-46.9 46.9zM512,364.9a46.1,46.1 0,0 1,-46.9 -46.9v-43.8A46.1,46.1 0,0 1,512 227.3a46.1,46.1 0,0 1,46.9 46.9v43.8A47,47 0,0 1,512 364.9z"
android:fillColor="#ffffff"/>
</vector>

+ 1
- 1
app/src/main/res/layout/activity_ble.xml Просмотреть файл

@@ -65,7 +65,7 @@
android:id="@+id/btnVersion"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读版本" />
android:text="读版本(BM)" />

<Button
android:id="@+id/btnBattery"

+ 0
- 70
app/src/main/res/layout/activity_eight_body_fat.xml Просмотреть файл

@@ -1,70 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<RadioGroup
android:id="@+id/unit"
android:layout_below="@+id/edit_Userid"
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_height="wrap_content">
<RadioButton
android:id="@+id/kg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="kg"/>
<RadioButton
android:id="@+id/jin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="斤"/>
<RadioButton
android:id="@+id/st_lb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="st:lb"/>
<RadioButton
android:id="@+id/lb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="lb"/>
</RadioGroup>
<RadioGroup
android:id="@+id/temp_unit"
android:layout_below="@+id/edit_Userid"
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_height="wrap_content">
<RadioButton
android:id="@+id/c"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="℃"/>
<RadioButton
android:id="@+id/f"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="℉"/>

</RadioGroup>
<Button
android:id="@+id/support_unit"
android:text="查询支持单位"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<ListView
android:id="@+id/log_list"
android:layout_marginTop="20dp"
android:layout_below="@id/unit"
android:layout_width="match_parent"
android:layout_height="match_parent">

</ListView>
</LinearLayout>

+ 3
- 499
app/src/main/res/layout/activity_main.xml Просмотреть файл

@@ -5,505 +5,9 @@
android:layout_height="match_parent"
android:orientation="vertical">

<LinearLayout
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_list"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_app_version"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:padding="10dp"
android:text="@string/version" />
<Button
android:id="@+id/btn_about"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="关于我们"
/>

</LinearLayout>


<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="5dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_clear_shake_hands"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
android:text="不握手不加密" />

<Button
android:id="@+id/btn_rope_skipping_set_mode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="跳绳设置模式" />

<Button
android:id="@+id/btn_broadcast_scale_weight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="广播体重秤"/>

<Button
android:id="@+id/btn_meat_probe"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="食物探针"/>
<Button
android:id="@+id/btn_meat_probe_charger"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="探针充电盒" />

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_sphy"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="BLE血压计" />

<Button
android:id="@+id/btn_sphy_wifi_ble"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="wifi血压计" />
<Button
android:id="@+id/btn_tempgun"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="额温枪" />

<Button
android:id="@+id/btn_temp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="体温计" />


</LinearLayout>

<LinearLayout

android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_height"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="身高仪" />

<Button
android:id="@+id/btn_lock"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
android:text="电子锁" />


<Button
android:id="@+id/btn_ad_weight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="艾迪体脂秤" />

<Button
android:id="@+id/btn_smart_mask"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="口罩" />
<Button
android:id="@+id/btn_baby"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="婴儿秤" />

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_baby_body_fat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="婴儿体脂两用秤" />

<Button
android:id="@+id/btn_broadcast_scale"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="广播秤" />

<Button
android:id="@+id/btn_broadcast_blood_oxygen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="血氧仪" />

</LinearLayout>

<LinearLayout

android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_wifi_ble_weight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="WiFi+Ble体脂秤" />

<Button
android:id="@+id/btn_ble_weight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Ble体脂秤" />

<Button
android:id="@+id/btn_wifi_ble_tooth"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="牙刷(wifi+ble)" />
</LinearLayout>

<LinearLayout

android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_ble"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Ble通用设置" />

<Button
android:id="@+id/btn_ble_test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

android:text="BleTest"

/>

<Button
android:id="@+id/btnConnectTest"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="BleConnectTest"

/>

</LinearLayout>

<LinearLayout

android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_public_ble_network"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="BLE通用配网" />

<Button
android:id="@+id/wifi_config"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="WIFI设备(配置wifi)"
android:visibility="gone"
/>

<Button
android:id="@+id/eight_scale"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="八极秤" />

<Button
android:id="@+id/glucometer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="血糖仪" />


</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button

android:id="@+id/btn_ota"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="OTA通用" />



<Button
android:id="@+id/btn_transmission"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="透传" />

<Button
android:id="@+id/btn_bld"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="百利达"
android:visibility="gone" />

<Button
android:id="@+id/btn_bleBo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="血氧(连接)" />


</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_coffeeScale"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="咖啡秤" />


<Button
android:id="@+id/btn_scooter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="电滑板" />

<Button
android:id="@+id/btn_shareCharger"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="共享充电器" />

<Button
android:id="@+id/btn_share_socket"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="共享插座" />


</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_broadcast_height"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="广播身高仪" />

<Button
android:id="@+id/btn_hbfs"
android:text="身高体脂秤"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_find"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="寻物器" />
<Button
android:id="@+id/btn_4g_bs"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="4G血糖仪" />

</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_food_temp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="食品温度计" />

<Button
android:id="@+id/btn_temp_humidity"
android:text="温湿度计"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

<Button
android:id="@+id/btn_share_condom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="共享套套机" />

<Button
android:id="@+id/btn_rope_skip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="跳绳" />

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_broadcast_nutrition"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="广播营养秤" />

<Button
android:id="@+id/btn_ble_nutrition"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="蓝牙营养秤" />

<Button
android:id="@+id/btn_toothbrush_test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="牙刷测试" />

<Button
android:id="@+id/btn_leaone_broadcast"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="LeaOne测试" />

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_fascia_gun"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="筋膜枪" />

<Button
android:id="@+id/btn_blood_pressure_tc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="血压计透传" />

<Button
android:id="@+id/btn_body_scale_4g"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="4G体脂秤" />

<Button
android:id="@+id/btn_scooter_cm02"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="电滑板Cm02" />

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_temp_instrument"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="测温仪" />


</LinearLayout>

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
android:id="@+id/btn_mqtt_air_detector"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="MQTT空气检测仪" />
<Button
android:id="@+id/btn_air_detector"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="空气检测仪" />
<Button
android:id="@+id/btn_mqtt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Mqtt工具" />
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_wifi_ble_noise_meter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="wifi+ble噪音计" />

<Button
android:id="@+id/btn_ble_noise_meter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ble噪音计" />

<Button
android:id="@+id/btn_weight_scale"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="体重秤"/>

</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_barometric_temp_humidity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="气压温湿度计" />


</LinearLayout>

</LinearLayout>
</ScrollView>

android:layout_height="match_parent" />

</LinearLayout>

+ 509
- 0
app/src/main/res/layout/activity_main_old.xml Просмотреть файл

@@ -0,0 +1,509 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_app_version"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:padding="10dp"
android:text="@string/version" />
<Button
android:id="@+id/btn_about"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="关于我们"
/>

</LinearLayout>


<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="5dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_clear_shake_hands"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
android:text="不握手不加密" />

<Button
android:id="@+id/btn_rope_skipping_set_mode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="跳绳设置模式" />

<Button
android:id="@+id/btn_broadcast_scale_weight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="广播体重秤"/>

<Button
android:id="@+id/btn_meat_probe"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="食物探针"/>
<Button
android:id="@+id/btn_meat_probe_charger"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="探针充电盒" />

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_sphy"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="BLE血压计" />

<Button
android:id="@+id/btn_sphy_wifi_ble"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="wifi血压计" />
<Button
android:id="@+id/btn_tempgun"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="额温枪" />

<Button
android:id="@+id/btn_temp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="体温计" />


</LinearLayout>

<LinearLayout

android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_height"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="身高仪" />

<Button
android:id="@+id/btn_lock"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
android:text="电子锁" />


<Button
android:id="@+id/btn_ad_weight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="艾迪体脂秤" />

<Button
android:id="@+id/btn_smart_mask"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="口罩" />
<Button
android:id="@+id/btn_baby"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="婴儿秤" />

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_baby_body_fat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="婴儿体脂两用秤" />

<Button
android:id="@+id/btn_broadcast_scale"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="广播秤" />

<Button
android:id="@+id/btn_broadcast_blood_oxygen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="血氧仪" />

</LinearLayout>

<LinearLayout

android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_wifi_ble_weight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="WiFi+Ble体脂秤" />

<Button
android:id="@+id/btn_ble_weight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Ble体脂秤" />

<Button
android:id="@+id/btn_wifi_ble_tooth"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="牙刷(wifi+ble)" />
</LinearLayout>

<LinearLayout

android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_ble"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Ble通用设置" />

<Button
android:id="@+id/btn_ble_test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

android:text="BleTest"

/>

<Button
android:id="@+id/btnConnectTest"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="BleConnectTest"

/>

</LinearLayout>

<LinearLayout

android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_public_ble_network"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="BLE通用配网" />

<Button
android:id="@+id/wifi_config"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="WIFI设备(配置wifi)"
android:visibility="gone"
/>

<Button
android:id="@+id/eight_scale"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="八极秤" />

<Button
android:id="@+id/glucometer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="血糖仪" />


</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button

android:id="@+id/btn_ota"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="OTA通用" />



<Button
android:id="@+id/btn_transmission"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="透传" />

<Button
android:id="@+id/btn_bld"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="百利达"
android:visibility="gone" />

<Button
android:id="@+id/btn_bleBo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="血氧(连接)" />


</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_coffeeScale"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="咖啡秤" />


<Button
android:id="@+id/btn_scooter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="电滑板" />

<Button
android:id="@+id/btn_shareCharger"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="共享充电器" />

<Button
android:id="@+id/btn_share_socket"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="共享插座" />


</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_broadcast_height"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="广播身高仪" />

<Button
android:id="@+id/btn_hbfs"
android:text="身高体脂秤"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_find"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="寻物器" />
<Button
android:id="@+id/btn_4g_bs"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="4G血糖仪" />

</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_food_temp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="食品温度计" />

<Button
android:id="@+id/btn_temp_humidity"
android:text="温湿度计"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

<Button
android:id="@+id/btn_share_condom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="共享套套机" />

<Button
android:id="@+id/btn_rope_skip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="跳绳" />

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_broadcast_nutrition"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="广播营养秤" />

<Button
android:id="@+id/btn_ble_nutrition"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="蓝牙营养秤" />

<Button
android:id="@+id/btn_toothbrush_test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="牙刷测试" />

<Button
android:id="@+id/btn_leaone_broadcast"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="LeaOne测试" />

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_fascia_gun"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="筋膜枪" />

<Button
android:id="@+id/btn_blood_pressure_tc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="血压计透传" />

<Button
android:id="@+id/btn_body_scale_4g"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="4G体脂秤" />

<Button
android:id="@+id/btn_scooter_cm02"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="电滑板Cm02" />

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_temp_instrument"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="测温仪" />


</LinearLayout>

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
android:id="@+id/btn_mqtt_air_detector"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="MQTT空气检测仪" />
<Button
android:id="@+id/btn_air_detector"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="空气检测仪" />
<Button
android:id="@+id/btn_mqtt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Mqtt工具" />
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_wifi_ble_noise_meter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="wifi+ble噪音计" />

<Button
android:id="@+id/btn_ble_noise_meter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ble噪音计" />

<Button
android:id="@+id/btn_weight_scale"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="体重秤"/>

</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btn_barometric_temp_humidity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="气压温湿度计" />


</LinearLayout>

</LinearLayout>
</ScrollView>


</LinearLayout>

+ 1
- 1
app/src/main/res/layout/activity_skateboard_data.xml Просмотреть файл

@@ -6,7 +6,7 @@
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
tools:context=".MainActivity">
tools:context=".home.MainActivity">

<ScrollView
android:layout_width="match_parent"

+ 1
- 1
app/src/main/res/layout/activity_skateboard_data_user.xml Просмотреть файл

@@ -6,7 +6,7 @@
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
tools:context=".MainActivity">
tools:context=".home.MainActivity">

<ScrollView
android:layout_width="match_parent"

+ 0
- 65
app/src/main/res/layout/activity_tooth_brush_ble.xml Просмотреть файл

@@ -1,65 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">



<Button
android:id="@+id/default_try_out"
android:layout_width="wrap_content"
android:layout_height="wrap_content"


android:layout_marginTop="5dp"
android:text="试用" />

<Button
android:id="@+id/default_mode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/sn"
android:layout_toEndOf="@id/default_try_out"
android:layout_marginStart="9dp"
android:layout_marginTop="5dp"
android:text="默认档位" />

<EditText
android:id="@+id/select_gears_et"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@id/default_mode"
android:layout_toEndOf="@id/default_mode"
android:hint="时长(s),档位,档位级别"

android:textSize="14dp" />



<Button
android:id="@+id/support_unit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

android:layout_below="@+id/default_mode"
android:layout_marginTop="5dp"
android:text="获取支持档位" />
<Button
android:id="@+id/default_time_mode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toEndOf="@id/support_unit"
android:layout_below="@+id/default_mode"
android:layout_marginTop="5dp"
android:text="获取时长和档位" />
<ListView
android:id="@+id/log_list"
android:layout_marginTop="10dp"
android:layout_below="@id/default_time_mode"
android:layout_width="match_parent"
android:layout_height="match_parent">

</ListView>
</RelativeLayout>

+ 4
- 4
app/src/main/res/layout/activity_weight_scale_wifi_ble.xml Просмотреть файл

@@ -185,7 +185,7 @@
android:inputType="text"
android:maxLines="1"
android:hint="IP or Url"
android:text="47.113.114.70" />
android:text="ailink.iot.aicare.net.cn" />

<EditText
android:id="@+id/et_port"
@@ -196,7 +196,7 @@
android:inputType="number"
android:maxLines="1"
android:hint="port"
android:text="8092" />
android:text="80" />

<EditText
android:id="@+id/et_path"
@@ -206,8 +206,8 @@
android:layout_marginEnd="10dp"
android:inputType="text"
android:maxLines="1"
android:hint="path"
android:text="/index/" />
android:hint="ps:/index/"
android:text="" />


<LinearLayout

+ 128
- 0
app/src/main/res/layout/activity_wifi_ble_ota.xml Просмотреть файл

@@ -0,0 +1,128 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="vertical">


<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:orientation="vertical">

<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp">

<TextView
android:id="@+id/tv_wifi_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="WIFI:"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<TextView
android:id="@+id/tv_wifi_ssid"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/tv_wifi_title"
app:layout_constraintTop_toTopOf="parent" />

<TextView
android:id="@+id/tv_wifi_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/tv_wifi_title"
app:layout_constraintTop_toTopOf="parent" />


<Button
android:id="@+id/btn_wifi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="配网"
app:layout_constraintEnd_toStartOf="@id/btn_read_wifi_status"
app:layout_constraintTop_toTopOf="parent" />


<Button
android:id="@+id/btn_read_wifi_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读状态"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>


<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp">


<Button
android:id="@+id/btn_start_ota"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="重新连接WIFI"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<TextView
android:id="@+id/tv_wifi_info"
android:layout_width="0dp"
android:layout_height="match_parent"
app:layout_constraintStart_toEndOf="@id/btn_start_ota"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginStart="10dp"
android:text="SSID:\nPWD:"
/>


</androidx.constraintlayout.widget.ConstraintLayout>



</LinearLayout>

</ScrollView>

<Button
android:id="@+id/clear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:text="清空" />

<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:padding="10dp"
android:stackFromBottom="true"
android:transcriptMode="alwaysScroll">

</ListView>

</LinearLayout>

+ 25
- 0
app/src/main/res/layout/item_home_list.xml Просмотреть файл

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="10dp"
app:cardBackgroundColor="@color/white"
app:cardCornerRadius="8dp"
android:foreground="?attr/selectableItemBackground"
app:cardElevation="0dp"
app:contentPadding="12dp">

<TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="@color/black"
android:textSize="18dp"
tools:text="item" />

</androidx.cardview.widget.CardView>

+ 11
- 0
app/src/main/res/menu/toolbar_menu.xml Просмотреть файл

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">

<item
android:id="@+id/toolbar_right_menu"
android:icon="@drawable/ic_info"
android:title="@string/about_us"
app:showAsAction="always" />

</menu>

+ 11
- 0
app/src/main/res/menu/toolbar_menu_share.xml Просмотреть файл

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">

<item
android:id="@+id/toolbar_right_menu"
android:icon="@drawable/ic_baseline_share_24"
android:title="@string/share"
app:showAsAction="always" />

</menu>

+ 60
- 0
app/src/main/res/values-zh/strings.xml Просмотреть файл

@@ -118,4 +118,64 @@
<string name="connecting_wifi">正在连接wifi...</string>
<string name="cancel">取消</string>
<string name="select_wifi">选择WIFI</string>
<string name="item_ble_general_settings">Ble通用设置</string>
<string name="item_ble_universal_distribution_network">BLE通用配网</string>
<string name="item_ble_test">Ble test</string>
<string name="item_ble_connect_test">Ble connect test</string>
<string name="item_ota">OTA通用</string>
<string name="item_penetrate">透传</string>
<string name="item_body_fat_scale_broadcast">广播秤</string>
<string name="item_body_fat_scale_ble">Ble体脂秤</string>
<string name="item_body_fat_scale_4g">4G体脂秤</string>
<string name="item_body_fat_scale_wifi_ble">WiFi+Ble体脂秤</string>
<string name="item_body_fat_scale_eight">八极秤</string>
<string name="item_body_fat_scale_aidi">艾迪体脂秤</string>
<string name="item_baby_scale">婴儿秤</string>
<string name="item_baby_body_fat_scale">婴儿体脂两用秤</string>
<string name="item_weight_scale_ble">Ble体重秤</string>
<string name="item_weight_scale_broadcast">广播体重秤</string>
<string name="item_nutritional_scale_ble">蓝牙营养秤</string>
<string name="item_nutritional_scale_broadcast">广播营养秤</string>
<string name="item_coffee_scale">咖啡秤</string>
<string name="item_height_body_fat_scale">身高体脂秤</string>
<string name="item_height_measuring_ble">身高仪</string>
<string name="item_height_measuring_broadcast">广播身高仪</string>
<string name="item_sphygmometer_ble">BLE血压计</string>
<string name="item_sphygmometer_wifi">wifi血压计</string>
<string name="item_sphygmometer_penetrate">血压计透传</string>
<string name="item_blood_glucose_meter_ble">血糖仪</string>
<string name="item_blood_glucose_meter_4g">4G血糖仪</string>
<string name="item_oximeter_broadcast">血氧仪(广播)</string>
<string name="item_oximeter_ble">血氧(连接)</string>
<string name="item_infrared_thermometer">额温枪</string>
<string name="item_thermometer">体温计</string>
<string name="item_auto_thermometer">测温仪</string>
<string name="item_food_thermometer">食品温度计</string>
<string name="item_meat_probe">食物探针</string>
<string name="item_probe_charging_box">探针充电盒</string>
<string name="item_toothbrush_wifi_ble">牙刷(wifi+ble)</string>
<string name="item_toothbrush_test">牙刷测试</string>
<string name="item_smart_mask">口罩</string>
<string name="item_fascia_gun">筋膜枪</string>
<string name="item_rope_skipping">跳绳</string>
<string name="item_rope_skipping_set_mode">跳绳设置模式</string>
<string name="item_hygrothermograph">温湿度计</string>
<string name="item_barothermohygrograph">气压温湿度计</string>
<string name="item_noise_meter_ble">ble噪音计</string>
<string name="item_noise_meter_wifi_ble">wifi+ble噪音计</string>
<string name="item_air_Detector">空气检测仪</string>
<string name="item_scooter">电滑板</string>
<string name="item_scooter_cm02">电滑板Cm02</string>
<string name="item_shared_charger">共享充电器</string>
<string name="item_shared_socket">共享插座</string>
<string name="item_condom">共享套套机</string>
<string name="item_finder">寻物器</string>
<string name="item_leaone">LeaOne测试</string>
<string name="item_no_handshake_encryption">不握手不加密</string>
<string name="item_electronic_locks">电子锁</string>
<string name="item_wifi_config">WIFI设备(配置wifi)</string>
<string name="about_us">关于我们</string>
<string name="share">分享</string>
<string name="wifi_ble_ota_tool">WIFI+BLE OTA工具</string>
</resources>

+ 59
- 0
app/src/main/res/values/strings.xml Просмотреть файл

@@ -122,4 +122,63 @@
<string name="cancel">Cancel</string>
<string name="select_wifi">Select WIFI</string>

<string name="item_ble_general_settings">Ble general settings</string>
<string name="item_ble_universal_distribution_network">Ble distribution network</string>
<string name="item_ble_test">Ble test</string>
<string name="item_ble_connect_test">Ble connect test</string>
<string name="item_ota">OTA</string>
<string name="item_penetrate">Penetrate</string>
<string name="item_body_fat_scale_broadcast">Body fat scale (Broadcast)</string>
<string name="item_body_fat_scale_ble">Body fat scale (Ble)</string>
<string name="item_body_fat_scale_4g">Body fat scale (4G)</string>
<string name="item_body_fat_scale_wifi_ble">Body fat scale (WiFi+Ble)</string>
<string name="item_body_fat_scale_eight">Eight-electrode body fat scale</string>
<string name="item_body_fat_scale_aidi">Body fat scale (Aidi)</string>
<string name="item_baby_scale">Baby scale</string>
<string name="item_baby_body_fat_scale">Baby body fat scale</string>
<string name="item_weight_scale_ble">Weight scale (Ble)</string>
<string name="item_weight_scale_broadcast">Weight scale (Broadcast)</string>
<string name="item_nutritional_scale_ble">Nutrition scale (Ble)</string>
<string name="item_nutritional_scale_broadcast">Nutrition scale (Broadcast)</string>
<string name="item_coffee_scale">Coffee scale</string>
<string name="item_height_body_fat_scale">Height body fat scale</string>
<string name="item_height_measuring_ble">Height meter (Ble)</string>
<string name="item_height_measuring_broadcast">Height meter (Broadcast)</string>
<string name="item_sphygmometer_ble">Sphygmometer (Ble)</string>
<string name="item_sphygmometer_wifi">Sphygmometer (Wifi)</string>
<string name="item_sphygmometer_penetrate">Sphygmometer (Penetrate)</string>
<string name="item_blood_glucose_meter_ble">Blood pressure monitor (Ble)</string>
<string name="item_blood_glucose_meter_4g">Blood pressure monitor (4G)</string>
<string name="item_oximeter_broadcast">Oximeter (Broadcast)</string>
<string name="item_oximeter_ble">Oximeter (Ble)</string>
<string name="item_infrared_thermometer">Forehead thermometer</string>
<string name="item_thermometer">Thermometer</string>
<string name="item_auto_thermometer">Infrared thermometer</string>
<string name="item_food_thermometer">Food thermometer</string>
<string name="item_meat_probe">Meat probe</string>
<string name="item_probe_charging_box">Probe charging box</string>
<string name="item_toothbrush_wifi_ble">Toothbrush (wifi+ble)</string>
<string name="item_toothbrush_test">Toothbrush test</string>
<string name="item_smart_mask">Mask</string>
<string name="item_fascia_gun">Fascia gun</string>
<string name="item_rope_skipping">Skipping rope</string>
<string name="item_rope_skipping_set_mode">Skipping rope setting mode</string>
<string name="item_hygrothermograph">Hygrothermograph</string>
<string name="item_barothermohygrograph">Barothermohygrograph</string>
<string name="item_noise_meter_ble">Noise meter (ble)</string>
<string name="item_noise_meter_wifi_ble">Noise meter (WiFi+Ble)</string>
<string name="item_air_Detector">Air detector</string>
<string name="item_scooter">Scooter</string>
<string name="item_scooter_cm02">Scooter cm02</string>
<string name="item_shared_charger">Shared charger</string>
<string name="item_shared_socket">Shared socket</string>
<string name="item_condom">Shared condom</string>
<string name="item_finder">Item finder</string>
<string name="item_leaone">LeaOne test</string>
<string name="item_no_handshake_encryption">No handshake, no encryption</string>
<string name="item_electronic_locks">Electronic locks</string>
<string name="item_wifi_config">WIFI config</string>
<string name="about_us">About us</string>
<string name="share">Share</string>
<string name="wifi_ble_ota_tool">WIFI+BLE OTA工具</string>
</resources>

Загрузка…
Отмена
Сохранить