diff --git a/radio/aidl/aidl_api/android.hardware.radio.network/current/android/hardware/radio/network/IRadioNetwork.aidl b/radio/aidl/aidl_api/android.hardware.radio.network/current/android/hardware/radio/network/IRadioNetwork.aidl index 16433be238..c6187913dd 100644 --- a/radio/aidl/aidl_api/android.hardware.radio.network/current/android/hardware/radio/network/IRadioNetwork.aidl +++ b/radio/aidl/aidl_api/android.hardware.radio.network/current/android/hardware/radio/network/IRadioNetwork.aidl @@ -68,4 +68,6 @@ interface IRadioNetwork { oneway void startNetworkScan(in int serial, in android.hardware.radio.network.NetworkScanRequest request); oneway void stopNetworkScan(in int serial); oneway void supplyNetworkDepersonalization(in int serial, in String netPin); + oneway void setUsageSetting(in int serial, in android.hardware.radio.network.UsageSetting usageSetting); + oneway void getUsageSetting(in int serial); } diff --git a/radio/aidl/aidl_api/android.hardware.radio.network/current/android/hardware/radio/network/IRadioNetworkResponse.aidl b/radio/aidl/aidl_api/android.hardware.radio.network/current/android/hardware/radio/network/IRadioNetworkResponse.aidl index ff953964b7..8cf4c31149 100644 --- a/radio/aidl/aidl_api/android.hardware.radio.network/current/android/hardware/radio/network/IRadioNetworkResponse.aidl +++ b/radio/aidl/aidl_api/android.hardware.radio.network/current/android/hardware/radio/network/IRadioNetworkResponse.aidl @@ -67,4 +67,6 @@ interface IRadioNetworkResponse { oneway void startNetworkScanResponse(in android.hardware.radio.RadioResponseInfo info); oneway void stopNetworkScanResponse(in android.hardware.radio.RadioResponseInfo info); oneway void supplyNetworkDepersonalizationResponse(in android.hardware.radio.RadioResponseInfo info, in int remainingRetries); + oneway void setUsageSettingResponse(in android.hardware.radio.RadioResponseInfo info); + oneway void getUsageSettingResponse(in android.hardware.radio.RadioResponseInfo info, in android.hardware.radio.network.UsageSetting usageSetting); } diff --git a/radio/aidl/aidl_api/android.hardware.radio.network/current/android/hardware/radio/network/UsageSetting.aidl b/radio/aidl/aidl_api/android.hardware.radio.network/current/android/hardware/radio/network/UsageSetting.aidl new file mode 100644 index 0000000000..7fdf8313d3 --- /dev/null +++ b/radio/aidl/aidl_api/android.hardware.radio.network/current/android/hardware/radio/network/UsageSetting.aidl @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m -update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.radio.network; +@Backing(type="int") @VintfStability +enum UsageSetting { + VOICE_CENTRIC = 1, + DATA_CENTRIC = 2, +} diff --git a/radio/aidl/android/hardware/radio/network/IRadioNetwork.aidl b/radio/aidl/android/hardware/radio/network/IRadioNetwork.aidl index 1081a75ae9..aaf432aaaa 100644 --- a/radio/aidl/android/hardware/radio/network/IRadioNetwork.aidl +++ b/radio/aidl/android/hardware/radio/network/IRadioNetwork.aidl @@ -27,6 +27,7 @@ import android.hardware.radio.network.NrDualConnectivityState; import android.hardware.radio.network.RadioAccessSpecifier; import android.hardware.radio.network.RadioBandMode; import android.hardware.radio.network.SignalThresholdInfo; +import android.hardware.radio.network.UsageSetting; /** * This interface is used by telephony and telecom to talk to cellular radio for network APIs. @@ -416,4 +417,25 @@ oneway interface IRadioNetwork { * Response function is IRadioNetworkResponse.supplyNetworkDepersonalizationResponse() */ void supplyNetworkDepersonalization(in int serial, in String netPin); + + /** + * Set the UE usage setting for data/voice centric usage. + * + *

Sets the usage setting in accordance with 3gpp 24.301 sec 4.3 and 3gpp 24.501 sec 4.3. + *

This value must be independently preserved for each SIM; (setting the value is not a + * "global" override). + * + * @param serial Serial number of request. + * @param usageSetting the usage setting for the current SIM. + */ + oneway void setUsageSetting(in int serial, in UsageSetting usageSetting); + + /** + * Get the UE usage setting for data/voice centric usage. + * + *

Gets the usage setting in accordance with 3gpp 24.301 sec 4.3 and 3gpp 24.501 sec 4.3. + * + * @param serial Serial number of request. + */ + oneway void getUsageSetting(in int serial); } diff --git a/radio/aidl/android/hardware/radio/network/IRadioNetworkResponse.aidl b/radio/aidl/android/hardware/radio/network/IRadioNetworkResponse.aidl index 429b5a8766..30f422101b 100644 --- a/radio/aidl/android/hardware/radio/network/IRadioNetworkResponse.aidl +++ b/radio/aidl/android/hardware/radio/network/IRadioNetworkResponse.aidl @@ -31,6 +31,7 @@ import android.hardware.radio.network.RadioAccessSpecifier; import android.hardware.radio.network.RadioBandMode; import android.hardware.radio.network.RegStateResult; import android.hardware.radio.network.SignalStrength; +import android.hardware.radio.network.UsageSetting; /** * Interface declaring response functions to solicited radio requests for network APIs. @@ -549,4 +550,30 @@ oneway interface IRadioNetworkResponse { * RadioError:SIM_ABSENT */ void supplyNetworkDepersonalizationResponse(in RadioResponseInfo info, in int remainingRetries); + + /** + * @param info Response info struct containing response type, serial no. and error. + * + * Valid errors returned: + * RadioError:NONE + * RadioError:RADIO_NOT_AVAILABLE + * RadioError:INVALID_STATE + * RadioError:INVALID_ARGUMENTS + * RadioError:INTERNAL_ERR + * RadioError:SIM_ABSENT + */ + oneway void setUsageSettingResponse(in RadioResponseInfo info); + + /** + * @param info Response info struct containing response type, serial no. and error. + * @param usageSetting the usage setting for the current SIM. + * + * Valid errors returned: + * RadioError:NONE + * RadioError:RADIO_NOT_AVAILABLE + * RadioError:INVALID_STATE + * RadioError:INTERNAL_ERR + * RadioError:SIM_ABSENT + */ + oneway void getUsageSettingResponse(in RadioResponseInfo info, in UsageSetting usageSetting); } diff --git a/radio/aidl/android/hardware/radio/network/UsageSetting.aidl b/radio/aidl/android/hardware/radio/network/UsageSetting.aidl new file mode 100644 index 0000000000..ba8fe93f55 --- /dev/null +++ b/radio/aidl/android/hardware/radio/network/UsageSetting.aidl @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.hardware.radio.network; + +/** + * Cellular usage setting with values according to 3gpp 24.301 sec 4.3 and 3gpp 24.501 sec 4.3. + * + *

Also refer to "UE's usage setting" as defined in 3gpp 24.301 section 3.1 and 3gpp 23.221 + * Annex A. + */ +@VintfStability +@Backing(type="int") +enum UsageSetting { + /** + * UE operates in voice-centric mode. Generally speaking, in this mode of operation, the UE + * will not remain camped on a cell or attached to a network unless that cell/network provides + * voice service. + */ + VOICE_CENTRIC = 1, + + /** + * UE operates in data-centric mode. Generally speaking, in this mode of operation, the UE + * will not reselect away from a cell/network that only provides data services. + */ + DATA_CENTRIC = 2, +} diff --git a/radio/aidl/compat/libradiocompat/include/libradiocompat/RadioNetwork.h b/radio/aidl/compat/libradiocompat/include/libradiocompat/RadioNetwork.h index c776fd1f09..09ae240dbc 100644 --- a/radio/aidl/compat/libradiocompat/include/libradiocompat/RadioNetwork.h +++ b/radio/aidl/compat/libradiocompat/include/libradiocompat/RadioNetwork.h @@ -88,6 +88,10 @@ class RadioNetwork : public RadioCompatBase, ::ndk::ScopedAStatus stopNetworkScan(int32_t serial) override; ::ndk::ScopedAStatus supplyNetworkDepersonalization(int32_t serial, const std::string& netPin) override; + ::ndk::ScopedAStatus setUsageSetting( + int32_t serial, + ::aidl::android::hardware::radio::network::UsageSetting usageSetting) override; + ::ndk::ScopedAStatus getUsageSetting(int32_t serial) override; public: using RadioCompatBase::RadioCompatBase; diff --git a/radio/aidl/compat/libradiocompat/network/RadioNetwork.cpp b/radio/aidl/compat/libradiocompat/network/RadioNetwork.cpp index af0bc4619f..5fa1cf5da3 100644 --- a/radio/aidl/compat/libradiocompat/network/RadioNetwork.cpp +++ b/radio/aidl/compat/libradiocompat/network/RadioNetwork.cpp @@ -278,4 +278,19 @@ ScopedAStatus RadioNetwork::supplyNetworkDepersonalization(int32_t ser, const st return ok(); } +// TODO(b/210498497): is there a cleaner way to send a response back to Android, even though these +// methods must never be called? +ScopedAStatus RadioNetwork::setUsageSetting( + int32_t ser, ::aidl::android::hardware::radio::network::UsageSetting) { + LOG_CALL << ser; + LOG(ERROR) << "setUsageSetting is unsupported by HIDL HALs"; + return ok(); +} + +ScopedAStatus RadioNetwork::getUsageSetting(int32_t ser) { + LOG_CALL << ser; + LOG(ERROR) << "getUsageSetting is unsupported by HIDL HALs"; + return ok(); +} + } // namespace android::hardware::radio::compat