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) {