From 99488fd10463d647aca3fd722c6a1d5b681b6c17 Mon Sep 17 00:00:00 2001 From: Jason Chiu Date: Thu, 17 Oct 2024 15:44:58 +0800 Subject: [PATCH] [Catalyst] Location screen migration - Add a flag for the migration - Add the skeleton of the screen Test: atest LocationScreenTest Bug: 368360458 Flag: com.android.settings.flags.catalyst_location_settings Change-Id: Id8b7d748210d1cacf99e3d61236706029b862289 --- aconfig/catalyst/location.aconfig | 9 +++ .../settings/location/LocationScreen.kt | 65 +++++++++++++++++ .../settings/location/LocationSettings.java | 7 ++ .../settings/location/LocationScreenTest.kt | 73 +++++++++++++++++++ 4 files changed, 154 insertions(+) create mode 100644 aconfig/catalyst/location.aconfig create mode 100644 src/com/android/settings/location/LocationScreen.kt create mode 100644 tests/robotests/src/com/android/settings/location/LocationScreenTest.kt diff --git a/aconfig/catalyst/location.aconfig b/aconfig/catalyst/location.aconfig new file mode 100644 index 00000000000..c656bf3ea58 --- /dev/null +++ b/aconfig/catalyst/location.aconfig @@ -0,0 +1,9 @@ +package: "com.android.settings.flags" +container: "system" + +flag { + name: "catalyst_location_settings" + namespace: "android_settings" + description: "Flag for Location" + bug: "323791114" +} diff --git a/src/com/android/settings/location/LocationScreen.kt b/src/com/android/settings/location/LocationScreen.kt new file mode 100644 index 00000000000..d45b762d102 --- /dev/null +++ b/src/com/android/settings/location/LocationScreen.kt @@ -0,0 +1,65 @@ +/* + * 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.location + +import android.content.Context +import android.location.LocationManager +import com.android.settings.R +import com.android.settings.flags.Flags +import com.android.settingslib.metadata.PreferenceIconProvider +import com.android.settingslib.metadata.PreferenceSummaryProvider +import com.android.settingslib.metadata.ProvidePreferenceScreen +import com.android.settingslib.metadata.preferenceHierarchy +import com.android.settingslib.preference.PreferenceScreenCreator + +@ProvidePreferenceScreen +class LocationScreen : PreferenceScreenCreator, PreferenceSummaryProvider, PreferenceIconProvider { + override val key: String + get() = KEY + + override val title: Int + get() = R.string.location_settings_title + + override val keywords: Int + get() = R.string.keywords_location + + override fun getSummary(context: Context): CharSequence? { + var locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager + return if (locationManager.isLocationEnabled) { + context.getString(R.string.location_settings_loading_app_permission_stats) + } else { + context.getString(R.string.location_settings_summary_location_off) + } + } + + override fun getIcon(context: Context) = + when { + Flags.homepageRevamp() -> R.drawable.ic_settings_location_filled + else -> R.drawable.ic_settings_location + } + + override fun isFlagEnabled(context: Context) = Flags.catalystLocationSettings() + + override fun hasCompleteHierarchy() = false + + override fun fragmentClass() = LocationSettings::class.java + + override fun getPreferenceHierarchy(context: Context) = preferenceHierarchy(this) {} + + companion object { + const val KEY = "location_settings" + } +} diff --git a/src/com/android/settings/location/LocationSettings.java b/src/com/android/settings/location/LocationSettings.java index 87e8817808f..6a1d3d28dfb 100644 --- a/src/com/android/settings/location/LocationSettings.java +++ b/src/com/android/settings/location/LocationSettings.java @@ -29,6 +29,8 @@ import android.os.SystemProperties; import android.provider.Settings; import android.util.Log; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.preference.Preference; import androidx.preference.PreferenceGroup; @@ -185,4 +187,9 @@ public class LocationSettings extends DashboardFragment implements R.string.location_settings_tooltip_text_for_chrome)); } } + + @Override + public @Nullable String getPreferenceScreenBindingKey(@NonNull Context context) { + return LocationScreen.KEY; + } } diff --git a/tests/robotests/src/com/android/settings/location/LocationScreenTest.kt b/tests/robotests/src/com/android/settings/location/LocationScreenTest.kt new file mode 100644 index 00000000000..1d1696d2d1a --- /dev/null +++ b/tests/robotests/src/com/android/settings/location/LocationScreenTest.kt @@ -0,0 +1,73 @@ +/* + * 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.location + +import android.content.Context +import android.content.ContextWrapper +import android.location.LocationManager +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.android.settings.R +import com.android.settings.flags.Flags +import com.android.settingslib.preference.CatalystScreenTestCase +import com.google.common.truth.Truth.assertThat +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.mock +import org.mockito.kotlin.stub + +@RunWith(AndroidJUnit4::class) +class LocationScreenTest : CatalystScreenTestCase() { + override val preferenceScreenCreator = LocationScreen() + + override val flagName: String + get() = Flags.FLAG_CATALYST_LOCATION_SETTINGS + + private val mockLocationManager = mock() + + private val context = + object : ContextWrapper(appContext) { + override fun getSystemService(name: String): Any = + when (name) { + Context.LOCATION_SERVICE -> mockLocationManager + else -> super.getSystemService(name) + } + } + + @Test + fun key() { + assertThat(preferenceScreenCreator.key).isEqualTo(LocationScreen.KEY) + } + + @Test + fun getSummary_enableLocation_shouldReturnLoading() { + mockLocationManager.stub { on { isLocationEnabled } doReturn true } + + assertThat(preferenceScreenCreator.getSummary(context)).isEqualTo( + context.getString(R.string.location_settings_loading_app_permission_stats)) + } + + @Test + fun getSummary_disableLocation_shouldReturnLocationOff() { + mockLocationManager.stub { on { isLocationEnabled } doReturn false } + + assertThat(preferenceScreenCreator.getSummary(context)).isEqualTo( + context.getString(R.string.location_settings_summary_location_off)) + } + + override fun migration() { + } +}