Project import generated by Copybara.
PiperOrigin-RevId: 219304512
diff --git a/README.md b/README.md
index a031a82..8aff5be 100644
--- a/README.md
+++ b/README.md
@@ -38,7 +38,6 @@
```groovy
testImplementation "org.robolectric:robolectric:4.0"
-
```
## Building And Contributing
diff --git a/robolectric/build.gradle b/robolectric/build.gradle
index 85f4667..f47118f 100644
--- a/robolectric/build.gradle
+++ b/robolectric/build.gradle
@@ -43,6 +43,7 @@
testImplementation "org.mockito:mockito-core:2.5.4"
testImplementation "androidx.test:core:1.0.0"
testImplementation "androidx.test.ext:junit:1.0.0"
+ testImplementation "androidx.test:runner:1.1.0"
testCompileOnly AndroidSdk.MAX_SDK.coordinates // compile against latest Android SDK
testRuntime AndroidSdk.MAX_SDK.coordinates // run against whatever this JDK supports
}
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowConnectivityManagerTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowConnectivityManagerTest.java
index de72d2a..ab88553 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowConnectivityManagerTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowConnectivityManagerTest.java
@@ -1,24 +1,24 @@
package org.robolectric.shadows;
+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 androidx.test.core.app.ApplicationProvider.getApplicationContext;
import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.robolectric.Shadows.shadowOf;
-import android.app.Application;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkInfo;
import android.net.NetworkRequest;
+import android.provider.Settings;
import android.telephony.TelephonyManager;
-import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import java.util.Map;
import org.junit.Before;
@@ -32,15 +32,12 @@
public class ShadowConnectivityManagerTest {
private ConnectivityManager connectivityManager;
private ShadowNetworkInfo shadowOfActiveNetworkInfo;
- private ShadowConnectivityManager shadowConnectivityManager;
@Before
public void setUp() throws Exception {
connectivityManager =
(ConnectivityManager)
- ((Application) ApplicationProvider.getApplicationContext())
- .getSystemService(Context.CONNECTIVITY_SERVICE);
- shadowConnectivityManager = shadowOf(connectivityManager);
+ getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
shadowOfActiveNetworkInfo = shadowOf(connectivityManager.getActiveNetworkInfo());
}
@@ -92,7 +89,7 @@
0,
true,
NetworkInfo.State.CONNECTED);
- shadowConnectivityManager.addNetwork(vpnNetwork, vpnNetworkInfo);
+ shadowOf(connectivityManager).addNetwork(vpnNetwork, vpnNetworkInfo);
NetworkInfo returnedNetworkInfo = connectivityManager.getNetworkInfo(vpnNetwork);
assertThat(returnedNetworkInfo).isSameAs(vpnNetworkInfo);
@@ -101,7 +98,7 @@
@Test @Config(minSdk = LOLLIPOP)
public void getNetworkInfo_shouldNotReturnRemovedNetwork() throws Exception {
Network wifiNetwork = ShadowNetwork.newInstance(ShadowConnectivityManager.NET_ID_WIFI);
- shadowConnectivityManager.removeNetwork(wifiNetwork);
+ shadowOf(connectivityManager).removeNetwork(wifiNetwork);
NetworkInfo returnedNetworkInfo = connectivityManager.getNetworkInfo(wifiNetwork);
assertThat(returnedNetworkInfo).isNull();
@@ -119,21 +116,22 @@
@Test
public void shouldGetAndSetBackgroundDataSetting() throws Exception {
assertThat(connectivityManager.getBackgroundDataSetting()).isFalse();
- shadowConnectivityManager.setBackgroundDataSetting(true);
+ shadowOf(connectivityManager).setBackgroundDataSetting(true);
assertThat(connectivityManager.getBackgroundDataSetting()).isTrue();
}
@Test
public void setActiveNetworkInfo_shouldSetActiveNetworkInfo() throws Exception {
- shadowConnectivityManager.setActiveNetworkInfo(null);
+ shadowOf(connectivityManager).setActiveNetworkInfo(null);
assertThat(connectivityManager.getActiveNetworkInfo()).isNull();
- shadowConnectivityManager.setActiveNetworkInfo(
- ShadowNetworkInfo.newInstance(
- null,
- ConnectivityManager.TYPE_MOBILE_HIPRI,
- TelephonyManager.NETWORK_TYPE_EDGE,
- true,
- NetworkInfo.State.DISCONNECTED));
+ shadowOf(connectivityManager)
+ .setActiveNetworkInfo(
+ ShadowNetworkInfo.newInstance(
+ null,
+ ConnectivityManager.TYPE_MOBILE_HIPRI,
+ TelephonyManager.NETWORK_TYPE_EDGE,
+ true,
+ NetworkInfo.State.DISCONNECTED));
NetworkInfo info = connectivityManager.getActiveNetworkInfo();
@@ -152,22 +150,23 @@
@Test
@Config(minSdk = M)
public void getActiveNetwork_nullIfNetworkNotActive() {
- shadowConnectivityManager.setDefaultNetworkActive(false);
+ shadowOf(connectivityManager).setDefaultNetworkActive(false);
assertThat(connectivityManager.getActiveNetwork()).isNull();
}
@Test
@Config(minSdk = M)
public void setActiveNetworkInfo_shouldSetActiveNetwork() throws Exception {
- shadowConnectivityManager.setActiveNetworkInfo(null);
+ shadowOf(connectivityManager).setActiveNetworkInfo(null);
assertThat(connectivityManager.getActiveNetworkInfo()).isNull();
- shadowConnectivityManager.setActiveNetworkInfo(
- ShadowNetworkInfo.newInstance(
- null,
- ConnectivityManager.TYPE_MOBILE_HIPRI,
- TelephonyManager.NETWORK_TYPE_EDGE,
- true,
- NetworkInfo.State.DISCONNECTED));
+ shadowOf(connectivityManager)
+ .setActiveNetworkInfo(
+ ShadowNetworkInfo.newInstance(
+ null,
+ ConnectivityManager.TYPE_MOBILE_HIPRI,
+ TelephonyManager.NETWORK_TYPE_EDGE,
+ true,
+ NetworkInfo.State.DISCONNECTED));
NetworkInfo info = connectivityManager.getActiveNetworkInfo();
@@ -184,7 +183,7 @@
assertThat(infos).asList().hasSize(2);
assertThat(infos).asList().contains(connectivityManager.getActiveNetworkInfo());
- shadowConnectivityManager.setActiveNetworkInfo(null);
+ shadowOf(connectivityManager).setActiveNetworkInfo(null);
assertThat(connectivityManager.getAllNetworkInfo()).isEmpty();
}
@@ -199,7 +198,7 @@
0 /* subType */,
true /* isAvailable */,
true /* isConnected */);
- shadowConnectivityManager.setActiveNetworkInfo(networkInfo);
+ shadowOf(connectivityManager).setActiveNetworkInfo(networkInfo);
// Verify that getAllNetworks and getAllNetworkInfo match.
Network[] networks = connectivityManager.getAllNetworks();
@@ -214,7 +213,7 @@
@Test
@Config(minSdk = LOLLIPOP)
public void getAllNetworkInfo_nullIfNetworkNotActive() {
- shadowConnectivityManager.setDefaultNetworkActive(false);
+ shadowOf(connectivityManager).setDefaultNetworkActive(false);
assertThat(connectivityManager.getAllNetworkInfo()).isNull();
}
@@ -226,7 +225,7 @@
@Test @Config(minSdk = LOLLIPOP)
public void getAllNetworks_shouldReturnNoNetworksWhenCleared() throws Exception {
- shadowConnectivityManager.clearAllNetworks();
+ shadowOf(connectivityManager).clearAllNetworks();
Network[] networks = connectivityManager.getAllNetworks();
assertThat(networks).isEmpty();
}
@@ -234,7 +233,7 @@
@Test @Config(minSdk = LOLLIPOP)
public void getAllNetworks_shouldReturnAddedNetworks() throws Exception {
// Let's start clear.
- shadowConnectivityManager.clearAllNetworks();
+ shadowOf(connectivityManager).clearAllNetworks();
// Add a "VPN network".
Network vpnNetwork = ShadowNetwork.newInstance(123);
@@ -245,7 +244,7 @@
0,
true,
NetworkInfo.State.CONNECTED);
- shadowConnectivityManager.addNetwork(vpnNetwork, vpnNetworkInfo);
+ shadowOf(connectivityManager).addNetwork(vpnNetwork, vpnNetworkInfo);
Network[] networks = connectivityManager.getAllNetworks();
assertThat(networks).asList().hasSize(1);
@@ -260,7 +259,7 @@
@Test @Config(minSdk = LOLLIPOP)
public void getAllNetworks_shouldNotReturnRemovedNetworks() throws Exception {
Network wifiNetwork = ShadowNetwork.newInstance(ShadowConnectivityManager.NET_ID_WIFI);
- shadowConnectivityManager.removeNetwork(wifiNetwork);
+ shadowOf(connectivityManager).removeNetwork(wifiNetwork);
Network[] networks = connectivityManager.getAllNetworks();
assertThat(networks).asList().hasSize(1);
@@ -282,13 +281,13 @@
connectivityManager.reportNetworkConnectivity(wifiNetwork, true);
Map<Network, Boolean> reportedNetworks =
- shadowConnectivityManager.getReportedNetworkConnectivity();
+ shadowOf(connectivityManager).getReportedNetworkConnectivity();
assertThat(reportedNetworks.size()).isEqualTo(1);
assertThat(reportedNetworks.get(wifiNetwork)).isTrue();
// Update the status.
connectivityManager.reportNetworkConnectivity(wifiNetwork, false);
- reportedNetworks = shadowConnectivityManager.getReportedNetworkConnectivity();
+ reportedNetworks = shadowOf(connectivityManager).getReportedNetworkConnectivity();
assertThat(reportedNetworks.size()).isEqualTo(1);
assertThat(reportedNetworks.get(wifiNetwork)).isFalse();
}
@@ -303,7 +302,7 @@
@Test @Config(minSdk = LOLLIPOP)
public void getNetworkCallbacks_shouldHaveEmptyDefault() throws Exception {
- assertEquals(0, shadowConnectivityManager.getNetworkCallbacks().size());
+ assertThat(shadowOf(connectivityManager).getNetworkCallbacks()).isEmpty();
}
private static ConnectivityManager.NetworkCallback createSimpleCallback() {
@@ -321,7 +320,7 @@
NetworkRequest.Builder builder = new NetworkRequest.Builder();
ConnectivityManager.NetworkCallback callback = createSimpleCallback();
connectivityManager.requestNetwork(builder.build(), callback);
- assertThat(shadowConnectivityManager.getNetworkCallbacks()).hasSize(1);
+ assertThat(shadowOf(connectivityManager).getNetworkCallbacks()).hasSize(1);
}
@Test @Config(minSdk = LOLLIPOP)
@@ -329,7 +328,7 @@
NetworkRequest.Builder builder = new NetworkRequest.Builder();
ConnectivityManager.NetworkCallback callback = createSimpleCallback();
connectivityManager.registerNetworkCallback(builder.build(), callback);
- assertEquals(1, shadowConnectivityManager.getNetworkCallbacks().size());
+ assertThat(shadowOf(connectivityManager).getNetworkCallbacks()).hasSize(1);
}
@Test @Config(minSdk = LOLLIPOP)
@@ -341,11 +340,11 @@
connectivityManager.registerNetworkCallback(builder.build(), callback1);
connectivityManager.registerNetworkCallback(builder.build(), callback2);
// Remove one at the time.
- assertEquals(2, shadowConnectivityManager.getNetworkCallbacks().size());
+ assertThat(shadowOf(connectivityManager).getNetworkCallbacks()).hasSize(2);
connectivityManager.unregisterNetworkCallback(callback2);
- assertEquals(1, shadowConnectivityManager.getNetworkCallbacks().size());
+ assertThat(shadowOf(connectivityManager).getNetworkCallbacks()).hasSize(1);
connectivityManager.unregisterNetworkCallback(callback1);
- assertEquals(0, shadowConnectivityManager.getNetworkCallbacks().size());
+ assertThat(shadowOf(connectivityManager).getNetworkCallbacks()).isEmpty();
}
@Test(expected=IllegalArgumentException.class) @Config(minSdk = LOLLIPOP)
@@ -361,27 +360,27 @@
@Test
public void isActiveNetworkMetered_mobileIsMetered() {
- shadowConnectivityManager.setActiveNetworkInfo(
- connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE));
+ shadowOf(connectivityManager)
+ .setActiveNetworkInfo(connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE));
assertThat(connectivityManager.isActiveNetworkMetered()).isTrue();
}
@Test
public void isActiveNetworkMetered_nonMobileIsUnmetered() {
- shadowConnectivityManager.setActiveNetworkInfo(
- connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI));
+ shadowOf(connectivityManager)
+ .setActiveNetworkInfo(connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI));
assertThat(connectivityManager.isActiveNetworkMetered()).isFalse();
}
@Test
public void isActiveNetworkMetered_noActiveNetwork() {
- shadowConnectivityManager.setActiveNetworkInfo(null);
+ shadowOf(connectivityManager).setActiveNetworkInfo(null);
assertThat(connectivityManager.isActiveNetworkMetered()).isFalse();
}
@Test
public void isActiveNetworkMetered_noDefaultNetworkActive() {
- shadowConnectivityManager.setDefaultNetworkActive(false);
+ shadowOf(connectivityManager).setDefaultNetworkActive(false);
assertThat(connectivityManager.isActiveNetworkMetered()).isFalse();
}
@@ -396,14 +395,14 @@
@Test
@Config(minSdk = LOLLIPOP)
public void isDefaultNetworkActive_defaultActive() {
- assertThat(shadowConnectivityManager.isDefaultNetworkActive()).isTrue();
+ assertThat(shadowOf(connectivityManager).isDefaultNetworkActive()).isTrue();
}
@Test
@Config(minSdk = LOLLIPOP)
public void isDefaultNetworkActive_notActive() {
- shadowConnectivityManager.setDefaultNetworkActive(false);
- assertThat(shadowConnectivityManager.isDefaultNetworkActive()).isFalse();
+ shadowOf(connectivityManager).setDefaultNetworkActive(false);
+ assertThat(shadowOf(connectivityManager).isDefaultNetworkActive()).isFalse();
}
private static ConnectivityManager.OnNetworkActiveListener createSimpleOnNetworkActiveListener() {
@@ -423,7 +422,7 @@
connectivityManager.addDefaultNetworkActiveListener(listener1);
connectivityManager.addDefaultNetworkActiveListener(listener2);
- shadowConnectivityManager.setDefaultNetworkActive(true);
+ shadowOf(connectivityManager).setDefaultNetworkActive(true);
verify(listener1).onNetworkActive();
verify(listener2).onNetworkActive();
@@ -440,21 +439,21 @@
connectivityManager.addDefaultNetworkActiveListener(listener1);
connectivityManager.addDefaultNetworkActiveListener(listener2);
- shadowConnectivityManager.setDefaultNetworkActive(true);
+ shadowOf(connectivityManager).setDefaultNetworkActive(true);
verify(listener1).onNetworkActive();
verify(listener2).onNetworkActive();
// Remove one at the time.
connectivityManager.removeDefaultNetworkActiveListener(listener2);
- shadowConnectivityManager.setDefaultNetworkActive(true);
+ shadowOf(connectivityManager).setDefaultNetworkActive(true);
verify(listener1, times(2)).onNetworkActive();
verify(listener2).onNetworkActive();
connectivityManager.removeDefaultNetworkActiveListener(listener1);
- shadowConnectivityManager.setDefaultNetworkActive(true);
+ shadowOf(connectivityManager).setDefaultNetworkActive(true);
verify(listener1, times(2)).onNetworkActive();
verify(listener2).onNetworkActive();
@@ -497,4 +496,19 @@
shadowOf(connectivityManager).setCaptivePortalServerUrl("http://10.0.0.2");
assertThat(connectivityManager.getCaptivePortalServerUrl()).isEqualTo("http://10.0.0.2");
}
+
+ @Test
+ @Config(minSdk = KITKAT)
+ public void setAirplaneMode() {
+ connectivityManager.setAirplaneMode(false);
+ assertThat(
+ Settings.Global.getInt(
+ getApplicationContext().getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, -1))
+ .isEqualTo(0);
+ connectivityManager.setAirplaneMode(true);
+ assertThat(
+ Settings.Global.getInt(
+ getApplicationContext().getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, -1))
+ .isEqualTo(1);
+ }
}
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowDevicePolicyManagerTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowDevicePolicyManagerTest.java
index 52f0853..2bf725a 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowDevicePolicyManagerTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowDevicePolicyManagerTest.java
@@ -581,7 +581,8 @@
devicePolicyManager.setOrganizationName(testComponent, organizationName);
// THEN the name should be set properly
- assertThat(devicePolicyManager.getOrganizationName(testComponent)).isEqualTo(organizationName);
+ assertThat(devicePolicyManager.getOrganizationName(testComponent).toString())
+ .isEqualTo(organizationName);
}
@Test
@@ -628,7 +629,8 @@
devicePolicyManager.setOrganizationName(testComponent, organizationName);
// THEN the name should be set properly
- assertThat(devicePolicyManager.getOrganizationName(testComponent)).isEqualTo(organizationName);
+ assertThat(devicePolicyManager.getOrganizationName(testComponent).toString())
+ .isEqualTo(organizationName);
}
@Test
@@ -963,4 +965,16 @@
shadowOf(devicePolicyManager).setUserProvisioningState(STATE_USER_UNMANAGED);
assertThat(devicePolicyManager.getUserProvisioningState()).isEqualTo(STATE_USER_UNMANAGED);
}
+
+ @Test
+ @Config(minSdk = LOLLIPOP)
+ public void getProfileOwnerNameAsUser() {
+ int userId = 0;
+ String orgName = "organization";
+ assertThat(devicePolicyManager.getProfileOwnerNameAsUser(userId)).isNull();
+
+ shadowOf(devicePolicyManager).setProfileOwnerName(userId, orgName);
+
+ assertThat(devicePolicyManager.getProfileOwnerNameAsUser(userId)).isEqualTo(orgName);
+ }
}
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowSliceManagerTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowSliceManagerTest.java
new file mode 100644
index 0000000..22ec514
--- /dev/null
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowSliceManagerTest.java
@@ -0,0 +1,71 @@
+package org.robolectric.shadows;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.robolectric.Shadows.shadowOf;
+
+import android.app.slice.SliceManager;
+import android.content.pm.PackageManager;
+import android.net.Uri;
+import android.os.Build.VERSION_CODES;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+/** Tests for {@link ShadowSliceManager}. */
+@RunWith(AndroidJUnit4.class)
+@Config(minSdk = VERSION_CODES.P)
+public final class ShadowSliceManagerTest {
+
+ private static final String PACKAGE_NAME_1 = "com.google.testing.slicemanager.foo";
+ private static final int PACKAGE_1_UID = 10;
+ private Uri sliceUri1;
+ private static final String PACKAGE_NAME_2 = "com.google.testing.slicemanager.bar";
+ private static final int PACKAGE_2_UID = 20;
+ private Uri sliceUri2;
+ private SliceManager sliceManager;
+
+ @Before
+ public void setUp() {
+ PackageManager packageManager = RuntimeEnvironment.application.getPackageManager();
+ ShadowApplicationPackageManager shadowPackageManager =
+ (ShadowApplicationPackageManager) shadowOf(packageManager);
+ shadowPackageManager.setPackagesForUid(PACKAGE_1_UID, new String[] {PACKAGE_NAME_1});
+ shadowPackageManager.setPackagesForUid(PACKAGE_2_UID, new String[] {PACKAGE_NAME_2});
+ sliceUri1 = Uri.parse("content://a/b");
+ sliceUri2 = Uri.parse("content://c/d");
+ sliceManager = ApplicationProvider.getApplicationContext().getSystemService(SliceManager.class);
+ }
+
+ @Test
+ public void testGrantSlicePermission_grantsPermissionToPackage() {
+ sliceManager.grantSlicePermission(PACKAGE_NAME_1, sliceUri1);
+ assertThat(sliceManager.checkSlicePermission(sliceUri1, /* pid= */ 1, PACKAGE_1_UID))
+ .isEqualTo(PackageManager.PERMISSION_GRANTED);
+ }
+
+ @Test
+ public void testGrantSlicePermission_doesNotGrantPermissionToOtherPackage() {
+ sliceManager.grantSlicePermission(PACKAGE_NAME_1, sliceUri1);
+ assertThat(sliceManager.checkSlicePermission(sliceUri1, /* pid= */ 1, PACKAGE_2_UID))
+ .isEqualTo(PackageManager.PERMISSION_DENIED);
+ }
+
+ @Test
+ public void testGrantSlicePermission_doesNotGrantPermissionToOtherSliceUri() {
+ sliceManager.grantSlicePermission(PACKAGE_NAME_1, sliceUri1);
+ assertThat(sliceManager.checkSlicePermission(sliceUri2, /* pid= */ 1, PACKAGE_1_UID))
+ .isEqualTo(PackageManager.PERMISSION_DENIED);
+ }
+
+ @Test
+ public void testRevokeSlicePermission_revokesPermissionToPackage() {
+ sliceManager.grantSlicePermission(PACKAGE_NAME_1, sliceUri1);
+ sliceManager.revokeSlicePermission(PACKAGE_NAME_1, sliceUri1);
+ assertThat(sliceManager.checkSlicePermission(sliceUri1, /* pid= */ 1, PACKAGE_1_UID))
+ .isEqualTo(PackageManager.PERMISSION_DENIED);
+ }
+}
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowSoundPoolTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowSoundPoolTest.java
index 236e088..71b3a10 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowSoundPoolTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowSoundPoolTest.java
@@ -4,6 +4,7 @@
import static android.os.Build.VERSION_CODES.LOLLIPOP;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
import static org.robolectric.Shadows.shadowOf;
import android.media.AudioManager;
@@ -88,6 +89,50 @@
}
@Test
+ public void notifyPathLoaded_notifiesListener() {
+ SoundPool soundPool = createSoundPool();
+ SoundPool.OnLoadCompleteListener listener = mock(SoundPool.OnLoadCompleteListener.class);
+ soundPool.setOnLoadCompleteListener(listener);
+
+ int soundId = soundPool.load("/mnt/sdcard/sound.wav", 1);
+ shadowOf(soundPool).notifyPathLoaded("/mnt/sdcard/sound.wav", true);
+
+ verify(listener).onLoadComplete(soundPool, soundId, 0);
+ }
+
+ @Test
+ public void notifyResourceLoaded_notifiesListener() {
+ SoundPool soundPool = createSoundPool();
+ SoundPool.OnLoadCompleteListener listener = mock(SoundPool.OnLoadCompleteListener.class);
+ soundPool.setOnLoadCompleteListener(listener);
+
+ int soundId = soundPool.load(ApplicationProvider.getApplicationContext(), R.raw.sound, 1);
+ shadowOf(soundPool).notifyResourceLoaded(R.raw.sound, true);
+
+ verify(listener).onLoadComplete(soundPool, soundId, 0);
+ }
+
+ @Test
+ public void notifyPathLoaded_notifiesFailure() {
+ SoundPool soundPool = createSoundPool();
+ SoundPool.OnLoadCompleteListener listener = mock(SoundPool.OnLoadCompleteListener.class);
+ soundPool.setOnLoadCompleteListener(listener);
+
+ int soundId = soundPool.load("/mnt/sdcard/sound.wav", 1);
+ shadowOf(soundPool).notifyPathLoaded("/mnt/sdcard/sound.wav", false);
+
+ verify(listener).onLoadComplete(soundPool, soundId, 1);
+ }
+
+ @Test
+ public void notifyResourceLoaded_doNotFailWithoutListener() {
+ SoundPool soundPool = createSoundPool();
+
+ soundPool.load("/mnt/sdcard/sound.wav", 1);
+ shadowOf(soundPool).notifyPathLoaded("/mnt/sdcard/sound.wav", false);
+ }
+
+ @Test
public void playedSoundsAreCleared() {
SoundPool soundPool = createSoundPool();
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowApplicationPackageManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowApplicationPackageManager.java
index 4113a3b..39ae1e4 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowApplicationPackageManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowApplicationPackageManager.java
@@ -19,7 +19,6 @@
import static android.os.Build.VERSION_CODES.O;
import static android.os.Build.VERSION_CODES.O_MR1;
import static android.os.Build.VERSION_CODES.P;
-
import static org.robolectric.shadow.api.Shadow.invokeConstructor;
import static org.robolectric.util.ReflectionHelpers.ClassParameter.from;
@@ -400,7 +399,7 @@
ComponentName componentName =
new ComponentName(componentInfo.applicationInfo.packageName, componentInfo.name);
if ((getComponentEnabledSetting(componentName)
- & PackageManager.COMPONENT_ENABLED_STATE_DISABLED)
+ & PackageManager.COMPONENT_ENABLED_STATE_DISABLED)
!= 0) {
iterator.remove();
continue;
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowConnectivityManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowConnectivityManager.java
index 335d2b1..79140ba 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowConnectivityManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowConnectivityManager.java
@@ -1,5 +1,6 @@
package org.robolectric.shadows;
+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;
@@ -347,7 +348,7 @@
}
/**
- * Set network capability and affects the result of {@link
+ * Sets network capability and affects the result of {@link
* ConnectivityManager#getNetworkCapabilities(Network)}
*
* @param network The {@link Network} object identifying the network in question.
@@ -356,4 +357,14 @@
public void setNetworkCapabilities(Network network, NetworkCapabilities networkCapabilities) {
networkCapabilitiesMap.put(network, networkCapabilities);
}
+
+ /**
+ * Sets the value for enabling/disabling airplane mode
+ *
+ * @param enable new status for airplane mode
+ */
+ @Implementation(minSdk = KITKAT)
+ protected void setAirplaneMode(boolean enable) {
+ ShadowSettings.setAirplaneMode(enable);
+ }
}
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowDevicePolicyManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowDevicePolicyManager.java
index 62117e0..a604905 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowDevicePolicyManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowDevicePolicyManager.java
@@ -58,6 +58,7 @@
private ComponentName deviceOwner;
private ComponentName profileOwner;
private List<ComponentName> deviceAdmins = new ArrayList<>();
+ private Map<Integer, String> profileOwnerNamesMap = new HashMap<>();
private List<String> permittedAccessibilityServices = new ArrayList<>();
private List<String> permittedInputMethods = new ArrayList<>();
private Map<String, Bundle> applicationRestrictionsMap = new HashMap<>();
@@ -258,6 +259,15 @@
return profileOwner;
}
+ /**
+ * Returns the human-readable name of the profile owner for a user if set using
+ * {@link #setProfileOwnerName}, otherwise `null`.
+ */
+ @Implementation(minSdk = LOLLIPOP)
+ protected String getProfileOwnerNameAsUser(int userId) {
+ return profileOwnerNamesMap.get(userId);
+ }
+
private ShadowUserManager getShadowUserManager() {
return Shadow.extract(context.getSystemService(Context.USER_SERVICE));
}
@@ -282,6 +292,10 @@
profileOwner = admin;
}
+ public void setProfileOwnerName(int userId, String name) {
+ profileOwnerNamesMap.put(userId, name);
+ }
+
/** Sets the given {@code componentName} as one of the active admins. */
public void setActiveAdmin(ComponentName componentName) {
deviceAdmins.add(componentName);
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowLegacyResources.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowLegacyResources.java
deleted file mode 100644
index e69de29..0000000
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowLegacyResources.java
+++ /dev/null
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 9476761..1a352fb 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowServiceManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowServiceManager.java
@@ -7,12 +7,14 @@
import static android.os.Build.VERSION_CODES.M;
import static android.os.Build.VERSION_CODES.N_MR1;
import static android.os.Build.VERSION_CODES.O;
+import static android.os.Build.VERSION_CODES.P;
import android.accounts.IAccountManager;
import android.app.IAlarmManager;
import android.app.ISearchManager;
import android.app.admin.IDevicePolicyManager;
import android.app.job.IJobScheduler;
+import android.app.slice.ISliceManager;
import android.app.trust.ITrustManager;
import android.app.usage.IUsageStatsManager;
import android.content.Context;
@@ -176,6 +178,11 @@
createBinder(
"android.os.storage.IMountService", "android.os.storage.IMountService"));
}
+ if (RuntimeEnvironment.getApiLevel() >= P) {
+ put(
+ Context.SLICE_SERVICE,
+ createBinder(ISliceManager.class, "android.app.slice.SliceManager"));
+ }
}
};
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSliceManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSliceManager.java
new file mode 100644
index 0000000..86074d2
--- /dev/null
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSliceManager.java
@@ -0,0 +1,80 @@
+package org.robolectric.shadows;
+
+import static android.os.Build.VERSION_CODES.P;
+
+import android.app.slice.SliceManager;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.net.Uri;
+import android.os.Handler;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+/** Shadow of {@link SliceManager}. */
+@Implements(value = SliceManager.class, minSdk = P)
+public class ShadowSliceManager {
+
+ private static final Map<Integer, Collection<Uri>> packageUidsToPermissionGrantedSliceUris =
+ new HashMap<>();
+ private Context context;
+
+ @Implementation
+ protected void __constructor__(Context context, Handler handler) {
+ this.context = context;
+ }
+
+ @Implementation
+ protected void grantSlicePermission(String toPackage, Uri uri) {
+ int packageUid = getUidForPackage(toPackage);
+ Collection<Uri> uris = packageUidsToPermissionGrantedSliceUris.get(packageUid);
+ if (uris == null) {
+ uris = new ArrayList<>();
+ packageUidsToPermissionGrantedSliceUris.put(packageUid, uris);
+ }
+ uris.add(uri);
+ }
+
+ @Implementation
+ protected void revokeSlicePermission(String toPackage, Uri uri) {
+ int packageUid = getUidForPackage(toPackage);
+ Collection<Uri> uris = packageUidsToPermissionGrantedSliceUris.get(packageUid);
+ if (uris != null) {
+ uris.remove(uri);
+ if (uris.isEmpty()) {
+ packageUidsToPermissionGrantedSliceUris.remove(packageUid);
+ }
+ }
+ }
+
+ @Implementation
+ protected int checkSlicePermission(Uri uri, int pid, int uid) {
+ if (uid == 0) {
+ return PackageManager.PERMISSION_GRANTED;
+ }
+ Collection<Uri> uris = packageUidsToPermissionGrantedSliceUris.get(uid);
+ if (uris != null && uris.contains(uri)) {
+ return PackageManager.PERMISSION_GRANTED;
+ }
+ return PackageManager.PERMISSION_DENIED;
+ }
+
+ private int getUidForPackage(String packageName) {
+ PackageManager packageManager = context.getPackageManager();
+ try {
+ return packageManager.getPackageUid(packageName, 0);
+ } catch (NameNotFoundException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Resetter
+ public static synchronized void reset() {
+ packageUidsToPermissionGrantedSliceUris.clear();
+ }
+}
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSoundPool.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSoundPool.java
index e5766b5..a1b55fa 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSoundPool.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSoundPool.java
@@ -8,6 +8,7 @@
import android.content.Context;
import android.media.IAudioService;
import android.media.SoundPool;
+import android.media.SoundPool.OnLoadCompleteListener;
import android.util.SparseArray;
import android.util.SparseIntArray;
import com.google.common.collect.ImmutableList;
@@ -36,6 +37,8 @@
private final List<Playback> playedSounds = new ArrayList<>();
+ private OnLoadCompleteListener listener;
+
@Implementation(minSdk = N, maxSdk = N_MR1)
protected static IAudioService getService() {
return ReflectionHelpers.createNullProxy(IAudioService.class);
@@ -74,6 +77,35 @@
return soundId;
}
+ @Implementation
+ protected void setOnLoadCompleteListener(OnLoadCompleteListener listener) {
+ this.listener = listener;
+ }
+
+ /** Notify the {@link OnLoadCompleteListener}, if present, that the given path was loaded. */
+ public void notifyPathLoaded(String path, boolean success) {
+ if (listener == null) {
+ return;
+ }
+ for (int pathIdx = 0; pathIdx < idToPaths.size(); ++pathIdx) {
+ if (idToPaths.valueAt(pathIdx).equals(path)) {
+ listener.onLoadComplete(realObject, idToPaths.keyAt(pathIdx), success ? 0 : 1);
+ }
+ }
+ }
+
+ /** Notify the {@link OnLoadCompleteListener}, if present, that the given resource was loaded. */
+ public void notifyResourceLoaded(int resId, boolean success) {
+ if (listener == null) {
+ return;
+ }
+ for (int resIdx = 0; resIdx < idToRes.size(); ++resIdx) {
+ if (idToRes.valueAt(resIdx) == resId) {
+ listener.onLoadComplete(realObject, idToRes.keyAt(resIdx), success ? 0 : 1);
+ }
+ }
+ }
+
/** Returns {@code true} if the given path was played. */
public boolean wasPathPlayed(String path) {
for (Playback playback : playedSounds) {