<?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_22</id>
	<title>Mobile Apps 2023W Lecture 22 - 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_22"/>
	<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=Mobile_Apps_2023W_Lecture_22&amp;action=history"/>
	<updated>2026-04-08T03:15:38Z</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_22&amp;diff=24418&amp;oldid=prev</id>
		<title>Soma: Created page with &quot;==Code==  &lt;syntaxhighlight lang=&quot;kotlin&quot; line&gt; package carleton.comp2601.webviewcompose  import android.os.Bundle import android.util.Log import android.view.ViewGroup import android.webkit.WebResourceRequest import android.webkit.WebView import android.webkit.WebViewClient import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.layout.Row import androidx.compose.foundation.text.ClickableText import androi...&quot;</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=Mobile_Apps_2023W_Lecture_22&amp;diff=24418&amp;oldid=prev"/>
		<updated>2023-03-31T22:05:56Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;==Code==  &amp;lt;syntaxhighlight lang=&amp;quot;kotlin&amp;quot; line&amp;gt; package carleton.comp2601.webviewcompose  import android.os.Bundle import android.util.Log import android.view.ViewGroup import android.webkit.WebResourceRequest import android.webkit.WebView import android.webkit.WebViewClient import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.layout.Row import androidx.compose.foundation.text.ClickableText import androi...&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;
