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
diff --git a/res/values/config.xml b/res/values/config.xml
index a6e5e1c..e6856ac 100755
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -143,6 +143,15 @@
     <!-- Whether or not homepage should display user's account avatar -->
     <bool name="config_show_avatar_in_homepage">false</bool>
 
+    <!-- Whether or not emergency info tile should display in device info page -->
+    <bool name="config_show_emergency_info_in_device_info">true</bool>
+
+    <!-- Whether or not branded account info tile should display in device info page -->
+    <bool name="config_show_branded_account_in_device_info">true</bool>
+
+    <!-- Whether or not device header widget tile should display in device info page -->
+    <bool name="config_show_device_header_in_device_info">true</bool>
+
     <!-- Whether or not TopLevelSettings should force rounded icon for injected tiles -->
     <bool name="config_force_rounded_icon_TopLevelSettings">true</bool>
 
diff --git a/res/xml/my_device_info.xml b/res/xml/my_device_info.xml
index d669977..6323a14 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"/>
 
     <!-- Device name -->
     <com.android.settings.widget.ValidatedEditTextPreference
@@ -33,6 +34,7 @@
         android:order="1"
         android:title="@string/my_device_info_device_name_preference_title"
         android:summary="@string/summary_placeholder"
+        settings:controller="com.android.settings.deviceinfo.DeviceNamePreferenceController"
         settings:enableCopying="true"/>
 
     <!-- Account name -->
@@ -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"/>
 
     <!-- Phone number -->
     <Preference
@@ -50,15 +53,15 @@
         android:summary="@string/summary_placeholder"
         android:selectable="false"
         settings:allowDynamicSummaryInSlice="true"
-        settings:controller=
-            "com.android.settings.deviceinfo.PhoneNumberPreferenceController"
+        settings:controller="com.android.settings.deviceinfo.PhoneNumberPreferenceController"
         settings:enableCopying="true"/>
 
     <Preference
         android:key="emergency_info"
         android:order="4"
         android:title="@string/emergency_info_title"
-        android:summary="@string/summary_placeholder"/>
+        android:summary="@string/summary_placeholder"
+        settings:controller="com.android.settings.accounts.EmergencyInfoPreferenceController"/>
 
     <!-- Legal information -->
     <Preference
diff --git a/src/com/android/settings/accounts/EmergencyInfoPreferenceController.java b/src/com/android/settings/accounts/EmergencyInfoPreferenceController.java
index 33e7771..7dc80d0 100644
--- a/src/com/android/settings/accounts/EmergencyInfoPreferenceController.java
+++ b/src/com/android/settings/accounts/EmergencyInfoPreferenceController.java
@@ -22,27 +22,25 @@
 import android.content.res.Resources;
 import android.os.UserHandle;
 import android.os.UserManager;
+import android.text.TextUtils;
 import android.util.FeatureFlagUtils;
 
 import androidx.preference.Preference;
 
 import com.android.settings.R;
-import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.core.BasePreferenceController;
 import com.android.settings.search.SearchIndexableRaw;
-import com.android.settingslib.core.AbstractPreferenceController;
 
 import java.util.List;
 
