Kaynağa Gözat

1,增加wifi_ble设备对象,专用于配网和服务器相关设置

2,增加广播身高仪
3,增加气压温湿度计
master
陈福行 1 yıl önce
ebeveyn
işleme
d0fa991d92
39 değiştirilmiş dosya ile 2518 ekleme ve 175 silme
  1. 4
    3
      app/build.gradle
  2. 4
    0
      app/src/main/AndroidManifest.xml
  3. 1
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ADWeightScaleCmdActivity.java
  4. 1
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/AboutActivity.java
  5. 1
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BroadcastBloodOxygenActivity.java
  6. 1
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BroadcastScaleActivity.java
  7. 2
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/HeightCmdActivity.java
  8. 2
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/HeightWeightScaleActivity.java
  9. 34
    12
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/MainActivity.java
  10. 31
    30
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ShowBleActivity.java
  11. 7
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/WeightScaleBleActivity.java
  12. 2
    3
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/BleAppBaseActivity.java
  13. 2
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/BleBaseActivity.java
  14. 2
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/BleNewBaseActivity.java
  15. 0
    3
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/MyApplication.java
  16. 532
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/MoveDataDialogFragment.java
  17. 28
    17
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/ShowListDialogFragment.java
  18. 1
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/BleDemoActivity.java
  19. 18
    18
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/PublicBleNetworkCmdActivity.java
  20. 314
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/barometric_temp_humidity/BarometricTempHygrometerActivity.java
  21. 214
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/barometric_temp_humidity/EditParamsDialog.java
  22. 93
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/barometric_temp_humidity/InstructionAdapter.java
  23. 27
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/barometric_temp_humidity/InstructionBean.java
  24. 1
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/broadcast_weight_sacle/BroadcastWeightScaleActivity.java
  25. 1
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/meat_probe_charger/MeatProbeChargerActivity.java
  26. 1
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/ropeskipping/RopeSkippingSetActivity.java
  27. 1
    1
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/toothbrush/ToothBrushWifiBleActivity.java
  28. 34
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/toothbrush_test/ToothbrushTestActivity.java
  29. 697
    0
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/wifible_sphy/WifiBleSphyActivity.java
  30. 3
    2
      app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/MyBleStrUtils.java
  31. 1
    1
      app/src/main/res/layout/activity_air_detector_test.xml
  32. 85
    0
      app/src/main/res/layout/activity_barometric_temp_humidity.xml
  33. 32
    10
      app/src/main/res/layout/activity_main.xml
  34. 17
    27
      app/src/main/res/layout/activity_sphy.xml
  35. 249
    0
      app/src/main/res/layout/activity_sphy_wifi_ble.xml
  36. 3
    3
      app/src/main/res/layout/activity_transmission.xml
  37. 34
    14
      app/src/main/res/layout/dialog_list_data_fillet.xml
  38. 14
    18
      app/src/main/res/layout/dialog_move_data.xml
  39. 24
    0
      app/src/main/res/layout/item_instruction.xml

+ 4
- 3
app/build.gradle Dosyayı Görüntüle

