Skip to content

Commit 54a17e8

Browse files
committed
Drop deprecated anko and replace with Kotlin coroutines.
We were using only 3 functions from it anyway. Fixes #276
1 parent 158183e commit 54a17e8

24 files changed

+799
-760
lines changed

app/build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,8 @@ dependencies {
121121
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
122122
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
123123

124-
implementation "org.jetbrains.anko:anko-commons:0.10.4"
124+
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3'
125+
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3'
125126

126127
implementation "com.etesync:journalmanager:1.1.1"
127128
def etebaseVersion = '2.3.2'

app/src/main/java/com/etesync/syncadapter/App.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,16 @@ import io.requery.android.sqlite.DatabaseSource
4040
import io.requery.meta.EntityModel
4141
import io.requery.sql.EntityDataStore
4242
import org.acra.ACRA
43-
import org.jetbrains.anko.doAsync
43+
import kotlinx.coroutines.CoroutineScope
44+
import kotlinx.coroutines.Dispatchers
45+
import kotlinx.coroutines.SupervisorJob
46+
import kotlinx.coroutines.launch
4447
import java.util.*
4548

4649

4750
class App : Application() {
51+
private val applicationScope = CoroutineScope(SupervisorJob() + Dispatchers.Main)
52+
4853
/**
4954
* @return [EntityDataStore] single instance for the application.
5055
*
@@ -79,7 +84,7 @@ class App : Application() {
7984
loadLanguage()
8085

8186
// don't block UI for some background checks
82-
doAsync {
87+
applicationScope.launch(Dispatchers.IO) {
8388
// watch installed/removed apps
8489
val tasksFilter = IntentFilter()
8590
tasksFilter.addAction(Intent.ACTION_PACKAGE_ADDED)

app/src/main/java/com/etesync/syncadapter/syncadapter/SyncManager.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ import com.etesync.syncadapter.ui.AccountsActivity
3737
import com.etesync.syncadapter.ui.DebugInfoActivity
3838
import com.etesync.syncadapter.ui.ViewCollectionActivity
3939
import com.etesync.syncadapter.ui.etebase.CollectionActivity
40-
import org.jetbrains.anko.defaultSharedPreferences
40+
import com.etesync.syncadapter.utils.defaultSharedPreferences
4141
import java.io.Closeable
4242
import java.io.FileNotFoundException
4343
import java.io.IOException

app/src/main/java/com/etesync/syncadapter/ui/AccountActivity.kt

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import androidx.core.content.ContextCompat
2828
import androidx.lifecycle.LifecycleOwner
2929
import androidx.lifecycle.MutableLiveData
3030
import androidx.lifecycle.ViewModel
31+
import androidx.lifecycle.lifecycleScope
3132
import androidx.lifecycle.observe
3233
import at.bitfire.ical4android.TaskProvider.Companion.TASK_PROVIDERS
3334
import at.bitfire.vcard4android.ContactsStorageException
@@ -57,8 +58,10 @@ import com.etesync.syncadapter.utils.packageInstalled
5758
import com.google.android.material.snackbar.Snackbar
5859
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
5960
import org.acra.ACRA
60-
import org.jetbrains.anko.doAsync
61-
import org.jetbrains.anko.uiThread
61+
import androidx.lifecycle.viewModelScope
62+
import kotlinx.coroutines.Dispatchers
63+
import kotlinx.coroutines.launch
64+
import kotlinx.coroutines.withContext
6265
import tourguide.tourguide.ToolTip
6366
import java.util.logging.Level
6467

@@ -366,11 +369,11 @@ class AccountActivity : BaseActivity(), Toolbar.OnMenuItemClickListener, PopupMe
366369
}
367370

368371
fun loadAccount() {
369-
doAsync {
370-
val info = doLoad()
371-
uiThread {
372-
holder.value = info
372+
viewModelScope.launch {
373+
val info = withContext(Dispatchers.IO) {
374+
doLoad()
373375
}
376+
holder.value = info
374377
}
375378
}
376379

@@ -577,29 +580,31 @@ class AccountActivity : BaseActivity(), Toolbar.OnMenuItemClickListener, PopupMe
577580
val accountManager = AccountManager.get(this)
578581
val settings = AccountSettings(this@AccountActivity, account)
579582

580-
doAsync {
581-
if (settings.isLegacy) {
582-
val authToken = settings.authToken
583-
val principal = settings.uri?.toHttpUrlOrNull()
584-
585-
try {
586-
val httpClient = HttpClient.Builder(this@AccountActivity, null, authToken).build().okHttpClient
587-
val journalAuthenticator = JournalAuthenticator(httpClient, principal!!)
588-
journalAuthenticator.invalidateAuthToken(authToken)
589-
} catch (e: Exceptions.HttpException) {
590-
// Ignore failures for now
591-
Logger.log.warning(e.toString())
592-
}
593-
} else {
594-
EtebaseLocalCache.clearUserCache(this@AccountActivity, account.name)
595-
596-
try {
597-
val httpClient = HttpClient.Builder(this@AccountActivity).build()
598-
val etebase = EtebaseLocalCache.getEtebase(this@AccountActivity, httpClient.okHttpClient, settings)
599-
etebase.logout()
600-
} catch(e: EtebaseException) {
601-
// Ignore failures for now
602-
Logger.log.warning(e.toString())
583+
lifecycleScope.launch {
584+
withContext(Dispatchers.IO) {
585+
if (settings.isLegacy) {
586+
val authToken = settings.authToken
587+
val principal = settings.uri?.toHttpUrlOrNull()
588+
589+
try {
590+
val httpClient = HttpClient.Builder(this@AccountActivity, null, authToken).build().okHttpClient
591+
val journalAuthenticator = JournalAuthenticator(httpClient, principal!!)
592+
journalAuthenticator.invalidateAuthToken(authToken)
593+
} catch (e: Exceptions.HttpException) {
594+
// Ignore failures for now
595+
Logger.log.warning(e.toString())
596+
}
597+
} else {
598+
EtebaseLocalCache.clearUserCache(this@AccountActivity, account.name)
599+
600+
try {
601+
val httpClient = HttpClient.Builder(this@AccountActivity).build()
602+
val etebase = EtebaseLocalCache.getEtebase(this@AccountActivity, httpClient.okHttpClient, settings)
603+
etebase.logout()
604+
} catch(e: EtebaseException) {
605+
// Ignore failures for now
606+
Logger.log.warning(e.toString())
607+
}
603608
}
604609
}
605610
}

app/src/main/java/com/etesync/syncadapter/ui/AccountSettingsActivity.kt

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,10 @@ import com.etesync.syncadapter.R
3333
import com.etesync.syncadapter.log.Logger
3434
import com.etesync.syncadapter.ui.setup.LoginCredentials
3535
import com.etesync.syncadapter.ui.setup.LoginCredentialsChangeFragment
36-
import org.jetbrains.anko.doAsync
37-
import org.jetbrains.anko.uiThread
36+
import androidx.lifecycle.lifecycleScope
37+
import kotlinx.coroutines.Dispatchers
38+
import kotlinx.coroutines.launch
39+
import kotlinx.coroutines.withContext
3840

3941
class AccountSettingsActivity : BaseActivity() {
4042
private lateinit var account: Account
@@ -96,26 +98,23 @@ class AccountSettingsFragment() : PreferenceFragmentCompat(), LoaderManager.Load
9698
// Category: dashboard
9799
val prefManageAccount = findPreference("manage_account")
98100
prefManageAccount.onPreferenceClickListener = Preference.OnPreferenceClickListener { _ ->
99-
doAsync {
101+
lifecycleScope.launch {
100102
try {
101-
102-
val httpClient = HttpClient.Builder(requireContext()).build()
103-
val etebase = EtebaseLocalCache.getEtebase(requireContext(), httpClient.okHttpClient, settings)
104-
val url = etebase.fetchDashboardUrl()
105-
uiThread {
106-
WebViewActivity.openUrl(requireActivity(), url.toUri())
103+
val url = withContext(Dispatchers.IO) {
104+
val httpClient = HttpClient.Builder(requireContext()).build()
105+
val etebase = EtebaseLocalCache.getEtebase(requireContext(), httpClient.okHttpClient, settings)
106+
etebase.fetchDashboardUrl()
107107
}
108+
WebViewActivity.openUrl(requireActivity(), url.toUri())
108109
} catch (e: EtebaseException) {
109-
uiThread {
110-
val context = context
111-
if (context != null) {
112-
AlertDialog.Builder(context)
113-
.setIcon(R.drawable.ic_error_dark)
114-
.setTitle(R.string.exception)
115-
.setMessage(e.localizedMessage)
116-
.setPositiveButton(android.R.string.yes) { _, _ -> }
117-
.show()
118-
}
110+
val context = context
111+
if (context != null) {
112+
AlertDialog.Builder(context)
113+
.setIcon(R.drawable.ic_error_dark)
114+
.setTitle(R.string.exception)
115+
.setMessage(e.localizedMessage)
116+
.setPositiveButton(android.R.string.yes) { _, _ -> }
117+
.show()
119118
}
120119
}
121120
}

app/src/main/java/com/etesync/syncadapter/ui/AppSettingsActivity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import com.etesync.syncadapter.model.Settings
2222
import com.etesync.syncadapter.utils.HintManager
2323
import com.etesync.syncadapter.utils.LanguageUtils
2424
import com.google.android.material.snackbar.Snackbar
25-
import org.jetbrains.anko.defaultSharedPreferences
25+
import com.etesync.syncadapter.utils.defaultSharedPreferences
2626
import java.net.URI
2727
import java.net.URISyntaxException
2828

0 commit comments

Comments
 (0)