> ## Documentation Index
> Fetch the complete documentation index at: https://docs.wavebybemobi.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Changelog

> Changelog about the Spam Control SDK

# 0.17.1 - 14/07/2026

* Update the monitoring dependency, fixing telemetry uploads that were rejected or stuck on devices with non-Latin-digit locales (e.g. Farsi) and preventing a rare crash from concurrent use of shared date formatters

# 0.17.0 - 23/06/2026

* Allow unblocking a number that is blocked only by a category rule (e.g. `CATEGORY_FILTERED_PREFIX` or the unknown-callers category); previously `unblockNumber` failed silently and the call kept being blocked
* Prefix all SDK database file names with `sc_` and migrate existing databases in place, preventing collisions with a host app database of the same name

# 0.16.1 - 10/06/2026

* Prefix all module resource names with `sc_` to prevent silent override of host app resources during resource merge
* Restrict the dialer stub activity to `ACTION_DIAL` intent filters, so browser and Google `tel:` link clicks no longer route to it; call screening and blocking are unaffected

# 0.16.0 - 25/05/2026

* Add `categoryRule`, `isVisible` and `isTrusted` fields to `Category`. Category should be visible to the user based on `isVisible` field.
* Fix `SpamControlSyncDatabaseWorker` not being registered for users with pre-existing subscriptions
* Fix workers skipping when device has no validated internet connection
* Fix race condition in credential encryption when multiple WorkManager workers run concurrently
* Fix a bug where numbers from the remote database that were manually unblocked would still be treated as blocked
* Security fix: close external bypass vector on the permissions activity

# 0.15.0 - 12/05/2026

* Remove `setBlockUnknownCallers` and `isBlockUnknownCallersEnabled` — unknown caller blocking is now driven by backend configuration
* Add dedicated monitoring event for outgoing call screening interruption
* Fix ConcurrentModificationException in call screening service caused by concurrent access from coroutine and main thread
* Fix SQLiteNotADatabaseException by recovering from wrong or missing encryption keys, with cooldown to avoid repeated re-downloads
* Fix potential ANR by moving a blocking WorkManager call to a background thread
* Fix potential deadlock when the user events database reaches its record limit
* Add missing consumer ProGuard rules for public API types, preventing R8 from obfuscating fields accessed by integrators in release builds

# 0.14.2 - 16/04/2026

* Fix block with leading 0s + ddi

# 0.14.1 - 01/04/2026

* Fix duplicated monitoring requests
* Retrofit update from 2.9.0 to 2.11.0
* Add proguard rules inside sdk so the integrator doesn't need to add any

# 0.14.0 - 23/03/2026

* Add SpamControl.BlockReturn.AlreadyBlocked to blockNumber method
* Fix some http errors from monitoring feature
* Improve dependency injection used internally
* Update database sync to be more frequent

# 0.13.0 - 13/02/2026

* Add subscription feature with new PhoneCall.Status field (ALLOWED\_PENDING\_PAYMENT) and getSubscription, cancelSubscription, getNoPaymentStatus and setNoPaymentStatus methods.
* Add date to manual block feature
* Add category icons
* Add extra data to request headers
* Add more monitoring events
* Update monitoring version

# 0.12.0 - 15/01/2026

* Add monitoring feature

# 0.11.15 - 12/12/2025

* Improve Contacts query performance, which was making call interception to fail

# 0.11.14 - 03/12/2025

* Add STG/PROD environment through SpamControl.enableSpamControl and SpamControl.enableSpamControlSilently
* Reduce SpamControlUploadDataWorker to run each hour instead of 15m to 15m
* Reduce retry times for SpamControlUploadDataWorker from 5 to 3
* Add check to isSpamControlOn before triggering triggerGetDatabaseWorker when getDatabaseVersionAndAmountOfNumbers fails
* Remove getAmountOfBlockedNumbers method

# 0.11.13 - 18/11/2025

* Fix isNumberBlocked not considering numbers from remote database

# 0.11.12 - 17/11/2025

* Fix behavior and name of SpamControl.isNumberBlocked (from inNumberBlocked)

# 0.11.11 - 13/11/2025

* Add stopAndTriggerUploadDataWorker and call it when starting every SpamControlUploadDataWorker

# 0.11.10 - 11/11/2025

* Add rules database to limit user events to 1 week old and 300 rows in size
* Fix SpamControlUploadDataWorker being launched as not unique work, causing a lot of history and parallel coroutines
* Add SpamControl.EnableReturn.AlreadyOn and SpamControl.EnableSilentlyReturn.AlreadyOn
* Add dispatcher to retrofit with maxRequests = 8
* Decrease getUserEvents batch during upload from 50 to 10
* Add userEvents database migration 4 to 5 to clean all database
* Add in memory cache inside SharedPreferencesHelper

