Loading res/xml/bluetooth_device_details_fragment.xml +5 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,11 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:title="@string/bluetooth_device_advanced_title"> <com.android.settings.applications.LayoutPreference android:key="bluetooth_device_header" android:layout="@layout/settings_entity_header" android:selectable="false"/> <com.android.settings.applications.LayoutPreference android:key="action_buttons" android:layout="@layout/app_action_buttons" Loading src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java +7 −4 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.support.v14.preference.PreferenceFragment; import android.support.v7.preference.PreferenceScreen; import android.util.Pair; import com.android.settings.R; import com.android.settings.applications.LayoutPreference; import com.android.settings.widget.EntityHeaderController; import com.android.settingslib.bluetooth.CachedBluetoothDevice; Loading @@ -31,6 +32,7 @@ import com.android.settingslib.core.lifecycle.Lifecycle; * This class adds a header with device name and status (connected/disconnected, etc.). */ public class BluetoothDetailsHeaderController extends BluetoothDetailsController { private static final String KEY_DEVICE_HEADER = "bluetooth_device_header"; private EntityHeaderController mHeaderController; Loading @@ -41,10 +43,11 @@ public class BluetoothDetailsHeaderController extends BluetoothDetailsController @Override protected void init(PreferenceScreen screen) { final LayoutPreference headerPreference = (LayoutPreference) screen.findPreference(KEY_DEVICE_HEADER); mHeaderController = EntityHeaderController.newInstance(mFragment.getActivity(), mFragment, null); LayoutPreference pref = mHeaderController.done(mFragment.getActivity(), mContext); screen.addPreference(pref); headerPreference.findViewById(R.id.entity_header)); screen.addPreference(headerPreference); } protected void setHeaderProperties() { Loading @@ -66,6 +69,6 @@ public class BluetoothDetailsHeaderController extends BluetoothDetailsController @Override public String getPreferenceKey() { return EntityHeaderController.PREF_KEY_APP_HEADER; return KEY_DEVICE_HEADER; } } src/com/android/settings/bluetooth/BluetoothDetailsMacAddressController.java +1 −1 Original line number Diff line number Diff line Loading @@ -45,7 +45,7 @@ public class BluetoothDetailsMacAddressController extends BluetoothDetailsContro protected void init(PreferenceScreen screen) { mFooterPreference = mFooterPreferenceMixin.createFooterPreference(); mFooterPreference.setTitle(mContext.getString( R.string.bluetooth_device_mac_address, mCachedDevice.getDevice().getAddress())); R.string.bluetooth_device_mac_address, mCachedDevice.getAddress())); } @Override Loading src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java +22 −0 Original line number Diff line number Diff line Loading @@ -44,6 +44,22 @@ public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment @VisibleForTesting static int EDIT_DEVICE_NAME_ITEM_ID = Menu.FIRST; /** * An interface to let tests override the normal mechanism for looking up the * CachedBluetoothDevice and LocalBluetoothManager, and substitute their own mocks instead. * This is only needed in situations where you instantiate the fragment indirectly (eg via an * intent) and can't use something like spying on an instance you construct directly via * newInstance. */ @VisibleForTesting interface TestDataFactory { CachedBluetoothDevice getDevice(String deviceAddress); LocalBluetoothManager getManager(Context context); } @VisibleForTesting static TestDataFactory sTestDataFactory; private String mDeviceAddress; private LocalBluetoothManager mManager; private CachedBluetoothDevice mCachedDevice; Loading @@ -54,11 +70,17 @@ public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment @VisibleForTesting LocalBluetoothManager getLocalBluetoothManager(Context context) { if (sTestDataFactory != null) { return sTestDataFactory.getManager(context); } return Utils.getLocalBtManager(context); } @VisibleForTesting CachedBluetoothDevice getCachedDevice(String deviceAddress) { if (sTestDataFactory != null) { return sTestDataFactory.getDevice(deviceAddress); } BluetoothDevice remoteDevice = mManager.getBluetoothAdapter().getRemoteDevice(deviceAddress); return mManager.getCachedDeviceManager().findDevice(remoteDevice); Loading tests/app/src/com/android/settings/bluetooth/BluetoothDeviceDetailsRotationTest.java 0 → 100644 +99 −0 Original line number Diff line number Diff line /* * Copyright (C) 2017 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.bluetooth; import static org.mockito.Mockito.when; import android.app.Instrumentation; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.RemoteException; import android.support.test.InstrumentationRegistry; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; import android.support.test.uiautomator.UiDevice; import com.android.settings.SettingsActivity; import com.android.settingslib.bluetooth.CachedBluetoothDevice; 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.Mock; import org.mockito.MockitoAnnotations; @RunWith(AndroidJUnit4.class) @SmallTest public class BluetoothDeviceDetailsRotationTest { private Context mContext; private UiDevice mUiDevice; private Instrumentation mInstrumentation; @Mock(answer = Answers.RETURNS_DEEP_STUBS) private CachedBluetoothDevice mCachedDevice; @Mock(answer = Answers.RETURNS_DEEP_STUBS) private LocalBluetoothManager mBluetoothManager; private String mDeviceAddress; @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); mContext = InstrumentationRegistry.getTargetContext(); mUiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); mInstrumentation = InstrumentationRegistry.getInstrumentation(); mDeviceAddress = "AA:BB:CC:DD:EE:FF"; when(mCachedDevice.getAddress()).thenReturn(mDeviceAddress); when(mCachedDevice.getName()).thenReturn("Mock Device"); BluetoothDeviceDetailsFragment.sTestDataFactory = new BluetoothDeviceDetailsFragment.TestDataFactory() { @Override public CachedBluetoothDevice getDevice(String deviceAddress) { return mCachedDevice; } @Override public LocalBluetoothManager getManager(Context context) { return mBluetoothManager; } }; } @Test public void rotation() { Intent intent = new Intent("android.settings.BLUETOOTH_SETTINGS"); SettingsActivity activity = (SettingsActivity) mInstrumentation.startActivitySync(intent); Bundle args = new Bundle(1); args.putString(BluetoothDeviceDetailsFragment.KEY_DEVICE_ADDRESS, mDeviceAddress); activity.startPreferencePanel(null, BluetoothDeviceDetailsFragment.class.getName(), args, 0, null, null, 0); try { mUiDevice.setOrientationLeft(); mUiDevice.setOrientationNatural(); mUiDevice.setOrientationRight(); mUiDevice.setOrientationNatural(); } catch (RemoteException e) { throw new RuntimeException(e); } } } Loading
res/xml/bluetooth_device_details_fragment.xml +5 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,11 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:title="@string/bluetooth_device_advanced_title"> <com.android.settings.applications.LayoutPreference android:key="bluetooth_device_header" android:layout="@layout/settings_entity_header" android:selectable="false"/> <com.android.settings.applications.LayoutPreference android:key="action_buttons" android:layout="@layout/app_action_buttons" Loading
src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java +7 −4 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.support.v14.preference.PreferenceFragment; import android.support.v7.preference.PreferenceScreen; import android.util.Pair; import com.android.settings.R; import com.android.settings.applications.LayoutPreference; import com.android.settings.widget.EntityHeaderController; import com.android.settingslib.bluetooth.CachedBluetoothDevice; Loading @@ -31,6 +32,7 @@ import com.android.settingslib.core.lifecycle.Lifecycle; * This class adds a header with device name and status (connected/disconnected, etc.). */ public class BluetoothDetailsHeaderController extends BluetoothDetailsController { private static final String KEY_DEVICE_HEADER = "bluetooth_device_header"; private EntityHeaderController mHeaderController; Loading @@ -41,10 +43,11 @@ public class BluetoothDetailsHeaderController extends BluetoothDetailsController @Override protected void init(PreferenceScreen screen) { final LayoutPreference headerPreference = (LayoutPreference) screen.findPreference(KEY_DEVICE_HEADER); mHeaderController = EntityHeaderController.newInstance(mFragment.getActivity(), mFragment, null); LayoutPreference pref = mHeaderController.done(mFragment.getActivity(), mContext); screen.addPreference(pref); headerPreference.findViewById(R.id.entity_header)); screen.addPreference(headerPreference); } protected void setHeaderProperties() { Loading @@ -66,6 +69,6 @@ public class BluetoothDetailsHeaderController extends BluetoothDetailsController @Override public String getPreferenceKey() { return EntityHeaderController.PREF_KEY_APP_HEADER; return KEY_DEVICE_HEADER; } }
src/com/android/settings/bluetooth/BluetoothDetailsMacAddressController.java +1 −1 Original line number Diff line number Diff line Loading @@ -45,7 +45,7 @@ public class BluetoothDetailsMacAddressController extends BluetoothDetailsContro protected void init(PreferenceScreen screen) { mFooterPreference = mFooterPreferenceMixin.createFooterPreference(); mFooterPreference.setTitle(mContext.getString( R.string.bluetooth_device_mac_address, mCachedDevice.getDevice().getAddress())); R.string.bluetooth_device_mac_address, mCachedDevice.getAddress())); } @Override Loading
src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java +22 −0 Original line number Diff line number Diff line Loading @@ -44,6 +44,22 @@ public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment @VisibleForTesting static int EDIT_DEVICE_NAME_ITEM_ID = Menu.FIRST; /** * An interface to let tests override the normal mechanism for looking up the * CachedBluetoothDevice and LocalBluetoothManager, and substitute their own mocks instead. * This is only needed in situations where you instantiate the fragment indirectly (eg via an * intent) and can't use something like spying on an instance you construct directly via * newInstance. */ @VisibleForTesting interface TestDataFactory { CachedBluetoothDevice getDevice(String deviceAddress); LocalBluetoothManager getManager(Context context); } @VisibleForTesting static TestDataFactory sTestDataFactory; private String mDeviceAddress; private LocalBluetoothManager mManager; private CachedBluetoothDevice mCachedDevice; Loading @@ -54,11 +70,17 @@ public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment @VisibleForTesting LocalBluetoothManager getLocalBluetoothManager(Context context) { if (sTestDataFactory != null) { return sTestDataFactory.getManager(context); } return Utils.getLocalBtManager(context); } @VisibleForTesting CachedBluetoothDevice getCachedDevice(String deviceAddress) { if (sTestDataFactory != null) { return sTestDataFactory.getDevice(deviceAddress); } BluetoothDevice remoteDevice = mManager.getBluetoothAdapter().getRemoteDevice(deviceAddress); return mManager.getCachedDeviceManager().findDevice(remoteDevice); Loading
tests/app/src/com/android/settings/bluetooth/BluetoothDeviceDetailsRotationTest.java 0 → 100644 +99 −0 Original line number Diff line number Diff line /* * Copyright (C) 2017 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.bluetooth; import static org.mockito.Mockito.when; import android.app.Instrumentation; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.RemoteException; import android.support.test.InstrumentationRegistry; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; import android.support.test.uiautomator.UiDevice; import com.android.settings.SettingsActivity; import com.android.settingslib.bluetooth.CachedBluetoothDevice; 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.Mock; import org.mockito.MockitoAnnotations; @RunWith(AndroidJUnit4.class) @SmallTest public class BluetoothDeviceDetailsRotationTest { private Context mContext; private UiDevice mUiDevice; private Instrumentation mInstrumentation; @Mock(answer = Answers.RETURNS_DEEP_STUBS) private CachedBluetoothDevice mCachedDevice; @Mock(answer = Answers.RETURNS_DEEP_STUBS) private LocalBluetoothManager mBluetoothManager; private String mDeviceAddress; @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); mContext = InstrumentationRegistry.getTargetContext(); mUiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); mInstrumentation = InstrumentationRegistry.getInstrumentation(); mDeviceAddress = "AA:BB:CC:DD:EE:FF"; when(mCachedDevice.getAddress()).thenReturn(mDeviceAddress); when(mCachedDevice.getName()).thenReturn("Mock Device"); BluetoothDeviceDetailsFragment.sTestDataFactory = new BluetoothDeviceDetailsFragment.TestDataFactory() { @Override public CachedBluetoothDevice getDevice(String deviceAddress) { return mCachedDevice; } @Override public LocalBluetoothManager getManager(Context context) { return mBluetoothManager; } }; } @Test public void rotation() { Intent intent = new Intent("android.settings.BLUETOOTH_SETTINGS"); SettingsActivity activity = (SettingsActivity) mInstrumentation.startActivitySync(intent); Bundle args = new Bundle(1); args.putString(BluetoothDeviceDetailsFragment.KEY_DEVICE_ADDRESS, mDeviceAddress); activity.startPreferencePanel(null, BluetoothDeviceDetailsFragment.class.getName(), args, 0, null, null, 0); try { mUiDevice.setOrientationLeft(); mUiDevice.setOrientationNatural(); mUiDevice.setOrientationRight(); mUiDevice.setOrientationNatural(); } catch (RemoteException e) { throw new RuntimeException(e); } } }