Add Wifi High Perf. mode during a call.

To prevent the wifi from entering low-power mode due to the screen off
triggered by the proximity sensor.

Change-Id: I490bc594d800bc30c256e52ef3bce08bf86bc7b1
diff --git a/voip/java/android/net/sip/SipAudioCallImpl.java b/voip/java/android/net/sip/SipAudioCallImpl.java
index b8ac6d7..5789cd4 100644
--- a/voip/java/android/net/sip/SipAudioCallImpl.java
+++ b/voip/java/android/net/sip/SipAudioCallImpl.java
@@ -36,6 +36,7 @@
 import android.net.sip.SipProfile;
 import android.net.sip.SipSessionAdapter;
 import android.net.sip.SipSessionState;
+import android.net.wifi.WifiManager;
 import android.os.Message;
 import android.os.RemoteException;
 import android.os.Vibrator;
@@ -84,10 +85,13 @@
     private ToneGenerator mRingbackTone;
 
     private SipProfile mPendingCallRequest;
+    private WifiManager mWm;
+    private WifiManager.WifiLock mWifiHighPerfLock;
 
     public SipAudioCallImpl(Context context, SipProfile localProfile) {
         mContext = context;
         mLocalProfile = localProfile;
+        mWm = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
     }
 
     public void setListener(SipAudioCall.Listener listener) {
@@ -422,6 +426,28 @@
         }
     }
 
+    private void grabWifiHighPerfLock() {
+        if (mWifiHighPerfLock == null) {
+            Log.v(TAG, "acquire wifi high perf lock");
+            mWifiHighPerfLock = ((WifiManager)
+                    mContext.getSystemService(Context.WIFI_SERVICE))
+                    .createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF, TAG);
+            mWifiHighPerfLock.acquire();
+        }
+    }
+
+    private void releaseWifiHighPerfLock() {
+        if (mWifiHighPerfLock != null) {
+            Log.v(TAG, "release wifi high perf lock");
+            mWifiHighPerfLock.release();
+            mWifiHighPerfLock = null;
+        }
+    }
+
+    private boolean isWifiOn() {
+        return (mWm.getConnectionInfo().getBSSID() == null) ? false : true;
+    }
+
     private SessionDescription createContinueSessionDescription() {
         return createSdpBuilder(true, mCodec).build();
     }
@@ -556,7 +582,7 @@
 
     private void startCall(SdpSessionDescription peerSd) {
         stopCall(DONT_RELEASE_SOCKET);
-
+        if (isWifiOn()) grabWifiHighPerfLock();
         mPeerSd = peerSd;
         String peerMediaAddress = peerSd.getPeerMediaAddress(AUDIO);
         // TODO: handle multiple media fields
@@ -623,6 +649,7 @@
 
     private void stopCall(boolean releaseSocket) {
         Log.d(TAG, "stop audiocall");
+        releaseWifiHighPerfLock();
         if (mAudioStream != null) {
             mAudioStream.join(null);