From 6189f9fcbd9c308aa1cb2c29b7b125af9f9c926a Mon Sep 17 00:00:00 2001 From: danielwbhuang Date: Tue, 16 May 2023 17:09:30 +0800 Subject: [PATCH] Use FeatureProvider to provide the firmware update category. 1. Add KeyboardSettingsFeatureProvider in FeatureFactory. 2. Use KeyboardSettingsFeatureProvider to add firmware update UI. Bug: 270114180 Test: manual, atest KeyboardSettingsFeatureProviderImplTest Change-Id: I62ec7aff71dd5c0d496860363f2c5b3e992503ff --- .../KeyboardSettingsFeatureProvider.java | 44 ++++++++++++++ .../KeyboardSettingsFeatureProviderImpl.java | 37 ++++++++++++ .../inputmethod/PhysicalKeyboardFragment.java | 12 ++++ .../settings/overlay/FeatureFactory.java | 6 ++ .../settings/overlay/FeatureFactoryImpl.java | 11 ++++ .../testutils/FakeFeatureFactory.java | 8 +++ .../settings/testutils/FakeFeatureFactory.kt | 5 ++ ...yboardSettingsFeatureProviderImplTest.java | 60 +++++++++++++++++++ .../testutils/FakeFeatureFactory.java | 8 +++ 9 files changed, 191 insertions(+) create mode 100644 src/com/android/settings/inputmethod/KeyboardSettingsFeatureProvider.java create mode 100644 src/com/android/settings/inputmethod/KeyboardSettingsFeatureProviderImpl.java create mode 100644 tests/unit/src/com/android/settings/inputmethod/KeyboardSettingsFeatureProviderImplTest.java diff --git a/src/com/android/settings/inputmethod/KeyboardSettingsFeatureProvider.java b/src/com/android/settings/inputmethod/KeyboardSettingsFeatureProvider.java new file mode 100644 index 00000000000..52e9c18612d --- /dev/null +++ b/src/com/android/settings/inputmethod/KeyboardSettingsFeatureProvider.java @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2023 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.inputmethod; + +import android.content.Context; + +import androidx.preference.PreferenceScreen; + +/** + * Provider for Keyboard settings related features. + */ +public interface KeyboardSettingsFeatureProvider { + + /** + * Checks whether the connected device supports firmware update. + * + * @return true if the connected device supports firmware update. + */ + boolean supportsFirmwareUpdate(); + + /** + * Add firmware update preference category . + * + * @param context The context to initialize the application with. + * @param screen The {@link PreferenceScreen} to add the firmware update preference category. + * + * @return true if the category is added successfully. + */ + boolean addFirmwareUpdateCategory(Context context, PreferenceScreen screen); +} diff --git a/src/com/android/settings/inputmethod/KeyboardSettingsFeatureProviderImpl.java b/src/com/android/settings/inputmethod/KeyboardSettingsFeatureProviderImpl.java new file mode 100644 index 00000000000..b0eb31b4174 --- /dev/null +++ b/src/com/android/settings/inputmethod/KeyboardSettingsFeatureProviderImpl.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2023 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.inputmethod; + +import android.content.Context; + +import androidx.preference.PreferenceScreen; + +/** + * Provider implementation for keyboard settings related features. + */ +public class KeyboardSettingsFeatureProviderImpl implements KeyboardSettingsFeatureProvider { + + @Override + public boolean supportsFirmwareUpdate() { + return false; + } + + @Override + public boolean addFirmwareUpdateCategory(Context context, PreferenceScreen screen) { + return false; + } +} diff --git a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java index 936de38ecac..f504fbaaf3f 100644 --- a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java +++ b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java @@ -48,6 +48,7 @@ import com.android.settings.R; import com.android.settings.Settings; import com.android.settings.SettingsPreferenceFragment; import com.android.settings.core.SubSettingLauncher; +import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.utils.ThreadUtils; @@ -75,6 +76,7 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment private InputManager mIm; private InputMethodManager mImm; private InputDeviceIdentifier mAutoInputDeviceIdentifier; + private KeyboardSettingsFeatureProvider mFeatureProvider; @NonNull private PreferenceCategory mKeyboardAssistanceCategory; @NonNull @@ -82,6 +84,7 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment private Intent mIntentWaitingForResult; private boolean mIsNewKeyboardSettings; + private boolean mSupportsFirmwareUpdate; static final String EXTRA_BT_ADDRESS = "extra_bt_address"; private String mBluetoothAddress; @@ -104,6 +107,12 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment (SwitchPreference) mKeyboardAssistanceCategory.findPreference( SHOW_VIRTUAL_KEYBOARD_SWITCH)); + FeatureFactory featureFactory = FeatureFactory.getFactory(getContext()); + mFeatureProvider = featureFactory.getKeyboardSettingsFeatureProvider(); + mSupportsFirmwareUpdate = mFeatureProvider.supportsFirmwareUpdate(); + if (mSupportsFirmwareUpdate) { + mFeatureProvider.addFirmwareUpdateCategory(getContext(), getPreferenceScreen()); + } mIsNewKeyboardSettings = FeatureFlagUtils.isEnabled( getContext(), FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_UI); boolean isModifierKeySettingsEnabled = FeatureFlagUtils @@ -247,6 +256,9 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment } mKeyboardAssistanceCategory.setOrder(1); preferenceScreen.addPreference(mKeyboardAssistanceCategory); + if (mSupportsFirmwareUpdate) { + mFeatureProvider.addFirmwareUpdateCategory(getPrefContext(), preferenceScreen); + } updateShowVirtualKeyboardSwitch(); } diff --git a/src/com/android/settings/overlay/FeatureFactory.java b/src/com/android/settings/overlay/FeatureFactory.java index a6d595810b3..9d81baa9bca 100644 --- a/src/com/android/settings/overlay/FeatureFactory.java +++ b/src/com/android/settings/overlay/FeatureFactory.java @@ -39,6 +39,7 @@ import com.android.settings.fuelgauge.BatteryStatusFeatureProvider; import com.android.settings.fuelgauge.PowerUsageFeatureProvider; import com.android.settings.gestures.AssistGestureFeatureProvider; import com.android.settings.homepage.contextualcards.ContextualCardFeatureProvider; +import com.android.settings.inputmethod.KeyboardSettingsFeatureProvider; import com.android.settings.localepicker.LocaleFeatureProvider; import com.android.settings.panel.PanelFeatureProvider; import com.android.settings.search.SearchFeatureProvider; @@ -198,6 +199,11 @@ public abstract class FeatureFactory { */ public abstract WifiFeatureProvider getWifiFeatureProvider(); + /** + * Retrieves implementation for keyboard settings feature. + */ + public abstract KeyboardSettingsFeatureProvider getKeyboardSettingsFeatureProvider(); + public static final class FactoryNotFoundException extends RuntimeException { public FactoryNotFoundException(Throwable throwable) { super("Unable to create factory. Did you misconfigure Proguard?", throwable); diff --git a/src/com/android/settings/overlay/FeatureFactoryImpl.java b/src/com/android/settings/overlay/FeatureFactoryImpl.java index 584e72a08c5..d4f18782c05 100644 --- a/src/com/android/settings/overlay/FeatureFactoryImpl.java +++ b/src/com/android/settings/overlay/FeatureFactoryImpl.java @@ -59,6 +59,8 @@ import com.android.settings.gestures.AssistGestureFeatureProvider; import com.android.settings.gestures.AssistGestureFeatureProviderImpl; import com.android.settings.homepage.contextualcards.ContextualCardFeatureProvider; import com.android.settings.homepage.contextualcards.ContextualCardFeatureProviderImpl; +import com.android.settings.inputmethod.KeyboardSettingsFeatureProvider; +import com.android.settings.inputmethod.KeyboardSettingsFeatureProviderImpl; import com.android.settings.localepicker.LocaleFeatureProvider; import com.android.settings.localepicker.LocaleFeatureProviderImpl; import com.android.settings.panel.PanelFeatureProvider; @@ -114,6 +116,7 @@ public class FeatureFactoryImpl extends FeatureFactory { private AccessibilityMetricsFeatureProvider mAccessibilityMetricsFeatureProvider; private AdvancedVpnFeatureProvider mAdvancedVpnFeatureProvider; private WifiFeatureProvider mWifiFeatureProvider; + private KeyboardSettingsFeatureProvider mKeyboardSettingsFeatureProvider; @Override public SupportFeatureProvider getSupportFeatureProvider(Context context) { @@ -365,4 +368,12 @@ public class FeatureFactoryImpl extends FeatureFactory { } return mWifiFeatureProvider; } + + @Override + public KeyboardSettingsFeatureProvider getKeyboardSettingsFeatureProvider() { + if (mKeyboardSettingsFeatureProvider == null) { + mKeyboardSettingsFeatureProvider = new KeyboardSettingsFeatureProviderImpl(); + } + return mKeyboardSettingsFeatureProvider; + } } diff --git a/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java b/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java index a17ce4f8608..47053802e39 100644 --- a/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java +++ b/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java @@ -37,6 +37,7 @@ import com.android.settings.fuelgauge.BatteryStatusFeatureProvider; import com.android.settings.fuelgauge.PowerUsageFeatureProvider; import com.android.settings.gestures.AssistGestureFeatureProvider; import com.android.settings.homepage.contextualcards.ContextualCardFeatureProvider; +import com.android.settings.inputmethod.KeyboardSettingsFeatureProvider; import com.android.settings.localepicker.LocaleFeatureProvider; import com.android.settings.overlay.DockUpdaterFeatureProvider; import com.android.settings.overlay.FeatureFactory; @@ -93,6 +94,7 @@ public class FakeFeatureFactory extends FeatureFactory { public AccessibilityMetricsFeatureProvider mAccessibilityMetricsFeatureProvider; public AdvancedVpnFeatureProvider mAdvancedVpnFeatureProvider; public WifiFeatureProvider mWifiFeatureProvider; + public KeyboardSettingsFeatureProvider mKeyboardSettingsFeatureProvider; /** * Call this in {@code @Before} method of the test class to use fake factory. @@ -145,6 +147,7 @@ public class FakeFeatureFactory extends FeatureFactory { mAccessibilityMetricsFeatureProvider = mock(AccessibilityMetricsFeatureProvider.class); mAdvancedVpnFeatureProvider = mock(AdvancedVpnFeatureProvider.class); mWifiFeatureProvider = mock(WifiFeatureProvider.class); + mKeyboardSettingsFeatureProvider = mock(KeyboardSettingsFeatureProvider.class); } @Override @@ -296,4 +299,9 @@ public class FakeFeatureFactory extends FeatureFactory { public WifiFeatureProvider getWifiFeatureProvider() { return mWifiFeatureProvider; } + + @Override + public KeyboardSettingsFeatureProvider getKeyboardSettingsFeatureProvider() { + return mKeyboardSettingsFeatureProvider; + } } diff --git a/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt b/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt index da6e8231536..50589ac67e0 100644 --- a/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt +++ b/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt @@ -33,6 +33,7 @@ import com.android.settings.fuelgauge.BatteryStatusFeatureProvider import com.android.settings.fuelgauge.PowerUsageFeatureProvider import com.android.settings.gestures.AssistGestureFeatureProvider import com.android.settings.homepage.contextualcards.ContextualCardFeatureProvider +import com.android.settings.inputmethod.KeyboardSettingsFeatureProvider import com.android.settings.localepicker.LocaleFeatureProvider import com.android.settings.overlay.DockUpdaterFeatureProvider import com.android.settings.overlay.FeatureFactory @@ -182,4 +183,8 @@ class FakeFeatureFactory : FeatureFactory() { override fun getWifiFeatureProvider(): WifiFeatureProvider { TODO("Not yet implemented") } + + override fun getKeyboardSettingsFeatureProvider(): KeyboardSettingsFeatureProvider { + TODO("Not yet implemented") + } } diff --git a/tests/unit/src/com/android/settings/inputmethod/KeyboardSettingsFeatureProviderImplTest.java b/tests/unit/src/com/android/settings/inputmethod/KeyboardSettingsFeatureProviderImplTest.java new file mode 100644 index 00000000000..72facc3dfa4 --- /dev/null +++ b/tests/unit/src/com/android/settings/inputmethod/KeyboardSettingsFeatureProviderImplTest.java @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2021 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.inputmethod; + +import static com.google.common.truth.Truth.assertThat; + +import android.content.Context; +import android.os.Looper; + +import androidx.preference.PreferenceManager; +import androidx.preference.PreferenceScreen; +import androidx.test.core.app.ApplicationProvider; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +public class KeyboardSettingsFeatureProviderImplTest { + + private Context mContext; + private KeyboardSettingsFeatureProviderImpl mFeatureProvider; + + @Before + public void setUp() { + mContext = ApplicationProvider.getApplicationContext(); + mFeatureProvider = new KeyboardSettingsFeatureProviderImpl(); + } + + @Test + public void supportsFirmwareUpdate_defaultValue_returnsFalse() { + assertThat(mFeatureProvider.supportsFirmwareUpdate()).isFalse(); + } + + @Test + public void addFirmwareUpdateCategory_defaultValue_returnsFalse() { + if (Looper.myLooper() == null) { + Looper.prepare(); + } + PreferenceManager preferenceManager = new PreferenceManager(mContext); + PreferenceScreen screen = preferenceManager.createPreferenceScreen(mContext); + + assertThat(mFeatureProvider.addFirmwareUpdateCategory(mContext, screen)).isFalse(); + } +} diff --git a/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java b/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java index 0150b726544..d7490100990 100644 --- a/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java +++ b/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java @@ -35,6 +35,7 @@ import com.android.settings.fuelgauge.BatteryStatusFeatureProvider; import com.android.settings.fuelgauge.PowerUsageFeatureProvider; import com.android.settings.gestures.AssistGestureFeatureProvider; import com.android.settings.homepage.contextualcards.ContextualCardFeatureProvider; +import com.android.settings.inputmethod.KeyboardSettingsFeatureProvider; import com.android.settings.localepicker.LocaleFeatureProvider; import com.android.settings.overlay.DockUpdaterFeatureProvider; import com.android.settings.overlay.FeatureFactory; @@ -88,6 +89,7 @@ public class FakeFeatureFactory extends FeatureFactory { public AccessibilityMetricsFeatureProvider mAccessibilityMetricsFeatureProvider; public AdvancedVpnFeatureProvider mAdvancedVpnFeatureProvider; public WifiFeatureProvider mWifiFeatureProvider; + public KeyboardSettingsFeatureProvider mKeyboardSettingsFeatureProvider; /** * Call this in {@code @Before} method of the test class to use fake factory. @@ -131,6 +133,7 @@ public class FakeFeatureFactory extends FeatureFactory { mAccessibilityMetricsFeatureProvider = mock(AccessibilityMetricsFeatureProvider.class); mAdvancedVpnFeatureProvider = mock(AdvancedVpnFeatureProvider.class); mWifiFeatureProvider = mock(WifiFeatureProvider.class); + mKeyboardSettingsFeatureProvider = mock(KeyboardSettingsFeatureProvider.class); } @Override @@ -282,4 +285,9 @@ public class FakeFeatureFactory extends FeatureFactory { public WifiFeatureProvider getWifiFeatureProvider() { return mWifiFeatureProvider; } + + @Override + public KeyboardSettingsFeatureProvider getKeyboardSettingsFeatureProvider() { + return mKeyboardSettingsFeatureProvider; + } }