Automated import from //branches/master/...@142348,142348

This commit is contained in:
Dianne Hackborn
2009-03-24 22:40:29 -07:00
committed by The Android Open Source Project
parent 9f4be9572d
commit 4840e143df
6 changed files with 270 additions and 30 deletions

View File

@@ -4,8 +4,6 @@ import java.io.PrintWriter;
import java.util.Formatter;
import java.util.Map;
import com.android.internal.os.BatteryStatsImpl.Timer;
import android.util.Log;
import android.util.Printer;
import android.util.SparseArray;
@@ -92,6 +90,8 @@ public abstract class BatteryStats implements Parcelable {
private static final String BATTERY_DATA = "battery";
private static final String WIFI_LOCK_DATA = "wifilock";
private static final String MISC_DATA = "misc";
private static final String SIGNAL_STRENGTH_DATA = "signal";
private static final String DATA_CONNECTION_DATA = "dataconn";
private final StringBuilder mFormatBuilder = new StringBuilder(8);
private final Formatter mFormatter = new Formatter(mFormatBuilder);
@@ -122,7 +122,7 @@ public abstract class BatteryStats implements Parcelable {
/**
* Temporary for debugging.
*/
public abstract void logState();
public abstract void logState(Printer pw, String prefix);
}
/**
@@ -293,6 +293,48 @@ public abstract class BatteryStats implements Parcelable {
*/
public abstract long getPhoneOnTime(long batteryRealtime, int which);
public static final int SIGNAL_STRENGTH_NONE_OR_UNKNOWN = 0;
public static final int SIGNAL_STRENGTH_POOR = 1;
public static final int SIGNAL_STRENGTH_MODERATE = 2;
public static final int SIGNAL_STRENGTH_GOOD = 3;
public static final int SIGNAL_STRENGTH_GREAT = 4;
static final String[] SIGNAL_STRENGTH_NAMES = {
"none", "poor", "moderate", "good", "great"
};
public static final int NUM_SIGNAL_STRENGTH_BINS = 5;
/**
* Returns the time in milliseconds that the phone has been running with
* the given signal strength.
*
* {@hide}
*/
public abstract long getPhoneSignalStrengthTime(int strengthBin,
long batteryRealtime, int which);
public static final int DATA_CONNECTION_NONE = 0;
public static final int DATA_CONNECTION_GPRS = 1;
public static final int DATA_CONNECTION_EDGE = 2;
public static final int DATA_CONNECTION_UMTS = 3;
public static final int DATA_CONNECTION_OTHER = 4;
static final String[] DATA_CONNECTION_NAMES = {
"none", "gprs", "edge", "umts", "other"
};
public static final int NUM_DATA_CONNECTION_TYPES = 5;
/**
* Returns the time in milliseconds that the phone has been running with
* the given data connection.
*
* {@hide}
*/
public abstract long getPhoneDataConnectionTime(int dataType,
long batteryRealtime, int which);
/**
* Returns the time in milliseconds that wifi has been on while the device was
* running on battery.
@@ -561,6 +603,20 @@ public abstract class BatteryStats implements Parcelable {
screenOnTime / 1000, phoneOnTime / 1000, wifiOnTime / 1000,
wifiRunningTime / 1000, bluetoothOnTime / 1000);
// Dump signal strength stats
Object[] args = new Object[NUM_SIGNAL_STRENGTH_BINS];
for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
args[i] = getPhoneSignalStrengthTime(i, batteryRealtime, which) / 1000;
}
dumpLine(pw, 0 /* uid */, category, SIGNAL_STRENGTH_DATA, args);
// Dump network type stats
args = new Object[NUM_DATA_CONNECTION_TYPES];
for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
args[i] = getPhoneDataConnectionTime(i, batteryRealtime, which) / 1000;
}
dumpLine(pw, 0 /* uid */, category, DATA_CONNECTION_DATA, args);
if (which == STATS_UNPLUGGED) {
dumpLine(pw, 0 /* uid */, category, BATTERY_DATA, getUnpluggedStartLevel(),
getPluggedStartLevel());
@@ -706,17 +762,58 @@ public abstract class BatteryStats implements Parcelable {
final long wifiOnTime = getWifiOnTime(batteryRealtime, which);
final long bluetoothOnTime = getBluetoothOnTime(batteryRealtime, which);
pw.println(prefix
+ " Time with screen on: " + formatTimeMs(screenOnTime / 1000)
+ " Screen on: " + formatTimeMs(screenOnTime / 1000)
+ "(" + formatRatioLocked(screenOnTime, whichBatteryRealtime)
+ "), time with phone on: " + formatTimeMs(phoneOnTime / 1000)
+ "(" + formatRatioLocked(phoneOnTime, whichBatteryRealtime)
+ "), time with wifi on: " + formatTimeMs(wifiOnTime / 1000)
+ "), Phone on: " + formatTimeMs(phoneOnTime / 1000)
+ "(" + formatRatioLocked(phoneOnTime, whichBatteryRealtime));
pw.println(prefix
+ " Wifi on: " + formatTimeMs(wifiOnTime / 1000)
+ "(" + formatRatioLocked(wifiOnTime, whichBatteryRealtime)
+ "), time with wifi running: " + formatTimeMs(wifiRunningTime / 1000)
+ "), Wifi running: " + formatTimeMs(wifiRunningTime / 1000)
+ "(" + formatRatioLocked(wifiRunningTime, whichBatteryRealtime)
+ "), time with bluetooth on: " + formatTimeMs(bluetoothOnTime / 1000)
+ "), Bluetooth on: " + formatTimeMs(bluetoothOnTime / 1000)
+ "(" + formatRatioLocked(bluetoothOnTime, whichBatteryRealtime)+ ")");
sb.setLength(0);
sb.append(" Signal strengths: ");
boolean didOne = false;
for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
final long time = getPhoneSignalStrengthTime(i, batteryRealtime, which);
if (time == 0) {
continue;
}
if (didOne) sb.append(", ");
didOne = true;
sb.append(SIGNAL_STRENGTH_NAMES[i]);
sb.append(" ");
sb.append(formatTimeMs(time/1000));
sb.append("(");
sb.append(formatRatioLocked(time, whichBatteryRealtime));
sb.append(")");
}
if (!didOne) sb.append("No activity");
pw.println(sb.toString());
sb.setLength(0);
sb.append(" Data types: ");
didOne = false;
for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
final long time = getPhoneDataConnectionTime(i, batteryRealtime, which);
if (time == 0) {
continue;
}
if (didOne) sb.append(", ");
didOne = true;
sb.append(DATA_CONNECTION_NAMES[i]);
sb.append(" ");
sb.append(formatTimeMs(time/1000));
sb.append("(");
sb.append(formatRatioLocked(time, whichBatteryRealtime));
sb.append(")");
}
if (!didOne) sb.append("No activity");
pw.println(sb.toString());
pw.println(" ");
if (which == STATS_UNPLUGGED) {

View File

@@ -30,6 +30,8 @@ interface IBatteryStats {
void noteScreenOff();
void notePhoneOn();
void notePhoneOff();
void notePhoneSignalStrength(int asu);
void notePhoneDataConnectionState(int dataType, boolean hasData);
void noteWifiOn();
void noteWifiOff();
void noteWifiRunning();

View File

@@ -22,6 +22,7 @@ import android.os.Parcel;
import android.os.ParcelFormatException;
import android.os.Parcelable;
import android.os.SystemClock;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.util.Printer;
import android.util.SparseArray;
@@ -47,7 +48,7 @@ public final class BatteryStatsImpl extends BatteryStats {
private static final int MAGIC = 0xBA757475; // 'BATSTATS'
// Current on-disk Parcel version
private static final int VERSION = 28;
private static final int VERSION = 29;
private final File mFile;
private final File mBackupFile;
@@ -92,6 +93,12 @@ public final class BatteryStatsImpl extends BatteryStats {
boolean mPhoneOn;
Timer mPhoneOnTimer;
int mPhoneSignalStrengthBin = -1;
final Timer[] mPhoneSignalStrengthsTimer = new Timer[NUM_SIGNAL_STRENGTH_BINS];
int mPhoneDataConnectionType = -1;
final Timer[] mPhoneDataConnectionsTimer = new Timer[NUM_DATA_CONNECTION_TYPES];
boolean mWifiOn;
Timer mWifiOnTimer;
@@ -307,15 +314,15 @@ public final class BatteryStatsImpl extends BatteryStats {
return val;
}
public void logState() {
Log.i("foo", "mNesting=" + mNesting + " mCount=" + mCount
public void logState(Printer pw, String prefix) {
pw.println(prefix + "mNesting=" + mNesting + " mCount=" + mCount
+ " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount
+ " mUnpluggedCount=" + mUnpluggedCount);
Log.i("foo", "mTotalTime=" + mTotalTime
pw.println(prefix + "mTotalTime=" + mTotalTime
+ " mLoadedTime=" + mLoadedTime);
Log.i("foo", "mLastTime=" + mLastTime
pw.println(prefix + "mLastTime=" + mLastTime
+ " mUnpluggedTime=" + mUnpluggedTime);
Log.i("foo", "mUpdateTime=" + mUpdateTime
pw.println(prefix + "mUpdateTime=" + mUpdateTime
+ " mAcquireTime=" + mAcquireTime);
}
@@ -486,6 +493,50 @@ public final class BatteryStatsImpl extends BatteryStats {
}
}
public void notePhoneSignalStrengthLocked(int asu) {
// Bin the strength.
int bin;
if (asu < 0 || asu >= 99) bin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
else if (asu >= 16) bin = SIGNAL_STRENGTH_GREAT;
else if (asu >= 8) bin = SIGNAL_STRENGTH_GOOD;
else if (asu >= 4) bin = SIGNAL_STRENGTH_MODERATE;
else bin = SIGNAL_STRENGTH_POOR;
if (mPhoneSignalStrengthBin != bin) {
if (mPhoneSignalStrengthBin >= 0) {
mPhoneSignalStrengthsTimer[mPhoneSignalStrengthBin].stopRunningLocked(this);
}
mPhoneSignalStrengthBin = bin;
mPhoneSignalStrengthsTimer[bin].startRunningLocked(this);
}
}
public void notePhoneDataConnectionStateLocked(int dataType, boolean hasData) {
int bin = DATA_CONNECTION_NONE;
if (hasData) {
switch (dataType) {
case TelephonyManager.NETWORK_TYPE_EDGE:
bin = DATA_CONNECTION_EDGE;
break;
case TelephonyManager.NETWORK_TYPE_GPRS:
bin = DATA_CONNECTION_GPRS;
break;
case TelephonyManager.NETWORK_TYPE_UMTS:
bin = DATA_CONNECTION_UMTS;
break;
default:
bin = DATA_CONNECTION_OTHER;
break;
}
}
if (mPhoneDataConnectionType != bin) {
if (mPhoneDataConnectionType >= 0) {
mPhoneDataConnectionsTimer[mPhoneDataConnectionType].stopRunningLocked(this);
}
mPhoneDataConnectionType = bin;
mPhoneDataConnectionsTimer[bin].startRunningLocked(this);
}
}
public void noteWifiOnLocked() {
if (!mWifiOn) {
mWifiOn = true;
@@ -564,6 +615,18 @@ public final class BatteryStatsImpl extends BatteryStats {
return mPhoneOnTimer.getTotalTime(batteryRealtime, which);
}
@Override public long getPhoneSignalStrengthTime(int strengthBin,
long batteryRealtime, int which) {
return mPhoneSignalStrengthsTimer[strengthBin].getTotalTime(
batteryRealtime, which);
}
@Override public long getPhoneDataConnectionTime(int dataType,
long batteryRealtime, int which) {
return mPhoneDataConnectionsTimer[dataType].getTotalTime(
batteryRealtime, which);
}
@Override public long getWifiOnTime(long batteryRealtime, int which) {
return mWifiOnTimer.getTotalTime(batteryRealtime, which);
}
@@ -1617,6 +1680,12 @@ public final class BatteryStatsImpl extends BatteryStats {
mStartCount++;
mScreenOnTimer = new Timer(-1, null, mUnpluggables);
mPhoneOnTimer = new Timer(-2, null, mUnpluggables);
for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
mPhoneSignalStrengthsTimer[i] = new Timer(-100-i, null, mUnpluggables);
}
for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
mPhoneDataConnectionsTimer[i] = new Timer(-200-i, null, mUnpluggables);
}
mWifiOnTimer = new Timer(-3, null, mUnpluggables);
mWifiRunningTimer = new Timer(-4, null, mUnpluggables);
mBluetoothOnTimer = new Timer(-5, null, mUnpluggables);
@@ -1955,6 +2024,12 @@ public final class BatteryStatsImpl extends BatteryStats {
mScreenOnTimer.readSummaryFromParcelLocked(in);
mPhoneOn = false;
mPhoneOnTimer.readSummaryFromParcelLocked(in);
for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
mPhoneSignalStrengthsTimer[i].readSummaryFromParcelLocked(in);
}
for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
mPhoneDataConnectionsTimer[i].readSummaryFromParcelLocked(in);
}
mWifiOn = false;
mWifiOnTimer.readSummaryFromParcelLocked(in);
mWifiRunning = false;
@@ -2061,6 +2136,12 @@ public final class BatteryStatsImpl extends BatteryStats {
mScreenOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
mPhoneOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
mPhoneSignalStrengthsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL);
}
for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
mPhoneDataConnectionsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL);
}
mWifiOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
mWifiRunningTimer.writeSummaryFromParcelLocked(out, NOWREAL);
mBluetoothOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
@@ -2186,6 +2267,12 @@ public final class BatteryStatsImpl extends BatteryStats {
mScreenOnTimer = new Timer(-1, null, mUnpluggables, in);
mPhoneOn = false;
mPhoneOnTimer = new Timer(-2, null, mUnpluggables, in);
for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
mPhoneSignalStrengthsTimer[i] = new Timer(-100-i, null, mUnpluggables, in);
}
for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
mPhoneDataConnectionsTimer[i] = new Timer(-200-i, null, mUnpluggables, in);
}
mWifiOn = false;
mWifiOnTimer = new Timer(-2, null, mUnpluggables, in);
mWifiRunning = false;
@@ -2243,6 +2330,12 @@ public final class BatteryStatsImpl extends BatteryStats {
out.writeLong(mBatteryLastRealtime);
mScreenOnTimer.writeToParcel(out, batteryRealtime);
mPhoneOnTimer.writeToParcel(out, batteryRealtime);
for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
mPhoneSignalStrengthsTimer[i].writeToParcel(out, batteryRealtime);
}
for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
mPhoneDataConnectionsTimer[i].writeToParcel(out, batteryRealtime);
}
mWifiOnTimer.writeToParcel(out, batteryRealtime);
mWifiRunningTimer.writeToParcel(out, batteryRealtime);
mBluetoothOnTimer.writeToParcel(out, batteryRealtime);
@@ -2286,16 +2379,24 @@ public final class BatteryStatsImpl extends BatteryStats {
public void dumpLocked(Printer pw) {
if (DEBUG) {
Log.i(TAG, "*** Screen timer:");
mScreenOnTimer.logState();
Log.i(TAG, "*** Phone timer:");
mPhoneOnTimer.logState();
Log.i(TAG, "*** Wifi timer:");
mWifiOnTimer.logState();
Log.i(TAG, "*** WifiRunning timer:");
mWifiRunningTimer.logState();
Log.i(TAG, "*** Bluetooth timer:");
mBluetoothOnTimer.logState();
pw.println("*** Screen timer:");
mScreenOnTimer.logState(pw, " ");
pw.println("*** Phone timer:");
mPhoneOnTimer.logState(pw, " ");
for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
pw.println("*** Signal strength #" + i + ":");
mPhoneSignalStrengthsTimer[i].logState(pw, " ");
}
for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
pw.println("*** Data connection type #" + i + ":");
mPhoneDataConnectionsTimer[i].logState(pw, " ");
}
pw.println("*** Wifi timer:");
mWifiOnTimer.logState(pw, " ");
pw.println("*** WifiRunning timer:");
mWifiRunningTimer.logState(pw, " ");
pw.println("*** Bluetooth timer:");
mBluetoothOnTimer.logState(pw, " ");
}
super.dumpLocked(pw);
}

View File

@@ -440,6 +440,14 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
}
private void broadcastSignalStrengthChanged(int asu) {
long ident = Binder.clearCallingIdentity();
try {
mBatteryStats.notePhoneSignalStrength(asu);
} catch (RemoteException e) {
} finally {
Binder.restoreCallingIdentity(ident);
}
Intent intent = new Intent(TelephonyIntents.ACTION_SIGNAL_STRENGTH_CHANGED);
intent.putExtra(PhoneStateIntentReceiver.INTENT_KEY_ASU, asu);
mContext.sendStickyBroadcast(intent);
@@ -469,6 +477,9 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
private void broadcastDataConnectionStateChanged(int state, boolean isDataConnectivityPossible,
String reason, String apn, String interfaceName) {
// Note: not reporting to the battery stats service here, because the
// status bar takes care of that after taking into account all of the
// required info.
Intent intent = new Intent(TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED);
intent.putExtra(Phone.STATE_KEY, DefaultPhoneNotifier.convertDataState(state).toString());
if (!isDataConnectivityPossible) {

View File

@@ -25,6 +25,7 @@ import android.os.IBinder;
import android.os.Parcel;
import android.os.Process;
import android.os.ServiceManager;
import android.telephony.TelephonyManager;
import android.util.PrintWriterPrinter;
import java.io.FileDescriptor;
@@ -149,6 +150,20 @@ public final class BatteryStatsService extends IBatteryStats.Stub {
}
}
public void notePhoneSignalStrength(int asu) {
enforceCallingPermission();
synchronized (mStats) {
mStats.notePhoneSignalStrengthLocked(asu);
}
}
public void notePhoneDataConnectionState(int dataType, boolean hasData) {
enforceCallingPermission();
synchronized (mStats) {
mStats.notePhoneDataConnectionStateLocked(dataType, hasData);
}
}
public void noteWifiOn() {
enforceCallingPermission();
synchronized (mStats) {

View File

@@ -17,9 +17,11 @@
package com.android.server.status;
import com.android.internal.R;
import com.android.internal.app.IBatteryStats;
import com.android.internal.location.GpsLocationProvider;
import com.android.internal.telephony.SimCard;
import com.android.internal.telephony.TelephonyIntents;
import com.android.server.am.BatteryStatsService;
import android.app.AlertDialog;
import android.bluetooth.BluetoothA2dp;
@@ -38,9 +40,11 @@ import android.graphics.drawable.Drawable;
import android.media.AudioManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiManager;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.RemoteException;
import android.provider.Settings;
import android.telephony.PhoneStateListener;
import android.telephony.ServiceState;
@@ -78,9 +82,10 @@ public class StatusBarPolicy {
private static final int BATTERY_THRESHOLD_WARNING = 1;
private static final int BATTERY_THRESHOLD_EMPTY = 2;
private Context mContext;
private StatusBarService mService;
private Handler mHandler = new StatusBarHandler();
private final Context mContext;
private final StatusBarService mService;
private final Handler mHandler = new StatusBarHandler();
private final IBatteryStats mBatteryStats;
// clock
private Calendar mCalendar;
@@ -144,6 +149,7 @@ public class StatusBarPolicy {
SimCard.State mSimState = SimCard.State.READY;
int mPhoneState = TelephonyManager.CALL_STATE_IDLE;
int mDataState = TelephonyManager.DATA_DISCONNECTED;
int mDataNetType = TelephonyManager.NETWORK_TYPE_UNKNOWN;
int mDataActivity = TelephonyManager.DATA_ACTIVITY_NONE;
ServiceState mServiceState;
int mSignalAsu = -1;
@@ -250,6 +256,7 @@ public class StatusBarPolicy {
private StatusBarPolicy(Context context, StatusBarService service) {
mContext = context;
mService = service;
mBatteryStats = BatteryStatsService.getService();
// clock
mCalendar = Calendar.getInstance(TimeZone.getDefault());
@@ -711,8 +718,8 @@ public class StatusBarPolicy {
}
private final void updateDataNetType() {
int net = mPhone.getNetworkType();
switch (net) {
mDataNetType = mPhone.getNetworkType();
switch (mDataNetType) {
case TelephonyManager.NETWORK_TYPE_EDGE:
mDataIconList = sDataNetType_e;
break;
@@ -766,6 +773,13 @@ public class StatusBarPolicy {
mDataData.iconId = com.android.internal.R.drawable.stat_sys_no_sim;
mService.updateIcon(mDataIcon, mDataData, null);
}
long ident = Binder.clearCallingIdentity();
try {
mBatteryStats.notePhoneDataConnectionState(mDataNetType, visible);
} catch (RemoteException e) {
} finally {
Binder.restoreCallingIdentity(ident);
}
if (mDataIconVisible != visible) {
mService.setIconVisibility(mDataIcon, visible);
mDataIconVisible = visible;