diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index 0c0c338..479affc 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -3,7 +3,20 @@ - + + + + + + + + + + + + + + diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 335bb28..43dfd56 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -16,7 +16,7 @@ android { minSdk = 26 targetSdk = 34 versionCode = 1 - versionName = "1.0.7" + versionName = "1.0.8" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/debug/app-debug.apk b/app/debug/app-debug.apk index e0adcae..d14a55f 100644 Binary files a/app/debug/app-debug.apk and b/app/debug/app-debug.apk differ diff --git a/app/debug/output-metadata.json b/app/debug/output-metadata.json index 96cb7d4..047b129 100644 --- a/app/debug/output-metadata.json +++ b/app/debug/output-metadata.json @@ -12,7 +12,7 @@ "filters": [], "attributes": [], "versionCode": 1, - "versionName": "1.0.7", + "versionName": "1.0.8", "outputFile": "app-debug.apk" } ], diff --git a/app/release/app-release.apk b/app/release/app-release.apk index 5b504b1..16c6d0c 100644 Binary files a/app/release/app-release.apk and b/app/release/app-release.apk differ diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json index 2892891..cb24940 100644 --- a/app/release/output-metadata.json +++ b/app/release/output-metadata.json @@ -12,7 +12,7 @@ "filters": [], "attributes": [], "versionCode": 1, - "versionName": "1.0.7", + "versionName": "1.0.8", "outputFile": "app-release.apk" } ], diff --git a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/ContinuityActionModalAdvertisementSetGenerator.kt b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/ContinuityActionModalAdvertisementSetGenerator.kt index 22c2ed8..fee9786 100644 --- a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/ContinuityActionModalAdvertisementSetGenerator.kt +++ b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/ContinuityActionModalAdvertisementSetGenerator.kt @@ -84,10 +84,12 @@ class ContinuityActionModalAdvertisementSetGenerator: IAdvertisementSetGenerator } private val _manufacturerId = 76 // 0x004c == 76 = Apple - override fun getAdvertisementSets(): List { + override fun getAdvertisementSets(inputData: Map?): List { var advertisementSets: MutableList = mutableListOf() - _nearbyActions.map { nearbyAction -> + val data = inputData ?: _nearbyActions + + data.map { nearbyAction -> var advertisementSet: AdvertisementSet = AdvertisementSet() advertisementSet.target = AdvertisementTarget.ADVERTISEMENT_TARGET_IOS advertisementSet.type = AdvertisementSetType.ADVERTISEMENT_TYPE_CONTINUITY_ACTION_MODALS diff --git a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/ContinuityIos17CrashAdvertisementSetGenerator.kt b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/ContinuityIos17CrashAdvertisementSetGenerator.kt index 5a1d646..21479e6 100644 --- a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/ContinuityIos17CrashAdvertisementSetGenerator.kt +++ b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/ContinuityIos17CrashAdvertisementSetGenerator.kt @@ -88,10 +88,12 @@ class ContinuityIos17CrashAdvertisementSetGenerator: IAdvertisementSetGenerator return advertisementSet } } - override fun getAdvertisementSets(): List { + override fun getAdvertisementSets(inputData: Map?): List { var advertisementSets: MutableList = mutableListOf() - _nearbyActions.map { nearbyAction -> + val data = inputData ?: _nearbyActions + + data.map { nearbyAction -> var advertisementSet: AdvertisementSet = AdvertisementSet() advertisementSet.target = AdvertisementTarget.ADVERTISEMENT_TARGET_IOS advertisementSet.type = AdvertisementSetType.ADVERTISEMENT_TYPE_CONTINUITY_IOS_17_CRASH diff --git a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/ContinuityNewAirtagPopUpAdvertisementSetGenerator.kt b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/ContinuityNewAirtagPopUpAdvertisementSetGenerator.kt index eb42618..db829a4 100644 --- a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/ContinuityNewAirtagPopUpAdvertisementSetGenerator.kt +++ b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/ContinuityNewAirtagPopUpAdvertisementSetGenerator.kt @@ -100,10 +100,12 @@ class ContinuityNewAirtagPopUpAdvertisementSetGenerator: IAdvertisementSetGenera } } - override fun getAdvertisementSets(): List { + override fun getAdvertisementSets(inputData: Map?): List { var advertisementSets:MutableList = mutableListOf() - deviceData.forEach{deviceData -> + val data = inputData ?: deviceData + + data.forEach{deviceData -> val colorMap = getColorMap(deviceData.key) val prefix = "05" // => NEW AIRTAG diff --git a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/ContinuityNewDevicePopUpAdvertisementSetGenerator.kt b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/ContinuityNewDevicePopUpAdvertisementSetGenerator.kt index 4065677..2129ec4 100644 --- a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/ContinuityNewDevicePopUpAdvertisementSetGenerator.kt +++ b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/ContinuityNewDevicePopUpAdvertisementSetGenerator.kt @@ -96,10 +96,12 @@ class ContinuityNewDevicePopUpAdvertisementSetGenerator: IAdvertisementSetGenera } } - override fun getAdvertisementSets(): List { + override fun getAdvertisementSets(inputData: Map?): List { var advertisementSets:MutableList = mutableListOf() - deviceData.forEach{deviceData -> + val data = inputData ?: deviceData + + data.forEach{deviceData -> val prefix = "07" // => NEW DEVICE val color = "00" diff --git a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/ContinuityNotYourDevicePopUpAdvertisementSetGenerator.kt b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/ContinuityNotYourDevicePopUpAdvertisementSetGenerator.kt index a268da2..cd9526a 100644 --- a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/ContinuityNotYourDevicePopUpAdvertisementSetGenerator.kt +++ b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/ContinuityNotYourDevicePopUpAdvertisementSetGenerator.kt @@ -263,10 +263,12 @@ class ContinuityNotYourDevicePopUpAdvertisementSetGenerator: IAdvertisementSetGe } } - override fun getAdvertisementSets(): List { + override fun getAdvertisementSets(inputData: Map?): List { var advertisementSets:MutableList = mutableListOf() - deviceData.forEach{deviceData -> + val data = inputData ?: deviceData + + data.forEach{deviceData -> val colorMap = getColorMap(deviceData.key) val prefix = "01" // => NOT YOUR DEVICE diff --git a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/EasySetupBudsAdvertisementSetGenerator.kt b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/EasySetupBudsAdvertisementSetGenerator.kt index ca09d6a..1d0ef53 100644 --- a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/EasySetupBudsAdvertisementSetGenerator.kt +++ b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/EasySetupBudsAdvertisementSetGenerator.kt @@ -56,11 +56,13 @@ class EasySetupBudsAdvertisementSetGenerator:IAdvertisementSetGenerator{ "011716" to "Sleek Black Buds2", ) - override fun getAdvertisementSets():List { + override fun getAdvertisementSets(inputData: Map?): List { var advertisementSets:MutableList = mutableListOf() + val data = inputData ?: _genuineBudsIds + // BUDS - _genuineBudsIds.map { + data.map { var advertisementSet:AdvertisementSet = AdvertisementSet() advertisementSet.target = AdvertisementTarget.ADVERTISEMENT_TARGET_SAMSUNG advertisementSet.type = AdvertisementSetType.ADVERTISEMENT_TYPE_EASY_SETUP_BUDS diff --git a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/EasySetupWatchAdvertisementSetGenerator.kt b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/EasySetupWatchAdvertisementSetGenerator.kt index 91b8468..2b4fc95 100644 --- a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/EasySetupWatchAdvertisementSetGenerator.kt +++ b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/EasySetupWatchAdvertisementSetGenerator.kt @@ -54,13 +54,13 @@ class EasySetupWatchAdvertisementSetGenerator:IAdvertisementSetGenerator{ "20" to "Green Watch6 Classic 43m", ) - override fun getAdvertisementSets():List { + override fun getAdvertisementSets(inputData: Map?): List { var advertisementSets:MutableList = mutableListOf() - + val data = inputData ?: _genuineWatchIds // WATCHES - _genuineWatchIds.map { + data.map { var advertisementSet:AdvertisementSet = AdvertisementSet() advertisementSet.target = AdvertisementTarget.ADVERTISEMENT_TARGET_SAMSUNG advertisementSet.type = AdvertisementSetType.ADVERTISEMENT_TYPE_EASY_SETUP_WATCH diff --git a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/FastPairDebugAdvertisementSetGenerator.kt b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/FastPairDebugAdvertisementSetGenerator.kt index 236b6c0..6677d2b 100644 --- a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/FastPairDebugAdvertisementSetGenerator.kt +++ b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/FastPairDebugAdvertisementSetGenerator.kt @@ -41,10 +41,12 @@ class FastPairDebugAdvertisementSetGenerator:IAdvertisementSetGenerator{ val serviceUuid = ParcelUuid(UUID.fromString("0000fe2c-0000-1000-8000-00805f9b34fb")) - override fun getAdvertisementSets():List { + override fun getAdvertisementSets(inputData: Map?): List { var advertisementSets:MutableList = mutableListOf() - _genuineDeviceIds.map { + val data = inputData ?: _genuineDeviceIds + + data.map { var advertisementSet:AdvertisementSet = AdvertisementSet() advertisementSet.target = AdvertisementTarget.ADVERTISEMENT_TARGET_ANDROID diff --git a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/FastPairDevicesAdvertisementSetGenerator.kt b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/FastPairDevicesAdvertisementSetGenerator.kt index fa14de3..8add350 100644 --- a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/FastPairDevicesAdvertisementSetGenerator.kt +++ b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/FastPairDevicesAdvertisementSetGenerator.kt @@ -511,10 +511,12 @@ class FastPairDevicesAdvertisementSetGenerator:IAdvertisementSetGenerator{ val serviceUuid = ParcelUuid(UUID.fromString("0000fe2c-0000-1000-8000-00805f9b34fb")) - override fun getAdvertisementSets():List { + override fun getAdvertisementSets(inputData: Map?): List { var advertisementSets:MutableList = mutableListOf() - _genuineDeviceIds.map { + val data = inputData ?: _genuineDeviceIds + + data.map { var advertisementSet:AdvertisementSet = AdvertisementSet() advertisementSet.target = AdvertisementTarget.ADVERTISEMENT_TARGET_ANDROID diff --git a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/FastPairNonProductionAdvertisementSetGenerator.kt b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/FastPairNonProductionAdvertisementSetGenerator.kt index cf27bf2..f787a4d 100644 --- a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/FastPairNonProductionAdvertisementSetGenerator.kt +++ b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/FastPairNonProductionAdvertisementSetGenerator.kt @@ -55,10 +55,12 @@ class FastPairNonProductionAdvertisementSetGenerator:IAdvertisementSetGenerator{ val serviceUuid = ParcelUuid(UUID.fromString("0000fe2c-0000-1000-8000-00805f9b34fb")) - override fun getAdvertisementSets():List { + override fun getAdvertisementSets(inputData: Map?): List { var advertisementSets:MutableList = mutableListOf() - _genuineDeviceIds.map { + val data = inputData ?: _genuineDeviceIds + + data.map { var advertisementSet:AdvertisementSet = AdvertisementSet() advertisementSet.target = AdvertisementTarget.ADVERTISEMENT_TARGET_ANDROID diff --git a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/FastPairPhoneSetupAdvertisementSetGenerator.kt b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/FastPairPhoneSetupAdvertisementSetGenerator.kt index 3da5fff..f447ff7 100644 --- a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/FastPairPhoneSetupAdvertisementSetGenerator.kt +++ b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/FastPairPhoneSetupAdvertisementSetGenerator.kt @@ -29,10 +29,12 @@ class FastPairPhoneSetupAdvertisementSetGenerator:IAdvertisementSetGenerator{ val serviceUuid = ParcelUuid(UUID.fromString("0000fe2c-0000-1000-8000-00805f9b34fb")) - override fun getAdvertisementSets():List { + override fun getAdvertisementSets(inputData: Map?): List { var advertisementSets:MutableList = mutableListOf() - _genuineDeviceIds.map { + val data = inputData ?: _genuineDeviceIds + + data.map { var advertisementSet:AdvertisementSet = AdvertisementSet() advertisementSet.target = AdvertisementTarget.ADVERTISEMENT_TARGET_ANDROID diff --git a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/IAdvertisementSetGenerator.kt b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/IAdvertisementSetGenerator.kt index 42fc15d..6282046 100644 --- a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/IAdvertisementSetGenerator.kt +++ b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/IAdvertisementSetGenerator.kt @@ -3,5 +3,6 @@ package de.simon.dankelmann.bluetoothlespam.AdvertisementSetGenerators import de.simon.dankelmann.bluetoothlespam.Models.AdvertisementSet interface IAdvertisementSetGenerator { - fun getAdvertisementSets():List + fun getAdvertisementSets(inputData: Map?):List + } \ No newline at end of file diff --git a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/LovespousePlayAdvertisementSetGenerator.kt b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/LovespousePlayAdvertisementSetGenerator.kt index d93f4e8..05de0f6 100644 --- a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/LovespousePlayAdvertisementSetGenerator.kt +++ b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/LovespousePlayAdvertisementSetGenerator.kt @@ -57,10 +57,12 @@ class LovespousePlayAdvertisementSetGenerator:IAdvertisementSetGenerator { private val _manufacturerId = 255 // 0xFF == 255 == Typo Products, LLC - override fun getAdvertisementSets(): List { + override fun getAdvertisementSets(inputData: Map?): List { var advertisementSets: MutableList = mutableListOf() - lovespousePlays.forEach { lovespousePlay -> + val data = inputData ?: lovespousePlays + + data.forEach { lovespousePlay -> var advertisementSet = AdvertisementSet() advertisementSet.target = AdvertisementTarget.ADVERTISEMENT_TARGET_LOVESPOUSE advertisementSet.type = AdvertisementSetType.ADVERTISEMENT_TYPE_LOVESPOUSE_PLAY diff --git a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/LovespouseStopAdvertisementSetGenerator.kt b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/LovespouseStopAdvertisementSetGenerator.kt index 5a60a9f..e7abff7 100644 --- a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/LovespouseStopAdvertisementSetGenerator.kt +++ b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/LovespouseStopAdvertisementSetGenerator.kt @@ -33,10 +33,12 @@ class LovespouseStopAdvertisementSetGenerator:IAdvertisementSetGenerator { private val _manufacturerId = 255 // 0xFF == 255 == Typo Products, LLC - override fun getAdvertisementSets(): List { + override fun getAdvertisementSets(inputData: Map?): List { var advertisementSets: MutableList = mutableListOf() - lovespouseStops.forEach { lovespouseStop -> + val data = inputData ?: lovespouseStops + + data.forEach { lovespouseStop -> var advertisementSet = AdvertisementSet() advertisementSet.target = AdvertisementTarget.ADVERTISEMENT_TARGET_LOVESPOUSE advertisementSet.type = AdvertisementSetType.ADVERTISEMENT_TYPE_LOVESPOUSE_STOP diff --git a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/SwiftPairAdvertisementSetGenerator.kt b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/SwiftPairAdvertisementSetGenerator.kt index cf29567..34e4299 100644 --- a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/SwiftPairAdvertisementSetGenerator.kt +++ b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/AdvertisementSetGenerators/SwiftPairAdvertisementSetGenerator.kt @@ -22,23 +22,27 @@ class SwiftPairAdvertisementSetGenerator : IAdvertisementSetGenerator { // https://github.com/Flipper-XFW/Xtreme-Firmware/blob/dev/applications/external/ble_spam/protocols/swiftpair.c private val _prependedBytes = StringHelpers.decodeHex("030080") - private var _deviceNames = mutableListOf( - "Device 1", - "Device 2", - "Device 3", - "Device 4", - "Device 5", - "Device 6", - "Device 7", - "Device 8", - "Device 9", - "Device 10") + + private val _deviceNames = mapOf( + "Device 1" to "Not used...", + "Device 2" to "Not used...", + "Device 3" to "Not used...", + "Device 4" to "Not used...", + "Device 5" to "Not used...", + "Device 6" to "Not used...", + "Device 7" to "Not used...", + "Device 8" to "Not used...", + "Device 9" to "Not used...", + "Device 10" to "Not used...", + ) private val _manufacturerId = 6 // 0x0006 == 6 = Microsoft - override fun getAdvertisementSets(): List { + override fun getAdvertisementSets(inputData: Map?): List { var advertisementSets:MutableList = mutableListOf() - _deviceNames.map {deviceName -> + val data = inputData ?: _deviceNames + + data.map {deviceName -> var advertisementSet:AdvertisementSet = AdvertisementSet() advertisementSet.target = AdvertisementTarget.ADVERTISEMENT_TARGET_WINDOWS @@ -63,7 +67,7 @@ class SwiftPairAdvertisementSetGenerator : IAdvertisementSetGenerator { val manufacturerSpecificData = ManufacturerSpecificData() manufacturerSpecificData.manufacturerId = _manufacturerId - manufacturerSpecificData.manufacturerSpecificData = _prependedBytes.plus(deviceName.toByteArray()) + manufacturerSpecificData.manufacturerSpecificData = _prependedBytes.plus(deviceName.key.toByteArray()) advertisementSet.advertiseData.manufacturerData.add(manufacturerSpecificData) advertisementSet.advertiseData.includeTxPower = false @@ -71,7 +75,7 @@ class SwiftPairAdvertisementSetGenerator : IAdvertisementSetGenerator { // advertisementSet.scanResponse.includeTxPower = false // General Data - advertisementSet.title = deviceName + advertisementSet.title = deviceName.key // Callbacks advertisementSet.advertisingSetCallback = GenericAdvertisingSetCallback() diff --git a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/Database/AppDatabase.kt b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/Database/AppDatabase.kt index b27264c..92ab8a3 100644 --- a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/Database/AppDatabase.kt +++ b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/Database/AppDatabase.kt @@ -42,6 +42,7 @@ import de.simon.dankelmann.bluetoothlespam.Database.Entities.AdvertisingSetParam import de.simon.dankelmann.bluetoothlespam.Database.Entities.AssociatonCollectionListEntity import de.simon.dankelmann.bluetoothlespam.Database.Entities.AssociationListSetEntity import de.simon.dankelmann.bluetoothlespam.Database.Entities.PeriodicAdvertisingParametersEntity +import de.simon.dankelmann.bluetoothlespam.Database.Migrations.Migration_1_2 import de.simon.dankelmann.bluetoothlespam.Helpers.DatabaseHelpers @androidx.room.Database( @@ -56,7 +57,7 @@ import de.simon.dankelmann.bluetoothlespam.Helpers.DatabaseHelpers AssociatonCollectionListEntity::class, AssociationListSetEntity::class, PeriodicAdvertisingParametersEntity::class], - version = 1, + version = 2, exportSchema = false) abstract class AppDatabase : RoomDatabase() { @@ -94,6 +95,8 @@ abstract class AppDatabase : RoomDatabase() { private fun buildDatabase(context: Context) = Room.databaseBuilder(context.applicationContext, AppDatabase::class.java, "BluetoothLeSpamDatabase.db") .addCallback(seedDatabaseCallback(context)) + .addMigrations(Migration_1_2) + //.fallbackToDestructiveMigration() .build() private fun seedDatabaseCallback(context: Context): Callback { @@ -136,7 +139,7 @@ abstract class AppDatabase : RoomDatabase() { ) advertisementSetGenerators.forEach{ generator -> - val advertisementSets = generator.getAdvertisementSets() + val advertisementSets = generator.getAdvertisementSets(null) advertisementSets.forEach{ advertisementSet -> DatabaseHelpers.saveAdvertisementSet(advertisementSet) } diff --git a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/Database/Migrations/Migration_1_2.kt b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/Database/Migrations/Migration_1_2.kt new file mode 100644 index 0000000..0fce283 --- /dev/null +++ b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/Database/Migrations/Migration_1_2.kt @@ -0,0 +1,41 @@ +package de.simon.dankelmann.bluetoothlespam.Database.Migrations + +import android.util.Log +import androidx.room.migration.Migration +import androidx.sqlite.db.SupportSQLiteDatabase +import de.simon.dankelmann.bluetoothlespam.AdvertisementSetGenerators.ContinuityActionModalAdvertisementSetGenerator +import de.simon.dankelmann.bluetoothlespam.AppContext.AppContext +import de.simon.dankelmann.bluetoothlespam.Database.AppDatabase +import de.simon.dankelmann.bluetoothlespam.Helpers.DatabaseHelpers + +val Migration_1_2 = object : Migration(1,2) { + private val _logTag = "Migration_1_2" + + + override fun migrate(database: SupportSQLiteDatabase) { + Log.d(_logTag, "Executing Migration...") + + val nearbyActionsAdded = mapOf( + "05" to "Apple Watch", + "24" to "Apple Vision Pro", + "2F" to "Connect to other Device", + "21" to "Software Update", + ) + + + val continuityActionModalAdvertisementSetGenerator = ContinuityActionModalAdvertisementSetGenerator() + val nearbyActionsAddedAdvertisementSets = continuityActionModalAdvertisementSetGenerator.getAdvertisementSets(nearbyActionsAdded) + + Thread { + synchronized(this) { + AppDatabase.getInstance().isSeeding = true + nearbyActionsAddedAdvertisementSets.forEach{ advertisementSet -> + DatabaseHelpers.saveAdvertisementSet(advertisementSet) + } + AppDatabase.getInstance().isSeeding = false + } + }.start() + + Log.d(_logTag, "Finished Executing Migration...") + } +} \ No newline at end of file diff --git a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/Helpers/DatabaseHelpers.kt b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/Helpers/DatabaseHelpers.kt index 1ff65c0..d9344a9 100644 --- a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/Helpers/DatabaseHelpers.kt +++ b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/Helpers/DatabaseHelpers.kt @@ -1,6 +1,7 @@ package de.simon.dankelmann.bluetoothlespam.Helpers import android.os.ParcelUuid +import androidx.sqlite.db.SupportSQLiteDatabase import de.simon.dankelmann.bluetoothlespam.Database.AppDatabase import de.simon.dankelmann.bluetoothlespam.Database.Entities.AdvertiseDataEntity import de.simon.dankelmann.bluetoothlespam.Database.Entities.AdvertiseDataManufacturerSpecificDataEntity @@ -26,9 +27,10 @@ class DatabaseHelpers { companion object{ private const val _logTag = "DatabaseHelpers" - fun saveAdvertisementSet(advertisementSet: AdvertisementSet):Int{ + fun saveAdvertisementSet(advertisementSet: AdvertisementSet,):Int{ - var database = AppDatabase.getInstance() + + val database = AppDatabase.getInstance() var advertisementSetEntity:AdvertisementSetEntity = AdvertisementSetEntity( advertisementSet.id, diff --git a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/ui/start/StartFragment.kt b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/ui/start/StartFragment.kt index 47d5cfd..71b4865 100644 --- a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/ui/start/StartFragment.kt +++ b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/ui/start/StartFragment.kt @@ -510,8 +510,7 @@ class StartFragment : Fragment() { var database = AppDatabase.getInstance() if(database != null){ removeMissingRequirement("Database is not initialized") - - if(!database.isSeeding){ + if(!database.isSeeding && !database.inTransaction()){ removeMissingRequirement("Database is Seeding") _viewModel!!.isSeeding.postValue(false) var numberOfAdvertisementSetEntities = database.advertisementSetDao().getAll().count() diff --git a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/ui/swiftPair/SwiftPairFragment.kt b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/ui/swiftPair/SwiftPairFragment.kt deleted file mode 100644 index 1709337..0000000 --- a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/ui/swiftPair/SwiftPairFragment.kt +++ /dev/null @@ -1,303 +0,0 @@ -package de.simon.dankelmann.bluetoothlespam.ui.swiftPair - -import android.os.Bundle -import android.util.Log -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.Button -import android.widget.LinearLayout -import android.widget.SeekBar -import android.widget.TextView -import androidx.core.content.ContextCompat -import androidx.fragment.app.Fragment -import androidx.lifecycle.ViewModelProvider -import com.airbnb.lottie.LottieAnimationView -import com.airbnb.lottie.LottieDrawable -import de.simon.dankelmann.bluetoothlespam.AdvertisementSetGenerators.SwiftPairAdvertisementSetGenerator -import de.simon.dankelmann.bluetoothlespam.AppContext.AppContext -import de.simon.dankelmann.bluetoothlespam.Constants.LogLevel -import de.simon.dankelmann.bluetoothlespam.Enums.AdvertisementError -import de.simon.dankelmann.bluetoothlespam.Enums.TxPowerLevel -import de.simon.dankelmann.bluetoothlespam.Handlers.AdvertisementSetQueueHandler -import de.simon.dankelmann.bluetoothlespam.Interfaces.Callbacks.IAdvertisementServiceCallback -import de.simon.dankelmann.bluetoothlespam.Models.AdvertisementSet -import de.simon.dankelmann.bluetoothlespam.Models.AdvertisementSetList -import de.simon.dankelmann.bluetoothlespam.Models.LogEntryModel -import de.simon.dankelmann.bluetoothlespam.R -import de.simon.dankelmann.bluetoothlespam.databinding.FragmentSwiftpairBinding - - -class SwiftPairFragment: Fragment(), IAdvertisementServiceCallback { - private var _binding: FragmentSwiftpairBinding? = null - - // This property is only valid between onCreateView and - // onDestroyView. - private val binding get() = _binding!! - private var _viewModel: SwiftPairViewModel? = null - private var _advertisementSetQueueHandler: AdvertisementSetQueueHandler = AppContext.getAdvertisementSetQueueHandler() - private val _advertisementSets = SwiftPairAdvertisementSetGenerator().getAdvertisementSets() - private val _logTag = "SwiftPairFragment" - - private lateinit var _toggleButton:Button - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - val viewModel = ViewModelProvider(this).get(SwiftPairViewModel::class.java) - _viewModel = viewModel - _binding = FragmentSwiftpairBinding.inflate(inflater, container, false) - val root: View = binding.root - - _advertisementSetQueueHandler.addAdvertisementServiceCallback(this) - _advertisementSetQueueHandler.clearAdvertisementSetCollection() - _advertisementSetQueueHandler.addAdvertisementSetList(getAdvertisementSetList()) - - setupUi() - - return root - } - - fun getAdvertisementSetList(): AdvertisementSetList { - var advertisementSetList = AdvertisementSetList() - advertisementSetList.title = "Swift Pairing" - advertisementSetList.advertisementSets = _advertisementSets.toMutableList() - return advertisementSetList - } - - override fun onResume() { - super.onResume() - _advertisementSetQueueHandler.addAdvertisementServiceCallback(this) - _advertisementSetQueueHandler.clearAdvertisementSetCollection() - _advertisementSetQueueHandler.addAdvertisementSetList(getAdvertisementSetList()) - } - - override fun onPause() { - super.onPause() - _advertisementSetQueueHandler.removeAdvertisementServiceCallback(this) - if( _advertisementSetQueueHandler != null && _advertisementSetQueueHandler!!.isActive()){ - stopAdvertising() - _advertisementSetQueueHandler.clearAdvertisementSetCollection() - } - } - - fun startAdvertising(){ - if( _advertisementSetQueueHandler != null){ - _advertisementSetQueueHandler!!.activate() - - val logEntry = LogEntryModel() - logEntry.level = LogLevel.Info - logEntry.message = "Started Advertising" - _viewModel!!.addLogEntry(logEntry) - - _viewModel!!.isTransmitting.postValue(true) - - _toggleButton.text = "Stop Advertising" - } else { - val logEntry = LogEntryModel() - logEntry.level = LogLevel.Info - logEntry.message = "Could not start Advertising" - _viewModel!!.addLogEntry(logEntry) - } - } - - fun stopAdvertising(){ - if( _advertisementSetQueueHandler != null){ - _advertisementSetQueueHandler!!.deactivate() - - val logEntry = LogEntryModel() - logEntry.level = LogLevel.Info - logEntry.message = "Stopped Advertising" - _viewModel!!.addLogEntry(logEntry) - - _viewModel!!.isTransmitting.postValue(false) - - _toggleButton.text = "Start Advertising" - } else { - val logEntry = LogEntryModel() - logEntry.level = LogLevel.Info - logEntry.message = "Could not stop Advertising" - _viewModel!!.addLogEntry(logEntry) - } - } - - fun setupUi(){ - if(_viewModel != null){ - - // toggle button - val toggleBtn: Button = binding.advertiseButton - _toggleButton = toggleBtn - //animation view - val animationView: LottieAnimationView = binding.swiftPairAnimation - - val toggleOnClickListener = View.OnClickListener { view -> - if( _advertisementSetQueueHandler != null){ - if (! _advertisementSetQueueHandler!!.isActive()) { - startAdvertising() - } else { - stopAdvertising() - } - } - } - - toggleBtn.setOnClickListener(toggleOnClickListener) - animationView.setOnClickListener(toggleOnClickListener) - - _viewModel!!.isTransmitting.observe(viewLifecycleOwner) { - if(it == true){ - animationView.repeatCount = LottieDrawable.INFINITE - animationView.playAnimation() - } else { - animationView.cancelAnimation() - } - } - - // txPower - val fastPairingTxPowerSeekbar = binding.swiftPairTxPowerSeekbar - val fastPairingTxPowerSeekbarLabel: TextView = binding.swiftPairTxPowerSeekbarLabel - fastPairingTxPowerSeekbar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener{ - override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { - - var newTxPowerLevel = progress - var newTxPowerLabel = "High" - - when (progress) { - 0 -> { - newTxPowerLabel = "Ultra Low" - } - 1 -> { - newTxPowerLabel = "Low" - } - 2 -> { - newTxPowerLabel = "Medium" - } - 3 -> { - newTxPowerLabel = "High" - } else -> { - newTxPowerLevel = 3 - newTxPowerLabel = "High" - } - } - - fastPairingTxPowerSeekbarLabel.text = "TX Power: ${newTxPowerLabel}" - if(_advertisementSetQueueHandler != null){ - _advertisementSetQueueHandler!!.setTxPowerLevel(TxPowerLevel.TX_POWER_HIGH) - } - } - - override fun onStartTrackingTouch(seekBar: SeekBar) { - // you can probably leave this empty - } - - override fun onStopTrackingTouch(seekBar: SeekBar) { - // you can probably leave this empty - } - }) - - // seekbar - val fastPairingRepeatitionSeekbar: SeekBar = binding.swiftPairRepeatitionSeekbar - val fastPairingRepeatitionLabel: TextView = binding.swiftPairRepeatitionSeekbarLabel - fastPairingRepeatitionSeekbar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener{ - override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { - fastPairingRepeatitionLabel.text = "Advertise every ${progress} Seconds" - if( _advertisementSetQueueHandler != null){ - _advertisementSetQueueHandler!!.setIntervalSeconds(progress) - } - } - - override fun onStartTrackingTouch(seekBar: SeekBar) { - // currently not in use - } - - override fun onStopTrackingTouch(seekBar: SeekBar) { - // currently not in use - } - }) - - // status label - val statusLabelFastPairing: TextView = binding.statusLabelswiftPair - _viewModel!!.statusText.observe(viewLifecycleOwner) { - statusLabelFastPairing.text = it - } - - // log scroll view - val logView: LinearLayout = binding.swiftPairLogLinearView - _viewModel!!.logEntries.observe(viewLifecycleOwner) { - logView.removeAllViews() - it.reversed().map { logEntryModel -> - val logEntryTextView: TextView = TextView(logView.context) - logEntryTextView.text = logEntryModel.message - - when (logEntryModel.level){ - LogLevel.Info -> { - logEntryTextView.setTextColor(ContextCompat.getColor(logView.context, R.color.log_info)) - } - LogLevel.Warning -> { - logEntryTextView.setTextColor(ContextCompat.getColor(logView.context, R.color.log_warning)) - } - LogLevel.Error -> { - logEntryTextView.setTextColor(ContextCompat.getColor(logView.context, R.color.log_error)) - } - LogLevel.Success -> { - logEntryTextView.setTextColor(ContextCompat.getColor(logView.context, R.color.log_success)) - } - } - - logView.addView(logEntryTextView) - } - } - - } - } - - override fun onDestroyView() { - super.onDestroyView() - _binding = null - } - - override fun onAdvertisementSetStart(advertisementSet: AdvertisementSet?) { - if(advertisementSet != null){ - var message = "Advertising: ${advertisementSet.title}" - _viewModel!!.setStatusText(message) - - var logEntry = LogEntryModel() - logEntry.level = LogLevel.Info - logEntry.message = message - _viewModel!!.addLogEntry(logEntry) - } - } - - override fun onAdvertisementSetStop(advertisementSet: AdvertisementSet?) { - Log.i(_logTag, "onAdvertisementSetStop called") - } - - override fun onAdvertisementSetSucceeded(advertisementSet: AdvertisementSet?) { - var logEntry = LogEntryModel() - logEntry.level = LogLevel.Success - logEntry.message = "Started advertising successfully" - _viewModel!!.addLogEntry(logEntry) - } - - override fun onAdvertisementSetFailed(advertisementSet: AdvertisementSet?, advertisementError: AdvertisementError) { - var message = if (advertisementError == AdvertisementError.ADVERTISE_FAILED_FEATURE_UNSUPPORTED) { - "ADVERTISE_FAILED_FEATURE_UNSUPPORTED" - } else if (advertisementError == AdvertisementError.ADVERTISE_FAILED_TOO_MANY_ADVERTISERS) { - "ADVERTISE_FAILED_TOO_MANY_ADVERTISERS" - } else if (advertisementError == AdvertisementError.ADVERTISE_FAILED_ALREADY_STARTED) { - "ADVERTISE_FAILED_ALREADY_STARTED" - } else if (advertisementError == AdvertisementError.ADVERTISE_FAILED_DATA_TOO_LARGE) { - "ADVERTISE_FAILED_DATA_TOO_LARGE" - } else if (advertisementError == AdvertisementError.ADVERTISE_FAILED_INTERNAL_ERROR) { - "ADVERTISE_FAILED_INTERNAL_ERROR" - } else { - "Unknown Error" - } - - var logEntry = LogEntryModel() - logEntry.level = LogLevel.Error - logEntry.message = message - _viewModel!!.addLogEntry(logEntry) - } -} \ No newline at end of file diff --git a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/ui/swiftPair/SwiftPairViewModel.kt b/app/src/main/java/de/simon/dankelmann/bluetoothlespam/ui/swiftPair/SwiftPairViewModel.kt deleted file mode 100644 index 880da20..0000000 --- a/app/src/main/java/de/simon/dankelmann/bluetoothlespam/ui/swiftPair/SwiftPairViewModel.kt +++ /dev/null @@ -1,31 +0,0 @@ -package de.simon.dankelmann.bluetoothlespam.ui.swiftPair - -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import de.simon.dankelmann.bluetoothlespam.Models.LogEntryModel - -class SwiftPairViewModel : ViewModel(){ - - private val _statusText = MutableLiveData().apply { - value = "Start Swift Pairing" - } - public fun setStatusText(text:String){ - _statusText.postValue(text) - } - - val isTransmitting = MutableLiveData().apply { - value = false - } - - val logEntries = MutableLiveData>().apply { - value = listOf() - } - - fun addLogEntry(logEntry: LogEntryModel){ - logEntries.value = logEntries.value?.plus(logEntry) ?: listOf(logEntry) - } - - val statusText: LiveData = _statusText - -} \ No newline at end of file