Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit db939b01 authored by Pawit Pornkitprasan's avatar Pawit Pornkitprasan Committed by Gerrit Code Review
Browse files

Samsung STK: Add USSD support

Allow USSD-based STK applications to work

Change-Id: I483f37a44a6c3ed43eefcf979e17b84877d03f93
parent e7111f67
Loading
Loading
Loading
Loading
+15 −0
Original line number Original line Diff line number Diff line
@@ -294,6 +294,11 @@ public class CatService extends Handler implements AppInterface {
                // Fall through
                // Fall through
            case SEND_SS:
            case SEND_SS:
            case SEND_USSD:
            case SEND_USSD:
                if (mContext.getResources().
                        getBoolean(com.android.internal.R.bool.config_samsung_stk)) {
                    handleProactiveCommandSendUSSD((SendUSSDParams) cmdParams);
                }

                if ((((DisplayTextParams)cmdParams).textMsg.text != null)
                if ((((DisplayTextParams)cmdParams).textMsg.text != null)
                        && (((DisplayTextParams)cmdParams).textMsg.text.equals(STK_DEFAULT))) {
                        && (((DisplayTextParams)cmdParams).textMsg.text.equals(STK_DEFAULT))) {
                    message = mContext.getText(com.android.internal.R.string.sending);
                    message = mContext.getText(com.android.internal.R.string.sending);
@@ -879,6 +884,16 @@ public class CatService extends Handler implements AppInterface {
        startTimeOut(WAITING_SMS_RESULT, WAITING_SMS_RESULT_TIME);
        startTimeOut(WAITING_SMS_RESULT, WAITING_SMS_RESULT_TIME);
    }
    }


    /**
     * Samsung STK SEND_USSD
     * @param cmdPar
     */
    private void handleProactiveCommandSendUSSD(SendUSSDParams cmdPar) {
        CatLog.d(this, "The USSD is: " + cmdPar.ussdString);
        mCmdIf.sendUSSD(cmdPar.ussdString, null);
        // Sent USSD, let framework handle the rest
    }

    private void cancelTimeOut() {
    private void cancelTimeOut() {
        removeMessages(MSG_ID_TIMEOUT);
        removeMessages(MSG_ID_TIMEOUT);
        mTimeoutDest = 0;
        mTimeoutDest = 0;
+9 −0
Original line number Original line Diff line number Diff line
@@ -209,3 +209,12 @@ class SendSMSParams extends DisplayTextParams {
        pdu = smsPdu;
        pdu = smsPdu;
    }
    }
}
}

class SendUSSDParams extends DisplayTextParams {
    String ussdString;

    SendUSSDParams(CommandDetails cmdDet, TextMessage textmessage, String ussdstring) {
        super(cmdDet, textmessage);
        ussdString = ussdstring;
    }
}
+12 −0
Original line number Original line Diff line number Diff line
@@ -670,6 +670,18 @@ class CommandParamsFactory extends Handler {
            }
            }
            mCmdParams = new SendSMSParams(cmdDet, textMsg, smscAddress, pdu);
            mCmdParams = new SendSMSParams(cmdDet, textMsg, smscAddress, pdu);
        }
        }
        else if (cmdType == AppInterface.CommandType.SEND_USSD && isSamsungStk) {
            String ussdString = null;
            ctlv = searchForTag(ComprehensionTlvTag.USSD_STRING, ctlvs);
            if (ctlv != null) {
                ussdString = ValueParser.retrieveUSSDString(ctlv);
                CatLog.d(this, "The ussd string is " + ussdString);
            }
            else {
                CatLog.d(this, "The ussd string is null");
            }
            mCmdParams = new SendUSSDParams(cmdDet, textMsg, ussdString);
        }
        else {
        else {
            mCmdParams = new DisplayTextParams(cmdDet, textMsg);
            mCmdParams = new DisplayTextParams(cmdDet, textMsg);
        }
        }
+30 −0
Original line number Original line Diff line number Diff line
@@ -407,4 +407,34 @@ abstract class ValueParser {


        return result;
        return result;
    }
    }

    /**
     * Samsung STK: Read USSD String
     *
     * @param ctlv A USSD String COMPREHENSION-TLV object
     * @return A String object decoded from the USSD String object
     * @throws ResultException
     */
    static String retrieveUSSDString(ComprehensionTlv ctlv) throws ResultException {
        byte[] rawValue = ctlv.getRawValue();
        int valueIndex = ctlv.getValueIndex();
        int length = ctlv.getLength();

        // If length is 0 (shouldn't be), return null
        if (length == 0) {
            return null;
        }

        // Should be 0x0f
        if (rawValue[valueIndex] != 0x0f) {
            throw new ResultException(ResultCode.CMD_DATA_NOT_UNDERSTOOD);
        }

        try {
            return GsmAlphabet.gsm7BitPackedToString(rawValue,
                    valueIndex + 1, ((length - 1) * 8) / 7);
        } catch (IndexOutOfBoundsException e) {
            throw new ResultException(ResultCode.CMD_DATA_NOT_UNDERSTOOD);
        }
    }
}
}