Skip to content

Commit

Permalink
use coroutines
Browse files Browse the repository at this point in the history
  • Loading branch information
andi@tryb.de authored and andi@tryb.de committed May 14, 2020
1 parent 6c35cb1 commit 0396fbe
Show file tree
Hide file tree
Showing 18 changed files with 77 additions and 77 deletions.
4 changes: 2 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -56,15 +56,15 @@ coveralls {
jacocoReportPath 'build/reports/jacoco/jacocoTestReleaseUnitTestReport/jacocoTestReleaseUnitTestReport.xml'
}

def anko_version = '0.10.8'
def dagger_version = '2.27'

dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.media:media:1.1.0'
implementation "org.jetbrains.anko:anko:$anko_version"
implementation 'androidx.core:core-ktx:1.2.0'
implementation "androidx.work:work-runtime-ktx:2.3.4"
implementation 'org.osmdroid:osmdroid-android:6.1.6'
implementation 'com.android.support:multidex:1.0.3'

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import android.media.RingtoneManager
import android.net.Uri
import android.os.Build
import android.os.Vibrator
import android.preference.PreferenceManager
import android.util.Log
import org.blitzortung.android.app.Main
import org.blitzortung.android.app.view.OnSharedPreferenceChangeListener
Expand All @@ -16,7 +17,6 @@ import org.blitzortung.android.app.view.PreferenceKey.ALERT_SOUND_SIGNAL
import org.blitzortung.android.app.view.PreferenceKey.ALERT_VIBRATION_SIGNAL
import org.blitzortung.android.app.view.get
import org.blitzortung.android.util.isAtLeast
import org.jetbrains.anko.defaultSharedPreferences
import javax.inject.Inject
import javax.inject.Singleton

