Slices feature supports device model.

- Migrate DeviceModelPreferenceController to BasePreferenceController
- Because Slice feature enables strict mode,
  we can't do I/O(DeviceInfoUtils.getMsvSuffix) on main thread.

  Using FutureTask to get around the foreground thread restriction.

- Modify test case for new device model controller.

Test: slice uri > content://android.settings.slices/intent/my_device_model
Test: make RunSettingsRoboTests -j
      atest UniquePreferenceTest SettingsGatewayTest

Change-Id: Idafc132dfa14138ad5a7edd58e63c4b0f644c994
This commit is contained in:
tmfang
2018-04-25 15:58:54 +08:00
committed by Fan Zhang
parent d43283b53a
commit 5c467566f1
6 changed files with 95 additions and 50 deletions

View File

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