<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://homeostasis.scs.carleton.ca/wiki/index.php?action=history&amp;feed=atom&amp;title=Mobile_Apps_2023W_Lecture_18</id>
	<title>Mobile Apps 2023W Lecture 18 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://homeostasis.scs.carleton.ca/wiki/index.php?action=history&amp;feed=atom&amp;title=Mobile_Apps_2023W_Lecture_18"/>
	<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=Mobile_Apps_2023W_Lecture_18&amp;action=history"/>
	<updated>2026-04-08T03:33:35Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=Mobile_Apps_2023W_Lecture_18&amp;diff=24399&amp;oldid=prev</id>
		<title>Soma: Created page with &quot;==Code==  ===MainActivity.kt===  &lt;syntaxhighlight lang=&quot;kotlin&quot; line&gt; 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 andro...&quot;</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=Mobile_Apps_2023W_Lecture_18&amp;diff=24399&amp;oldid=prev"/>
		<updated>2023-03-17T20:52:12Z</updated>

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