From c134cf466dcce60b997bad78c04958047de27e76 Mon Sep 17 00:00:00 2001 From: Janne Koschinski <janne@kuschku.de> Date: Thu, 3 May 2018 22:38:08 +0200 Subject: [PATCH] Fixes #65 Signed-off-by: Janne Koschinski <janne@kuschku.de> --- .../util/service/BackendServiceConnection.kt | 33 +++++++++++++------ .../java/de/kuschku/malheur/CrashHandler.kt | 10 ++++-- 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/service/BackendServiceConnection.kt b/app/src/main/java/de/kuschku/quasseldroid/util/service/BackendServiceConnection.kt index 35ce1b674..111d27191 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/util/service/BackendServiceConnection.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/util/service/BackendServiceConnection.kt @@ -35,14 +35,19 @@ class BackendServiceConnection : ServiceConnection { var context: Context? = null - private var bound: Boolean = false + enum class State { + UNBOUND, + BINDING, + BOUND, + UNBINDING + } + + private var state: State = State.UNBOUND override fun onServiceDisconnected(component: ComponentName?) { - when (component) { - ComponentName(context, QuasselService::class.java) -> { - bound = false - backend.onNext(Optional.empty()) - } + synchronized(this@BackendServiceConnection) { + state = State.UNBOUND + backend.onNext(Optional.empty()) } } @@ -50,8 +55,10 @@ class BackendServiceConnection : ServiceConnection { when (component) { ComponentName(context, QuasselService::class.java) -> if (binder is QuasselBinder) { - bound = true - backend.onNext(Optional.of(binder.backend)) + synchronized(this@BackendServiceConnection) { + state = State.BOUND + backend.onNext(Optional.of(binder.backend)) + } } } } @@ -62,7 +69,10 @@ class BackendServiceConnection : ServiceConnection { @Synchronized fun bind(intent: Intent = QuasselService.intent(context!!), flags: Int = 0) { - context?.bindService(intent, this, flags) + if (state == State.UNBOUND || state == State.UNBINDING) { + state = State.BINDING + context?.bindService(intent, this, flags) + } } fun stop(intent: Intent = QuasselService.intent(context!!)) { @@ -71,6 +81,9 @@ class BackendServiceConnection : ServiceConnection { @Synchronized fun unbind() { - if (bound) context?.unbindService(this) + if (state == State.BOUND || state == State.BINDING) { + state = State.UNBINDING + context?.unbindService(this) + } } } diff --git a/malheur/src/main/java/de/kuschku/malheur/CrashHandler.kt b/malheur/src/main/java/de/kuschku/malheur/CrashHandler.kt index 9b81bf549..32afbe1fd 100644 --- a/malheur/src/main/java/de/kuschku/malheur/CrashHandler.kt +++ b/malheur/src/main/java/de/kuschku/malheur/CrashHandler.kt @@ -20,6 +20,7 @@ package de.kuschku.malheur import android.app.Application +import android.os.Build import android.os.Handler import android.os.HandlerThread import android.util.Log @@ -85,11 +86,16 @@ object CrashHandler { } } catch (e: Throwable) { e.printStackTrace() - originalHandler?.uncaughtException(activeThread, throwable) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + throwable.addSuppressed(e) + } } }.start() } - Thread.setDefaultUncaughtExceptionHandler(myHandler) + Thread.setDefaultUncaughtExceptionHandler { currentThread, throwable -> + myHandler?.uncaughtException(currentThread, throwable) + originalHandler?.uncaughtException(currentThread, throwable) + } } fun handle(throwable: Throwable) { -- GitLab