Loading packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/SpaEnvironment.kt +1 −1 Original line number Diff line number Diff line Loading @@ -54,7 +54,7 @@ fun createSettingsPage( parameter: List<NamedNavArgument> = emptyList(), arguments: Bundle? = null ): SettingsPage { return SettingsPage( return SettingsPage.create( name = SppName.name, displayName = SppName.displayName, parameter = parameter, Loading packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/DebugActivity.kt +3 −3 Original line number Diff line number Diff line Loading @@ -153,7 +153,7 @@ open class DebugActivity( "${pageWithEntry.page.displayName} (${pageWithEntry.entries.size})" override val summary = pageWithEntry.page.formatArguments().toState() override val onClick = navigator(route = ROUTE_PAGE + "/${pageWithEntry.page.id()}") navigator(route = ROUTE_PAGE + "/${pageWithEntry.page.id}") }) } } Loading @@ -172,7 +172,7 @@ open class DebugActivity( val id = arguments!!.getString(PARAM_NAME_PAGE_ID, "") val pageWithEntry = entryRepository.getPageWithEntry(id)!! RegularScaffold(title = "Page - ${pageWithEntry.page.displayName}") { Text(text = "id = ${pageWithEntry.page.id()}") Text(text = "id = ${pageWithEntry.page.id}") Text(text = pageWithEntry.page.formatArguments()) Text(text = "Entry size: ${pageWithEntry.entries.size}") Preference(model = object : PreferenceModel { Loading Loading @@ -206,7 +206,7 @@ open class DebugActivity( override val title = entry.displayTitle() override val summary = "${entry.fromPage?.displayName} -> ${entry.toPage?.displayName}".toState() override val onClick = navigator(route = ROUTE_ENTRY + "/${entry.id()}") override val onClick = navigator(route = ROUTE_ENTRY + "/${entry.id}") }) } } Loading packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/EntryProvider.kt +59 −21 Original line number Diff line number Diff line Loading @@ -38,8 +38,9 @@ import com.android.settingslib.spa.framework.common.SettingsPage * For gallery, AuthorityPath = com.android.spa.gallery.provider * For SettingsGoogle, AuthorityPath = com.android.settings.spa.provider * Some examples: * $ adb shell content query --uri content://<AuthorityPath>/page_start * $ adb shell content query --uri content://<AuthorityPath>/page_debug * $ adb shell content query --uri content://<AuthorityPath>/page_info * $ adb shell content query --uri content://<AuthorityPath>/entry_info */ open class EntryProvider( private val entryRepository: SettingsEntryRepository, Loading @@ -50,6 +51,7 @@ open class EntryProvider( * Enum to define all column names in provider. */ enum class ColumnEnum(val id: String) { // Columns related to page PAGE_ID("pageId"), PAGE_NAME("pageName"), PAGE_ROUTE("pageRoute"), Loading @@ -57,6 +59,13 @@ open class EntryProvider( PAGE_ENTRY_COUNT("entryCount"), HAS_RUNTIME_PARAM("hasRuntimeParam"), PAGE_START_ADB("pageStartAdb"), // Columns related to entry ENTRY_ID("entryId"), ENTRY_NAME("entryName"), ENTRY_ROUTE("entryRoute"), ENTRY_TITLE("entryTitle"), ENTRY_SEARCH_KEYWORD("entrySearchKw"), } /** Loading @@ -67,12 +76,15 @@ open class EntryProvider( val queryMatchCode: Int, val columnNames: List<ColumnEnum> ) { PAGE_START_COMMAND( "page_start", 1, // For debug PAGE_DEBUG_QUERY( "page_debug", 1, listOf(ColumnEnum.PAGE_START_ADB) ), // page related queries. PAGE_INFO_QUERY( "page_info", 2, "page_info", 100, listOf( ColumnEnum.PAGE_ID, ColumnEnum.PAGE_NAME, Loading @@ -82,9 +94,24 @@ open class EntryProvider( ColumnEnum.HAS_RUNTIME_PARAM, ) ), // entry related queries ENTRY_INFO_QUERY( "entry_info", 200, listOf( ColumnEnum.ENTRY_ID, ColumnEnum.ENTRY_NAME, ColumnEnum.ENTRY_ROUTE, ColumnEnum.ENTRY_TITLE, ColumnEnum.ENTRY_SEARCH_KEYWORD, ) ) } private var uriMatcher: UriMatcher? = null private val uriMatcher = UriMatcher(UriMatcher.NO_MATCH) private fun addUri(authority: String, query: QueryEnum) { uriMatcher.addURI(authority, query.queryPath, query.queryMatchCode) } override fun delete(uri: Uri, selection: String?, selectionArgs: Array<String>?): Int { TODO("Implement this to handle requests to delete one or more rows") Loading Loading @@ -115,18 +142,10 @@ open class EntryProvider( } override fun attachInfo(context: Context?, info: ProviderInfo?) { uriMatcher = UriMatcher(UriMatcher.NO_MATCH) if (info != null) { uriMatcher!!.addURI( info.authority, QueryEnum.PAGE_START_COMMAND.queryPath, QueryEnum.PAGE_START_COMMAND.queryMatchCode ) uriMatcher!!.addURI( info.authority, QueryEnum.PAGE_INFO_QUERY.queryPath, QueryEnum.PAGE_INFO_QUERY.queryMatchCode ) addUri(info.authority, QueryEnum.PAGE_DEBUG_QUERY) addUri(info.authority, QueryEnum.PAGE_INFO_QUERY) addUri(info.authority, QueryEnum.ENTRY_INFO_QUERY) } super.attachInfo(context, info) } Loading @@ -139,9 +158,10 @@ open class EntryProvider( sortOrder: String? ): Cursor? { return try { when (uriMatcher!!.match(uri)) { QueryEnum.PAGE_START_COMMAND.queryMatchCode -> queryPageStartCommand() when (uriMatcher.match(uri)) { QueryEnum.PAGE_DEBUG_QUERY.queryMatchCode -> queryPageDebug() QueryEnum.PAGE_INFO_QUERY.queryMatchCode -> queryPageInfo() QueryEnum.ENTRY_INFO_QUERY.queryMatchCode -> queryEntryInfo() else -> throw UnsupportedOperationException("Unknown Uri $uri") } } catch (e: UnsupportedOperationException) { Loading @@ -152,8 +172,8 @@ open class EntryProvider( } } private fun queryPageStartCommand(): Cursor { val cursor = MatrixCursor(QueryEnum.PAGE_START_COMMAND.getColumns()) private fun queryPageDebug(): Cursor { val cursor = MatrixCursor(QueryEnum.PAGE_DEBUG_QUERY.getColumns()) for (pageWithEntry in entryRepository.getAllPageWithEntry()) { val command = createBrowsePageAdbCommand(pageWithEntry.page) if (command != null) { Loading @@ -168,7 +188,7 @@ open class EntryProvider( for (pageWithEntry in entryRepository.getAllPageWithEntry()) { val page = pageWithEntry.page cursor.newRow() .add(ColumnEnum.PAGE_ID.id, page.id()) .add(ColumnEnum.PAGE_ID.id, page.id) .add(ColumnEnum.PAGE_NAME.id, page.displayName) .add(ColumnEnum.PAGE_ROUTE.id, page.buildRoute()) .add(ColumnEnum.PAGE_ENTRY_COUNT.id, pageWithEntry.entries.size) Loading @@ -181,6 +201,24 @@ open class EntryProvider( return cursor } private fun queryEntryInfo(): Cursor { val cursor = MatrixCursor(QueryEnum.ENTRY_INFO_QUERY.getColumns()) for (entry in entryRepository.getAllEntries()) { // We can add runtime arguments if necessary val searchData = entry.getSearchData() cursor.newRow() .add(ColumnEnum.ENTRY_ID.id, entry.id) .add(ColumnEnum.ENTRY_NAME.id, entry.displayName) .add(ColumnEnum.ENTRY_ROUTE.id, entry.buildRoute()) .add(ColumnEnum.ENTRY_TITLE.id, searchData?.title ?: "") .add( ColumnEnum.ENTRY_SEARCH_KEYWORD.id, searchData?.keyword ?: emptyList<String>() ) } return cursor } private fun createBrowsePageIntent(page: SettingsPage): Intent { if (context == null || browseActivityClass == null || page.hasRuntimeParam()) return Intent() Loading packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsEntry.kt +13 −10 Original line number Diff line number Diff line Loading @@ -32,6 +32,9 @@ const val ROOT_ENTRY_NAME = "ROOT" * Defines data of a Settings entry. */ data class SettingsEntry( // The unique id of this entry, which is computed by name + owner + fromPage + toPage. val id: String, // The name of the page, which is used to compute the unique id, and need to be stable. private val name: String, Loading Loading @@ -72,14 +75,9 @@ data class SettingsEntry( */ private val uiLayoutImpl: (@Composable (arguments: Bundle?) -> Unit) = {}, ) { // The unique id of this entry, which is computed by name + owner + fromPage + toPage. fun id(): String { return "$name:${owner.id()}(${fromPage?.id()}-${toPage?.id()})".toHashId() } fun formatContent(): String { val content = listOf( "id = ${id()}", "id = $id", "owner = ${owner.formatDisplayTitle()}", "linkFrom = ${fromPage?.formatDisplayTitle()}", "linkTo = ${toPage?.formatDisplayTitle()}", Loading @@ -99,7 +97,7 @@ data class SettingsEntry( } fun buildRoute(): String { return containerPage().buildRoute(id()) return containerPage().buildRoute(id) } fun hasRuntimeParam(): Boolean { Loading @@ -121,14 +119,13 @@ data class SettingsEntry( @Composable fun UiLayout(runtimeArguments: Bundle? = null) { val context = LocalContext.current val entryId = remember { id() } val highlight = rememberSaveable { mutableStateOf(runtimeArguments?.getString(HIGHLIGHT_ENTRY_PARAM_NAME) == entryId) mutableStateOf(runtimeArguments?.getString(HIGHLIGHT_ENTRY_PARAM_NAME) == id) } if (highlight.value) { highlight.value = false // TODO: Add highlight entry logic Toast.makeText(context, "entry $entryId highlighted", Toast.LENGTH_SHORT).show() Toast.makeText(context, "entry $id highlighted", Toast.LENGTH_SHORT).show() } uiLayoutImpl(fullArgument(runtimeArguments)) } Loading @@ -151,6 +148,7 @@ class SettingsEntryBuilder(private val name: String, private val owner: Settings fun build(): SettingsEntry { return SettingsEntry( id = id(), name = name, owner = owner, displayName = displayName, Loading Loading @@ -206,6 +204,11 @@ class SettingsEntryBuilder(private val name: String, private val owner: Settings return this } // The unique id of this entry, which is computed by name + owner + fromPage + toPage. private fun id(): String { return "$name:${owner.id}(${fromPage?.id}-${toPage?.id})".toHashId() } companion object { fun create(entryName: String, owner: SettingsPage): SettingsEntryBuilder { return SettingsEntryBuilder(entryName, owner) Loading packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsEntryRepository.kt +6 −9 Original line number Diff line number Diff line Loading @@ -44,26 +44,23 @@ class SettingsEntryRepository(sppRepository: SettingsPageProviderRepository) { val entryQueue = LinkedList<SettingsEntry>() for (page in sppRepository.getAllRootPages()) { val rootEntry = SettingsEntryBuilder.createRoot(owner = page).build() val rootEntryId = rootEntry.id() if (!entryMap.containsKey(rootEntryId)) { if (!entryMap.containsKey(rootEntry.id)) { entryQueue.push(rootEntry) entryMap.put(rootEntryId, rootEntry) entryMap.put(rootEntry.id, rootEntry) } } while (entryQueue.isNotEmpty() && entryMap.size < MAX_ENTRY_SIZE) { val entry = entryQueue.pop() val page = entry.toPage val pageId = page?.id() if (pageId == null || pageWithEntryMap.containsKey(pageId)) continue if (page == null || pageWithEntryMap.containsKey(page.id)) continue val spp = sppRepository.getProviderOrNull(page.name) ?: continue val newEntries = spp.buildEntry(page.arguments) pageWithEntryMap[pageId] = SettingsPageWithEntry(page, newEntries) pageWithEntryMap[page.id] = SettingsPageWithEntry(page, newEntries) for (newEntry in newEntries) { val newEntryId = newEntry.id() if (!entryMap.containsKey(newEntryId)) { if (!entryMap.containsKey(newEntry.id)) { entryQueue.push(newEntry) entryMap.put(newEntryId, newEntry) entryMap.put(newEntry.id, newEntry) } } } Loading Loading
packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/SpaEnvironment.kt +1 −1 Original line number Diff line number Diff line Loading @@ -54,7 +54,7 @@ fun createSettingsPage( parameter: List<NamedNavArgument> = emptyList(), arguments: Bundle? = null ): SettingsPage { return SettingsPage( return SettingsPage.create( name = SppName.name, displayName = SppName.displayName, parameter = parameter, Loading
packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/DebugActivity.kt +3 −3 Original line number Diff line number Diff line Loading @@ -153,7 +153,7 @@ open class DebugActivity( "${pageWithEntry.page.displayName} (${pageWithEntry.entries.size})" override val summary = pageWithEntry.page.formatArguments().toState() override val onClick = navigator(route = ROUTE_PAGE + "/${pageWithEntry.page.id()}") navigator(route = ROUTE_PAGE + "/${pageWithEntry.page.id}") }) } } Loading @@ -172,7 +172,7 @@ open class DebugActivity( val id = arguments!!.getString(PARAM_NAME_PAGE_ID, "") val pageWithEntry = entryRepository.getPageWithEntry(id)!! RegularScaffold(title = "Page - ${pageWithEntry.page.displayName}") { Text(text = "id = ${pageWithEntry.page.id()}") Text(text = "id = ${pageWithEntry.page.id}") Text(text = pageWithEntry.page.formatArguments()) Text(text = "Entry size: ${pageWithEntry.entries.size}") Preference(model = object : PreferenceModel { Loading Loading @@ -206,7 +206,7 @@ open class DebugActivity( override val title = entry.displayTitle() override val summary = "${entry.fromPage?.displayName} -> ${entry.toPage?.displayName}".toState() override val onClick = navigator(route = ROUTE_ENTRY + "/${entry.id()}") override val onClick = navigator(route = ROUTE_ENTRY + "/${entry.id}") }) } } Loading
packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/EntryProvider.kt +59 −21 Original line number Diff line number Diff line Loading @@ -38,8 +38,9 @@ import com.android.settingslib.spa.framework.common.SettingsPage * For gallery, AuthorityPath = com.android.spa.gallery.provider * For SettingsGoogle, AuthorityPath = com.android.settings.spa.provider * Some examples: * $ adb shell content query --uri content://<AuthorityPath>/page_start * $ adb shell content query --uri content://<AuthorityPath>/page_debug * $ adb shell content query --uri content://<AuthorityPath>/page_info * $ adb shell content query --uri content://<AuthorityPath>/entry_info */ open class EntryProvider( private val entryRepository: SettingsEntryRepository, Loading @@ -50,6 +51,7 @@ open class EntryProvider( * Enum to define all column names in provider. */ enum class ColumnEnum(val id: String) { // Columns related to page PAGE_ID("pageId"), PAGE_NAME("pageName"), PAGE_ROUTE("pageRoute"), Loading @@ -57,6 +59,13 @@ open class EntryProvider( PAGE_ENTRY_COUNT("entryCount"), HAS_RUNTIME_PARAM("hasRuntimeParam"), PAGE_START_ADB("pageStartAdb"), // Columns related to entry ENTRY_ID("entryId"), ENTRY_NAME("entryName"), ENTRY_ROUTE("entryRoute"), ENTRY_TITLE("entryTitle"), ENTRY_SEARCH_KEYWORD("entrySearchKw"), } /** Loading @@ -67,12 +76,15 @@ open class EntryProvider( val queryMatchCode: Int, val columnNames: List<ColumnEnum> ) { PAGE_START_COMMAND( "page_start", 1, // For debug PAGE_DEBUG_QUERY( "page_debug", 1, listOf(ColumnEnum.PAGE_START_ADB) ), // page related queries. PAGE_INFO_QUERY( "page_info", 2, "page_info", 100, listOf( ColumnEnum.PAGE_ID, ColumnEnum.PAGE_NAME, Loading @@ -82,9 +94,24 @@ open class EntryProvider( ColumnEnum.HAS_RUNTIME_PARAM, ) ), // entry related queries ENTRY_INFO_QUERY( "entry_info", 200, listOf( ColumnEnum.ENTRY_ID, ColumnEnum.ENTRY_NAME, ColumnEnum.ENTRY_ROUTE, ColumnEnum.ENTRY_TITLE, ColumnEnum.ENTRY_SEARCH_KEYWORD, ) ) } private var uriMatcher: UriMatcher? = null private val uriMatcher = UriMatcher(UriMatcher.NO_MATCH) private fun addUri(authority: String, query: QueryEnum) { uriMatcher.addURI(authority, query.queryPath, query.queryMatchCode) } override fun delete(uri: Uri, selection: String?, selectionArgs: Array<String>?): Int { TODO("Implement this to handle requests to delete one or more rows") Loading Loading @@ -115,18 +142,10 @@ open class EntryProvider( } override fun attachInfo(context: Context?, info: ProviderInfo?) { uriMatcher = UriMatcher(UriMatcher.NO_MATCH) if (info != null) { uriMatcher!!.addURI( info.authority, QueryEnum.PAGE_START_COMMAND.queryPath, QueryEnum.PAGE_START_COMMAND.queryMatchCode ) uriMatcher!!.addURI( info.authority, QueryEnum.PAGE_INFO_QUERY.queryPath, QueryEnum.PAGE_INFO_QUERY.queryMatchCode ) addUri(info.authority, QueryEnum.PAGE_DEBUG_QUERY) addUri(info.authority, QueryEnum.PAGE_INFO_QUERY) addUri(info.authority, QueryEnum.ENTRY_INFO_QUERY) } super.attachInfo(context, info) } Loading @@ -139,9 +158,10 @@ open class EntryProvider( sortOrder: String? ): Cursor? { return try { when (uriMatcher!!.match(uri)) { QueryEnum.PAGE_START_COMMAND.queryMatchCode -> queryPageStartCommand() when (uriMatcher.match(uri)) { QueryEnum.PAGE_DEBUG_QUERY.queryMatchCode -> queryPageDebug() QueryEnum.PAGE_INFO_QUERY.queryMatchCode -> queryPageInfo() QueryEnum.ENTRY_INFO_QUERY.queryMatchCode -> queryEntryInfo() else -> throw UnsupportedOperationException("Unknown Uri $uri") } } catch (e: UnsupportedOperationException) { Loading @@ -152,8 +172,8 @@ open class EntryProvider( } } private fun queryPageStartCommand(): Cursor { val cursor = MatrixCursor(QueryEnum.PAGE_START_COMMAND.getColumns()) private fun queryPageDebug(): Cursor { val cursor = MatrixCursor(QueryEnum.PAGE_DEBUG_QUERY.getColumns()) for (pageWithEntry in entryRepository.getAllPageWithEntry()) { val command = createBrowsePageAdbCommand(pageWithEntry.page) if (command != null) { Loading @@ -168,7 +188,7 @@ open class EntryProvider( for (pageWithEntry in entryRepository.getAllPageWithEntry()) { val page = pageWithEntry.page cursor.newRow() .add(ColumnEnum.PAGE_ID.id, page.id()) .add(ColumnEnum.PAGE_ID.id, page.id) .add(ColumnEnum.PAGE_NAME.id, page.displayName) .add(ColumnEnum.PAGE_ROUTE.id, page.buildRoute()) .add(ColumnEnum.PAGE_ENTRY_COUNT.id, pageWithEntry.entries.size) Loading @@ -181,6 +201,24 @@ open class EntryProvider( return cursor } private fun queryEntryInfo(): Cursor { val cursor = MatrixCursor(QueryEnum.ENTRY_INFO_QUERY.getColumns()) for (entry in entryRepository.getAllEntries()) { // We can add runtime arguments if necessary val searchData = entry.getSearchData() cursor.newRow() .add(ColumnEnum.ENTRY_ID.id, entry.id) .add(ColumnEnum.ENTRY_NAME.id, entry.displayName) .add(ColumnEnum.ENTRY_ROUTE.id, entry.buildRoute()) .add(ColumnEnum.ENTRY_TITLE.id, searchData?.title ?: "") .add( ColumnEnum.ENTRY_SEARCH_KEYWORD.id, searchData?.keyword ?: emptyList<String>() ) } return cursor } private fun createBrowsePageIntent(page: SettingsPage): Intent { if (context == null || browseActivityClass == null || page.hasRuntimeParam()) return Intent() Loading
packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsEntry.kt +13 −10 Original line number Diff line number Diff line Loading @@ -32,6 +32,9 @@ const val ROOT_ENTRY_NAME = "ROOT" * Defines data of a Settings entry. */ data class SettingsEntry( // The unique id of this entry, which is computed by name + owner + fromPage + toPage. val id: String, // The name of the page, which is used to compute the unique id, and need to be stable. private val name: String, Loading Loading @@ -72,14 +75,9 @@ data class SettingsEntry( */ private val uiLayoutImpl: (@Composable (arguments: Bundle?) -> Unit) = {}, ) { // The unique id of this entry, which is computed by name + owner + fromPage + toPage. fun id(): String { return "$name:${owner.id()}(${fromPage?.id()}-${toPage?.id()})".toHashId() } fun formatContent(): String { val content = listOf( "id = ${id()}", "id = $id", "owner = ${owner.formatDisplayTitle()}", "linkFrom = ${fromPage?.formatDisplayTitle()}", "linkTo = ${toPage?.formatDisplayTitle()}", Loading @@ -99,7 +97,7 @@ data class SettingsEntry( } fun buildRoute(): String { return containerPage().buildRoute(id()) return containerPage().buildRoute(id) } fun hasRuntimeParam(): Boolean { Loading @@ -121,14 +119,13 @@ data class SettingsEntry( @Composable fun UiLayout(runtimeArguments: Bundle? = null) { val context = LocalContext.current val entryId = remember { id() } val highlight = rememberSaveable { mutableStateOf(runtimeArguments?.getString(HIGHLIGHT_ENTRY_PARAM_NAME) == entryId) mutableStateOf(runtimeArguments?.getString(HIGHLIGHT_ENTRY_PARAM_NAME) == id) } if (highlight.value) { highlight.value = false // TODO: Add highlight entry logic Toast.makeText(context, "entry $entryId highlighted", Toast.LENGTH_SHORT).show() Toast.makeText(context, "entry $id highlighted", Toast.LENGTH_SHORT).show() } uiLayoutImpl(fullArgument(runtimeArguments)) } Loading @@ -151,6 +148,7 @@ class SettingsEntryBuilder(private val name: String, private val owner: Settings fun build(): SettingsEntry { return SettingsEntry( id = id(), name = name, owner = owner, displayName = displayName, Loading Loading @@ -206,6 +204,11 @@ class SettingsEntryBuilder(private val name: String, private val owner: Settings return this } // The unique id of this entry, which is computed by name + owner + fromPage + toPage. private fun id(): String { return "$name:${owner.id}(${fromPage?.id}-${toPage?.id})".toHashId() } companion object { fun create(entryName: String, owner: SettingsPage): SettingsEntryBuilder { return SettingsEntryBuilder(entryName, owner) Loading
packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsEntryRepository.kt +6 −9 Original line number Diff line number Diff line Loading @@ -44,26 +44,23 @@ class SettingsEntryRepository(sppRepository: SettingsPageProviderRepository) { val entryQueue = LinkedList<SettingsEntry>() for (page in sppRepository.getAllRootPages()) { val rootEntry = SettingsEntryBuilder.createRoot(owner = page).build() val rootEntryId = rootEntry.id() if (!entryMap.containsKey(rootEntryId)) { if (!entryMap.containsKey(rootEntry.id)) { entryQueue.push(rootEntry) entryMap.put(rootEntryId, rootEntry) entryMap.put(rootEntry.id, rootEntry) } } while (entryQueue.isNotEmpty() && entryMap.size < MAX_ENTRY_SIZE) { val entry = entryQueue.pop() val page = entry.toPage val pageId = page?.id() if (pageId == null || pageWithEntryMap.containsKey(pageId)) continue if (page == null || pageWithEntryMap.containsKey(page.id)) continue val spp = sppRepository.getProviderOrNull(page.name) ?: continue val newEntries = spp.buildEntry(page.arguments) pageWithEntryMap[pageId] = SettingsPageWithEntry(page, newEntries) pageWithEntryMap[page.id] = SettingsPageWithEntry(page, newEntries) for (newEntry in newEntries) { val newEntryId = newEntry.id() if (!entryMap.containsKey(newEntryId)) { if (!entryMap.containsKey(newEntry.id)) { entryQueue.push(newEntry) entryMap.put(newEntryId, newEntry) entryMap.put(newEntry.id, newEntry) } } } Loading