Set country code in the driver and remove channel set

With dual band support, using country code
settings is the way to go

Bug: 2936741
Change-Id: I760dce4c43b1af19ee205c28f0d287420c8d9e85
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index ee53828..2229964 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -1199,12 +1199,6 @@
          */
         public static final String WIFI_STATIC_DNS2 = "wifi_static_dns2";
 
-        /**
-         * The number of radio channels that are allowed in the local
-         * 802.11 regulatory domain.
-         * @hide
-         */
-        public static final String WIFI_NUM_ALLOWED_CHANNELS = "wifi_num_allowed_channels";
 
         /**
          * Determines whether remote devices may discover and/or connect to
@@ -2701,11 +2695,11 @@
                 "wifi_networks_available_repeat_delay";
 
         /**
-         * The number of radio channels that are allowed in the local
-         * 802.11 regulatory domain.
+         * 802.11 country code in ISO 3166 format
          * @hide
          */
-        public static final String WIFI_NUM_ALLOWED_CHANNELS = "wifi_num_allowed_channels";
+        public static final String WIFI_COUNTRY_CODE = "wifi_country_code";
+
 
         /**
          * When the number of open networks exceeds this number, the
@@ -3638,7 +3632,7 @@
             TTS_ENABLED_PLUGINS,
             WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,
             WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY,
-            WIFI_NUM_ALLOWED_CHANNELS,
+            WIFI_COUNTRY_CODE,
             WIFI_NUM_OPEN_NETWORKS_KEPT,
             MOUNT_PLAY_NOTIFICATION_SND,
             MOUNT_UMS_AUTOSTART,
diff --git a/core/jni/android_net_wifi_Wifi.cpp b/core/jni/android_net_wifi_Wifi.cpp
index a024420..0663e98 100644
--- a/core/jni/android_net_wifi_Wifi.cpp
+++ b/core/jni/android_net_wifi_Wifi.cpp
@@ -198,11 +198,25 @@
     env->ReleaseStringUTFChars(bssid, bssidStr);
 
     if ((numWritten == -1) || (numWritten >= (int)sizeof(cmdstr))) {
-        return false;
+        return -1;
     }
     return doIntCommand(cmdstr);
 }
 
+static jboolean android_net_wifi_setCountryCodeCommand(JNIEnv* env, jobject clazz, jstring country)
+{
+    char cmdstr[BUF_SIZE];
+    jboolean isCopy;
+
+    const char *countryStr = env->GetStringUTFChars(country, &isCopy);
+    int numWritten = snprintf(cmdstr, sizeof(cmdstr), "DRIVER COUNTRY %s", countryStr);
+    env->ReleaseStringUTFChars(country, countryStr);
+
+    if ((numWritten == -1) || (numWritten >= (int)sizeof(cmdstr))) {
+        return false;
+    }
+    return doBooleanCommand(cmdstr, "OK");
+}
 
 static jboolean android_net_wifi_setNetworkVariableCommand(JNIEnv* env,
                                                            jobject clazz,
@@ -484,32 +498,6 @@
     return (jint)band;
 }
 
-static jboolean android_net_wifi_setNumAllowedChannelsCommand(JNIEnv* env, jobject clazz, jint numChannels)
-{
-    char cmdstr[BUF_SIZE];
-
-    int numWritten = snprintf(cmdstr, sizeof(cmdstr), "DRIVER SCAN-CHANNELS %u", numChannels);
-    int cmdTooLong = numWritten >= (int)sizeof(cmdstr);
-
-    return (jboolean)!cmdTooLong && doBooleanCommand(cmdstr, "OK");
-}
-
-static jint android_net_wifi_getNumAllowedChannelsCommand(JNIEnv* env, jobject clazz)
-{
-    char reply[BUF_SIZE];
-    int numChannels;
-
-    if (doCommand("DRIVER SCAN-CHANNELS", reply, sizeof(reply)) != 0) {
-        return -1;
-    }
-    // reply comes back in the form "Scan-Channels = X" where X is the
-    // number of channels
-    if (sscanf(reply, "%*s = %u", &numChannels) == 1)
-        return numChannels;
-    else
-        return -1;
-}
-
 static jboolean android_net_wifi_setBluetoothCoexistenceModeCommand(JNIEnv* env, jobject clazz, jint mode)
 {
     char cmdstr[BUF_SIZE];
@@ -645,8 +633,6 @@
     { "getPowerModeCommand", "()I", (void*) android_net_wifi_getPowerModeCommand },
     { "setBandCommand", "(I)Z", (void*) android_net_wifi_setBandCommand},
     { "getBandCommand", "()I", (void*) android_net_wifi_getBandCommand},
-    { "setNumAllowedChannelsCommand", "(I)Z", (void*) android_net_wifi_setNumAllowedChannelsCommand },
-    { "getNumAllowedChannelsCommand", "()I", (void*) android_net_wifi_getNumAllowedChannelsCommand },
     { "setBluetoothCoexistenceModeCommand", "(I)Z",
     		(void*) android_net_wifi_setBluetoothCoexistenceModeCommand },
     { "setBluetoothCoexistenceScanModeCommand", "(Z)Z",
@@ -668,6 +654,8 @@
         (void*) android_net_wifi_wpsPinFromDeviceCommand },
     { "setSuspendOptimizationsCommand", "(Z)Z",
         (void*) android_net_wifi_setSuspendOptimizationsCommand},
+    { "setCountryCodeCommand", "(Ljava/lang/String;)Z",
+        (void*) android_net_wifi_setCountryCodeCommand},
     { "doDhcpRequest", "(Landroid/net/DhcpInfo;)Z", (void*) android_net_wifi_doDhcpRequest },
     { "getDhcpError", "()Ljava/lang/String;", (void*) android_net_wifi_getDhcpError },
 };
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 541835f..c89789e 100755
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -2345,10 +2345,9 @@
     <!-- This string appears (on two lines) when you type a number into contacts search, to let you create a contact whose phone number is the number you typed.  The first line will be in bigger type than the second. -->
     <string name="create_contact_using">Create contact\nusing <xliff:g id="number" example="555">%s</xliff:g></string>
 
-    <!-- This string array should be overridden by the manufacture to present a list of carrier-id,locale,wifi-channel sets.  This is used at startup to set system defaults by checking the system property ro.carrier for the carrier-id and searching through this array -->
+    <!-- This string array should be overridden by the manufacture to present a list of carrier-id,locale. The wifi regulatory domain is extracted from the locale information. This is used at startup to set system defaults by checking the system property ro.carrier for the carrier-id and searching through this array -->
     <!-- An Array of [[Carrier-ID]                     -->
-    <!--              [default-locale]                 -->
-    <!--              [default-wifi-allowed-channels]] -->
+    <!--              [default-locale]]                -->
     <string-array translatable="false" name="carrier_properties">
     </string-array>
 
diff --git a/services/java/com/android/server/WifiService.java b/services/java/com/android/server/WifiService.java
index 55d69f0..9687aa7 100644
--- a/services/java/com/android/server/WifiService.java
+++ b/services/java/com/android/server/WifiService.java
@@ -134,12 +134,6 @@
      */
     private static final long DEFAULT_SCAN_INTERVAL_MS = 60 * 1000; /* 1 minute */
 