@@ -6,7 +6,7 @@ android {
applicationId "aicare.net.cn.sdk.ailinksdkdemoandroid"
minSdkVersion 19
targetSdkVersion 31
versionName "1.11.9"
versionName "1.11.10"
versionCode getVersionCodeNumber(versionName)
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
@@ -64,10 +64,11 @@ dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.4.2'
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.13.11'//蓝牙核心库
implementation 'com.github.elinkthings:AILinkSDKRepositoryAndroid:1.14.1'//蓝牙核心库
implementation 'com.github.elinkthings:AILinkSDKOtaLibraryAndroid:1.0.3'//OTA库,需要依赖核心库
implementation 'com.github.elinkthings:AILinkSDKParsingLibraryAndroid:1.8.4'//蓝牙解析库
implementation 'com.github.elinkthings:AILinkSDKParsingLibraryAndroid:1.9.1'//蓝牙解析库
implementation 'androidx.recyclerview:recyclerview:1.2.1'
implementation 'com.jakewharton:butterknife:10.2.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.0'

+ 4
- 0
app/src/main/AndroidManifest.xml Dosyayı Görüntüle

@@ -113,6 +113,10 @@
<activity
android:name=".modules.broadcast_weight_sacle.BroadcastWeightScaleActivity"
android:screenOrientation="unspecified" />
<activity
android:name=".modules.barometric_temp_humidity.BarometricTempHygrometerActivity"
android:screenOrientation="portrait" />
<activity android:name=".modules.wifible_sphy.WifiBleSphyActivity" />

<provider
android:name="androidx.core.content.FileProvider"

+ 1
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ADWeightScaleCmdActivity.java Dosyayı Görüntüle

@@ -31,6 +31,7 @@ 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 java.util.ArrayList;
import java.util.List;


+ 1
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/AboutActivity.java Dosyayı Görüntüle

@@ -5,6 +5,7 @@ import android.view.View;

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.AppBaseActivity;


/**
* xing<br>
* 2022/4/6<br>

+ 1
- 1
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BroadcastBloodOxygenActivity.java Dosyayı Görüntüle

@@ -232,7 +232,7 @@ public class BroadcastBloodOxygenActivity extends BleBaseActivity implements OnC
int vid = bleValueBean.getVid();
int pid = bleValueBean.getPid();
if (mDevice != null)
mDevice.onNotifyData(manufacturerData, cid, vid, pid);
mDevice.onNotifyData("",manufacturerData, cid, vid, pid);
}
}


+ 1
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/BroadcastScaleActivity.java Dosyayı Görüntüle

@@ -35,7 +35,6 @@ import cn.net.aicare.modulelibrary.module.BroadcastScale.BroadcastScaleDeviceDat
import cn.net.aicare.modulelibrary.module.babyscale.BabyBleConfig;



/**
* xing<br>
* 2020/08/10<br>
@@ -378,7 +377,7 @@ public class BroadcastScaleActivity extends BleNewBaseActivity implements OnCall
int vid = bleValueBean.getVid();
int pid = bleValueBean.getPid();
if (mDevice != null) {
mDevice.onNotifyData( manufacturerData, cid, vid, pid);
mDevice.onNotifyData("", manufacturerData, cid, vid, pid);
}
}
}

+ 2
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/HeightCmdActivity.java Dosyayı Görüntüle

@@ -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;



+ 2
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/HeightWeightScaleActivity.java Dosyayı Görüntüle

@@ -15,13 +15,13 @@ import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.bean.SupportUnitBean;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.AllUnitUtils;

import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.AllUnitUtils;
import cn.net.aicare.algorithmutil.AlgorithmUtil;
import cn.net.aicare.algorithmutil.BodyFatData;
import cn.net.aicare.modulelibrary.module.HeightWeightScale.HeightBodyFatBleData;

+ 34
- 12
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/MainActivity.java Dosyayı Görüntüle

@@ -91,6 +91,7 @@ public class MainActivity extends AppCompatActivity {
}
});


MyListener listener = new MyListener();

// Button btn_shpy = findViewById(R.id.btn_sphy);
@@ -122,6 +123,7 @@ public class MainActivity extends AppCompatActivity {
// 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));
@@ -178,6 +180,7 @@ public class MainActivity extends AppCompatActivity {
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);
}
@@ -292,6 +295,9 @@ public class MainActivity extends AppCompatActivity {
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;
@@ -304,6 +310,9 @@ public class MainActivity extends AppCompatActivity {
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;
@@ -485,6 +494,9 @@ public class MainActivity extends AppCompatActivity {
// 食物探针
type = BleDeviceConfig.MEAT_PROBE;
break;
case R.id.btn_barometric_temp_humidity:
type = BleDeviceConfig.BAROMETRIC_TEMP_HUMIDITY;
break;
case R.id.btn_mqtt:

return;
@@ -544,12 +556,17 @@ public class MainActivity extends AppCompatActivity {
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 = HintDataDialogFragment.newInstance()
.setTitle("提示", 0)
.setCancel("取消", 0)
.setOk("确定", 0)
.setContent("请求开启定位服务", true)
.setOnDialogListener(new HintDataDialogFragment.onDialogListener() {
@Override
public void onSucceedListener(View v) {
startLocationActivity();
}
});
mHintDataDialog.show(getSupportFragmentManager());


@@ -584,12 +601,17 @@ public class MainActivity extends AppCompatActivity {
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 = 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());

}

+ 31
- 30
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ShowBleActivity.java Dosyayı Görüntüle

@@ -28,6 +28,7 @@ import androidx.core.app.ActivityCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.pingwang.bluetoothlib.bean.BleScanAddAilinkBean;
import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.config.BleConfig;
import com.pingwang.bluetoothlib.device.BleDevice;
@@ -38,9 +39,7 @@ import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import aicare.net.cn.sdk.ailinksdkdemoandroid.adapter.StringAdapter;
@@ -52,6 +51,7 @@ 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;
@@ -68,6 +68,7 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_socket.ShareSocketAc
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;
@@ -142,7 +143,9 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O

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

@@ -157,7 +160,8 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O
mBleValueList = new ArrayList<>();
RecyclerView recyclerView = findViewById(R.id.rv_data);
recyclerView.setLayoutManager(new LinearLayoutManager(mContext));
recyclerView.addItemDecoration(new MyItemDecoration(mContext, LinearLayoutManager.VERTICAL, 1, mContext.getResources().getColor(R.color.public_press_bg)));
recyclerView.addItemDecoration(new MyItemDecoration(mContext, LinearLayoutManager.VERTICAL, 1, mContext.getResources()
.getColor(R.color.public_press_bg)));
Button btn = findViewById(R.id.btn);
Button btn1 = findViewById(R.id.btn1);
Button clear = findViewById(R.id.clear);
@@ -186,12 +190,12 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O
mFilterName = et_filter_name.getText().toString().trim();
mFilterMac = et_filter_mac.getText().toString().trim();
if (mType == BleDeviceConfig.SMART_SCOOTER) {
Map<String, String> map = new HashMap<>();
map.put(SkateboardBleConfig.UUID_BROADCAST.toString(), "37,3,1");//37=0x0025=电滑板的cid
mBluetoothService.startScan(30 * 1000, map, BleConfig.UUID_SERVER_AILINK, SkateboardBleConfig.UUID_BROADCAST);
List<BleScanAddAilinkBean> list = new ArrayList<>();
list.add(new BleScanAddAilinkBean(0x37, 0x03, 0x01, SkateboardBleConfig.UUID_BROADCAST));
mBluetoothService.startScan(30 * 1000, list, BleConfig.UUID_SERVER_AILINK, SkateboardBleConfig.UUID_BROADCAST);
} else {
//0000FEE7=手表
mBluetoothService.startScan(1000, BleConfig.UUID_SERVER_AILINK, UUID.fromString("0000FEE7-0000-1000-8000-00805F9B34FB"), SkateboardBleConfig.UUID_BROADCAST);
mBluetoothService.startScan(30 * 1000, BleConfig.UUID_BROADCAST_AILINK, BleConfig.UUID_SERVER_BROADCAST_AILINK, UUID.fromString("0000FEE7-0000-1000-8000-00805F9B34FB"), SkateboardBleConfig.UUID_BROADCAST);
}
mBleValueList.clear();
listAdapter.notifyDataSetChanged();
@@ -203,7 +207,7 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O
@Override
public void onClick(View v) {
if (mBluetoothService != null) {
mBluetoothService.stopScan();
mBluetoothService.stopScan(10000);
}
}
});
@@ -292,7 +296,11 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O
}
String data2 = BleStrUtils.byte2HexStr(bleValueBean.getManufacturerData());
showData.append(data2);
HintDataDialogFragment.newInstance().setTitle("自定义厂商数据", 0).setContent(showData.toString(), false).setOk("", 0).show(getSupportFragmentManager());
HintDataDialogFragment.newInstance()
.setTitle("自定义厂商数据", 0)
.setContent(showData.toString(), false)
.setOk("", 0)
.show(getSupportFragmentManager());
}
});
recyclerView.setAdapter(listAdapter);
@@ -329,10 +337,9 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O
BleValueBean bleValueBean = mBleValueList.get(i);
if (bleValueBean.equals(data)) {
bleValueBean.setRssi(data.getRssi());
if (!oldData) {
oldData = true;
}
oldData = true;
listAdapter.notifyItemChanged(i);
break;
}
}
if (!oldData) {
@@ -384,9 +391,11 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O
intent.setClass(ShowBleActivity.this, TempGunCmdActivity.class);
break;
case BleDeviceConfig.BLOOD_PRESSURE:
case BleDeviceConfig.SPHY_WIFI_BLE:
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;
@@ -529,7 +538,10 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O
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;
@@ -561,7 +573,6 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O
@Override
public boolean onFilter(BleValueBean bleValueBean) {
int cid = bleValueBean.getCid();
BleLog.i(TAG, "绑定设备广播类型:" + cid + "||添加的类型:" + mType);
boolean nameAndMac = false;
if (TextUtils.isEmpty(mFilterName) && TextUtils.isEmpty(mFilterMac)) {
nameAndMac = true;
@@ -586,6 +597,9 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O
if (mScanCid == BleDeviceConfig.FOOD_TEMP && nameAndMac) {
return cid == BleDeviceConfig.FOOD_TEMP || cid == 63;
}
// if (mScanCid == BleDeviceConfig.BLOOD_PRESSURE && nameAndMac) {
// return cid == BleDeviceConfig.BLOOD_PRESSURE || cid == BleDeviceConfig.SPHY_WIFI_BLE;
// }
if (mScanCid < 0) {
return nameAndMac;
} else {
@@ -596,24 +610,11 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O


private boolean isCheckDevice(int scanCid, int cid, boolean nameAndMac) {
boolean okDevice = false;
if (scanCid == BleDeviceConfig.BLOOD_PRESSURE) {
//血压计包含wifi+bel
if (nameAndMac) {
okDevice = (scanCid == cid) || (cid == BleDeviceConfig.SPHY_WIFI_BLE);
}
} else {
okDevice = scanCid == cid && nameAndMac;
}
boolean okDevice = scanCid == cid && nameAndMac;
return okDevice;
}


@Override
public void onScanRecord(BleValueBean mBle) {
//TODO 过滤后的设备
}

@Override
public void onScanTimeOut() {


+ 7
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/WeightScaleBleActivity.java Dosyayı Görüntüle

@@ -303,11 +303,15 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl
break;
case BodyFatDataUtil.TEST_FINISH:
mlogList.add(0, "测量状态:" + status + " 测量完成");
if (bodyFatBleUtilsData != null) {
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().updataPresentUser(selectUser));
}
break;
case BodyFatDataUtil.MUC_REQUEST_USER_INFO:
mlogList.add(0, "测量状态:" + status + "请求用户信息");
if (bodyFatBleUtilsData != null)
if (bodyFatBleUtilsData != null) {
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setUserInfo(selectUser, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE));
}
break;
default:
mlogList.add(0, "测量状态:" + status);
@@ -502,8 +506,9 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl
int userid = Integer.parseInt(mEditText.getText().toString().trim());
if (mUsers.size() >= userid) {
selectUser = mUsers.get(userid - 1);
if (bodyFatBleUtilsData != null)
if (bodyFatBleUtilsData != null) {
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().updataPresentUser(selectUser));
}
}
}
break;

+ 2
- 3
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/BleAppBaseActivity.java Dosyayı Görüntüle

@@ -15,11 +15,10 @@ import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar;

import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.CheckPermissionUtils;

import java.lang.ref.WeakReference;

import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.CheckPermissionUtils;
import butterknife.ButterKnife;
import butterknife.Unbinder;


+ 2
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/BleBaseActivity.java Dosyayı Görüntüle

@@ -12,9 +12,11 @@ import com.pingwang.bluetoothlib.AILinkBleManager;
import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.config.BleConfig;
import com.pingwang.bluetoothlib.utils.BleLog;

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


/**
* xing<br>
* 2019/4/25<br>

+ 2
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/BleNewBaseActivity.java Dosyayı Görüntüle

@@ -10,9 +10,11 @@ import com.pingwang.bluetoothlib.AILinkBleManager;
import com.pingwang.bluetoothlib.bean.BleValueBean;
import com.pingwang.bluetoothlib.config.BleConfig;
import com.pingwang.bluetoothlib.utils.BleLog;

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


/**
* xing<br>
* 2019/4/25<br>

+ 0
- 3
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/MyApplication.java Dosyayı Görüntüle

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

import android.app.Application;

import com.pingwang.bluetoothlib.AILinkSDK;

public class MyApplication extends Application {

private static MyApplication sInstance;
@@ -12,7 +10,6 @@ public class MyApplication extends Application {
public void onCreate() {
super.onCreate();
sInstance = this;
AILinkSDK.getInstance().init(this);
}

public static MyApplication getInstance(){

+ 532
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/MoveDataDialogFragment.java Dosyayı Görüntüle

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

import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.Editable;
import android.text.InputFilter;
import android.text.InputType;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.TextView;

import androidx.annotation.ColorInt;
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.FragmentManager;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.regex.Pattern;

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


/**
* 修改信息的弹框
*/
public class MoveDataDialogFragment extends DialogFragment implements View.OnClickListener {

private String TAG = MoveDataDialogFragment.class.getName();

public static final int EMAIL = 2;
public static final int NAME = 1;
public static final int PAW = 3;

@IntDef({EMAIL, NAME, PAW})
@Retention(RetentionPolicy.SOURCE)
public @interface MoveDataType {
}

private Context mContext;

private OnDialogListener mOnDialogListener;
private EditText mEtName;
private TextView mTvCancel, mTvSucceed, mTvTitle, mTvTitleHint;
private int mNameLength = 32;
private CharSequence mTitle = "";
private CharSequence mTitleHint;
private CharSequence mContent = "";
private CharSequence mContentHint = "";
private CharSequence mCancel = "";
@ColorInt
private int mCancelColor = 0;
private CharSequence mOkStr = "";
private String mRegular = "";
@ColorInt
private int mOkColor = 0;
private boolean mBottom;
/**
* 点击确定后是否自动关闭,默认true
*/
private boolean autoDismiss = true;
/**
* 是否显示灰色背景
*/
private boolean mBackground = true;

/**
* 点击空白区域是否关闭
*/
private boolean mCancelBlank;

/**
* 是否显示
*/
private boolean mShow;
/**
* 类型
*/
private int mType;
/**
* 确认按钮背景
*/
private Drawable drawable;


public static MoveDataDialogFragment newInstance() {
return new MoveDataDialogFragment();
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(STYLE_NO_FRAME, R.style.MyDialog);
}

@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
setStyle(STYLE_NO_FRAME, R.style.MyDialog);

Dialog dialogView = new Dialog(requireContext(), R.style.MyDialog);// 创建自定义样式dialog
dialogView.setCancelable(false);//设置是否可以关闭
dialogView.setCanceledOnTouchOutside(mCancelBlank);//设置点击空白处是否可以取消
dialogView.setOnKeyListener((dialog, keyCode, event) -> {
if (mCancelBlank) {
return false;
} else {
//返回不关闭
return keyCode == KeyEvent.KEYCODE_BACK;
}
});
return dialogView;
}


@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.dialog_move_data, container);
}


@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mContext = view.getContext();
init(view, mType);
initData(mTitle, mTitleHint, mContent, mContentHint, mCancelColor, mOkColor, mType);
}


@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Dialog dialog = getDialog();
if (dialog != null) {
Window window = dialog.getWindow();
if (window != null) {
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
WindowManager.LayoutParams params = window.getAttributes();
if (mBackground) {
params.dimAmount = 0.5f;
} else {
params.dimAmount = 0f;
}
if (mBottom) {
params.y = 10;//设置Dialog距离底部的距离
params.gravity = Gravity.BOTTOM;
}
window.setAttributes(params);
}
}
}


