aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2024-05-10 15:39:03 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2024-05-10 15:39:03 +0000
commit7c6298aee060843942d8faa4108e82189c2ed3c8 (patch)
tree62eb9236e84927850aa1c50716e32667146ae9e8
parent74db492b82c0650ccf26a7bcc3a94a0d10be2245 (diff)
parent432d3ed6098def186a60af3b10efe6767039fa52 (diff)
downloadrobolectric-shadows-busytown-mac-infra-release.tar.gz
Snap for 11819167 from 432d3ed6098def186a60af3b10efe6767039fa52 to busytown-mac-infra-releasebusytown-mac-infra-release
Change-Id: I40fe9823d1dbfe4bcc1e7c0b8e6a3b7518349f26
-rw-r--r--Android.bp105
-rw-r--r--OWNERS6
-rw-r--r--processor/Android.bp2
-rw-r--r--processor/sdks.txt2
-rw-r--r--resources/Android.bp2
-rw-r--r--resources/src/main/java/org/robolectric/res/android/CppAssetManager2.java2
-rw-r--r--resources/src/main/java/org/robolectric/res/android/LoadedArsc.java15
-rw-r--r--resources/src/main/java/org/robolectric/res/android/ResourceTypes.java57
-rw-r--r--robolectric/Android.bp2
-rw-r--r--robolectric/src/main/java/org/robolectric/internal/SdkConfig.java8
-rw-r--r--robolectric/src/test/java/org/robolectric/shadows/ShadowStorageManagerTest.java23
-rw-r--r--robolectric/src/test/java/org/robolectric/shadows/ShadowTelephonyManagerTest.java101
-rw-r--r--run_robolectric_module_tests.mk2
-rw-r--r--run_robotests.mk2
-rw-r--r--sandbox/Android.bp2
-rw-r--r--shadowapi/Android.bp2
-rw-r--r--shadows/androidx/fragment/Android.mk4
-rw-r--r--shadows/framework/src/main/java/org/robolectric/android/controller/ActivityController.java8
-rw-r--r--shadows/framework/src/main/java/org/robolectric/shadows/ImageUtil.java20
-rw-r--r--shadows/framework/src/main/java/org/robolectric/shadows/ShadowAlarmManager.java17
-rw-r--r--shadows/framework/src/main/java/org/robolectric/shadows/ShadowDisplayManagerGlobal.java2
-rw-r--r--shadows/framework/src/main/java/org/robolectric/shadows/ShadowImageDecoder.java20
-rw-r--r--shadows/framework/src/main/java/org/robolectric/shadows/ShadowInputManager.java4
-rw-r--r--shadows/framework/src/main/java/org/robolectric/shadows/ShadowSQLiteConnection.java10
-rw-r--r--shadows/framework/src/main/java/org/robolectric/shadows/ShadowSensor.java36
-rw-r--r--shadows/framework/src/main/java/org/robolectric/shadows/ShadowSensorManager.java6
-rw-r--r--shadows/framework/src/main/java/org/robolectric/shadows/ShadowServiceManager.java4
-rw-r--r--shadows/framework/src/main/java/org/robolectric/shadows/ShadowSettings.java17
-rw-r--r--shadows/framework/src/main/java/org/robolectric/shadows/ShadowStorageManager.java9
-rw-r--r--shadows/framework/src/main/java/org/robolectric/shadows/ShadowTelephonyManager.java15
-rw-r--r--shadows/framework/src/main/java/org/robolectric/shadows/ShadowUsbManager.java14
-rw-r--r--shadows/framework/src/main/java/org/robolectric/shadows/ShadowUserManager.java38
-rw-r--r--shadows/framework/src/main/java/org/robolectric/shadows/ShadowViewRootImpl.java15
-rw-r--r--shadows/framework/src/main/java/org/robolectric/shadows/ShadowWindowManagerGlobal.java5
-rw-r--r--shadows/httpclient/Android.bp2
-rw-r--r--shadows/supportv4/Android.bp2
-rw-r--r--soong/Android.bp32
-rw-r--r--soong/robolectric.go101
-rw-r--r--utils/Android.bp2
39 files changed, 379 insertions, 337 deletions
diff --git a/Android.bp b/Android.bp
index c12f01202..76f78968e 100644
--- a/Android.bp
+++ b/Android.bp
@@ -46,71 +46,6 @@ license {
// Empty library. Should be removed
java_library {
name: "robolectric_android-all-stub",
- visibility: ["//visibility:public"],
-}
-
-// build.prop file created by module type defined in soong/robolectric.go
-robolectric_build_props {
- name: "robolectric_build_props",
-}
-
-java_genrule_host {
- name: "robolectric_framework_res",
- tools: ["zip2zip"],
- srcs: [":framework-res"],
- out: ["robolectric_framework_res.jar"],
- cmd: "$(location zip2zip) " +
- "-i $(location :framework-res) " +
- "-o $(location robolectric_framework_res.jar) " +
- "-x classes.dex " +
- "-x META-INF/**/* " +
- "-0 resources.arsc",
-}
-
-java_device_for_host {
- name: "robolectric_android-all-device-deps",
- libs: [
- "conscrypt-for-host",
- "core-icu4j-for-host",
- "core-libart-for-host",
- "ext",
- "framework-all",
- "icu4j-icudata-jarjar",
- "icu4j-icutzdata-jarjar",
- "ims-common",
- "libphonenumber-platform",
- "okhttp-for-host",
- "services",
- "services.accessibility",
- "telephony-common",
- "android.car",
- "android.car.builtin",
- ],
-}
-
-java_library_host {
- name: "robolectric-host-android_all",
- static_libs: [
- "robolectric_android-all-device-deps",
- "robolectric_tzdata",
- "robolectric_framework_res",
- ],
- dist: {
- targets: [
- "sdk",
- "win_sdk",
- ],
- dest: "android-all-robolectric.jar",
- },
-
- java_resources: [
- // Copy the build.prop
- ":robolectric_build_props",
- ],
- visibility: [
- ":__subpackages__",
- "//prebuilts/misc/common/robolectric",
- ],
}
//#############################################
@@ -158,46 +93,10 @@ java_host_for_device {
libs: ["Robolectric_all"],
visibility: [
":__subpackages__",
- //java references
- "//frameworks/opt/net/wifi/libs/WifiTrackerLib/tests:__pkg__",
- "//prebuilts/sdk/current/androidx:__pkg__",
- "//prebuilts/sdk/current/aaos-libs:__pkg__",
- "//packages/apps/TV/tests/common:__pkg__",
- //robolectric tests
- "//vendor:__subpackages__",
- "//platform_testing/robolab/roboStandaloneProj/tests:__pkg__",
- "//external/mobile-data-download/javatests:__pkg__",
- "//frameworks/base/services/robotests:__pkg__",
- "//frameworks/base/services/robotests/backup:__pkg__",
+ //settings test
+ "//packages/apps/TvSettings/Settings/tests/robotests:__pkg__",
"//frameworks/base/packages/SettingsLib/tests/robotests:__pkg__",
- "//frameworks/base/packages/SystemUI:__pkg__",
- "//frameworks/opt/car/setupwizard/library/main/tests/robotests:__pkg__",
- "//frameworks/opt/localepicker/tests:__pkg__",
- "//frameworks/opt/wear/signaldetector/robotests:__pkg__",
- "//frameworks/opt/wear/robotests:__pkg__",
- "//packages/modules/Connectivity/nearby/tests/multidevices/clients/test_support/snippet_helper/tests:__pkg__",
- "//packages/modules/Connectivity/nearby/tests/robotests:__pkg__",
- "//packages/modules/DeviceLock/DeviceLockController/tests/robolectric:__pkg__",
- "//packages/services/Car/tests/CarLibTests:__pkg__",
- "//packages/services/Mms/tests/robotests:__pkg__",
- "//packages/apps/QuickAccessWallet/tests/robolectric:__pkg__",
- "//packages/apps/ManagedProvisioning/tests/robotests:__pkg__",
- "//packages/apps/Car/libs/car-media-common/tests/robotests",
- "//packages/apps/Car/libs/car-ui-lib",
- "//packages/apps/Car/Notification/tests/robotests:__pkg__",
- "//packages/apps/Car/Cluster/DirectRenderingCluster/tests/robotests:__pkg__",
- "//packages/apps/Car/Settings/tests/robotests:__pkg__",
- "//packages/apps/EmergencyInfo/tests/robolectric:__pkg__",
- "//packages/apps/StorageManager/robotests:__pkg__",
"//packages/apps/Settings/tests/robotests:__pkg__",
- "//packages/apps/ThemePicker/tests/robotests:__pkg__",
- "//packages/apps/WallpaperPicker2/tests/robotests:__pkg__",
- "//packages/apps/TvSettings/Settings/tests/robotests:__pkg__",
- "//packages/apps/KeyChain/robotests:__pkg__",
- "//packages/apps/CertInstaller/robotests:__pkg__",
- //tm-dev additions
- "//frameworks/base/packages/BackupEncryption/test/robolectric-integration:__pkg__",
- "//frameworks/base/packages/BackupEncryption/test/robolectric:__pkg__",
],
}
diff --git a/OWNERS b/OWNERS
index 8036aa048..fd8aa1955 100644
--- a/OWNERS
+++ b/OWNERS
@@ -1,10 +1,14 @@
+# This modified, 4 year old copy of robelectric is unsupported
+# You should switch your tests to use /external/robolectric.
+# You will not receive support on this project and very few projects still use
+# it.
+rexhoffman@google.com
brettchabot@google.com
hoisie@google.com
jplemieux@google.com
yukl@google.com
tmfang@google.com
chiujason@google.com
-rexhoffman@google.com
yuwu@google.com
congxiliu@google.com
ramperi@google.com
diff --git a/processor/Android.bp b/processor/Android.bp
index a61af5000..1988e97a6 100644
--- a/processor/Android.bp
+++ b/processor/Android.bp
@@ -64,7 +64,7 @@ java_test_host {
"guava",
"objenesis",
"junit",
- "truth-prebuilt",
+ "truth",
"gson",
"jsr305",
],
diff --git a/processor/sdks.txt b/processor/sdks.txt
index 985d2d5e3..3b4b80de4 100644
--- a/processor/sdks.txt
+++ b/processor/sdks.txt
@@ -13,3 +13,5 @@ prebuilts/misc/common/robolectric/android-all/android-all-9-robolectric-4913185-
prebuilts/misc/common/robolectric/android-all/android-all-10-robolectric-5803371.jar
prebuilts/misc/common/robolectric/android-all/android-all-11-robolectric-6757853.jar
prebuilts/misc/common/robolectric/android-all/android-all-12-robolectric-7732740.jar
+prebuilts/misc/common/robolectric/android-all/android-all-12.1-robolectric-8229987.jar
+prebuilts/misc/common/robolectric/android-all/android-all-13-robolectric-9030017.jar
diff --git a/resources/Android.bp b/resources/Android.bp
index 3d08f907f..fdda5f91a 100644
--- a/resources/Android.bp
+++ b/resources/Android.bp
@@ -43,7 +43,7 @@ java_test_host {
"guava",
"objenesis",
"junit",
- "truth-prebuilt",
+ "truth",
"jsr305",
],
test_suites: ["general-tests"],
diff --git a/resources/src/main/java/org/robolectric/res/android/CppAssetManager2.java b/resources/src/main/java/org/robolectric/res/android/CppAssetManager2.java
index 33bf96aa9..0f5affb0a 100644
--- a/resources/src/main/java/org/robolectric/res/android/CppAssetManager2.java
+++ b/resources/src/main/java/org/robolectric/res/android/CppAssetManager2.java
@@ -760,7 +760,7 @@ public class CppAssetManager2 {
out_entry_.type_flags = type_flags;
out_entry_.type_string_ref = new StringPoolRef(best_package.GetTypeStringPool(), best_type.id - 1);
out_entry_.entry_string_ref =
- new StringPoolRef(best_package.GetKeyStringPool(), best_entry.key.index);
+ new StringPoolRef(best_package.GetKeyStringPool(), best_entry.getKeyIndex());
out_entry_.dynamic_ref_table = package_group.dynamic_ref_table;
out_entry.set(out_entry_);
return best_cookie;
diff --git a/resources/src/main/java/org/robolectric/res/android/LoadedArsc.java b/resources/src/main/java/org/robolectric/res/android/LoadedArsc.java
index b79f70a62..0c41714f6 100644
--- a/resources/src/main/java/org/robolectric/res/android/LoadedArsc.java
+++ b/resources/src/main/java/org/robolectric/res/android/LoadedArsc.java
@@ -238,7 +238,9 @@ public class LoadedArsc {
// Make sure that there is enough room for the entry offsets.
int offsets_offset = dtohs(header.header.headerSize);
int entries_offset = dtohl(header.entriesStart);
- int offsets_length = 4 * entry_count;
+ int offsets_length = isTruthy(header.flags & ResTable_type.FLAG_OFFSET16)
+ ? 2 * entry_count
+ : 4 * entry_count;
if (offsets_offset > entries_offset || entries_offset - offsets_offset < offsets_length) {
logError("RES_TABLE_TYPE_TYPE entry offsets overlap actual entry data.");
@@ -285,7 +287,7 @@ public class LoadedArsc {
// reinterpret_cast<uint8_t*>(type) + entry_offset);
ResTable_entry entry = new ResTable_entry(type.myBuf(), type.myOffset() + entry_offset);
- int entry_size = dtohs(entry.size);
+ int entry_size = entry.isCompact() ? 8 : dtohs(entry.size);
// if (entry_size < sizeof(*entry)) {
if (entry_size < ResTable_entry.SIZEOF) {
logError("ResTable_entry size " + entry_size + " at offset " + entry_offset
@@ -299,6 +301,10 @@ public class LoadedArsc {
return false;
}
+ if (entry.isCompact()) {
+ return true;
+ }
+
if (entry_size < ResTable_map_entry.BASE_SIZEOF) {
// There needs to be room for one Res_value struct.
if (entry_offset + entry_size > chunk_size - Res_value.SIZEOF) {
@@ -309,8 +315,7 @@ public class LoadedArsc {
// Res_value value =
// reinterpret_cast<Res_value*>(reinterpret_cast<uint8_t*>(entry) + entry_size);
- Res_value value =
- new Res_value(entry.myBuf(), entry.myOffset() + ResTable_entry.SIZEOF);
+ Res_value value = entry.getResValue();
int value_size = dtohs(value.size);
if (value_size < Res_value.SIZEOF) {
logError("Res_value at offset " + entry_offset + " is too small.");
@@ -532,7 +537,7 @@ public class LoadedArsc {
ResTable_entry entry =
new ResTable_entry(type.myBuf(), type.myOffset() +
dtohl(type.entriesStart) + offset);
- if (dtohl(entry.key.index) == key_idx) {
+ if (dtohl(entry.getKeyIndex()) == key_idx) {
// The package ID will be overridden by the caller (due to runtime assignment of package
// IDs for shared libraries).
return make_resid((byte) 0x00, (byte) (type_idx + type_id_offset_ + 1), (short) entry_idx);
diff --git a/resources/src/main/java/org/robolectric/res/android/ResourceTypes.java b/resources/src/main/java/org/robolectric/res/android/ResourceTypes.java
index 7e802e12d..5438f33cb 100644
--- a/resources/src/main/java/org/robolectric/res/android/ResourceTypes.java
+++ b/resources/src/main/java/org/robolectric/res/android/ResourceTypes.java
@@ -340,7 +340,7 @@ public class ResourceTypes {
}
public Res_value(byte dataType, int data) {
- this.size = 0;
+ this.size = SIZEOF;
// this.res0 = 0;
this.dataType = dataType;
this.data = data;
@@ -1167,6 +1167,11 @@ public static class ResTable_ref
// Mark any types that use this with a v26 qualifier to prevent runtime issues on older
// platforms.
public static final int FLAG_SPARSE = 0x01;
+
+ // If set, the offsets to the entries are encoded in 16-bit, real_offset = offset * 4u
+ // An 16-bit offset of 0xffffu means a NO_ENTRY
+ public static final int FLAG_OFFSET16 = 0x02;
+
// };
final byte flags;
@@ -1208,13 +1213,21 @@ public static class ResTable_ref
int entryOffset(int entryIndex) {
ByteBuffer byteBuffer = myBuf();
int offset = myOffset();
-
+ boolean isOffset16 = (flags & ResTable_type.FLAG_OFFSET16) == ResTable_type.FLAG_OFFSET16;
+ if (isOffset16) {
+ short off16 = byteBuffer.getShort(offset + header.headerSize + entryIndex * 2);
+ if (off16 == -1) {
+ return -1;
+ }
+ return dtohs(off16) == 0xffff ? ResTable_type.NO_ENTRY : dtohs(off16) * 4;
+ } else {
+ return byteBuffer.getInt(offset + header.headerSize + entryIndex * 4);
+ }
// from ResTable cpp:
// const uint32_t* const eindex = reinterpret_cast<const uint32_t*>(
// reinterpret_cast<const uint8_t*>(thisType) + dtohs(thisType->header.headerSize));
//
// uint32_t thisOffset = dtohl(eindex[realEntryIndex]);
- return byteBuffer.getInt(offset + header.headerSize + entryIndex * 4);
}
private int entryNameIndex(int entryIndex) {
@@ -1282,7 +1295,7 @@ public static class ResTable_ref
public static final int SIZEOF = 4 + ResStringPool_ref.SIZEOF;
// Number of bytes in this structure.
- final short size;
+ short size;
//enum {
// If set, this is a complex entry, holding a set of name/value
@@ -1295,18 +1308,41 @@ public static class ResTable_ref
// resources of the same name/type. This is only useful during
// linking with other resource tables.
public static final int FLAG_WEAK = 0x0004;
+
+ public static final int FLAG_COMPACT = 0x0008;
// };
final short flags;
// Reference into ResTable_package::keyStrings identifying this entry.
- final ResStringPool_ref key;
+ ResStringPool_ref key;
+
+ int compactData;
+ short compactKey;
ResTable_entry(ByteBuffer buf, int offset) {
super(buf, offset);
- size = buf.getShort(offset);
flags = buf.getShort(offset + 2);
- key = new ResStringPool_ref(buf, offset + 4);
+
+ if (isCompact()) {
+ compactKey = buf.getShort(offset);
+ compactData = buf.getInt(offset + 4);
+ } else {
+ size = buf.getShort(offset);
+ key = new ResStringPool_ref(buf, offset + 4);
+ }
+ }
+
+ public boolean isCompact() {
+ return (flags & FLAG_COMPACT) == FLAG_COMPACT;
+ }
+
+ public int getKeyIndex() {
+ if (isCompact()) {
+ return dtohs(compactKey);
+ } else {
+ return key.index;
+ }
}
public Res_value getResValue() {
@@ -1315,7 +1351,12 @@ public static class ResTable_ref
// final Res_value device_value = reinterpret_cast<final Res_value>(
// reinterpret_cast<final byte*>(entry) + dtohs(entry.size));
- return new Res_value(myBuf(), myOffset() + dtohs(size));
+ if (isCompact()) {
+ byte type = (byte)(dtohs(flags) >> 8);
+ return new Res_value((byte)(dtohs(flags) >> 8), compactData);
+ } else {
+ return new Res_value(myBuf(), myOffset() + dtohs(size));
+ }
}
}
diff --git a/robolectric/Android.bp b/robolectric/Android.bp
index 4d2639d15..8e5a7d664 100644
--- a/robolectric/Android.bp
+++ b/robolectric/Android.bp
@@ -78,7 +78,7 @@ java_test_host {
"ow2-asm-tree",
"junit",
"icu4j",
- "truth-prebuilt",
+ "truth",
"robolectric-ant-1.8.0",
"ow2-asm",
"jsr305",
diff --git a/robolectric/src/main/java/org/robolectric/internal/SdkConfig.java b/robolectric/src/main/java/org/robolectric/internal/SdkConfig.java
index 901d518f4..c99372a7c 100644
--- a/robolectric/src/main/java/org/robolectric/internal/SdkConfig.java
+++ b/robolectric/src/main/java/org/robolectric/internal/SdkConfig.java
@@ -30,10 +30,12 @@ public class SdkConfig implements Comparable<SdkConfig> {
addSdk(Build.VERSION_CODES.O_MR1, "8.1.0", "4611349", "REL");
addSdk(Build.VERSION_CODES.P, "9", "4913185-2", "REL");
addSdk(Build.VERSION_CODES.Q, "10", "5803371", "REL");
+ addSdk(Build.VERSION_CODES.R, "11", "6757853", "REL");
+ addSdk(Build.VERSION_CODES.S, "12", "7732740", "REL");
+ addSdk(Build.VERSION_CODES.S_V2, "12.1", "8229987", "REL");
+ addSdk(Build.VERSION_CODES.TIRAMISU, "13", "9030017", "REL");
// 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");
+ // TODO: Update jar with final U release.
addSdk(Build.VERSION_CODES.CUR_DEVELOPMENT, "current", "r0", "ZZZ");
// END-INTERNAL
}
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowStorageManagerTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowStorageManagerTest.java
index e1c4c7104..ecc07bd63 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowStorageManagerTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowStorageManagerTest.java
@@ -1,6 +1,8 @@
package org.robolectric.shadows;
import static android.os.Build.VERSION_CODES.N;
+import static android.os.Build.VERSION_CODES.TIRAMISU;
+import static android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE;
import static com.google.common.truth.Truth.assertThat;
import static org.robolectric.RuntimeEnvironment.application;
import static org.robolectric.Shadows.shadowOf;
@@ -17,6 +19,7 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.annotation.Config;
+import org.robolectric.util.ReflectionHelpers;
/** Unit tests for {@link ShadowStorageManager}. */
@RunWith(AndroidJUnit4.class)
@@ -53,17 +56,29 @@ public class ShadowStorageManagerTest {
}
@Test
- @Config(minSdk = N)
+ @Config(minSdk = N, maxSdk = TIRAMISU)
public void isFileEncryptedNativeOrEmulated() {
shadowOf(storageManager).setFileEncryptedNativeOrEmulated(true);
- assertThat(StorageManager.isFileEncryptedNativeOrEmulated()).isTrue();
+ // Use reflection, as this method is planned to be removed from StorageManager in V.
+ assertThat(
+ (boolean)
+ ReflectionHelpers.callStaticMethod(
+ StorageManager.class, "isFileEncryptedNativeOrEmulated"))
+ .isTrue();
}
@Test
- @Config(minSdk = N)
+ @Config(minSdk = N, maxSdk = UPSIDE_DOWN_CAKE)
public void isUserKeyUnlocked() {
shadowOf(application.getSystemService(UserManager.class)).setUserUnlocked(true);
- assertThat(StorageManager.isUserKeyUnlocked(0)).isTrue();
+ // Use reflection, as this method is planned to be removed from StorageManager in V.
+ assertThat(
+ (boolean)
+ ReflectionHelpers.callStaticMethod(
+ StorageManager.class,
+ "isUserKeyUnlocked",
+ ReflectionHelpers.ClassParameter.from(int.class, 0)))
+ .isTrue();
}
private StorageVolume buildAndGetStorageVolume(File file, String description) {
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowTelephonyManagerTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowTelephonyManagerTest.java
index 5b947ceea..52ef012d1 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowTelephonyManagerTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowTelephonyManagerTest.java
@@ -34,6 +34,7 @@ import android.telephony.PhoneStateListener;
import android.telephony.ServiceState;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
+import android.telephony.UiccSlotInfo;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import java.util.Collections;
@@ -47,12 +48,10 @@ import org.robolectric.annotation.Config;
public class ShadowTelephonyManagerTest {
private TelephonyManager telephonyManager;
- private ShadowTelephonyManager shadowTelephonyManager;
@Before
public void setUp() throws Exception {
telephonyManager = (TelephonyManager) application.getSystemService(TELEPHONY_SERVICE);
- shadowTelephonyManager = shadowOf(telephonyManager);
}
@Test
@@ -70,15 +69,15 @@ public class ShadowTelephonyManagerTest {
@Test
public void shouldGiveDeviceId() {
String testId = "TESTING123";
- shadowTelephonyManager.setDeviceId(testId);
+ shadowOf(telephonyManager).setDeviceId(testId);
assertEquals(testId, telephonyManager.getDeviceId());
}
@Test
@Config(minSdk = M)
public void shouldGiveDeviceIdForSlot() {
- shadowTelephonyManager.setDeviceId(1, "device in slot 1");
- shadowTelephonyManager.setDeviceId(2, "device in slot 2");
+ shadowOf(telephonyManager).setDeviceId(1, "device in slot 1");
+ shadowOf(telephonyManager).setDeviceId(2, "device in slot 2");
assertEquals("device in slot 1", telephonyManager.getDeviceId(1));
assertEquals("device in slot 2", telephonyManager.getDeviceId(2));
@@ -88,7 +87,7 @@ public class ShadowTelephonyManagerTest {
@Config(minSdk = O)
public void getImei() {
String testImei = "4test imei";
- shadowTelephonyManager.setImei(testImei);
+ shadowOf(telephonyManager).setImei(testImei);
assertEquals(testImei, telephonyManager.getImei());
}
@@ -96,45 +95,45 @@ public class ShadowTelephonyManagerTest {
@Config(minSdk = O)
public void getMeid() {
String testMeid = "4test meid";
- shadowTelephonyManager.setMeid(testMeid);
+ shadowOf(telephonyManager).setMeid(testMeid);
assertEquals(testMeid, telephonyManager.getMeid());
}
@Test
public void shouldGiveNetworkOperatorName() {
- shadowTelephonyManager.setNetworkOperatorName("SomeOperatorName");
+ shadowOf(telephonyManager).setNetworkOperatorName("SomeOperatorName");
assertEquals("SomeOperatorName", telephonyManager.getNetworkOperatorName());
}
@Test
public void shouldGiveSimOperatorName() {
- shadowTelephonyManager.setSimOperatorName("SomeSimOperatorName");
+ shadowOf(telephonyManager).setSimOperatorName("SomeSimOperatorName");
assertEquals("SomeSimOperatorName", telephonyManager.getSimOperatorName());
}
@Test(expected = SecurityException.class)
public void getSimSerialNumber_shouldThrowSecurityExceptionWhenReadPhoneStatePermissionNotGranted()
throws Exception {
- shadowTelephonyManager.setReadPhoneStatePermission(false);
+ shadowOf(telephonyManager).setReadPhoneStatePermission(false);
telephonyManager.getSimSerialNumber();
}
@Test
public void shouldGetSimSerialNumber() {
- shadowTelephonyManager.setSimSerialNumber("SomeSerialNumber");
+ shadowOf(telephonyManager).setSimSerialNumber("SomeSerialNumber");
assertEquals("SomeSerialNumber", telephonyManager.getSimSerialNumber());
}
@Test
public void shouldGiveNetworkType() {
- shadowTelephonyManager.setNetworkType(TelephonyManager.NETWORK_TYPE_CDMA);
+ shadowOf(telephonyManager).setNetworkType(TelephonyManager.NETWORK_TYPE_CDMA);
assertEquals(TelephonyManager.NETWORK_TYPE_CDMA, telephonyManager.getNetworkType());
}
@Test
@Config(minSdk = N)
public void shouldGiveVoiceNetworkType() {
- shadowTelephonyManager.setVoiceNetworkType(TelephonyManager.NETWORK_TYPE_CDMA);
+ shadowOf(telephonyManager).setVoiceNetworkType(TelephonyManager.NETWORK_TYPE_CDMA);
assertThat(telephonyManager.getVoiceNetworkType())
.isEqualTo(TelephonyManager.NETWORK_TYPE_CDMA);
}
@@ -146,48 +145,48 @@ public class ShadowTelephonyManagerTest {
telephonyManager.listen(listener, LISTEN_CELL_INFO);
List<CellInfo> allCellInfo = Collections.singletonList(mock(CellInfo.class));
- shadowTelephonyManager.setAllCellInfo(allCellInfo);
+ shadowOf(telephonyManager).setAllCellInfo(allCellInfo);
assertEquals(allCellInfo, telephonyManager.getAllCellInfo());
verify(listener).onCellInfoChanged(allCellInfo);
}
@Test
public void shouldGiveNetworkCountryIso() {
- shadowTelephonyManager.setNetworkCountryIso("SomeIso");
+ shadowOf(telephonyManager).setNetworkCountryIso("SomeIso");
assertEquals("SomeIso", telephonyManager.getNetworkCountryIso());
}
@Test
public void shouldGiveNetworkOperator() {
- shadowTelephonyManager.setNetworkOperator("SomeOperator");
+ shadowOf(telephonyManager).setNetworkOperator("SomeOperator");
assertEquals("SomeOperator", telephonyManager.getNetworkOperator());
}
@Test
public void shouldGiveLine1Number() {
- shadowTelephonyManager.setLine1Number("123-244-2222");
+ shadowOf(telephonyManager).setLine1Number("123-244-2222");
assertEquals("123-244-2222", telephonyManager.getLine1Number());
}
@Test
@Config(minSdk = JELLY_BEAN_MR2)
public void shouldGiveGroupIdLevel1() {
- shadowTelephonyManager.setGroupIdLevel1("SomeGroupId");
+ shadowOf(telephonyManager).setGroupIdLevel1("SomeGroupId");
assertEquals("SomeGroupId", telephonyManager.getGroupIdLevel1());
}
@Test(expected = SecurityException.class)
public void getDeviceId_shouldThrowSecurityExceptionWhenReadPhoneStatePermissionNotGranted()
throws Exception {
- shadowTelephonyManager.setReadPhoneStatePermission(false);
+ shadowOf(telephonyManager).setReadPhoneStatePermission(false);
telephonyManager.getDeviceId();
}
@Test
public void shouldGivePhoneType() {
- shadowTelephonyManager.setPhoneType(TelephonyManager.PHONE_TYPE_CDMA);
+ shadowOf(telephonyManager).setPhoneType(TelephonyManager.PHONE_TYPE_CDMA);
assertEquals(TelephonyManager.PHONE_TYPE_CDMA, telephonyManager.getPhoneType());
- shadowTelephonyManager.setPhoneType(TelephonyManager.PHONE_TYPE_GSM);
+ shadowOf(telephonyManager).setPhoneType(TelephonyManager.PHONE_TYPE_GSM);
assertEquals(TelephonyManager.PHONE_TYPE_GSM, telephonyManager.getPhoneType());
}
@@ -219,7 +218,7 @@ public class ShadowTelephonyManagerTest {
@Test
public void isSmsCapable() {
assertThat(telephonyManager.isSmsCapable()).isTrue();
- shadowTelephonyManager.setIsSmsCapable(false);
+ shadowOf(telephonyManager).setIsSmsCapable(false);
assertThat(telephonyManager.isSmsCapable()).isFalse();
}
@@ -228,7 +227,7 @@ public class ShadowTelephonyManagerTest {
public void shouldGiveCarrierConfigIfSet() {
PersistableBundle bundle = new PersistableBundle();
bundle.putInt("foo", 42);
- shadowTelephonyManager.setCarrierConfig(bundle);
+ shadowOf(telephonyManager).setCarrierConfig(bundle);
assertEquals(bundle, telephonyManager.getCarrierConfig());
}
@@ -241,14 +240,14 @@ public class ShadowTelephonyManagerTest {
@Test
public void shouldGiveVoiceMailNumber() {
- shadowTelephonyManager.setVoiceMailNumber("123");
+ shadowOf(telephonyManager).setVoiceMailNumber("123");
assertEquals("123", telephonyManager.getVoiceMailNumber());
}
@Test
public void shouldGiveVoiceMailAlphaTag() {
- shadowTelephonyManager.setVoiceMailAlphaTag("tag");
+ shadowOf(telephonyManager).setVoiceMailAlphaTag("tag");
assertEquals("tag", telephonyManager.getVoiceMailAlphaTag());
}
@@ -256,7 +255,7 @@ public class ShadowTelephonyManagerTest {
@Test
@Config(minSdk = M)
public void shouldGivePhoneCount() {
- shadowTelephonyManager.setPhoneCount(42);
+ shadowOf(telephonyManager).setPhoneCount(42);
assertEquals(42, telephonyManager.getPhoneCount());
}
@@ -268,7 +267,7 @@ public class ShadowTelephonyManagerTest {
new PhoneAccountHandle(
new ComponentName(ApplicationProvider.getApplicationContext(), Object.class), "handle");
- shadowTelephonyManager.setVoicemailVibrationEnabled(phoneAccountHandle, true);
+ shadowOf(telephonyManager).setVoicemailVibrationEnabled(phoneAccountHandle, true);
assertTrue(telephonyManager.isVoicemailVibrationEnabled(phoneAccountHandle));
}
@@ -281,7 +280,7 @@ public class ShadowTelephonyManagerTest {
new ComponentName(ApplicationProvider.getApplicationContext(), Object.class), "handle");
Uri ringtoneUri = Uri.fromParts("file", "ringtone.mp3", /* fragment = */ null);
- shadowTelephonyManager.setVoicemailRingtoneUri(phoneAccountHandle, ringtoneUri);
+ shadowOf(telephonyManager).setVoicemailRingtoneUri(phoneAccountHandle, ringtoneUri);
assertEquals(ringtoneUri, telephonyManager.getVoicemailRingtoneUri(phoneAccountHandle));
}
@@ -308,7 +307,8 @@ public class ShadowTelephonyManagerTest {
new ComponentName(ApplicationProvider.getApplicationContext(), Object.class), "handle");
TelephonyManager mockTelephonyManager = mock(TelephonyManager.class);
- shadowTelephonyManager.setTelephonyManagerForHandle(phoneAccountHandle, mockTelephonyManager);
+ shadowOf(telephonyManager)
+ .setTelephonyManagerForHandle(phoneAccountHandle, mockTelephonyManager);
assertEquals(
mockTelephonyManager, telephonyManager.createForPhoneAccountHandle(phoneAccountHandle));
@@ -320,8 +320,8 @@ public class ShadowTelephonyManagerTest {
int subscriptionId = 42;
TelephonyManager mockTelephonyManager = mock(TelephonyManager.class);
- shadowTelephonyManager.setTelephonyManagerForSubscriptionId(
- subscriptionId, mockTelephonyManager);
+ shadowOf(telephonyManager)
+ .setTelephonyManagerForSubscriptionId(subscriptionId, mockTelephonyManager);
assertEquals(mockTelephonyManager, telephonyManager.createForSubscriptionId(subscriptionId));
}
@@ -332,14 +332,14 @@ public class ShadowTelephonyManagerTest {
ServiceState serviceState = new ServiceState();
serviceState.setState(ServiceState.STATE_OUT_OF_SERVICE);
- shadowTelephonyManager.setServiceState(serviceState);
+ shadowOf(telephonyManager).setServiceState(serviceState);
assertEquals(serviceState, telephonyManager.getServiceState());
}
@Test
public void shouldSetIsNetworkRoaming() {
- shadowTelephonyManager.setIsNetworkRoaming(true);
+ shadowOf(telephonyManager).setIsNetworkRoaming(true);
assertTrue(telephonyManager.isNetworkRoaming());
}
@@ -354,7 +354,7 @@ public class ShadowTelephonyManagerTest {
public void shouldGetSimStateUsingSlotNumber() {
int expectedSimState = TelephonyManager.SIM_STATE_ABSENT;
int slotNumber = 3;
- shadowTelephonyManager.setSimState(slotNumber, expectedSimState);
+ shadowOf(telephonyManager).setSimState(slotNumber, expectedSimState);
assertThat(telephonyManager.getSimState(slotNumber)).isEqualTo(expectedSimState);
}
@@ -369,7 +369,7 @@ public class ShadowTelephonyManagerTest {
public void shouldGetSimIosWhenSetUsingSlotNumber() {
String expectedSimIso = "usa";
int subId = 2;
- shadowTelephonyManager.setSimCountryIso(subId, expectedSimIso);
+ shadowOf(telephonyManager).setSimCountryIso(subId, expectedSimIso);
assertThat(telephonyManager.getSimCountryIso(subId)).isEqualTo(expectedSimIso);
}
@@ -378,7 +378,7 @@ public class ShadowTelephonyManagerTest {
@Config(minSdk = P)
public void shouldGetSimCarrierId() {
int expectedCarrierId = 132;
- shadowTelephonyManager.setSimCarrierId(expectedCarrierId);
+ shadowOf(telephonyManager).setSimCarrierId(expectedCarrierId);
assertThat(telephonyManager.getSimCarrierId()).isEqualTo(expectedCarrierId);
}
@@ -388,7 +388,7 @@ public class ShadowTelephonyManagerTest {
public void shouldGetCurrentPhoneTypeGivenSubId() {
int subId = 1;
int expectedPhoneType = TelephonyManager.PHONE_TYPE_GSM;
- shadowTelephonyManager.setCurrentPhoneType(subId, expectedPhoneType);
+ shadowOf(telephonyManager).setCurrentPhoneType(subId, expectedPhoneType);
assertThat(telephonyManager.getCurrentPhoneType(subId)).isEqualTo(expectedPhoneType);
}
@@ -398,7 +398,7 @@ public class ShadowTelephonyManagerTest {
public void shouldGetCarrierPackageNamesForIntentAndPhone() {
List<String> packages = Collections.singletonList("package1");
int phoneId = 123;
- shadowTelephonyManager.setCarrierPackageNamesForPhone(phoneId, packages);
+ shadowOf(telephonyManager).setCarrierPackageNamesForPhone(phoneId, packages);
assertThat(telephonyManager.getCarrierPackageNamesForIntentAndPhone(new Intent(), phoneId))
.isEqualTo(packages);
@@ -408,15 +408,15 @@ public class ShadowTelephonyManagerTest {
@Config(minSdk = M)
public void shouldGetCarrierPackageNamesForIntent() {
List<String> packages = Collections.singletonList("package1");
- shadowTelephonyManager.setCarrierPackageNamesForPhone(
- SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, packages);
+ shadowOf(telephonyManager)
+ .setCarrierPackageNamesForPhone(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, packages);
assertThat(telephonyManager.getCarrierPackageNamesForIntent(new Intent())).isEqualTo(packages);
}
@Test
public void resetSimStates_shouldRetainDefaultState() {
- shadowTelephonyManager.resetSimStates();
+ shadowOf(telephonyManager).resetSimStates();
assertThat(telephonyManager.getSimState()).isEqualTo(TelephonyManager.SIM_STATE_READY);
}
@@ -424,16 +424,27 @@ public class ShadowTelephonyManagerTest {
@Test
@Config(minSdk = N)
public void resetSimCountryIsos_shouldRetainDefaultState() {
- shadowTelephonyManager.resetSimCountryIsos();
+ shadowOf(telephonyManager).resetSimCountryIsos();
- assertThat(shadowTelephonyManager.getSimCountryIso()).isEmpty();
+ assertThat(telephonyManager.getSimCountryIso()).isEmpty();
}
@Test
public void shouldSetSubscriberId() {
String subscriberId = "123451234512345";
- shadowTelephonyManager.setSubscriberId(subscriberId);
+ shadowOf(telephonyManager).setSubscriberId(subscriberId);
+
+ assertThat(telephonyManager.getSubscriberId()).isEqualTo(subscriberId);
+ }
+
+ @Test
+ @Config(minSdk = P)
+ public void getUiccSlotsInfo() {
+ UiccSlotInfo slotInfo1 = new UiccSlotInfo(true, true, null, 0, 0, true);
+ UiccSlotInfo slotInfo2 = new UiccSlotInfo(true, true, null, 0, 1, true);
+ UiccSlotInfo[] slotInfos = new UiccSlotInfo[] {slotInfo1, slotInfo2};
+ shadowOf(telephonyManager).setUiccSlotsInfo(slotInfos);
- assertThat(shadowTelephonyManager.getSubscriberId()).isEqualTo(subscriberId);
+ assertThat(shadowOf(telephonyManager).getUiccSlotsInfo()).isEqualTo(slotInfos);
}
}
diff --git a/run_robolectric_module_tests.mk b/run_robolectric_module_tests.mk
index 9e15ecdd4..0050c7326 100644
--- a/run_robolectric_module_tests.mk
+++ b/run_robolectric_module_tests.mk
@@ -54,6 +54,8 @@ copy_android_all_jar_pairs := \
$(android_all_source_dir)/android-all-10-robolectric-5803371.jar:$(android_all_target_dir)/android-all-10-robolectric-5803371.jar \
$(android_all_source_dir)/android-all-11-robolectric-6757853.jar:$(android_all_target_dir)/android-all-11-robolectric-6757853.jar \
$(android_all_source_dir)/android-all-12-robolectric-7732740.jar:$(android_all_target_dir)/android-all-12-robolectric-7732740.jar \
+ $(android_all_source_dir)/android-all-12.1-robolectric-8229987.jar:$(android_all_target_dir)/android-all-12.1-robolectric-8229987.jar \
+ $(android_all_source_dir)/android-all-13-robolectric-9030017.jar:$(android_all_target_dir)/android-all-13-robolectric-9030017.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 a7bc43d81..cb0db1b74 100644
--- a/run_robotests.mk
+++ b/run_robotests.mk
@@ -137,6 +137,8 @@ ifneq ($(DISABLE_ROBO_RUN_TESTS),true)
$(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-11-robolectric-6757853.jar:$(my_robolectric_path)/android-all-11-robolectric-6757853.jar \
$(android_all_lib_path)/android-all-12-robolectric-7732740.jar:$(my_robolectric_path)/android-all-12-robolectric-7732740.jar \
+ $(android_all_lib_path)/android-all-12.1-robolectric-8229987.jar:$(my_robolectric_path)/android-all-12.1-robolectric-8229987.jar \
+ $(android_all_lib_path)/android-all-13-robolectric-9030017.jar:$(my_robolectric_path)/android-all-13-robolectric-9030017.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/sandbox/Android.bp b/sandbox/Android.bp
index fafcdef53..9a194bdbd 100644
--- a/sandbox/Android.bp
+++ b/sandbox/Android.bp
@@ -46,7 +46,7 @@ java_test_host {
"objenesis",
"ow2-asm-tree",
"junit",
- "truth-prebuilt",
+ "truth",
"ow2-asm",
"jsr305",
],
diff --git a/shadowapi/Android.bp b/shadowapi/Android.bp
index a46f8ca03..95c75681a 100644
--- a/shadowapi/Android.bp
+++ b/shadowapi/Android.bp
@@ -33,7 +33,7 @@ java_test_host {
"hamcrest",
"guava",
"junit",
- "truth-prebuilt",
+ "truth",
],
test_suites: ["general-tests"],
}
diff --git a/shadows/androidx/fragment/Android.mk b/shadows/androidx/fragment/Android.mk
index 6b538e33b..98ece456f 100644
--- a/shadows/androidx/fragment/Android.mk
+++ b/shadows/androidx/fragment/Android.mk
@@ -14,7 +14,7 @@ LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/src/test/resources/res
# This exists to coerce make into generating and compiling R.java.
LOCAL_STATIC_JAVA_LIBRARIES := androidx.fragment_fragment
-LOCAL_MIN_SDK_VERSION := 16
+LOCAL_MIN_SDK_VERSION := 19
LOCAL_SDK_VERSION := current
@@ -44,7 +44,7 @@ LOCAL_DONT_DELETE_JAR_META_INF := true
LOCAL_STATIC_JAVA_LIBRARIES := \
Robolectric_all-target \
- truth-prebuilt
+ truth
LOCAL_JAVA_LIBRARIES := \
robolectric_android-all-stub
diff --git a/shadows/framework/src/main/java/org/robolectric/android/controller/ActivityController.java b/shadows/framework/src/main/java/org/robolectric/android/controller/ActivityController.java
index 3f173dcb8..b41ca9cee 100644
--- a/shadows/framework/src/main/java/org/robolectric/android/controller/ActivityController.java
+++ b/shadows/framework/src/main/java/org/robolectric/android/controller/ActivityController.java
@@ -16,6 +16,7 @@ import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
+import android.os.Build;
import android.os.Bundle;
import android.view.ViewRootImpl;
import org.robolectric.RuntimeEnvironment;
@@ -160,9 +161,14 @@ public class ActivityController<T extends Activity> extends ComponentController<
callDispatchResized(root);
}
- ReflectionHelpers.callInstanceMethod(root, "windowFocusChanged",
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+ ReflectionHelpers.callInstanceMethod(root, "windowFocusChanged",
+ from(boolean.class, hasFocus));
+ } else {
+ ReflectionHelpers.callInstanceMethod(root, "windowFocusChanged",
from(boolean.class, hasFocus), /* hasFocus */
from(boolean.class, false) /* inTouchMode */);
+ }
return this;
}
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ImageUtil.java b/shadows/framework/src/main/java/org/robolectric/shadows/ImageUtil.java
index 534a0eebc..83ed5a7b9 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ImageUtil.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ImageUtil.java
@@ -21,7 +21,25 @@ import javax.imageio.stream.ImageOutputStream;
public class ImageUtil {
private static boolean initialized;
+ public static class ImageInfo {
+
+ public final int width;
+ public final int height;
+ public final String mimeType;
+
+ ImageInfo(int width, int height, String mimeType) {
+ this.width = width;
+ this.height = height;
+ this.mimeType = mimeType;
+ }
+ }
+
public static Point getImageSizeFromStream(InputStream is) {
+ ImageInfo info = getImageInfoFromStream(is);
+ return new Point(info.width, info.height);
+ }
+
+ public static ImageInfo getImageInfoFromStream(InputStream is) {
if (!initialized) {
// Stops ImageIO from creating temp files when reading images
// from input stream.
@@ -37,7 +55,7 @@ public class ImageUtil {
ImageReader reader = readers.next();
try {
reader.setInput(imageStream);
- return new Point(reader.getWidth(0), reader.getHeight(0));
+ return new ImageInfo(reader.getWidth(0), reader.getHeight(0), "image/" + reader.getFormatName());
} finally {
reader.dispose();
}
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowAlarmManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowAlarmManager.java
index bea306d2e..0ec2bc838 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowAlarmManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowAlarmManager.java
@@ -5,6 +5,7 @@ import static android.os.Build.VERSION_CODES.KITKAT;
import static android.os.Build.VERSION_CODES.LOLLIPOP;
import static android.os.Build.VERSION_CODES.M;
import static android.os.Build.VERSION_CODES.N;
+import static android.os.Build.VERSION_CODES.S;
import android.annotation.TargetApi;
import android.app.AlarmManager;
@@ -29,6 +30,7 @@ public class ShadowAlarmManager {
private static final TimeZone DEFAULT_TIMEZONE = TimeZone.getDefault();
+ private static boolean canScheduleExactAlarms;
private final List<ScheduledAlarm> scheduledAlarms = new ArrayList<>();
@RealObject private AlarmManager realObject;
@@ -36,6 +38,7 @@ public class ShadowAlarmManager {
@Resetter
public static void reset() {
TimeZone.setDefault(DEFAULT_TIMEZONE);
+ canScheduleExactAlarms = false;
}
@Implementation
@@ -196,6 +199,20 @@ public class ShadowAlarmManager {
}
}
+ /** Returns the schedule exact alarm state set by {@link #setCanScheduleExactAlarms}. */
+ @Implementation(minSdk = S)
+ protected boolean canScheduleExactAlarms() {
+ return canScheduleExactAlarms;
+ }
+
+ /**
+ * Sets the schedule exact alarm state reported by {@link AlarmManager#canScheduleExactAlarms},
+ * but has no effect otherwise.
+ */
+ public static void setCanScheduleExactAlarms(boolean scheduleExactAlarms) {
+ canScheduleExactAlarms = scheduleExactAlarms;
+ }
+
/**
* Container object to hold a PendingIntent and parameters describing when to send it.
*/
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 8f730a9cb..b9691d104 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 @@ public class ShadowDisplayManagerGlobal {
}
// @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/ShadowImageDecoder.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowImageDecoder.java
index fbe48ac8b..b7efad575 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowImageDecoder.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowImageDecoder.java
@@ -39,12 +39,14 @@ public class ShadowImageDecoder {
private final int height;
private final boolean animated = false;
private final boolean ninePatch;
+ private final String mimeType;
ImgStream() {
InputStream inputStream = getInputStream();
- final Point size = ImageUtil.getImageSizeFromStream(inputStream);
- this.width = size == null ? 10 : size.x;
- this.height = size == null ? 10 : size.y;
+ final ImageUtil.ImageInfo info = ImageUtil.getImageInfoFromStream(inputStream);
+ this.width = info == null ? 10 : info.width;
+ this.height = info == null ? 10 : info.height;
+ this.mimeType = info == null ? "" : info.mimeType;
if (inputStream instanceof AssetManager.AssetInputStream) {
ShadowAssetInputStream sis = Shadow.extract(inputStream);
this.ninePatch = sis.isNinePatch();
@@ -70,6 +72,10 @@ public class ShadowImageDecoder {
boolean isNinePatch() {
return ninePatch;
}
+
+ String getMimeType() {
+ return mimeType;
+ }
}
private static final class CppImageDecoder {
@@ -80,6 +86,9 @@ public class ShadowImageDecoder {
this.imgStream = imgStream;
}
+ public String getMimeType() {
+ return imgStream.getMimeType();
+ }
}
private static final NativeObjRegistry<CppImageDecoder> NATIVE_IMAGE_DECODER_REGISTRY =
@@ -238,8 +247,7 @@ public class ShadowImageDecoder {
static String ImageDecoder_nGetMimeType(long nativePtr) {
CppImageDecoder decoder = NATIVE_IMAGE_DECODER_REGISTRY.getNativeObject(nativePtr);
- // return encodedFormatToString(decoder.mCodec.getEncodedFormat());
- throw new UnsupportedOperationException();
+ return decoder.getMimeType();
}
static ColorSpace ImageDecoder_nGetColorSpace(long nativePtr) {
@@ -247,7 +255,7 @@ public class ShadowImageDecoder {
// auto colorType = codec.computeOutputColorType(codec.getInfo().colorType());
// sk_sp<SkColorSpace> colorSpace = codec.computeOutputColorSpace(colorType);
// return GraphicsJNI.getColorSpace(colorSpace, colorType);
- throw new UnsupportedOperationException();
+ return null;
}
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowInputManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowInputManager.java
index 4c8ebf509..867c72033 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowInputManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowInputManager.java
@@ -3,6 +3,7 @@ package org.robolectric.shadows;
import static android.os.Build.VERSION_CODES.KITKAT;
import android.hardware.input.InputManager;
+import android.hardware.input.InputManagerGlobal;
import android.view.InputEvent;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
@@ -25,6 +26,7 @@ public class ShadowInputManager {
@Resetter
public static void reset() {
- ReflectionHelpers.setStaticField(InputManager.class, "sInstance", null);
+ ReflectionHelpers.setStaticField(InputManagerGlobal.class,
+ "sInstance", null);
}
}
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSQLiteConnection.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSQLiteConnection.java
index d4b8a1db7..ce65e8ef6 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSQLiteConnection.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSQLiteConnection.java
@@ -1,5 +1,6 @@
package org.robolectric.shadows;
+import static android.os.Build.VERSION_CODES.CUR_DEVELOPMENT;
import static android.os.Build.VERSION_CODES.KITKAT_WATCH;
import static android.os.Build.VERSION_CODES.LOLLIPOP;
import static android.os.Build.VERSION_CODES.O;
@@ -158,11 +159,16 @@ public class ShadowSQLiteConnection {
nativeExecute((long) connectionPtr, (long) statementPtr);
}
- @Implementation(minSdk = LOLLIPOP)
+ @Implementation(minSdk = LOLLIPOP, maxSdk = 32)
public static void nativeExecute(final long connectionPtr, final long statementPtr) {
CONNECTIONS.executeStatement(connectionPtr, statementPtr);
}
+ @Implementation(minSdk = CUR_DEVELOPMENT)
+ public static void nativeExecute(final long connectionPtr, final long statementPtr, boolean isPragmaStmt){
+ CONNECTIONS.executeStatement(connectionPtr, statementPtr);
+ }
+
@Implementation(maxSdk = KITKAT_WATCH)
public static String nativeExecuteForString(int connectionPtr, int statementPtr) {
return nativeExecuteForString((long) connectionPtr, (long) statementPtr);
@@ -668,7 +674,7 @@ static class Connections {
@Override
public Long call() throws Exception {
statement.stepThrough();
- return connection.getLastInsertId();
+ return connection.getChanges() > 0 ? connection.getLastInsertId() : -1L;
}
});
}
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSensor.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSensor.java
index c37ca3a3d..00fea9483 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSensor.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSensor.java
@@ -1,27 +1,51 @@
package org.robolectric.shadows;
-
import android.hardware.Sensor;
import android.os.Build.VERSION_CODES;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.RealObject;
import org.robolectric.shadow.api.Shadow;
import org.robolectric.util.ReflectionHelpers;
-import org.robolectric.util.ReflectionHelpers.ClassParameter;
@Implements(Sensor.class)
public class ShadowSensor {
- /**
- * Constructs a {@link Sensor} with a given type.
- */
+ @RealObject private Sensor realSensor;
+
+ /** Constructs a {@link Sensor} with a given type. */
public static Sensor newInstance(int type) {
Sensor sensor = Shadow.newInstanceOf(Sensor.class);
if (RuntimeEnvironment.getApiLevel() >= VERSION_CODES.M) {
- Shadow.directlyOn(sensor, Sensor.class, "setType", ClassParameter.from(int.class, type));
+ Shadow.directlyOn(sensor, Sensor.class, "setType", ReflectionHelpers.ClassParameter.from(int.class, type));
} else {
ReflectionHelpers.setField(Sensor.class, sensor, "mType", type);
}
return sensor;
}
+
+ /** Controls the return value of {@link Sensor#isWakeUpSensor()}. */
+ public void setWakeUpFlag(boolean wakeup) {
+ int wakeUpSensorFlag = getWakeUpSensorFlag();
+
+ if(wakeup) {
+ setMask(wakeUpSensorFlag);
+ } else {
+ clearMask(wakeUpSensorFlag);
+ }
+ }
+
+ private void setMask(int mask) {
+ int value = ReflectionHelpers.getField(realSensor, "mFlags");
+ ReflectionHelpers.setField(realSensor, "mFlags", (value | mask));
+ }
+
+ private void clearMask(int mask) {
+ int value = ReflectionHelpers.getField(realSensor, "mFlags");
+ ReflectionHelpers.setField(realSensor, "mFlags", (value & ~mask));
+ }
+
+ private int getWakeUpSensorFlag() {
+ return ReflectionHelpers.getStaticField(Sensor.class, "SENSOR_FLAG_WAKE_UP_SENSOR");
+ }
}
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSensorManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSensorManager.java
index 68a80cd43..05a4b9574 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSensorManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSensorManager.java
@@ -53,6 +53,12 @@ public class ShadowSensorManager {
return sensorMap.get(type);
}
+ @Implementation
+ protected Sensor getDefaultSensor(int type, boolean wakeUp) {
+ Sensor typedSensor = sensorMap.get(type);
+ return (typedSensor != null && typedSensor.isWakeUpSensor() == wakeUp) ? typedSensor : null;
+ }
+
/** @param handler is ignored. */
@Implementation
protected boolean registerListener(
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowServiceManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowServiceManager.java
index 3c4afdab6..facd5a5b6 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowServiceManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowServiceManager.java
@@ -55,6 +55,7 @@ import android.os.ServiceManager;
import android.os.storage.IStorageManager;
import android.permission.IPermissionManager;
import android.service.persistentdata.IPersistentDataBlockService;
+import android.view.IWindowManager;
import com.android.internal.app.IAppOpsService;
import com.android.internal.app.IBatteryStats;
@@ -133,6 +134,9 @@ public class ShadowServiceManager {
map.put(
Context.APPWIDGET_SERVICE,
createBinder(IAppWidgetService.class, "com.android.internal.appwidget.IAppWidgetService"));
+ map.put(
+ Context.WINDOW_SERVICE,
+ createBinder(IWindowManager.class, "android.view.IWindowManager"));
if (RuntimeEnvironment.getApiLevel() >= JELLY_BEAN_MR1) {
map.put(Context.USER_SERVICE, createBinder(IUserManager.class, "android.os.IUserManager"));
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSettings.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSettings.java
index b925f4317..3de5456a9 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSettings.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSettings.java
@@ -6,6 +6,7 @@ import static android.os.Build.VERSION_CODES.LOLLIPOP;
import static android.os.Build.VERSION_CODES.M;
import static android.os.Build.VERSION_CODES.P;
+import android.app.ActivityThread;
import android.content.ContentResolver;
import android.content.Context;
import android.os.Build;
@@ -265,11 +266,21 @@ public class ShadowSettings {
return true;
}
+ @Implementation(minSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
+ protected static boolean putString(String name, String value) {
+ return putString(ActivityThread.currentApplication().getContentResolver(), name, value);
+ }
+
@Implementation
protected static String getString(ContentResolver cr, String name) {
return get(cr).get(name);
}
+ @Implementation(minSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
+ protected static String getString(String name) {
+ return getString(ActivityThread.currentApplication().getContentResolver(), name);
+ }
+
// BEGIN-INTERNAL
@Implementation(minSdk = Build.VERSION_CODES.R)
protected static Map<String, String> getStrings(ContentResolver cr, String prefix,
@@ -288,6 +299,12 @@ public class ShadowSettings {
}
return arrayMap;
}
+
+ @Implementation(minSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
+ protected static Map<String, String> getStrings(String prefix,
+ List<String> names) {
+ return getStrings(ActivityThread.currentApplication().getContentResolver(), prefix, names);
+ }
// END-INTERNAL
private static Map<String, String> get(ContentResolver cr) {
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowStorageManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowStorageManager.java
index 2614d7e88..ccdf10d49 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowStorageManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowStorageManager.java
@@ -2,6 +2,8 @@ package org.robolectric.shadows;
import static android.os.Build.VERSION_CODES.M;
import static android.os.Build.VERSION_CODES.N;
+import static android.os.Build.VERSION_CODES.TIRAMISU;
+import static android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE;
import static org.robolectric.RuntimeEnvironment.application;
import android.os.UserManager;
@@ -82,8 +84,10 @@ public class ShadowStorageManager {
return null;
}
+ // Use maxSdk=T for this method, since starting in U, this method in StorageManager is deprecated
+ // and is no longer called by the Android framework. It's planned to be removed entirely in V.
@HiddenApi
- @Implementation(minSdk = N)
+ @Implementation(minSdk = N, maxSdk = TIRAMISU)
protected static boolean isFileEncryptedNativeOrEmulated() {
return isFileEncryptionSupported;
}
@@ -97,8 +101,9 @@ public class ShadowStorageManager {
isFileEncryptionSupported = isSupported;
}
+ // Use maxSdk=U, as this method is planned to be removed from StorageManager in V.
@HiddenApi
- @Implementation(minSdk = N)
+ @Implementation(minSdk = N, maxSdk = UPSIDE_DOWN_CAKE)
protected static boolean isUserKeyUnlocked(int userId) {
ShadowUserManager extract = Shadow.extract(application.getSystemService(UserManager.class));
return extract.isUserUnlocked();
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowTelephonyManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowTelephonyManager.java
index 12b40fa79..acd0acaa9 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowTelephonyManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowTelephonyManager.java
@@ -38,7 +38,7 @@ import org.robolectric.annotation.HiddenApi;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
-@Implements(TelephonyManager.class)
+@Implements(value = TelephonyManager.class, looseSignatures = true)
public class ShadowTelephonyManager {
private final Map<PhoneStateListener, Integer> phoneStateRegistrations = new HashMap<>();
@@ -85,6 +85,7 @@ public class ShadowTelephonyManager {
private final Map<Integer, String> simCountryIsoMap = new HashMap<>();
private int simCarrierId;
private String subscriberId;
+ private /*UiccSlotInfo[]*/ Object uiccSlotInfos;
{
resetSimStates();
@@ -288,6 +289,18 @@ public class ShadowTelephonyManager {
return simStates.get(slotIndex, TelephonyManager.SIM_STATE_UNKNOWN);
}
+ /** Sets the UICC slots information returned by {@link #getUiccSlotsInfo()}. */
+ public void setUiccSlotsInfo(/*UiccSlotInfo[]*/ Object uiccSlotsInfos) {
+ this.uiccSlotInfos = uiccSlotsInfos;
+ }
+
+ /** Returns the UICC slots information set by {@link #setUiccSlotsInfo}. */
+ @Implementation(minSdk = P)
+ @HiddenApi
+ protected /*UiccSlotInfo[]*/ Object getUiccSlotsInfo() {
+ return uiccSlotInfos;
+ }
+
/** Clears {@code slotIndex} to state mapping and resets to default state. */
public void resetSimStates() {
simStates.clear();
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowUsbManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowUsbManager.java
index d5dd186b4..52a83e9f7 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowUsbManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowUsbManager.java
@@ -4,6 +4,7 @@ import static android.os.Build.VERSION_CODES.M;
import static android.os.Build.VERSION_CODES.N;
import static android.os.Build.VERSION_CODES.N_MR1;
import static android.os.Build.VERSION_CODES.P;
+import static android.os.Build.VERSION_CODES.TIRAMISU;
import static org.robolectric.RuntimeEnvironment.application;
import static org.robolectric.util.ReflectionHelpers.ClassParameter.from;
import static org.robolectric.util.ReflectionHelpers.callConstructor;
@@ -261,6 +262,15 @@ public class ShadowUsbManager {
from(UsbManager.class, usbManager),
from(String.class, id),
from(int.class, supportedModes));
+ } else if (RuntimeEnvironment.getApiLevel() <= TIRAMISU) {
+ return new UsbPort(
+ usbManager,
+ id,
+ supportedModes,
+ 0,
+ false,
+ false
+ );
}
// BEGIN-INTERNAL
return new UsbPort(
@@ -269,7 +279,9 @@ public class ShadowUsbManager {
supportedModes,
0,
false,
- false
+ false,
+ false,
+ 0
);
// END-INTERNAL
}
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 e1625d159..f4598aaa3 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowUserManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowUserManager.java
@@ -8,6 +8,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 android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE;
import static org.robolectric.shadow.api.Shadow.directlyOn;
@@ -17,6 +18,7 @@ import android.annotation.UserIdInt;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.UserInfo;
+import android.content.pm.UserProperties;
import android.os.Bundle;
import android.os.IUserManager;
import android.os.Process;
@@ -64,6 +66,10 @@ public class ShadowUserManager {
private boolean userUnlocked = true;
private boolean managedProfile = false;
private boolean isSystemUser = true;
+ private static boolean isHeadlessSystemUserMode = false;
+ private static boolean isMultipleAdminEnabled = false;
+
+
private Map<Integer, Bundle> userRestrictions = new HashMap<>();
private BiMap<UserHandle, Long> userProfiles = HashBiMap.create();
private Map<String, Bundle> applicationRestrictions = new HashMap<>();
@@ -72,6 +78,7 @@ public class ShadowUserManager {
private Map<Integer, UserInfo> userInfoMap = new HashMap<>();
private Map<Integer, List<UserInfo>> profiles = new HashMap<>();
private Map<Integer, Integer> profileToParent = new HashMap<>();
+ private Map<Integer, UserProperties> mUserPropertiesMap = new HashMap<>();
private Context context;
private boolean enforcePermissions;
@@ -341,6 +348,24 @@ public class ShadowUserManager {
return context.getPackageManager().checkPermission(permission.MANAGE_USERS, context.getPackageName()) == PackageManager.PERMISSION_GRANTED;
}
+ public static void setIsMultipleAdminEnabled(boolean enableMultipleAdmin) {
+ isMultipleAdminEnabled = enableMultipleAdmin;
+ }
+
+ @Implementation(minSdk = UPSIDE_DOWN_CAKE)
+ protected static boolean isMultipleAdminEnabled() {
+ return isMultipleAdminEnabled;
+ }
+
+ public static void setIsHeadlessSystemUserMode(boolean isHSUM) {
+ isHeadlessSystemUserMode = isHSUM;
+ }
+
+ @Implementation
+ protected static boolean isHeadlessSystemUserMode() {
+ return isHeadlessSystemUserMode;
+ }
+
private void checkPermissions() {
// TODO Ensure permisions
// throw new SecurityException("You need INTERACT_ACROSS_USERS or MANAGE_USERS
@@ -636,5 +661,18 @@ public class ShadowUserManager {
userPidMap.clear();
userPidMap.put(UserHandle.USER_SYSTEM, Process.myUid());
}
+ isMultipleAdminEnabled = false;
+ }
+
+ public void setupUserProperty(int userId, int showInSettings) {
+ UserProperties userProperties = new UserProperties(new UserProperties.Builder()
+ .setShowInSettings(showInSettings).build());
+ mUserPropertiesMap.putIfAbsent(userId, userProperties);
+ }
+
+ @Implementation(minSdk = UPSIDE_DOWN_CAKE)
+ protected UserProperties getUserProperties(UserHandle user) {
+ return mUserPropertiesMap.getOrDefault(user.getIdentifier(),
+ new UserProperties(new UserProperties.Builder().build()));
}
}
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 ad17119d4..5e6719c24 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowViewRootImpl.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowViewRootImpl.java
@@ -163,7 +163,7 @@ public class ShadowViewRootImpl {
ClassParameter.from(boolean.class, false),
ClassParameter.from(int.class, 0));
// END-INTERNAL
- } else if (apiLevel >= Build.VERSION_CODES.TIRAMISU) {
+ } else if (apiLevel <= Build.VERSION_CODES.TIRAMISU) {
// BEGIN-INTERNAL
ReflectionHelpers.callInstanceMethod(ViewRootImpl.class, component, "dispatchResized",
ClassParameter.from(ClientWindowFrames.class, clientWindowFrame),
@@ -176,6 +176,19 @@ public class ShadowViewRootImpl {
ClassParameter.from(int.class, 0),
ClassParameter.from(int.class, 0));
// END-INTERNAL
+ } else if (apiLevel >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
+ // 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(boolean.class, false));
+ // 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/ShadowWindowManagerGlobal.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowWindowManagerGlobal.java
index a6aeaf2a9..a23dab947 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowWindowManagerGlobal.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowWindowManagerGlobal.java
@@ -3,7 +3,10 @@ package org.robolectric.shadows;
import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR1;
import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR2;
+import android.content.Context;
import android.os.Looper;
+import android.os.ServiceManager;
+import android.view.IWindowManager;
import android.view.WindowManagerGlobal;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
@@ -32,7 +35,7 @@ public class ShadowWindowManagerGlobal {
@Implementation
public static Object getWindowManagerService() {
- return null;
+ return IWindowManager.Stub.asInterface(ServiceManager.getService(Context.WINDOW_SERVICE));
}
} \ No newline at end of file
diff --git a/shadows/httpclient/Android.bp b/shadows/httpclient/Android.bp
index d3ca43f56..7569b3aef 100644
--- a/shadows/httpclient/Android.bp
+++ b/shadows/httpclient/Android.bp
@@ -60,7 +60,7 @@ java_test_host {
"guava",
"ow2-asm-tree",
"junit",
- "truth-prebuilt",
+ "truth",
"robolectric-ant-1.8.0",
"ow2-asm",
"jsr305",
diff --git a/shadows/supportv4/Android.bp b/shadows/supportv4/Android.bp
index c2fd48036..429fb4a34 100644
--- a/shadows/supportv4/Android.bp
+++ b/shadows/supportv4/Android.bp
@@ -58,7 +58,7 @@ java_test_host {
"objenesis",
"ow2-asm-tree",
"junit",
- "truth-prebuilt",
+ "truth",
"robolectric-ant-1.8.0",
"ow2-asm",
"jsr305",
diff --git a/soong/Android.bp b/soong/Android.bp
deleted file mode 100644
index 954cf15b8..000000000
--- a/soong/Android.bp
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright (C) 2019 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package {
- // See: http://go/android-license-faq
- // A large-scale-change added 'default_applicable_licenses' to import
- // all of the 'license_kinds' from "external_robolectric-shadows_license"
- // to get the below license kinds:
- // SPDX-license-identifier-Apache-2.0
- default_applicable_licenses: ["external_robolectric-shadows_license"],
-}
-
-bootstrap_go_package {
- name: "soong-robolectric",
- pkgPath: "android/soong/robolectric",
- srcs: ["robolectric.go"],
- pluginFor: ["soong_build"],
- deps: [
- "soong-android",
- ],
-}
diff --git a/soong/robolectric.go b/soong/robolectric.go
deleted file mode 100644
index cadeb0fad..000000000
--- a/soong/robolectric.go
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright (C) 2019 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package robolectric
-
-import (
- "fmt"
- "strings"
-
- "android/soong/android"
-)
-
-var pctx = android.NewPackageContext("android/soong/robolectric")
-
-func init() {
- pctx.Import("android/soong/android")
- android.RegisterModuleType("robolectric_build_props", buildPropsFactory)
-}
-
-type buildProps struct {
- android.ModuleBase
- output android.WritablePath
-}
-
-var _ android.SourceFileProducer = (*buildProps)(nil)
-
-func (b *buildProps) Srcs() android.Paths {
- return android.Paths{b.output}
-}
-
-func (b *buildProps) GenerateAndroidBuildActions(ctx android.ModuleContext) {
-
- displayID := fmt.Sprintf("robolectric %s %s",
- ctx.Config().PlatformVersionName(),
- ctx.Config().BuildId())
-
- lines := []string{
- "# build properties autogenerated by robolectric.go",
- "",
- "ro.build.id=" + ctx.Config().BuildId(),
- "ro.build.display.id=" + displayID,
- "ro.product.name=robolectric",
- "ro.product.device=robolectric",
- "ro.product.board=robolectric",
- "ro.product.manufacturer=robolectric",
- "ro.product.brand=robolectric",
- "ro.product.model=robolectric",
- "ro.hardware=robolectric",
- "ro.build.version.security_patch=" + ctx.Config().PlatformSecurityPatch(),
- "ro.build.version.sdk=" + ctx.Config().PlatformSdkVersion().String(),
- "ro.build.version.release=" + ctx.Config().PlatformVersionName(),
- "ro.build.version.preview_sdk=" + ctx.Config().PlatformPreviewSdkVersion(),
- // We don't have the API fingerprint available, just use the preview SDK version.
- "ro.build.version.preview_sdk_fingerprint=" + ctx.Config().PlatformPreviewSdkVersion(),
- "ro.build.version.codename=" + ctx.Config().PlatformSdkCodename(),
- "ro.build.version.all_codenames=" + strings.Join(ctx.Config().PlatformVersionActiveCodenames(), ","),
- "ro.build.version.min_supported_target_sdk=" + ctx.Config().PlatformMinSupportedTargetSdkVersion(),
- "ro.build.version.base_os=" + ctx.Config().PlatformBaseOS(),
- "ro.build.tags=robolectric",
- "ro.build.fingerprint=robolectric",
- "ro.build.characteristics=robolectric",
- "",
- "# for backwards-compatibility reasons, set CPUs to unknown/ARM",
- "ro.product.cpu.abi=unknown",
- "ro.product.cpu.abi2=unknown",
- "ro.product.cpu.abilist=armeabi-v7a",
- "ro.product.cpu.abilist32=armeabi-v7a,armeabi",
- "ro.product.cpu.abilist64=armeabi-v7a,armeabi",
- "",
- "# temp fix for robolectric freezing issue b/150011638",
- "persist.debug.new_insets=0",
- }
-
- b.output = android.PathForModuleGen(ctx, "build.prop")
-
- rule := android.NewRuleBuilder(pctx, ctx)
-
- rule.Command().Text("rm").Flag("-f").Output(b.output)
- for _, l := range lines {
- rule.Command().Text("echo").Text("'" + l + "'").Text(">>").Output(b.output)
- }
-
- rule.Build("build_prop", "robolectric build.prop")
-}
-
-func buildPropsFactory() android.Module {
- module := &buildProps{}
- android.InitAndroidModule(module)
- return module
-}
diff --git a/utils/Android.bp b/utils/Android.bp
index aee5d77eb..46a1caf9b 100644
--- a/utils/Android.bp
+++ b/utils/Android.bp
@@ -28,7 +28,7 @@ java_test_host {
"hamcrest",
"guava",
"junit",
- "truth-prebuilt",
+ "truth",
],
test_suites: ["general-tests"],
}