Android Open Source - BleSensorTag Ti Services Adapter






From Project

Back to project page BleSensorTag.

License

The source code is released under:

MIT License

If you think the Android project BleSensorTag listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package sample.ble.sensortag.adapters;
/*from ww w.  j a  v  a2  s . c o m*/
import android.bluetooth.BluetoothGattCharacteristic;
import android.bluetooth.BluetoothGattService;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.SeekBar;
import android.widget.TextView;
import sample.ble.sensortag.R;
import sample.ble.sensortag.info.TiInfoService;
import sample.ble.sensortag.info.TiInfoServices;
import sample.ble.sensortag.sensor.TiPeriodicalSensor;
import sample.ble.sensortag.sensor.TiSensor;
import sample.ble.sensortag.sensor.TiSensors;

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

/**
 * Created by steven on 9/5/13.
 */
public class TiServicesAdapter extends BaseExpandableListAdapter {

    public interface OnServiceItemClickListener {
        public void onServiceUpdated(BluetoothGattService service);
    }

    private static final String MODE_READ = "R";
    private static final String MODE_NOTIFY = "N";
    private static final String MODE_WRITE = "W";

    private final ArrayList<BluetoothGattService> services;
    private final HashMap<BluetoothGattService, ArrayList<BluetoothGattCharacteristic>> characteristics;
    private final LayoutInflater inflater;

    private OnServiceItemClickListener serviceListener;

    public TiServicesAdapter(Context context, List<BluetoothGattService> gattServices) {
        inflater = LayoutInflater.from(context);

        services = new ArrayList<BluetoothGattService>(gattServices.size());
        characteristics = new HashMap<BluetoothGattService, ArrayList<BluetoothGattCharacteristic>>(gattServices.size());
        for (BluetoothGattService gattService : gattServices) {
            final List<BluetoothGattCharacteristic> gattCharacteristics = gattService.getCharacteristics();
            characteristics.put(gattService, new ArrayList<BluetoothGattCharacteristic>(gattCharacteristics));
            services.add(gattService);
        }
    }

    public void setServiceListener(OnServiceItemClickListener listener) {
        this.serviceListener = listener;
    }

    @Override
    public int getGroupCount() {
        return services.size();
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return characteristics.get(getGroup(groupPosition)).size();
    }

    @Override
    public BluetoothGattService getGroup(int groupPosition) {
        return services.get(groupPosition);
    }

    @Override
    public BluetoothGattCharacteristic getChild(int groupPosition, int childPosition) {
        return characteristics.get(getGroup(groupPosition)).get(childPosition);
    }

    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return groupPosition * 100 + childPosition;
    }

    @Override
    public boolean hasStableIds() {
        return true;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        final GroupViewHolder holder;
        if (convertView == null) {
            holder = new GroupViewHolder();

            convertView = inflater.inflate(R.layout.li_service, parent, false);
            holder.name = (TextView) convertView.findViewById(R.id.name);
            holder.uuid = (TextView) convertView.findViewById(R.id.uuid);

            convertView.setTag(holder);
        } else {
            holder = (GroupViewHolder) convertView.getTag();
        }

        final BluetoothGattService item = getGroup(groupPosition);

        final String uuid = item.getUuid().toString();
        final TiSensor<?> sensor = TiSensors.getSensor(uuid);
        final TiInfoService infoService = TiInfoServices.getService(uuid);

        final String serviceName;

        if (sensor != null)
            serviceName = sensor.getName();
        else if ( infoService != null )
            serviceName = infoService.getName();
        else
            serviceName = "Unknown";

        holder.name.setText(serviceName);
        holder.uuid.setText(uuid);

        return convertView;
    }

    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        final ChildViewHolder holder;
        if (convertView == null) {
            holder = new ChildViewHolder();

            convertView = inflater.inflate(R.layout.li_characteristic, parent, false);
            holder.name = (TextView) convertView.findViewById(R.id.name);
            holder.uuid = (TextView) convertView.findViewById(R.id.uuid);
            holder.modes = (TextView) convertView.findViewById(R.id.modes);
            holder.seek = (SeekBar) convertView.findViewById(R.id.seek);
            holder.seek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                @Override
                public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                    if (serviceListener == null || !fromUser)
                        return;

                    final TiSensor<?> sensor = TiSensors.getSensor(holder.service.getUuid().toString());
                    if (sensor == null)
                        return;

                    if (sensor instanceof TiPeriodicalSensor) {
                        final TiPeriodicalSensor periodicalSensor = (TiPeriodicalSensor) sensor;
                        periodicalSensor.setPeriod(progress + periodicalSensor.getMinPeriod());

                        serviceListener.onServiceUpdated(holder.service);
                    }
                }

                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {
                }

                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {
                }
            });

            convertView.setTag(holder);
        } else {
            holder = (ChildViewHolder) convertView.getTag();
        }

        final BluetoothGattCharacteristic item = getChild(groupPosition, childPosition);

        final String uuid = item.getUuid().toString();
        final String name;
        final String modes = getModeString(item.getProperties());

        holder.service = item.getService();

        final String serviceUUID = item.getService().getUuid().toString();
        final TiSensor<?> sensor = TiSensors.getSensor(serviceUUID);
        final TiInfoService infoService = TiInfoServices.getService(serviceUUID);

        if ( sensor != null ) {
            name = sensor.getCharacteristicName(uuid);

            if ( sensor.isConfigUUID(uuid) ) {
                if ( sensor instanceof TiPeriodicalSensor) {
                    final TiPeriodicalSensor periodicalSensor = (TiPeriodicalSensor) sensor;

                    final int max = periodicalSensor.getMaxPeriod() - periodicalSensor.getMinPeriod();
                    final int value = periodicalSensor.getPeriod() - periodicalSensor.getMinPeriod();
                    holder.seek.setMax(max);
                    holder.seek.setProgress(value);

                    holder.seek.setVisibility(View.VISIBLE);
                    holder.uuid.setVisibility(View.GONE);
                }
            } else {
                holder.uuid.setVisibility(View.VISIBLE);
                holder.seek.setVisibility(View.GONE);
            }
        } else if (infoService != null) {
            name = infoService.getCharacteristicName(uuid);

            holder.uuid.setVisibility(View.VISIBLE);
            holder.seek.setVisibility(View.GONE);
        } else {
            name = "Unknown";

            holder.uuid.setVisibility(View.VISIBLE);
            holder.seek.setVisibility(View.GONE);
        }

        holder.name.setText(name);
        holder.uuid.setText(uuid);
        holder.modes.setText(modes);

        return convertView;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }

    private static String getModeString(int prop) {
        final StringBuilder modeBuilder = new StringBuilder();
        if ((prop & BluetoothGattCharacteristic.PROPERTY_READ) > 0) {
            modeBuilder.append(MODE_READ);
        }
        if ((prop & BluetoothGattCharacteristic.PROPERTY_NOTIFY) > 0) {
            if (modeBuilder.length() > 0)
                modeBuilder.append("/");
            modeBuilder.append(MODE_NOTIFY);
        }
        if ((prop & BluetoothGattCharacteristic.PROPERTY_WRITE) > 0) {
            if (modeBuilder.length() > 0)
                modeBuilder.append("/");
            modeBuilder.append(MODE_WRITE);
        }
        return modeBuilder.toString();
    }

    private static class GroupViewHolder {
        public TextView name;
        public TextView uuid;
    }

    private static class ChildViewHolder {
        public BluetoothGattService service;

        public TextView name;
        public TextView uuid;
        public TextView modes;
        public SeekBar seek;
    }
}




