From 2385aa819b2c1176e861b37bb8301c63fdbebf17 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Wed, 16 Nov 2016 14:44:43 -0800 Subject: [PATCH] Use new API Build.getSerial() to get serial number. Bug: 32935486 Test: RunSettingsRoboTests Change-Id: I28b8d27d034b4a6c4ae5f29e8311e84e5c423967 --- .../SerialNumberPreferenceController.java | 67 +++++++++++++ .../android/settings/deviceinfo/Status.java | 52 +++------- .../SerialNumberPreferenceControllerTest.java | 94 +++++++++++++++++++ 3 files changed, 172 insertions(+), 41 deletions(-) create mode 100644 src/com/android/settings/deviceinfo/SerialNumberPreferenceController.java create mode 100644 tests/robotests/src/com/android/settings/deviceinfo/SerialNumberPreferenceControllerTest.java diff --git a/src/com/android/settings/deviceinfo/SerialNumberPreferenceController.java b/src/com/android/settings/deviceinfo/SerialNumberPreferenceController.java new file mode 100644 index 00000000000..1029e203574 --- /dev/null +++ b/src/com/android/settings/deviceinfo/SerialNumberPreferenceController.java @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.deviceinfo; + +import android.content.Context; +import android.os.Build; +import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceScreen; +import android.text.TextUtils; + +import com.android.internal.annotations.VisibleForTesting; +import com.android.settings.core.PreferenceController; + +public class SerialNumberPreferenceController extends PreferenceController { + + private static final String KEY_SERIAL_NUMBER = "serial_number"; + + private final String mSerialNumber; + + public SerialNumberPreferenceController(Context context) { + this(context, Build.getSerial()); + } + + @VisibleForTesting + SerialNumberPreferenceController(Context context, String serialNumber) { + super(context); + mSerialNumber = serialNumber; + } + + @Override + public boolean isAvailable() { + return !TextUtils.isEmpty(mSerialNumber); + } + + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + final Preference pref = screen.findPreference(KEY_SERIAL_NUMBER); + if (pref != null) { + pref.setSummary(mSerialNumber); + } + } + + @Override + public boolean handlePreferenceTreeClick(Preference preference) { + return false; + } + + @Override + public String getPreferenceKey() { + return KEY_SERIAL_NUMBER; + } +} diff --git a/src/com/android/settings/deviceinfo/Status.java b/src/com/android/settings/deviceinfo/Status.java index 930e185e3d1..fb6627ad2c3 100644 --- a/src/com/android/settings/deviceinfo/Status.java +++ b/src/com/android/settings/deviceinfo/Status.java @@ -16,9 +16,6 @@ package com.android.settings.deviceinfo; -import static android.content.Context.CONNECTIVITY_SERVICE; -import static android.content.Context.WIFI_SERVICE; - import android.bluetooth.BluetoothAdapter; import android.content.BroadcastReceiver; import android.content.Context; @@ -28,7 +25,6 @@ import android.content.res.Resources; import android.net.ConnectivityManager; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; -import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Message; @@ -36,6 +32,7 @@ import android.os.SystemClock; import android.os.SystemProperties; import android.os.UserManager; import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceScreen; import android.text.TextUtils; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; @@ -46,6 +43,9 @@ import com.android.settings.Utils; import java.lang.ref.WeakReference; +import static android.content.Context.CONNECTIVITY_SERVICE; +import static android.content.Context.WIFI_SERVICE; + /** * Display the following information * # Battery Strength : TODO @@ -61,7 +61,6 @@ public class Status extends SettingsPreferenceFragment { private static final String KEY_IP_ADDRESS = "wifi_ip_address"; private static final String KEY_WIFI_MAC_ADDRESS = "wifi_mac_address"; private static final String KEY_BT_ADDRESS = "bt_address"; - private static final String KEY_SERIAL_NUMBER = "serial_number"; private static final String KEY_WIMAX_MAC_ADDRESS = "wimax_mac_address"; private static final String KEY_SIM_STATUS = "sim_status"; private static final String KEY_IMEI_INFO = "imei_info"; @@ -83,9 +82,10 @@ public class Status extends SettingsPreferenceFragment { private Resources mRes; - private String mUnknown; private String mUnavailable; + private SerialNumberPreferenceController mSerialNumberPreferenceController; + private Preference mUptime; private Preference mBatteryStatus; private Preference mBatteryLevel; @@ -93,7 +93,6 @@ public class Status extends SettingsPreferenceFragment { private Preference mIpAddress; private Preference mWifiMacAddress; private Preference mWimaxMacAddress; - private Handler mHandler; private static class MyHandler extends Handler { @@ -162,6 +161,7 @@ public class Status extends SettingsPreferenceFragment { mCM = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); mWifiManager = (WifiManager) getSystemService(WIFI_SERVICE); + mSerialNumberPreferenceController = new SerialNumberPreferenceController(getActivity()); addPreferencesFromResource(R.xml.device_info_status); mBatteryLevel = findPreference(KEY_BATTERY_LEVEL); @@ -172,19 +172,18 @@ public class Status extends SettingsPreferenceFragment { mIpAddress = findPreference(KEY_IP_ADDRESS); mRes = getResources(); - mUnknown = mRes.getString(R.string.device_info_default); mUnavailable = mRes.getString(R.string.status_unavailable); // Note - missing in zaku build, be careful later... mUptime = findPreference("up_time"); - + final PreferenceScreen screen = getPreferenceScreen(); if (!hasBluetooth()) { - getPreferenceScreen().removePreference(mBtAddress); + screen.removePreference(mBtAddress); mBtAddress = null; } if (!hasWimax()) { - getPreferenceScreen().removePreference(mWimaxMacAddress); + screen.removePreference(mWimaxMacAddress); mWimaxMacAddress = null; } @@ -195,12 +194,7 @@ public class Status extends SettingsPreferenceFragment { updateConnectivity(); - String serial = Build.SERIAL; - if (serial != null && !serial.equals("")) { - setSummaryText(KEY_SERIAL_NUMBER, serial); - } else { - removePreferenceFromScreen(KEY_SERIAL_NUMBER); - } + mSerialNumberPreferenceController.displayPreference(screen); // Remove SimStatus and Imei for Secondary user as it access Phone b/19165700 // Also remove on Wi-Fi only devices. @@ -247,30 +241,6 @@ public class Status extends SettingsPreferenceFragment { } } - /** - * @param preference The key for the Preference item - * @param property The system property to fetch - * @param alt The default value, if the property doesn't exist - */ - private void setSummary(String preference, String property, String alt) { - try { - findPreference(preference).setSummary( - SystemProperties.get(property, alt)); - } catch (RuntimeException e) { - - } - } - - private void setSummaryText(String preference, String text) { - if (TextUtils.isEmpty(text)) { - text = mUnknown; - } - // some preferences may be missing - if (findPreference(preference) != null) { - findPreference(preference).setSummary(text); - } - } - private void setWimaxStatus() { if (mWimaxMacAddress != null) { String macAddress = SystemProperties.get("net.wimax.mac.address", mUnavailable); diff --git a/tests/robotests/src/com/android/settings/deviceinfo/SerialNumberPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/SerialNumberPreferenceControllerTest.java new file mode 100644 index 00000000000..72d6609caa6 --- /dev/null +++ b/tests/robotests/src/com/android/settings/deviceinfo/SerialNumberPreferenceControllerTest.java @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.deviceinfo; + +import android.content.Context; +import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceScreen; + +import com.android.settings.TestConfig; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; + +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Answers.RETURNS_DEEP_STUBS; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@RunWith(RobolectricTestRunner.class) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) +public class SerialNumberPreferenceControllerTest { + + @Mock(answer = RETURNS_DEEP_STUBS) + private Context mContext; + @Mock(answer = RETURNS_DEEP_STUBS) + private PreferenceScreen mScreen; + + private SerialNumberPreferenceController mController; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + } + + @Test + public void testIsAvaiable_noSerial_shouldReturnFalse() { + mController = new SerialNumberPreferenceController(mContext, null); + + assertThat(mController.isAvailable()).isFalse(); + } + + @Test + public void testIsAvaiable_hasSerial_shouldReturnTrue() { + mController = new SerialNumberPreferenceController(mContext, "123"); + + assertThat(mController.isAvailable()).isTrue(); + } + + @Test + public void testDisplay_noSerial_shouldHidePreference() { + when(mScreen.findPreference(anyString())).thenReturn(mock(Preference.class)); + + mController = new SerialNumberPreferenceController(mContext, null); + mController.displayPreference(mScreen); + + verify(mScreen).removePreference(any(Preference.class)); + } + + @Test + public void testDisplay_hasSerial_shouldSummary() { + final String serial = "123"; + final Preference preference = mock(Preference.class); + when(mScreen.findPreference(anyString())).thenReturn(preference); + + mController = new SerialNumberPreferenceController(mContext, serial); + mController.displayPreference(mScreen); + + verify(mScreen, never()).removePreference(any(Preference.class)); + verify(preference).setSummary(serial); + } +}