Merge "Fixed deadlock in IccSmsInterfaceManager"
diff --git a/src/java/com/android/internal/telephony/IccSmsInterfaceManager.java b/src/java/com/android/internal/telephony/IccSmsInterfaceManager.java
index 23e5519..017cd95 100644
--- a/src/java/com/android/internal/telephony/IccSmsInterfaceManager.java
+++ b/src/java/com/android/internal/telephony/IccSmsInterfaceManager.java
@@ -36,6 +36,7 @@
import android.os.AsyncResult;
import android.os.Binder;
import android.os.Handler;
+import android.os.Looper;
import android.os.Message;
import android.os.UserManager;
import android.provider.Telephony;
@@ -199,13 +200,23 @@
if (mPhone.getPhoneId() == intent.getIntExtra(
CarrierConfigManager.EXTRA_SLOT_INDEX,
SubscriptionManager.INVALID_SIM_SLOT_INDEX)) {
- mCellBroadcastRangeManager.updateRanges();
+ new Thread(() -> {
+ log("Carrier config changed. Update ranges.");
+ mCellBroadcastRangeManager.updateRanges();
+ }).start();
}
}
}
}, new IntentFilter(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED));
}
+ private void enforceNotOnHandlerThread(String methodName) {
+ if (Looper.myLooper() == mHandler.getLooper()) {
+ throw new RuntimeException("This method " + methodName + " will deadlock if called from"
+ + " the handler's thread.");
+ }
+ }
+
protected void markMessagesAsRead(ArrayList<byte[]> messages) {
if (messages == null) {
return;
@@ -266,6 +277,7 @@
" status=" + status + " ==> " +
"("+ Arrays.toString(pdu) + ")");
enforceReceiveAndSend("Updating message on Icc");
+ enforceNotOnHandlerThread("updateMessageOnIccEf");
if (mAppOps.noteOp(AppOpsManager.OPSTR_WRITE_ICC_SMS, Binder.getCallingUid(),
callingPackage) != AppOpsManager.MODE_ALLOWED) {
return false;
@@ -325,6 +337,7 @@
"pdu=("+ Arrays.toString(pdu) +
"), smsc=(" + Arrays.toString(smsc) +")");
enforceReceiveAndSend("Copying message to Icc");
+ enforceNotOnHandlerThread("copyMessageToIccEf");
if (mAppOps.noteOp(AppOpsManager.OPSTR_WRITE_ICC_SMS, Binder.getCallingUid(),
callingPackage) != AppOpsManager.MODE_ALLOWED) {
return false;
@@ -363,6 +376,7 @@
mContext.enforceCallingOrSelfPermission(
Manifest.permission.RECEIVE_SMS,
"Reading messages from Icc");
+ enforceNotOnHandlerThread("getAllMessagesFromIccEf");
if (mAppOps.noteOp(AppOpsManager.OPSTR_READ_ICC_SMS, Binder.getCallingUid(),
callingPackage) != AppOpsManager.MODE_ALLOWED) {
return new ArrayList<SmsRawData>();
@@ -859,6 +873,7 @@
callingPackage, "getSmscAddressFromIccEf")) {
return null;
}
+ enforceNotOnHandlerThread("getSmscAddressFromIccEf");
synchronized (mLock) {
mSmsc = null;
Message response = mHandler.obtainMessage(EVENT_GET_SMSC_DONE);
@@ -1134,9 +1149,10 @@
@UnsupportedAppUsage
private boolean setCellBroadcastConfig(SmsBroadcastConfigInfo[] configs) {
- if (DBG)
+ if (DBG) {
log("Calling setGsmBroadcastConfig with " + configs.length + " configurations");
-
+ }
+ enforceNotOnHandlerThread("setCellBroadcastConfig");
synchronized (mLock) {
Message response = mHandler.obtainMessage(EVENT_SET_BROADCAST_CONFIG_DONE);
@@ -1154,9 +1170,11 @@
}
private boolean setCellBroadcastActivation(boolean activate) {
- if (DBG)
+ if (DBG) {
log("Calling setCellBroadcastActivation(" + activate + ')');
+ }
+ enforceNotOnHandlerThread("setCellBroadcastConfig");
synchronized (mLock) {
Message response = mHandler.obtainMessage(EVENT_SET_BROADCAST_ACTIVATION_DONE);
@@ -1175,9 +1193,11 @@
@UnsupportedAppUsage
private boolean setCdmaBroadcastConfig(CdmaSmsBroadcastConfigInfo[] configs) {
- if (DBG)
+ if (DBG) {
log("Calling setCdmaBroadcastConfig with " + configs.length + " configurations");
+ }
+ enforceNotOnHandlerThread("setCdmaBroadcastConfig");
synchronized (mLock) {
Message response = mHandler.obtainMessage(EVENT_SET_BROADCAST_CONFIG_DONE);
@@ -1195,9 +1215,11 @@
}
private boolean setCdmaBroadcastActivation(boolean activate) {
- if (DBG)
+ if (DBG) {
log("Calling setCdmaBroadcastActivation(" + activate + ")");
+ }
+ enforceNotOnHandlerThread("setCdmaBroadcastActivation");
synchronized (mLock) {
Message response = mHandler.obtainMessage(EVENT_SET_BROADCAST_ACTIVATION_DONE);