Android Open Source - interdroid-swan Bluetooth Sensor






From Project

Back to project page interdroid-swan.

License

The source code is released under:

Copyright (c) 2008-2011 Vrije Universiteit, The Netherlands All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the follo...

If you think the Android project interdroid-swan 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 interdroid.swan.sensors.impl;
/*from ww w.  ja v a2s  .co m*/
import interdroid.swan.R;
import interdroid.swan.sensors.AbstractConfigurationActivity;
import interdroid.swan.sensors.AbstractVdbSensor;
import interdroid.vdb.content.avro.AvroContentProviderProxy;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;

/**
 * A sensor for discovered bluetooth devices.
 * 
 * @author nick <palmer@cs.vu.nl>
 * 
 */
public class BluetoothSensor extends AbstractVdbSensor {

  private static final String TAG = "Bluetooth Sensor";

  /**
   * This configuration activity for this sensor.
   * 
   * @author nick <palmer@cs.vu.nl>
   * 
   */
  public static class ConfigurationActivity extends
      AbstractConfigurationActivity {

    @Override
    public final int getPreferencesXML() {
      return R.xml.bluetooth_preferences;
    }

  }

  /**
   * The device name field.
   */
  public static final String DEVICE_NAME_FIELD = "name";
  /**
   * The device address field.
   */
  public static final String DEVICE_ADDRESS_FIELD = "address";

  /**
   * The bond state for the device.
   */
  public static final String DEVICE_BOND_STATE = "bond_state";

  /**
   * The class of the device.
   */
  private static final String DEVICE_CLASS = "class";

  /**
   * The major class of the device.
   */
  private static final String DEVICE_MAJOR_CLASS = "major_class";

  /**
   * The discovery interval.
   */
  public static final String DISCOVERY_INTERVAL = "discovery_interval";

  /**
   * The default discovery interval.
   */
  public static final long DEFAULT_DISCOVERY_INTERVAL = 5 * 60 * 1000; // ms

  /**
   * The schema for this sensor.
   */
  public static final String SCHEME = getSchema();

  /**
   * The provider for this sensor.
   * 
   * @author nick <palmer@cs.vu.nl>
   * 
   */
  public static class Provider extends AvroContentProviderProxy {

    /**
     * Construct the provider for this sensor.
     */
    public Provider() {
      super(SCHEME);
    }

  }

  /**
   * @return the schema for this sensor.
   */
  private static String getSchema() {
    String scheme = "{'type': 'record', 'name': 'bluetooth', "
        + "'namespace': 'interdroid.context.sensor.bluetooth',"
        + "\n'fields': [" + SCHEMA_TIMESTAMP_FIELDS + "\n{'name': '"
        + DEVICE_NAME_FIELD + "', 'type': 'string'}," + "\n{'name': '"
        + DEVICE_ADDRESS_FIELD + "', 'type': 'string'},"
        + "\n{'name': '" + DEVICE_CLASS + "', 'type': 'int'},"
        + "\n{'name': '" + DEVICE_MAJOR_CLASS + "', 'type': 'int'}"
        + "\n]" + "}";
    return scheme.replace('\'', '"');
  }

  /**
   * A flag to indicate we should stop polling.
   */
  private boolean stopPolling = false;

  /**
   * The bluetooth adapter we use to do discovery.
   */
  private BluetoothAdapter mBluetoothAdapter;