/**
* 初始化控件
*/
private void init(View view, int type) {
mEtName = view.findViewById(R.id.et_move_data_context);
mTvCancel = view.findViewById(R.id.tv_move_data_cancel);
mTvSucceed = view.findViewById(R.id.tv_move_data_ok);
mTvTitle = view.findViewById(R.id.tv_move_data_title);
mTvTitleHint = view.findViewById(R.id.tv_move_data_title_hint);
if (type == NAME) {
mEtName.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}

@Override
public void afterTextChanged(Editable s) {
String name = s.toString().trim();
if (name.length() > mNameLength) {
mEtName.setText(name.substring(0, mNameLength));
mEtName.setSelection(mEtName.getText().length());
}
}
});
} else if (type == EMAIL) {
mEtName.setInputType(InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);
mEtName.setSelection(mEtName.getText().length());
}
if (!TextUtils.isEmpty(mRegular)) {
mEtName.setFilters(new InputFilter[]{(charSequence, start, end, dest, dstart, dend) -> {
boolean isChinese = Pattern.matches(mRegular, charSequence.toString());
if (isChinese) {
return "";
}
return null;
}});
}
if (mOnDialogListener != null) {
mOnDialogListener.onModifyName(mEtName);
}
mTvCancel.setOnClickListener(this);
mTvSucceed.setOnClickListener(this);
}

/**
* 点击确定后是否自动关闭,默认true
*
* @param autoDismiss 默认true
* @return MoveDataDialogFragment
*/
public MoveDataDialogFragment setAutoDismiss(boolean autoDismiss) {
this.autoDismiss = autoDismiss;
return this;
}


@Override
public void onClick(View v) {
int i = v.getId();
if (i == R.id.tv_move_data_cancel) {
if (mOnDialogListener != null) {
mOnDialogListener.onCancelListener(v);
}
dismiss();
} else if (i == R.id.tv_move_data_ok) {
if (mOnDialogListener != null) {
String data = mEtName.getText().toString().trim();
mOnDialogListener.onSucceedListener(v, data);
}
if (!mEtName.getText().toString().trim().isEmpty() && autoDismiss) {
dismiss();
}
}
}

/**
* 初始化数据
*
* @param title 标题
* @param titleHint 标题提示
* @param content 输入框内容
* @param contentHint 输入框提示
* @param cancelColor 取消颜色
* @param okColor 确定颜色
* @param type 类型(名称,email){@link MoveDataType}
*/
private void initData(CharSequence title, CharSequence titleHint, CharSequence content,
CharSequence contentHint, int cancelColor, int okColor, int type) {
setTitle(title, titleHint);
setContent(content, contentHint, type);
setCancel("", cancelColor);
setOk("", okColor, drawable);
}


/**
* @param content 输入框内容
* @param contentHint 输入框提示
* @param type {@link MoveDataType}
* @return
*/
public MoveDataDialogFragment setContent(CharSequence content, CharSequence contentHint, @MoveDataType int type) {
this.mType = type;
if (mType == NAME) {
if (mContent != null && mContent.length() > mNameLength) {
mContent = content.toString().substring(0, mNameLength);
} else {
this.mContent = content;
}
} else {
this.mContent = content;
}
this.mContentHint = contentHint;
if (mEtName != null) {
if (mContent != null && !mContent.equals("")) {
mEtName.setText(mContent);
mEtName.setSelection(mEtName.getText().length());
} else if (mContent == null) {
mEtName.setText("");
}
if (mContentHint != null && !mContentHint.equals("")) {
mEtName.setHint(mContentHint);
} else if (mContentHint == null || mContentHint.equals("")) {
mEtName.setHint("");
}
if (mType == PAW) {
mEtName.setInputType(8194);
mEtName.setFilters(new InputFilter[]{new InputFilter.LengthFilter(6)});
}


}
return this;
}


public MoveDataDialogFragment setTitle(CharSequence title, CharSequence titleHint) {
this.mTitle = title;
this.mTitleHint = titleHint;
if (mTvTitle != null) {
if (mTitle != null && !mTitle.equals("")) {
mTvTitle.setVisibility(View.VISIBLE);
mTvTitle.setText(mTitle);
} else if (mTitle == null) {
mTvTitle.setVisibility(View.GONE);
}
}
if (mTvTitleHint != null) {
if (mTitleHint != null && mTitleHint.length() != 0) {
mTvTitleHint.setVisibility(View.VISIBLE);
mTvTitleHint.setText(mTitleHint);
} else {
mTvTitleHint.setVisibility(View.GONE);
}
}
return this;
}

public MoveDataDialogFragment setCancel(CharSequence cancel, @ColorInt int cancelColor) {
this.mCancel = cancel;
this.mCancelColor = cancelColor;
if (mTvCancel != null) {
if (mCancel != null && !mCancel.equals("")) {
mTvCancel.setVisibility(View.VISIBLE);
mTvCancel.setText(mCancel);
} else if (mCancel == null) {
mTvCancel.setVisibility(View.GONE);
}
if (mCancelColor > 0) {
mTvCancel.setTextColor(mCancelColor);
}


}
return this;
}


/**
* 确认按钮
*/
public MoveDataDialogFragment setOk(CharSequence ok, @ColorInt int okColor) {

return setOk(ok, okColor, null);
}


public MoveDataDialogFragment setOk(CharSequence ok, @ColorInt int okColor, Drawable drawable) {
this.mOkStr = ok;
this.mOkColor = okColor;
this.drawable = drawable;
if (mTvSucceed != null) {
if (mOkStr != null && !mOkStr.equals("")) {
mTvSucceed.setVisibility(View.VISIBLE);
mTvSucceed.setText(mOkStr);
} else if (mOkStr == null) {
mTvSucceed.setVisibility(View.GONE);
}
if (mOkColor > 0) {
mTvSucceed.setTextColor(mOkColor);
}
if (drawable != null) {
mTvSucceed.setBackground(drawable);
}
}
return this;
}


/**
* 设置edittext输入的过滤
*
* @param regular 过滤的正则
* @return
*/
public MoveDataDialogFragment setFilters(String regular) {
this.mRegular = regular;
return this;
}


/**
* 设置dialog是否在底部
*/
public MoveDataDialogFragment setBottom(boolean bottom) {
mBottom = bottom;
return this;
}


/**
* 设置dialog是否有灰色背景,默认显示灰色背景
*/
public MoveDataDialogFragment setBackground(boolean background) {
mBackground = background;
return this;
}

/**
* 设置点击空白区域是否可以关闭,默认false
*/
public MoveDataDialogFragment setCancelBlank(boolean cancelable) {
mCancelBlank = cancelable;
return this;
}

public MoveDataDialogFragment setOnDialogListener(OnDialogListener mOnDialogListener) {
this.mOnDialogListener = mOnDialogListener;
return this;
}

public MoveDataDialogFragment setNameLength(int nameLength) {
mNameLength = nameLength;
return this;
}


public MoveDataDialogFragment setOkBack(int nameLength) {
mNameLength = nameLength;
return this;
}


/**
* 当前是否显示
*/
public boolean isShow() {
return mShow;
}


@Override
public void show(@NonNull FragmentManager manager, @Nullable String tag) {
try {
if (!mShow) {
super.show(manager, tag);
mShow = true;
}
} catch (Exception e) {
e.printStackTrace();
}
}


public void show(@NonNull FragmentManager manager) {
this.show(manager, "HintDataDialogFragment");
}


@Override
public void onDismiss(@NonNull DialogInterface dialog) {
super.onDismiss(dialog);
mShow = false;
}


@Override
public void dismiss() {
try {
mShow = false;
super.dismiss();
} catch (Exception e) {
e.printStackTrace();
}
}

public interface OnDialogListener {

/**
* 取消的点击事件
*/
default void onCancelListener(View v) {
}

/**
* 成功的点击事件
*/
default void onSucceedListener(View v, String data) {
}

/**
* 修改名称的控件
*/
default void onModifyName(EditText v) {
}


}


@Override
public void onDestroyView() {
super.onDestroyView();
mShow = false;
}


@Override
public void onStart() {
super.onStart();
Dialog dialog = getDialog();
if (dialog != null) {
dialog.setOnDismissListener(this);
DisplayMetrics dm = new DisplayMetrics();
if (getActivity() != null) {
getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);
if (dialog.getWindow() != null)
{
//设置宽度为80%
dialog.getWindow().setLayout((int) (dm.widthPixels * 0.8),
ViewGroup.LayoutParams.WRAP_CONTENT);
}
}
}
}
}

+ 28
- 17
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/ShowListDialogFragment.java Dosyayı Görüntüle

@@ -27,29 +27,31 @@ import java.util.ArrayList;
import java.util.List;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L;
import aicare.net.cn.sdk.ailinksdkdemoandroid.view.MyItemDecoration;

/**
* 列表显示的dialog
*
* @author xing
* @date 2023/09/23
*/
public class ShowListDialogFragment extends DialogFragment implements View.OnClickListener {
private String TAG = ShowListDialogFragment.class.getName();

private Context mContext;
private onDialogListener mOnDialogListener;
private TextView mTvCancel, mTvTitle;
private TextView mTvCancel, mTvTitle, tv_dialog_list_data_hint;
private RecyclerView rv_dialog_list;
private DialogStringImageAdapter mAdapter;
private int mCancelColor;
private CharSequence mCancel;
private CharSequence mTitle;
private CharSequence mCancel = "";
private CharSequence mTitle = "";
private ArrayList<DialogStringImageBean> mList;
private boolean mBottom;
/**
* 是否显示灰色背景
*/
private boolean mBackground=true;
private boolean mBackground = true;

/**
* 点击空白区域是否关闭
@@ -102,7 +104,6 @@ public class ShowListDialogFragment extends DialogFragment implements View.OnCli
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
L.i(TAG,"onActivityCreated");
Dialog dialog = getDialog();
if (dialog != null) {
Window window = dialog.getWindow();
@@ -124,7 +125,6 @@ public class ShowListDialogFragment extends DialogFragment implements View.OnCli
}



/**
* 初始化控件,数据
*/
@@ -132,10 +132,10 @@ public class ShowListDialogFragment extends DialogFragment implements View.OnCli
mTvTitle = view.findViewById(R.id.tv_dialog_list_data_title);
mTvCancel = view.findViewById(R.id.tv_dialog_photo_cancel);
rv_dialog_list = view.findViewById(R.id.rv_dialog_list);
tv_dialog_list_data_hint = view.findViewById(R.id.tv_dialog_list_data_hint);
rv_dialog_list.setLayoutManager(new LinearLayoutManager(mContext));
rv_dialog_list.addItemDecoration(new MyItemDecoration(mContext,
LinearLayoutManager.VERTICAL, 1,
mContext.getResources().getColor(R.color.public_press_bg)));
rv_dialog_list.addItemDecoration(new MyItemDecoration(mContext, LinearLayoutManager.VERTICAL, 1, mContext.getResources()
.getColor(R.color.public_press_bg)));

}

