diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2024-05-10 15:39:03 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2024-05-10 15:39:03 +0000 |
commit | 7c6298aee060843942d8faa4108e82189c2ed3c8 (patch) | |
tree | 62eb9236e84927850aa1c50716e32667146ae9e8 | |
parent | 74db492b82c0650ccf26a7bcc3a94a0d10be2245 (diff) | |
parent | 432d3ed6098def186a60af3b10efe6767039fa52 (diff) | |
download | robolectric-shadows-busytown-mac-infra-release.tar.gz |
Snap for 11819167 from 432d3ed6098def186a60af3b10efe6767039fa52 to busytown-mac-infra-releasebusytown-mac-infra-release
Change-Id: I40fe9823d1dbfe4bcc1e7c0b8e6a3b7518349f26
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__", ], } @@ -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"], } |