  /**
   * The broadcast receiver which gets information on bluetooth discovery.
   */
  private BroadcastReceiver bluetoothReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(final Context context, final Intent intent) {
      long now = System.currentTimeMillis();
      BluetoothDevice device = intent
          .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
      ContentValues values = new ContentValues();
      Log.d(TAG, "Bluetooth discovered: " + device.getName() + " "
          + device.getAddress());
      values.put(DEVICE_NAME_FIELD, device.getName());
      values.put(DEVICE_ADDRESS_FIELD, device.getAddress());

      putValues(values, now);
    }

  };

  /**
   * The thread which polls for bluetooth devices.
   */
  private Thread bluetoothPoller = new Thread() {
    public void run() {
      while (!stopPolling) {
        long start = System.currentTimeMillis();
        if (registeredConfigurations.size() > 0) {
          if (mBluetoothAdapter != null
              && !mBluetoothAdapter.isDiscovering()) {
            mBluetoothAdapter.startDiscovery();
            Log.d(TAG, "bt started discovery");
          }
        }
        try {
          Thread.sleep(currentConfiguration
              .getLong(DISCOVERY_INTERVAL)
              + start
              - System.currentTimeMillis());
        } catch (InterruptedException e) {
          Log.w(TAG, "Interrupted while sleeping.");
        }
      }
    }
  };

  @Override
  public final String[] getValuePaths() {
    return new String[] { DEVICE_ADDRESS_FIELD, DEVICE_NAME_FIELD,
        DEVICE_BOND_STATE, DEVICE_CLASS, DEVICE_MAJOR_CLASS };
  }

  @Override
  public final void initDefaultConfiguration(final Bundle defaults) {
    defaults.putLong(DISCOVERY_INTERVAL, DEFAULT_DISCOVERY_INTERVAL);
  }

  @Override
  public final String getScheme() {
    return SCHEME;
  }

  @Override
  public final void onConnected() {
    mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    Log.d(TAG, "bluetooth connected");
  }

  @Override
  public final void register(final String id, final String valuePath,
      final Bundle configuration) {
    if (registeredConfigurations.size() == 1) {
      registerReceiver(bluetoothReceiver, new IntentFilter(
          BluetoothDevice.ACTION_FOUND));
      if (!bluetoothPoller.isAlive()) {
        bluetoothPoller.start();
      }
    }
    updatePollRate();
  }

  /**
   * Update the polling rate.
   */
  private void updatePollRate() {
    boolean keepDefault = true;
    long updatedPollRate = Long.MAX_VALUE;
    for (Bundle configuration : registeredConfigurations.values()) {
      if (configuration.containsKey(DISCOVERY_INTERVAL)) {
        keepDefault = false;
        updatedPollRate = Math.min(updatedPollRate,
            configuration.getLong(DISCOVERY_INTERVAL));
      }
    }
    if (keepDefault) {
      currentConfiguration.putLong(DISCOVERY_INTERVAL,
          DEFAULT_DISCOVERY_INTERVAL);
    } else {
      currentConfiguration.putLong(DISCOVERY_INTERVAL, updatedPollRate);
    }
  }

  @Override
  public final void unregister(final String id) {
    if (registeredConfigurations.size() == 0) {
      unregisterReceiver(bluetoothReceiver);
    }
    updatePollRate();
  }

  @Override
  public final void onDestroySensor() {
    if (registeredConfigurations.size() != 0) {
      unregisterReceiver(bluetoothReceiver);
    }
    mBluetoothAdapter.cancelDiscovery();
    stopPolling = true;
    bluetoothPoller.interrupt();
  }

}




Java Source Code List

