Android_System_ANTHALService_3-1-0
diff --git a/Android.mk b/Android.mk
index f119ec0..2169f06 100644
--- a/Android.mk
+++ b/Android.mk
@@ -20,9 +20,6 @@
 LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
 
-BT_ON_SRC_FILES := \
-     src/com/dsi/ant/server/StateChangedReceiver.java
-
 #
 # ANT java system service
 #
@@ -32,16 +29,6 @@
     src/com/dsi/ant/server/IAntHal.aidl \
     src/com/dsi/ant/server/IAntHalCallback.aidl
 
-#
-# If target board is not one that requires Bluetooth to be enabled for ANT to enable, 
-# filter out files that are only needed for Bluetooth to enable when ANT is enabled.
-#
-
-ifeq ($(filter msm8610 msm8226 msm8974, $(TARGET_BOARD_PLATFORM)),)
-LOCAL_SRC_FILES := \
-     $(filter-out  $(BT_ON_SRC_FILES), $(LOCAL_SRC_FILES))
-endif
-
 LOCAL_REQUIRED_MODULES := libantradio
 LOCAL_PROGUARD_FLAG_FILES := proguard.flags
 LOCAL_CERTIFICATE := platform
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 7e0a17e..28b95be 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -16,8 +16,8 @@
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.dsi.ant.server"
-    android:versionName="3.0.1"
-    android:versionCode="030001"
+    android:versionName="3.1.0"
+    android:versionCode="030100"
     android:sharedUserId="android.uid.system">
 
     <uses-sdk
@@ -49,15 +49,6 @@
                 <action android:name="android.intent.action.BOOT_COMPLETED" />
             </intent-filter>
         </receiver>
-        
-        <receiver android:name="com.dsi.ant.server.StateChangedReceiver"
-            android:enabled="true"
-            android:exported="false"
-            android:label="StateChangedReceiver">
-            <intent-filter>
-                <action android:name="android.bluetooth.adapter.action.STATE_CHANGED" />
-            </intent-filter>
-        </receiver>
 
     </application>
 
diff --git a/ReleaseNotes.txt b/ReleaseNotes.txt
index d889dc7..82df96b 100644
--- a/ReleaseNotes.txt
+++ b/ReleaseNotes.txt
@@ -1,6 +1,6 @@
 AntHalService - Release Notes
-v3.0.1
-2013-07-18
+v3.1.0
+2013-07-19
 
 Copyright 2011 Dynastream Innovations
 
@@ -27,6 +27,12 @@
 =============================================================
 2. REVISION HISTORY
 
+v3.1.0 : 2013-07-19 : Android_System_ANTHALService_3-1-0
+
+Task
+    [ANTDROID-2035] - Remove tabs from AntService
+    [ANTDROID-1987] - Enable Bluetooth when ANT is enabled, if required by chip
+
 v3.0.0 : 2013-01-17 : Android_System_ANTHALService_3-0-0
 
 Bug
diff --git a/src/com/dsi/ant/server/AntService.java b/src/com/dsi/ant/server/AntService.java
index 388a311..1ed828f 100644
--- a/src/com/dsi/ant/server/AntService.java
+++ b/src/com/dsi/ant/server/AntService.java
@@ -46,18 +46,35 @@
 
     public static final String ANT_SERVICE = "AntService";
 
+    /**
+     * Allows the application to directly configure the ANT radio through the
+     * proxy service. Malicious applications may prevent other ANT applications
+     * from connecting to ANT devices
+     */
     public static final String ANT_ADMIN_PERMISSION = "com.dsi.ant.permission.ANT_ADMIN";
 
+    /**
+     * Request that ANT be enabled
+     */
     public static final String ACTION_REQUEST_ENABLE = "com.dsi.ant.server.action.REQUEST_ENABLE";
 
+    /**
+     * Request that ANT be disabled
+     */
     public static final String ACTION_REQUEST_DISABLE = "com.dsi.ant.server.action.REQUEST_DISABLE";
 
     private JAntJava mJAnt = null;
 
     private boolean mInitialized = false;
 
