diff options
10 files changed, 289 insertions, 5 deletions
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingFooterPreference.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingFooterPreference.java index 2099b33b78b5..e84a5d2874ec 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingFooterPreference.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingFooterPreference.java @@ -31,7 +31,7 @@ public class DeviceSettingFooterPreference extends DeviceSettingPreference imple DeviceSettingFooterPreference( @NonNull String footerText, Bundle extras) { - super(DeviceSettingType.DEVICE_SETTING_TYPE_MULTI_TOGGLE); + super(DeviceSettingType.DEVICE_SETTING_TYPE_FOOTER); mFooterText = footerText; mExtras = extras; } diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingHelpPreference.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingHelpPreference.java new file mode 100644 index 000000000000..953e7cb0fc5d --- /dev/null +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingHelpPreference.java @@ -0,0 +1,132 @@ +/* + * Copyright (C) 2024 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.settingslib.bluetooth.devicesettings; + +import android.content.Intent; +import android.os.Bundle; +import android.os.Parcel; +import android.os.Parcelable; + +import androidx.annotation.NonNull; + +/** A data class representing a help button displayed on the top right corner of the page. */ +public class DeviceSettingHelpPreference extends DeviceSettingPreference implements Parcelable { + + private final Intent mIntent; + private final Bundle mExtras; + + DeviceSettingHelpPreference(@NonNull Intent intent, Bundle extras) { + super(DeviceSettingType.DEVICE_SETTING_TYPE_HELP); + mIntent = intent; + mExtras = extras; + } + + /** Read a {@link DeviceSettingHelpPreference} from {@link Parcel}. */ + @NonNull + public static DeviceSettingHelpPreference readFromParcel(@NonNull Parcel in) { + Intent intent = in.readParcelable(Intent.class.getClassLoader()); + Bundle extras = in.readBundle(Bundle.class.getClassLoader()); + return new DeviceSettingHelpPreference(intent, extras); + } + + public static final Creator<DeviceSettingHelpPreference> CREATOR = + new Creator<>() { + @Override + @NonNull + public DeviceSettingHelpPreference createFromParcel(@NonNull Parcel in) { + in.readInt(); + return readFromParcel(in); + } + + @Override + @NonNull + public DeviceSettingHelpPreference[] newArray(int size) { + return new DeviceSettingHelpPreference[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + super.writeToParcel(dest, flags); + dest.writeParcelable(mIntent, flags); + dest.writeBundle(mExtras); + } + + /** Builder class for {@link DeviceSettingHelpPreference}. */ + public static final class Builder { + private Intent mIntent; + private Bundle mExtras = Bundle.EMPTY; + + /** + * Sets the intent of the preference, should be an activity intent. + * + * @param intent The intent to launch when clicked. + * @return Returns the Builder object. + */ + @NonNull + public DeviceSettingHelpPreference.Builder setIntent(@NonNull Intent intent) { + mIntent = intent; + return this; + } + + /** + * Sets the extras bundle. + * + * @return Returns the Builder object. + */ + @NonNull + public DeviceSettingHelpPreference.Builder setExtras(@NonNull Bundle extras) { + mExtras = extras; + return this; + } + + /** + * Builds the {@link DeviceSettingHelpPreference} object. + * + * @return Returns the built {@link DeviceSettingHelpPreference} object. + */ + @NonNull + public DeviceSettingHelpPreference build() { + return new DeviceSettingHelpPreference(mIntent, mExtras); + } + } + + /** + * Gets the intent to launch when clicked. + * + * @return The intent. + */ + @NonNull + public Intent getIntent() { + return mIntent; + } + + /** + * Gets the extras Bundle. + * + * @return Returns a Bundle object. + */ + @NonNull + public Bundle getExtras() { + return mExtras; + } +} diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingType.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingType.java index 441e3f86708d..ae3bf5e3fc72 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingType.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingType.java @@ -42,4 +42,7 @@ public @interface DeviceSettingType { /** Device setting type is footer preference. */ int DEVICE_SETTING_TYPE_FOOTER = 3; + + /** Device setting type is "help" preference. */ + int DEVICE_SETTING_TYPE_HELP = 4; } diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingsConfig.kt b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingsConfig.kt index 127275fe28d2..5656f38a0a11 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingsConfig.kt +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingsConfig.kt @@ -25,12 +25,13 @@ import android.os.Parcelable * * @property mainContentItems The setting items to be shown in main page. * @property moreSettingsItems The setting items to be shown in more settings page. - * @property moreSettingsFooter The footer in more settings page. + * @property moreSettingsHelpItem The help item displayed on the top right corner of the page. * @property extras Extra bundle */ data class DeviceSettingsConfig( val mainContentItems: List<DeviceSettingItem>, val moreSettingsItems: List<DeviceSettingItem>, + val moreSettingsHelpItem: DeviceSettingItem?, val extras: Bundle = Bundle.EMPTY, ) : Parcelable { @@ -40,6 +41,7 @@ data class DeviceSettingsConfig( parcel.run { writeTypedList(mainContentItems) writeTypedList(moreSettingsItems) + writeParcelable(moreSettingsHelpItem, flags) writeBundle(extras) } } @@ -59,7 +61,9 @@ data class DeviceSettingsConfig( arrayListOf<DeviceSettingItem>().also { readTypedList(it, DeviceSettingItem.CREATOR) }, - extras = readBundle((Bundle::class.java.classLoader))!!, + moreSettingsHelpItem = readParcelable( + DeviceSettingItem::class.java.classLoader + ) ) } diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/data/repository/DeviceSettingRepository.kt b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/data/repository/DeviceSettingRepository.kt index cded014feda1..457d6a3a714d 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/data/repository/DeviceSettingRepository.kt +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/data/repository/DeviceSettingRepository.kt @@ -26,6 +26,7 @@ import com.android.settingslib.bluetooth.devicesettings.DeviceSettingId import com.android.settingslib.bluetooth.devicesettings.DeviceSettingItem import com.android.settingslib.bluetooth.devicesettings.DeviceSettingsConfig import com.android.settingslib.bluetooth.devicesettings.DeviceSettingFooterPreference +import com.android.settingslib.bluetooth.devicesettings.DeviceSettingHelpPreference import com.android.settingslib.bluetooth.devicesettings.MultiTogglePreference import com.android.settingslib.bluetooth.devicesettings.ToggleInfo import com.android.settingslib.bluetooth.devicesettings.shared.model.DeviceSettingConfigItemModel @@ -97,7 +98,8 @@ class DeviceSettingRepositoryImpl( private fun DeviceSettingsConfig.toModel(): DeviceSettingConfigModel = DeviceSettingConfigModel( mainItems = mainContentItems.map { it.toModel() }, - moreSettingsItems = moreSettingsItems.map { it.toModel() }) + moreSettingsItems = moreSettingsItems.map { it.toModel() }, + moreSettingsHelpItem = moreSettingsHelpItem?.toModel(), ) private fun DeviceSettingItem.toModel(): DeviceSettingConfigItemModel { return if (!TextUtils.isEmpty(preferenceKey)) { @@ -154,6 +156,9 @@ class DeviceSettingRepositoryImpl( is DeviceSettingFooterPreference -> DeviceSettingModel.FooterPreference( cachedDevice = cachedDevice, id = settingId, footerText = pref.footerText) + is DeviceSettingHelpPreference -> DeviceSettingModel.HelpPreference( + cachedDevice = cachedDevice, + id = settingId, intent = pref.intent) else -> DeviceSettingModel.Unknown(cachedDevice, settingId) } diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/shared/model/DeviceSettingConfigModel.kt b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/shared/model/DeviceSettingConfigModel.kt index 406246246e7e..c1ac763929cd 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/shared/model/DeviceSettingConfigModel.kt +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/shared/model/DeviceSettingConfigModel.kt @@ -24,6 +24,11 @@ data class DeviceSettingConfigModel( val mainItems: List<DeviceSettingConfigItemModel>, /** Items need to be shown in device details more settings page. */ val moreSettingsItems: List<DeviceSettingConfigItemModel>, + /** + * Help button which need to be shown on the top right corner of device details more settings + * page. + */ + val moreSettingsHelpItem: DeviceSettingConfigItemModel?, ) /** Models a device setting item in config. */ diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/shared/model/DeviceSettingModel.kt b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/shared/model/DeviceSettingModel.kt index 5fd4d06872c8..73648acd801e 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/shared/model/DeviceSettingModel.kt +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/shared/model/DeviceSettingModel.kt @@ -59,6 +59,13 @@ sealed interface DeviceSettingModel { val footerText: String, ) : DeviceSettingModel + /** Models a help preference displayed on the top right corner of the fragment. */ + data class HelpPreference( + override val cachedDevice: CachedBluetoothDevice, + @DeviceSettingId override val id: Int, + val intent: Intent, + ) : DeviceSettingModel + /** Models an unknown preference. */ data class Unknown( override val cachedDevice: CachedBluetoothDevice, diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingHelpPreferenceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingHelpPreferenceTest.java new file mode 100644 index 000000000000..5620ba31758c --- /dev/null +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingHelpPreferenceTest.java @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2024 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.settingslib.bluetooth.devicesettings; + +import static com.google.common.truth.Truth.assertThat; + +import android.content.Intent; +import android.os.Bundle; +import android.os.Parcel; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; + +@RunWith(RobolectricTestRunner.class) +public final class DeviceSettingHelpPreferenceTest { + + @Test + public void getMethods() { + Intent intent = new Intent(); + DeviceSettingHelpPreference preference = + new DeviceSettingHelpPreference.Builder() + .setIntent(intent) + .setExtras(buildBundle("key1", "value1")) + .build(); + + assertThat(preference.getIntent()).isSameInstanceAs(intent); + assertThat(preference.getExtras().getString("key1")).isEqualTo("value1"); + } + + @Test + public void parcelOperation() { + Intent intent = new Intent("intent_action"); + DeviceSettingHelpPreference preference = + new DeviceSettingHelpPreference.Builder() + .setIntent(intent) + .setExtras(buildBundle("key1", "value1")) + .build(); + + DeviceSettingHelpPreference fromParcel = writeAndRead(preference); + + assertThat(fromParcel.getIntent().getAction()) + .isEqualTo(preference.getIntent().getAction()); + assertThat(fromParcel.getExtras().getString("key1")) + .isEqualTo(preference.getExtras().getString("key1")); + } + + private Bundle buildBundle(String key, String value) { + Bundle bundle = new Bundle(); + bundle.putString(key, value); + return bundle; + } + + private DeviceSettingHelpPreference writeAndRead(DeviceSettingHelpPreference preference) { + Parcel parcel = Parcel.obtain(); + preference.writeToParcel(parcel, 0); + parcel.setDataPosition(0); + DeviceSettingHelpPreference fromParcel = + DeviceSettingHelpPreference.CREATOR.createFromParcel(parcel); + return fromParcel; + } +} diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingsConfigTest.kt b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingsConfigTest.kt index 7223e9032648..a0a2658b05d3 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingsConfigTest.kt +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/devicesettings/DeviceSettingsConfigTest.kt @@ -50,6 +50,14 @@ class DeviceSettingsConfigTest { null, Bundle(), )), + moreSettingsHelpItem = DeviceSettingItem( + 3, + "package_name_2", + "class_name_2", + "intent_action_2", + null, + Bundle(), + ), extras = Bundle().apply { putString("key1", "value1") }, ) @@ -71,6 +79,10 @@ class DeviceSettingsConfigTest { .containsExactly("class_name_2") assertThat(fromParcel.moreSettingsItems.stream().map { it.intentAction }.toList()) .containsExactly("intent_action_2") + assertThat(fromParcel.moreSettingsHelpItem?.settingId).isEqualTo(3) + assertThat(fromParcel.moreSettingsHelpItem?.packageName).isEqualTo("package_name_2") + assertThat(fromParcel.moreSettingsHelpItem?.className).isEqualTo("class_name_2") + assertThat(fromParcel.moreSettingsHelpItem?.intentAction).isEqualTo("intent_action_2") } private fun writeAndRead(item: DeviceSettingsConfig): DeviceSettingsConfig { diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/devicesettings/data/repository/DeviceSettingRepositoryTest.kt b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/devicesettings/data/repository/DeviceSettingRepositoryTest.kt index 061d5150f60a..95ee46e4fdb9 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/devicesettings/data/repository/DeviceSettingRepositoryTest.kt +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/devicesettings/data/repository/DeviceSettingRepositoryTest.kt @@ -28,6 +28,7 @@ import com.android.settingslib.bluetooth.devicesettings.ActionSwitchPreference import com.android.settingslib.bluetooth.devicesettings.ActionSwitchPreferenceState import com.android.settingslib.bluetooth.devicesettings.DeviceInfo import com.android.settingslib.bluetooth.devicesettings.DeviceSetting +import com.android.settingslib.bluetooth.devicesettings.DeviceSettingHelpPreference import com.android.settingslib.bluetooth.devicesettings.DeviceSettingId import com.android.settingslib.bluetooth.devicesettings.DeviceSettingItem import com.android.settingslib.bluetooth.devicesettings.DeviceSettingState @@ -246,6 +247,28 @@ class DeviceSettingRepositoryTest { } @Test + fun getDeviceSetting_helpPreference_success() { + testScope.runTest { + `when`(configService.getDeviceSettingsConfig(any())).thenReturn(DEVICE_SETTING_CONFIG) + `when`(settingProviderService2.registerDeviceSettingsListener(any(), any())).then { + input -> + input + .getArgument<IDeviceSettingsListener>(1) + .onDeviceSettingsChanged(listOf(DEVICE_SETTING_HELP)) + } + var setting: DeviceSettingModel? = null + + underTest + .getDeviceSetting(cachedDevice, DEVICE_SETTING_ID_HELP) + .onEach { setting = it } + .launchIn(backgroundScope) + runCurrent() + + assertDeviceSetting(setting!!, DEVICE_SETTING_HELP) + } + } + + @Test fun getDeviceSetting_noConfig_returnNull() { testScope.runTest { `when`(settingProviderService1.registerDeviceSettingsListener(any(), any())).then { @@ -359,6 +382,12 @@ class DeviceSettingRepositoryTest { assertToggle(actual.toggles[i], pref.toggleInfos[i]) } } + is DeviceSettingModel.HelpPreference -> { + assertThat(serviceResponse.preference) + .isInstanceOf(DeviceSettingHelpPreference::class.java) + val pref = serviceResponse.preference as DeviceSettingHelpPreference + assertThat(actual.intent).isSameInstanceAs(pref.intent) + } else -> {} } } @@ -418,7 +447,7 @@ class DeviceSettingRepositoryTest { CONFIG_SERVICE_INTENT_ACTION + "</DEVICE_SETTINGS_CONFIG_ACTION>" val DEVICE_INFO = DeviceInfo.Builder().setBluetoothAddress(BLUETOOTH_ADDRESS).build() - + const val DEVICE_SETTING_ID_HELP = 12345 val DEVICE_SETTING_ITEM_1 = DeviceSettingItem( DeviceSettingId.DEVICE_SETTING_ID_HEADER, @@ -431,6 +460,12 @@ class DeviceSettingRepositoryTest { SETTING_PROVIDER_SERVICE_PACKAGE_NAME_2, SETTING_PROVIDER_SERVICE_CLASS_NAME_2, SETTING_PROVIDER_SERVICE_INTENT_ACTION_2) + val DEVICE_SETTING_HELP_ITEM = + DeviceSettingItem( + DEVICE_SETTING_ID_HELP, + SETTING_PROVIDER_SERVICE_PACKAGE_NAME_2, + SETTING_PROVIDER_SERVICE_CLASS_NAME_2, + SETTING_PROVIDER_SERVICE_INTENT_ACTION_2) val DEVICE_SETTING_1 = DeviceSetting.Builder() .setSettingId(DeviceSettingId.DEVICE_SETTING_ID_HEADER) @@ -460,10 +495,15 @@ class DeviceSettingRepositoryTest { .build()) .build()) .build() + val DEVICE_SETTING_HELP = DeviceSetting.Builder() + .setSettingId(DEVICE_SETTING_ID_HELP) + .setPreference(DeviceSettingHelpPreference.Builder().setIntent(Intent()).build()) + .build() val DEVICE_SETTING_CONFIG = DeviceSettingsConfig( listOf(DEVICE_SETTING_ITEM_1), listOf(DEVICE_SETTING_ITEM_2), + DEVICE_SETTING_HELP_ITEM, ) } } |