interdroid.swan.ExpressionListener.java
interdroid.swan.ExpressionManager.java
interdroid.swan.SensorConfigurationException.java
interdroid.swan.SensorInfo.java
interdroid.swan.SwanException.java
interdroid.swan.TriStateExpressionListener.java
interdroid.swan.ValueExpressionListener.java
interdroid.swan.crossdevice.Converter.java
interdroid.swan.crossdevice.CrossDeviceReceiver.java
interdroid.swan.crossdevice.Pusher.java
interdroid.swan.crossdevice.Registry.java
interdroid.swan.crossdevice.SwanGCMConstants.java
interdroid.swan.crossdevice.SwanLakeActivity.java
interdroid.swan.engine.EvaluationEngineReceiver.java
interdroid.swan.engine.EvaluationEngineService.java
interdroid.swan.engine.EvaluationManager.java
interdroid.swan.engine.ExpressionViewerActivity.java
interdroid.swan.engine.QueuedExpression.java
interdroid.swan.engine.SensorSetupFailedException.java
interdroid.swan.engine.SensorViewerActivity.java
interdroid.swan.engine.TextProgressBar.java
interdroid.swan.sensors.AbstractConfigurationActivity.java
interdroid.swan.sensors.AbstractCuckooSensor.java
interdroid.swan.sensors.AbstractMemorySensor.java
interdroid.swan.sensors.AbstractSensorBase.java
interdroid.swan.sensors.AbstractVdbSensor.java
interdroid.swan.sensors.MonitorThread.java
interdroid.swan.sensors.SensorInterface.java
interdroid.swan.sensors.TimeSensor.java
interdroid.swan.sensors.impl.BatterySensor.java
interdroid.swan.sensors.impl.BluetoothSensor.java
interdroid.swan.sensors.impl.CalendarSensor.java
interdroid.swan.sensors.impl.CallSensor.java
interdroid.swan.sensors.impl.GyroscopeSensor.java
interdroid.swan.sensors.impl.IntentSensor.java
interdroid.swan.sensors.impl.LightSensor.java
interdroid.swan.sensors.impl.LocationSensor.java
interdroid.swan.sensors.impl.LogCatSensor.java
interdroid.swan.sensors.impl.MagnetometerSensor.java
interdroid.swan.sensors.impl.MovementSensor.java
interdroid.swan.sensors.impl.PolarHeartRate.java
interdroid.swan.sensors.impl.PressureSensor.java
interdroid.swan.sensors.impl.ProximitySensor.java
interdroid.swan.sensors.impl.ScreenSensor.java
interdroid.swan.sensors.impl.SignalStrengthSensor.java
interdroid.swan.sensors.impl.SmartLocationSensor.java
interdroid.swan.sensors.impl.SoundSensor.java
interdroid.swan.sensors.impl.TemperatureSensor.java
interdroid.swan.sensors.impl.TwitterSensor.java
interdroid.swan.sensors.impl.WifiSensor.java
interdroid.swan.sensors.impl.package-info.java
interdroid.swan.swansong.BinaryLogicOperator.java
interdroid.swan.swansong.ComparatorResult.java
interdroid.swan.swansong.Comparator.java
interdroid.swan.swansong.ComparisonExpression.java
interdroid.swan.swansong.ConstantValueExpression.java
interdroid.swan.swansong.ExpressionFactory.java
interdroid.swan.swansong.ExpressionParseException.java
interdroid.swan.swansong.Expression.java
interdroid.swan.swansong.HistoryReductionMode.java
interdroid.swan.swansong.LogicExpression.java
interdroid.swan.swansong.LogicOperator.java
interdroid.swan.swansong.MathOperator.java
interdroid.swan.swansong.MathValueExpression.java
interdroid.swan.swansong.ParseableEnum.java
interdroid.swan.swansong.Parseable.java
interdroid.swan.swansong.Result.java
interdroid.swan.swansong.SensorValueExpression.java
interdroid.swan.swansong.TimestampedValue.java
interdroid.swan.swansong.TriStateExpression.java
interdroid.swan.swansong.TriState.java
interdroid.swan.swansong.UnaryLogicOperator.java
interdroid.swan.swansong.ValueExpression.java
interdroid.swan.ui.EnterConstantDialog.java
interdroid.swan.ui.ExpressionBuilderActivity.java
interdroid.swan.ui.LaunchService.java
interdroid.swan.ui.MergeExpressionDialog.java
interdroid.swan.ui.NewExpressionDialog.java
interdroid.swan.ui.NewMathExpressionDialog.java
interdroid.swan.ui.SelectComparatorDialog.java
interdroid.swan.ui.SelectExpressionDialog.java
interdroid.swan.ui.SelectOperatorDialog.java
interdroid.swan.ui.SelectSensorDialog.java
interdroid.swan.ui.SelectTypedValueDialog.java
interdroid.swan.ui.package-info.java
interdroid.swan.util.SeekBarPreference.java
interdroid.swan.util.TimePreference.java