Wifi: Check for WiFiService's existence before its access

The sip components currently access WiFiManager before it is started.
The current behavior is to not start the WiFi service during the FDE
encryption (WiFi service is not considered as a core service). This
behavior would lead to a fatal exception. Address this by adding a NULL
check before the access in all the components of telephony framework.

See also the similar CAF change in frameworks/base:
I5fb753df8874b962622ef6921b9cbc518381203c

Issue: FP2P-373
Change-Id: Idad86aebf677aefe3905e26d77cb087686ed2634
diff --git a/src/java/android/net/sip/SipAudioCall.java b/src/java/android/net/sip/SipAudioCall.java
index ea943e9..6e28a79 100644
--- a/src/java/android/net/sip/SipAudioCall.java
+++ b/src/java/android/net/sip/SipAudioCall.java
@@ -833,10 +833,14 @@
     private void grabWifiHighPerfLock() {
         if (mWifiHighPerfLock == null) {
             if (DBG) log("grabWifiHighPerfLock:");
-            mWifiHighPerfLock = ((WifiManager)
-                    mContext.getSystemService(Context.WIFI_SERVICE))
-                    .createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF, LOG_TAG);
-            mWifiHighPerfLock.acquire();
+            WifiManager wM = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
+            if (wM != null) {
+                mWifiHighPerfLock =
+                    wM.createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF, LOG_TAG);
+                mWifiHighPerfLock.acquire();
+            } else {
+                logw("WifiManager is not running; cannot create lock.");
+            }
         }
     }
 
@@ -849,6 +853,8 @@
     }
 
     private boolean isWifiOn() {
+        if (mWm == null)
+            return false;
         return (mWm.getConnectionInfo().getBSSID() == null) ? false : true;
     }
 
@@ -1133,6 +1139,10 @@
         Rlog.d(LOG_TAG, s);
     }
 
+    private void logw(String s) {
+        Rlog.w(LOG_TAG, s);
+    }
+
     private void loge(String s) {
         Rlog.e(LOG_TAG, s);
     }
diff --git a/src/java/com/android/server/sip/SipService.java b/src/java/com/android/server/sip/SipService.java
index d14a8d6..6573258 100644
--- a/src/java/com/android/server/sip/SipService.java
+++ b/src/java/com/android/server/sip/SipService.java
@@ -114,10 +114,13 @@
         mContext = context;
         mConnectivityReceiver = new ConnectivityReceiver();
 
-        mWifiLock = ((WifiManager)
-                context.getSystemService(Context.WIFI_SERVICE))
-                .createWifiLock(WifiManager.WIFI_MODE_FULL, TAG);
-        mWifiLock.setReferenceCounted(false);
+        WifiManager wM = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
+        if (wM != null) {
+            mWifiLock = wM.createWifiLock(WifiManager.WIFI_MODE_FULL, TAG);
+            mWifiLock.setReferenceCounted(false);
+        } else {
+            logw("WifiManager is not running; cannot create lock.");
+        }
         mSipOnWifiOnly = SipManager.isSipWifiOnly(context);
 
         mMyWakeLock = new SipWakeLock((PowerManager)
@@ -1160,25 +1163,28 @@
         if (DBG) log("unregisterReceivers:");
 
         // Reset variables maintained by ConnectivityReceiver.
-        mWifiLock.release();
+        if (mWifiLock != null)
+            mWifiLock.release();
         mNetworkType = -1;
     }
 
     private void updateWakeLocks() {
-        for (SipSessionGroupExt group : mSipGroups.values()) {
-            if (group.isOpenedToReceiveCalls()) {
-                // Also grab the WifiLock when we are disconnected, so the
-                // system will keep trying to reconnect. It will be released
-                // when the system eventually connects to something else.
-                if (mNetworkType == ConnectivityManager.TYPE_WIFI || mNetworkType == -1) {
-                    mWifiLock.acquire();
-                } else {
-                    mWifiLock.release();
+        if (mWifiLock != null) {
+                for (SipSessionGroupExt group : mSipGroups.values()) {
+                    if (group.isOpenedToReceiveCalls()) {
+                        // Also grab the WifiLock when we are disconnected, so the
+                        // system will keep trying to reconnect. It will be released
+                        // when the system eventually connects to something else.
+                        if (mNetworkType == ConnectivityManager.TYPE_WIFI || mNetworkType == -1) {
+                            mWifiLock.acquire();
+                        } else {
+                            mWifiLock.release();
+                        }
+                        return;
+                    }
                 }
-                return;
-            }
+            mWifiLock.release();
         }
-        mWifiLock.release();
         mMyWakeLock.reset(); // in case there's a leak
     }
 
@@ -1283,6 +1289,10 @@
         Rlog.d(TAG, s);
     }
 
+    private void logw(String s) {
+        Rlog.w(TAG, s);
+    }
+
     private void loge(String s, Throwable e) {
         Rlog.e(TAG, s, e);
     }