Loading src/java/com/android/internal/telephony/GsmCdmaConnection.java +89 −2 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.PersistableBundle; import android.os.PowerManager; import android.os.Registrant; import android.os.SystemClock; import android.telephony.CarrierConfigManager; Loading Loading @@ -74,6 +75,8 @@ public class GsmCdmaConnection extends Connection { Handler mHandler; private PowerManager.WakeLock mPartialWakeLock; // The cached delay to be used between DTMF tones fetched from carrier config. private int mDtmfToneDelay = 0; Loading @@ -83,11 +86,13 @@ public class GsmCdmaConnection extends Connection { static final int EVENT_DTMF_DONE = 1; static final int EVENT_PAUSE_DONE = 2; static final int EVENT_NEXT_POST_DIAL = 3; static final int EVENT_WAKE_LOCK_TIMEOUT = 4; static final int EVENT_DTMF_DELAY_DONE = 5; //***** Constants static final int PAUSE_DELAY_MILLIS_GSM = 3 * 1000; static final int PAUSE_DELAY_MILLIS_CDMA = 2 * 1000; static final int WAKE_LOCK_TIMEOUT_MILLIS = 60 * 1000; //***** Inner Classes Loading @@ -104,6 +109,9 @@ public class GsmCdmaConnection extends Connection { case EVENT_PAUSE_DONE: processNextPostDialChar(); break; case EVENT_WAKE_LOCK_TIMEOUT: releaseWakeLock(); break; case EVENT_DTMF_DONE: // We may need to add a delay specified by carrier between DTMF tones that are // sent out. Loading @@ -119,6 +127,8 @@ public class GsmCdmaConnection extends Connection { /** This is probably an MT call that we first saw in a CLCC response or a hand over. */ public GsmCdmaConnection (GsmCdmaPhone phone, DriverCall dc, GsmCdmaCallTracker ct, int index) { super(phone.getPhoneType()); createWakeLock(phone.getContext()); acquireWakeLock(); mOwner = ct; mHandler = new MyHandler(mOwner.getLooper()); Loading Loading @@ -149,6 +159,8 @@ public class GsmCdmaConnection extends Connection { public GsmCdmaConnection (GsmCdmaPhone phone, String dialString, GsmCdmaCallTracker ct, GsmCdmaCall parent, boolean isEmergencyCall) { super(phone.getPhoneType()); createWakeLock(phone.getContext()); acquireWakeLock(); mOwner = ct; mHandler = new MyHandler(mOwner.getLooper()); Loading Loading @@ -203,6 +215,8 @@ public class GsmCdmaConnection extends Connection { public GsmCdmaConnection(Context context, CdmaCallWaitingNotification cw, GsmCdmaCallTracker ct, GsmCdmaCall parent) { super(parent.getPhone().getPhoneType()); createWakeLock(context); acquireWakeLock(); mOwner = ct; mHandler = new MyHandler(mOwner.getLooper()); Loading @@ -226,6 +240,7 @@ public class GsmCdmaConnection extends Connection { if (mParent != null) { mParent.detach(this); } releaseAllWakeLocks(); } static boolean equalsHandlesNulls(Object a, Object b) { Loading Loading @@ -618,6 +633,7 @@ public class GsmCdmaConnection extends Connection { mOrigConnection = null; } clearPostDialListeners(); releaseWakeLock(); return changed; } Loading @@ -633,6 +649,7 @@ public class GsmCdmaConnection extends Connection { mParent.detach(this); } } releaseWakeLock(); } // Returns true if state has changed, false if nothing changed Loading Loading @@ -774,7 +791,21 @@ public class GsmCdmaConnection extends Connection { if (!mIsIncoming) { // outgoing calls only processNextPostDialChar(); } else { // Only release wake lock for incoming calls, for outgoing calls the wake lock // will be released after any pause-dial is completed releaseWakeLock(); } } /** * We have completed the migration of another connection to this GsmCdmaConnection (for example, * in the case of SRVCC) and not still DIALING/ALERTING/INCOMING/WAITING. */ void onConnectedConnectionMigrated() { // We can release the wakelock in this case, the migrated call is not still // DIALING/ALERTING/INCOMING/WAITING. releaseWakeLock(); } private void Loading Loading @@ -861,7 +892,17 @@ public class GsmCdmaConnection extends Connection { @Override protected void finalize() { /** * It is understood that This finalizer is not guaranteed * to be called and the release lock call is here just in * case there is some path that doesn't call onDisconnect * and or onConnectedInOrOut. */ if (mPartialWakeLock != null && mPartialWakeLock.isHeld()) { Rlog.e(LOG_TAG, "UNEXPECTED; mPartialWakeLock is held when finalizing."); } clearPostDialListeners(); releaseWakeLock(); } private void Loading @@ -870,6 +911,7 @@ public class GsmCdmaConnection extends Connection { Registrant postDialHandler; if (mPostDialState == PostDialState.CANCELLED) { releaseWakeLock(); return; } Loading @@ -877,6 +919,9 @@ public class GsmCdmaConnection extends Connection { mPostDialString.length() <= mNextPostDialChar) { setPostDialState(PostDialState.COMPLETE); // We were holding a wake lock until pause-dial was complete, so give it up now releaseWakeLock(); // notifyMessage.arg1 is 0 on complete c = 0; } else { Loading Loading @@ -970,18 +1015,60 @@ public class GsmCdmaConnection extends Connection { * @param s new PostDialState */ private void setPostDialState(PostDialState s) { if (s == PostDialState.STARTED || s == PostDialState.PAUSE) { synchronized (mPartialWakeLock) { if (mPartialWakeLock.isHeld()) { mHandler.removeMessages(EVENT_WAKE_LOCK_TIMEOUT); } else { acquireWakeLock(); } Message msg = mHandler.obtainMessage(EVENT_WAKE_LOCK_TIMEOUT); mHandler.sendMessageDelayed(msg, WAKE_LOCK_TIMEOUT_MILLIS); } } else { mHandler.removeMessages(EVENT_WAKE_LOCK_TIMEOUT); releaseWakeLock(); } mPostDialState = s; notifyPostDialListeners(); } @UnsupportedAppUsage private void createWakeLock(Context context) { // no-op PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); mPartialWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, LOG_TAG); } @UnsupportedAppUsage private void acquireWakeLock() { // no-op if (mPartialWakeLock != null) { synchronized (mPartialWakeLock) { log("acquireWakeLock"); mPartialWakeLock.acquire(); } } } private void releaseWakeLock() { if (mPartialWakeLock != null) { synchronized (mPartialWakeLock) { if (mPartialWakeLock.isHeld()) { log("releaseWakeLock"); mPartialWakeLock.release(); } } } } private void releaseAllWakeLocks() { if (mPartialWakeLock != null) { synchronized (mPartialWakeLock) { while (mPartialWakeLock.isHeld()) { mPartialWakeLock.release(); } } } } @UnsupportedAppUsage Loading Loading
src/java/com/android/internal/telephony/GsmCdmaConnection.java +89 −2 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.PersistableBundle; import android.os.PowerManager; import android.os.Registrant; import android.os.SystemClock; import android.telephony.CarrierConfigManager; Loading Loading @@ -74,6 +75,8 @@ public class GsmCdmaConnection extends Connection { Handler mHandler; private PowerManager.WakeLock mPartialWakeLock; // The cached delay to be used between DTMF tones fetched from carrier config. private int mDtmfToneDelay = 0; Loading @@ -83,11 +86,13 @@ public class GsmCdmaConnection extends Connection { static final int EVENT_DTMF_DONE = 1; static final int EVENT_PAUSE_DONE = 2; static final int EVENT_NEXT_POST_DIAL = 3; static final int EVENT_WAKE_LOCK_TIMEOUT = 4; static final int EVENT_DTMF_DELAY_DONE = 5; //***** Constants static final int PAUSE_DELAY_MILLIS_GSM = 3 * 1000; static final int PAUSE_DELAY_MILLIS_CDMA = 2 * 1000; static final int WAKE_LOCK_TIMEOUT_MILLIS = 60 * 1000; //***** Inner Classes Loading @@ -104,6 +109,9 @@ public class GsmCdmaConnection extends Connection { case EVENT_PAUSE_DONE: processNextPostDialChar(); break; case EVENT_WAKE_LOCK_TIMEOUT: releaseWakeLock(); break; case EVENT_DTMF_DONE: // We may need to add a delay specified by carrier between DTMF tones that are // sent out. Loading @@ -119,6 +127,8 @@ public class GsmCdmaConnection extends Connection { /** This is probably an MT call that we first saw in a CLCC response or a hand over. */ public GsmCdmaConnection (GsmCdmaPhone phone, DriverCall dc, GsmCdmaCallTracker ct, int index) { super(phone.getPhoneType()); createWakeLock(phone.getContext()); acquireWakeLock(); mOwner = ct; mHandler = new MyHandler(mOwner.getLooper()); Loading Loading @@ -149,6 +159,8 @@ public class GsmCdmaConnection extends Connection { public GsmCdmaConnection (GsmCdmaPhone phone, String dialString, GsmCdmaCallTracker ct, GsmCdmaCall parent, boolean isEmergencyCall) { super(phone.getPhoneType()); createWakeLock(phone.getContext()); acquireWakeLock(); mOwner = ct; mHandler = new MyHandler(mOwner.getLooper()); Loading Loading @@ -203,6 +215,8 @@ public class GsmCdmaConnection extends Connection { public GsmCdmaConnection(Context context, CdmaCallWaitingNotification cw, GsmCdmaCallTracker ct, GsmCdmaCall parent) { super(parent.getPhone().getPhoneType()); createWakeLock(context); acquireWakeLock(); mOwner = ct; mHandler = new MyHandler(mOwner.getLooper()); Loading @@ -226,6 +240,7 @@ public class GsmCdmaConnection extends Connection { if (mParent != null) { mParent.detach(this); } releaseAllWakeLocks(); } static boolean equalsHandlesNulls(Object a, Object b) { Loading Loading @@ -618,6 +633,7 @@ public class GsmCdmaConnection extends Connection { mOrigConnection = null; } clearPostDialListeners(); releaseWakeLock(); return changed; } Loading @@ -633,6 +649,7 @@ public class GsmCdmaConnection extends Connection { mParent.detach(this); } } releaseWakeLock(); } // Returns true if state has changed, false if nothing changed Loading Loading @@ -774,7 +791,21 @@ public class GsmCdmaConnection extends Connection { if (!mIsIncoming) { // outgoing calls only processNextPostDialChar(); } else { // Only release wake lock for incoming calls, for outgoing calls the wake lock // will be released after any pause-dial is completed releaseWakeLock(); } } /** * We have completed the migration of another connection to this GsmCdmaConnection (for example, * in the case of SRVCC) and not still DIALING/ALERTING/INCOMING/WAITING. */ void onConnectedConnectionMigrated() { // We can release the wakelock in this case, the migrated call is not still // DIALING/ALERTING/INCOMING/WAITING. releaseWakeLock(); } private void Loading Loading @@ -861,7 +892,17 @@ public class GsmCdmaConnection extends Connection { @Override protected void finalize() { /** * It is understood that This finalizer is not guaranteed * to be called and the release lock call is here just in * case there is some path that doesn't call onDisconnect * and or onConnectedInOrOut. */ if (mPartialWakeLock != null && mPartialWakeLock.isHeld()) { Rlog.e(LOG_TAG, "UNEXPECTED; mPartialWakeLock is held when finalizing."); } clearPostDialListeners(); releaseWakeLock(); } private void Loading @@ -870,6 +911,7 @@ public class GsmCdmaConnection extends Connection { Registrant postDialHandler; if (mPostDialState == PostDialState.CANCELLED) { releaseWakeLock(); return; } Loading @@ -877,6 +919,9 @@ public class GsmCdmaConnection extends Connection { mPostDialString.length() <= mNextPostDialChar) { setPostDialState(PostDialState.COMPLETE); // We were holding a wake lock until pause-dial was complete, so give it up now releaseWakeLock(); // notifyMessage.arg1 is 0 on complete c = 0; } else { Loading Loading @@ -970,18 +1015,60 @@ public class GsmCdmaConnection extends Connection { * @param s new PostDialState */ private void setPostDialState(PostDialState s) { if (s == PostDialState.STARTED || s == PostDialState.PAUSE) { synchronized (mPartialWakeLock) { if (mPartialWakeLock.isHeld()) { mHandler.removeMessages(EVENT_WAKE_LOCK_TIMEOUT); } else { acquireWakeLock(); } Message msg = mHandler.obtainMessage(EVENT_WAKE_LOCK_TIMEOUT); mHandler.sendMessageDelayed(msg, WAKE_LOCK_TIMEOUT_MILLIS); } } else { mHandler.removeMessages(EVENT_WAKE_LOCK_TIMEOUT); releaseWakeLock(); } mPostDialState = s; notifyPostDialListeners(); } @UnsupportedAppUsage private void createWakeLock(Context context) { // no-op PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); mPartialWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, LOG_TAG); } @UnsupportedAppUsage private void acquireWakeLock() { // no-op if (mPartialWakeLock != null) { synchronized (mPartialWakeLock) { log("acquireWakeLock"); mPartialWakeLock.acquire(); } } } private void releaseWakeLock() { if (mPartialWakeLock != null) { synchronized (mPartialWakeLock) { if (mPartialWakeLock.isHeld()) { log("releaseWakeLock"); mPartialWakeLock.release(); } } } } private void releaseAllWakeLocks() { if (mPartialWakeLock != null) { synchronized (mPartialWakeLock) { while (mPartialWakeLock.isHeld()) { mPartialWakeLock.release(); } } } } @UnsupportedAppUsage Loading