diff --git a/algorigoble2/build.gradle b/algorigoble2/build.gradle
index 9741e5d6..fca0f428 100644
--- a/algorigoble2/build.gradle
+++ b/algorigoble2/build.gradle
@@ -112,6 +112,7 @@ android {
dependencies {
implementation 'androidx.core:core-ktx:1.7.0'
+ implementation 'androidx.startup:startup-runtime:1.1.1'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.4'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0'
diff --git a/algorigoble2/src/main/AndroidManifest.xml b/algorigoble2/src/main/AndroidManifest.xml
index b50b57f2..508c7571 100644
--- a/algorigoble2/src/main/AndroidManifest.xml
+++ b/algorigoble2/src/main/AndroidManifest.xml
@@ -3,6 +3,20 @@
xmlns:tools="http://schemas.android.com/tools"
package="com.algorigo.algorigoble2">
+
+
+
+
+
+
+
{
+
+ override fun create(context: Context): AlgorigoBleLibrary {
+ applicationContext = context.applicationContext
+ logging = Logging(DefaultLogger())
+ return AlgorigoBleLibrary
+ }
+
+ override fun dependencies(): MutableList>> = mutableListOf()
+}
diff --git a/algorigoble2/src/main/java/com/algorigo/algorigoble2/BleDevice.kt b/algorigoble2/src/main/java/com/algorigo/algorigoble2/BleDevice.kt
index e70fa2eb..9655247b 100644
--- a/algorigoble2/src/main/java/com/algorigo/algorigoble2/BleDevice.kt
+++ b/algorigoble2/src/main/java/com/algorigo/algorigoble2/BleDevice.kt
@@ -1,7 +1,6 @@
package com.algorigo.algorigoble2
import android.bluetooth.BluetoothGattDescriptor
-import com.algorigo.algorigoble2.logging.Logging
import java.util.*
open class BleDevice {
@@ -21,12 +20,10 @@ open class BleDevice {
}
internal lateinit var engine: BleDeviceEngine
- internal lateinit var logging: Logging
- internal fun initEngine(engine: BleDeviceEngine, logging: Logging) {
+ internal fun initEngine(engine: BleDeviceEngine) {
engine.bleDevice = this
this.engine = engine
- this.logging = logging
}
val deviceId: String
diff --git a/algorigoble2/src/main/java/com/algorigo/algorigoble2/BleDeviceEngine.kt b/algorigoble2/src/main/java/com/algorigo/algorigoble2/BleDeviceEngine.kt
index e81c3900..1dcd54de 100644
--- a/algorigoble2/src/main/java/com/algorigo/algorigoble2/BleDeviceEngine.kt
+++ b/algorigoble2/src/main/java/com/algorigo/algorigoble2/BleDeviceEngine.kt
@@ -1,13 +1,11 @@
package com.algorigo.algorigoble2
-import android.bluetooth.BluetoothGattCharacteristic
-import com.algorigo.algorigoble2.logging.Logging
import io.reactivex.rxjava3.core.Completable
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Single
import java.util.UUID
-internal abstract class BleDeviceEngine(protected val logging: Logging) {
+abstract class BleDeviceEngine {
lateinit var bleDevice: BleDevice
diff --git a/algorigoble2/src/main/java/com/algorigo/algorigoble2/BleManager.kt b/algorigoble2/src/main/java/com/algorigo/algorigoble2/BleManager.kt
index c43763a4..f96ab363 100644
--- a/algorigoble2/src/main/java/com/algorigo/algorigoble2/BleManager.kt
+++ b/algorigoble2/src/main/java/com/algorigo/algorigoble2/BleManager.kt
@@ -1,19 +1,13 @@
package com.algorigo.algorigoble2
import android.bluetooth.BluetoothDevice
-import android.content.Context
import com.algorigo.algorigoble2.impl.BleManagerEngineImpl
-import com.algorigo.algorigoble2.logging.DefaultLogger
-import com.algorigo.algorigoble2.logging.Logger
-import com.algorigo.algorigoble2.logging.Logging
import com.algorigo.algorigoble2.virtual.VirtualDevice
import io.reactivex.rxjava3.core.Observable
class BleManager(
- context: Context,
private val delegate: BleDeviceDelegate = defaultBleDeviceDelegate,
engine: Engine = Engine.ALGORIGO_BLE,
- logger: Logger? = null,
virtualDevices: Array> = arrayOf()
) {
@@ -49,14 +43,9 @@ class BleManager(
private val virtualDevices: Map
init {
- val logging = if (logger != null) {
- Logging(logger)
- } else {
- Logging(DefaultLogger())
- }
when (engine) {
// Engine.RX_ANDROID_BLE -> this.engine = RxAndroidBleEngine(context.applicationContext, delegate)
- Engine.ALGORIGO_BLE -> this.engine = BleManagerEngineImpl(context.applicationContext, delegate, logging)
+ Engine.ALGORIGO_BLE -> this.engine = BleManagerEngineImpl(delegate)
}
this.virtualDevices = virtualDevices.associate {
Pair(
diff --git a/algorigoble2/src/main/java/com/algorigo/algorigoble2/BleManagerEngine.kt b/algorigoble2/src/main/java/com/algorigo/algorigoble2/BleManagerEngine.kt
index 8ae27987..84f064b6 100644
--- a/algorigoble2/src/main/java/com/algorigo/algorigoble2/BleManagerEngine.kt
+++ b/algorigoble2/src/main/java/com/algorigo/algorigoble2/BleManagerEngine.kt
@@ -5,7 +5,9 @@ import com.algorigo.algorigoble2.virtual.VirtualDevice
import com.jakewharton.rxrelay3.PublishRelay
import io.reactivex.rxjava3.core.Observable
-internal abstract class BleManagerEngine(protected val bleDeviceDelegate: BleManager.BleDeviceDelegate, protected val logging: Logging) {
+internal abstract class BleManagerEngine(
+ protected val bleDeviceDelegate: BleManager.BleDeviceDelegate
+) {
protected val connectionStateRelay = PublishRelay.create>()
diff --git a/algorigoble2/src/main/java/com/algorigo/algorigoble2/impl/BleDeviceEngineImpl.kt b/algorigoble2/src/main/java/com/algorigo/algorigoble2/impl/BleDeviceEngineImpl.kt
index 7ed7b55a..0dd979a2 100644
--- a/algorigoble2/src/main/java/com/algorigo/algorigoble2/impl/BleDeviceEngineImpl.kt
+++ b/algorigoble2/src/main/java/com/algorigo/algorigoble2/impl/BleDeviceEngineImpl.kt
@@ -8,14 +8,14 @@ import android.bluetooth.BluetoothGattCharacteristic
import android.bluetooth.BluetoothGattDescriptor
import android.bluetooth.BluetoothGattService
import android.bluetooth.BluetoothProfile
-import android.content.Context
import android.util.Log
import com.algorigo.algorigoble2.BleCharacterisic
import com.algorigo.algorigoble2.BleDevice
import com.algorigo.algorigoble2.BleDeviceEngine
import com.algorigo.algorigoble2.BleManager
import com.algorigo.algorigoble2.BleSppSocket
-import com.algorigo.algorigoble2.logging.Logging
+import com.algorigo.algorigoble2.applicationContext
+import com.algorigo.algorigoble2.logging
import com.jakewharton.rxrelay3.BehaviorRelay
import com.jakewharton.rxrelay3.PublishRelay
import enumerated
@@ -29,8 +29,9 @@ import java.util.concurrent.TimeUnit
import java.util.concurrent.TimeoutException
@SuppressLint("MissingPermission")
-internal class BleDeviceEngineImpl(private val context: Context, private val bluetoothDevice: BluetoothDevice, logging: Logging):
- BleDeviceEngine(logging) {
+internal class BleDeviceEngineImpl(
+ private val bluetoothDevice: BluetoothDevice
+) : BleDeviceEngine() {
class CommunicationFailedException: Exception()
class IllegalCharacteristicProperty(val property: Int, val type: String): Exception()
@@ -268,7 +269,7 @@ internal class BleDeviceEngineImpl(private val context: Context, private val blu
if (it.second is State.DISCONNECTED) {
if (it.first == 0) {
logging.d { "${gatt?.device?.name}(${gatt?.device?.address}) : connectGatt call" }
- gatt = bluetoothDevice.connectGatt(context, false, gattCallback)
+ gatt = bluetoothDevice.connectGatt(applicationContext, false, gattCallback)
stateRelay.accept(State.CONNECTING())
} else {
throw BleManager.DisconnectedException()
diff --git a/algorigoble2/src/main/java/com/algorigo/algorigoble2/impl/BleManagerEngineImpl.kt b/algorigoble2/src/main/java/com/algorigo/algorigoble2/impl/BleManagerEngineImpl.kt
index fa614a5c..18ad6698 100644
--- a/algorigoble2/src/main/java/com/algorigo/algorigoble2/impl/BleManagerEngineImpl.kt
+++ b/algorigoble2/src/main/java/com/algorigo/algorigoble2/impl/BleManagerEngineImpl.kt
@@ -15,7 +15,6 @@ import androidx.core.location.LocationManagerCompat
import com.algorigo.algorigoble2.*
import com.algorigo.algorigoble2.exception.SystemServiceException
import com.algorigo.algorigoble2.extension.locationManager
-import com.algorigo.algorigoble2.logging.Logging
import com.algorigo.algorigoble2.rx_util.RxBroadcastReceiver
import com.algorigo.algorigoble2.rx_util.collectListLastSortedIndex
import com.algorigo.algorigoble2.virtual.VirtualDevice
@@ -24,14 +23,16 @@ import io.reactivex.rxjava3.core.Observable
import java.util.*
@SuppressLint("MissingPermission")
-internal class BleManagerEngineImpl(private val context: Context, bleDeviceDelegate: BleManager.BleDeviceDelegate, logging: Logging) : BleManagerEngine(bleDeviceDelegate, logging) {
+internal class BleManagerEngineImpl(
+ bleDeviceDelegate: BleManager.BleDeviceDelegate
+) : BleManagerEngine(bleDeviceDelegate) {
- private val bluetoothManager: BluetoothManager = context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
+ private val bluetoothManager: BluetoothManager = applicationContext.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
private val bluetoothAdapter: BluetoothAdapter = bluetoothManager.adapter
private val deviceMap: MutableMap = mutableMapOf()
- private val scanAvailableObservable = scanAvailableObservable(context)
+ private val scanAvailableObservable = scanAvailableObservable()
.doOnNext { (isLocationEnabled, isBluetoothEnabled) ->
if (!isLocationEnabled && isBluetoothEnabled) {
throw SystemServiceException.LocationUnavailableException("System location is unavailable")
@@ -63,14 +64,14 @@ internal class BleManagerEngineImpl(private val context: Context, bleDeviceDeleg
}
init {
- context.registerReceiver(
+ applicationContext.registerReceiver(
bluetoothReceiver,
IntentFilter().apply { addAction(BluetoothAdapter.ACTION_STATE_CHANGED) }
)
}
protected fun finalize() {
- context.unregisterReceiver(bluetoothReceiver)
+ applicationContext.unregisterReceiver(bluetoothReceiver)
}
override fun scanObservable(
@@ -149,7 +150,7 @@ internal class BleManagerEngineImpl(private val context: Context, bleDeviceDeleg
}
?.also { device ->
deviceMap[bluetoothDevice] = device
- device.initEngine(BleDeviceEngineImpl(context, bluetoothDevice, logging), logging)
+ device.initEngine(BleDeviceEngineImpl(bluetoothDevice))
device.getConnectionStateObservable()
.subscribe({
connectionStateRelay.accept(Pair(device, it))
@@ -157,32 +158,32 @@ internal class BleManagerEngineImpl(private val context: Context, bleDeviceDeleg
}
}
- private fun locationEnabledObservable(context: Context): Observable = when {
+ private fun locationEnabledObservable(): Observable = when {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> Observable.just(true)
else -> Observable
.fromCallable {
- LocationManagerCompat.isLocationEnabled(context.locationManager)
+ LocationManagerCompat.isLocationEnabled(applicationContext.locationManager)
}
.concatWith(
RxBroadcastReceiver
- .broadCastReceiverObservable(context, IntentFilter(LocationManager.PROVIDERS_CHANGED_ACTION))
+ .broadCastReceiverObservable(applicationContext, IntentFilter(LocationManager.PROVIDERS_CHANGED_ACTION))
.map { intent ->
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
intent.getBooleanExtra(LocationManager.EXTRA_PROVIDER_ENABLED, false)
} else {
- LocationManagerCompat.isLocationEnabled(context.locationManager)
+ LocationManagerCompat.isLocationEnabled(applicationContext.locationManager)
}
}
)
}
- private fun bluetoothEnabledObservable(context: Context): Observable {
+ private fun bluetoothEnabledObservable(): Observable {
return Observable
.fromCallable {
bluetoothAdapter.isEnabled
}
.concatWith(RxBroadcastReceiver
- .broadCastReceiverObservable(context, IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED))
+ .broadCastReceiverObservable(applicationContext, IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED))
.map { intent -> intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1) }
.map { state ->
when (state) {
@@ -195,11 +196,11 @@ internal class BleManagerEngineImpl(private val context: Context, bleDeviceDeleg
})
}
- private fun scanAvailableObservable(context: Context): Observable> {
+ private fun scanAvailableObservable(): Observable> {
return Observable
.combineLatest(
- locationEnabledObservable(context),
- bluetoothEnabledObservable(context)
+ locationEnabledObservable(),
+ bluetoothEnabledObservable()
) { isLocationEnabled, isBluetoothEnabled ->
isLocationEnabled to isBluetoothEnabled
}
@@ -207,7 +208,7 @@ internal class BleManagerEngineImpl(private val context: Context, bleDeviceDeleg
override fun initVirtualDevice(virtualDevice: VirtualDevice, bleDevice: BleDevice): BleDevice {
return bleDevice.also { device ->
- device.initEngine(VirtualDeviceEngine(virtualDevice, logging), logging)
+ device.initEngine(VirtualDeviceEngine(virtualDevice))
device.getConnectionStateObservable()
.subscribe({
connectionStateRelay.accept(Pair(device, it))
diff --git a/algorigoble2/src/main/java/com/algorigo/algorigoble2/virtual/VirtualDeviceEngine.kt b/algorigoble2/src/main/java/com/algorigo/algorigoble2/virtual/VirtualDeviceEngine.kt
index e2d7bd5e..e3f58cb2 100644
--- a/algorigoble2/src/main/java/com/algorigo/algorigoble2/virtual/VirtualDeviceEngine.kt
+++ b/algorigoble2/src/main/java/com/algorigo/algorigoble2/virtual/VirtualDeviceEngine.kt
@@ -12,7 +12,9 @@ import io.reactivex.rxjava3.core.Single
import java.util.*
import java.util.concurrent.TimeUnit
-internal class VirtualDeviceEngine(private val virtualDevice: VirtualDevice, logging: Logging) : BleDeviceEngine(logging) {
+internal class VirtualDeviceEngine(
+ private val virtualDevice: VirtualDevice
+) : BleDeviceEngine() {
override val deviceId: String
get() = virtualDevice.deviceId
override val deviceName: String?
diff --git a/app/src/main/java/com/algorigo/algorigoblelibrary/BluetoothService.kt b/app/src/main/java/com/algorigo/algorigoblelibrary/BluetoothService.kt
index 11dd5fd5..4d983309 100644
--- a/app/src/main/java/com/algorigo/algorigoblelibrary/BluetoothService.kt
+++ b/app/src/main/java/com/algorigo/algorigoblelibrary/BluetoothService.kt
@@ -20,7 +20,6 @@ class BluetoothService : Service() {
override fun onCreate() {
super.onCreate()
bleManager = BleManager(
- applicationContext,
virtualDevices = arrayOf(
VirtualBleDevice() to BleDevice(),
)