-    /**
-     * Number of allowed radio frequency channels in various regulatory domains.
-     * This list is sufficient for 802.11b/g networks (2.4GHz range).
-     */
-    private static int[] sValidRegulatoryChannelCounts = new int[] {11, 13, 14};
-
     private static final String ACTION_DEVICE_IDLE =
             "com.android.server.WifiManager.action.DEVICE_IDLE";
 
@@ -737,82 +731,19 @@
     }
 
     /**
-     * Set the number of radio frequency channels that are allowed to be used
-     * in the current regulatory domain. This method should be used only
-     * if the correct number of channels cannot be determined automatically
-     * for some reason. If the operation is successful, the new value may be
-     * persisted as a Secure setting.
-     * @param numChannels the number of allowed channels. Must be greater than 0
-     * and less than or equal to 16.
+     * Set the country code
+     * @param countryCode ISO 3166 country code.
      * @param persist {@code true} if the setting should be remembered.
-     * @return {@code true} if the operation succeeds, {@code false} otherwise, e.g.,
-     * {@code numChannels} is outside the valid range.
+     *
+     * The persist behavior exists so that wifi can fall back to the last
+     * persisted country code on a restart, when the locale information is
+     * not available from telephony.
      */
-    public synchronized boolean setNumAllowedChannels(int numChannels, boolean persist) {
-        Slog.i(TAG, "WifiService trying to setNumAllowed to "+numChannels+
-                " with persist set to "+persist);
+    public void setCountryCode(String countryCode, boolean persist) {
+        Slog.i(TAG, "WifiService trying to set country code to " + countryCode +
+                " with persist set to " + persist);
         enforceChangePermission();
-
-        /*
-         * Validate the argument. We'd like to let the Wi-Fi driver do this,
-         * but if Wi-Fi isn't currently enabled, that's not possible, and
-         * we want to persist the setting anyway,so that it will take
-         * effect when Wi-Fi does become enabled.
-         */
-        boolean found = false;
-        for (int validChan : sValidRegulatoryChannelCounts) {
-            if (validChan == numChannels) {
-                found = true;
-                break;
-            }
-        }
-        if (!found) {
-            return false;
-        }
-
-        if (persist) {
-            Settings.Secure.putInt(mContext.getContentResolver(),
-                    Settings.Secure.WIFI_NUM_ALLOWED_CHANNELS,
-                    numChannels);
-        }
-
-        mWifiStateMachine.setNumAllowedChannels(numChannels);
-
-        return true;
-    }
-
-    /**
-     * Return the number of frequency channels that are allowed
-     * to be used in the current regulatory domain.
-     * @return the number of allowed channels, or {@code -1} if an error occurs
-     */
-    public int getNumAllowedChannels() {
-        int numChannels;
-
-        enforceAccessPermission();
-
-        /*
-         * If we can't get the value from the driver (e.g., because
-         * Wi-Fi is not currently enabled), get the value from
-         * Settings.
-         */
-        numChannels = mWifiStateMachine.getNumAllowedChannels();
-        if (numChannels < 0) {
-            numChannels = Settings.Secure.getInt(mContext.getContentResolver(),
-                    Settings.Secure.WIFI_NUM_ALLOWED_CHANNELS,
-                    -1);
-        }
-        return numChannels;
-    }
-
-    /**
-     * Return the list of valid values for the number of allowed radio channels
-     * for various regulatory domains.
-     * @return the list of channel counts
-     */
-    public int[] getValidChannelCounts() {
-        enforceAccessPermission();
-        return sValidRegulatoryChannelCounts;
+        mWifiStateMachine.setCountryCode(countryCode, persist);
     }
 
     /**
diff --git a/telephony/java/com/android/internal/telephony/MccTable.java b/telephony/java/com/android/internal/telephony/MccTable.java
index 9b0aa3c..c0bf7ec 100644
--- a/telephony/java/com/android/internal/telephony/MccTable.java
+++ b/telephony/java/com/android/internal/telephony/MccTable.java
@@ -48,22 +48,16 @@
         String iso;
         int smallestDigitsMnc;
         String language;
-        int wifiChannels;
 
         MccEntry(int mnc, String iso, int smallestDigitsMCC) {
             this(mnc, iso, smallestDigitsMCC, null);
         }
 
         MccEntry(int mnc, String iso, int smallestDigitsMCC, String language) {
-            this(mnc, iso, smallestDigitsMCC, language, 0);
-        }
-
-        MccEntry(int mnc, String iso, int smallestDigitsMCC, String language, int wifiChannels) {
             this.mcc = mnc;
             this.iso = iso;
             this.smallestDigitsMnc = smallestDigitsMCC;
             this.language = language;
-            this.wifiChannels = wifiChannels;
         }
 
 
@@ -171,23 +165,6 @@
     }
 
     /**
-     * Given a GSM Mobile Country Code, returns the number of wifi
-     * channels allowed in that country.  Returns 0 if unavailable.
-     */
-    public static int
-    wifiChannelsForMcc(int mcc) {
-        MccEntry entry;
-
-        entry = entryForMcc(mcc);
-
-        if (entry == null) {
-            return 0;
-        } else {
-            return entry.wifiChannels;
-        }
-    }
-
-    /**
      * Updates MCC and MNC device configuration information for application retrieving
      * correct version of resources.  If either MCC or MNC is 0, they will be ignored (not set).
      * @param phone PhoneBae to act on.
@@ -210,7 +187,7 @@
             if (mcc != 0) {
                 setTimezoneFromMccIfNeeded(phone, mcc);
                 setLocaleFromMccIfNeeded(phone, mcc);
-                setWifiChannelsFromMcc(phone, mcc);
+                setWifiCountryCodeFromMcc(phone, mcc);
             }
             try {
                 Configuration config = ActivityManagerNative.getDefault().getConfiguration();
@@ -266,14 +243,14 @@
      * @param phone PhoneBase to act on (get context from).
      * @param mcc Mobile Country Code of the SIM or SIM-like entity (build prop on CDMA)
      */
-    private static void setWifiChannelsFromMcc(PhoneBase phone, int mcc) {
-        int wifiChannels = MccTable.wifiChannelsForMcc(mcc);
-        if (wifiChannels != 0) {
+    private static void setWifiCountryCodeFromMcc(PhoneBase phone, int mcc) {
+        String country = MccTable.countryCodeForMcc(mcc);
+        if (!country.isEmpty()) {
             Context context = phone.getContext();
-            Log.d(LOG_TAG, "WIFI_NUM_ALLOWED_CHANNELS set to " + wifiChannels);
+            Log.d(LOG_TAG, "WIFI_COUNTRY_CODE set to " + country);
             WifiManager wM = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
             //persist
-            wM.setNumAllowedChannels(wifiChannels, true);
+            wM.setCountryCode(country, true);
         }
     }
 
@@ -297,7 +274,7 @@
          */
 
 		table.add(new MccEntry(202,"gr",2));	//Greece
-		table.add(new MccEntry(204,"nl",2,"nl",13));	//Netherlands (Kingdom of the)
+		table.add(new MccEntry(204,"nl",2,"nl"));	//Netherlands (Kingdom of the)
 		table.add(new MccEntry(206,"be",2));	//Belgium
 		table.add(new MccEntry(208,"fr",2,"fr"));	//France
 		table.add(new MccEntry(212,"mc",2));	//Monaco (Principality of)
@@ -311,11 +288,11 @@
 		table.add(new MccEntry(225,"va",2,"it"));	//Vatican City State
 		table.add(new MccEntry(226,"ro",2));	//Romania
 		table.add(new MccEntry(228,"ch",2,"de"));	//Switzerland (Confederation of)
-		table.add(new MccEntry(230,"cz",2,"cs",13));	//Czech Republic
+		table.add(new MccEntry(230,"cz",2,"cs"));	//Czech Republic
 		table.add(new MccEntry(231,"sk",2));	//Slovak Republic
-		table.add(new MccEntry(232,"at",2,"de",13));	//Austria
-		table.add(new MccEntry(234,"gb",2,"en",13));	//United Kingdom of Great Britain and Northern Ireland
-		table.add(new MccEntry(235,"gb",2,"en",13));	//United Kingdom of Great Britain and Northern Ireland
+		table.add(new MccEntry(232,"at",2,"de"));	//Austria
+		table.add(new MccEntry(234,"gb",2,"en"));	//United Kingdom of Great Britain and Northern Ireland
+		table.add(new MccEntry(235,"gb",2,"en"));	//United Kingdom of Great Britain and Northern Ireland
 		table.add(new MccEntry(238,"dk",2));	//Denmark
 		table.add(new MccEntry(240,"se",2));	//Sweden
 		table.add(new MccEntry(242,"no",2));	//Norway
@@ -328,7 +305,7 @@
 		table.add(new MccEntry(257,"by",2));	//Belarus (Republic of)
 		table.add(new MccEntry(259,"md",2));	//Moldova (Republic of)
 		table.add(new MccEntry(260,"pl",2));	//Poland (Republic of)
-		table.add(new MccEntry(262,"de",2,"de",13));	//Germany (Federal Republic of)
+		table.add(new MccEntry(262,"de",2,"de"));	//Germany (Federal Republic of)
 		table.add(new MccEntry(266,"gi",2));	//Gibraltar
 		table.add(new MccEntry(268,"pt",2));	//Portugal
 		table.add(new MccEntry(270,"lu",2));	//Luxembourg
@@ -349,15 +326,15 @@
                 table.add(new MccEntry(294,"mk",2));   //The Former Yugoslav Republic of Macedonia
 		table.add(new MccEntry(295,"li",2));	//Liechtenstein (Principality of)
                 table.add(new MccEntry(297,"me",2));    //Montenegro (Republic of)
-		table.add(new MccEntry(302,"ca",3,"",11));	//Canada
+		table.add(new MccEntry(302,"ca",3,""));	//Canada
 		table.add(new MccEntry(308,"pm",2));	//Saint Pierre and Miquelon (Collectivit territoriale de la Rpublique franaise)
-		table.add(new MccEntry(310,"us",3,"en",11));	//United States of America
-		table.add(new MccEntry(311,"us",3,"en",11));	//United States of America
-		table.add(new MccEntry(312,"us",3,"en",11));	//United States of America
-		table.add(new MccEntry(313,"us",3,"en",11));	//United States of America
-		table.add(new MccEntry(314,"us",3,"en",11));	//United States of America
-		table.add(new MccEntry(315,"us",3,"en",11));	//United States of America
-		table.add(new MccEntry(316,"us",3,"en",11));	//United States of America
+		table.add(new MccEntry(310,"us",3,"en"));	//United States of America
+		table.add(new MccEntry(311,"us",3,"en"));	//United States of America
+		table.add(new MccEntry(312,"us",3,"en"));	//United States of America
+		table.add(new MccEntry(313,"us",3,"en"));	//United States of America
+		table.add(new MccEntry(314,"us",3,"en"));	//United States of America
+		table.add(new MccEntry(315,"us",3,"en"));	//United States of America
+		table.add(new MccEntry(316,"us",3,"en"));	//United States of America
 		table.add(new MccEntry(330,"pr",2));	//Puerto Rico
 		table.add(new MccEntry(332,"vi",2));	//United States Virgin Islands
 		table.add(new MccEntry(334,"mx",3));	//Mexico
@@ -414,27 +391,27 @@
 		table.add(new MccEntry(436,"tj",2));	//Tajikistan (Republic of)
 		table.add(new MccEntry(437,"kg",2));	//Kyrgyz Republic
 		table.add(new MccEntry(438,"tm",2));	//Turkmenistan
-		table.add(new MccEntry(440,"jp",2,"ja",14));	//Japan
-		table.add(new MccEntry(441,"jp",2,"ja",14));	//Japan
-		table.add(new MccEntry(450,"kr",2,"ko",13));	//Korea (Republic of)
+		table.add(new MccEntry(440,"jp",2,"ja"));	//Japan
+		table.add(new MccEntry(441,"jp",2,"ja"));	//Japan
+		table.add(new MccEntry(450,"kr",2,"ko"));	//Korea (Republic of)
 		table.add(new MccEntry(452,"vn",2));	//Viet Nam (Socialist Republic of)
 		table.add(new MccEntry(454,"hk",2));	//"Hong Kong, China"
 		table.add(new MccEntry(455,"mo",2));	//"Macao, China"
 		table.add(new MccEntry(456,"kh",2));	//Cambodia (Kingdom of)
 		table.add(new MccEntry(457,"la",2));	//Lao People's Democratic Republic
-		table.add(new MccEntry(460,"cn",2,"zh",13));	//China (People's Republic of)
-		table.add(new MccEntry(461,"cn",2,"zh",13));	//China (People's Republic of)
+		table.add(new MccEntry(460,"cn",2,"zh"));	//China (People's Republic of)
+		table.add(new MccEntry(461,"cn",2,"zh"));	//China (People's Republic of)
 		table.add(new MccEntry(466,"tw",2));	//"Taiwan, China"
 		table.add(new MccEntry(467,"kp",2));	//Democratic People's Republic of Korea
 		table.add(new MccEntry(470,"bd",2));	//Bangladesh (People's Republic of)
 		table.add(new MccEntry(472,"mv",2));	//Maldives (Republic of)
 		table.add(new MccEntry(502,"my",2));	//Malaysia
-		table.add(new MccEntry(505,"au",2,"en",11));	//Australia
+		table.add(new MccEntry(505,"au",2,"en"));	//Australia
 		table.add(new MccEntry(510,"id",2));	//Indonesia (Republic of)
 		table.add(new MccEntry(514,"tl",2));	//Democratic Republic of Timor-Leste
 		table.add(new MccEntry(515,"ph",2));	//Philippines (Republic of the)
 		table.add(new MccEntry(520,"th",2));	//Thailand
-		table.add(new MccEntry(525,"sg",2,"en",11));	//Singapore (Republic of)
+		table.add(new MccEntry(525,"sg",2,"en"));	//Singapore (Republic of)
 		table.add(new MccEntry(528,"bn",2));	//Brunei Darussalam
 		table.add(new MccEntry(530,"nz",2, "en"));	//New Zealand
 		table.add(new MccEntry(534,"mp",2));	//Northern Mariana Islands (Commonwealth of the)
diff --git a/telephony/java/com/android/internal/telephony/PhoneBase.java b/telephony/java/com/android/internal/telephony/PhoneBase.java
index 554a7ba..dddb493 100644
--- a/telephony/java/com/android/internal/telephony/PhoneBase.java
+++ b/telephony/java/com/android/internal/telephony/PhoneBase.java
@@ -558,11 +558,6 @@
             String c = carrierLocales[i].toString();
             if (carrier.equals(c)) {
                 String l = carrierLocales[i+1].toString();
-                int wifiChannels = 0;
-                try {
-                    wifiChannels = Integer.parseInt(
-                            carrierLocales[i+2].toString());
-                } catch (NumberFormatException e) { }
 
                 String language = l.substring(0, 2);
                 String country = "";
@@ -571,15 +566,15 @@
                 }
                 setSystemLocale(language, country);
 
-                if (wifiChannels != 0) {
+                if (!country.isEmpty()) {
                     try {
                         Settings.Secure.getInt(mContext.getContentResolver(),
-                                Settings.Secure.WIFI_NUM_ALLOWED_CHANNELS);
+                                Settings.Secure.WIFI_COUNTRY_CODE);
                     } catch (Settings.SettingNotFoundException e) {
                         // note this is not persisting
                         WifiManager wM = (WifiManager)
                                 mContext.getSystemService(Context.WIFI_SERVICE);
-                        wM.setNumAllowedChannels(wifiChannels, false);
+                        wM.setCountryCode(country, false);
                     }
                 }
                 return;
diff --git a/telephony/tests/telephonytests/src/com/android/internal/telephony/MccTableTest.java b/telephony/tests/telephonytests/src/com/android/internal/telephony/MccTableTest.java
index 7eb3df8..868c76d 100644
--- a/telephony/tests/telephonytests/src/com/android/internal/telephony/MccTableTest.java
+++ b/telephony/tests/telephonytests/src/com/android/internal/telephony/MccTableTest.java
@@ -72,16 +72,4 @@
         assertEquals(MccTable.smallestDigitsMccForMnc(0), 2);    // mcc not defined, hence default
         assertEquals(MccTable.smallestDigitsMccForMnc(2000), 2); // mcc not defined, hence default
     }
-
-    @SmallTest
-    public void testWifi() throws Exception {
-        assertEquals(MccTable.wifiChannelsForMcc(262), 13);
-        assertEquals(MccTable.wifiChannelsForMcc(234), 13);
-        assertEquals(MccTable.wifiChannelsForMcc(505), 11);
-        assertEquals(MccTable.wifiChannelsForMcc(313), 11);
-        assertEquals(MccTable.wifiChannelsForMcc(330), 0);  // wifi not defined, hence default
-        assertEquals(MccTable.wifiChannelsForMcc(0), 0);    // mcc not defined, hence default
-        assertEquals(MccTable.wifiChannelsForMcc(2000), 0); // mcc not defined, hence default
-
-    }
 }
diff --git a/wifi/java/android/net/wifi/IWifiManager.aidl b/wifi/java/android/net/wifi/IWifiManager.aidl
index 720f6ac..4bd5286 100644
--- a/wifi/java/android/net/wifi/IWifiManager.aidl
+++ b/wifi/java/android/net/wifi/IWifiManager.aidl
@@ -58,11 +58,7 @@
 
     int getWifiEnabledState();
 
-    int getNumAllowedChannels();
-
-    boolean setNumAllowedChannels(int numChannels, boolean persist);
-
-    int[] getValidChannelCounts();
+    void setCountryCode(String country, boolean persist);
 
     boolean saveConfiguration();
 
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index 356a0bd..c85a988 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -672,57 +672,19 @@
     }
 
     /**
-     * Return the number of frequency channels that are allowed
-     * to be used in the current regulatory domain.
-     * @return the number of allowed channels, or {@code -1} if an error occurs
+     * Set the country code.
+     * @param countryCode country code in ISO 3166 format.
+     * @param persist {@code true} if this needs to be remembered
      *
-     * @hide pending API council
+     * @hide
      */
