Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,8 @@ To run the demo app locally, get valid playground Ditto instance credentials and
```properties
ditto.onlinePlayground.appId="YOUR_APPID"
ditto.onlinePlayground.token="YOUR_TOKEN"
ditto.onlinePlayground.customAuthUrl="YOUR_AUTHURL"
ditto.onlinePlayground.websocketUrl="YOUR_WEBSOCKETURL"
```

To test your changes to a module in the demo app, make sure to import the local module in `app/build.gradle` dependencies section:
Expand Down
6 changes: 6 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ apply from: "$rootProject.projectDir/gradle/android-common.gradle"

ext.dittoOnlinePlaygroundAppId = getValueFromLocalProperties('ditto.onlinePlayground.appId', "null")
ext.dittoOnlinePlaygroundToken = getValueFromLocalProperties('ditto.onlinePlayground.token', "null")
ext.dittoCustomAuthUrl = getValueFromLocalProperties('ditto.onlinePlayground.customAuthUrl', "null")
ext.dittoWebsocketUrl = getValueFromLocalProperties('ditto.onlinePlayground.websocketUrl', "null")



android {
namespace "live.ditto.dittotoolsapp"
Expand All @@ -19,6 +23,8 @@ android {

buildConfigField "String", "DITTO_ONLINE_PLAYGROUND_APP_ID", dittoOnlinePlaygroundAppId
buildConfigField "String", "DITTO_ONLINE_PLAYGROUND_TOKEN", dittoOnlinePlaygroundToken
buildConfigField "String", "DITTO_CUSTOM_AUTH_URL", dittoCustomAuthUrl
buildConfigField "String", "DITTO_WEBSOCKET_URL", dittoWebsocketUrl
}
buildTypes {
release {
Expand Down
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
tools:targetApi="tiramisu" />

<application
android:name=".DittoToolsApplication"
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package live.ditto.dittotoolsapp

import android.app.Application
import android.util.Log
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.launch
import live.ditto.Ditto
import live.ditto.DittoIdentity
import live.ditto.DittoLogLevel
import live.ditto.DittoLogger
import live.ditto.android.DefaultAndroidDittoDependencies
import live.ditto.transports.DittoSyncPermissions

class DittoToolsApplication : Application() {

private val applicationScope = CoroutineScope(SupervisorJob() + Dispatchers.Default)

lateinit var ditto: Ditto

override fun onCreate() {
super.onCreate()

// Initialize Ditto in the background
applicationScope.launch {
try {
DittoLogger.minimumLogLevel = DittoLogLevel.DEBUG

val androidDependencies = DefaultAndroidDittoDependencies(applicationContext)
val identity = DittoIdentity.OnlinePlayground(
dependencies = androidDependencies,
appId = BuildConfig.DITTO_ONLINE_PLAYGROUND_APP_ID,
token = BuildConfig.DITTO_ONLINE_PLAYGROUND_TOKEN,
customAuthUrl = BuildConfig.DITTO_CUSTOM_AUTH_URL,
enableDittoCloudSync = false
)

ditto = Ditto(
dependencies = androidDependencies,
identity = identity
).apply {
disableSyncWithV3()

updateTransportConfig { transportConfig ->
transportConfig.connect.websocketUrls.add(BuildConfig.DITTO_WEBSOCKET_URL)
}

store.execute("ALTER SYSTEM SET DQL_STRICT_MODE = false")

startSync()
}

Log.d(TAG, "Ditto initialized successfully")
} catch (e: Exception) {
Log.e(TAG, "Failed to initialize Ditto", e)
}
}
}

fun getDittoOrNull(): Ditto? {
return if (::ditto.isInitialized) ditto else null
}

fun missingPermissions(): Array<String> {
return DittoSyncPermissions(applicationContext).missingPermissions()
}

companion object {
private const val TAG = "DittoToolsApplication"
}
}
55 changes: 13 additions & 42 deletions app/src/main/java/live/ditto/dittotoolsapp/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package live.ditto.dittotoolsapp

import android.os.Build
import android.os.Bundle
import android.util.Log
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.annotation.RequiresApi
Expand All @@ -26,18 +25,15 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import kotlinx.coroutines.delay
import live.ditto.Ditto
import live.ditto.DittoIdentity
import live.ditto.DittoLogLevel
import live.ditto.DittoLogger
import live.ditto.android.DefaultAndroidDittoDependencies
import live.ditto.dittotoolsapp.ui.theme.DittoToolsAppTheme
import live.ditto.tools.toolsviewer.DittoToolsViewer
import live.ditto.transports.DittoSyncPermissions

class MainActivity : ComponentActivity() {

private val app by lazy { application as DittoToolsApplication }

@RequiresApi(Build.VERSION_CODES.O)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand All @@ -49,34 +45,22 @@ class MainActivity : ComponentActivity() {
modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background
) {
var ditto: Ditto? by remember { mutableStateOf(null) }
var dittoError: String? by remember { mutableStateOf(null) }

LaunchedEffect(key1 = true) {
try {
ditto = createDitto()
ditto?.startSync()
} catch (e: Throwable) {
dittoError = e.message.toString()
Log.e("Ditto error", e.message.toString())
while (app.getDittoOrNull() == null) {
delay(100)
}
}

dittoError?.let {
DittoError(it)
return@Surface
ditto = app.ditto
}

if (ditto == null) {
Loading()
return@Surface
}

ditto?.let {
DittoToolsViewer(
ditto = it,
onExitTools = { }
)
}
DittoToolsViewer(
ditto = ditto!!
)
}
}
}
Expand All @@ -87,24 +71,11 @@ class MainActivity : ComponentActivity() {
checkPermissions()
}

private suspend fun createDitto(): Ditto = withContext(Dispatchers.Default) {
val androidDependencies = DefaultAndroidDittoDependencies(applicationContext)
val identity = DittoIdentity.OnlinePlayground(
androidDependencies,
appId = BuildConfig.DITTO_ONLINE_PLAYGROUND_APP_ID,
token = BuildConfig.DITTO_ONLINE_PLAYGROUND_TOKEN,
enableDittoCloudSync = true
)
val ditto = Ditto(androidDependencies, identity)
DittoLogger.minimumLogLevel = DittoLogLevel.DEBUG

ditto
}

private fun checkPermissions() {
val missing = DittoSyncPermissions(this).missingPermissions()
val missing = app.missingPermissions()
if (missing.isNotEmpty()) {
this.requestPermissions(missing, 0)
requestPermissions(missing, 0)
app.getDittoOrNull()?.refreshPermissions()
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ androidx-navigation = "2.5.3"
androidx-test-ext = "1.1.5"
androidx-webkit = "1.7.0"
datastorePreferences = "1.0.0"
ditto = "4.9.3"
ditto = "4.11.6"
ditto-tools-android = "4.0.1"

junit = "4.13.2"
Expand Down