Merge change 1881 into donut

* changes:
  WifiService: Wifi power management change
diff --git a/services/java/com/android/server/WifiService.java b/services/java/com/android/server/WifiService.java
index 348f0a1..90ab270 100644
--- a/services/java/com/android/server/WifiService.java
+++ b/services/java/com/android/server/WifiService.java
@@ -1449,10 +1449,12 @@
                     Settings.System.getInt(mContext.getContentResolver(),
                                            Settings.System.STAY_ON_WHILE_PLUGGED_IN, 0);
             if (action.equals(Intent.ACTION_SCREEN_ON)) {
+                Log.d(TAG, "ACTION_SCREEN_ON");
                 mAlarmManager.cancel(mIdleIntent);
                 mDeviceIdle = false;
                 mScreenOff = false;
             } else if (action.equals(Intent.ACTION_SCREEN_OFF)) {
+                Log.d(TAG, "ACTION_SCREEN_OFF");
                 mScreenOff = true;
                 /*
                  * Set a timer to put Wi-Fi to sleep, but only if the screen is off
@@ -1461,12 +1463,20 @@
                  * or plugged in to AC).
                  */
                 if (!shouldWifiStayAwake(stayAwakeConditions, mPluggedType)) {
-                    long triggerTime = System.currentTimeMillis() + idleMillis;
-                    mAlarmManager.set(AlarmManager.RTC_WAKEUP, triggerTime, mIdleIntent);
+                    if (!mWifiStateTracker.hasIpAddress()) {
+                        // do not keep Wifi awake when screen is off if Wifi is not fully active
+                        mDeviceIdle = true;
+                        updateWifiState();
+                    } else {
+                        long triggerTime = System.currentTimeMillis() + idleMillis;
+                        Log.d(TAG, "setting ACTION_DEVICE_IDLE timer for " + idleMillis + "ms");
+                        mAlarmManager.set(AlarmManager.RTC_WAKEUP, triggerTime, mIdleIntent);
+                    }
                 }
                 /* we can return now -- there's nothing to do until we get the idle intent back */
                 return;
             } else if (action.equals(ACTION_DEVICE_IDLE)) {
+                Log.d(TAG, "got ACTION_DEVICE_IDLE");
                 mDeviceIdle = true;
             } else if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
                 /*
@@ -1477,9 +1487,11 @@
                  * the already-set timer.
                  */
                 int pluggedType = intent.getIntExtra("plugged", 0);
+                Log.d(TAG, "ACTION_BATTERY_CHANGED pluggedType: " + pluggedType);
                 if (mScreenOff && shouldWifiStayAwake(stayAwakeConditions, mPluggedType) &&
                         !shouldWifiStayAwake(stayAwakeConditions, pluggedType)) {
                     long triggerTime = System.currentTimeMillis() + idleMillis;
+                    Log.d(TAG, "setting ACTION_DEVICE_IDLE timer for " + idleMillis + "ms");
                     mAlarmManager.set(AlarmManager.RTC_WAKEUP, triggerTime, mIdleIntent);
                     mPluggedType = pluggedType;
                     return;
diff --git a/wifi/java/android/net/wifi/WifiStateTracker.java b/wifi/java/android/net/wifi/WifiStateTracker.java
index 64084cf..4073ddc 100644
--- a/wifi/java/android/net/wifi/WifiStateTracker.java
+++ b/wifi/java/android/net/wifi/WifiStateTracker.java
@@ -161,8 +161,8 @@
     private WifiInfo mWifiInfo;
     private List<ScanResult> mScanResults;
     private WifiManager mWM;
-    private boolean mHaveIPAddress;
-    private boolean mObtainingIPAddress;
+    private boolean mHaveIpAddress;
+    private boolean mObtainingIpAddress;
     private boolean mTornDownByConnMgr;
     /**
      * A DISCONNECT event has been received, but processing it
@@ -303,8 +303,8 @@
         
         mWifiInfo = new WifiInfo();
         mWifiMonitor = new WifiMonitor(this);
-        mHaveIPAddress = false;
-        mObtainingIPAddress = false;
+        mHaveIpAddress = false;
+        mObtainingIpAddress = false;
         setTornDownByConnMgr(false);
         mDisconnectPending = false;
         mScanResults = new ArrayList<ScanResult>();
@@ -444,6 +444,14 @@
     }
 
     /**
+     * Report whether the Wi-Fi connection has successfully acquired an IP address.
+     * @return {@code true} if the Wi-Fi connection has been assigned an IP address.
+     */
+    public boolean hasIpAddress() {
+        return mHaveIpAddress;
+    }
+
+    /**
      * Send the tracker a notification that a user-entered password key
      * may be incorrect (i.e., caused authentication to fail).
      */
@@ -724,7 +732,7 @@
                     intent.putExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, true);
                     mContext.sendBroadcast(intent);
                 }
