Telephony: Update CF number in EF_CFIS.
Wink Saville [Wed, 18 Sep 2013 21:03:33 +0000 (14:03 -0700)]
When call forwarding is enabled, only status is updated in EF_CFIS.
CF number is not updated. Added support to update CF number as well.

Bug: 10642929
Change-Id: Ia764b872b7837d71ffad206e37e9b261e4db7a83

src/java/com/android/internal/telephony/gsm/GSMPhone.java
src/java/com/android/internal/telephony/gsm/GsmMmiCode.java
src/java/com/android/internal/telephony/uicc/IccRecords.java
src/java/com/android/internal/telephony/uicc/SIMRecords.java

index 95dd084..555246c 100644 (file)
@@ -126,6 +126,19 @@ public class GSMPhone extends PhoneBase {
 
     GsmInboundSmsHandler mGsmInboundSmsHandler;
 
+    // Create Cfu (Call forward unconditional) so that dialling number &
+    // mOnComplete (Message object passed by client) can be packed &
+    // given as a single Cfu object as user data to RIL.
+    private static class Cfu {
+        final String mSetCfNumber;
+        final Message mOnComplete;
+
+        Cfu(String cfNumber, Message onComplete) {
+            mSetCfNumber = cfNumber;
+            mOnComplete = onComplete;
+        }
+    }
+
     // Constructors
 
     public
@@ -994,8 +1007,9 @@ public class GSMPhone extends PhoneBase {
 
             Message resp;
             if (commandInterfaceCFReason == CF_REASON_UNCONDITIONAL) {
+                Cfu cfu = new Cfu(dialingNumber, onComplete);
                 resp = obtainMessage(EVENT_SET_CALL_FORWARD_DONE,
-                        isCfEnable(commandInterfaceCFAction) ? 1 : 0, 0, onComplete);
+                        isCfEnable(commandInterfaceCFAction) ? 1 : 0, 0, cfu);
             } else {
                 resp = onComplete;
             }
@@ -1330,13 +1344,13 @@ public class GSMPhone extends PhoneBase {
             case EVENT_SET_CALL_FORWARD_DONE:
                 ar = (AsyncResult)msg.obj;
                 IccRecords r = mIccRecords.get();
+                Cfu cfu = (Cfu) ar.userObj;
                 if (ar.exception == null && r != null) {
-                    r.setVoiceCallForwardingFlag(1, msg.arg1 == 1);
+                    r.setVoiceCallForwardingFlag(1, msg.arg1 == 1, cfu.mSetCfNumber);
                 }
-                onComplete = (Message) ar.userObj;
-                if (onComplete != null) {
-                    AsyncResult.forMessage(onComplete, ar.result, ar.exception);
-                    onComplete.sendToTarget();
+                if (cfu.mOnComplete != null) {
+                    AsyncResult.forMessage(cfu.mOnComplete, ar.result, ar.exception);
+                    cfu.mOnComplete.sendToTarget();
                 }
                 break;
 
@@ -1523,11 +1537,12 @@ public class GSMPhone extends PhoneBase {
             if (infos == null || infos.length == 0) {
                 // Assume the default is not active
                 // Set unconditional CFF in SIM to false
-                r.setVoiceCallForwardingFlag(1, false);
+                r.setVoiceCallForwardingFlag(1, false, null);
             } else {
                 for (int i = 0, s = infos.length; i < s; i++) {
                     if ((infos[i].serviceClass & SERVICE_CLASS_VOICE) != 0) {
-                        r.setVoiceCallForwardingFlag(1, (infos[i].status == 1));
+                        r.setVoiceCallForwardingFlag(1, (infos[i].status == 1),
+                            infos[i].number);
                         // should only have the one
                         break;
                     }
index ac346cd..395cfc9 100644 (file)
@@ -914,7 +914,7 @@ public final class GsmMmiCode extends Handler implements MmiCode {
                 if ((ar.exception == null) && (msg.arg1 == 1)) {
                     boolean cffEnabled = (msg.arg2 == 1);
                     if (mIccRecords != null) {
-                        mIccRecords.setVoiceCallForwardingFlag(1, cffEnabled);
+                        mIccRecords.setVoiceCallForwardingFlag(1, cffEnabled, mDialingNumber);
                     }
                 }
 
@@ -1239,7 +1239,7 @@ public final class GsmMmiCode extends Handler implements MmiCode {
                         == CommandsInterface.SERVICE_CLASS_VOICE) {
             boolean cffEnabled = (info.status == 1);
             if (mIccRecords != null) {
-                mIccRecords.setVoiceCallForwardingFlag(1, cffEnabled);
+                mIccRecords.setVoiceCallForwardingFlag(1, cffEnabled, info.number);
             }
         }
 
@@ -1266,7 +1266,7 @@ public final class GsmMmiCode extends Handler implements MmiCode {
 
                 // Set unconditional CFF in SIM to false
                 if (mIccRecords != null) {
-                    mIccRecords.setVoiceCallForwardingFlag(1, false);
+                    mIccRecords.setVoiceCallForwardingFlag(1, false, null);
                 }
             } else {
 
index 140277a..ec920f9 100644 (file)
@@ -464,8 +464,9 @@ public abstract class IccRecords extends Handler implements IccConstants {
      *
      * @param line to enable/disable
      * @param enable
+     * @param number to which CFU is enabled
      */
-    public void setVoiceCallForwardingFlag(int line, boolean enable) {
+    public void setVoiceCallForwardingFlag(int line, boolean enable, String number) {
     }
 
     /**
index b285921..721758a 100644 (file)
@@ -23,6 +23,7 @@ import android.content.Context;
 import android.os.AsyncResult;
 import android.os.Message;
 import android.os.SystemProperties;
+import android.telephony.PhoneNumberUtils;
 import android.telephony.SmsMessage;
 import android.text.TextUtils;
 import android.telephony.Rlog;
@@ -122,6 +123,13 @@ public class SIMRecords extends IccRecords {
     private static final int CPHS_SST_MBN_MASK = 0x30;
     private static final int CPHS_SST_MBN_ENABLED = 0x30;
 
+    // EF_CFIS related constants
+    // Spec reference TS 51.011 section 10.3.46.
+    private static final int CFIS_BCD_NUMBER_LENGTH_OFFSET = 2;
+    private static final int CFIS_TON_NPI_OFFSET = 3;
+    private static final int CFIS_ADN_CAPABILITY_ID_OFFSET = 14;
+    private static final int CFIS_ADN_EXTENSION_ID_OFFSET = 15;
+
     // ***** Event Constants
     private static final int EVENT_GET_IMSI_DONE = 3;
     private static final int EVENT_GET_ICCID_DONE = 4;
@@ -454,7 +462,7 @@ public class SIMRecords extends IccRecords {
      * {@inheritDoc}
      */
     @Override
-    public void setVoiceCallForwardingFlag(int line, boolean enable) {
+    public void setVoiceCallForwardingFlag(int line, boolean enable, String dialNumber) {
 
         if (line != 1) return; // only line 1 is supported
 
@@ -474,8 +482,18 @@ public class SIMRecords extends IccRecords {
                 log("setVoiceCallForwardingFlag: enable=" + enable
                         + " mEfCfis=" + IccUtils.bytesToHexString(mEfCfis));
 
-                // TODO: Should really update other fields in EF_CFIS, eg,
-                // dialing number.  We don't read or use it right now.
+                // Update dialNumber if not empty and CFU is enabled.
+                // Spec reference for EF_CFIS contents, TS 51.011 section 10.3.46.
+                if (enable && !TextUtils.isEmpty(dialNumber)) {
+                    log("EF_CFIS: updating cf number, " + dialNumber);
+                    byte[] bcdNumber = PhoneNumberUtils.numberToCalledPartyBCD(dialNumber);
+
+                    System.arraycopy(bcdNumber, 0, mEfCfis, CFIS_TON_NPI_OFFSET, bcdNumber.length);
+
+                    mEfCfis[CFIS_BCD_NUMBER_LENGTH_OFFSET] = (byte) (bcdNumber.length);
+                    mEfCfis[CFIS_ADN_CAPABILITY_ID_OFFSET] = (byte) 0xFF;
+                    mEfCfis[CFIS_ADN_EXTENSION_ID_OFFSET] = (byte) 0xFF;
+                }
 
                 mFh.updateEFLinearFixed(
                         EF_CFIS, 1, mEfCfis, null,