Show category when search "Mobile data"

The displayed category is "SIMs".

Bug: 346776183
Flag: EXEMPT bug fix
Test: manual - search "Mobile data"
Test: unit test
Change-Id: If3c395281e96603193e7476a9e76d1f9e9213531
This commit is contained in:
Chaohui Wang
2024-07-26 14:51:33 +08:00
parent 50a18d9e85
commit 7477f4ea9a
8 changed files with 93 additions and 56 deletions

View File

@@ -197,6 +197,9 @@ open class NetworkCellularGroupProvider : SettingsPageProvider, SearchablePage {
// Do nothing
}
override fun getPageTitleForSearch(context: Context): String =
context.getString(R.string.provider_network_settings_title)
override fun getSearchableTitles(context: Context): List<String> {
if (!isPageSearchable(context)) return emptyList()
return buildList {

View File

@@ -20,6 +20,9 @@ import android.content.Context
interface SearchablePage {
/** Gets the searchable titles at the current moment. */
/** Gets the title of the page. */
fun getPageTitleForSearch(context: Context): String = ""
/** Gets the titles of the searchable items at the current moment. */
fun getSearchableTitles(context: Context): List<String>
}

View File

@@ -18,25 +18,45 @@ package com.android.settings.spa.search
import android.app.Activity
import android.os.Bundle
import android.util.Log
import com.android.settings.SettingsActivity.EXTRA_FRAGMENT_ARG_KEY
import com.android.settings.overlay.FeatureFactory.Companion.featureFactory
import com.android.settings.password.PasswordUtils
import com.android.settings.spa.SpaDestination
import com.android.settings.spa.SpaSearchLanding
import com.google.protobuf.ByteString
import com.google.protobuf.InvalidProtocolBufferException
class SpaSearchLandingActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (!isValidCall()) return
val destination = intent.getStringExtra(EXTRA_FRAGMENT_ARG_KEY)
if (destination.isNullOrBlank()) return
val keyString = intent.getStringExtra(EXTRA_FRAGMENT_ARG_KEY)
val key =
try {
SpaSearchLanding.SpaSearchLandingKey.parseFrom(ByteString.copyFromUtf8(keyString))
} catch (e: InvalidProtocolBufferException) {
Log.w(TAG, "arg key ($keyString) invalid", e)
finish()
return
}
SpaDestination(destination = destination, highlightMenuKey = null)
.startFromExportedActivity(this)
if (key.hasSpaPage()) {
val destination = key.spaPage.destination
if (destination.isNotEmpty()) {
SpaDestination(destination = destination, highlightMenuKey = null)
.startFromExportedActivity(this)
}
}
finish()
}
private fun isValidCall() =
PasswordUtils.getCallingAppPackageName(activityToken) ==
featureFactory.searchFeatureProvider.getSettingsIntelligencePkgName(this)
private companion object {
private const val TAG = "SpaSearchLandingActivity"
}
}

View File

@@ -20,6 +20,8 @@ import android.content.Context
import android.provider.SearchIndexableResource
import android.util.Log
import androidx.annotation.VisibleForTesting
import com.android.settings.spa.SpaSearchLanding.SpaSearchLandingKey
import com.android.settings.spa.SpaSearchLanding.SpaSearchLandingSpaPage
import com.android.settingslib.search.Indexable
import com.android.settingslib.search.SearchIndexableData
import com.android.settingslib.search.SearchIndexableRaw
@@ -34,7 +36,8 @@ class SpaSearchRepository(
Log.d(TAG, "getSearchIndexableDataList")
return spaEnvironment.pageProviderRepository.value.getAllProviders().mapNotNull { page ->
if (page is SearchablePage) {
page.createSearchIndexableData(page::getSearchableTitles)
page.createSearchIndexableData(
page::getPageTitleForSearch, page::getSearchableTitles)
} else null
}
}
@@ -44,6 +47,7 @@ class SpaSearchRepository(
@VisibleForTesting
fun SettingsPageProvider.createSearchIndexableData(
getPageTitleForSearch: (context: Context) -> String,
titlesProvider: (context: Context) -> List<String>,
): SearchIndexableData {
val searchIndexProvider =
@@ -61,23 +65,36 @@ class SpaSearchRepository(
override fun getDynamicRawDataToIndex(
context: Context,
enabled: Boolean,
): List<SearchIndexableRaw> =
titlesProvider(context).map { title ->
createSearchIndexableRaw(context, title)
): List<SearchIndexableRaw> {
val pageTitle = getPageTitleForSearch(context)
return titlesProvider(context).map { itemTitle ->
createSearchIndexableRaw(context, itemTitle, pageTitle)
}
}
override fun getNonIndexableKeys(context: Context): List<String> = emptyList()
}
return SearchIndexableData(this::class.java, searchIndexProvider)
}
private fun SettingsPageProvider.createSearchIndexableRaw(context: Context, title: String) =
private fun SettingsPageProvider.createSearchIndexableRaw(
context: Context,
itemTitle: String,
pageTitle: String,
) =
SearchIndexableRaw(context).apply {
key = name
this.title = title
key =
SpaSearchLandingKey.newBuilder()
.setSpaPage(SpaSearchLandingSpaPage.newBuilder().setDestination(name))
.build()
.toByteString()
.toStringUtf8()
title = itemTitle
intentAction = SEARCH_LANDING_ACTION
intentTargetClass = SpaSearchLandingActivity::class.qualifiedName
packageName = context.packageName
className = SpaSearchLandingActivity::class.qualifiedName
className = this@createSearchIndexableRaw::class.java.name
screenTitle = pageTitle
}
private const val SEARCH_LANDING_ACTION = "android.settings.SPA_SEARCH_LANDING"