&amp;lt;syntaxhighlight lang=&amp;quot;kotlin&amp;quot; line&amp;gt;&lt;br /&gt;
package carleton.comp2601.webviewcompose&lt;br /&gt;
&lt;br /&gt;
import android.os.Bundle&lt;br /&gt;
import android.util.Log&lt;br /&gt;
import android.view.ViewGroup&lt;br /&gt;
import android.webkit.WebResourceRequest&lt;br /&gt;
import android.webkit.WebView&lt;br /&gt;
import android.webkit.WebViewClient&lt;br /&gt;
import androidx.activity.ComponentActivity&lt;br /&gt;
import androidx.activity.compose.setContent&lt;br /&gt;
import androidx.compose.foundation.layout.Row&lt;br /&gt;
import androidx.compose.foundation.text.ClickableText&lt;br /&gt;
import androidx.compose.material.*&lt;br /&gt;
import androidx.compose.runtime.*&lt;br /&gt;
import androidx.compose.ui.graphics.Color&lt;br /&gt;
import androidx.compose.ui.text.AnnotatedString&lt;br /&gt;
import androidx.compose.ui.tooling.preview.Preview&lt;br /&gt;
import androidx.compose.ui.viewinterop.AndroidView&lt;br /&gt;
&lt;br /&gt;
class MainActivity : ComponentActivity() {&lt;br /&gt;
&lt;br /&gt;
    override fun onCreate(savedInstanceState: Bundle?) {&lt;br /&gt;
        super.onCreate(savedInstanceState)&lt;br /&gt;
        setContent {&lt;br /&gt;
            // Calling the composable function&lt;br /&gt;
            // to display element and its contents&lt;br /&gt;
            MainContent()&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Creating a composable&lt;br /&gt;
// function to display Top Bar&lt;br /&gt;
@Composable&lt;br /&gt;
fun MainContent() {&lt;br /&gt;
    var curURL by remember { mutableStateOf(&amp;quot;https://news.ycombinator.com&amp;quot;) }&lt;br /&gt;
    var history = mutableListOf&amp;lt;String&amp;gt;(&amp;quot;https://news.ycombinator.com&amp;quot;)&lt;br /&gt;
    var curURLIndex = 0&lt;br /&gt;
&lt;br /&gt;
    fun updateURL(newURL: String) {&lt;br /&gt;
        curURLIndex += 1&lt;br /&gt;
        history.add(curURLIndex, newURL)&lt;br /&gt;
        val lastIndex = history.lastIndex&lt;br /&gt;
        if (lastIndex &amp;gt; curURLIndex) {&lt;br /&gt;
            for (i in curURLIndex + 1..lastIndex) {&lt;br /&gt;
                history.removeAt(i)&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        curURL = newURL&lt;br /&gt;
        Log.d(&amp;quot;webviewCompose&amp;quot;, &amp;quot;updating URL to $curURL&amp;quot;)&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    fun prevURL() {&lt;br /&gt;
        curURLIndex -= 1&lt;br /&gt;
        if (curURLIndex &amp;lt; 0) {&lt;br /&gt;
            curURLIndex = 0&lt;br /&gt;
        }&lt;br /&gt;
        curURL = history[curURLIndex]&lt;br /&gt;
        Log.d(&amp;quot;webviewCompose&amp;quot;, &amp;quot;going to previous URL $curURL&amp;quot;)&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    fun nextURL() {&lt;br /&gt;
        curURLIndex += 1&lt;br /&gt;
        if (curURLIndex &amp;gt; history.lastIndex) {&lt;br /&gt;
            curURLIndex = history.lastIndex&lt;br /&gt;
        }&lt;br /&gt;
        curURL = history[curURLIndex]&lt;br /&gt;
        Log.d(&amp;quot;webviewCompose&amp;quot;, &amp;quot;going to next URL $curURL&amp;quot;)&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Scaffold(&lt;br /&gt;
//        topBar = { TopAppBar(title = {Text(&amp;quot;COMP 2601&amp;quot;)})},&lt;br /&gt;
        topBar = {&lt;br /&gt;
            Row {&lt;br /&gt;
                ClickableText(&lt;br /&gt;
                    AnnotatedString(text = &amp;quot;Back&amp;quot;),&lt;br /&gt;
                    onClick = {&lt;br /&gt;
                        prevURL()&lt;br /&gt;
                    }&lt;br /&gt;
                )&lt;br /&gt;
                ClickableText(&lt;br /&gt;
                    AnnotatedString(text = &amp;quot;Forward&amp;quot;),&lt;br /&gt;
                    onClick = {&lt;br /&gt;
                        nextURL()&lt;br /&gt;
                    }&lt;br /&gt;
                )&lt;br /&gt;
                URLBar(curURL = curURL, updateURL = ::updateURL)&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        content = { MyContent(curURL = curURL, updateURL = ::updateURL) }&lt;br /&gt;
    )&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Composable&lt;br /&gt;
fun URLBar(curURL: String, updateURL: (String) -&amp;gt; Unit) {&lt;br /&gt;
    var newURL = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    TextField(&lt;br /&gt;
        value = curURL,&lt;br /&gt;
        //onFocusChange = { updateURL(newURL) },&lt;br /&gt;
        //onValueChange = { updatedURL: String -&amp;gt; newURL = updatedURL},&lt;br /&gt;
        onValueChange = updateURL,&lt;br /&gt;
        label = { Text(&amp;quot;Enter URL here&amp;quot;) }&lt;br /&gt;
    )&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Composable&lt;br /&gt;
fun MyContent(curURL: String, updateURL: (String) -&amp;gt; Unit) {&lt;br /&gt;
&lt;br /&gt;
    class ObservableWebViewClient : WebViewClient() {&lt;br /&gt;
&lt;br /&gt;
        override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest): Boolean {&lt;br /&gt;
            val url = request.url&lt;br /&gt;
&lt;br /&gt;
            if (!request.isRedirect) {&lt;br /&gt;
                updateURL(url.toString())&lt;br /&gt;
            }&lt;br /&gt;
            return false&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    fun logWebViewHistory(view: WebView) {&lt;br /&gt;
        val history = view.copyBackForwardList()&lt;br /&gt;
&lt;br /&gt;
        val current = history.currentIndex&lt;br /&gt;
&lt;br /&gt;
        Log.d(&amp;quot;webviewCompose&amp;quot;, &amp;quot;Current history item: $current&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        Log.d(&amp;quot;webviewCompose&amp;quot;, &amp;quot;Webview BackForwardList contents:&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        for (i in 0..history.size -1) {&lt;br /&gt;
            val item = history.getItemAtIndex(i)&lt;br /&gt;
&lt;br /&gt;
            if (item != null) {&lt;br /&gt;
                val u = item.originalUrl&lt;br /&gt;
                Log.d(&amp;quot;webviewCompose&amp;quot;, &amp;quot;  $i: $u&amp;quot;)&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Adding a WebView inside AndroidView&lt;br /&gt;
    // with layout as full screen&lt;br /&gt;
    AndroidView(factory = {&lt;br /&gt;
        WebView(it).apply {&lt;br /&gt;
//            layoutParams = ViewGroup.LayoutParams(&lt;br /&gt;
//                ViewGroup.LayoutParams.MATCH_PARENT,&lt;br /&gt;
//                ViewGroup.LayoutParams.MATCH_PARENT&lt;br /&gt;
//            )&lt;br /&gt;
            webViewClient = ObservableWebViewClient()&lt;br /&gt;
            loadUrl(curURL)&lt;br /&gt;
        }&lt;br /&gt;
    }, update = {&lt;br /&gt;
        Log.d(&amp;quot;webviewCompose&amp;quot;, &amp;quot;loading URL $curURL&amp;quot;)&lt;br /&gt;
        it.loadUrl(curURL)&lt;br /&gt;
        //logWebViewHistory(it)&lt;br /&gt;
    })&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// For displaying preview in&lt;br /&gt;
// the Android Studio IDE emulator&lt;br /&gt;
@Preview(showBackground = true)&lt;br /&gt;
@Composable&lt;br /&gt;
fun DefaultPreview() {&lt;br /&gt;
    MainContent()&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Soma</name></author>
	</entry>
</feed>