Merge ""Unlocked device required" javadoc clarification" into pi-dev
diff --git a/api/current.txt b/api/current.txt
index 8cba5cb..421151a6 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -7360,8 +7360,8 @@
method public int getCount();
method public int getEventType();
method public long getFirstTimeStamp();
+ method public long getLastEventTime();
method public long getLastTimeStamp();
- method public long getLastTimeUsed();
method public long getTotalTime();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.usage.EventStats> CREATOR;
@@ -7469,6 +7469,8 @@
method public int getStandbyBucket();
method public long getTimeStamp();
field public static final int CONFIGURATION_CHANGE = 5; // 0x5
+ field public static final int KEYGUARD_HIDDEN = 18; // 0x12
+ field public static final int KEYGUARD_SHOWN = 17; // 0x11
field public static final int MOVE_TO_BACKGROUND = 2; // 0x2
field public static final int MOVE_TO_FOREGROUND = 1; // 0x1
field public static final int NONE = 0; // 0x0
@@ -38578,11 +38580,11 @@
method public boolean isInvalidatedByBiometricEnrollment();
method public boolean isRandomizedEncryptionRequired();
method public boolean isStrongBoxBacked();
- method public boolean isTrustedUserPresenceRequired();
method public boolean isUnlockedDeviceRequired();
method public boolean isUserAuthenticationRequired();
method public boolean isUserAuthenticationValidWhileOnBody();
method public boolean isUserConfirmationRequired();
+ method public boolean isUserPresenceRequired();
}
public static final class KeyGenParameterSpec.Builder {
@@ -38606,12 +38608,12 @@
method public android.security.keystore.KeyGenParameterSpec.Builder setKeyValidityStart(java.util.Date);
method public android.security.keystore.KeyGenParameterSpec.Builder setRandomizedEncryptionRequired(boolean);
method public android.security.keystore.KeyGenParameterSpec.Builder setSignaturePaddings(java.lang.String...);
- method public android.security.keystore.KeyGenParameterSpec.Builder setTrustedUserPresenceRequired(boolean);
method public android.security.keystore.KeyGenParameterSpec.Builder setUnlockedDeviceRequired(boolean);
method public android.security.keystore.KeyGenParameterSpec.Builder setUserAuthenticationRequired(boolean);
method public android.security.keystore.KeyGenParameterSpec.Builder setUserAuthenticationValidWhileOnBody(boolean);
method public android.security.keystore.KeyGenParameterSpec.Builder setUserAuthenticationValidityDurationSeconds(int);
method public android.security.keystore.KeyGenParameterSpec.Builder setUserConfirmationRequired(boolean);
+ method public android.security.keystore.KeyGenParameterSpec.Builder setUserPresenceRequired(boolean);
}
public class KeyInfo implements java.security.spec.KeySpec {
@@ -38699,11 +38701,11 @@
method public boolean isDigestsSpecified();
method public boolean isInvalidatedByBiometricEnrollment();
method public boolean isRandomizedEncryptionRequired();
- method public boolean isTrustedUserPresenceRequired();
method public boolean isUnlockedDeviceRequired();
method public boolean isUserAuthenticationRequired();
method public boolean isUserAuthenticationValidWhileOnBody();
method public boolean isUserConfirmationRequired();
+ method public boolean isUserPresenceRequired();
}
public static final class KeyProtection.Builder {
@@ -38719,12 +38721,12 @@
method public android.security.keystore.KeyProtection.Builder setKeyValidityStart(java.util.Date);
method public android.security.keystore.KeyProtection.Builder setRandomizedEncryptionRequired(boolean);
method public android.security.keystore.KeyProtection.Builder setSignaturePaddings(java.lang.String...);
- method public android.security.keystore.KeyProtection.Builder setTrustedUserPresenceRequired(boolean);
method public android.security.keystore.KeyProtection.Builder setUnlockedDeviceRequired(boolean);
method public android.security.keystore.KeyProtection.Builder setUserAuthenticationRequired(boolean);
method public android.security.keystore.KeyProtection.Builder setUserAuthenticationValidWhileOnBody(boolean);
method public android.security.keystore.KeyProtection.Builder setUserAuthenticationValidityDurationSeconds(int);
method public android.security.keystore.KeyProtection.Builder setUserConfirmationRequired(boolean);
+ method public android.security.keystore.KeyProtection.Builder setUserPresenceRequired(boolean);
}
public class SecureKeyImportUnavailableException extends java.security.ProviderException {
diff --git a/core/java/android/app/Dialog.java b/core/java/android/app/Dialog.java
index 4a168fe..e4a0583 100644
--- a/core/java/android/app/Dialog.java
+++ b/core/java/android/app/Dialog.java
@@ -321,16 +321,20 @@
}
WindowManager.LayoutParams l = mWindow.getAttributes();
+ boolean restoreSoftInputMode = false;
if ((l.softInputMode
& WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) == 0) {
- WindowManager.LayoutParams nl = new WindowManager.LayoutParams();
- nl.copyFrom(l);
- nl.softInputMode |=
+ l.softInputMode |=
WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION;
- l = nl;
+ restoreSoftInputMode = true;
}
mWindowManager.addView(mDecor, l);
+ if (restoreSoftInputMode) {
+ l.softInputMode &=
+ ~WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION;
+ }
+
mShowing = true;
sendShowMessage();
diff --git a/core/java/android/app/usage/EventStats.java b/core/java/android/app/usage/EventStats.java
index b799de9..ea95a05 100644
--- a/core/java/android/app/usage/EventStats.java
+++ b/core/java/android/app/usage/EventStats.java
@@ -41,10 +41,9 @@
public long mEndTimeStamp;
/**
- * Last time used by the user with an explicit action (notification, activity launch).
* {@hide}
*/
- public long mLastTimeUsed;
+ public long mLastEventTime;
/**
* {@hide}
@@ -66,7 +65,7 @@
mEventType = stats.mEventType;
mBeginTimeStamp = stats.mBeginTimeStamp;
mEndTimeStamp = stats.mEndTimeStamp;
- mLastTimeUsed = stats.mLastTimeUsed;
+ mLastEventTime = stats.mLastEventTime;
mTotalTime = stats.mTotalTime;
mCount = stats.mCount;
}
@@ -100,12 +99,12 @@
}
/**
- * Get the last time this event was used, measured in milliseconds since the epoch.
+ * Get the last time this event triggered, measured in milliseconds since the epoch.
* <p/>
* See {@link System#currentTimeMillis()}.
*/
- public long getLastTimeUsed() {
- return mLastTimeUsed;
+ public long getLastEventTime() {
+ return mLastEventTime;
}
/**
@@ -138,7 +137,7 @@
// We use the mBeginTimeStamp due to a bug where UsageStats files can overlap with
// regards to their mEndTimeStamp.
if (right.mBeginTimeStamp > mBeginTimeStamp) {
- mLastTimeUsed = Math.max(mLastTimeUsed, right.mLastTimeUsed);
+ mLastEventTime = Math.max(mLastEventTime, right.mLastEventTime);
}
mBeginTimeStamp = Math.min(mBeginTimeStamp, right.mBeginTimeStamp);
mEndTimeStamp = Math.max(mEndTimeStamp, right.mEndTimeStamp);
@@ -156,7 +155,7 @@
dest.writeInt(mEventType);
dest.writeLong(mBeginTimeStamp);
dest.writeLong(mEndTimeStamp);
- dest.writeLong(mLastTimeUsed);
+ dest.writeLong(mLastEventTime);
dest.writeLong(mTotalTime);
dest.writeInt(mCount);
}
@@ -168,7 +167,7 @@
stats.mEventType = in.readInt();
stats.mBeginTimeStamp = in.readLong();
stats.mEndTimeStamp = in.readLong();
- stats.mLastTimeUsed = in.readLong();
+ stats.mLastEventTime = in.readLong();
stats.mTotalTime = in.readLong();
stats.mCount = in.readInt();
return stats;
diff --git a/core/java/android/app/usage/UsageEvents.java b/core/java/android/app/usage/UsageEvents.java
index a665652..84f57a3 100644
--- a/core/java/android/app/usage/UsageEvents.java
+++ b/core/java/android/app/usage/UsageEvents.java
@@ -152,6 +152,18 @@
*/
public static final int SCREEN_NON_INTERACTIVE = 16;
+ /**
+ * An event type denoting that the screen's keyguard has been shown, whether or not
+ * the screen is off.
+ */
+ public static final int KEYGUARD_SHOWN = 17;
+
+ /**
+ * An event type denoting that the screen's keyguard has been hidden. This typically
+ * happens when the user unlocks their phone after turning it on.
+ */
+ public static final int KEYGUARD_HIDDEN = 18;
+
/** @hide */
public static final int FLAG_IS_PACKAGE_INSTANT_APP = 1 << 0;
diff --git a/core/java/android/app/usage/UsageStatsManager.java b/core/java/android/app/usage/UsageStatsManager.java
index eafe91a..7fb97d3 100644
--- a/core/java/android/app/usage/UsageStatsManager.java
+++ b/core/java/android/app/usage/UsageStatsManager.java
@@ -319,6 +319,8 @@
* <ul>
* <li>{@link UsageEvents.Event#SCREEN_INTERACTIVE}</li>
* <li>{@link UsageEvents.Event#SCREEN_NON_INTERACTIVE}</li>
+ * <li>{@link UsageEvents.Event#KEYGUARD_SHOWN}</li>
+ * <li>{@link UsageEvents.Event#KEYGUARD_HIDDEN}</li>
* </ul>
*
* <p> The caller must have {@link android.Manifest.permission#PACKAGE_USAGE_STATS} </p>
diff --git a/keystore/java/android/security/keystore/KeyGenParameterSpec.java b/keystore/java/android/security/keystore/KeyGenParameterSpec.java
index e41b5d1..c0d0fb0 100644
--- a/keystore/java/android/security/keystore/KeyGenParameterSpec.java
+++ b/keystore/java/android/security/keystore/KeyGenParameterSpec.java
@@ -259,7 +259,7 @@
private final boolean mRandomizedEncryptionRequired;
private final boolean mUserAuthenticationRequired;
private final int mUserAuthenticationValidityDurationSeconds;
- private final boolean mTrustedUserPresenceRequred;
+ private final boolean mUserPresenceRequired;
private final byte[] mAttestationChallenge;
private final boolean mUniqueIdIncluded;
private final boolean mUserAuthenticationValidWhileOnBody;
@@ -291,7 +291,7 @@
boolean randomizedEncryptionRequired,
boolean userAuthenticationRequired,
int userAuthenticationValidityDurationSeconds,
- boolean trustedUserPresenceRequired,
+ boolean userPresenceRequired,
byte[] attestationChallenge,
boolean uniqueIdIncluded,
boolean userAuthenticationValidWhileOnBody,
@@ -339,7 +339,7 @@
mBlockModes = ArrayUtils.cloneIfNotEmpty(ArrayUtils.nullToEmpty(blockModes));
mRandomizedEncryptionRequired = randomizedEncryptionRequired;
mUserAuthenticationRequired = userAuthenticationRequired;
- mTrustedUserPresenceRequred = trustedUserPresenceRequired;
+ mUserPresenceRequired = userPresenceRequired;
mUserAuthenticationValidityDurationSeconds = userAuthenticationValidityDurationSeconds;
mAttestationChallenge = Utils.cloneIfNotNull(attestationChallenge);
mUniqueIdIncluded = uniqueIdIncluded;
@@ -595,8 +595,8 @@
* Returns {@code true} if the key is authorized to be used only if a test of user presence has
* been performed between the {@code Signature.initSign()} and {@code Signature.sign()} calls.
*/
- public boolean isTrustedUserPresenceRequired() {
- return mTrustedUserPresenceRequred;
+ public boolean isUserPresenceRequired() {
+ return mUserPresenceRequired;
}
/**
@@ -714,7 +714,7 @@
private boolean mRandomizedEncryptionRequired = true;
private boolean mUserAuthenticationRequired;
private int mUserAuthenticationValidityDurationSeconds = -1;
- private boolean mTrustedUserPresenceRequired = false;
+ private boolean mUserPresenceRequired = false;
private byte[] mAttestationChallenge = null;
private boolean mUniqueIdIncluded = false;
private boolean mUserAuthenticationValidWhileOnBody;
@@ -777,7 +777,7 @@
mUserAuthenticationRequired = sourceSpec.isUserAuthenticationRequired();
mUserAuthenticationValidityDurationSeconds =
sourceSpec.getUserAuthenticationValidityDurationSeconds();
- mTrustedUserPresenceRequired = sourceSpec.isTrustedUserPresenceRequired();
+ mUserPresenceRequired = sourceSpec.isUserPresenceRequired();
mAttestationChallenge = sourceSpec.getAttestationChallenge();
mUniqueIdIncluded = sourceSpec.isUniqueIdIncluded();
mUserAuthenticationValidWhileOnBody = sourceSpec.isUserAuthenticationValidWhileOnBody();
@@ -1182,8 +1182,8 @@
* {@code Signature.initSign()} and {@code Signature.sign()} method calls.
*/
@NonNull
- public Builder setTrustedUserPresenceRequired(boolean required) {
- mTrustedUserPresenceRequired = required;
+ public Builder setUserPresenceRequired(boolean required) {
+ mUserPresenceRequired = required;
return this;
}
@@ -1327,7 +1327,7 @@
mRandomizedEncryptionRequired,
mUserAuthenticationRequired,
mUserAuthenticationValidityDurationSeconds,
- mTrustedUserPresenceRequired,
+ mUserPresenceRequired,
mAttestationChallenge,
mUniqueIdIncluded,
mUserAuthenticationValidWhileOnBody,
diff --git a/keystore/java/android/security/keystore/KeyProtection.java b/keystore/java/android/security/keystore/KeyProtection.java
index 8997b39..4daf30c 100644
--- a/keystore/java/android/security/keystore/KeyProtection.java
+++ b/keystore/java/android/security/keystore/KeyProtection.java
@@ -224,7 +224,7 @@
private final boolean mRandomizedEncryptionRequired;
private final boolean mUserAuthenticationRequired;
private final int mUserAuthenticationValidityDurationSeconds;
- private final boolean mTrustedUserPresenceRequired;
+ private final boolean mUserPresenceRequred;
private final boolean mUserAuthenticationValidWhileOnBody;
private final boolean mInvalidatedByBiometricEnrollment;
private final long mBoundToSecureUserId;
@@ -244,7 +244,7 @@
boolean randomizedEncryptionRequired,
boolean userAuthenticationRequired,
int userAuthenticationValidityDurationSeconds,
- boolean trustedUserPresenceRequired,
+ boolean userPresenceRequred,
boolean userAuthenticationValidWhileOnBody,
boolean invalidatedByBiometricEnrollment,
long boundToSecureUserId,
@@ -264,7 +264,7 @@
mRandomizedEncryptionRequired = randomizedEncryptionRequired;
mUserAuthenticationRequired = userAuthenticationRequired;
mUserAuthenticationValidityDurationSeconds = userAuthenticationValidityDurationSeconds;
- mTrustedUserPresenceRequired = trustedUserPresenceRequired;
+ mUserPresenceRequred = userPresenceRequred;
mUserAuthenticationValidWhileOnBody = userAuthenticationValidWhileOnBody;
mInvalidatedByBiometricEnrollment = invalidatedByBiometricEnrollment;
mBoundToSecureUserId = boundToSecureUserId;
@@ -446,8 +446,8 @@
* Returns {@code true} if the key is authorized to be used only if a test of user presence has
* been performed between the {@code Signature.initSign()} and {@code Signature.sign()} calls.
*/
- public boolean isTrustedUserPresenceRequired() {
- return mTrustedUserPresenceRequired;
+ public boolean isUserPresenceRequired() {
+ return mUserPresenceRequred;
}
/**
@@ -534,7 +534,7 @@
private boolean mRandomizedEncryptionRequired = true;
private boolean mUserAuthenticationRequired;
private int mUserAuthenticationValidityDurationSeconds = -1;
- private boolean mTrustedUserPresenceRequired = false;
+ private boolean mUserPresenceRequired = false;
private boolean mUserAuthenticationValidWhileOnBody;
private boolean mInvalidatedByBiometricEnrollment = true;
private boolean mUserConfirmationRequired;
@@ -843,8 +843,8 @@
* {@code Signature.initSign()} and {@code Signature.sign()} method calls.
*/
@NonNull
- public Builder setTrustedUserPresenceRequired(boolean required) {
- mTrustedUserPresenceRequired = required;
+ public Builder setUserPresenceRequired(boolean required) {
+ mUserPresenceRequired = required;
return this;
}
@@ -961,7 +961,7 @@
mRandomizedEncryptionRequired,
mUserAuthenticationRequired,
mUserAuthenticationValidityDurationSeconds,
- mTrustedUserPresenceRequired,
+ mUserPresenceRequired,
mUserAuthenticationValidWhileOnBody,
mInvalidatedByBiometricEnrollment,
mBoundToSecureUserId,
diff --git a/keystore/java/android/security/keystore/KeymasterUtils.java b/keystore/java/android/security/keystore/KeymasterUtils.java
index 14a9970..f829bb7 100644
--- a/keystore/java/android/security/keystore/KeymasterUtils.java
+++ b/keystore/java/android/security/keystore/KeymasterUtils.java
@@ -106,7 +106,7 @@
args.addBoolean(KeymasterDefs.KM_TAG_TRUSTED_CONFIRMATION_REQUIRED);
}
- if (spec.isTrustedUserPresenceRequired()) {
+ if (spec.isUserPresenceRequired()) {
args.addBoolean(KeymasterDefs.KM_TAG_TRUSTED_USER_PRESENCE_REQUIRED);
}
diff --git a/keystore/java/android/security/keystore/ParcelableKeyGenParameterSpec.java b/keystore/java/android/security/keystore/ParcelableKeyGenParameterSpec.java
index e5fdea7..911bbf8 100644
--- a/keystore/java/android/security/keystore/ParcelableKeyGenParameterSpec.java
+++ b/keystore/java/android/security/keystore/ParcelableKeyGenParameterSpec.java
@@ -101,7 +101,7 @@
out.writeBoolean(mSpec.isUniqueIdIncluded());
out.writeBoolean(mSpec.isUserAuthenticationValidWhileOnBody());
out.writeBoolean(mSpec.isInvalidatedByBiometricEnrollment());
- out.writeBoolean(mSpec.isTrustedUserPresenceRequired());
+ out.writeBoolean(mSpec.isUserPresenceRequired());
}
private static Date readDateOrNull(Parcel in) {
@@ -165,7 +165,7 @@
builder.setUniqueIdIncluded(in.readBoolean());
builder.setUserAuthenticationValidWhileOnBody(in.readBoolean());
builder.setInvalidatedByBiometricEnrollment(in.readBoolean());
- builder.setTrustedUserPresenceRequired(in.readBoolean());
+ builder.setUserPresenceRequired(in.readBoolean());
mSpec = builder.build();
}
diff --git a/keystore/java/android/security/keystore/UserAuthArgs.java b/keystore/java/android/security/keystore/UserAuthArgs.java
index ad18ff8..6952060 100644
--- a/keystore/java/android/security/keystore/UserAuthArgs.java
+++ b/keystore/java/android/security/keystore/UserAuthArgs.java
@@ -32,7 +32,6 @@
boolean isInvalidatedByBiometricEnrollment();
boolean isUserConfirmationRequired();
long getBoundToSpecificSecureUserId();
- boolean isTrustedUserPresenceRequired();
+ boolean isUserPresenceRequired();
boolean isUnlockedDeviceRequired();
-
}
diff --git a/media/java/android/media/MediaDrm.java b/media/java/android/media/MediaDrm.java
index 5173743..7ac1529 100644
--- a/media/java/android/media/MediaDrm.java
+++ b/media/java/android/media/MediaDrm.java
@@ -993,6 +993,9 @@
* active. The license server returns a secure stop release response
* message to the app which then deletes the secure stop from persistent
* memory using {@link #releaseSecureStops}.
+ * <p>
+ * Each secure stop has a unique ID that can be used to identify it during
+ * enumeration, access and removal.
* @return a list of all secure stops from secure persistent memory
*/
@NonNull
@@ -1000,6 +1003,8 @@
/**
* Return a list of all secure stop IDs currently in persistent memory.
+ * The secure stop ID can be used to access or remove the corresponding
+ * secure stop.
*
* @return a list of secure stop IDs
*/
@@ -1008,6 +1013,7 @@
/**
* Access a specific secure stop given its secure stop ID.
+ * Each secure stop has a unique ID.
*
* @param ssid the ID of the secure stop to return
* @return the secure stop identified by ssid
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
index 8a4f324..ce16efb 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
@@ -54,7 +54,6 @@
private static final int MARQUEE_DELAY_MS = 2000;
private final LockPatternUtils mLockPatternUtils;
- private final AlarmManager mAlarmManager;
private final IActivityManager mIActivityManager;
private final float mSmallClockScale;
private final float mWidgetPadding;
@@ -123,7 +122,6 @@
public KeyguardStatusView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
- mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
mIActivityManager = ActivityManager.getService();
mLockPatternUtils = new LockPatternUtils(getContext());
mHandler = new Handler(Looper.myLooper());
@@ -223,10 +221,7 @@
}
private void refresh() {
- AlarmManager.AlarmClockInfo nextAlarm =
- mAlarmManager.getNextAlarmClock(UserHandle.USER_CURRENT);
- Patterns.update(mContext, nextAlarm != null);
-
+ Patterns.update(mContext);
refreshTime();
}
@@ -301,20 +296,16 @@
// DateFormat.getBestDateTimePattern is extremely expensive, and refresh is called often.
// This is an optimization to ensure we only recompute the patterns when the inputs change.
private static final class Patterns {
- static String dateViewSkel;
static String clockView12;
static String clockView24;
static String cacheKey;
- static void update(Context context, boolean hasAlarm) {
+ static void update(Context context) {
final Locale locale = Locale.getDefault();
final Resources res = context.getResources();
- dateViewSkel = res.getString(hasAlarm
- ? R.string.abbrev_wday_month_day_no_year_alarm
- : R.string.abbrev_wday_month_day_no_year);
final String clockView12Skel = res.getString(R.string.clock_12hr_format);
final String clockView24Skel = res.getString(R.string.clock_24hr_format);
- final String key = locale.toString() + dateViewSkel + clockView12Skel + clockView24Skel;
+ final String key = locale.toString() + clockView12Skel + clockView24Skel;
if (key.equals(cacheKey)) return;
clockView12 = DateFormat.getBestDateTimePattern(locale, clockView12Skel);
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index fd8998b..e3e844a 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -1530,6 +1530,11 @@
private int mWakefulness = PowerManagerInternal.WAKEFULNESS_AWAKE;
/**
+ * State of external calls telling us if the device is awake or asleep.
+ */
+ private boolean mKeyguardShown = false;
+
+ /**
* Set if we are shutting down the system, similar to sleeping.
*/
boolean mShuttingDown = false;
@@ -13094,6 +13099,12 @@
: UsageEvents.Event.SCREEN_NON_INTERACTIVE);
}
+ void reportCurKeyguardUsageEventLocked() {
+ reportGlobalUsageEventLocked(mKeyguardShown
+ ? UsageEvents.Event.KEYGUARD_SHOWN
+ : UsageEvents.Event.KEYGUARD_HIDDEN);
+ }
+
void onWakefulnessChanged(int wakefulness) {
synchronized(this) {
boolean wasAwake = mWakefulness == PowerManagerInternal.WAKEFULNESS_AWAKE;
@@ -13257,6 +13268,10 @@
synchronized(this) {
long ident = Binder.clearCallingIdentity();
+ if (mKeyguardShown != keyguardShowing) {
+ mKeyguardShown = keyguardShowing;
+ reportCurKeyguardUsageEventLocked();
+ }
try {
mKeyguardController.setKeyguardShown(keyguardShowing, aodShowing,
secondaryDisplayShowing);
diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java
index a30a944..1b7e1ed 100644
--- a/services/core/java/com/android/server/am/ActivityStarter.java
+++ b/services/core/java/com/android/server/am/ActivityStarter.java
@@ -46,6 +46,7 @@
import static android.content.Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS;
import static android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP;
import static android.content.pm.ActivityInfo.DOCUMENT_LAUNCH_ALWAYS;
+import static android.content.pm.ActivityInfo.LAUNCH_MULTIPLE;
import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_INSTANCE;
import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_TASK;
import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_TOP;
@@ -1205,9 +1206,20 @@
return START_RETURN_LOCK_TASK_MODE_VIOLATION;
}
- if (mStartActivity.getTask() == null) {
+ // True if we are clearing top and resetting of a standard (default) launch mode
+ // ({@code LAUNCH_MULTIPLE}) activity. The existing activity will be finished.
+ final boolean clearTopAndResetStandardLaunchMode =
+ (mLaunchFlags & (FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED))
+ == (FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED)
+ && mLaunchMode == LAUNCH_MULTIPLE;
+
+ // If mStartActivity does not have a task associated with it, associate it with the
+ // reused activity's task. Do not do so if we're clearing top and resetting for a
+ // standard launchMode activity.
+ if (mStartActivity.getTask() == null && !clearTopAndResetStandardLaunchMode) {
mStartActivity.setTask(reusedActivity.getTask());
}
+
if (reusedActivity.getTask().intent == null) {
// This task was started because of movement of the activity based on affinity...
// Now that we are actually launching it, we can assign the base intent.
@@ -1266,17 +1278,21 @@
resumeTargetStackIfNeeded();
return START_RETURN_INTENT_TO_CALLER;
}
- setTaskFromIntentActivity(reusedActivity);
- if (!mAddingToTask && mReuseTask == null) {
- // We didn't do anything... but it was needed (a.k.a., client don't use that
- // intent!) And for paranoia, make sure we have correctly resumed the top activity.
- resumeTargetStackIfNeeded();
- if (outActivity != null && outActivity.length > 0) {
- outActivity[0] = reusedActivity;
+ if (reusedActivity != null) {
+ setTaskFromIntentActivity(reusedActivity);
+
+ if (!mAddingToTask && mReuseTask == null) {
+ // We didn't do anything... but it was needed (a.k.a., client don't use that
+ // intent!) And for paranoia, make sure we have correctly resumed the top activity.
+
+ resumeTargetStackIfNeeded();
+ if (outActivity != null && outActivity.length > 0) {
+ outActivity[0] = reusedActivity;
+ }
+
+ return mMovedToFront ? START_TASK_TO_FRONT : START_DELIVERED_TO_TOP;
}
-
- return mMovedToFront ? START_TASK_TO_FRONT : START_DELIVERED_TO_TOP;
}
}
diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java
index f710690..a294334 100644
--- a/services/core/java/com/android/server/am/UserController.java
+++ b/services/core/java/com/android/server/am/UserController.java
@@ -1593,6 +1593,7 @@
void onSystemReady() {
updateCurrentProfileIds();
+ mInjector.reportCurWakefulnessUsageEvent();
}
/**
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 7f83f38..b3d9354 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -10227,7 +10227,7 @@
}
if (changedAbiCodePath != null && changedAbiCodePath.size() > 0) {
- for (int i = changedAbiCodePath.size() - 1; i <= 0; --i) {
+ for (int i = changedAbiCodePath.size() - 1; i >= 0; --i) {
final String codePathString = changedAbiCodePath.get(i);
try {
mInstaller.rmdex(codePathString,
diff --git a/services/usage/java/com/android/server/usage/IntervalStats.java b/services/usage/java/com/android/server/usage/IntervalStats.java
index b070e03..c914689 100644
--- a/services/usage/java/com/android/server/usage/IntervalStats.java
+++ b/services/usage/java/com/android/server/usage/IntervalStats.java
@@ -30,12 +30,10 @@
public long beginTime;
public long endTime;
public long lastTimeSaved;
- public long lastInteractiveTime;
- public long lastNonInteractiveTime;
- public long interactiveDuration;
- public int interactiveCount;
- public long nonInteractiveDuration;
- public int nonInteractiveCount;
+ public final EventTracker interactiveTracker = new EventTracker();
+ public final EventTracker nonInteractiveTracker = new EventTracker();
+ public final EventTracker keyguardShownTracker = new EventTracker();
+ public final EventTracker keyguardHiddenTracker = new EventTracker();
public final ArrayMap<String, UsageStats> packageStats = new ArrayMap<>();
public final ArrayMap<Configuration, ConfigurationStats> configurations = new ArrayMap<>();
public Configuration activeConfiguration;
@@ -47,6 +45,44 @@
// strings that had identical copies in the cache.
private final ArraySet<String> mStringCache = new ArraySet<>();
+ public static final class EventTracker {
+ public long curStartTime;
+ public long lastEventTime;
+ public long duration;
+ public int count;
+
+ public void commitTime(long timeStamp) {
+ if (curStartTime != 0) {
+ duration += timeStamp - duration;
+ curStartTime = 0;
+ }
+ }
+
+ public void update(long timeStamp) {
+ if (curStartTime == 0) {
+ // If we aren't already running, time to bump the count.
+ count++;
+ }
+ commitTime(timeStamp);
+ curStartTime = timeStamp;
+ lastEventTime = timeStamp;
+ }
+
+ void addToEventStats(List<EventStats> out, int event, long beginTime, long endTime) {
+ if (count != 0 || duration != 0) {
+ EventStats ev = new EventStats();
+ ev.mEventType = event;
+ ev.mCount = count;
+ ev.mTotalTime = duration;
+ ev.mLastEventTime = lastEventTime;
+ ev.mBeginTimeStamp = beginTime;
+ ev.mEndTimeStamp = endTime;
+ out.add(ev);
+ }
+ }
+
+ }
+
/**
* Gets the UsageStats object for the given package, or creates one and adds it internally.
*/
@@ -180,58 +216,42 @@
usageStats.mAppLaunchCount += 1;
}
- private void commitInteractiveTime(long timeStamp) {
- if (lastInteractiveTime != 0) {
- interactiveDuration += timeStamp - lastInteractiveTime;
- lastInteractiveTime = 0;
- }
- if (lastNonInteractiveTime != 0) {
- nonInteractiveDuration += timeStamp - lastNonInteractiveTime;
- lastNonInteractiveTime = 0;
- }
- }
-
void commitTime(long timeStamp) {
- commitInteractiveTime(timeStamp);
+ interactiveTracker.commitTime(timeStamp);
+ nonInteractiveTracker.commitTime(timeStamp);
+ keyguardShownTracker.commitTime(timeStamp);
+ keyguardHiddenTracker.commitTime(timeStamp);
}
void updateScreenInteractive(long timeStamp) {
- if (lastInteractiveTime != 0) {
- // Already interactive, just keep running.
- return;
- }
- commitInteractiveTime(timeStamp);
- lastInteractiveTime = timeStamp;
- interactiveCount++;
+ interactiveTracker.update(timeStamp);
+ nonInteractiveTracker.commitTime(timeStamp);
}
void updateScreenNonInteractive(long timeStamp) {
- if (lastNonInteractiveTime != 0) {
- // Already non-interactive, just keep running.
- return;
- }
- commitInteractiveTime(timeStamp);
- lastNonInteractiveTime = timeStamp;
- nonInteractiveCount++;
+ nonInteractiveTracker.update(timeStamp);
+ interactiveTracker.commitTime(timeStamp);
}
- private void addOneEventStats(List<EventStats> out, int event, int count, long duration) {
- if (count != 0 || duration != 0) {
- EventStats ev = new EventStats();
- ev.mEventType = event;
- ev.mCount = count;
- ev.mTotalTime = duration;
- ev.mBeginTimeStamp = beginTime;
- ev.mEndTimeStamp = endTime;
- out.add(ev);
- }
+ void updateKeyguardShown(long timeStamp) {
+ keyguardShownTracker.update(timeStamp);
+ keyguardHiddenTracker.commitTime(timeStamp);
+ }
+
+ void updateKeyguardHidden(long timeStamp) {
+ keyguardHiddenTracker.update(timeStamp);
+ keyguardShownTracker.commitTime(timeStamp);
}
void addEventStatsTo(List<EventStats> out) {
- addOneEventStats(out, UsageEvents.Event.SCREEN_INTERACTIVE, interactiveCount,
- interactiveDuration);
- addOneEventStats(out, UsageEvents.Event.SCREEN_NON_INTERACTIVE, nonInteractiveCount,
- nonInteractiveDuration);
+ interactiveTracker.addToEventStats(out, UsageEvents.Event.SCREEN_INTERACTIVE,
+ beginTime, endTime);
+ nonInteractiveTracker.addToEventStats(out, UsageEvents.Event.SCREEN_NON_INTERACTIVE,
+ beginTime, endTime);
+ keyguardShownTracker.addToEventStats(out, UsageEvents.Event.KEYGUARD_SHOWN,
+ beginTime, endTime);
+ keyguardHiddenTracker.addToEventStats(out, UsageEvents.Event.KEYGUARD_HIDDEN,
+ beginTime, endTime);
}
private String getCachedStringRef(String str) {
diff --git a/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java b/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java
index 2287b27..fe3a884 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java
@@ -40,6 +40,8 @@
private static final String INTERACTIVE_TAG = "interactive";
private static final String NON_INTERACTIVE_TAG = "non-interactive";
+ private static final String KEYGUARD_SHOWN_TAG = "keyguard-shown";
+ private static final String KEYGUARD_HIDDEN_TAG = "keyguard-hidden";
private static final String PACKAGES_TAG = "packages";
private static final String PACKAGE_TAG = "package";
@@ -103,12 +105,12 @@
}
}
- private static Pair<Integer, Long> loadCountAndTime(XmlPullParser parser)
+ private static void loadCountAndTime(XmlPullParser parser,
+ IntervalStats.EventTracker tracker)
throws IOException, XmlPullParserException {
- int count = XmlUtils.readIntAttribute(parser, COUNT_ATTR, 0);
- long time = XmlUtils.readLongAttribute(parser, TIME_ATTR, 0);
+ tracker.count = XmlUtils.readIntAttribute(parser, COUNT_ATTR, 0);
+ tracker.duration = XmlUtils.readLongAttribute(parser, TIME_ATTR, 0);
XmlUtils.skipCurrentTag(parser);
- return new Pair<>(count, time);
}
private static void loadChooserCounts(
@@ -340,17 +342,21 @@
final String tag = parser.getName();
switch (tag) {
- case INTERACTIVE_TAG: {
- Pair<Integer, Long> result = loadCountAndTime(parser);
- statsOut.interactiveCount = result.first;
- statsOut.interactiveDuration = result.second;
- } break;
+ case INTERACTIVE_TAG:
+ loadCountAndTime(parser, statsOut.interactiveTracker);
+ break;
- case NON_INTERACTIVE_TAG: {
- Pair<Integer, Long> result = loadCountAndTime(parser);
- statsOut.nonInteractiveCount = result.first;
- statsOut.nonInteractiveDuration = result.second;
- } break;
+ case NON_INTERACTIVE_TAG:
+ loadCountAndTime(parser, statsOut.nonInteractiveTracker);
+ break;
+
+ case KEYGUARD_SHOWN_TAG:
+ loadCountAndTime(parser, statsOut.keyguardShownTracker);
+ break;
+
+ case KEYGUARD_HIDDEN_TAG:
+ loadCountAndTime(parser, statsOut.keyguardHiddenTracker);
+ break;
case PACKAGE_TAG:
loadUsageStats(parser, statsOut);
@@ -378,10 +384,14 @@
public static void write(XmlSerializer xml, IntervalStats stats) throws IOException {
XmlUtils.writeLongAttribute(xml, END_TIME_ATTR, stats.endTime - stats.beginTime);
- writeCountAndTime(xml, INTERACTIVE_TAG, stats.interactiveCount, stats.interactiveDuration);
-
- writeCountAndTime(xml, NON_INTERACTIVE_TAG, stats.nonInteractiveCount,
- stats.nonInteractiveDuration);
+ writeCountAndTime(xml, INTERACTIVE_TAG, stats.interactiveTracker.count,
+ stats.interactiveTracker.duration);
+ writeCountAndTime(xml, NON_INTERACTIVE_TAG, stats.nonInteractiveTracker.count,
+ stats.nonInteractiveTracker.duration);
+ writeCountAndTime(xml, KEYGUARD_SHOWN_TAG, stats.keyguardShownTracker.count,
+ stats.keyguardShownTracker.duration);
+ writeCountAndTime(xml, KEYGUARD_HIDDEN_TAG, stats.keyguardHiddenTracker.count,
+ stats.keyguardHiddenTracker.duration);
xml.startTag(null, PACKAGES_TAG);
final int statsCount = stats.packageStats.size();
diff --git a/services/usage/java/com/android/server/usage/UserUsageStatsService.java b/services/usage/java/com/android/server/usage/UserUsageStatsService.java
index 6ad374b..d9fc066 100644
--- a/services/usage/java/com/android/server/usage/UserUsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UserUsageStatsService.java
@@ -211,6 +211,12 @@
case UsageEvents.Event.SCREEN_NON_INTERACTIVE: {
stats.updateScreenNonInteractive(event.mTimeStamp);
} break;
+ case UsageEvents.Event.KEYGUARD_SHOWN: {
+ stats.updateKeyguardShown(event.mTimeStamp);
+ } break;
+ case UsageEvents.Event.KEYGUARD_HIDDEN: {
+ stats.updateKeyguardHidden(event.mTimeStamp);
+ } break;
default: {
stats.update(event.mPackage, event.mTimeStamp, event.mEventType);
if (incrementAppLaunch) {
@@ -665,14 +671,19 @@
}
}
- void printEventAggregation(IndentingPrintWriter pw, String label, int count, long duration,
- boolean prettyDates) {
- if (count != 0 || duration != 0) {
+ void printEventAggregation(IndentingPrintWriter pw, String label,
+ IntervalStats.EventTracker tracker, boolean prettyDates) {
+ if (tracker.count != 0 || tracker.duration != 0) {
pw.print(label);
pw.print(": ");
- pw.print(count);
+ pw.print(tracker.count);
pw.print("x for ");
- pw.print(formatElapsedTime(duration, prettyDates));
+ pw.print(formatElapsedTime(tracker.duration, prettyDates));
+ if (tracker.curStartTime != 0) {
+ pw.print(" (now running, started at ");
+ formatDateTime(tracker.curStartTime, prettyDates);
+ pw.print(")");
+ }
pw.println();
}
}
@@ -752,10 +763,14 @@
pw.decreaseIndent();
pw.println("event aggregations");
pw.increaseIndent();
- printEventAggregation(pw, "screen-interactive", stats.interactiveCount,
- stats.interactiveDuration, prettyDates);
- printEventAggregation(pw, "screen-non-interactive", stats.nonInteractiveCount,
- stats.nonInteractiveDuration, prettyDates);
+ printEventAggregation(pw, "screen-interactive", stats.interactiveTracker,
+ prettyDates);
+ printEventAggregation(pw, "screen-non-interactive", stats.nonInteractiveTracker,
+ prettyDates);
+ printEventAggregation(pw, "keyguard-shown", stats.keyguardShownTracker,
+ prettyDates);
+ printEventAggregation(pw, "keyguard-hidden", stats.keyguardHiddenTracker,
+ prettyDates);
pw.decreaseIndent();
}