Migrate system settings page to PreferenceController and SettingsFragment.
Because ExtraSettingsLoader was migrated but this fragment was not, loading extra settings was no longer working on this page and blocking other development.
Bug: 112931076
Test: build and deploy, RunCarSettingsRoboTests
Change-Id: Ida9824cf189a3ecb25e2669401b0ad853fb9df28
diff --git a/res/values/preference_keys.xml b/res/values/preference_keys.xml
index ff44902..4d5fc91 100644
--- a/res/values/preference_keys.xml
+++ b/res/values/preference_keys.xml
@@ -127,6 +127,7 @@
<string name="pk_pin_lock" translatable="false">pin_lock</string>
<!-- System Settings -->
+ <string name="pk_languages_and_input_settings" translatable="false">languages_and_input_settings</string>
<string name="pk_system_update_settings" translatable="false">system_update_settings</string>
<string name="pk_system_extra_settings" translatable="false">system_extra_settings</string>
<string name="pk_about_settings_entry" translatable="false">about_settings_entry</string>
diff --git a/res/xml/system_settings_fragment.xml b/res/xml/system_settings_fragment.xml
index 75a175e..76da737 100644
--- a/res/xml/system_settings_fragment.xml
+++ b/res/xml/system_settings_fragment.xml
@@ -21,9 +21,10 @@
android:title="@string/system_setting_title">
<Preference
android:fragment="com.android.car.settings.language.LanguagesAndInputFragment"
+ android:key="@string/pk_languages_and_input_settings"
android:icon="@drawable/ic_language"
android:title="@string/languages_and_input_settings"
- settings:controller="com.android.car.settings.common.NoSetupPreferenceController"/>
+ settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
<Preference
android:icon="@drawable/ic_system_update"
android:key="@string/pk_system_update_settings"
@@ -50,14 +51,14 @@
android:icon="@drawable/ic_settings_about"
android:key="@string/pk_legal_information_entry"
android:title="@string/legal_information"
- settings:controller="com.android.car.settings.common.NoSetupPreferenceController"/>
+ settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
<Preference
android:fragment="com.android.car.settings.system.ResetOptionsFragment"
android:icon="@drawable/ic_restore"
android:key="@string/pk_reset_options_entry"
android:summary="@string/reset_options_summary"
android:title="@string/reset_options_title"
- settings:controller="com.android.car.settings.common.NoSetupPreferenceController"/>
+ settings:controller="com.android.car.settings.common.DefaultRestrictionsPreferenceController"/>
<Preference
android:fragment="com.android.car.settings.development.DeveloperOptionsFragment"
android:icon="@drawable/ic_settings_development"
diff --git a/src/com/android/car/settings/Utils.java b/src/com/android/car/settings/Utils.java
index 99c8701..ca1b11e 100644
--- a/src/com/android/car/settings/Utils.java
+++ b/src/com/android/car/settings/Utils.java
@@ -23,7 +23,6 @@
import android.content.pm.ResolveInfo;
import androidx.preference.Preference;
-import androidx.preference.PreferenceGroup;
import java.util.List;
@@ -36,23 +35,16 @@
public static final int UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY = 1;
/**
- * Finds a matching activity for a preference's intent. If no matching activity is found, the
- * preference is removed from the parent group.
+ * Finds a matching activity for a preference's intent. If found, the preference's intent is
+ * updated to that activity. Only activities in the system image are considered.
*
- * @param context the context
- * @param parentPreferenceGroup the preference group that contains the preference whose
- * intent is being resolved
- * @param preferenceKey the key of the preference whose intent is being resolved
- * @param flags 0 or one or more of
- * {@link #UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY}
- * @return {@code true} if an activity was found. If {@code false}, the preference was removed.
+ * @param context the context to use.
+ * @param preference the preference whose intent is being resolved.
+ * @param flags 0 or {@link #UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY}.
+ * @return {@code true} if an activity was found and the preference was updated.
*/
- public static boolean updatePreferenceToSpecificActivityOrRemove(Context context,
- PreferenceGroup parentPreferenceGroup, String preferenceKey, int flags) {
- Preference preference = parentPreferenceGroup.findPreference(preferenceKey);
- if (preference == null) {
- return false;
- }
+ public static boolean updatePreferenceToSpecificActivity(Context context, Preference preference,
+ int flags) {
Intent intent = preference.getIntent();
if (intent != null) {
// Find the activity that is in the system image.
@@ -75,8 +67,6 @@
}
}
}
- // Did not find a matching activity, so remove the preference
- parentPreferenceGroup.removePreference(preference);
return false;
}
}
diff --git a/src/com/android/car/settings/system/AboutSettingsEntryPreferenceController.java b/src/com/android/car/settings/system/AboutSettingsEntryPreferenceController.java
index 42f59c6..8f13d9f 100644
--- a/src/com/android/car/settings/system/AboutSettingsEntryPreferenceController.java
+++ b/src/com/android/car/settings/system/AboutSettingsEntryPreferenceController.java
@@ -16,23 +16,32 @@
package com.android.car.settings.system;
+import android.car.drivingstate.CarUxRestrictions;
import android.content.Context;
import android.os.Build;
+import androidx.preference.Preference;
+
import com.android.car.settings.R;
import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.common.NoSetupPreferenceController;
+import com.android.car.settings.common.PreferenceController;
/** Updates the about settings entry summary with the build version. */
-public class AboutSettingsEntryPreferenceController extends NoSetupPreferenceController {
+public class AboutSettingsEntryPreferenceController extends PreferenceController<Preference> {
public AboutSettingsEntryPreferenceController(Context context, String preferenceKey,
- FragmentController fragmentController) {
- super(context, preferenceKey, fragmentController);
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
}
@Override
- public CharSequence getSummary() {
- return mContext.getString(R.string.about_summary, Build.VERSION.RELEASE);
+ protected Class<Preference> getPreferenceType() {
+ return Preference.class;
+ }
+
+ @Override
+ protected void updateState(Preference preference) {
+ preference.setSummary(
+ getContext().getString(R.string.about_summary, Build.VERSION.RELEASE));
}
}
diff --git a/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceController.java b/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceController.java
index 7cf27f8..9b2b22b 100644
--- a/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceController.java
+++ b/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceController.java
@@ -16,28 +16,35 @@
package com.android.car.settings.system;
+import android.car.drivingstate.CarUxRestrictions;
import android.car.userlib.CarUserManagerHelper;
import android.content.Context;
+import androidx.preference.Preference;
+
import com.android.car.settings.common.FragmentController;
-import com.android.car.settings.common.NoSetupPreferenceController;
+import com.android.car.settings.common.PreferenceController;
import com.android.car.settings.development.DevelopmentSettingsUtil;
/** Controls the visibility of the developer options setting. */
-public class DeveloperOptionsEntryPreferenceController extends NoSetupPreferenceController {
+public class DeveloperOptionsEntryPreferenceController extends PreferenceController<Preference> {
private CarUserManagerHelper mCarUserManagerHelper;
- public DeveloperOptionsEntryPreferenceController(Context context,
- String preferenceKey,
- FragmentController fragmentController) {
- super(context, preferenceKey, fragmentController);
- mCarUserManagerHelper = new CarUserManagerHelper(mContext);
+ public DeveloperOptionsEntryPreferenceController(Context context, String preferenceKey,
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
+ mCarUserManagerHelper = new CarUserManagerHelper(context);
}
@Override
- public int getAvailabilityStatus() {
- return DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(mContext, mCarUserManagerHelper)
- ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
+ protected Class<Preference> getPreferenceType() {
+ return Preference.class;
+ }
+
+ @Override
+ protected int getAvailabilityStatus() {
+ return DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(getContext(),
+ mCarUserManagerHelper) ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
}
}
diff --git a/src/com/android/car/settings/system/SystemSettingsFragment.java b/src/com/android/car/settings/system/SystemSettingsFragment.java
index 85c1d1c..5b5efc2 100644
--- a/src/com/android/car/settings/system/SystemSettingsFragment.java
+++ b/src/com/android/car/settings/system/SystemSettingsFragment.java
@@ -17,12 +17,12 @@
package com.android.car.settings.system;
import com.android.car.settings.R;
-import com.android.car.settings.common.BasePreferenceFragment;
+import com.android.car.settings.common.SettingsFragment;
/**
* Shows basic info about the system and provide some actions like update, reset etc.
*/
-public class SystemSettingsFragment extends BasePreferenceFragment {
+public class SystemSettingsFragment extends SettingsFragment {
@Override
protected int getPreferenceScreenResId() {
diff --git a/src/com/android/car/settings/system/SystemUpdatePreferenceController.java b/src/com/android/car/settings/system/SystemUpdatePreferenceController.java
index 7f28af1..9a29e47 100644
--- a/src/com/android/car/settings/system/SystemUpdatePreferenceController.java
+++ b/src/com/android/car/settings/system/SystemUpdatePreferenceController.java
@@ -18,6 +18,7 @@
import static android.content.Context.CARRIER_CONFIG_SERVICE;
+import android.car.drivingstate.CarUxRestrictions;
import android.car.userlib.CarUserManagerHelper;
import android.content.Context;
import android.content.Intent;
@@ -26,13 +27,12 @@
import android.text.TextUtils;
import androidx.preference.Preference;
-import androidx.preference.PreferenceScreen;
import com.android.car.settings.R;
import com.android.car.settings.Utils;
import com.android.car.settings.common.FragmentController;
import com.android.car.settings.common.Logger;
-import com.android.car.settings.common.NoSetupPreferenceController;
+import com.android.car.settings.common.PreferenceController;
/**
* Controller which determines if the system update preference should be displayed based on
@@ -41,46 +41,52 @@
*
* @see CarrierConfigManager#KEY_CI_ACTION_ON_SYS_UPDATE_BOOL
*/
-public class SystemUpdatePreferenceController extends NoSetupPreferenceController {
+public class SystemUpdatePreferenceController extends PreferenceController<Preference> {
private static final Logger LOG = new Logger(SystemUpdatePreferenceController.class);
private final CarUserManagerHelper mCarUserManagerHelper;
+ private boolean mActivityFound;
public SystemUpdatePreferenceController(Context context, String preferenceKey,
- FragmentController fragmentController) {
- super(context, preferenceKey, fragmentController);
+ FragmentController fragmentController, CarUxRestrictions uxRestrictions) {
+ super(context, preferenceKey, fragmentController, uxRestrictions);
mCarUserManagerHelper = new CarUserManagerHelper(context);
}
@Override
- public int getAvailabilityStatus() {
- if (!mContext.getResources().getBoolean(R.bool.config_show_system_update_settings)) {
+ protected Class<Preference> getPreferenceType() {
+ return Preference.class;
+ }
+
+ @Override
+ protected int getAvailabilityStatus() {
+ if (!getContext().getResources().getBoolean(R.bool.config_show_system_update_settings)) {
return UNSUPPORTED_ON_DEVICE;
}
return mCarUserManagerHelper.isCurrentProcessAdminUser() ? AVAILABLE : DISABLED_FOR_USER;
}
@Override
- public void displayPreference(PreferenceScreen screen) {
- super.displayPreference(screen);
- if (isAvailable()) {
- Utils.updatePreferenceToSpecificActivityOrRemove(mContext, screen, getPreferenceKey(),
- Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY);
- }
+ protected void onCreateInternal() {
+ mActivityFound = Utils.updatePreferenceToSpecificActivity(getContext(), getPreference(),
+ Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY);
}
@Override
- public boolean handlePreferenceTreeClick(Preference preference) {
- if (TextUtils.equals(getPreferenceKey(), preference.getKey())) {
- CarrierConfigManager configManager = (CarrierConfigManager) mContext.getSystemService(
- CARRIER_CONFIG_SERVICE);
- PersistableBundle b = configManager.getConfig();
- if (b != null && b.getBoolean(CarrierConfigManager.KEY_CI_ACTION_ON_SYS_UPDATE_BOOL)) {
- ciActionOnSysUpdate(b);
- }
+ protected void updateState(Preference preference) {
+ preference.setVisible(mActivityFound);
+ }
+
+ @Override
+ protected boolean handlePreferenceClicked(Preference preference) {
+ CarrierConfigManager configManager = (CarrierConfigManager) getContext().getSystemService(
+ CARRIER_CONFIG_SERVICE);
+ PersistableBundle b = configManager.getConfig();
+ if (b != null && b.getBoolean(CarrierConfigManager.KEY_CI_ACTION_ON_SYS_UPDATE_BOOL)) {
+ ciActionOnSysUpdate(b);
}
- // Return false as to not block other handlers.
+ // Don't handle so that preference framework will launch the preference intent.
return false;
}
@@ -100,7 +106,7 @@
}
LOG.d("ciActionOnSysUpdate: broadcasting intent " + intentStr + " with extra " + extra
+ ", " + extraVal);
- mContext.getApplicationContext().sendBroadcast(intent);
+ getContext().getApplicationContext().sendBroadcast(intent);
}
}
}
diff --git a/tests/robotests/src/com/android/car/settings/UtilsTest.java b/tests/robotests/src/com/android/car/settings/UtilsTest.java
index 9103dfc..ea00c87 100644
--- a/tests/robotests/src/com/android/car/settings/UtilsTest.java
+++ b/tests/robotests/src/com/android/car/settings/UtilsTest.java
@@ -18,10 +18,6 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -31,7 +27,6 @@
import android.content.pm.ResolveInfo;
import androidx.preference.Preference;
-import androidx.preference.PreferenceGroup;
import org.junit.Before;
import org.junit.Test;
@@ -52,7 +47,7 @@
}
@Test
- public void updatePreferenceToSpecificActivityOrRemove_activityFound_updatesComponent() {
+ public void updatePreferenceToSpecificActivity_activityFound_updatesComponent() {
// Arrange
ApplicationInfo applicationInfo = new ApplicationInfo();
applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
@@ -69,15 +64,11 @@
ShadowPackageManager packageManager = Shadows.shadowOf(mContext.getPackageManager());
packageManager.addResolveInfoForIntent(intent, resolveInfo);
- PreferenceGroup group = mock(PreferenceGroup.class);
Preference preference = new Preference(mContext);
- preference.setKey("key");
preference.setIntent(intent);
- when(group.findPreference(preference.getKey())).thenReturn(preference);
// Act
- assertThat(Utils.updatePreferenceToSpecificActivityOrRemove(mContext, group,
- preference.getKey(), /* flags= */ 0)).isTrue();
+ Utils.updatePreferenceToSpecificActivity(mContext, preference, /* flags= */ 0);
// Assert
Intent updatedIntent = preference.getIntent();
@@ -87,7 +78,31 @@
}
@Test
- public void updatePreferenceToSpecificActivityOrRemove_setTitleFlag_updatesTitle() {
+ public void updatePreferenceToSpecificActivity_activityFound_returnsTrue() {
+ ApplicationInfo applicationInfo = new ApplicationInfo();
+ applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
+
+ ActivityInfo activityInfo = new ActivityInfo();
+ activityInfo.applicationInfo = applicationInfo;
+ activityInfo.packageName = "some.test.package";
+ activityInfo.name = "SomeActivity";
+
+ ResolveInfo resolveInfo = new ResolveInfo();
+ resolveInfo.activityInfo = activityInfo;
+
+ Intent intent = new Intent();
+ ShadowPackageManager packageManager = Shadows.shadowOf(mContext.getPackageManager());
+ packageManager.addResolveInfoForIntent(intent, resolveInfo);
+
+ Preference preference = new Preference(mContext);
+ preference.setIntent(intent);
+
+ assertThat(Utils.updatePreferenceToSpecificActivity(mContext, preference, /* flags= */
+ 0)).isTrue();
+ }
+
+ @Test
+ public void updatePreferenceToSpecificActivity_setTitleFlag_updatesTitle() {
// Arrange
ApplicationInfo applicationInfo = new ApplicationInfo();
applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
@@ -110,15 +125,11 @@
ShadowPackageManager packageManager = Shadows.shadowOf(mContext.getPackageManager());
packageManager.addResolveInfoForIntent(intent, resolveInfo);
- PreferenceGroup group = mock(PreferenceGroup.class);
Preference preference = new Preference(mContext);
- preference.setKey("key");
preference.setIntent(intent);
- when(group.findPreference(preference.getKey())).thenReturn(preference);
// Act
- assertThat(Utils.updatePreferenceToSpecificActivityOrRemove(mContext, group,
- preference.getKey(),
+ assertThat(Utils.updatePreferenceToSpecificActivity(mContext, preference,
Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY)).isTrue();
// Assert
@@ -126,18 +137,12 @@
}
@Test
- public void updatePreferenceToSpecificActivityOrRemove_activityNotFound_removesPreference() {
+ public void updatePreferenceToSpecificActivityOrRemove_activityNotFound_returnsFalse() {
Intent intent = new Intent();
- PreferenceGroup group = mock(PreferenceGroup.class);
Preference preference = new Preference(mContext);
- preference.setKey("key");
preference.setIntent(intent);
- when(group.findPreference(preference.getKey())).thenReturn(preference);
- assertThat(Utils.updatePreferenceToSpecificActivityOrRemove(mContext, group,
- preference.getKey(),
+ assertThat(Utils.updatePreferenceToSpecificActivity(mContext, preference,
Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY)).isFalse();
-
- verify(group).removePreference(preference);
}
}
diff --git a/tests/robotests/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceControllerTest.java
index f4b6291..7baf1a3 100644
--- a/tests/robotests/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceControllerTest.java
@@ -21,7 +21,6 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import android.car.userlib.CarUserManagerHelper;
@@ -33,7 +32,7 @@
import androidx.preference.Preference;
import com.android.car.settings.CarSettingsRobolectricTestRunner;
-import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
import org.junit.After;
@@ -49,11 +48,8 @@
@Config(shadows = {ShadowCarUserManagerHelper.class})
public class DeveloperOptionsEntryPreferenceControllerTest {
- private static final String PREFERENCE_KEY = "preference_key";
-
private Context mContext;
private DeveloperOptionsEntryPreferenceController mController;
- private Preference mPreference;
private UserInfo mUserInfo;
@Mock
private CarUserManagerHelper mShadowCarUserManagerHelper;
@@ -63,10 +59,9 @@
MockitoAnnotations.initMocks(this);
ShadowCarUserManagerHelper.setMockInstance(mShadowCarUserManagerHelper);
mContext = RuntimeEnvironment.application;
- mController = new DeveloperOptionsEntryPreferenceController(mContext, PREFERENCE_KEY,
- mock(FragmentController.class));
- mPreference = new Preference(mContext);
- mPreference.setKey(PREFERENCE_KEY);
+ mController = new PreferenceControllerTestHelper<>(mContext,
+ DeveloperOptionsEntryPreferenceController.class,
+ new Preference(mContext)).getController();
// Setup admin user who is able to enable developer settings.
mUserInfo = new UserInfo();
diff --git a/tests/robotests/src/com/android/car/settings/system/SystemUpdatePreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/SystemUpdatePreferenceControllerTest.java
index 2b58165..b87488a 100644
--- a/tests/robotests/src/com/android/car/settings/system/SystemUpdatePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/system/SystemUpdatePreferenceControllerTest.java
@@ -21,32 +21,39 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import android.car.userlib.CarUserManagerHelper;
import android.content.Context;
import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
import android.os.PersistableBundle;
import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager;
+import androidx.lifecycle.Lifecycle;
import androidx.preference.Preference;
import com.android.car.settings.CarSettingsRobolectricTestRunner;
-import com.android.car.settings.common.FragmentController;
+import com.android.car.settings.common.PreferenceControllerTestHelper;
import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
import com.android.car.settings.testutils.ShadowCarrierConfigManager;
+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.RuntimeEnvironment;
+import org.robolectric.Shadows;
import org.robolectric.annotation.Config;
import org.robolectric.shadow.api.Shadow;
import org.robolectric.shadows.ShadowApplication;
+import org.robolectric.shadows.ShadowPackageManager;
import java.util.List;
@@ -55,21 +62,29 @@
@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowCarrierConfigManager.class})
public class SystemUpdatePreferenceControllerTest {
- private static final String PREFERENCE_KEY = "preference_key";
-
@Mock
private CarUserManagerHelper mCarUserManagerHelper;
private Context mContext;
+ private Preference mPreference;
+ private PreferenceControllerTestHelper<SystemUpdatePreferenceController> mControllerHelper;
private SystemUpdatePreferenceController mController;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+ when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(true);
mContext = RuntimeEnvironment.application;
- mController = new SystemUpdatePreferenceController(mContext, PREFERENCE_KEY,
- mock(FragmentController.class));
+ mPreference = new Preference(mContext);
+ mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
+ SystemUpdatePreferenceController.class, mPreference);
+ mController = mControllerHelper.getController();
+ }
+
+ @After
+ public void tearDown() {
+ ShadowCarUserManagerHelper.reset();
}
@Test
@@ -87,7 +102,46 @@
}
@Test
- public void handlePreferenceTreeClick_triggersClientInitiatedAction() {
+ public void onCreate_setsActivityLabelAsTitle() {
+ ApplicationInfo applicationInfo = new ApplicationInfo();
+ applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
+
+ ActivityInfo activityInfo = new ActivityInfo();
+ activityInfo.applicationInfo = applicationInfo;
+ activityInfo.packageName = "some.test.package";
+ activityInfo.name = "SomeActivity";
+
+ String label = "Activity Label";
+ ResolveInfo resolveInfo = new ResolveInfo() {
+ @Override
+ public CharSequence loadLabel(PackageManager pm) {
+ return label;
+ }
+ };
+ resolveInfo.activityInfo = activityInfo;
+
+ Intent intent = new Intent();
+ ShadowPackageManager packageManager = Shadows.shadowOf(mContext.getPackageManager());
+ packageManager.addResolveInfoForIntent(intent, resolveInfo);
+ mPreference.setIntent(intent);
+
+ mControllerHelper.markState(Lifecycle.State.CREATED);
+
+ assertThat(mPreference.getTitle()).isEqualTo(label);
+ }
+
+ @Test
+ public void refreshUi_activityNotFount_hidesPreference() {
+ mPreference.setIntent(new Intent());
+ mControllerHelper.markState(Lifecycle.State.STARTED);
+
+ mController.refreshUi();
+
+ assertThat(mPreference.isVisible()).isFalse();
+ }
+
+ @Test
+ public void preferenceClicked_triggersClientInitiatedAction() {
// Arrange
String action = "action";
String key = "key";
@@ -99,16 +153,13 @@
config.putString(CarrierConfigManager.KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_STRING, key);
config.putString(CarrierConfigManager.KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_VAL_STRING, value);
- ShadowCarrierConfigManager shadowCarrierConfigManager = Shadow.extract(
- mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE));
- shadowCarrierConfigManager.setConfigForSubId(SubscriptionManager.getDefaultSubscriptionId(),
- config);
+ getShadowCarrierConfigManager().setConfigForSubId(
+ SubscriptionManager.getDefaultSubscriptionId(), config);
- Preference preference = new Preference(mContext);
- preference.setKey(PREFERENCE_KEY);
+ mControllerHelper.markState(Lifecycle.State.STARTED);
// Act
- mController.handlePreferenceTreeClick(preference);
+ mPreference.performClick();
// Assert
List<Intent> broadcasts = ShadowApplication.getInstance().getBroadcastIntents();
@@ -117,4 +168,15 @@
assertThat(broadcast.getAction()).isEqualTo(action);
assertThat(broadcast.getStringExtra(key)).isEqualTo(value);
}
+
+ @Test
+ public void preferenceClicked_handledReturnsFalse() {
+ mControllerHelper.markState(Lifecycle.State.STARTED);
+ assertThat(mPreference.getOnPreferenceClickListener().onPreferenceClick(
+ mPreference)).isFalse();
+ }
+
+ private ShadowCarrierConfigManager getShadowCarrierConfigManager() {
+ return Shadow.extract(mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE));
+ }
}