diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/payment/CanPaymentActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/payment/CanPaymentActivity.kt index db23b164..a31aa72a 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/payment/CanPaymentActivity.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/payment/CanPaymentActivity.kt @@ -2,11 +2,16 @@ package kr.co.vividnext.sodalive.mypage.can.payment import android.annotation.SuppressLint import android.content.Intent +import android.graphics.Bitmap import android.net.Uri +import android.os.Build import android.os.Handler import android.os.Looper import android.view.View +import android.webkit.WebChromeClient +import android.webkit.WebResourceError import android.webkit.WebResourceRequest +import android.webkit.WebSettings import android.webkit.WebView import android.webkit.WebViewClient import android.widget.TextView @@ -26,6 +31,7 @@ import kr.co.vividnext.sodalive.BuildConfig import kr.co.vividnext.sodalive.R import kr.co.vividnext.sodalive.base.BaseActivity import kr.co.vividnext.sodalive.common.Constants +import kr.co.vividnext.sodalive.common.LoadingDialog import kr.co.vividnext.sodalive.common.SharedPreferenceManager import kr.co.vividnext.sodalive.databinding.ActivityCanPaymentBinding import kr.co.vividnext.sodalive.extensions.formatMoney @@ -53,8 +59,16 @@ class CanPaymentActivity : BaseActivity( private val handler = Handler(Looper.getMainLooper()) + private lateinit var loadingDialog: LoadingDialog + + override fun onDestroy() { + loadingDialog.dismiss() + super.onDestroy() + } + @SuppressLint("SetTextI18n") override fun setupView() { + loadingDialog = LoadingDialog(this, layoutInflater) canResponse = IntentCompat.getParcelableExtra( intent, Constants.EXTRA_CAN, @@ -298,12 +312,52 @@ class CanPaymentActivity : BaseActivity( val webView: WebView = binding.webviewPayverse webView.visibility = View.VISIBLE + webView.settings.allowFileAccess = false + webView.settings.allowContentAccess = false + webView.settings.displayZoomControls = false + webView.settings.cacheMode = WebSettings.LOAD_NO_CACHE + webView.settings.domStorageEnabled = true webView.settings.javaScriptEnabled = true + webView.settings.javaScriptCanOpenWindowsAutomatically = true + webView.settings.loadsImagesAutomatically = true + webView.settings.loadWithOverviewMode = true + webView.settings.useWideViewPort = true + webView.settings.setSupportMultipleWindows(true) + webView.webViewClient = object : WebViewClient() { + override fun onReceivedError( + view: WebView?, + request: WebResourceRequest?, + error: WebResourceError? + ) { + loadingDialog.dismiss() + } + + override fun onReceivedError( + view: WebView?, + errorCode: Int, + description: String?, + failingUrl: String? + ) { + loadingDialog.dismiss() + } + override fun onPageFinished(view: WebView, url: String) { super.onPageFinished(view, url) - val escaped = JSONObject.quote(jsonForJs) - view.evaluateJavascript("startPay($escaped)", null) + loadingDialog.dismiss() + + if ( + url == "file:///android_asset/payverse_starter_debug.html" || + url == "file:///android_asset/payverse_starter.html" + ) { + val escaped = JSONObject.quote(jsonForJs) + view.evaluateJavascript("startPay($escaped)", null) + } + } + + override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) { + super.onPageStarted(view, url, favicon) + loadingDialog.show(screenWidth) } override fun shouldOverrideUrlLoading( @@ -311,19 +365,24 @@ class CanPaymentActivity : BaseActivity( request: WebResourceRequest ): Boolean { val url = request.url.toString() - if (url.startsWith("$appScheme://")) { - startActivity(Intent(Intent.ACTION_VIEW, url.toUri())) - return true - } + return handleUrl(view, url) + } - if (url.startsWith("payverse://")) { - val intent = Intent(Intent.ACTION_VIEW, url.toUri()) - if (intent.resolveActivity(packageManager) != null) { - startActivity(intent) - } - return true + @Deprecated("Deprecated in Java") + @Suppress("DEPRECATION") + override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { + return handleUrl(view, url) + } + return super.shouldOverrideUrlLoading(view, url) + } + } + + webView.webChromeClient = object : WebChromeClient() { + override fun onProgressChanged(view: WebView?, newProgress: Int) { + if (newProgress >= 100) { + loadingDialog.dismiss() } - return BootpayUrlHelper.shouldOverrideUrlLoading(view, url) } } @@ -334,7 +393,12 @@ class CanPaymentActivity : BaseActivity( } } catch (e: Exception) { Logger.e(e.message ?: "payverse start error") - Toast.makeText(applicationContext, "결제 초기화에 실패했습니다.", Toast.LENGTH_LONG).show() + Toast.makeText( + applicationContext, + "결제 초기화에 실패했습니다.", + Toast.LENGTH_LONG + ).show() + binding.webviewPayverse.visibility = View.GONE } } @@ -343,6 +407,23 @@ class CanPaymentActivity : BaseActivity( intent?.data?.let { handlePayverseDeeplink(it) } } + private fun handleUrl(view: WebView, url: String): Boolean { + val appScheme = BuildConfig.APPSCHEME + if (url.startsWith("$appScheme://")) { + startActivity(Intent(Intent.ACTION_VIEW, url.toUri())) + return true + } + + if (url.startsWith("payverse://")) { + val intent = Intent(Intent.ACTION_VIEW, url.toUri()) + if (intent.resolveActivity(packageManager) != null) { + startActivity(intent) + } + return true + } + return BootpayUrlHelper.shouldOverrideUrlLoading(view, url) + } + private fun handlePayverseDeeplink(uri: Uri) { val resultStatus = uri.getQueryParameter("resultStatus") val transactionId = uri.getQueryParameter("tid") @@ -372,6 +453,7 @@ class CanPaymentActivity : BaseActivity( }, onFailure = { Toast.makeText(applicationContext, it, Toast.LENGTH_LONG).show() + binding.webviewPayverse.visibility = View.GONE } ) }