diff --git a/src/com/android/settings/applications/AppInfoWithHeader.java b/src/com/android/settings/applications/AppInfoWithHeader.java index 6129fef2519..bbcec3c0f8a 100644 --- a/src/com/android/settings/applications/AppInfoWithHeader.java +++ b/src/com/android/settings/applications/AppInfoWithHeader.java @@ -22,10 +22,10 @@ import android.support.v7.preference.Preference; import android.util.IconDrawableFactory; import android.util.Log; -import com.android.settings.overlay.FeatureFactory; +import com.android.settings.widget.EntityHeaderController; import com.android.settingslib.applications.AppUtils; -import static com.android.settings.applications.EntityHeaderController.ActionType; +import static com.android.settings.widget.EntityHeaderController.ActionType; public abstract class AppInfoWithHeader extends AppInfoBase { @@ -41,9 +41,8 @@ public abstract class AppInfoWithHeader extends AppInfoBase { mCreated = true; if (mPackageInfo == null) return; final Activity activity = getActivity(); - final Preference pref = FeatureFactory.getFactory(activity) - .getApplicationFeatureProvider(activity) - .newAppHeaderController(this, null /* appHeader */) + final Preference pref = EntityHeaderController + .newInstance(activity, this, null /* header */) .setIcon(IconDrawableFactory.newInstance(activity) .getBadgedIcon(mPackageInfo.applicationInfo)) .setLabel(mPackageInfo.applicationInfo.loadLabel(mPm)) diff --git a/src/com/android/settings/applications/AppOpsDetails.java b/src/com/android/settings/applications/AppOpsDetails.java index 9800ea0281e..b488af696e8 100644 --- a/src/com/android/settings/applications/AppOpsDetails.java +++ b/src/com/android/settings/applications/AppOpsDetails.java @@ -44,6 +44,7 @@ import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.Utils; +import com.android.settings.widget.EntityHeaderController; import java.util.List; diff --git a/src/com/android/settings/applications/ApplicationFeatureProvider.java b/src/com/android/settings/applications/ApplicationFeatureProvider.java index a6d26ebd01a..bff93b8e748 100644 --- a/src/com/android/settings/applications/ApplicationFeatureProvider.java +++ b/src/com/android/settings/applications/ApplicationFeatureProvider.java @@ -27,11 +27,6 @@ import java.util.List; public interface ApplicationFeatureProvider { - /** - * Returns a new {@link EntityHeaderController} instance to customize app header. - */ - EntityHeaderController newAppHeaderController(Fragment fragment, View appHeader); - /** * Returns a new {@link InstantAppButtonsController} instance for showing buttons * only relevant to instant apps. diff --git a/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java b/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java index cdbbeb6cf65..36e0965e101 100644 --- a/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java +++ b/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java @@ -52,11 +52,6 @@ public class ApplicationFeatureProviderImpl implements ApplicationFeatureProvide mUm = UserManager.get(mContext); } - @Override - public EntityHeaderController newAppHeaderController(Fragment fragment, View appHeader) { - return new EntityHeaderController(mContext, fragment, appHeader); - } - @Override public InstantAppButtonsController newInstantAppButtonsController(Fragment fragment, View view, InstantAppButtonsController.ShowDialogDelegate showDialogDelegate) { diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java index 1ff4a03073f..3021f7560c2 100755 --- a/src/com/android/settings/applications/InstalledAppDetails.java +++ b/src/com/android/settings/applications/InstalledAppDetails.java @@ -91,6 +91,7 @@ import com.android.settings.notification.AppNotificationSettings; import com.android.settings.notification.NotificationBackend; import com.android.settings.notification.NotificationBackend.AppRow; import com.android.settings.overlay.FeatureFactory; +import com.android.settings.widget.EntityHeaderController; import com.android.settingslib.AppItem; import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.applications.AppUtils; @@ -406,9 +407,7 @@ public class InstalledAppDetails extends AppInfoBase final Activity activity = getActivity(); mHeader = (LayoutPreference) findPreference(KEY_HEADER); mActionButtons = (LayoutPreference) findPreference(KEY_ACTION_BUTTONS); - FeatureFactory.getFactory(activity) - .getApplicationFeatureProvider(activity) - .newAppHeaderController(this, mHeader.findViewById(R.id.entity_header)) + EntityHeaderController.newInstance(activity, this, mHeader.findViewById(R.id.entity_header)) .setPackageName(mPackageName) .setButtonActions(EntityHeaderController.ActionType.ACTION_APP_PREFERENCE, EntityHeaderController.ActionType.ACTION_NONE) @@ -585,9 +584,7 @@ public class InstalledAppDetails extends AppInfoBase final boolean isInstantApp = AppUtils.isInstant(mPackageInfo.applicationInfo); final CharSequence summary = isInstantApp ? null : getString(Utils.getInstallationStatus(mAppEntry.info)); - FeatureFactory.getFactory(activity) - .getApplicationFeatureProvider(activity) - .newAppHeaderController(this, appSnippet) + EntityHeaderController.newInstance(activity, this, appSnippet) .setLabel(mAppEntry) .setIcon(mAppEntry) .setSummary(summary) diff --git a/src/com/android/settings/applications/ProcessStatsDetail.java b/src/com/android/settings/applications/ProcessStatsDetail.java index 0313239b288..9f229afa1f4 100644 --- a/src/com/android/settings/applications/ProcessStatsDetail.java +++ b/src/com/android/settings/applications/ProcessStatsDetail.java @@ -16,8 +16,6 @@ package com.android.settings.applications; -import static com.android.settings.applications.EntityHeaderController.ActionType; - import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager.RunningServiceInfo; @@ -53,7 +51,7 @@ import com.android.settings.R; import com.android.settings.SettingsPreferenceFragment; import com.android.settings.SummaryPreference; import com.android.settings.applications.ProcStatsEntry.Service; -import com.android.settings.overlay.FeatureFactory; +import com.android.settings.widget.EntityHeaderController; import java.util.ArrayList; import java.util.Collections; @@ -61,6 +59,8 @@ import java.util.Comparator; import java.util.HashMap; import java.util.List; +import static com.android.settings.widget.EntityHeaderController.ActionType; + public class ProcessStatsDetail extends SettingsPreferenceFragment { private static final String TAG = "ProcessStatsDetail"; @@ -126,9 +126,8 @@ public class ProcessStatsDetail extends SettingsPreferenceFragment { return; } final Activity activity = getActivity(); - final Preference pref = FeatureFactory.getFactory(activity) - .getApplicationFeatureProvider(activity) - .newAppHeaderController(this, null /* appHeader */) + final Preference pref = EntityHeaderController + .newInstance(activity, this, null /* appHeader */) .setIcon(mApp.mUiTargetApp != null ? IconDrawableFactory.newInstance(activity).getBadgedIcon(mApp.mUiTargetApp) : new ColorDrawable(0)) diff --git a/src/com/android/settings/datausage/AppDataUsage.java b/src/com/android/settings/datausage/AppDataUsage.java index 0aa08422cb8..a47e1357533 100644 --- a/src/com/android/settings/datausage/AppDataUsage.java +++ b/src/com/android/settings/datausage/AppDataUsage.java @@ -41,9 +41,8 @@ import android.widget.AdapterView; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; -import com.android.settings.applications.EntityHeaderController; import com.android.settings.applications.AppInfoBase; -import com.android.settings.overlay.FeatureFactory; +import com.android.settings.widget.EntityHeaderController; import com.android.settingslib.AppItem; import com.android.settingslib.net.ChartData; import com.android.settingslib.net.ChartDataLoader; @@ -326,9 +325,8 @@ public class AppDataUsage extends DataUsageBase implements Preference.OnPreferen final boolean showInfoButton = mAppItem.key > 0; final Activity activity = getActivity(); - final Preference pref = FeatureFactory.getFactory(activity) - .getApplicationFeatureProvider(activity) - .newAppHeaderController(this, null /* appHeader */) + final Preference pref = EntityHeaderController + .newInstance(activity, this, null /* header */) .setButtonActions(showInfoButton ? EntityHeaderController.ActionType.ACTION_APP_INFO : EntityHeaderController.ActionType.ACTION_NONE, diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java index 456a5112547..18223410831 100644 --- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java +++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java @@ -37,13 +37,12 @@ import com.android.internal.util.ArrayUtils; import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.Utils; -import com.android.settings.applications.EntityHeaderController; import com.android.settings.applications.LayoutPreference; import com.android.settings.core.PreferenceController; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.enterprise.DevicePolicyManagerWrapper; import com.android.settings.enterprise.DevicePolicyManagerWrapperImpl; -import com.android.settings.overlay.FeatureFactory; +import com.android.settings.widget.EntityHeaderController; import com.android.settingslib.applications.AppUtils; import com.android.settingslib.applications.ApplicationsState; @@ -183,9 +182,8 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements final View appSnippet = mHeaderPreference.findViewById(R.id.entity_header); final Activity context = getActivity(); final Bundle bundle = getArguments(); - EntityHeaderController controller = FeatureFactory.getFactory(context) - .getApplicationFeatureProvider(context) - .newAppHeaderController(this, appSnippet) + EntityHeaderController controller = EntityHeaderController + .newInstance(context, this, appSnippet) .setButtonActions(EntityHeaderController.ActionType.ACTION_NONE, EntityHeaderController.ActionType.ACTION_NONE); diff --git a/src/com/android/settings/notification/AppNotificationSettings.java b/src/com/android/settings/notification/AppNotificationSettings.java index 3a4e1c91a17..92ad3f1e814 100644 --- a/src/com/android/settings/notification/AppNotificationSettings.java +++ b/src/com/android/settings/notification/AppNotificationSettings.java @@ -38,10 +38,9 @@ import com.android.settings.AppHeader; import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.applications.AppInfoBase; -import com.android.settings.applications.EntityHeaderController; import com.android.settings.applications.LayoutPreference; import com.android.settings.notification.NotificationBackend.AppRow; -import com.android.settings.overlay.FeatureFactory; +import com.android.settings.widget.EntityHeaderController; import com.android.settings.widget.MasterSwitchPreference; import com.android.settings.widget.SwitchBar; import com.android.settingslib.RestrictedSwitchPreference; @@ -127,13 +126,12 @@ public class AppNotificationSettings extends NotificationSettingsBase { } private void addHeaderPref() { - ArrayMap rows = new ArrayMap(); + ArrayMap rows = new ArrayMap<>(); rows.put(mAppRow.pkg, mAppRow); collectConfigActivities(rows); final Activity activity = getActivity(); - final Preference pref = FeatureFactory.getFactory(activity) - .getApplicationFeatureProvider(activity) - .newAppHeaderController(this /* fragment */, null /* appHeader */) + final Preference pref = EntityHeaderController + .newInstance(activity, this /* fragment */, null /* header */) .setIcon(mAppRow.icon) .setLabel(mAppRow.label) .setPackageName(mAppRow.pkg) diff --git a/src/com/android/settings/notification/ChannelNotificationSettings.java b/src/com/android/settings/notification/ChannelNotificationSettings.java index 6984c212601..85a56baa609 100644 --- a/src/com/android/settings/notification/ChannelNotificationSettings.java +++ b/src/com/android/settings/notification/ChannelNotificationSettings.java @@ -16,10 +16,6 @@ package com.android.settings.notification; -import static android.app.NotificationManager.IMPORTANCE_LOW; -import static android.app.NotificationManager.IMPORTANCE_NONE; -import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED; - import android.app.Activity; import android.app.NotificationChannel; import android.app.NotificationManager; @@ -40,14 +36,17 @@ import com.android.settings.AppHeader; import com.android.settings.R; import com.android.settings.RingtonePreference; import com.android.settings.Utils; -import com.android.settings.applications.EntityHeaderController; import com.android.settings.applications.AppInfoBase; import com.android.settings.applications.LayoutPreference; -import com.android.settings.overlay.FeatureFactory; +import com.android.settings.widget.EntityHeaderController; import com.android.settings.widget.SwitchBar; import com.android.settingslib.RestrictedSwitchPreference; import com.android.settingslib.widget.FooterPreference; +import static android.app.NotificationManager.IMPORTANCE_LOW; +import static android.app.NotificationManager.IMPORTANCE_NONE; +import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED; + public class ChannelNotificationSettings extends NotificationSettingsBase { private static final String TAG = "ChannelSettings"; @@ -107,13 +106,12 @@ public class ChannelNotificationSettings extends NotificationSettingsBase { } private void addHeaderPref() { - ArrayMap rows = new ArrayMap(); + ArrayMap rows = new ArrayMap<>(); rows.put(mAppRow.pkg, mAppRow); collectConfigActivities(rows); final Activity activity = getActivity(); - final Preference pref = FeatureFactory.getFactory(activity) - .getApplicationFeatureProvider(activity) - .newAppHeaderController(this /* fragment */, null /* appHeader */) + final Preference pref = EntityHeaderController + .newInstance(activity, this /* fragment */, null /* header */) .setIcon(mAppRow.icon) .setLabel(mChannel.getName()) .setSummary(mAppRow.label) diff --git a/src/com/android/settings/overlay/FeatureFactory.java b/src/com/android/settings/overlay/FeatureFactory.java index 6f1d35051d6..60893b29790 100644 --- a/src/com/android/settings/overlay/FeatureFactory.java +++ b/src/com/android/settings/overlay/FeatureFactory.java @@ -30,8 +30,8 @@ import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider; import com.android.settings.fuelgauge.PowerUsageFeatureProvider; import com.android.settings.gestures.AssistGestureFeatureProvider; import com.android.settings.localepicker.LocaleFeatureProvider; -import com.android.settings.security.SecurityFeatureProvider; import com.android.settings.search2.SearchFeatureProvider; +import com.android.settings.security.SecurityFeatureProvider; import com.android.settings.users.UserFeatureProvider; /** diff --git a/src/com/android/settings/applications/EntityHeaderController.java b/src/com/android/settings/widget/EntityHeaderController.java similarity index 84% rename from src/com/android/settings/applications/EntityHeaderController.java rename to src/com/android/settings/widget/EntityHeaderController.java index 98658b13ef4..d5231776f67 100644 --- a/src/com/android/settings/applications/EntityHeaderController.java +++ b/src/com/android/settings/widget/EntityHeaderController.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.settings.applications; +package com.android.settings.widget; import android.annotation.IdRes; import android.annotation.UserIdInt; @@ -41,6 +41,9 @@ import android.widget.TextView; import com.android.settings.AppHeader; import com.android.settings.R; import com.android.settings.Utils; +import com.android.settings.applications.AppInfoBase; +import com.android.settings.applications.InstalledAppDetails; +import com.android.settings.applications.LayoutPreference; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.applications.ApplicationsState; @@ -84,7 +87,18 @@ public class EntityHeaderController { private boolean mIsInstantApp; - public EntityHeaderController(Context context, Fragment fragment, View header) { + /** + * Creates a new instance of the controller. + * + * @param fragment The fragment that header will be placed in. + * @param header Optional: header view if it's already created. + */ + public static EntityHeaderController newInstance(Context context, Fragment fragment, + View header) { + return new EntityHeaderController(context.getApplicationContext(), fragment, header); + } + + private EntityHeaderController(Context context, Fragment fragment, View header) { mContext = context; mFragment = fragment; mMetricsCategory = FeatureFactory.getFactory(context).getMetricsFeatureProvider() @@ -245,9 +259,16 @@ public class EntityHeaderController { button.setContentDescription( mContext.getString(R.string.application_info_label)); button.setImageResource(com.android.settings.R.drawable.ic_info); - button.setOnClickListener(v -> AppInfoBase.startAppInfoFragment( - InstalledAppDetails.class, R.string.application_info_label, - mPackageName, mUid, mFragment, 0 /* request */, mMetricsCategory)); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + AppInfoBase.startAppInfoFragment( + InstalledAppDetails.class, R.string.application_info_label, + mPackageName, mUid, mFragment, 0 /* request */, + mMetricsCategory); + + } + }); button.setVisibility(View.VISIBLE); } return; @@ -256,7 +277,12 @@ public class EntityHeaderController { if (mAppNotifPrefIntent == null) { button.setVisibility(View.GONE); } else { - button.setOnClickListener(v -> mFragment.startActivity(mAppNotifPrefIntent)); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mFragment.startActivity(mAppNotifPrefIntent); + } + }); button.setVisibility(View.VISIBLE); } return; @@ -268,7 +294,12 @@ public class EntityHeaderController { button.setVisibility(View.GONE); return; } - button.setOnClickListener(v -> mFragment.startActivity(intent)); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mFragment.startActivity(intent); + } + }); button.setVisibility(View.VISIBLE); return; } diff --git a/tests/robotests/src/com/android/settings/applications/AppInfoWithHeaderTest.java b/tests/robotests/src/com/android/settings/applications/AppInfoWithHeaderTest.java index c8a782e9343..5a526e724ee 100644 --- a/tests/robotests/src/com/android/settings/applications/AppInfoWithHeaderTest.java +++ b/tests/robotests/src/com/android/settings/applications/AppInfoWithHeaderTest.java @@ -28,9 +28,12 @@ import com.android.internal.logging.nano.MetricsProto; import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.testutils.FakeFeatureFactory; +import com.android.settings.testutils.shadow.ShadowEntityHeaderController; +import com.android.settings.widget.EntityHeaderController; import com.android.settingslib.applications.AppUtils; import com.android.settingslib.applications.instantapps.InstantAppDataProvider; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -47,10 +50,13 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(SettingsRobolectricTestRunner.class) -@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, + shadows = ShadowEntityHeaderController.class) public class AppInfoWithHeaderTest { @Mock(answer = Answers.RETURNS_DEEP_STUBS) private Context mContext; + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private EntityHeaderController mHeaderController; private FakeFeatureFactory mFactory; private TestFragment mAppInfoWithHeader; @@ -64,16 +70,16 @@ public class AppInfoWithHeaderTest { when(mFactory.metricsFeatureProvider.getMetricsCategory(any(Object.class))) .thenReturn(MetricsProto.MetricsEvent.SETTINGS_APP_NOTIF_CATEGORY); mAppInfoWithHeader = new TestFragment(); + ShadowEntityHeaderController.setUseMock(mHeaderController); + } + + @After + public void tearDown() { + ShadowEntityHeaderController.reset(); } @Test public void testAppHeaderIsAdded() { - final EntityHeaderController entityHeaderController = new EntityHeaderController( - ShadowApplication.getInstance().getApplicationContext(), - mAppInfoWithHeader, - null); - when(mFactory.applicationFeatureProvider.newAppHeaderController(mAppInfoWithHeader, null)) - .thenReturn(entityHeaderController); mAppInfoWithHeader.onActivityCreated(null); verify(mAppInfoWithHeader.mScreen).addPreference(any(LayoutPreference.class)); @@ -93,7 +99,7 @@ public class AppInfoWithHeaderTest { mPackageInfo.applicationInfo = new ApplicationInfo(); mShadowContext = ShadowApplication.getInstance().getApplicationContext(); ReflectionHelpers.setStaticField(AppUtils.class, "sInstantAppDataProvider", - (InstantAppDataProvider) (info -> false)); + (InstantAppDataProvider) (info -> false)); when(mManager.getContext()).thenReturn(mShadowContext); } diff --git a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java index 6edbe351d5b..2d0f0318188 100644 --- a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java +++ b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java @@ -25,11 +25,13 @@ import android.view.View; import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; -import com.android.settings.applications.EntityHeaderController; -import com.android.settings.applications.EntityHeaderController.ActionType; import com.android.settings.testutils.FakeFeatureFactory; +import com.android.settings.testutils.shadow.ShadowEntityHeaderController; +import com.android.settings.widget.EntityHeaderController; +import com.android.settings.widget.EntityHeaderController.ActionType; import com.android.settingslib.AppItem; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -45,28 +47,33 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; 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) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, + shadows = ShadowEntityHeaderController.class) public class AppDataUsageTest { @Mock(answer = Answers.RETURNS_DEEP_STUBS) private Context mContext; @Mock(answer = Answers.RETURNS_DEEP_STUBS) private EntityHeaderController mHeaderController; - private FakeFeatureFactory mFeatureFactory; + private AppDataUsage mFragment; @Before public void setUp() { MockitoAnnotations.initMocks(this); FakeFeatureFactory.setupForTest(mContext); - mFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext); + } + + @After + public void tearDown() { + ShadowEntityHeaderController.reset(); } @Test public void bindAppHeader_allWorkApps_shouldNotShowAppInfoLink() { + ShadowEntityHeaderController.setUseMock(mHeaderController); mFragment = spy(new AppDataUsage()); doReturn(mock(PreferenceManager.class, RETURNS_DEEP_STUBS)) @@ -74,8 +81,6 @@ public class AppDataUsageTest { .getPreferenceManager(); doReturn(mock(PreferenceScreen.class)).when(mFragment).getPreferenceScreen(); ReflectionHelpers.setField(mFragment, "mAppItem", mock(AppItem.class)); - when(mFeatureFactory.applicationFeatureProvider.newAppHeaderController(mFragment, null)) - .thenReturn(mHeaderController); mFragment.onViewCreated(new View(RuntimeEnvironment.application), new Bundle()); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java index 5762e76c0b1..7b2d8cc63ac 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java @@ -17,27 +17,27 @@ package com.android.settings.fuelgauge; import android.app.Activity; -import android.app.Fragment; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; import android.os.BatteryStats; import android.os.Bundle; -import android.view.View; import com.android.internal.os.BatterySipper; import com.android.internal.os.BatteryStatsHelper; import com.android.settings.SettingsActivity; import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; -import com.android.settings.applications.EntityHeaderController; import com.android.settings.applications.LayoutPreference; import com.android.settings.testutils.FakeFeatureFactory; +import com.android.settings.testutils.shadow.ShadowEntityHeaderController; +import com.android.settings.widget.EntityHeaderController; import com.android.settingslib.applications.AppUtils; import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.applications.instantapps.InstantAppDataProvider; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -64,7 +64,8 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; @RunWith(SettingsRobolectricTestRunner.class) -@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, + shadows = ShadowEntityHeaderController.class) public class AdvancedPowerUsageDetailTest { private static final String APP_LABEL = "app label"; private static final String SUMMARY = "summary"; @@ -120,8 +121,7 @@ public class AdvancedPowerUsageDetailTest { doReturn(APP_LABEL).when(mBundle).getString(anyString()); doReturn(mBundle).when(mFragment).getArguments(); - doReturn(mEntityHeaderController).when(mFeatureFactory.applicationFeatureProvider) - .newAppHeaderController(any(Fragment.class), any(View.class)); + ShadowEntityHeaderController.setUseMock(mEntityHeaderController); doReturn(mEntityHeaderController).when(mEntityHeaderController) .setButtonActions(anyInt(), anyInt()); doReturn(mEntityHeaderController).when(mEntityHeaderController) @@ -165,6 +165,11 @@ public class AdvancedPowerUsageDetailTest { captor.capture(), anyInt(), any(), any()); } + @After + public void reset() { + ShadowEntityHeaderController.reset(); + } + @Test public void testInitHeader_NoAppEntry_BuildByBundle() { mFragment.mAppEntry = null; diff --git a/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java b/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java index aedb289d20b..195e0075ecd 100644 --- a/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java +++ b/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java @@ -16,15 +16,6 @@ package com.android.settings.language; -import static com.google.common.truth.Truth.assertThat; -import static org.mockito.Matchers.any; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; -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.Activity; import android.app.admin.DevicePolicyManager; import android.content.ComponentName; @@ -44,7 +35,6 @@ import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.core.PreferenceController; import com.android.settings.dashboard.SummaryLoader; -import com.android.settings.fuelgauge.PowerUsageSummary; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.XmlTestUtils; import com.android.settings.testutils.shadow.ShadowSecureSettings; @@ -63,6 +53,15 @@ 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.Matchers.any; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +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) public class LanguageAndInputSettingsTest { diff --git a/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java b/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java index 65bb3898073..6085c1ea01c 100644 --- a/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java +++ b/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java @@ -28,14 +28,13 @@ import com.android.settings.gestures.AssistGestureFeatureProvider; import com.android.settings.localepicker.LocaleFeatureProvider; import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.SupportFeatureProvider; -import com.android.settings.security.SecurityFeatureProvider; -import com.android.settings.search2.SearchFeatureProvider; import com.android.settings.overlay.SurveyFeatureProvider; +import com.android.settings.search2.SearchFeatureProvider; +import com.android.settings.security.SecurityFeatureProvider; import com.android.settings.users.UserFeatureProvider; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.mockingDetails; import static org.mockito.Mockito.when; /** @@ -64,7 +63,7 @@ public class FakeFeatureFactory extends FeatureFactory { * * @param context The context must be a deep mock. */ - public static void setupForTest(Context context) { + public static FakeFeatureFactory setupForTest(Context context) { sFactory = null; when(context.getString(com.android.settings.R.string.config_featureFactory)) .thenReturn(FakeFeatureFactory.class.getName()); @@ -74,6 +73,7 @@ public class FakeFeatureFactory extends FeatureFactory { } catch (ClassNotFoundException e) { // Ignore. } + return (FakeFeatureFactory) FakeFeatureFactory.getFactory(context); } /** diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowEntityHeaderController.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowEntityHeaderController.java new file mode 100644 index 00000000000..bccb2972d4e --- /dev/null +++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowEntityHeaderController.java @@ -0,0 +1,49 @@ +/* + * 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.testutils.shadow; + +import android.app.Fragment; +import android.content.Context; +import android.view.View; + +import com.android.settings.widget.EntityHeaderController; + +import org.robolectric.annotation.Implementation; +import org.robolectric.annotation.Implements; +import org.robolectric.annotation.Resetter; + +@Implements(value = EntityHeaderController.class, callThroughByDefault = false) +public class ShadowEntityHeaderController { + + private static EntityHeaderController sMockController; + + public static void setUseMock(EntityHeaderController mockController) { + sMockController = mockController; + } + + @Resetter + public static void reset() { + sMockController = null; + } + + @Implementation + public static EntityHeaderController newInstance(Context context, Fragment fragment, + View header) { + return sMockController; + } + +} diff --git a/tests/robotests/src/com/android/settings/applications/EntityHeaderControllerTest.java b/tests/robotests/src/com/android/settings/widget/EntityHeaderControllerTest.java similarity index 86% rename from tests/robotests/src/com/android/settings/applications/EntityHeaderControllerTest.java rename to tests/robotests/src/com/android/settings/widget/EntityHeaderControllerTest.java index e2e0fa0c027..e6c742a72a2 100644 --- a/tests/robotests/src/com/android/settings/applications/EntityHeaderControllerTest.java +++ b/tests/robotests/src/com/android/settings/widget/EntityHeaderControllerTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.settings.applications; +package com.android.settings.widget; import android.app.ActionBar; @@ -35,6 +35,8 @@ import android.widget.TextView; import com.android.settings.R; import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; +import com.android.settings.applications.LayoutPreference; +import com.android.settings.testutils.FakeFeatureFactory; import org.junit.Before; import org.junit.Test; @@ -64,16 +66,19 @@ public class EntityHeaderControllerTest { @Mock private Fragment mFragment; + private FakeFeatureFactory mFeatureFactory; private Context mShadowContext; private LayoutInflater mLayoutInflater; private PackageInfo mInfo; private EntityHeaderController mController; - @Before public void setUp() { MockitoAnnotations.initMocks(this); + FakeFeatureFactory.setupForTest(mContext); + mFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext); mShadowContext = RuntimeEnvironment.application; + when(mContext.getApplicationContext()).thenReturn(mContext); when(mFragment.getContext()).thenReturn(mShadowContext); mLayoutInflater = LayoutInflater.from(mShadowContext); mInfo = new PackageInfo(); @@ -82,7 +87,7 @@ public class EntityHeaderControllerTest { @Test public void testBuildView_constructedWithoutView_shouldCreateNewView() { - mController = new EntityHeaderController(mShadowContext, mFragment, null); + mController = EntityHeaderController.newInstance(mShadowContext, mFragment, null); View view = mController.done(mActivity); assertThat(view).isNotNull(); @@ -90,7 +95,7 @@ public class EntityHeaderControllerTest { @Test public void testBuildView_withContext_shouldBuildPreference() { - mController = new EntityHeaderController(mShadowContext, mFragment, null); + mController = EntityHeaderController.newInstance(mShadowContext, mFragment, null); Preference preference = mController.done(mActivity, mShadowContext); assertThat(preference instanceof LayoutPreference).isTrue(); @@ -99,7 +104,7 @@ public class EntityHeaderControllerTest { @Test public void testBuildView_constructedWithView_shouldReturnSameView() { View inputView = mLayoutInflater.inflate(R.layout.settings_entity_header, null /* root */); - mController = new EntityHeaderController(mShadowContext, mFragment, inputView); + mController = EntityHeaderController.newInstance(mShadowContext, mFragment, inputView); View view = mController.done(mActivity); assertThat(view).isSameAs(inputView); @@ -113,7 +118,7 @@ public class EntityHeaderControllerTest { final TextView label = header.findViewById(R.id.entity_header_title); final TextView version = header.findViewById(R.id.entity_header_summary); - mController = new EntityHeaderController(mShadowContext, mFragment, header); + mController = EntityHeaderController.newInstance(mShadowContext, mFragment, header); mController.setLabel(testString); mController.setSummary(testString); mController.setIcon(mShadowContext.getDrawable(R.drawable.ic_add)); @@ -134,7 +139,7 @@ public class EntityHeaderControllerTest { when(mContext.getPackageManager().resolveActivity(any(Intent.class), anyInt())) .thenReturn(info); - mController = new EntityHeaderController(mContext, mFragment, appLinks); + mController = EntityHeaderController.newInstance(mContext, mFragment, appLinks); mController.setButtonActions( EntityHeaderController.ActionType.ACTION_APP_PREFERENCE, EntityHeaderController.ActionType.ACTION_NONE); @@ -159,7 +164,7 @@ public class EntityHeaderControllerTest { when(mContext.getPackageManager().resolveActivity(any(Intent.class), anyInt())) .thenReturn(null); - mController = new EntityHeaderController(mContext, mFragment, appLinks); + mController = EntityHeaderController.newInstance(mContext, mFragment, appLinks); mController.setButtonActions( EntityHeaderController.ActionType.ACTION_APP_PREFERENCE, EntityHeaderController.ActionType.ACTION_NONE); @@ -176,7 +181,7 @@ public class EntityHeaderControllerTest { final View appLinks = mLayoutInflater .inflate(R.layout.settings_entity_header, null /* root */); - mController = new EntityHeaderController(mContext, mFragment, appLinks); + mController = EntityHeaderController.newInstance(mContext, mFragment, appLinks); mController.setPackageName(null) .setButtonActions( EntityHeaderController.ActionType.ACTION_APP_INFO, @@ -195,7 +200,7 @@ public class EntityHeaderControllerTest { .inflate(R.layout.settings_entity_header, null /* root */); when(mFragment.getActivity()).thenReturn(mock(Activity.class)); - mController = new EntityHeaderController(mContext, mFragment, appLinks); + mController = EntityHeaderController.newInstance(mContext, mFragment, appLinks); mController.setPackageName("123") .setUid(UserHandle.USER_SYSTEM) .setButtonActions( @@ -216,7 +221,7 @@ public class EntityHeaderControllerTest { when(mFragment.getActivity()).thenReturn(mock(Activity.class)); when(mContext.getString(eq(R.string.application_info_label))).thenReturn("App Info"); - mController = new EntityHeaderController(mContext, mFragment, appLinks); + mController = EntityHeaderController.newInstance(mContext, mFragment, appLinks); mController.setPackageName("123") .setUid(UserHandle.USER_SYSTEM) .setButtonActions( @@ -233,7 +238,7 @@ public class EntityHeaderControllerTest { final View appLinks = mLayoutInflater .inflate(R.layout.settings_entity_header, null /* root */); - mController = new EntityHeaderController(mContext, mFragment, appLinks); + mController = EntityHeaderController.newInstance(mContext, mFragment, appLinks); mController.setAppNotifPrefIntent(new Intent()) .setButtonActions( EntityHeaderController.ActionType.ACTION_NOTIF_PREFERENCE, @@ -252,7 +257,7 @@ public class EntityHeaderControllerTest { public void instantApps_normalAppsDontGetLabel() { final View header = mLayoutInflater.inflate( R.layout.settings_entity_header, null /* root */); - mController = new EntityHeaderController(mContext, mFragment, header); + mController = EntityHeaderController.newInstance(mContext, mFragment, header); mController.done(mActivity); assertThat(header.findViewById(R.id.install_type).getVisibility()) @@ -264,7 +269,7 @@ public class EntityHeaderControllerTest { public void instantApps_expectedHeaderItem() { final View header = mLayoutInflater.inflate( R.layout.settings_entity_header, null /* root */); - mController = new EntityHeaderController(mContext, mFragment, header); + mController = EntityHeaderController.newInstance(mContext, mFragment, header); mController.setIsInstantApp(true); mController.done(mActivity); TextView label = header.findViewById(R.id.install_type); @@ -278,7 +283,7 @@ public class EntityHeaderControllerTest { @Test public void styleActionBar_invalidObjects_shouldNotCrash() { - mController = new EntityHeaderController(mShadowContext, mFragment, null); + mController = EntityHeaderController.newInstance(mShadowContext, mFragment, null); mController.styleActionBar(null); when(mActivity.getActionBar()).thenReturn(null); @@ -291,7 +296,7 @@ public class EntityHeaderControllerTest { public void styleActionBar_setElevationAndBackground() { final ActionBar actionBar = mActivity.getActionBar(); - mController = new EntityHeaderController(mShadowContext, mFragment, null); + mController = EntityHeaderController.newInstance(mShadowContext, mFragment, null); mController.styleActionBar(mActivity); verify(actionBar).setElevation(0); @@ -302,7 +307,7 @@ public class EntityHeaderControllerTest { @Test public void initAppHeaderController_appHeaderNull_useFragmentContext() { - mController = new EntityHeaderController(mContext, mFragment, null); + mController = EntityHeaderController.newInstance(mContext, mFragment, null); // Fragment.getContext() is invoked to inflate the view verify(mFragment).getContext();