OSDN Git Service

DO NOT MERGE Enable all networks on screen on
authorIrfan Sheriff <isheriff@google.com>
Mon, 16 Aug 2010 18:36:41 +0000 (11:36 -0700)
committerIrfan Sheriff <isheriff@google.com>
Fri, 20 Aug 2010 21:51:00 +0000 (14:51 -0700)
Connectivity to a disabled network never happens.
An old dhcp issue for example prevents
connectivity again in future. Allow connectivity
on all networks on screen on.

Bug: 2129037
Change-Id: I42afc17ddb5cd238e46d7e50f1b6e708e107b35d

services/java/com/android/server/WifiService.java
wifi/java/android/net/wifi/WifiStateTracker.java

index af4d7e4..0eca082 100644 (file)
@@ -171,6 +171,7 @@ public class WifiService extends IWifiManager.Stub {
     private static final int MESSAGE_START_ACCESS_POINT = 6;
     private static final int MESSAGE_STOP_ACCESS_POINT  = 7;
     private static final int MESSAGE_SET_CHANNELS       = 8;
+    private static final int MESSAGE_ENABLE_NETWORKS    = 9;
 
 
     private final  WifiHandler mWifiHandler;
@@ -1663,6 +1664,12 @@ public class WifiService extends IWifiManager.Stub {
                 mDeviceIdle = false;
                 mScreenOff = false;
                 mWifiStateTracker.enableRssiPolling(true);
+                /* DHCP or other temporary failures in the past can prevent
+                 * a disabled network from being connected to, enable on screen on
+                 */
+                if (mWifiStateTracker.isAnyNetworkDisabled()) {
+                    sendEnableNetworksMessage();
+                }
             } else if (action.equals(Intent.ACTION_SCREEN_OFF)) {
                 Slog.d(TAG, "ACTION_SCREEN_OFF");
                 mScreenOff = true;
@@ -1794,6 +1801,10 @@ public class WifiService extends IWifiManager.Stub {
                 uid, 0, wifiConfig).sendToTarget();
     }
 
+    private void sendEnableNetworksMessage() {
+        Message.obtain(mWifiHandler, MESSAGE_ENABLE_NETWORKS).sendToTarget();
+    }
+
     private void updateWifiState() {
         // send a message so it's all serialized
         Message.obtain(mWifiHandler, MESSAGE_UPDATE_STATE, 0, 0).sendToTarget();
@@ -1956,6 +1967,10 @@ public class WifiService extends IWifiManager.Stub {
                     setNumAllowedChannelsBlocking(msg.arg1, msg.arg2 == 1);
                     break;
 
+                case MESSAGE_ENABLE_NETWORKS:
+                    mWifiStateTracker.enableAllNetworks(getConfiguredNetworks());
+                    break;
+
             }
         }
     }
index 0cc1f46..22dbda3 100644 (file)
@@ -59,6 +59,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
  * Track the state of Wifi connectivity. All event handling is done here,
@@ -216,6 +217,9 @@ public class WifiStateTracker extends NetworkStateTracker {
     private boolean mUseStaticIp = false;
     private int mReconnectCount;
 
+    /* Tracks if any network in the configuration is disabled */
+    private AtomicBoolean mIsAnyNetworkDisabled = new AtomicBoolean(false);
+
     // used to store the (non-persisted) num determined during device boot 
     // (from mcc or other phone info) before the driver is started.
     private int mNumAllowedChannels = 0;
@@ -814,6 +818,7 @@ public class WifiStateTracker extends NetworkStateTracker {
                 mTornDownByConnMgr = false;
                 mLastBssid = null;
                 mLastSsid = null;
+                mIsAnyNetworkDisabled.set(false);
                 requestConnectionInfo();
                 SupplicantState supplState = mWifiInfo.getSupplicantState();
                 /**
@@ -1585,6 +1590,10 @@ public class WifiStateTracker extends NetworkStateTracker {
         mWifiState.set(wifiState);
     }
 
+    public boolean isAnyNetworkDisabled() {
+        return mIsAnyNetworkDisabled.get();
+    }
+
    /**
      * The WifiNative interface functions are listed below.
      * The only native call that is not synchronized on
@@ -1785,10 +1794,28 @@ public class WifiStateTracker extends NetworkStateTracker {
         if (mWifiState.get() != WIFI_STATE_ENABLED) {
             return false;
         }
+        if (disableOthers) mIsAnyNetworkDisabled.set(true);
         return WifiNative.enableNetworkCommand(netId, disableOthers);
     }
 
     /**
+     * Enable all networks
+     *
+     * @param networks list of configured networks
+     */
+    public synchronized void enableAllNetworks(List<WifiConfiguration> networks) {
+        if (mWifiState.get() != WIFI_STATE_ENABLED) {
+            return;
+        }
+        mIsAnyNetworkDisabled.set(false);
+        for (WifiConfiguration config : networks) {
+            if (config.status == WifiConfiguration.Status.DISABLED) {
+                WifiNative.enableNetworkCommand(config.networkId, false);
+            }
+        }
+    }
+
+    /**
      * Disable a network
      *
      * @param netId network id of the network
@@ -1798,6 +1825,7 @@ public class WifiStateTracker extends NetworkStateTracker {
         if (mWifiState.get() != WIFI_STATE_ENABLED) {
             return false;
         }
+        mIsAnyNetworkDisabled.set(true);
         return WifiNative.disableNetworkCommand(netId);
     }