- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello, Using the CY8KIT-042-BLE-A kit and made a demo using the CySmart Android App found here:
https://www.cypress.com/documentation/software-and-drivers/cysmart-mobile-app
How do I remove the GATT DB Screen from the Carousel View? While GATT DB service is very handy for debug I would like to remove it for my demo and be able to easily put it back for debug. I tried things like mPager.removeViewsInLayout(3, 1); and mPager.removeViewAt(3); but these attempts just made the app crash.
From CySmart Android App User Guide.pdf
Thanks!
Mark
Solved! Go to Solution.
- Labels:
-
BLE
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
The reason you see the error is because when you remove the view, you haven't notified the adapter about this change and hence results in a null pointer exception as shown below:
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.unFocus(android.view.View)' on a null object reference
Also, this assumes the position and in case there are more services or no services, the app will crash. Better than hardcoding this way, you could modify the function "prepareData" in "ServiceDiscoveryFragment.java" in the following way (lines: 43, 44, 47 and 111):
private void prepareData(List<BluetoothGattService> gattServices) {
boolean mFindMeSet = false;
boolean mProximitySet = false;
boolean mGattSet = false;
if (gattServices == null)
return;
// Clear all array list before entering values.
mGattServiceData.clear();mGattServiceFindMeData.clear();
mGattServiceMasterData.clear();
// Loops through available GATT Services.
for (BluetoothGattService gattService : gattServices) {HashMap<String, BluetoothGattService> currentServiceData = new HashMap<String, BluetoothGattService>();
UUID uuid = gattService.getUuid();
// Optimization code for FindMe Profile
if (uuid.equals(UUIDDatabase.UUID_IMMEDIATE_ALERT_SERVICE)) {currentServiceData.put(LIST_UUID, gattService);
mGattServiceMasterData.add(currentServiceData);
if (!mGattServiceFindMeData.contains(currentServiceData)) {
mGattServiceFindMeData.add(currentServiceData);
}
if (!mFindMeSet) {
mFindMeSet = true;
mGattServiceData.add(currentServiceData);
}
}
// Optimization code for Proximity Profile
else if (uuid.equals(UUIDDatabase.UUID_LINK_LOSS_SERVICE)|| uuid.equals(UUIDDatabase.UUID_TRANSMISSION_POWER_SERVICE)) {
currentServiceData.put(LIST_UUID, gattService);
mGattServiceMasterData.add(currentServiceData);
if (!mGattServiceProximityData.contains(currentServiceData)) {
mGattServiceProximityData.add(currentServiceData);
}
if (!mProximitySet) {
mProximitySet = true;
mGattServiceData.add(currentServiceData);
}
}// Optimization code for GATTDB
else if (uuid.equals(UUIDDatabase.UUID_GENERIC_ACCESS_SERVICE)|| uuid.equals(UUIDDatabase.UUID_GENERIC_ATTRIBUTE_SERVICE)) {
//currentServiceData.put(LIST_UUID, gattService);
//mGattDbServiceData.add(currentServiceData);
if (!mGattSet) {mGattSet = true;
//mGattServiceData.add(currentServiceData);
}} //Optimization code for HID
else if (uuid.equals(UUIDDatabase.UUID_HID_SERVICE)) {/**
* Special handling for KITKAT devices
*/
if (android.os.Build.VERSION.SDK_INT < 21) {Logger.e("Kitkat RDK device found");
List<BluetoothGattCharacteristic> allCharacteristics = gattService.getCharacteristics();
List<BluetoothGattCharacteristic> RDKCharacteristics = new ArrayList<BluetoothGattCharacteristic>();
List<BluetoothGattDescriptor> RDKDescriptors = new ArrayList<BluetoothGattDescriptor>();
//Find all Report characteristics
for (BluetoothGattCharacteristic characteristic : allCharacteristics) {if (characteristic.getUuid().equals(UUIDDatabase.UUID_REPORT)) {
RDKCharacteristics.add(characteristic);
}
}
//Find all Report descriptors
for (BluetoothGattCharacteristic rdkcharacteristic : RDKCharacteristics) {List<BluetoothGattDescriptor> descriptors = rdkcharacteristic.
getDescriptors();
for (BluetoothGattDescriptor descriptor : descriptors) {
RDKDescriptors.add(descriptor);
}
}
/**
* Wait for all descriptors to receive
*/
if (RDKDescriptors.size() == RDKCharacteristics.size() * 2) {for (int pos = 0, descPos = 0; descPos < RDKCharacteristics.size(); pos++, descPos++) {
BluetoothGattCharacteristic rdkCharacteristic = RDKCharacteristics.get(descPos);
//Mapping the characteristic and descriptors
Logger.e("Pos-->" + pos);Logger.e("Pos+1-->" + (pos + 1));
BluetoothGattDescriptor clientdescriptor = RDKDescriptors.get(pos);
BluetoothGattDescriptor reportdescriptor = RDKDescriptors.get(pos + 1);
if (!rdkCharacteristic.getDescriptors().contains(clientdescriptor)) {
rdkCharacteristic.addDescriptor(clientdescriptor);
}
if (!rdkCharacteristic.getDescriptors().contains(reportdescriptor)) {
rdkCharacteristic.addDescriptor(reportdescriptor);
}
pos++;
}
}
currentServiceData.put(LIST_UUID, gattService);
mGattServiceMasterData.add(currentServiceData);
mGattServiceData.add(currentServiceData);
} else {
currentServiceData.put(LIST_UUID, gattService);
mGattServiceMasterData.add(currentServiceData);
mGattServiceData.add(currentServiceData);
}
} else {
currentServiceData.put(LIST_UUID, gattService);
mGattServiceMasterData.add(currentServiceData);
mGattServiceData.add(currentServiceData);
}
}
mApplication.setGattServiceMasterData(mGattServiceMasterData);
if (mGattServiceData.size() > 0) {
updateWithNewFragment();
} else {
dismissProgressDialog();
showNoServiceDiscoveredInfo();
}
}
}
The carousal view uses the adapter to set the fragments. The adapter uses the ArrayList of HashMaps<String, BluetoothGattService>. In the above code we comment out the code where the GattDB service is added to this ArrayList.
This way only the services other than GattDB get displayed as you wanted.
Regards,
Dheeraj
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
The reason you see the error is because when you remove the view, you haven't notified the adapter about this change and hence results in a null pointer exception as shown below:
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.unFocus(android.view.View)' on a null object reference
Also, this assumes the position and in case there are more services or no services, the app will crash. Better than hardcoding this way, you could modify the function "prepareData" in "ServiceDiscoveryFragment.java" in the following way (lines: 43, 44, 47 and 111):
private void prepareData(List<BluetoothGattService> gattServices) {
boolean mFindMeSet = false;
boolean mProximitySet = false;
boolean mGattSet = false;
if (gattServices == null)
return;
// Clear all array list before entering values.
mGattServiceData.clear();mGattServiceFindMeData.clear();
mGattServiceMasterData.clear();
// Loops through available GATT Services.
for (BluetoothGattService gattService : gattServices) {HashMap<String, BluetoothGattService> currentServiceData = new HashMap<String, BluetoothGattService>();
UUID uuid = gattService.getUuid();
// Optimization code for FindMe Profile
if (uuid.equals(UUIDDatabase.UUID_IMMEDIATE_ALERT_SERVICE)) {currentServiceData.put(LIST_UUID, gattService);
mGattServiceMasterData.add(currentServiceData);
if (!mGattServiceFindMeData.contains(currentServiceData)) {
mGattServiceFindMeData.add(currentServiceData);
}
if (!mFindMeSet) {
mFindMeSet = true;
mGattServiceData.add(currentServiceData);
}
}
// Optimization code for Proximity Profile
else if (uuid.equals(UUIDDatabase.UUID_LINK_LOSS_SERVICE)|| uuid.equals(UUIDDatabase.UUID_TRANSMISSION_POWER_SERVICE)) {
currentServiceData.put(LIST_UUID, gattService);
mGattServiceMasterData.add(currentServiceData);
if (!mGattServiceProximityData.contains(currentServiceData)) {
mGattServiceProximityData.add(currentServiceData);
}
if (!mProximitySet) {
mProximitySet = true;
mGattServiceData.add(currentServiceData);
}
}// Optimization code for GATTDB
else if (uuid.equals(UUIDDatabase.UUID_GENERIC_ACCESS_SERVICE)|| uuid.equals(UUIDDatabase.UUID_GENERIC_ATTRIBUTE_SERVICE)) {
//currentServiceData.put(LIST_UUID, gattService);
//mGattDbServiceData.add(currentServiceData);
if (!mGattSet) {mGattSet = true;
//mGattServiceData.add(currentServiceData);
}} //Optimization code for HID
else if (uuid.equals(UUIDDatabase.UUID_HID_SERVICE)) {/**
* Special handling for KITKAT devices
*/
if (android.os.Build.VERSION.SDK_INT < 21) {Logger.e("Kitkat RDK device found");
List<BluetoothGattCharacteristic> allCharacteristics = gattService.getCharacteristics();
List<BluetoothGattCharacteristic> RDKCharacteristics = new ArrayList<BluetoothGattCharacteristic>();
List<BluetoothGattDescriptor> RDKDescriptors = new ArrayList<BluetoothGattDescriptor>();
//Find all Report characteristics
for (BluetoothGattCharacteristic characteristic : allCharacteristics) {if (characteristic.getUuid().equals(UUIDDatabase.UUID_REPORT)) {
RDKCharacteristics.add(characteristic);
}
}
//Find all Report descriptors
for (BluetoothGattCharacteristic rdkcharacteristic : RDKCharacteristics) {List<BluetoothGattDescriptor> descriptors = rdkcharacteristic.
getDescriptors();
for (BluetoothGattDescriptor descriptor : descriptors) {
RDKDescriptors.add(descriptor);
}
}
/**
* Wait for all descriptors to receive
*/
if (RDKDescriptors.size() == RDKCharacteristics.size() * 2) {for (int pos = 0, descPos = 0; descPos < RDKCharacteristics.size(); pos++, descPos++) {
BluetoothGattCharacteristic rdkCharacteristic = RDKCharacteristics.get(descPos);
//Mapping the characteristic and descriptors
Logger.e("Pos-->" + pos);Logger.e("Pos+1-->" + (pos + 1));
BluetoothGattDescriptor clientdescriptor = RDKDescriptors.get(pos);
BluetoothGattDescriptor reportdescriptor = RDKDescriptors.get(pos + 1);
if (!rdkCharacteristic.getDescriptors().contains(clientdescriptor)) {
rdkCharacteristic.addDescriptor(clientdescriptor);
}
if (!rdkCharacteristic.getDescriptors().contains(reportdescriptor)) {
rdkCharacteristic.addDescriptor(reportdescriptor);
}
pos++;
}
}
currentServiceData.put(LIST_UUID, gattService);
mGattServiceMasterData.add(currentServiceData);
mGattServiceData.add(currentServiceData);
} else {
currentServiceData.put(LIST_UUID, gattService);
mGattServiceMasterData.add(currentServiceData);
mGattServiceData.add(currentServiceData);
}
} else {
currentServiceData.put(LIST_UUID, gattService);
mGattServiceMasterData.add(currentServiceData);
mGattServiceData.add(currentServiceData);
}
}
mApplication.setGattServiceMasterData(mGattServiceMasterData);
if (mGattServiceData.size() > 0) {
updateWithNewFragment();
} else {
dismissProgressDialog();
showNoServiceDiscoveredInfo();
}
}
}
The carousal view uses the adapter to set the fragments. The adapter uses the ArrayList of HashMaps<String, BluetoothGattService>. In the above code we comment out the code where the GattDB service is added to this ArrayList.
This way only the services other than GattDB get displayed as you wanted.
Regards,
Dheeraj
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thank you Dheeraj! I would have never figured that out.
It took me a few minutes to pick up the change on line 111, from
if (mGattDbServiceData.size() > 0) {
to
if (mGattServiceData.size() > 0) {
Thanks again! Works perfectly!
Mark