@@ -145,8 +145,9 @@ public class ShowListDialogFragment extends DialogFragment implements View.OnCli
*/
private void initData(ArrayList<DialogStringImageBean> list, CharSequence title, CharSequence cancel, int cancelColor) {

if (mList == null)
if (mList == null) {
mList = new ArrayList<>();
}
mAdapter = new DialogStringImageAdapter(mContext, mList, position -> {
if (mOnDialogListener != null) {
//item点击事件
@@ -185,8 +186,9 @@ public class ShowListDialogFragment extends DialogFragment implements View.OnCli
} else if (mCancel == null) {
mTvCancel.setVisibility(View.GONE);
}
if (mCancelColor != 0)
if (mCancelColor != 0) {
mTvCancel.setTextColor(mCancelColor);
}


}
@@ -199,10 +201,20 @@ public class ShowListDialogFragment extends DialogFragment implements View.OnCli
public ShowListDialogFragment setList(List<DialogStringImageBean> list) {
if (mList == null) {
mList = new ArrayList<>();
mList.addAll(list);
}
if (mAdapter != null)
mList.clear();
mList.addAll(list);
if (tv_dialog_list_data_hint != null) {
if (mList.size() == 0) {
tv_dialog_list_data_hint.setVisibility(View.VISIBLE);
} else {
tv_dialog_list_data_hint.setVisibility(View.GONE);
}
}

if (mAdapter != null) {
mAdapter.notifyDataSetChanged();
}
return this;
}

@@ -215,8 +227,9 @@ public class ShowListDialogFragment extends DialogFragment implements View.OnCli
public void onClick(View v) {
int i = v.getId();
if (i == R.id.tv_dialog_photo_cancel) {
if (mOnDialogListener != null)
if (mOnDialogListener != null) {
mOnDialogListener.onCancelListener(v);
}
dismiss();
}
}
@@ -263,7 +276,6 @@ public class ShowListDialogFragment extends DialogFragment implements View.OnCli
mShow = true;
}
} catch (Exception e) {
L.e(TAG, "显示异常");
e.printStackTrace();
}
}
@@ -287,7 +299,6 @@ public class ShowListDialogFragment extends DialogFragment implements View.OnCli
mShow = false;
super.dismiss();
} catch (Exception e) {
L.e(TAG, "关闭异常");
e.printStackTrace();
}
}

+ 1
- 1
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/BleDemoActivity.java Dosyayı Görüntüle

@@ -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;


+ 18
- 18
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/PublicBleNetworkCmdActivity.java Dosyayı Görüntüle

@@ -499,7 +499,7 @@ public class PublicBleNetworkCmdActivity extends BleBaseActivity implements OnCa
public SendBleBean checkWiFiState() {
byte[] bytes = new byte[1];
bytes[0] = 0x26;
return getSendBleBeam(bytes);
return getSendBleBean(bytes);
}


@@ -507,13 +507,13 @@ public class PublicBleNetworkCmdActivity extends BleBaseActivity implements OnCa
byte[] bytes = new byte[2];
bytes[0] = (byte) CmdConfig.GET_SCAN_WIFI_RESULT;
bytes[1] = 0x01;
return getSendBleBeam(bytes);
return getSendBleBean(bytes);
}

public SendBleBean getSnDeviceId() {
byte[] bytes = new byte[1];
bytes[0] = (byte) 0x93;
return getSendBleBeam(bytes);
return getSendBleBean(bytes);
}

public SendBleBean setWifiMac(String mac) {
@@ -521,9 +521,9 @@ public class PublicBleNetworkCmdActivity extends BleBaseActivity implements OnCa
bytes[0] = (byte) CmdConfig.SET_WIFI_MAC;
String[] s = mac.split(":");
for (int i = 0; i < s.length; i++) {
bytes[i + 1] = (byte) Integer.parseInt(s[i]);
bytes[i + 1] = (byte) Integer.parseInt(s[s.length -1 - i], 16);
}
return getSendBleBeam(bytes);
return getSendBleBean(bytes);

}

@@ -541,7 +541,7 @@ public class PublicBleNetworkCmdActivity extends BleBaseActivity implements OnCa
bytes1 = new byte[1];
bytes1[0] = (byte) 0x86;
}
return getSendBleBeam(bytes1);
return getSendBleBean(bytes1);
}


@@ -549,7 +549,7 @@ public class PublicBleNetworkCmdActivity extends BleBaseActivity implements OnCa
byte[] bytes = new byte[2];
bytes[0] = (byte) CmdConfig.DIS_OR_CON_WIFI;
bytes[1] = 0x01;
return getSendBleBeam(bytes);
return getSendBleBean(bytes);
}

/**
@@ -562,7 +562,7 @@ public class PublicBleNetworkCmdActivity extends BleBaseActivity implements OnCa
byte[] bytes = new byte[2];
bytes[0] = (byte) CmdConfig.DIS_OR_CON_WIFI;
bytes[1] = 0x00;
return getSendBleBeam(bytes);
return getSendBleBean(bytes);
}

/**
@@ -574,7 +574,7 @@ public class PublicBleNetworkCmdActivity extends BleBaseActivity implements OnCa
public SendBleBean getConnectWifiName() {
byte[] bytes = new byte[1];
bytes[0] = (byte) CmdConfig.GET_WIFI_NAME;
return getSendBleBeam(bytes);
return getSendBleBean(bytes);
}

/**
@@ -585,14 +585,14 @@ public class PublicBleNetworkCmdActivity extends BleBaseActivity implements OnCa
public SendBleBean getConnectWifiPwd() {
byte[] bytes = new byte[1];
bytes[0] = (byte) CmdConfig.GET_WIFI_PWD;
return getSendBleBeam(bytes);
return getSendBleBean(bytes);
}

public SendBleBean reset() {
byte[] bytes = new byte[2];
bytes[0] = 0x22;
bytes[1] = 0x01;
return getSendBleBeam(bytes);
return getSendBleBean(bytes);

}

@@ -600,19 +600,19 @@ public class PublicBleNetworkCmdActivity extends BleBaseActivity implements OnCa
public SendBleBean checkIp() {
byte[] bytes = new byte[1];
bytes[0] = (byte) 0x8c;
return getSendBleBeam(bytes);
return getSendBleBean(bytes);
}

public SendBleBean checkPort() {
byte[] bytes = new byte[1];
bytes[0] = (byte) 0x8e;
return getSendBleBeam(bytes);
return getSendBleBean(bytes);
}

public SendBleBean checkUrl() {
byte[] bytes = new byte[1];
bytes[0] = (byte) 0x97;
return getSendBleBeam(bytes);
return getSendBleBean(bytes);
}


@@ -628,7 +628,7 @@ public class PublicBleNetworkCmdActivity extends BleBaseActivity implements OnCa
bytes1[0] = (byte) 0x8b;
}

return getSendBleBeam(bytes1);
return getSendBleBean(bytes1);

}

@@ -638,7 +638,7 @@ public class PublicBleNetworkCmdActivity extends BleBaseActivity implements OnCa
bytes1[0] = (byte) 0x8d;
bytes1[1] = (byte) (port >> 8);
bytes1[2] = (byte) (port & 0xff);
return getSendBleBeam(bytes1);
return getSendBleBean(bytes1);
}


@@ -654,7 +654,7 @@ public class PublicBleNetworkCmdActivity extends BleBaseActivity implements OnCa
bytes1[0] = (byte) 0x96;
}

return getSendBleBeam(bytes1);
return getSendBleBean(bytes1);

}

@@ -765,7 +765,7 @@ public class PublicBleNetworkCmdActivity extends BleBaseActivity implements OnCa
}
}

private SendBleBean getSendBleBeam(byte[] bytes) {
private SendBleBean getSendBleBean(byte[] bytes) {
SendBleBean sendBleBean = new SendBleBean();
sendBleBean.setHex(bytes);
return sendBleBean;

+ 314
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/barometric_temp_humidity/BarometricTempHygrometerActivity.java Dosyayı Görüntüle

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

import android.app.AlertDialog;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;

import androidx.annotation.Nullable;
import androidx.lifecycle.Lifecycle;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.pingwang.bluetoothlib.AILinkBleManager;
import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;

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

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleNewBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig;
import cn.net.aicare.modulelibrary.module.BoraTempHumidity.BarometricTempHumidityBleData;
import cn.net.aicare.modulelibrary.module.BoraTempHumidity.BleSendUtils;

/**
* @author yesp
*/
public class BarometricTempHygrometerActivity extends BleNewBaseActivity implements BarometricTempHumidityBleData.BaroTempHygrometerListener,
OnCallbackBle, BarometricTempHumidityBleData.LogInterface {

private static final String TAG = "BarometricTempHygrometerActivity";
private BarometricTempHumidityBleData mBarometricTempHumidityBleData;
private String mAddress;
private ListView lvLogs;
private List<String> mLogList;
private ArrayAdapter<String> listAdapter;
private RecyclerView rvInstruction;
private InstructionAdapter mInstructionAdapter;
private List<String> mHistoryList;
private EditText etTime;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_barometric_temp_humidity);
initView();
}

