DO NOT MERGE - Merge Android 13
Bug: 242648940
Merged-In: I29de8eaaaa2d4404a9a1bb66bd8f6fda0afdb544
Change-Id: Ie56326fbbe3db40ef3fa8a289b3527f17c6be921
diff --git a/OWNERS b/OWNERS
index dc17b81..2011246 100644
--- a/OWNERS
+++ b/OWNERS
@@ -1,8 +1,6 @@
brettchabot@google.com
-christianw@google.com
-jongerrish@google.com
+hoisie@google.com
jplemieux@google.com
-justinklaassen@google.com
leechou@google.com
yukl@google.com
tmfang@google.com
\ No newline at end of file
diff --git a/processor/sdks.txt b/processor/sdks.txt
index b9931ca..5444e46 100644
--- a/processor/sdks.txt
+++ b/processor/sdks.txt
@@ -13,3 +13,4 @@
prebuilts/misc/common/robolectric/android-all/android-all-9plus-robolectric-5616371.jar
prebuilts/misc/common/robolectric/android-all/android-all-10-robolectric-5803371.jar
prebuilts/misc/common/robolectric/android-all/android-all-R-beta2-robolectric-6625208.jar
+prebuilts/misc/common/robolectric/android-all/android-all-S-beta3-robolectric-7541949.jar
diff --git a/robolectric/src/main/java/org/robolectric/internal/AndroidConfigurer.java b/robolectric/src/main/java/org/robolectric/internal/AndroidConfigurer.java
index c7b986e..69afa64 100644
--- a/robolectric/src/main/java/org/robolectric/internal/AndroidConfigurer.java
+++ b/robolectric/src/main/java/org/robolectric/internal/AndroidConfigurer.java
@@ -104,6 +104,10 @@
// This results in an error where two __robo_data__ fields get added to the same object.
builder.doNotInstrumentPackage("androidx.room.migration");
builder.doNotInstrumentPackage("androidx.test");
+ // Robolectric instrumentation causes issues with
+ // androidx.lifecycle.viewmodel.MutableCreationExtras and androidx.lifecycle.ViewModelProvider
+ // constructor.
+ builder.doNotInstrumentPackage("androidx.lifecycle");
builder.doNotInstrumentPackage("android.arch.persistence.room.migration");
builder.doNotInstrumentPackage("android.support.test");
diff --git a/robolectric/src/main/java/org/robolectric/internal/SdkConfig.java b/robolectric/src/main/java/org/robolectric/internal/SdkConfig.java
index 8c59354..901d518 100644
--- a/robolectric/src/main/java/org/robolectric/internal/SdkConfig.java
+++ b/robolectric/src/main/java/org/robolectric/internal/SdkConfig.java
@@ -33,6 +33,7 @@
// BEGIN-INTERNAL
// TODO: Update jar with final R release.
addSdk(Build.VERSION_CODES.R, "R-beta2", "6625208", "REL");
+ addSdk(Build.VERSION_CODES.S, "S-beta3", "7541949", "REL");
addSdk(Build.VERSION_CODES.CUR_DEVELOPMENT, "current", "r0", "ZZZ");
// END-INTERNAL
}
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowBluetoothAdapterTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowBluetoothAdapterTest.java
index 42e9f61..2734d60 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowBluetoothAdapterTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowBluetoothAdapterTest.java
@@ -2,12 +2,15 @@
import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR2;
import static android.os.Build.VERSION_CODES.LOLLIPOP;
+import static android.os.Build.VERSION_CODES.S_V2;
+import static android.os.Build.VERSION_CODES.TIRAMISU;
import static com.google.common.truth.Truth.assertThat;
import static org.robolectric.Shadows.shadowOf;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothProfile;
+import android.bluetooth.BluetoothStatusCodes;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import java.util.UUID;
import org.junit.Before;
@@ -86,28 +89,65 @@
}
@Test
+ @Config(maxSdk = S_V2)
public void scanMode_getAndSet_connectable() throws Exception {
- assertThat(bluetoothAdapter.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE)).isTrue();
+ assertThat(bluetoothAdapter.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE)).isEqualTo(
+ true);
assertThat(bluetoothAdapter.getScanMode()).isEqualTo(BluetoothAdapter.SCAN_MODE_CONNECTABLE);
}
@Test
+ @Config(maxSdk = S_V2)
public void scanMode_getAndSet_discoverable() throws Exception {
assertThat(bluetoothAdapter.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE))
- .isTrue();
+ .isEqualTo(true);
assertThat(bluetoothAdapter.getScanMode())
.isEqualTo(BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE);
}
@Test
+ @Config(maxSdk = S_V2)
public void scanMode_getAndSet_none() throws Exception {
- assertThat(bluetoothAdapter.setScanMode(BluetoothAdapter.SCAN_MODE_NONE)).isTrue();
+ assertThat(bluetoothAdapter.setScanMode(BluetoothAdapter.SCAN_MODE_NONE)).isEqualTo(true);
assertThat(bluetoothAdapter.getScanMode()).isEqualTo(BluetoothAdapter.SCAN_MODE_NONE);
}
@Test
+ @Config(maxSdk = S_V2)
public void scanMode_getAndSet_invalid() throws Exception {
- assertThat(bluetoothAdapter.setScanMode(9999)).isFalse();
+ assertThat(bluetoothAdapter.setScanMode(9999)).isEqualTo(false);
+ }
+
+
+ @Test
+ @Config(minSdk = TIRAMISU)
+ public void scanMode_getAndSet_connectable_min_T() throws Exception {
+ assertThat(bluetoothAdapter.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE)).isEqualTo(
+ BluetoothStatusCodes.SUCCESS);
+ assertThat(bluetoothAdapter.getScanMode()).isEqualTo(BluetoothAdapter.SCAN_MODE_CONNECTABLE);
+ }
+
+ @Test
+ @Config(minSdk = TIRAMISU)
+ public void scanMode_getAndSet_discoverable_min_T() throws Exception {
+ assertThat(bluetoothAdapter.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE))
+ .isEqualTo(BluetoothStatusCodes.SUCCESS);
+ assertThat(bluetoothAdapter.getScanMode())
+ .isEqualTo(BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE);
+ }
+
+ @Test
+ @Config(minSdk = TIRAMISU)
+ public void scanMode_getAndSet_none_min_T() throws Exception {
+ assertThat(bluetoothAdapter.setScanMode(BluetoothAdapter.SCAN_MODE_NONE)).isEqualTo(
+ BluetoothStatusCodes.SUCCESS);
+ assertThat(bluetoothAdapter.getScanMode()).isEqualTo(BluetoothAdapter.SCAN_MODE_NONE);
+ }
+
+ @Test
+ @Config(minSdk = TIRAMISU)
+ public void scanMode_getAndSet_invalid_min_T() throws Exception {
+ assertThat(bluetoothAdapter.setScanMode(9999)).isEqualTo(BluetoothStatusCodes.ERROR_UNKNOWN);
}
@Test
diff --git a/run_robolectric_module_tests.mk b/run_robolectric_module_tests.mk
index d65793d..f8d5840 100644
--- a/run_robolectric_module_tests.mk
+++ b/run_robolectric_module_tests.mk
@@ -53,6 +53,7 @@
$(android_all_source_dir)/android-all-9-robolectric-4913185-2.jar:$(android_all_target_dir)/android-all-9-robolectric-4913185-2.jar \
$(android_all_source_dir)/android-all-9plus-robolectric-5616371.jar:$(android_all_target_dir)/android-all-9plus-robolectric-5616371.jar \
$(android_all_source_dir)/android-all-R-beta2-robolectric-6625208.jar:$(android_all_target_dir)/android-all-R-beta2-robolectric-6625208.jar \
+ $(android_all_source_dir)/android-all-S-beta3-robolectric-7541949.jar:$(android_all_target_dir)/android-all-S-beta3-robolectric-7541949.jar \
$(local_android_all_source_jar):$(android_all_target_dir)/android-all-current-robolectric-r0.jar
copy_android_all_jars := $(call copy-many-files, $(copy_android_all_jar_pairs))
diff --git a/run_robotests.mk b/run_robotests.mk
index 262e916..b5a6ee4 100644
--- a/run_robotests.mk
+++ b/run_robotests.mk
@@ -136,6 +136,7 @@
$(android_all_lib_path)/android-all-9-robolectric-4913185-2.jar:$(my_robolectric_path)/android-all-9-robolectric-4913185-2.jar \
$(android_all_lib_path)/android-all-10-robolectric-5803371.jar:$(my_robolectric_path)/android-all-10-robolectric-5803371.jar \
$(android_all_lib_path)/android-all-R-beta2-robolectric-6625208.jar:$(my_robolectric_path)/android-all-R-beta2-robolectric-6625208.jar \
+ $(android_all_lib_path)/android-all-S-beta3-robolectric-7541949.jar:$(my_robolectric_path)/android-all-S-beta3-robolectric-7541949.jar \
$(local_android_all_source_jar):$(my_robolectric_path)/android-all-current-robolectric-r0.jar
copy_android_all_jars := $(call copy-many-files, $(copy_android_all_jar_pairs))
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowActivityThread.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowActivityThread.java
index f41493e..8291517 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowActivityThread.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowActivityThread.java
@@ -42,7 +42,7 @@
throws Exception {
if (method.getName().equals("getApplicationInfo")) {
String packageName = (String) args[0];
- int flags = (Integer) args[1];
+ int flags = ((Number) args[1]).intValue();
if (packageName.equals(ShadowActivityThread.applicationInfo.packageName)) {
return ShadowActivityThread.applicationInfo;
@@ -57,7 +57,7 @@
}
} else if (method.getName().equals("getActivityInfo")) {
ComponentName className = (ComponentName) args[0];
- int flags = (Integer) args[1];
+ int flags = ((Number) args[1]).intValue();
try {
return RuntimeEnvironment.application
@@ -68,7 +68,7 @@
}
} else if (method.getName().equals("getServiceInfo")) {
ComponentName className = (ComponentName) args[0];
- int flags = (Integer) args[1];
+ int flags = ((Number) args[1]).intValue();
try {
return RuntimeEnvironment.application
@@ -78,7 +78,7 @@
throw new RemoteException(e.getMessage());
}
} else if (method.getName().equals("getInstalledApplications")) {
- int flags = (Integer) args[0];
+ int flags = ((Number) args[0]).intValue();
int userId = (Integer) args[1];
return new ParceledListSlice<>(
RuntimeEnvironment.application
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBluetoothAdapter.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBluetoothAdapter.java
index e184e4d..ddfca82 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBluetoothAdapter.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBluetoothAdapter.java
@@ -2,6 +2,7 @@
import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR2;
import static android.os.Build.VERSION_CODES.LOLLIPOP;
+import static android.os.Build.VERSION_CODES.TIRAMISU;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothAdapter.LeScanCallback;
@@ -9,6 +10,7 @@
import android.bluetooth.BluetoothProfile;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
+import android.bluetooth.BluetoothStatusCodes;
import android.os.ParcelUuid;
import java.util.Collections;
import java.util.HashMap;
@@ -18,9 +20,10 @@
import java.util.UUID;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
+import org.robolectric.RuntimeEnvironment;
@SuppressWarnings({"UnusedDeclaration"})
-@Implements(BluetoothAdapter.class)
+@Implements(value = BluetoothAdapter.class, looseSignatures = true)
public class ShadowBluetoothAdapter {
private static final int ADDRESS_LENGTH = 17;
@@ -140,15 +143,16 @@
}
@Implementation
- protected boolean setScanMode(int scanMode) {
+ protected Object setScanMode(int scanMode) {
if (scanMode != BluetoothAdapter.SCAN_MODE_CONNECTABLE
&& scanMode != BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE
&& scanMode != BluetoothAdapter.SCAN_MODE_NONE) {
- return false;
+ return (RuntimeEnvironment.getApiLevel() >= TIRAMISU) ?
+ BluetoothStatusCodes.ERROR_UNKNOWN : false;
}
-
this.scanMode = scanMode;
- return true;
+ return (RuntimeEnvironment.getApiLevel() >= TIRAMISU) ?
+ BluetoothStatusCodes.SUCCESS : true;
}
@Implementation
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowContextImpl.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowContextImpl.java
index 2b29bdb..51cf6bb 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowContextImpl.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowContextImpl.java
@@ -242,6 +242,13 @@
}
@Implementation
+ protected Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
+ String broadcastPermission, Handler scheduler, int flags) {
+ return getShadowInstrumentation()
+ .registerReceiver(receiver, filter, broadcastPermission, scheduler, realContextImpl);
+ }
+
+ @Implementation
protected Intent registerReceiver(
BroadcastReceiver receiver,
IntentFilter filter,
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowDisplayManagerGlobal.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowDisplayManagerGlobal.java
index 8f730a9..b9691d1 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowDisplayManagerGlobal.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowDisplayManagerGlobal.java
@@ -81,7 +81,7 @@
}
// @Override // todo: use @Implements/@Implementation for signature checking
- public int[] getDisplayIds() throws RemoteException {
+ public int[] getDisplayIds(boolean includeDisabledDisplays) throws RemoteException {
int[] ids = new int[displayInfos.size()];
int i = 0;
for (Integer displayId : displayInfos.keySet()) {
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPackageManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPackageManager.java
index d8a3011..56b93ba 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPackageManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPackageManager.java
@@ -53,11 +53,11 @@
import android.content.pm.PackageParser.Component;
import android.content.pm.PackageParser.Package;
import android.content.pm.PackageStats;
-import android.content.pm.PackageUserState;
import android.content.pm.PermissionGroupInfo;
import android.content.pm.PermissionInfo;
import android.content.pm.ResolveInfo;
import android.content.pm.Signature;
+import android.content.pm.pkg.FrameworkPackageUserState;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.net.Uri;
@@ -775,7 +775,7 @@
0,
0,
new HashSet<String>(),
- new PackageUserState());
+ FrameworkPackageUserState.DEFAULT);
} else if (RuntimeEnvironment.getApiLevel() >= LOLLIPOP_MR1) {
packageInfo =
ReflectionHelpers.callStaticMethod(
@@ -788,7 +788,7 @@
ReflectionHelpers.ClassParameter.from(long.class, 0L),
ReflectionHelpers.ClassParameter.from(ArraySet.class, new ArraySet<>()),
ReflectionHelpers.ClassParameter.from(
- PackageUserState.class, new PackageUserState()));
+ FrameworkPackageUserState.class, FrameworkPackageUserState.DEFAULT));
} else if (RuntimeEnvironment.getApiLevel() >= JELLY_BEAN_MR1) {
packageInfo =
ReflectionHelpers.callStaticMethod(
@@ -801,7 +801,7 @@
ReflectionHelpers.ClassParameter.from(long.class, 0L),
ReflectionHelpers.ClassParameter.from(HashSet.class, new HashSet<>()),
ReflectionHelpers.ClassParameter.from(
- PackageUserState.class, new PackageUserState()));
+ FrameworkPackageUserState.class, FrameworkPackageUserState.DEFAULT));
} else {
packageInfo =
ReflectionHelpers.callStaticMethod(
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSystemServiceRegistry.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSystemServiceRegistry.java
index 224f016..61a4174 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSystemServiceRegistry.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSystemServiceRegistry.java
@@ -22,7 +22,7 @@
Class staticApplicationServiceFetcherClass = null;
if (RuntimeEnvironment.getApiLevel() >= Build.VERSION_CODES.N
- && RuntimeEnvironment.getApiLevel() < Build.VERSION_CODES.S) {
+ && RuntimeEnvironment.getApiLevel() < Build.VERSION_CODES.S) {
staticApplicationServiceFetcherClass =
classForName("android.app.SystemServiceRegistry$StaticApplicationContextServiceFetcher");
} else if (RuntimeEnvironment.getApiLevel() == Build.VERSION_CODES.M) {
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowUserManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowUserManager.java
index 44996fa..e1625d1 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowUserManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowUserManager.java
@@ -7,6 +7,7 @@
import static android.os.Build.VERSION_CODES.N;
import static android.os.Build.VERSION_CODES.N_MR1;
import static android.os.Build.VERSION_CODES.R;
+import static android.os.Build.VERSION_CODES.TIRAMISU;
import static org.robolectric.shadow.api.Shadow.directlyOn;
@@ -258,6 +259,12 @@
protected boolean hasUserRestrictionForUser(String restrictionKey, UserHandle userHandle) {
return hasUserRestriction(restrictionKey, userHandle);
}
+
+ @Implementation(minSdk = TIRAMISU)
+ protected boolean hasUserRestrictionForUser(String restrictionKey, int userId) {
+ Bundle bundle = userRestrictions.get(userId);
+ return bundle != null && bundle.getBoolean(restrictionKey);
+ }
// END-INTERNAL
public void setUserRestriction(UserHandle userHandle, String restrictionKey, boolean value) {
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowViewRootImpl.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowViewRootImpl.java
index c42e507..ad17119 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowViewRootImpl.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowViewRootImpl.java
@@ -11,10 +11,11 @@
import android.util.MergedConfiguration;
import android.view.Display;
import android.view.IWindowSession;
+import android.view.InsetsState;
import android.view.ViewRootImpl;
import android.view.WindowManager;
import android.window.ClientWindowFrames;
-import java.util.ArrayList;
+
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
@@ -23,6 +24,8 @@
import org.robolectric.util.ReflectionHelpers;
import org.robolectric.util.ReflectionHelpers.ClassParameter;
+import java.util.ArrayList;
+
@Implements(value = ViewRootImpl.class, isInAndroidSdk = false)
public class ShadowViewRootImpl {
@@ -150,7 +153,7 @@
ClassParameter.from(android.view.DisplayCutout.ParcelableWrapper.class,
new android.view.DisplayCutout.ParcelableWrapper()));
// END-INTERNAL
- } else if (apiLevel >= Build.VERSION_CODES.S) {
+ } else if (apiLevel <= Build.VERSION_CODES.S_V2) {
// BEGIN-INTERNAL
ReflectionHelpers.callInstanceMethod(ViewRootImpl.class, component, "dispatchResized",
ClassParameter.from(ClientWindowFrames.class, clientWindowFrame),
@@ -160,6 +163,19 @@
ClassParameter.from(boolean.class, false),
ClassParameter.from(int.class, 0));
// END-INTERNAL
+ } else if (apiLevel >= Build.VERSION_CODES.TIRAMISU) {
+ // BEGIN-INTERNAL
+ ReflectionHelpers.callInstanceMethod(ViewRootImpl.class, component, "dispatchResized",
+ ClassParameter.from(ClientWindowFrames.class, clientWindowFrame),
+ ClassParameter.from(boolean.class, true),
+ ClassParameter.from(MergedConfiguration.class, new MergedConfiguration()),
+ ClassParameter.from(InsetsState.class, new InsetsState()),
+ ClassParameter.from(boolean.class, false),
+ ClassParameter.from(boolean.class, false),
+ ClassParameter.from(int.class, 0),
+ ClassParameter.from(int.class, 0),
+ ClassParameter.from(int.class, 0));
+ // END-INTERNAL
} else {
throw new RuntimeException("Could not find AndroidRuntimeAdapter for API level: " + apiLevel);
}
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowWifiInfo.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowWifiInfo.java
index a2dca62..ef2e463 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowWifiInfo.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowWifiInfo.java
@@ -61,9 +61,9 @@
private static Object getWifiSsid(String ssid) {
WifiSsid wifiSsid;
if (ssid.startsWith("0x")) {
- wifiSsid = WifiSsid.createFromHex(ssid);
+ wifiSsid = WifiSsid.fromString(ssid.substring(2));
} else {
- wifiSsid = WifiSsid.createFromAsciiEncoded(ssid);
+ wifiSsid = WifiSsid.fromUtf8Text(ssid);
}
return wifiSsid;
}