Bluetooh-wipower: Support for power apply and charge complete API's.

Support for Power apply command from app layer provided along with
charge complete api's as a part of wipower charging.

Change-Id: I32bae53d87c2af123c86b9f744093cdada18852d
CRs-fixed:  671422
diff --git a/Android.mk b/Android.mk
index f487428..2a68027 100644
--- a/Android.mk
+++ b/Android.mk
@@ -23,6 +23,8 @@
 LOCAL_JAVA_LIBRARIES := javax.obex
 LOCAL_JAVA_LIBRARIES += mms-common
 LOCAL_JAVA_LIBRARIES += telephony-common
+LOCAL_JAVA_LIBRARIES += com.quicinc.wbc
+
 LOCAL_STATIC_JAVA_LIBRARIES := com.android.vcard
 
 LOCAL_REQUIRED_MODULES := libbluetooth_jni bluetooth.default
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 3bbd86d..3e7c322 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -51,6 +51,8 @@
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />
     <application android:process="com.android.bluetooth">
+        <uses-library android:name="com.quicinc.wbc"
+            android:required="false" />
         <uses-library android:name="javax.obex" />
         <uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
         <service
diff --git a/src/org/codeaurora/bluetooth/a4wp/A4wpService.java b/src/org/codeaurora/bluetooth/a4wp/A4wpService.java
index 50f6393..f778f96 100644
--- a/src/org/codeaurora/bluetooth/a4wp/A4wpService.java
+++ b/src/org/codeaurora/bluetooth/a4wp/A4wpService.java
@@ -58,6 +58,8 @@
 import android.wipower.WipowerManager.PowerApplyEvent;
 import android.wipower.WipowerManager.PowerLevel;
 import android.wipower.WipowerDynamicParam;
+import com.quicinc.wbc.WbcManager;
+import com.quicinc.wbc.WbcTypes;
 
 /**
  * Class which executes A4WP service
@@ -94,7 +96,7 @@
     private final static byte DEFAULT_MAX_POWER_DESIRED = 0x0032;
     private final static short DEFAULT_VRECT_MIN = 0x003200;
     private final static short DEFAULT_VRECT_MAX = 0x004650;
-    private final static short DEFAULT_VRECT_SET = 0x002580;
+    private final static short DEFAULT_VRECT_SET = 0x003580;
     private final static short DEFAULT_DELTA_R1 = 0x0001;
     private final static int DEFAULT_RFU_VAL = 0x0000;
     private static final int MSB_MASK = 0xFF00;
@@ -108,6 +110,30 @@
     private static final byte A4WP_ADV_MIN_INTERVAL = 0x20;
     private static final byte A4WP_ADV_MAX_INTERVAL = 0x20;
 
+    private static boolean mWipowerBoot = false;
+    static boolean mChargeComplete = true;
+
+    private WbcManager.WbcEventListener mWbcCallback = new WbcManager.WbcEventListener() {
+
+        @Override
+        public void onWbcEventUpdate(int what, int arg1, int arg2) {
+            Log.v(LOGTAG, "onWbcEventUpdate rcvd: " + what + ", " + arg1 + ", " + arg2);
+            if ((what == WbcTypes.WBC_EVENT_TYPE_CHARGING_REQUIRED_STATUS)){
+                if ((arg1 == WbcTypes.WBC_BATTERY_STATUS_CHARGING_NOT_REQUIRED)){
+                    // this will set charge complete bit in pru alert
+                    // eventally leading to a possible disconnect from ptu
+                    mChargeComplete = true;
+                } else {
+                    // We could be in 600mS scan state here and since charging needs to be resumed
+                    // send enable power apply command to scan for short beacons */
+                    mChargeComplete = false;
+                    mWipowerManager.enablePowerApply(true, true, false);
+                }
+            }
+            Log.v(LOGTAG, "onWbcEventUpdate: charge complete " +  mChargeComplete);
+        }
+    };
+
     private class PruStaticParam {
         private byte mOptvalidity;
         private byte mProtoRevision;
@@ -380,6 +406,7 @@
     private PtuStaticParam mPtuStaticParam; //20 bytes
     private static WipowerDynamicParam mPruDynamicParam; //20 bytes
     private WipowerManager mWipowerManager;
+    private WbcManager mWbcManager;
 
     public A4wpService() {
         Log.v(LOGTAG, "A4wpService");
@@ -451,6 +478,12 @@
         @Override
         public void onWipowerReady() {
             Log.v(LOGTAG, "onWipowerReady");
+            if (mChargeComplete == true) {
+                mWipowerManager.enablePowerApply(true, true, true);
+            } else {
+                mWipowerManager.enablePowerApply(true, true, false);
+            }
+            mWipowerBoot = true;
         }
 
         @Override
@@ -514,7 +547,7 @@
             byte[] value = data.getValue();
 
             Log.v(LOGTAG, "calling SetValue");
-            mPruDynamicParam.setAppValue(value);
+            mPruDynamicParam.setValue(value);
         }
 
     };