private void initView() {
lvLogs = findViewById(R.id.lv_log);
mLogList = new ArrayList<>();
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mLogList);
lvLogs.setAdapter(listAdapter);
mHistoryList = new ArrayList<>();
rvInstruction = findViewById(R.id.rv_inst);
rvInstruction.setLayoutManager(new LinearLayoutManager(this));
mInstructionAdapter = new InstructionAdapter(this, getInstructionList());
rvInstruction.setAdapter(mInstructionAdapter);
mInstructionAdapter.setItemClickListener(this::sendInstruction);
etTime = findViewById(R.id.et_time);
}

public static ArrayList<InstructionBean> getInstructionList() {
ArrayList<InstructionBean> list = new ArrayList<>();

list.add(new InstructionBean(0, "获取支持功能"));
list.add(new InstructionBean(1, "获取设备状态"));
list.add(new InstructionBean(2, "设置设备变化阀值: 1℃, 1% , 10hpa"));
list.add(new InstructionBean(3, "设置设备变化阀值: 2℃, 2% , 20hpa"));
list.add(new InstructionBean(4, "读取设备的历史数据: time - 0"));
list.add(new InstructionBean(5, "读取设备的历史数据: 自定义time"));
list.add(new InstructionBean(6, "发下一组离线数据"));
list.add(new InstructionBean(7, "离线数据接收完毕"));
list.add(new InstructionBean(8, "设置采样频率(10s),保存频率(20s), 间隔(2s)"));
list.add(new InstructionBean(9, "设置采样频率(自定义)"));
list.add(new InstructionBean(10, "读取校准值"));
list.add(new InstructionBean(11, "设置校准值: +1℃, +1% , +10hpa"));
list.add(new InstructionBean(12, "设置校准值: -1℃, -1% , -10hpa"));
list.add(new InstructionBean(13, "开始寻物"));
list.add(new InstructionBean(14, "停止寻物"));
list.add(new InstructionBean(15, "读取蜂鸣器状态"));
list.add(new InstructionBean(16, "设置蜂鸣器-开"));
list.add(new InstructionBean(17, "设置蜂鸣器-关"));
list.add(new InstructionBean(18, "绑定设备"));
return list;
}

private void sendInstruction(InstructionBean bean) {
if (bean == null || mBarometricTempHumidityBleData == null) {
return;
}
byte[] sendBytes = null;
switch (bean.getIndex()) {
case 0:
sendBytes = BleSendUtils.getSupportFunction();
break;
case 1:
sendBytes = BleSendUtils.getDeviceStatus();
break;
case 2:
sendBytes = BleSendUtils.setThreshold(10, 10, 10);
break;
case 3:
sendBytes = BleSendUtils.setThreshold(20, 20, 20);
break;
case 4:
sendBytes = BleSendUtils.getOfflineRecord(0);
break;
case 5:
String time = etTime.getText().toString().trim();
if (TextUtils.isEmpty(time)) {
addLog("请在顶部输入时间");
return;
} else {
sendBytes = BleSendUtils.getOfflineRecord(Long.parseLong(time));
}
break;
case 6:
sendBytes = BleSendUtils.sendOfflineStatus(1);
break;
case 7:
sendBytes = BleSendUtils.sendOfflineStatus(0);
break;
case 8:
sendBytes = BleSendUtils.setFrequency(5, 10, 20);
break;
case 9:
EditParamsDialog dialog = EditParamsDialog.newInstance();
dialog.setOnDialogListener(new EditParamsDialog.OnDialogListener() {
@Override
public void tvCancelListener(View v) {
}

@Override
public void tvSucceedListener(View v, int value1, int value2, int value3) {
byte[] sendBytesT = BleSendUtils.setFrequency(value1, value2, value3);
mBarometricTempHumidityBleData.sendDataA7(sendBytesT);
addLog(bean.getName() + ", 发送的 payload 数据:\n" + BleStrUtils.byte2HexStr(sendBytesT));
}
});
dialog.show(getSupportFragmentManager());
break;
case 10:
sendBytes = BleSendUtils.getCalibration();
break;
case 11:
sendBytes = BleSendUtils.setCalibration(10, 10, 10);
break;
case 12:
sendBytes = BleSendUtils.setCalibration(-10, -10, -10);
break;
case 13:
sendBytes = BleSendUtils.findDevice(0);
break;
case 14:
sendBytes = BleSendUtils.findDevice(1);
break;
case 15:
sendBytes = BleSendUtils.getSound();
break;
case 16:
sendBytes = BleSendUtils.setSound(true);
break;
case 17:
sendBytes = BleSendUtils.setSound(false);
break;
case 18:
sendBytes = BleSendUtils.startBindDevice();
break;
default:
break;
}
if (sendBytes != null) {
mBarometricTempHumidityBleData.sendDataA7(sendBytes);
addLog(bean.getName() + ", 发送的 payload 数据:\n" + BleStrUtils.byte2HexStr(sendBytes));
}
}


@Override
public void onServiceSuccess() {
if (AILinkBleManager.getInstance() != null) {
mAddress = getIntent().getStringExtra("mac");
AILinkBleManager.getInstance().setOnCallbackBle(this);
BleDevice bleDevice = AILinkBleManager.getInstance().getBleDevice(mAddress);
BarometricTempHumidityBleData.init(bleDevice, BleDeviceConfig.BAROMETRIC_TEMP_HUMIDITY);
mBarometricTempHumidityBleData = BarometricTempHumidityBleData.getInstance();
mBarometricTempHumidityBleData.setBaroTempHygrometerListener(this);
mBarometricTempHumidityBleData.setLogInterface(this);
}
}

@Override
public void onDisConnected(String mac, int code) {
if (mac.equals(mAddress) && getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) {
BleLog.i(TAG, "设备断开连接,请退出重新连接");
new AlertDialog.Builder(this)
.setTitle("ERROR:")
.setMessage("\n" + "设备断开连接,请退出重新连接")
.setPositiveButton("确认", (dialog, which) -> finish())
.show();
}
}

private void addLog(String str) {
mLogList.add(str);
listAdapter.notifyDataSetChanged();
lvLogs.smoothScrollToPosition(listAdapter.getCount() - 1);
}

private void addLog(List<String> strList) {
mLogList.addAll(strList);
listAdapter.notifyDataSetChanged();
lvLogs.smoothScrollToPosition(listAdapter.getCount() - 1);
}


@Override
public void onServiceErr() {

}

@Override
public void unbindServices() {
AILinkBleManager.getInstance().disconnect(mAddress);
if (mBarometricTempHumidityBleData != null) {
mBarometricTempHumidityBleData.clear();
mBarometricTempHumidityBleData = null;
}
}

@Override
public void onDeviceStatus(int battery, long time, int temp, int humidity, int barometric) {
addLog("当前设备状态:电量:" + battery + ", 开机时间:" + time + ", 温度:" + temp / 10f + "℃, 湿度:" + humidity / 10 + "%, 气压:" + barometric);
}

@Override
public void onFunctionList(int calibration, int buzzerAlarm, int alarmFunction, int reportPunctually, int nightLight, int bgLight, int findDevice, byte[] bytes) {
addLog("当前支持功能:气压温湿度校准:" + (calibration == 1) +
", \n蜂鸣器报警:" + (buzzerAlarm == 1) +
", \n闹钟功能:" + (alarmFunction == 1) +
", \n整点报时:" + (reportPunctually == 1) +
", \n小夜灯:" + (nightLight == 1) +
", \n背光亮度:" + (bgLight == 1) +
", \n寻物功能:" + (findDevice == 1));
}

@Override
public void onOffLineRecordNum(long total, long sendNum) {
addLog("离线记录总数: " + "总数:" + total + ", 已发数量:" + sendNum);
addLog(mHistoryList);
mHistoryList.clear();
}

@Override
public void onOffLineRecord(long time, int temp, int humidity, int barometric) {
mHistoryList.add("离线记录:" + "时间:" + time + ", 温度:" + temp / 10f + "℃, 湿度:" + humidity / 10f + "%, 气压:" + barometric + "hpa");
}

@Override
public void onVersion(String version) {

}

@Override
public void onThreshold(int tempT, int humidityT, int barometricT) {
addLog("当前设备变化阀值:" + "温度:" + tempT / 10f + "℃, 湿度:" + humidityT / 10f + "%, 气压:" + barometricT + "hpa");
}

@Override
public void onFrequency(int samplingFrequency, int saveFrequency, int timerInterval) {
int interval = timerInterval * 100;
addLog("当前频率:" + "采样频率:" + samplingFrequency * interval + "ms, 保存频率:" + saveFrequency * interval + "ms, 设备定时器间隔:" + interval + "ms");
}

@Override
public void onFindDevice(int status) {
String result;
if (status == 0) {
result = "正在报警";
} else if (status == 1) {
result = "停止报警";
} else {
result = "未知";
}
addLog("寻物状态:" + result);
}

@Override
public void onBuzzer(boolean isOpen) {
addLog("蜂鸣器状态:" + (isOpen ? "开" : "关"));
}

@Override
public void onCalibration(int tempCal, int humidityCal, int barometricCal) {
addLog("当前校准值:" + "温度:" + tempCal / 10f + "℃, 湿度:" + humidityCal / 10f + "%, 气压:" + barometricCal + "hpa");
}

@Override
public void onBindStatus(boolean success) {
addLog("绑定设备结果:" + (success ? "成功" : "失败"));
}

@Override
public void onLog(byte[] bytes) {
addLog("接收到的 payload 数据:" + BleStrUtils.byte2HexStr(bytes));
}
}

+ 214
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/barometric_temp_humidity/EditParamsDialog.java Dosyayı Görüntüle

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

import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.FragmentManager;

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


