diff --git a/wifi/api/system-current.txt b/wifi/api/system-current.txt index 48d9fd453b053..eba744330a2e8 100644 --- a/wifi/api/system-current.txt +++ b/wifi/api/system-current.txt @@ -483,6 +483,7 @@ package android.net.wifi { method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public java.util.List getWifiConfigForMatchedNetworkSuggestionsSharedWithUser(@NonNull java.util.List); method public boolean is60GHzBandSupported(); method public boolean isApMacRandomizationSupported(); + method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public boolean isCarrierNetworkOffloadEnabled(int, boolean); method public boolean isConnectedMacRandomizationSupported(); method @Deprecated public boolean isDeviceToDeviceRttSupported(); method public boolean isPortableHotspotSupported(); @@ -501,6 +502,7 @@ package android.net.wifi { method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public byte[] retrieveSoftApBackupData(); method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD, android.Manifest.permission.NETWORK_STACK}) public void save(@NonNull android.net.wifi.WifiConfiguration, @Nullable android.net.wifi.WifiManager.ActionListener); method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void setAutoWakeupEnabled(boolean); + method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public void setCarrierNetworkOffloadEnabled(int, boolean, boolean); method @RequiresPermission(android.Manifest.permission.WIFI_UPDATE_COEX_UNSAFE_CHANNELS) public void setCoexUnsafeChannels(@NonNull java.util.Set, int); method @RequiresPermission(android.Manifest.permission.WIFI_SET_DEVICE_MOBILITY_STATE) public void setDeviceMobilityState(int); method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void setMacRandomizationSettingPasspointEnabled(@NonNull String, boolean); diff --git a/wifi/java/android/net/wifi/IWifiManager.aidl b/wifi/java/android/net/wifi/IWifiManager.aidl index 6dee751f5894c..866e913800fd5 100644 --- a/wifi/java/android/net/wifi/IWifiManager.aidl +++ b/wifi/java/android/net/wifi/IWifiManager.aidl @@ -296,4 +296,8 @@ interface IWifiManager void startTemporarilyDisablingAllNonCarrierMergedWifi(int subId); void stopTemporarilyDisablingAllNonCarrierMergedWifi(); + + void setCarrierNetworkOffloadEnabled(int subscriptionId, boolean merged, boolean enabled); + + boolean isCarrierNetworkOffloadEnabled(int subscriptionId, boolean merged); } diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java index b8fa1e18ed28f..e5aeead2dec03 100644 --- a/wifi/java/android/net/wifi/WifiManager.java +++ b/wifi/java/android/net/wifi/WifiManager.java @@ -53,6 +53,7 @@ import android.os.Looper; import android.os.RemoteException; import android.os.WorkSource; import android.os.connectivity.WifiActivityEnergyInfo; +import android.telephony.SubscriptionInfo; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.CloseGuard; @@ -6721,4 +6722,63 @@ public class WifiManager { throw e.rethrowFromSystemServer(); } } + + /** + * Sets the state of carrier offload on merged or unmerged networks for specified subscription. + * + *

+ * When a subscription's carrier network offload is disabled, all network suggestions related to + * this subscription will not be considered for auto join. + *

+ * If calling app want disable all carrier network offload from a specified subscription, should + * call this API twice to disable both merged and unmerged carrier network suggestions. + * + * @param subscriptionId See {@link SubscriptionInfo#getSubscriptionId()}. + * @param merged True for carrier merged network, false otherwise. + * See {@link WifiNetworkSuggestion.Builder#setCarrierMerged(boolean)} + * @param enabled True for enable carrier network offload, false otherwise. + * @see #isCarrierNetworkOffloadEnabled(int, boolean) + * @hide + */ + @SystemApi + @RequiresPermission(anyOf = { + android.Manifest.permission.NETWORK_SETTINGS, + android.Manifest.permission.NETWORK_SETUP_WIZARD}) + public void setCarrierNetworkOffloadEnabled(int subscriptionId, boolean merged, + boolean enabled) { + if (!SdkLevel.isAtLeastS()) { + throw new UnsupportedOperationException(); + } + try { + mService.setCarrierNetworkOffloadEnabled(subscriptionId, merged, enabled); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * Get the carrier network offload state for merged or unmerged networks for specified + * subscription. + * @param subscriptionId subscription ID see {@link SubscriptionInfo#getSubscriptionId()} + * @param merged True for carrier merged network, false otherwise. + * See {@link WifiNetworkSuggestion.Builder#setCarrierMerged(boolean)} + * @return True to indicate that carrier network offload is enabled, false otherwise. + * @see #setCarrierNetworkOffloadEnabled(int, boolean, boolean) + * @hide + */ + @SystemApi + @RequiresPermission(anyOf = { + android.Manifest.permission.NETWORK_SETTINGS, + android.Manifest.permission.NETWORK_SETUP_WIZARD}) + public boolean isCarrierNetworkOffloadEnabled(int subscriptionId, boolean merged) { + if (!SdkLevel.isAtLeastS()) { + throw new UnsupportedOperationException(); + } + try { + return mService.isCarrierNetworkOffloadEnabled(subscriptionId, merged); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + } diff --git a/wifi/tests/src/android/net/wifi/WifiManagerTest.java b/wifi/tests/src/android/net/wifi/WifiManagerTest.java index 39f6f57b05b3a..52e91394d8bf5 100644 --- a/wifi/tests/src/android/net/wifi/WifiManagerTest.java +++ b/wifi/tests/src/android/net/wifi/WifiManagerTest.java @@ -136,6 +136,7 @@ public class WifiManagerTest { private static final String[] TEST_MAC_ADDRESSES = {"da:a1:19:0:0:0"}; private static final int TEST_AP_FREQUENCY = 2412; private static final int TEST_AP_BANDWIDTH = SoftApInfo.CHANNEL_WIDTH_20MHZ; + private static final int TEST_SUB_ID = 3; @Mock Context mContext; @Mock android.net.wifi.IWifiManager mWifiService; @@ -2583,10 +2584,29 @@ public class WifiManagerTest { @Test public void testGetNetworkSuggestionUserApprovalStatus() throws Exception { + assumeTrue(SdkLevel.isAtLeastS()); + when(mWifiService.getNetworkSuggestionUserApprovalStatus(TEST_PACKAGE_NAME)) .thenReturn(WifiManager.STATUS_SUGGESTION_APPROVAL_APPROVED_BY_USER); assertEquals(WifiManager.STATUS_SUGGESTION_APPROVAL_APPROVED_BY_USER, mWifiManager.getNetworkSuggestionUserApprovalStatus()); verify(mWifiService).getNetworkSuggestionUserApprovalStatus(TEST_PACKAGE_NAME); } + + @Test + public void testSetCarrierNetworkOffload() throws Exception { + assumeTrue(SdkLevel.isAtLeastS()); + mWifiManager.setCarrierNetworkOffloadEnabled(TEST_SUB_ID, true, false); + verify(mWifiService).setCarrierNetworkOffloadEnabled(TEST_SUB_ID, + true, false); + } + + @Test + public void testGetCarrierNetworkOffload() throws Exception { + assumeTrue(SdkLevel.isAtLeastS()); + when(mWifiService.isCarrierNetworkOffloadEnabled(TEST_SUB_ID, false)).thenReturn(true); + assertTrue(mWifiManager.isCarrierNetworkOffloadEnabled(TEST_SUB_ID, false)); + verify(mWifiService).isCarrierNetworkOffloadEnabled(TEST_SUB_ID, false); + } + }