+    /**
+     * Flag for if Bluetooth needs to be enabled for ANT to enable
+     */
     private boolean mRequiresBluetoothOn = false;
 
+    /**
+     * Flag which specifies if we are waiting for an ANT enable intent
+     */
     private boolean mEnablePending = false;
 
     private Object mChangeAntPowerState_LOCK = new Object();
@@ -65,17 +82,16 @@
 
     IAntHalCallback mCallback;
 
-    private boolean isQcomPlatform()
-    {
-        if ((SystemProperties.get("ro.board.platform").equals("msm8974"))
-                || (SystemProperties.get("ro.board.platform").equals("msm8610"))
-                || (SystemProperties.get("ro.board.platform").equals("msm8226"))) {
+    /**
+     * Receives Bluetooth State Changed intent and sends {@link ACTION_REQUEST_ENABLE}
+     * and {@link ACTION_REQUEST_DISABLE} accordingly
+     */
+    private final StateChangedReceiver mStateChangedReceiver = new StateChangedReceiver();
 
-            return true;
-        }
-        return false;
-    }
-
+    /**
+     * Receives {@link ACTION_REQUEST_ENABLE} and {@link ACTION_REQUEST_DISABLE}
+     * intents to enable and disable ANT.
+     */
     private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
@@ -97,6 +113,27 @@
         }
     };
 
