diff options
32 files changed, 388 insertions, 290 deletions
diff --git a/api/current.txt b/api/current.txt index 6c23563117e2..d54b7fd11708 100644 --- a/api/current.txt +++ b/api/current.txt @@ -7912,6 +7912,7 @@ package android.content { field public static final int MODE_APPEND = 32768; // 0x8000 field public static final int MODE_ENABLE_WRITE_AHEAD_LOGGING = 8; // 0x8 field public static final deprecated int MODE_MULTI_PROCESS = 4; // 0x4 + field public static final int MODE_NO_LOCALIZED_COLLATORS = 16; // 0x10 field public static final int MODE_PRIVATE = 0; // 0x0 field public static final deprecated int MODE_WORLD_READABLE = 1; // 0x1 field public static final deprecated int MODE_WORLD_WRITEABLE = 2; // 0x2 @@ -28064,6 +28065,7 @@ package android.os { method public boolean isUserAGoat(); method public boolean isUserRunning(android.os.UserHandle); method public boolean isUserRunningOrStopping(android.os.UserHandle); + method public boolean isUserRunningUnlocked(android.os.UserHandle); method public deprecated boolean setRestrictionsChallenge(java.lang.String); method public deprecated void setUserRestriction(java.lang.String, boolean); method public deprecated void setUserRestrictions(android.os.Bundle); diff --git a/api/system-current.txt b/api/system-current.txt index bfafd2579d91..e1f17f3433aa 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -8159,6 +8159,7 @@ package android.content { field public static final int MODE_APPEND = 32768; // 0x8000 field public static final int MODE_ENABLE_WRITE_AHEAD_LOGGING = 8; // 0x8 field public static final deprecated int MODE_MULTI_PROCESS = 4; // 0x4 + field public static final int MODE_NO_LOCALIZED_COLLATORS = 16; // 0x10 field public static final int MODE_PRIVATE = 0; // 0x0 field public static final deprecated int MODE_WORLD_READABLE = 1; // 0x1 field public static final deprecated int MODE_WORLD_WRITEABLE = 2; // 0x2 @@ -30047,6 +30048,7 @@ package android.os { method public boolean isUserAGoat(); method public boolean isUserRunning(android.os.UserHandle); method public boolean isUserRunningOrStopping(android.os.UserHandle); + method public boolean isUserRunningUnlocked(android.os.UserHandle); method public deprecated boolean setRestrictionsChallenge(java.lang.String); method public deprecated void setUserRestriction(java.lang.String, boolean); method public deprecated void setUserRestrictions(android.os.Bundle); diff --git a/api/test-current.txt b/api/test-current.txt index 095ce5b53755..904347de1259 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -7912,6 +7912,7 @@ package android.content { field public static final int MODE_APPEND = 32768; // 0x8000 field public static final int MODE_ENABLE_WRITE_AHEAD_LOGGING = 8; // 0x8 field public static final deprecated int MODE_MULTI_PROCESS = 4; // 0x4 + field public static final int MODE_NO_LOCALIZED_COLLATORS = 16; // 0x10 field public static final int MODE_PRIVATE = 0; // 0x0 field public static final deprecated int MODE_WORLD_READABLE = 1; // 0x1 field public static final deprecated int MODE_WORLD_WRITEABLE = 2; // 0x2 @@ -28064,6 +28065,7 @@ package android.os { method public boolean isUserAGoat(); method public boolean isUserRunning(android.os.UserHandle); method public boolean isUserRunningOrStopping(android.os.UserHandle); + method public boolean isUserRunningUnlocked(android.os.UserHandle); method public deprecated boolean setRestrictionsChallenge(java.lang.String); method public deprecated void setUserRestriction(java.lang.String, boolean); method public deprecated void setUserRestrictions(android.os.Bundle); diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index f7d765c7c86f..c2038543a4c0 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -543,6 +543,11 @@ public class ActivityManager { return stackId == FREEFORM_WORKSPACE_STACK_ID || stackId == FULLSCREEN_WORKSPACE_STACK_ID || stackId == DOCKED_STACK_ID; } + + /** Returns true if the windows in the stack can receive input keys. */ + public static boolean canReceiveKeys(int stackId) { + return stackId != PINNED_STACK_ID; + } } /** @@ -3091,6 +3096,8 @@ public class ActivityManager { public static final int FLAG_OR_STOPPED = 1 << 0; /** {@hide} */ public static final int FLAG_AND_LOCKED = 1 << 1; + /** {@hide} */ + public static final int FLAG_AND_UNLOCKED = 1 << 2; /** * Return whether the given user is actively running. This means that diff --git a/core/java/android/app/AlarmManager.java b/core/java/android/app/AlarmManager.java index bf2e13af2820..b569416cdacb 100644 --- a/core/java/android/app/AlarmManager.java +++ b/core/java/android/app/AlarmManager.java @@ -25,7 +25,6 @@ import android.os.Handler; import android.os.Parcel; import android.os.Parcelable; import android.os.RemoteException; -import android.os.SystemClock; import android.os.UserHandle; import android.os.WorkSource; import android.text.TextUtils; @@ -869,13 +868,19 @@ public class AlarmManager { * {@link Intent#filterEquals}), will be canceled. * * @param operation IntentSender which matches a previously added - * IntentSender. + * IntentSender. This parameter must not be {@code null}. * * @see #set */ public void cancel(PendingIntent operation) { if (operation == null) { - throw new NullPointerException("operation"); + final String msg = "cancel() called with a null PendingIntent"; + if (mTargetSdkVersion >= Build.VERSION_CODES.N) { + throw new NullPointerException(msg); + } else { + Log.e(TAG, msg); + return; + } } try { @@ -891,7 +896,7 @@ public class AlarmManager { */ public void cancel(OnAlarmListener listener) { if (listener == null) { - throw new NullPointerException("listener"); + throw new NullPointerException("cancel() called with a null OnAlarmListener"); } ListenerWrapper wrapper = null; diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index c661107e3397..23c4198e348f 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -589,6 +589,9 @@ class ContextImpl extends Context { if ((mode & MODE_ENABLE_WRITE_AHEAD_LOGGING) != 0) { flags |= SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING; } + if ((mode & MODE_NO_LOCALIZED_COLLATORS) != 0) { + flags |= SQLiteDatabase.NO_LOCALIZED_COLLATORS; + } SQLiteDatabase db = SQLiteDatabase.openDatabase(f.getPath(), factory, flags, errorHandler); setFilePermissionsFromMode(f.getPath(), mode, 0); return db; diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl index c1d5b196563c..c504ce3b1a06 100644 --- a/core/java/android/app/INotificationManager.aidl +++ b/core/java/android/app/INotificationManager.aidl @@ -93,6 +93,7 @@ interface INotificationManager AutomaticZenRule addAutomaticZenRule(in AutomaticZenRule automaticZenRule); boolean updateAutomaticZenRule(in AutomaticZenRule automaticZenRule); boolean removeAutomaticZenRule(String id); + boolean removeAutomaticZenRules(String packageName); byte[] getBackupPayload(int user); void applyRestore(in byte[] payload, int user); diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java index 3eb3e0f3b69f..89610e99a718 100644 --- a/core/java/android/app/NotificationManager.java +++ b/core/java/android/app/NotificationManager.java @@ -470,6 +470,20 @@ public class NotificationManager } /** + * Deletes all automatic zen rules owned by the given package. + * + * @hide + */ + public boolean removeAutomaticZenRules(String packageName) { + INotificationManager service = getService(); + try { + return service.removeAutomaticZenRules(packageName); + } catch (RemoteException e) { + } + return false; + } + + /** * Checks the ability to read/modify notification policy for the calling package. * * <p> diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index b73fa50dcf15..6cc549745f66 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -159,6 +159,16 @@ public abstract class Context { */ public static final int MODE_ENABLE_WRITE_AHEAD_LOGGING = 0x0008; + /** + * Database open flag: when set, the database is opened without support for + * localized collators. + * + * @see #openOrCreateDatabase(String, int, CursorFactory) + * @see #openOrCreateDatabase(String, int, CursorFactory, DatabaseErrorHandler) + * @see SQLiteDatabase#NO_LOCALIZED_COLLATORS + */ + public static final int MODE_NO_LOCALIZED_COLLATORS = 0x0010; + /** @hide */ @IntDef(flag = true, value = { @@ -1271,6 +1281,7 @@ public abstract class Context { * default operation, {@link #MODE_WORLD_READABLE} * and {@link #MODE_WORLD_WRITEABLE} to control permissions. * Use {@link #MODE_ENABLE_WRITE_AHEAD_LOGGING} to enable write-ahead logging by default. + * Use {@link #MODE_NO_LOCALIZED_COLLATORS} to disable localized collators. * @param factory An optional factory class that is called to instantiate a * cursor when query is called. * @@ -1281,6 +1292,7 @@ public abstract class Context { * @see #MODE_WORLD_READABLE * @see #MODE_WORLD_WRITEABLE * @see #MODE_ENABLE_WRITE_AHEAD_LOGGING + * @see #MODE_NO_LOCALIZED_COLLATORS * @see #deleteDatabase */ public abstract SQLiteDatabase openOrCreateDatabase(String name, @@ -1298,6 +1310,7 @@ public abstract class Context { * default operation, {@link #MODE_WORLD_READABLE} * and {@link #MODE_WORLD_WRITEABLE} to control permissions. * Use {@link #MODE_ENABLE_WRITE_AHEAD_LOGGING} to enable write-ahead logging by default. + * Use {@link #MODE_NO_LOCALIZED_COLLATORS} to disable localized collators. * @param factory An optional factory class that is called to instantiate a * cursor when query is called. * @param errorHandler the {@link DatabaseErrorHandler} to be used when sqlite reports database @@ -1309,6 +1322,7 @@ public abstract class Context { * @see #MODE_WORLD_READABLE * @see #MODE_WORLD_WRITEABLE * @see #MODE_ENABLE_WRITE_AHEAD_LOGGING + * @see #MODE_NO_LOCALIZED_COLLATORS * @see #deleteDatabase */ public abstract SQLiteDatabase openOrCreateDatabase(String name, diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index 1aa5c66202f2..bce38f40682a 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -169,7 +169,7 @@ public abstract class BatteryStats implements Parcelable { /** * Current version of checkin data format. */ - static final String CHECKIN_VERSION = "16"; + static final String CHECKIN_VERSION = "17"; /** * Old version, we hit 9 and ran out of room, need to remove. @@ -407,17 +407,23 @@ public abstract class BatteryStats implements Parcelable { public abstract Timer getCameraTurnedOnTimer(); public abstract Timer getForegroundActivityTimer(); - // Time this uid has any processes in foreground state. - public static final int PROCESS_STATE_FOREGROUND = 0; - // Time this uid has any process in active state (not cached). - public static final int PROCESS_STATE_ACTIVE = 1; + // Time this uid has any processes in the top state. + public static final int PROCESS_STATE_TOP = 0; + // Time this uid has any process with a started out bound foreground service. + public static final int PROCESS_STATE_FOREGROUND_SERVICE = 1; + // Time this uid has any process that is top while the device is sleeping. + public static final int PROCESS_STATE_TOP_SLEEPING = 2; + // Time this uid has any process in an active foreground state. + public static final int PROCESS_STATE_FOREGROUND = 3; + // Time this uid has any process in an active background state. + public static final int PROCESS_STATE_BACKGROUND = 4; // Time this uid has any processes running at all. - public static final int PROCESS_STATE_RUNNING = 2; + public static final int PROCESS_STATE_CACHED = 5; // Total number of process states we track. - public static final int NUM_PROCESS_STATE = 3; + public static final int NUM_PROCESS_STATE = 6; static final String[] PROCESS_STATE_NAMES = { - "Foreground", "Active", "Running" + "Top", "Fg Service", "Top Sleeping", "Foreground", "Background", "Cached" }; public abstract long getProcessStateTime(int state, long elapsedRealtimeUs, int which); @@ -2954,8 +2960,9 @@ public abstract class BatteryStats implements Parcelable { final Object[] stateTimes = new Object[Uid.NUM_PROCESS_STATE]; long totalStateTime = 0; for (int ips=0; ips<Uid.NUM_PROCESS_STATE; ips++) { - totalStateTime += u.getProcessStateTime(ips, rawRealtime, which); - stateTimes[ips] = (totalStateTime + 500) / 1000; + final long time = u.getProcessStateTime(ips, rawRealtime, which); + totalStateTime += time; + stateTimes[ips] = (time + 500) / 1000; } if (totalStateTime > 0) { dumpLine(pw, uid, category, STATE_TIME_DATA, stateTimes); @@ -4122,11 +4129,18 @@ public abstract class BatteryStats implements Parcelable { sb.append(" "); sb.append(Uid.PROCESS_STATE_NAMES[ips]); sb.append(" for: "); - formatTimeMs(sb, (totalStateTime + 500) / 1000); + formatTimeMs(sb, (time + 500) / 1000); pw.println(sb.toString()); uidActivity = true; } } + if (totalStateTime > 0) { + sb.setLength(0); + sb.append(prefix); + sb.append(" Total running: "); + formatTimeMs(sb, (totalStateTime + 500) / 1000); + pw.println(sb.toString()); + } final long userCpuTimeUs = u.getUserCpuTimeUs(which); final long systemCpuTimeUs = u.getSystemCpuTimeUs(which); diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index 4723025c59e9..79390d4696d7 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -755,6 +755,23 @@ public class UserManager { } /** + * Return whether the given user is running in an "unlocked" state. A user + * is unlocked only after they've entered their credentials (such as a lock + * pattern or PIN), and credential-encrypted private app data storage is + * available. + * + * @param user to retrieve the unlocked state for. + */ + public boolean isUserRunningUnlocked(UserHandle user) { + try { + return ActivityManagerNative.getDefault().isUserRunning( + user.getIdentifier(), ActivityManager.FLAG_AND_UNLOCKED); + } catch (RemoteException e) { + return false; + } + } + + /** * Returns the UserInfo object describing a specific user. * Requires {@link android.Manifest.permission#MANAGE_USERS} permission. * @param userHandle the user handle of the user whose information is being requested. diff --git a/core/java/android/service/notification/ZenModeConfig.java b/core/java/android/service/notification/ZenModeConfig.java index b3399d063807..541623d736f1 100644 --- a/core/java/android/service/notification/ZenModeConfig.java +++ b/core/java/android/service/notification/ZenModeConfig.java @@ -1110,7 +1110,7 @@ public class ZenModeConfig implements Parcelable { if (!Objects.equals(id, to.id)) { d.addLine(item, "id", id, to.id); } - if (creationTime == to.creationTime) { + if (creationTime != to.creationTime) { d.addLine(item, "creationTime", creationTime, to.creationTime); } } diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java index 0ed72e4df02b..0dd803a23d30 100644 --- a/core/java/android/widget/RemoteViews.java +++ b/core/java/android/widget/RemoteViews.java @@ -1666,6 +1666,7 @@ public class RemoteViews implements Parcelable, Filter { ViewGroup.LayoutParams layoutParams = target.getLayoutParams(); if (layoutParams instanceof ViewGroup.MarginLayoutParams) { ((ViewGroup.MarginLayoutParams) layoutParams).setMarginEnd(end); + target.setLayoutParams(layoutParams); } } diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 9391c6038fbc..4a969b28e784 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -105,7 +105,7 @@ public final class BatteryStatsImpl extends BatteryStats { private static final int MAGIC = 0xBA757475; // 'BATSTATS' // Current on-disk Parcel version - private static final int VERSION = 136 + (USE_OLD_HISTORY ? 1000 : 0); + private static final int VERSION = 138 + (USE_OLD_HISTORY ? 1000 : 0); // Maximum number of items we will record in the history. private static final int MAX_HISTORY_ITEMS = 2000; @@ -2621,10 +2621,9 @@ public final class BatteryStatsImpl extends BatteryStats { } } - public void noteProcessStateLocked(String name, int uid, int state) { + public void noteUidProcessStateLocked(int uid, int state) { uid = mapUid(uid); - final long elapsedRealtime = SystemClock.elapsedRealtime(); - getUidStatsLocked(uid).updateProcessStateLocked(name, state, elapsedRealtime); + getUidStatsLocked(uid).updateUidProcessStateLocked(state); } public void noteProcessFinishLocked(String name, int uid) { @@ -2632,13 +2631,11 @@ public final class BatteryStatsImpl extends BatteryStats { if (!mActiveEvents.updateState(HistoryItem.EVENT_PROC_FINISH, name, uid, 0)) { return; } - final long elapsedRealtime = SystemClock.elapsedRealtime(); - final long uptime = SystemClock.uptimeMillis(); - getUidStatsLocked(uid).updateProcessStateLocked(name, Uid.PROCESS_STATE_NONE, - elapsedRealtime); if (!mRecordAllHistory) { return; } + final long elapsedRealtime = SystemClock.elapsedRealtime(); + final long uptime = SystemClock.uptimeMillis(); addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_PROC_FINISH, name, uid); } @@ -4446,8 +4443,7 @@ public final class BatteryStatsImpl extends BatteryStats { StopwatchTimer mForegroundActivityTimer; - static final int PROCESS_STATE_NONE = NUM_PROCESS_STATE; - int mProcessState = PROCESS_STATE_NONE; + int mProcessState = ActivityManager.PROCESS_STATE_NONEXISTENT; StopwatchTimer[] mProcessStateTimer; BatchTimer mVibratorOnTimer; @@ -4812,21 +4808,6 @@ public final class BatteryStatsImpl extends BatteryStats { } } - void updateUidProcessStateLocked(int state, long elapsedRealtimeMs) { - if (mProcessState == state) return; - - if (mProcessState != PROCESS_STATE_NONE) { - mProcessStateTimer[mProcessState].stopRunningLocked(elapsedRealtimeMs); - } - mProcessState = state; - if (state != PROCESS_STATE_NONE) { - if (mProcessStateTimer[state] == null) { - makeProcessState(state, null); - } - mProcessStateTimer[state].startRunningLocked(elapsedRealtimeMs); - } - } - public BatchTimer createVibratorOnTimerLocked() { if (mVibratorOnTimer == null) { mVibratorOnTimer = new BatchTimer(Uid.this, VIBRATOR_ON, mOnBatteryTimeBase); @@ -5167,7 +5148,7 @@ public final class BatteryStatsImpl extends BatteryStats { active |= !mProcessStateTimer[i].reset(false); } } - active |= (mProcessState != PROCESS_STATE_NONE); + active |= (mProcessState != ActivityManager.PROCESS_STATE_NONEXISTENT); } if (mVibratorOnTimer != null) { if (mVibratorOnTimer.reset(false)) { @@ -5261,14 +5242,9 @@ public final class BatteryStatsImpl extends BatteryStats { } for (int ip=mProcessStats.size()-1; ip>=0; ip--) { Proc proc = mProcessStats.valueAt(ip); - if (proc.mProcessState == PROCESS_STATE_NONE) { - proc.detach(); - mProcessStats.removeAt(ip); - } else { - proc.reset(); - active = true; - } + proc.detach(); } + mProcessStats.clear(); if (mPids.size() > 0) { for (int i=mPids.size()-1; i>=0; i--) { Pid pid = mPids.valueAt(i); @@ -5697,7 +5673,7 @@ public final class BatteryStatsImpl extends BatteryStats { } else { mForegroundActivityTimer = null; } - mProcessState = PROCESS_STATE_NONE; + mProcessState = ActivityManager.PROCESS_STATE_NONEXISTENT; for (int i = 0; i < NUM_PROCESS_STATE; i++) { if (in.readInt() != 0) { makeProcessState(i, in); @@ -6080,11 +6056,6 @@ public final class BatteryStatsImpl extends BatteryStats { */ int mUnpluggedNumAnrs; - /** - * Current process state. - */ - int mProcessState = PROCESS_STATE_NONE; - ArrayList<ExcessivePower> mExcessivePower; Proc(String name) { @@ -6104,16 +6075,6 @@ public final class BatteryStatsImpl extends BatteryStats { public void onTimeStopped(long elapsedRealtime, long baseUptime, long baseRealtime) { } - void reset() { - mUserTime = mSystemTime = mForegroundTime = 0; - mStarts = mNumCrashes = mNumAnrs = 0; - mLoadedUserTime = mLoadedSystemTime = mLoadedForegroundTime = 0; - mLoadedStarts = mLoadedNumCrashes = mLoadedNumAnrs = 0; - mUnpluggedUserTime = mUnpluggedSystemTime = mUnpluggedForegroundTime = 0; - mUnpluggedStarts = mUnpluggedNumCrashes = mUnpluggedNumAnrs = 0; - mExcessivePower = null; - } - void detach() { mActive = false; mOnBatteryTimeBase.remove(this); @@ -6668,46 +6629,39 @@ public final class BatteryStatsImpl extends BatteryStats { return ps; } - public void updateProcessStateLocked(String procName, int state, long elapsedRealtimeMs) { - int procState; - if (state <= ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND) { - procState = PROCESS_STATE_FOREGROUND; - } else if (state <= ActivityManager.PROCESS_STATE_RECEIVER) { - procState = PROCESS_STATE_ACTIVE; + public void updateUidProcessStateLocked(int procState) { + int uidRunningState; + if (procState == ActivityManager.PROCESS_STATE_NONEXISTENT) { + uidRunningState = ActivityManager.PROCESS_STATE_NONEXISTENT; + } else if (procState == ActivityManager.PROCESS_STATE_TOP) { + uidRunningState = PROCESS_STATE_TOP; + } else if (procState <= ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE) { + // Persistent and other foreground states go here. + uidRunningState = PROCESS_STATE_FOREGROUND_SERVICE; + } else if (procState <= ActivityManager.PROCESS_STATE_TOP_SLEEPING) { + uidRunningState = PROCESS_STATE_TOP_SLEEPING; + } else if (procState <= ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND) { + // Persistent and other foreground states go here. + uidRunningState = PROCESS_STATE_FOREGROUND; + } else if (procState <= ActivityManager.PROCESS_STATE_RECEIVER) { + uidRunningState = PROCESS_STATE_BACKGROUND; } else { - procState = PROCESS_STATE_RUNNING; + uidRunningState = PROCESS_STATE_CACHED; } - updateRealProcessStateLocked(procName, procState, elapsedRealtimeMs); - } - public void updateRealProcessStateLocked(String procName, int procState, - long elapsedRealtimeMs) { - Proc proc = getProcessStatsLocked(procName); - if (proc.mProcessState != procState) { - boolean changed; - if (procState < proc.mProcessState) { - // Has this process become more important? If so, - // we may need to change the uid if the currrent uid proc state - // is not as important as what we are now setting. - changed = mProcessState > procState; - } else { - // Has this process become less important? If so, - // we may need to change the uid if the current uid proc state - // is the same importance as the old setting. - changed = mProcessState == proc.mProcessState; - } - proc.mProcessState = procState; - if (changed) { - // uid's state may have changed; compute what the new state should be. - int uidProcState = PROCESS_STATE_NONE; - for (int ip=mProcessStats.size()-1; ip>=0; ip--) { - proc = mProcessStats.valueAt(ip); - if (proc.mProcessState < uidProcState) { - uidProcState = proc.mProcessState; - } - } - updateUidProcessStateLocked(uidProcState, elapsedRealtimeMs); + if (mProcessState == uidRunningState) return; + + final long elapsedRealtime = SystemClock.elapsedRealtime(); + + if (mProcessState != ActivityManager.PROCESS_STATE_NONEXISTENT) { + mProcessStateTimer[mProcessState].stopRunningLocked(elapsedRealtime); + } + mProcessState = uidRunningState; + if (uidRunningState != ActivityManager.PROCESS_STATE_NONEXISTENT) { + if (mProcessStateTimer[uidRunningState] == null) { + makeProcessState(uidRunningState, null); } + mProcessStateTimer[uidRunningState].startRunningLocked(elapsedRealtime); } } @@ -9423,7 +9377,7 @@ public final class BatteryStatsImpl extends BatteryStats { if (in.readInt() != 0) { u.createForegroundActivityTimerLocked().readSummaryFromParcelLocked(in); } - u.mProcessState = Uid.PROCESS_STATE_NONE; + u.mProcessState = ActivityManager.PROCESS_STATE_NONEXISTENT; for (int i = 0; i < Uid.NUM_PROCESS_STATE; i++) { if (in.readInt() != 0) { u.makeProcessState(i, null); diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java index b0421b02bf9e..be3013b4ef72 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java @@ -741,45 +741,45 @@ public class DirectoryFragment extends Fragment { Selection selection = mSelectionManager.getSelection(new Selection()); - final int id = item.getItemId(); - if (id == R.id.menu_open) { - openDocuments(selection); - mode.finish(); - return true; + switch (item.getItemId()) { + case R.id.menu_open: + openDocuments(selection); + mode.finish(); + return true; - } else if (id == R.id.menu_share) { - shareDocuments(selection); - mode.finish(); - return true; + case R.id.menu_share: + shareDocuments(selection); + mode.finish(); + return true; - } else if (id == R.id.menu_delete) { - // Exit selection mode first, so we avoid deselecting deleted documents. - mode.finish(); - deleteDocuments(selection); - return true; + case R.id.menu_delete: + // Exit selection mode first, so we avoid deselecting deleted documents. + mode.finish(); + deleteDocuments(selection); + return true; - } else if (id == R.id.menu_copy_to) { - transferDocuments(selection, CopyService.TRANSFER_MODE_COPY); - mode.finish(); - return true; + case R.id.menu_copy_to: + transferDocuments(selection, CopyService.TRANSFER_MODE_COPY); + mode.finish(); + return true; - } else if (id == R.id.menu_move_to) { - // Exit selection mode first, so we avoid deselecting deleted documents. - mode.finish(); - transferDocuments(selection, CopyService.TRANSFER_MODE_MOVE); - return true; + case R.id.menu_move_to: + // Exit selection mode first, so we avoid deselecting deleted documents. + mode.finish(); + transferDocuments(selection, CopyService.TRANSFER_MODE_MOVE); + return true; - } else if (id == R.id.menu_copy_to_clipboard) { - copySelectionToClipboard(selection); - mode.finish(); - return true; + case R.id.menu_copy_to_clipboard: + copySelectionToClipboard(selection); + return true; - } else if (id == R.id.menu_select_all) { - selectAllFiles(); - return true; + case R.id.menu_select_all: + selectAllFiles(); + return true; - } else { - return false; + default: + if (DEBUG) Log.d(TAG, "Unhandled menu item selected: " + item); + return false; } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java index 6f8cd8c10c8b..da3cd54a91e3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java @@ -130,6 +130,7 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView private final int mLowPriorityColor; private boolean mIsBelowSpeedBump; private FalsingManager mFalsingManager; + private boolean mTrackTouch; public ActivatableNotificationView(Context context, AttributeSet attrs) { super(context, attrs); @@ -175,12 +176,27 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView }; @Override - public boolean onTouchEvent(MotionEvent event) { - if (mDimmed) { + public boolean dispatchTouchEvent(MotionEvent event) { + if (mDimmed && !mActivated) { return handleTouchEventDimmed(event); } else { - return super.onTouchEvent(event); + return super.dispatchTouchEvent(event); + } + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + boolean result; + if (mDimmed && mActivated) { + result = handleTouchEventDimmed(event); + } else { + result = super.onTouchEvent(event); + } + if (mActivated && result && event.getAction() == MotionEvent.ACTION_UP) { + mFalsingManager.onNotificationDoubleTap(); + removeCallbacks(mTapTimeoutRunnable); } + return result; } @Override @@ -206,14 +222,15 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView case MotionEvent.ACTION_DOWN: mDownX = event.getX(); mDownY = event.getY(); + mTrackTouch = true; if (mDownY > getActualHeight()) { - return false; + mTrackTouch = false; } break; case MotionEvent.ACTION_MOVE: if (!isWithinTouchSlop(event)) { makeInactive(true /* animate */); - return false; + mTrackTouch = false; } break; case MotionEvent.ACTION_UP: @@ -222,23 +239,23 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView makeActive(); postDelayed(mTapTimeoutRunnable, DOUBLETAP_TIMEOUT_MS); } else { - mFalsingManager.onNotificationDoubleTap(); - boolean performed = performClick(); - if (performed) { - removeCallbacks(mTapTimeoutRunnable); + if (!performClick()) { + return false; } } } else { makeInactive(true /* animate */); + mTrackTouch = false; } break; case MotionEvent.ACTION_CANCEL: makeInactive(true /* animate */); + mTrackTouch = false; break; default: break; } - return true; + return mTrackTouch; } private void makeActive() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index 5d4c64e8cec3..3c7ff7f13146 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -116,7 +116,8 @@ import static com.android.keyguard.KeyguardHostView.OnDismissAction; public abstract class BaseStatusBar extends SystemUI implements CommandQueue.Callbacks, ActivatableNotificationView.OnActivatedListener, - ExpandableNotificationRow.ExpansionLogger, NotificationData.Environment { + ExpandableNotificationRow.ExpansionLogger, NotificationData.Environment, + ExpandableNotificationRow.OnExpandClickListener { public static final String TAG = "StatusBar"; public static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); public static final boolean MULTIUSER_DEBUG = false; @@ -1298,9 +1299,14 @@ public abstract class BaseStatusBar extends SystemUI implements // Since the number of notifications is determined based on the height of the view, we // need to update them. updateRowStates(); + mStackScroller.onHeightChanged(null, false); } } + @Override + public void onExpandClicked(View clickedView, boolean nowExpanded) { + } + protected class H extends Handler { public void handleMessage(Message m) { switch (m.what) { @@ -1381,6 +1387,7 @@ public abstract class BaseStatusBar extends SystemUI implements parent, false); row.setExpansionLogger(this, entry.notification.getKey()); row.setGroupManager(mGroupManager); + row.setOnExpandClickListener(this); } workAroundBadLayerDrawableOpacity(row); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java index 81e20aaf13ee..7a94a58297b3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java @@ -104,14 +104,20 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { private boolean mIconAnimationRunning; private boolean mShowNoBackground; private ExpandableNotificationRow mNotificationParent; + private OnExpandClickListener mOnExpandClickListener; private OnClickListener mExpandClickListener = new OnClickListener() { @Override public void onClick(View v) { if (mGroupManager.isSummaryOfGroup(mStatusBarNotification)) { mGroupManager.toggleGroupExpansion(mStatusBarNotification); + mOnExpandClickListener.onExpandClicked(ExpandableNotificationRow.this, + mGroupManager.isGroupExpanded(mStatusBarNotification)); } else { - setUserExpanded(!isExpanded()); + boolean nowExpanded = !isExpanded(); + setUserExpanded(nowExpanded); notifyHeightChanged(true); + mOnExpandClickListener.onExpandClicked(ExpandableNotificationRow.this, + nowExpanded); } } }; @@ -421,6 +427,10 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { mPrivateLayout.setSubTextVisible(visible); } + public void setOnExpandClickListener(OnExpandClickListener onExpandClickListener) { + mOnExpandClickListener = onExpandClickListener; + } + public interface ExpansionLogger { public void logNotificationExpansion(String key, boolean userAction, boolean expanded); } @@ -986,4 +996,8 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { mLogger.logNotificationExpansion(mLoggingKey, userAction, nowExpanded) ; } } + + public interface OnExpandClickListener { + void onExpandClicked(View clickedView, boolean nowExpanded); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index c0e3ec1f6889..73ee363a61cf 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -955,15 +955,7 @@ public class NotificationPanelView extends PanelView implements mQsTracking = false; mTrackingPointer = -1; trackMovement(event); - float fraction = getQsExpansionFraction(); - if ((fraction != 0f || y >= mInitialTouchY) - && (fraction != 1f || y <= mInitialTouchY)) { - flingQsWithCurrentVelocity(y, - event.getActionMasked() == MotionEvent.ACTION_CANCEL); - } else { - logQsSwipeDown(y); - mScrollYOverride = -1; - } + flingQsWithCurrentVelocity(y, event.getActionMasked() == MotionEvent.ACTION_CANCEL); if (mVelocityTracker != null) { mVelocityTracker.recycle(); mVelocityTracker = null; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 05660ecb383b..685c4e5b06ee 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -25,7 +25,6 @@ import android.app.ActivityManagerNative; import android.app.IActivityManager; import android.app.Notification; import android.app.PendingIntent; -import android.app.RemoteInput; import android.app.StatusBarManager; import android.content.BroadcastReceiver; import android.content.ComponentCallbacks2; @@ -3999,6 +3998,13 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } } + @Override + public void onExpandClicked(View clickedView, boolean nowExpanded) { + if (mState == StatusBarState.KEYGUARD && nowExpanded) { + goToLockedShade(clickedView); + } + } + /** * Goes back to the keyguard after hanging around in {@link StatusBarState#SHADE_LOCKED}. */ diff --git a/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java b/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java index 76b234694790..2fe6648d82da 100644 --- a/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java +++ b/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java @@ -19,6 +19,7 @@ package com.android.vpndialogs; import android.content.Context; import android.content.DialogInterface; import android.net.IConnectivityManager; +import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.ServiceManager; @@ -50,8 +51,8 @@ public class ManageDialog extends AlertActivity implements private Handler mHandler; @Override - protected void onResume() { - super.onResume(); + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); if (getCallingPackage() != null) { Log.e(TAG, getCallingPackage() + " cannot start this activity"); @@ -108,11 +109,11 @@ public class ManageDialog extends AlertActivity implements } @Override - protected void onPause() { - super.onPause(); + protected void onDestroy() { if (!isFinishing()) { finish(); } + super.onDestroy(); } @Override diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 7649f9316dde..b0f1fc829f63 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -2771,57 +2771,60 @@ public final class ActivityManagerService extends ActivityManagerNative } final void setFocusedActivityLocked(ActivityRecord r, String reason) { - if (r != null && mFocusedActivity != r) { - if (DEBUG_FOCUS) Slog.d(TAG_FOCUS, "setFocusedActivityLocked: r=" + r); - ActivityRecord last = mFocusedActivity; - mFocusedActivity = r; - if (r.task.taskType != ActivityRecord.HOME_ACTIVITY_TYPE - && r.task.taskType != ActivityRecord.RECENTS_ACTIVITY_TYPE) { - if (mCurAppTimeTracker != r.appTimeTracker) { - // We are switching app tracking. Complete the current one. - if (mCurAppTimeTracker != null) { - mCurAppTimeTracker.stop(); - mHandler.obtainMessage(REPORT_TIME_TRACKER_MSG, - mCurAppTimeTracker).sendToTarget(); - mStackSupervisor.clearOtherAppTimeTrackers(r.appTimeTracker); - mCurAppTimeTracker = null; - } - if (r.appTimeTracker != null) { - mCurAppTimeTracker = r.appTimeTracker; - startTimeTrackingFocusedActivityLocked(); - } - } else { + if (r == null || mFocusedActivity == r) { + return; + } + + if (DEBUG_FOCUS) Slog.d(TAG_FOCUS, "setFocusedActivityLocked: r=" + r); + final ActivityRecord last = mFocusedActivity; + mFocusedActivity = r; + if (r.task.isApplicationTask()) { + if (mCurAppTimeTracker != r.appTimeTracker) { + // We are switching app tracking. Complete the current one. + if (mCurAppTimeTracker != null) { + mCurAppTimeTracker.stop(); + mHandler.obtainMessage( + REPORT_TIME_TRACKER_MSG, mCurAppTimeTracker).sendToTarget(); + mStackSupervisor.clearOtherAppTimeTrackers(r.appTimeTracker); + mCurAppTimeTracker = null; + } + if (r.appTimeTracker != null) { + mCurAppTimeTracker = r.appTimeTracker; startTimeTrackingFocusedActivityLocked(); } } else { - r.appTimeTracker = null; - } - if (r.task != null && r.task.voiceInteractor != null) { - startRunningVoiceLocked(r.task.voiceSession, r.info.applicationInfo.uid); - } else { - finishRunningVoiceLocked(); - if (last != null && last.task.voiceSession != null) { - // We had been in a voice interaction session, but now focused has - // move to something different. Just finish the session, we can't - // return to it and retain the proper state and synchronization with - // the voice interaction service. - finishVoiceTask(last.task.voiceSession); - } - } - if (mStackSupervisor.setFocusedStack(r, reason + " setFocusedActivity")) { - mWindowManager.setFocusedApp(r.appToken, true); + startTimeTrackingFocusedActivityLocked(); } - applyUpdateLockStateLocked(r); - if (mFocusedActivity.userId != mLastFocusedUserId) { - mHandler.removeMessages(FOREGROUND_PROFILE_CHANGED_MSG); - mHandler.sendMessage(mHandler.obtainMessage(FOREGROUND_PROFILE_CHANGED_MSG, - mFocusedActivity.userId, 0)); - mLastFocusedUserId = mFocusedActivity.userId; + } else { + r.appTimeTracker = null; + } + if (r.task.voiceInteractor != null) { + startRunningVoiceLocked(r.task.voiceSession, r.info.applicationInfo.uid); + } else { + finishRunningVoiceLocked(); + if (last != null && last.task.voiceSession != null) { + // We had been in a voice interaction session, but now focused has + // move to something different. Just finish the session, we can't + // return to it and retain the proper state and synchronization with + // the voice interaction service. + finishVoiceTask(last.task.voiceSession); } } - EventLog.writeEvent(EventLogTags.AM_FOCUSED_ACTIVITY, + if (mStackSupervisor.setFocusedStack(r, reason + " setFocusedActivity")) { + mWindowManager.setFocusedApp(r.appToken, true); + } + applyUpdateLockStateLocked(r); + if (mFocusedActivity.userId != mLastFocusedUserId) { + mHandler.removeMessages(FOREGROUND_PROFILE_CHANGED_MSG); + mHandler.obtainMessage( + FOREGROUND_PROFILE_CHANGED_MSG, mFocusedActivity.userId, 0).sendToTarget(); + mLastFocusedUserId = mFocusedActivity.userId; + } + + EventLogTags.writeAmFocusedActivity( mFocusedActivity == null ? -1 : mFocusedActivity.userId, - mFocusedActivity == null ? "NULL" : mFocusedActivity.shortComponentName); + mFocusedActivity == null ? "NULL" : mFocusedActivity.shortComponentName, + reason); } final void clearFocusedActivity(ActivityRecord r) { @@ -2837,7 +2840,7 @@ public final class ActivityManagerService extends ActivityManagerNative } } mFocusedActivity = null; - EventLog.writeEvent(EventLogTags.AM_FOCUSED_ACTIVITY, -1, "NULL"); + EventLogTags.writeAmFocusedActivity(-1, "NULL", "clearFocusedActivity"); } } @@ -5386,6 +5389,11 @@ public final class ActivityManagerService extends ActivityManagerNative removeUriPermissionsForPackageLocked(packageName, userId, true); } + // Remove all zen rules created by this package; revoke it's zen access. + INotificationManager inm = NotificationManager.getService(); + inm.removeAutomaticZenRules(packageName); + inm.setNotificationPolicyAccessGranted(packageName, false); + Intent intent = new Intent(Intent.ACTION_PACKAGE_DATA_CLEARED, Uri.fromParts("package", packageName, null)); intent.putExtra(Intent.EXTRA_UID, pkgUid); @@ -6069,6 +6077,8 @@ public final class ActivityManagerService extends ActivityManagerNative "No more processes in " + old.uidRecord); enqueueUidChangeLocked(old.uidRecord, -1, UidRecord.CHANGE_GONE); mActiveUids.remove(uid); + mBatteryStatsService.noteUidProcessState(uid, + ActivityManager.PROCESS_STATE_NONEXISTENT); } old.uidRecord = null; } @@ -6093,6 +6103,7 @@ public final class ActivityManagerService extends ActivityManagerNative if (DEBUG_UID_OBSERVERS) Slog.i(TAG_UID_OBSERVERS, "Creating new process uid: " + uidRec); mActiveUids.put(proc.uid, uidRec); + mBatteryStatsService.noteUidProcessState(uidRec.uid, uidRec.curProcState); enqueueUidChangeLocked(uidRec, -1, UidRecord.CHANGE_ACTIVE); } proc.uidRecord = uidRec; @@ -19494,10 +19505,6 @@ public final class ActivityManagerService extends ActivityManagerNative if (proc.baseProcessTracker != null) { proc.baseProcessTracker.setState(proc.repProcState, memFactor, now, proc.pkgList); } - if (proc.repProcState >= 0) { - mBatteryStatsService.noteProcessState(proc.processName, proc.info.uid, - proc.repProcState); - } } } @@ -19997,6 +20004,7 @@ public final class ActivityManagerService extends ActivityManagerNative } uidRec.setProcState = uidRec.curProcState; enqueueUidChangeLocked(uidRec, -1, uidChange); + mBatteryStatsService.noteUidProcessState(uidRec.uid, uidRec.curProcState); } } diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index da2c8c5cda6e..02a372a6a08a 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -54,7 +54,6 @@ import android.app.IActivityController; import android.app.ResultInfo; import android.app.ActivityManager.RunningTaskInfo; import android.content.ComponentName; -import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; @@ -73,7 +72,6 @@ import android.os.RemoteException; import android.os.SystemClock; import android.os.Trace; import android.os.UserHandle; -import android.provider.Settings; import android.service.voice.IVoiceInteractionSession; import android.util.EventLog; import android.util.Slog; @@ -2827,41 +2825,43 @@ final class ActivityStack { } private void adjustFocusedActivityLocked(ActivityRecord r, String reason) { - if (mStackSupervisor.isFocusedStack(this) && mService.mFocusedActivity == r) { - ActivityRecord next = topRunningActivityLocked(); - final String myReason = reason + " adjustFocus"; - if (next != r) { - if (next != null && StackId.keepFocusInStackIfPossible(mStackId)) { - // For freeform, docked, and pinned stacks we always keep the focus within the - // stack as long as there is a running activity in the stack that we can adjust - // focus to. - mService.setFocusedActivityLocked(next, myReason); - return; - } else { - final TaskRecord task = r.task; - if (r.frontOfTask && task == topTask() && task.isOverHomeStack()) { - // For non-fullscreen stack, we want to move the focus to the next visible - // stack to prevent the home screen from moving to the top and obscuring - // other visible stacks. - if (!mFullscreen - && adjustFocusToNextVisibleStackLocked(null, myReason)) { - return; - } - // Move the home stack to the top if this stack is fullscreen or there is no - // other visible stack. - if (mStackSupervisor.moveHomeStackTaskToTop( - task.getTaskToReturnTo(), myReason)) { - // Activity focus was already adjusted. Nothing else to do... - return; - } + if (!mStackSupervisor.isFocusedStack(this) || mService.mFocusedActivity != r) { + return; + } + + final ActivityRecord next = topRunningActivityLocked(); + final String myReason = reason + " adjustFocus"; + if (next != r) { + if (next != null && StackId.keepFocusInStackIfPossible(mStackId)) { + // For freeform, docked, and pinned stacks we always keep the focus within the + // stack as long as there is a running activity in the stack that we can adjust + // focus to. + mService.setFocusedActivityLocked(next, myReason); + return; + } else { + final TaskRecord task = r.task; + if (r.frontOfTask && task == topTask() && task.isOverHomeStack()) { + // For non-fullscreen stack, we want to move the focus to the next visible + // stack to prevent the home screen from moving to the top and obscuring + // other visible stacks. + if (!mFullscreen + && adjustFocusToNextVisibleStackLocked(null, myReason)) { + return; + } + // Move the home stack to the top if this stack is fullscreen or there is no + // other visible stack. + if (mStackSupervisor.moveHomeStackTaskToTop( + task.getTaskToReturnTo(), myReason)) { + // Activity focus was already adjusted. Nothing else to do... + return; } } } + } - final ActivityRecord top = mStackSupervisor.topRunningActivityLocked(); - if (top != null) { - mService.setFocusedActivityLocked(top, myReason); - } + final ActivityRecord top = mStackSupervisor.topRunningActivityLocked(); + if (top != null) { + mService.setFocusedActivityLocked(top, myReason); } } diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index c7228ce47683..f64b80323b91 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -272,15 +272,15 @@ public final class BatteryStatsService extends IBatteryStats.Stub } } - void noteProcessState(String name, int uid, int state) { + void noteProcessFinish(String name, int uid) { synchronized (mStats) { - mStats.noteProcessStateLocked(name, uid, state); + mStats.noteProcessFinishLocked(name, uid); } } - void noteProcessFinish(String name, int uid) { + void noteUidProcessState(int uid, int state) { synchronized (mStats) { - mStats.noteProcessFinishLocked(name, uid); + mStats.noteUidProcessStateLocked(uid, state); } } diff --git a/services/core/java/com/android/server/am/EventLogTags.logtags b/services/core/java/com/android/server/am/EventLogTags.logtags index 78b5f3333b2c..03975536816d 100644 --- a/services/core/java/com/android/server/am/EventLogTags.logtags +++ b/services/core/java/com/android/server/am/EventLogTags.logtags @@ -91,7 +91,7 @@ option java_package com.android.server.am 30042 am_activity_fully_drawn_time (User|1|5),(Token|1|5),(Component Name|3),(time|2|3) # Activity focused -30043 am_focused_activity (User|1|5),(Component Name|3) +30043 am_focused_activity (User|1|5),(Component Name|3),(Reason|3) # Stack focus 30044 am_focused_stack (User|1|5),(Focused Stack Id|1|5),(Last Focused Stack Id|1|5),(Reason|3) diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java index 12bd7f97e0cb..3e0ae1785faa 100644 --- a/services/core/java/com/android/server/am/UserController.java +++ b/services/core/java/com/android/server/am/UserController.java @@ -1117,12 +1117,11 @@ final class UserController { if ((flags & ActivityManager.FLAG_OR_STOPPED) != 0) { return true; } - if ((flags & ActivityManager.FLAG_AND_LOCKED) != 0) { - // If user is currently locked, we fall through to default "running" - // behavior below - if (state.unlocked) { - return false; - } + if ((flags & ActivityManager.FLAG_AND_LOCKED) != 0 && state.unlocked) { + return false; + } + if ((flags & ActivityManager.FLAG_AND_UNLOCKED) != 0 && !state.unlocked) { + return false; } return state.mState != UserState.STATE_STOPPING && state.mState != UserState.STATE_SHUTDOWN; diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 38893b8d932c..e0b73701ef07 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -1634,6 +1634,14 @@ public class NotificationManagerService extends SystemService { } @Override + public boolean removeAutomaticZenRules(String packageName) throws RemoteException { + Preconditions.checkNotNull(packageName, "Package name is null"); + enforceSystemOrSystemUI("removeAutomaticZenRules"); + + return mZenModeHelper.removeAutomaticZenRules(packageName, "removeAutomaticZenRules"); + } + + @Override public void setInterruptionFilter(String pkg, int filter) throws RemoteException { enforcePolicyAccess(pkg, "setInterruptionFilter"); final int zen = NotificationManager.zenModeFromInterruptionFilter(filter, -1); diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java index dbdc3f4ca40b..3c891dff5b1d 100644 --- a/services/core/java/com/android/server/notification/ZenModeHelper.java +++ b/services/core/java/com/android/server/notification/ZenModeHelper.java @@ -41,6 +41,7 @@ import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; +import android.os.Process; import android.os.SystemClock; import android.os.UserHandle; import android.provider.Settings.Global; @@ -274,7 +275,7 @@ public class ZenModeHelper { newConfig = mConfig.copy(); } final String ruleId = automaticZenRule.getId(); - ZenModeConfig.ZenRule rule = new ZenModeConfig.ZenRule(); + ZenModeConfig.ZenRule rule; if (ruleId == null) { throw new IllegalArgumentException("Rule doesn't exist"); } else { @@ -307,13 +308,32 @@ public class ZenModeHelper { return setConfig(newConfig, reason, true); } + public boolean removeAutomaticZenRules(String packageName, String reason) { + ZenModeConfig newConfig; + synchronized (mConfig) { + if (mConfig == null) return false; + newConfig = mConfig.copy(); + } + for (int i = newConfig.automaticRules.size() - 1; i >= 0; i--) { + ZenRule rule = newConfig.automaticRules.get(newConfig.automaticRules.keyAt(i)); + if (rule.component.getPackageName().equals(packageName) + && canManageAutomaticZenRule(rule)) { + newConfig.automaticRules.removeAt(i); + } + } + return setConfig(newConfig, reason, true); + } + public boolean canManageAutomaticZenRule(ZenRule rule) { - if (mContext.checkCallingPermission(android.Manifest.permission.MANAGE_NOTIFICATIONS) + final int callingUid = Binder.getCallingUid(); + if (callingUid == 0 || callingUid == Process.SYSTEM_UID) { + return true; + } else if (mContext.checkCallingPermission(android.Manifest.permission.MANAGE_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED) { return true; } else { - String[] packages = mContext.getPackageManager().getPackagesForUid( - Binder.getCallingUid()); + String[] packages = + mContext.getPackageManager().getPackagesForUid(Binder.getCallingUid()); if (packages != null) { final int packageCount = packages.length; for (int i = 0; i < packageCount; i++) { diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index 3301c49da578..3d00e027a009 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -269,6 +269,10 @@ class AppWindowToken extends WindowToken { return candidate; } + boolean stackCanReceiveKeys() { + return (windows.size() > 0) ? windows.get(windows.size() - 1).stackCanReceiveKeys() : false; + } + boolean isVisible() { final int N = allAppWindows.size(); for (int i=0; i<N; i++) { diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index 116c16ecbaaa..611ad407dffe 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -702,26 +702,4 @@ public class TaskStack implements DimLayer.DimLayerUser { } return false; } - - /** - * Returns true if this stack has a window that is fully visible, doesn't perform an entry - * animation and is just positioned where it's supposed to be. - */ - boolean hasWindowWithFinalVisibility() { - for (int i = mTasks.size() - 1; i >= 0; i--) { - Task task = mTasks.get(i); - for (int j = task.mAppTokens.size() - 1; j >= 0; j--) { - final AppWindowToken token = task.mAppTokens.get(j); - if (token.mAppAnimator.animating || token.mWillReplaceWindow) { - continue; - } - WindowState win = token.findMainWindow(); - if (win != null && !win.mWinAnimator.mEnterAnimationPending - && !win.mWinAnimator.mEnteringAnimation) { - return true; - } - } - } - return false; - } } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index dab195f5abba..1bb5ad029c4c 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -2528,10 +2528,12 @@ public class WindowManagerService extends IWindowManager.Stub + "attached to a parent win=" + win); } - win.mFrame.left = left; - win.mFrame.top = top; - win.mFrame.right = right; - win.mFrame.bottom = bottom; + win.mAttrs.x = left; + win.mAttrs.y = top; + win.mAttrs.width = right - left; + win.mAttrs.height = bottom - top; + + win.setWindowScale(win.mRequestedWidth, win.mRequestedHeight); win.mWinAnimator.computeShownFrameLocked(); @@ -9129,8 +9131,9 @@ public class WindowManagerService extends IWindowManager.Stub if (wtoken == token) { break; } - if (mFocusedApp == token) { - // Whoops, we are below the focused app... no focus for you! + if (mFocusedApp == token && token.stackCanReceiveKeys()) { + // Whoops, we are below the focused app whose stack can receive keys... + // No focus for you!!! if (localLOGV || DEBUG_FOCUS_LIGHT) Slog.v(TAG, "findFocusedWindow: Reached focused app=" + mFocusedApp); return null; diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 29cadf3e67c4..cfa2bb370a4e 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -56,6 +56,7 @@ import android.view.WindowManagerPolicy; import java.io.PrintWriter; import java.util.ArrayList; +import static android.app.ActivityManager.StackId; import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER; import static android.view.ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_CONTENT; import static android.view.ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME; @@ -1564,13 +1565,17 @@ final class WindowState implements WindowManagerPolicy.WindowState { } } - /** - * @return true if this window desires key events. - */ - public final boolean canReceiveKeys() { + /** @return true if this window desires key events. */ + boolean canReceiveKeys() { return isVisibleOrAdding() && (mViewVisibility == View.VISIBLE) - && ((mAttrs.flags & WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE) == 0); + && ((mAttrs.flags & WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE) == 0) + && stackCanReceiveKeys(); + } + + boolean stackCanReceiveKeys() { + final TaskStack stack = getStack(); + return stack != null && StackId.canReceiveKeys(stack.mStackId); } @Override |