Merge "WifiManager: get startLOHS packageName" into oc-dev
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index 2de205b..723204f 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -846,8 +846,9 @@
// Calling start activity from outside an activity without FLAG_ACTIVITY_NEW_TASK is
// generally not allowed, except if the caller specifies the task id the activity should
// be launched in.
- if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0
- && options != null && ActivityOptions.fromBundle(options).getLaunchTaskId() == -1) {
+ if ((intent.getFlags() & Intent.FLAG_ACTIVITY_NEW_TASK) == 0
+ && (options == null
+ || ActivityOptions.fromBundle(options).getLaunchTaskId() == -1)) {
throw new AndroidRuntimeException(
"Calling startActivity() from outside of an Activity "
+ " context requires the FLAG_ACTIVITY_NEW_TASK flag."
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index 3eea72d..499d6bb 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -157,6 +157,11 @@
public static final int BLUETOOTH_SCAN_ON = 19;
/**
+ * A constant indicating an aggregated partial wake lock timer.
+ */
+ public static final int AGGREGATED_WAKE_TYPE_PARTIAL = 20;
+
+ /**
* Include all of the data in the stats, including previously saved data.
*/
public static final int STATS_SINCE_CHARGED = 0;
@@ -185,6 +190,7 @@
* - Background timers and counters for: Sensor, BluetoothScan, WifiScan, Jobs, Syncs.
* New in version 21:
* - Actual (not just apportioned) Wakelock time is also recorded.
+ * - Aggregated partial wakelock time (per uid, instead of per wakelock) is recorded.
*/
static final String CHECKIN_VERSION = "21";
@@ -216,6 +222,10 @@
// window totalTime, 'w', count, current duration, max duration, total duration
// [Currently, full and window wakelocks have durations current = max = total = -1]
private static final String WAKELOCK_DATA = "wl";
+ // awl line is:
+ // BATTERY_STATS_CHECKIN_VERSION, uid, which, "awl",
+ // cumulative partial wakelock duration, cumulative background partial wakelock duration
+ private static final String AGGREGATED_WAKELOCK_DATA = "awl";
private static final String SYNC_DATA = "sy";
private static final String JOB_DATA = "jb";
private static final String KERNEL_WAKELOCK_DATA = "kwl";
@@ -485,6 +495,13 @@
}
/**
+ * The cumulative time the uid spent holding any partial wakelocks. This will generally
+ * differ from summing over the Wakelocks in getWakelockStats since the latter may have
+ * wakelocks that overlap in time (and therefore over-counts).
+ */
+ public abstract Timer getAggregatedPartialWakelockTimer();
+
+ /**
* Returns a mapping containing sensor statistics.
*
* @return a Map from Integer sensor ids to Uid.Sensor objects.
@@ -495,7 +512,7 @@
* Returns a mapping containing active process data.
*/
public abstract SparseArray<? extends Pid> getPidStats();
-
+
/**
* Returns a mapping containing process statistics.
*
@@ -609,7 +626,7 @@
static final String[] USER_ACTIVITY_TYPES = {
"other", "button", "touch", "accessibility"
};
-
+
public static final int NUM_USER_ACTIVITY_TYPES = 4;
public abstract void noteUserActivityLocked(int type);
@@ -1259,7 +1276,7 @@
public static final byte CMD_SHUTDOWN = 8;
public byte cmd = CMD_NULL;
-
+
/**
* Return whether the command code is a delta data update.
*/
@@ -1271,13 +1288,13 @@
public byte batteryStatus;
public byte batteryHealth;
public byte batteryPlugType;
-
+
public short batteryTemperature;
public char batteryVoltage;
// The charge of the battery in micro-Ampere-hours.
public int batteryChargeUAh;
-
+
// Constants from SCREEN_BRIGHTNESS_*
public static final int STATE_BRIGHTNESS_SHIFT = 0;
public static final int STATE_BRIGHTNESS_MASK = 0x7;
@@ -1458,13 +1475,13 @@
public HistoryItem() {
}
-
+
public HistoryItem(long time, Parcel src) {
this.time = time;
numReadInts = 2;
readFromParcel(src);
}
-
+
public int describeContents() {
return 0;
}
@@ -1560,7 +1577,7 @@
eventCode = EVENT_NONE;
eventTag = null;
}
-
+
public void setTo(HistoryItem o) {
time = o.time;
cmd = o.cmd;
@@ -1714,7 +1731,7 @@
public final String shortName;
public final String[] values;
public final String[] shortValues;
-
+
public BitDescription(int mask, String name, String shortName) {
this.mask = mask;
this.shift = -1;
@@ -1723,7 +1740,7 @@
this.values = null;
this.shortValues = null;
}
-
+
public BitDescription(int mask, int shift, String name, String shortName,
String[] values, String[] shortValues) {
this.mask = mask;
@@ -1771,20 +1788,20 @@
* Return the base time offset for the battery history.
*/
public abstract long getHistoryBaseTime();
-
+
/**
* Returns the number of times the device has been started.
*/
public abstract int getStartCount();
-
+
/**
* Returns the time in microseconds that the screen has been on while the device was
* running on battery.
- *
+ *
* {@hide}
*/
public abstract long getScreenOnTime(long elapsedRealtimeUs, int which);
-
+
/**
* Returns the number of times the screen was turned on.
*
@@ -1799,11 +1816,11 @@
public static final int SCREEN_BRIGHTNESS_MEDIUM = 2;
public static final int SCREEN_BRIGHTNESS_LIGHT = 3;
public static final int SCREEN_BRIGHTNESS_BRIGHT = 4;
-
+
static final String[] SCREEN_BRIGHTNESS_NAMES = {
"dark", "dim", "medium", "light", "bright"
};
-
+
static final String[] SCREEN_BRIGHTNESS_SHORT_NAMES = {
"0", "1", "2", "3", "4"
};
@@ -1813,7 +1830,7 @@
/**
* Returns the time in microseconds that the screen has been on with
* the given brightness
- *
+ *
* {@hide}
*/
public abstract long getScreenBrightnessTime(int brightnessBin,
@@ -1897,11 +1914,11 @@
/**
* Returns the time in microseconds that the phone has been on while the device was
* running on battery.
- *
+ *
* {@hide}
*/
public abstract long getPhoneOnTime(long elapsedRealtimeUs, int which);
-
+
/**
* Returns the number of times a phone call was activated.
*
@@ -1912,7 +1929,7 @@
/**
* Returns the time in microseconds that the phone has been running with
* the given signal strength.
- *
+ *
* {@hide}
*/
public abstract long getPhoneSignalStrengthTime(int strengthBin,
@@ -1929,7 +1946,7 @@
/**
* Returns the number of times the phone has entered the given signal strength.
- *
+ *
* {@hide}
*/
public abstract int getPhoneSignalStrengthCount(int strengthBin, int which);
@@ -1997,13 +2014,13 @@
"1xrtt", "hsdpa", "hsupa", "hspa", "iden", "evdo_b", "lte",
"ehrpd", "hspap", "other"
};
-
+
public static final int NUM_DATA_CONNECTION_TYPES = DATA_CONNECTION_OTHER+1;
-
+
/**
* Returns the time in microseconds that the phone has been running with
* the given data connection.
- *
+ *
* {@hide}
*/
public abstract long getPhoneDataConnectionTime(int dataType,
@@ -2012,7 +2029,7 @@
/**
* Returns the number of times the phone has entered the given data
* connection type.
- *
+ *
* {@hide}
*/
public abstract int getPhoneDataConnectionCount(int dataType, int which);
@@ -2131,7 +2148,7 @@
/**
* Returns the time in microseconds that wifi has been on while the device was
* running on battery.
- *
+ *
* {@hide}
*/
public abstract long getWifiOnTime(long elapsedRealtimeUs, int which);
@@ -2322,7 +2339,7 @@
* Return whether we are currently running on battery.
*/
public abstract boolean getIsOnBattery();
-
+
/**
* Returns a SparseArray containing the statistics for each uid.
*/
@@ -2341,13 +2358,13 @@
* @param curTime the amount of elapsed realtime in microseconds.
*/
public abstract long getBatteryRealtime(long curTime);
-
+
/**
* Returns the battery percentage level at the last time the device was unplugged from power, or
- * the last time it booted on battery power.
+ * the last time it booted on battery power.
*/
public abstract int getDischargeStartLevel();
-
+
/**
* Returns the current battery percentage level if we are in a discharge cycle, otherwise
* returns the level at the last plug event.
@@ -2643,7 +2660,7 @@
final String formatBytesLocked(long bytes) {
mFormatBuilder.setLength(0);
-
+
if (bytes < BYTES_PER_KB) {
return bytes + "B";
} else if (bytes < BYTES_PER_MB) {
@@ -2773,10 +2790,10 @@
}
return false;
}
-
+
/**
* Checkin version of wakelock printer. Prints simple comma-separated list.
- *
+ *
* @param sb a StringBuilder object.
* @param timer a Timer object contining the wakelock times.
* @param elapsedRealtimeUs the current time in microseconds.
@@ -2831,13 +2848,13 @@
/**
* Dump a comma-separated line of values for terse checkin mode.
- *
+ *
* @param pw the PageWriter to dump log to
* @param category category of data (e.g. "total", "last", "unplugged", "current" )
* @param type type of data (e.g. "wakelock", "sensor", "process", "apk" , "process", "network")
* @param args type-dependent data arguments
*/
- private static final void dumpLine(PrintWriter pw, int uid, String category, String type,
+ private static final void dumpLine(PrintWriter pw, int uid, String category, String type,
Object... args ) {
dumpLineHeader(pw, uid, category, type);
for (Object arg : args) {
@@ -3014,7 +3031,7 @@
/**
* Checkin server version of dump to produce more compact, computer-readable log.
- *
+ *
* NOTE: all times are expressed in 'ms'.
*/
public final void dumpCheckinLocked(Context context, PrintWriter pw, int which, int reqUid,
@@ -3047,10 +3064,10 @@
.getCountLocked(which);
final StringBuilder sb = new StringBuilder(128);
-
+
final SparseArray<? extends Uid> uidStats = getUidStats();
final int NU = uidStats.size();
-
+
final String category = STAT_NAMES[which];
// Dump "battery" stat
@@ -3063,11 +3080,11 @@
getEstimatedBatteryCapacity(),
getMinLearnedBatteryCapacity(), getMaxLearnedBatteryCapacity());
-
+
// Calculate wakelock times across all uids.
long fullWakeLockTimeTotal = 0;
long partialWakeLockTimeTotal = 0;
-
+
for (int iu = 0; iu < NU; iu++) {
final Uid u = uidStats.valueAt(iu);
@@ -3138,14 +3155,14 @@
getDeviceIdlingCount(DEVICE_IDLE_MODE_LIGHT, which),
getLongestDeviceIdleModeTime(DEVICE_IDLE_MODE_LIGHT),
getLongestDeviceIdleModeTime(DEVICE_IDLE_MODE_DEEP));
-
+
// Dump screen brightness stats
Object[] args = new Object[NUM_SCREEN_BRIGHTNESS_BINS];
for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
args[i] = getScreenBrightnessTime(i, rawRealtime, which) / 1000;
}
dumpLine(pw, 0 /* uid */, category, SCREEN_BRIGHTNESS_DATA, args);
-
+
// Dump signal strength stats
args = new Object[SignalStrength.NUM_SIGNAL_STRENGTH_BINS];
for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
@@ -3207,7 +3224,7 @@
dumpLine(pw, 0 /* uid */, category, BATTERY_LEVEL_DATA, getDischargeStartLevel(),
getDischargeCurrentLevel());
}
-
+
if (which == STATS_SINCE_UNPLUGGED) {
dumpLine(pw, 0 /* uid */, category, BATTERY_DISCHARGE_DATA,
getDischargeStartLevel()-getDischargeCurrentLevel(),
@@ -3221,7 +3238,7 @@
getDischargeAmountScreenOffSinceCharge(),
dischargeCount / 1000, dischargeScreenOffCount / 1000);
}
-
+
if (reqUid < 0) {
final Map<String, ? extends Timer> kernelWakelocks = getKernelWakelockStats();
if (kernelWakelocks.size() > 0) {
@@ -3244,7 +3261,7 @@
}
}
}
-
+
final BatteryStatsHelper helper = new BatteryStatsHelper(context, false, wifiOnly);
helper.create(this);
helper.refreshStats(which, UserHandle.USER_ALL);
@@ -3434,7 +3451,17 @@
dumpLine(pw, uid /* uid */, category, USER_ACTIVITY_DATA, args);
}
}
-
+
+ if (u.getAggregatedPartialWakelockTimer() != null) {
+ final Timer timer = u.getAggregatedPartialWakelockTimer();
+ // Convert from microseconds to milliseconds with rounding
+ final long totTimeMs = (timer.getTotalTimeLocked(rawRealtime, which) + 500) / 1000;
+ final Timer bgTimer = timer.getSubTimer();
+ final long bgTimeMs = bgTimer != null ?
+ (bgTimer.getTotalTimeLocked(rawRealtime, which) + 500) / 1000 : 0;
+ dumpLine(pw, uid, category, AGGREGATED_WAKELOCK_DATA, totTimeMs, bgTimeMs);
+ }
+
final ArrayMap<String, ? extends Uid.Wakelock> wakelocks = u.getWakelockStats();
for (int iw=wakelocks.size()-1; iw>=0; iw--) {
final Uid.Wakelock wl = wakelocks.valueAt(iw);
@@ -3666,7 +3693,7 @@
final long chargeTimeRemaining = computeChargeTimeRemaining(rawRealtime);
final StringBuilder sb = new StringBuilder(128);
-
+
final SparseArray<? extends Uid> uidStats = getUidStats();
final int NU = uidStats.size();
@@ -3932,7 +3959,7 @@
}
}
}
-
+
final long mobileRxTotalBytes = getNetworkActivityBytes(NETWORK_MOBILE_RX_DATA, which);
final long mobileTxTotalBytes = getNetworkActivityBytes(NETWORK_MOBILE_TX_DATA, which);
final long wifiRxTotalBytes = getNetworkActivityBytes(NETWORK_WIFI_RX_DATA, which);
@@ -4161,15 +4188,15 @@
if (which == STATS_SINCE_UNPLUGGED) {
if (getIsOnBattery()) {
pw.print(prefix); pw.println(" Device is currently unplugged");
- pw.print(prefix); pw.print(" Discharge cycle start level: ");
+ pw.print(prefix); pw.print(" Discharge cycle start level: ");
pw.println(getDischargeStartLevel());
pw.print(prefix); pw.print(" Discharge cycle current level: ");
pw.println(getDischargeCurrentLevel());
} else {
pw.print(prefix); pw.println(" Device is currently plugged into power");
- pw.print(prefix); pw.print(" Last discharge cycle start level: ");
+ pw.print(prefix); pw.print(" Last discharge cycle start level: ");
pw.println(getDischargeStartLevel());
- pw.print(prefix); pw.print(" Last discharge cycle end level: ");
+ pw.print(prefix); pw.print(" Last discharge cycle end level: ");
pw.println(getDischargeCurrentLevel());
}
pw.print(prefix); pw.print(" Amount discharged while screen on: ");
@@ -4450,7 +4477,7 @@
if (reqUid >= 0 && uid != reqUid && uid != Process.SYSTEM_UID) {
continue;
}
-
+
final Uid u = uidStats.valueAt(iu);
pw.print(prefix);
@@ -4538,7 +4565,7 @@
formatTimeMs(sb, uidWifiRunningTime / 1000);
sb.append("("); sb.append(formatRatioLocked(uidWifiRunningTime,
whichBatteryRealtime)); sb.append(")\n");
- sb.append(prefix); sb.append(" Full Wifi Lock: ");
+ sb.append(prefix); sb.append(" Full Wifi Lock: ");
formatTimeMs(sb, fullWifiLockOnTime / 1000);
sb.append("("); sb.append(formatRatioLocked(fullWifiLockOnTime,
whichBatteryRealtime)); sb.append(")\n");
@@ -4690,8 +4717,23 @@
rawRealtime, which);
}
if (countWakelock > 1) {
- if (totalFullWakelock != 0 || totalPartialWakelock != 0
- || totalWindowWakelock != 0) {
+ // get unpooled partial wakelock quantities (unlike totalPartialWakelock, which is
+ // pooled and therefore just a lower bound)
+ long actualTotalPartialWakelock = 0;
+ long actualBgPartialWakelock = 0;
+ if (u.getAggregatedPartialWakelockTimer() != null) {
+ final Timer aggTimer = u.getAggregatedPartialWakelockTimer();
+ // Convert from microseconds to milliseconds with rounding
+ actualTotalPartialWakelock =
+ (aggTimer.getTotalTimeLocked(rawRealtime, which) + 500) / 1000;
+ final Timer bgAggTimer = aggTimer.getSubTimer();
+ actualBgPartialWakelock = bgAggTimer != null ?
+ (bgAggTimer.getTotalTimeLocked(rawRealtime, which) + 500) / 1000 : 0;
+ }
+
+ if (actualTotalPartialWakelock != 0 || actualBgPartialWakelock != 0 ||
+ totalFullWakelock != 0 || totalPartialWakelock != 0 ||
+ totalWindowWakelock != 0) {
sb.setLength(0);
sb.append(prefix);
sb.append(" TOTAL wake: ");
@@ -4707,7 +4749,23 @@
}
needComma = true;
formatTimeMs(sb, totalPartialWakelock);
- sb.append("partial");
+ sb.append("blamed partial");
+ }
+ if (actualTotalPartialWakelock != 0) {
+ if (needComma) {
+ sb.append(", ");
+ }
+ needComma = true;
+ formatTimeMs(sb, actualTotalPartialWakelock);
+ sb.append("actual partial");
+ }
+ if (actualBgPartialWakelock != 0) {
+ if (needComma) {
+ sb.append(", ");
+ }
+ needComma = true;
+ formatTimeMs(sb, actualBgPartialWakelock);
+ sb.append("actual background partial");
}
if (totalWindowWakelock != 0) {
if (needComma) {
diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java
index 38a5395..0a5e9a8 100644
--- a/core/java/android/os/Parcel.java
+++ b/core/java/android/os/Parcel.java
@@ -429,13 +429,7 @@
* @param size The new number of bytes in the Parcel.
*/
public final void setDataSize(int size) {
- // STOPSHIP: Try/catch for exception is for temporary debug. Remove once bug resolved
- try {
- updateNativeSize(nativeSetDataSize(mNativePtr, size));
- } catch (IllegalArgumentException iae) {
- Log.e(TAG,"Caught Exception representing a known bug in Parcel",iae);
- Log.wtfStack(TAG, "This flow is using SetDataSize incorrectly");
- }
+ updateNativeSize(nativeSetDataSize(mNativePtr, size));
}
/**
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java
index a326327..dc53c22 100644
--- a/core/java/android/view/WindowManagerPolicy.java
+++ b/core/java/android/view/WindowManagerPolicy.java
@@ -1684,4 +1684,16 @@
public void onConfigurationChanged();
public boolean shouldRotateSeamlessly(int oldRotation, int newRotation);
+
+ /**
+ * Called when System UI has been started.
+ */
+ void onSystemUiStarted();
+
+ /**
+ * Checks whether the policy is ready for dismissing the boot animation and completing the boot.
+ *
+ * @return true if ready; false otherwise.
+ */
+ boolean canDismissBootAnimation();
}
diff --git a/core/java/android/view/accessibility/AccessibilityEvent.java b/core/java/android/view/accessibility/AccessibilityEvent.java
index 8a13c0c..eecfdca 100644
--- a/core/java/android/view/accessibility/AccessibilityEvent.java
+++ b/core/java/android/view/accessibility/AccessibilityEvent.java
@@ -618,8 +618,7 @@
public static final int TYPE_WINDOW_CONTENT_CHANGED = 0x00000800;
/**
- * Represents the event of scrolling a view. This event type is generally not sent directly.
- * @see View#onScrollChanged(int, int, int, int)
+ * Represents the event of scrolling a view.
*/
public static final int TYPE_VIEW_SCROLLED = 0x00001000;
diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java
index d456989..7bdd6da 100644
--- a/core/java/android/widget/NumberPicker.java
+++ b/core/java/android/widget/NumberPicker.java
@@ -737,7 +737,6 @@
mInputText.setFilters(new InputFilter[] {
new InputTextFilter()
});
- mInputText.setAccessibilityLiveRegion(View.ACCESSIBILITY_LIVE_REGION_POLITE);
mInputText.setRawInputType(InputType.TYPE_CLASS_NUMBER);
mInputText.setImeOptions(EditorInfo.IME_ACTION_DONE);
@@ -771,12 +770,6 @@
if (getImportantForAccessibility() == IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES);
}
-
- // Should be focusable by default, as the text view whose visibility changes is focusable
- if (getFocusable() == View.FOCUSABLE_AUTO) {
- setFocusable(View.FOCUSABLE);
- setFocusableInTouchMode(true);
- }
}
@Override
@@ -863,7 +856,7 @@
switch (action) {
case MotionEvent.ACTION_DOWN: {
removeAllCallbacks();
- hideSoftInput();
+ mInputText.setVisibility(View.INVISIBLE);
mLastDownOrMoveEventY = mLastDownEventY = event.getY();
mLastDownEventTime = event.getEventTime();
mIgnoreMoveEvents = false;
@@ -890,9 +883,11 @@
mFlingScroller.forceFinished(true);
mAdjustScroller.forceFinished(true);
} else if (mLastDownEventY < mTopSelectionDividerTop) {
+ hideSoftInput();
postChangeCurrentByOneFromLongPress(
false, ViewConfiguration.getLongPressTimeout());
} else if (mLastDownEventY > mBottomSelectionDividerBottom) {
+ hideSoftInput();
postChangeCurrentByOneFromLongPress(
true, ViewConfiguration.getLongPressTimeout());
} else {
@@ -1125,7 +1120,6 @@
@Override
public void scrollBy(int x, int y) {
int[] selectorIndices = mSelectorIndices;
- int startScrollOffset = mCurrentScrollOffset;
if (!mWrapSelectorWheel && y > 0
&& selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] <= mMinValue) {
mCurrentScrollOffset = mInitialScrollOffset;
@@ -1153,9 +1147,6 @@
mCurrentScrollOffset = mInitialScrollOffset;
}
}
- if (startScrollOffset != mCurrentScrollOffset) {
- onScrollChanged(0, mCurrentScrollOffset, 0, startScrollOffset);
- }
}
@Override
@@ -1744,10 +1735,7 @@
}
int previous = mValue;
mValue = current;
- // If we're flinging, we'll update the text view at the end when it becomes visible
- if (mScrollState != OnScrollListener.SCROLL_STATE_FLING) {
- updateInputTextView();
- }
+ updateInputTextView();
if (notifyChange) {
notifyChange(previous, current);
}
@@ -1764,7 +1752,7 @@
*/
private void changeValueByOne(boolean increment) {
if (mHasSelectorWheel) {
- hideSoftInput();
+ mInputText.setVisibility(View.INVISIBLE);
if (!moveToFinalScrollerPosition(mFlingScroller)) {
moveToFinalScrollerPosition(mAdjustScroller);
}
@@ -1811,8 +1799,9 @@
*/
private void onScrollerFinished(Scroller scroller) {
if (scroller == mFlingScroller) {
- ensureScrollWheelAdjusted();
- updateInputTextView();
+ if (!ensureScrollWheelAdjusted()) {
+ updateInputTextView();
+ }
onScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE);
} else {
if (mScrollState != OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
@@ -1948,25 +1937,9 @@
*/
String text = (mDisplayedValues == null) ? formatNumber(mValue)
: mDisplayedValues[mValue - mMinValue];
- if (!TextUtils.isEmpty(text)) {
- CharSequence beforeText = mInputText.getText();
- if (!text.equals(beforeText.toString())) {
- mInputText.setText(text);
- if (mAccessibilityNodeProvider != null) {
- AccessibilityEvent event = AccessibilityEvent.obtain(
- AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED);
- mInputText.onInitializeAccessibilityEvent(event);
- mInputText.onPopulateAccessibilityEvent(event);
- event.setFromIndex(0);
- event.setRemovedCount(beforeText.length());
- event.setAddedCount(text.length());
- event.setBeforeText(beforeText);
- event.setSource(NumberPicker.this,
- AccessibilityNodeProviderImpl.VIRTUAL_VIEW_ID_INPUT);
- requestSendAccessibilityEvent(NumberPicker.this, event);
- }
- return true;
- }
+ if (!TextUtils.isEmpty(text) && !text.equals(mInputText.getText().toString())) {
+ mInputText.setText(text);
+ return true;
}
return false;
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 8542bec0..3a4d008 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -1653,6 +1653,7 @@
? (val.data == 0 ? NOT_FOCUSABLE : FOCUSABLE)
: val.data;
}
+ break;
case com.android.internal.R.styleable.View_clickable:
clickable = a.getBoolean(attr, clickable);
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index 25d5fae..f28e862 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -116,7 +116,7 @@
private static final int MAGIC = 0xBA757475; // 'BATSTATS'
// Current on-disk Parcel version
- private static final int VERSION = 157 + (USE_OLD_HISTORY ? 1000 : 0);
+ private static final int VERSION = 158 + (USE_OLD_HISTORY ? 1000 : 0);
// Maximum number of items we will record in the history.
private static final int MAX_HISTORY_ITEMS = 2000;
@@ -3467,8 +3467,8 @@
boolean batteryStatusChanged = mOnBatteryTimeBase.setRunning(unplugged, uptime, realtime);
if (batteryStatusChanged) {
- for (int i=0; i<mUidStats.size(); i++) {
- mUidStats.valueAt(i).updateBgTimeBase(uptime, realtime);
+ for (int i = 0; i < mUidStats.size(); i++) {
+ mUidStats.valueAt(i).updateOnBatteryBgTimeBase(uptime, realtime);
}
}
@@ -3482,6 +3482,9 @@
}
updateCpuTimeLocked();
mOnBatteryScreenOffTimeBase.setRunning(unpluggedScreenOff, uptime, realtime);
+ for (int i = 0; i < mUidStats.size(); i++) {
+ mUidStats.valueAt(i).updateOnBatteryScreenOffBgTimeBase(uptime, realtime);
+ }
}
}
@@ -5581,6 +5584,8 @@
/** TimeBase for when uid is in background and device is on battery. */
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
public final TimeBase mOnBatteryBackgroundTimeBase;
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+ public final TimeBase mOnBatteryScreenOffBackgroundTimeBase;
boolean mWifiRunning;
StopwatchTimer mWifiRunningTimer;
@@ -5603,6 +5608,8 @@
StopwatchTimer mFlashlightTurnedOnTimer;
StopwatchTimer mCameraTurnedOnTimer;
StopwatchTimer mForegroundActivityTimer;
+ /** Total time spent by the uid holding any partial wakelocks. */
+ DualTimer mAggregatedPartialWakelockTimer;
DualTimer mBluetoothScanTimer;
Counter mBluetoothScanResultCounter;
@@ -5704,6 +5711,10 @@
mOnBatteryBackgroundTimeBase.init(mBsi.mClocks.uptimeMillis() * 1000,
mBsi.mClocks.elapsedRealtime() * 1000);
+ mOnBatteryScreenOffBackgroundTimeBase = new TimeBase();
+ mOnBatteryScreenOffBackgroundTimeBase.init(mBsi.mClocks.uptimeMillis() * 1000,
+ mBsi.mClocks.elapsedRealtime() * 1000);
+
mUserCpuTime = new LongSamplingCounter(mBsi.mOnBatteryTimeBase);
mSystemCpuTime = new LongSamplingCounter(mBsi.mOnBatteryTimeBase);
@@ -5774,6 +5785,11 @@
}
@Override
+ public Timer getAggregatedPartialWakelockTimer() {
+ return mAggregatedPartialWakelockTimer;
+ }
+
+ @Override
public ArrayMap<String, ? extends BatteryStats.Uid.Wakelock> getWakelockStats() {
return mWakelockStats.getMap();
}
@@ -6062,6 +6078,15 @@
return mForegroundActivityTimer;
}
+ public DualTimer createAggregatedPartialWakelockTimerLocked() {
+ if (mAggregatedPartialWakelockTimer == null) {
+ mAggregatedPartialWakelockTimer = new DualTimer(mBsi.mClocks, this,
+ AGGREGATED_WAKE_TYPE_PARTIAL, null,
+ mBsi.mOnBatteryScreenOffTimeBase, mOnBatteryScreenOffBackgroundTimeBase);
+ }
+ return mAggregatedPartialWakelockTimer;
+ }
+
public DualTimer createBluetoothScanTimerLocked() {
if (mBluetoothScanTimer == null) {
mBluetoothScanTimer = new DualTimer(mBsi.mClocks, Uid.this, BLUETOOTH_SCAN_ON,
@@ -6504,6 +6529,7 @@
active |= !resetTimerIfNotNull(mFlashlightTurnedOnTimer, false);
active |= !resetTimerIfNotNull(mCameraTurnedOnTimer, false);
active |= !resetTimerIfNotNull(mForegroundActivityTimer, false);
+ active |= !resetTimerIfNotNull(mAggregatedPartialWakelockTimer, false);
active |= !resetTimerIfNotNull(mBluetoothScanTimer, false);
if (mBluetoothScanResultCounter != null) {
mBluetoothScanResultCounter.reset(false);
@@ -6656,6 +6682,8 @@
mOnBatteryBackgroundTimeBase.reset(mBsi.mClocks.elapsedRealtime() * 1000,
mBsi.mClocks.uptimeMillis() * 1000);
+ mOnBatteryScreenOffBackgroundTimeBase.reset(mBsi.mClocks.elapsedRealtime() * 1000,
+ mBsi.mClocks.uptimeMillis() * 1000);
if (!active) {
if (mWifiRunningTimer != null) {
@@ -6695,6 +6723,10 @@
mForegroundActivityTimer.detach();
mForegroundActivityTimer = null;
}
+ if (mAggregatedPartialWakelockTimer != null) {
+ mAggregatedPartialWakelockTimer.detach();
+ mAggregatedPartialWakelockTimer = null;
+ }
if (mBluetoothScanTimer != null) {
mBluetoothScanTimer.detach();
mBluetoothScanTimer = null;
@@ -6760,6 +6792,7 @@
void writeToParcelLocked(Parcel out, long uptimeUs, long elapsedRealtimeUs) {
mOnBatteryBackgroundTimeBase.writeToParcel(out, uptimeUs, elapsedRealtimeUs);
+ mOnBatteryScreenOffBackgroundTimeBase.writeToParcel(out, uptimeUs, elapsedRealtimeUs);
final ArrayMap<String, Wakelock> wakeStats = mWakelockStats.getMap();
int NW = wakeStats.size();
@@ -6874,6 +6907,12 @@
} else {
out.writeInt(0);
}
+ if (mAggregatedPartialWakelockTimer != null) {
+ out.writeInt(1);
+ mAggregatedPartialWakelockTimer.writeToParcel(out, elapsedRealtimeUs);
+ } else {
+ out.writeInt(0);
+ }
if (mBluetoothScanTimer != null) {
out.writeInt(1);
mBluetoothScanTimer.writeToParcel(out, elapsedRealtimeUs);
@@ -6987,6 +7026,7 @@
void readFromParcelLocked(TimeBase timeBase, TimeBase screenOffTimeBase, Parcel in) {
mOnBatteryBackgroundTimeBase.readFromParcel(in);
+ mOnBatteryScreenOffBackgroundTimeBase.readFromParcel(in);
int numWakelocks = in.readInt();
mWakelockStats.clear();
@@ -7113,6 +7153,14 @@
mForegroundActivityTimer = null;
}
if (in.readInt() != 0) {
+ mAggregatedPartialWakelockTimer = new DualTimer(mBsi.mClocks, this,
+ AGGREGATED_WAKE_TYPE_PARTIAL, null,
+ mBsi.mOnBatteryScreenOffTimeBase, mOnBatteryScreenOffBackgroundTimeBase,
+ in);
+ } else {
+ mAggregatedPartialWakelockTimer = null;
+ }
+ if (in.readInt() != 0) {
mBluetoothScanTimer = new DualTimer(mBsi.mClocks, Uid.this, BLUETOOTH_SCAN_ON,
mBsi.mBluetoothScanOnTimers, mBsi.mOnBatteryTimeBase,
mOnBatteryBackgroundTimeBase, in);
@@ -8224,15 +8272,25 @@
mProcessStateTimer[uidRunningState].startRunningLocked(elapsedRealtimeMs);
}
- updateBgTimeBase(uptimeMs * 1000, elapsedRealtimeMs * 1000);
+ updateOnBatteryBgTimeBase(uptimeMs * 1000, elapsedRealtimeMs * 1000);
+ updateOnBatteryScreenOffBgTimeBase(uptimeMs * 1000, elapsedRealtimeMs * 1000);
}
- public boolean updateBgTimeBase(long uptimeUs, long realtimeUs) {
+ /** Whether to consider Uid to be in the background for background timebase purposes. */
+ public boolean isInBackground() {
// Note that PROCESS_STATE_CACHED and ActivityManager.PROCESS_STATE_NONEXISTENT is
// also considered to be 'background' for our purposes, because it's not foreground.
- boolean isBgAndUnplugged = mBsi.mOnBatteryTimeBase.isRunning()
- && mProcessState >= PROCESS_STATE_BACKGROUND;
- return mOnBatteryBackgroundTimeBase.setRunning(isBgAndUnplugged, uptimeUs, realtimeUs);
+ return mProcessState >= PROCESS_STATE_BACKGROUND;
+ }
+
+ public boolean updateOnBatteryBgTimeBase(long uptimeUs, long realtimeUs) {
+ boolean on = mBsi.mOnBatteryTimeBase.isRunning() && isInBackground();
+ return mOnBatteryBackgroundTimeBase.setRunning(on, uptimeUs, realtimeUs);
+ }
+
+ public boolean updateOnBatteryScreenOffBgTimeBase(long uptimeUs, long realtimeUs) {
+ boolean on = mBsi.mOnBatteryScreenOffTimeBase.isRunning() && isInBackground();
+ return mOnBatteryScreenOffBackgroundTimeBase.setRunning(on, uptimeUs, realtimeUs);
}
public SparseArray<? extends Pid> getPidStats() {
@@ -8363,10 +8421,13 @@
if (wl != null) {
wl.getStopwatchTimer(type).startRunningLocked(elapsedRealtimeMs);
}
- if (pid >= 0 && type == WAKE_TYPE_PARTIAL) {
- Pid p = getPidStatsLocked(pid);
- if (p.mWakeNesting++ == 0) {
- p.mWakeStartMs = elapsedRealtimeMs;
+ if (type == WAKE_TYPE_PARTIAL) {
+ createAggregatedPartialWakelockTimerLocked().startRunningLocked(elapsedRealtimeMs);
+ if (pid >= 0) {
+ Pid p = getPidStatsLocked(pid);
+ if (p.mWakeNesting++ == 0) {
+ p.mWakeStartMs = elapsedRealtimeMs;
+ }
}
}
}
@@ -8376,12 +8437,17 @@
if (wl != null) {
wl.getStopwatchTimer(type).stopRunningLocked(elapsedRealtimeMs);
}
- if (pid >= 0 && type == WAKE_TYPE_PARTIAL) {
- Pid p = mPids.get(pid);
- if (p != null && p.mWakeNesting > 0) {
- if (p.mWakeNesting-- == 1) {
- p.mWakeSumMs += elapsedRealtimeMs - p.mWakeStartMs;
- p.mWakeStartMs = 0;
+ if (type == WAKE_TYPE_PARTIAL) {
+ if (mAggregatedPartialWakelockTimer != null) {
+ mAggregatedPartialWakelockTimer.stopRunningLocked(elapsedRealtimeMs);
+ }
+ if (pid >= 0) {
+ Pid p = mPids.get(pid);
+ if (p != null && p.mWakeNesting > 0) {
+ if (p.mWakeNesting-- == 1) {
+ p.mWakeSumMs += elapsedRealtimeMs - p.mWakeStartMs;
+ p.mWakeStartMs = 0;
+ }
}
}
}
@@ -11265,6 +11331,7 @@
mUidStats.put(uid, u);
u.mOnBatteryBackgroundTimeBase.readSummaryFromParcel(in);
+ u.mOnBatteryScreenOffBackgroundTimeBase.readSummaryFromParcel(in);
u.mWifiRunning = false;
if (in.readInt() != 0) {
@@ -11305,6 +11372,9 @@
u.createForegroundActivityTimerLocked().readSummaryFromParcelLocked(in);
}
if (in.readInt() != 0) {
+ u.createAggregatedPartialWakelockTimerLocked().readSummaryFromParcelLocked(in);
+ }
+ if (in.readInt() != 0) {
u.createBluetoothScanTimerLocked().readSummaryFromParcelLocked(in);
}
if (in.readInt() != 0) {
@@ -11641,6 +11711,7 @@
Uid u = mUidStats.valueAt(iu);
u.mOnBatteryBackgroundTimeBase.writeSummaryToParcel(out, NOW_SYS, NOWREAL_SYS);
+ u.mOnBatteryScreenOffBackgroundTimeBase.writeSummaryToParcel(out, NOW_SYS, NOWREAL_SYS);
if (u.mWifiRunningTimer != null) {
out.writeInt(1);
@@ -11704,6 +11775,12 @@
} else {
out.writeInt(0);
}
+ if (u.mAggregatedPartialWakelockTimer != null) {
+ out.writeInt(1);
+ u.mAggregatedPartialWakelockTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
+ } else {
+ out.writeInt(0);
+ }
if (u.mBluetoothScanTimer != null) {
out.writeInt(1);
u.mBluetoothScanTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
diff --git a/core/jni/android_os_Parcel.cpp b/core/jni/android_os_Parcel.cpp
index 56f68d4..d740a76 100644
--- a/core/jni/android_os_Parcel.cpp
+++ b/core/jni/android_os_Parcel.cpp
@@ -119,11 +119,7 @@
Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
if (parcel != NULL) {
const status_t err = parcel->setDataSize(size);
- //STOPSHIP: check for BADFLO is for a temporary debug using wtf. Remove once bug resolved.
- if (err == UNKNOWN_ERROR + 0xBADF10) {
- jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException",
- "Attempt to resize (size = %d) Parcel would corrupt object memory", size);
- } else if (err != NO_ERROR) {
+ if (err != NO_ERROR) {
signalExceptionForError(env, clazz, err);
}
return parcel->getOpenAshmemSize();
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java
index d8de70c..9aabdbb 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java
@@ -100,6 +100,55 @@
assertEquals(227_000, bgtb.computeRealtime(cur, STATS_SINCE_CHARGED));
}
+ /** Test that BatteryStatsImpl.Uid.mOnBatteryScreenOffBackgroundTimeBase works correctly. */
+ @SmallTest
+ public void testScreenOffBgTimeBase() throws Exception {
+ final MockClocks clocks = new MockClocks(); // holds realtime and uptime in ms
+ MockBatteryStatsImpl bi = new MockBatteryStatsImpl(clocks);
+ long cur = 0; // realtime in us
+
+ BatteryStatsImpl.TimeBase bgtb = bi.getOnBatteryScreenOffBackgroundTimeBase(UID);
+
+ // battery=off, screen=off, background=off
+ cur = (clocks.realtime = clocks.uptime = 100) * 1000;
+ bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND);
+ bi.updateTimeBasesLocked(false, false, cur, cur);
+ assertFalse(bgtb.isRunning());
+
+ // battery=on, screen=off, background=off
+ cur = (clocks.realtime = clocks.uptime = 200) * 1000;
+ bi.updateTimeBasesLocked(true, false, cur, cur);
+ assertFalse(bgtb.isRunning());
+
+ // battery=on, screen=on, background=off
+ cur = (clocks.realtime = clocks.uptime = 300) * 1000;
+ bi.updateTimeBasesLocked(true, true, cur, cur);
+ assertFalse(bgtb.isRunning());
+
+ // battery=on, screen=on, background=on
+ // Only during this period should the timebase progress
+ cur = (clocks.realtime = clocks.uptime = 400) * 1000;
+ bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND);
+ assertTrue(bgtb.isRunning());
+
+ // battery=on, screen=off, background=on
+ cur = (clocks.realtime = clocks.uptime = 550) * 1000;
+ bi.updateTimeBasesLocked(true, false, cur, cur);
+ assertFalse(bgtb.isRunning());
+
+ // battery=off, screen=off, background=on
+ cur = (clocks.realtime = clocks.uptime = 660) * 1000;
+ bi.updateTimeBasesLocked(false, false, cur, cur);
+ assertFalse(bgtb.isRunning());
+
+ // battery=off, screen=off, background=off
+ cur = (clocks.realtime = clocks.uptime = 770) * 1000;
+ bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND);
+ assertFalse(bgtb.isRunning());
+
+ assertEquals(150_000, bgtb.computeRealtime(cur, STATS_SINCE_CHARGED));
+ }
+
@SmallTest
public void testWifiScan() throws Exception {
final MockClocks clocks = new MockClocks();
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java
index e374e11..06ca18d 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java
@@ -16,7 +16,10 @@
package com.android.internal.os;
import static android.os.BatteryStats.STATS_SINCE_CHARGED;
+import static android.os.BatteryStats.WAKE_TYPE_PARTIAL;
+import android.app.ActivityManager;
+import android.os.BatteryStats;
import android.os.WorkSource;
import android.support.test.filters.SmallTest;
@@ -29,7 +32,7 @@
private static final int UID = 10500;
private static final WorkSource WS = new WorkSource(UID);
- /** Test that BatteryStatsImpl.Uid.noteBluetoothScanResultsLocked. */
+ /** Test BatteryStatsImpl.Uid.noteBluetoothScanResultLocked. */
@SmallTest
public void testNoteBluetoothScanResultLocked() throws Exception {
MockBatteryStatsImpl bi = new MockBatteryStatsImpl(new MockClocks());
@@ -41,4 +44,30 @@
bi.getUidStats().get(UID).getBluetoothScanResultCounter()
.getCountLocked(STATS_SINCE_CHARGED));
}
+
+ /** Test BatteryStatsImpl.Uid.noteStartWakeLocked. */
+ @SmallTest
+ public void testNoteStartWakeLocked() throws Exception {
+ final MockClocks clocks = new MockClocks(); // holds realtime and uptime in ms
+ MockBatteryStatsImpl bi = new MockBatteryStatsImpl(clocks);
+
+ int pid = 10;
+ String name = "name";
+
+ bi.updateTimeBasesLocked(true, true, 0, 0);
+ bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_TOP);
+ bi.getUidStatsLocked(UID).noteStartWakeLocked(pid, name, WAKE_TYPE_PARTIAL, clocks.realtime);
+
+ clocks.realtime = clocks.uptime = 100;
+ bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND);
+
+ clocks.realtime = clocks.uptime = 220;
+ bi.getUidStatsLocked(UID).noteStopWakeLocked(pid, name, WAKE_TYPE_PARTIAL, clocks.realtime);
+
+ BatteryStats.Timer aggregTimer = bi.getUidStats().get(UID).getAggregatedPartialWakelockTimer();
+ long actualTime = aggregTimer.getTotalTimeLocked(300_000, STATS_SINCE_CHARGED);
+ long bgTime = aggregTimer.getSubTimer().getTotalTimeLocked(300_000, STATS_SINCE_CHARGED);
+ assertEquals(220_000, actualTime);
+ assertEquals(120_000, bgTime);
+ }
}
diff --git a/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java b/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java
index 65f898c..a123fce 100644
--- a/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java
+++ b/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java
@@ -44,5 +44,9 @@
public TimeBase getOnBatteryBackgroundTimeBase(int uid) {
return getUidStatsLocked(uid).mOnBatteryBackgroundTimeBase;
}
+
+ public TimeBase getOnBatteryScreenOffBackgroundTimeBase(int uid) {
+ return getUidStatsLocked(uid).mOnBatteryScreenOffBackgroundTimeBase;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/RecentsComponent.java b/packages/SystemUI/src/com/android/systemui/RecentsComponent.java
index cdad8ae..44a044b 100644
--- a/packages/SystemUI/src/com/android/systemui/RecentsComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/RecentsComponent.java
@@ -22,9 +22,6 @@
public interface RecentsComponent {
void showRecentApps(boolean triggeredFromAltTab, boolean fromHome);
- void hideRecentApps(boolean triggeredFromAltTab, boolean triggeredFromHomeKey);
- void toggleRecents();
- void preloadRecents();
void showNextAffiliatedTask();
void showPrevAffiliatedTask();
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java
index 0da4681..5ca9fa5 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java
@@ -70,7 +70,7 @@
TaskStackListener mTaskStackListener = new TaskStackListener() {
@Override
public void onActivityPinned(String packageName, int taskId) {
- if (!checkCurrentUserId(false /* debug */)) {
+ if (!checkCurrentUserId(mContext, false /* debug */)) {
return;
}
@@ -85,7 +85,7 @@
@Override
public void onActivityUnpinned() {
- if (!checkCurrentUserId(false /* debug */)) {
+ if (!checkCurrentUserId(mContext, false /* debug */)) {
return;
}
@@ -114,7 +114,7 @@
@Override
public void onPinnedActivityRestartAttempt(boolean clearedTask) {
- if (!checkCurrentUserId(false /* debug */)) {
+ if (!checkCurrentUserId(mContext, false /* debug */)) {
return;
}
diff --git a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
index 1c5da4d..6490b33 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
@@ -577,7 +577,7 @@
@Override
public void onTaskStackChanged() {
if (DEBUG) Log.d(TAG, "onTaskStackChanged()");
- if (!checkCurrentUserId(DEBUG)) {
+ if (!checkCurrentUserId(mContext, DEBUG)) {
return;
}
if (getState() != STATE_NO_PIP) {
@@ -614,7 +614,7 @@
@Override
public void onActivityPinned(String packageName, int taskId) {
if (DEBUG) Log.d(TAG, "onActivityPinned()");
- if (!checkCurrentUserId(DEBUG)) {
+ if (!checkCurrentUserId(mContext, DEBUG)) {
return;
}
StackInfo stackInfo = getPinnedStackInfo();
@@ -641,7 +641,7 @@
@Override
public void onPinnedActivityRestartAttempt(boolean clearedTask) {
if (DEBUG) Log.d(TAG, "onPinnedActivityRestartAttempt()");
- if (!checkCurrentUserId(DEBUG)) {
+ if (!checkCurrentUserId(mContext, DEBUG)) {
return;
}
// If PIPed activity is launched again by Launcher or intent, make it fullscreen.
@@ -651,7 +651,7 @@
@Override
public void onPinnedStackAnimationEnded() {
if (DEBUG) Log.d(TAG, "onPinnedStackAnimationEnded()");
- if (!checkCurrentUserId(DEBUG)) {
+ if (!checkCurrentUserId(mContext, DEBUG)) {
return;
}
switch (getState()) {
diff --git a/packages/SystemUI/src/com/android/systemui/recents/Recents.java b/packages/SystemUI/src/com/android/systemui/recents/Recents.java
index 72dd2da..9ba32b3 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/Recents.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/Recents.java
@@ -19,7 +19,6 @@
import static com.android.systemui.statusbar.phone.StatusBar.SYSTEM_DIALOG_REASON_RECENT_APPS;
import android.app.ActivityManager;
-import android.app.UiModeManager;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
@@ -33,7 +32,6 @@
import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
-import android.os.Looper;
import android.os.RemoteException;
import android.os.SystemProperties;
import android.os.UserHandle;
@@ -41,7 +39,6 @@
import android.util.EventLog;
import android.util.Log;
import android.view.Display;
-import android.view.WindowManager;
import android.widget.Toast;
import com.android.internal.logging.MetricsLogger;
@@ -60,11 +57,12 @@
import com.android.systemui.recents.events.component.ShowUserToastEvent;
import com.android.systemui.recents.events.ui.RecentsDrawnEvent;
import com.android.systemui.recents.misc.SystemServicesProxy;
-import com.android.systemui.recents.model.HighResThumbnailLoader;
import com.android.systemui.recents.model.RecentsTaskLoader;
import com.android.systemui.stackdivider.Divider;
import com.android.systemui.statusbar.CommandQueue;
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
@@ -322,16 +320,11 @@
}
}
- @Override
- public void toggleRecentApps() {
- toggleRecents();
- }
-
/**
* Toggles the Recents activity.
*/
@Override
- public void toggleRecents() {
+ public void toggleRecentApps() {
// Ensure the device has been provisioned before allowing the user to interact with
// recents
if (!isUserSetup()) {
@@ -368,7 +361,7 @@
* Preloads info for the Recents activity.
*/
@Override
- public void preloadRecents() {
+ public void preloadRecentApps() {
// Ensure the device has been provisioned before allowing the user to interact with
// recents
if (!isUserSetup()) {
@@ -792,4 +785,10 @@
}
return false;
}
+
+ @Override
+ public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ pw.println("Recents");
+ pw.println(" currentUserId=" + SystemServicesProxy.getInstance(mContext).getCurrentUser());
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
index e229c90..e2e9b1b 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
@@ -119,6 +119,11 @@
@Override
public void onTaskStackChangedBackground() {
+ // Check this is for the right user
+ if (!checkCurrentUserId(mContext, false /* debug */)) {
+ return;
+ }
+
// Preloads the next task
RecentsConfiguration config = Recents.getConfiguration();
if (config.svelteLevel == RecentsConfiguration.SVELTE_NONE) {
@@ -161,6 +166,11 @@
@Override
public void onActivityPinned(String packageName, int taskId) {
+ // Check this is for the right user
+ if (!checkCurrentUserId(mContext, false /* debug */)) {
+ return;
+ }
+
// This time needs to be fetched the same way the last active time is fetched in
// {@link TaskRecord#touchActiveTime}
Recents.getConfiguration().getLaunchState().launchedFromPipApp = true;
@@ -172,12 +182,22 @@
@Override
public void onActivityUnpinned() {
+ // Check this is for the right user
+ if (!checkCurrentUserId(mContext, false /* debug */)) {
+ return;
+ }
+
EventBus.getDefault().send(new ActivityUnpinnedEvent());
sLastPipTime = -1;
}
@Override
public void onTaskSnapshotChanged(int taskId, TaskSnapshot snapshot) {
+ // Check this is for the right user
+ if (!checkCurrentUserId(mContext, false /* debug */)) {
+ return;
+ }
+
EventBus.getDefault().send(new TaskSnapshotChangedEvent(taskId, snapshot));
}
}
@@ -413,30 +433,34 @@
public void preloadRecents() {
// Preload only the raw task list into a new load plan (which will be consumed by the
- // RecentsActivity) only if there is a task to animate to.
- SystemServicesProxy ssp = Recents.getSystemServices();
- MutableBoolean isHomeStackVisible = new MutableBoolean(true);
- if (!ssp.isRecentsActivityVisible(isHomeStackVisible)) {
- ActivityManager.RunningTaskInfo runningTask = ssp.getRunningTask();
- if (runningTask == null) {
- return;
- }
+ // RecentsActivity) only if there is a task to animate to. Post this to ensure that we
+ // don't block the touch feedback on the nav bar button which triggers this.
+ mHandler.post(() -> {
+ SystemServicesProxy ssp = Recents.getSystemServices();
+ MutableBoolean isHomeStackVisible = new MutableBoolean(true);
+ if (!ssp.isRecentsActivityVisible(isHomeStackVisible)) {
+ ActivityManager.RunningTaskInfo runningTask = ssp.getRunningTask();
+ if (runningTask == null) {
+ return;
+ }
- RecentsTaskLoader loader = Recents.getTaskLoader();
- sInstanceLoadPlan = loader.createLoadPlan(mContext);
- loader.preloadTasks(sInstanceLoadPlan, runningTask.id, !isHomeStackVisible.value);
- TaskStack stack = sInstanceLoadPlan.getTaskStack();
- if (stack.getTaskCount() > 0) {
- // Only preload the icon (but not the thumbnail since it may not have been taken for
- // the pausing activity)
- preloadIcon(runningTask.id);
+ RecentsTaskLoader loader = Recents.getTaskLoader();
+ sInstanceLoadPlan = loader.createLoadPlan(mContext);
+ loader.preloadTasks(sInstanceLoadPlan, runningTask.id, !isHomeStackVisible.value);
+ TaskStack stack = sInstanceLoadPlan.getTaskStack();
+ if (stack.getTaskCount() > 0) {
+ // Only preload the icon (but not the thumbnail since it may not have been taken
+ // for the pausing activity)
+ preloadIcon(runningTask.id);
- // At this point, we don't know anything about the stack state. So only calculate
- // the dimensions of the thumbnail that we need for the transition into Recents, but
- // do not draw it until we construct the activity options when we start Recents
- updateHeaderBarLayout(stack, null /* window rect override*/);
+ // At this point, we don't know anything about the stack state. So only
+ // calculate the dimensions of the thumbnail that we need for the transition
+ // into Recents, but do not draw it until we construct the activity options when
+ // we start Recents
+ updateHeaderBarLayout(stack, null /* window rect override*/);
+ }
}
- }
+ });
}
public void cancelPreloadingRecents() {
@@ -1039,7 +1063,6 @@
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
| Intent.FLAG_ACTIVITY_TASK_ON_HOME);
- Recents.getSystemServices().startActivityAsUserAsync(intent, opts);
HidePipMenuEvent hideMenuEvent = new HidePipMenuEvent();
hideMenuEvent.addPostAnimationCallback(() -> {
Recents.getSystemServices().startActivityAsUserAsync(intent, opts);
diff --git a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
index a155a71..cbfa0e5 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
@@ -85,7 +85,6 @@
import com.android.internal.app.AssistUtils;
import com.android.internal.os.BackgroundThread;
-import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.UiOffloadThread;
@@ -95,6 +94,8 @@
import com.android.systemui.recents.RecentsImpl;
import com.android.systemui.recents.model.Task;
import com.android.systemui.recents.model.ThumbnailData;
+import com.android.systemui.statusbar.policy.UserInfoController;
+import com.android.systemui.statusbar.policy.UserInfoController.OnUserInfoChangedListener;
import java.io.IOException;
import java.util.ArrayList;
@@ -102,8 +103,6 @@
import java.util.Iterator;
import java.util.List;
import java.util.Random;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
/**
* Acts as a shim around the real system services that we need to access data from, and provides
@@ -143,6 +142,7 @@
Display mDisplay;
String mRecentsPackage;
ComponentName mAssistComponent;
+ private int mCurrentUserId;
boolean mIsSafeMode;
boolean mHasFreeformWorkspaceSupport;
@@ -185,9 +185,9 @@
* TaskStackListener should make this call to verify that we don't act on events from other
* user's processes.
*/
- protected final boolean checkCurrentUserId(boolean debug) {
+ protected final boolean checkCurrentUserId(Context context, boolean debug) {
int processUserId = UserHandle.myUserId();
- int currentUserId = KeyguardUpdateMonitor.getCurrentUser();
+ int currentUserId = SystemServicesProxy.getInstance(context).getCurrentUser();
if (processUserId != currentUserId) {
if (debug) {
Log.d(TAG, "UID mismatch. SystemUI is running uid=" + processUserId
@@ -284,6 +284,10 @@
}
};
+ private final UserInfoController.OnUserInfoChangedListener mOnUserInfoChangedListener =
+ (String name, Drawable picture, String userAccount) ->
+ mCurrentUserId = mAm.getCurrentUser();
+
/**
* List of {@link TaskStackListener} registered from {@link #registerTaskStackListener}.
*/
@@ -312,6 +316,7 @@
Settings.Global.getInt(context.getContentResolver(),
DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT, 0) != 0;
mIsSafeMode = mPm.isSafeMode();
+ mCurrentUserId = mAm.getCurrentUser();
// Get the dummy thumbnail width/heights
Resources res = context.getResources();
@@ -329,6 +334,12 @@
// Resolve the assist intent
mAssistComponent = mAssistUtils.getAssistComponentForUser(UserHandle.myUserId());
+ // Since SystemServicesProxy can be accessed from a per-SysUI process component, create a
+ // per-process listener to keep track of the current user id to reduce the number of binder
+ // calls to fetch it.
+ UserInfoController userInfoController = Dependency.get(UserInfoController.class);
+ userInfoController.addCallback(mOnUserInfoChangedListener);
+
if (RecentsDebugFlags.Static.EnableMockTasks) {
// Create a dummy icon
mDummyIcon = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
@@ -1029,15 +1040,11 @@
}
/**
- * Returns the current user id.
+ * Returns the current user id. Used instead of KeyguardUpdateMonitor in SystemUI components
+ * that run in the non-primary SystemUI process.
*/
public int getCurrentUser() {
- if (mAm == null) return 0;
-
- // This must call through ActivityManager, as the SystemServicesProxy can be called in a
- // secondary user's SystemUI process, and KeyguardUpdateMonitor is only updated in the
- // primary user's SystemUI process
- return mAm.getCurrentUser();
+ return mCurrentUserId;
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java
index ed09640..93033ea 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java
@@ -22,7 +22,6 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.UserInfo;
import android.content.res.Resources;
-import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.os.UserHandle;
import android.os.UserManager;
@@ -33,15 +32,13 @@
import android.util.SparseBooleanArray;
import android.util.SparseIntArray;
-import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.Prefs;
import com.android.systemui.R;
import com.android.systemui.recents.Recents;
-import com.android.systemui.recents.RecentsConfiguration;
import com.android.systemui.recents.RecentsDebugFlags;
import com.android.systemui.recents.misc.SystemServicesProxy;
-
import com.android.systemui.recents.views.grid.TaskGridLayoutAlgorithm;
+
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
diff --git a/services/core/java/com/android/server/PinnerService.java b/services/core/java/com/android/server/PinnerService.java
index a94bf79..e3ebf4d 100644
--- a/services/core/java/com/android/server/PinnerService.java
+++ b/services/core/java/com/android/server/PinnerService.java
@@ -244,20 +244,22 @@
// get the path to the odex or oat file
String baseCodePath = cameraInfo.getBaseCodePath();
- String odex = null;
+ String[] files = null;
try {
- odex = DexFile.getDexFileOutputPath(baseCodePath, arch);
+ files = DexFile.getDexFileOutputPaths(baseCodePath, arch);
} catch (IOException ioe) {}
- if (odex == null) {
+ if (files == null) {
return true;
}
//not pinning the oat/odex is not a fatal error
- pf = pinFile(odex, 0, 0, MAX_CAMERA_PIN_SIZE);
- if (pf != null) {
- mPinnedCameraFiles.add(pf);
- if (DEBUG) {
- Slog.i(TAG, "Pinned " + pf.mFilename);
+ for (String file : files) {
+ pf = pinFile(file, 0, 0, MAX_CAMERA_PIN_SIZE);
+ if (pf != null) {
+ mPinnedCameraFiles.add(pf);
+ if (DEBUG) {
+ Slog.i(TAG, "Pinned " + pf.mFilename);
+ }
}
}
diff --git a/services/core/java/com/android/server/SystemServiceManager.java b/services/core/java/com/android/server/SystemServiceManager.java
index 10b2609..72ff606 100644
--- a/services/core/java/com/android/server/SystemServiceManager.java
+++ b/services/core/java/com/android/server/SystemServiceManager.java
@@ -164,6 +164,13 @@
}
}
+ /**
+ * @return true if system has completed the boot; false otherwise.
+ */
+ public boolean isBootCompleted() {
+ return mCurrentPhase >= SystemService.PHASE_BOOT_COMPLETED;
+ }
+
public void startUser(final int userHandle) {
Slog.i(TAG, "Calling onStartUser u" + userHandle);
final int serviceLen = mServices.size();
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index c56e4ea..7df9b69 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -1152,11 +1152,15 @@
void updateActivityApplicationInfoLocked(ApplicationInfo aInfo) {
final String packageName = aInfo.packageName;
+ final int userId = UserHandle.getUserId(aInfo.uid);
+
for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
final List<ActivityRecord> activities = mTaskHistory.get(taskNdx).mActivities;
for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
- if (packageName.equals(activities.get(activityNdx).packageName)) {
- activities.get(activityNdx).info.applicationInfo = aInfo;
+ final ActivityRecord ar = activities.get(activityNdx);
+
+ if ((userId == ar.userId) && packageName.equals(ar.packageName)) {
+ ar.info.applicationInfo = aInfo;
}
}
}
diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java
index 85d8986..3fd91dc 100644
--- a/services/core/java/com/android/server/location/GnssLocationProvider.java
+++ b/services/core/java/com/android/server/location/GnssLocationProvider.java
@@ -937,9 +937,9 @@
long time = mNtpTime.getCachedNtpTime();
long timeReference = mNtpTime.getCachedNtpTimeReference();
long certainty = mNtpTime.getCacheCertainty();
- long now = SystemClock.elapsedRealtime();
if (DEBUG) {
+ long now = System.currentTimeMillis();
Log.d(TAG, "NTP server returned: "
+ time + " (" + new Date(time)
+ ") reference: " + timeReference
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index 44bcff2..24cbdbf 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -987,11 +987,11 @@
// Update static shared library dependencies if needed
if (pkg.usesStaticLibraries != null && pkg.usesStaticLibrariesVersions != null
&& pkg.usesStaticLibraries.size() == pkg.usesStaticLibrariesVersions.length) {
- String[] usesStaticLibraries = new String[pkg.usesStaticLibraries.size()];
- pkg.usesStaticLibraries.toArray(usesStaticLibraries);
+ p.usesStaticLibraries = new String[pkg.usesStaticLibraries.size()];
+ pkg.usesStaticLibraries.toArray(p.usesStaticLibraries);
p.usesStaticLibrariesVersions = pkg.usesStaticLibrariesVersions;
} else {
- pkg.usesStaticLibraries = null;
+ p.usesStaticLibraries = null;
p.usesStaticLibrariesVersions = null;
}
addPackageSettingLPw(p, p.sharedUser);
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 78727c0..ae9852e 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -234,6 +234,7 @@
import com.android.internal.widget.PointerLocationView;
import com.android.server.GestureLauncherService;
import com.android.server.LocalServices;
+import com.android.server.SystemServiceManager;
import com.android.server.policy.keyguard.KeyguardServiceDelegate;
import com.android.server.policy.keyguard.KeyguardServiceDelegate.DrawnListener;
import com.android.server.policy.keyguard.KeyguardStateMonitor.StateCallback;
@@ -476,6 +477,7 @@
boolean mBootMessageNeedsHiding;
KeyguardServiceDelegate mKeyguardDelegate;
+ private boolean mKeyguardBound;
final Runnable mWindowManagerDrawCallback = new Runnable() {
@Override
public void run() {
@@ -530,7 +532,6 @@
boolean mSystemReady;
boolean mSystemBooted;
- private boolean mDeferBindKeyguard;
boolean mHdmiPlugged;
HdmiControl mHdmiControl;
IUiModeManager mUiModeManager;
@@ -2087,6 +2088,13 @@
handleStartTransitionForKeyguardLw(transit, null /* transit */);
}
});
+ mKeyguardDelegate = new KeyguardServiceDelegate(mContext,
+ new StateCallback() {
+ @Override
+ public void onTrustedChanged() {
+ mWindowManagerFuncs.notifyKeyguardTrustedChanged();
+ }
+ });
}
/**
@@ -6631,6 +6639,13 @@
reportScreenStateToVrManager(false);
}
+ private long getKeyguardDrawnTimeout() {
+ final boolean bootCompleted =
+ LocalServices.getService(SystemServiceManager.class).isBootCompleted();
+ // Set longer timeout if it has not booted yet to prevent showing empty window.
+ return bootCompleted ? 1000 : 5000;
+ }
+
// Called on the DisplayManager's DisplayPowerController thread.
@Override
public void screenTurningOn(final ScreenOnListener screenOnListener) {
@@ -6646,7 +6661,8 @@
if (mKeyguardDelegate != null) {
mHandler.removeMessages(MSG_KEYGUARD_DRAWN_TIMEOUT);
- mHandler.sendEmptyMessageDelayed(MSG_KEYGUARD_DRAWN_TIMEOUT, 1000);
+ mHandler.sendEmptyMessageDelayed(MSG_KEYGUARD_DRAWN_TIMEOUT,
+ getKeyguardDrawnTimeout());
mKeyguardDelegate.onScreenTurningOn(mKeyguardDrawnCallback);
} else {
if (DEBUG_WAKEUP) Slog.d(TAG,
@@ -7159,16 +7175,26 @@
return out;
}
+ private void bindKeyguard() {
+ synchronized (mLock) {
+ if (mKeyguardBound) {
+ return;
+ }
+ mKeyguardBound = true;
+ }
+ mKeyguardDelegate.bindService(mContext);
+ }
+
+ @Override
+ public void onSystemUiStarted() {
+ bindKeyguard();
+ }
+
/** {@inheritDoc} */
@Override
public void systemReady() {
- mKeyguardDelegate = new KeyguardServiceDelegate(mContext,
- new StateCallback() {
- @Override
- public void onTrustedChanged() {
- mWindowManagerFuncs.notifyKeyguardTrustedChanged();
- }
- });
+ // In normal flow, systemReady is called before other system services are ready.
+ // So it is better not to bind keyguard here.
mKeyguardDelegate.onSystemReady();
mVrManagerInternal = LocalServices.getService(VrManagerInternal.class);
@@ -7178,7 +7204,6 @@
readCameraLensCoverState();
updateUiMode();
- boolean bindKeyguardNow;
synchronized (mLock) {
updateOrientationListenerLp();
mSystemReady = true;
@@ -7188,18 +7213,13 @@
updateSettings();
}
});
-
- bindKeyguardNow = mDeferBindKeyguard;
- if (bindKeyguardNow) {
- // systemBooted ran but wasn't able to bind to the Keyguard, we'll do it now.
- mDeferBindKeyguard = false;
+ // If this happens, for whatever reason, systemReady came later than systemBooted.
+ // And keyguard should be already bound from systemBooted
+ if (mSystemBooted) {
+ mKeyguardDelegate.onBootCompleted();
}
}
- if (bindKeyguardNow) {
- mKeyguardDelegate.bindService(mContext);
- mKeyguardDelegate.onBootCompleted();
- }
mSystemGestures.systemReady();
mImmersiveModeConfirmation.systemReady();
}
@@ -7207,30 +7227,25 @@
/** {@inheritDoc} */
@Override
public void systemBooted() {
- boolean bindKeyguardNow = false;
- synchronized (mLock) {
- // Time to bind Keyguard; take care to only bind it once, either here if ready or
- // in systemReady if not.
- if (mKeyguardDelegate != null) {
- bindKeyguardNow = true;
- } else {
- // Because mKeyguardDelegate is null, we know that the synchronized block in
- // systemReady didn't run yet and setting this will actually have an effect.
- mDeferBindKeyguard = true;
- }
- }
- if (bindKeyguardNow) {
- mKeyguardDelegate.bindService(mContext);
- mKeyguardDelegate.onBootCompleted();
- }
+ bindKeyguard();
synchronized (mLock) {
mSystemBooted = true;
+ if (mSystemReady) {
+ mKeyguardDelegate.onBootCompleted();
+ }
}
startedWakingUp();
screenTurningOn(null);
screenTurnedOn();
}
+ @Override
+ public boolean canDismissBootAnimation() {
+ synchronized (mLock) {
+ return mKeyguardDrawComplete;
+ }
+ }
+
ProgressDialog mBootMsgDialog = null;
/** {@inheritDoc} */
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index a2ae430..a15891b 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -3341,6 +3341,13 @@
performEnableScreen();
}
+ /**
+ * Called when System UI has been started.
+ */
+ public void onSystemUiStarted() {
+ mPolicy.onSystemUiStarted();
+ }
+
private void performEnableScreen() {
synchronized(mWindowMap) {
if (DEBUG_BOOT) Slog.i(TAG_WM, "performEnableScreen: mDisplayEnabled=" + mDisplayEnabled
@@ -3356,6 +3363,10 @@
return;
}
+ if (!mShowingBootMessages && !mPolicy.canDismissBootAnimation()) {
+ return;
+ }
+
// Don't enable the screen until all existing windows have been drawn.
if (!mForceDisplayEnabled
// TODO(multidisplay): Expand to all displays?
@@ -3369,7 +3380,7 @@
try {
IBinder surfaceFlinger = ServiceManager.getService("SurfaceFlinger");
if (surfaceFlinger != null) {
- //Slog.i(TAG_WM, "******* TELLING SURFACE FLINGER WE ARE BOOTED!");
+ Slog.i(TAG_WM, "******* TELLING SURFACE FLINGER WE ARE BOOTED!");
Parcel data = Parcel.obtain();
data.writeInterfaceToken("android.ui.ISurfaceComposer");
surfaceFlinger.transact(IBinder.FIRST_CALL_TRANSACTION, // BOOT_FINISHED
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 0965f03..b620b3e 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -1644,6 +1644,7 @@
final MediaRouterService mediaRouterF = mediaRouter;
final MmsServiceBroker mmsServiceF = mmsService;
final IpSecService ipSecServiceF = ipSecService;
+ final WindowManagerService windowManagerF = wm;
// We now tell the activity manager it is okay to run third party
// code. It will call back into us once it has gotten to the state
@@ -1683,7 +1684,7 @@
traceBeginAndSlog("StartSystemUI");
try {
- startSystemUi(context);
+ startSystemUi(context, windowManagerF);
} catch (Throwable e) {
reportWtf("starting System UI", e);
}
@@ -1837,13 +1838,14 @@
}, BOOT_TIMINGS_TRACE_LOG);
}
- static final void startSystemUi(Context context) {
+ static final void startSystemUi(Context context, WindowManagerService windowManager) {
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.android.systemui",
"com.android.systemui.SystemUIService"));
intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);
//Slog.d(TAG, "Starting service: " + intent);
context.startServiceAsUser(intent, UserHandle.SYSTEM);
+ windowManager.onSystemUiStarted();
}
private static void traceBeginAndSlog(String name) {
diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java b/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java
index 5e4ba7be..25ba66e 100644
--- a/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java
+++ b/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java
@@ -25,9 +25,12 @@
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.CoreMatchers.nullValue;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import android.annotation.NonNull;
@@ -37,6 +40,7 @@
import android.content.pm.UserInfo;
import android.os.UserHandle;
import android.os.UserManagerInternal;
+import android.security.keystore.ArrayUtils;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
@@ -57,6 +61,7 @@
import java.io.IOException;
import java.security.PublicKey;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
@RunWith(AndroidJUnit4.class)
@@ -527,6 +532,41 @@
false /*notLaunched*/, false /*stopped*/, true /*installed*/);
}
+ @Test
+ public void testInsertPackageSetting() {
+ final PackageSetting ps = createPackageSetting(0 /*sharedUserId*/, 0 /*pkgFlags*/);
+ final PackageParser.Package pkg = new PackageParser.Package(PACKAGE_NAME);
+ pkg.applicationInfo.setCodePath(ps.codePathString);
+ pkg.applicationInfo.setResourcePath(ps.resourcePathString);
+ final Settings settings =
+ new Settings(InstrumentationRegistry.getContext().getFilesDir(), new Object());
+ pkg.usesStaticLibraries = new ArrayList<>(
+ Arrays.asList("foo.bar1", "foo.bar2", "foo.bar3"));
+ pkg.usesStaticLibrariesVersions = new int[] {2, 4, 6};
+ settings.insertPackageSettingLPw(ps, pkg);
+ assertEquals(pkg, ps.pkg);
+ assertArrayEquals(pkg.usesStaticLibraries.toArray(new String[0]), ps.usesStaticLibraries);
+ assertArrayEquals(pkg.usesStaticLibrariesVersions, ps.usesStaticLibrariesVersions);
+
+ pkg.usesStaticLibraries = null;
+ pkg.usesStaticLibrariesVersions = null;
+ settings.insertPackageSettingLPw(ps, pkg);
+ assertEquals(pkg, ps.pkg);
+ assertNull("Actual: " + Arrays.toString(ps.usesStaticLibraries), ps.usesStaticLibraries);
+ assertNull("Actual: " + Arrays.toString(ps.usesStaticLibrariesVersions),
+ ps.usesStaticLibrariesVersions);
+ }
+
+ private <T> void assertArrayEquals(T[] a, T[] b) {
+ assertTrue("Expected: " + Arrays.toString(a) + ", actual: " + Arrays.toString(b),
+ Arrays.equals(a, b));
+ }
+
+ private void assertArrayEquals(int[] a, int[] b) {
+ assertTrue("Expected: " + Arrays.toString(a) + ", actual: " + Arrays.toString(b),
+ Arrays.equals(a, b));
+ }
+
private void verifyUserState(PackageUserState userState, PackageUserState oldUserState,
boolean userStateChanged) {
verifyUserState(userState, oldUserState, userStateChanged, false /*notLaunched*/,
diff --git a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java
index 623d77b..c457cb3 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java
@@ -637,5 +637,14 @@
@Override
public void setRecentsVisibilityLw(boolean visible) {
- }
+ }
+
+ @Override
+ public void onSystemUiStarted() {
+ }
+
+ @Override
+ public boolean canDismissBootAnimation() {
+ return true;
+ }
}
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java
index 0de3c7c..912e7a8 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsService.java
@@ -831,6 +831,9 @@
final UserUsageStatsService service =
getUserDataAndInitializeIfNeededLocked(userId, timeNow);
List<UsageStats> list = service.queryUsageStats(bucketType, beginTime, endTime);
+ if (list == null) {
+ return null;
+ }
// Mangle instant app names *using their current state (not whether they were ephemeral
// when the data was recorded)*.
diff --git a/wifi/java/android/net/wifi/p2p/nsd/WifiP2pServiceResponse.java b/wifi/java/android/net/wifi/p2p/nsd/WifiP2pServiceResponse.java
index a0b5a6e..1020fd2 100644
--- a/wifi/java/android/net/wifi/p2p/nsd/WifiP2pServiceResponse.java
+++ b/wifi/java/android/net/wifi/p2p/nsd/WifiP2pServiceResponse.java
@@ -186,31 +186,23 @@
/**
* Create the list of WifiP2pServiceResponse instance from supplicant event.
*
- * <pre>The format is as follows.
- * P2P-SERV-DISC-RESP <address> <update indicator> <response data>
- * e.g) P2P-SERV-DISC-RESP 02:03:7f:11:62:da 1 0300000101
- *
- * @param supplicantEvent wpa_supplicant event string.
+ * @param srcAddr source address of the service response
+ * @param tlvsBin byte array containing the binary tlvs data
* @return if parse failed, return null
* @hide
*/
- public static List<WifiP2pServiceResponse> newInstance(String supplicantEvent) {
+ public static List<WifiP2pServiceResponse> newInstance(String srcAddr, byte[] tlvsBin) {
+ //updateIndicator not used, and not passed up from supplicant
List<WifiP2pServiceResponse> respList = new ArrayList<WifiP2pServiceResponse>();
- String[] args = supplicantEvent.split(" ");
- if (args.length != 4) {
- return null;
- }
WifiP2pDevice dev = new WifiP2pDevice();
- String srcAddr = args[1];
dev.deviceAddress = srcAddr;
- //String updateIndicator = args[2];//not used.
- byte[] bin = hexStr2Bin(args[3]);
- if (bin == null) {
+ if (tlvsBin == null) {
return null;
}
- DataInputStream dis = new DataInputStream(new ByteArrayInputStream(bin));
+
+ DataInputStream dis = new DataInputStream(new ByteArrayInputStream(tlvsBin));
try {
while (dis.available() > 0) {
/*