# 0.11.9 - 25/09/2025

* Fix missed databaseID when migrating out of EncryptedSharedPref
* Update contacts query for more precision when checking if a call is originating from a known contact

# 0.11.8 - 11/09/2025

* Add SpamControl.enableSpamControlSilently method so the app host can disable or enable the sdk remotely if the user has already granted the mandatory permissions
* Add SpamControl.disableSpamControl in SyncDatabaseWorker if mandatory permission is missing
* Add another userEvents database migration to clean all database
* Fix SpamControl.disableSpamControl triggering turn off data event even and uploadDataWorker only when flag is on
* Fix CryptoManager.decrypt crash and disableSpamControl if apiKey or phoneNumber are null in SharedPreferencesHelper

# 0.11.7 - 05/09/2025

* Fix event loop crash by adding a userEvents database migration

# 0.11.6 - 01/09/2025

* Fix request loop when auth data is lost
* Fix sdk-version in request header from "currentVersion"
* Add date to all user event requests
* Improve performance by:
  * Access device call log only when necessary
  * Update EncryptedSharedPref to be volatile

# 0.11.5 - 26/08/2025

* Update coroutines usage to prevent ANRs
* Update database creation to be lazy
* Improve performance of some sql queries
* Stop database operations if CallScreeningService times out

### 0.11.4 - 15/08/2025

* Fix a bug where sdk was not asking for optional permissions if the Spam Id permission was already granted. Added hasSpamControlOptionalPermissions public method.

### 0.11.3 - 11/08/2025

* Downgrade dependencies to avoid conflicts. Upgrading back is expected in a few weeks.
  * Kotlin from `2.0.21` to `1.9.25`
  * KSP from `2.0.21-1.0.28` to `1.9.25-1.0.20`
  * AndroidX Room from `2.7.2` to `2.6.1`
  * AndroidX Core-ktx from `1.16.0` to `1.8.0`
  * AndroidX AppCompat from `1.7.0` to `1.6.1`
  * Android Material from `1.12.0` to `1.6.1`

### 0.11.2 - 06/08/2025

* Fix a bug where the default dialer permission was not being asked correctly for apis 24-28
* Support for 16kb memory page size. For this, we updated SqlCipher from `4.5.4` to `4.7.2`

### 0.11.1 - 01/08/2025

* Fix a bug where calls from a contact were allowed even with number blocked manually

## 0.11.0 - 31/07/2025

* Add register for `OUTGOING` calls to improve spam detection
* Add current `database_id` field to PhoneCall object
* Add Popup trigger by extending `SpamControlPopupService`
* Add rule to allow calls from contacts
* Add rule to block calls from private numbers
* Fix a bug in database sync where numbers were not being mapped correctly

## 0.10.0 - 25/07/2025

* Add daily database sync instead of daily full download

### 0.9.2 - 23/07/2025

* Add `CATEGORY_FILTERED_PREFIX` and `CATEGORY_NOT_MAPPED` to `PhoneCallStatus` enum

### 0.9.1 - 22/07/2025

* Fix Keystore handling with Cipher when storing apiKey and phoneNumber

## 0.9.0 - 16/07/2025

* Add call information from system to improve spam detection
* Improve our SQL query to match numbers with leading 0s
* Update Gradle, AGP, Kotlin and some dependencies versions

### 0.8.5 - 25/06/2025

* Update `READ_CONTACTS` as an optional permission

### 0.8.4 - 18/06/2025

* Add Relinker to reload sqlcipher lib in case of `UnsatisfiedLinkError`
* Add id to `PhoneCall` object in database
* Update try catch in `ContactsHelper.getContacts` when trying to check if a call was from a contact
* Change `EncryptedSharedPreferences` to `SharedPreferences` + `Keystore` to safely store `apiKey` and `phoneNumber`

### 0.8.3 - 06/06/2025

* Fix a bug where empty `phoneNumber` was being categorized with categories that had empty prefix regex
* Fix a bug where `getString` in ContactsHelper is crashing
* Update `minSdkVersion` to 24 + Remove `SpamControlReceiver`

### 0.8.2 - 05/06/2025

* Fix a bug where user refused to give `READ_CONTACTS` permission
* Fix a bug where a call doesn't have a caller number

### 0.8.1 - 21/05/2025

* Fix a bug where not blocked categories were not registered in the respective PhoneCall objects
* Fix a bug where calls were registered with corresponding status even when sdk was off (Ex: MANUAL\_BLOCK)
* Fix a bug where unblocking a number would unblock all matching numbers with different ids

## 0.8.0 - 05/05/2025

* Add `BlockReturn`, `UnblockReturn` and `DeleteCallsReturn` so different uis can be shown to the user in different situations
* Add contact name to `phoneCall` name
* Fix UserEvents crashing the app when happening at the same second
