Skip to content

Instantly share code, notes, and snippets.

@RuurdBijlsma
Created August 22, 2020 22:14
Show Gist options
  • Save RuurdBijlsma/2b52d80a4d74460ac2837ee55b0b933c to your computer and use it in GitHub Desktop.
Save RuurdBijlsma/2b52d80a4d74460ac2837ee55b0b933c to your computer and use it in GitHub Desktop.
package dev.ruurd.vuemusic
import android.annotation.SuppressLint
import android.net.http.SslError
import android.os.Bundle
import android.util.Log
import android.view.View
import android.view.Window
import android.webkit.*
import androidx.appcompat.app.AppCompatActivity
import com.android.volley.toolbox.Volley
import kotlinx.android.synthetic.main.activity_main.*
import java.io.BufferedInputStream
import java.io.ByteArrayInputStream
import java.io.InputStream
import java.io.InputStreamReader
import java.net.HttpURLConnection
import java.net.URL
import java.nio.charset.Charset
import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit
import java.util.concurrent.atomic.AtomicReference
class MainActivity : AppCompatActivity() {
@SuppressLint("SetJavaScriptEnabled")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
this.requestWindowFeature(Window.FEATURE_NO_TITLE)
setContentView(R.layout.activity_main)
// webView.settings.mediaPlaybackRequiresUserGesture = false
// webView.settings.allowFileAccessFromFileURLs = true
// webView.settings.allowUniversalAccessFromFileURLs = true
// webView.settings.setAppCacheEnabled(true)
webView.settings.allowContentAccess = true
webView.settings.allowFileAccess = true
webView.settings.javaScriptEnabled = true
webView.settings.domStorageEnabled = true
webView.settings.mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW
webView.setLayerType(View.LAYER_TYPE_HARDWARE, null)
webView.addJavascriptInterface(JavaScriptInterface(this, webView), "Android")
webView.clearCache(true)
WebView.setWebContentsDebuggingEnabled(true)
// val vuemusicUrl = "https://ruurd.dev/deleteme";
val vuemusicUrl = "http://127.0.0.1:5500"
val queue = Volley.newRequestQueue(applicationContext)
webView.webViewClient = object : WebViewClient() {
override fun shouldInterceptRequest(
view: WebView?,
request: WebResourceRequest
): WebResourceResponse? {
Log.d("chromium", request.url.toString())
if (request.method.equals("OPTIONS", ignoreCase = true)) {
return OptionsAllowResponse.buildOptionsResponse()
}
if (request.url.toString().contains("android")) {
// val haveHeaders = CountDownLatch(1);
// val haveData = CountDownLatch(1)
// val headersRef = AtomicReference<MutableMap<String, String>>()
// val dataRef = AtomicReference<InputStream>()
//
// Thread {
// val url = URL("https://www.android.com")
// val urlConnection: HttpURLConnection =
// url.openConnection() as HttpURLConnection
// var headers =
// urlConnection.headerFields.mapValues { it.value.joinToString() }
// headers = headers.toMutableMap()
// headers["Access-Control-Allow-Origin"] = "*"
// headers["Access-Control-Allow-Headers"] = "*"
// headers["Access-Control-Allow-Credentials"] = "true"
// headersRef.set(headers)
// }.start()
//
// return object:WebResourceResponse(
// null,
// "UTF-8",
// object : InputStream() {
// override fun read(): Int {
// haveData.await(100, TimeUnit.SECONDS);
// return dataRef.get().read();
// }
// }
// ){
// override fun getResponseHeaders(): MutableMap<String, String> {
// haveHeaders.await(100, TimeUnit.SECONDS)
// return headersRef.get()
// }
// }
val url = URL("https://www.android.com")
val urlConnection: HttpURLConnection = url.openConnection() as HttpURLConnection
try {
var headers =
urlConnection.headerFields.mapValues { it.value.joinToString() }
headers = headers.toMutableMap()
headers["Access-Control-Allow-Origin"] = "*"
headers["Access-Control-Allow-Headers"] = "*"
headers["Access-Control-Allow-Credentials"] = "true"
// val inStream: InputStream = BufferedInputStream(urlConnection.inputStream) // Doesn't work
// val string = "hello world :)"
// val inStream = string.byteInputStream(charset = Charset.forName("UTF-8")) // Works when used as stream, sends hello world as response
return WebResourceResponse(
headers["Content-Type"],
if (urlConnection.contentEncoding === null) "UTF-8" else urlConnection.contentEncoding,
urlConnection.responseCode,
"OK",
headers,
urlConnection.inputStream
)
} finally {
urlConnection.disconnect()
}
} else {
return null
}
}
override fun onPageFinished(view: WebView?, url: String?) {
}
override fun onReceivedError(
view: WebView?,
request: WebResourceRequest?,
error: WebResourceError?
) {
super.onReceivedError(view, request, error)
Log.d("webviwe", "URL ERROR ${request?.url}")
}
override fun onReceivedSslError(
view: WebView?,
handler: SslErrorHandler,
error: SslError?
) {
handler.proceed() // Ignore SSL certificate errors
}
}
webView.loadUrl(vuemusicUrl)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment