content: package uk.co.alt236.btlescan.ui.control;
  
  import android.bluetooth.BluetoothGattCharacteristic;
  import android.bluetooth.BluetoothGattService;
  import android.content.Context;
  import android.widget.SimpleExpandableListAdapter;
  
  import java.util.ArrayList;
  import java.util.HashMap;
  import java.util.List;
  import java.util.Map;
  
  import dev.alt236.bluetoothlelib.resolvers.GattAttributeResolver;
  import uk.co.alt236.btlescan.R;
  
  /*package*/ class GattDataAdapterFactory {
      private static final String LIST_NAME = "NAME";
      private static final String LIST_UUID = "UUID";
  
      public static GattDataAdapter createAdapter(final Context context,
                                                  final List<BluetoothGattService> gattServices) {
  
  
          final String unknownServiceString = context.getString(R.string.unknown_service);
          final String unknownCharaString = context.getString(R.string.unknown_characteristic);
          final List<Map<String, String>> gattServiceData = new ArrayList<>();
          final List<List<Map<String, String>>> gattCharacteristicData = new ArrayList<>();
          final List<List<BluetoothGattCharacteristic>> fullGattCharacteristics = new ArrayList<>();
  
          // Loops through available GATT Services.
          String uuid;
          for (final BluetoothGattService gattService : gattServices) {
              final Map<String, String> currentServiceData = new HashMap<>();
              uuid = gattService.getUuid().toString();
              currentServiceData.put(LIST_NAME, GattAttributeResolver.getAttributeName(uuid, unknownServiceString));
              currentServiceData.put(LIST_UUID, uuid);
              gattServiceData.add(currentServiceData);
  
              final List<Map<String, String>> gattCharacteristicGroupData = new ArrayList<>();
              final List<BluetoothGattCharacteristic> gattCharacteristics = gattService.getCharacteristics();
              final List<BluetoothGattCharacteristic> charas = new ArrayList<>();
  
              // Loops through available Characteristics.
              for (final BluetoothGattCharacteristic gattCharacteristic : gattCharacteristics) {
                  charas.add(gattCharacteristic);
                  final Map<String, String> currentCharaData = new HashMap<>();
                  uuid = gattCharacteristic.getUuid().toString();
                  currentCharaData.put(LIST_NAME, GattAttributeResolver.getAttributeName(uuid, unknownCharaString));
                  currentCharaData.put(LIST_UUID, uuid);
                  gattCharacteristicGroupData.add(currentCharaData);
              }
  
              fullGattCharacteristics.add(charas);
              gattCharacteristicData.add(gattCharacteristicGroupData);
          }
  
          return new GattDataAdapter(
                  context,
                  fullGattCharacteristics,
                  gattServiceData,
                  android.R.layout.simple_expandable_list_item_2,
                  new String[]{LIST_NAME, LIST_UUID},
                  new int[]{android.R.id.text1, android.R.id.text2},
                  gattCharacteristicData,
                  android.R.layout.simple_expandable_list_item_2,
                  new String[]{LIST_NAME, LIST_UUID},
                  new int[]{android.R.id.text1, android.R.id.text2}
          );
      }
  
  
      public static class GattDataAdapter extends SimpleExpandableListAdapter {
  
          private final List<List<BluetoothGattCharacteristic>> mGattCharacteristics;
  
          public GattDataAdapter(Context context,
                                 List<List<BluetoothGattCharacteristic>> gattCharacteristics,
                                 List<Map<String, String>> groupData,
                                 int groupLayout, String[] groupFrom,
                                 int[] groupTo,
                                 List<List<Map<String, String>>> childData,
                                 int childLayout,
                                 String[] childFrom,
                                 int[] childTo) {
  
              super(context, groupData, groupLayout, groupFrom, groupTo, childData, childLayout, childFrom, childTo);
              mGattCharacteristics = gattCharacteristics;
          }
  
          public BluetoothGattCharacteristic getBluetoothGattCharacteristic(final int groupPosition, final int childPosition) {
              return mGattCharacteristics.get(groupPosition).get(childPosition);
          }
      }
  }
  