From 107d7fc5c6cd42b04e19e750da81df4d5f3dfcb6 Mon Sep 17 00:00:00 2001 From: Carbo Kuo Date: Wed, 15 Feb 2023 19:19:13 +0000 Subject: [PATCH] Migrate the About page in Settings. This change adds the "About" page and the "Device name" Preference. However, due to the lack of editable text support in the alert dialog (SPA widget), the device name can't be changed at the moment. Bug: 269486170 Test: manual, see screenshots. Change-Id: Ie6b034d82b1718c8f22366ef525fd6d36e4df9ad --- .../settings/spa/SettingsSpaEnvironment.kt | 2 + .../android/settings/spa/about/AboutPhone.kt | 67 +++++++++++++++++++ .../settings/spa/about/BasicInfoCategory.kt | 31 +++++++++ .../android/settings/spa/about/DeviceName.kt | 67 +++++++++++++++++++ src/com/android/settings/spa/home/HomePage.kt | 2 + 5 files changed, 169 insertions(+) create mode 100644 src/com/android/settings/spa/about/AboutPhone.kt create mode 100644 src/com/android/settings/spa/about/BasicInfoCategory.kt create mode 100644 src/com/android/settings/spa/about/DeviceName.kt diff --git a/src/com/android/settings/spa/SettingsSpaEnvironment.kt b/src/com/android/settings/spa/SettingsSpaEnvironment.kt index 55c0f835719..f1ac3eaa935 100644 --- a/src/com/android/settings/spa/SettingsSpaEnvironment.kt +++ b/src/com/android/settings/spa/SettingsSpaEnvironment.kt @@ -17,6 +17,7 @@ package com.android.settings.spa import android.content.Context +import com.android.settings.spa.about.AboutPhonePageProvider import com.android.settings.spa.app.AllAppListPageProvider import com.android.settings.spa.app.AppsMainPageProvider import com.android.settings.spa.app.appinfo.AppInfoSettingsProvider @@ -81,6 +82,7 @@ open class SettingsSpaEnvironment(context: Context) : SpaEnvironment(context) { BackgroundInstalledAppsPageProvider, CloneAppInfoSettingsProvider, NetworkAndInternetPageProvider, + AboutPhonePageProvider, ) + togglePermissionAppListTemplate.createPageProviders(), rootPages = listOf( SettingsPage.create(HomePageProvider.name), diff --git a/src/com/android/settings/spa/about/AboutPhone.kt b/src/com/android/settings/spa/about/AboutPhone.kt new file mode 100644 index 00000000000..7343da050c6 --- /dev/null +++ b/src/com/android/settings/spa/about/AboutPhone.kt @@ -0,0 +1,67 @@ +/* + * 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.spa.about + +import android.os.Bundle +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.PermDeviceInformation +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import com.android.settings.R +import com.android.settingslib.spa.framework.common.SettingsEntryBuilder +import com.android.settingslib.spa.framework.common.SettingsPageProvider +import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory +import com.android.settingslib.spa.framework.common.createSettingsPage +import com.android.settingslib.spa.framework.compose.navigator +import com.android.settingslib.spa.framework.compose.toState +import com.android.settingslib.spa.widget.preference.Preference +import com.android.settingslib.spa.widget.preference.PreferenceModel +import com.android.settingslib.spa.widget.scaffold.RegularScaffold +import com.android.settingslib.spa.widget.ui.SettingsIcon + +object AboutPhonePageProvider : SettingsPageProvider { + override val name = "AboutPhone" + private val owner = createSettingsPage() + + @Composable + override fun Page(arguments: Bundle?) { + RegularScaffold(title = getTitle(arguments)) { + BasicInfoCategory.CategoryItems() + } + } + + override fun getTitle(arguments: Bundle?): String = + SpaEnvironmentFactory.instance.appContext.getString(R.string.about_settings) + + fun buildInjectEntry(): SettingsEntryBuilder { + return SettingsEntryBuilder.createInject(owner = owner) + .setUiLayoutFn { + val context = LocalContext.current + val deviceNamePresenter = remember { DeviceNamePresenter(context) } + Preference(object : PreferenceModel { + override val title = stringResource(R.string.about_settings) + override val summary = deviceNamePresenter.deviceName.toState() + override val onClick = navigator(name) + override val icon = @Composable { + SettingsIcon(imageVector = Icons.Outlined.PermDeviceInformation) + } + }) + } + } +} \ No newline at end of file diff --git a/src/com/android/settings/spa/about/BasicInfoCategory.kt b/src/com/android/settings/spa/about/BasicInfoCategory.kt new file mode 100644 index 00000000000..d382f51beb6 --- /dev/null +++ b/src/com/android/settings/spa/about/BasicInfoCategory.kt @@ -0,0 +1,31 @@ +/* + * 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.spa.about + +import androidx.compose.runtime.Composable +import androidx.compose.ui.res.stringResource +import com.android.settings.R +import com.android.settingslib.spa.widget.ui.Category + +object BasicInfoCategory { + @Composable + fun CategoryItems() { + Category(title = stringResource(R.string.my_device_info_basic_info_category_title)) { + DeviceNamePreference.EntryItem() + } + } +} \ No newline at end of file diff --git a/src/com/android/settings/spa/about/DeviceName.kt b/src/com/android/settings/spa/about/DeviceName.kt new file mode 100644 index 00000000000..c481e329082 --- /dev/null +++ b/src/com/android/settings/spa/about/DeviceName.kt @@ -0,0 +1,67 @@ +/* + * 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.spa.about + +import android.content.Context +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import com.android.settings.R +import com.android.settings.deviceinfo.DeviceNamePreferenceController +import com.android.settingslib.spa.framework.compose.toState +import com.android.settingslib.spa.widget.dialog.AlertDialogButton +import com.android.settingslib.spa.widget.dialog.rememberAlertDialogPresenter +import com.android.settingslib.spa.widget.preference.Preference +import com.android.settingslib.spa.widget.preference.PreferenceModel + +object DeviceNamePreference { + + @Composable + fun EntryItem() { + val context = LocalContext.current + val deviceNamePresenter = remember { DeviceNamePresenter(context) } + // TODO: Instead of a AlertDialog, it should be a dialog that accepts text input. + val dialogPresenter = rememberAlertDialogPresenter( + confirmButton = AlertDialogButton( + stringResource(R.string.okay), onClick = DeviceNamePreference::confirmChange + ), + dismissButton = AlertDialogButton(stringResource(R.string.cancel)), + title = stringResource(R.string.my_device_info_device_name_preference_title), + text = { Text(deviceNamePresenter.deviceName) }, + ) + Preference(object : PreferenceModel { + override val title = + stringResource(R.string.my_device_info_device_name_preference_title) + override val summary = deviceNamePresenter.deviceName.toState() + override val onClick = dialogPresenter::open + }) + + } + + private fun confirmChange() { + // TODO: Save the change of the device name. + } +} + +class DeviceNamePresenter(val context: Context) { + private val deviceNamePreferenceController = + DeviceNamePreferenceController(context, "unused_key") + + val deviceName: String get() = deviceNamePreferenceController.summary.toString() +} diff --git a/src/com/android/settings/spa/home/HomePage.kt b/src/com/android/settings/spa/home/HomePage.kt index d2416f44a0d..be3e015c136 100644 --- a/src/com/android/settings/spa/home/HomePage.kt +++ b/src/com/android/settings/spa/home/HomePage.kt @@ -18,6 +18,7 @@ package com.android.settings.spa.home import android.os.Bundle import com.android.settings.R +import com.android.settings.spa.about.AboutPhonePageProvider import com.android.settings.spa.app.AppsMainPageProvider import com.android.settings.spa.network.NetworkAndInternetPageProvider import com.android.settings.spa.notification.NotificationMainPageProvider @@ -38,6 +39,7 @@ object HomePageProvider : SettingsPageProvider { AppsMainPageProvider.buildInjectEntry().setLink(fromPage = owner).build(), NotificationMainPageProvider.buildInjectEntry().setLink(fromPage = owner).build(), SystemMainPageProvider.buildInjectEntry().setLink(fromPage = owner).build(), + AboutPhonePageProvider.buildInjectEntry().setLink(fromPage = owner).build(), ) }