From 792d8a97dd1e8e8892b1c99b78aabf53227241f7 Mon Sep 17 00:00:00 2001 From: Jason Chiu Date: Mon, 28 Oct 2024 15:57:19 +0800 Subject: [PATCH] [Catalyst] Tethering screen migration - Add a flag for the migration - Add the skeleton of the screen Test: atest TetherScreenTest Bug: 368359963 Flag: com.android.settings.flags.catalyst_tether_settings Change-Id: Ib9987def4f1a644f7661e75c314b3a556e8f210c --- aconfig/catalyst/network_and_internet.aconfig | 7 ++ .../settings/network/tether/TetherScreen.kt | 63 +++++++++++ .../network/tether/TetherSettings.java | 6 + .../network/tether/TetherScreenTest.kt | 103 ++++++++++++++++++ 4 files changed, 179 insertions(+) create mode 100644 src/com/android/settings/network/tether/TetherScreen.kt create mode 100644 tests/robotests/src/com/android/settings/network/tether/TetherScreenTest.kt diff --git a/aconfig/catalyst/network_and_internet.aconfig b/aconfig/catalyst/network_and_internet.aconfig index e8943e66d84..aa26ce42be6 100644 --- a/aconfig/catalyst/network_and_internet.aconfig +++ b/aconfig/catalyst/network_and_internet.aconfig @@ -22,6 +22,13 @@ flag { bug: "323791114" } +flag { + name: "catalyst_tether_settings" + namespace: "android_settings" + description: "Flag for Hotspot & tethering" + bug: "323791114" +} + flag { name: "catalyst_adaptive_connectivity" namespace: "android_settings" diff --git a/src/com/android/settings/network/tether/TetherScreen.kt b/src/com/android/settings/network/tether/TetherScreen.kt new file mode 100644 index 00000000000..20dc4b704fc --- /dev/null +++ b/src/com/android/settings/network/tether/TetherScreen.kt @@ -0,0 +1,63 @@ +/* + * 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.settings.network.tether + +import android.content.Context +import android.net.TetheringManager +import com.android.settings.R +import com.android.settings.flags.Flags +import com.android.settings.network.TetherPreferenceController +import com.android.settingslib.TetherUtil +import com.android.settingslib.Utils +import com.android.settingslib.metadata.PreferenceAvailabilityProvider +import com.android.settingslib.metadata.ProvidePreferenceScreen +import com.android.settingslib.metadata.preferenceHierarchy +import com.android.settingslib.preference.PreferenceScreenCreator + +@ProvidePreferenceScreen +class TetherScreen : PreferenceScreenCreator, PreferenceAvailabilityProvider { + + override val key: String + get() = KEY + + override val icon: Int + get() = R.drawable.ic_wifi_tethering + + override val keywords: Int + get() = R.string.keywords_hotspot_tethering + + override fun getPreferenceTitle(context: Context): CharSequence? = + if (TetherPreferenceController.isTetherConfigDisallowed(context)) { + context.getText(R.string.tether_settings_title_all) + } else { + val tetheringManager = context.getSystemService(TetheringManager::class.java)!! + context.getText(Utils.getTetheringLabel(tetheringManager)) + } + + override fun isAvailable(context: Context) = TetherUtil.isTetherAvailable(context) + + override fun isFlagEnabled(context: Context) = Flags.catalystTetherSettings() + + override fun hasCompleteHierarchy() = false + + override fun fragmentClass() = TetherSettings::class.java + + override fun getPreferenceHierarchy(context: Context) = preferenceHierarchy(this) {} + + companion object { + const val KEY = "tether_settings" + } +} diff --git a/src/com/android/settings/network/tether/TetherSettings.java b/src/com/android/settings/network/tether/TetherSettings.java index 74585149fe6..1db1802d2c0 100644 --- a/src/com/android/settings/network/tether/TetherSettings.java +++ b/src/com/android/settings/network/tether/TetherSettings.java @@ -48,6 +48,7 @@ import android.text.TextUtils; import android.util.Log; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.lifecycle.ViewModelProvider; import androidx.preference.Preference; @@ -731,4 +732,9 @@ public class TetherSettings extends RestrictedDashboardFragment } updateBluetoothAndEthernetState(); } + + @Override + public @Nullable String getPreferenceScreenBindingKey(@NonNull Context context) { + return TetherScreen.KEY; + } } diff --git a/tests/robotests/src/com/android/settings/network/tether/TetherScreenTest.kt b/tests/robotests/src/com/android/settings/network/tether/TetherScreenTest.kt new file mode 100644 index 00000000000..0eeac4353f1 --- /dev/null +++ b/tests/robotests/src/com/android/settings/network/tether/TetherScreenTest.kt @@ -0,0 +1,103 @@ +/* + * 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.settings.network.tether + +import android.net.TetheringManager +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.android.settings.R +import com.android.settings.flags.Flags +import com.android.settings.testutils.shadow.ShadowConnectivityManager +import com.android.settings.testutils.shadow.ShadowRestrictedLockUtilsInternal +import com.android.settingslib.Utils +import com.android.settingslib.preference.CatalystScreenTestCase +import com.google.common.truth.Truth.assertThat +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.annotation.Config +import org.robolectric.annotation.Implementation +import org.robolectric.annotation.Implements + +@RunWith(AndroidJUnit4::class) +@Config(shadows = [ShadowConnectivityManager::class, ShadowRestrictedLockUtilsInternal::class, + ShadowTetheringManager::class]) +class TetherScreenTest : CatalystScreenTestCase() { + override val preferenceScreenCreator = TetherScreen() + + override val flagName: String + get() = Flags.FLAG_CATALYST_TETHER_SETTINGS + + @Before + fun setUp() { + ShadowConnectivityManager.getShadow().setTetheringSupported(true) + } + + @Test + fun key() { + assertThat(preferenceScreenCreator.key).isEqualTo(TetherScreen.KEY) + } + + @Test + fun getPreferenceTitle_tetherConfigDisallowed_shouldShowAll() { + ShadowRestrictedLockUtilsInternal.setRestricted(true) + + assertThat(preferenceScreenCreator.getPreferenceTitle(appContext)).isEqualTo( + appContext.getString(R.string.tether_settings_title_all)) + } + + @Test + fun getPreferenceTitle_tetherConfigAllowed_shouldShowTetheringLabel() { + ShadowRestrictedLockUtilsInternal.setRestricted(false) + val tm = appContext.getSystemService(TetheringManager::class.java) + + assertThat(preferenceScreenCreator.getPreferenceTitle(appContext)).isEqualTo( + appContext.getText(Utils.getTetheringLabel(tm))) + } + + @Test + fun isAvailable_tetherIsAvailable_shouldReturnTrue() { + ShadowRestrictedLockUtilsInternal.setRestricted(false) + + assertThat(preferenceScreenCreator.isAvailable(appContext)).isTrue() + } + + @Test + fun isAvailable_tetherIsUnavailable_shouldReturnFalse() { + ShadowRestrictedLockUtilsInternal.setRestricted(true) + + assertThat(preferenceScreenCreator.isAvailable(appContext)).isFalse() + } +} + +@Implements(TetheringManager::class) +class ShadowTetheringManager { + private val emptyArray = arrayOf() + + @Implementation + fun getTetheredIfaces() = emptyArray + + @Implementation + fun getTetherableIfaces() = emptyArray + + @Implementation + fun getTetherableWifiRegexs() = emptyArray + + @Implementation + fun getTetherableUsbRegexs() = emptyArray + + @Implementation + fun getTetherableBluetoothRegexs() = emptyArray +}