Fix AccessibilitySettingsTest

**Root cause**
- We can no longer mock the fragment.getActivity method because it's a
  final method.
- We need to use custom shadows to implement the method we use but not
  shadowed in Robolectric. (e.g. ColorDisplayManager's
  isReduceBrightColorsActivated method)

Bug: 300157873
Test: atest AccessibilitySettingsTest
Change-Id: Ia7d039dd2e31e6b4a7b9382827f9006d4133ca1d
This commit is contained in:
Chun-Ku Lin
2023-10-13 21:41:52 +00:00
parent 780a0cb230
commit 9a0c7ba7da
2 changed files with 90 additions and 90 deletions

View File

@@ -19,52 +19,46 @@ package com.android.settings.accessibility;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import static org.robolectric.Shadows.shadowOf;
import static java.util.Collections.singletonList; import static java.util.Collections.singletonList;
import android.accessibilityservice.AccessibilityServiceInfo; import android.accessibilityservice.AccessibilityServiceInfo;
import android.accessibilityservice.AccessibilityShortcutInfo; import android.accessibilityservice.AccessibilityShortcutInfo;
import android.app.AppOpsManager; import android.app.Application;
import android.content.BroadcastReceiver;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo; import android.content.pm.ServiceInfo;
import android.database.ContentObserver;
import android.os.Build; import android.os.Build;
import android.os.Bundle;
import android.provider.Settings; import android.provider.Settings;
import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityManager;
import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.Fragment;
import androidx.preference.PreferenceManager;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import com.android.internal.accessibility.util.AccessibilityUtils; import com.android.internal.accessibility.util.AccessibilityUtils;
import com.android.internal.content.PackageMonitor; import com.android.internal.content.PackageMonitor;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.testutils.XmlTestUtils; import com.android.settings.testutils.XmlTestUtils;
import com.android.settings.testutils.shadow.ShadowApplicationPackageManager;
import com.android.settings.testutils.shadow.ShadowBluetoothAdapter; import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
import com.android.settings.testutils.shadow.ShadowBluetoothUtils; import com.android.settings.testutils.shadow.ShadowBluetoothUtils;
import com.android.settings.testutils.shadow.ShadowFragment;
import com.android.settings.testutils.shadow.ShadowUserManager; import com.android.settings.testutils.shadow.ShadowUserManager;
import com.android.settingslib.RestrictedPreference; import com.android.settingslib.RestrictedPreference;
import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.search.SearchIndexableRaw; import com.android.settingslib.search.SearchIndexableRaw;
import com.android.settingslib.testutils.shadow.ShadowColorDisplayManager;
import org.junit.Before; import org.junit.Before;
import org.junit.Ignore;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@@ -74,21 +68,25 @@ import org.mockito.Spy;
import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule; import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.android.controller.ActivityController;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import org.robolectric.shadow.api.Shadow; import org.robolectric.shadow.api.Shadow;
import org.robolectric.shadows.ShadowAccessibilityManager; import org.robolectric.shadows.ShadowAccessibilityManager;
import org.robolectric.shadows.ShadowContentResolver;
import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.List; import java.util.List;
/** Test for {@link AccessibilitySettings}. */ /** Test for {@link AccessibilitySettings}. */
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(shadows = { @Config(shadows = {
ShadowBluetoothUtils.class,
ShadowBluetoothAdapter.class, ShadowBluetoothAdapter.class,
ShadowFragment.class, ShadowUserManager.class,
ShadowColorDisplayManager.class,
ShadowApplicationPackageManager.class,
}) })
public class AccessibilitySettingsTest { public class AccessibilitySettingsTest {
private static final String PACKAGE_NAME = "com.android.test"; private static final String PACKAGE_NAME = "com.android.test";
@@ -103,50 +101,34 @@ public class AccessibilitySettingsTest {
@Rule @Rule
public final MockitoRule mocks = MockitoJUnit.rule(); public final MockitoRule mocks = MockitoJUnit.rule();
@Spy
private final Context mContext = ApplicationProvider.getApplicationContext(); private final Context mContext = ApplicationProvider.getApplicationContext();
@Spy @Spy
private final AccessibilityServiceInfo mServiceInfo = getMockAccessibilityServiceInfo( private final AccessibilityServiceInfo mServiceInfo = getMockAccessibilityServiceInfo(
PACKAGE_NAME, CLASS_NAME); PACKAGE_NAME, CLASS_NAME);
@Spy
private final AccessibilitySettings mFragment = new AccessibilitySettings();
@Mock @Mock
private AccessibilityShortcutInfo mShortcutInfo; private AccessibilityShortcutInfo mShortcutInfo;
@Mock
private FragmentActivity mActivity;
@Mock
private ContentResolver mContentResolver;
@Mock
private PreferenceManager mPreferenceManager;
private ShadowAccessibilityManager mShadowAccessibilityManager; private ShadowAccessibilityManager mShadowAccessibilityManager;
@Mock @Mock
private AppOpsManager mAppOpsManager;
@Mock
private LocalBluetoothManager mLocalBluetoothManager; private LocalBluetoothManager mLocalBluetoothManager;
private ActivityController<SettingsActivity> mActivityController;
private Lifecycle mLifecycle; private AccessibilitySettings mFragment;
@Before @Before
public void setup() { public void setup() {
mShadowAccessibilityManager = Shadow.extract(AccessibilityManager.getInstance(mContext)); mShadowAccessibilityManager = Shadow.extract(AccessibilityManager.getInstance(mContext));
mShadowAccessibilityManager.setInstalledAccessibilityServiceList(new ArrayList<>()); mShadowAccessibilityManager.setInstalledAccessibilityServiceList(new ArrayList<>());
when(mFragment.getContext()).thenReturn(mContext);
when(mFragment.getActivity()).thenReturn(mActivity);
when(mActivity.getContentResolver()).thenReturn(mContentResolver);
when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager);
when(mFragment.getPreferenceManager().getContext()).thenReturn(mContext);
mContext.setTheme(androidx.appcompat.R.style.Theme_AppCompat); mContext.setTheme(androidx.appcompat.R.style.Theme_AppCompat);
when(mContext.getSystemService(AppOpsManager.class)).thenReturn(mAppOpsManager);
when(mAppOpsManager.noteOpNoThrow(eq(AppOpsManager.OP_ACCESS_RESTRICTED_SETTINGS),
anyInt(), anyString())).thenReturn(AppOpsManager.MODE_ALLOWED);
mLifecycle = new Lifecycle(() -> mLifecycle);
when(mFragment.getSettingsLifecycle()).thenReturn(mLifecycle);
ShadowBluetoothUtils.sLocalBluetoothManager = mLocalBluetoothManager; ShadowBluetoothUtils.sLocalBluetoothManager = mLocalBluetoothManager;
setMockAccessibilityShortcutInfo(mShortcutInfo); setMockAccessibilityShortcutInfo(mShortcutInfo);
Intent intent = new Intent();
intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT,
AccessibilitySettings.class.getName());
mActivityController = ActivityController.of(new SettingsActivity(), intent);
} }
@Test @Test
@Ignore
public void getNonIndexableKeys_existInXmlLayout() { public void getNonIndexableKeys_existInXmlLayout() {
final List<String> niks = AccessibilitySettings.SEARCH_INDEX_DATA_PROVIDER final List<String> niks = AccessibilitySettings.SEARCH_INDEX_DATA_PROVIDER
.getNonIndexableKeys(mContext); .getNonIndexableKeys(mContext);
@@ -157,16 +139,15 @@ public class AccessibilitySettingsTest {
} }
@Test @Test
@Ignore
public void getRawDataToIndex_isNull() { public void getRawDataToIndex_isNull() {
final List<SearchIndexableRaw> indexableRawList = final List<SearchIndexableRaw> indexableRawList =
AccessibilitySettings.SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex(mContext, true); AccessibilitySettings.SEARCH_INDEX_DATA_PROVIDER
.getRawDataToIndex(mContext, true);
assertThat(indexableRawList).isNull(); assertThat(indexableRawList).isNull();
} }
@Test @Test
@Ignore
public void getServiceSummary_serviceCrash_showsStopped() { public void getServiceSummary_serviceCrash_showsStopped() {
mServiceInfo.crashed = true; mServiceInfo.crashed = true;
@@ -178,7 +159,6 @@ public class AccessibilitySettingsTest {
} }
@Test @Test
@Ignore
public void getServiceSummary_invisibleToggle_shortcutEnabled_showsOnSummary() { public void getServiceSummary_invisibleToggle_shortcutEnabled_showsOnSummary() {
setInvisibleToggleFragmentType(mServiceInfo); setInvisibleToggleFragmentType(mServiceInfo);
doReturn(DEFAULT_SUMMARY).when(mServiceInfo).loadSummary(any()); doReturn(DEFAULT_SUMMARY).when(mServiceInfo).loadSummary(any());
@@ -194,7 +174,6 @@ public class AccessibilitySettingsTest {
} }
@Test @Test
@Ignore
public void getServiceSummary_invisibleToggle_shortcutDisabled_showsOffSummary() { public void getServiceSummary_invisibleToggle_shortcutDisabled_showsOffSummary() {
setInvisibleToggleFragmentType(mServiceInfo); setInvisibleToggleFragmentType(mServiceInfo);
setShortcutEnabled(mServiceInfo.getComponentName(), false); setShortcutEnabled(mServiceInfo.getComponentName(), false);
@@ -210,7 +189,6 @@ public class AccessibilitySettingsTest {
} }
@Test @Test
@Ignore
public void getServiceSummary_enableServiceShortcutOn_showsServiceEnabledShortcutOn() { public void getServiceSummary_enableServiceShortcutOn_showsServiceEnabledShortcutOn() {
doReturn(EMPTY_STRING).when(mServiceInfo).loadSummary(any()); doReturn(EMPTY_STRING).when(mServiceInfo).loadSummary(any());
setShortcutEnabled(mServiceInfo.getComponentName(), true); setShortcutEnabled(mServiceInfo.getComponentName(), true);
@@ -223,7 +201,6 @@ public class AccessibilitySettingsTest {
} }
@Test @Test
@Ignore
public void getServiceSummary_enableServiceShortcutOff_showsServiceEnabledShortcutOff() { public void getServiceSummary_enableServiceShortcutOff_showsServiceEnabledShortcutOff() {
doReturn(EMPTY_STRING).when(mServiceInfo).loadSummary(any()); doReturn(EMPTY_STRING).when(mServiceInfo).loadSummary(any());
setShortcutEnabled(mServiceInfo.getComponentName(), false); setShortcutEnabled(mServiceInfo.getComponentName(), false);
@@ -236,7 +213,6 @@ public class AccessibilitySettingsTest {
} }
@Test @Test
@Ignore
public void getServiceSummary_disableServiceShortcutOff_showsDisabledShortcutOff() { public void getServiceSummary_disableServiceShortcutOff_showsDisabledShortcutOff() {
doReturn(EMPTY_STRING).when(mServiceInfo).loadSummary(any()); doReturn(EMPTY_STRING).when(mServiceInfo).loadSummary(any());
setShortcutEnabled(mServiceInfo.getComponentName(), false); setShortcutEnabled(mServiceInfo.getComponentName(), false);
@@ -249,7 +225,6 @@ public class AccessibilitySettingsTest {
} }
@Test @Test
@Ignore
public void getServiceSummary_disableServiceShortcutOn_showsDisabledShortcutOn() { public void getServiceSummary_disableServiceShortcutOn_showsDisabledShortcutOn() {
doReturn(EMPTY_STRING).when(mServiceInfo).loadSummary(any()); doReturn(EMPTY_STRING).when(mServiceInfo).loadSummary(any());
setShortcutEnabled(mServiceInfo.getComponentName(), true); setShortcutEnabled(mServiceInfo.getComponentName(), true);
@@ -262,7 +237,6 @@ public class AccessibilitySettingsTest {
} }
@Test @Test
@Ignore
public void getServiceSummary_enableServiceShortcutOffAndHasSummary_showsEnabledSummary() { public void getServiceSummary_enableServiceShortcutOffAndHasSummary_showsEnabledSummary() {
setShortcutEnabled(mServiceInfo.getComponentName(), false); setShortcutEnabled(mServiceInfo.getComponentName(), false);
doReturn(DEFAULT_SUMMARY).when(mServiceInfo).loadSummary(any()); doReturn(DEFAULT_SUMMARY).when(mServiceInfo).loadSummary(any());
@@ -277,7 +251,6 @@ public class AccessibilitySettingsTest {
} }
@Test @Test
@Ignore
public void getServiceSummary_enableServiceShortcutOnAndHasSummary_showsEnabledSummary() { public void getServiceSummary_enableServiceShortcutOnAndHasSummary_showsEnabledSummary() {
doReturn(DEFAULT_SUMMARY).when(mServiceInfo).loadSummary(any()); doReturn(DEFAULT_SUMMARY).when(mServiceInfo).loadSummary(any());
setShortcutEnabled(mServiceInfo.getComponentName(), true); setShortcutEnabled(mServiceInfo.getComponentName(), true);
@@ -292,7 +265,6 @@ public class AccessibilitySettingsTest {
} }
@Test @Test
@Ignore
public void getServiceSummary_disableServiceShortcutOnAndHasSummary_showsDisabledSummary() { public void getServiceSummary_disableServiceShortcutOnAndHasSummary_showsDisabledSummary() {
doReturn(DEFAULT_SUMMARY).when(mServiceInfo).loadSummary(any()); doReturn(DEFAULT_SUMMARY).when(mServiceInfo).loadSummary(any());
setShortcutEnabled(mServiceInfo.getComponentName(), true); setShortcutEnabled(mServiceInfo.getComponentName(), true);
@@ -307,7 +279,6 @@ public class AccessibilitySettingsTest {
} }
@Test @Test
@Ignore
public void getServiceSummary_disableServiceShortcutOffAndHasSummary_showsDisabledSummary() { public void getServiceSummary_disableServiceShortcutOffAndHasSummary_showsDisabledSummary() {
setShortcutEnabled(mServiceInfo.getComponentName(), false); setShortcutEnabled(mServiceInfo.getComponentName(), false);
doReturn(DEFAULT_SUMMARY).when(mServiceInfo).loadSummary(any()); doReturn(DEFAULT_SUMMARY).when(mServiceInfo).loadSummary(any());
@@ -322,7 +293,6 @@ public class AccessibilitySettingsTest {
} }
@Test @Test
@Ignore
public void getServiceDescription_serviceCrash_showsStopped() { public void getServiceDescription_serviceCrash_showsStopped() {
mServiceInfo.crashed = true; mServiceInfo.crashed = true;
@@ -334,7 +304,6 @@ public class AccessibilitySettingsTest {
} }
@Test @Test
@Ignore
public void getServiceDescription_haveDescription_showsDescription() { public void getServiceDescription_haveDescription_showsDescription() {
doReturn(DEFAULT_DESCRIPTION).when(mServiceInfo).loadDescription(any()); doReturn(DEFAULT_DESCRIPTION).when(mServiceInfo).loadDescription(any());
@@ -345,42 +314,66 @@ public class AccessibilitySettingsTest {
} }
@Test @Test
@Ignore
@Config(shadows = {ShadowFragment.class, ShadowUserManager.class})
public void onCreate_haveRegisterToSpecificUrisAndActions() { public void onCreate_haveRegisterToSpecificUrisAndActions() {
mFragment.onAttach(mContext); setupFragment();
mFragment.onCreate(Bundle.EMPTY); ShadowContentResolver shadowContentResolver = shadowOf(mContext.getContentResolver());
Collection<ContentObserver> a11yButtonTargetsObservers =
verify(mContentResolver).registerContentObserver( shadowContentResolver.getContentObservers(
eq(Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS)), Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS));
anyBoolean(), Collection<ContentObserver> a11yShortcutTargetServiceObservers =
any(AccessibilitySettingsContentObserver.class)); shadowContentResolver.getContentObservers(Settings.Secure.getUriFor(
verify(mContentResolver).registerContentObserver(eq(Settings.Secure.getUriFor( Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE));
Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE)), anyBoolean(), List<BroadcastReceiver> broadcastReceivers =
any(AccessibilitySettingsContentObserver.class)); shadowOf((Application) ApplicationProvider.getApplicationContext())
verify(mActivity, atLeast(1)).registerReceiver( .getRegisteredReceivers()
any(PackageMonitor.class), any(), isNull(), any()); .stream().map(wrapper -> wrapper.broadcastReceiver).toList();
assertThat(
a11yButtonTargetsObservers.stream()
.anyMatch(contentObserver ->
contentObserver instanceof AccessibilitySettingsContentObserver))
.isTrue();
assertThat(
a11yShortcutTargetServiceObservers.stream()
.anyMatch(contentObserver ->
contentObserver instanceof AccessibilitySettingsContentObserver))
.isTrue();
assertThat(broadcastReceivers.stream().anyMatch(
broadcastReceiver -> broadcastReceiver instanceof PackageMonitor)).isTrue();
} }
@Test @Test
@Ignore
@Config(shadows = {ShadowFragment.class, ShadowUserManager.class})
public void onDestroy_unregisterObserverAndReceiver() { public void onDestroy_unregisterObserverAndReceiver() {
setupFragment(); setupFragment();
mFragment.onPause();
mFragment.onStop();
mFragment.onDestroy(); mActivityController.pause().stop().destroy();
verify(mContentResolver).unregisterContentObserver( ShadowContentResolver shadowContentResolver = shadowOf(mContext.getContentResolver());
any(AccessibilitySettingsContentObserver.class)); Collection<ContentObserver> a11yButtonTargetsObservers =
verify(mActivity).unregisterReceiver(any(PackageMonitor.class)); shadowContentResolver.getContentObservers(
Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS));
Collection<ContentObserver> a11yShortcutTargetServiceObservers =
shadowContentResolver.getContentObservers(Settings.Secure.getUriFor(
Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE));
List<BroadcastReceiver> broadcastReceivers =
shadowOf((Application) ApplicationProvider.getApplicationContext())
.getRegisteredReceivers()
.stream().map(wrapper -> wrapper.broadcastReceiver).toList();
assertThat(
a11yButtonTargetsObservers.stream()
.anyMatch(contentObserver ->
contentObserver instanceof AccessibilitySettingsContentObserver))
.isFalse();
assertThat(
a11yShortcutTargetServiceObservers.stream()
.anyMatch(contentObserver ->
contentObserver instanceof AccessibilitySettingsContentObserver))
.isFalse();
assertThat(broadcastReceivers.stream().anyMatch(
broadcastReceiver -> broadcastReceiver instanceof PackageMonitor)).isFalse();
} }
@Test @Test
@Ignore
@Config(shadows = {ShadowFragment.class, ShadowUserManager.class})
public void onContentChanged_updatePreferenceInForeground_preferenceUpdated() { public void onContentChanged_updatePreferenceInForeground_preferenceUpdated() {
setupFragment(); setupFragment();
mShadowAccessibilityManager.setInstalledAccessibilityServiceList( mShadowAccessibilityManager.setInstalledAccessibilityServiceList(
@@ -396,8 +389,6 @@ public class AccessibilitySettingsTest {
} }
@Test @Test
@Ignore
@Config(shadows = {ShadowFragment.class, ShadowUserManager.class})
public void onContentChanged_updatePreferenceInBackground_preferenceUpdated() { public void onContentChanged_updatePreferenceInBackground_preferenceUpdated() {
setupFragment(); setupFragment();
mFragment.onPause(); mFragment.onPause();
@@ -417,8 +408,6 @@ public class AccessibilitySettingsTest {
} }
@Test @Test
@Ignore
@Config(shadows = {ShadowFragment.class, ShadowUserManager.class})
public void testAccessibilityMenuInSystem_IncludedInInteractionControl() { public void testAccessibilityMenuInSystem_IncludedInInteractionControl() {
mShadowAccessibilityManager.setInstalledAccessibilityServiceList( mShadowAccessibilityManager.setInstalledAccessibilityServiceList(
List.of(getMockAccessibilityServiceInfo( List.of(getMockAccessibilityServiceInfo(
@@ -433,8 +422,6 @@ public class AccessibilitySettingsTest {
} }
@Test @Test
@Ignore
@Config(shadows = {ShadowFragment.class, ShadowUserManager.class})
public void testAccessibilityMenuInSystem_NoPrefWhenNotInstalled() { public void testAccessibilityMenuInSystem_NoPrefWhenNotInstalled() {
mShadowAccessibilityManager.setInstalledAccessibilityServiceList(List.of()); mShadowAccessibilityManager.setInstalledAccessibilityServiceList(List.of());
setupFragment(); setupFragment();
@@ -487,10 +474,14 @@ public class AccessibilitySettingsTest {
} }
private void setupFragment() { private void setupFragment() {
mFragment.onAttach(mContext); mActivityController.create().start().resume();
mFragment.onCreate(Bundle.EMPTY); Fragment fragment = mActivityController.get().getSupportFragmentManager().findFragmentById(
mFragment.onStart(); R.id.main_content);
mFragment.onResume();
assertThat(fragment).isNotNull();
assertThat(fragment).isInstanceOf(AccessibilitySettings.class);
mFragment = (AccessibilitySettings) fragment;
} }
private void setShortcutEnabled(ComponentName componentName, boolean enabled) { private void setShortcutEnabled(ComponentName componentName, boolean enabled) {

View File

@@ -16,9 +16,12 @@
package com.android.settings.testutils.shadow; package com.android.settings.testutils.shadow;
import android.annotation.NonNull;
import android.app.ApplicationPackageManager; import android.app.ApplicationPackageManager;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.os.IRemoteCallback;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements; import org.robolectric.annotation.Implements;
import java.util.ArrayList; import java.util.ArrayList;
@@ -49,4 +52,10 @@ public class ShadowApplicationPackageManager
} }
return packages; return packages;
} }
@Implementation
public void registerPackageMonitorCallback(@NonNull IRemoteCallback callback, int userId) {}
@Implementation
public void unregisterPackageMonitorCallback(@NonNull IRemoteCallback callback) {}
} }