Xcall Mobile
Android softphone that rings on the system call screen, one APK serving two brands.
One signed APK serving two brands, where an incoming call looks and behaves like any other call the phone receives.
A SIP calling app for Android, built so it behaves like the phone's own dialer rather than an app you have to be inside to receive a call. Signalling runs over JsSIP on a WebSocket with react-native-webrtc carrying the audio, and incoming calls raise the native Android call screen through CallKeep. One codebase and one signed APK serve two brands — Xcall and SeloraX — with the brand chosen at run time.
Problem
A softphone that only rings while the app is open in the foreground is a phone that misses calls. To be usable at all it has to ring on a locked screen, show the system call UI, and keep working after Android has decided the app is idle.
Constraint
Android aggressively suspends background work, and a SIP call arrives over a socket that has to still be alive when it does. The same binary also had to ship under two brands, so a second app in the store was not an option.
Decision
Signalling over JsSIP on a WebSocket with react-native-webrtc for audio, wired into CallKeep so an incoming call raises the real Android call screen instead of an in-app banner. A foreground service plus Firebase push keeps the connection reachable while the app is backgrounded, and the brand is selected at run time so both ship from one APK.
Tradeoff
CallKeep and the foreground-service library both needed local patches through patch-package. Carrying patches against native libraries is real maintenance debt on every React Native upgrade — the alternative was writing the native call-screen integration twice, once per platform, and owning that instead.
Result
One signed APK serving two brands, where an incoming call looks and behaves like any other call the phone receives.