Merge "Reset BatteryStats when too large for clients to handle" into nyc-mr2-dev
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index a0c2efd..0bb05b5 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -182,7 +182,7 @@
* New in version 19:
* - Wakelock data (wl) gets current and max times.
*/
- static final String CHECKIN_VERSION = "19";
+ static final String CHECKIN_VERSION = "20";
/**
* Old version, we hit 9 and ran out of room, need to remove.
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index 3c0976c..da13a04 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -108,7 +108,7 @@
private static final int MAGIC = 0xBA757475; // 'BATSTATS'
// Current on-disk Parcel version
- private static final int VERSION = 150 + (USE_OLD_HISTORY ? 1000 : 0);
+ private static final int VERSION = 151 + (USE_OLD_HISTORY ? 1000 : 0);
// Maximum number of items we will record in the history.
private static final int MAX_HISTORY_ITEMS = 2000;
@@ -1593,7 +1593,7 @@
@Override
public void writeToParcel(Parcel out, long elapsedRealtimeUs) {
super.writeToParcel(out, elapsedRealtimeUs);
- out.writeLong(mMaxDurationMs);
+ out.writeLong(getMaxDurationMsLocked(elapsedRealtimeUs / 1000));
}
/**
@@ -1606,7 +1606,7 @@
@Override
public void writeSummaryFromParcelLocked(Parcel out, long elapsedRealtimeUs) {
super.writeSummaryFromParcelLocked(out, elapsedRealtimeUs);
- out.writeLong(mMaxDurationMs);
+ out.writeLong(getMaxDurationMsLocked(elapsedRealtimeUs / 1000));
}
/**
@@ -1630,7 +1630,7 @@
public void onTimeStarted(long elapsedRealtimeUs, long baseUptime, long baseRealtime) {
super.onTimeStarted(elapsedRealtimeUs, baseUptime, baseRealtime);
if (mNesting > 0) {
- mStartTimeMs = mTimeBase.getRealtime(mClocks.elapsedRealtime()*1000) / 1000;
+ mStartTimeMs = baseRealtime / 1000;
}
}
@@ -1640,10 +1640,11 @@
* If the timer is running, add the duration into mCurrentDurationMs.
*/
@Override
- public void onTimeStopped(long elapsedRealtimeUs, long baseUptime, long baseRealtime) {
- super.onTimeStopped(elapsedRealtimeUs, baseUptime, baseRealtime);
+ public void onTimeStopped(long elapsedRealtimeUs, long baseUptime, long baseRealtimeUs) {
+ super.onTimeStopped(elapsedRealtimeUs, baseUptime, baseRealtimeUs);
if (mNesting > 0) {
- mCurrentDurationMs += (elapsedRealtimeUs / 1000) - mStartTimeMs;
+ // baseRealtimeUs has already been converted to the timebase's realtime.
+ mCurrentDurationMs += (baseRealtimeUs / 1000) - mStartTimeMs;
}
mStartTimeMs = -1;
}
@@ -1658,7 +1659,7 @@
super.startRunningLocked(elapsedRealtimeMs);
if (mNesting == 1 && mTimeBase.isRunning()) {
// Just started
- mStartTimeMs = mTimeBase.getRealtime(mClocks.elapsedRealtime()*1000) / 1000;
+ mStartTimeMs = mTimeBase.getRealtime(elapsedRealtimeMs * 1000) / 1000;
}
}
@@ -1670,8 +1671,7 @@
*/
@Override
public void stopRunningLocked(long elapsedRealtimeMs) {
- super.stopRunningLocked(elapsedRealtimeMs);
- if (mNesting == 0) {
+ if (mNesting == 1) {
final long durationMs = getCurrentDurationMsLocked(elapsedRealtimeMs);
if (durationMs > mMaxDurationMs) {
mMaxDurationMs = durationMs;
@@ -1679,6 +1679,9 @@
mStartTimeMs = -1;
mCurrentDurationMs = 0;
}
+ // super method decrements mNesting, which getCurrentDurationMsLocked relies on,
+ // so call super.stopRunningLocked after calling getCurrentDurationMsLocked.
+ super.stopRunningLocked(elapsedRealtimeMs);
}
@Override
@@ -1720,11 +1723,9 @@
@Override
public long getCurrentDurationMsLocked(long elapsedRealtimeMs) {
long durationMs = mCurrentDurationMs;
- if (mNesting > 0) {
- if (mTimeBase.isRunning()) {
- durationMs += (mTimeBase.getRealtime(elapsedRealtimeMs*1000)/1000)
- - mStartTimeMs;
- }
+ if (mNesting > 0 && mTimeBase.isRunning()) {
+ durationMs += (mTimeBase.getRealtime(elapsedRealtimeMs*1000)/1000)
+ - mStartTimeMs;
}
return durationMs;
}
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 1c06cc8..ebfb837 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -2620,6 +2620,9 @@
<!-- Component that is the default launcher when demo mode is enabled. -->
<string name="config_demoModeLauncherComponent">com.android.retaildemo/.DemoPlayer</string>
+ <!-- Hashed password (SHA-256) used to restrict demo mode operation -->
+ <string name="config_demoModePassword" translatable="false"></string>
+
<!-- Flag indicating whether round icons should be parsed from the application manifest. -->
<bool name="config_useRoundIcon">false</bool>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 5ae03a9..edd8b78 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -202,6 +202,12 @@
<!-- Displayed to tell the user that all service is blocked by access control. -->
<string name="RestrictedOnAll">All voice/data/SMS services are blocked.</string>
+ <!-- Displayed to tell the user that they should switch their network preference. -->
+ <string name="NetworkPreferenceSwitchTitle">Can\u2019t reach network</string>
+ <!-- Displayed to tell the user that they should switch their network preference. -->
+ <string name="NetworkPreferenceSwitchSummary">To improve reception, try changing the type selected at Settings > Cellular networks > Preferred network type."</string>
+
+
<!-- Displayed to tell the user that peer changed TTY mode -->
<string name="peerTtyModeFull">Peer requested TTY Mode FULL</string>
<string name="peerTtyModeHco">Peer requested TTY Mode HCO</string>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 225a20a..86eea99 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -486,6 +486,8 @@
<java-symbol type="string" name="RestrictedOnData" />
<java-symbol type="string" name="RestrictedOnEmergency" />
<java-symbol type="string" name="RestrictedOnNormal" />
+ <java-symbol type="string" name="NetworkPreferenceSwitchSummary" />
+ <java-symbol type="string" name="NetworkPreferenceSwitchTitle" />
<java-symbol type="string" name="SetupCallDefault" />
<java-symbol type="string" name="accept" />
<java-symbol type="string" name="accessibility_enabled" />
@@ -1113,6 +1115,7 @@
<java-symbol type="string" name="config_ethernet_tcp_buffers" />
<java-symbol type="string" name="config_wifi_tcp_buffers" />
<java-symbol type="string" name="config_demoModeLauncherComponent" />
+ <java-symbol type="string" name="config_demoModePassword" />
<java-symbol type="string" name="demo_starting_message" />
<java-symbol type="string" name="demo_restarting_message" />
<java-symbol type="string" name="conference_call" />
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsDurationTimerTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsDurationTimerTest.java
index a15e367..f1aeecc 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsDurationTimerTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsDurationTimerTest.java
@@ -18,12 +18,9 @@
import android.os.BatteryStats;
import android.os.Parcel;
import android.support.test.filters.SmallTest;
-import android.util.Log;
import junit.framework.TestCase;
-import org.mockito.Mockito;
-
/**
* Test BatteryStatsImpl.DurationTimer.
*
@@ -39,7 +36,7 @@
final BatteryStatsImpl.TimeBase timeBase = new BatteryStatsImpl.TimeBase();
timeBase.init(clocks.uptimeMillis(), clocks.elapsedRealtime());
- final BatteryStatsImpl.DurationTimer timer = new BatteryStatsImpl.DurationTimer(clocks,
+ final BatteryStatsImpl.DurationTimer timer = new BatteryStatsImpl.DurationTimer(clocks,
null, BatteryStats.WAKE_TYPE_PARTIAL, null, timeBase);
// TimeBase running, timer not running: current and max are 0
@@ -82,15 +79,15 @@
// Stop the TimeBase. The values should be frozen.
timeBase.setRunning(false, /* uptimeUs */ 10, /* realtimeUs */ 55000*1000);
assertTrue(timer.isRunningLocked());
- assertEquals(28100, timer.getCurrentDurationMsLocked(110100)); // Why 28100 and not 28000?
- assertEquals(28100, timer.getMaxDurationMsLocked(110101));
+ assertEquals(28000, timer.getCurrentDurationMsLocked(110100));
+ assertEquals(28000, timer.getMaxDurationMsLocked(110101));
// Start the TimeBase. The values should be the old value plus the delta
// between when the timer restarted and the current time
timeBase.setRunning(true, /* uptimeUs */ 10, /* realtimeUs */ 220100*1000);
assertTrue(timer.isRunningLocked());
- assertEquals(28300, timer.getCurrentDurationMsLocked(220300)); // extra 100 from above??
- assertEquals(28301, timer.getMaxDurationMsLocked(220301));
+ assertEquals(28200, timer.getCurrentDurationMsLocked(220300));
+ assertEquals(28201, timer.getMaxDurationMsLocked(220301));
}
@SmallTest
@@ -104,7 +101,7 @@
final BatteryStatsImpl.TimeBase timeBase = new BatteryStatsImpl.TimeBase();
timeBase.init(clocks.uptimeMillis(), clocks.elapsedRealtime());
- final BatteryStatsImpl.DurationTimer timer = new BatteryStatsImpl.DurationTimer(clocks,
+ final BatteryStatsImpl.DurationTimer timer = new BatteryStatsImpl.DurationTimer(clocks,
null, BatteryStats.WAKE_TYPE_PARTIAL, null, timeBase);
// Start running on battery.
@@ -124,7 +121,7 @@
summaryParcel.setDataPosition(0);
// Read summary
- final BatteryStatsImpl.DurationTimer summary = new BatteryStatsImpl.DurationTimer(clocks,
+ final BatteryStatsImpl.DurationTimer summary = new BatteryStatsImpl.DurationTimer(clocks,
null, BatteryStats.WAKE_TYPE_PARTIAL, null, timeBase);
summary.startRunningLocked(3100);
summary.readSummaryFromParcelLocked(summaryParcel);
@@ -138,9 +135,9 @@
final Parcel fullParcel = Parcel.obtain();
timer.writeToParcel(fullParcel, 1500*1000);
fullParcel.setDataPosition(0);
-
+
// Read full - Should be the same as the summary as far as DurationTimer is concerned.
- final BatteryStatsImpl.DurationTimer full = new BatteryStatsImpl.DurationTimer(clocks,
+ final BatteryStatsImpl.DurationTimer full = new BatteryStatsImpl.DurationTimer(clocks,
null, BatteryStats.WAKE_TYPE_PARTIAL, null, timeBase, fullParcel);
// The new one shouldn't be running, and therefore 0 for current time
assertFalse(full.isRunningLocked());
diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java
index 9eceeac..c965067 100644
--- a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java
+++ b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java
@@ -31,6 +31,7 @@
import com.android.internal.app.AssistUtils;
import com.android.internal.app.IVoiceInteractionSessionListener;
import com.android.internal.app.IVoiceInteractionSessionShowCallback;
+import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.R;
import com.android.systemui.statusbar.BaseStatusBar;
import com.android.systemui.statusbar.CommandQueue;
@@ -282,7 +283,7 @@
@Nullable
private ComponentName getAssistInfo() {
- return mAssistUtils.getAssistComponentForUser(UserHandle.USER_CURRENT);
+ return mAssistUtils.getAssistComponentForUser(KeyguardUpdateMonitor.getCurrentUser());
}
public void showDisclosure() {
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingLog.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingLog.java
index 1338d9d..71ddba5 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingLog.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingLog.java
@@ -84,6 +84,11 @@
log("I", tag, s);
}
+ public static void wLogcat(String tag, String s) {
+ Log.w(TAG, tag + "\t" + s);
+ log("W", tag, s);
+ }
+
public static void w(String tag, String s) {
if (LOGCAT) {
Log.w(TAG, tag + "\t" + s);
@@ -133,7 +138,7 @@
pw.println();
}
- public static synchronized void wtf(String tag, String s) {
+ public static synchronized void wtf(String tag, String s, Throwable here) {
if (!ENABLED) {
return;
}
@@ -161,6 +166,6 @@
Log.e(TAG, "Unable to write log, build must be debuggable.");
}
- Log.wtf(TAG, tag + " " + s + "; " + fileMessage);
+ Log.wtf(TAG, tag + " " + s + "; " + fileMessage, here);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManager.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManager.java
index 8fc555f..1abea37 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManager.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManager.java
@@ -71,6 +71,7 @@
private boolean mSessionActive = false;
private int mState = StatusBarState.SHADE;
private boolean mScreenOn;
+ private Runnable mPendingWtf;
protected final ContentObserver mSettingsObserver = new ContentObserver(mHandler) {
@Override
@@ -136,6 +137,7 @@
private void onSessionStart() {
if (FalsingLog.ENABLED) {
FalsingLog.i("onSessionStart", "classifierEnabled=" + isClassiferEnabled());
+ clearPendingWtf();
}
mBouncerOn = false;
mSessionActive = true;
@@ -172,13 +174,35 @@
if (FalsingLog.ENABLED) {
// We're getting some false wtfs from touches that happen after the device went
// to sleep. Only report missing sessions that happen when the device is interactive.
- if (!mSessionActive && mContext.getSystemService(PowerManager.class).isInteractive()) {
- FalsingLog.wtf("isFalseTouch", new StringBuilder()
+ if (!mSessionActive && mContext.getSystemService(PowerManager.class).isInteractive()
+ && mPendingWtf == null) {
+ int enabled = isEnabled() ? 1 : 0;
+ int screenOn = mScreenOn ? 1 : 0;
+ String state = StatusBarState.toShortString(mState);
+ Throwable here = new Throwable("here");
+ FalsingLog.wLogcat("isFalseTouch", new StringBuilder()
.append("Session is not active, yet there's a query for a false touch.")
- .append(" enabled=").append(isEnabled() ? 1 : 0)
- .append(" mScreenOn=").append(mScreenOn ? 1 : 0)
- .append(" mState=").append(StatusBarState.toShortString(mState))
+ .append(" enabled=").append(enabled)
+ .append(" mScreenOn=").append(screenOn)
+ .append(" mState=").append(state)
+ .append(". Escalating to WTF if screen does not turn on soon.")
.toString());
+
+ // Unfortunately we're also getting false positives for touches that happen right
+ // after the screen turns on, but before that notification has made it to us.
+ // Unfortunately there's no good way to catch that, except to wait and see if we get
+ // the screen on notification soon.
+ mPendingWtf = () -> FalsingLog.wtf("isFalseTouch", new StringBuilder()
+ .append("Session did not become active after query for a false touch.")
+ .append(" enabled=").append(enabled)
+ .append('/').append(isEnabled() ? 1 : 0)
+ .append(" mScreenOn=").append(screenOn)
+ .append('/').append(mScreenOn ? 1 : 0)
+ .append(" mState=").append(state)
+ .append('/').append(StatusBarState.toShortString(mState))
+ .append(". Look for warnings ~1000ms earlier to see root cause.")
+ .toString(), here);
+ mHandler.postDelayed(mPendingWtf, 1000);
}
}
if (mAccessibilityManager.isTouchExplorationEnabled()) {
@@ -189,6 +213,13 @@
return mHumanInteractionClassifier.isFalseTouch();
}
+ private void clearPendingWtf() {
+ if (mPendingWtf != null) {
+ mHandler.removeCallbacks(mPendingWtf);
+ mPendingWtf = null;
+ }
+ }
+
@Override
public synchronized void onSensorChanged(SensorEvent event) {
mDataCollector.onSensorChanged(event);
@@ -224,6 +255,7 @@
FalsingLog.i("onScreenTurningOn", new StringBuilder()
.append("from=").append(mScreenOn ? 1 : 0)
.toString());
+ clearPendingWtf();
}
mScreenOn = true;
if (sessionEntrypoint()) {
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index d00783e..b68af43 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -1547,6 +1547,7 @@
static final int NOTIFY_FORCED_RESIZABLE_MSG = 67;
static final int NOTIFY_ACTIVITY_DISMISSING_DOCKED_STACK_MSG = 68;
static final int SHOW_UNSUPPORTED_DISPLAY_SIZE_DIALOG_MSG = 69;
+ static final int NOTIFY_VR_SLEEPING_MSG = 70;
static final int FIRST_ACTIVITY_STACK_MSG = 100;
static final int FIRST_BROADCAST_QUEUE_MSG = 200;
@@ -2362,6 +2363,8 @@
}
}
vrService.setVrMode(vrMode, requestedPackage, userId, callingPackage);
+ } case NOTIFY_VR_SLEEPING_MSG: {
+ notifyVrManagerOfSleepState(msg.arg1 != 0);
} break;
}
}
@@ -3164,6 +3167,11 @@
mHandler.obtainMessage(VR_MODE_CHANGE_MSG, 0, 0, r));
}
+ private void sendNotifyVrManagerOfSleepState(boolean isSleeping) {
+ mHandler.sendMessage(
+ mHandler.obtainMessage(NOTIFY_VR_SLEEPING_MSG, isSleeping ? 1 : 0, 0));
+ }
+
private void notifyVrManagerOfSleepState(boolean isSleeping) {
final VrManagerInternal vrService = LocalServices.getService(VrManagerInternal.class);
if (vrService == null) {
@@ -11690,7 +11698,7 @@
startTimeTrackingFocusedActivityLocked();
mTopProcessState = ActivityManager.PROCESS_STATE_TOP;
mStackSupervisor.comeOutOfSleepIfNeededLocked();
- notifyVrManagerOfSleepState(false);
+ sendNotifyVrManagerOfSleepState(false);
updateOomAdjLocked();
} else if (!mSleeping && shouldSleepLocked()) {
mSleeping = true;
@@ -11699,7 +11707,7 @@
}
mTopProcessState = ActivityManager.PROCESS_STATE_TOP_SLEEPING;
mStackSupervisor.goingToSleepLocked();
- notifyVrManagerOfSleepState(true);
+ sendNotifyVrManagerOfSleepState(true);
updateOomAdjLocked();
// Initialize the wake times of all processes.
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index 8006284..a240bb1 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -1036,6 +1036,17 @@
public static final String KEY_PREF_NETWORK_NOTIFICATION_DELAY_INT =
"network_notification_delay_int";
+ /**
+ * Determine whether user edited tether APN (type dun) has effect
+ * {@code false} - Default. APN with dun type in telephony database has no effect.
+ *
+ * {@code true} - DUN APN added/edited in ApnEditor will be used for tethering data call.
+ *
+ * @hide
+ */
+ public static final String KEY_EDITABLE_TETHER_APN_BOOL =
+ "editable_tether_apn_bool";
+
/** The default value for every variable. */
private final static PersistableBundle sDefaults;
@@ -1217,6 +1228,7 @@
sDefaults.putBoolean(KEY_STK_DISABLE_LAUNCH_BROWSER_BOOL, false);
sDefaults.putStringArray(KEY_CARRIER_WIFI_STRING_ARRAY, null);
sDefaults.putInt(KEY_PREF_NETWORK_NOTIFICATION_DELAY_INT, -1);
+ sDefaults.putBoolean(KEY_EDITABLE_TETHER_APN_BOOL, false);
}
/**