blob: 289dacbca69eef9482ecbb5f7327441c401cb23a [file] [log] [blame]
/*
* Copyright (C) 2020 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.systemui.statusbar.notification.collection.render
import android.view.View
import java.lang.RuntimeException
import java.lang.StringBuilder
/**
* A controller that represents a single unit of addable/removable view(s) in the notification
* shade. Some nodes are just a single view (such as a header), while some might involve many views
* (such as a notification row).
*
* It's possible for nodes to support having child nodes (for example, some notification rows
* contain other notification rows). If so, they must implement all of the child-related methods
* below.
*/
interface NodeController {
/** A string that uniquely(ish) represents the node in the tree. Used for debugging. */
val nodeLabel: String
val view: View
fun getChildAt(index: Int): View? {
throw RuntimeException("Not supported")
}
fun getChildCount(): Int = 0
fun addChildAt(child: NodeController, index: Int) {
throw RuntimeException("Not supported")
}
fun moveChildTo(child: NodeController, index: Int) {
throw RuntimeException("Not supported")
}
fun removeChild(child: NodeController, isTransfer: Boolean) {
throw RuntimeException("Not supported")
}
}
/**
* Used to specify the tree of [NodeController]s that currently make up the shade.
*/
interface NodeSpec {
val parent: NodeSpec?
val controller: NodeController
val children: List<NodeSpec>
}
class NodeSpecImpl(
override val parent: NodeSpec?,
override val controller: NodeController
) : NodeSpec {
override val children = mutableListOf<NodeSpec>()
}
/**
* Converts a tree spec to human-readable string, for dumping purposes.
*/
fun treeSpecToStr(tree: NodeSpec): String {
return StringBuilder().also { treeSpecToStrHelper(tree, it, "") }.toString()
}
private fun treeSpecToStrHelper(tree: NodeSpec, sb: StringBuilder, indent: String) {
sb.append("${indent}{${tree.controller.nodeLabel}}\n")
if (tree.children.isNotEmpty()) {
val childIndent = "$indent "
for (child in tree.children) {
treeSpecToStrHelper(child, sb, childIndent)
}
}
}