+    /**
+     * Checks if Bluetooth needs to be turned on for ANT to enable
+     */
+    private boolean requiresBluetoothOn() {
+        return isQcomPlatform();
+    }
+
+    /**
+     * Checks if the current platform is QCom
+     */
+    private boolean isQcomPlatform()
+    {
+        if ((SystemProperties.get("ro.board.platform").equals("msm8974"))
+                || (SystemProperties.get("ro.board.platform").equals("msm8610"))
+                || (SystemProperties.get("ro.board.platform").equals("msm8226"))) {
+
+            return true;
+        }
+        return false;
+    }
+
     public static boolean startService(Context context)
     {
         return ( null != context.startService(new Intent(IAntHal.class.getName())) );
@@ -157,22 +194,25 @@
                         BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
 
                         if (bluetoothAdapter != null) {
+
+                            // run with permissions of ANTHALService
                             long callingPid = Binder.clearCallingIdentity();
 
                             if (!bluetoothAdapter.isEnabled()) {
 
                                 waitForBluetoothToEnable = true;
-
-                                // check permissions of ANTHALService
+                                mEnablePending = true;
+                                
                                 boolean isEnabling = bluetoothAdapter.enable();
 
                                 // if enabling adapter has begun, return
                                 // success.
                                 if (isEnabling) {
-                                    mEnablePending = true;
                                     result = AntHalDefine.ANT_HAL_RESULT_SUCCESS;
                                     // StateChangedReceiver will receive
                                     // enabled status and then enable ANT
+                                } else {
+                                    mEnablePending = false;
                                 }
                             }
 
@@ -226,44 +266,48 @@
      */
     private int asyncSetAntPowerState(final boolean state)
     {
-    	int result = AntHalDefine.ANT_HAL_RESULT_FAIL_UNKNOWN;
+        int result = AntHalDefine.ANT_HAL_RESULT_FAIL_UNKNOWN;
 
-    	synchronized(mChangeAntPowerState_LOCK) {
-    		// Check we are not already in/transitioning to the state we want
-    		int currentState = doGetAntState();
+        synchronized (mChangeAntPowerState_LOCK) {
+            // Check we are not already in/transitioning to the state we want
+            int currentState = doGetAntState();
 
-    		if(state) {
-    			if((AntHalDefine.ANT_HAL_STATE_ENABLED == currentState)
-    					|| (AntHalDefine.ANT_HAL_STATE_ENABLING == currentState)) {
-    				if(DEBUG) Log.d(TAG, "Enable request ignored as already enabled/enabling");
+            if (state) {
+                if ((AntHalDefine.ANT_HAL_STATE_ENABLED == currentState)
+                        || (AntHalDefine.ANT_HAL_STATE_ENABLING == currentState)) {
+                    if (DEBUG) {
+                        Log.d(TAG, "Enable request ignored as already enabled/enabling");
+                    }
 
-    				return AntHalDefine.ANT_HAL_RESULT_SUCCESS;
-    			} else if(AntHalDefine.ANT_HAL_STATE_DISABLING == currentState) {
-    				Log.w(TAG, "Enable request ignored as already disabling");
+                    return AntHalDefine.ANT_HAL_RESULT_SUCCESS;
+                } else if (AntHalDefine.ANT_HAL_STATE_DISABLING == currentState) {
+                    Log.w(TAG, "Enable request ignored as already disabling");
 
-    				return AntHalDefine.ANT_HAL_RESULT_FAIL_UNKNOWN;
-    			}
-    		} else {
-    			if((AntHalDefine.ANT_HAL_STATE_DISABLED == currentState)
-    					|| (AntHalDefine.ANT_HAL_STATE_DISABLING == currentState)) {
-    				if(DEBUG)Log.d(TAG, "Disable request ignored as already disabled/disabling");
+                    return AntHalDefine.ANT_HAL_RESULT_FAIL_UNKNOWN;
+                }
+            } else {
+                if ((AntHalDefine.ANT_HAL_STATE_DISABLED == currentState)
+                        || (AntHalDefine.ANT_HAL_STATE_DISABLING == currentState)) {
+                    if (DEBUG) {
+                        Log.d(TAG, "Disable request ignored as already disabled/disabling");
+                    }
 
-    				return AntHalDefine.ANT_HAL_RESULT_SUCCESS;
-    			} else if(AntHalDefine.ANT_HAL_STATE_ENABLING == currentState) {
-    				Log.w(TAG, "Disable request ignored as already enabling");
+                    return AntHalDefine.ANT_HAL_RESULT_SUCCESS;
+                } else if (AntHalDefine.ANT_HAL_STATE_ENABLING == currentState) {
+                    Log.w(TAG, "Disable request ignored as already enabling");
 
-    				return AntHalDefine.ANT_HAL_RESULT_FAIL_UNKNOWN;
-    			}
-    		}
+                    return AntHalDefine.ANT_HAL_RESULT_FAIL_UNKNOWN;
+                }
+            }
 
-    		if (state) {
-    			result = enableBackground();
-    		} else {
-    			result = disableBackground();
-    		}
+            if (state) {
+                result = enableBackground();
+            } else {
+                result = disableBackground();
+            }
         }
-    	
-    	return result;
+
+        return result;
     }
 
     /**
@@ -513,7 +557,7 @@
         }
         // create a single new JAnt HCI Interface instance
         mJAnt = new JAntJava();
-        mRequiresBluetoothOn = isQcomPlatform();
+        mRequiresBluetoothOn = requiresBluetoothOn();
         JAntStatus createResult = mJAnt.create(mJAntCallback);
 
         if (createResult == JAntStatus.SUCCESS)
@@ -533,6 +577,12 @@
         filter.addAction(ACTION_REQUEST_ENABLE);
         filter.addAction(ACTION_REQUEST_DISABLE);
         registerReceiver(mReceiver, filter);
+        
+        if (mRequiresBluetoothOn) {
+            IntentFilter stateChangedFilter = new IntentFilter();
+            stateChangedFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
+            registerReceiver(mStateChangedReceiver, stateChangedFilter);
+        }
     }
 
     @Override
@@ -561,6 +611,10 @@
             super.onDestroy();
         }
 
+        if (mRequiresBluetoothOn) {
+            unregisterReceiver(mStateChangedReceiver);
+        }
+
         unregisterReceiver(mReceiver);
     }