package uk.beads.manager import android.app.Activity import android.os.Handler import android.os.Looper import android.view.View import android.view.ViewGroup import android.webkit.CookieManager import android.webkit.WebView import android.webkit.WebViewClient import okhttp3.Cookie import okhttp3.HttpUrl.Companion.toHttpUrlOrNull object SessionInitializer { private var initialized = false fun init(activity: Activity, onReady: () -> Unit) { if (initialized) { onReady() return } CookieManager.getInstance().setAcceptCookie(true) val webView = WebView(activity) webView.settings.javaScriptEnabled = true webView.settings.domStorageEnabled = true activity.addContentView(webView, ViewGroup.LayoutParams(1, 1)) webView.visibility = View.INVISIBLE val handler = Handler(Looper.getMainLooper()) // Fallback timeout — proceed after 10 seconds even if no __test cookie handler.postDelayed({ if (!initialized) { android.util.Log.w("SessionInit", "Timeout waiting for __test cookie — proceeding anyway") initialized = true transferWebViewCookies() onReady() } }, 10000) webView.webViewClient = object : WebViewClient() { override fun onPageFinished(view: WebView, url: String) { android.util.Log.d("SessionInit", "Page finished: $url") val cookieStr = CookieManager.getInstance().getCookie(ApiClient.BASE_URL) ?: return android.util.Log.d("SessionInit", "WebView cookies: $cookieStr") if (cookieStr.contains("__test=")) { if (!initialized) { initialized = true handler.removeCallbacksAndMessages(null) transferWebViewCookies() android.util.Log.d("SessionInit", "Bot challenge passed via WebView") onReady() } } } } webView.loadUrl("${ApiClient.BASE_URL}/login.php?i=1") } /** * Transfers cookies from the system WebView CookieManager into ApiClient's OkHttp cookie store. */ private fun transferWebViewCookies() { val cookieStr = CookieManager.getInstance().getCookie(ApiClient.BASE_URL) ?: return val httpUrl = ApiClient.BASE_URL.toHttpUrlOrNull() ?: return cookieStr.split(";").forEach { raw -> val parts = raw.trim().split("=", limit = 2) if (parts.size == 2 && parts[0].isNotBlank()) { val cookie = Cookie.Builder() .name(parts[0].trim()) .value(parts[1].trim()) .domain(httpUrl.host) .path("/") .build() ApiClient.addCookie(httpUrl.host, cookie) android.util.Log.d("SessionInit", "Transferred cookie: ${parts[0].trim()}") } } } fun reset() { initialized = false } }