diff --git a/res/xml/device_info_settings.xml b/res/xml/device_info_settings.xml
index d364d9e99ab..5f1ce123be3 100644
--- a/res/xml/device_info_settings.xml
+++ b/res/xml/device_info_settings.xml
@@ -38,11 +38,12 @@
+ android:summary="@string/summary_placeholder"
+ settings:controller="com.android.settings.deviceinfo.DeviceModelPreferenceController" />
+ android:summary="@string/summary_placeholder"
+ settings:controller=
+ "com.android.settings.deviceinfo.DeviceModelPreferenceController" />
controllers = new ArrayList<>();
controllers.add(new PhoneNumberPreferenceController(context));
controllers.add(new SimStatusPreferenceController(context, fragment));
- controllers.add(new DeviceModelPreferenceController(context, fragment));
controllers.add(new ImeiInfoPreferenceController(context, fragment));
controllers.add(new IpAddressPreferenceController(context, lifecycle));
controllers.add(new WifiMacAddressPreferenceController(context, lifecycle));
diff --git a/src/com/android/settings/deviceinfo/DeviceModelPreferenceController.java b/src/com/android/settings/deviceinfo/DeviceModelPreferenceController.java
index 1fc54cd6755..4fa7afc0a15 100644
--- a/src/com/android/settings/deviceinfo/DeviceModelPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/DeviceModelPreferenceController.java
@@ -18,50 +18,54 @@ package com.android.settings.deviceinfo;
import android.app.Fragment;
import android.content.Context;
import android.os.Build;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceScreen;
import android.text.TextUtils;
+import android.util.Log;
import com.android.settings.R;
-import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.core.BasePreferenceController;
import com.android.settingslib.DeviceInfoUtils;
-import com.android.settingslib.core.AbstractPreferenceController;
-public class DeviceModelPreferenceController extends AbstractPreferenceController implements
- PreferenceControllerMixin {
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.FutureTask;
- private static final String KEY_DEVICE_MODEL = "device_model";
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
- private final Fragment mHost;
- public DeviceModelPreferenceController(Context context, Fragment host) {
- super(context);
- mHost = host;
+public class DeviceModelPreferenceController extends BasePreferenceController {
+
+ private static final String TAG = "DeviceModelPrefCtrl";
+
+ private Fragment mHost;
+
+ public DeviceModelPreferenceController(Context context, String key) {
+ super(context, key);
}
- @Override
- public boolean isAvailable() {
- return mContext.getResources().getBoolean(R.bool.config_show_device_model);
+ public void setHost(Fragment fragment) {
+ mHost = fragment;
}
@Override
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
- final Preference pref = screen.findPreference(KEY_DEVICE_MODEL);
- if (pref != null) {
- pref.setSummary(mContext.getResources().getString(R.string.model_summary,
- getDeviceModel()));
- }
}
@Override
- public String getPreferenceKey() {
- return KEY_DEVICE_MODEL;
+ public int getAvailabilityStatus() {
+ return mContext.getResources().getBoolean(R.bool.config_show_device_model)
+ ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+ }
+
+ @Override
+ public CharSequence getSummary() {
+ return mContext.getResources().getString(R.string.model_summary, getDeviceModel());
}
@Override
public boolean handlePreferenceTreeClick(Preference preference) {
- if (!TextUtils.equals(preference.getKey(), KEY_DEVICE_MODEL)) {
+ if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) {
return false;
}
final HardwareInfoDialogFragment fragment = HardwareInfoDialogFragment.newInstance();
@@ -70,6 +74,25 @@ public class DeviceModelPreferenceController extends AbstractPreferenceControlle
}
public static String getDeviceModel() {
- return Build.MODEL + DeviceInfoUtils.getMsvSuffix();
+ FutureTask msvSuffixTask = new FutureTask(new Callable() {
+ @Override
+ public String call() {
+ return DeviceInfoUtils.getMsvSuffix();
+ }
+ });
+
+ msvSuffixTask.run();
+ try {
+ // Wait for msv suffix value.
+ final String msvSuffix = msvSuffixTask.get();
+ return Build.MODEL + msvSuffix;
+ } catch (ExecutionException e) {
+ Log.e(TAG, "Execution error, so we only show model name");
+ } catch (InterruptedException e) {
+ Log.e(TAG, "Interruption error, so we only show model name");
+ }
+ // If we can't get an msv suffix value successfully,
+ // it's better to return model name.
+ return Build.MODEL;
}
}
diff --git a/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java b/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java
index bdafa82c95d..00be8be0a01 100644
--- a/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java
+++ b/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java
@@ -82,6 +82,7 @@ public class MyDeviceInfoFragment extends DashboardFragment
public void onAttach(Context context) {
super.onAttach(context);
use(FirmwareVersionPreferenceController.class).setHost(this /*parent*/);
+ use(DeviceModelPreferenceController.class).setHost(this /* parent */);
}
@Override
@@ -122,7 +123,6 @@ public class MyDeviceInfoFragment extends DashboardFragment
}
controllers.add(deviceNamePreferenceController);
controllers.add(new SimStatusPreferenceController(context, fragment));
- controllers.add(new DeviceModelPreferenceController(context, fragment));
controllers.add(new ImeiInfoPreferenceController(context, fragment));
controllers.add(new IpAddressPreferenceController(context, lifecycle));
controllers.add(new WifiMacAddressPreferenceController(context, lifecycle));
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/DeviceModelPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/DeviceModelPreferenceControllerTest.java
index c91683e00d4..dbffc3182e1 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/DeviceModelPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/DeviceModelPreferenceControllerTest.java
@@ -15,40 +15,44 @@
*/
package com.android.settings.deviceinfo;
-import static com.android.settings.deviceinfo.DeviceModelPreferenceController.getDeviceModel;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.Fragment;
+import android.app.FragmentManager;
+import android.app.FragmentTransaction;
import android.content.Context;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceScreen;
+import android.os.Build;
import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
+
@RunWith(SettingsRobolectricTestRunner.class)
public class DeviceModelPreferenceControllerTest {
- @Mock(answer = Answers.RETURNS_DEEP_STUBS)
- private Fragment mFragment;
- @Mock
- private Preference mPreference;
- @Mock
- private PreferenceScreen mPreferenceScreen;
+ private final String KEY = "device_model_key";
+ @Mock
+ private Fragment mFragment;
+ private Preference mPreference;
+ private PreferenceScreen mPreferenceScreen;
private Context mContext;
private DeviceModelPreferenceController mController;
@@ -56,35 +60,49 @@ public class DeviceModelPreferenceControllerTest {
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
- mController = new DeviceModelPreferenceController(mContext, mFragment);
- when(mPreferenceScreen.findPreference(mController.getPreferenceKey()))
- .thenReturn(mPreference);
- when(mPreference.getKey()).thenReturn(mController.getPreferenceKey());
+ mController = new DeviceModelPreferenceController(mContext, KEY);
+ mController.setHost(mFragment);
+ mPreference = new Preference(mContext);
+ mPreference.setKey(KEY);
+ final PreferenceManager preferenceManager = new PreferenceManager(mContext);
+ mPreferenceScreen = preferenceManager.createPreferenceScreen(mContext);
+ mPreferenceScreen.addPreference(mPreference);
}
@Test
public void isAvailable_returnTrueIfVisible() {
- assertThat(mController.isAvailable()).isTrue();
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(
+ BasePreferenceController.AVAILABLE);
}
@Test
@Config(qualifiers = "mcc999")
public void isAvailable_returnFalseIfNotVisible() {
- assertThat(mController.isAvailable()).isFalse();
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(
+ BasePreferenceController.UNSUPPORTED_ON_DEVICE);
}
@Test
- public void displayPref_shouldSetSummary() {
- mController.displayPreference(mPreferenceScreen);
+ public void updatePreference_summaryShouldContainBuildModel() {
+ mController.updateState(mPreference);
- verify(mPreference).setSummary(mContext.getString(R.string.model_summary, getDeviceModel()));
+ assertThat(containBuildModel(mPreference.getSummary())).isTrue();
}
@Test
public void clickPreference_shouldLaunchHardwareInfoDialog() {
+ FragmentManager fragmentManager = mock(FragmentManager.class);
+ when(mFragment.getFragmentManager()).thenReturn(fragmentManager);
+ when(fragmentManager.beginTransaction()).thenReturn(mock(FragmentTransaction.class));
+
assertThat(mController.handlePreferenceTreeClick(mPreference)).isTrue();
- verify(mFragment).getFragmentManager();
- verify(mFragment.getFragmentManager().beginTransaction())
+ verify(fragmentManager.beginTransaction())
.add(any(HardwareInfoDialogFragment.class), eq(HardwareInfoDialogFragment.TAG));
}
+
+ private boolean containBuildModel(CharSequence result) {
+ final String oracle = mContext.getResources().getString(R.string.model_summary,
+ Build.MODEL);
+ return result.toString().contains(oracle);
+ }
}