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
This commit is contained in:
Carbo Kuo
2023-02-15 19:19:13 +00:00
parent 282b5201a7
commit 107d7fc5c6
5 changed files with 169 additions and 0 deletions

View File

@@ -17,6 +17,7 @@
package com.android.settings.spa package com.android.settings.spa
import android.content.Context import android.content.Context
import com.android.settings.spa.about.AboutPhonePageProvider
import com.android.settings.spa.app.AllAppListPageProvider import com.android.settings.spa.app.AllAppListPageProvider
import com.android.settings.spa.app.AppsMainPageProvider import com.android.settings.spa.app.AppsMainPageProvider
import com.android.settings.spa.app.appinfo.AppInfoSettingsProvider import com.android.settings.spa.app.appinfo.AppInfoSettingsProvider
@@ -81,6 +82,7 @@ open class SettingsSpaEnvironment(context: Context) : SpaEnvironment(context) {
BackgroundInstalledAppsPageProvider, BackgroundInstalledAppsPageProvider,
CloneAppInfoSettingsProvider, CloneAppInfoSettingsProvider,
NetworkAndInternetPageProvider, NetworkAndInternetPageProvider,
AboutPhonePageProvider,
) + togglePermissionAppListTemplate.createPageProviders(), ) + togglePermissionAppListTemplate.createPageProviders(),
rootPages = listOf( rootPages = listOf(
SettingsPage.create(HomePageProvider.name), SettingsPage.create(HomePageProvider.name),

View File

@@ -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)
}
})
}
}
}

View File

@@ -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()
}
}
}

View File

@@ -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()
}

View File

@@ -18,6 +18,7 @@ package com.android.settings.spa.home
import android.os.Bundle import android.os.Bundle
import com.android.settings.R import com.android.settings.R
import com.android.settings.spa.about.AboutPhonePageProvider
import com.android.settings.spa.app.AppsMainPageProvider import com.android.settings.spa.app.AppsMainPageProvider
import com.android.settings.spa.network.NetworkAndInternetPageProvider import com.android.settings.spa.network.NetworkAndInternetPageProvider
import com.android.settings.spa.notification.NotificationMainPageProvider import com.android.settings.spa.notification.NotificationMainPageProvider
@@ -38,6 +39,7 @@ object HomePageProvider : SettingsPageProvider {
AppsMainPageProvider.buildInjectEntry().setLink(fromPage = owner).build(), AppsMainPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
NotificationMainPageProvider.buildInjectEntry().setLink(fromPage = owner).build(), NotificationMainPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
SystemMainPageProvider.buildInjectEntry().setLink(fromPage = owner).build(), SystemMainPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
AboutPhonePageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
) )
} }