Renamed ble service class to more appropriate BLE TNC Service
Renamed ble service class to more appropriate BLE TNC Service

--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -38,7 +38,7 @@
        		android:exported="true"
 		/>
 
-        <service android:name="com.dryerzinia.aprs_x.services.BluetoothLeService" android:enabled="true"/>

+        <service android:name="com.dryerzinia.aprs_x.services.BLETNCService" android:enabled="true"/>

 
     </application>

 


--- /dev/null
+++ b/src/com/dryerzinia/aprs_x/services/BLETNCService.java
@@ -1,1 +1,415 @@
-
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.dryerzinia.aprs_x.services;
+
+import android.app.Service;
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothGatt;
+import android.bluetooth.BluetoothGattCallback;
+import android.bluetooth.BluetoothGattCharacteristic;
+import android.bluetooth.BluetoothGattDescriptor;
+import android.bluetooth.BluetoothGattService;
+import android.bluetooth.BluetoothManager;
+import android.bluetooth.BluetoothProfile;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Binder;
+import android.os.IBinder;
+import android.util.Log;
+
+import java.io.UnsupportedEncodingException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.UUID;
+
+import com.dryerzinia.aprs_x.data_model.packet.RawPacket;
+import com.dryerzinia.aprs_x.db.APRSContentProvider;
+import com.dryerzinia.aprs_x.db.table.RawPacketTable;
+
+/**
+ * Service for managing connection and data communication with a GATT server hosted on a
+ * given Bluetooth LE device.
+ */
+public class BLETNCService extends Service {
+    private final static String TAG = BLETNCService.class.getSimpleName();
+
+    private BluetoothManager mBluetoothManager;
+    private BluetoothAdapter mBluetoothAdapter;
+    private String mBluetoothDeviceAddress;
+    private BluetoothGatt mBluetoothGatt;
+    private int mConnectionState = STATE_DISCONNECTED;
+
+    private final static int MAX_PACKET_LENGTH = 1000;
+
+    private int packetCurrentLength = 1000;
+    private byte[] packetData;
+
+    private static final int STATE_DISCONNECTED = 0;
+    private static final int STATE_CONNECTING = 1;
+    private static final int STATE_CONNECTED = 2;
+
+    public final static String ACTION_GATT_CONNECTED =
+            "com.example.bluetooth.le.ACTION_GATT_CONNECTED";
+    public final static String ACTION_GATT_DISCONNECTED =
+            "com.example.bluetooth.le.ACTION_GATT_DISCONNECTED";
+    public final static String ACTION_GATT_SERVICES_DISCOVERED =
+            "com.example.bluetooth.le.ACTION_GATT_SERVICES_DISCOVERED";
+    public final static String ACTION_DATA_AVAILABLE =
+            "com.example.bluetooth.le.ACTION_DATA_AVAILABLE";
+    public final static String EXTRA_DATA =
+            "com.example.bluetooth.le.EXTRA_DATA";
+    public final static String BLE_TNC_PACKET_DATA =
+            "com.example.bluetooth.le.BLE_TNC_PACKET_DATA";
+    public final static String BLE_TNC_VOLUME =
+            "com.example.bluetooth.le.BLE_TNC_VOLUME";
+
+    public final static UUID UUID_BLE_TNC_PACKET_DATA =
+            UUID.fromString("00002221-0000-1000-8000-00805f9b34fb");
+
+    // Implements callback methods for GATT events that the app cares about.  For example,
+    // connection change and services discovered.
+    private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
+        @Override
+        public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
+            String intentAction;
+            if (newState == BluetoothProfile.STATE_CONNECTED) {
+                intentAction = ACTION_GATT_CONNECTED;
+                mConnectionState = STATE_CONNECTED;
+                broadcastUpdate(intentAction);
+                Log.i(TAG, "Connected to GATT server.");
+                // Attempts to discover services after successful connection.
+                Log.i(TAG, "Attempting to start service discovery:" +
+                        mBluetoothGatt.discoverServices());
+
+            } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
+                intentAction = ACTION_GATT_DISCONNECTED;
+                mConnectionState = STATE_DISCONNECTED;
+                Log.i(TAG, "Disconnected from GATT server.");
+                broadcastUpdate(intentAction);
+            }
+        }
+
+        @Override
+        public void onServicesDiscovered(BluetoothGatt gatt, int status) {
+            if (status == BluetoothGatt.GATT_SUCCESS) {
+                broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED);
+            } else {
+                Log.e(TAG, "onServicesDiscovered received: " + status);
+            }
+        }
+
+        @Override
+        public void onCharacteristicRead(BluetoothGatt gatt,
+                                         BluetoothGattCharacteristic characteristic,
+                                         int status) {
+            if (status == BluetoothGatt.GATT_SUCCESS) {
+                broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
+            }
+        }
+
+        @Override
+        public void onDescriptorRead(BluetoothGatt gatt,
+        								BluetoothGattDescriptor descriptor,
+        								int status) {
+
+        }
+
+        @Override
+        public void onDescriptorWrite(BluetoothGatt gatt,
+        								BluetoothGattDescriptor descriptor,
+        								int status) {
+
+        }
+
+        @Override
+        public void onCharacteristicChanged(BluetoothGatt gatt,
+                                            BluetoothGattCharacteristic characteristic) {
+            broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
+        }
+    };
+
+    private void broadcastUpdate(final String action) {
+        final Intent intent = new Intent(action);
+        sendBroadcast(intent);
+    }
+
+    private void broadcastUpdate(final String action,
+                                 final BluetoothGattCharacteristic characteristic) {
+
+        Log.d(TAG, "Update");
+
+        if (UUID_BLE_TNC_PACKET_DATA.equals(characteristic.getUuid())){
+
+        	final byte[] data = characteristic.getValue();
+
+            Log.d(TAG, "Message type: " + data[0]);
+
+        	if(data[0] == 0x01){
+
+        		Log.d(TAG, "Packet Start Length: " + (data[1] & 0xFF));
+
+        		packetData = new byte[data[1] & 0xFF];
+        		packetCurrentLength = 0;
+        		for(int i = 2; i < data.length; i++){
+        			packetData[packetCurrentLength] = data[i];
+        			packetCurrentLength++;
+        		}
+
+        	} else if(data[0] == 0x02 && packetData != null){
+
+        		Log.d(TAG, "Packet Continued...");
+
+        		if(packetCurrentLength + data.length - 1 > packetData.length){
+
+        			Log.e(TAG, "Error: Packet to long!");
+
+            		packetCurrentLength = MAX_PACKET_LENGTH;
+
+            		return;
+
+        		}
+
+        		for(int i = 1; i < data.length; i++){
+        			packetData[packetCurrentLength] = data[i];
+        			packetCurrentLength++;
+        		}
+
+        	} else if(data[0] == 0x03){
+
+        		Log.d(TAG, "Volume Peak: " + (data[1] & 0xFF));
+
+        		final Intent intent = new Intent(action);
+        		intent.putExtra(BLE_TNC_VOLUME, (int) (data[1] & 0xFF));
+                sendBroadcast(intent);
+
+        	}
+
+        	Log.d(TAG, "pcl: " + packetCurrentLength);
+
+        	if(packetData != null){
+	        	if(packetData.length == packetCurrentLength){
+	
+	        		Log.d(TAG, "Broadcasting packet");
+	
+	        		// Put packet in DB
+	        		RawPacket pkt = RawPacket.fromRawData(packetData);
+	        		getContentResolver().insert(
+	        			APRSContentProvider.RAW_PACKET_URI,
+	        			RawPacketTable.getContentValues(pkt)
+	        		);
+	
+	        		Log.d(TAG, pkt.toString());
+
+	        		final Intent intent = new Intent(action);
+	        		intent.putExtra(BLE_TNC_PACKET_DATA, pkt);
+	                sendBroadcast(intent);
+	
+	        		packetCurrentLength = MAX_PACKET_LENGTH;
+	
+	        	} else if(packetData.length < packetCurrentLength && packetCurrentLength != MAX_PACKET_LENGTH){
+	
+	        		Log.e(TAG, "Error: Packet to long!");
+	
+	        		// Error, don't broadcast
+	        		packetCurrentLength = MAX_PACKET_LENGTH;
+	
+	        	}
+        	}
+
+        }
+    }
+
+    public class LocalBinder extends Binder {
+        public BLETNCService getService() {
+            return BLETNCService.this;
+        }
+    }
+
+    @Override
+    public IBinder onBind(Intent intent) {
+        return mBinder;
+    }
+
+    @Override
+    public boolean onUnbind(Intent intent) {
+        // After using a given device, you should make sure that BluetoothGatt.close() is called
+        // such that resources are cleaned up properly.  In this particular example, close() is
+        // invoked when the UI is disconnected from the Service.
+        close();
+        return super.onUnbind(intent);
+    }
+
+    private final IBinder mBinder = new LocalBinder();
+
+    /**
+     * Initializes a reference to the local Bluetooth adapter.
+     *
+     * @return Return true if the initialization is successful.
+     */
+    public boolean initialize() {
+        // For API level 18 and above, get a reference to BluetoothAdapter through
+        // BluetoothManager.
+        if (mBluetoothManager == null) {
+            mBluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
+            if (mBluetoothManager == null) {
+                Log.e(TAG, "Unable to initialize BluetoothManager.");
+                return false;
+            }
+        }
+
+        mBluetoothAdapter = mBluetoothManager.getAdapter();
+        if (mBluetoothAdapter == null) {
+            Log.e(TAG, "Unable to obtain a BluetoothAdapter.");
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * Connects to the GATT server hosted on the Bluetooth LE device.
+     *
+     * @param address The device address of the destination device.
+     *
+     * @return Return true if the connection is initiated successfully. The connection result
+     *         is reported asynchronously through the
+     *         {@code BluetoothGattCallback#onConnectionStateChange(android.bluetooth.BluetoothGatt, int, int)}
+     *         callback.
+     */
+    public boolean connect(final String address) {
+        if (mBluetoothAdapter == null || address == null) {
+            Log.w(TAG, "BluetoothAdapter not initialized or unspecified address.");
+            return false;
+        }
+
+        // Previously connected device.  Try to reconnect.
+        if (mBluetoothDeviceAddress != null && address.equals(mBluetoothDeviceAddress)
+                && mBluetoothGatt != null) {
+            Log.d(TAG, "Trying to use an existing mBluetoothGatt for connection.");
+            if (mBluetoothGatt.connect()) {
+                mConnectionState = STATE_CONNECTING;
+                return true;
+            } else {
+                return false;
+            }
+        }
+
+        final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
+        if (device == null) {
+            Log.w(TAG, "Device not found.  Unable to connect.");
+            return false;
+        }
+        // We want to directly connect to the device, so we are setting the autoConnect
+        // parameter to false.
+        mBluetoothGatt = device.connectGatt(this, false, mGattCallback);
+        Log.d(TAG, "Trying to create a new connection.");
+        mBluetoothDeviceAddress = address;
+        mConnectionState = STATE_CONNECTING;
+        return true;
+    }
+
+    /**
+     * Disconnects an existing connection or cancel a pending connection. The disconnection result
+     * is reported asynchronously through the
+     * {@code BluetoothGattCallback#onConnectionStateChange(android.bluetooth.BluetoothGatt, int, int)}
+     * callback.
+     */
+    public void disconnect() {
+        if (mBluetoothAdapter == null || mBluetoothGatt == null) {
+            Log.w(TAG, "BluetoothAdapter not initialized");
+            return;
+        }
+        mBluetoothGatt.disconnect();
+    }
+
+    /**
+     * After using a given BLE device, the app must call this method to ensure resources are
+     * released properly.
+     */
+    public void close() {
+        if (mBluetoothGatt == null) {
+            return;
+        }
+        mBluetoothGatt.close();
+        mBluetoothGatt = null;
+    }
+
+    /**
+     * Request a read on a given {@code BluetoothGattCharacteristic}. The read result is reported
+     * asynchronously through the {@code BluetoothGattCallback#onCharacteristicRead(android.bluetooth.BluetoothGatt, android.bluetooth.BluetoothGattCharacteristic, int)}
+     * callback.
+     *
+     * @param characteristic The characteristic to read from.
+     */
+    public void readCharacteristic(BluetoothGattCharacteristic characteristic) {
+        if (mBluetoothAdapter == null || mBluetoothGatt == null) {
+            Log.w(TAG, "BluetoothAdapter not initialized");
+            return;
+        }
+        mBluetoothGatt.readCharacteristic(characteristic);
+    }
+
+    public void writeDescriptor(BluetoothGattDescriptor descriptor) {
+        if (mBluetoothAdapter == null || mBluetoothGatt == null) {
+            Log.w(TAG, "BluetoothAdapter not initialized");
+            return;
+        }
+        mBluetoothGatt.writeDescriptor(descriptor);
+    }
+
+    
+    /**
+     * Enables or disables notification on a give characteristic.
+     *
+     * @param characteristic Characteristic to act on.
+     * @param enabled If true, enable notification.  False otherwise.
+     */
+    public void setCharacteristicNotification(BluetoothGattCharacteristic characteristic,
+                                              boolean enabled) {
+        if (mBluetoothAdapter == null || mBluetoothGatt == null) {
+            Log.w(TAG, "BluetoothAdapter not initialized");
+            return;
+        }
+
+        mBluetoothGatt.setCharacteristicNotification(characteristic, enabled);
+
+        if (UUID_BLE_TNC_PACKET_DATA.equals(characteristic.getUuid())) {
+
+        	BluetoothGattDescriptor descriptor = characteristic.getDescriptor(
+                    UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"));
+
+        	descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
+            mBluetoothGatt.writeDescriptor(descriptor);
+
+        }
+    }
+
+    /**
+     * Retrieves a list of supported GATT services on the connected device. This should be
+     * invoked only after {@code BluetoothGatt#discoverServices()} completes successfully.
+     *
+     * @return A {@code List} of supported services.
+     */
+    public List<BluetoothGattService> getSupportedGattServices() {
+        if (mBluetoothGatt == null) return null;
+
+        return mBluetoothGatt.getServices();
+    }
+}
+

--- a/src/com/dryerzinia/aprs_x/services/BluetoothLeService.java
+++ /dev/null
@@ -1,415 +1,1 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
 
-package com.dryerzinia.aprs_x.services;
-
-import android.app.Service;
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothGatt;
-import android.bluetooth.BluetoothGattCallback;
-import android.bluetooth.BluetoothGattCharacteristic;
-import android.bluetooth.BluetoothGattDescriptor;
-import android.bluetooth.BluetoothGattService;
-import android.bluetooth.BluetoothManager;
-import android.bluetooth.BluetoothProfile;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Binder;
-import android.os.IBinder;
-import android.util.Log;
-
-import java.io.UnsupportedEncodingException;
-import java.util.Arrays;
-import java.util.List;
-import java.util.UUID;
-
-import com.dryerzinia.aprs_x.data_model.packet.RawPacket;
-import com.dryerzinia.aprs_x.db.APRSContentProvider;
-import com.dryerzinia.aprs_x.db.table.RawPacketTable;
-
-/**
- * Service for managing connection and data communication with a GATT server hosted on a
- * given Bluetooth LE device.
- */
-public class BluetoothLeService extends Service {
-    private final static String TAG = BluetoothLeService.class.getSimpleName();
-
-    private BluetoothManager mBluetoothManager;
-    private BluetoothAdapter mBluetoothAdapter;
-    private String mBluetoothDeviceAddress;
-    private BluetoothGatt mBluetoothGatt;
-    private int mConnectionState = STATE_DISCONNECTED;
-
-    private final static int MAX_PACKET_LENGTH = 1000;
-
-    private int packetCurrentLength = 1000;
-    private byte[] packetData;
-
-    private static final int STATE_DISCONNECTED = 0;
-    private static final int STATE_CONNECTING = 1;
-    private static final int STATE_CONNECTED = 2;
-
-    public final static String ACTION_GATT_CONNECTED =
-            "com.example.bluetooth.le.ACTION_GATT_CONNECTED";
-    public final static String ACTION_GATT_DISCONNECTED =
-            "com.example.bluetooth.le.ACTION_GATT_DISCONNECTED";
-    public final static String ACTION_GATT_SERVICES_DISCOVERED =
-            "com.example.bluetooth.le.ACTION_GATT_SERVICES_DISCOVERED";
-    public final static String ACTION_DATA_AVAILABLE =
-            "com.example.bluetooth.le.ACTION_DATA_AVAILABLE";
-    public final static String EXTRA_DATA =
-            "com.example.bluetooth.le.EXTRA_DATA";
-    public final static String BLE_TNC_PACKET_DATA =
-            "com.example.bluetooth.le.BLE_TNC_PACKET_DATA";
-    public final static String BLE_TNC_VOLUME =
-            "com.example.bluetooth.le.BLE_TNC_VOLUME";
-
-    public final static UUID UUID_BLE_TNC_PACKET_DATA =
-            UUID.fromString("00002221-0000-1000-8000-00805f9b34fb");
-
-    // Implements callback methods for GATT events that the app cares about.  For example,
-    // connection change and services discovered.
-    private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
-        @Override
-        public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
-            String intentAction;
-            if (newState == BluetoothProfile.STATE_CONNECTED) {
-                intentAction = ACTION_GATT_CONNECTED;
-                mConnectionState = STATE_CONNECTED;
-                broadcastUpdate(intentAction);
-                Log.i(TAG, "Connected to GATT server.");
-                // Attempts to discover services after successful connection.
-                Log.i(TAG, "Attempting to start service discovery:" +
-                        mBluetoothGatt.discoverServices());
-
-            } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
-                intentAction = ACTION_GATT_DISCONNECTED;
-                mConnectionState = STATE_DISCONNECTED;
-                Log.i(TAG, "Disconnected from GATT server.");
-                broadcastUpdate(intentAction);
-            }
-        }
-
-        @Override
-        public void onServicesDiscovered(BluetoothGatt gatt, int status) {
-            if (status == BluetoothGatt.GATT_SUCCESS) {
-                broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED);
-            } else {
-                Log.e(TAG, "onServicesDiscovered received: " + status);
-            }
-        }
-
-        @Override
-        public void onCharacteristicRead(BluetoothGatt gatt,
-                                         BluetoothGattCharacteristic characteristic,
-                                         int status) {
-            if (status == BluetoothGatt.GATT_SUCCESS) {
-                broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
-            }
-        }
-
-        @Override
-        public void onDescriptorRead(BluetoothGatt gatt,
-        								BluetoothGattDescriptor descriptor,
-        								int status) {
-
-        }
-
-        @Override
-        public void onDescriptorWrite(BluetoothGatt gatt,
-        								BluetoothGattDescriptor descriptor,
-        								int status) {
-
-        }
-
-        @Override
-        public void onCharacteristicChanged(BluetoothGatt gatt,
-                                            BluetoothGattCharacteristic characteristic) {
-            broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
-        }
-    };
-
-    private void broadcastUpdate(final String action) {
-        final Intent intent = new Intent(action);
-        sendBroadcast(intent);
-    }
-
-    private void broadcastUpdate(final String action,
-                                 final BluetoothGattCharacteristic characteristic) {
-
-        Log.d(TAG, "Update");
-
-        if (UUID_BLE_TNC_PACKET_DATA.equals(characteristic.getUuid())){
-
-        	final byte[] data = characteristic.getValue();
-
-            Log.d(TAG, "Message type: " + data[0]);
-
-        	if(data[0] == 0x01){
-
-        		Log.d(TAG, "Packet Start Length: " + (data[1] & 0xFF));
-
-        		packetData = new byte[data[1] & 0xFF];
-        		packetCurrentLength = 0;
-        		for(int i = 2; i < data.length; i++){
-        			packetData[packetCurrentLength] = data[i];
-        			packetCurrentLength++;
-        		}
-
-        	} else if(data[0] == 0x02 && packetData != null){
-
-        		Log.d(TAG, "Packet Continued...");
-
-        		if(packetCurrentLength + data.length - 1 > packetData.length){
-
-        			Log.e(TAG, "Error: Packet to long!");
-
-            		packetCurrentLength = MAX_PACKET_LENGTH;
-
-            		return;
-
-        		}
-
-        		for(int i = 1; i < data.length; i++){
-        			packetData[packetCurrentLength] = data[i];
-        			packetCurrentLength++;
-        		}
-
-        	} else if(data[0] == 0x03){
-
-        		Log.d(TAG, "Volume Peak: " + (data[1] & 0xFF));
-
-        		final Intent intent = new Intent(action);
-        		intent.putExtra(BLE_TNC_VOLUME, (int) (data[1] & 0xFF));
-                sendBroadcast(intent);
-
-        	}
-
-        	Log.d(TAG, "pcl: " + packetCurrentLength);
-
-        	if(packetData != null){
-	        	if(packetData.length == packetCurrentLength){
-	
-	        		Log.d(TAG, "Broadcasting packet");
-	
-	        		// Put packet in DB
-	        		RawPacket pkt = RawPacket.fromRawData(packetData);
-	        		getContentResolver().insert(
-	        			APRSContentProvider.RAW_PACKET_URI,
-	        			RawPacketTable.getContentValues(pkt)
-	        		);
-	
-	        		Log.d(TAG, pkt.toString());
-
-	        		final Intent intent = new Intent(action);
-	        		intent.putExtra(BLE_TNC_PACKET_DATA, pkt);
-	                sendBroadcast(intent);
-	
-	        		packetCurrentLength = MAX_PACKET_LENGTH;
-	
-	        	} else if(packetData.length < packetCurrentLength && packetCurrentLength != MAX_PACKET_LENGTH){
-	
-	        		Log.e(TAG, "Error: Packet to long!");
-	
-	        		// Error, don't broadcast
-	        		packetCurrentLength = MAX_PACKET_LENGTH;
-	
-	        	}
-        	}
-
-        }
-    }
-
-    public class LocalBinder extends Binder {
-        public BluetoothLeService getService() {
-            return BluetoothLeService.this;
-        }
-    }
-
-    @Override
-    public IBinder onBind(Intent intent) {
-        return mBinder;
-    }
-
-    @Override
-    public boolean onUnbind(Intent intent) {
-        // After using a given device, you should make sure that BluetoothGatt.close() is called
-        // such that resources are cleaned up properly.  In this particular example, close() is
-        // invoked when the UI is disconnected from the Service.
-        close();
-        return super.onUnbind(intent);
-    }
-
-    private final IBinder mBinder = new LocalBinder();
-
-    /**
-     * Initializes a reference to the local Bluetooth adapter.
-     *
-     * @return Return true if the initialization is successful.
-     */
-    public boolean initialize() {
-        // For API level 18 and above, get a reference to BluetoothAdapter through
-        // BluetoothManager.
-        if (mBluetoothManager == null) {
-            mBluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
-            if (mBluetoothManager == null) {
-                Log.e(TAG, "Unable to initialize BluetoothManager.");
-                return false;
-            }
-        }
-
-        mBluetoothAdapter = mBluetoothManager.getAdapter();
-        if (mBluetoothAdapter == null) {
-            Log.e(TAG, "Unable to obtain a BluetoothAdapter.");
-            return false;
-        }
-
-        return true;
-    }
-
-    /**
-     * Connects to the GATT server hosted on the Bluetooth LE device.
-     *
-     * @param address The device address of the destination device.
-     *
-     * @return Return true if the connection is initiated successfully. The connection result
-     *         is reported asynchronously through the
-     *         {@code BluetoothGattCallback#onConnectionStateChange(android.bluetooth.BluetoothGatt, int, int)}
-     *         callback.
-     */
-    public boolean connect(final String address) {
-        if (mBluetoothAdapter == null || address == null) {
-            Log.w(TAG, "BluetoothAdapter not initialized or unspecified address.");
-            return false;
-        }
-
-        // Previously connected device.  Try to reconnect.
-        if (mBluetoothDeviceAddress != null && address.equals(mBluetoothDeviceAddress)
-                && mBluetoothGatt != null) {
-            Log.d(TAG, "Trying to use an existing mBluetoothGatt for connection.");
-            if (mBluetoothGatt.connect()) {
-                mConnectionState = STATE_CONNECTING;
-                return true;
-            } else {
-                return false;
-            }
-        }
-
-        final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
-        if (device == null) {
-            Log.w(TAG, "Device not found.  Unable to connect.");
-            return false;
-        }
-        // We want to directly connect to the device, so we are setting the autoConnect
-        // parameter to false.
-        mBluetoothGatt = device.connectGatt(this, false, mGattCallback);
-        Log.d(TAG, "Trying to create a new connection.");
-        mBluetoothDeviceAddress = address;
-        mConnectionState = STATE_CONNECTING;
-        return true;
-    }
-
-    /**
-     * Disconnects an existing connection or cancel a pending connection. The disconnection result
-     * is reported asynchronously through the
-     * {@code BluetoothGattCallback#onConnectionStateChange(android.bluetooth.BluetoothGatt, int, int)}
-     * callback.
-     */
-    public void disconnect() {
-        if (mBluetoothAdapter == null || mBluetoothGatt == null) {
-            Log.w(TAG, "BluetoothAdapter not initialized");
-            return;
-        }
-        mBluetoothGatt.disconnect();
-    }
-
-    /**
-     * After using a given BLE device, the app must call this method to ensure resources are
-     * released properly.
-     */
-    public void close() {
-        if (mBluetoothGatt == null) {
-            return;
-        }
-        mBluetoothGatt.close();
-        mBluetoothGatt = null;
-    }
-
-    /**
-     * Request a read on a given {@code BluetoothGattCharacteristic}. The read result is reported
-     * asynchronously through the {@code BluetoothGattCallback#onCharacteristicRead(android.bluetooth.BluetoothGatt, android.bluetooth.BluetoothGattCharacteristic, int)}
-     * callback.
-     *
-     * @param characteristic The characteristic to read from.
-     */
-    public void readCharacteristic(BluetoothGattCharacteristic characteristic) {
-        if (mBluetoothAdapter == null || mBluetoothGatt == null) {
-            Log.w(TAG, "BluetoothAdapter not initialized");
-            return;
-        }
-        mBluetoothGatt.readCharacteristic(characteristic);
-    }
-
-    public void writeDescriptor(BluetoothGattDescriptor descriptor) {
-        if (mBluetoothAdapter == null || mBluetoothGatt == null) {
-            Log.w(TAG, "BluetoothAdapter not initialized");
-            return;
-        }
-        mBluetoothGatt.writeDescriptor(descriptor);
-    }
-
-    
-    /**
-     * Enables or disables notification on a give characteristic.
-     *
-     * @param characteristic Characteristic to act on.
-     * @param enabled If true, enable notification.  False otherwise.
-     */
-    public void setCharacteristicNotification(BluetoothGattCharacteristic characteristic,
-                                              boolean enabled) {
-        if (mBluetoothAdapter == null || mBluetoothGatt == null) {
-            Log.w(TAG, "BluetoothAdapter not initialized");
-            return;
-        }
-
-        mBluetoothGatt.setCharacteristicNotification(characteristic, enabled);
-
-        if (UUID_BLE_TNC_PACKET_DATA.equals(characteristic.getUuid())) {
-
-        	BluetoothGattDescriptor descriptor = characteristic.getDescriptor(
-                    UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"));
-
-        	descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
-            mBluetoothGatt.writeDescriptor(descriptor);
-
-        }
-    }
-
-    /**
-     * Retrieves a list of supported GATT services on the connected device. This should be
-     * invoked only after {@code BluetoothGatt#discoverServices()} completes successfully.
-     *
-     * @return A {@code List} of supported services.
-     */
-    public List<BluetoothGattService> getSupportedGattServices() {
-        if (mBluetoothGatt == null) return null;
-
-        return mBluetoothGatt.getServices();
-    }
-}
-