public class EditParamsDialog extends DialogFragment implements View.OnClickListener {

/**
* 是否显示
*/

private EditText etContent1, etContent2, etContent3;
private TextView mTvCancel, mTvSucceed;
private boolean mShow;
private boolean mCancelBlank;
private Context mContext;
private OnDialogListener mOnDialogListener;




public static EditParamsDialog newInstance() {
return new EditParamsDialog();
}
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
Dialog dialogView = new Dialog(requireContext(), R.style.MyDialog);// 创建自定义样式dialog
dialogView.setCancelable(false);//设置是否可以关闭
dialogView.setCanceledOnTouchOutside(mCancelBlank);//设置点击空白处是否可以取消
dialogView.setOnKeyListener((dialog, keyCode, event) -> {
if (mCancelBlank) {
return false;
} else {
//返回不关闭
return keyCode == KeyEvent.KEYCODE_BACK;
}
});
return dialogView;
}


@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.dialog_edit_params, container);
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mContext = view.getContext();
init(view);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}


private void init(View view) {
etContent1 = view.findViewById(R.id.et_context1);
etContent2 = view.findViewById(R.id.et_context2);
etContent3 = view.findViewById(R.id.et_context3);
mTvCancel = view.findViewById(R.id.tv_cancel);
mTvSucceed = view.findViewById(R.id.tv_ok);
mTvCancel.setOnClickListener(this);
mTvSucceed.setOnClickListener(this);
}

@Override
public void onClick(View v) {
int i = v.getId();
if (i == R.id.tv_cancel) {
if (mOnDialogListener != null) {
mOnDialogListener.tvCancelListener(v);
}
dismiss();
} else if (i == R.id.tv_ok) {
if (mOnDialogListener != null) {
String content1 = etContent1.getText().toString().trim();
String content2 = etContent2.getText().toString().trim();
String content3 = etContent3.getText().toString().trim();
int value1 = 1;
int value2 = 30;
int value3 = 20;
try {
value1 = Integer.parseInt(content1);
if (value1 > 10 || value1 < 1) {
Toast.makeText(mContext, "采样频率输入有误", Toast.LENGTH_SHORT).show();
return;
}
} catch (NumberFormatException e) {
Toast.makeText(mContext, "采样频率输入有误", Toast.LENGTH_SHORT).show();
return;
}
try {
value2 = Integer.parseInt(content2);
if (value2 > 60 || value2 < 1) {
Toast.makeText(mContext, "保存频率输入有误", Toast.LENGTH_SHORT).show();
return;
}
} catch (NumberFormatException e) {
Toast.makeText(mContext, "保存频率输入有误", Toast.LENGTH_SHORT).show();
return;
}
try {
value3 = Integer.parseInt(content3);
if (value3 > 20 || value3 < 2) {
Toast.makeText(mContext, "设备定时器间隔输入有误", Toast.LENGTH_SHORT).show();
return;
}
} catch (NumberFormatException e) {
Toast.makeText(mContext, "设备定时器间隔输入有误", Toast.LENGTH_SHORT).show();
return;
}
mOnDialogListener.tvSucceedListener(v, value1, value2, value3);
}
dismiss();
}
}

public EditParamsDialog setOnDialogListener(OnDialogListener onDialogListener) {
mOnDialogListener = onDialogListener;
return this;
}

/**
* 当前是否显示
*/
public boolean isShow() {
return mShow;
}


@Override
public void show(@NonNull FragmentManager manager, @Nullable String tag) {
try {
if (!mShow) {
super.show(manager, tag);
mShow = true;
}
} catch (Exception e) {

e.printStackTrace();
}
}


public void show(@NonNull FragmentManager manager) {
this.show(manager, "DialogFragment");
}


@Override
public void onDismiss(@NonNull DialogInterface dialog) {
super.onDismiss(dialog);
mShow = false;
}


@Override
public void dismiss() {
try {
mShow = false;
super.dismiss();
} catch (Exception e) {
e.printStackTrace();
}
}

public interface OnDialogListener {

/**
* 取消的点击事件
*/
default void tvCancelListener(View v) {
}

/**
* 成功的点击事件
*/
default void tvSucceedListener(View v, int value1, int value2, int value3) {
}
}


@Override
public void onDestroyView() {
super.onDestroyView();
mShow = false;
}


}

+ 93
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/barometric_temp_humidity/InstructionAdapter.java Dosyayı Görüntüle

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

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;

/**
* 指令 adapter
*
* @author yesp
*/
public class InstructionAdapter extends RecyclerView.Adapter<InstructionAdapter.ViewHolder> {


private Context context;
private ArrayList<InstructionBean> list;

private ItemClickListener itemClickListener;

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

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

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

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

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
InstructionBean bean = list.get(position);
if (bean == null) {
return;
}
String content = bean.getName();
holder.tvContent.setText(content);
}


@Override
public int getItemCount() {
return list != null ? list.size() : 0;
}

public class ViewHolder extends RecyclerView.ViewHolder {
private TextView tvContent;

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

public interface ItemClickListener {

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

}

+ 27
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/barometric_temp_humidity/InstructionBean.java Dosyayı Görüntüle

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

public class InstructionBean {
private int index;
private String name;

public InstructionBean(int index, String name) {
this.index = index;
this.name = name;
}

public int getIndex() {
return index;
}

public void setIndex(int index) {
this.index = index;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

+ 1
- 1
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/broadcast_weight_sacle/BroadcastWeightScaleActivity.java Dosyayı Görüntüle

@@ -357,7 +357,7 @@ public class BroadcastWeightScaleActivity extends BleNewBaseActivity implements
int vid = bleValueBean.getVid();
int pid = bleValueBean.getPid();
if (mDevice != null) {
mDevice.onNotifyData(bleValueBean.getManufacturerData(), cid, vid, pid);
mDevice.onNotifyData(bleValueBean.getManufacturerData(),payload, cid, vid, pid);
}
}
}

+ 1
- 1
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/meat_probe_charger/MeatProbeChargerActivity.java Dosyayı Görüntüle

@@ -205,7 +205,7 @@ public class MeatProbeChargerActivity extends BleBaseActivity implements View.On
*/
private void cancelDialog() {
ShowListDialogFragment.newInstance().setTitle("选择探针").setCancel("取消", 0).setCancelBlank(true).setBackground(true).setBottom(false).setList(mDialogMacList)
.setOnDialogListener(new ShowListDialogFragment.onDialogListener() {
.setOnDialogListener(new ShowListDialogFragment.onDialogListener() {
@Override
public void onItemListener(int position) {
Toast.makeText(MeatProbeChargerActivity.this, mDialogMacList.get(position).getName() + "设置该指令", Toast.LENGTH_SHORT).show();

+ 1
- 1
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/ropeskipping/RopeSkippingSetActivity.java Dosyayı Görüntüle

@@ -149,7 +149,7 @@ public class RopeSkippingSetActivity extends BleBaseActivity implements View.OnC

private void refreshLog(String content) {
if (!isPauseLog) {
content=TimeUtils.getTime(System.currentTimeMillis())+content;
content= TimeUtils.getTime(System.currentTimeMillis())+content;
logList.add( content);
mArrayAdapter.notifyDataSetChanged();
}

+ 1
- 1
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/toothbrush/ToothBrushWifiBleActivity.java Dosyayı Görüntüle

@@ -295,7 +295,7 @@ public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.O

if (data.equals("") || data.length() > 8) {
dataPaw = data.trim();
mToothBrushWiFiBleUtilsData.setWifimac(wifimacMap.get(selectWifi));
mToothBrushWiFiBleUtilsData.setWifiMac(wifimacMap.get(selectWifi));
} else {
Toast.makeText(ToothBrushWifiBleActivity.this, "密码格式不对", Toast.LENGTH_SHORT).show();
}

+ 34
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/toothbrush_test/ToothbrushTestActivity.java Dosyayı Görüntüle

@@ -6,6 +6,7 @@ import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

@@ -105,6 +106,39 @@ public class ToothbrushTestActivity extends BleBaseActivity implements Toothbrus
recycler_view.setLayoutManager(new LinearLayoutManager(this));
recycler_view.setAdapter(mAdapter);
mAdapter.setOnSelectListener(this);

btn_toothbrush_prevent_splash_test = findViewById(R.id.btn_toothbrush_prevent_splash_test);
btn_toothbrush_prevent_splash = findViewById(R.id.btn_toothbrush_prevent_splash);
tv_toothbrush_status = findViewById(R.id.tv_toothbrush_status);
tv_toothbrush_status.setTag(false);
btn_toothbrush_prevent_splash_test.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ToothBrushBleUtilsData.init(mBleDevice, new ToothBrushBleUtilsData.BleToothBrushCallback() {
@Override
public void onPreventSplash(boolean support, boolean status) {
if (tv_toothbrush_status != null) {
tv_toothbrush_status.setText("是否支持防飞溅:" + support + "\n防飞溅当前开关:" + status);
tv_toothbrush_status.setTag(status);
}

}


});
ToothBrushBleUtilsData.getInstance().getPreventSplash();
}
});
btn_toothbrush_prevent_splash.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ToothBrushBleUtilsData instance = ToothBrushBleUtilsData.getInstance();
if (instance != null) {
boolean status = (boolean) tv_toothbrush_status.getTag();
instance.setPreventSplash(!status);
}
}
});
}

@Override

+ 697
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/wifible_sphy/WifiBleSphyActivity.java Dosyayı Görüntüle

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

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.EditText;
import android.widget.ListView;
import android.widget.TextView;

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

import com.pingwang.bluetoothlib.config.CmdConfig;
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.OnBleVersionListener;
import com.pingwang.bluetoothlib.listener.OnCallbackDis;
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 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.TimeUtils;
import cn.net.aicare.modulelibrary.module.sphygmomanometer.SphyBleConfig;
import cn.net.aicare.modulelibrary.module.sphygmomanometer.SphyWifiBleDeviceData;
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 WifiBleSphyActivity extends BleBaseActivity implements OnCallbackDis, OnBleVersionListener, OnMcuParameterListener, OnBleCompanyListener, View.OnClickListener {

private static String TAG = WifiBleSphyActivity.class.getName();
private final int REFRESH_DATA = 3;
private List<String> mList;
private ArrayAdapter listAdapter;
private TextView tv_wifi_ssid, tv_wifi_status;
private EditText et_url, et_port, et_path;
private Context mContext;
private SphyWifiBleDeviceData mSphyWifiBleDeviceData;
private WifiBleDeviceData mWifiBleDeviceData;
private List<DialogStringImageBean> mWifiList = new ArrayList<>();
private String mAddress;
private BleSendCmdUtil mBleSendCmdUtil;
private int mType;
private int mCid;
private byte unit = 0;
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_sphy_wifi_ble);
mContext = this;
mAddress = getIntent().getStringExtra("mac");
mType = getIntent().getIntExtra("type", -1);
mCid = getIntent().getIntExtra("cid", -1);
mBleSendCmdUtil = BleSendCmdUtil.getInstance();
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_status = findViewById(R.id.tv_wifi_status);
et_url = findViewById(R.id.et_url);
et_port = findViewById(R.id.et_port);
et_path = findViewById(R.id.et_path);

findViewById(R.id.btnVersion).setOnClickListener(this);
findViewById(R.id.btnBattery).setOnClickListener(this);
findViewById(R.id.btn_get_did).setOnClickListener(this);
findViewById(R.id.btn_voice).setOnClickListener(this);
findViewById(R.id.clear).setOnClickListener(this);
findViewById(R.id.btn_wifi).setOnClickListener(this);
findViewById(R.id.btn_config).setOnClickListener(this);
findViewById(R.id.btn_read_config).setOnClickListener(this);
findViewById(R.id.btn_read_wifi_status).setOnClickListener(this);

cmdBtn();
}