@@ -528,11 +561,15 @@
         public void onConnectionStateChange(BluetoothDevice device, int status, int newState) {
             mState = newState;
             if (mState == BluetoothProfile.STATE_DISCONNECTED) {
-                Log.v(LOGTAG, "onConnectionStateChange:DISCONNECTED " + device);
-                if (mDevice != null) {
-                    //Uncomment this later
-                    //mWipowerManager.enableDataNotification(false);
-                    //mWipowerManager.stopCharging();
+                Log.v(LOGTAG, "onConnectionStateChange:DISCONNECTED " + device + "charge complete " + mChargeComplete);
+                if (mDevice != null && mWipowerManager != null) {
+                    mWipowerManager.enableDataNotification(false);
+                    mWipowerManager.stopCharging();
+                    if (mChargeComplete == true) {
+                        mWipowerManager.enablePowerApply(true, true, true);
+                    } else {
+                        mWipowerManager.enablePowerApply(true, true, false);
+                    }
                     mDevice = null;
                 }
             } else {
@@ -588,10 +625,15 @@
                          return;
                     }
                     value = mPruDynamicParam.getValue();
+                    if (mChargeComplete == true) {
+                        value[16] = (byte)(value[16] | CHARGE_COMPLETE_BIT);
+                    } else {
+                        value[16] = (byte)(value[16] & (~CHARGE_COMPLETE_BIT));
+                    }
                 }
                 if (value != null)
                 {
-                     Log.v(LOGTAG, "device:" + id + "requestId:" + requestId + "status:" + status + "offset:" + offset + "value" + value);
+                     Log.v(LOGTAG, "device=" + id + "requestId=" + requestId + "status=" + status + "offset=" + offset + "value=" + value[16]);
                      mBluetoothGattServer.sendResponse(device, requestId, status, offset, value);
                 }
         }
@@ -698,7 +740,6 @@
 
 
         mBluetoothGattServer.addService(a4wpService);
-        Log.d(LOGTAG,"time to start advertising....:");
 
         //startAdvertising();
 
@@ -726,6 +767,12 @@
         mWipowerManager = WipowerManager.getWipowerManger(this, mWipowerCallback);
         if (mWipowerManager != null)
              mWipowerManager.registerCallback(mWipowerCallback);
+        mWbcManager = WbcManager.getInstance();
+        if (mWbcManager != null) {
+            mChargeComplete = (mWbcManager.getChargingRequired() == 0);
+            Log.v(LOGTAG, "onCreate: charge complete " + mChargeComplete);
+            mWbcManager.register(mWbcCallback);
+        }
     }
 
     @Override
@@ -733,6 +780,8 @@
         Log.v(LOGTAG, "onDestroy");
         if (mWipowerManager != null)
              mWipowerManager.unregisterCallback(mWipowerCallback);
+        if (mWbcManager != null)
+             mWbcManager.unregister(mWbcCallback);
     }
 
     @Override
@@ -744,8 +793,15 @@
     @Override
     public int onStartCommand(Intent intent, int flags, int startId) {
         Log.d(LOGTAG, "onStart Command called!!");
-        //Make this restarable service by
-        //Android app manager
+
+        //mWipowerBoot is used to hold power enable command till the service is been registered completely
+        if (mWipowerBoot == true) {
+            if (mChargeComplete == true) {
+                mWipowerManager.enablePowerApply(true, true, true);
+            } else {
+                mWipowerManager.enablePowerApply(true, true, false);
+            }
+        }
         return START_STICKY;
    }
 }