Merge "Delete DynamicindexableContentMonitor & all refs to it" into oc-mr1-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
5b820431d3
@@ -30,7 +30,6 @@ import com.android.settings.password.ChooseLockPattern.IntentBuilder;
|
||||
import com.android.settings.password.SetupChooseLockPattern;
|
||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||
import com.android.settings.testutils.shadow.SettingsShadowResources;
|
||||
import com.android.settings.testutils.shadow.ShadowDynamicIndexableContentMonitor;
|
||||
import com.android.settings.testutils.shadow.ShadowEventLogWriter;
|
||||
import com.android.settings.testutils.shadow.ShadowUtils;
|
||||
|
||||
@@ -49,7 +48,6 @@ import org.robolectric.res.builder.RobolectricPackageManager.ComponentState;
|
||||
shadows = {
|
||||
SettingsShadowResources.class,
|
||||
SettingsShadowResources.SettingsShadowTheme.class,
|
||||
ShadowDynamicIndexableContentMonitor.class,
|
||||
ShadowEventLogWriter.class,
|
||||
ShadowUtils.class
|
||||
})
|
||||
|
@@ -16,6 +16,17 @@
|
||||
|
||||
package com.android.settings.applications;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
import static org.mockito.Matchers.any;
|
||||
import static org.mockito.Matchers.anyInt;
|
||||
import static org.mockito.Matchers.eq;
|
||||
import static org.mockito.Mockito.doNothing;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
@@ -35,7 +46,6 @@ import com.android.settings.TestConfig;
|
||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||
import com.android.settings.testutils.shadow.SettingsShadowResources;
|
||||
import com.android.settings.testutils.shadow.SettingsShadowResources.SettingsShadowTheme;
|
||||
import com.android.settings.testutils.shadow.ShadowDynamicIndexableContentMonitor;
|
||||
import com.android.settings.testutils.shadow.ShadowEventLogWriter;
|
||||
import com.android.settings.widget.LoadingViewController;
|
||||
import com.android.settingslib.applications.ApplicationsState;
|
||||
@@ -53,17 +63,6 @@ import org.robolectric.util.ReflectionHelpers;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
import static org.mockito.Matchers.any;
|
||||
import static org.mockito.Matchers.anyInt;
|
||||
import static org.mockito.Matchers.eq;
|
||||
import static org.mockito.Mockito.doNothing;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
/**
|
||||
* Tests for {@link ManageApplications}.
|
||||
*/
|
||||
@@ -74,7 +73,6 @@ import static org.mockito.Mockito.when;
|
||||
shadows = {
|
||||
SettingsShadowResources.class,
|
||||
SettingsShadowTheme.class,
|
||||
ShadowDynamicIndexableContentMonitor.class,
|
||||
ShadowEventLogWriter.class
|
||||
})
|
||||
public class ManageApplicationsTest {
|
||||
|
@@ -15,6 +15,19 @@
|
||||
*/
|
||||
package com.android.settings.dashboard;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
import static org.mockito.ArgumentMatchers.anyInt;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.any;
|
||||
import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.reset;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
@@ -38,7 +51,6 @@ import com.android.settings.dashboard.suggestions.SuggestionAdapter;
|
||||
import com.android.settings.testutils.FakeFeatureFactory;
|
||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||
import com.android.settings.testutils.shadow.SettingsShadowResources;
|
||||
import com.android.settings.testutils.shadow.ShadowDynamicIndexableContentMonitor;
|
||||
import com.android.settingslib.drawer.DashboardCategory;
|
||||
import com.android.settingslib.drawer.Tile;
|
||||
|
||||
@@ -56,26 +68,12 @@ import org.robolectric.annotation.Config;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
import static org.mockito.ArgumentMatchers.anyInt;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.any;
|
||||
import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.reset;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
@RunWith(SettingsRobolectricTestRunner.class)
|
||||
@Config(manifest = TestConfig.MANIFEST_PATH,
|
||||
sdk = TestConfig.SDK_VERSION,
|
||||
shadows = {
|
||||
SettingsShadowResources.class,
|
||||
SettingsShadowResources.SettingsShadowTheme.class,
|
||||
ShadowDynamicIndexableContentMonitor.class
|
||||
})
|
||||
public class DashboardAdapterTest {
|
||||
|
||||
|
@@ -36,7 +36,6 @@ import com.android.settings.password.ChooseLockSettingsHelper;
|
||||
import com.android.settings.password.IFingerprintManager;
|
||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||
import com.android.settings.testutils.shadow.SettingsShadowResources;
|
||||
import com.android.settings.testutils.shadow.ShadowDynamicIndexableContentMonitor;
|
||||
import com.android.settings.testutils.shadow.ShadowEventLogWriter;
|
||||
import com.android.settings.testutils.shadow.ShadowUtils;
|
||||
|
||||
@@ -61,7 +60,6 @@ import org.robolectric.shadows.ShadowActivity.IntentForResult;
|
||||
shadows = {
|
||||
SettingsShadowResources.class,
|
||||
SettingsShadowResources.SettingsShadowTheme.class,
|
||||
ShadowDynamicIndexableContentMonitor.class,
|
||||
ShadowEventLogWriter.class,
|
||||
ShadowUtils.class
|
||||
})
|
||||
|
@@ -30,7 +30,6 @@ import com.android.settings.password.ChooseLockSettingsHelper;
|
||||
import com.android.settings.password.IFingerprintManager;
|
||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||
import com.android.settings.testutils.shadow.SettingsShadowResources;
|
||||
import com.android.settings.testutils.shadow.ShadowDynamicIndexableContentMonitor;
|
||||
import com.android.settings.testutils.shadow.ShadowEventLogWriter;
|
||||
import com.android.settings.testutils.shadow.ShadowUtils;
|
||||
|
||||
@@ -53,7 +52,6 @@ import org.robolectric.shadows.ShadowAlertDialog;
|
||||
shadows = {
|
||||
SettingsShadowResources.class,
|
||||
SettingsShadowResources.SettingsShadowTheme.class,
|
||||
ShadowDynamicIndexableContentMonitor.class,
|
||||
ShadowEventLogWriter.class,
|
||||
ShadowUtils.class
|
||||
})
|
||||
|
@@ -17,6 +17,15 @@
|
||||
|
||||
package com.android.settings.fuelgauge;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
import static org.mockito.ArgumentMatchers.nullable;
|
||||
import static org.mockito.Matchers.any;
|
||||
import static org.mockito.Matchers.eq;
|
||||
import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
@@ -27,11 +36,10 @@ import android.support.v7.widget.RecyclerView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||
import com.android.settings.TestConfig;
|
||||
import com.android.settings.applications.LayoutPreference;
|
||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||
import com.android.settings.testutils.shadow.SettingsShadowResources;
|
||||
import com.android.settings.testutils.shadow.ShadowDynamicIndexableContentMonitor;
|
||||
import com.android.settings.testutils.shadow.ShadowEntityHeaderController;
|
||||
import com.android.settings.widget.EntityHeaderController;
|
||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||
@@ -45,23 +53,12 @@ import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.annotation.Config;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.nullable;
|
||||
import static org.mockito.Matchers.any;
|
||||
import static org.mockito.Matchers.eq;
|
||||
import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
@RunWith(SettingsRobolectricTestRunner.class)
|
||||
@Config(manifest = TestConfig.MANIFEST_PATH,
|
||||
sdk = TestConfig.SDK_VERSION,
|
||||
shadows = {
|
||||
SettingsShadowResources.class,
|
||||
SettingsShadowResources.SettingsShadowTheme.class,
|
||||
ShadowDynamicIndexableContentMonitor.class,
|
||||
ShadowEntityHeaderController.class
|
||||
})
|
||||
public class BatteryHeaderPreferenceControllerTest {
|
||||
|
@@ -16,15 +16,17 @@
|
||||
package com.android.settings.fuelgauge;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.ColorFilter;
|
||||
|
||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||
import com.android.settings.TestConfig;
|
||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||
import com.android.settings.testutils.shadow.SettingsShadowResources;
|
||||
import com.android.settings.testutils.shadow.SettingsShadowResources.SettingsShadowTheme;
|
||||
import com.android.settings.testutils.shadow.ShadowDynamicIndexableContentMonitor;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
@@ -34,10 +36,6 @@ import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.annotation.Config;
|
||||
|
||||
import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
@RunWith(SettingsRobolectricTestRunner.class)
|
||||
// TODO: Consider making the shadow class set global using a robolectric.properties file.
|
||||
@Config(manifest = TestConfig.MANIFEST_PATH,
|
||||
@@ -45,7 +43,6 @@ import static org.mockito.Mockito.verify;
|
||||
shadows = {
|
||||
SettingsShadowResources.class,
|
||||
SettingsShadowTheme.class,
|
||||
ShadowDynamicIndexableContentMonitor.class
|
||||
})
|
||||
public class BatteryMeterViewTest {
|
||||
private static final int BATTERY_LEVEL = 100;
|
||||
|
@@ -18,9 +18,7 @@ package com.android.settings.fuelgauge;
|
||||
import static com.android.settings.fuelgauge.PowerUsageSummary.MENU_ADDITIONAL_BATTERY_INFO;
|
||||
import static com.android.settings.fuelgauge.PowerUsageSummary.MENU_HIGH_POWER_APPS;
|
||||
import static com.android.settings.fuelgauge.PowerUsageSummary.MENU_TOGGLE_APPS;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.Matchers.any;
|
||||
import static org.mockito.Matchers.anyInt;
|
||||
import static org.mockito.Matchers.anyLong;
|
||||
@@ -34,8 +32,6 @@ import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import android.app.LoaderManager;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
@@ -68,7 +64,6 @@ import com.android.settings.testutils.FakeFeatureFactory;
|
||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||
import com.android.settings.testutils.XmlTestUtils;
|
||||
import com.android.settings.testutils.shadow.SettingsShadowResources;
|
||||
import com.android.settings.testutils.shadow.ShadowDynamicIndexableContentMonitor;
|
||||
import com.android.settingslib.core.AbstractPreferenceController;
|
||||
|
||||
import org.junit.Before;
|
||||
@@ -95,7 +90,6 @@ import java.util.List;
|
||||
shadows = {
|
||||
SettingsShadowResources.class,
|
||||
SettingsShadowResources.SettingsShadowTheme.class,
|
||||
ShadowDynamicIndexableContentMonitor.class
|
||||
})
|
||||
public class PowerUsageSummaryTest {
|
||||
private static final String[] PACKAGE_NAMES = {"com.app1", "com.app2"};
|
||||
|
@@ -31,7 +31,6 @@ import com.android.settings.password.ChooseLockPassword.ChooseLockPasswordFragme
|
||||
import com.android.settings.password.ChooseLockPassword.IntentBuilder;
|
||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||
import com.android.settings.testutils.shadow.SettingsShadowResources;
|
||||
import com.android.settings.testutils.shadow.ShadowDynamicIndexableContentMonitor;
|
||||
import com.android.settings.testutils.shadow.ShadowEventLogWriter;
|
||||
import com.android.settings.testutils.shadow.ShadowUtils;
|
||||
import com.android.setupwizardlib.GlifLayout;
|
||||
@@ -52,7 +51,6 @@ import org.robolectric.shadows.ShadowDrawable;
|
||||
shadows = {
|
||||
SettingsShadowResources.class,
|
||||
SettingsShadowResources.SettingsShadowTheme.class,
|
||||
ShadowDynamicIndexableContentMonitor.class,
|
||||
ShadowEventLogWriter.class,
|
||||
ShadowUtils.class
|
||||
})
|
||||
|
@@ -29,7 +29,6 @@ import com.android.settings.password.ChooseLockPattern.ChooseLockPatternFragment
|
||||
import com.android.settings.password.ChooseLockPattern.IntentBuilder;
|
||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||
import com.android.settings.testutils.shadow.SettingsShadowResources;
|
||||
import com.android.settings.testutils.shadow.ShadowDynamicIndexableContentMonitor;
|
||||
import com.android.settings.testutils.shadow.ShadowEventLogWriter;
|
||||
import com.android.settings.testutils.shadow.ShadowUtils;
|
||||
import com.android.setupwizardlib.GlifLayout;
|
||||
@@ -48,7 +47,6 @@ import org.robolectric.shadows.ShadowDrawable;
|
||||
shadows = {
|
||||
SettingsShadowResources.class,
|
||||
SettingsShadowResources.SettingsShadowTheme.class,
|
||||
ShadowDynamicIndexableContentMonitor.class,
|
||||
ShadowEventLogWriter.class,
|
||||
ShadowUtils.class
|
||||
})
|
||||
|
@@ -34,7 +34,6 @@ import com.android.settings.password.ChooseLockPassword.IntentBuilder;
|
||||
import com.android.settings.password.SetupChooseLockPassword.SetupChooseLockPasswordFragment;
|
||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||
import com.android.settings.testutils.shadow.SettingsShadowResources;
|
||||
import com.android.settings.testutils.shadow.ShadowDynamicIndexableContentMonitor;
|
||||
import com.android.settings.testutils.shadow.ShadowEventLogWriter;
|
||||
import com.android.settings.testutils.shadow.ShadowUtils;
|
||||
|
||||
@@ -62,7 +61,6 @@ import java.util.List;
|
||||
shadows = {
|
||||
SettingsShadowResources.class,
|
||||
SettingsShadowResources.SettingsShadowTheme.class,
|
||||
ShadowDynamicIndexableContentMonitor.class,
|
||||
ShadowEventLogWriter.class,
|
||||
ShadowUtils.class
|
||||
})
|
||||
|
@@ -27,7 +27,6 @@ import com.android.settings.R;
|
||||
import com.android.settings.TestConfig;
|
||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||
import com.android.settings.testutils.shadow.SettingsShadowResources;
|
||||
import com.android.settings.testutils.shadow.ShadowDynamicIndexableContentMonitor;
|
||||
import com.android.settings.testutils.shadow.ShadowEventLogWriter;
|
||||
import com.android.settings.testutils.shadow.ShadowUtils;
|
||||
|
||||
@@ -40,13 +39,11 @@ import org.robolectric.annotation.Config;
|
||||
import org.robolectric.shadows.ShadowAlertDialog;
|
||||
|
||||
@RunWith(SettingsRobolectricTestRunner.class)
|
||||
@Config(
|
||||
manifest = TestConfig.MANIFEST_PATH,
|
||||
@Config(manifest = TestConfig.MANIFEST_PATH,
|
||||
sdk = TestConfig.SDK_VERSION,
|
||||
shadows = {
|
||||
SettingsShadowResources.class,
|
||||
SettingsShadowResources.SettingsShadowTheme.class,
|
||||
ShadowDynamicIndexableContentMonitor.class,
|
||||
ShadowEventLogWriter.class,
|
||||
ShadowUtils.class
|
||||
})
|
||||
|
@@ -1,563 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2016 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 com.android.settings.search;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
import static org.mockito.Matchers.any;
|
||||
import static org.mockito.Matchers.anyBoolean;
|
||||
import static org.mockito.Matchers.anyInt;
|
||||
import static org.mockito.Matchers.anyString;
|
||||
import static org.mockito.Matchers.eq;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.only;
|
||||
import static org.mockito.Mockito.reset;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
import android.accessibilityservice.AccessibilityServiceInfo;
|
||||
import android.app.Activity;
|
||||
import android.app.Application;
|
||||
import android.app.LoaderManager;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.Loader;
|
||||
import android.content.pm.ActivityInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.content.pm.ServiceInfo;
|
||||
import android.database.ContentObserver;
|
||||
import android.hardware.input.InputManager;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.print.PrintManager;
|
||||
import android.print.PrintServicesLoader;
|
||||
import android.printservice.PrintServiceInfo;
|
||||
import android.provider.Settings;
|
||||
import android.provider.UserDictionary;
|
||||
import android.view.inputmethod.InputMethodInfo;
|
||||
|
||||
import com.android.internal.content.PackageMonitor;
|
||||
import com.android.settings.TestConfig;
|
||||
import com.android.settings.inputmethod.AvailableVirtualKeyboardFragment;
|
||||
import com.android.settings.inputmethod.PhysicalKeyboardFragment;
|
||||
import com.android.settings.inputmethod.VirtualKeyboardFragment;
|
||||
import com.android.settings.language.LanguageAndInputSettings;
|
||||
import com.android.settings.print.PrintSettingsFragment;
|
||||
import com.android.settings.testutils.DatabaseTestUtils;
|
||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||
import com.android.settings.testutils.shadow.ShadowActivityWithLoadManager;
|
||||
import com.android.settings.testutils.shadow.ShadowContextImplWithRegisterReceiver;
|
||||
import com.android.settings.testutils.shadow.ShadowInputManager;
|
||||
import com.android.settings.testutils.shadow.ShadowInputMethodManagerWithMethodList;
|
||||
import com.android.settings.testutils.shadow.ShadowPackageMonitor;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.Robolectric;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.annotation.Config;
|
||||
import org.robolectric.internal.ShadowExtractor;
|
||||
import org.robolectric.res.builder.RobolectricPackageManager;
|
||||
import org.robolectric.shadows.ShadowAccessibilityManager;
|
||||
import org.robolectric.shadows.ShadowApplication;
|
||||
import org.robolectric.shadows.ShadowContentResolver;
|
||||
import org.xmlpull.v1.XmlPullParserException;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
@RunWith(SettingsRobolectricTestRunner.class)
|
||||
@Config(
|
||||
manifest = TestConfig.MANIFEST_PATH,
|
||||
sdk = TestConfig.SDK_VERSION,
|
||||
shadows = {
|
||||
ShadowActivityWithLoadManager.class,
|
||||
ShadowContextImplWithRegisterReceiver.class,
|
||||
ShadowInputManager.class,
|
||||
ShadowInputMethodManagerWithMethodList.class,
|
||||
ShadowPackageMonitor.class,
|
||||
}
|
||||
)
|
||||
public class DynamicIndexableContentMonitorTest {
|
||||
|
||||
private static final int LOADER_ID = 1234;
|
||||
private static final String A11Y_PACKAGE_1 = "a11y-1";
|
||||
private static final String A11Y_PACKAGE_2 = "a11y-2";
|
||||
private static final String IME_PACKAGE_1 = "ime-1";
|
||||
private static final String IME_PACKAGE_2 = "ime-2";
|
||||
|
||||
@Mock
|
||||
private LoaderManager mLoaderManager;
|
||||
@Mock
|
||||
private DatabaseIndexingManager mIndexManager;
|
||||
|
||||
private Activity mActivity;
|
||||
private InputManager mInputManager;
|
||||
|
||||
private ShadowContextImplWithRegisterReceiver mShadowContextImpl;
|
||||
private ShadowActivityWithLoadManager mShadowActivity;
|
||||
private ShadowAccessibilityManager mShadowAccessibilityManager;
|
||||
private ShadowInputMethodManagerWithMethodList mShadowInputMethodManager;
|
||||
private RobolectricPackageManager mRobolectricPackageManager;
|
||||
|
||||
private final DynamicIndexableContentMonitor mMonitor = new DynamicIndexableContentMonitor();
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
mActivity = Robolectric.buildActivity(Activity.class).get();
|
||||
mInputManager = InputManager.getInstance();
|
||||
|
||||
// Robolectric shadows.
|
||||
mShadowContextImpl = (ShadowContextImplWithRegisterReceiver) ShadowExtractor.extract(
|
||||
((Application) ShadowApplication.getInstance().getApplicationContext())
|
||||
.getBaseContext());
|
||||
mShadowActivity = (ShadowActivityWithLoadManager) ShadowExtractor.extract(mActivity);
|
||||
mShadowAccessibilityManager = (ShadowAccessibilityManager) ShadowExtractor.extract(
|
||||
mActivity.getSystemService(Context.ACCESSIBILITY_SERVICE));
|
||||
mShadowInputMethodManager = (ShadowInputMethodManagerWithMethodList) ShadowExtractor
|
||||
.extract(mActivity.getSystemService(Context.INPUT_METHOD_SERVICE));
|
||||
mRobolectricPackageManager = RuntimeEnvironment.getRobolectricPackageManager();
|
||||
|
||||
// Setup shadows.
|
||||
mShadowContextImpl.setSystemService(Context.PRINT_SERVICE, mock(PrintManager.class));
|
||||
mShadowContextImpl.setSystemService(Context.INPUT_SERVICE, mInputManager);
|
||||
mShadowActivity.setLoaderManager(mLoaderManager);
|
||||
mShadowAccessibilityManager.setInstalledAccessibilityServiceList(Collections.emptyList());
|
||||
mShadowInputMethodManager.setInputMethodList(Collections.emptyList());
|
||||
mRobolectricPackageManager.setSystemFeature(PackageManager.FEATURE_PRINTING, true);
|
||||
mRobolectricPackageManager.setSystemFeature(PackageManager.FEATURE_INPUT_METHODS, true);
|
||||
}
|
||||
|
||||
@After
|
||||
public void shutDown() {
|
||||
mMonitor.unregister(mActivity, LOADER_ID);
|
||||
// BroadcastReceiver must be unregistered.
|
||||
assertThat(extractPackageMonitor()).isNull();
|
||||
|
||||
DynamicIndexableContentMonitor.resetForTesting();
|
||||
mRobolectricPackageManager.reset();
|
||||
|
||||
DatabaseTestUtils.clearDb(mActivity);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLockedUser() {
|
||||
mMonitor.register(mActivity, LOADER_ID, mIndexManager, false /* isUserUnlocked */);
|
||||
|
||||
// No loader procedure happens.
|
||||
verify(mLoaderManager, never()).initLoader(
|
||||
anyInt(), any(Bundle.class), any(LoaderManager.LoaderCallbacks.class));
|
||||
// No indexing happens.
|
||||
verify(mIndexManager, never()).updateFromClassNameResource(
|
||||
anyString(), anyBoolean());
|
||||
|
||||
mMonitor.unregister(mActivity, LOADER_ID);
|
||||
|
||||
// No destroy loader should happen.
|
||||
verify(mLoaderManager, never()).destroyLoader(anyInt());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testWithNoPrintingFeature() {
|
||||
mRobolectricPackageManager.setSystemFeature(PackageManager.FEATURE_PRINTING, false);
|
||||
|
||||
mMonitor.register(mActivity, LOADER_ID, mIndexManager, true /* isUserUnlocked */);
|
||||
|
||||
// No loader procedure happens.
|
||||
verify(mLoaderManager, never()).initLoader(
|
||||
anyInt(), any(Bundle.class), any(LoaderManager.LoaderCallbacks.class));
|
||||
verifyNoIndexing(PrintSettingsFragment.class);
|
||||
|
||||
mMonitor.unregister(mActivity, LOADER_ID);
|
||||
|
||||
// No destroy loader should happen.
|
||||
verify(mLoaderManager, never()).destroyLoader(anyInt());
|
||||
// BroadcastReceiver must be unregistered.
|
||||
assertThat(extractPackageMonitor()).isNull();
|
||||
|
||||
// To suppress spurious test fail in {@link #shutDown()}.
|
||||
mMonitor.register(mActivity, LOADER_ID, mIndexManager, true /* isUserUnlocked */);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPrinterServiceIndex() {
|
||||
mMonitor.register(mActivity, LOADER_ID, mIndexManager, true /* isUserUnlocked */);
|
||||
|
||||
// Loader procedure happens.
|
||||
verify(mLoaderManager, only()).initLoader(LOADER_ID, null, mMonitor);
|
||||
|
||||
// Loading print services happens.
|
||||
final Loader<List<PrintServiceInfo>> loader =
|
||||
mMonitor.onCreateLoader(LOADER_ID, null /* args */);
|
||||
assertThat(loader).isInstanceOf(PrintServicesLoader.class);
|
||||
verifyNoIndexing(PrintSettingsFragment.class);
|
||||
|
||||
mMonitor.onLoadFinished(loader, Collections.emptyList());
|
||||
|
||||
verifyIncrementalIndexing(PrintSettingsFragment.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testInputDevicesMonitor() {
|
||||
mMonitor.register(mActivity, LOADER_ID, mIndexManager, true /* isUserUnlocked */);
|
||||
|
||||
// Rebuild indexing should happen.
|
||||
verifyIncrementalIndexing(PhysicalKeyboardFragment.class);
|
||||
// Input monitor should be registered to InputManager.
|
||||
final InputManager.InputDeviceListener listener = extactInputDeviceListener();
|
||||
assertThat(listener).isNotNull();
|
||||
|
||||
/*
|
||||
* Nothing happens on successive register calls.
|
||||
*/
|
||||
mMonitor.unregister(mActivity, LOADER_ID);
|
||||
reset(mIndexManager);
|
||||
|
||||
mMonitor.register(mActivity, LOADER_ID, mIndexManager, true /* isUserUnlocked */);
|
||||
|
||||
verifyNoIndexing(PhysicalKeyboardFragment.class);
|
||||
assertThat(extactInputDeviceListener()).isEqualTo(listener);
|
||||
|
||||
/*
|
||||
* A device is added.
|
||||
*/
|
||||
reset(mIndexManager);
|
||||
|
||||
listener.onInputDeviceAdded(1 /* deviceId */);
|
||||
|
||||
verifyIncrementalIndexing(PhysicalKeyboardFragment.class);
|
||||
|
||||
/*
|
||||
* A device is removed.
|
||||
*/
|
||||
reset(mIndexManager);
|
||||
|
||||
listener.onInputDeviceRemoved(2 /* deviceId */);
|
||||
|
||||
verifyIncrementalIndexing(PhysicalKeyboardFragment.class);
|
||||
|
||||
/*
|
||||
* A device is changed.
|
||||
*/
|
||||
reset(mIndexManager);
|
||||
|
||||
listener.onInputDeviceChanged(3 /* deviceId */);
|
||||
|
||||
verifyIncrementalIndexing(PhysicalKeyboardFragment.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testInputMethodServicesMonitor() throws Exception {
|
||||
mMonitor.register(mActivity, LOADER_ID, mIndexManager, true /* isUserUnlocked */);
|
||||
|
||||
verifyIncrementalIndexing(VirtualKeyboardFragment.class);
|
||||
verifyIncrementalIndexing(AvailableVirtualKeyboardFragment.class);
|
||||
|
||||
final Uri enabledInputMethodsContentUri = Settings.Secure.getUriFor(
|
||||
Settings.Secure.ENABLED_INPUT_METHODS);
|
||||
// Content observer should be registered.
|
||||
final ContentObserver observer = extractContentObserver(enabledInputMethodsContentUri);
|
||||
assertThat(observer).isNotNull();
|
||||
|
||||
/*
|
||||
* When an input method service package is installed, incremental indexing happen.
|
||||
*/
|
||||
reset(mIndexManager);
|
||||
|
||||
installInputMethodService(IME_PACKAGE_1);
|
||||
|
||||
verifyIncrementalIndexing(VirtualKeyboardFragment.class);
|
||||
verifyIncrementalIndexing(AvailableVirtualKeyboardFragment.class);
|
||||
|
||||
/*
|
||||
* When another input method service package is installed, incremental indexing happens.
|
||||
*/
|
||||
reset(mIndexManager);
|
||||
|
||||
installInputMethodService(IME_PACKAGE_2);
|
||||
|
||||
verifyIncrementalIndexing(VirtualKeyboardFragment.class);
|
||||
verifyIncrementalIndexing(AvailableVirtualKeyboardFragment.class);
|
||||
|
||||
/*
|
||||
* When an input method service is disabled, rebuild indexing happens.
|
||||
*/
|
||||
reset(mIndexManager);
|
||||
|
||||
disableInstalledPackage(IME_PACKAGE_1);
|
||||
|
||||
verifyIncrementalIndexing(VirtualKeyboardFragment.class);
|
||||
verifyIncrementalIndexing(AvailableVirtualKeyboardFragment.class);
|
||||
|
||||
/*
|
||||
* When an input method service is enabled, incremental indexing happens.
|
||||
*/
|
||||
reset(mIndexManager);
|
||||
|
||||
enableInstalledPackage(IME_PACKAGE_1);
|
||||
|
||||
verifyIncrementalIndexing(VirtualKeyboardFragment.class);
|
||||
verifyIncrementalIndexing(AvailableVirtualKeyboardFragment.class);
|
||||
|
||||
/*
|
||||
* When an input method service package is uninstalled, rebuild indexing happens.
|
||||
*/
|
||||
reset(mIndexManager);
|
||||
|
||||
uninstallInputMethodService(IME_PACKAGE_1);
|
||||
|
||||
verifyIncrementalIndexing(VirtualKeyboardFragment.class);
|
||||
verifyIncrementalIndexing(AvailableVirtualKeyboardFragment.class);
|
||||
|
||||
/*
|
||||
* When an accessibility service package is installed, nothing happens.
|
||||
*/
|
||||
reset(mIndexManager);
|
||||
|
||||
installAccessibilityService(A11Y_PACKAGE_1);
|
||||
|
||||
verifyNoIndexing(VirtualKeyboardFragment.class);
|
||||
verifyNoIndexing(AvailableVirtualKeyboardFragment.class);
|
||||
|
||||
/*
|
||||
* When enabled IMEs list is changed, rebuild indexing happens.
|
||||
*/
|
||||
reset(mIndexManager);
|
||||
|
||||
observer.onChange(false /* selfChange */, enabledInputMethodsContentUri);
|
||||
|
||||
verifyIncrementalIndexing(VirtualKeyboardFragment.class);
|
||||
verifyIncrementalIndexing(AvailableVirtualKeyboardFragment.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUserDictionaryChangeMonitor() throws Exception {
|
||||
mMonitor.register(mActivity, LOADER_ID, mIndexManager, true /* isUserUnlocked */);
|
||||
|
||||
// Content observer should be registered.
|
||||
final ContentObserver observer = extractContentObserver(UserDictionary.Words.CONTENT_URI);
|
||||
assertThat(observer).isNotNull();
|
||||
|
||||
verifyIncrementalIndexing(LanguageAndInputSettings.class);
|
||||
|
||||
/*
|
||||
* When user dictionary content is changed, rebuild indexing happens.
|
||||
*/
|
||||
reset(mIndexManager);
|
||||
|
||||
observer.onChange(false /* selfChange */, UserDictionary.Words.CONTENT_URI);
|
||||
|
||||
verifyIncrementalIndexing(LanguageAndInputSettings.class);
|
||||
}
|
||||
|
||||
/*
|
||||
* Verification helpers.
|
||||
*/
|
||||
|
||||
private void verifyNoIndexing(Class<?> indexingClass) {
|
||||
verify(mIndexManager, never()).updateFromClassNameResource(eq(indexingClass.getName()),
|
||||
anyBoolean());
|
||||
}
|
||||
|
||||
private void verifyIncrementalIndexing(Class<?> indexingClass) {
|
||||
verify(mIndexManager, times(1)).updateFromClassNameResource(indexingClass.getName(),
|
||||
true /* includeInSearchResults */);
|
||||
verify(mIndexManager, never()).updateFromClassNameResource(indexingClass.getName(),
|
||||
false /* includeInSearchResults */);
|
||||
}
|
||||
|
||||
/*
|
||||
* Testing helper methods.
|
||||
*/
|
||||
|
||||
private InputManager.InputDeviceListener extactInputDeviceListener() {
|
||||
List<InputManager.InputDeviceListener> listeners = ((ShadowInputManager) ShadowExtractor
|
||||
.extract(mInputManager))
|
||||
.getRegisteredInputDeviceListeners();
|
||||
InputManager.InputDeviceListener inputDeviceListener = null;
|
||||
for (InputManager.InputDeviceListener listener : listeners) {
|
||||
if (isUnderTest(listener)) {
|
||||
if (inputDeviceListener != null) {
|
||||
assertThat(listener).isEqualTo(inputDeviceListener);
|
||||
} else {
|
||||
inputDeviceListener = listener;
|
||||
}
|
||||
}
|
||||
}
|
||||
return inputDeviceListener;
|
||||
}
|
||||
|
||||
private PackageMonitor extractPackageMonitor() {
|
||||
List<ShadowApplication.Wrapper> receivers = ShadowApplication.getInstance()
|
||||
.getRegisteredReceivers();
|
||||
PackageMonitor packageMonitor = null;
|
||||
for (ShadowApplication.Wrapper wrapper : receivers) {
|
||||
BroadcastReceiver receiver = wrapper.getBroadcastReceiver();
|
||||
if (isUnderTest(receiver) && receiver instanceof PackageMonitor) {
|
||||
if (packageMonitor != null) {
|
||||
assertThat(receiver).isEqualTo(packageMonitor);
|
||||
} else {
|
||||
packageMonitor = (PackageMonitor) receiver;
|
||||
}
|
||||
}
|
||||
}
|
||||
return packageMonitor;
|
||||
}
|
||||
|
||||
private ContentObserver extractContentObserver(Uri uri) {
|
||||
ShadowContentResolver contentResolver = (ShadowContentResolver) ShadowExtractor
|
||||
.extract(mActivity.getContentResolver());
|
||||
Collection<ContentObserver> observers = contentResolver.getContentObservers(uri);
|
||||
ContentObserver contentObserver = null;
|
||||
for (ContentObserver observer : observers) {
|
||||
if (isUnderTest(observer)) {
|
||||
if (contentObserver != null) {
|
||||
assertThat(observer).isEqualTo(contentObserver);
|
||||
} else {
|
||||
contentObserver = observer;
|
||||
}
|
||||
}
|
||||
}
|
||||
return contentObserver;
|
||||
}
|
||||
|
||||
private void enableInstalledPackage(String packageName) {
|
||||
((PackageManager) mRobolectricPackageManager).setApplicationEnabledSetting(
|
||||
packageName, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 0 /* flags */);
|
||||
extractPackageMonitor().onPackageModified(packageName);
|
||||
Robolectric.flushBackgroundThreadScheduler();
|
||||
}
|
||||
|
||||
private void disableInstalledPackage(String packageName) {
|
||||
((PackageManager) mRobolectricPackageManager).setApplicationEnabledSetting(
|
||||
packageName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0 /* flags */);
|
||||
extractPackageMonitor().onPackageModified(packageName);
|
||||
Robolectric.flushBackgroundThreadScheduler();
|
||||
}
|
||||
|
||||
private void installAccessibilityService(String packageName) throws Exception {
|
||||
final AccessibilityServiceInfo serviceToAdd = buildAccessibilityServiceInfo(packageName);
|
||||
|
||||
final List<AccessibilityServiceInfo> services = new ArrayList<>();
|
||||
services.addAll(mShadowAccessibilityManager.getInstalledAccessibilityServiceList());
|
||||
services.add(serviceToAdd);
|
||||
mShadowAccessibilityManager.setInstalledAccessibilityServiceList(services);
|
||||
|
||||
final Intent intent = DynamicIndexableContentMonitor
|
||||
.getAccessibilityServiceIntent(packageName);
|
||||
mRobolectricPackageManager.addResolveInfoForIntent(intent, serviceToAdd.getResolveInfo());
|
||||
mRobolectricPackageManager.addPackage(packageName);
|
||||
|
||||
extractPackageMonitor()
|
||||
.onPackageAppeared(packageName, PackageMonitor.PACKAGE_PERMANENT_CHANGE);
|
||||
Robolectric.flushBackgroundThreadScheduler();
|
||||
}
|
||||
|
||||
private void uninstallAccessibilityService(String packageName) throws Exception {
|
||||
final AccessibilityServiceInfo serviceToRemove = buildAccessibilityServiceInfo(packageName);
|
||||
|
||||
final List<AccessibilityServiceInfo> services = new ArrayList<>();
|
||||
services.addAll(mShadowAccessibilityManager.getInstalledAccessibilityServiceList());
|
||||
services.remove(serviceToRemove);
|
||||
mShadowAccessibilityManager.setInstalledAccessibilityServiceList(services);
|
||||
|
||||
final Intent intent = DynamicIndexableContentMonitor
|
||||
.getAccessibilityServiceIntent(packageName);
|
||||
mRobolectricPackageManager.removeResolveInfosForIntent(intent, packageName);
|
||||
mRobolectricPackageManager.removePackage(packageName);
|
||||
|
||||
extractPackageMonitor()
|
||||
.onPackageDisappeared(packageName, PackageMonitor.PACKAGE_PERMANENT_CHANGE);
|
||||
Robolectric.flushBackgroundThreadScheduler();
|
||||
}
|
||||
|
||||
private void installInputMethodService(String packageName) throws Exception {
|
||||
final ResolveInfo resolveInfoToAdd = buildResolveInfo(packageName, "imeService");
|
||||
final InputMethodInfo serviceToAdd = buildInputMethodInfo(resolveInfoToAdd);
|
||||
|
||||
final List<InputMethodInfo> services = new ArrayList<>();
|
||||
services.addAll(mShadowInputMethodManager.getInputMethodList());
|
||||
services.add(serviceToAdd);
|
||||
mShadowInputMethodManager.setInputMethodList(services);
|
||||
|
||||
final Intent intent = DynamicIndexableContentMonitor.getIMEServiceIntent(packageName);
|
||||
mRobolectricPackageManager.addResolveInfoForIntent(intent, resolveInfoToAdd);
|
||||
mRobolectricPackageManager.addPackage(packageName);
|
||||
|
||||
extractPackageMonitor()
|
||||
.onPackageAppeared(packageName, PackageMonitor.PACKAGE_PERMANENT_CHANGE);
|
||||
Robolectric.flushBackgroundThreadScheduler();
|
||||
}
|
||||
|
||||
private void uninstallInputMethodService(String packageName) throws Exception {
|
||||
final ResolveInfo resolveInfoToRemove = buildResolveInfo(packageName, "imeService");
|
||||
final InputMethodInfo serviceToRemove = buildInputMethodInfo(resolveInfoToRemove);
|
||||
|
||||
final List<InputMethodInfo> services = new ArrayList<>();
|
||||
services.addAll(mShadowInputMethodManager.getInputMethodList());
|
||||
services.remove(serviceToRemove);
|
||||
mShadowInputMethodManager.setInputMethodList(services);
|
||||
|
||||
final Intent intent = DynamicIndexableContentMonitor.getIMEServiceIntent(packageName);
|
||||
mRobolectricPackageManager.removeResolveInfosForIntent(intent, packageName);
|
||||
mRobolectricPackageManager.removePackage(packageName);
|
||||
|
||||
extractPackageMonitor()
|
||||
.onPackageDisappeared(packageName, PackageMonitor.PACKAGE_PERMANENT_CHANGE);
|
||||
Robolectric.flushBackgroundThreadScheduler();
|
||||
}
|
||||
|
||||
private AccessibilityServiceInfo buildAccessibilityServiceInfo(String packageName)
|
||||
throws IOException, XmlPullParserException {
|
||||
return new AccessibilityServiceInfo(
|
||||
buildResolveInfo(packageName, "A11yService"), mActivity);
|
||||
}
|
||||
|
||||
private static InputMethodInfo buildInputMethodInfo(ResolveInfo resolveInfo) {
|
||||
return new InputMethodInfo(resolveInfo, false /* isAuxIme */, "SettingsActivity",
|
||||
null /* subtypes */, 0 /* defaultResId */, false /* forceDefault */);
|
||||
}
|
||||
|
||||
private static ResolveInfo buildResolveInfo(String packageName, String className) {
|
||||
final ResolveInfo resolveInfo = new ResolveInfo();
|
||||
resolveInfo.serviceInfo = new ServiceInfo();
|
||||
resolveInfo.serviceInfo.packageName = packageName;
|
||||
resolveInfo.serviceInfo.name = className;
|
||||
// To workaround that RobolectricPackageManager.removeResolveInfosForIntent() only works
|
||||
// for activity/broadcast resolver.
|
||||
resolveInfo.activityInfo = new ActivityInfo();
|
||||
resolveInfo.activityInfo.packageName = packageName;
|
||||
resolveInfo.activityInfo.name = className;
|
||||
|
||||
return resolveInfo;
|
||||
}
|
||||
|
||||
private static boolean isUnderTest(Object object) {
|
||||
return object.getClass().getName().startsWith(
|
||||
DynamicIndexableContentMonitor.class.getName());
|
||||
}
|
||||
}
|
@@ -0,0 +1,173 @@
|
||||
/*
|
||||
* Copyright (C) 2017 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 com.android.settings.search;
|
||||
|
||||
import static android.content.Context.INPUT_METHOD_SERVICE;
|
||||
import static com.android.settings.search.InputDeviceResultLoader.PHYSICAL_KEYBOARD_FRAGMENT;
|
||||
import static com.android.settings.search.InputDeviceResultLoader.VIRTUAL_KEYBOARD_FRAGMENT;
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
import static org.mockito.Matchers.anyInt;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.verifyZeroInteractions;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.ServiceInfo;
|
||||
import android.hardware.input.InputManager;
|
||||
import android.view.InputDevice;
|
||||
import android.view.inputmethod.InputMethodInfo;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.TestConfig;
|
||||
import com.android.settings.dashboard.SiteMapManager;
|
||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||
import com.android.settings.testutils.shadow.ShadowInputDevice;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Answers;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.annotation.Config;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@RunWith(SettingsRobolectricTestRunner.class)
|
||||
@Config(manifest = TestConfig.MANIFEST_PATH,
|
||||
sdk = TestConfig.SDK_VERSION,
|
||||
shadows = {
|
||||
ShadowInputDevice.class
|
||||
})
|
||||
public class InputDeviceResultLoaderTest {
|
||||
|
||||
private static final String QUERY = "test_query";
|
||||
private static final List<String> PHYSICAL_KEYBOARD_BREADCRUMB;
|
||||
private static final List<String> VIRTUAL_KEYBOARD_BREADCRUMB;
|
||||
|
||||
static {
|
||||
PHYSICAL_KEYBOARD_BREADCRUMB = new ArrayList<>();
|
||||
VIRTUAL_KEYBOARD_BREADCRUMB = new ArrayList<>();
|
||||
PHYSICAL_KEYBOARD_BREADCRUMB.add("Settings");
|
||||
PHYSICAL_KEYBOARD_BREADCRUMB.add("physical keyboard");
|
||||
VIRTUAL_KEYBOARD_BREADCRUMB.add("Settings");
|
||||
VIRTUAL_KEYBOARD_BREADCRUMB.add("virtual keyboard");
|
||||
}
|
||||
|
||||
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
||||
private Context mContext;
|
||||
@Mock
|
||||
private SiteMapManager mSiteMapManager;
|
||||
@Mock
|
||||
private InputManager mInputManager;
|
||||
@Mock
|
||||
private InputMethodManager mImm;
|
||||
@Mock
|
||||
private PackageManager mPackageManager;
|
||||
|
||||
private InputDeviceResultLoader mLoader;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
when(mContext.getApplicationContext()).thenReturn(mContext);
|
||||
when(mContext.getSystemService(Context.INPUT_SERVICE))
|
||||
.thenReturn(mInputManager);
|
||||
when(mContext.getSystemService(INPUT_METHOD_SERVICE))
|
||||
.thenReturn(mImm);
|
||||
when(mContext.getPackageManager())
|
||||
.thenReturn(mPackageManager);
|
||||
when(mContext.getString(anyInt()))
|
||||
.thenAnswer(invocation -> RuntimeEnvironment.application.getString(
|
||||
(Integer) invocation.getArguments()[0]));
|
||||
mLoader = new InputDeviceResultLoader(mContext, QUERY, mSiteMapManager);
|
||||
}
|
||||
|
||||
@After
|
||||
public void tearDown() {
|
||||
ShadowInputDevice.reset();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void query_noKeyboard_shouldNotReturnAnything() {
|
||||
assertThat(mLoader.loadInBackground()).isEmpty();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void query_hasPhysicalKeyboard_match() {
|
||||
addPhysicalKeyboard(QUERY);
|
||||
when(mSiteMapManager.buildBreadCrumb(mContext, PHYSICAL_KEYBOARD_FRAGMENT,
|
||||
RuntimeEnvironment.application.getString(R.string.physical_keyboard_title)))
|
||||
.thenReturn(PHYSICAL_KEYBOARD_BREADCRUMB);
|
||||
|
||||
final List<SearchResult> results = new ArrayList<>(mLoader.loadInBackground());
|
||||
|
||||
assertThat(results).hasSize(1);
|
||||
assertThat(results.get(0).title).isEqualTo(QUERY);
|
||||
assertThat(results.get(0).breadcrumbs)
|
||||
.containsExactlyElementsIn(PHYSICAL_KEYBOARD_BREADCRUMB);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void query_hasVirtualKeyboard_match() {
|
||||
addVirtualKeyboard(QUERY);
|
||||
when(mSiteMapManager.buildBreadCrumb(mContext, VIRTUAL_KEYBOARD_FRAGMENT,
|
||||
RuntimeEnvironment.application.getString(R.string.add_virtual_keyboard)))
|
||||
.thenReturn(VIRTUAL_KEYBOARD_BREADCRUMB);
|
||||
|
||||
final List<SearchResult> results = new ArrayList<>(mLoader.loadInBackground());
|
||||
assertThat(results).hasSize(1);
|
||||
assertThat(results.get(0).title).isEqualTo(QUERY);
|
||||
assertThat(results.get(0).breadcrumbs)
|
||||
.containsExactlyElementsIn(VIRTUAL_KEYBOARD_BREADCRUMB);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void query_hasPhysicalVirtualKeyboard_doNotMatch() {
|
||||
addPhysicalKeyboard("abc");
|
||||
addVirtualKeyboard("def");
|
||||
|
||||
assertThat(mLoader.loadInBackground()).isEmpty();
|
||||
verifyZeroInteractions(mSiteMapManager);
|
||||
}
|
||||
|
||||
private void addPhysicalKeyboard(String name) {
|
||||
final InputDevice device = mock(InputDevice.class);
|
||||
when(device.isVirtual()).thenReturn(false);
|
||||
when(device.isFullKeyboard()).thenReturn(true);
|
||||
when(device.getName()).thenReturn(name);
|
||||
ShadowInputDevice.sDeviceIds = new int[]{0};
|
||||
ShadowInputDevice.addDevice(0, device);
|
||||
}
|
||||
|
||||
private void addVirtualKeyboard(String name) {
|
||||
final List<InputMethodInfo> imis = new ArrayList<>();
|
||||
final InputMethodInfo info = mock(InputMethodInfo.class);
|
||||
imis.add(info);
|
||||
when(info.getServiceInfo()).thenReturn(new ServiceInfo());
|
||||
when(info.loadLabel(mPackageManager)).thenReturn(name);
|
||||
info.getServiceInfo().packageName = "pkg";
|
||||
info.getServiceInfo().name = "class";
|
||||
when(mImm.getInputMethodList()).thenReturn(imis);
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Copyright (C) 2017 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 com.android.settings.search;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
public class MockAccessibilityLoader extends AccessibilityServiceResultLoader {
|
||||
|
||||
public MockAccessibilityLoader(Context context) {
|
||||
super(context, "test_query", null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<? extends SearchResult> loadInBackground() {
|
||||
return new HashSet<>();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDiscardResult(Set<? extends SearchResult> result) {
|
||||
|
||||
}
|
||||
}
|
@@ -21,9 +21,8 @@ import android.content.Context;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
public class MockAccessiblityLoader extends AccessibilityServiceResultLoader {
|
||||
|
||||
public MockAccessiblityLoader(Context context) {
|
||||
public class MockInputDeviceResultLoader extends InputDeviceResultLoader {
|
||||
public MockInputDeviceResultLoader(Context context) {
|
||||
super(context, "test_query", null);
|
||||
}
|
||||
|
@@ -17,6 +17,20 @@
|
||||
|
||||
package com.android.settings.search;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
import static org.mockito.ArgumentMatchers.nullable;
|
||||
import static org.mockito.Matchers.any;
|
||||
import static org.mockito.Matchers.anyInt;
|
||||
import static org.mockito.Matchers.anyString;
|
||||
import static org.mockito.Matchers.argThat;
|
||||
import static org.mockito.Matchers.eq;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.app.LoaderManager;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
@@ -28,10 +42,10 @@ import android.view.View;
|
||||
import com.android.internal.logging.nano.MetricsProto;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.SettingsActivity;
|
||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||
import com.android.settings.TestConfig;
|
||||
import com.android.settings.testutils.DatabaseTestUtils;
|
||||
import com.android.settings.testutils.FakeFeatureFactory;
|
||||
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||
import com.android.settings.testutils.shadow.SettingsShadowResources;
|
||||
|
||||
import org.junit.After;
|
||||
@@ -52,20 +66,6 @@ import org.robolectric.util.ReflectionHelpers;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
import static org.mockito.ArgumentMatchers.nullable;
|
||||
import static org.mockito.Matchers.any;
|
||||
import static org.mockito.Matchers.anyInt;
|
||||
import static org.mockito.Matchers.anyString;
|
||||
import static org.mockito.Matchers.argThat;
|
||||
import static org.mockito.Matchers.eq;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
@RunWith(SettingsRobolectricTestRunner.class)
|
||||
@Config(manifest = TestConfig.MANIFEST_PATH,
|
||||
sdk = TestConfig.SDK_VERSION,
|
||||
@@ -83,6 +83,8 @@ public class SearchFragmentTest {
|
||||
private InstalledAppResultLoader mInstalledAppResultLoader;
|
||||
@Mock
|
||||
private AccessibilityServiceResultLoader mAccessibilityServiceResultLoader;
|
||||
@Mock
|
||||
private InputDeviceResultLoader mInputDeviceResultLoader;
|
||||
|
||||
@Mock
|
||||
private SavedQueryLoader mSavedQueryLoader;
|
||||
@@ -118,6 +120,9 @@ public class SearchFragmentTest {
|
||||
when(mFeatureFactory.searchFeatureProvider
|
||||
.getAccessibilityServiceResultLoader(any(Context.class), anyString()))
|
||||
.thenReturn(mAccessibilityServiceResultLoader);
|
||||
when(mFeatureFactory.searchFeatureProvider
|
||||
.getInputDeviceResultLoader(any(Context.class), anyString()))
|
||||
.thenReturn(mInputDeviceResultLoader);
|
||||
when(mFeatureFactory.searchFeatureProvider.getSavedQueryLoader(any(Context.class)))
|
||||
.thenReturn(mSavedQueryLoader);
|
||||
|
||||
@@ -178,6 +183,9 @@ public class SearchFragmentTest {
|
||||
when(mFeatureFactory.searchFeatureProvider
|
||||
.getAccessibilityServiceResultLoader(any(Context.class), anyString()))
|
||||
.thenReturn(mAccessibilityServiceResultLoader);
|
||||
when(mFeatureFactory.searchFeatureProvider
|
||||
.getInputDeviceResultLoader(any(Context.class), anyString()))
|
||||
.thenReturn(mInputDeviceResultLoader);
|
||||
when(mFeatureFactory.searchFeatureProvider.getSavedQueryLoader(any(Context.class)))
|
||||
.thenReturn(mSavedQueryLoader);
|
||||
|
||||
@@ -236,6 +244,9 @@ public class SearchFragmentTest {
|
||||
when(mFeatureFactory.searchFeatureProvider
|
||||
.getAccessibilityServiceResultLoader(any(Context.class), anyString()))
|
||||
.thenReturn(mAccessibilityServiceResultLoader);
|
||||
when(mFeatureFactory.searchFeatureProvider
|
||||
.getInputDeviceResultLoader(any(Context.class), anyString()))
|
||||
.thenReturn(mInputDeviceResultLoader);
|
||||
when(mFeatureFactory.searchFeatureProvider.getSavedQueryLoader(any(Context.class)))
|
||||
.thenReturn(mSavedQueryLoader);
|
||||
ActivityController<SearchActivity> activityController =
|
||||
@@ -270,6 +281,9 @@ public class SearchFragmentTest {
|
||||
when(mFeatureFactory.searchFeatureProvider
|
||||
.getAccessibilityServiceResultLoader(any(Context.class), anyString()))
|
||||
.thenReturn(mAccessibilityServiceResultLoader);
|
||||
when(mFeatureFactory.searchFeatureProvider
|
||||
.getInputDeviceResultLoader(any(Context.class), anyString()))
|
||||
.thenReturn(mInputDeviceResultLoader);
|
||||
when(mFeatureFactory.searchFeatureProvider.getSavedQueryLoader(any(Context.class)))
|
||||
.thenReturn(mSavedQueryLoader);
|
||||
|
||||
@@ -349,7 +363,10 @@ public class SearchFragmentTest {
|
||||
.thenReturn(new MockAppLoader(RuntimeEnvironment.application));
|
||||
when(mFeatureFactory.searchFeatureProvider
|
||||
.getAccessibilityServiceResultLoader(any(Context.class), anyString()))
|
||||
.thenReturn(new MockAccessiblityLoader(RuntimeEnvironment.application));
|
||||
.thenReturn(new MockAccessibilityLoader(RuntimeEnvironment.application));
|
||||
when(mFeatureFactory.searchFeatureProvider
|
||||
.getInputDeviceResultLoader(any(Context.class), anyString()))
|
||||
.thenReturn(new MockInputDeviceResultLoader(RuntimeEnvironment.application));
|
||||
when(mFeatureFactory.searchFeatureProvider.getSavedQueryLoader(any(Context.class)))
|
||||
.thenReturn(mSavedQueryLoader);
|
||||
ActivityController<SearchActivity> activityController =
|
||||
|
@@ -1,22 +0,0 @@
|
||||
package com.android.settings.testutils.shadow;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.os.UserManager;
|
||||
import com.android.settings.search.DynamicIndexableContentMonitor;
|
||||
import org.robolectric.annotation.Implementation;
|
||||
import org.robolectric.annotation.Implements;
|
||||
import org.robolectric.annotation.RealObject;
|
||||
|
||||
/**
|
||||
* A shadow class of {@link DynamicIndexableContentMonitor}. The real implementation of
|
||||
* {@link DynamicIndexableContentMonitor#register} calls {@link UserManager#isUserUnlocked()}, which
|
||||
* Robolectric has not yet been updated to support, so throws a NoSuchMethodError exception.
|
||||
*/
|
||||
// TODO: Delete this once Robolectric is updated to the latest SDK.
|
||||
@Implements(DynamicIndexableContentMonitor.class)
|
||||
public class ShadowDynamicIndexableContentMonitor {
|
||||
|
||||
@Implementation
|
||||
public void register(Activity activity, int loaderId) {
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user