-    public int getNumAllowedChannels() {
+    public void setCountryCode(String country, boolean persist) {
         try {
-            return mService.getNumAllowedChannels();
-        } catch (RemoteException e) {
-            return -1;
-        }
+            mService.setCountryCode(country, persist);
+        } catch (RemoteException e) { }
     }
 
     /**
-     * Set the number of frequency channels that are allowed to be used
-     * in the current regulatory domain. This method should be used only
-     * if the correct number of channels cannot be determined automatically
-     * for some reason.
-     * @param numChannels the number of allowed channels. Must be greater than 0
-     * and less than or equal to 16.
-     * @param persist {@code true} if you want this remembered
-     * @return {@code true} if the operation succeeds, {@code false} otherwise, e.g.,
-     * {@code numChannels} is out of range.
-     *
-     * @hide pending API council
-     */
-    public boolean setNumAllowedChannels(int numChannels, boolean persist) {
-        try {
-            return mService.setNumAllowedChannels(numChannels, persist);
-        } catch (RemoteException e) {
-            return false;
-        }
-    }
-
-    /**
-     * Return the list of valid values for the number of allowed radio channels
-     * for various regulatory domains.
-     * @return the list of channel counts, or {@code null} if the operation fails
-     *
-     * @hide pending API council review
-     */
-    public int[] getValidChannelCounts() {
-        try {
-            return mService.getValidChannelCounts();
-        } catch (RemoteException e) {
-            return null;
-        }
-   }
-
-    /**
      * Return the DHCP-assigned addresses from the last successful DHCP request,
      * if any.
      * @return the DHCP information
diff --git a/wifi/java/android/net/wifi/WifiNative.java b/wifi/java/android/net/wifi/WifiNative.java
index 3d8157c..06f945b 100644
--- a/wifi/java/android/net/wifi/WifiNative.java
+++ b/wifi/java/android/net/wifi/WifiNative.java
@@ -117,10 +117,6 @@
 
     public native static int getPowerModeCommand();
 
-    public native static boolean setNumAllowedChannelsCommand(int numChannels);
-
-    public native static int getNumAllowedChannelsCommand();
-
     /**
      * Sets the bluetooth coexistence mode.
      * 
@@ -163,6 +159,8 @@
 
     public native static boolean setSuspendOptimizationsCommand(boolean enabled);
 
+    public native static boolean setCountryCodeCommand(String countryCode);
+
     /**
      * Wait for the supplicant to send an event, returning the event string.
      * @return the event string sent by the supplicant.
diff --git a/wifi/java/android/net/wifi/WifiStateMachine.java b/wifi/java/android/net/wifi/WifiStateMachine.java
index 3531749..fdb50e2 100644
--- a/wifi/java/android/net/wifi/WifiStateMachine.java
+++ b/wifi/java/android/net/wifi/WifiStateMachine.java
@@ -111,7 +111,6 @@
 
     private String mInterfaceName;
 
-    private int mNumAllowedChannels = 0;
     private int mLastSignalLevel = -1;
     private String mLastBssid;
     private int mLastNetworkId;
@@ -271,8 +270,8 @@
      * false(0)
      */
     private static final int CMD_SET_BLUETOOTH_SCAN_MODE          = 79;
