mirror of
https://github.com/screentinker/screentinker.git
synced 2026-08-14 06:16:20 -06:00
The player has a launcher (category.HOME) + a boot receiver, but auto-start was unreliable where you can't set a home launcher (Android TV) and on Android 14+, where USE_FULL_SCREEN_INTENT is auto-revoked for non-calling apps so the boot full-screen launcher silently no-ops. Boot launch: - BootReceiver now does a direct background startActivity when 'display over other apps' (SYSTEM_ALERT_WINDOW) is granted — a real exception to the bg-activity-launch restriction, and the one path that works on Android TV. Full-screen-intent notification kept as a fallback (locked screen / no overlay). - Boot notification moved to a dedicated HIGH-importance channel (full-screen intents are only honored from one), and it auto-dismisses once the UI is up. Setup screen — new permission rows so operators can grant what boot-launch needs: - Launch on Boot (USE_FULL_SCREEN_INTENT, shown on Android 14+) - Background Activity (battery-optimization exemption) - Display Over Apps (SYSTEM_ALERT_WINDOW) Made the screen scrollable and ~50% smaller text/buttons so all rows + Continue fit on one screen (incl. landscape signage). Install-Unknown-Apps subtitle now states updates are signature-verified, so it doesn't read as 'install anything'. Verified end-to-end on an Android 16 emulator: after reboot the app auto-launched (Direct launch via overlay) and the boot notice cleared itself; all rows toggle.
41 lines
1.4 KiB
Kotlin
41 lines
1.4 KiB
Kotlin
package com.remotedisplay.player
|
|
|
|
import android.app.Application
|
|
import android.app.NotificationChannel
|
|
import android.app.NotificationManager
|
|
import android.os.Build
|
|
|
|
class RemoteDisplayApp : Application() {
|
|
|
|
companion object {
|
|
const val CHANNEL_ID = "remote_display_service"
|
|
const val CHANNEL_NAME = "ScreenTinker Service"
|
|
// Separate HIGH-importance channel for the boot full-screen-intent launch.
|
|
// A full-screen intent is only honored from a high-importance channel.
|
|
const val BOOT_CHANNEL_ID = "remote_display_boot"
|
|
}
|
|
|
|
override fun onCreate() {
|
|
super.onCreate()
|
|
createNotificationChannel()
|
|
}
|
|
|
|
private fun createNotificationChannel() {
|
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
|
val manager = getSystemService(NotificationManager::class.java)
|
|
manager.createNotificationChannel(
|
|
NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_LOW).apply {
|
|
description = "ScreenTinker background service"
|
|
setShowBadge(false)
|
|
}
|
|
)
|
|
manager.createNotificationChannel(
|
|
NotificationChannel(BOOT_CHANNEL_ID, "ScreenTinker Startup", NotificationManager.IMPORTANCE_HIGH).apply {
|
|
description = "Launches the display on boot"
|
|
setShowBadge(false)
|
|
}
|
|
)
|
|
}
|
|
}
|
|
}
|