private void cmdBtn() {
Button btn_set_unit = findViewById(R.id.btn_set_unit);
btn_set_unit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (unit == SphyBleConfig.SPHY_UNIT_MMHG) {
unit = SphyBleConfig.SPHY_UNIT_KPA;
mSphyWifiBleDeviceData.setUnit(unit);
} else {
unit = SphyBleConfig.SPHY_UNIT_MMHG;
mSphyWifiBleDeviceData.setUnit(unit);
}
}
});

Button btn_start = findViewById(R.id.btn_start);
btn_start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mSphyWifiBleDeviceData.startMeasuring();
}
});

Button btn_stop = findViewById(R.id.btn_stop);
btn_stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mSphyWifiBleDeviceData.stopMeasuring();
}
});
}


private int mVoiceStatus = 0;

@Override
public void onClick(View v) {
SendBleBean sendBleBean = new SendBleBean();
switch (v.getId()) {
case R.id.btnVersion:
sendBleBean.setHex(mBleSendCmdUtil.getBleVersion());
mSphyWifiBleDeviceData.sendData(sendBleBean);
break;
case R.id.btnBattery:
sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus());
mSphyWifiBleDeviceData.sendData(sendBleBean);
break;
case R.id.btn_get_did:
sendBleBean.setHex(mBleSendCmdUtil.getDid());
mSphyWifiBleDeviceData.sendData(sendBleBean);
break;
case R.id.btn_voice:
if (mVoiceStatus == 0) {
mVoiceStatus = 1;
} else {
mVoiceStatus = 0;

}
mSphyWifiBleDeviceData.setSphyVoice(mVoiceStatus);
break;

case R.id.clear:
if (mList != null)
mList.clear();
mHandler.sendEmptyMessage(REFRESH_DATA);
break;


case R.id.btn_config:

String ip = et_url.getText().toString().trim();
String port = et_port.getText().toString().trim();
String path = et_path.getText().toString().trim();
if (ip.length() == 0 || port.length() == 0) {
mList.add(TimeUtils.getTime() + "配置失败:ip或端口为空");
mHandler.sendEmptyMessage(REFRESH_DATA);
return;
}
setServiceInfo(ip, Integer.parseInt(port), path);
mList.add(TimeUtils.getTime() + "配置服务器信息中...");
mHandler.sendEmptyMessage(REFRESH_DATA);
break;

case R.id.btn_read_config:
getWifiConnectInfo();
break;

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


default:
break;
}
}


/**
* 获取wifi连接信息
*/
public void getWifiConnectInfo() {
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.getIp();
mWifiBleDeviceData.getPort();
mWifiBleDeviceData.getPath();
mWifiBleDeviceData.getDeviceSn();
}
}

/**
* 设置服务信息
*
* @param ip 知识产权
* @param port 港口
* @param path 路径
*/
public void setServiceInfo(String ip, int port, String path) {
if (mWifiBleDeviceData != null) {
mWifiBleDeviceData.setServiceInfo(ip, port, path);
}
}

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);
String ssid = wifiBleInfoBean.getSsid();
MoveDataDialogFragment.newInstance()
.setTitle(ssid, "")
.setContent("", "请输入密码", MoveDataDialogFragment.NAME)
.setOk("OK", 0)
.setCancel("取消", 0)
.setOnDialogListener(new MoveDataDialogFragment.OnDialogListener() {
@Override
public void onSucceedListener(View v, String data) {
String pwd = data.trim();
setConnectWifi(wifiBleInfoBean.getMac(), pwd);

}
})
.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);
}
}


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


@Override
public void onServiceSuccess() {
CallbackDisIm.getInstance().addListListener(this);
BleLog.i(TAG, "服务与界面建立连接成功");
//与服务建立连接
if (mBluetoothService != null) {
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress);
if (bleDevice != null) {
mSphyWifiBleDeviceData = SphyWifiBleDeviceData.getInstance(bleDevice);
mWifiBleDeviceData = mSphyWifiBleDeviceData.getWifiBleDeviceData();
mWifiBleDeviceData.setOnWiFiBleCallback(new WifiBleDeviceListener());
mSphyWifiBleDeviceData.setType(mCid);
mSphyWifiBleDeviceData.setOnNotifyData(new NotifyData());
mSphyWifiBleDeviceData.setOnBleVersionListener(WifiBleSphyActivity.this);
mSphyWifiBleDeviceData.setOnMcuParameterListener(WifiBleSphyActivity.this);
mSphyWifiBleDeviceData.setOnCompanyListener(WifiBleSphyActivity.this);
}
}
}

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


@Override
public void unbindServices() {
CallbackDisIm.getInstance().removeListener(this);
if (mSphyWifiBleDeviceData != null) {
mSphyWifiBleDeviceData.disconnect();
mSphyWifiBleDeviceData.clear();
mSphyWifiBleDeviceData = null;
}
}


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


