diff options
11 files changed, 134 insertions, 46 deletions
diff --git a/src/java/com/android/internal/telephony/CellBroadcastHandler.java b/src/java/com/android/internal/telephony/CellBroadcastHandler.java index 678f3e06a8..f7e0e3ae65 100644 --- a/src/java/com/android/internal/telephony/CellBroadcastHandler.java +++ b/src/java/com/android/internal/telephony/CellBroadcastHandler.java @@ -30,15 +30,13 @@ import android.telephony.SmsCbMessage; * completes and our result receiver is called. */ public class CellBroadcastHandler extends WakeLockStateMachine { - private final Context mContext; private CellBroadcastHandler(Context context) { - this("CellBroadcastHandler", context); + this("CellBroadcastHandler", context, null); } - protected CellBroadcastHandler(String debugTag, Context context) { - super(debugTag, context); - mContext = context; + protected CellBroadcastHandler(String debugTag, Context context, PhoneBase phone) { + super(debugTag, context, phone); } /** diff --git a/src/java/com/android/internal/telephony/ImsSMSDispatcher.java b/src/java/com/android/internal/telephony/ImsSMSDispatcher.java index 28919a08b1..d49b974647 100644 --- a/src/java/com/android/internal/telephony/ImsSMSDispatcher.java +++ b/src/java/com/android/internal/telephony/ImsSMSDispatcher.java @@ -79,6 +79,8 @@ public final class ImsSMSDispatcher extends SMSDispatcher { super.updatePhoneObject(phone); mCdmaDispatcher.updatePhoneObject(phone); mGsmDispatcher.updatePhoneObject(phone); + mGsmInboundSmsHandler.updatePhoneObject(phone); + mCdmaInboundSmsHandler.updatePhoneObject(phone); } public void dispose() { diff --git a/src/java/com/android/internal/telephony/InboundSmsHandler.java b/src/java/com/android/internal/telephony/InboundSmsHandler.java index 4288fcc3c8..95a650f3aa 100644 --- a/src/java/com/android/internal/telephony/InboundSmsHandler.java +++ b/src/java/com/android/internal/telephony/InboundSmsHandler.java @@ -114,6 +114,9 @@ public abstract class InboundSmsHandler extends StateMachine { /** Sent by {@link SmsBroadcastUndelivered} after cleaning the raw table. */ static final int EVENT_START_ACCEPTING_SMS = 6; + /** Update phone object */ + static final int EVENT_UPDATE_PHONE_OBJECT = 7; + /** Wakelock release delay when returning to idle state. */ private static final int WAKELOCK_TIMEOUT = 3000; @@ -145,21 +148,29 @@ public abstract class InboundSmsHandler extends StateMachine { final WaitingState mWaitingState = new WaitingState(); /** Helper class to check whether storage is available for incoming messages. */ - protected final SmsStorageMonitor mStorageMonitor; + protected SmsStorageMonitor mStorageMonitor; private final boolean mSmsReceiveDisabled; + protected PhoneBase mPhone; + + protected CellBroadcastHandler mCellBroadcastHandler; + + /** * Create a new SMS broadcast helper. * @param name the class name for logging * @param context the context of the phone app * @param storageMonitor the SmsStorageMonitor to check for storage availability */ - protected InboundSmsHandler(String name, Context context, SmsStorageMonitor storageMonitor) { + protected InboundSmsHandler(String name, Context context, SmsStorageMonitor storageMonitor, + PhoneBase phone, CellBroadcastHandler cellBroadcastHandler) { super(name); mContext = context; mStorageMonitor = storageMonitor; + mPhone = phone; + mCellBroadcastHandler = cellBroadcastHandler; mResolver = context.getContentResolver(); mWapPush = new WapPushOverSms(context); @@ -190,6 +201,13 @@ public abstract class InboundSmsHandler extends StateMachine { } /** + * Update the phone object when it changes. + */ + public void updatePhoneObject(PhoneBase phone) { + sendMessage(EVENT_UPDATE_PHONE_OBJECT, phone); + } + + /** * Dispose of the WAP push object and release the wakelock. */ @Override @@ -208,13 +226,22 @@ public abstract class InboundSmsHandler extends StateMachine { class DefaultState extends State { @Override public boolean processMessage(Message msg) { - String errorText = "processMessage: unhandled message type " + msg.what; - if (Build.IS_DEBUGGABLE) { - throw new RuntimeException(errorText); - } else { - loge(errorText); - return HANDLED; - } + switch (msg.what) { + case EVENT_UPDATE_PHONE_OBJECT: { + onUpdatePhoneObject((PhoneBase) msg.obj); + break; + } + default: { + String errorText = "processMessage: unhandled message type " + msg.what; + if (Build.IS_DEBUGGABLE) { + throw new RuntimeException(errorText); + } else { + loge(errorText); + } + break; + } + } + return HANDLED; } } @@ -455,6 +482,19 @@ public abstract class InboundSmsHandler extends StateMachine { int result, Message response); /** + * Called when the phone changes the default method updates mPhone + * mStorageMonitor and mCellBroadcastHandler.updatePhoneObject. + * Override if different or other behavior is desired. + * + * @param phone + */ + protected void onUpdatePhoneObject(PhoneBase phone) { + mPhone = phone; + mStorageMonitor = mPhone.mSmsStorageMonitor; + log("onUpdatePhoneObject: phone=" + mPhone.getClass().getSimpleName()); + } + + /** * Notify interested apps if the framework has rejected an incoming SMS, * and send an acknowledge message to the network. * @param success indicates that last message was successfully received. diff --git a/src/java/com/android/internal/telephony/WakeLockStateMachine.java b/src/java/com/android/internal/telephony/WakeLockStateMachine.java index ef1b68e66f..404b0cc4b0 100644 --- a/src/java/com/android/internal/telephony/WakeLockStateMachine.java +++ b/src/java/com/android/internal/telephony/WakeLockStateMachine.java @@ -48,6 +48,12 @@ public abstract class WakeLockStateMachine extends StateMachine { /** Release wakelock after a short timeout when returning to idle state. */ static final int EVENT_RELEASE_WAKE_LOCK = 3; + static final int EVENT_UPDATE_PHONE_OBJECT = 4; + + protected PhoneBase mPhone; + + protected Context mContext; + /** Wakelock release delay when returning to idle state. */ private static final int WAKE_LOCK_TIMEOUT = 3000; @@ -55,9 +61,12 @@ public abstract class WakeLockStateMachine extends StateMachine { private final IdleState mIdleState = new IdleState(); private final WaitingState mWaitingState = new WaitingState(); - protected WakeLockStateMachine(String debugTag, Context context) { + protected WakeLockStateMachine(String debugTag, Context context, PhoneBase phone) { super(debugTag); + mContext = context; + mPhone = phone; + PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, debugTag); mWakeLock.acquire(); // wake lock released after we enter idle state @@ -68,6 +77,10 @@ public abstract class WakeLockStateMachine extends StateMachine { setInitialState(mIdleState); } + public void updatePhoneObject(PhoneBase phone) { + sendMessage(EVENT_UPDATE_PHONE_OBJECT, phone); + } + /** * Tell the state machine to quit after processing all messages. */ @@ -98,13 +111,23 @@ public abstract class WakeLockStateMachine extends StateMachine { class DefaultState extends State { @Override public boolean processMessage(Message msg) { - String errorText = "processMessage: unhandled message type " + msg.what; - if (Build.IS_DEBUGGABLE) { - throw new RuntimeException(errorText); - } else { - loge(errorText); - return HANDLED; - } + switch (msg.what) { + case EVENT_UPDATE_PHONE_OBJECT: { + mPhone = (PhoneBase) msg.obj; + log("updatePhoneObject: phone=" + mPhone.getClass().getSimpleName()); + break; + } + default: { + String errorText = "processMessage: unhandled message type " + msg.what; + if (Build.IS_DEBUGGABLE) { + throw new RuntimeException(errorText); + } else { + loge(errorText); + } + break; + } + } + return HANDLED; } } diff --git a/src/java/com/android/internal/telephony/cdma/CdmaInboundSmsHandler.java b/src/java/com/android/internal/telephony/cdma/CdmaInboundSmsHandler.java index 99e790fbbf..9352639a36 100644 --- a/src/java/com/android/internal/telephony/cdma/CdmaInboundSmsHandler.java +++ b/src/java/com/android/internal/telephony/cdma/CdmaInboundSmsHandler.java @@ -45,9 +45,7 @@ import java.util.Arrays; */ public class CdmaInboundSmsHandler extends InboundSmsHandler { - private final PhoneBase mPhone; private final CdmaSMSDispatcher mSmsDispatcher; - private final CellBroadcastHandler mCellBroadcastHandler; private final CdmaServiceCategoryProgramHandler mServiceCategoryProgramHandler; private byte[] mLastDispatchedSmsFingerprint; @@ -61,12 +59,11 @@ public class CdmaInboundSmsHandler extends InboundSmsHandler { */ private CdmaInboundSmsHandler(Context context, SmsStorageMonitor storageMonitor, PhoneBase phone, CdmaSMSDispatcher smsDispatcher) { - super("CdmaInboundSmsHandler", context, storageMonitor); + super("CdmaInboundSmsHandler", context, storageMonitor, phone, + CellBroadcastHandler.makeCellBroadcastHandler(context)); mSmsDispatcher = smsDispatcher; - mCellBroadcastHandler = CellBroadcastHandler.makeCellBroadcastHandler(context); mServiceCategoryProgramHandler = CdmaServiceCategoryProgramHandler.makeScpHandler(context, phone.mCi); - mPhone = phone; phone.mCi.setOnNewCdmaSms(getHandler(), EVENT_NEW_SMS, null); } @@ -214,6 +211,19 @@ public class CdmaInboundSmsHandler extends InboundSmsHandler { } /** + * Called when the phone changes the default method updates mPhone + * mStorageMonitor and mCellBroadcastHandler.updatePhoneObject. + * Override if different or other behavior is desired. + * + * @param phone + */ + @Override + protected void onUpdatePhoneObject(PhoneBase phone) { + super.onUpdatePhoneObject(phone); + mCellBroadcastHandler.updatePhoneObject(phone); + } + + /** * Convert Android result code to CDMA SMS failure cause. * @param rc the Android SMS intent result value * @return 0 for success, or a CDMA SMS failure cause value diff --git a/src/java/com/android/internal/telephony/cdma/CdmaMmiCode.java b/src/java/com/android/internal/telephony/cdma/CdmaMmiCode.java index 07c137b503..3cb8bc7bff 100644 --- a/src/java/com/android/internal/telephony/cdma/CdmaMmiCode.java +++ b/src/java/com/android/internal/telephony/cdma/CdmaMmiCode.java @@ -315,7 +315,11 @@ public final class CdmaMmiCode extends Handler implements MmiCode { } // Get the No. of retries remaining to unlock PUK/PUK2 int attemptsRemaining = msg.arg1; - if (attemptsRemaining >= 0) { + if (attemptsRemaining <= 0) { + Rlog.d(LOG_TAG, "onSetComplete: PUK locked," + + " cancel as lock screen will handle this"); + mState = State.CANCELLED; + } else if (attemptsRemaining > 0) { Rlog.d(LOG_TAG, "onSetComplete: attemptsRemaining="+attemptsRemaining); sb.append(mContext.getResources().getQuantityString( com.android.internal.R.plurals.pinpuk_attempts, diff --git a/src/java/com/android/internal/telephony/cdma/CdmaServiceCategoryProgramHandler.java b/src/java/com/android/internal/telephony/cdma/CdmaServiceCategoryProgramHandler.java index f11c681a85..bb9f9d5e70 100644 --- a/src/java/com/android/internal/telephony/cdma/CdmaServiceCategoryProgramHandler.java +++ b/src/java/com/android/internal/telephony/cdma/CdmaServiceCategoryProgramHandler.java @@ -45,14 +45,13 @@ import java.util.ArrayList; */ public final class CdmaServiceCategoryProgramHandler extends WakeLockStateMachine { - private final Context mContext; final CommandsInterface mCi; /** * Create a new CDMA inbound SMS handler. */ CdmaServiceCategoryProgramHandler(Context context, CommandsInterface commandsInterface) { - super("CdmaServiceCategoryProgramHandler", context); + super("CdmaServiceCategoryProgramHandler", context, null); mContext = context; mCi = commandsInterface; } @@ -159,7 +158,7 @@ public final class CdmaServiceCategoryProgramHandler extends WakeLockStateMachin dos.writeInt(0); //servicePresent dos.writeInt(0); //serviceCategory CdmaSmsAddress destAddr = CdmaSmsAddress.parse( - PhoneNumberUtils.cdmaCheckAndProcessPlusCode(sender)); + PhoneNumberUtils.cdmaCheckAndProcessPlusCodeForSms(sender)); dos.write(destAddr.digitMode); dos.write(destAddr.numberMode); dos.write(destAddr.ton); // number_type diff --git a/src/java/com/android/internal/telephony/cdma/SmsMessage.java b/src/java/com/android/internal/telephony/cdma/SmsMessage.java index e36ac453dd..6f202c1b91 100644 --- a/src/java/com/android/internal/telephony/cdma/SmsMessage.java +++ b/src/java/com/android/internal/telephony/cdma/SmsMessage.java @@ -851,7 +851,7 @@ public class SmsMessage extends SmsMessageBase { * Convert + code to 011 and dial out for international SMS */ CdmaSmsAddress destAddr = CdmaSmsAddress.parse( - PhoneNumberUtils.cdmaCheckAndProcessPlusCode(destAddrStr)); + PhoneNumberUtils.cdmaCheckAndProcessPlusCodeForSms(destAddrStr)); if (destAddr == null) return null; BearerData bearerData = new BearerData(); diff --git a/src/java/com/android/internal/telephony/gsm/GsmCellBroadcastHandler.java b/src/java/com/android/internal/telephony/gsm/GsmCellBroadcastHandler.java index de984584b3..6671a58883 100644 --- a/src/java/com/android/internal/telephony/gsm/GsmCellBroadcastHandler.java +++ b/src/java/com/android/internal/telephony/gsm/GsmCellBroadcastHandler.java @@ -42,11 +42,8 @@ public class GsmCellBroadcastHandler extends CellBroadcastHandler { private final HashMap<SmsCbConcatInfo, byte[][]> mSmsCbPageMap = new HashMap<SmsCbConcatInfo, byte[][]>(4); - private final PhoneBase mPhone; - protected GsmCellBroadcastHandler(Context context, PhoneBase phone) { - super("GsmCellBroadcastHandler", context); - mPhone = phone; + super("GsmCellBroadcastHandler", context, phone); phone.mCi.setOnNewGsmBroadcastSms(getHandler(), EVENT_NEW_SMS_MESSAGE, null); } diff --git a/src/java/com/android/internal/telephony/gsm/GsmInboundSmsHandler.java b/src/java/com/android/internal/telephony/gsm/GsmInboundSmsHandler.java index 2c63bf0ee6..7e48cc2c90 100644 --- a/src/java/com/android/internal/telephony/gsm/GsmInboundSmsHandler.java +++ b/src/java/com/android/internal/telephony/gsm/GsmInboundSmsHandler.java @@ -38,20 +38,14 @@ public class GsmInboundSmsHandler extends InboundSmsHandler { /** Handler for SMS-PP data download messages to UICC. */ private final UsimDataDownloadHandler mDataDownloadHandler; - private final GsmCellBroadcastHandler mCellBroadcastDispatcher; - - private final PhoneBase mPhone; - /** * Create a new GSM inbound SMS handler. */ private GsmInboundSmsHandler(Context context, SmsStorageMonitor storageMonitor, PhoneBase phone) { - super("GsmInboundSmsHandler", context, storageMonitor); - mPhone = phone; + super("GsmInboundSmsHandler", context, storageMonitor, phone, + GsmCellBroadcastHandler.makeGsmCellBroadcastHandler(context, phone)); phone.mCi.setOnNewGsmSms(getHandler(), EVENT_NEW_SMS, null); - mCellBroadcastDispatcher = GsmCellBroadcastHandler.makeGsmCellBroadcastHandler(context, - phone); mDataDownloadHandler = new UsimDataDownloadHandler(phone.mCi); } @@ -61,7 +55,7 @@ public class GsmInboundSmsHandler extends InboundSmsHandler { @Override protected void onQuitting() { mPhone.mCi.unSetOnNewGsmSms(getHandler()); - mCellBroadcastDispatcher.dispose(); + mCellBroadcastHandler.dispose(); if (DBG) log("unregistered for 3GPP SMS"); super.onQuitting(); // release wakelock @@ -147,6 +141,22 @@ public class GsmInboundSmsHandler extends InboundSmsHandler { } /** + * Called when the phone changes the default method updates mPhone + * mStorageMonitor and mCellBroadcastHandler.updatePhoneObject. + * Override if different or other behavior is desired. + * + * @param phone + */ + @Override + protected void onUpdatePhoneObject(PhoneBase phone) { + super.onUpdatePhoneObject(phone); + log("onUpdatePhoneObject: dispose of old CellBroadcastHandler and make a new one"); + mCellBroadcastHandler.dispose(); + mCellBroadcastHandler = GsmCellBroadcastHandler + .makeGsmCellBroadcastHandler(mContext, phone); + } + + /** * Convert Android result code to 3GPP SMS failure cause. * @param rc the Android SMS intent result value * @return 0 for success, or a 3GPP SMS failure cause value diff --git a/src/java/com/android/internal/telephony/gsm/GsmMmiCode.java b/src/java/com/android/internal/telephony/gsm/GsmMmiCode.java index 1dd958fed1..c2bafbe442 100644 --- a/src/java/com/android/internal/telephony/gsm/GsmMmiCode.java +++ b/src/java/com/android/internal/telephony/gsm/GsmMmiCode.java @@ -1030,7 +1030,12 @@ public final class GsmMmiCode extends Handler implements MmiCode { } // Get the No. of retries remaining to unlock PUK/PUK2 int attemptsRemaining = msg.arg1; - if (attemptsRemaining >= 0) { + if (attemptsRemaining <= 0) { + Rlog.d(LOG_TAG, "onSetComplete: PUK locked," + + " cancel as lock screen will handle this"); + mState = State.CANCELLED; + } else if (attemptsRemaining > 0) { + Rlog.d(LOG_TAG, "onSetComplete: attemptsRemaining="+attemptsRemaining); sb.append(mContext.getResources().getQuantityString( com.android.internal.R.plurals.pinpuk_attempts, attemptsRemaining, attemptsRemaining)); |