diff --git a/thread/service/java/com/android/server/thread/ThreadNetworkCountryCode.java b/thread/service/java/com/android/server/thread/ThreadNetworkCountryCode.java index ff0e2c19e8..50e0b121e5 100644 --- a/thread/service/java/com/android/server/thread/ThreadNetworkCountryCode.java +++ b/thread/service/java/com/android/server/thread/ThreadNetworkCountryCode.java @@ -16,6 +16,7 @@ package com.android.server.thread; +import static android.net.thread.ThreadNetworkException.ERROR_UNSUPPORTED_FEATURE; import static com.android.server.thread.ThreadPersistentSettings.KEY_COUNTRY_CODE; import android.annotation.Nullable; @@ -115,6 +116,9 @@ public class ThreadNetworkCountryCode { new ArrayMap(); private final ThreadPersistentSettings mPersistentSettings; + /** Indicates whether the Thread co-processor supports setting the country code. */ + private boolean mIsCpSettingCountryCodeSupported = true; + @Nullable private CountryCodeInfo mCurrentCountryCodeInfo; @Nullable private CountryCodeInfo mLocationCountryCodeInfo; @Nullable private CountryCodeInfo mOverrideCountryCodeInfo; @@ -520,6 +524,10 @@ public class ThreadNetworkCountryCode { @Override public void onError(int otError, String message) { + if (otError == ERROR_UNSUPPORTED_FEATURE) { + mIsCpSettingCountryCodeSupported = false; + } + LOG.e( "Error " + otError @@ -546,6 +554,11 @@ public class ThreadNetworkCountryCode { return; } + if (!mIsCpSettingCountryCodeSupported) { + LOG.i("Thread co-processor doesn't support setting the country code"); + return; + } + LOG.i("Set country code: " + countryCodeInfo); mThreadNetworkControllerService.setCountryCode( countryCodeInfo.getCountryCode().toUpperCase(Locale.ROOT), @@ -592,6 +605,7 @@ public class ThreadNetworkCountryCode { /** Dumps the current state of this ThreadNetworkCountryCode object. */ public synchronized void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println("---- Dump of ThreadNetworkCountryCode begin ----"); + pw.println("mIsCpSettingCountryCodeSupported: " + mIsCpSettingCountryCodeSupported); pw.println("mOverrideCountryCodeInfo : " + mOverrideCountryCodeInfo); pw.println("mTelephonyCountryCodeSlotInfoMap: " + mTelephonyCountryCodeSlotInfoMap); pw.println("mTelephonyCountryCodeInfo : " + mTelephonyCountryCodeInfo); diff --git a/thread/tests/unit/src/com/android/server/thread/ThreadNetworkCountryCodeTest.java b/thread/tests/unit/src/com/android/server/thread/ThreadNetworkCountryCodeTest.java index 139f4c8fca..2e58bc9e2c 100644 --- a/thread/tests/unit/src/com/android/server/thread/ThreadNetworkCountryCodeTest.java +++ b/thread/tests/unit/src/com/android/server/thread/ThreadNetworkCountryCodeTest.java @@ -17,6 +17,7 @@ package com.android.server.thread; import static android.net.thread.ThreadNetworkException.ERROR_INTERNAL_ERROR; +import static android.net.thread.ThreadNetworkException.ERROR_UNSUPPORTED_FEATURE; import static com.android.server.thread.ThreadNetworkCountryCode.DEFAULT_COUNTRY_CODE; import static com.android.server.thread.ThreadPersistentSettings.KEY_COUNTRY_CODE; @@ -109,6 +110,7 @@ public class ThreadNetworkCountryCodeTest { private ThreadNetworkCountryCode mThreadNetworkCountryCode; private boolean mErrorSetCountryCode; + private boolean mErrorUnsupportedFeatureSetCountryCode; @Captor private ArgumentCaptor mLocationListenerCaptor; @Captor private ArgumentCaptor mGeocodeListenerCaptor; @@ -143,6 +145,10 @@ public class ThreadNetworkCountryCodeTest { if (mErrorSetCountryCode) { cb.onError(ERROR_INTERNAL_ERROR, new String("Invalid country code")); + } else if (mErrorUnsupportedFeatureSetCountryCode) { + cb.onError( + ERROR_UNSUPPORTED_FEATURE, + new String("Setting country code is not supported")); } else { cb.onSuccess(); } @@ -452,6 +458,22 @@ public class ThreadNetworkCountryCodeTest { assertThat(mThreadNetworkCountryCode.getCountryCode()).isEqualTo(DEFAULT_COUNTRY_CODE); } + @Test + public void setCountryCodeNotSupported_returnUnsupportedFeatureError_countryCodeNotSetAgain() { + mThreadNetworkCountryCode.initialize(); + assertThat(mThreadNetworkCountryCode.getCountryCode()).isEqualTo(DEFAULT_COUNTRY_CODE); + + mErrorUnsupportedFeatureSetCountryCode = true; + mThreadNetworkCountryCode.setOverrideCountryCode(TEST_COUNTRY_CODE_CN); + verify(mThreadNetworkControllerService) + .setCountryCode(eq(TEST_COUNTRY_CODE_CN), mOperationReceiverCaptor.capture()); + + mThreadNetworkCountryCode.setOverrideCountryCode(TEST_COUNTRY_CODE_US); + verifyNoMoreInteractions(mThreadNetworkControllerService); + + assertThat(mThreadNetworkCountryCode.getCountryCode()).isEqualTo(DEFAULT_COUNTRY_CODE); + } + @Test public void settingsCountryCode_settingsCountryCodeIsActive_settingsCountryCodeIsUsed() { when(mPersistentSettings.get(KEY_COUNTRY_CODE)).thenReturn(TEST_COUNTRY_CODE_CN); @@ -468,6 +490,7 @@ public class ThreadNetworkCountryCodeTest { mThreadNetworkCountryCode.dump(new FileDescriptor(), printWriter, null); String outputString = stringWriter.toString(); + assertThat(outputString).contains("mIsCpSettingCountryCodeSupported"); assertThat(outputString).contains("mOverrideCountryCodeInfo"); assertThat(outputString).contains("mTelephonyCountryCodeSlotInfoMap"); assertThat(outputString).contains("mTelephonyCountryCodeInfo");