NIHAL T P

Automatically adjust contact ringtones based on missed and answered calls.
A smart, automated Android utility that dynamically changes and escalates contact ringtones based on call behavior (missed, rejected, or answered calls). Built with Jetpack Compose and Kotlin, it integrates directly with the Android Contacts Provider to safely manage per-contact custom ringtones.
Basically this app is made so that i will attend more calls. I usually don't attend calls from some contacts, so this app will change their ringtone to a set ringtone as they call me more and more.
For me personally, i have set a ringtone that will shame me if i don't attend calls for sometime. I will assure you, this has helped me attend more calls.
Download the latest APK directly from the GitHub Releases page.
Available on my F-Droid repository:
Repository URL:
https://nihaltp.github.io/fdroid/repo/
Open Repo Page and scan the QR code.
graph TD
A[Incoming Call] --> B{Call Status}
B -->|Missed| C[Score +1 π]
B -->|Rejected| D[Score +2 π«]
B -->|Answered| E[Score Reset to 0 β
]
A2[Outgoing Call] --> E
C --> F{Update Contact Ringtone}
D --> F
E --> F
F -->|Score = 0| G[Restore Default Ringtone]
F -->|Score >= 1| H[Set Ringtone from Sequence: index = Score - 1]
H -->|Score > List Length| I[Cap at Final Ringtone in Sequence]
The app assigns a Call Score (starting at 0) to each contact. When contacts call you, their score changes based on your response:
+1 π+2 π«0 β
You configure a ordered list (sequence) of custom ringtones in the app. As a contact's Call Score escalates, their custom ringtone shifts through this sequence:
index = score - 1). If the score exceeds the list length, it caps at the final (often loudest/most urgent) ringtone in the sequence.This escalation system ensures that contacts trying to reach you repeatedly receive louder, more attention-grabbing ringtones until you answer or call them back, at which point their ringtone resets to default.
0, restoring their default ringtones.Smart Ringtone is designed to run automatically in the background, but there are a few simple setup and configuration steps to get the most out of it.
When you first open the app, you will be prompted to grant the necessary permissions. These are essential for the app to function:
READ_CONTACTS, WRITE_CONTACTS): Allows the app to read your contact list and update custom ringtones directly on each contact's card.READ_PHONE_STATE, READ_CALL_LOG): Allows the app to detect incoming calls, read call status (missed/rejected/answered), and adjust contact scores accordingly.READ_EXTERNAL_STORAGE, READ_MEDIA_AUDIO): Allows the app to access, select, and read custom audio files from your device's internal storage to use as custom contact ringtones.POST_NOTIFICATIONS): Used to display background sync status progress notifications during bulk contact updates.Head over to the Ringtones tab. This is where you configure the sequence of ringtones used for escalation:
The Contacts tab lists all the contacts on your device:
0.0.You can keep track of how contact scores change in real time:
[!IMPORTANT] Rescanning will reset all scores to
0and recalculate everything from the beginning of your system call log.
Navigate to the Settings tab to fine-tune the app:
[!WARNING] Before uninstalling Smart Ringtone, you should pause the customization service to clean up your contact ringtones.
ViewModel, ComponentActivity)Gson serialization for complex entities)BroadcastReceiver (CallReceiver) monitors phone state transitions.ContactsContract (Contacts Provider) queries contact details and updates per-contact custom ringtone URIs.CallLog content provider to query and process recent calls.To operate in the background and modify ringtones, the app requires:
READ_CONTACTS, WRITE_CONTACTS): Needed to read your contact list and write custom ringtones back to individual contact cards.READ_PHONE_STATE, READ_CALL_LOG): Required to monitor incoming calls and process call logs to update contact scores.READ_EXTERNAL_STORAGE for Android 12 & below, READ_MEDIA_AUDIO for Android 13+): Required to let users browse, select, and read custom ringtones from the device's local storage.POST_NOTIFICATIONS): Required on Android 13 (API 33) and above to show the sync status progress notification during batch updates.To build the debug APK:
./gradlew assembleDebug
If you have an Android device or emulator connected with adb enabled, you can run the provided PowerShell utility to build and deploy the correct architecture-specific APK:
./debug.ps1 -BuildType debug
This project enforces ktlint for code style rules. Lint checking and formatting are run on commit via pre-commit hooks.
Initialize Pre-commit Hooks:
pre-commit install
Run Linter Check:
./gradlew ktlintCheck
Auto-Format Code:
./gradlew ktlintFormat
Smart Ringtone is free software: you can redistribute it and/or modify it under the terms of the MIT License. See the LICENSE file for more details.
NIHAL T P
Building a dev tool or hiring developers? Get seen here. Become our Sponsor
Building a dev tool or hiring developers? Get seen here. Become our Sponsor