Skip to content

Latest commit

 

History

History
97 lines (74 loc) · 3.3 KB

android.md

File metadata and controls

97 lines (74 loc) · 3.3 KB

Android

The Java SDK should be compatible with modern Android applications written in both Java and Kotlin.

To use the Java SDK in an android application add it to the project's gradle file in the dependencies block.

For Groovy

// build.gradle

dependencies {
    implementation "com.box:box-java-sdk:3.8.0"
}

For Kotlin

// build.gradle.kts

dependencies {
    implementation("com.box:box-java-sdk:3.8.0")
}

Kotlin

The Java SDK can also be used in Kotlin Android applications through interoperability thanks to the Kotlin design. You can read more about Kotlin and Java interoperability here

The following example creates an API connection with a developer token:

val api = BoxAPIConnection("myToken")

The following example shows how to get current user

val userID = "33333"
val api = BoxAPIConnection("myToken")
val user = BoxUser(api, userID)
val userInfo = user.getInfo()

If you are using an IntelliJ-based IDE, you can copy our samples located in the docs directory and paste them into your file. The IDE should ask you to convert the pasted Java sample to Kotlin. Most samples still work after conversion using this approach.

Note that the current Java SDK does not support Kotlin coroutines. By default, you cannot run network calls on the main thread in an Android application. There are various ways to overcome this. For example, if you are in a viewModel context, you can run the SDK method as a coroutine using viewModelScope.

viewModelScope.launch {
    val result = withContext(Dispatchers.IO) {
        /*
            SDK code goes here
        */
    }
    // here you can access the result and load it to the viewModel
}

The following example shows how to get the current items in the root folder, sorted by name in ascending order with additional "created_by" and "name" fields returned from the API. The items are then loaded to the custom data class defined earlier.

// data class definition used in viewModel
data class Item(
    val isFolder: Boolean,
    val name: String,
    val createdBy: String
)

// viewModel init code
viewModelScope.launch {
    val result = withContext(Dispatchers.IO) {
        val res = BoxFolder(BoxAPIConnection("myToken"), "0")
        val iterator: Iterator<BoxItem.Info> =
            res.getChildren("name", BoxFolder.SortDirection.ASC, "created_by", "name")
                .iterator() 
        val items = mutableListOf<Item>()

        when (val itemInfo = iterator.next()) {
            is BoxFile.Info -> items.add(Item(false, "File " + itemInfo.name, itemInfo.createdBy.name))
            is BoxFolder.Info -> items.add(Item(true, "Folder " + itemInfo.name, itemInfo.createdBy.name)) 
        }
        items
    }          
}      

If you are familiar with Kotlin syntax, you might have noticed that we could have used the .map function (or a similar function) to map the API result to a list of items. Due to current limitations, using .map and similar operations on collections is not always possible and may lead to unexpected results. The preferred way is to use an explicit iterator to iterate over the collections returned by the SDK.

If you find any problem related to the Java SDK in Kotlin-based app feel free to open an issue.