# File Downloads

This implementation allows users to download `.ics` files (calendar events) from the LiSA Player running in a WebView, and save them to the device for easy "Add to Calendar" functionality.

### **Update WebViewActivity with `.ics` File Download Support**

```kotlin
import android.Manifest
import android.app.DownloadManager
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.webkit.*
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import java.io.File

class WebViewActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_webview)

        val webView: WebView = findViewById(R.id.webView)
        webView.webViewClient = WebViewClient()
        webView.webChromeClient = WebChromeClient()

        // Enable JavaScript
        val webSettings: WebSettings = webView.settings
        webSettings.javaScriptEnabled = true

        // Allow Media Playback Inline
        webSettings.mediaPlaybackRequiresUserGesture = false

        // Enable file downloads
        enableFileDownloads(webView)

        // Load the web app URL
        webView.loadUrl("https://{clientId}.loveslisa.tech/s/{showId}")

        // Handle communication from the web app
        webView.addJavascriptInterface(object : Any() {
            @JavascriptInterface
            fun postMessage(message: String) {
                // Process the message from the web app
                println("Message from LiSA: $message")
            }
        }, "MessageFromLiSA")
    }

    private fun enableFileDownloads(webView: WebView) {
        // Request permissions for downloading files
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != 
            PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(
                this,
                arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE),
                1
            )
        }

        // Set up a Download Listener
        webView.setDownloadListener { url, userAgent, contentDisposition, mimeType, _ ->
            if (mimeType == "text/calendar" || url.endsWith(".ics")) {
                // Use DownloadManager to download the file
                val request = DownloadManager.Request(Uri.parse(url))
                request.setMimeType(mimeType)
                request.addRequestHeader("User-Agent", userAgent)
                request.setDescription("Downloading calendar event...")
                request.setTitle(URLUtil.guessFileName(url, contentDisposition, mimeType))
                request.setDestinationInExternalPublicDir(
                    Environment.DIRECTORY_DOWNLOADS,
                    URLUtil.guessFileName(url, contentDisposition, mimeType)
                )
                request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)

                val downloadManager = getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
                downloadManager.enqueue(request)

                // Inform the user
                println("Downloading .ics file from: $url")
            }
        }
    }
}
```

***

### **Key Changes and Additions**

1. **`setDownloadListener`:**
   * Listens for file download requests from the `WebView` and identifies `.ics` files (MIME type: `text/calendar` or files ending in `.ics`).
2. **Permissions Request:**
   * Requests `WRITE_EXTERNAL_STORAGE` permission at runtime to save the `.ics` file to the device.
3. **Use of `DownloadManager`:**
   * Downloads the `.ics` file and saves it in the `Downloads` directory.
   * Adds a notification when the download is complete.

***

### **Steps to Integrate**

#### **Add the WebViewActivity to Your Android App:**

Use the provided `WebViewActivity` code as a starting point.

#### **Request Permissions in `AndroidManifest.xml`**

Ensure the following permissions are declared in your `AndroidManifest.xml`:

```xml
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
```

#### **Add the WebView to Your Layout**

Define the `WebView` in your `activity_webview.xml` layout file:

```xml
<WebView
    android:id="@+id/webView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
```

#### **Handle File Downloads**

* The `.ics` files are detected based on their MIME type (`text/calendar`) or file extension (`.ics`).
* Files are saved in the `Downloads` directory using `DownloadManager`.

#### **Permissions Handling**

* If running on Android 6.0 (API level 23) or higher, the app requests storage permissions at runtime.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.hello-lisa.com/developers/guides/integration-guide/app-integration/android/file-downloads.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