-public class EmergencyInfoPreferenceController extends AbstractPreferenceController
-        implements PreferenceControllerMixin {
+public class EmergencyInfoPreferenceController extends BasePreferenceController {
 
     public static final String ACTION_EDIT_EMERGENCY_INFO = "android.settings.EDIT_EMERGENCY_INFO";
 
-    private static final String KEY_EMERGENCY_INFO = "emergency_info";
     private static final String PACKAGE_NAME_EMERGENCY = "com.android.emergency";
 
-    public EmergencyInfoPreferenceController(Context context) {
-        super(context);
+    public EmergencyInfoPreferenceController(Context context, String preferenceKey) {
+        super(context, preferenceKey);
     }
 
     @Override
@@ -56,6 +54,7 @@
         }
     }
 
+    @Override
     public void updateState(Preference preference) {
         UserInfo info = mContext.getSystemService(UserManager.class).getUserInfo(
                 UserHandle.myUserId());
@@ -64,7 +63,7 @@
 
     @Override
     public boolean handlePreferenceTreeClick(Preference preference) {
-        if (KEY_EMERGENCY_INFO.equals(preference.getKey())) {
+        if (TextUtils.equals(getPreferenceKey(), preference.getKey())) {
             Intent intent = new Intent(getIntentAction(mContext));
             intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
             mContext.startActivity(intent);
@@ -74,18 +73,19 @@
     }
 
     @Override
-    public boolean isAvailable() {
-        Intent intent = new Intent(getIntentAction(mContext)).setPackage(getPackageName(mContext));
-        List<ResolveInfo> 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<ResolveInfo> 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 @@
         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 b54b398..bdd76fc 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.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 @@
 
     @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 @@
         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 0d7b1d3..fb20a2e 100644
--- a/src/com/android/settings/deviceinfo/DeviceNamePreferenceController.java
+++ b/src/com/android/settings/deviceinfo/DeviceNamePreferenceController.java
@@ -43,8 +43,6 @@
         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 @@
     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 @@
     @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());
@@ -95,11 +93,6 @@
     }
 
     @Override
-    public String getPreferenceKey() {
-        return PREF_KEY;
-    }
-
-    @Override
     public boolean onPreferenceChange(Preference preference, Object newValue) {
         mPendingDeviceName = (String) newValue;
         if (mHost != null) {
diff --git a/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java b/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java
index b61cb3c..0116c42 100644
--- a/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java
+++ b/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java
@@ -28,10 +28,8 @@
 
 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 @@
         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 @@
 
     @Override
     protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
-        return buildPreferenceControllers(context, getActivity(), this /* fragment */,
-                getSettingsLifecycle());
+        return buildPreferenceControllers(context, this /* fragment */, getSettingsLifecycle());
     }
 
     private static List<AbstractPreferenceController> buildPreferenceControllers(
-            Context context, Activity activity, MyDeviceInfoFragment fragment,
-            Lifecycle lifecycle) {
+            Context context, MyDeviceInfoFragment fragment, Lifecycle lifecycle) {
         final List<AbstractPreferenceController> 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 @@
     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 @@
                 @Override
                 public List<AbstractPreferenceController> 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 d2ffd0d..dbee443 100644
--- a/src/com/android/settings/deviceinfo/aboutphone/TopLevelAboutDevicePreferenceController.java
+++ b/src/com/android/settings/deviceinfo/aboutphone/TopLevelAboutDevicePreferenceController.java
@@ -35,7 +35,7 @@
     @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 101a6b8..da71273 100644
--- a/tests/robotests/res/values-mcc999/config.xml
+++ b/tests/robotests/res/values-mcc999/config.xml
@@ -67,10 +67,13 @@
     <bool name="config_show_device_name">false</bool>
     <bool name="config_use_legacy_suggestion">false</bool>
     <bool name="config_show_avatar_in_homepage">true</bool>
+    <bool name="config_show_branded_account_in_device_info">false</bool>
+    <bool name="config_show_emergency_info_in_device_info">false</bool>
 
     <!-- Whether or not extra preview panels should be used for screen zoom setting. -->
     <bool name="config_enable_extra_screen_zoom_preview">false</bool>
 
+
     <!-- List of a11y components on the device allowed to be enabled by Settings Slices -->
     <string-array name="config_settings_slices_accessibility_components" translatable="false">
         <item>fake_package/fake_service</item>
diff --git a/tests/robotests/src/com/android/settings/accounts/EmergencyInfoPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accounts/EmergencyInfoPreferenceControllerTest.java
index 5901f55..65da1f7 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 @@
     @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 @@
 
         mController.updateRawDataToIndex(data);
 
+        assertThat(mController.isAvailable()).isTrue();
         assertThat(data).isNotEmpty();
     }
 
@@ -152,7 +155,7 @@
         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 564acfd..87dcb33 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 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 5eb0114..21c0e74 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 @@
         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 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();
     }