Skip to content

Commit

Permalink
Merge pull request #147 from simondankelmann/simondankelmann/foregrou…
Browse files Browse the repository at this point in the history
…ndservice

Simondankelmann/foregroundservice
  • Loading branch information
simondankelmann authored Dec 3, 2023
2 parents 981cffe + f3f152f commit d685a7c
Show file tree
Hide file tree
Showing 32 changed files with 741 additions and 464 deletions.
2 changes: 1 addition & 1 deletion app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ android {
minSdk = 26
targetSdk = 34
versionCode = 1
versionName = "1.0.5"
versionName = "1.0.6"

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
Expand Down
Binary file modified app/debug/app-debug.apk
Binary file not shown.
2 changes: 1 addition & 1 deletion app/debug/output-metadata.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
"filters": [],
"attributes": [],
"versionCode": 1,
"versionName": "1.0.5",
"versionName": "1.0.6",
"outputFile": "app-debug.apk"
}
],
Expand Down
Binary file modified app/release/app-release.apk
Binary file not shown.
2 changes: 1 addition & 1 deletion app/release/output-metadata.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
"filters": [],
"attributes": [],
"versionCode": 1,
"versionName": "1.0.5",
"versionName": "1.0.6",
"outputFile": "app-release.apk"
}
],
Expand Down
8 changes: 7 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -36,16 +36,22 @@
android:name="android.hardware.bluetooth_le"
android:required="true" />

<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>

<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:roundIcon="@mipmap/ic_launcher"
android:supportsRtl="true"
android:theme="@style/Theme.BluetoothLESpam.NoActionBar"
tools:targetApi="31">
<service android:name=".Services.AdvertisementForegroundService"></service>
<receiver android:name=".Services.AdvertisementForegroundService$ToggleButtonListener" />
<receiver android:name=".Services.AdvertisementForegroundService$StopButtonListener" />
<activity
android:name=".MainActivity"
android:exported="true"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import android.app.Activity
import android.bluetooth.BluetoothAdapter
import android.bluetooth.BluetoothManager
import android.content.Context
import android.util.Log
import de.simon.dankelmann.bluetoothlespam.Handlers.AdvertisementSetQueueHandler
import de.simon.dankelmann.bluetoothlespam.Interfaces.Services.IAdvertisementService

Expand All @@ -29,7 +30,6 @@ abstract class AppContext {
return false
}


fun setContext(context: Context) {
_context = context
}
Expand All @@ -54,6 +54,10 @@ abstract class AppContext {
return _advertisementService
}

fun advertisementServiceIsInitialized(): Boolean {
return this::_advertisementService.isInitialized
}

fun setAdvertisementSetQueueHandler(advertisementSetQueueHandler: AdvertisementSetQueueHandler) {
_advertisementSetQueueHandler = advertisementSetQueueHandler
}
Expand All @@ -62,6 +66,10 @@ abstract class AppContext {
return _advertisementSetQueueHandler
}

fun advertisementSetQueueHandlerIsInitialized(): Boolean {
return this::_advertisementSetQueueHandler.isInitialized
}

