Angler Should Not Use Channel 11 for SoftAP

b/22541346

Change-Id: I300605d8d305214e81803d5d54549e7c3e5bc5bb
diff --git a/service/java/com/android/server/wifi/WifiApConfigStore.java b/service/java/com/android/server/wifi/WifiApConfigStore.java
index c06db02..ed5ddf7 100644
--- a/service/java/com/android/server/wifi/WifiApConfigStore.java
+++ b/service/java/com/android/server/wifi/WifiApConfigStore.java
@@ -37,6 +37,7 @@
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.UUID;
 
 /**
@@ -59,6 +60,7 @@
 
     private WifiConfiguration mWifiApConfig = null;
     private AsyncChannel mReplyChannel = new AsyncChannel();
+    public ArrayList <Integer> allowed2GChannel = null;
 
     WifiApConfigStore(Context context, Handler target) {
         super(TAG, target.getLooper());
@@ -69,6 +71,17 @@
             addState(mActiveState, mDefaultState);
 
         setInitialState(mInactiveState);
+        String ap2GChannelListStr = (mContext.getResources().getString(
+                R.string.config_wifi_framework_sap_2G_channel_list));
+        Log.d(TAG, "2G band allowed channels are:" + ap2GChannelListStr);
+
+        if (ap2GChannelListStr != null) {
+            allowed2GChannel = new ArrayList<Integer>();
+            String channelList[] = ap2GChannelListStr.split(",");
+            for (String tmp : channelList) {
+                allowed2GChannel.add(Integer.parseInt(tmp));
+            }
+        }
     }
 
     public static WifiApConfigStore makeWifiApConfigStore(Context context, Handler target) {
@@ -167,6 +180,7 @@
             if (authType != KeyMgmt.NONE) {
                 config.preSharedKey = in.readUTF();
             }
+
             mWifiApConfig = config;
         } catch (IOException ignore) {
             setDefaultApConfiguration();
diff --git a/service/java/com/android/server/wifi/WifiStateMachine.java b/service/java/com/android/server/wifi/WifiStateMachine.java
index f1d8c3b..c2f6081 100644
--- a/service/java/com/android/server/wifi/WifiStateMachine.java
+++ b/service/java/com/android/server/wifi/WifiStateMachine.java
@@ -193,7 +193,7 @@
     private INetworkManagementService mNwService;
     private ConnectivityManager mCm;
     private WifiLogger mWifiLogger;
-
+    private WifiApConfigStore mWifiApConfigStore;
     private final boolean mP2pSupported;
     private final AtomicBoolean mP2pConnected = new AtomicBoolean(false);
     private boolean mTemporarilyDisconnectWifi = false;
@@ -5110,8 +5110,17 @@
         int[] channel;
 
         if (apBand == 0)  {
-            //for 2.4GHz, we only set the AP at channel 1,6,11
-            apChannel = 5 * mRandom.nextInt(3) + 1;
+            if (mWifiApConfigStore.allowed2GChannel == null ||
+                    mWifiApConfigStore.allowed2GChannel.size() == 0) {
+                //most safe channel to use
+                if(DBG) {
+                    Log.d(TAG, "No specified 2G allowed channel list");
+                }
+                apChannel = 6;
+            } else {
+                int index = mRandom.nextInt(mWifiApConfigStore.allowed2GChannel.size());
+                apChannel = mWifiApConfigStore.allowed2GChannel.get(index).intValue();
+            }
         } else {
             //5G without DFS
             channel = mWifiNative.getChannelsForBand(2);
@@ -5597,11 +5606,11 @@
 
             if (mWifiApConfigChannel == null) {
                 mWifiApConfigChannel = new AsyncChannel();
-                WifiApConfigStore wifiApConfigStore = WifiApConfigStore.makeWifiApConfigStore(
+                mWifiApConfigStore = WifiApConfigStore.makeWifiApConfigStore(
                         mContext, getHandler());
-                wifiApConfigStore.loadApConfiguration();
+                mWifiApConfigStore.loadApConfiguration();
                 mWifiApConfigChannel.connectSync(mContext, getHandler(),
-                        wifiApConfigStore.getMessenger());
+                        mWifiApConfigStore.getMessenger());
             }
 
             if (mWifiConfigStore.enableHalBasedPno.get()) {