Expand All @@ -27,7 +27,7 @@ class AlertSignal @Inject constructor(
) : OnSharedPreferenceChangeListener {

init {
val preferences = context.defaultSharedPreferences
val preferences = PreferenceManager.getDefaultSharedPreferences(context)
preferences.registerOnSharedPreferenceChangeListener(this)
onSharedPreferenceChanged(preferences, ALERT_VIBRATION_SIGNAL, ALERT_SOUND_SIGNAL)
}
Expand Down
3 changes: 1 addition & 2 deletions app/src/main/java/org/blitzortung/android/app/Main.kt
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,6 @@ import org.blitzortung.android.map.overlay.color.StrikeColorHandler
import org.blitzortung.android.util.LogUtil
import org.blitzortung.android.util.TabletAwareView
import org.blitzortung.android.util.isAtLeast
import org.jetbrains.anko.intentFor
import org.osmdroid.config.Configuration
import org.osmdroid.tileprovider.util.StorageUtils
import org.osmdroid.util.GeoPoint
Expand Down Expand Up @@ -236,7 +235,7 @@ class Main : FragmentActivity(), OnSharedPreferenceChangeListener {
}

private val serviceIntent: Intent
get() = intentFor<AppService>()
get() = Intent(this, AppService::class.java)

private fun startService() {
startService(serviceIntent)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package org.blitzortung.android.app

import android.app.Activity
import android.app.Dialog
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import androidx.appcompat.widget.PopupMenu
import android.util.Log
Expand All @@ -14,7 +16,6 @@ import org.blitzortung.android.dialogs.AlertDialog
import org.blitzortung.android.dialogs.AlertDialogColorHandler
import org.blitzortung.android.dialogs.InfoDialog
import org.blitzortung.android.dialogs.LogDialog
import org.jetbrains.anko.startActivity

class MainPopupMenu(
context: Context,
Expand All @@ -37,7 +38,7 @@ class MainPopupMenu(
override fun onMenuItemClick(item: MenuItem?): Boolean {
val versionComponent = VersionComponent(context)
if (item?.itemId == R.id.menu_preferences) {
context.startActivity<Preferences>()
context.startActivity(Intent(context, Preferences::class.java))
} else {
val dialog = when (item?.itemId) {
R.id.menu_info -> InfoDialog(context, versionComponent)
Expand Down
7 changes: 4 additions & 3 deletions app/src/main/java/org/blitzortung/android/app/Preferences.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

package org.blitzortung.android.app

import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.location.LocationManager
Expand All @@ -30,7 +31,6 @@ import org.blitzortung.android.app.view.PreferenceKey
import org.blitzortung.android.app.view.get
import org.blitzortung.android.data.provider.DataProviderType
import org.blitzortung.android.location.LocationHandler
import org.jetbrains.anko.locationManager
import javax.inject.Inject

class Preferences : PreferenceActivity(), OnSharedPreferenceChangeListener {
Expand Down Expand Up @@ -59,8 +59,9 @@ class Preferences : PreferenceActivity(), OnSharedPreferenceChangeListener {

PreferenceKey.LOCATION_MODE -> {
val provider = configureLocationProviderPreferences(sharedPreferences)

if (provider != LocationHandler.MANUAL_PROVIDER && !this.locationManager.isProviderEnabled(provider)) {
getSystemService(Context.LOCATION_SERVICE) as LocationManager
if (provider != LocationHandler.MANUAL_PROVIDER &&
!(getSystemService(Context.LOCATION_SERVICE) as LocationManager).isProviderEnabled(provider)) {
startActivity(Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS))
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import android.graphics.*
import android.graphics.Paint.Align
import android.graphics.Paint.Style
import android.location.Location
import android.preference.PreferenceManager
import android.util.AttributeSet
import android.util.Log
import android.view.View
Expand All @@ -39,7 +40,6 @@ import org.blitzortung.android.dialogs.AlertDialogColorHandler
import org.blitzortung.android.location.LocationEvent
import org.blitzortung.android.map.overlay.color.ColorHandler
import org.blitzortung.android.util.TabletAwareView
import org.jetbrains.anko.defaultSharedPreferences

class AlertView @JvmOverloads constructor(
context: Context,
Expand Down Expand Up @@ -96,7 +96,8 @@ class AlertView @JvmOverloads constructor(
}

fun enableLongClickListener(dataHandler: MainDataHandler, alertHandler: AlertHandler) {
val sharedPreferences = context.defaultSharedPreferences

val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)

setOnLongClickListener {
AlertDialog(context, AlertDialogColorHandler(sharedPreferences), dataHandler, alertHandler)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,10 @@ import android.content.SharedPreferences
import android.content.pm.PackageInfo
import android.os.PowerManager
import android.os.Vibrator
import android.preference.PreferenceManager
import dagger.Module
import dagger.Provides
import org.blitzortung.android.app.BOApplication
import org.jetbrains.anko.defaultSharedPreferences
import org.jetbrains.anko.powerManager
import javax.inject.Inject
import javax.inject.Named

Expand All @@ -23,10 +22,10 @@ class AppModule @Inject constructor(
fun provideContext(): Context = application

@Provides
fun provideSharedPrefs(): SharedPreferences = application.defaultSharedPreferences
fun provideSharedPrefs(): SharedPreferences = PreferenceManager.getDefaultSharedPreferences(application)

@Provides
fun wakeLock() : PowerManager.WakeLock = application.powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, BOApplication.WAKE_LOCK_TAG)
fun wakeLock(): PowerManager.WakeLock = (application.getSystemService(Context.POWER_SERVICE) as PowerManager).newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, BOApplication.WAKE_LOCK_TAG)

@Provides
fun packageInfo(): PackageInfo = application.packageManager.getPackageInfo(application.packageName, 0)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,20 @@ package org.blitzortung.android.data
import android.os.Build
import android.os.PowerManager
import android.util.Log
import kotlinx.coroutines.*
import org.blitzortung.android.app.Main
import org.blitzortung.android.data.provider.data.DataProvider
import org.blitzortung.android.data.provider.result.ResultEvent
import org.blitzortung.android.util.isAtLeast
import java.util.concurrent.locks.Lock
import kotlin.reflect.KSuspendFunction1

internal class FetchBackgroundDataTask(
dataMode: DataMode,
dataProvider: DataProvider,
lock: Lock,
resultConsumer: (ResultEvent) -> Unit,
toast: (Int) -> Unit,
toast: KSuspendFunction1<Int, Unit>,
private val wakeLock: PowerManager.WakeLock
) : FetchDataTask(dataMode, dataProvider, lock, resultConsumer, toast) {

Expand All @@ -33,7 +35,7 @@ internal class FetchBackgroundDataTask(
}
}

override fun doInBackground(vararg taskParametersArray: TaskParameters): ResultEvent? {
override suspend fun doInBackground(taskParameters: TaskParameters): ResultEvent? = withContext(Dispatchers.IO) {
if (isAtLeast(Build.VERSION_CODES.N)) {
wakeLock.acquire(ServiceDataHandler.WAKELOCK_TIMEOUT)
} else {
Expand All @@ -42,10 +44,9 @@ internal class FetchBackgroundDataTask(

Log.v(Main.LOG_TAG, "FetchBackgroundDataTask aquire wakelock " + wakeLock)

val taskParameters = taskParametersArray[0]
val updatedParameters = taskParameters.parameters.copy(intervalDuration = 10, intervalOffset = 0)
val updatedParams = arrayOf(taskParameters.copy(parameters = updatedParameters, flags = Flags(storeResult = false)))
val updatedParams = taskParameters.copy(parameters = updatedParameters, flags = Flags(storeResult = false))

return super.doInBackground(*updatedParams)
return@withContext super.doInBackground(updatedParams)
}
}
41 changes: 28 additions & 13 deletions app/src/main/java/org/blitzortung/android/data/FetchDataTask.kt
Original file line number Diff line number Diff line change
@@ -1,29 +1,37 @@
package org.blitzortung.android.data

import android.os.AsyncTask
import kotlinx.coroutines.*
import org.blitzortung.android.app.R
import org.blitzortung.android.data.provider.data.DataProvider
import org.blitzortung.android.data.provider.result.ResultEvent
import java.net.SocketException
import java.net.SocketTimeoutException
import java.util.concurrent.locks.Lock
import kotlin.coroutines.CoroutineContext
import kotlin.reflect.KSuspendFunction1

internal open class FetchDataTask(
private val dataMode: DataMode,
private val dataProvider: DataProvider,
private val lock: Lock,
private val resultConsumer: (ResultEvent) -> Unit,
private val toast: (Int) -> Unit
) : AsyncTask<TaskParameters, Int, ResultEvent>() {
private val toast: KSuspendFunction1<Int, Unit>
) : CoroutineScope {
private var job: Job = Job()

override fun onPostExecute(result: ResultEvent?) {
if (result != null) {
resultConsumer.invoke(result)
}
override val coroutineContext: CoroutineContext
get() = Dispatchers.Main + job

fun cancel() {
job.cancel()
}

fun execute(taskParameters: TaskParameters) = launch {
val result = doInBackground(taskParameters)
onPostExecute(result)
}

override fun doInBackground(vararg taskParametersArray: TaskParameters): ResultEvent? {
val taskParameters = taskParametersArray[0]
protected open suspend fun doInBackground(taskParameters: TaskParameters): ResultEvent? = withContext(Dispatchers.IO) {
val parameters = taskParameters.parameters
val flags = taskParameters.flags

Expand All @@ -47,21 +55,21 @@ internal open class FetchDataTask(
result.copy(stations = dataProvider!!.getStations(parameters.region))
}*/

return result
return@withContext result
} catch (e: RuntimeException) {
e.printStackTrace()

handleErrorUserFeedback(e)

return ResultEvent(failed = true, referenceTime = System.currentTimeMillis(), parameters = parameters, flags = flags)
return@withContext ResultEvent(failed = true, referenceTime = System.currentTimeMillis(), parameters = parameters, flags = flags)
} finally {
lock.unlock()
}
}
return null
return@withContext null
}

private fun handleErrorUserFeedback(e: RuntimeException) {
private suspend fun handleErrorUserFeedback(e: RuntimeException) {
val warningToastStringResource = when (e.cause) {
is SocketTimeoutException ->
R.string.timeout_warning
Expand All @@ -76,4 +84,11 @@ internal open class FetchDataTask(
toast.invoke(warningToastStringResource)
}
}

open fun onPostExecute(result: ResultEvent?) {
if (result != null) {
resultConsumer.invoke(result)
}
}

}
21 changes: 6 additions & 15 deletions app/src/main/java/org/blitzortung/android/data/MainDataHandler.kt
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ import android.content.SharedPreferences
import android.os.Handler
import android.util.Log
import android.widget.Toast
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import org.blitzortung.android.app.Main
import org.blitzortung.android.app.R
import org.blitzortung.android.app.view.OnSharedPreferenceChangeListener
Expand All @@ -37,8 +39,6 @@ import org.blitzortung.android.data.provider.result.ResultEvent
import org.blitzortung.android.data.provider.result.StatusEvent
import org.blitzortung.android.protocol.ConsumerContainer
import org.blitzortung.android.util.Period
import org.jetbrains.anko.doAsync
import org.jetbrains.anko.uiThread
import java.util.*
import java.util.concurrent.locks.ReentrantLock
import javax.inject.Inject
Expand Down Expand Up @@ -197,13 +197,8 @@ class MainDataHandler @Inject constructor(
}
}

private fun showBlitzortungProviderWarning() {
doAsync {
uiThread {
Toast.makeText(context, R.string.provider_warning, Toast.LENGTH_LONG).show()
}
}
}
private fun showBlitzortungProviderWarning() =
Toast.makeText(context, R.string.provider_warning, Toast.LENGTH_LONG).show()

private fun updateProviderSpecifics() {

Expand Down Expand Up @@ -250,12 +245,8 @@ class MainDataHandler @Inject constructor(
val isRealtime: Boolean
get() = parameters.isRealtime()

private fun toast(stringResource: Int) {
doAsync {
uiThread {
Toast.makeText(context, stringResource, Toast.LENGTH_LONG).show()
}
}
private suspend fun toast(stringResource: Int) = withContext(Dispatchers.Main) {
Toast.makeText(context, stringResource, Toast.LENGTH_LONG).show()
}

fun broadcastEvent(event: DataEvent) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ import android.content.SharedPreferences
import android.os.PowerManager
import android.util.Log
import android.widget.Toast
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import org.blitzortung.android.app.Main
import org.blitzortung.android.app.R
import org.blitzortung.android.app.view.OnSharedPreferenceChangeListener
Expand All @@ -34,8 +36,6 @@ import org.blitzortung.android.data.provider.data.DataProvider
import org.blitzortung.android.data.provider.result.DataEvent
import org.blitzortung.android.data.provider.result.ResultEvent
import org.blitzortung.android.protocol.ConsumerContainer
import org.jetbrains.anko.doAsync
import org.jetbrains.anko.uiThread
import java.util.concurrent.locks.ReentrantLock
import javax.inject.Inject
import javax.inject.Singleton
Expand Down Expand Up @@ -190,11 +190,7 @@ class ServiceDataHandler @Inject constructor(
}

private fun showBlitzortungProviderWarning() {
doAsync {
uiThread {
Toast.makeText(context, R.string.provider_warning, Toast.LENGTH_LONG).show()
}
}
Toast.makeText(context, R.string.provider_warning, Toast.LENGTH_LONG).show()
}

private fun updateProviderSpecifics() {
Expand All @@ -209,12 +205,8 @@ class ServiceDataHandler @Inject constructor(
}


private fun toast(stringResource: Int) {
doAsync {
uiThread {
Toast.makeText(context, stringResource, Toast.LENGTH_LONG).show()
}
}
private suspend fun toast(stringResource: Int) = withContext(Dispatchers.Main) {
Toast.makeText(context, stringResource, Toast.LENGTH_LONG).show()
}

companion object {
Expand Down

0 comments on commit 0396fbe

Please sign in to comment.