Skip to content

Customizing WebView

Learn how to customize the WebView in Bagisto Native Android for better user experience.

WebView Configuration

Configuration Layers

Basic Customization

kotlin
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        navigator = Navigator(this)
        
        // Configure with custom WebView settings
        val config = NavigatorConfiguration(
            name = "main",
            startLocation = "https://your-storefront.com"
        ).apply {
            // JavaScript settings
            isJavaScriptEnabled = true
            isJavaScriptCanOpenWindowsAutomatically = true
            
            // DOM storage
            isDomStorageEnabled = true
            
            // Database storage
            isDatabaseEnabled = true
            
            // Cache settings
            cacheMode = WebSettings.LOAD_DEFAULT
            
            // Zoom controls
            isBuiltInZoomControls = false
            isDisplayZoomControls = false
            
            // Viewport
            useWideViewPort = true
            loadWithOverviewMode = true
            
            // Media
            allowsInlineMediaPlayback = true
            mediaPlaybackRequiresUserGesture = false
        }
        
        navigator.configure(config)
        setContentView(navigator.getView())
    }
}

Advanced Settings

1. Enable Debugging

kotlin
// Enable WebView debugging
WebView.setWebContentsDebuggingEnabled(true)

2. Custom User Agent

kotlin
val config = NavigatorConfiguration(
    name = "main",
    startLocation = "https://your-storefront.com"
).apply {
    userAgent = "BagistoNative/1.0 Android ${Build.VERSION.SDK_INT}"
}
kotlin
// Enable cookies
CookieManager.getInstance().setAcceptCookie(true)

// Allow third-party cookies
CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true)

4. SSL/TLS Settings

kotlin
webView.webViewClient = object : WebViewClient() {
    override fun onReceivedSslError(
        view: WebView?, 
        handler: SslErrorHandler?, 
        error: SslError?
    ) {
        // WARNING: Never use this in production!
        // For development only:
        handler?.proceed()
        
        // In production, handle appropriately:
        // handler?.cancel()
    }
}

Performance Optimization

1. Enable Hardware Acceleration

xml
<!-- AndroidManifest.xml -->
<application
    android:hardwareAccelerated="true"
    ... >
</application>

2. Enable Fast Loading

kotlin
val config = NavigatorConfiguration(
    name = "main",
    startLocation = "https://your-storefront.com"
).apply {
    // Enable fast loading
    isLoadWithOverviewMode = true
    isUseWideViewPort = true
    
    // Block popups
    isJavaScriptCanOpenWindowsAutomatically = false
}

3. Configure Cache

kotlin
val config = NavigatorConfiguration(
    name = "main",
    startLocation = "https://your-storefront.com"
).apply {
    // Use cache if available
    cacheMode = WebSettings.LOAD_CACHE_ELSE_NETWORK
    
    // Enable app cache
    isAppCacheEnabled = true
    appCachePath = cacheDir.absolutePath
}

Custom ChromeClient

Handle JavaScript Dialogs

kotlin
webView.webChromeClient = object : WebChromeClient() {
    override fun onJsAlert(
        view: WebView?,
        url: String?,
        message: String?,
        result: JsResult?
    ): Boolean {
        // Show native dialog
        AlertDialog.Builder(context)
            .setMessage(message)
            .setPositiveButton("OK") { _, _ -> result?.confirm() }
            .show()
        return true
    }

    override fun onJsConfirm(
        view: WebView?,
        url: String?,
        message: String?,
        result: JsResult?
    ): Boolean {
        // Show confirmation dialog
        AlertDialog.Builder(context)
            .setMessage(message)
            .setPositiveButton("OK") { _, _ -> result?.confirm() }
            .setNegativeButton("Cancel") { _, _ -> result?.cancel() }
            .show()
        return true
    }

    override fun onJsPrompt(
        view: WebView?,
        url: String?,
        message: String?,
        defaultValue: String?,
        result: JsPromptResult?
    ): Boolean {
        // Handle prompt
        return true
    }

    override fun onProgressChanged(view: WebView?, newProgress: Int) {
        // Update progress bar
        if (newProgress < 100) {
            progressBar.visibility = View.VISIBLE
        } else {
            progressBar.visibility = View.GONE
        }
    }
}

Custom WebViewClient

Handle Page Loading

kotlin
webView.webViewClient = object : WebViewClient() {
    override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
        super.onPageStarted(view, url, favicon)
        // Show loading indicator
    }

    override fun onPageFinished(view: WebView?, url: String?) {
        super.onPageFinished(view, url)
        // Hide loading indicator
    }

    override fun shouldOverrideUrlLoading(
        view: WebView?,
        request: WebResourceRequest?
    ): Boolean {
        // Handle URL navigation
        val url = request?.url?.toString() ?: return false
        
        // Open external links in browser
        if (url.startsWith("http://") && !url.contains("your-storefront.com")) {
            Intent(Intent.ACTION_VIEW, Uri.parse(url)).apply {
                startActivity(this)
            }
            return true
        }
        
        return false
    }

    override fun onReceivedError(
        view: WebView?,
        request: WebResourceRequest?,
        error: WebResourceError?
    ) {
        // Handle error
        if (request?.isForMainFrame == true) {
            // Show error page
        }
    }
}

Best Practices

PracticeDescription
Enable hardware accelerationSmoother rendering
Configure cachingFaster page loads
Handle errors gracefullyBetter UX
Use WebViewClientControl navigation
Optimize imagesReduce data usage

Troubleshooting

IssueSolution
White screenCheck network, JavaScript enabled
Can't open linksOverride shouldOverrideUrlLoading
Cookies not workingEnable CookieManager
SSL errorsCheck certificate validity
Slow loadingEnable cache, optimize images

Released under the MIT License.