private boolean handleCallHoldIncallSupplementaryService(String dialString)
      throws CallStateException {
    int len = dialString.length();

    if (len > 2) {
      return false;
    }

    GsmCall call = (GsmCall) getForegroundCall();

    if (len > 1) {
      try {
        char ch = dialString.charAt(1);
        int callIndex = ch - '0';
        GsmConnection conn = mCT.getConnectionByIndex(call, callIndex);

        // gsm index starts at 1, up to 5 connections in a call,
        if (conn != null && callIndex >= 1 && callIndex <= GsmCallTracker.MAX_CONNECTIONS) {
          if (LOCAL_DEBUG) Log.d(LOG_TAG, "MmiCode 2: separate call " + callIndex);
          mCT.separate(conn);
        } else {
          if (LOCAL_DEBUG) Log.d(LOG_TAG, "separate: invalid call index " + callIndex);
          notifySuppServiceFailed(Phone.SuppService.SEPARATE);
        }
      } catch (CallStateException e) {
        if (LOCAL_DEBUG) Log.d(LOG_TAG, "separate failed", e);
        notifySuppServiceFailed(Phone.SuppService.SEPARATE);
      }
    } else {
      try {
        if (getRingingCall().getState() != GsmCall.State.IDLE) {
          if (LOCAL_DEBUG) Log.d(LOG_TAG, "MmiCode 2: accept ringing call");
          mCT.acceptCall();
        } else {
          if (LOCAL_DEBUG) Log.d(LOG_TAG, "MmiCode 2: switchWaitingOrHoldingAndActive");
          mCT.switchWaitingOrHoldingAndActive();
        }
      } catch (CallStateException e) {
        if (LOCAL_DEBUG) Log.d(LOG_TAG, "switch failed", e);
        notifySuppServiceFailed(Phone.SuppService.SWITCH);
      }
    }

    return true;
  }