Repository navigation
Quick Settings Tiles
Essentials provides 25+ Quick Settings tiles that you can add to your notification shade for instant access to system settings and feature toggles. All tiles are managed in-app from the Quick Settings Tiles settings screen.
- Open Essentials → Quick Settings Tiles section
- Each tile has an "Add" button — tap it to add directly to your QS panel
- Or manually drag from the QS tile editor (pull down notification shade → tap pencil icon → find Essentials tiles)
| Tile | Service Class | Description | Permission |
|---|---|---|---|
| UI Blur | UiBlurTileService |
Toggle system UI blur/frosted glass effect | WRITE_SECURE_SETTINGS |
| Always on Display (AOD) | AlwaysOnDisplayTileService |
Toggle AOD on/off | WRITE_SECURE_SETTINGS |
| Tap to Wake | TapToWakeTileService |
Toggle tap-to-wake on/off | WRITE_SETTINGS |
| Refresh Rate | RefreshRateTileService |
Cycle through refresh rate modes (Auto/Fixed/Peak) |
WRITE_SECURE_SETTINGS (Pixel only) |
| Scale Animations | ScaleAnimationsTileService |
Toggle UI animations on/off | WRITE_SETTINGS |
| Adaptive Brightness | AdaptiveBrightnessTileService |
Toggle adaptive brightness | WRITE_SETTINGS |
| Dynamic Night Light | DynamicNightLightTileService |
Toggle app-based night light | — |
| Pocket Mode | PocketModeTileService |
Toggle pocket mode | ACCESSIBILITY |
| Tile | Service Class | Description | Permission |
|---|---|---|---|
| Sound Mode | SoundModeTileService |
Cycle Normal / Vibrate / Silent | ACCESS_NOTIFICATION_POLICY |
| Mono Audio | MonoAudioTileService |
Toggle mono audio output |
SHIZUKU/ROOT
|
| Tile | Service Class | Description | Permission |
|---|---|---|---|
| Notification Lighting | NotificationLightingTileService |
Toggle edge lighting | — |
| Flashlight Pulse | FlashlightPulseTileService |
Toggle flashlight notification pulse | — |
| Sensitive Content | PrivateNotificationsTileService |
Toggle notification content hiding on lock screen | — |
| Bubbles | BubblesTileService |
Toggle chat bubbles | WRITE_SECURE_SETTINGS |
| Tile | Service Class | Description | Permission |
|---|---|---|---|
| Caffeinate | CaffeinateTileService |
Toggle screen-on wake lock with timer options | POST_NOTIFICATIONS |
| Stay Awake | StayAwakeTileService |
Keep screen on while charging | WRITE_SETTINGS |
| Charge Optimization | ChargeQuickTileService |
Toggle charging optimization (limit to 80%) |
ROOT (Pixel only) |
| Maps Power Saving | MapsPowerSavingTileService |
Toggle Maps power saving mode |
SHIZUKU/ROOT
|
| Tile | Service Class | Description | Permission |
|---|---|---|---|
| Screen Locked Security | ScreenLockedSecurityTileService |
Toggle QS restriction when locked |
SHIZUKU/ROOT
|
| App Lock | AppLockTileService |
Toggle app lock on/off | ACCESSIBILITY |
| Lockdown | LockdownTileService |
Instantly enter lockdown mode | DEVICE_ADMIN |
| Tile | Service Class | Description | Permission |
|---|---|---|---|
| Private DNS | PrivateDnsTileService |
Cycle through DNS presets (Off / Auto / Custom) | WRITE_SECURE_SETTINGS |
| NFC | NfcTileService |
Toggle NFC on/off | — |
| USB Debugging | UsbDebuggingTileService |
Toggle USB ADB debugging | WRITE_SECURE_SETTINGS |
| Tile | Service Class | Description | Permission |
|---|---|---|---|
| Developer Options | DeveloperOptionsTileService |
Toggle developer options | WRITE_SECURE_SETTINGS |
| Flashlight | FlashlightTileService |
Torch with brightness control | — |
| App Freezing | AppFreezingTileService |
Freeze all selected apps |
SHIZUKU/ROOT
|
| Color Picker | ColorPickerTileService |
Open system color picker (Android 17+) | — |
| Restart SystemUI | RestartSystemUiTileService |
Restart SystemUI process |
SHIZUKU/ROOT
|
The Private DNS tile cycles through up to 4 modes with each tap:
- Off — No Private DNS
- Automatic — DNS over TLS with opportunistic encryption
-
Custom 1 — Your first preset hostname (e.g.,
dns.cloudflare.com) -
Custom 2 — Your second preset hostname (e.g.,
dns.adguard.com)
Configure your custom DNS hostnames from the Networks settings screen.
All Essentials tiles extend BaseTileService:
BaseTileService (TileService)
├── onTileClick() — Background execution logic for toggle/action
├── getTileState() — Returns ACTIVE / INACTIVE / UNAVAILABLE
├── getTileLabel() — Returns tile label string
├── getTileSubtitle() — Returns subtitle string (e.g., On/Off, timer remaining)
├── getTileIcon() — Returns dynamic icon resource
├── hasFeaturePermission()— Checks required permissions
└── isDeviceSupported() — Verifies hardware / OEM support
BaseTileService provides automatic haptic feedback, asynchronous coroutine dispatching on click, fallback to Shizuku/root shell for setting adjustments (getSecureInt, putSecureInt, getGlobalInt, putGlobalInt), and processing state animations.
Adding a Quick Settings tile to Essentials involves 6 core steps across the codebase:
Create a new Kotlin class in app/src/main/java/com/sameerasw/essentials/services/tiles/YourTileService.kt extending BaseTileService:
package com.sameerasw.essentials.services.tiles
import android.Manifest
import android.content.pm.PackageManager
import android.graphics.drawable.Icon
import android.service.quicksettings.Tile
import com.sameerasw.essentials.R
class YourTileService : BaseTileService() {
override fun getTileLabel(): String = getString(R.string.tile_your_feature)
override fun getTileSubtitle(): String {
return if (isFeatureEnabled()) getString(R.string.on) else getString(R.string.off)
}
override fun hasFeaturePermission(): Boolean {
return checkCallingOrSelfPermission(Manifest.permission.WRITE_SECURE_SETTINGS) == PackageManager.PERMISSION_GRANTED
}
override fun getTileIcon(): Icon? {
val iconRes = if (isFeatureEnabled()) R.drawable.rounded_feature_on_24 else R.drawable.rounded_feature_off_24
return Icon.createWithResource(this, iconRes)
}
override fun getTileState(): Int {
return if (isFeatureEnabled()) Tile.STATE_ACTIVE else Tile.STATE_INACTIVE
}
override fun onTileClick() {
val newState = if (isFeatureEnabled()) 0 else 1
putSecureInt("your_secure_setting_key", newState)
}
private fun isFeatureEnabled(): Boolean {
return getSecureInt("your_secure_setting_key", 0) == 1
}
}Add the service declaration under <application>:
<service
android:name=".services.tiles.YourTileService"
android:exported="true"
android:icon="@drawable/rounded_your_feature_24"
android:label="@string/tile_your_feature"
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
<intent-filter>
<action android:name="android.service.quicksettings.action.QS_TILE" />
</intent-filter>
<meta-data
android:name="android.service.quicksettings.TILE_CATEGORY"
android:value="android.service.quicksettings.CATEGORY_UTILITIES" />
</service>Define localized strings for title and about description:
<string name="tile_your_feature">Your Feature</string>
<string name="about_desc_your_feature">Description explaining what your feature tile does.</string>Add the entry to QsTileRegistry.ALL_TILES:
QsTileEntry(
titleRes = R.string.tile_your_feature,
iconRes = R.drawable.rounded_your_feature_24,
serviceClass = YourTileService::class.java
),Note:
QsTileRegistrypowers the Favorite QS Tiles Glance Widget (QsTilesWidget) and lock screen shortcuts. StandardBaseTileServiceimplementations have their active state, icon, and subtitles queried dynamically via reflection.
When tapped from the Favorite QS Tiles Glance Widget, actions route through QsTileActionRouter. Standard BaseTileService classes are executed headlessly by default. If your tile triggers an external service, controller, or custom flow, add an explicit branch in QsTileActionRouter.kt.
All tiles MUST be listed in the in-app tile manager screen so users can view permissions and tap "Add" to install them via StatusBarManager.requestAddTileService():
QSTileInfo(
titleRes = R.string.tile_your_feature,
iconRes = R.drawable.rounded_your_feature_24,
serviceClass = YourTileService::class.java,
permissionKeys = listOf("WRITE_SECURE_SETTINGS"), // "SHIZUKU", "ROOT", "ACCESSIBILITY", or emptyList()
aboutDescription = R.string.about_desc_your_feature,
categoryRes = R.string.cat_utils // e.g., R.string.cat_visuals, R.string.cat_privacy
)The Quick Settings Tiles settings screen in Essentials (QuickSettingsTilesSettingsUI.kt) provides:
- All available tiles categorized with their icons, descriptions, and about bottom sheets
- Real-time active state queries
- Quick "Add" button using
StatusBarManager.requestAddTileService()(Android 13+) - Interactive permission cards & guidance sheets for required permissions