@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 class NotifyData implements SphyWifiBleDeviceData.onNotifyData {
@Override
public void onData(byte[] status, int type) {
String data = "";
if (status != null)
data = BleStrUtils.byte2HexStr(status);
if (type == 100) {
mList.add(TimeUtils.getTime() + "send->" + data);
} else {
mList.add(TimeUtils.getTime() + "notify->" + data);
}
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onSphyCmd(byte cmd) {
String cmdStr = "";
switch (cmd) {
case SphyBleConfig.SHPY_CMD_START:
cmdStr += "开始测量";
break;
case SphyBleConfig.SHPY_CMD_STOP:
cmdStr += "停止测试";
break;
case SphyBleConfig.SHPY_CMD_MCU_START:
cmdStr += "mcu 开机";
break;
case SphyBleConfig.SHPY_CMD_MCU_STOP:
cmdStr += "mcu 关机";
break;
}
mList.add(TimeUtils.getTime() + "指令:" + cmdStr);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onSphyVoice(byte cmd) {
String cmdStr = "";
switch (cmd) {
case 0x00:
cmdStr += "打开语音";
break;
case 0x01:
cmdStr += "关闭语音";
break;
}
mList.add(TimeUtils.getTime() + "指令:" + cmdStr);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onSphyDataNow(int dia, int sys, int decimal, int pul, int unit) {
String diaStr = BleDensityUtil.getInstance().holdDecimals(dia, decimal);
String sysStr = BleDensityUtil.getInstance().holdDecimals(sys, decimal);
mList.add(TimeUtils.getTime() + "实时:舒张压=" + diaStr + " 收缩压=" + sysStr + " 心率=" + pul + " 单位=" + (unit == 0 ? "mmhg" : "kPa"));
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onSphyData(int dia, int sys, int decimal, int pul, int unit) {
String diaStr = BleDensityUtil.getInstance().holdDecimals(dia, decimal);
String sysStr = BleDensityUtil.getInstance().holdDecimals(sys, decimal);
mList.add(TimeUtils.getTime() + "稳定:舒张压=" + diaStr + " 收缩压=" + sysStr + " 心率=" + pul + " 单位=" + (unit == 0 ? "mmhg" : "kPa"));
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onUnit(int unit) {
String showData = "";
switch (unit) {
case CmdConfig.SETTING_SUCCESS:
showData = "设置单位成功";
break;
case CmdConfig.SETTING_FAILURE:
showData = "设置单位失败";

break;
case CmdConfig.SETTING_ERR:

showData = "设置单位错误";
break;
}
mList.add(TimeUtils.getTime() + showData);
mHandler.sendEmptyMessage(REFRESH_DATA);
}

@Override
public void onErr(byte status) {
String errStr = "";
switch ((int) status) {

case 0:
errStr += "未找到高压";
break;
case 1:
errStr += "无法正常加压,请检查是否插入袖带,或者重新插拔袖带气 管";
break;
case 2:
errStr += "电量低";
break;
case 3:
errStr += "传感器信号异常";
break;
case 4:
errStr += "测量结果异常";
break;
case 5:
errStr += "腕带过紧或气路堵塞";
break;
case 60:
errStr += "测量中压力干扰严重";
break;
case 7:
errStr += "压力超 290";
break;
case 8:
errStr += "标定数据异常或存储 IC 异常";
break;

}
mList.add(TimeUtils.getTime() + "错误:" + errStr);
mHandler.sendEmptyMessage(REFRESH_DATA);
}
}


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("蓝牙状态:" + bleStatus + "\nwifi状态:" + wifiStatusStr + "\n工作状态:" + workStatus);
mHandler.sendEmptyMessage(REFRESH_DATA);

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

@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("wifi正在连接中...");
mHandler.sendEmptyMessage(REFRESH_DATA);
}

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

}

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

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

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

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

@Override
public void onServerSettingInfo(boolean status) {
mList.add("服务器配置:" + (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");
}
}

+ 3
- 2
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/MyBleStrUtils.java Dosyayı Görüntüle

@@ -21,10 +21,11 @@ public class MyBleStrUtils {
for (byte aB : b) {
int a = aB & 0XFF;
stmp = getHexString(a);
if (stmp.length() == 1)
if (stmp.length() == 1) {
hs.append("0").append(stmp);
else
} else {
hs.append(stmp);
}
hs.append(" ");
}
return hs.toString();

+ 1
- 1
app/src/main/res/layout/activity_air_detector_test.xml Dosyayı Görüntüle

@@ -18,7 +18,7 @@
android:layout_margin="16dp"
android:text="开始\n测试"
android:textSize="18dp"
android:textColor="@color/public_white"
android:textColor="@color/white"
android:background="@drawable/ic_round"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />

+ 85
- 0
app/src/main/res/layout/activity_barometric_temp_humidity.xml Dosyayı Görüntüle

@@ -0,0 +1,85 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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">

<TextView
android:id="@+id/tv_ins"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="8dp"
android:gravity="center"
android:text="请选择指令"
android:textColor="@color/colorAccent"
android:textSize="16dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<TextView
android:id="@+id/tv_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="8dp"
android:gravity="center"
android:text="开机时间(读取历史记录):"
android:textColor="@color/colorAccent"
android:textSize="16dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_ins" />

<EditText
android:id="@+id/et_time"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:inputType="number"
android:hint="自定义time"
app:layout_constraintBottom_toBottomOf="@id/tv_time"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/tv_time"
app:layout_constraintStart_toEndOf="@id/tv_time" />

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_inst"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="4dp"
app:layout_constraintBottom_toTopOf="@id/mid_driver"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_time" />

<View
android:id="@+id/mid_driver"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/black"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<TextView
android:id="@+id/tv_logs"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="8dp"
android:gravity="center"
android:text="log:"
android:textColor="@color/colorAccent"
android:textSize="16dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/mid_driver" />

<ListView
android:id="@+id/lv_log"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_logs" />

</androidx.constraintlayout.widget.ConstraintLayout>

+ 32
- 10
app/src/main/res/layout/activity_main.xml Dosyayı Görüntüle

@@ -78,8 +78,13 @@
android:id="@+id/btn_sphy"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="血压计" />
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"
@@ -92,11 +97,7 @@
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
@@ -110,7 +111,12 @@
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
@@ -124,7 +130,11 @@
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>

@@ -142,7 +152,7 @@
android:id="@+id/btn_broadcast_scale"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="广播体脂秤" />
android:text="广播秤" />

<Button
android:id="@+id/btn_broadcast_blood_oxygen"
@@ -476,7 +486,19 @@
android:id="@+id/btn_weight_scale"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="连接体重秤"/>
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>


+ 17
- 27
app/src/main/res/layout/activity_sphy.xml Dosyayı Görüntüle

@@ -1,24 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:focusable="true"
android:focusableInTouchMode="true"
>
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"
>
android:layout_weight="1">

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

<LinearLayout
android:layout_width="match_parent"
@@ -26,13 +23,11 @@
android:padding="10dp">



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

<LinearLayout
@@ -44,31 +39,29 @@
android:id="@+id/btn_set_unit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="set_unit"
/>
android:text="set_unit" />

<Button
android:id="@+id/btn_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="start"
/>
android:text="start" />

<Button
android:id="@+id/btn_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="stop"
/>
android:text="stop" />
<Button
android:id="@+id/btn_voice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="voice"
/>
android:text="voice" />


</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -78,15 +71,13 @@
android:id="@+id/btn_get_did"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="get_did"
/>
android:text="get_did" />

<Button
android:id="@+id/btnVersion"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="version"
/>
android:text="version" />

<Button
android:id="@+id/btnBattery"
@@ -107,8 +98,7 @@
android:layout_weight="2"
android:padding="10dp"
android:stackFromBottom="true"
android:transcriptMode="alwaysScroll"
>
android:transcriptMode="alwaysScroll">


</ListView>

+ 249
- 0
app/src/main/res/layout/activity_sphy_wifi_ble.xml Dosyayı Görüntüle

@@ -0,0 +1,249 @@
<?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="3">

<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>


<View
android:layout_width="match_parent"
android:layout_height="0.1dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:background="#000000" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:orientation="horizontal">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="URL(IP):" />

<EditText
android:id="@+id/et_url"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="ailink.iot.aicare.net.cn" />
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:orientation="horizontal">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Port:" />

<EditText
android:id="@+id/et_port"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="number"
android:text="80" />
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:orientation="horizontal">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Path:" />

<EditText
android:id="@+id/et_path"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:orientation="horizontal">

<Button
android:id="@+id/btn_config"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="配置信息" />

<Button
android:id="@+id/btn_read_config"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读取信息" />


</LinearLayout>

<View
android:layout_width="match_parent"
android:layout_height="0.1dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:background="#000000" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="1dp"
android:padding="10dp">

<Button
android:id="@+id/btn_set_unit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="set_unit" />

<Button
android:id="@+id/btn_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="start" />

<Button
android:id="@+id/btn_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="stop" />

<Button
android:id="@+id/btn_voice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="voice" />


</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp">

<Button
android:id="@+id/btn_get_did"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="get_did" />

<Button
android:id="@+id/btnVersion"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="version" />

<Button
android:id="@+id/btnBattery"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Battery" />

</LinearLayout>


</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>

+ 3
- 3
app/src/main/res/layout/activity_transmission.xml Dosyayı Görüntüle

@@ -46,7 +46,7 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:digits="0123456789ABCDEFabcdef"
android:hint="输入payload数据" />
android:hint="输入payload数据(16进制)" />

<Button
android:id="@+id/send"
@@ -68,7 +68,7 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:digits="0123456789ABCDEFabcdef"
android:hint="输入payload数据" />
android:hint="输入payload数据(16进制)" />

<Button
android:id="@+id/send_a6"
@@ -89,7 +89,7 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:digits="0123456789ABCDEFabcdef"
android:hint="输入完整的指令"
android:hint="输入完整的指令(16进制)"
android:textColorHint="@color/colorAccent" />

<Button

+ 34
- 14
app/src/main/res/layout/dialog_list_data_fillet.xml Dosyayı Görüntüle

@@ -1,10 +1,10 @@
<?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:background="@drawable/bg_btn_white_dialog"
android:orientation="vertical">
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_btn_white_dialog"
android:orientation="vertical">


<TextView
@@ -15,19 +15,40 @@
android:padding="10dp"
android:text="请选择"
android:textColor="@android:color/black"
android:textSize="16dp"/>
android:textSize="16dp" />

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_dialog_list"
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:overScrollMode="never"
android:scrollbars="none"/>
android:layout_height="wrap_content">

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_dialog_list"
android:layout_width="match_parent"
android:layout_height="200dp"
android:overScrollMode="never"
android:padding="5dp"
android:scrollbars="none"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<TextView
android:id="@+id/tv_dialog_list_data_hint"
android:layout_width="match_parent"
android:layout_height="200dp"
android:gravity="center"
android:text="加载中..."
android:textSize="20dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />


</androidx.constraintlayout.widget.ConstraintLayout>


<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="@android:color/black"/>
android:background="@android:color/black" />

<TextView
android:id="@+id/tv_dialog_photo_cancel"
@@ -36,8 +57,7 @@
android:gravity="center"
android:padding="10dp"
android:text="取消"
android:textColor="@android:color/black"
/>
android:textColor="@android:color/black" />


</LinearLayout>

+ 14
- 18
app/src/main/res/layout/dialog_move_data.xml Dosyayı Görüntüle

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


<TextView
@@ -18,7 +18,7 @@
android:textSize="20dp"


/>
/>

<TextView

@@ -28,60 +28,56 @@
android:layout_marginTop="10dp"
android:gravity="center"
android:padding="10dp"
android:text="title_2"
android:text=""
android:textColor="#000000"
android:textSize="18dp"

/>
/>

<EditText
android:id="@+id/et_move_data_context"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="25dp"
android:layout_marginStart="25dp"
android:layout_marginTop="20dp"
android:layout_marginEnd="25dp"
android:focusable="true"
android:padding="8dp"
android:singleLine="true"
android:textColor="#000000"
android:textSize="18dp"
android:focusable="true"

/>




<TextView
android:id="@+id/tv_move_data_ok"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="25dp"
android:layout_marginStart="25dp"
android:layout_marginTop="40dp"
android:layout_marginEnd="25dp"
android:background="#2878ce"
android:gravity="center"
android:padding="10dp"
android:text="确认"
android:textColor="#ffffff"
android:textSize="18dp"
/>
android:textSize="18dp" />

<TextView
android:id="@+id/tv_move_data_cancel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="25dp"
android:layout_marginStart="25dp"
android:layout_marginTop="10dp"
android:layout_marginEnd="25dp"
android:gravity="center"
android:padding="10dp"
android:text="取消"
android:textSize="15dp"
/>
android:textSize="15dp" />

<View
android:layout_width="match_parent"
android:layout_height="20dp"/>
android:layout_height="20dp" />

</LinearLayout>

+ 24
- 0
app/src/main/res/layout/item_instruction.xml Dosyayı Görüntüle

@@ -0,0 +1,24 @@
<?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"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="12dp"
app:cardBackgroundColor="@android:color/holo_blue_dark"
app:cardCornerRadius="8dp"
app:cardElevation="0dp"
android:layout_marginStart="24dp"
android:layout_marginEnd="24dp"
app:contentPadding="8dp">

<TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:paddingStart="8dp"
android:paddingEnd="8dp"
android:textColor="@android:color/white"
android:textSize="18dp" />

</androidx.cardview.widget.CardView>

Loading…
İptal
Kaydet