summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/java/android/os/BatteryStats.java21
-rw-r--r--core/java/com/android/internal/app/IBatteryStats.aidl2
-rw-r--r--core/java/com/android/internal/os/BatteryStatsImpl.java34
-rw-r--r--services/java/com/android/server/WifiService.java30
-rw-r--r--services/java/com/android/server/am/BatteryStatsService.java16
-rw-r--r--wifi/java/android/net/wifi/WifiStateTracker.java26
6 files changed, 104 insertions, 25 deletions
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index 76c74df..d492b6a 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -292,7 +292,7 @@ public abstract class BatteryStats implements Parcelable {
* {@hide}
*/
public abstract long getPhoneOnTime(long batteryRealtime, int which);
-
+
/**
* Returns the time in milliseconds that wifi has been on while the device was
* running on battery.
@@ -300,7 +300,15 @@ public abstract class BatteryStats implements Parcelable {
* {@hide}
*/
public abstract long getWifiOnTime(long batteryRealtime, int which);
-
+
+ /**
+ * Returns the time in milliseconds that wifi has been on and the driver has
+ * been in the running state while the device was running on battery.
+ *
+ * {@hide}
+ */
+ public abstract long getWifiRunningTime(long batteryRealtime, int which);
+
/**
* Returns the time in milliseconds that bluetooth has been on while the device was
* running on battery.
@@ -535,6 +543,7 @@ public abstract class BatteryStats implements Parcelable {
final long screenOnTime = getScreenOnTime(batteryRealtime, which);
final long phoneOnTime = getPhoneOnTime(batteryRealtime, which);
final long wifiOnTime = getWifiOnTime(batteryRealtime, which);
+ final long wifiRunningTime = getWifiRunningTime(batteryRealtime, which);
final long bluetoothOnTime = getBluetoothOnTime(batteryRealtime, which);
StringBuilder sb = new StringBuilder(128);
@@ -549,7 +558,8 @@ public abstract class BatteryStats implements Parcelable {
// Dump misc stats
dumpLine(pw, 0 /* uid */, category, MISC_DATA,
- screenOnTime / 1000, phoneOnTime / 1000, wifiOnTime / 1000, bluetoothOnTime / 1000);
+ screenOnTime / 1000, phoneOnTime / 1000, wifiOnTime / 1000,
+ wifiRunningTime / 1000, bluetoothOnTime / 1000);
if (which == STATS_UNPLUGGED) {
dumpLine(pw, 0 /* uid */, category, BATTERY_DATA, getUnpluggedStartLevel(),
@@ -667,7 +677,7 @@ public abstract class BatteryStats implements Parcelable {
final long rawUptime = SystemClock.uptimeMillis() * 1000;
final long rawRealtime = SystemClock.elapsedRealtime() * 1000;
final long batteryUptime = getBatteryUptime(rawUptime);
- final long batteryRealtime = getBatteryUptime(rawRealtime);
+ final long batteryRealtime = getBatteryRealtime(rawRealtime);
final long whichBatteryUptime = computeBatteryUptime(rawUptime, which);
final long whichBatteryRealtime = computeBatteryRealtime(rawRealtime, which);
@@ -692,6 +702,7 @@ public abstract class BatteryStats implements Parcelable {
final long screenOnTime = getScreenOnTime(batteryRealtime, which);
final long phoneOnTime = getPhoneOnTime(batteryRealtime, which);
+ final long wifiRunningTime = getWifiRunningTime(batteryRealtime, which);
final long wifiOnTime = getWifiOnTime(batteryRealtime, which);
final long bluetoothOnTime = getBluetoothOnTime(batteryRealtime, which);
pw.println(prefix
@@ -701,6 +712,8 @@ public abstract class BatteryStats implements Parcelable {
+ "(" + formatRatioLocked(phoneOnTime, whichBatteryRealtime)
+ "), time with wifi on: " + formatTimeMs(wifiOnTime / 1000)
+ "(" + formatRatioLocked(wifiOnTime, whichBatteryRealtime)
+ + "), time with wifi running: " + formatTimeMs(wifiRunningTime / 1000)
+ + "(" + formatRatioLocked(wifiRunningTime, whichBatteryRealtime)
+ "), time with bluetooth on: " + formatTimeMs(bluetoothOnTime / 1000)
+ "(" + formatRatioLocked(bluetoothOnTime, whichBatteryRealtime)+ ")");
diff --git a/core/java/com/android/internal/app/IBatteryStats.aidl b/core/java/com/android/internal/app/IBatteryStats.aidl
index d259756..e0de421 100644
--- a/core/java/com/android/internal/app/IBatteryStats.aidl
+++ b/core/java/com/android/internal/app/IBatteryStats.aidl
@@ -32,6 +32,8 @@ interface IBatteryStats {
void notePhoneOff();
void noteWifiOn();
void noteWifiOff();
+ void noteWifiRunning();
+ void noteWifiStopped();
void noteBluetoothOn();
void noteBluetoothOff();
void noteFullWifiLockAcquired(int uid);
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index b3ae0d6..38335b5 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -47,7 +47,7 @@ public final class BatteryStatsImpl extends BatteryStats {
private static final int MAGIC = 0xBA757475; // 'BATSTATS'
// Current on-disk Parcel version
- private static final int VERSION = 27;
+ private static final int VERSION = 28;
private final File mFile;
private final File mBackupFile;
@@ -94,6 +94,9 @@ public final class BatteryStatsImpl extends BatteryStats {
boolean mWifiOn;
Timer mWifiOnTimer;
+
+ boolean mWifiRunning;
+ Timer mWifiRunningTimer;
boolean mBluetoothOn;
Timer mBluetoothOnTimer;
@@ -497,6 +500,20 @@ public final class BatteryStatsImpl extends BatteryStats {
}
}
+ public void noteWifiRunningLocked() {
+ if (!mWifiRunning) {
+ mWifiRunning = true;
+ mWifiRunningTimer.startRunningLocked(this);
+ }
+ }
+
+ public void noteWifiStoppedLocked() {
+ if (mWifiRunning) {
+ mWifiRunning = false;
+ mWifiRunningTimer.stopRunningLocked(this);
+ }
+ }
+
public void noteBluetoothOnLocked() {
if (!mBluetoothOn) {
mBluetoothOn = true;
@@ -551,6 +568,10 @@ public final class BatteryStatsImpl extends BatteryStats {
return mWifiOnTimer.getTotalTime(batteryRealtime, which);
}
+ @Override public long getWifiRunningTime(long batteryRealtime, int which) {
+ return mWifiRunningTimer.getTotalTime(batteryRealtime, which);
+ }
+
@Override public long getBluetoothOnTime(long batteryRealtime, int which) {
return mBluetoothOnTimer.getTotalTime(batteryRealtime, which);
}
@@ -1597,7 +1618,8 @@ public final class BatteryStatsImpl extends BatteryStats {
mScreenOnTimer = new Timer(-1, null, mUnpluggables);
mPhoneOnTimer = new Timer(-2, null, mUnpluggables);
mWifiOnTimer = new Timer(-3, null, mUnpluggables);
- mBluetoothOnTimer = new Timer(-4, null, mUnpluggables);
+ mWifiRunningTimer = new Timer(-4, null, mUnpluggables);
+ mBluetoothOnTimer = new Timer(-5, null, mUnpluggables);
mOnBattery = mOnBatteryInternal = false;
mTrackBatteryPastUptime = 0;
mTrackBatteryPastRealtime = 0;
@@ -1935,6 +1957,8 @@ public final class BatteryStatsImpl extends BatteryStats {
mPhoneOnTimer.readSummaryFromParcelLocked(in);
mWifiOn = false;
mWifiOnTimer.readSummaryFromParcelLocked(in);
+ mWifiRunning = false;
+ mWifiRunningTimer.readSummaryFromParcelLocked(in);
mBluetoothOn = false;
mBluetoothOnTimer.readSummaryFromParcelLocked(in);
@@ -2038,6 +2062,7 @@ public final class BatteryStatsImpl extends BatteryStats {
mScreenOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
mPhoneOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
mWifiOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
+ mWifiRunningTimer.writeSummaryFromParcelLocked(out, NOWREAL);
mBluetoothOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
final int NU = mUidStats.size();
@@ -2163,6 +2188,8 @@ public final class BatteryStatsImpl extends BatteryStats {
mPhoneOnTimer = new Timer(-2, null, mUnpluggables, in);
mWifiOn = false;
mWifiOnTimer = new Timer(-2, null, mUnpluggables, in);
+ mWifiRunning = false;
+ mWifiRunningTimer = new Timer(-2, null, mUnpluggables, in);
mBluetoothOn = false;
mBluetoothOnTimer = new Timer(-2, null, mUnpluggables, in);
mUptime = in.readLong();
@@ -2217,6 +2244,7 @@ public final class BatteryStatsImpl extends BatteryStats {
mScreenOnTimer.writeToParcel(out, batteryRealtime);
mPhoneOnTimer.writeToParcel(out, batteryRealtime);
mWifiOnTimer.writeToParcel(out, batteryRealtime);
+ mWifiRunningTimer.writeToParcel(out, batteryRealtime);
mBluetoothOnTimer.writeToParcel(out, batteryRealtime);
out.writeLong(mUptime);
out.writeLong(mUptimeStart);
@@ -2264,6 +2292,8 @@ public final class BatteryStatsImpl extends BatteryStats {
mPhoneOnTimer.logState();
Log.i(TAG, "*** Wifi timer:");
mWifiOnTimer.logState();
+ Log.i(TAG, "*** WifiRunning timer:");
+ mWifiRunningTimer.logState();
Log.i(TAG, "*** Bluetooth timer:");
mBluetoothOnTimer.logState();
}
diff --git a/services/java/com/android/server/WifiService.java b/services/java/com/android/server/WifiService.java
index ddf92e2..6323e2f 100644
--- a/services/java/com/android/server/WifiService.java
+++ b/services/java/com/android/server/WifiService.java
@@ -50,7 +50,6 @@ import android.os.PowerManager;
import android.os.RemoteException;
import android.provider.Settings;
import android.util.Log;
-import android.telephony.TelephonyManager;
import android.text.TextUtils;
import java.util.ArrayList;
@@ -64,7 +63,6 @@ import java.io.FileDescriptor;
import java.io.PrintWriter;
import com.android.internal.app.IBatteryStats;
-import com.android.internal.os.BatteryStatsImpl;
import com.android.server.am.BatteryStatsService;
/**
@@ -1874,24 +1872,26 @@ public class WifiService extends IWifiManager.Stub {
}
private boolean releaseWifiLockLocked(IBinder lock) {
- boolean result;
+ boolean hadLock;
WifiLock wifiLock = mLocks.removeLock(lock);
- result = (wifiLock != null);
-
- int uid = Binder.getCallingUid();
- long ident = Binder.clearCallingIdentity();
- try {
- switch(wifiLock.mLockMode) {
- case (WifiManager.WIFI_MODE_FULL): mBatteryStats.noteFullWifiLockReleased(uid);
- case (WifiManager.WIFI_MODE_SCAN_ONLY): mBatteryStats.noteScanWifiLockReleased(uid);
+ hadLock = (wifiLock != null);
+
+ if (hadLock) {
+ int uid = Binder.getCallingUid();
+ long ident = Binder.clearCallingIdentity();
+ try {
+ switch(wifiLock.mLockMode) {
+ case (WifiManager.WIFI_MODE_FULL): mBatteryStats.noteFullWifiLockReleased(uid);
+ case (WifiManager.WIFI_MODE_SCAN_ONLY): mBatteryStats.noteScanWifiLockReleased(uid);
+ }
+ } catch (RemoteException e) {
+ } finally {
+ Binder.restoreCallingIdentity(ident);
}
- } catch (RemoteException e) {
- } finally {
- Binder.restoreCallingIdentity(ident);
}
updateWifiState();
- return result;
+ return hadLock;
}
}
diff --git a/services/java/com/android/server/am/BatteryStatsService.java b/services/java/com/android/server/am/BatteryStatsService.java
index cc9a0af..ee89c09 100644
--- a/services/java/com/android/server/am/BatteryStatsService.java
+++ b/services/java/com/android/server/am/BatteryStatsService.java
@@ -162,7 +162,21 @@ public final class BatteryStatsService extends IBatteryStats.Stub {
mStats.noteWifiOffLocked();
}
}
-
+
+ public void noteWifiRunning() {
+ enforceCallingPermission();
+ synchronized (mStats) {
+ mStats.noteWifiRunningLocked();
+ }
+ }
+
+ public void noteWifiStopped() {
+ enforceCallingPermission();
+ synchronized (mStats) {
+ mStats.noteWifiStoppedLocked();
+ }
+ }
+
public void noteBluetoothOn() {
enforceCallingPermission();
synchronized (mStats) {
diff --git a/wifi/java/android/net/wifi/WifiStateTracker.java b/wifi/java/android/net/wifi/WifiStateTracker.java
index 452a8fa..f7a9677 100644
--- a/wifi/java/android/net/wifi/WifiStateTracker.java
+++ b/wifi/java/android/net/wifi/WifiStateTracker.java
@@ -30,6 +30,8 @@ import android.os.Handler;
import android.os.HandlerThread;
import android.os.SystemProperties;
import android.os.Looper;
+import android.os.RemoteException;
+import android.os.ServiceManager;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.EventLog;
@@ -43,6 +45,7 @@ import android.content.ContentResolver;
import android.content.Intent;
import android.content.Context;
import android.database.ContentObserver;
+import com.android.internal.app.IBatteryStats;
import java.util.List;
import java.util.ArrayList;
@@ -244,12 +247,12 @@ public class WifiStateTracker extends NetworkStateTracker {
private static final int RUN_STATE_STOPPED = 4;
private int mRunState;
+ private final IBatteryStats mBatteryStats;
+
private boolean mIsScanOnly;
private BluetoothA2dp mBluetoothA2dp;
- private boolean mBluetoothScanMode;
-
private String mInterfaceName;
private static String LS = System.getProperty("line.separator");
@@ -316,6 +319,8 @@ public class WifiStateTracker extends NetworkStateTracker {
"dhcp." + mInterfaceName + ".dns1",
"dhcp." + mInterfaceName + ".dns2"
};
+ mBatteryStats = IBatteryStats.Stub.asInterface(ServiceManager.getService("batteryinfo"));
+
}
/**
@@ -501,7 +506,7 @@ public class WifiStateTracker extends NetworkStateTracker {
* Send the tracker a notification that the Wi-Fi driver has been stopped.
*/
void notifyDriverStopped() {
- mRunState = RUN_STATE_STOPPED;
+ mRunState = RUN_STATE_STOPPED;
// Send a driver stopped message to our handler
Message.obtain(this, EVENT_DRIVER_STATE_CHANGED, 0, 0).sendToTarget();
@@ -530,6 +535,17 @@ public class WifiStateTracker extends NetworkStateTracker {
return mRunState == RUN_STATE_STOPPED || mRunState == RUN_STATE_STOPPING;
}
+ private void noteRunState() {
+ try {
+ if (mRunState == RUN_STATE_RUNNING) {
+ mBatteryStats.noteWifiRunning();
+ } else if (mRunState == RUN_STATE_STOPPED) {
+ mBatteryStats.noteWifiStopped();
+ }
+ } catch (RemoteException ignore) {
+ }
+ }
+
/**
* Set the number of allowed radio frequency channels from the system
* setting value, if any.
@@ -654,6 +670,7 @@ public class WifiStateTracker extends NetworkStateTracker {
switch (msg.what) {
case EVENT_SUPPLICANT_CONNECTION:
mRunState = RUN_STATE_RUNNING;
+ noteRunState();
checkUseStaticIp();
/*
* DHCP requests are blocking, so run them in a separate thread.
@@ -721,6 +738,8 @@ public class WifiStateTracker extends NetworkStateTracker {
break;
case EVENT_SUPPLICANT_DISCONNECT:
+ mRunState = RUN_STATE_STOPPED;
+ noteRunState();
int wifiState = mWM.getWifiState();
boolean died = wifiState != WifiManager.WIFI_STATE_DISABLED &&
wifiState != WifiManager.WIFI_STATE_DISABLING;
@@ -1079,6 +1098,7 @@ public class WifiStateTracker extends NetworkStateTracker {
}
}
}
+ noteRunState();
break;
case EVENT_PASSWORD_KEY_MAY_BE_INCORRECT: