The webview app is not saving cookies, but all other browsers, both PC and Android saved login data. Cookies are not getting saved I guess. Each time the app is closed, the logged in details are not getting saved. I am new to app development, I cant figure out how to fix this issue. Here is the full source link
https://github.com/shylendramadda/android-webview-kotlin
import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.graphics.Bitmap
import android.net.ConnectivityManager
import android.net.NetworkCapabilities
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.provider.Settings
import android.util.Log
import android.view.KeyEvent
import android.webkit.*
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.google.android.material.snackbar.Snackbar
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
private var progress: Progress? = null
private var isLoaded: Boolean = false
private var doubleBackToExitPressedOnce = false
private var webURL = "https://www.nextinweb.com/"
@SuppressLint("SetJavaScriptEnabled")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val settings = webView.settings
settings.javaScriptEnabled = true
settings.allowFileAccess = true
settings.domStorageEnabled = true
settings.javaScriptCanOpenWindowsAutomatically = true
settings.supportMultipleWindows()
progress = Progress(this, R.string.please_wait, cancelable = true)
if (!isOnline()) {
showToast(getString(R.string.no_internet))
infoTV.text = getString(R.string.no_internet)
showNoNetSnackBar()
return
}
}
override fun onResume() {
if (isOnline() && !isLoaded) loadWebView()
super.onResume()
}
private fun loadWebView() {
showProgress(true)
infoTV.text = ""
webView.loadUrl(webURL)
webView.webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(
view: WebView?,
request: WebResourceRequest?
): Boolean {
val url = request?.url.toString()
if (android.os.Build.VERSION.SDK_INT >= 21) {
CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true);
} else {
CookieManager.getInstance().setAcceptCookie(true);
}
if (url.contains("facebook.com") || url.contains("twitter.com") || url.contains("instagram.com") || url.contains("youtube.com")) {
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
startActivity(intent)
webView.goBack()
return true
} else {
view?.loadUrl(url)
}
return super.shouldOverrideUrlLoading(view, request)
}
override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
showProgress(true)
super.onPageStarted(view, url, favicon)
}
override fun onPageFinished(view: WebView?, url: String?) {
isLoaded = true
showProgress(false)
super.onPageFinished(view, url)
}
override fun onReceivedError(
view: WebView,
request: WebResourceRequest,
error: WebResourceError
) {
isLoaded = false
val errorMessage = "Got Error! $error"
showToast(errorMessage)
infoTV.text = errorMessage
showProgress(false)
super.onReceivedError(view, request, error)
}
}
}
override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
if (event.action == KeyEvent.ACTION_DOWN) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (webView.canGoBack()) {
webView.goBack()
} else {
showToastToExit()
}
return true
}
}
return super.onKeyDown(keyCode, event)
}
private fun showToastToExit() {
when {
doubleBackToExitPressedOnce -> {
onBackPressed()
}
else -> {
doubleBackToExitPressedOnce = true
showToast(getString(R.string.back_again_to_exit))
Handler(Looper.myLooper()!!).postDelayed(
{ doubleBackToExitPressedOnce = false },
2000
)
}
}
}
private fun showProgress(visible: Boolean) {
}
private fun isOnline(): Boolean {
val connectivityManager =
getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val capabilities =
connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)
if (capabilities != null) {
when {
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> {
Log.i("Internet", "NetworkCapabilities.TRANSPORT_CELLULAR")
return true
}
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> {
Log.i("Internet", "NetworkCapabilities.TRANSPORT_WIFI")
return true
}
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> {
Log.i("Internet", "NetworkCapabilities.TRANSPORT_ETHERNET")
return true
}
}
}
return false
}
private fun showToast(message: String) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
}
private fun showNoNetSnackBar() {
val snack =
Snackbar.make(rootView, getString(R.string.no_internet), Snackbar.LENGTH_INDEFINITE)
snack.setAction(getString(R.string.settings)) {
startActivity(Intent(Settings.ACTION_WIFI_SETTINGS))
}
snack.show()
}
}