diff --git a/res/xml/my_device_info.xml b/res/xml/my_device_info.xml index 673b2a5722a..4988b16c83a 100644 --- a/res/xml/my_device_info.xml +++ b/res/xml/my_device_info.xml @@ -30,7 +30,7 @@ @@ -43,7 +43,7 @@ android:summary="@string/summary_placeholder"/> - use the original + if (filteredSequence == null) { + return deviceName; + } + return filteredSequence.toString(); + } + + private void setTetherSsidName(String deviceName) { + final WifiConfiguration config = mWifiManager.getWifiApConfiguration(); + config.SSID = deviceName; + // TODO: If tether is running, turn off the AP and restart it after setting config. + mWifiManager.setWifiApConfiguration(config); + } +} \ No newline at end of file diff --git a/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java b/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java index a3018072c30..04e7fde59d4 100644 --- a/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java +++ b/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java @@ -16,6 +16,8 @@ package com.android.settings.deviceinfo.aboutphone; +import static com.android.settings.bluetooth.Utils.getLocalBtManager; + import android.app.Activity; import android.app.Fragment; import android.content.Context; @@ -54,6 +56,7 @@ import com.android.settings.search.Indexable; import com.android.settings.widget.EntityHeaderController; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settings.deviceinfo.DeviceNamePreferenceController; import java.util.ArrayList; import java.util.Arrays; @@ -102,6 +105,10 @@ public class MyDeviceInfoFragment extends DashboardFragment { final List controllers = new ArrayList<>(); controllers.add(new PhoneNumberPreferenceController(context)); controllers.add(new BrandedAccountPreferenceController(context)); + DeviceNamePreferenceController deviceNamePreferenceController = + new DeviceNamePreferenceController(context); + deviceNamePreferenceController.setLocalBluetoothManager(getLocalBtManager(context)); + controllers.add(deviceNamePreferenceController); controllers.add(new SimStatusPreferenceController(context, fragment)); controllers.add(new DeviceModelPreferenceController(context, fragment)); controllers.add(new ImeiInfoPreferenceController(context, fragment)); @@ -117,7 +124,6 @@ public class MyDeviceInfoFragment extends DashboardFragment { controllers.add(new FccEquipmentIdPreferenceController(context)); controllers.add( new BuildNumberPreferenceController(context, activity, fragment, lifecycle)); - // TODO: Add preference controller for getting the device name. return controllers; } diff --git a/src/com/android/settings/wifi/tether/WifiDeviceNameTextValidator.java b/src/com/android/settings/wifi/tether/WifiDeviceNameTextValidator.java new file mode 100644 index 00000000000..e766e32e962 --- /dev/null +++ b/src/com/android/settings/wifi/tether/WifiDeviceNameTextValidator.java @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2018 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.wifi.tether; + +import com.android.settings.widget.ValidatedEditTextPreference; +import com.android.settings.wifi.WifiUtils; + +/** + * Validates a text field for a valid Wi-Fi SSID name. + */ +public class WifiDeviceNameTextValidator implements ValidatedEditTextPreference.Validator { + @Override + public boolean isTextValid(String value) { + return !WifiUtils.isSSIDTooLong(value) && !WifiUtils.isSSIDTooShort(value); + } +} diff --git a/src/com/android/settings/wifi/tether/WifiTetherSSIDPreferenceController.java b/src/com/android/settings/wifi/tether/WifiTetherSSIDPreferenceController.java index b563e53e4b8..d7cb441fc0c 100644 --- a/src/com/android/settings/wifi/tether/WifiTetherSSIDPreferenceController.java +++ b/src/com/android/settings/wifi/tether/WifiTetherSSIDPreferenceController.java @@ -35,10 +35,12 @@ public class WifiTetherSSIDPreferenceController extends WifiTetherBasePreference static final String DEFAULT_SSID = "AndroidAP"; private String mSSID; + private WifiDeviceNameTextValidator mWifiDeviceNameTextValidator; public WifiTetherSSIDPreferenceController(Context context, OnTetherConfigUpdateListener listener) { super(context, listener); + mWifiDeviceNameTextValidator = new WifiDeviceNameTextValidator(); } @Override @@ -70,7 +72,7 @@ public class WifiTetherSSIDPreferenceController extends WifiTetherBasePreference @Override public boolean isTextValid(String value) { - return !WifiUtils.isSSIDTooLong(value) && !WifiUtils.isSSIDTooShort(value); + return mWifiDeviceNameTextValidator.isTextValid(value); } public String getSSID() { diff --git a/tests/robotests/src/com/android/settings/deviceinfo/DeviceNamePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/DeviceNamePreferenceControllerTest.java new file mode 100644 index 00000000000..4ff79ca69e6 --- /dev/null +++ b/tests/robotests/src/com/android/settings/deviceinfo/DeviceNamePreferenceControllerTest.java @@ -0,0 +1,132 @@ +/* + * Copyright (C) 2018 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 static com.google.common.truth.Truth.assertThat; + +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.content.Context; +import android.net.wifi.WifiConfiguration; +import android.net.wifi.WifiManager; +import android.os.Build; +import android.provider.Settings; +import android.support.v7.preference.PreferenceScreen; + +import com.android.settings.TestConfig; +import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.widget.ValidatedEditTextPreference; +import com.android.settingslib.bluetooth.LocalBluetoothAdapter; +import com.android.settingslib.bluetooth.LocalBluetoothManager; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Answers; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; +import org.robolectric.shadows.ShadowApplication; + +@RunWith(SettingsRobolectricTestRunner.class) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) +public class DeviceNamePreferenceControllerTest { + private static final String TESTING_STRING = "Testing"; + + @Mock + private LocalBluetoothAdapter mBluetoothAdapter; + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private LocalBluetoothManager mBluetoothManager; + @Mock + private WifiManager mWifiManager; + @Mock + private PreferenceScreen mScreen; + private ValidatedEditTextPreference mPreference; + private DeviceNamePreferenceController mController; + private Context mContext; + + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + ShadowApplication shadowApplication = ShadowApplication.getInstance(); + shadowApplication.setSystemService(Context.WIFI_SERVICE, mWifiManager); + mContext = shadowApplication.getApplicationContext(); + mPreference = new ValidatedEditTextPreference(mContext); + when(mBluetoothManager.getBluetoothAdapter()).thenReturn(mBluetoothAdapter); + when(mScreen.findPreference(anyString())).thenReturn(mPreference); + final WifiConfiguration configuration = new WifiConfiguration(); + configuration.SSID = "test-ap"; + when(mWifiManager.getWifiApConfiguration()).thenReturn(configuration); + + mController = new DeviceNamePreferenceController(mContext); + mController.setLocalBluetoothManager(mBluetoothManager); + } + + @Test + public void constructor_defaultDeviceNameIsModelName() { + assertThat(mController.getSummary()).isEqualTo(Build.MODEL); + } + + @Test + public void constructor_deviceNameLoadedIfSet() { + Settings.Global.putString(mContext.getContentResolver(), Settings.Global.DEVICE_NAME, + "Test"); + mController = new DeviceNamePreferenceController(mContext); + mController.setLocalBluetoothManager(mBluetoothManager); + assertThat(mController.getSummary()).isEqualTo("Test"); + } + + @Test + public void isTextValid_nameUnder33CharactersIsValid() { + assertThat(mController.isTextValid("12345678901234567890123456789012")).isTrue(); + } + + @Test + public void isTextValid_nameTooLongIsInvalid() { + assertThat(mController.isTextValid("123456789012345678901234567890123")).isFalse(); + } + + @Test + public void setDeviceName_preferenceUpdatedWhenDeviceNameUpdated() { + mController.onPreferenceChange(mPreference, TESTING_STRING); + + assertThat(mPreference.getSummary()).isEqualTo(TESTING_STRING); + } + + @Test + public void setDeviceName_bluetoothNameUpdatedWhenDeviceNameUpdated() { + mController.onPreferenceChange(mPreference, TESTING_STRING); + + verify(mBluetoothAdapter).setName(eq(TESTING_STRING)); + } + + @Test + public void setDeviceName_wifiTetherNameUpdatedWhenDeviceNameUpdated() { + mController.onPreferenceChange(mPreference, TESTING_STRING); + + ArgumentCaptor captor = ArgumentCaptor.forClass(WifiConfiguration.class); + verify(mWifiManager).setWifiApConfiguration(captor.capture()); + assertThat(captor.getValue().SSID).isEqualTo(TESTING_STRING); + } +}