Change to dispose Gsm/CdmaConnection to make sure wakelock is released

Wakelock acq/release is done only on connection creation and
disconnect. If phone switch happens before disconnect, wakelock is not
released.

Bug: 23334669
Change-Id: Iebf34fa7b05015fec16730ec9e45635181939649
diff --git a/src/java/com/android/internal/telephony/cdma/CdmaCallTracker.java b/src/java/com/android/internal/telephony/cdma/CdmaCallTracker.java
index aa38e4d..f5a5658 100644
--- a/src/java/com/android/internal/telephony/cdma/CdmaCallTracker.java
+++ b/src/java/com/android/internal/telephony/cdma/CdmaCallTracker.java
@@ -124,6 +124,11 @@
 
         clearDisconnected();
 
+        for (CdmaConnection cdmaConnection : mConnections) {
+            if (cdmaConnection != null) {
+                cdmaConnection.dispose();
+            }
+        }
     }
 
     @Override
@@ -358,6 +363,7 @@
 
         updatePhoneState();
         mPhone.notifyPreciseCallStateChanged();
+
     }
 
     boolean
diff --git a/src/java/com/android/internal/telephony/cdma/CdmaConnection.java b/src/java/com/android/internal/telephony/cdma/CdmaConnection.java
index 9ad3a99..6b819f8 100755
--- a/src/java/com/android/internal/telephony/cdma/CdmaConnection.java
+++ b/src/java/com/android/internal/telephony/cdma/CdmaConnection.java
@@ -186,6 +186,8 @@
     }
 
     public void dispose() {
+        clearPostDialListeners();
+        releaseAllWakeLocks();
     }
 
     static boolean
@@ -794,6 +796,14 @@
         }
     }
 
+    private void releaseAllWakeLocks() {
+        synchronized (mPartialWakeLock) {
+            while (mPartialWakeLock.isHeld()) {
+                mPartialWakeLock.release();
+            }
+        }
+    }
+
     private static boolean isPause(char c) {
         return c == PhoneNumberUtils.PAUSE;
     }
diff --git a/src/java/com/android/internal/telephony/gsm/GsmCallTracker.java b/src/java/com/android/internal/telephony/gsm/GsmCallTracker.java
index a9958f5..4198257 100755
--- a/src/java/com/android/internal/telephony/gsm/GsmCallTracker.java
+++ b/src/java/com/android/internal/telephony/gsm/GsmCallTracker.java
@@ -119,8 +119,13 @@
         mCi.unregisterForOn(this);
         mCi.unregisterForNotAvailable(this);
 
-
         clearDisconnected();
+
+        for (GsmConnection gsmConnection : mConnections) {
+            if (gsmConnection != null) {
+                gsmConnection.dispose();
+            }
+        }
     }
 
     @Override
diff --git a/src/java/com/android/internal/telephony/gsm/GsmConnection.java b/src/java/com/android/internal/telephony/gsm/GsmConnection.java
index e343c6e..585bf7e 100644
--- a/src/java/com/android/internal/telephony/gsm/GsmConnection.java
+++ b/src/java/com/android/internal/telephony/gsm/GsmConnection.java
@@ -157,6 +157,8 @@
     }
 
     public void dispose() {
+        clearPostDialListeners();
+        releaseAllWakeLocks();
     }
 
     static boolean
@@ -740,6 +742,15 @@
         }
     }
 
+    private void
+    releaseAllWakeLocks() {
+        synchronized(mPartialWakeLock) {
+            while (mPartialWakeLock.isHeld()) {
+                mPartialWakeLock.release();
+            }
+        }
+    }
+
     private void log(String msg) {
         Rlog.d(LOG_TAG, "[GSMConn] " + msg);
     }