am d2127c43: Handle DHCP renewal and wakeup in framework

* commit 'd2127c438fc858a4f6c8ad75b7a1e4491da69a78':
  Handle DHCP renewal and wakeup in framework
This commit is contained in:
Irfan Sheriff
2011-04-26 01:01:31 -07:00
committed by Android Git Automerger

View File

@@ -23,6 +23,18 @@ import static android.net.wifi.WifiManager.WIFI_STATE_ENABLING;
import static android.net.wifi.WifiManager.WIFI_STATE_UNKNOWN; import static android.net.wifi.WifiManager.WIFI_STATE_UNKNOWN;
import android.app.ActivityManagerNative; import android.app.ActivityManagerNative;
import android.app.AlarmManager;
import android.app.Notification;
import android.app.PendingIntent;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothHeadset;
import android.bluetooth.BluetoothA2dp;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.ContentObserver;
import android.net.NetworkInfo; import android.net.NetworkInfo;
import android.net.NetworkStateTracker; import android.net.NetworkStateTracker;
import android.net.DhcpInfo; import android.net.DhcpInfo;
@@ -32,8 +44,10 @@ import android.net.NetworkInfo.DetailedState;
import android.net.NetworkInfo.State; import android.net.NetworkInfo.State;
import android.os.Message; import android.os.Message;
import android.os.Parcelable; import android.os.Parcelable;
import android.os.PowerManager;
import android.os.Handler; import android.os.Handler;
import android.os.HandlerThread; import android.os.HandlerThread;
import android.os.SystemClock;
import android.os.SystemProperties; import android.os.SystemProperties;
import android.os.Looper; import android.os.Looper;
import android.os.RemoteException; import android.os.RemoteException;
@@ -44,15 +58,6 @@ import android.text.TextUtils;
import android.util.EventLog; import android.util.EventLog;
import android.util.Log; import android.util.Log;
import android.util.Config; import android.util.Config;
import android.app.Notification;
import android.app.PendingIntent;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothHeadset;
import android.bluetooth.BluetoothA2dp;
import android.content.ContentResolver;
import android.content.Intent;
import android.content.Context;
import android.database.ContentObserver;
import com.android.internal.app.IBatteryStats; import com.android.internal.app.IBatteryStats;
import java.net.UnknownHostException; import java.net.UnknownHostException;
@@ -91,15 +96,16 @@ public class WifiStateTracker extends NetworkStateTracker {
private static final int EVENT_INTERFACE_CONFIGURATION_FAILED = 7; private static final int EVENT_INTERFACE_CONFIGURATION_FAILED = 7;
private static final int EVENT_POLL_INTERVAL = 8; private static final int EVENT_POLL_INTERVAL = 8;
private static final int EVENT_DHCP_START = 9; private static final int EVENT_DHCP_START = 9;
private static final int EVENT_DEFERRED_DISCONNECT = 10; private static final int EVENT_DHCP_RENEW = 10;
private static final int EVENT_DEFERRED_RECONNECT = 11; private static final int EVENT_DEFERRED_DISCONNECT = 11;
private static final int EVENT_DEFERRED_RECONNECT = 12;
/** /**
* The driver is started or stopped. The object will be the state: true for * The driver is started or stopped. The object will be the state: true for
* started, false for stopped. * started, false for stopped.
*/ */
private static final int EVENT_DRIVER_STATE_CHANGED = 12; private static final int EVENT_DRIVER_STATE_CHANGED = 13;
private static final int EVENT_PASSWORD_KEY_MAY_BE_INCORRECT = 13; private static final int EVENT_PASSWORD_KEY_MAY_BE_INCORRECT = 14;
private static final int EVENT_MAYBE_START_SCAN_POST_DISCONNECT = 14; private static final int EVENT_MAYBE_START_SCAN_POST_DISCONNECT = 15;
/** /**
* The driver state indication. * The driver state indication.
@@ -218,6 +224,15 @@ public class WifiStateTracker extends NetworkStateTracker {
private boolean mUseStaticIp = false; private boolean mUseStaticIp = false;
private int mReconnectCount; private int mReconnectCount;
private AlarmManager mAlarmManager;
private PendingIntent mDhcpRenewalIntent;
private PowerManager.WakeLock mDhcpRenewWakeLock;
private static final String WAKELOCK_TAG = "*wifi*";
private static final int DHCP_RENEW = 0;
private static final String ACTION_DHCP_RENEW = "android.net.wifi.DHCP_RENEW";
/* Tracks if any network in the configuration is disabled */ /* Tracks if any network in the configuration is disabled */
private AtomicBoolean mIsAnyNetworkDisabled = new AtomicBoolean(false); private AtomicBoolean mIsAnyNetworkDisabled = new AtomicBoolean(false);
@@ -386,6 +401,27 @@ public class WifiStateTracker extends NetworkStateTracker {
mDhcpInfo = new DhcpInfo(); mDhcpInfo = new DhcpInfo();
mRunState = RUN_STATE_STARTING; mRunState = RUN_STATE_STARTING;
mAlarmManager = (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE);
Intent dhcpRenewalIntent = new Intent(ACTION_DHCP_RENEW, null);
mDhcpRenewalIntent = PendingIntent.getBroadcast(mContext, DHCP_RENEW, dhcpRenewalIntent, 0);
mContext.registerReceiver(
new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//DHCP renew
if (mDhcpTarget != null) {
Log.d(TAG, "Sending a DHCP renewal");
//acquire a 40s wakelock to finish DHCP renewal
mDhcpRenewWakeLock.acquire(40000);
mDhcpTarget.sendEmptyMessage(EVENT_DHCP_RENEW);
}
}
},new IntentFilter(ACTION_DHCP_RENEW));
PowerManager powerManager = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
mDhcpRenewWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, WAKELOCK_TAG);
// Setting is in seconds // Setting is in seconds
NOTIFICATION_REPEAT_DELAY_MS = Settings.Secure.getInt(context.getContentResolver(), NOTIFICATION_REPEAT_DELAY_MS = Settings.Secure.getInt(context.getContentResolver(),
Settings.Secure.WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY, 900) * 1000l; Settings.Secure.WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY, 900) * 1000l;
@@ -2389,7 +2425,7 @@ public class WifiStateTracker extends NetworkStateTracker {
private class DhcpHandler extends Handler { private class DhcpHandler extends Handler {
private Handler mTarget; private Handler mWifiStateTrackerHandler;
/** /**
* Whether to skip the DHCP result callback to the target. For example, * Whether to skip the DHCP result callback to the target. For example,
@@ -2413,7 +2449,7 @@ public class WifiStateTracker extends NetworkStateTracker {
public DhcpHandler(Looper looper, Handler target) { public DhcpHandler(Looper looper, Handler target) {
super(looper); super(looper);
mTarget = target; mWifiStateTrackerHandler = target;
mBluetoothHeadset = new BluetoothHeadset(mContext, null); mBluetoothHeadset = new BluetoothHeadset(mContext, null);
} }
@@ -2423,7 +2459,7 @@ public class WifiStateTracker extends NetworkStateTracker {
switch (msg.what) { switch (msg.what) {
case EVENT_DHCP_START: case EVENT_DHCP_START:
case EVENT_DHCP_RENEW:
boolean modifiedBluetoothCoexistenceMode = false; boolean modifiedBluetoothCoexistenceMode = false;
int powerMode = DRIVER_POWER_MODE_AUTO; int powerMode = DRIVER_POWER_MODE_AUTO;
@@ -2465,14 +2501,70 @@ public class WifiStateTracker extends NetworkStateTracker {
// A new request is being made, so assume we will callback // A new request is being made, so assume we will callback
mCancelCallback = false; mCancelCallback = false;
} }
Log.d(TAG, "DhcpHandler: DHCP request started");
if (NetworkUtils.runDhcp(mInterfaceName, mDhcpInfo)) { if (msg.what == EVENT_DHCP_START) {
event = EVENT_INTERFACE_CONFIGURATION_SUCCEEDED; Log.d(TAG, "DHCP request started");
if (LOCAL_LOGD) Log.v(TAG, "DhcpHandler: DHCP request succeeded"); if (NetworkUtils.runDhcp(mInterfaceName, mDhcpInfo)) {
} else { event = EVENT_INTERFACE_CONFIGURATION_SUCCEEDED;
event = EVENT_INTERFACE_CONFIGURATION_FAILED; Log.d(TAG, "DHCP succeeded with lease: " + mDhcpInfo.leaseDuration);
Log.i(TAG, "DhcpHandler: DHCP request failed: " + //Do it a bit earlier than half the lease duration time
NetworkUtils.getDhcpError()); //to beat the native DHCP client and avoid extra packets
//48% for one hour lease time = 29 minutes
mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() +
mDhcpInfo.leaseDuration * 480, //in milliseconds
mDhcpRenewalIntent);
} else {
event = EVENT_INTERFACE_CONFIGURATION_FAILED;
Log.e(TAG, "DHCP request failed: " + NetworkUtils.getDhcpError());
}
synchronized (this) {
if (!mCancelCallback) {
mWifiStateTrackerHandler.sendEmptyMessage(event);
}
}
} else if (msg.what == EVENT_DHCP_RENEW) {
Log.d(TAG, "DHCP renewal started");
int oIp = mDhcpInfo.ipAddress;
int oGw = mDhcpInfo.gateway;
int oMsk = mDhcpInfo.netmask;
int oDns1 = mDhcpInfo.dns1;
int oDns2 = mDhcpInfo.dns2;
if (NetworkUtils.runDhcpRenew(mInterfaceName, mDhcpInfo)) {
Log.d(TAG, "DHCP renewal with lease: " + mDhcpInfo.leaseDuration);
boolean changed =
(oIp != mDhcpInfo.ipAddress ||
oGw != mDhcpInfo.gateway ||
oMsk != mDhcpInfo.netmask ||
oDns1 != mDhcpInfo.dns1 ||
oDns2 != mDhcpInfo.dns2);
if (changed) {
Log.d(TAG, "IP config change on renewal");
mWifiInfo.setIpAddress(mDhcpInfo.ipAddress);
NetworkUtils.resetConnections(mInterfaceName);
msg = mTarget.obtainMessage(EVENT_CONFIGURATION_CHANGED,
mNetworkInfo);
msg.sendToTarget();
}
mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() +
mDhcpInfo.leaseDuration * 480,
mDhcpRenewalIntent);
} else {
event = EVENT_INTERFACE_CONFIGURATION_FAILED;
Log.d(TAG, "DHCP renewal failed: " + NetworkUtils.getDhcpError());
synchronized (this) {
if (!mCancelCallback) {
mWifiStateTrackerHandler.sendEmptyMessage(event);
}
}
}
} }
if (powerMode != DRIVER_POWER_MODE_ACTIVE) { if (powerMode != DRIVER_POWER_MODE_ACTIVE) {
@@ -2485,17 +2577,15 @@ public class WifiStateTracker extends NetworkStateTracker {
WifiNative.BLUETOOTH_COEXISTENCE_MODE_SENSE); WifiNative.BLUETOOTH_COEXISTENCE_MODE_SENSE);
} }
synchronized (this) {
if (!mCancelCallback) {
mTarget.sendEmptyMessage(event);
}
}
break; break;
} }
} }
public synchronized void setCancelCallback(boolean cancelCallback) { public synchronized void setCancelCallback(boolean cancelCallback) {
mCancelCallback = cancelCallback; mCancelCallback = cancelCallback;
if (cancelCallback) {
mAlarmManager.cancel(mDhcpRenewalIntent);
}
} }
/** /**
@@ -2511,6 +2601,7 @@ public class WifiStateTracker extends NetworkStateTracker {
int state = mBluetoothHeadset.getState(mBluetoothHeadset.getCurrentHeadset()); int state = mBluetoothHeadset.getState(mBluetoothHeadset.getCurrentHeadset());
return state == BluetoothHeadset.STATE_DISCONNECTED; return state == BluetoothHeadset.STATE_DISCONNECTED;
} }
} }
private void checkUseStaticIp() { private void checkUseStaticIp() {