-    /* Set number of allowed channels */
-    private static final int CMD_SET_NUM_ALLOWED_CHANNELS         = 80;
+    /* Set the country code */
+    private static final int CMD_SET_COUNTRY_CODE                 = 80;
     /* Request connectivity manager wake lock before driver stop */
     private static final int CMD_REQUEST_CM_WAKELOCK              = 81;
     /* Enables RSSI poll */
@@ -308,6 +307,7 @@
     private static final int CMD_START_WPS_PIN_FROM_AP            = 90;
     /* Start Wi-Fi protected setup pin method configuration with pin obtained from device */
     private static final int CMD_START_WPS_PIN_FROM_DEVICE        = 91;
+
     /**
      * Interval in milliseconds between polling for connection
      * status items that are not sent via asynchronous events.
@@ -831,42 +831,17 @@
     }
 
     /**
-     * Set the number of allowed radio frequency channels from the system
-     * setting value, if any.
+     * Set the country code
+     * @param countryCode following ISO 3166 format
+     * @param persist {@code true} if the setting should be remembered.
      */
-    public void setNumAllowedChannels() {
-        try {
-            setNumAllowedChannels(
-                    Settings.Secure.getInt(mContext.getContentResolver(),
-                    Settings.Secure.WIFI_NUM_ALLOWED_CHANNELS));
-        } catch (Settings.SettingNotFoundException e) {
-            if (mNumAllowedChannels != 0) {
-                setNumAllowedChannels(mNumAllowedChannels);
-            }
-            // otherwise, use the driver default
+    public void setCountryCode(String countryCode, boolean persist) {
+        if (persist) {
+            Settings.Secure.putString(mContext.getContentResolver(),
+                    Settings.Secure.WIFI_COUNTRY_CODE,
+                    countryCode);
         }
-    }
-
-    /**
-     * Set the number of radio frequency channels that are allowed to be used
-     * in the current regulatory domain.
-     * @param numChannels the number of allowed channels. Must be greater than 0
-     * and less than or equal to 16.
-     */
-    public void setNumAllowedChannels(int numChannels) {
-        sendMessage(obtainMessage(CMD_SET_NUM_ALLOWED_CHANNELS, numChannels, 0));
-    }
-
-    /**
-     * Get number of allowed channels
-     *
-     * @return channel count, -1 on failure
-     *
-     * TODO: this is not a public API and needs to be removed in favor
-     * of asynchronous reporting. unused for now.
-     */
-    public int getNumAllowedChannels() {
-        return -1;
+        sendMessage(obtainMessage(CMD_SET_COUNTRY_CODE, countryCode));
     }
 
     /**
@@ -957,7 +932,6 @@
         sb.append("mWifiInfo ").append(mWifiInfo).append(LS);
         sb.append("mDhcpInfo ").append(mDhcpInfo).append(LS);
         sb.append("mNetworkInfo ").append(mNetworkInfo).append(LS);
-        sb.append("mNumAllowedChannels ").append(mNumAllowedChannels).append(LS);
         sb.append("mLastSignalLevel ").append(mLastSignalLevel).append(LS);
         sb.append("mLastBssid ").append(mLastBssid).append(LS);
         sb.append("mLastNetworkId ").append(mLastNetworkId).append(LS);
@@ -977,6 +951,19 @@
      * Internal private functions
      ********************************************************/
 
+    /**
+     * Set the country code from the system setting value, if any.
+     */
+    private void setCountryCode() {
+        String countryCode = Settings.Secure.getString(mContext.getContentResolver(),
+                Settings.Secure.WIFI_COUNTRY_CODE);
+        if (countryCode != null && !countryCode.isEmpty()) {
+            setCountryCode(countryCode, false);
+        } else {
+            //use driver default
+        }
+    }
+
     private void setWifiState(int wifiState) {
         final int previousWifiState = mWifiState.get();
 
@@ -1563,7 +1550,7 @@
                 case CMD_SET_HIGH_PERF_MODE:
                 case CMD_SET_BLUETOOTH_COEXISTENCE:
                 case CMD_SET_BLUETOOTH_SCAN_MODE:
-                case CMD_SET_NUM_ALLOWED_CHANNELS:
+                case CMD_SET_COUNTRY_CODE:
                 case CMD_REQUEST_CM_WAKELOCK:
                 case CMD_CONNECT_NETWORK:
                 case CMD_SAVE_NETWORK:
@@ -1665,7 +1652,7 @@
                 case CMD_SET_HIGH_PERF_MODE:
                 case CMD_SET_BLUETOOTH_COEXISTENCE:
                 case CMD_SET_BLUETOOTH_SCAN_MODE:
-                case CMD_SET_NUM_ALLOWED_CHANNELS:
+                case CMD_SET_COUNTRY_CODE:
                 case CMD_START_PACKET_FILTERING:
                 case CMD_STOP_PACKET_FILTERING:
                     deferMessage(message);
@@ -1793,7 +1780,7 @@
                 case CMD_SET_HIGH_PERF_MODE:
                 case CMD_SET_BLUETOOTH_COEXISTENCE:
                 case CMD_SET_BLUETOOTH_SCAN_MODE:
-                case CMD_SET_NUM_ALLOWED_CHANNELS:
+                case CMD_SET_COUNTRY_CODE:
                 case CMD_START_PACKET_FILTERING:
                 case CMD_STOP_PACKET_FILTERING:
                     deferMessage(message);
@@ -1890,7 +1877,7 @@
                 case CMD_SET_HIGH_PERF_MODE:
                 case CMD_SET_BLUETOOTH_COEXISTENCE:
                 case CMD_SET_BLUETOOTH_SCAN_MODE:
-                case CMD_SET_NUM_ALLOWED_CHANNELS:
+                case CMD_SET_COUNTRY_CODE:
                 case CMD_START_PACKET_FILTERING:
                 case CMD_STOP_PACKET_FILTERING:
                     deferMessage(message);
@@ -2034,7 +2021,7 @@
                 case CMD_SET_HIGH_PERF_MODE:
                 case CMD_SET_BLUETOOTH_COEXISTENCE:
                 case CMD_SET_BLUETOOTH_SCAN_MODE:
-                case CMD_SET_NUM_ALLOWED_CHANNELS:
+                case CMD_SET_COUNTRY_CODE:
                 case CMD_START_PACKET_FILTERING:
                 case CMD_STOP_PACKET_FILTERING:
                 case CMD_START_SCAN:
@@ -2060,8 +2047,8 @@
             mIsRunning = true;
             updateBatteryWorkSource(null);
 
-            /* Initialize channel count */
-            setNumAllowedChannels();
+            /* set country code */
+            setCountryCode();
 
             if (mIsScanMode) {
                 WifiNative.setScanResultHandlingCommand(SCAN_ONLY_MODE);
@@ -2093,9 +2080,12 @@
                 case CMD_SET_BLUETOOTH_SCAN_MODE:
                     WifiNative.setBluetoothCoexistenceScanModeCommand(message.arg1 == 1);
                     break;
-                case CMD_SET_NUM_ALLOWED_CHANNELS:
-                    mNumAllowedChannels = message.arg1;
-                    WifiNative.setNumAllowedChannelsCommand(message.arg1);
+                case CMD_SET_COUNTRY_CODE:
+                    String country = (String) message.obj;
+                    Log.d(TAG, "set country code " + country);
+                    if (!WifiNative.setCountryCodeCommand(country.toUpperCase())) {
+                        Log.e(TAG, "Failed to set country code " + country);
+                    }
                     break;
                 case CMD_STOP_DRIVER:
                     mWakeLock.acquire();
@@ -2151,7 +2141,7 @@
                 case CMD_SET_HIGH_PERF_MODE:
                 case CMD_SET_BLUETOOTH_COEXISTENCE:
                 case CMD_SET_BLUETOOTH_SCAN_MODE:
-                case CMD_SET_NUM_ALLOWED_CHANNELS:
+                case CMD_SET_COUNTRY_CODE:
                 case CMD_START_PACKET_FILTERING:
                 case CMD_STOP_PACKET_FILTERING:
                 case CMD_START_SCAN: