From 5c3301b0abf2f407de802143b0f711bf59064c8f Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Mon, 28 Jan 2019 13:10:32 -0800 Subject: [PATCH] Add configs to display/hide a few tiles in device info page - Displaying/hiding Emergency info, branded account, device header widget are now driven by config flags - Also refactored controllers to use BasePreferenceController Change-Id: Ie601ebf689e0744c6a05a2cca5513fa43ef355e0 Fixes: 119607340 Test: robotests --- res/values/config.xml | 9 +++++ res/xml/my_device_info.xml | 13 ++++--- .../EmergencyInfoPreferenceController.java | 38 +++++++++---------- .../BrandedAccountPreferenceController.java | 11 ++++-- .../DeviceNamePreferenceController.java | 13 ++----- .../aboutphone/MyDeviceInfoFragment.java | 34 +++++++---------- ...pLevelAboutDevicePreferenceController.java | 2 +- tests/robotests/res/values-mcc999/config.xml | 3 ++ ...EmergencyInfoPreferenceControllerTest.java | 7 +++- ...randedAccountPreferenceControllerTest.java | 38 +++++++++++++------ .../DeviceNamePreferenceControllerTest.java | 8 ++-- 11 files changed, 100 insertions(+), 76 deletions(-) diff --git a/res/values/config.xml b/res/values/config.xml index a6e5e1ce332..e6856ac782e 100755 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -143,6 +143,15 @@ false + + true + + + true + + + true + true diff --git a/res/xml/my_device_info.xml b/res/xml/my_device_info.xml index d66997764f3..6323a14cc93 100644 --- a/res/xml/my_device_info.xml +++ b/res/xml/my_device_info.xml @@ -25,7 +25,8 @@ android:key="my_device_info_header" android:order="0" android:layout="@layout/settings_entity_header" - android:selectable="false"/> + android:selectable="false" + settings:isPreferenceVisible="false"/> @@ -40,7 +42,8 @@ android:key="branded_account" android:order="2" android:title="@string/my_device_info_account_preference_title" - android:summary="@string/summary_placeholder"/> + android:summary="@string/summary_placeholder" + settings:controller="com.android.settings.deviceinfo.BrandedAccountPreferenceController"/> + android:summary="@string/summary_placeholder" + settings:controller="com.android.settings.accounts.EmergencyInfoPreferenceController"/> infos = mContext.getPackageManager().queryIntentActivities(intent, 0); - return infos != null && !infos.isEmpty(); + public int getAvailabilityStatus() { + if (!mContext.getResources().getBoolean(R.bool.config_show_emergency_info_in_device_info)) { + return UNSUPPORTED_ON_DEVICE; + } + final Intent intent = new Intent(getIntentAction(mContext)).setPackage( + getPackageName(mContext)); + final List infos = mContext.getPackageManager().queryIntentActivities(intent, + 0); + return infos != null && !infos.isEmpty() + ? AVAILABLE : UNSUPPORTED_ON_DEVICE; } - @Override - public String getPreferenceKey() { - return KEY_EMERGENCY_INFO; - } - - private String getIntentAction(Context context) { + private static String getIntentAction(Context context) { if (FeatureFlagUtils.isEnabled(context, FeatureFlagUtils.SAFETY_HUB)) { return context.getResources().getString(R.string.config_emergency_intent_action); } @@ -93,7 +93,7 @@ public class EmergencyInfoPreferenceController extends AbstractPreferenceControl return ACTION_EDIT_EMERGENCY_INFO; } - private String getPackageName(Context context) { + private static String getPackageName(Context context) { if (FeatureFlagUtils.isEnabled(context, FeatureFlagUtils.SAFETY_HUB)) { return context.getResources().getString(R.string.config_emergency_package_name); } diff --git a/src/com/android/settings/deviceinfo/BrandedAccountPreferenceController.java b/src/com/android/settings/deviceinfo/BrandedAccountPreferenceController.java index b54b3980686..bdd76fca2ae 100644 --- a/src/com/android/settings/deviceinfo/BrandedAccountPreferenceController.java +++ b/src/com/android/settings/deviceinfo/BrandedAccountPreferenceController.java @@ -32,11 +32,10 @@ import com.android.settings.core.SubSettingLauncher; import com.android.settings.overlay.FeatureFactory; public class BrandedAccountPreferenceController extends BasePreferenceController { - private static final String KEY_PREFERENCE_TITLE = "branded_account"; private final Account[] mAccounts; - public BrandedAccountPreferenceController(Context context) { - super(context, KEY_PREFERENCE_TITLE); + public BrandedAccountPreferenceController(Context context, String key) { + super(context, key); final AccountFeatureProvider accountFeatureProvider = FeatureFactory.getFactory( mContext).getAccountFeatureProvider(); mAccounts = accountFeatureProvider.getAccounts(mContext); @@ -44,6 +43,10 @@ public class BrandedAccountPreferenceController extends BasePreferenceController @Override public int getAvailabilityStatus() { + if (!mContext.getResources().getBoolean( + R.bool.config_show_branded_account_in_device_info)) { + return UNSUPPORTED_ON_DEVICE; + } if (mAccounts != null && mAccounts.length > 0) { return AVAILABLE; } @@ -55,7 +58,7 @@ public class BrandedAccountPreferenceController extends BasePreferenceController super.displayPreference(screen); final AccountFeatureProvider accountFeatureProvider = FeatureFactory.getFactory( mContext).getAccountFeatureProvider(); - final Preference accountPreference = screen.findPreference(KEY_PREFERENCE_TITLE); + final Preference accountPreference = screen.findPreference(getPreferenceKey()); if (accountPreference != null && (mAccounts == null || mAccounts.length == 0)) { screen.removePreference(accountPreference); return; diff --git a/src/com/android/settings/deviceinfo/DeviceNamePreferenceController.java b/src/com/android/settings/deviceinfo/DeviceNamePreferenceController.java index 0d7b1d313cb..fb20a2e6520 100644 --- a/src/com/android/settings/deviceinfo/DeviceNamePreferenceController.java +++ b/src/com/android/settings/deviceinfo/DeviceNamePreferenceController.java @@ -43,8 +43,6 @@ public class DeviceNamePreferenceController extends BasePreferenceController LifecycleObserver, OnSaveInstanceState, OnCreate { - private static final String PREF_KEY = "device_name"; - public static final int DEVICE_NAME_SET_WARNING_ID = 1; private static final String KEY_PENDING_DEVICE_NAME = "key_pending_device_name"; private String mDeviceName; protected WifiManager mWifiManager; @@ -54,8 +52,8 @@ public class DeviceNamePreferenceController extends BasePreferenceController private DeviceNamePreferenceHost mHost; private String mPendingDeviceName; - public DeviceNamePreferenceController(Context context) { - super(context, PREF_KEY); + public DeviceNamePreferenceController(Context context, String key) { + super(context, key); mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); mWifiDeviceNameTextValidator = new WifiDeviceNameTextValidator(); @@ -67,7 +65,7 @@ public class DeviceNamePreferenceController extends BasePreferenceController @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); - mPreference = (ValidatedEditTextPreference) screen.findPreference(PREF_KEY); + mPreference = screen.findPreference(getPreferenceKey()); final CharSequence deviceName = getSummary(); mPreference.setSummary(deviceName); mPreference.setText(deviceName.toString()); @@ -94,11 +92,6 @@ public class DeviceNamePreferenceController extends BasePreferenceController : UNSUPPORTED_ON_DEVICE; } - @Override - public String getPreferenceKey() { - return PREF_KEY; - } - @Override public boolean onPreferenceChange(Preference preference, Object newValue) { mPendingDeviceName = (String) newValue; diff --git a/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java b/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java index b61cb3c0ade..0116c42258a 100644 --- a/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java +++ b/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java @@ -28,10 +28,8 @@ import android.view.View; import com.android.settings.R; import com.android.settings.Utils; -import com.android.settings.accounts.EmergencyInfoPreferenceController; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.deviceinfo.BluetoothAddressPreferenceController; -import com.android.settings.deviceinfo.BrandedAccountPreferenceController; import com.android.settings.deviceinfo.BuildNumberPreferenceController; import com.android.settings.deviceinfo.DeviceModelPreferenceController; import com.android.settings.deviceinfo.DeviceNamePreferenceController; @@ -82,6 +80,7 @@ public class MyDeviceInfoFragment extends DashboardFragment use(FirmwareVersionPreferenceController.class).setHost(this /* parent */); use(DeviceModelPreferenceController.class).setHost(this /* parent */); use(ImeiInfoPreferenceController.class).setHost(this /* parent */); + use(DeviceNamePreferenceController.class).setHost(this /* parent */); mBuildNumberPreferenceController = use(BuildNumberPreferenceController.class); mBuildNumberPreferenceController.setHost(this /* parent */); } @@ -104,23 +103,12 @@ public class MyDeviceInfoFragment extends DashboardFragment @Override protected List createPreferenceControllers(Context context) { - return buildPreferenceControllers(context, getActivity(), this /* fragment */, - getSettingsLifecycle()); + return buildPreferenceControllers(context, this /* fragment */, getSettingsLifecycle()); } private static List buildPreferenceControllers( - Context context, Activity activity, MyDeviceInfoFragment fragment, - Lifecycle lifecycle) { + Context context, MyDeviceInfoFragment fragment, Lifecycle lifecycle) { final List controllers = new ArrayList<>(); - controllers.add(new EmergencyInfoPreferenceController(context)); - controllers.add(new BrandedAccountPreferenceController(context)); - DeviceNamePreferenceController deviceNamePreferenceController = - new DeviceNamePreferenceController(context); - deviceNamePreferenceController.setHost(fragment); - if (lifecycle != null) { - lifecycle.addObserver(deviceNamePreferenceController); - } - controllers.add(deviceNamePreferenceController); controllers.add(new SimStatusPreferenceController(context, fragment)); controllers.add(new IpAddressPreferenceController(context, lifecycle)); controllers.add(new WifiMacAddressPreferenceController(context, lifecycle)); @@ -145,12 +133,18 @@ public class MyDeviceInfoFragment extends DashboardFragment private void initHeader() { // TODO: Migrate into its own controller. final LayoutPreference headerPreference = - (LayoutPreference) getPreferenceScreen().findPreference(KEY_MY_DEVICE_INFO_HEADER); - final View appSnippet = headerPreference.findViewById(R.id.entity_header); + getPreferenceScreen().findPreference(KEY_MY_DEVICE_INFO_HEADER); + final boolean shouldDisplayHeader = getContext().getResources().getBoolean( + R.bool.config_show_device_header_in_device_info); + headerPreference.setVisible(shouldDisplayHeader); + if (!shouldDisplayHeader) { + return; + } + final View headerView = headerPreference.findViewById(R.id.entity_header); final Activity context = getActivity(); final Bundle bundle = getArguments(); final EntityHeaderController controller = EntityHeaderController - .newInstance(context, this, appSnippet) + .newInstance(context, this, headerView) .setRecyclerView(getListView(), getSettingsLifecycle()) .setButtonActions(EntityHeaderController.ActionType.ACTION_NONE, EntityHeaderController.ActionType.ACTION_NONE); @@ -197,8 +191,8 @@ public class MyDeviceInfoFragment extends DashboardFragment @Override public List createPreferenceControllers( Context context) { - return buildPreferenceControllers(context, null /* activity */, - null /* fragment */, null /* lifecycle */); + return buildPreferenceControllers(context, null /* fragment */, + null /* lifecycle */); } }; } diff --git a/src/com/android/settings/deviceinfo/aboutphone/TopLevelAboutDevicePreferenceController.java b/src/com/android/settings/deviceinfo/aboutphone/TopLevelAboutDevicePreferenceController.java index d2ffd0dbae0..dbee4430e7e 100644 --- a/src/com/android/settings/deviceinfo/aboutphone/TopLevelAboutDevicePreferenceController.java +++ b/src/com/android/settings/deviceinfo/aboutphone/TopLevelAboutDevicePreferenceController.java @@ -35,7 +35,7 @@ public class TopLevelAboutDevicePreferenceController extends BasePreferenceContr @Override public CharSequence getSummary() { final DeviceNamePreferenceController deviceNamePreferenceController = - new DeviceNamePreferenceController(mContext); + new DeviceNamePreferenceController(mContext, "dummy_key"); return deviceNamePreferenceController.getSummary(); } } diff --git a/tests/robotests/res/values-mcc999/config.xml b/tests/robotests/res/values-mcc999/config.xml index 101a6b813f4..da7127372fd 100644 --- a/tests/robotests/res/values-mcc999/config.xml +++ b/tests/robotests/res/values-mcc999/config.xml @@ -67,10 +67,13 @@ false false true + false + false false + fake_package/fake_service diff --git a/tests/robotests/src/com/android/settings/accounts/EmergencyInfoPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accounts/EmergencyInfoPreferenceControllerTest.java index 5901f55edb0..65da1f7c30b 100644 --- a/tests/robotests/src/com/android/settings/accounts/EmergencyInfoPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accounts/EmergencyInfoPreferenceControllerTest.java @@ -70,10 +70,12 @@ public class EmergencyInfoPreferenceControllerTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); - mController = new EmergencyInfoPreferenceController(mContext); + mController = new EmergencyInfoPreferenceController(mContext, "test_key"); mPreference = new Preference(Robolectric.setupActivity(Activity.class)); mPreference.setKey(mController.getPreferenceKey()); when(mScreen.findPreference(mPreference.getKey())).thenReturn(mPreference); + when(mContext.getResources().getBoolean(R.bool.config_show_emergency_info_in_device_info)) + .thenReturn(true); } @After @@ -104,6 +106,7 @@ public class EmergencyInfoPreferenceControllerTest { mController.updateRawDataToIndex(data); + assertThat(mController.isAvailable()).isTrue(); assertThat(data).isNotEmpty(); } @@ -152,7 +155,7 @@ public class EmergencyInfoPreferenceControllerTest { final Activity activity = Robolectric.setupActivity(Activity.class); final Preference preference = new Preference(activity); preference.setKey("emergency_info"); - mController = new EmergencyInfoPreferenceController(activity); + mController = new EmergencyInfoPreferenceController(activity, preference.getKey()); mController.handlePreferenceTreeClick(preference); diff --git a/tests/robotests/src/com/android/settings/deviceinfo/BrandedAccountPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/BrandedAccountPreferenceControllerTest.java index 564acfdd0fb..87dcb3371c6 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/BrandedAccountPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/BrandedAccountPreferenceControllerTest.java @@ -29,36 +29,52 @@ import com.android.settings.testutils.FakeFeatureFactory; 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.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; @RunWith(RobolectricTestRunner.class) public class BrandedAccountPreferenceControllerTest { - @Mock(answer = Answers.RETURNS_DEEP_STUBS) private Context mContext; - private BrandedAccountPreferenceController mController; private FakeFeatureFactory fakeFeatureFactory; @Before public void setUp() { MockitoAnnotations.initMocks(this); + mContext = RuntimeEnvironment.application; fakeFeatureFactory = FakeFeatureFactory.setupForTest(); - mController = new BrandedAccountPreferenceController(mContext); + } @Test - public void isAvailable_defaultOff() { - assertThat(mController.isAvailable()).isFalse(); + public void isAvailable_configOn_noAccount_off() { + final BrandedAccountPreferenceController controller = + new BrandedAccountPreferenceController(mContext, "test_key"); + assertThat(controller.isAvailable()).isFalse(); } @Test - public void isAvailable_onWhenAccountIsAvailable() { + public void isAvailable_accountIsAvailable_on() { when(fakeFeatureFactory.mAccountFeatureProvider.getAccounts(any(Context.class))) - .thenReturn(new Account[] {new Account("fake@account.foo", "fake.reallyfake")}); - mController = new BrandedAccountPreferenceController(mContext); - assertThat(mController.isAvailable()).isTrue(); + .thenReturn(new Account[]{new Account("fake@account.foo", "fake.reallyfake")}); + + final BrandedAccountPreferenceController controller = + new BrandedAccountPreferenceController(mContext, "test_key"); + + assertThat(controller.isAvailable()).isTrue(); + } + + @Test + @Config(qualifiers = "mcc999") + public void isAvailable_configOff_hasAccount_off() { + when(fakeFeatureFactory.mAccountFeatureProvider.getAccounts(any(Context.class))) + .thenReturn(new Account[]{new Account("fake@account.foo", "fake.reallyfake")}); + + final BrandedAccountPreferenceController controller = + new BrandedAccountPreferenceController(mContext, "test_key"); + + assertThat(controller.isAvailable()).isFalse(); } } diff --git a/tests/robotests/src/com/android/settings/deviceinfo/DeviceNamePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/DeviceNamePreferenceControllerTest.java index 5eb011449d2..21c0e744d9d 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/DeviceNamePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/DeviceNamePreferenceControllerTest.java @@ -75,7 +75,7 @@ public class DeviceNamePreferenceControllerTest { configuration.SSID = "test-ap"; when(mWifiManager.getWifiApConfiguration()).thenReturn(configuration); - mController = new DeviceNamePreferenceController(mContext); + mController = new DeviceNamePreferenceController(mContext, "test_key"); mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); } @@ -99,17 +99,17 @@ public class DeviceNamePreferenceControllerTest { public void constructor_deviceNameLoadedIfSet() { Settings.Global.putString( mContext.getContentResolver(), Settings.Global.DEVICE_NAME, "Test"); - mController = new DeviceNamePreferenceController(mContext); + mController = new DeviceNamePreferenceController(mContext, "test_key"); assertThat(mController.getSummary()).isEqualTo("Test"); } @Test - public void isTextValid_nameUnder33CharactersIsValid() { + public void isTextValid_nameUnder33Characters_isValid() { assertThat(mController.isTextValid("12345678901234567890123456789012")).isTrue(); } @Test - public void isTextValid_nameTooLongIsInvalid() { + public void isTextValid_nameTooLong_isInvalid() { assertThat(mController.isTextValid("123456789012345678901234567890123")).isFalse(); }