package com.looker.droidify.service import android.content.ComponentName import android.content.Context import android.content.Intent import android.content.ServiceConnection import android.os.IBinder class Connection>( private val serviceClass: Class, private val onBind: ((Connection, B) -> Unit)? = null, private val onUnbind: ((Connection, B) -> Unit)? = null ) : ServiceConnection { var binder: B? = null private set private fun handleUnbind() { binder?.let { binder = null onUnbind?.invoke(this, it) } } override fun onServiceConnected(componentName: ComponentName, binder: IBinder) { @Suppress("UNCHECKED_CAST") binder as B this.binder = binder onBind?.invoke(this, binder) } override fun onServiceDisconnected(componentName: ComponentName) { handleUnbind() } fun bind(context: Context) { context.bindService(Intent(context, serviceClass), this, Context.BIND_AUTO_CREATE) } fun unbind(context: Context) { context.unbindService(this) handleUnbind() } }