package carleton.comp2601.historyviewer
import android.net.Uri
import android.os.Bundle
import android.util.Log
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Surface
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import carleton.comp2601.historyviewer.ui.theme.HistoryViewerTheme
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.text.ClickableText
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.remember
import androidx.compose.ui.text.AnnotatedString
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
var hnTreeRoot = HNTree()
hnTreeRoot.add("www.carleton.ca")
hnTreeRoot.add("www.google.com")
hnTreeRoot.add("www.cbc.ca.")
hnTreeRoot.add("www.mit.edu")
hnTreeRoot.add("www.google.com")
setContent {
HistoryViewerTheme {
// A surface container using the 'background' color from the theme
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colors.background
) {
Start(hnTreeRoot)
}
}
}
}
}
@Composable
fun Start(hnTreeRoot: HNTree) {
val allNodes = remember {
mutableStateListOf<HNTree>()
}
hnTreeRoot.addMyNodes(allNodes)
LazyColumn {
item {
Text(text = "HOSTS:")
}
items(allNodes) { child ->
val spacing = " ".repeat(child.treeLevel)
val nodeName = child.hostSuffix
ClickableText(text = AnnotatedString("$spacing$nodeName"), onClick = {
child.toggleExpanded()
allNodes.clear()
hnTreeRoot.addMyNodes(allNodes)
Log.d("HistoryViewer","toggled node on $nodeName")
})
}
}
}
package carleton.comp2601.historyviewer
import android.util.Log
class HNTree {
var hostComponent: String = ""
var hostSuffix: String = ""
var parent: HNTree = this
var children: MutableList<HNTree> = mutableListOf()
var treeLevel: Int = 0
var expanded = true
fun add(hostPrefix: String) {
var allComponents: List<String>
var component: String
var child: HNTree? = null
/* still have to deal with getting to the end */
allComponents = hostPrefix.split(".")
if (allComponents.last() == "") {
allComponents = allComponents.dropLast(1)
}
component = allComponents.last()
for (c in this.children) {
if (c.hostComponent == component) {
child = c
break
}
}
if (child == null) {
child = HNTree()
child.parent = this
child.hostComponent = component
child.hostSuffix = "$component.$hostSuffix"
child.treeLevel = this.treeLevel + 1
children.add(child)
}
val hostRemainder = allComponents.dropLast(1).joinToString(".")
Log.d("HNTree", "$hostSuffix adding child $hostRemainder")
if (component != hostPrefix) {
child.add(hostRemainder)
}
}
fun addMyNodes(nodes: MutableList<HNTree>) {
nodes.add(this)
if (expanded) {
//Log.d("HNTree", "$hostSuffix is expanded " )
for (n in children) {
n.addMyNodes(nodes)
}
}
//Log.d("HNTree", "$hostSuffix added " + nodes.count() + " nodes." )
}
fun toggleExpanded() {
expanded = !expanded
}
}