Java Source Code List

sample.ble.sensortag.BleSensorsRecordService.java
sample.ble.sensortag.BleServiceBindingActivity.java
sample.ble.sensortag.BleService.java
sample.ble.sensortag.BluetoothStateReciever.java
sample.ble.sensortag.DeviceScanActivity.java
sample.ble.sensortag.DeviceServicesActivity.java
sample.ble.sensortag.adapters.BleDevicesAdapter.java
sample.ble.sensortag.adapters.TiServicesAdapter.java
sample.ble.sensortag.ble.BleActionsReceiver.java
sample.ble.sensortag.ble.BleDevicesScanner.java
sample.ble.sensortag.ble.BleExecutorListener.java
sample.ble.sensortag.ble.BleGattExecutor.java
sample.ble.sensortag.ble.BleManager.java
sample.ble.sensortag.ble.BleServiceListener.java
sample.ble.sensortag.ble.BleUtils.java
sample.ble.sensortag.config.AppConfig.java
sample.ble.sensortag.dialogs.AppDialog.java
sample.ble.sensortag.dialogs.EnableBluetoothDialog.java
sample.ble.sensortag.dialogs.ErrorDialog.java
sample.ble.sensortag.fusion.SensorFusionActivity.java
sample.ble.sensortag.fusion.SensorFusionFragment.java
sample.ble.sensortag.fusion.engine.SensorFusionEngine.java
sample.ble.sensortag.fusion.engine.SensorFusionHelper.java
sample.ble.sensortag.fusion.sensors.AndroidSensorManager.java
sample.ble.sensortag.fusion.sensors.AndroidSensor.java
sample.ble.sensortag.fusion.sensors.BleSensorManager.java
sample.ble.sensortag.fusion.sensors.BleSensor.java
sample.ble.sensortag.fusion.sensors.ISensorManager.java
sample.ble.sensortag.fusion.sensors.ISensor.java
sample.ble.sensortag.fusion.sensors.SensorManagerException.java
sample.ble.sensortag.gl.GLSurfaceView.java
sample.ble.sensortag.gl.GlFragment.java
sample.ble.sensortag.gl.ModelLoader.java
sample.ble.sensortag.gl.ModelRenderer.java
sample.ble.sensortag.info.TiDeviceInfoSerivce.java
sample.ble.sensortag.info.TiGapSerivce.java
sample.ble.sensortag.info.TiGattSerivce.java
sample.ble.sensortag.info.TiInfoService.java
sample.ble.sensortag.info.TiInfoServices.java
sample.ble.sensortag.sensor.TiAccelerometerSensor.java
sample.ble.sensortag.sensor.TiGyroscopeSensor.java
sample.ble.sensortag.sensor.TiHumiditySensor.java
sample.ble.sensortag.sensor.TiKeysSensor.java
sample.ble.sensortag.sensor.TiMagnetometerSensor.java
sample.ble.sensortag.sensor.TiPeriodicalSensor.java
sample.ble.sensortag.sensor.TiPressureSensor.java
sample.ble.sensortag.sensor.TiRangeSensors.java
sample.ble.sensortag.sensor.TiSensorUtils.java
sample.ble.sensortag.sensor.TiSensor.java
sample.ble.sensortag.sensor.TiSensors.java
sample.ble.sensortag.sensor.TiTemperatureSensor.java
sample.ble.sensortag.sensor.TiTestSensor.java