Merge "Light greylist additions." into pi-dev
diff --git a/config/hiddenapi-light-greylist.txt b/config/hiddenapi-light-greylist.txt
index 5bcdf76..5612ba2 100644
--- a/config/hiddenapi-light-greylist.txt
+++ b/config/hiddenapi-light-greylist.txt
@@ -147,6 +147,7 @@
Landroid/app/admin/IDevicePolicyManager$Stub;->TRANSACTION_packageHasActiveAdmins:I
Landroid/app/admin/IDevicePolicyManager$Stub;->TRANSACTION_removeActiveAdmin:I
Landroid/app/admin/SecurityLog$SecurityEvent;-><init>([B)V
+Landroid/app/ActionBar;->setShowHideAnimationEnabled(Z)V
Landroid/app/AlarmManager;->FLAG_ALLOW_WHILE_IDLE_UNRESTRICTED:I
Landroid/app/AlarmManager;->FLAG_IDLE_UNTIL:I
Landroid/app/AlarmManager;->FLAG_STANDALONE:I
@@ -251,6 +252,7 @@
Landroid/app/DownloadManager$Request;->mUri:Landroid/net/Uri;
Landroid/app/DownloadManager;->setAccessFilename(Z)V
Landroid/app/FragmentManagerImpl;->mAdded:Ljava/util/ArrayList;
+Landroid/app/FragmentManagerImpl;->mStateSaved:Z
Landroid/app/FragmentManagerImpl;->noteStateNotSaved()V
Landroid/app/Fragment;->mChildFragmentManager:Landroid/app/FragmentManagerImpl;
Landroid/app/Fragment;->mWho:Ljava/lang/String;
@@ -686,6 +688,7 @@
Landroid/content/res/AssetManager;->addAssetPathAsSharedLibrary(Ljava/lang/String;)I
Landroid/content/res/AssetManager;->addAssetPath(Ljava/lang/String;)I
Landroid/content/res/AssetManager;->applyStyle(JIILandroid/content/res/XmlBlock$Parser;[IJJ)V
+Landroid/content/res/AssetManager;->createTheme()J
Landroid/content/res/AssetManager;->getAssignedPackageIdentifiers()Landroid/util/SparseArray;
Landroid/content/res/AssetManager;->getResourceBagText(II)Ljava/lang/CharSequence;
Landroid/content/res/AssetManager;->getResourceEntryName(I)Ljava/lang/String;
@@ -2318,6 +2321,7 @@
Landroid/view/Choreographer;->scheduleVsyncLocked()V
Landroid/view/Choreographer;->USE_VSYNC:Z
Landroid/view/ContextThemeWrapper;->getThemeResId()I
+Landroid/view/ContextThemeWrapper;->initializeTheme()V
Landroid/view/ContextThemeWrapper;->mInflater:Landroid/view/LayoutInflater;
Landroid/view/ContextThemeWrapper;->mResources:Landroid/content/res/Resources;
Landroid/view/ContextThemeWrapper;->mTheme:Landroid/content/res/Resources$Theme;
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index 8395681..131fe13 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -128,7 +128,10 @@
void overridePendingAppTransitionRemote(in RemoteAnimationAdapter remoteAnimationAdapter);
void executeAppTransition();
- /** Used by system ui to report that recents has shown itself. */
+ /**
+ * Used by system ui to report that recents has shown itself.
+ * @deprecated to be removed once prebuilts are updated
+ */
void endProlongedAnimations();
// Re-evaluate the current orientation from the caller's state.
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java
index 50c6aac..3b1e4ce 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java
@@ -27,8 +27,10 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.Objects;
/**
@@ -191,6 +193,7 @@
log("updateHearingAidsDevices: getHearingAidProfile() is null");
return;
}
+ final Set<Long> syncIdChangedSet = new HashSet<Long>();
for (CachedBluetoothDevice cachedDevice : mCachedDevices) {
if (cachedDevice.getHiSyncId() != BluetoothHearingAid.HI_SYNC_ID_INVALID) {
continue;
@@ -200,9 +203,12 @@
if (newHiSyncId != BluetoothHearingAid.HI_SYNC_ID_INVALID) {
cachedDevice.setHiSyncId(newHiSyncId);
- onHiSyncIdChanged(newHiSyncId);
+ syncIdChangedSet.add(newHiSyncId);
}
}
+ for (Long syncId : syncIdChangedSet) {
+ onHiSyncIdChanged(syncId);
+ }
}
/**
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java
index c3bd161..bab3cab 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java
@@ -486,11 +486,14 @@
doAnswer((invocation) -> mHearingAidProfile).when(mLocalProfileManager)
.getHearingAidProfile();
doAnswer((invocation) -> HISYNCID1).when(mHearingAidProfile).getHiSyncId(mDevice1);
+ doAnswer((invocation) -> HISYNCID1).when(mHearingAidProfile).getHiSyncId(mDevice2);
mCachedDeviceManager.mCachedDevices.add(mCachedDevice1);
+ mCachedDeviceManager.mCachedDevices.add(mCachedDevice2);
mCachedDeviceManager.updateHearingAidsDevices(mLocalProfileManager);
- // Assert that the mCachedDevice1 has an updated HiSyncId.
+ // Assert that the mCachedDevice1 and mCachedDevice2 have an updated HiSyncId.
assertThat(mCachedDevice1.getHiSyncId()).isEqualTo(HISYNCID1);
+ assertThat(mCachedDevice2.getHiSyncId()).isEqualTo(HISYNCID1);
}
/**
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java
index 9355acf..68e3b92 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java
@@ -104,14 +104,6 @@
}
}
- public void endProlongedAnimations() {
- try {
- WindowManagerGlobal.getWindowManagerService().endProlongedAnimations();
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to end prolonged animations: ", e);
- }
- }
-
/**
* Enable or disable haptic feedback on the navigation bar buttons.
*/
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
index fd9ddb0..b7907a6 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
@@ -284,6 +284,7 @@
final boolean isDemo = UserManager.isDeviceInDemoMode(mContext);
mMultiUserSwitch.setVisibility(showUserSwitcher(isDemo) ? View.VISIBLE : View.INVISIBLE);
mEdit.setVisibility(isDemo || !mExpanded ? View.INVISIBLE : View.VISIBLE);
+ mSettingsButton.setVisibility(isDemo || !mExpanded ? View.INVISIBLE : View.VISIBLE);
}
private boolean showUserSwitcher(boolean isDemo) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
index 5d7dcbb..2dcb723 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
@@ -366,6 +366,7 @@
@Override
public void onAttachedToWindow() {
+ super.onAttachedToWindow();
Dependency.get(StatusBarIconController.class).addIconGroup(mIconManager);
requestApplyInsets();
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
index 95b311f..36a1255 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
@@ -835,9 +835,6 @@
@Override
public boolean onPreDraw() {
mRecentsView.getViewTreeObserver().removeOnPreDrawListener(this);
- // We post to make sure that this information is delivered after this traversals is
- // finished.
- mRecentsView.post(() -> WindowManagerWrapper.getInstance().endProlongedAnimations());
return true;
}
diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto
index cd2e2a4..e33ef1f 100644
--- a/proto/src/metrics_constants.proto
+++ b/proto/src/metrics_constants.proto
@@ -5697,6 +5697,26 @@
// internal platform metrics use.
NOTIFICATION_SHADE_COUNT = 1395;
+ // ACTION: DND Settings > What to block
+ // OS: P
+ ACTION_ZEN_SOUND_ONLY = 1396;
+
+ // ACTION: DND Settings > Notifications
+ // OS: P
+ ACTION_ZEN_SOUND_AND_VIS_EFFECTS = 1397;
+
+ // ACTION: DND Settings > Notifications
+ // OS: P
+ ACTION_ZEN_SHOW_CUSTOM = 1398;
+
+ // ACTION: DND Settings > Notifications
+ // OS: P
+ ACTION_ZEN_CUSTOM = 1399;
+
+ // Screen: DND Settings > Notifications
+ // OS: P
+ SETTINGS_ZEN_NOTIFICATIONS = 1400;
+
// ---- End P Constants, all P constants go above this line ----
// Add new aosp constants above this line.
// END OF AOSP CONSTANTS
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index c9dbd45c..9045841 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -21961,54 +21961,6 @@
// INSTRUMENTATION
// =========================================================
- private static String[] HIDDENAPI_EXEMPT_PACKAGES = {
- "com.android.bluetooth.tests",
- "com.android.managedprovisioning.tests",
- "com.android.frameworks.coretests",
- "com.android.frameworks.coretests.binderproxycountingtestapp",
- "com.android.frameworks.coretests.binderproxycountingtestservice",
- "com.android.frameworks.tests.net",
- "com.android.frameworks.tests.uiservices",
- "com.android.coretests.apps.bstatstestapp",
- "com.android.servicestests.apps.conntestapp",
- "com.android.frameworks.servicestests",
- "com.android.frameworks.utiltests",
- "com.android.mtp.tests",
- "android.mtp",
- "com.android.documentsui.tests",
- "com.android.shell.tests",
- "com.android.systemui.tests",
- "com.android.testables",
- "android.net.wifi.test",
- "com.android.server.wifi.test",
- "com.android.frameworks.telephonytests",
- "com.android.providers.contacts.tests",
- "com.android.providers.contacts.tests2",
- "com.android.settings.tests.unit",
- "com.android.server.telecom.tests",
- "com.android.vcard.tests",
- "com.android.providers.blockednumber.tests",
- "android.settings.functional",
- "com.android.notification.functional",
- "com.android.frameworks.dexloggertest",
- "com.android.server.usb",
- "com.android.providers.downloads.tests",
- "com.android.emergency.tests.unit",
- "com.android.providers.calendar.tests",
- "com.android.settingslib",
- "com.android.rs.test",
- "com.android.printspooler.outofprocess.tests",
- "com.android.cellbroadcastreceiver.tests.unit",
- "com.android.providers.telephony.tests",
- "com.android.carrierconfig.tests",
- "com.android.phone.tests",
- "com.android.service.ims.presence.tests",
- "com.android.providers.setting.test",
- "com.android.frameworks.locationtests",
- "com.android.frameworks.coretests.privacy",
- "com.android.settings.ui",
- };
-
public boolean startInstrumentation(ComponentName className,
String profileFile, int flags, Bundle arguments,
IInstrumentationWatcher watcher, IUiAutomationConnection uiAutomationConnection,
@@ -22096,12 +22048,6 @@
mUsageStatsService.reportEvent(ii.targetPackage, userId,
UsageEvents.Event.SYSTEM_INTERACTION);
}
- // TODO: Temporary whitelist of packages which need to be exempt from hidden API
- // checks. Remove this as soon as the testing infrastructure allows to set
- // the flag in AndroidTest.xml.
- if (Arrays.asList(HIDDENAPI_EXEMPT_PACKAGES).contains(ai.packageName)) {
- disableHiddenApiChecks = true;
- }
ProcessRecord app = addAppLocked(ai, defProcess, false, disableHiddenApiChecks,
abiOverride);
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index 95bae2e..9fb3e11 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -3802,7 +3802,11 @@
// and the resumed activity is not yet visible, then hold off on
// finishing until the resumed one becomes visible.
- final ActivityRecord next = mStackSupervisor.topRunningActivityLocked();
+ // The activity that we are finishing may be over the lock screen. In this case, we do not
+ // want to consider activities that cannot be shown on the lock screen as running and should
+ // proceed with finishing the activity if there is no valid next top running activity.
+ final ActivityRecord next = mStackSupervisor.topRunningActivityLocked(
+ true /* considerKeyguardState */);
if (mode == FINISH_AFTER_VISIBLE && (r.visible || r.nowVisible)
&& next != null && !next.nowVisible) {
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index 0dc2445..e5565dc 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -1210,6 +1210,18 @@
}
ActivityRecord topRunningActivityLocked() {
+ return topRunningActivityLocked(false /* considerKeyguardState */);
+ }
+
+ /**
+ * Returns the top running activity in the focused stack. In the case the focused stack has no
+ * such activity, the next focusable stack on top of a display is returned.
+ * @param considerKeyguardState Indicates whether the locked state should be considered. if
+ * {@code true} and the keyguard is locked, only activities that
+ * can be shown on top of the keyguard will be considered.
+ * @return The top running activity. {@code null} if none is available.
+ */
+ ActivityRecord topRunningActivityLocked(boolean considerKeyguardState) {
final ActivityStack focusedStack = mFocusedStack;
ActivityRecord r = focusedStack.topRunningActivityLocked();
if (r != null) {
@@ -1228,16 +1240,33 @@
if (display == null) {
continue;
}
- for (int j = display.getChildCount() - 1; j >= 0; --j) {
- final ActivityStack stack = display.getChildAt(j);
- if (stack != focusedStack && stack.isTopStackOnDisplay() && stack.isFocusable()) {
- r = stack.topRunningActivityLocked();
- if (r != null) {
- return r;
- }
- }
+
+ // TODO: We probably want to consider the top fullscreen stack as we could have a pinned
+ // stack on top.
+ final ActivityStack topStack = display.getTopStack();
+
+ // Only consider focusable top stacks other than the current focused one.
+ if (topStack == null || !topStack.isFocusable() || topStack == focusedStack) {
+ continue;
+ }
+
+ final ActivityRecord topActivity = topStack.topRunningActivityLocked();
+
+ // Skip if no top activity.
+ if (topActivity == null) {
+ continue;
+ }
+
+ final boolean keyguardLocked = getKeyguardController().isKeyguardLocked();
+
+ // This activity can be considered the top running activity if we are not
+ // considering the locked state, the keyguard isn't locked, or we can show when
+ // locked.
+ if (!considerKeyguardState || !keyguardLocked || topActivity.canShowWhenLocked()) {
+ return topActivity;
}
}
+
return null;
}
diff --git a/services/core/java/com/android/server/power/Notifier.java b/services/core/java/com/android/server/power/Notifier.java
index 61e82cd..20283a7 100644
--- a/services/core/java/com/android/server/power/Notifier.java
+++ b/services/core/java/com/android/server/power/Notifier.java
@@ -16,6 +16,7 @@
package com.android.server.power;
+import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.app.ActivityManagerInternal;
import android.app.AppOpsManager;
@@ -97,7 +98,7 @@
private final ActivityManagerInternal mActivityManagerInternal;
private final InputManagerInternal mInputManagerInternal;
private final InputMethodManagerInternal mInputMethodManagerInternal;
- private final StatusBarManagerInternal mStatusBarManagerInternal;
+ @Nullable private final StatusBarManagerInternal mStatusBarManagerInternal;
private final TrustManager mTrustManager;
private final NotifierHandler mHandler;
@@ -738,7 +739,9 @@
private void showWirelessChargingStarted(int batteryLevel) {
playChargingStartedSound();
- mStatusBarManagerInternal.showChargingAnimation(batteryLevel);
+ if (mStatusBarManagerInternal != null) {
+ mStatusBarManagerInternal.showChargingAnimation(batteryLevel);
+ }
mSuspendBlocker.release();
}
diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java
index 0dc06b2..762d4e5 100644
--- a/services/core/java/com/android/server/wm/AppTransition.java
+++ b/services/core/java/com/android/server/wm/AppTransition.java
@@ -245,7 +245,6 @@
private int mLastClipRevealMaxTranslation;
private boolean mLastHadClipReveal;
- private boolean mProlongedAnimationsEnded;
private final boolean mGridLayoutRecentsEnabled;
private final boolean mLowRamRecentsEnabled;
@@ -423,27 +422,12 @@
mService.getDefaultDisplayContentLocked().getDockedDividerController()
.notifyAppTransitionStarting(openingApps, transit);
- // Prolong the start for the transition when docking a task from recents, unless recents
- // ended it already then we don't need to wait.
- if (transit == TRANSIT_DOCK_TASK_FROM_RECENTS && !mProlongedAnimationsEnded) {
- for (int i = openingApps.size() - 1; i >= 0; i--) {
- final AppWindowToken app = openingApps.valueAt(i);
- app.startDelayingAnimationStart();
- }
- }
if (mRemoteAnimationController != null) {
mRemoteAnimationController.goodToGo();
}
return redoLayout;
}
- /**
- * Let the transitions manager know that the somebody wanted to end the prolonged animations.
- */
- void notifyProlongedAnimationsEnded() {
- mProlongedAnimationsEnded = true;
- }
-
void clear() {
mNextAppTransitionType = NEXT_TRANSIT_TYPE_NONE;
mNextAppTransitionPackage = null;
@@ -452,7 +436,6 @@
mNextAppTransitionAnimationsSpecsFuture = null;
mDefaultNextAppTransitionAnimationSpec = null;
mAnimationFinishedCallback = null;
- mProlongedAnimationsEnded = false;
}
void freeze() {
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 09e43f8..7512486 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -2677,15 +2677,7 @@
@Override
public void endProlongedAnimations() {
- synchronized (mWindowMap) {
- for (final WindowState win : mWindowMap.values()) {
- final AppWindowToken appToken = win.mAppToken;
- if (appToken != null) {
- appToken.endDelayingAnimationStart();
- }
- }
- mAppTransition.notifyProlongedAnimationsEnded();
- }
+ // TODO: Remove once clients are updated.
}
@Override
@@ -5816,6 +5808,7 @@
final int displayId = mFrozenDisplayId;
mFrozenDisplayId = INVALID_DISPLAY;
mDisplayFrozen = false;
+ mInputMonitor.thawInputDispatchingLw();
mLastDisplayFreezeDuration = (int)(SystemClock.elapsedRealtime() - mDisplayFreezeTime);
StringBuilder sb = new StringBuilder(128);
sb.append("Screen frozen for ");
@@ -5862,8 +5855,6 @@
updateRotation = true;
}
- mInputMonitor.thawInputDispatchingLw();
-
boolean configChanged;
// While the display is frozen we don't re-compute the orientation
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java
index 08b8af2..9daea1a 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java
@@ -25,6 +25,7 @@
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
import static android.content.pm.ActivityInfo.FLAG_ALWAYS_FOCUSABLE;
+import static android.content.pm.ActivityInfo.FLAG_SHOW_WHEN_LOCKED;
import static com.android.server.am.ActivityStack.REMOVE_TASK_MODE_DESTROYING;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
@@ -329,4 +330,52 @@
REMOVE_TASK_MODE_DESTROYING);
assertFalse(pinnedStack.isFocusable());
}
+
+ /**
+ * Verifies the correct activity is returned when querying the top running activity with an
+ * empty focused stack.
+ */
+ @Test
+ public void testNonFocusedTopRunningActivity() throws Exception {
+ // Create stack to hold focus
+ final ActivityStack focusedStack = mService.mStackSupervisor.getDefaultDisplay()
+ .createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+
+ final KeyguardController keyguard = mSupervisor.getKeyguardController();
+ final ActivityStack stack = mService.mStackSupervisor.getDefaultDisplay().createStack(
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+ final ActivityRecord activity = new ActivityBuilder(mService).setCreateTask(true)
+ .setStack(stack).build();
+
+ mSupervisor.mFocusedStack = focusedStack;
+
+ doAnswer((InvocationOnMock invocationOnMock) -> {
+ final SparseIntArray displayIds = invocationOnMock.<SparseIntArray>getArgument(0);
+ displayIds.put(0, mSupervisor.getDefaultDisplay().mDisplayId);
+ return null;
+ }).when(mSupervisor.mWindowManager).getDisplaysInFocusOrder(any());
+
+ // Make sure the top running activity is not affected when keyguard is not locked
+ assertEquals(activity, mService.mStackSupervisor.topRunningActivityLocked());
+ assertEquals(activity, mService.mStackSupervisor.topRunningActivityLocked(
+ true /* considerKeyguardState */));
+
+ // Check to make sure activity not reported when it cannot show on lock and lock is on.
+ doReturn(true).when(keyguard).isKeyguardLocked();
+ assertEquals(activity, mService.mStackSupervisor.topRunningActivityLocked());
+ assertEquals(null, mService.mStackSupervisor.topRunningActivityLocked(
+ true /* considerKeyguardState */));
+
+ // Add activity that should be shown on the keyguard.
+ final ActivityRecord showWhenLockedActivity = new ActivityBuilder(mService)
+ .setCreateTask(true)
+ .setStack(stack)
+ .setActivityFlags(FLAG_SHOW_WHEN_LOCKED)
+ .build();
+
+ // Ensure the show when locked activity is returned.
+ assertEquals(showWhenLockedActivity, mService.mStackSupervisor.topRunningActivityLocked());
+ assertEquals(showWhenLockedActivity, mService.mStackSupervisor.topRunningActivityLocked(
+ true /* considerKeyguardState */));
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
index f5e61a1..1cd111f 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
@@ -132,6 +132,7 @@
private int mUid;
private boolean mCreateTask;
private ActivityStack mStack;
+ private int mActivityFlags;
ActivityBuilder(ActivityManagerService service) {
mService = service;
@@ -152,6 +153,11 @@
return this;
}
+ ActivityBuilder setActivityFlags(int flags) {
+ mActivityFlags = flags;
+ return this;
+ }
+
ActivityBuilder setStack(ActivityStack stack) {
mStack = stack;
return this;
@@ -186,6 +192,8 @@
aInfo.applicationInfo = new ApplicationInfo();
aInfo.applicationInfo.packageName = mComponent.getPackageName();
aInfo.applicationInfo.uid = mUid;
+ aInfo.flags |= mActivityFlags;
+
final ActivityRecord activity = new ActivityRecord(mService, null /* caller */,
0 /* launchedFromPid */, 0, null, intent, null,
aInfo /*aInfo*/, new Configuration(), null /* resultTo */, null /* resultWho */,