--- a/src/com/dryerzinia/aprs_x/test/DeviceControlActivity.java
+++ b/src/com/dryerzinia/aprs_x/test/DeviceControlActivity.java
@@ -49,7 +49,7 @@
 
 import com.dryerzinia.aprs_x.R;
 import com.dryerzinia.aprs_x.data_model.packet.RawPacket;
-import com.dryerzinia.aprs_x.services.BluetoothLeService;
+import com.dryerzinia.aprs_x.services.BLETNCService;
 
 /**
  * For a given BLE device, this Activity provides the user interface to connect, display data,
@@ -74,7 +74,7 @@
     private List<String> mPacketList = new ArrayList<String>();
     private ListView mPacketListView;
     private ProgressBar volumeBar;
-    private BluetoothLeService mBluetoothLeService;
+    private BLETNCService mBluetoothLeService;
     private boolean mConnected = false;
     private OutputStream mLogOutputStream;
 
@@ -83,7 +83,7 @@
 
         @Override
         public void onServiceConnected(ComponentName componentName, IBinder service) {
-            mBluetoothLeService = ((BluetoothLeService.LocalBinder) service).getService();
+            mBluetoothLeService = ((BLETNCService.LocalBinder) service).getService();
             if (!mBluetoothLeService.initialize()) {
                 Log.e(TAG, "Unable to initialize Bluetooth");
                 finish();
@@ -108,19 +108,19 @@
         @Override
         public void onReceive(Context context, Intent intent) {
             final String action = intent.getAction();
-            if (BluetoothLeService.ACTION_GATT_CONNECTED.equals(action)) {
+            if (BLETNCService.ACTION_GATT_CONNECTED.equals(action)) {
 
             	mConnected = true;
                 updateConnectionState(R.string.connected);
                 invalidateOptionsMenu();
 
-            } else if (BluetoothLeService.ACTION_GATT_DISCONNECTED.equals(action)) {
+            } else if (BLETNCService.ACTION_GATT_DISCONNECTED.equals(action)) {
 
             	mConnected = false;
                 updateConnectionState(R.string.disconnected);
                 invalidateOptionsMenu();
 
-            } else if (BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED.equals(action)) {
+            } else if (BLETNCService.ACTION_GATT_SERVICES_DISCOVERED.equals(action)) {
 
             	List<BluetoothGattService> services = mBluetoothLeService.getSupportedGattServices();
             	for(BluetoothGattService service : services){
@@ -130,11 +130,11 @@
             		}
             	}
 
-            } else if (BluetoothLeService.ACTION_DATA_AVAILABLE.equals(action)) {
-
-                if(intent.hasExtra(BluetoothLeService.BLE_TNC_VOLUME)){
-
-                	int volume = intent.getIntExtra(BluetoothLeService.BLE_TNC_VOLUME, -1);
+            } else if (BLETNCService.ACTION_DATA_AVAILABLE.equals(action)) {
+
+                if(intent.hasExtra(BLETNCService.BLE_TNC_VOLUME)){
+
+                	int volume = intent.getIntExtra(BLETNCService.BLE_TNC_VOLUME, -1);
                 	if(volume != -1){
 
                 		volumeBar.setProgress(volume);
@@ -148,11 +148,11 @@
 
                 	}
 
-                } else if(intent.hasExtra(BluetoothLeService.BLE_TNC_PACKET_DATA)){
+                } else if(intent.hasExtra(BLETNCService.BLE_TNC_PACKET_DATA)){
 
                     Log.d(TAG, "Displaying Packet");
 
-                	RawPacket pkt = (RawPacket) intent.getSerializableExtra(BluetoothLeService.BLE_TNC_PACKET_DATA);
+                	RawPacket pkt = (RawPacket) intent.getSerializableExtra(BLETNCService.BLE_TNC_PACKET_DATA);
 		
 	                try {
 	                	mLogOutputStream.write(0x00);
@@ -196,7 +196,7 @@
 
         getActionBar().setTitle(mDeviceName);
         getActionBar().setDisplayHomeAsUpEnabled(true);
-        Intent gattServiceIntent = new Intent(this, BluetoothLeService.class);
+        Intent gattServiceIntent = new Intent(this, BLETNCService.class);
         bindService(gattServiceIntent, mServiceConnection, BIND_AUTO_CREATE);
         registerReceiver(mGattUpdateReceiver, makeGattUpdateIntentFilter());
     }
@@ -275,10 +275,10 @@
 
     private static IntentFilter makeGattUpdateIntentFilter() {
         final IntentFilter intentFilter = new IntentFilter();
-        intentFilter.addAction(BluetoothLeService.ACTION_GATT_CONNECTED);
-        intentFilter.addAction(BluetoothLeService.ACTION_GATT_DISCONNECTED);
-        intentFilter.addAction(BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED);
-        intentFilter.addAction(BluetoothLeService.ACTION_DATA_AVAILABLE);
+        intentFilter.addAction(BLETNCService.ACTION_GATT_CONNECTED);
+        intentFilter.addAction(BLETNCService.ACTION_GATT_DISCONNECTED);
+        intentFilter.addAction(BLETNCService.ACTION_GATT_SERVICES_DISCOVERED);
+        intentFilter.addAction(BLETNCService.ACTION_DATA_AVAILABLE);
         return intentFilter;
     }
 }