package vendor.samsung.hardware.radio@2.0;

import android.hardware.radio@1.0::RadioResponseInfo;

interface ISehRadioResponse {
    /*
     * getIccCardStatusResponse(RadioResponseInfo info, SehCardStatus cardStatus);
     */
    oneway getIccCardStatusResponse();

    /*
     * (RadioResponseInfo info, int32_t remainingRetries);
     */
    oneway supplyNetworkDepersonalizationResponse(RadioResponseInfo info);

    oneway dialResponse(RadioResponseInfo info);

    /*
     * (RadioResponseInfo info, vec<SehCall> calls);
     */
    oneway getCurrentCallsResponse();

    /*
     * (RadioResponseInfo info, vec<SehOperatorInfo> networkInfos)
     */
    oneway getImsRegistrationStateResponse();

    oneway setImsCallListResponse(RadioResponseInfo info);

    /*
     * RadioResponseInfo, vec<SehPreferredNetworkInfo> infos
     */
    oneway getPreferredNetworkListResponse();

    oneway setPreferredNetworkListResponse(RadioResponseInfo info);

    oneway sendEncodedUssdResponse(RadioResponseInfo info);

    oneway getDisable2gResponse(RadioResponseInfo info, int32_t isDisable);

    oneway setDisable2gResponse(RadioResponseInfo info);

    oneway getCnapResponse(RadioResponseInfo info, int32_t m);

    /*
     * RadioResponseInfo, SehPhonebookInfo
     */
    oneway getPhonebookStorageInfoResponse();

    oneway getUsimPhonebookCapabilityResponse(RadioResponseInfo info,
        vec<int32_t> phonebookCapability);

    oneway setSimOnOffResponse(RadioResponseInfo info);

    oneway setSimInitEventResponse(RadioResponseInfo info);

    /*
     * RadioResponseInfo info, SehSimLockInfo simLockInfo
     */
    oneway getSimLockInfoResponse();

    oneway supplyIccPersonalizationResponse(RadioResponseInfo info);

    oneway changeIccPersonalizationResponse(RadioResponseInfo info);

    /*
     * RadioResponseInfo, SehSimPhonebookResponse
     */
    oneway getPhonebookEntryResponse();

    oneway accessPhonebookEntryResponse(RadioResponseInfo info, int32_t SimPhonmebookAccessResp);

    /*
     * RadioResponseInfo, SehCbConfigArgs
     */
    oneway getCellBroadcastConfigResponse();

    oneway emergencySearchResponse(RadioResponseInfo info, int32_t respEmergencySearch);

    oneway emergencyControlResponse(RadioResponseInfo info);

    oneway getAtrResponse(RadioResponseInfo info, string atr);

    /*
     * RadioResponseInfo, SehSendSmsResult
     */
    oneway sendCdmaSmsExpectMoreResponse();

    /*
     * RadioResponseInfo, SehSendSmsResult
     */
    oneway sendSmsResponse();

    /*
     * RadioResponseInfo, SehSendSmsResult
     */
    oneway sendSMSExpectMoreResponse();

    /*
     * RadioResponseInfo, SehSendSmsResult
     */
    oneway sendCdmaSmsResponse();

    /*
     * RadioResponseInfo, SehSendSmsResult
     */
    oneway sendImsSmsResponse();

    /*
     * RadioResponseInfo, SehStoredMsgCount
     */
    oneway getStoredMsgCountFromSimResponse();

    /*
     * RadioResponseInfo, SehSimMsgArgs
     */
    oneway readSmsFromSimResponse();

    oneway writeSmsToSimResponse(RadioResponseInfo info, int32_t index);

    oneway setDataAllowedResponse(RadioResponseInfo info);

    /*
     * RadioResponseInfo, vec<SehCsgInfo>
     */
    oneway getCsgListResponse();

    oneway selectCsgManualResponse(RadioResponseInfo info);

    oneway setMobileDataSettingResponse(RadioResponseInfo info);

    oneway sendRequestRawResponse(RadioResponseInfo info, vec<int8_t> data);

    oneway sendRequestStringsResponse(RadioResponseInfo info, vec<string> data);
};
