Mobile Apps 2023W Lecture 18
Jump to navigation
Jump to search
Code
MainActivity.kt
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")
})
}
}
}
HNTree.kt
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
}
}