diff options
Diffstat (limited to 'services')
12 files changed, 227 insertions, 47 deletions
diff --git a/services/core/java/com/android/server/adb/AdbDebuggingManager.java b/services/core/java/com/android/server/adb/AdbDebuggingManager.java index 1f35b88c8cbd..d91537c8afc6 100644 --- a/services/core/java/com/android/server/adb/AdbDebuggingManager.java +++ b/services/core/java/com/android/server/adb/AdbDebuggingManager.java @@ -18,6 +18,7 @@ package com.android.server.adb; import static com.android.internal.util.dump.DumpUtils.writeStringIfNotNull; +import android.annotation.NonNull; import android.annotation.TestApi; import android.app.ActivityManager; import android.app.Notification; @@ -170,6 +171,12 @@ public class AdbDebuggingManager { mAdbConnectionInfo = new AdbConnectionInfo(); } + static void sendBroadcastWithDebugPermission(@NonNull Context context, @NonNull Intent intent, + @NonNull UserHandle userHandle) { + context.sendBroadcastAsUser(intent, userHandle, + android.Manifest.permission.MANAGE_DEBUGGING); + } + class PairingThread extends Thread implements NsdManager.RegistrationListener { private NsdManager mNsdManager; private String mPublicKey; @@ -1278,7 +1285,7 @@ public class AdbDebuggingManager { ? AdbManager.WIRELESS_STATUS_CONNECTED : AdbManager.WIRELESS_STATUS_DISCONNECTED); intent.putExtra(AdbManager.WIRELESS_DEBUG_PORT_EXTRA, port); - mContext.sendBroadcastAsUser(intent, UserHandle.ALL); + AdbDebuggingManager.sendBroadcastWithDebugPermission(mContext, intent, UserHandle.ALL); } private void onAdbdWifiServerConnected(int port) { @@ -1350,7 +1357,8 @@ public class AdbDebuggingManager { if (publicKey == null) { Intent intent = new Intent(AdbManager.WIRELESS_DEBUG_PAIRING_RESULT_ACTION); intent.putExtra(AdbManager.WIRELESS_STATUS_EXTRA, AdbManager.WIRELESS_STATUS_FAIL); - mContext.sendBroadcastAsUser(intent, UserHandle.ALL); + AdbDebuggingManager.sendBroadcastWithDebugPermission(mContext, intent, + UserHandle.ALL); } else { Intent intent = new Intent(AdbManager.WIRELESS_DEBUG_PAIRING_RESULT_ACTION); intent.putExtra(AdbManager.WIRELESS_STATUS_EXTRA, @@ -1363,7 +1371,8 @@ public class AdbDebuggingManager { } PairDevice device = new PairDevice(fingerprints, hostname, false); intent.putExtra(AdbManager.WIRELESS_PAIR_DEVICE_EXTRA, device); - mContext.sendBroadcastAsUser(intent, UserHandle.ALL); + AdbDebuggingManager.sendBroadcastWithDebugPermission(mContext, intent, + UserHandle.ALL); // Add the key into the keystore mAdbKeyStore.setLastConnectionTime(publicKey, System.currentTimeMillis()); @@ -1377,14 +1386,14 @@ public class AdbDebuggingManager { intent.putExtra(AdbManager.WIRELESS_STATUS_EXTRA, AdbManager.WIRELESS_STATUS_CONNECTED); intent.putExtra(AdbManager.WIRELESS_DEBUG_PORT_EXTRA, port); - mContext.sendBroadcastAsUser(intent, UserHandle.ALL); + AdbDebuggingManager.sendBroadcastWithDebugPermission(mContext, intent, UserHandle.ALL); } private void sendPairedDevicesToUI(Map<String, PairDevice> devices) { Intent intent = new Intent(AdbManager.WIRELESS_DEBUG_PAIRED_DEVICES_ACTION); // Map is not serializable, so need to downcast intent.putExtra(AdbManager.WIRELESS_DEVICES_EXTRA, (HashMap) devices); - mContext.sendBroadcastAsUser(intent, UserHandle.ALL); + AdbDebuggingManager.sendBroadcastWithDebugPermission(mContext, intent, UserHandle.ALL); } private void updateUIPairCode(String code) { @@ -1394,7 +1403,7 @@ public class AdbDebuggingManager { intent.putExtra(AdbManager.WIRELESS_PAIRING_CODE_EXTRA, code); intent.putExtra(AdbManager.WIRELESS_STATUS_EXTRA, AdbManager.WIRELESS_STATUS_PAIRING_CODE); - mContext.sendBroadcastAsUser(intent, UserHandle.ALL); + AdbDebuggingManager.sendBroadcastWithDebugPermission(mContext, intent, UserHandle.ALL); } } diff --git a/services/core/java/com/android/server/adb/AdbService.java b/services/core/java/com/android/server/adb/AdbService.java index 29bb5428dd84..5b16daa5e835 100644 --- a/services/core/java/com/android/server/adb/AdbService.java +++ b/services/core/java/com/android/server/adb/AdbService.java @@ -431,7 +431,7 @@ public class AdbService extends IAdbManager.Stub { ? AdbManager.WIRELESS_STATUS_CONNECTED : AdbManager.WIRELESS_STATUS_DISCONNECTED); intent.putExtra(AdbManager.WIRELESS_DEBUG_PORT_EXTRA, port); - mContext.sendBroadcastAsUser(intent, UserHandle.ALL); + AdbDebuggingManager.sendBroadcastWithDebugPermission(mContext, intent, UserHandle.ALL); Slog.i(TAG, "sent port broadcast port=" + port); } diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java index 2761a7c6d937..2aba375fc40b 100644 --- a/services/core/java/com/android/server/am/CachedAppOptimizer.java +++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java @@ -28,6 +28,7 @@ import android.net.Uri; import android.os.Debug; import android.os.Handler; import android.os.Message; +import android.os.PowerManagerInternal; import android.os.Process; import android.os.SystemClock; import android.os.SystemProperties; @@ -1181,6 +1182,9 @@ public final class CachedAppOptimizer { int lastOomAdj = msg.arg1; int procState = msg.arg2; synchronized (mProcLock) { + if(mPendingCompactionProcesses.isEmpty()) { + return; + } proc = mPendingCompactionProcesses.remove(0); opt = proc.mOptRecord; diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java index 419b72675c49..24b9f48e71a6 100644 --- a/services/core/java/com/android/server/pm/LauncherAppsService.java +++ b/services/core/java/com/android/server/pm/LauncherAppsService.java @@ -815,7 +815,7 @@ public class LauncherAppsService extends SystemService { PendingIntent injectCreatePendingIntent(int requestCode, @NonNull Intent[] intents, int flags, Bundle options, String ownerPackage, int ownerUserId) { return mActivityManagerInternal.getPendingIntentActivityAsApp(requestCode, intents, - flags, options, ownerPackage, ownerUserId); + flags, null /* options */, ownerPackage, ownerUserId); } @Override @@ -1117,7 +1117,7 @@ public class LauncherAppsService extends SystemService { // calling identity to mirror the startActivityAsUser() call which does not validate // the calling user return PendingIntent.getActivityAsUser(mContext, 0 /* requestCode */, launchIntent, - FLAG_IMMUTABLE, opts, user); + FLAG_IMMUTABLE, null /* options */, user); } finally { Binder.restoreCallingIdentity(ident); } diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 7f3c733ec33e..e4ee577d1aea 100644..100755 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -6240,6 +6240,12 @@ public final class ActivityRecord extends WindowToken implements WindowManagerSe /** Called when the windows associated app window container are drawn. */ private void onWindowsDrawn(long timestampNs) { + if (mPerf != null && perfActivityBoostHandler > 0) { + mPerf.perfLockReleaseHandler(perfActivityBoostHandler); + perfActivityBoostHandler = -1; + } else if (perfActivityBoostHandler > 0) { + Slog.w(TAG, "activity boost didn't release as expected"); + } final TransitionInfoSnapshot info = mTaskSupervisor .getActivityMetricsLogger().notifyWindowsDrawn(this, timestampNs); final boolean validInfo = info != null; @@ -7492,7 +7498,8 @@ public final class ActivityRecord extends WindowToken implements WindowManagerSe mSizeCompatBounds = null; mCompatDisplayInsets = null; - onRequestedOverrideConfigurationChanged(getRequestedOverrideConfiguration()); + // Clear config override in #updateCompatDisplayInsets(). + onRequestedOverrideConfigurationChanged(EMPTY); } @Override diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 6c57bc0904a2..d6f93ce491b3 100644..100755 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -1783,6 +1783,10 @@ class ActivityStarter { BoostFramework.VENDOR_HINT_FIRST_LAUNCH_BOOST, packageName, -1, BoostFramework.Launch.ACTIVITY_LAUNCH_BOOST, 1, pkgType); } else { + if (mStartActivity.perfActivityBoostHandler > 0) { + Slog.i(TAG, "Activity boosted, release it firstly"); + mPerf.perfLockReleaseHandler(mStartActivity.perfActivityBoostHandler); + } mStartActivity.perfActivityBoostHandler = mPerf.perfHint(BoostFramework.VENDOR_HINT_FIRST_LAUNCH_BOOST, packageName, -1, BoostFramework.Launch.BOOST_V1); @@ -2834,6 +2838,10 @@ class ActivityStarter { BoostFramework.VENDOR_HINT_FIRST_LAUNCH_BOOST, packageName, -1, BoostFramework.Launch.ACTIVITY_LAUNCH_BOOST, 1, pkgType); } else { + if (mStartActivity.perfActivityBoostHandler > 0) { + Slog.i(TAG, "Activity boosted, release it firstly"); + mPerf.perfLockReleaseHandler(mStartActivity.perfActivityBoostHandler); + } mStartActivity.perfActivityBoostHandler = mPerf.perfHint(BoostFramework.VENDOR_HINT_FIRST_LAUNCH_BOOST, packageName, -1, BoostFramework.Launch.BOOST_V1); diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index c1231da1ef93..1ac8990de2b6 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -20,7 +20,6 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY; -import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static android.content.res.Configuration.UI_MODE_TYPE_CAR; import static android.content.res.Configuration.UI_MODE_TYPE_MASK; import static android.util.RotationUtils.deltaRotation; diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index ba5e32891255..69c3c6e46346 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -195,7 +195,6 @@ import android.window.WindowContainerToken; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.app.ActivityTrigger; import com.android.internal.app.IVoiceInteractor; import com.android.internal.protolog.common.ProtoLog; import com.android.internal.util.XmlUtils; @@ -284,9 +283,6 @@ class Task extends TaskFragment { // code. static final int PERSIST_TASK_VERSION = 1; - //ActivityTrigger - static final ActivityTrigger mActivityTrigger = new ActivityTrigger(); - private float mShadowRadius = 0; /** @@ -306,8 +302,6 @@ class Task extends TaskFragment { // Do not move the root task as a part of reparenting static final int REPARENT_LEAVE_ROOT_TASK_IN_PLACE = 2; - public BoostFramework mPerf = null; - // The topmost Activity passed to convertToTranslucent(). When non-null it means we are // waiting for all Activities in mUndrawnActivitiesBelowTopTranslucent to be removed as they // are drawn. When the last member of mUndrawnActivitiesBelowTopTranslucent is removed the diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java index ad51387210d9..7f890fc7469c 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -82,6 +82,7 @@ import android.graphics.Point; import android.graphics.Rect; import android.os.IBinder; import android.os.RemoteException; +import android.util.BoostFramework; import android.util.DisplayMetrics; import android.util.Slog; import android.util.proto.ProtoOutputStream; @@ -93,6 +94,7 @@ import android.window.TaskFragmentInfo; import android.window.TaskFragmentOrganizerToken; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.app.ActivityTrigger; import com.android.internal.protolog.common.ProtoLog; import com.android.internal.util.function.pooled.PooledFunction; import com.android.internal.util.function.pooled.PooledLambda; @@ -240,6 +242,12 @@ class TaskFragment extends WindowContainer<WindowContainer> { @Nullable private IBinder mFragmentToken; + //Perf + public BoostFramework mPerf = null; + + //ActivityTrigger + static final ActivityTrigger mActivityTrigger = new ActivityTrigger(); + /** * Whether to delay the last activity of TaskFragment being immediately removed while finishing. * This should only be set on a embedded TaskFragment, where the organizer can have the @@ -1048,14 +1056,14 @@ class TaskFragment extends WindowContainer<WindowContainer> { if (DEBUG_SWITCH) Slog.v(TAG_SWITCH, "Resuming " + next); - // TODO(b/223439401) adjust the value-add - // //Trigger Activity Resume - // if (mActivityTrigger != null) { - // mActivityTrigger.activityResumeTrigger(next.intent, next.info, - // next.info.applicationInfo, - // next.occludesParent()); - // } + //Trigger Activity Resume + if (mActivityTrigger != null) { + mActivityTrigger.activityResumeTrigger(next.intent, next.info, + next.info.applicationInfo, + next.occludesParent()); + } + // TODO(b/223439401) adjust the value-add // if (mActivityPluginDelegate != null && getWindowingMode() != WINDOWING_MODE_UNDEFINED) { // mActivityPluginDelegate.activityInvokeNotification // (next.info.packageName, getWindowingMode() == WINDOWING_MODE_FULLSCREEN); @@ -1162,10 +1170,9 @@ class TaskFragment extends WindowContainer<WindowContainer> { // to ignore it when computing the desired screen orientation. boolean anim = true; final DisplayContent dc = taskDisplayArea.mDisplayContent; - // TODO(b/223439401) adjust the value-add - // if (mPerf == null) { - // mPerf = new BoostFramework(); - // } + if (mPerf == null) { + mPerf = new BoostFramework(); + } if (prev != null) { if (prev.finishing) { if (DEBUG_TRANSITION) { @@ -1175,11 +1182,10 @@ class TaskFragment extends WindowContainer<WindowContainer> { anim = false; dc.prepareAppTransition(TRANSIT_NONE); } else { - // TODO(b/223439401) adjust the value-add - // if(prev.getTask() != next.getTask() && mPerf != null) { - // mPerf.perfHint(BoostFramework.VENDOR_HINT_ANIM_BOOST, - // next.packageName); - // } + if(prev.getTask() != next.getTask() && mPerf != null) { + mPerf.perfHint(BoostFramework.VENDOR_HINT_ANIM_BOOST, + next.packageName); + } dc.prepareAppTransition(TRANSIT_CLOSE); } prev.setVisibility(false); @@ -1191,11 +1197,10 @@ class TaskFragment extends WindowContainer<WindowContainer> { anim = false; dc.prepareAppTransition(TRANSIT_NONE); } else { - // TODO(b/223439401) adjust the value-add - // if(prev.getTask() != next.getTask() && mPerf != null) { - // mPerf.perfHint(BoostFramework.VENDOR_HINT_ANIM_BOOST, - // next.packageName); - // } + if(prev.getTask() != next.getTask() && mPerf != null) { + mPerf.perfHint(BoostFramework.VENDOR_HINT_ANIM_BOOST, + next.packageName); + } dc.prepareAppTransition(TRANSIT_OPEN, next.mLaunchTaskBehind ? TRANSIT_FLAG_OPEN_BEHIND : 0); } @@ -1458,13 +1463,13 @@ class TaskFragment extends WindowContainer<WindowContainer> { return false; } - // TODO(b/223439401) adjust the value-add - // //Trigger Activity Pause - // if (mActivityTrigger != null) { - // mActivityTrigger.activityPauseTrigger(prev.intent, prev.info, - // prev.info.applicationInfo); - // } + //Trigger Activity Pause + if (mActivityTrigger != null) { + mActivityTrigger.activityPauseTrigger(prev.intent, prev.info, + prev.info.applicationInfo); + } + // TODO(b/223439401) adjust the value-add // if (mActivityPluginDelegate != null && getWindowingMode() != WINDOWING_MODE_UNDEFINED) { // mActivityPluginDelegate.activitySuspendNotification // (prev.info.packageName, getWindowingMode() == WINDOWING_MODE_FULLSCREEN, true); diff --git a/services/core/jni/com_android_server_am_CachedAppOptimizer.cpp b/services/core/jni/com_android_server_am_CachedAppOptimizer.cpp index 94bc22a05d7a..619b612b0374 100644 --- a/services/core/jni/com_android_server_am_CachedAppOptimizer.cpp +++ b/services/core/jni/com_android_server_am_CachedAppOptimizer.cpp @@ -57,6 +57,19 @@ using android::base::unique_fd; #define ASYNC_RECEIVED_WHILE_FROZEN (2) #define TXNS_PENDING_WHILE_FROZEN (4) +#define MAX_RW_COUNT (INT_MAX & PAGE_MASK) + +// Defines the maximum amount of VMAs we can send per process_madvise syscall. +// Currently this is set to UIO_MAXIOV which is the maximum segments allowed by +// iovec implementation used by process_madvise syscall +#define MAX_VMAS_PER_COMPACTION UIO_MAXIOV + +// Maximum bytes that we can send per process_madvise syscall once this limit +// is reached we split the remaining VMAs into another syscall. The MAX_RW_COUNT +// limit is imposed by iovec implementation. However, if you want to use a smaller +// limit, it has to be a page aligned value, otherwise, compaction would fail. +#define MAX_BYTES_PER_COMPACTION MAX_RW_COUNT + namespace android { static bool cancelRunningCompaction; @@ -70,8 +83,10 @@ static inline void compactProcessProcfs(int pid, const std::string& compactionTy } // Compacts a set of VMAs for pid using an madviseType accepted by process_madvise syscall -// On success returns the total bytes that where compacted. On failure it returns -// a negative error code from the standard linux error codes. +// Returns the total bytes that where madvised. +// +// If any VMA fails compaction due to -EINVAL it will be skipped and continue. +// However, if it fails for any other reason, it will bail out and forward the error static int64_t compactMemory(const std::vector<Vma>& vmas, int pid, int madviseType) { // UIO_MAXIOV is currently a small value and we might have more addresses // we do multiple syscalls if we exceed its maximum @@ -138,7 +153,12 @@ static int getAnyPageAdvice(const Vma& vma) { } // Perform a full process compaction using process_madvise syscall -// reading all filtering VMAs and filtering pages as specified by pageFilter +// using the madvise behavior defined by vmaToAdviseFunc per VMA. +// +// Currently supported behaviors are MADV_COLD and MADV_PAGEOUT. +// +// Returns the total number of bytes compacted or forwards an +// process_madvise error. static int64_t compactProcess(int pid, VmaToAdviseFunc vmaToAdviseFunc) { ProcMemInfo meminfo(pid); std::vector<Vma> pageoutVmas, coldVmas; diff --git a/services/tests/servicestests/src/com/android/server/adb/AdbDebuggingManagerTest.java b/services/tests/servicestests/src/com/android/server/adb/AdbDebuggingManagerTest.java index cffff66b64f1..02cf971a8076 100644 --- a/services/tests/servicestests/src/com/android/server/adb/AdbDebuggingManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/adb/AdbDebuggingManagerTest.java @@ -23,7 +23,14 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import android.content.BroadcastReceiver; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.PackageManager; +import android.debug.AdbManager; +import android.debug.IAdbManager; +import android.os.ServiceManager; import android.provider.Settings; import android.util.Log; @@ -105,6 +112,7 @@ public final class AdbDebuggingManagerTest { public void tearDown() throws Exception { mKeyStore.deleteKeyStore(); setAllowedConnectionTime(mOriginalAllowedConnectionTime); + dropShellPermissionIdentity(); } /** @@ -813,6 +821,108 @@ public final class AdbDebuggingManagerTest { return hasAtLeastOneLetter; } + CountDownLatch mAdbActionLatch = new CountDownLatch(1); + private final BroadcastReceiver mReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + Log.i(TAG, "Received intent action=" + action); + if (AdbManager.WIRELESS_DEBUG_PAIRED_DEVICES_ACTION.equals(action)) { + assertEquals("Received broadcast without MANAGE_DEBUGGING permission.", + context.checkSelfPermission(android.Manifest.permission.MANAGE_DEBUGGING), + PackageManager.PERMISSION_GRANTED); + Log.i(TAG, "action=" + action + " paired_device=" + intent.getSerializableExtra( + AdbManager.WIRELESS_DEVICES_EXTRA).toString()); + mAdbActionLatch.countDown(); + } else if (AdbManager.WIRELESS_DEBUG_STATE_CHANGED_ACTION.equals(action)) { + assertEquals("Received broadcast without MANAGE_DEBUGGING permission.", + context.checkSelfPermission(android.Manifest.permission.MANAGE_DEBUGGING), + PackageManager.PERMISSION_GRANTED); + int status = intent.getIntExtra(AdbManager.WIRELESS_STATUS_EXTRA, + AdbManager.WIRELESS_STATUS_DISCONNECTED); + Log.i(TAG, "action=" + action + " status=" + status); + mAdbActionLatch.countDown(); + } else if (AdbManager.WIRELESS_DEBUG_PAIRING_RESULT_ACTION.equals(action)) { + assertEquals("Received broadcast without MANAGE_DEBUGGING permission.", + context.checkSelfPermission(android.Manifest.permission.MANAGE_DEBUGGING), + PackageManager.PERMISSION_GRANTED); + Integer res = intent.getIntExtra( + AdbManager.WIRELESS_STATUS_EXTRA, + AdbManager.WIRELESS_STATUS_FAIL); + Log.i(TAG, "action=" + action + " result=" + res); + + if (res.equals(AdbManager.WIRELESS_STATUS_PAIRING_CODE)) { + String pairingCode = intent.getStringExtra( + AdbManager.WIRELESS_PAIRING_CODE_EXTRA); + Log.i(TAG, "pairingCode=" + pairingCode); + } else if (res.equals(AdbManager.WIRELESS_STATUS_CONNECTED)) { + int port = intent.getIntExtra(AdbManager.WIRELESS_DEBUG_PORT_EXTRA, 0); + Log.i(TAG, "port=" + port); + } + mAdbActionLatch.countDown(); + } + } + }; + + private void adoptShellPermissionIdentity() { + InstrumentationRegistry.getInstrumentation().getUiAutomation() + .adoptShellPermissionIdentity(android.Manifest.permission.MANAGE_DEBUGGING); + } + + private void dropShellPermissionIdentity() { + InstrumentationRegistry.getInstrumentation().getUiAutomation() + .dropShellPermissionIdentity(); + } + + @Test + public void testBroadcastReceiverWithPermissions() throws Exception { + adoptShellPermissionIdentity(); + final IAdbManager mAdbManager = IAdbManager.Stub.asInterface( + ServiceManager.getService(Context.ADB_SERVICE)); + IntentFilter intentFilter = + new IntentFilter(AdbManager.WIRELESS_DEBUG_PAIRED_DEVICES_ACTION); + intentFilter.addAction(AdbManager.WIRELESS_DEBUG_STATE_CHANGED_ACTION); + intentFilter.addAction(AdbManager.WIRELESS_DEBUG_PAIRING_RESULT_ACTION); + assertEquals("Context does not have MANAGE_DEBUGGING permission.", + mContext.checkSelfPermission(android.Manifest.permission.MANAGE_DEBUGGING), + PackageManager.PERMISSION_GRANTED); + try { + mContext.registerReceiver(mReceiver, intentFilter); + mAdbManager.enablePairingByPairingCode(); + if (!mAdbActionLatch.await(TIMEOUT, TIMEOUT_TIME_UNIT)) { + fail("Receiver did not receive adb intent action within the timeout duration"); + } + } finally { + mContext.unregisterReceiver(mReceiver); + } + } + + @Test + public void testBroadcastReceiverWithoutPermissions() throws Exception { + adoptShellPermissionIdentity(); + final IAdbManager mAdbManager = IAdbManager.Stub.asInterface( + ServiceManager.getService(Context.ADB_SERVICE)); + IntentFilter intentFilter = + new IntentFilter(AdbManager.WIRELESS_DEBUG_PAIRED_DEVICES_ACTION); + intentFilter.addAction(AdbManager.WIRELESS_DEBUG_STATE_CHANGED_ACTION); + intentFilter.addAction(AdbManager.WIRELESS_DEBUG_PAIRING_RESULT_ACTION); + mAdbManager.enablePairingByPairingCode(); + + dropShellPermissionIdentity(); + assertEquals("Context has MANAGE_DEBUGGING permission.", + mContext.checkSelfPermission(android.Manifest.permission.MANAGE_DEBUGGING), + PackageManager.PERMISSION_DENIED); + try { + mContext.registerReceiver(mReceiver, intentFilter); + + if (mAdbActionLatch.await(TIMEOUT, TIMEOUT_TIME_UNIT)) { + fail("Broadcast receiver received adb action intent without debug permissions"); + } + } finally { + mContext.unregisterReceiver(mReceiver); + } + } + /** * Runs an adb test with the provided configuration. * diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java index 9639aa78fd5b..dc378dc8cab2 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -76,6 +76,7 @@ import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo.ScreenOrientation; import android.content.res.Configuration; import android.graphics.Rect; +import android.os.UserHandle; import android.platform.test.annotations.Presubmit; import android.provider.DeviceConfig; import android.provider.DeviceConfig.Properties; @@ -2181,6 +2182,29 @@ public class SizeCompatTests extends WindowTestsBase { .computeAspectRatio(sizeCompatAppBounds), delta); } + @Test + public void testClearSizeCompat_resetOverrideConfig() { + final int origDensity = 480; + final int newDensity = 520; + final DisplayContent display = new TestDisplayContent.Builder(mAtm, 600, 800) + .setDensityDpi(origDensity) + .build(); + setUpApp(display); + prepareUnresizable(mActivity, -1.f /* maxAspect */, SCREEN_ORIENTATION_PORTRAIT); + + // Activity should enter size compat with old density after display density change. + display.setForcedDensity(newDensity, UserHandle.USER_CURRENT); + + assertScaled(); + assertEquals(origDensity, mActivity.getConfiguration().densityDpi); + + // Activity should exit size compat with new density. + mActivity.clearSizeCompatMode(); + + assertFitted(); + assertEquals(newDensity, mActivity.getConfiguration().densityDpi); + } + private void assertHorizontalPositionForDifferentDisplayConfigsForLandscapeActivity( float letterboxHorizontalPositionMultiplier) { // Set up a display in landscape and ignoring orientation request. |