public DataActivityState getDataActivityState() {
    DataActivityState ret = DataActivityState.NONE;

    if (mSST.getCurrentGprsState() == ServiceState.STATE_IN_SERVICE) {
      switch (mDataConnection.getActivity()) {
        case DATAIN:
          ret = DataActivityState.DATAIN;
          break;

        case DATAOUT:
          ret = DataActivityState.DATAOUT;
          break;

        case DATAINANDOUT:
          ret = DataActivityState.DATAINANDOUT;
          break;
      }
    }

    return ret;
  }
  public DataState getDataConnectionState() {
    DataState ret = DataState.DISCONNECTED;

    if (mSST == null) {
      // Radio Technology Change is ongoning, dispose() and removeReferences() have
      // already been called

      ret = DataState.DISCONNECTED;
    } else if (mSST.getCurrentGprsState() != ServiceState.STATE_IN_SERVICE) {
      // If we're out of service, open TCP sockets may still work
      // but no data will flow
      ret = DataState.DISCONNECTED;
    } else {
        /* mSST.gprsState == ServiceState.STATE_IN_SERVICE */
      switch (mDataConnection.getState()) {
        case FAILED:
        case IDLE:
          ret = DataState.DISCONNECTED;
          break;

        case CONNECTED:
        case DISCONNECTING:
          if (mCT.state != Phone.State.IDLE && !mSST.isConcurrentVoiceAndData()) {
            ret = DataState.SUSPENDED;
          } else {
            ret = DataState.CONNECTED;
          }
          break;

        case INITING:
        case CONNECTING:
        case SCANNING:
          ret = DataState.CONNECTING;
          break;
      }
    }

    return ret;
  }