From f2f03b81986eeefb21d2a33ec18a2f6bbd4c728b Mon Sep 17 00:00:00 2001 From: Ivan Chiang Date: Tue, 10 Apr 2018 14:32:58 +0800 Subject: [PATCH 1/7] Add DockUpdaterFeatureProvider and DockUpdater. Add the new feature components for dock devices. Bug: 77931823 Test: Build Change-Id: I219a5256d02f2b1b8ea7cce1cff4219975f2eae2 --- .../connecteddevice/dock/DockUpdater.java | 43 +++++++++++++++++++ .../dock/DockUpdaterFeatureProviderImpl.java | 29 +++++++++++++ .../overlay/DockUpdaterFeatureProvider.java | 35 +++++++++++++++ .../settings/overlay/FeatureFactory.java | 2 + .../settings/overlay/FeatureFactoryImpl.java | 10 +++++ .../testutils/FakeFeatureFactory.java | 8 ++++ 6 files changed, 127 insertions(+) create mode 100644 src/com/android/settings/connecteddevice/dock/DockUpdater.java create mode 100644 src/com/android/settings/connecteddevice/dock/DockUpdaterFeatureProviderImpl.java create mode 100644 src/com/android/settings/overlay/DockUpdaterFeatureProvider.java diff --git a/src/com/android/settings/connecteddevice/dock/DockUpdater.java b/src/com/android/settings/connecteddevice/dock/DockUpdater.java new file mode 100644 index 00000000000..19ee7324179 --- /dev/null +++ b/src/com/android/settings/connecteddevice/dock/DockUpdater.java @@ -0,0 +1,43 @@ +/* + * 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.connecteddevice.dock; + +import android.content.Context; + +/** + * Update the dock devices. It notifies the upper level whether to add/remove the preference + * through {@link DevicePreferenceCallback} + */ +public interface DockUpdater { + + /** + * Register the dock event callback and update the list + */ + default void registerCallback() { + } + + /** + * Unregister the dock event callback + */ + default void unregisterCallback() { + } + + /** + * Force to update the list of dock devices + */ + default void forceUpdate() { + } +} diff --git a/src/com/android/settings/connecteddevice/dock/DockUpdaterFeatureProviderImpl.java b/src/com/android/settings/connecteddevice/dock/DockUpdaterFeatureProviderImpl.java new file mode 100644 index 00000000000..7cd2d508519 --- /dev/null +++ b/src/com/android/settings/connecteddevice/dock/DockUpdaterFeatureProviderImpl.java @@ -0,0 +1,29 @@ +package com.android.settings.connecteddevice.dock; + +import android.content.Context; + +import com.android.settings.connecteddevice.DevicePreferenceCallback; +import com.android.settings.connecteddevice.dock.DockUpdater; +import com.android.settings.overlay.DockUpdaterFeatureProvider; + +/** + * Impl for {@link DockUpdaterFeatureProvider} + */ +public class DockUpdaterFeatureProviderImpl implements DockUpdaterFeatureProvider { + + @Override + public DockUpdater getConnectedDockUpdater(Context context, + DevicePreferenceCallback devicePreferenceCallback) { + final DockUpdater updater = new DockUpdater() { + }; + return updater; + } + + @Override + public DockUpdater getSavedDockUpdater(Context context, + DevicePreferenceCallback devicePreferenceCallback) { + final DockUpdater updater = new DockUpdater() { + }; + return updater; + } +} diff --git a/src/com/android/settings/overlay/DockUpdaterFeatureProvider.java b/src/com/android/settings/overlay/DockUpdaterFeatureProvider.java new file mode 100644 index 00000000000..2a968e0e826 --- /dev/null +++ b/src/com/android/settings/overlay/DockUpdaterFeatureProvider.java @@ -0,0 +1,35 @@ +/* + * 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.overlay; + +import android.content.Context; + +import com.android.settings.connecteddevice.DevicePreferenceCallback; +import com.android.settings.connecteddevice.dock.DockUpdater; + +/** Feature provider for the dock updater. */ +public interface DockUpdaterFeatureProvider { + + /** Returns the DockUpdater of the connected dock device */ + DockUpdater getConnectedDockUpdater(Context context, + DevicePreferenceCallback devicePreferenceCallback); + + /** Returns the DockUpdater of the saved dock devices */ + DockUpdater getSavedDockUpdater(Context context, + DevicePreferenceCallback devicePreferenceCallback); + +} diff --git a/src/com/android/settings/overlay/FeatureFactory.java b/src/com/android/settings/overlay/FeatureFactory.java index 110d204ed93..72bac99cc95 100644 --- a/src/com/android/settings/overlay/FeatureFactory.java +++ b/src/com/android/settings/overlay/FeatureFactory.java @@ -86,6 +86,8 @@ public abstract class FeatureFactory { public abstract DashboardFeatureProvider getDashboardFeatureProvider(Context context); + public abstract DockUpdaterFeatureProvider getDockUpdaterFeatureProvider(); + public abstract ApplicationFeatureProvider getApplicationFeatureProvider(Context context); public abstract LocaleFeatureProvider getLocaleFeatureProvider(); diff --git a/src/com/android/settings/overlay/FeatureFactoryImpl.java b/src/com/android/settings/overlay/FeatureFactoryImpl.java index b652c669f2b..d058b3b3ac5 100644 --- a/src/com/android/settings/overlay/FeatureFactoryImpl.java +++ b/src/com/android/settings/overlay/FeatureFactoryImpl.java @@ -29,6 +29,7 @@ import com.android.settings.applications.ApplicationFeatureProvider; import com.android.settings.applications.ApplicationFeatureProviderImpl; import com.android.settings.bluetooth.BluetoothFeatureProvider; import com.android.settings.bluetooth.BluetoothFeatureProviderImpl; +import com.android.settings.connecteddevice.dock.DockUpdaterFeatureProviderImpl; import com.android.settings.dashboard.DashboardFeatureProvider; import com.android.settings.dashboard.DashboardFeatureProviderImpl; import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider; @@ -63,6 +64,7 @@ public class FeatureFactoryImpl extends FeatureFactory { private ApplicationFeatureProvider mApplicationFeatureProvider; private MetricsFeatureProvider mMetricsFeatureProvider; private DashboardFeatureProviderImpl mDashboardFeatureProvider; + private DockUpdaterFeatureProvider mDockUpdaterFeatureProvider; private LocaleFeatureProvider mLocaleFeatureProvider; private EnterprisePrivacyFeatureProvider mEnterprisePrivacyFeatureProvider; private SearchFeatureProvider mSearchFeatureProvider; @@ -105,6 +107,14 @@ public class FeatureFactoryImpl extends FeatureFactory { return mDashboardFeatureProvider; } + @Override + public DockUpdaterFeatureProvider getDockUpdaterFeatureProvider() { + if (mDockUpdaterFeatureProvider == null) { + mDockUpdaterFeatureProvider = new DockUpdaterFeatureProviderImpl(); + } + return mDockUpdaterFeatureProvider; + } + @Override public ApplicationFeatureProvider getApplicationFeatureProvider(Context context) { if (mApplicationFeatureProvider == null) { diff --git a/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java b/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java index 8945af924e7..6e607fe7521 100644 --- a/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java +++ b/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java @@ -30,6 +30,7 @@ import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider; import com.android.settings.fuelgauge.PowerUsageFeatureProvider; import com.android.settings.gestures.AssistGestureFeatureProvider; import com.android.settings.localepicker.LocaleFeatureProvider; +import com.android.settings.overlay.DockUpdaterFeatureProvider; import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.SupportFeatureProvider; import com.android.settings.overlay.SurveyFeatureProvider; @@ -52,6 +53,7 @@ public class FakeFeatureFactory extends FeatureFactory { public final MetricsFeatureProvider metricsFeatureProvider; public final PowerUsageFeatureProvider powerUsageFeatureProvider; public final DashboardFeatureProvider dashboardFeatureProvider; + public final DockUpdaterFeatureProvider dockUpdaterFeatureProvider; public final LocaleFeatureProvider localeFeatureProvider; public final ApplicationFeatureProvider applicationFeatureProvider; public final EnterprisePrivacyFeatureProvider enterprisePrivacyFeatureProvider; @@ -91,6 +93,7 @@ public class FakeFeatureFactory extends FeatureFactory { metricsFeatureProvider = mock(MetricsFeatureProvider.class); powerUsageFeatureProvider = mock(PowerUsageFeatureProvider.class); dashboardFeatureProvider = mock(DashboardFeatureProvider.class); + dockUpdaterFeatureProvider = mock(DockUpdaterFeatureProvider.class); localeFeatureProvider = mock(LocaleFeatureProvider.class); applicationFeatureProvider = mock(ApplicationFeatureProvider.class); enterprisePrivacyFeatureProvider = mock(EnterprisePrivacyFeatureProvider.class); @@ -131,6 +134,11 @@ public class FakeFeatureFactory extends FeatureFactory { return dashboardFeatureProvider; } + @Override + public DockUpdaterFeatureProvider getDockUpdaterFeatureProvider() { + return dockUpdaterFeatureProvider; + } + @Override public ApplicationFeatureProvider getApplicationFeatureProvider(Context context) { return applicationFeatureProvider; From 1346b066bde27e89f876eca6ada31c63d8ea29d0 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Tue, 24 Apr 2018 11:31:58 -0700 Subject: [PATCH 2/7] Update brightness percentage display logic to match sysui. The brightness raw value is in linear pace, we need to convert it to gamma space to make it match the way sysui represents the brightness level. Bug: 73810208 Change-Id: Ic4551bbeff4a6af30f7af2871a79a7d797279edb Fixes: 78173473 Test: robotests --- .../BrightnessLevelPreferenceController.java | 31 ++++++++++++------- ...ightnessLevelPreferenceControllerTest.java | 6 ++-- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/com/android/settings/display/BrightnessLevelPreferenceController.java b/src/com/android/settings/display/BrightnessLevelPreferenceController.java index bbd6f8053fe..4bb0a99b7ff 100644 --- a/src/com/android/settings/display/BrightnessLevelPreferenceController.java +++ b/src/com/android/settings/display/BrightnessLevelPreferenceController.java @@ -13,6 +13,9 @@ */ package com.android.settings.display; +import static com.android.settingslib.display.BrightnessUtils.GAMMA_SPACE_MAX; +import static com.android.settingslib.display.BrightnessUtils.convertLinearToGamma; + import android.content.ContentResolver; import android.content.Context; import android.database.ContentObserver; @@ -63,12 +66,12 @@ public class BrightnessLevelPreferenceController extends AbstractPreferenceContr } private ContentObserver mBrightnessObserver = - new ContentObserver(new Handler(Looper.getMainLooper())) { - @Override - public void onChange(boolean selfChange) { - updatedSummary(mPreference); - } - }; + new ContentObserver(new Handler(Looper.getMainLooper())) { + @Override + public void onChange(boolean selfChange) { + updatedSummary(mPreference); + } + }; public BrightnessLevelPreferenceController(Context context, Lifecycle lifecycle) { super(context); @@ -103,6 +106,7 @@ public class BrightnessLevelPreferenceController extends AbstractPreferenceContr public void updateState(Preference preference) { updatedSummary(preference); } + @Override public void onStart() { mContentResolver.registerContentObserver(BRIGHTNESS_URI, false, mBrightnessObserver); @@ -122,15 +126,18 @@ public class BrightnessLevelPreferenceController extends AbstractPreferenceContr } private double getCurrentBrightness() { + final int value; if (isInVrMode()) { - final double value = System.getInt(mContentResolver, System.SCREEN_BRIGHTNESS_FOR_VR, - mMaxBrightness); - return getPercentage(value, mMinVrBrightness, mMaxVrBrightness); + value = convertLinearToGamma(System.getInt(mContentResolver, + System.SCREEN_BRIGHTNESS_FOR_VR, mMaxBrightness), + mMinVrBrightness, mMaxVrBrightness); } else { - final double value = Settings.System.getInt(mContentResolver, System.SCREEN_BRIGHTNESS, - mMinBrightness); - return getPercentage(value, mMinBrightness, mMaxBrightness); + value = convertLinearToGamma(Settings.System.getInt(mContentResolver, + System.SCREEN_BRIGHTNESS, mMinBrightness), + mMinBrightness, mMaxBrightness); + } + return getPercentage(value, 0, GAMMA_SPACE_MAX); } private double getPercentage(double value, int min, int max) { diff --git a/tests/robotests/src/com/android/settings/display/BrightnessLevelPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/BrightnessLevelPreferenceControllerTest.java index adc3b66be06..e29ded0ee30 100644 --- a/tests/robotests/src/com/android/settings/display/BrightnessLevelPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/display/BrightnessLevelPreferenceControllerTest.java @@ -122,7 +122,7 @@ public class BrightnessLevelPreferenceControllerTest { mController.updateState(mPreference); - verify(mPreference).setSummary("85%"); + verify(mPreference).setSummary("97%"); } @Test @@ -135,7 +135,7 @@ public class BrightnessLevelPreferenceControllerTest { mController.updateState(mPreference); - verify(mPreference).setSummary("31%"); + verify(mPreference).setSummary("78%"); } @Test @@ -148,7 +148,7 @@ public class BrightnessLevelPreferenceControllerTest { mController.updateState(mPreference); - verify(mPreference).setSummary("45%"); + verify(mPreference).setSummary("85%"); } @Test From 70206e6ff2454a22c8336a09ff74b210c16df50e Mon Sep 17 00:00:00 2001 From: Doris Ling Date: Tue, 24 Apr 2018 13:19:27 -0700 Subject: [PATCH 3/7] Fixes crash in security settings. - save the loaded icon drawable to a local var, instead of setting it to the tile.icon and later reset it, so that we will not run into the issue that the icon will become null when this is called multiple times. Change-Id: I0fc73961986cddd97ad1e74b0609ac47d011cc87 Fixes: 78445923 Test: make RunSettingsRoboTests --- .../settings/dashboard/DashboardFeatureProviderImpl.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java index 82a5b9bd2d0..f403e056da0 100644 --- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java +++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java @@ -258,10 +258,9 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { Log.w(TAG, "Failed to get icon from uri " + uri); return; } - tile.icon = Icon.createWithResource(iconInfo.first, iconInfo.second); + final Icon icon = Icon.createWithResource(iconInfo.first, iconInfo.second); ThreadUtils.postOnMainThread(() -> { - preference.setIcon(tile.icon.loadDrawable(preference.getContext())); - tile.icon = null; + preference.setIcon(icon.loadDrawable(preference.getContext())); } ); }); From c5655d4a5ebf9005c2d8ce85cdc32a452279ccf9 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Thu, 12 Apr 2018 13:14:57 +0800 Subject: [PATCH 4/7] Fix a incorrect class cast in GameControllerPreferenceCtrl Also convert the controller to TogglePrefCtrl, and register it in xml. Change-Id: Ifbc95364b47690117b2875cba1cdc4761ad205be Merged-In: Ifbc95364b47690117b2875cba1cdc4761ad205be Fixes: 71972185 Test: make RunSettingsRoboTests --- res/xml/language_and_input.xml | 31 +++---- .../GameControllerPreferenceController.java | 87 ++++++------------- .../language/LanguageAndInputSettings.java | 12 --- ...ameControllerPreferenceControllerTest.java | 56 ++++++------ 4 files changed, 66 insertions(+), 120 deletions(-) diff --git a/res/xml/language_and_input.xml b/res/xml/language_and_input.xml index d7fad7ee9f5..747d1b4fc41 100644 --- a/res/xml/language_and_input.xml +++ b/res/xml/language_and_input.xml @@ -20,13 +20,13 @@ xmlns:settings="http://schemas.android.com/apk/res-auto" android:key="language_and_input_settings_screen" android:title="@string/language_settings" - settings:initialExpandedChildrenCount="3" > + settings:initialExpandedChildrenCount="3"> + android:fragment="com.android.settings.localepicker.LocaleListEditor" /> + android:fragment="com.android.settings.inputmethod.VirtualKeyboardFragment" /> + android:fragment="com.android.settings.inputmethod.PhysicalKeyboardFragment" /> + android:fragment="com.android.settings.inputmethod.SpellCheckersSettings" /> + android:title="@string/user_dict_settings_title" /> + android:dialogTitle="@string/pointer_speed" /> + android:fragment="com.android.settings.tts.TextToSpeechSettings" /> - - - - - + diff --git a/src/com/android/settings/inputmethod/GameControllerPreferenceController.java b/src/com/android/settings/inputmethod/GameControllerPreferenceController.java index c4e998a7a84..85aef6341da 100644 --- a/src/com/android/settings/inputmethod/GameControllerPreferenceController.java +++ b/src/com/android/settings/inputmethod/GameControllerPreferenceController.java @@ -19,38 +19,27 @@ package com.android.settings.inputmethod; import android.content.Context; import android.hardware.input.InputManager; import android.provider.Settings; -import android.support.annotation.VisibleForTesting; -import android.support.v14.preference.SwitchPreference; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceScreen; -import android.text.TextUtils; import android.view.InputDevice; -import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.R; -import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settings.core.PreferenceControllerMixin; +import com.android.settings.core.TogglePreferenceController; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnPause; import com.android.settingslib.core.lifecycle.events.OnResume; -import java.util.List; - -public class GameControllerPreferenceController extends AbstractPreferenceController +public class GameControllerPreferenceController extends TogglePreferenceController implements PreferenceControllerMixin, InputManager.InputDeviceListener, LifecycleObserver, OnResume, OnPause { - @VisibleForTesting - static final String PREF_KEY = "vibrate_input_devices"; - private static final String CATEGORY_KEY = "game_controller_settings_category"; - private final InputManager mIm; - private PreferenceScreen mScreen; - private Preference mCategory; private Preference mPreference; - public GameControllerPreferenceController(Context context) { - super(context); + public GameControllerPreferenceController(Context context, String key) { + super(context, key); mIm = (InputManager) context.getSystemService(Context.INPUT_SERVICE); } @@ -67,85 +56,61 @@ public class GameControllerPreferenceController extends AbstractPreferenceContro @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); - mScreen = screen; - mCategory = screen.findPreference(CATEGORY_KEY); - mPreference = screen.findPreference(PREF_KEY); + mPreference = screen.findPreference(getPreferenceKey()); } @Override - public boolean isAvailable() { + @AvailabilityStatus + public int getAvailabilityStatus() { // If device explicitly wants to hide this, return early. if (!mContext.getResources().getBoolean(R.bool.config_show_vibrate_input_devices)) { - return false; + return DISABLED_UNSUPPORTED; } final int[] devices = mIm.getInputDeviceIds(); for (int deviceId : devices) { InputDevice device = mIm.getInputDevice(deviceId); if (device != null && !device.isVirtual() && device.getVibrator().hasVibrator()) { - return true; + return AVAILABLE; } } - return false; - } - - @Override - public boolean handlePreferenceTreeClick(Preference preference) { - if (TextUtils.equals(PREF_KEY, preference.getKey())) { - Settings.System.putInt(mContext.getContentResolver(), - Settings.System.VIBRATE_INPUT_DEVICES, - ((SwitchPreference) preference).isChecked() ? 1 : 0); - return true; - } - return false; - } - - @Override - public String getPreferenceKey() { - return CATEGORY_KEY; + return DISABLED_UNSUPPORTED; } @Override public void updateState(Preference preference) { + super.updateState(preference); if (preference == null) { return; } - ((SwitchPreference) preference).setChecked(Settings.System.getInt( - mContext.getContentResolver(), - Settings.System.VIBRATE_INPUT_DEVICES, 1) > 0); + mPreference.setVisible(isAvailable()); } @Override - public void updateNonIndexableKeys(List keys) { - if (!isAvailable()) { - keys.add(CATEGORY_KEY); - keys.add(PREF_KEY); - } + public boolean isChecked() { + return Settings.System.getInt( + mContext.getContentResolver(), + Settings.System.VIBRATE_INPUT_DEVICES, 1) > 0; + } + + @Override + public boolean setChecked(boolean isChecked) { + return Settings.System.putInt(mContext.getContentResolver(), + Settings.System.VIBRATE_INPUT_DEVICES, isChecked ? 1 : 0); } @Override public void onInputDeviceAdded(int deviceId) { - updateGameControllers(); + updateState(mPreference); } @Override public void onInputDeviceRemoved(int deviceId) { - updateGameControllers(); + updateState(mPreference); } @Override public void onInputDeviceChanged(int deviceId) { - updateGameControllers(); - } - - private void updateGameControllers() { - if (isAvailable()) { - mScreen.addPreference(mCategory); - updateState(mPreference); - } else { - if (mCategory != null) { - mScreen.removePreference(mCategory); - } - } + updateState(mPreference); } } diff --git a/src/com/android/settings/language/LanguageAndInputSettings.java b/src/com/android/settings/language/LanguageAndInputSettings.java index 126f3c848df..73cfe27df76 100644 --- a/src/com/android/settings/language/LanguageAndInputSettings.java +++ b/src/com/android/settings/language/LanguageAndInputSettings.java @@ -35,7 +35,6 @@ import com.android.settings.R; import com.android.settings.applications.defaultapps.DefaultAutofillPreferenceController; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.SummaryLoader; -import com.android.settings.inputmethod.GameControllerPreferenceController; import com.android.settings.inputmethod.PhysicalKeyboardPreferenceController; import com.android.settings.inputmethod.SpellCheckerPreferenceController; import com.android.settings.inputmethod.VirtualKeyboardPreferenceController; @@ -124,17 +123,6 @@ public class LanguageAndInputSettings extends DashboardFragment { controllers.add(new DefaultAutofillPreferenceController(context)); controllers.add(new UserDictionaryPreferenceController(context)); - // Game Controller - final GameControllerPreferenceController gameControllerPreferenceController - = new GameControllerPreferenceController(context); - if (lifecycle != null) { - lifecycle.addObserver(gameControllerPreferenceController); - } - controllers.add(gameControllerPreferenceController); - controllers.add(new PreferenceCategoryController(context, - KEY_GAME_CONTROLLER_CATEGORY).setChildren( - Arrays.asList(gameControllerPreferenceController))); - return controllers; } diff --git a/tests/robotests/src/com/android/settings/inputmethod/GameControllerPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/inputmethod/GameControllerPreferenceControllerTest.java index bc4eca80ca3..61283fab3c1 100644 --- a/tests/robotests/src/com/android/settings/inputmethod/GameControllerPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/inputmethod/GameControllerPreferenceControllerTest.java @@ -16,6 +16,8 @@ package com.android.settings.inputmethod; +import static com.android.settings.core.BasePreferenceController.AVAILABLE; +import static com.android.settings.core.BasePreferenceController.DISABLED_UNSUPPORTED; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; @@ -37,10 +39,6 @@ import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - @RunWith(SettingsRobolectricTestRunner.class) public class GameControllerPreferenceControllerTest { @@ -57,7 +55,7 @@ public class GameControllerPreferenceControllerTest { MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application); when(mContext.getSystemService(Context.INPUT_SERVICE)).thenReturn(mInputManager); - mController = new GameControllerPreferenceController(mContext); + mController = new GameControllerPreferenceController(mContext, "test_key"); } @Test @@ -75,59 +73,59 @@ public class GameControllerPreferenceControllerTest { } @Test - public void testIsAvailable_hasDeviceWithVibrator_shouldReturnTrue() { - when(mInputManager.getInputDeviceIds()).thenReturn(new int[]{1}); + public void getAvailabilityStatus_hasDeviceWithVibrator_shouldReturnAvailable() { + when(mInputManager.getInputDeviceIds()).thenReturn(new int[] {1}); when(mInputManager.getInputDevice(1)).thenReturn(mInputDevice); when(mInputDevice.isVirtual()).thenReturn(false); when(mInputDevice.getVibrator().hasVibrator()).thenReturn(true); - assertThat(mController.isAvailable()).isTrue(); + assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE); } @Test - public void testIsAvailable_hasNoVibratingDevice_shouldReturnFalse() { - when(mInputManager.getInputDeviceIds()).thenReturn(new int[]{1}); + public void getAvailabilityStatus_hasNoVibratingDevice_shouldReturnDisabled() { + when(mInputManager.getInputDeviceIds()).thenReturn(new int[] {1}); when(mInputManager.getInputDevice(1)).thenReturn(mInputDevice); when(mInputDevice.isVirtual()).thenReturn(false); when(mInputDevice.getVibrator().hasVibrator()).thenReturn(false); - assertThat(mController.isAvailable()).isFalse(); + assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_UNSUPPORTED); } @Test - public void testIsAvailable_hasNoPhysicalDevice_shouldReturnFalse() { - when(mInputManager.getInputDeviceIds()).thenReturn(new int[]{1}); + public void getAvailabilityStatus_hasNoPhysicalDevice_shouldReturnDisabled() { + when(mInputManager.getInputDeviceIds()).thenReturn(new int[] {1}); when(mInputManager.getInputDevice(1)).thenReturn(mInputDevice); when(mInputDevice.isVirtual()).thenReturn(true); - assertThat(mController.isAvailable()).isFalse(); + assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_UNSUPPORTED); } @Test - public void testIsAvailable_hasNoDevice_shouldReturnFalse() { - when(mInputManager.getInputDeviceIds()).thenReturn(new int[]{}); + public void getAvailabilityStatus_hasNoDevice_shouldReturnDisabled() { + when(mInputManager.getInputDeviceIds()).thenReturn(new int[] {}); - assertThat(mController.isAvailable()).isFalse(); + assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_UNSUPPORTED); } @Test @Config(qualifiers = "mcc999") - public void testIsAvailable_ifDisabled_shouldReturnFalse() { - mController = new GameControllerPreferenceController(mContext); + public void getAvailabilityStatus_ifDisabled_shouldReturnDisabled() { + mController = new GameControllerPreferenceController(mContext, "testkey"); - assertThat(mController.isAvailable()).isFalse(); + assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_UNSUPPORTED); } @Test - public void updateNonIndexableKeys_shouldIncludeCategoryAndPrefKeys() { - when(mInputManager.getInputDeviceIds()).thenReturn(new int[]{}); + public void setChecked_toEnabled_shouldSetToSettingsProvider() { + mController.setChecked(true); + assertThat(mController.isChecked()).isTrue(); + } - final List nonIndexables = new ArrayList<>(); - mController.updateNonIndexableKeys(nonIndexables); - - assertThat(mController.isAvailable()).isFalse(); - assertThat(nonIndexables).containsExactlyElementsIn(Arrays.asList( - GameControllerPreferenceController.PREF_KEY, - mController.getPreferenceKey())); + @Test + public void setChecked_toDisabled_shouldSetToSettingsProvider() { + mController.setChecked(true); + mController.setChecked(false); + assertThat(mController.isChecked()).isFalse(); } } From 1ff466675d81db5da4c319bcefeb249186d0c832 Mon Sep 17 00:00:00 2001 From: hjchangliao Date: Wed, 25 Apr 2018 11:38:05 +0800 Subject: [PATCH 5/7] Make Nfc/Beam searchable based on feature availability Update logic of updateNonIndexableKeys, in BaseNfcPreferenceController to fix issue. Add robotest to avoid same problem. Change-Id: I1de5324b5a7147ff58e3c366ee7e8cf858e3283c Fixes: 78540155 Test: make RunSettingsRoboTests --- .../nfc/BaseNfcPreferenceController.java | 2 +- .../ConnectedDeviceDashboardFragmentTest.java | 3 +-- .../AndroidBeamPreferenceControllerTest.java | 23 +++++++++++++++++++ .../nfc/NfcPreferenceControllerTest.java | 23 +++++++++++++++++++ 4 files changed, 48 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/nfc/BaseNfcPreferenceController.java b/src/com/android/settings/nfc/BaseNfcPreferenceController.java index b945738eab5..33d75fab672 100644 --- a/src/com/android/settings/nfc/BaseNfcPreferenceController.java +++ b/src/com/android/settings/nfc/BaseNfcPreferenceController.java @@ -67,7 +67,7 @@ public abstract class BaseNfcPreferenceController extends AbstractPreferenceCont @Override public void updateNonIndexableKeys(List keys) { - if (isAvailable()) { + if (!isAvailable()) { keys.add(getPreferenceKey()); } } diff --git a/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragmentTest.java index 0230540a61c..90641792639 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragmentTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragmentTest.java @@ -78,7 +78,6 @@ public class ConnectedDeviceDashboardFragmentTest { final List niks = ConnectedDeviceDashboardFragment.SEARCH_INDEX_DATA_PROVIDER .getNonIndexableKeys(mContext); - assertThat(niks).containsExactly(KEY_CONNECTED_DEVICES, KEY_AVAILABLE_DEVICES, - NfcPreferenceController.KEY_TOGGLE_NFC); + assertThat(niks).containsExactly(KEY_CONNECTED_DEVICES, KEY_AVAILABLE_DEVICES); } } diff --git a/tests/robotests/src/com/android/settings/nfc/AndroidBeamPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/nfc/AndroidBeamPreferenceControllerTest.java index cb18b5abd9e..df5bb64c1e8 100644 --- a/tests/robotests/src/com/android/settings/nfc/AndroidBeamPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/nfc/AndroidBeamPreferenceControllerTest.java @@ -41,6 +41,9 @@ import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; import org.robolectric.util.ReflectionHelpers; +import java.util.ArrayList; +import java.util.List; + @RunWith(SettingsRobolectricTestRunner.class) public class AndroidBeamPreferenceControllerTest { @@ -132,4 +135,24 @@ public class AndroidBeamPreferenceControllerTest { mAndroidBeamController.onResume(); assertThat(mAndroidBeamPreference.isEnabled()).isFalse(); } + + @Test + public void updateNonIndexableKeys_available_shouldNotUpdate() { + when(mNfcAdapter.isEnabled()).thenReturn(true); + final List keys = new ArrayList<>(); + + mAndroidBeamController.updateNonIndexableKeys(keys); + + assertThat(keys).isEmpty(); + } + + @Test + public void updateNonIndexableKeys_notAvailable_shouldUpdate() { + ReflectionHelpers.setField(mAndroidBeamController, "mNfcAdapter", null); + final List keys = new ArrayList<>(); + + mAndroidBeamController.updateNonIndexableKeys(keys); + + assertThat(keys).hasSize(1); + } } diff --git a/tests/robotests/src/com/android/settings/nfc/NfcPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/nfc/NfcPreferenceControllerTest.java index cd90820b449..802e199abf2 100644 --- a/tests/robotests/src/com/android/settings/nfc/NfcPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/nfc/NfcPreferenceControllerTest.java @@ -39,6 +39,9 @@ import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; import org.robolectric.util.ReflectionHelpers; +import java.util.ArrayList; +import java.util.List; + @RunWith(SettingsRobolectricTestRunner.class) public class NfcPreferenceControllerTest { @@ -134,4 +137,24 @@ public class NfcPreferenceControllerTest { mNfcController.onResume(); assertThat(mNfcPreference.isChecked()).isFalse(); } + + @Test + public void updateNonIndexableKeys_available_shouldNotUpdate() { + when(mNfcAdapter.isEnabled()).thenReturn(true); + final List keys = new ArrayList<>(); + + mNfcController.updateNonIndexableKeys(keys); + + assertThat(keys).isEmpty(); + } + + @Test + public void updateNonIndexableKeys_notAvailable_shouldUpdate() { + ReflectionHelpers.setField(mNfcController, "mNfcAdapter", null); + final List keys = new ArrayList<>(); + + mNfcController.updateNonIndexableKeys(keys); + + assertThat(keys).hasSize(1); + } } From 0890c337bae9e142c08653580ff51cbe4632c769 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Wed, 25 Apr 2018 12:40:14 -0700 Subject: [PATCH 6/7] Use colorPrimary for search bar and suggestion background Bug: 78519022 Test: visual Change-Id: I36b00c689eba1d731e37f8ffb38ab8ee59dba59a Merged-In: I36b00c689eba1d731e37f8ffb38ab8ee59dba59a --- res/layout/settings_main_dashboard.xml | 2 +- res/values/styles.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/res/layout/settings_main_dashboard.xml b/res/layout/settings_main_dashboard.xml index 10ff2eeff30..c430d6de126 100644 --- a/res/layout/settings_main_dashboard.xml +++ b/res/layout/settings_main_dashboard.xml @@ -27,7 +27,7 @@ android:id="@+id/search_bar_container" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="@color/suggestion_condition_background"> + android:background="?android:attr/colorPrimary">