Pixelcat-App-Android/app/src/main/kotlin/at/connyduck/pixelcat/components/login/LoginWebViewActivity.kt

100 lines
3.5 KiB
Kotlin

/*
* Copyright (C) 2020 Conny Duck
*
* This file is part of Pixelcat.
*
* Pixelcat is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Pixelcat is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package at.connyduck.pixelcat.components.login
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.webkit.WebResourceRequest
import android.webkit.WebView
import at.connyduck.pixelcat.config.Config
import android.webkit.WebViewClient
import at.connyduck.pixelcat.databinding.ActivityLoginWebViewBinding
class LoginWebViewActivity : AppCompatActivity() {
private lateinit var binding: ActivityLoginWebViewBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityLoginWebViewBinding.inflate(layoutInflater)
setContentView(binding.root)
val domain = intent.getStringExtra(EXTRA_DOMAIN)
val clientId = intent.getStringExtra(EXTRA_CLIENT_ID)
val clientSecret = intent.getStringExtra(EXTRA_CLIENT_SECRET)
val endpoint = "/oauth/authorize"
val parameters = mapOf(
"client_id" to clientId,
"redirect_uri" to Config.oAuthRedirect,
"response_type" to "code",
"scope" to Config.oAuthScopes
)
val url = "https://" + domain + endpoint + "?" + toQueryString(parameters)
binding.loginWebView.webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean {
if (request.url.scheme == Config.oAuthScheme && request.url.host == Config.oAuthHost) {
loginSuccess(request.url.getQueryParameter("code").orEmpty())
return true
}
return false
}
}
binding.loginWebView.loadUrl(url)
}
private fun loginSuccess(authCode: String) {
val successIntent = Intent().apply {
putExtra(RESULT_AUTHORIZATION_CODE, authCode)
}
setResult(Activity.RESULT_OK, successIntent)
finish()
}
private fun toQueryString(parameters: Map<String, String>): String {
return parameters.map { "${it.key}=${Uri.encode(it.value)}" }
.joinToString("&")
}
companion object {
const val RESULT_AUTHORIZATION_CODE = "authCode"
private const val EXTRA_DOMAIN = "domain"
private const val EXTRA_CLIENT_ID = "clientId"
private const val EXTRA_CLIENT_SECRET = "clientSecret"
fun newIntent(domain: String, clientId: String, clientSecret: String, context: Context): Intent {
return Intent(context, LoginWebViewActivity::class.java).apply {
putExtra(EXTRA_DOMAIN, domain)
putExtra(EXTRA_CLIENT_ID, clientId)
putExtra(EXTRA_CLIENT_SECRET, clientSecret)
}
}
}
}