-                if (supplState == SupplicantState.COMPLETED && mHaveIPAddress) {
+                if (supplState == SupplicantState.COMPLETED && mHaveIpAddress) {
                     setDetailedState(DetailedState.CONNECTED);
                 } else {
                     setDetailedState(WifiInfo.getDetailedStateOf(supplState));
@@ -783,8 +791,8 @@
                 }
                 setDetailedState(DetailedState.DISCONNECTED);
                 setSupplicantState(SupplicantState.UNINITIALIZED);
-                mHaveIPAddress = false;
-                mObtainingIPAddress = false;
+                mHaveIpAddress = false;
+                mObtainingIpAddress = false;
                 if (died) {
                     mWM.setWifiEnabled(false);
                 }
@@ -954,7 +962,7 @@
                 }
                 requestConnectionStatus(mWifiInfo);
                 if (!(result.state == DetailedState.CONNECTED &&
-                        (!mHaveIPAddress || mDisconnectPending))) {
+                        (!mHaveIpAddress || mDisconnectPending))) {
                     setDetailedState(result.state);
                 }
 
@@ -983,7 +991,7 @@
                     mLastBssid = result.BSSID;
                     mLastSsid = mWifiInfo.getSSID();
                     mLastNetworkId = result.networkId;
-                    if (mHaveIPAddress) {
+                    if (mHaveIpAddress) {
                         setDetailedState(DetailedState.CONNECTED);
                     } else {
                         setDetailedState(DetailedState.OBTAINING_IPADDR);
@@ -1051,8 +1059,8 @@
                     break;
                 }
                 mReconnectCount = 0;
-                mHaveIPAddress = true;
-                mObtainingIPAddress = false;
+                mHaveIpAddress = true;
+                mObtainingIpAddress = false;
                 mWifiInfo.setIpAddress(mDhcpInfo.ipAddress);
                 mLastSignalLevel = -1; // force update of signal strength
                 if (mNetworkInfo.getDetailedState() != DetailedState.CONNECTED) {
@@ -1078,9 +1086,9 @@
                     // [ 0- 0] Interface configuration succeeded (1) or failed (0)
                     EventLog.writeEvent(EVENTLOG_INTERFACE_CONFIGURATION_STATE_CHANGED, 0);
                 
-                    mHaveIPAddress = false;
+                    mHaveIpAddress = false;
                     mWifiInfo.setIpAddress(0);
-                    mObtainingIPAddress = false;
+                    mObtainingIpAddress = false;
                     synchronized(this) {
                         WifiNative.disconnectCommand();
                     }
@@ -1156,18 +1164,18 @@
         setPollTimer();
         mLastSignalLevel = -1;
         if (!mUseStaticIp) {
-            if (!mHaveIPAddress && !mObtainingIPAddress) {
-                mObtainingIPAddress = true;
+            if (!mHaveIpAddress && !mObtainingIpAddress) {
+                mObtainingIpAddress = true;
                 mDhcpTarget.sendEmptyMessage(EVENT_DHCP_START);
             }
         } else {
             int event;
             if (NetworkUtils.configureInterface(mInterfaceName, mDhcpInfo)) {
-                mHaveIPAddress = true;
+                mHaveIpAddress = true;
                 event = EVENT_INTERFACE_CONFIGURATION_SUCCEEDED;
                 if (LOCAL_LOGD) Log.v(TAG, "Static IP configuration succeeded");
             } else {
-                mHaveIPAddress = false;
+                mHaveIpAddress = false;
                 event = EVENT_INTERFACE_CONFIGURATION_FAILED;
                 if (LOCAL_LOGD) Log.v(TAG, "Static IP configuration failed");
             }
@@ -1200,8 +1208,8 @@
      * using the interface, stopping DHCP, and disabling the interface.
      */
     public void resetInterface() {
-        mHaveIPAddress = false;
-        mObtainingIPAddress = false;
+        mHaveIpAddress = false;
+        mObtainingIpAddress = false;
         mWifiInfo.setIpAddress(0);
 
         /*
@@ -1612,8 +1620,8 @@
         }
         sb.append(LS).append(mWifiInfo).append(LS);
         sb.append(mDhcpInfo).append(LS);
-        sb.append("haveIpAddress=").append(mHaveIPAddress).
-                append(", obtainingIpAddress=").append(mObtainingIPAddress).
+        sb.append("haveIpAddress=").append(mHaveIpAddress).
+                append(", obtainingIpAddress=").append(mObtainingIpAddress).
                 append(", scanModeActive=").append(mIsScanModeActive).append(LS).
                 append("lastSignalLevel=").append(mLastSignalLevel).
                 append(", explicitlyDisabled=").append(mTornDownByConnMgr);