fun registerPermissionCallback(requestCode: Int, callback:Runnable){

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,27 +9,32 @@ import de.simon.dankelmann.bluetoothlespam.Enums.AdvertisementQueueMode
import de.simon.dankelmann.bluetoothlespam.Enums.TxPowerLevel
import de.simon.dankelmann.bluetoothlespam.Helpers.QueueHandlerHelpers
import de.simon.dankelmann.bluetoothlespam.Interfaces.Callbacks.IAdvertisementServiceCallback
import de.simon.dankelmann.bluetoothlespam.Interfaces.Callbacks.IAdvertisementSetQueueHandlerCallback
import de.simon.dankelmann.bluetoothlespam.Interfaces.Services.IAdvertisementService
import de.simon.dankelmann.bluetoothlespam.Models.AdvertisementSet
import de.simon.dankelmann.bluetoothlespam.Models.AdvertisementSetCollection
import de.simon.dankelmann.bluetoothlespam.Models.AdvertisementSetList
import de.simon.dankelmann.bluetoothlespam.Services.AdvertisementForegroundService
import kotlin.random.Random

class AdvertisementSetQueueHandler :IAdvertisementServiceCallback {
class AdvertisementSetQueueHandler :IAdvertisementServiceCallback{

// private
private var _logTag = "AdvertisementSetQueuHandler"
private var _advertisementService:IAdvertisementService? = null
private var _advertisementSetCollection:AdvertisementSetCollection = AdvertisementSetCollection()
private var _interval:Long = 1000
private var _advertisementServiceCallbacks:MutableList<IAdvertisementServiceCallback> = mutableListOf()
private var _advertisementQueueHandlerCallbacks:MutableList<IAdvertisementSetQueueHandlerCallback> = mutableListOf()

private var _active = false
private var _advertisementQueueMode: AdvertisementQueueMode = AdvertisementQueueMode.ADVERTISEMENT_QUEUE_MODE_LINEAR

private var _currentAdvertisementSet: AdvertisementSet? = null
private var _currentAdvertisementSetListIndex = 0
private var _currentAdvertisementSetIndex = 0


init{
_advertisementService = AppContext.getAdvertisementService()
if(_advertisementService != null){
Expand Down Expand Up @@ -69,7 +74,9 @@ class AdvertisementSetQueueHandler :IAdvertisementServiceCallback {
}

fun setAdvertisementSetCollection(advertisementSetCollection: AdvertisementSetCollection){
_advertisementSetCollection = advertisementSetCollection
if(_advertisementSetCollection != advertisementSetCollection){
_advertisementSetCollection = advertisementSetCollection
}

// Reset indices
_currentAdvertisementSet= null
Expand Down Expand Up @@ -109,6 +116,17 @@ class AdvertisementSetQueueHandler :IAdvertisementServiceCallback {
}
}

fun addAdvertisementQueueHandlerCallback(callback: IAdvertisementSetQueueHandlerCallback){
if(!_advertisementQueueHandlerCallbacks.contains(callback)){
_advertisementQueueHandlerCallbacks.add(callback)
}
}
fun removeAdvertisementQueueHandlerCallback(callback: IAdvertisementSetQueueHandlerCallback){
if(_advertisementQueueHandlerCallbacks.contains(callback)){
_advertisementQueueHandlerCallbacks.remove(callback)
}
}

fun setIntervalSeconds(seconds:Int){
_interval = (seconds * 1000).toLong()
}
Expand All @@ -119,19 +137,48 @@ class AdvertisementSetQueueHandler :IAdvertisementServiceCallback {
}
}

fun activate(){
_active = true
if(_currentAdvertisementSet != null){
handleAdvertisementSet(_currentAdvertisementSet!!)
} else {
advertiseNextAdvertisementSet()
fun activate(startService: Boolean = true){
if(!_active){
_active = true

if(startService){
AdvertisementForegroundService.startService(AppContext.getContext(), "Foreground Service is running...")
}

_advertisementQueueHandlerCallbacks.forEach { it ->
try {
it.onQueueHandlerActivated()
} catch (e:Exception){
Log.e(_logTag, "Error while executing AdvertisementQueueHandlerCallback onQueueHandlerActivated")
}
}

if(_currentAdvertisementSet != null){
handleAdvertisementSet(_currentAdvertisementSet!!)
} else {
advertiseNextAdvertisementSet()
}
}
}

fun deactivate(){
fun deactivate(stopService: Boolean = false){
_active = false
if(_advertisementService != null){
_advertisementService!!.stopAdvertisement()

if(AppContext.getAdvertisementService() != null){
AppContext.getAdvertisementService().stopAdvertisement()
}

if(stopService){
Log.d(_logTag, "Stopping Foreground Service")
AdvertisementForegroundService.stopService(AppContext.getActivity())
}

_advertisementQueueHandlerCallbacks.forEach { it ->
try {
it.onQueueHandlerDeactivated()
} catch (e:Exception){
Log.e(_logTag, "Error while executing AdvertisementQueueHandlerCallback onQueueHandlerDeactivated")
}
}
}

Expand Down Expand Up @@ -287,13 +334,21 @@ class AdvertisementSetQueueHandler :IAdvertisementServiceCallback {
// Callback Implementation, just pass to own Listeners
override fun onAdvertisementSetStart(advertisementSet: AdvertisementSet?) {
_advertisementServiceCallbacks.map {
it.onAdvertisementSetStart(advertisementSet)
try {
it.onAdvertisementSetStart(advertisementSet)
} catch (e:Exception){
Log.e(_logTag, "Error in: onAdvertisementSetStart ${e.message}")
}
}
}

override fun onAdvertisementSetStop(advertisementSet: AdvertisementSet?) {
_advertisementServiceCallbacks.map {
it.onAdvertisementSetStop(advertisementSet)
try {
it.onAdvertisementSetStop(advertisementSet)
} catch (e:Exception){
Log.e(_logTag, "Error in: onAdvertisementSetStop ${e.message}")
}
}

if(_advertisementService != null && !_advertisementService!!.isLegacyService()){
Expand All @@ -304,14 +359,22 @@ class AdvertisementSetQueueHandler :IAdvertisementServiceCallback {
override fun onAdvertisementSetSucceeded(advertisementSet: AdvertisementSet?) {
runLocalCallback(true)
_advertisementServiceCallbacks.map {
it.onAdvertisementSetSucceeded(advertisementSet)
try {
it.onAdvertisementSetSucceeded(advertisementSet)
} catch (e:Exception){
Log.e(_logTag, "Error in: onAdvertisementSetSucceeded ${e.message}")
}
}
}

override fun onAdvertisementSetFailed(advertisementSet: AdvertisementSet?, advertisementError: AdvertisementError) {
runLocalCallback(false)
_advertisementServiceCallbacks.map {
it.onAdvertisementSetFailed(advertisementSet, advertisementError)
try {
it.onAdvertisementSetFailed(advertisementSet, advertisementError)
} catch (e:Exception){
Log.e(_logTag, "Error in: onAdvertisementSetFailed ${e.message}")
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package de.simon.dankelmann.bluetoothlespam.Interfaces.Callbacks

import de.simon.dankelmann.bluetoothlespam.Models.AdvertisementSet

interface IAdvertisementSetQueueHandlerCallback {
fun onQueueHandlerActivated()
fun onQueueHandlerDeactivated()
}
Loading

0 comments on commit d685a7c

Please sign in to comment.