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); + } }