From 4c841b9f5ecb0fdaa5e3b7596d153f1354222cee Mon Sep 17 00:00:00 2001 From: seunghwan Date: Tue, 23 May 2023 15:07:55 +0900 Subject: [PATCH 1/4] =?UTF-8?q?Jetpack=20App=20Startup=20=EB=94=94?= =?UTF-8?q?=ED=8E=9C=EB=8D=98=EC=8B=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- algorigoble2/build.gradle | 1 + 1 file changed, 1 insertion(+) 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' From a1560cedd56fe910ab488c71928bba7366ee181a Mon Sep 17 00:00:00 2001 From: seunghwan Date: Tue, 23 May 2023 15:11:02 +0900 Subject: [PATCH 2/4] =?UTF-8?q?AlgorigoBleInitializer=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../algorigoble2/AlgorigoBleInitializer.kt | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 algorigoble2/src/main/java/com/algorigo/algorigoble2/AlgorigoBleInitializer.kt diff --git a/algorigoble2/src/main/java/com/algorigo/algorigoble2/AlgorigoBleInitializer.kt b/algorigoble2/src/main/java/com/algorigo/algorigoble2/AlgorigoBleInitializer.kt new file mode 100644 index 00000000..33f47373 --- /dev/null +++ b/algorigoble2/src/main/java/com/algorigo/algorigoble2/AlgorigoBleInitializer.kt @@ -0,0 +1,24 @@ +package com.algorigo.algorigoble2 + +import android.content.Context +import androidx.startup.Initializer +import com.algorigo.algorigoble2.logging.DefaultLogger +import com.algorigo.algorigoble2.logging.Logging + +object AlgorigoBleLibrary + +internal lateinit var applicationContext: Context + private set + +internal lateinit var logging: Logging + +class AlgorigoBleInitializer: Initializer { + + override fun create(context: Context): AlgorigoBleLibrary { + applicationContext = context.applicationContext + logging = Logging(DefaultLogger()) + return AlgorigoBleLibrary + } + + override fun dependencies(): MutableList>> = mutableListOf() +} From 3d692e89344c2d92ced4e99e5f184ed5a31e9f38 Mon Sep 17 00:00:00 2001 From: seunghwan Date: Tue, 23 May 2023 15:14:20 +0900 Subject: [PATCH 3/4] =?UTF-8?q?Manifest=EC=97=90=20Initializer=20ContentPr?= =?UTF-8?q?ovider=20=EB=93=B1=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- algorigoble2/src/main/AndroidManifest.xml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) 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"> + + + + + + + Date: Tue, 23 May 2023 15:18:07 +0900 Subject: [PATCH 4/4] =?UTF-8?q?context=20=EB=B0=8F=20logging=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=98=EB=8D=98=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/algorigo/algorigoble2/BleDevice.kt | 5 +-- .../algorigo/algorigoble2/BleDeviceEngine.kt | 4 +-- .../com/algorigo/algorigoble2/BleManager.kt | 13 +------ .../algorigo/algorigoble2/BleManagerEngine.kt | 4 ++- .../algorigoble2/impl/BleDeviceEngineImpl.kt | 11 +++--- .../algorigoble2/impl/BleManagerEngineImpl.kt | 35 ++++++++++--------- .../virtual/VirtualDeviceEngine.kt | 4 ++- .../algorigoblelibrary/BluetoothService.kt | 1 - 8 files changed, 33 insertions(+), 44 deletions(-) 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(), )