Screening phone calls on Android: unknown numbers, contacts by category, times of day¶
The question: how could Sioul on Android screen every incoming phone call, and block or silence callers by its own rules: everyone not in the contacts, some people one by one or by the category of their contact card (CardDAV CATEGORIES), at the times areas.md sets (work, admin, leisure, meals, sleep)? What does Android let an application do; what do do-not-disturb, ringtones and voicemail add; which rules work in practice against unwanted calls (unknown numbers, prefixes, ranges, France's telemarketing prefixes, its caller authentication); where number reputation comes from and what it costs in privacy; what open-source blockers do; what voicemail and transcription offer; why unexpected calls matter, briefly; and what must never be blocked without the person knowing?
The means come first; laws and opt-out lists are left out (they have not stopped unwanted calls), except where a technical choice depends on them, in a few lines.
Researched on 6 October 2026. Nothing here is built; this note researches an idea. Builds on emergency-pause.md (cited as "pause note": 1.1 on autistic overload, 1.7k on emergency numbers, 7.1 on Android's do-not-disturb) and on Sioul's do-not-disturb on every device (android.md, "Pauses"; areas.md; porch.md, "Who may write to you").
Grading. Technical facts come from primary sources: the Android source (AOSP, read at the named release branch on android.googlesource.com), the SDK's stubs and API database (android-36), developer.android.com, ARCEP's decisions, the projects' own repositories and Exodus Privacy's reports. "Read in the source" means the code was read, not a summary; "(unverified)" marks what could not be confirmed at a primary source; "needs a test" marks what only a phone can answer. Research on people is graded as in the other notes: strong (meta-analysis, large or multi-site trial, guideline built on a systematic review), moderate (several consistent studies, or one large well-run study), weak (one small study, cross-sectional only, case series), opinion (consensus without data, lived-experience writing, vendor documentation). "Verified" next to a DOI means it resolved on Crossref with matching authors, year and venue.
Answers so far¶
(Updated 6 October 2026, 20:15, final. Numbers point to the entries below, "CS" to the design criteria.)
1. Sioul can screen every call without becoming the phone app. The claim that a screening app other than the dialer only hears about numbers not in the contacts is wrong from Android 11 on: Telecom skips a contact's call only when the screening app lacks READ_CONTACTS (in the code since the first Android 11 release, in the documentation from Android 12). Android 10's code passes every call, contacts included, when the carrier configures no screening app of its own, whatever its own Javadoc says. Android 9 has no screening role. Hidden numbers reach the app as a null number in the code, though the documentation says they do not (a test). The app has five seconds, learns the number, its presentation and (API 30) a verification status, never the caller's name, the line called or the contact's name; it can let the call ring, ring silently, or never show it (rejected, or left ringing until the network's voicemail), and skip the missed-call notification, not the call log. /e/OS keeps AOSP's code, sets no default screening app, and its users run Saracroche and others. (1.1–1.4, 1.9)
2. The phone app's role is a whole phone (call screens within a second, audio routes, emergency calls handed to the preloaded dialer anyway; a restricted setting on Android 15 and 16 for apps installed from a file). It would add Android 9, the line called, the phone's voicemail and the platform's blocked list, not the rules asked here. Not needed. (1.5, 1.6, 8.1)
3. The platform's blocked list holds exact numbers, blocks their calls and texts for every app, pauses for two hours after an emergency call, and only the phone, SMS or carrier app may write it: Sioul can open its page, not fill it. Texts can be filtered only by the SMS app; a notification listener only hides them. (1.7, 1.10)
4. Do-not-disturb, ringtones and "route to voicemail" do what screening cannot when Sioul is off: do-not-disturb by time (starred, contacts, anyone or nobody, repeat callers) is the floor that holds without Sioul running; a silent ringtone per contact still vibrates and shows; "Route to voicemail" holds for one person at all times, set by the person in Contacts. Android's repeat-caller memory never sees a call a screening app held, so Sioul must count repeats itself. The matrix of who, when and which mechanism is in 2.4. (2)
5. Rules that work in France: "not in my contacts", with three exceptions every blocker converges on (numbers called lately, a second try within minutes, emergency numbers); ARCEP's 22 roots for automated callers (NPV, list of 1 January 2026: 12 mainland, 10 overseas) and the caller IDs that cannot exist (089, blocks never attributed, from ARCEP's open data), shipped as data; a separate public-interest range not to block. Hidden numbers changed meaning in 2026: they now include French mobiles abroad that failed authentication. France's caller authentication (MAN) cuts or hides calls in the network and gives the phone nothing to read; Free diverts its spam list to voicemail by default; Bouygues' and Orange's labels reach only the phone app. Bloctel closed on 11 August 2026. (3)
6. Number reputation and open-source blockers. Maintained open-source blockers all use the screening role: Saracroche (GPL, France's prefixes plus community lists, downloads that send only a country code, 0 trackers), SpamBlocker (MIT, rules with priorities, schedules and reasons), Silence (GPL, everyone unknown blocked unless a sign says otherwise, no network), CallShield ("expecting a call", a snapshot before the first unlock). Their pitfalls: a copied proprietary database (Yet Another Call Blocker), live lookups that send the caller's number, even hashed (PhoneBlock, SpamBlocker's option), the silent block that leaves no trace (Fossify Phone). Operators' and commercial apps carry trackers. (3.6, 4)
7. Voicemail and transcription. Only the phone app reads the phone's voicemail; answering a caller with a voice is a system-only API; Apple (French), Samsung (French) and Google (English and Spanish for voicemail) do parts of it on their own phones. Where the operator mails voicemail as audio (Free does, as WAV), Sioul already receives it and could transcribe it on the device with an open engine (whisper.cpp, Vosk); French accuracy on telephone audio needs a test. (5)
8. Why it matters: 78% of autistic adults avoid the phone and 61% avoid voicemail too (Doherty 2022); real-time talk is a barrier for a third (Raymaker 2017); uncertainty and anxiety go together (meta-analysis, young people). No study compares unexpected with scheduled calls or tests screening: the case rests on stated preferences and a plausible mechanism, and argues for written, predictable contact (a list, a text back, a transcript) as much as for silence. (6)
9. Safety: emergency callbacks come from 0 800 112 112 and, since January 2026, may show the emergency number itself; Sioul must let those ring, and every call for 24 hours after the person calls an emergency number (Apple's rule; Android's own pause covers only its blocked list). Hospitals call from hidden or switchboard numbers and may leave no message: an "expecting a call" window and a care category answer it. Every held call is listed afterwards, calmly, never counted; anything Sioul cannot decide in time rings. The law: rejecting one's own calls is a right; never record or answer with a voice; keep lists on the person's devices. (7)
10. Design: Sioul as the "Caller ID & spam app" with READ_CONTACTS; calls on the same "Who may reach you, and when" matrix as mail, with two rows added (numbers not in the contacts, hidden numbers) and a "silent" state; a fixed order of decision with floors; a table written ahead and read in Java within milliseconds; a calm list afterwards with Call back and Text back; rules shared between the person's devices; texts left to do-not-disturb and Android's blocked list. (8, CS1–CS21)
Main uncertainties, all for a real phone: hidden numbers in onScreenCall; whether rejected and unanswered calls reach voicemail with each operator; what a silenced call looks like in /e/OS's phone app; whether outgoing emergency calls reach the screening service; the start-up time of the screening process; what MAN's status reads in France. (Open questions)
1. Android's ways to screen calls¶
Read in the Telecom service's source (platform/packages/services/Telecomm) at the branches android10-release to android16-release, the framework's Javadoc (platform/frameworks/base, telecomm/java/android/telecom/), the role definitions (platform/packages/modules/Permission, PermissionController/res/xml/roles.xml), and the SDK's API database (android-36). Paths below are relative to https://android.googlesource.com/; …/callfiltering/ stands for platform/packages/services/Telecomm/+/refs/heads/<branch>/src/com/android/server/telecom/callfiltering/.
1.1 How an incoming call is filtered (Android 11 to 16). CallsManager.onSuccessfulIncomingCall builds a small graph of filters for each call (setUpCallFilterGraph, CallsManager.java): the contacts' "send to voicemail" flag (DirectToVoicemailFilter), the platform's blocked numbers (BlockCheckerFilter) and do-not-disturb (DndCallFilter, Android 14 and later) run side by side; then the carrier's screening app, if the carrier configures one; then ONE more screening app: the app holding the call-screening role when there is one and it is not the default dialer, else the default dialer's own screening service (if ((userChosenPackageName != null) && (!userChosenPackageName.equals(defaultDialerPackageName)))). The whole graph has 5 seconds (Timeouts.getCallScreeningTimeoutMillis, setting call_screening_timeout, default 5000 ms); past it the call goes on with what was decided so far. Calls skip every filter when the phone is in emergency callback mode (PROPERTY_EMERGENCY_CALLBACK_MODE, Android 10 and later), when the network marks the call as an emergency one (PROPERTY_NETWORK_IDENTIFIED_EMERGENCY_CALL) or after an emergency SMS (isInEmergencySmsMode), both from Android 14, or for self-managed calls (VoIP apps such as Signal or WhatsApp manage their own calls; they never reach call screening).
- Read in the source (
…/CallsManager.java,…/callfiltering/IncomingCallFilterGraph.java,…/Timeouts.java, android11-release to android16-release). Primary. - Takeaway for Sioul: a screening app sees ordinary phone-network calls only, has under 5 seconds, and replaces the default dialer's own screening (on a phone where the dialer filters spam itself, as Google's Phone app does, holding the role takes that filter away: say so at setup).
1.2 Which calls a screening app is asked about: the claim "only numbers not in the contacts" is wrong from Android 11 on, for an app that may read the contacts.
- Android 11 to 16:
CallScreeningServiceFilter.startFilterLookupskips the call only when "the number is in the user's contacts" AND the app "does NOT hold READ_CONTACTS permission" (if (priorStageResult.contactExists && (!hasReadContactsPermission())); the carrier's and the default dialer's are treated as holding it). An app holding the role andREAD_CONTACTSis asked about every call, contacts included. Present from the first Android 11 release (tagandroid-11.0.0_r1) toandroid16-release, unchanged. The Javadoc ofonScreenCallstill said "only calls which are not in the user's contacts are passed for screening" in Android 10 and 11; from Android 12 it adds "unless the CallScreeningService has been granted READ_CONTACTS permission by the user". - Android 10: the code differs from its own Javadoc ("Called when a new incoming or outgoing call is added which is not in the user's contact list").
CallScreeningServiceController.bindCarrierServicebinds the dialer's and the role holder's services at once when the carrier configures no screening app of its own (KEY_CARRIER_CALL_SCREENING_APP_STRING, empty by default inCarrierConfigManager); only after a carrier app has answered does it look the number up and skip both for a contact (checkContactExistsAndBindService). So on a phone without a carrier screening app, Android 10 passes every call, contacts included, whatever the permissions. Android 10's own tests cover only the case with a carrier app (CallScreeningServiceControllerTest, all withsetCarrierDefinedCallScreeningApplication()). Read in the source; needs a test. - Android 9 and earlier: no call-screening role (it came with
RoleManager, API 29); only the default dialer'sCallScreeningServiceis bound (API 24 to 28). - Which contacts count: Telecom's own lookup (
CallerInfoLookupHelper,PhoneLookupin Android's contacts provider): any contact on the phone, in any account (local, DAVx⁵…). Sioul's own address books, synced by its own code (android.md, "Accounts"), are not Android's contacts and count for nothing here. - Hidden numbers: the Javadoc (Android 12 to 16) says calls whose presentation is restricted, unknown, unavailable or payphone "are not provided to the CallScreeningService". The code does not skip them:
ParcelableCallUtils.toParcelableCallForScreeningpasses them with a null handle and their presentation (call.getHandlePresentation() == TelecomManager.PRESENTATION_ALLOWED ? call.getHandle() : null), and no filter checks the presentation. Read in the source (android10 to android16); the documentation disagrees; needs a test. - Only
tel:numbers; VoIP apps' calls never come. - Sources:
…/callfiltering/CallScreeningServiceFilter.java(android11-release to android16-release; tagsandroid-11.0.0_r1,android-12.0.0_r1);platform/packages/services/Telecomm/+/refs/heads/android10-release/src/com/android/server/telecom/callfiltering/CallScreeningServiceController.javaand its test;platform/frameworks/base/+/refs/heads/<branch>/telecomm/java/android/telecom/CallScreeningService.java(android10, 11, 12, 15, 16);…/ParcelableCallUtils.java. Primary (source code). - Takeaway for Sioul: with the call-screening role and
READ_CONTACTS(which the do-not-disturb work asks already), Sioul can apply its own rules to every call on Android 10 to 16, contacts by category and time included, without becoming the phone app. Android 9 cannot.
1.3 What a screening app can answer. respondToCall(details, response), built with CallScreeningService.CallResponse.Builder:
setDisallowCall(true)(API 24): the call is not shown at all. WithsetRejectCall(true)it is "disconnected as if the user had manually rejected it", so the network treats it as declined (most operators then forward it to voicemail, as on "busy"); without it, the phone stays silent while the caller hears ringing until the network's no-answer forwarding sends them to voicemail or they hang up (onCallFilteringComplete:incomingCall.reject(false, null)only whenshouldReject). Which one French operators turn into voicemail: needs a test (section 5).setSilenceCall(true)(API 29): "the Telecom framework will not play a ringtone for the call. The call will, however, still be sent to the default dialer app": the phone app still shows the incoming call (setSilentRingingRequested). Whether the screen lights up depends on the phone app: needs a test with /e/OS's dialer.setSkipNotification(true): no missed-call notification for a disallowed call (honoured for every screening app).setSkipCallLog(true): ignored for anyone but the carrier's and the system's screening apps ("Note: Only the carrier and system call screening apps can use this parameter", Android 15 Javadoc; the code adds a role holder's blocked calls to the call log whatever it asks, since Android 10). A call Sioul blocks is always written to the phone's call log asBLOCKED_TYPE, with the reason "call screening service" and Sioul's name (CallLog.Calls.CALL_SCREENING_APP_NAME).- Screening "via audio processing" (answering in the background to let a bot listen, as Google's Call Screen does) is a system API (
@SystemApi,CAPTURE_AUDIO_OUTPUT) honoured only for the system dialer. - After an allowed call ends, Telecom starts the role holder's activity for
TelecomManager.ACTION_POST_CALLif it declares one (to rate a number). Sioul should declare none: a screen after every call is the opposite of calm. - Sources:
CallScreeningService.java(android15-release,CallResponse.Builder);…/callfiltering/CallScreeningServiceFilter.java;…/CallsManager.java(onCallFilteringComplete,maybeSendPostCallScreenIntent). Primary. - Takeaway for Sioul: three answers are enough: ring, ring silently (the call still shows), or not at all (to voicemail, rejected or left unanswered). Every blocked call stays visible in the phone's own call log: Sioul cannot hide what it did, which is good. Decided otherwise on 7 October 2026: two answers, a call rings or goes to voicemail and is listed after; a phone cannot show what it holds (attention.md, §1.5).
1.4 Time and what the app learns.
- Time: "For incoming calls, the CallScreeningService must call respondToCall … within 5 seconds of being bound … the user's device will not begin ringing until the response is received (or the timeout is hit)." Telecom starts the app's process if it is not running: it binds with
BIND_AUTO_CREATE | BIND_FOREGROUND_SERVICE | BIND_SCHEDULE_LIKE_TOP_APP(CallScreeningServiceHelper.bindCallScreeningService), so a frozen or stopped Sioul is woken at foreground priority. No answer in time, a crash, or a failed binding: the call rings as usual (mResultFuture.complete(mPriorStageResult)). Before the first unlock after a restart, a service that is not direct-boot aware is not found, and calls ring as usual. - What it learns (
onScreenCall's Javadoc andtoParcelableCallForScreening): the direction, the number (getHandle(), atel:URI, null when hidden), its presentation, the creation and connection times, and from API 30 the caller-number verification status (getCallerNumberVerificationStatus():VERIFICATION_STATUS_NOT_VERIFIED,_PASSED,_FAILED, from the network's STIR/SHAKEN-type check where the operator sends one; for France see section 3). Not the caller's name from the network, not the SIM or line called (setAccountHandle(null)), not the contact's name. Outgoing calls are passed too ("for the purpose of providing caller ID"), for contacts only withREAD_CONTACTS. - Reading the contacts itself:
READ_CONTACTSis an ordinary runtime permission ("dangerous", not hard-restricted, not on Android 15's restricted-settings list, 1.6); with it the app can look the number up (PhoneLookup) and read the contact's groups. Sioul has better: its own vCards, with theirCATEGORIES, matched by its own number keys (sioul_core::phones::key). - Primary (Javadoc and source, android15-release; API levels from
api-versions.xml). - Takeaway for Sioul: the decision must be ready before the call: Rust writes, ahead, a small table (each known number's key and its category, the person's rules, the times of the coming days, as for the home card's frames); the Java service decides from it in milliseconds, never loading Sioul's Rust library or Qt during a call; anything it cannot decide in time rings, as Android would.
1.5 The default phone app (ROLE_DIALER). What it takes: activities for ACTION_DIAL (a dial pad) with and without tel:; an InCallService with IN_CALL_SERVICE_UI (required by the role for apps targeting API 33 and later); and in the documentation's words, "It must fully implement the InCallService API and provide both an incoming call UI, as well as an ongoing call UI": the incoming-call notification with a full-screen intent, answering and declining, the ongoing call (mute, speaker, Bluetooth and wired routes, hold, the keypad for menus, swapping and merging, conference), the call history, missed-call notifications (ACTION_SHOW_MISSED_CALLS_NOTIFICATION), and, optionally, ringing itself (METADATA_IN_CALL_SERVICE_RINGING). "The preloaded dialer will ALWAYS be used when the user places an emergency call, even if your app fills the ROLE_DIALER role." The role grants the holder the phone, contacts, SMS, microphone and camera permissions it declares (roles.xml); on Android 15 and 16 it is a restricted setting for apps installed from a file (1.6). What it adds over the screening role: Android 9; the SIM or line called; its own ringing, per contact (IN_CALL_SERVICE_RINGING); writing the platform's blocked list (1.7); reading the phone's voicemail (section 5).
- Sources:
InCallService.javaJavadoc (frameworks/base, android15-release);roles.xml(android12-release, android15-release). Primary. - Takeaway for Sioul: being the phone app means writing a complete, reliable phone (the call screen must appear within a second; Sioul's Qt window takes 1.8 s to its first frame on a 2019 phone, so the call screens would be native Java) and owning every failure of a phone call. The screening role covers the rules asked here; the dialer role is not needed.
1.6 Getting the roles and permissions, on a phone that installs Sioul from a file. RoleManager.createRequestRoleIntent(ROLE_CALL_SCREENING) (API 29) shows the system's question; the role is exclusive (one holder), may be "None" (showNone), is found in Settings as "Caller ID & spam app" (« Appli numéro de l'appelant et spam »; the dialog: "Set Sioul as your default caller ID & spam app?", "No permissions needed"; PermissionController's strings.xml, android15-release), and grants the "display over other apps" app-op (and notifications on Android 15). Android 15's "restricted settings" for apps installed from a local or downloaded file (EnhancedConfirmationService, android15-release and android16-release) cover ROLE_DIALER, ROLE_SMS, the SMS permissions, accessibility, notification access and display-over-apps, not ROLE_CALL_SCREENING, READ_CONTACTS or do-not-disturb access. Primary (source). Takeaway for Sioul: the screening role and READ_CONTACTS can be given in two system dialogs, without the restricted-settings detour the dialer role would need.
1.7 The platform's blocked numbers (BlockedNumberContract, API 24). One list on the phone, of exact numbers (or addresses), each also matched in its E.164 form; "Messages, and calls from blocked numbers are discarded by the platform" (calls by BlockCheckerFilter; SMS and MMS by telephony's InboundSmsHandler, which drops them before any SMS app sees them). No prefixes, ranges, patterns, times or categories. "Only the system, the default SMS application, and the default phone app … and carrier apps can read, and write to the blockednumber provider"; any app may open the system's page to manage it (TelecomManager.createManageBlockedNumbersIntent()). "The platform will not block messages, and calls from emergency numbers", and after the person contacts emergency services blocking is suspended for KEY_DURATION_BLOCKING_DISABLED_AFTER_EMERGENCY_INT (7200 s, two hours, by default). The same page carries the "enhanced" switches where the platform enables them (BlockedNumbersActivity shows EnhancedCallBlockingFragment when isEnhancedCallBlockingEnabledByPlatform; carrier key KEY_SUPPORT_ENHANCED_CALL_BLOCKING_BOOL, true by default in Android 10): block numbers not in the contacts, private, payphone, unknown, unavailable (Telecom's settings/EnhancedCallBlockingFragment.java, android15-release). The person can thus block every number not in their contacts with no app at all, at all times, with no exception but the post-emergency pause. The post-emergency suspension applies to this list only: a third-party screening app is still asked during those two hours (no such check in CallScreeningServiceFilter or CallsManager).
- Sources:
BlockedNumberContract.javaJavadoc (frameworks/base, android12-release, android15-release);…/callfiltering/BlockCheckerFilter.java;platform/frameworks/opt/telephony/+/refs/heads/android15-release/src/java/com/android/internal/telephony/InboundSmsHandler.java("drop the message if it is blocked");CarrierConfigManager.java(android10-release). Primary. - Takeaway for Sioul: the blocked list is the only way to stop texts as well as calls, but only the phone or SMS app can write it: Sioul can open its page for the person, never write it. Sioul's own screening must copy its safety rule: after the person calls an emergency number, block nothing for some hours (section 7).
1.8 Older ways, not to use. TelecomManager.endCall() (API 28, deprecated in 29 "Apps performing call screening should use the CallScreeningService API instead") still rejects the ringing call with ANSWER_PHONE_CALLS, but only after the phone has started ringing, and knowing the number needs the call log (READ_CALL_LOG). Primary (TelecomManager.java, TelecomServiceImpl.java, android15-release). Takeaway for Sioul: the screening role does all of it before the first ring.
1.9 /e/OS. /e/OS's Telecom is LineageOS's, itself AOSP's: its CallScreeningServiceFilter and its filter graph (setUpCallFilterGraph) are those of AOSP on the Android 12 branch (v1-s) and on the Android 15 branch (a15, which differs only by a later AOSP change to how app labels are read) (gitlab.e.foundation/e/os/android_packages_services_Telecomm, compared on 6 October 2026). The role itself is granted by AOSP's PermissionController. So a third-party screening app works there as on AOSP, from the source; /e/OS users report Saracroche, Yet Another Call Blocker and SpamBlocker working, Saracroche's blocked calls showing in the call history (community.e.foundation threads 83060, July–August 2026; 66448; 79761; secondary), and no thread reports a screening app failing. /e/OS sets no default holder of the role (config_defaultCallScreening empty in its frameworks/base and vendor_lineage, branch a16), and its dialer, LineageOS's with /e/'s theme and call recording, has no screening service of its own (section 4.3). Primary (source), secondary (users). Takeaway for Sioul: nothing /e/OS-specific stands in the way and the role is free; that the settings offer "Caller ID & spam app" on a given /e/OS build still deserves a look on the phone.
1.10 Texts (SMS). Filtering texts is another matter:
- Only the default SMS app (
ROLE_SMS) receives texts first and decides what to keep; becoming it means being a full SMS and MMS app, and on Android 15 and 16 the role is a restricted setting for apps installed from a file (1.6). - A notification listener (
BIND_NOTIFICATION_LISTENER_SERVICE, a restricted setting since Android 13 for apps installed from a file) can only hide or delay the SMS app's notifications; the text is still in the SMS app. - The platform's blocked numbers (1.7) drop texts from those numbers for every app, but only the phone or SMS app writes that list.
- Sioul's do-not-disturb mode can keep texts silent (messages from starred contacts only, pause note 7.1); they still arrive.
- Takeaway for Sioul: for texts, silence (do-not-disturb) and the person's own blocked list (opened from Sioul) are the means; Sioul does not filter SMS.
2. Do-not-disturb, ringtones and voicemail flags for contacts¶
Section 1 removes the premise that contacts never reach a screening app: with READ_CONTACTS, Sioul's screening sees them. The three older means still matter as fallbacks (Android 9, the screening role refused or given to another app, Sioul failing to answer in time) and for what screening cannot do (texts, the person's own pauses).
2.1 Do-not-disturb, changed with the time. Sioul's own mode (an AutomaticZenRule, pause note 7.1; android.md, "Pauses") can carry, per time, who may ring: anyone, contacts, starred contacts, or nobody (ZenPolicy.Builder.allowCalls(PEOPLE_TYPE_…), API 29), separately for texts (allowMessages), and repeat callers (allowRepeatCallers). Sioul switches it at each change of time with setAutomaticZenRuleState (API 29), from an exact alarm when Sioul is not running (as the do-not-disturb work does for its timed changes). How Android decides (ZenModeFiltering.matchesCallFilter, frameworks/base, android15-release): a repeat caller passes first, then the policy's people: "contacts" are all of Android's contacts, "starred" those with the STARRED column, set in the Contacts app. Needs "Do Not Disturb access" (a switch the person turns on), not WRITE_CONTACTS. From Android 15 the person can edit the mode in Settings ▸ Modes, and their edits win.
- What it cannot express: a category, an individual (except by starring, which marks a favourite everywhere and for all times), a number not in the contacts, a prefix.
- How reliable: the system enforces it even when Sioul is frozen or stopped, once the mode is on; the time changes need Sioul's alarm to fire (exact alarms, "Alarms & reminders").
- Repeat callers: Android remembers a caller when a call's notification from the phone app goes away (
NotificationManagerService.cancelNotificationLocked→recordCallerLocked→ZenModeFiltering.RepeatCallers.recordCall, thresholdconfig_zen_repeat_callers_threshold, 15 minutes in AOSP'score/res/res/values/config.xml, which a phone maker may change). A call that a screening app disallows never reaches the phone app, posts no call notification, and is therefore never remembered: a second call within 15 minutes is not a "repeat caller" for do-not-disturb. A silenced call is shown, so it is remembered. Read in the source (android15-release); needs a test. - Sources:
ZenModeFiltering.java,ZenModeHelper.java,NotificationManagerService.java(frameworks/base, android15-release);ZenPolicy.Builder,NotificationManager(api-versions.xml). Primary. - Takeaway for Sioul: do-not-disturb by time is the safety net that works without Sioul running: "starred only" during sleep and pauses, "contacts" or "anyone" at other times; if Sioul blocks a call, Sioul must count repeat calls itself, since Android's own repeat-caller rule never sees it (section 7).
2.2 Ringtones per contact. ContactsContract.Contacts.CUSTOM_RINGTONE (API 5): Telecom reads it with the caller's contact (CallerInfo: "An empty string ("") in the database indicates a silent ringtone … {null} … the default ringtone"). It controls the sound only: the phone still vibrates by its own settings (Ringer.isVibratorEnabled) and the incoming-call screen still shows; a ringtone that fails to load falls back to the default one (RingtoneFactory.getRingtone). Set by the person in the Contacts app (AOSP Contacts: a contact's ⋮ ▸ "Set ringtone"), or by an app with WRITE_CONTACTS. Not by time.
- Sources:
telecomm/java/android/telecom/CallerInfo.java(frameworks/base, android15-release);RingtoneFactory.java,Ringer.java(Telecomm, android15-release);res/menu/quickcontact.xml(packages/apps/Contacts, android15-release). Primary. - Takeaway for Sioul: a weak tool (vibration and screen stay; whether "silent" truly plays nothing on /e/OS needs a test); screening's "ring silently" does the same per call and per time. Not worth guiding people to.
2.3 "Route to voicemail" per contact. SEND_TO_VOICEMAIL (API 5) on the contact: Telecom's DirectToVoicemailFilter rejects the call before any screening app is asked (setShouldAllowCall(!info.shouldSendToVoicemail), setShouldReject(info.shouldSendToVoicemail)), logs it as blocked with the reason BLOCK_REASON_DIRECT_TO_VOICEMAIL, and shows a missed-call notification. Set by the person in the Contacts app (AOSP Contacts: ⋮ ▸ "Route to voicemail"), or by an app with WRITE_CONTACTS. Always, not by time. It is a column of Android's raw contacts: whether a contact synced by DAVx⁵ keeps it through syncs, and whether /e/OS's Contacts app shows the menu, needs a test.
- Sources:
…/callfiltering/DirectToVoicemailFilter.java(android11-release to android16-release);CallerInfo.java; Contacts'quickcontact.xmlandstrings.xml("Route to voicemail"). Primary. - Takeaway for Sioul: for one person who must never ring, at any time, the person's own "Route to voicemail" works with Sioul switched off; Sioul can open that contact for them (guided, as the stars are). Writing it at each change of time would rewrite contacts several times a day: refused.
2.4 Which mechanism fits which rule. "Screening" means Sioul holding the call-screening role with READ_CONTACTS (Android 10 to 16); "DND" Sioul's own do-not-disturb mode switched with the times; "blocked list" the platform's (1.7), written by the person on the system's page.
| Who | A rule by time (work, admin, leisure, meals, sleep) | Always the same | Without the screening role (fallback) | Their texts |
|---|---|---|---|---|
| Unknown numbers (not in the phone's contacts) | screening: ring, ring silently, or voicemail, per time | screening; or Android's own "block numbers not in contacts" switch (1.7), no exceptions | DND "contacts" or "starred" for the times that want quiet; Android's switch | DND keeps them silent; they still arrive |
| Hidden numbers | screening, if the call comes with a null number (1.2; needs a test) | screening; or the blocked list's "private" switch, where the carrier allows it | DND (they are not contacts) | — |
A contact by category (vCard CATEGORIES) |
screening, matching Sioul's own vCards | screening | DND cannot see categories; starring a whole category is a guided chore | DND "starred" or "contacts" only |
| One person, a contact | screening | screening; or "Route to voicemail" in Contacts (guided) | starring (allowed through DND), "Route to voicemail" (never rings) | the blocked list (blocks calls and texts) |
| One number, not a contact | screening | screening; or the blocked list | the blocked list (exact number only) | the blocked list |
| A prefix or range (telemarketing, section 3) | screening | screening | none (the blocked list takes exact numbers) | none |
| Always allowed (the person's safe list) | screening lets them ring; DND lets them through only if starred | — | starring | starring |
| Emergency callbacks, repeat callers | never blocked unseen (section 7): screening's own rules; DND's repeat callers | — | DND's repeat callers; starring the callback number | — |
- Takeaway for Sioul: screening covers every rule asked, by time; DND by time is the floor when Sioul cannot answer; the person's own "Route to voicemail", stars and blocked list cover what must hold even with Sioul off, and texts.
3. Rules that work: unknown numbers, prefixes, ranges, caller authentication¶
France first. Read on 6 October 2026 in ARCEP's decisions and open data, the operators' own pages, and Exodus Privacy's reports. Opt-out lists are left aside: France's, Bloctel, closed on 11 August 2026, when telephone canvassing came to need prior consent ("Le service Bloctel a pris fin avec l'entrée en vigueur au 11 août 2026 du régime de démarchage téléphonique fondé sur le recueil préalable du consentement du consommateur", bloctel.gouv.fr; loi n° 2025-594 du 30 juin 2025, art. 13): there is no list left to sync with.
3.1 "Not in my contacts" is the rule that works, with three exceptions every blocker converges on. The open-source blockers (section 4) all start from it: a contact always passes (Yet Another Call Blocker's first check), "block everyone not in contacts" is a single switch (Saracroche's "only contacts", SpamBlocker's "non-contact", Silence's default), and the exceptions are numbers the person called or answered recently, a second call within minutes, and emergency numbers (SpamBlocker, Silence; section 4). Before the first unlock after a restart, contacts cannot be read: Yet Another Call Blocker makes it a setting ("Contacts can't be reliably used as a whitelist in this mode"); a screening service that is not direct-boot aware is simply not asked then, and calls ring (1.4).
- Source (the projects' code, section 4). Takeaway for Sioul: "numbers not in my contacts" is the main lever; Sioul's contacts are its own vCards (1.4), so a number that is only in the phone's Android contacts must count as known too, or the person will be surprised.
3.2 Machines calling: ARCEP's "verified multi-use numbers" (numéros polyvalents vérifiés, NPV). Since 1 January 2023, an automated system (dialer, robocall, mass texting) may show an ordinary French number only from these roots: "Les numéros territorialisés … ne peuvent être utilisés comme identifiant de l'appelant présenté à l'appelé pour des appels ou des messages émis par des systèmes automatisés d'appels et d'envois de messages", except the NPV (decision n° 2022-1583 of 1 September 2022, annex 1, § 2.3.2 f and § 2.3.7; https://www.arcep.fr/uploads/tx_gsavis/22-1583.pdf). The list in force since 1 January 2026 (decision n° 2025-2215 of 27 November 2025, plan § 2.3.7 a, https://www.arcep.fr/uploads/tx_gsavis/25-2215.pdf; checked in the text):
- +33: 0162, 0163, 0270, 0271, 0377, 0378, 0424, 0425, 0568, 0569, 0948, 0949;
- +590 (Guadeloupe, Saint-Martin, Saint-Barthélemy): 05987, 09475; +594 (Guyane): 05988, 09476; +596 (Martinique): 05989, 09477; +262: 02688 and 09479 (La Réunion), 02689 and 09478 (Mayotte); none in Saint-Pierre-et-Miquelon.
- What it means: "a machine is calling", for any purpose (canvassing, a survey, a parcel notice, an appointment reminder, a bank alert), calls and texts alike. It does not cover a person dialling by hand, who may show any 01–05 or 09 number; mobile numbers (06, 07) are for "une personne physique unique" and may never be shown by an automated system (§ 4.1.1, § 2.3.4 f). In ARCEP's open data (MAJNUM, 15 September 2026) 1,018 NPV blocks, 2,287,000 numbers, are attributed (count from the CSV).
- A second category, new in 2026, must be kept apart: "numéros polyvalents pour les appels et messages d'intérêt général" (+33: 01510, 02810, 03410, 04410, 05410, 09410; overseas roots in the decision), for organisations named by ministerial order (opinion, polling, "ordre public économique"). ARCEP notes some feared "blocage automatique par certaines applications mobiles qui analysent les appels entrants". No block of them was attributed on 15 September 2026.
- Other ranges where machines are expected: exchanges with a technical platform (+33 0937, 0938, 09390–09394; overseas 09395–09399) and 13–14-digit M2M numbers (07000–07004, 09010–09014; overseas 07005–07009, 09015–09019) (decision 2022-1583, § 4.2; plan).
- Primary. Takeaway for Sioul: ship the NPV roots as data, with their source, the plan's version and the date checked (as
crisis-lines.tomldoes), as a rule of its own, "Automated calls", sent to voicemail and folded in the list by default; never fold it into "spam"; keep the public-interest roots as another category, not blocked by default; the plan changes every two to three years (2018, 2019, 2021, 2023, 2026), with one to four months' notice.
3.3 Caller IDs that cannot be real. "Les numéros spéciaux à tarification majorée commençant par 089 ne peuvent pas être présentés en tant qu'identifiant de l'appelant" (plan 2026); from 1 July 2027 the same for premium short numbers and 118 XYZ above a price threshold; technical numbers neither; and a shown number must "avoir fait l'objet d'une attribution par l'Arcep et d'une affectation à un utilisateur" (plan § 2.2.2 a). ARCEP publishes every attributed block as open data under the Licence Ouverte (MAJNUM, https://www.data.gouv.fr/fr/datasets/ressources-en-numerotation-telephonique/, about 20,700 rows, 1.15 MB, updated after each ARCEP board meeting).
- Primary. Takeaway for Sioul: a French number from 089, or from a block ARCEP never attributed, is spoofed whatever else is known: offline, Sioul can call it so ("This number does not exist in the French plan") and send it to voicemail; a snapshot of MAJNUM fits in the app, refreshed only when the person allows it.
3.4 Hidden numbers changed meaning in 2026. Since 1 January 2026, a French mobile number arriving from abroad that cannot be authenticated is passed with the number hidden instead of being cut: "Désormais, le « numéro masqué » signifiera ainsi que soit l'appelant a souhaité masquer son numéro d'appelant, soit le numéro d'appelant n'a pas pu être authentifié pour des raisons techniques" (ARCEP press release, 2 December 2025, https://www.arcep.fr/actualites/actualites-et-communiques/detail/n/plan-de-numerotation-021225.html; decision 2025-2215, plan § 2.3.4 h). Operators must also let a subscriber refuse hidden-number calls in the network (CPCE D98-5, 7.6): Free's "Rejet des appels anonymes" tells such callers the subscriber refuses them (https://assistance.free.fr/articles/890).
- Primary; operator. Takeaway for Sioul: "a hidden number" now covers a person who hides, a hospital switchboard (7.2), and a spoofer abroad: say it in those words; silencing them is a reasonable default for an unknown caller, rejecting them in the network (the operator's switch) loses the hospital's call for good.
3.5 France's caller authentication (MAN) gives a phone nothing to read. Since October 2024 operators sign calls (STIR/SHAKEN, certificates from the APNF, attestation levels A, B, C) and must cut what fails: "l'opérateur interrompt l'acheminement de l'appel ou du message" (loi n° 2020-901, art. 10, now CPCE L. 44 IV; ARCEP's sheet for operators, updated 27 March 2026, https://www.arcep.fr/mes-demarches-et-services/acteurs-regules/operateurs-telecoms/fiches-pratiques/authentification-numeros-telephone-fixe-ou-mobile-que-faire-en-tant-que-operateur-telephonique.html). In practice: an unauthenticated French fixed number (01–05, 09) is cut and the phone never rings; an unauthenticated French mobile from abroad arrives hidden (3.4); calls attested only at levels B and C "peuvent actuellement ne pas être interrompus" and ring with their number and no mark. No ARCEP, operator or federation document says a verification result is passed to the subscriber's phone; Android's getCallerNumberVerificationStatus() (1.4) is filled only when the network sends one (the SIP verstat parameter of the North American standard). Spoofing still reaches phones: reports to ARCEP grew "de 531 en 2023 à plus de 19 000 en 2025" (ARCEP, 29 January 2026, which opened an inquiry into every operator).
- Primary for the rules; "nothing reaches the phone" is a negative finding (no document says it does). Inference, needs one test call per operator: the status reads
NOT_VERIFIEDfor every call in France. - Takeaway for Sioul: do not build on MAN; read the status anyway, treat
FAILEDas spoofed andPASSEDas a bonus if it ever comes (a foreign SIM, roaming, a later French rollout); what MAN gives in practice is that an unknown French fixed number that rings has passed some check.
3.6 What French operators already do in the network. Operator pages, read 6 October 2026:
- Free Mobile: "Antispam voix", "activé par défaut", filters incoming calls "en se basant sur une liste établie par Free", by default redirecting them "vers la messagerie vocale" (https://assistance.free.fr/articles/883); also per-number filters for calls and texts, refusing all calls, refusing forwarded calls, in the subscriber's web area (articles 890, 892, 894, 896). No schedules.
- Bouygues Telecom: "Anti-Spam" with Hiya, "directement intégrée au réseau voix", from 5 October 2026 at 2 € a month; it warns rather than blocks (press release, 28 September 2026); "Branded Call" shows a paying business's name to subscribers (press release, 13 May 2026).
- Orange: spam marking on mobile through the "Orange et Moi" app, blocking with the paid "Orange Cybersecure" option (https://boutique.orange.fr/options/cyber-secure); "Branded Calling" announced for businesses in 2026.
- SFR: no page on call spam could be read (automated reading refused); not checked.
- The operators' apps carry trackers (Exodus Privacy, latest reports): Orange Téléphone 3 (Google CrashLytics, Firebase Analytics, Tag Manager), Orange et Moi 5, Bouygues Telecom's Espace Client 5, SFR & Moi 3, RED & Moi 3; Saracroche, an open-source blocker, 0 (section 4).
- What reaches an app: a call Free diverts to voicemail never reaches the phone. Labels and business names travel in the caller-name field, which Telecom blanks for screening apps (
toParcelableCallForScreening:setCallerDisplayName(null), android10 to android16, read in the source): only the phone app shows them. - Operator (pages); primary for the Android side. Takeaway for Sioul: much spam is cut or diverted before the phone, and the operators' labels are for the person's eyes in their phone app, not a signal for Sioul; Sioul can point to the operator's own free switches (Free's web settings), and need not duplicate an operator's paid list.
3.7 How prefix rules are written in practice (section 4 for the projects): Saracroche keeps digit strings in international form without "+", # standing for exactly one digit and the pattern as long as the number (33162######), in ordered allow and block lists, the first match deciding; Yet Another Call Blocker and NoPhoneSpam use * (any digits) and # or _ (one digit), stored as SQL LIKE; SpamBlocker uses full regular expressions on the number with "+" and leading zeros stripped, with flags. Takeaway for Sioul: E.164 prefixes with an exact length (France: +33 and nine digits) cover the plan's categories without regular expressions; ranges are a prefix and a length; patterns are for advanced use only.
4. Number reputation and open-source blockers¶
Each project's repository was cloned on 6 October 2026 (latest default branch) and read where stated; F-Droid's metadata and Exodus Privacy's reports (https://reports.exodus-privacy.eu.org/en/reports/
4.1 Where number reputation comes from, and what it costs.
- A proprietary database, copied. Yet Another Call Blocker ships the database of the proprietary app "Should I Answer?" (24.5 MB, last refreshed in its repository in April 2021) and fetches updates from that app's server by passing itself off as its client (a fixed fake device, the app family "SIA-NEXT"); per-number reviews, on request only, send the number and the person's IP address. No licence covers the data; F-Droid marks the app "NonFreeNet". (Source:
gitlab.com/xynngh/LibPhoneNumberInfo, modulesia; README "Privacy".) - Community lists, downloaded. Saracroche downloads, once a day, lists that send nothing but a country code (
X-Country-Code: FR): the ARCEP prefixes, 1,203 operator number blocks "les plus signalés", 970 numbers reported at least 30 times with at least 90% spam, and 105,313 numbers reported at least three times, used as labels; all under CC BY-NC-SA 4.0; reports send the number with a random install ID; hosted in France (https://app.saracroche.org/api/v2/lists, read 6 October 2026; privacy page https://saracroche.org/fr/privacy/). PhoneBlock (Germany) needs an account; its list is downloaded daily, and its app also looks up each unknown call live, sending SHA-1 hashes of the number and of its 10- and 100-number blocks with the account's token (source:CallChecker.javain https://github.com/haumacher/phoneblock). A phone number's SHA-1 is reversed by trying every number of the country: the server learns who called whom. - Public complaint data. The US Federal Trade Commission publishes consumers' Do Not Call and robocall complaints daily ("None of the information about the reported calls is verified", https://www.ftc.gov/policy-notices/open-government/data-sets/do-not-call-data); SpamBlocker can import a 90-day mirror; CallShield builds a signed database from FCC and FTC complaints with others. US numbers in practice.
- Official numbering data. ARCEP's categories and open data (3.2, 3.3): small, authoritative, under the Licence Ouverte, no reputation but certainty about what a range is for; MAJNUM also names the operator holding each block (columns
EZABPQM;Tranche_Debut;Tranche_Fin;Mnémo;Territoire;Date_Attribution, https://extranet.arcep.fr/uploads/MAJNUM.csv), so a number can be told offline to belong to, say, a VoIP wholesaler; Saracroche's "most reported operators" list is built on such blocks. - Names for businesses. OpenStreetMap's shops, offices and services carry
phonetags (ODbL): an offline source to name a pharmacy or a clinic calling, which Saracroche extracts (codeberg.org/cbouvat/saracroche-osm) and LineageOS's dialer queries live (4.3). - Source, docs. Takeaway for Sioul: official data first (ARCEP's), then only downloaded lists whose licence allows shipping in a GPL app (CC BY-NC-SA does not, for a list bundled in it; a download the person chooses is another matter) and whose download sends nothing about the person; never a lookup per call, hashed or not.
4.2 The open-source blockers, and how they do it. All the maintained ones use the call-screening role; none needs to be the phone app.
| Project (package) | Licence, state | Blocks with | Rules | Data and network | Trackers (Exodus) |
|---|---|---|---|---|---|
Saracroche (com.cbouvat.android.saracroche) |
GPL-3.0-or-later; active (5.5.2, 30 Sept 2026); France | screening role; reject; asks to skip log and notification | ordered allow and block lists, # patterns of exact length in international form; "only contacts" by not asking READ_CONTACTS; hidden numbers |
daily list download, country code only; reports with a random ID | 0 (5.5.2) |
SpamBlocker (spam.blocker) |
MIT; active (5.18, 1 Oct 2026) | screening role; reject, silence, or answer and hang up | priorities, regular expressions, contact groups (by group name), weekly window per rule, calendar events, repeat calls, numbers dialled or answered, apps used recently, STIR/SHAKEN, emergency window | optional imports (FTC, PhoneBlock); optional live lookups | 0 (5.16) |
Silence (me.lucky.silence) |
GPL-3.0-only; maintained (1.13.1, Nov 2025) | screening role; reject, silence, skip log or notification, as chosen | everyone not known is blocked; known = contacts, numbers called or texted, a repeat call, a number seen in a recent message, number types; emergency always | none (no network permission) | 0 (1.12.1) |
Yet Another Call Blocker (dummydomain.yetanothercallblocker) |
AGPL-3.0-only; dormant since 2021 | screening role (opt-in), else end the ringing call | contacts pass; hidden; rating; */# patterns |
copied proprietary database; impersonated updates | 0 (0.5.17) |
PhoneBlock Mobile (de.haumacher.phoneblock_mobile) |
GPL-3.0-or-later; maintained; Google Play only | screening role; reject | votes per number and per 10- or 100-number block; own prefixes; hidden numbers always ring | account; daily list; live lookup per call (hashed number); answers from the local copy if the server is slower than 4.5 s | 0 (1.3.1) |
CallShield (com.sysadmindoc.callshield) |
MIT; new (March 2026), very active; GitHub only | screening role; reject or silence | a priority ladder of about 30 steps; # ranges; hour-based schedules; quiet hours; "Expecting a call" window; contact groups; a snapshot for before the first unlock |
signed database (FCC, FTC, Saracroche ranges…); optional live lookup sending the plain number | no report |
Fossify Phone (org.fossify.phone) |
GPL-3.0-only; maintained | the phone app plus the screening role; the platform's blocked list | exact numbers and * patterns (its own service only); "block not in contacts"; "block hidden" |
none (no network) | 0 (1.11.1) |
| NoPhoneSpam, Blacklist Blocker | GPL-3.0, Apache-2.0; abandoned (2021, 2019) | end the ringing call (endCall, reflection) |
modes (everyone, contacts, list, nobody); SQL LIKE patterns |
none | 0 |
- Details that matter, from the code: no project reads
getHandlePresentation(); all treat a null or empty number as hidden (Saracroche:callDetails.handle?.schemeSpecificPart, then "no digits"; Silence:getRawNumber().isNullOrBlank(); PhoneBlock: "No handle (e.g. withheld number), accepting"; Fossify:number == null), which agrees with 1.2: hidden calls do reach the screening app, as a null number. Projects withoutREAD_CONTACTS(Saracroche, PhoneBlock) count on Telecom not sending them contacts' calls, and Saracroche's own setting warns "this option may not work with some devices" (Android 10, 1.2). Saracroche, PhoneBlock and Fossify ask to skip the call log; Android ignores the request for them (1.3), so their blocked calls are still in the phone's history as blocked. SpamBlocker's repeat-call rule and Silence's read the call log, and so depend on blocked calls staying there. - What the person sees: Saracroche, a list and a count on its home screen, an optional notification, and for allowed calls a label ("CPAM", "Spam à 100% sur 4 signalements"); SpamBlocker, a history with the reason of each decision and a notification per blocked call; Silence, an optional notification; Yet Another Call Blocker, a notification and the call log with ratings; Fossify Phone, nothing at all ("Do not copy the silent block: … the person cannot find a wrongly blocked call").
- A warning about ownership: Simple Dialer, Fossify's GPL ancestor, was sold with its suite at the end of 2023, and its Google Play build 5.19.1 carried 9 trackers (Amazon Advertisement, AppLovin, AppMetrica, Facebook Ads, Google AdMob, CrashLytics, Firebase Analytics, IAB Open Measurement, Yandex Ad; Exodus report of 29 February 2024); the F-Droid builds and the fork stayed clean.
- Source, docs, report. Takeaway for Sioul: copy Saracroche's data model (exact-length prefixes, ordered allow and block lists, downloads that say nothing about the person, ARCEP's prefixes on by default), Silence's allow-signals that need no list (numbers called, a second try, emergency calls), SpamBlocker's per-rule reason shown afterwards, CallShield's "Expecting a call" window and its small rule snapshot for before the first unlock (only the person's explicit blocks; contacts cannot be read then), PhoneBlock's "answer from local data before Telecom's deadline". Avoid per-call lookups, copied databases, 17-permission sprawl, a ladder of some 30 steps, and the silent block.
4.3 What the privacy-minded systems build in: exact numbers, nothing more.
- GrapheneOS: its features page lists, for the dialer, call recording only; its dialer is AOSP's, blocking through the platform's list (1.7), and AOSP's spam module is a stub (
SpamStub.checkSpamStatus()returns "not spam") (https://grapheneos.org/features;github.com/GrapheneOS/platform_packages_apps_Dialer, branch 17). - LineageOS: AOSP's blocking (exact numbers in the platform's list) plus an old caller-ID lookup, off by default, that sends the caller's number to US or German directory sites (YellowPages, ZabaSearch, DasTelefonbuch), and a place search that sends the query and the phone's position to OpenStreetMap's Overpass server (
com.android.dialer.lookup, branchlineage-23.2); nothing for France; no screening service; no default holder of the role. - /e/OS: LineageOS's dialer with /e/'s theme, call recording on, the voice-search button hidden; branch
a16.2differs fromlineage-23.2only by its CI file (GitLab comparison); no spam or blocking feature added; no default screening app. Users on its forum ask for ranges ("+33161*"), hidden numbers and "silence" in the stock phone app, which takes exact numbers only (threads 69573, 64369, 79761). - Source, docs, secondary. Takeaway for Sioul: the field is empty on the systems Sioul's people use: a screening service competes with nothing built in; LineageOS's lookups show what never to do (send the caller's number to a directory).
4.4 For comparison: the proprietary caller-ID apps. Exodus Privacy finds tracker code by static analysis of the store build (it does not prove the trackers run); reports read on 6 October 2026, at https://reports.exodus-privacy.eu.org/en/reports/
| App (package) | Version, report | Trackers | Permissions |
|---|---|---|---|
Truecaller (com.truecaller) |
26.37.5, 24 Sept 2026 | 30, among them Amazon Advertisement, AppLovin, AppsFlyer, Criteo, Facebook Ads, Google AdMob, Firebase Analytics, ironSource, Unity3d Ads, Yandex Ad | 96 |
Getcontact (app.source.getcontact) |
8.16.0, 28 Aug 2026 | 36 (Adjust, AppsFlyer, Facebook Ads, Google AdMob, myTarget, Yandex Ad…) | 62 |
CallApp (com.callapp.contacts) |
2.290, 24 Sept 2026 | 24 (Facebook Ads, Analytics, Login and Share, Google AdMob…) | 75 |
Whoscall (gogolook.callgogolook2) |
8.38, 25 Sept 2026 | 19 | 48 |
Hiya (com.webascender.callerid) |
15.1.1, 1 Oct 2026 | 3 (Google CrashLytics, Firebase Analytics, OpenTelemetry) | 40 |
Orange Téléphone (com.orange.phone) |
10.2.2, 7 Sept 2026 | 3 (Google CrashLytics, Firebase Analytics, Tag Manager) | 68 |
Should I Answer? (org.mistergroup.shouldianswer) |
1.9.276, 14 Aug 2026 | 2 (Google CrashLytics, Firebase Analytics) | 18 |
- How the big directories are built, in their own policies (read 6 October 2026): Truecaller collects "access to device address book" and call metadata, lets users "suggest a name for a given number", and processes data about people who never used it, "information associated with your phone number that we receive from our Users … to derive trust and reputation signals" (https://www.truecaller.com/privacy-policy; its EU policy says contacts are read on the device, https://www.truecaller.com/privacy-policy-eu); CallApp collects "Information regarding contacts contained in user device phone books" to "Create a contacts database in order to allow users of this Service to identify who is calling", and information "may be used to identify users across devices and channels for the purpose of serving targeted advertising" (https://callapp.com/privacy).
- Report, docs. Takeaway for Sioul: the caller-ID business runs on other people's address books and on advertising; even the leanest ship analytics. Every open-source blocker with a report shows none. Sioul keeps every lookup on the phone, sends nobody's number anywhere, and names callers only from the person's own contacts and official data.
5. Voicemail and transcription¶
Voicemail is where a diverted call goes, and a transcript is what makes it readable for the many who avoid voicemail too (6.1). Who can reach the audio decides what Sioul can do.
5.1 The phone's voicemail belongs to the phone app. Reading voicemails needs the default or system dialer, or READ_VOICEMAIL (signature|privileged|role: not for other apps); ADD_VOICEMAIL (an ordinary runtime permission) lets an app insert and read only its own voicemails (VoicemailPermissions.callerHasReadAccess, ContactsProvider, android15-release). Visual voicemail (OMTP: the operator's server notifies by a hidden SMS, the messages are fetched over IMAP) is handled by a VisualVoicemailService, to which "Telephony will only bind to the default dialer". The provider has a transcription column (Voicemails.TRANSCRIPTION, with a state), filled by whoever inserted the voicemail.
- Sources:
VoicemailContract.java,VisualVoicemailService.java(frameworks/base, android15-release);VoicemailPermissions.java(packages/providers/ContactsProvider, android15-release);core/res/AndroidManifest.xml(protection levels). Primary. - Takeaway for Sioul: as a screening app, Sioul cannot read the phone's voicemail; it can only say when a call went to voicemail and that a message may wait there. The operator's own channels (5.4) are the way to the audio.
5.2 Answering a caller with a voice, as Google's Call Screen does, is closed to other apps. Telecom's "background audio processing", which lets a call be answered silently while software listens and talks, is a system API: CallResponse.Builder.setShouldScreenCallViaAudioProcessing (@SystemApi, CAPTURE_AUDIO_OUTPUT, "only be honored if the CallScreeningService shares the same uid as the system dialer app") and Call.enterBackgroundAudioProcessing (@SystemApi, @hide). Primary (frameworks/base, android15-release). Google's Call Screen runs on Pixel phones; in France only by hand ("Screen call" tapped), its automatic mode being offered in Australia, Canada, Ireland, the UK and the US; it "works on your device", and saves the screening audio by default (https://support.google.com/phoneapp/answer/9118387, https://support.google.com/phoneapp/answer/9094888, read 6 October 2026; vendor). Apple's Live Voicemail transcribes on the iPhone while the caller speaks, and iOS 26's "Ask Reason for Calling" questions unknown callers before the phone rings, both in French (https://support.apple.com/en-us/105066, https://support.apple.com/en-us/111106; vendor). Samsung's Bixby text call lets the person take a call by typing ("Bixby will let the caller know you are using an automated voice"), on the device, in French among other languages (https://www.samsung.com/us/support/answer/ANS10003690/; vendor). Google's Phone app transcribes voicemail "only … in English and Spanish" (https://support.google.com/phoneapp/answer/2811844; vendor).
- Takeaway for Sioul: no bot answering, ever (it is closed to apps, and would need telling callers, 7.6); a person on a Samsung phone can be pointed to text call, an iPhone user to Live Voicemail; Sioul's part is what comes after: the list of who called and, where the audio reaches Sioul, a transcript.
5.3 Transcribing on the device. Open engines that run offline, with French:
- whisper.cpp (MIT, https://github.com/ggml-org/whisper.cpp) running OpenAI's Whisper models ("Whisper's code and model weights are released under the MIT License", https://github.com/openai/whisper): multilingual sizes tiny (39 M parameters), base (74 M), small (244 M); Rust bindings
whisper-rs(public domain, Unlicense). - Vosk (Apache-2.0, https://github.com/alphacep/vosk-api):
vosk-model-small-fr-0.22, 41 MB, Apache-2.0, "Lightweight wideband model for Android/iOS and RPi", word error rate 23.95% (Common Voice test), 27.25% (podcasts); the 1.4 GBvosk-model-fr-0.2214.72% (https://alphacephei.com/vosk/models, read 6 October 2026). - sherpa-onnx (Apache-2.0, https://github.com/k2-fsa/sherpa-onnx), which runs several model families on Android.
- Accuracy on French voicemail (narrowband telephone audio, names, numbers spoken), speed on a 2019 phone, and the model's size in the APK: needs a test. A wrong transcript of a phone number or an appointment time is worse than none: the audio stays one tap away, and digits heard are shown as heard, never acted on.
- Takeaway for Sioul: transcription is possible on the phone and the computer without any server, once Sioul holds the audio; on a computer whisper.cpp's larger models are affordable.
5.4 Where a diverted call goes, and the operators' channels to the audio.
- Forwarding decides. A call the phone rejects is treated by the network as busy and follows "call forwarding on busy"; a call left ringing unanswered follows "call forwarding on no reply" after a timer that "is in between 5 and 30 seconds, in steps of 5 seconds"; a phone off or out of reach follows "not reachable" (3GPP TS 22.082 § 3, https://www.etsi.org/deliver/etsi_ts/122000_122099/122082/19.00.00_60/ts_122082v190000p.pdf). The person sets and reads them with the standard codes (3GPP TS 22.030, annex B, https://www.etsi.org/deliver/etsi_ts/122000_122099/122030/19.00.00_60/ts_122030v190000p.pdf):
*#61#reads "on no reply" (number and timer),*#67#"on busy",*#62#"not reachable";**61*<voicemail number>*11*10#sends unanswered calls to voicemail after 10 seconds. No public Android call sets forwarding (none found in the SDK); an app can open the phone app with the code filled in (ACTION_DIAL, "#" written%23) for the person to press call. - Visual voicemail per operator (AOSP's carrier configurations,
platform/packages/apps/CarrierConfig/assets/): Orange France names its own app (carrier_vvm_package_name_string_array = com.orange.vvm); the AOSP configurations of SFR, Bouygues Telecom and Free carry no visual-voicemail keys (phone makers may add theirs). Either way the audio lives with the phone app or the operator's app (5.1). - Voicemail by e-mail: Free Mobile can send, for each new message, "un email vous notifiant le numéro appelant, la date et la durée du message", and "en pièce jointe le contenu audio de ce message, sous forme de fichier son (.wav)" (https://assistance.free.fr/articles/940, read 6 October 2026; the Freebox line likewise, article 572). Orange, SFR and Bouygues Telecom: not verified (their help pages could not be read automatically).
- Transcription by operators: not verified anywhere (press claims only).
- Primary (3GPP, AOSP), operator (Free). Takeaway for Sioul: "voicemail" in Sioul's rules means the operator's forwarding; the setup should show the person how to check it (
*#61#,*#67#) and, if they wish, how to shorten the no-reply timer, since an unknown caller left ringing silently otherwise hears ringing for up to 30 seconds. Where the operator mails voicemail as audio (Free does), Sioul already receives it with the person's mail: it can file the message beside the call in the list ("They left a message, 0:42") and transcribe it on the device (5.3), with no phone permission at all.
6. Why unexpected calls matter (brief)¶
Searched on 6 October 2026 (PubMed, Crossref, Europe PMC, the vendors' pages); full texts read where said. Kept short on purpose: anxiety disorders, ADHD, trauma and the cost of interruptions were not researched here (the sibling notes cover interruptions and overload: emergency-pause.md, done-for-the-day.md).
6.1 Doherty M, Neilson S, O'Sullivan J, et al. 2022. Barriers to healthcare and self-reported adverse outcomes for autistic adults: a cross-sectional study. BMJ Open 12(2):e056904. doi:10.1136/bmjopen-2021-056904 — verified (Crossref, PubMed 35193921); full text read; autistic-led team.
- 507 autistic and 157 non-autistic adults (online, 2019): telephone "generally avoided where possible" 78% against 38%; voicemail avoided 61% against 39%; "easier for me to communicate in writing" 41% against 8%; difficulty booking a GP appointment by telephone 62% against 16%, which went with self-reported harm (untreated conditions, missed screening).
- Cross-sectional, convenience sample, large. Moderate.
- Takeaway for Sioul: most autistic adults avoid the phone, and 61% avoid voicemail too: sending calls to voicemail is not enough on its own; what reaches them is written (a transcript, a text back, a list of who called).
6.2 Howard PL, Sedgewick F. 2021. "Anything but the phone!": communication mode preferences in the autism community. Autism 25(8):2265–2278. doi:10.1177/13623613211014995 — verified (Crossref, PubMed 34169750); full text read.
- 245 autistic adults ranked six ways of being in touch: for services, email first, and the phone below text, chat, letters and face-to-face; "Not the phone" was "the pattern that was clearest among all participants and scenarios", about making and receiving calls ("I hate it when [they] call me too!"; "if I'm disturbed by a phone call … it's quite jarring and it can take time afterwards to get back into the flow"). Avoiding the phone cost missed hospital appointments, therapy refused because it was by phone, refunds lost.
- Survey with thematic analysis. Moderate for preferences; weak for incoming calls in particular (quotes only).
- Takeaway for Sioul: written first; the calls of close people stay welcome (with family, the phone ranked above letters only, below text and face-to-face).
6.3 Raymaker DM, McDonald KE, Ashkenazy E, et al. 2017. Barriers to healthcare: instrument development and comparison between autistic adults and adults with and without other disabilities. Autism 21(8):972–984. doi:10.1177/1362361316661261 — verified (Crossref, PubMed 27663266); full text read.
- 209 autistic against 173 non-disabled adults: "cannot process information fast enough to participate in real-time discussions" 32% against 1%; "fear or anxiety keeps me from getting primary care" 35% against 10%.
- Cross-sectional, participatory. Moderate; no item on the phone itself.
- Takeaway for Sioul: a live call is the real-time exchange a third of autistic adults cannot keep up with; asynchronous is the accommodation.
6.4 Uncertainty, and speech that may go. Jenkinson R, Milne E, Thompson A. 2020. The relationship between intolerance of uncertainty and anxiety in autism: a systematic literature review and meta-analysis. Autism 24(8):1933–1944. doi:10.1177/1362361320932437 — verified (Crossref, PubMed 32564625): intolerance of uncertainty and anxiety correlate at r = 0.62 (95% CI 0.52–0.71) in autistic samples aged 4 to 24; cross-sectional studies. Zisk & Dalton 2019 (pause note 1.1g): speech in speaking autistic adults may be "intermittent, unreliable, and/or insufficient".
- Moderate for the link, in young people; no study tests calls.
- Takeaway for Sioul: an unknown number at an unknown time is the uncertain event par excellence, and a call must be answered by voice when speech may not be there. Predictability (who called, why, when they will call again) is the remedy as much as silence; blocking alone swaps one uncertainty for another ("what did I miss?").
6.5 What helps, with evidence.
- Gurol-Urganci I, de Jongh T, Vodopivec-Jamsek V, Atun R, Car J. 2013. Mobile phone messaging reminders for attendance at healthcare appointments. Cochrane Database Syst Rev (12):CD007458. doi:10.1002/14651858.CD007458.pub3 — verified (Crossref, PubMed 24310741); abstract only. Text reminders against reminder calls: attendance RR 0.99 (0.95–1.02), three trials, 2,509 people, general population. Moderate. Takeaway: asking a service to text instead of calling loses nothing.
- McClain C, Pew Research Center, 14 December 2020, "Most Americans don't answer cellphone calls from unknown numbers" (https://www.pewresearch.org/short-reads/2020/12/14/most-americans-dont-answer-cellphone-calls-from-unknown-numbers/): 10,211 US adults, probability panel: 80% do not answer unknown numbers; 67% let it ring and check voicemail; 14% ignore the voicemail too. Moderate, one country. Takeaway: letting unknown numbers go to voicemail is ordinary, not exotic; the risk is the call nobody ever looks at.
- No study was found that tests call screening, voicemail transcription or text-first contact with autistic people (or anyone) and measures stress or missed care; none compares unexpected with scheduled calls; none measures what blocking costs.
What this says. The evidence supports, moderately, that phone contact is a major barrier for most autistic adults and that written, predictable contact helps. "Preventing unexpected calls is paramount" goes beyond the studies, which are about the phone in general and mostly about calling out; the case for screening rests on stated preferences and a plausible mechanism, and the case for transcripts and a list of who called on the 61% who avoid voicemail too.
7. Safety: what must never be blocked unseen¶
7.1 Emergency services call back from a number the person does not know. In France, from 0 800 112 112 since 1 October 2024 (pause note 1.7k; crates/sioul-core/data/crisis-lines.toml, kind callback); and since 1 January 2026 an emergency centre may call back showing the emergency number itself: ARCEP authorises "que des numéros d'urgence soient utilisés en tant qu'identifiant d'appelant pour des appels et des messages dès lors que la communication est émise directement par un centre de réception des communications d'urgence" (so that people "seront donc plus à même de décrocher rapidement cet appel"; ARCEP decision n° 2025-2215 of 27 November 2025, § 5.3, https://www.arcep.fr/uploads/tx_gsavis/25-2215.pdf, read 6 October 2026). Android lets every filter be skipped only in emergency callback mode, for calls the network marks as emergency ones, and after an emergency SMS (1.1); the platform's blocked list pauses for two hours after an emergency call (1.7), but a screening app is still asked during those hours. Apple's rule: "If you call emergency services, call screening turns off for 24 hours" (https://support.apple.com/en-us/111106, "Manage unknown callers on iPhone", published 14 September 2026, read 6 October 2026). Sioul's screening service also sees the person's outgoing calls, with the number dialled (1.4), and TelephonyManager.isEmergencyNumber (API 29) tells an emergency number; no exclusion of outgoing emergency calls from the screening app's caller-ID stage was found in CallsManager.startOutgoingCall (android15-release). SpamBlocker relies on exactly that: its "emergency situation" lets every call through for 120 minutes by default after an outgoing call to an emergency number seen in onScreenCall (service/CallScreeningService.kt, updateOutgoingEmergencyTimestamp; section 4); that it works on a given phone still needs a test.
- Primary (Android source, ARCEP's decision, Apple's page); SpamBlocker's code (source); the rule is an inference.
- Takeaway for Sioul: an incoming call whose number is an emergency number, or the national callback number, always rings; after the person calls an emergency number, every call rings for 24 hours; and if the test shows outgoing emergency calls never reach the screening service, Sioul needs another witness of them (reading the call log,
READ_CALL_LOG, at each incoming call) before it may block anything.
7.2 Health and care call from numbers nobody can save. A health district: "When our community or patients receive a call from one of our hospitals or health services, the call is displayed as 'private numbers' or 'no caller ID'" (South Western Sydney Local Health District, NSW Health, consultation page "Who's calling?", https://engage.swslhd.health.nsw.gov.au/whos-calling, undated, read 6 October 2026). NHS Shetland's protocol (2021, version 1.3, https://nhsshetland.scot/downloads/file/216/protocol-for-leaving-telephone-messages) shows one number that "can't be called back" and recommends "that messages are not left on mobile telephones". Patients not reached by a reminder call missed more appointments (Teo AR et al. 2017, Psychiatric Services 68(11):1098–1100, doi:10.1176/appi.ps.201700128 — verified; weak, observational). Apple: "Add important numbers to your Contacts—family, friends, your child's school, your doctor's office". French practice was not checked.
- Opinion (official documents), weak (study).
- Takeaway for Sioul: "unknown numbers to voicemail" can lose a hospital's call without a trace, since it may leave no message. Hence: hidden numbers are never rejected in the hours when such calls come unless the person chose it knowingly; an "I am expecting a call" window (from a callback asked, an appointment, a task waiting on a call) lets unknown and hidden numbers ring; a category for care (doctor, pharmacy, hospital switchboard, the carer) that rings whatever the time but sleep, as the person sets it.
7.3 Repeat callers. Android's do-not-disturb lets a second call within 15 minutes through, but never remembers a call a screening app disallowed (2.1). Takeaway for Sioul: Sioul counts calls itself: a second call from the same number within 15 minutes rings, whatever the rule, except numbers the person blocked by name; two hidden-number calls cannot be told apart (open question).
7.4 Never unseen, never counted. Every call Sioul silences or sends to voicemail is in the phone's call log anyway (1.3: Sioul cannot hide it, and should not). Sioul's own list says, when the person may be reached again (after sleep, after a pause, at the next time that lets that caller through, never as an interruption): who (the contact's name and category, or "a number not in your contacts", or "a hidden number"), when, whether they called twice; with Call back, Text back, Add to contacts, Always let through, Block this number. No count, no badge, no red; doubt said plainly ("Sioul cannot see whether they left a message").
- Inference from 6.1–6.4, 7.2 and Sioul's rules (no count, no badge: design.md; research.md, rule 2).
7.5 Failing open. No answer in five seconds, a crash, a binding that fails, or the phone not yet unlocked after a restart: Android rings the call as usual (1.4). Sioul's table of rules carries the times of the coming days; once past them, only the rules that hold at any time apply (numbers and prefixes the person blocked), never the quiet of a time Sioul can no longer compute. An on-call worker (French labour law's astreinte, Code du travail L3121-9, https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000033020484) must be able to switch every rule off in one press, as "Work now" does for work.
7.6 The law, in a few lines (read on 6 October 2026, primary texts; not legal advice).
- Rejecting, silencing and sending one's own calls to voicemail need nobody's consent; EU law calls rejecting calls whose number is withheld "the right of the called party to reject calls from unidentified lines" (Directive 2002/58/EC, recital 34 and Art. 8(3), https://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri=CELEX:02002L0058-20091219), and French operators must offer it "par un moyen simple" (CPCE art. D98-5, II 4°, https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000044164596). No rule obliging anyone to answer a call was found.
- Recording or transcribing a live caller's words without telling them is an offence in France (Code pénal art. 226-1 and 226-2, https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000006417929); a message the caller chose to leave after a greeting is not that (reading of the text; no decision found). A synthetic voice answering callers must tell them it is an AI (Regulation (EU) 2024/1689, Art. 50(1), applicable from 2 August 2026, open-source software not exempt: https://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri=CELEX:32024R1689).
- Lists kept only on the person's own devices fall under the GDPR's household exemption (Art. 2(2)(c), recital 18); a server run by the developer would not.
- Installing a means to intercept someone else's calls is an offence, heavier between partners (Code pénal art. 226-15, https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000042193573).
- Takeaway for Sioul: screen, silence and divert freely; never record, never answer with a voice; keep everything on the person's devices; never show one person another person's calls (the sharing carries rules and lists between the person's own devices only).
8. Design for Sioul¶
A proposal, built on sections 1 to 7. Each part says whether it rests on a source ("from the source", "from research"), is a guess to try with the people concerned ("a guess"), or can only be settled on a phone ("needs a test").
8.1 What Sioul becomes: the "Caller ID & spam app", not the phone app. Sioul holds Android's call-screening role and READ_CONTACTS (asked already for do-not-disturb), on Android 10 to 16 (from the source: 1.2, 1.6). It never answers, records or rings a call itself; the person's phone app stays theirs.
- A
CallScreeningServicein Java (android:permission="android.permission.BIND_SCREENING_SERVICE"), in a small process of its own so that Telecom never waits for Qt (a guess; its start-up time on a 2019 phone needs a test), deciding from a table Rust wrote ahead (1.4), answering in milliseconds, writing each decision to a log Rust reads (calls/held.jsonl, say). - Rust (
sioul_core): the rules, the person's lists and categories matched by number key (sioul_core::phones::key), the times of the coming days (as the home card's frames, android.md), written as the table whenever any of them changes. - On Android 9, or when the role is refused or held by another app: Sioul's do-not-disturb by time and the guided options (2.4) only, and the settings say so.
- What only the phone app could add (1.5): Android 9, the line called on a dual-SIM phone, the phone's voicemail, the platform's blocked list, ringing per person. Not worth a phone app of Sioul's own (from the source; the judgment is a guess).
8.2 The rules: one matrix for mail and calls. Calls follow "Who may reach you, and when" (porch.md, "Who may write to you"): the same rows (safe, neutral, restricted, with contacts' categories on them), the same five times; a call from someone whose mail may come now rings, otherwise it goes to voicemail and waits on the list. Two rows are added for calls: Numbers not in your contacts and Hidden numbers; each box may also say Silent (shown, no sound). Proposed starting values (a guess, to try):
| Who | Work | Admin | Leisure | Meals | Sleep |
|---|---|---|---|---|---|
| Safe | rings | rings | rings | rings | the do-not-disturb list's people ring (starred, so that Android's mode lets them through); the others, voicemail |
| Neutral | rings | rings | voicemail | voicemail | voicemail |
| Restricted | rings | voicemail | voicemail | voicemail | voicemail |
| Numbers not in your contacts | voicemail | voicemail | voicemail | voicemail | voicemail |
| Hidden numbers | silent | silent | voicemail | voicemail | voicemail |
| Blocked | voicemail, always, not listed one by one |
The "numbers not in your contacts" row is the rule asked ("silenced to voicemail"); hidden numbers stay silent but visible in working and admin hours because hospitals call that way (7.2, 3.4). During a pause, calls follow the sleep column, as everything else does (areas.md: the pause "holds everything Sioul shows, whatever the time, as sleep does").
8.3 The order of the decision (from the projects' engines, section 4, and the safety section; the order is a guess to check):
- Always rings (floors, from 7.1, 7.5): a caller ID that is an emergency number or the national callback number (
crisis-lines.toml); any call within 24 hours of the person calling an emergency number; "Answer every call" switched on (on call, a single press, until it is switched off, shared as "Work now" is); the people on the do-not-disturb list. - Blocked by the person (their number, or a category marked blocked): voicemail, even when they call again.
- Repeat caller: a second call from the same number within 15 minutes rings (7.3); not for blocked numbers.
- "I am expecting a call" (a callback asked, an appointment that day, a task waiting on a call; or by hand, for an hour or a day): numbers not in the contacts and hidden numbers ring in that window.
- A known person: their own entry, then their contact card's categories, then the matrix for now (as
porch::Senders::judgedoes for mail). - A number the person called or answered in the last days counts as neutral (SpamBlocker's and Silence's "dialled" and "answered" rules; the number of days is a guess).
- Numbers that cannot be real (3.3) and automated calls (the NPV roots, 3.2): voicemail, folded together in the list; the public-interest roots follow the "not in your contacts" row.
- Any other number not in the contacts, then hidden numbers: their rows.
- Nothing decided in time, no table, a table past its last frame: Android rings the call (1.4, 7.5); past its frames, only steps 1 to 3 and 7 apply.
8.4 Where the rules live. Shared through Sioul's sharing, as the do-not-disturb list is (android.md, "Pauses"; the do-not-disturb work's config/dnd-people.toml): the matrix's rows for calls (with the settings, as [reach]), numbers on the four lists (beside the addresses, as tel: lines: a guess), the categories (on the contact cards), the switches for automated calls and impossible numbers, "Answer every call". Per phone: whether this phone screens (the role and the permission), the 24-hour window after an emergency call, the log of calls held. People on the do-not-disturb list ring at every time, sleep and pauses included, and are starred on each phone by the person (guided), so that Android's own mode lets them through as well. Whether the log of calls held travels to the computer (to read on the Porch there) was an open question; the owner answered it on 7 October 2026: it does, sealed, a part of the sharing of its own (porch.md, "Calls declined").
8.5 What the person sees.
- During: nothing for a call sent to voicemail (
setSkipNotification(true)); a silent call shows as the phone app shows calls; the phone's own call history lists both, with Sioul's name (1.3). - After, at the next time those callers may reach the person (after sleep, after a pause, at the next work hours for a work caller), on the Porch and in the notification Sioul already sends for mail at those times: a short list, never a count, never a badge (7.4): "While you slept: Dr Martin's office called at 08:12. A number not in your contacts called twice, at 09:30 and 09:41." Each line: Call back, Text back (Android's SMS app, filled), Add to contacts, Always let through, Block (and "Block calls and texts on this phone" opens Android's blocked-numbers page, 1.7). Automated calls and impossible numbers fold under one line. Each says why, on request: "Numbers not in your contacts go to voicemail in leisure time."
- Doubt said, never hidden: Sioul cannot see the voicemail (5.1): "They may have left a message."
- Text first: the list offers a written answer before a call (6.1–6.5), and the setup suggests the person's voicemail greeting say "send me a text" (a guess).
8.6 Setting it up (a guess for the wording; the steps from 1.6 and section 7):
- One page: what Sioul will do (send to voicemail, ring silently, list who called; ringing silently was dropped since, CS3), what it never does (answer, record, listen, send a number anywhere: no server, no lookup), what always rings (emergency numbers and callbacks, a second call within 15 minutes, everyone for a day after you call an emergency number).
- Android's question "Set Sioul as your caller ID & spam app?" (the role); then the contacts permission, if not given yet.
- If the phone app screens spam itself (Google's Phone app does), one sentence: holding the role replaces its filter (1.1). And one more: Android's own "block numbers not in contacts" (1.7) acts before Sioul is asked, so Sioul's exceptions (a second call, an expected call) cannot apply while it is on; Sioul cannot read that switch (a system setting), so it says where it is.
- The people who must always get through: the do-not-disturb list, a carer, a "care" category (doctor, pharmacy, hospital switchboard), with the suggestion to add their numbers to the contacts (Apple gives the same advice, 7.2).
- A try: "Ask someone to call you": the list shows what Sioul did and why.
8.7 Texts. Sioul does not filter SMS (1.10): do-not-disturb keeps texts silent at the times set; a number blocked for good is blocked by the person on Android's own page, which then drops its calls and texts for every app (1.7).
8.8 Transcripts. When the operator sends voicemail as audio (by e-mail, where offered; section 5), Sioul could transcribe it on the device with an open engine (5.3) and put the text in the list: accuracy on French telephone audio needs a test before any of it is shown.
Design criteria for Sioul¶
Numbered rules for call screening, each with the entries it rests on. "Inference" marks a rule that combines sources or extends them; values marked "default" are starting points to try with the people concerned, not findings.
Becoming the screening app
CS1. Sioul screens calls as Android's call-screening role holder with READ_CONTACTS (Android 10 to 16), never as the phone app; on Android 9, or without the role, it says so and falls back to do-not-disturb by time and the person's own options (stars, "Route to voicemail", the blocked list). — 1.2, 1.5, 1.6, 2.4.
CS2. The decision is made in Java from a table Rust wrote ahead, in milliseconds; the screening service never loads Sioul's Rust library or Qt; whatever it cannot decide in time rings. — 1.4, 7.5; inference.
CS3. Three outcomes only: ring, ring silently, voicemail. No post-call screen, no overlay over the phone app, no bot answering, no recording, no listening. — 1.3, 5.2, 7.6. Decided otherwise (7 October 2026, the attention model): two outcomes, ring or voicemail, a call sent to voicemail listed after; the rest of the rule holds (attention.md, §1.5).
CS4. Before asking for the role, Sioul says that holding it replaces the phone app's own spam filter where there is one. — 1.1.
The rules CS5. Calls follow the same "Who may reach you, and when" matrix as mail, with two rows added (numbers not in the contacts, hidden numbers) and a third state, "silent"; a person's own entry, then their card's categories, decide as for mail. Defaults in 8.2. — 8.2, porch.md; inference. Built otherwise: calls follow the one attention matrix, with rows of their own (strangers' numbers and hidden numbers among them) and no "silent" state (attention.md). CS6. A number in the phone's Android contacts, though not in Sioul's address books, counts as known. — 1.2, 3.1. CS7. The order of the decision is fixed and can be read in the settings: floors; blocked; repeat caller; expecting a call; known person; numbers called or answered lately; impossible and automated numbers; other numbers not in the contacts; hidden numbers; ring by default. — 8.3, section 4. CS8. Floors no rule overrides: an incoming emergency number or the national callback number rings; every call rings for 24 hours after the person calls an emergency number; "Answer every call" (on call) is one press away; the do-not-disturb list's people ring at every time. — 7.1, 7.5, 2.1. CS9. A second call from the same number within 15 minutes rings, unless the person blocked that number; Sioul counts it itself, since Android's repeat-caller memory never sees a call Sioul held. — 2.1, 7.3. CS10. "I am expecting a call", set from a callback asked, an appointment or a task waiting on a call, or by hand, lets numbers not in the contacts and hidden numbers ring while it lasts. — 7.2, 6.4; inference. CS11. Hidden numbers are named for what they are since 2026 (a person who hides, a hospital's switchboard, a number from abroad that failed authentication) and are not sent to voicemail in working and admin hours unless the person chooses it knowingly. — 3.4, 7.2. CS12. ARCEP's automated-caller roots (NPV) and the caller IDs that cannot be real (089, unattributed blocks) ship as data with their source, the plan's version and the date checked, each a category of its own, sent to voicemail and folded by default; the public-interest roots are a separate category, not blocked by default; the data is checked before each release, as the crisis lines are. — 3.2, 3.3; pause note P13. CS13. No lookup leaves the phone: no reputation server, no crowd-sourced database, no hashed number sent anywhere; any list is offline, downloaded only with the person's yes and with nothing sent but a country code. — section 4, 7.6. CS14. Prefix and range rules are E.164 prefixes with an exact length; regular expressions stay an advanced option. — 3.7, section 4.
What the person sees CS15. During a held call, nothing. After, at the next time those callers may reach the person, a short list, no count, no badge: who, when, twice or not, why, and Call back, Text back, Add to contacts, Always let through, Block. — 7.4, 6.1–6.5, design.md. CS16. Nothing is hidden: held calls stay in the phone's call history with Sioul's name; the list says plainly what Sioul cannot know ("They may have left a message"). — 1.3, 5.1; Sioul's rule on doubt (health.md). CS17. Written first: the list offers a written reply before a call, and the setup suggests a voicemail greeting that asks for a text. — 6.1–6.5; inference. CS18. Transcripts only from audio Sioul legitimately holds (the operator's voicemail by e-mail), made on the device, never acted on, and shown only once their accuracy on French telephone audio is tested. — 5.1–5.3, 7.6.
Sharing, texts, setup CS19. Rules, lists, categories and switches travel through Sioul's sharing between the person's own devices; the role and the emergency window belong to each phone; the log of calls screened travels sealed between the person's own devices, while its part is on (7 October 2026: the owner's request); nothing ever shows one person another person's calls. — 8.4, 7.6. CS20. Sioul does not filter texts: do-not-disturb keeps them silent at the times set; "Block calls and texts on this phone" opens Android's blocked-numbers page for the person to confirm. — 1.10, 1.7. CS21. Setup: one page on what Sioul does, never does, and what always rings; Android's role dialog; the contacts permission; the people who always get through and a "care" category; a try with a real call. — 8.6, 1.6, 7.2.
Open questions¶
- Hidden numbers: the code passes them to
onScreenCallwith a null number; the Javadoc (Android 12 and later) says they are not provided. Test on /e/OS, and on Android 15 or 16 if at hand. - Android 10: the code passes every call, contacts included, when the carrier configures no screening app, whatever the permissions; Silence's README hints the same ("If the app rejects calls from contacts on Android 10, allow Contacts permission manually"). Test if an Android 10 phone is at hand.
- Reject or not: which of "rejected" and "left ringing" sends the caller to voicemail with each French operator, after how long, and what the caller hears.
- A silent call: does /e/OS's phone app light the screen, show it full screen, leave a missed-call notification? (SpamBlocker reports that Android 16 shows a missed-call notification for every silenced call.)
- Outgoing emergency calls: does Telecom hand them to the screening service (no exclusion found in the code; SpamBlocker relies on it)? If not, Sioul needs the call log as a witness before blocking anything. Never test by calling a real emergency number: ordinary outgoing calls can be checked freely; Android has a test mode that adds a number to the emergency list (
adb shell cmd phone emergency-number-test-mode -a <number>,TelephonyShellCommand, android12-release), but whether the network then routes such a call to emergency services was not checked, so it is no safe test either until that is known. - Two hidden calls within 15 minutes: the same caller or not? Letting the second ring helps a hospital and lets a spoofer through.
- The matrix's defaults (8.2), above all for numbers not in the contacts in working hours: voicemail as asked, or silent?
- Numbers called or answered lately: for how many days do they count as known?
- The list on the computer: one place to read who called, or the phone's calls shown where they do not belong? Answered (7 October 2026): on each of your devices, at the times your rows allow, behind a setting on by default (porch.md, "Calls declined").
- Voicemail audio: which French operators send voicemail by e-mail, in which format; how accurate French transcription is on telephone audio; whether a wrong transcript does more harm than none.
- MAN: what
getCallerNumberVerificationStatus()reads on Orange, SFR, Bouygues Telecom and Free (expected: not verified, every call). - Speed: how long a cold start of the screening process takes on a 2019 phone, against Telecom's five seconds.
- /e/OS: whether its settings offer "Caller ID & spam app" and grant the role.
- "Route to voicemail": whether contacts synced by DAVx⁵ keep it across syncs, if the guided fallback is offered.
- Texts: whether hiding the SMS app's notifications for unknown senders (a notification listener, as Saracroche does) is worth its restricted permission, given that it hides without blocking.
- The premise: the evidence supports written, predictable contact more than blocking (section 6); whether people prefer "voicemail and a list" or "a silent ring" for unknown callers is untested.
Sources checked (verification log)¶
- Android source (6 October 2026): files fetched from android.googlesource.com (
?format=TEXT) atandroid10-releasetoandroid16-releaseand at the tagsandroid-10.0.0_r1,android-11.0.0_r1,android-12.0.0_r1: Telecom'sCallsManager,callfiltering/*(CallScreeningServiceControllerandIncomingCallFilterfor Android 10;CallScreeningServiceFilter,IncomingCallFilterGraph,DirectToVoicemailFilter,BlockCheckerFilter,DndCallFilter,CallFilteringResultfor 11 to 16),ParcelableCallUtils,CallScreeningServiceHelper,Timeouts,TelecomServiceImpl,Ringer,RingtoneFactory, the Android 10 controller's test; frameworks/base'sCallScreeningService,Call,InCallService,TelecomManager,CallerInfo,BlockedNumberContract,VoicemailContract,VisualVoicemailService,CarrierConfigManager,ZenModeFiltering,ZenModeHelper,NotificationManagerService,core/res/AndroidManifest.xml,core/res/res/values/config.xml; telephony'sInboundSmsHandler; ContactsProvider'sVoicemailPermissions; Contacts' menu and strings; Permission'sroles.xml,strings.xmlandEnhancedConfirmationService; CarrierConfig's assets for Orange, SFR, Bouygues Telecom and Free. The commit history pages need a login, so the first release of a change was found by reading the tagged versions. API levels from the SDK'splatforms/android-36/data/api-versions.xml. - /e/OS:
e/os/android_packages_services_Telecomm(branchesv1-sanda15) compared with AOSP through gitlab.e.foundation's API; /e/OS's dialer, manifest and configuration compared with LineageOS's by a sub-agent (GitLab comparison API). - Open-source projects: repositories cloned (
--depth 1) and read by a sub-agent; Saracroche's block flags and permissions, Silence's hidden-number test, and SpamBlocker's emergency window and caller-name reading re-read in the clones. Exodus Privacy reports read on 6 October 2026. - France: ARCEP decisions n° 2022-1583 and n° 2025-2215 read in full by a sub-agent; the NPV table (plan § 2.3.7 a) and § 5.3 on emergency numbers as caller ID re-read in the text. MAJNUM counts are the sub-agent's, from the CSV of 15 September 2026. Quotes re-checked at the source: bloctel.gouv.fr (end of Bloctel), Free's articles 883 and 940.
- Research on people: every DOI in section 6 resolved on Crossref and PubMed (sub-agent); Doherty et al. 2022's figures re-read in the full text (Europe PMC, PMC8883251). Apple's "turns off for 24 hours" re-read on its page; NHS Shetland's protocol re-read in its PDF (the link was corrected to its current address); the vendor and health-service pages answered on 6 October 2026.
- Law (section 7.6): EUR-Lex and Légifrance texts read by a sub-agent, quotes as given; not legal advice.
- Not checked: that hidden-number calls reach
onScreenCallon a real phone (code says yes, documentation no); Android 10's behaviour on a real phone; whether French operators send a caller-verification result (none documented); SFR's offers and the voicemail-by-e-mail offers of Orange, SFR and Bouygues Telecom (their help pages could not be read automatically); Bouygues' on-screen label wording (press only); the ministerial order (arrêté) naming who may use the public-interest numbers, none of which was attributed on 15 September 2026; French hospitals' calling practice; accuracy of French transcription on telephone audio; anxiety, ADHD and trauma literature (left out on purpose). - No reference in this note was invented. Where a claim rests on a page that could not be read, it says so.