Merge SP2A.220405.004 to aosp-master - DO NOT MERGE
Merged-In: Iae1a66165221f45051be17c4d047b5bd5be3999b Merged-In: I0c82fda5497bace30d49989b8e84ebc98250ca8c Change-Id: I2c75988c023cec548e3a576cb0c3a1a13bb0016f
This commit is contained in:
@@ -683,6 +683,7 @@ package android.content {
|
||||
ctor public AttributionSource(int, @Nullable String, @Nullable String);
|
||||
ctor public AttributionSource(int, @Nullable String, @Nullable String, @NonNull android.os.IBinder);
|
||||
ctor public AttributionSource(int, @Nullable String, @Nullable String, @Nullable java.util.Set<java.lang.String>, @Nullable android.content.AttributionSource);
|
||||
method public void enforceCallingPid();
|
||||
}
|
||||
|
||||
public final class AutofillOptions implements android.os.Parcelable {
|
||||
|
||||
@@ -155,8 +155,8 @@ public final class AttributionSource implements Parcelable {
|
||||
this(AttributionSourceState.CREATOR.createFromParcel(in));
|
||||
|
||||
// Since we just unpacked this object as part of it transiting a Binder
|
||||
// call, this is the perfect time to enforce that its UID can be trusted
|
||||
enforceCallingUid();
|
||||
// call, this is the perfect time to enforce that its UID and PID can be trusted
|
||||
enforceCallingUidAndPid();
|
||||
}
|
||||
|
||||
/** @hide */
|
||||
@@ -258,14 +258,25 @@ public final class AttributionSource implements Parcelable {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* If you are handling an IPC and you don't trust the caller you need to validate whether the
|
||||
* attribution source is one for the calling app to prevent the caller to pass you a source from
|
||||
* another app without including themselves in the attribution chain.
|
||||
*
|
||||
* @throws SecurityException if the attribution source cannot be trusted to be from the caller.
|
||||
*/
|
||||
private void enforceCallingUidAndPid() {
|
||||
enforceCallingUid();
|
||||
enforceCallingPid();
|
||||
}
|
||||
|
||||
/**
|
||||
* If you are handling an IPC and you don't trust the caller you need to validate
|
||||
* whether the attribution source is one for the calling app to prevent the caller
|
||||
* to pass you a source from another app without including themselves in the
|
||||
* attribution chain.
|
||||
*
|
||||
* @throws SecurityException if the attribution source cannot be trusted to be
|
||||
* from the caller.
|
||||
* @throws SecurityException if the attribution source cannot be trusted to be from the caller.
|
||||
*/
|
||||
public void enforceCallingUid() {
|
||||
if (!checkCallingUid()) {
|
||||
@@ -294,6 +305,33 @@ public final class AttributionSource implements Parcelable {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate that the pid being claimed for the calling app is not spoofed
|
||||
*
|
||||
* @throws SecurityException if the attribution source cannot be trusted to be from the caller.
|
||||
* @hide
|
||||
*/
|
||||
@TestApi
|
||||
public void enforceCallingPid() {
|
||||
if (!checkCallingPid()) {
|
||||
throw new SecurityException("Calling pid: " + Binder.getCallingPid()
|
||||
+ " doesn't match source pid: " + mAttributionSourceState.pid);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate that the pid being claimed for the calling app is not spoofed
|
||||
*
|
||||
* @return if the attribution source cannot be trusted to be from the caller.
|
||||
*/
|
||||
private boolean checkCallingPid() {
|
||||
final int callingPid = Binder.getCallingPid();
|
||||
if (mAttributionSourceState.pid != -1 && callingPid != mAttributionSourceState.pid) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
if (Build.IS_DEBUGGABLE) {
|
||||
|
||||
@@ -739,7 +739,7 @@ public class LauncherApps {
|
||||
* {@link #startMainActivity(ComponentName, UserHandle, Rect, Bundle)}.
|
||||
*
|
||||
* @param component The ComponentName of the activity to launch
|
||||
* @param startActivityOptions Options to pass to startActivity
|
||||
* @param startActivityOptions This parameter is no longer supported
|
||||
* @param user The UserHandle of the profile
|
||||
* @hide
|
||||
*/
|
||||
@@ -751,7 +751,8 @@ public class LauncherApps {
|
||||
Log.i(TAG, "GetMainActivityLaunchIntent " + component + " " + user);
|
||||
}
|
||||
try {
|
||||
return mService.getActivityLaunchIntent(component, startActivityOptions, user);
|
||||
// due to b/209607104, startActivityOptions will be ignored
|
||||
return mService.getActivityLaunchIntent(component, null /* opts */, user);
|
||||
} catch (RemoteException re) {
|
||||
throw re.rethrowFromSystemServer();
|
||||
}
|
||||
@@ -846,7 +847,7 @@ public class LauncherApps {
|
||||
*
|
||||
* @param packageName The packageName of the shortcut
|
||||
* @param shortcutId The id of the shortcut
|
||||
* @param opts Options to pass to the PendingIntent
|
||||
* @param opts This parameter is no longer supported
|
||||
* @param user The UserHandle of the profile
|
||||
*/
|
||||
@Nullable
|
||||
@@ -858,8 +859,9 @@ public class LauncherApps {
|
||||
Log.i(TAG, "GetShortcutIntent " + packageName + "/" + shortcutId + " " + user);
|
||||
}
|
||||
try {
|
||||
// due to b/209607104, opts will be ignored
|
||||
return mService.getShortcutIntent(
|
||||
mContext.getPackageName(), packageName, shortcutId, opts, user);
|
||||
mContext.getPackageName(), packageName, shortcutId, null /* opts */, user);
|
||||
} catch (RemoteException re) {
|
||||
throw re.rethrowFromSystemServer();
|
||||
}
|
||||
|
||||
@@ -38,6 +38,7 @@ public class AdbManager {
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
@RequiresPermission(android.Manifest.permission.MANAGE_DEBUGGING)
|
||||
public static final String WIRELESS_DEBUG_STATE_CHANGED_ACTION =
|
||||
"com.android.server.adb.WIRELESS_DEBUG_STATUS";
|
||||
|
||||
@@ -46,6 +47,7 @@ public class AdbManager {
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
@RequiresPermission(android.Manifest.permission.MANAGE_DEBUGGING)
|
||||
public static final String WIRELESS_DEBUG_PAIRED_DEVICES_ACTION =
|
||||
"com.android.server.adb.WIRELESS_DEBUG_PAIRED_DEVICES";
|
||||
|
||||
@@ -59,6 +61,7 @@ public class AdbManager {
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
@RequiresPermission(android.Manifest.permission.MANAGE_DEBUGGING)
|
||||
public static final String WIRELESS_DEBUG_PAIRING_RESULT_ACTION =
|
||||
"com.android.server.adb.WIRELESS_DEBUG_PAIRING_RESULT";
|
||||
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
|
||||
package com.android.internal.app;
|
||||
|
||||
import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
@@ -27,6 +29,7 @@ import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.android.internal.R;
|
||||
|
||||
/**
|
||||
@@ -48,6 +51,7 @@ public class HarmfulAppWarningActivity extends AlertActivity implements
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
getWindow().addSystemFlags(SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
|
||||
final Intent intent = getIntent();
|
||||
mPackageName = intent.getStringExtra(Intent.EXTRA_PACKAGE_NAME);
|
||||
mTarget = intent.getParcelableExtra(Intent.EXTRA_INTENT);
|
||||
|
||||
@@ -825,6 +825,10 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
|
||||
}
|
||||
|
||||
private void fadeExistingPip(boolean show) {
|
||||
if (mLeash == null || !mLeash.isValid()) {
|
||||
Log.w(TAG, "Invalid leash on fadeExistingPip: " + mLeash);
|
||||
return;
|
||||
}
|
||||
final float alphaStart = show ? 0 : 1;
|
||||
final float alphaEnd = show ? 1 : 0;
|
||||
mPipAnimationController
|
||||
|
||||
@@ -686,16 +686,14 @@ static binder_status_t readBlob(AParcel* parcel, T inPlaceCallback, U ashmemCall
|
||||
}
|
||||
return data->ptr != nullptr;
|
||||
}));
|
||||
inPlaceCallback(std::move(data.ptr), data.size);
|
||||
return STATUS_OK;
|
||||
return inPlaceCallback(std::move(data.ptr), data.size);
|
||||
} else if (type == BlobType::ASHMEM) {
|
||||
int rawFd = -1;
|
||||
int32_t size = 0;
|
||||
ON_ERROR_RETURN(AParcel_readInt32(parcel, &size));
|
||||
ON_ERROR_RETURN(AParcel_readParcelFileDescriptor(parcel, &rawFd));
|
||||
android::base::unique_fd fd(rawFd);
|
||||
ashmemCallback(std::move(fd), size);
|
||||
return STATUS_OK;
|
||||
return ashmemCallback(std::move(fd), size);
|
||||
} else {
|
||||
// Although the above if/else was "exhaustive" guard against unknown types
|
||||
return STATUS_UNKNOWN_ERROR;
|
||||
@@ -768,7 +766,7 @@ static binder_status_t writeBlob(AParcel* parcel, const int32_t size, const void
|
||||
// framework, we may need to update this maximum size.
|
||||
static constexpr size_t kMaxColorSpaceSerializedBytes = 80;
|
||||
|
||||
static constexpr auto RuntimeException = "java/lang/RuntimeException";
|
||||
static constexpr auto BadParcelableException = "android/os/BadParcelableException";
|
||||
|
||||
static bool validateImageInfo(const SkImageInfo& info, int32_t rowBytes) {
|
||||
// TODO: Can we avoid making a SkBitmap for this?
|
||||
@@ -809,7 +807,7 @@ static jobject Bitmap_createFromParcel(JNIEnv* env, jobject, jobject parcel) {
|
||||
kRGB_565_SkColorType != colorType &&
|
||||
kARGB_4444_SkColorType != colorType &&
|
||||
kAlpha_8_SkColorType != colorType) {
|
||||
jniThrowExceptionFmt(env, RuntimeException,
|
||||
jniThrowExceptionFmt(env, BadParcelableException,
|
||||
"Bitmap_createFromParcel unknown colortype: %d\n", colorType);
|
||||
return NULL;
|
||||
}
|
||||
@@ -821,7 +819,7 @@ static jobject Bitmap_createFromParcel(JNIEnv* env, jobject, jobject parcel) {
|
||||
return NULL;
|
||||
}
|
||||
if (!Bitmap::computeAllocationSize(rowBytes, height, &allocationSize)) {
|
||||
jniThrowExceptionFmt(env, RuntimeException,
|
||||
jniThrowExceptionFmt(env, BadParcelableException,
|
||||
"Received bad bitmap size: width=%d, height=%d, rowBytes=%d", width,
|
||||
height, rowBytes);
|
||||
return NULL;
|
||||
@@ -831,13 +829,23 @@ static jobject Bitmap_createFromParcel(JNIEnv* env, jobject, jobject parcel) {
|
||||
p.get(),
|
||||
// In place callback
|
||||
[&](std::unique_ptr<int8_t[]> buffer, int32_t size) {
|
||||
if (allocationSize > size) {
|
||||
android_errorWriteLog(0x534e4554, "213169612");
|
||||
return STATUS_BAD_VALUE;
|
||||
}
|
||||
nativeBitmap = Bitmap::allocateHeapBitmap(allocationSize, imageInfo, rowBytes);
|
||||
if (nativeBitmap) {
|
||||
memcpy(nativeBitmap->pixels(), buffer.get(), size);
|
||||
memcpy(nativeBitmap->pixels(), buffer.get(), allocationSize);
|
||||
return STATUS_OK;
|
||||
}
|
||||
return STATUS_NO_MEMORY;
|
||||
},
|
||||
// Ashmem callback
|
||||
[&](android::base::unique_fd fd, int32_t size) {
|
||||
if (allocationSize > size) {
|
||||
android_errorWriteLog(0x534e4554, "213169612");
|
||||
return STATUS_BAD_VALUE;
|
||||
}
|
||||
int flags = PROT_READ;
|
||||
if (isMutable) {
|
||||
flags |= PROT_WRITE;
|
||||
@@ -846,18 +854,21 @@ static jobject Bitmap_createFromParcel(JNIEnv* env, jobject, jobject parcel) {
|
||||
if (addr == MAP_FAILED) {
|
||||
const int err = errno;
|
||||
ALOGW("mmap failed, error %d (%s)", err, strerror(err));
|
||||
return;
|
||||
return STATUS_NO_MEMORY;
|
||||
}
|
||||
nativeBitmap =
|
||||
Bitmap::createFrom(imageInfo, rowBytes, fd.release(), addr, size, !isMutable);
|
||||
return STATUS_OK;
|
||||
});
|
||||
if (error != STATUS_OK) {
|
||||
|
||||
if (error != STATUS_OK && error != STATUS_NO_MEMORY) {
|
||||
// TODO: Stringify the error, see signalExceptionForError in android_util_Binder.cpp
|
||||
jniThrowExceptionFmt(env, RuntimeException, "Failed to read from Parcel, error=%d", error);
|
||||
jniThrowExceptionFmt(env, BadParcelableException, "Failed to read from Parcel, error=%d",
|
||||
error);
|
||||
return nullptr;
|
||||
}
|
||||
if (!nativeBitmap) {
|
||||
jniThrowRuntimeException(env, "Could not allocate java pixel ref.");
|
||||
if (error == STATUS_NO_MEMORY || !nativeBitmap) {
|
||||
jniThrowRuntimeException(env, "Could not allocate bitmap data.");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
@@ -279,11 +279,11 @@ public class NotificationStackScrollLayoutController {
|
||||
|
||||
@Override
|
||||
public void onThemeChanged() {
|
||||
updateShowEmptyShadeView();
|
||||
mView.updateCornerRadius();
|
||||
mView.updateBgColor();
|
||||
mView.updateDecorViews();
|
||||
mView.reinflateViews();
|
||||
updateShowEmptyShadeView();
|
||||
updateFooter();
|
||||
}
|
||||
|
||||
|
||||
@@ -376,6 +376,11 @@ public class StackScrollAlgorithm {
|
||||
|
||||
final float stackHeight = ambientState.getStackHeight() - shelfHeight - scrimPadding;
|
||||
final float stackEndHeight = ambientState.getStackEndHeight() - shelfHeight - scrimPadding;
|
||||
if (stackEndHeight == 0f) {
|
||||
// This should not happen, since even when the shade is empty we show EmptyShadeView
|
||||
// but check just in case, so we don't return infinity or NaN.
|
||||
return 0f;
|
||||
}
|
||||
return stackHeight / stackEndHeight;
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
@@ -1366,7 +1374,8 @@ public class AdbDebuggingManager {
|
||||
device.guid = hostname;
|
||||
device.connected = 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());
|
||||
@@ -1380,14 +1389,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) {
|
||||
@@ -1397,7 +1406,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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -459,7 +459,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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -7380,7 +7380,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
|
||||
mSizeCompatBounds = null;
|
||||
mCompatDisplayInsets = null;
|
||||
|
||||
onRequestedOverrideConfigurationChanged(getRequestedOverrideConfiguration());
|
||||
// Clear config override in #updateCompatDisplayInsets().
|
||||
onRequestedOverrideConfigurationChanged(EMPTY);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -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.
|
||||
*
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user