Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
119 commits
Select commit Hold shift + click to select a range
77ee662
New translations strings.xml (Turkish)
sameerasw Apr 27, 2026
ca51b96
New translations strings.xml (Turkish)
sameerasw Apr 27, 2026
aa8d74c
New translations strings.xml (Spanish)
sameerasw Apr 27, 2026
1593754
New translations strings.xml (Turkish)
sameerasw Apr 28, 2026
2e80272
New translations strings.xml (Turkish)
sameerasw Apr 29, 2026
9eef5c4
New translations strings.xml (Turkish)
sameerasw Apr 29, 2026
c6e07c2
New translations strings.xml (French)
sameerasw Apr 29, 2026
133dfad
New translations strings.xml (Turkish)
sameerasw Apr 29, 2026
8a7eb94
New translations strings.xml (Turkish)
sameerasw Apr 29, 2026
aedf1c2
New translations strings.xml (Turkish)
sameerasw Apr 29, 2026
dcb7ca5
New translations strings.xml (Turkish)
sameerasw Apr 29, 2026
a655a3e
New translations strings.xml (Turkish)
sameerasw Apr 30, 2026
be4bbd4
New translations strings.xml (Turkish)
sameerasw Apr 30, 2026
462c6dc
New translations strings.xml (Arabic)
sameerasw Apr 30, 2026
8156587
New translations strings.xml (German)
sameerasw Apr 30, 2026
4001466
New translations strings.xml (Hebrew)
sameerasw Apr 30, 2026
62157ba
New translations strings.xml (Italian)
sameerasw Apr 30, 2026
e3f8a7c
New translations strings.xml (Japanese)
sameerasw Apr 30, 2026
d6d2279
New translations strings.xml (Polish)
sameerasw Apr 30, 2026
9a4ed9d
New translations strings.xml (Russian)
sameerasw Apr 30, 2026
2fb9101
New translations strings.xml (Portuguese, Brazilian)
sameerasw Apr 30, 2026
96317f0
New translations strings.xml (English)
sameerasw Apr 30, 2026
a6c6957
New translations strings.xml (Romanian)
sameerasw Apr 30, 2026
bd0b311
New translations strings.xml (French)
sameerasw Apr 30, 2026
8b568c3
New translations strings.xml (Spanish)
sameerasw Apr 30, 2026
a18f172
New translations strings.xml (Afrikaans)
sameerasw Apr 30, 2026
d8e294d
New translations strings.xml (Catalan)
sameerasw Apr 30, 2026
4cbbfaa
New translations strings.xml (Czech)
sameerasw Apr 30, 2026
3e64cae
New translations strings.xml (Danish)
sameerasw Apr 30, 2026
606b89c
New translations strings.xml (Greek)
sameerasw Apr 30, 2026
a73ea02
New translations strings.xml (Finnish)
sameerasw Apr 30, 2026
3cc200f
New translations strings.xml (Hungarian)
sameerasw Apr 30, 2026
7903652
New translations strings.xml (Korean)
sameerasw Apr 30, 2026
af9522c
New translations strings.xml (Dutch)
sameerasw Apr 30, 2026
0328780
New translations strings.xml (Norwegian)
sameerasw Apr 30, 2026
7f03ed4
New translations strings.xml (Portuguese)
sameerasw Apr 30, 2026
b6abd1a
New translations strings.xml (Serbian (Cyrillic))
sameerasw Apr 30, 2026
e09fa65
New translations strings.xml (Swedish)
sameerasw Apr 30, 2026
82ff78c
New translations strings.xml (Turkish)
sameerasw Apr 30, 2026
843e1fa
New translations strings.xml (Ukrainian)
sameerasw Apr 30, 2026
c6987eb
New translations strings.xml (Chinese Simplified)
sameerasw Apr 30, 2026
8fa2726
New translations strings.xml (Chinese Traditional)
sameerasw Apr 30, 2026
8abc693
New translations strings.xml (Vietnamese)
sameerasw Apr 30, 2026
73a7971
New translations strings.xml (Sinhala)
sameerasw Apr 30, 2026
1dd662a
New translations strings.xml (Acholi)
sameerasw Apr 30, 2026
52aab05
Update source file strings.xml
sameerasw Apr 30, 2026
030b8a6
New translations strings.xml (Arabic)
sameerasw Apr 30, 2026
c2b9e8a
New translations strings.xml (German)
sameerasw Apr 30, 2026
71c48f4
New translations strings.xml (Hebrew)
sameerasw Apr 30, 2026
51fc659
New translations strings.xml (Italian)
sameerasw Apr 30, 2026
a7d7dba
New translations strings.xml (Japanese)
sameerasw Apr 30, 2026
a4a9aa7
New translations strings.xml (Polish)
sameerasw Apr 30, 2026
a602fd3
New translations strings.xml (Russian)
sameerasw Apr 30, 2026
d3d888e
New translations strings.xml (Portuguese, Brazilian)
sameerasw Apr 30, 2026
2086416
New translations strings.xml (English)
sameerasw Apr 30, 2026
2768d7e
New translations strings.xml (Romanian)
sameerasw Apr 30, 2026
e7531ee
New translations strings.xml (French)
sameerasw Apr 30, 2026
7345984
New translations strings.xml (Spanish)
sameerasw Apr 30, 2026
897be6a
New translations strings.xml (Afrikaans)
sameerasw Apr 30, 2026
493e4b0
New translations strings.xml (Catalan)
sameerasw Apr 30, 2026
6093305
New translations strings.xml (Czech)
sameerasw Apr 30, 2026
dd6198b
New translations strings.xml (Danish)
sameerasw Apr 30, 2026
31d4b4e
New translations strings.xml (Greek)
sameerasw Apr 30, 2026
84ba346
New translations strings.xml (Finnish)
sameerasw Apr 30, 2026
5e46051
New translations strings.xml (Hungarian)
sameerasw Apr 30, 2026
019243e
New translations strings.xml (Korean)
sameerasw Apr 30, 2026
c1ec179
New translations strings.xml (Dutch)
sameerasw Apr 30, 2026
adc4123
New translations strings.xml (Norwegian)
sameerasw Apr 30, 2026
0b34c45
New translations strings.xml (Portuguese)
sameerasw Apr 30, 2026
faca99a
New translations strings.xml (Serbian (Cyrillic))
sameerasw Apr 30, 2026
5a63d07
New translations strings.xml (Swedish)
sameerasw Apr 30, 2026
6ebf3f9
New translations strings.xml (Turkish)
sameerasw Apr 30, 2026
b9e236d
New translations strings.xml (Ukrainian)
sameerasw Apr 30, 2026
fbfdf07
New translations strings.xml (Chinese Simplified)
sameerasw Apr 30, 2026
a401cd9
New translations strings.xml (Chinese Traditional)
sameerasw Apr 30, 2026
17b9e94
New translations strings.xml (Vietnamese)
sameerasw Apr 30, 2026
ae8758f
New translations strings.xml (Sinhala)
sameerasw Apr 30, 2026
0d0a80f
New translations strings.xml (Acholi)
sameerasw Apr 30, 2026
e55284c
Update source file strings.xml
sameerasw Apr 30, 2026
bd06244
New translations strings.xml (Arabic)
sameerasw Apr 30, 2026
8b4b0ca
New translations strings.xml (German)
sameerasw Apr 30, 2026
c4ada6f
New translations strings.xml (Hebrew)
sameerasw Apr 30, 2026
8c02886
New translations strings.xml (Italian)
sameerasw Apr 30, 2026
2647e4f
New translations strings.xml (Japanese)
sameerasw Apr 30, 2026
dc98d89
New translations strings.xml (Polish)
sameerasw Apr 30, 2026
7669947
New translations strings.xml (Russian)
sameerasw Apr 30, 2026
b2ffffb
New translations strings.xml (Portuguese, Brazilian)
sameerasw Apr 30, 2026
b8e806a
New translations strings.xml (English)
sameerasw Apr 30, 2026
4a3adaf
New translations strings.xml (Romanian)
sameerasw Apr 30, 2026
b2f2866
New translations strings.xml (French)
sameerasw Apr 30, 2026
fbe3317
New translations strings.xml (Spanish)
sameerasw Apr 30, 2026
f3f8da1
New translations strings.xml (Afrikaans)
sameerasw Apr 30, 2026
ca2e3ed
New translations strings.xml (Catalan)
sameerasw Apr 30, 2026
17464fb
New translations strings.xml (Czech)
sameerasw Apr 30, 2026
faa7ac3
New translations strings.xml (Danish)
sameerasw Apr 30, 2026
5f5f9ff
New translations strings.xml (Greek)
sameerasw Apr 30, 2026
2f9a8b3
New translations strings.xml (Finnish)
sameerasw Apr 30, 2026
26a93a9
New translations strings.xml (Hungarian)
sameerasw Apr 30, 2026
52866f5
New translations strings.xml (Korean)
sameerasw Apr 30, 2026
97ccb0b
New translations strings.xml (Dutch)
sameerasw Apr 30, 2026
3420a9b
New translations strings.xml (Norwegian)
sameerasw Apr 30, 2026
9ccf9ec
New translations strings.xml (Portuguese)
sameerasw Apr 30, 2026
c33ca70
New translations strings.xml (Serbian (Cyrillic))
sameerasw Apr 30, 2026
50ed285
New translations strings.xml (Swedish)
sameerasw Apr 30, 2026
e236a56
New translations strings.xml (Turkish)
sameerasw Apr 30, 2026
762029e
New translations strings.xml (Ukrainian)
sameerasw Apr 30, 2026
a9a3705
New translations strings.xml (Chinese Simplified)
sameerasw Apr 30, 2026
3a82975
New translations strings.xml (Chinese Traditional)
sameerasw Apr 30, 2026
73e4d73
New translations strings.xml (Vietnamese)
sameerasw Apr 30, 2026
6ff40c0
New translations strings.xml (Sinhala)
sameerasw Apr 30, 2026
90e3bad
New translations strings.xml (Acholi)
sameerasw Apr 30, 2026
2f22aae
New Crowdin updates (#376)
sameerasw Apr 30, 2026
e0093e8
refactor: remove error_unlock_network_settings string across all locales
sameerasw Apr 30, 2026
a97566e
feat: suppress ambient glance and dream services when Android Auto is…
sameerasw May 1, 2026
f04b632
Delete codex-analysis-notes.md
sameerasw May 1, 2026
cadd52f
feat: update permission UI labels to reflect granted status dynamically
sameerasw May 2, 2026
b2b296f
feat: implement Live Wallpaper service and configuration UI
sameerasw May 2, 2026
0273560
feat: add support for removing custom live wallpaper videos via long-…
sameerasw May 2, 2026
a2275b9
refactor: move LiveWallpaper placement
sameerasw May 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -148,4 +148,9 @@ dependencies {
implementation("org.jsoup:jsoup:1.15.3")
implementation(libs.sentry.android)
implementation(libs.androidx.graphics.shapes)

// Media3 for Live Wallpaper
implementation(libs.androidx.media3.exoplayer)
implementation(libs.androidx.media3.common)

}
19 changes: 19 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -793,6 +793,25 @@
</intent-filter>
</service>

<service
android:name=".services.LiveWallpaperService"
android:label="@string/live_wallpaper_label"
android:permission="android.permission.BIND_WALLPAPER"
android:exported="true">
<intent-filter>
<action android:name="android.service.wallpaper.WallpaperService" />
</intent-filter>
<meta-data
android:name="android.service.wallpaper"
android:resource="@xml/live_wallpaper_info" />
</service>

<activity
android:name=".ui.activities.LiveWallpaperActivity"
android:exported="true"
android:label="@string/live_wallpaper_label" />


<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ import com.sameerasw.essentials.ui.composables.configs.ButtonRemapSettingsUI
import com.sameerasw.essentials.ui.composables.configs.CaffeinateSettingsUI
import com.sameerasw.essentials.ui.composables.configs.DynamicNightLightSettingsUI
import com.sameerasw.essentials.ui.composables.configs.KeyboardSettingsUI
import com.sameerasw.essentials.ui.composables.configs.LiveWallpaperSettingsUI
import com.sameerasw.essentials.ui.composables.configs.LocationReachedSettingsUI
import com.sameerasw.essentials.ui.composables.configs.MapsPowerSavingSettingsUI
import com.sameerasw.essentials.ui.composables.configs.NotificationLightingSettingsUI
Expand Down Expand Up @@ -649,6 +650,14 @@ class FeatureSettingsActivity : AppCompatActivity() {
)
}

"LiveWallpaper" -> {
LiveWallpaperSettingsUI(
viewModel = viewModel,
modifier = Modifier.padding(top = 16.dp),
highlightSetting = highlightSetting
)
}

"Other customizations" -> {
OtherCustomizationsSettingsUI(
viewModel = viewModel,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,15 @@ class SettingsRepository(private val context: Context) {
const val KEY_REFRESH_RATE_MIN = "refresh_rate_min"
const val KEY_REFRESH_RATE_PEAK = "refresh_rate_peak"
const val KEY_REFRESH_RATE_DEFAULT_PEAK_INFINITY = "refresh_rate_default_peak_infinity"

// Live Wallpaper
const val LIVE_WALLPAPER_PREFS_NAME = "live_wallpaper_prefs"
const val KEY_LIVE_WALLPAPER_SELECTED_VIDEO = "selected_video"
const val KEY_LIVE_WALLPAPER_PLAYBACK_TRIGGER = "playback_trigger"
const val KEY_LIVE_WALLPAPER_CUSTOM_VIDEOS = "custom_videos"
const val LIVE_WALLPAPER_DEFAULT_VIDEO = "my_video"
const val LIVE_WALLPAPER_TRIGGER_UNLOCK = "unlock"
const val LIVE_WALLPAPER_TRIGGER_SCREEN_ON = "screen_on"
}

// Observe changes
Expand Down Expand Up @@ -580,7 +589,8 @@ class SettingsRepository(private val context: Context) {
"essentials_prefs",
"caffeinate_prefs",
"link_prefs",
"diy_automations_prefs"
"diy_automations_prefs",
"live_wallpaper_prefs"
)

prefFiles.forEach { fileName ->
Expand Down Expand Up @@ -794,6 +804,61 @@ class SettingsRepository(private val context: Context) {
fun isBatteryNotificationEnabled(): Boolean = getBoolean(KEY_BATTERY_NOTIFICATION_ENABLED, false)
fun setBatteryNotificationEnabled(enabled: Boolean) = putBoolean(KEY_BATTERY_NOTIFICATION_ENABLED, enabled)

// Live Wallpaper Helpers
private val liveWallpaperPrefs: SharedPreferences by lazy {
context.getSharedPreferences(LIVE_WALLPAPER_PREFS_NAME, Context.MODE_PRIVATE)
}

fun getLiveWallpaperSelectedVideo(): String =
liveWallpaperPrefs.getString(KEY_LIVE_WALLPAPER_SELECTED_VIDEO, LIVE_WALLPAPER_DEFAULT_VIDEO)
?: LIVE_WALLPAPER_DEFAULT_VIDEO

fun saveLiveWallpaperSelectedVideo(video: String) =
liveWallpaperPrefs.edit().putString(KEY_LIVE_WALLPAPER_SELECTED_VIDEO, video).apply()

fun getLiveWallpaperPlaybackTrigger(): String =
liveWallpaperPrefs.getString(KEY_LIVE_WALLPAPER_PLAYBACK_TRIGGER, LIVE_WALLPAPER_TRIGGER_UNLOCK)
?: LIVE_WALLPAPER_TRIGGER_UNLOCK

fun saveLiveWallpaperPlaybackTrigger(trigger: String) =
liveWallpaperPrefs.edit().putString(KEY_LIVE_WALLPAPER_PLAYBACK_TRIGGER, trigger).apply()

fun getLiveWallpaperCustomVideos(): List<String> =
liveWallpaperPrefs.getString(KEY_LIVE_WALLPAPER_CUSTOM_VIDEOS, "")?.split(",")?.filter { it.isNotEmpty() }
?: emptyList()

fun saveLiveWallpaperCustomVideos(videos: List<String>) =
liveWallpaperPrefs.edit().putString(KEY_LIVE_WALLPAPER_CUSTOM_VIDEOS, videos.joinToString(",")).apply()

fun addLiveWallpaperCustomVideo(uri: String) {
val current = getLiveWallpaperCustomVideos().toMutableList()
if (current.contains(uri)) {
current.remove(uri)
}
current.add(0, uri)
saveLiveWallpaperCustomVideos(if (current.size > 5) current.take(5) else current)
}

fun getLiveWallpaperAvailableVideos(): List<String> {
val raws = com.sameerasw.essentials.R.raw::class.java.fields.mapNotNull { field ->
try {
if (field.name == "keep") null else field.name
} catch (e: Exception) { null }
}
return raws + getLiveWallpaperCustomVideos()
}

fun removeLiveWallpaperCustomVideo(videoUri: String) {
val current = getLiveWallpaperCustomVideos().toMutableList()
if (current.remove(videoUri)) {
saveLiveWallpaperCustomVideos(current)
// If the removed video was selected, revert to default
if (getLiveWallpaperSelectedVideo() == videoUri) {
saveLiveWallpaperSelectedVideo(LIVE_WALLPAPER_DEFAULT_VIDEO)
}
}
}

fun getFontScale(): Float {
return try {
android.provider.Settings.System.getFloat(context.contentResolver, android.provider.Settings.System.FONT_SCALE)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,7 @@ object FeatureRegistry {
override fun isEnabled(viewModel: MainViewModel) = true
override fun onToggle(viewModel: MainViewModel, context: Context, enabled: Boolean) {}
},

object : Feature(
id = "Always on Display",
title = R.string.feat_always_on_display_title,
Expand Down Expand Up @@ -730,6 +731,21 @@ object FeatureRegistry {
viewModel.setDynamicNightLightEnabled(enabled, context)
},

object : Feature(
id = "LiveWallpaper",
title = R.string.feat_live_wallpaper_title,
iconRes = R.drawable.rounded_slow_motion_video_24,
category = R.string.cat_interface,
parentFeatureId = "Display",
description = R.string.feat_live_wallpaper_desc,
aboutDescription = R.string.about_desc_live_wallpaper,
showToggle = false
) {
override fun isEnabled(viewModel: MainViewModel) = true
override fun onToggle(viewModel: MainViewModel, context: Context, enabled: Boolean) {}
},



object : Feature(
id = "Other customizations",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
package com.sameerasw.essentials.services

import android.app.KeyguardManager
import android.net.Uri
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.content.SharedPreferences
import android.service.wallpaper.WallpaperService
import android.view.SurfaceHolder
import androidx.annotation.OptIn
import androidx.media3.common.C
import androidx.media3.common.MediaItem
import androidx.media3.common.Player
import androidx.media3.common.util.UnstableApi
import androidx.media3.exoplayer.DefaultRenderersFactory
import androidx.media3.exoplayer.ExoPlayer
import com.sameerasw.essentials.data.repository.SettingsRepository

class LiveWallpaperService : WallpaperService() {
override fun onCreateEngine(): Engine = VideoEngine()

inner class VideoEngine : Engine() {
private var exoPlayer: ExoPlayer? = null
private lateinit var repository: SettingsRepository
private val executor = android.os.Handler(android.os.Looper.getMainLooper())
private val keyguardManager by lazy { getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager }

private val prefsListener = SharedPreferences.OnSharedPreferenceChangeListener { _, key ->
when (key) {
SettingsRepository.KEY_LIVE_WALLPAPER_SELECTED_VIDEO -> loadSelectedVideo()
SettingsRepository.KEY_LIVE_WALLPAPER_PLAYBACK_TRIGGER -> {
// Update current playback state if screen is on
if (isVisible && !keyguardManager.isKeyguardLocked) {
exoPlayer?.play()
} else if (isVisible && repository.getLiveWallpaperPlaybackTrigger() == SettingsRepository.LIVE_WALLPAPER_TRIGGER_SCREEN_ON) {
exoPlayer?.play()
}
}
}
}

private val receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
when (intent?.action) {
Intent.ACTION_USER_PRESENT -> exoPlayer?.play()
Intent.ACTION_SCREEN_OFF -> {
executor.removeCallbacksAndMessages(null)
executor.postDelayed({
exoPlayer?.pause()
exoPlayer?.seekTo(0)
}, 500)
}
Intent.ACTION_SCREEN_ON -> {
val shouldPlay = isPreview ||
!keyguardManager.isKeyguardLocked ||
repository.getLiveWallpaperPlaybackTrigger() == SettingsRepository.LIVE_WALLPAPER_TRIGGER_SCREEN_ON

if (shouldPlay) {
executor.removeCallbacksAndMessages(null)
exoPlayer?.play()
} else {
executor.removeCallbacksAndMessages(null)
executor.postDelayed({
exoPlayer?.pause()
exoPlayer?.seekTo(0)
}, 500)
}
}
}
}
}

@OptIn(UnstableApi::class)
override fun onCreate(surfaceHolder: SurfaceHolder?) {
super.onCreate(surfaceHolder)
repository = SettingsRepository(applicationContext)

val filter = IntentFilter().apply {
addAction(Intent.ACTION_USER_PRESENT)
addAction(Intent.ACTION_SCREEN_OFF)
addAction(Intent.ACTION_SCREEN_ON)
}
registerReceiver(receiver, filter)

repository.registerOnSharedPreferenceChangeListener(prefsListener)
}

override fun onVisibilityChanged(visible: Boolean) {
if (visible) {
val shouldPlay = isPreview ||
!keyguardManager.isKeyguardLocked ||
repository.getLiveWallpaperPlaybackTrigger() == SettingsRepository.LIVE_WALLPAPER_TRIGGER_SCREEN_ON
if (shouldPlay) exoPlayer?.play()
} else {
exoPlayer?.pause()
}
}

@OptIn(UnstableApi::class)
override fun onSurfaceCreated(holder: SurfaceHolder) {
super.onSurfaceCreated(holder)
val renderersFactory = DefaultRenderersFactory(applicationContext)
val player = ExoPlayer.Builder(applicationContext, renderersFactory).build()
exoPlayer = player

player.apply {
setVideoSurfaceHolder(holder)
repeatMode = Player.REPEAT_MODE_OFF
volume = 0f
videoScalingMode = C.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING
loadSelectedVideo()
val shouldPlay = isPreview ||
!keyguardManager.isKeyguardLocked ||
repository.getLiveWallpaperPlaybackTrigger() == SettingsRepository.LIVE_WALLPAPER_TRIGGER_SCREEN_ON
playWhenReady = shouldPlay
}
}

@OptIn(UnstableApi::class)
private fun loadSelectedVideo() {
val videoName = repository.getLiveWallpaperSelectedVideo()
val resId = resources.getIdentifier(videoName, "raw", packageName)
val mediaItem = if (resId != 0) {
MediaItem.fromUri("android.resource://$packageName/$resId")
} else {
try {
MediaItem.fromUri(Uri.parse(videoName))
} catch (e: Exception) {
null
}
}

mediaItem?.let {
exoPlayer?.setMediaItem(it)
exoPlayer?.prepare()
}
}

override fun onSurfaceChanged(holder: SurfaceHolder, f: Int, w: Int, h: Int) {
super.onSurfaceChanged(holder, f, w, h)
exoPlayer?.videoScalingMode = C.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING
}

override fun onDestroy() {
super.onDestroy()
executor.removeCallbacksAndMessages(null)
try { unregisterReceiver(receiver) } catch (e: Exception) { }
repository.unregisterOnSharedPreferenceChangeListener(prefsListener)
exoPlayer?.release()
exoPlayer = null
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,11 @@ class NotificationListener : NotificationListenerService() {
)

if (isEnabled) {
// Skip if Android Auto is running
if (AppUtil.isAndroidAutoRunning(this)) {
return
}

val metadata = activeSession.metadata
val title = metadata?.getString(android.media.MediaMetadata.METADATA_KEY_TITLE)
val artist = metadata?.getString(android.media.MediaMetadata.METADATA_KEY_ARTIST)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,13 @@ class AmbientDreamService : DreamService() {

private val burnInProtectionRunnable = object : Runnable {
override fun run() {
if (isDetached) return

// Revert to clock if Android Auto is running
if (com.sameerasw.essentials.utils.AppUtil.isAndroidAutoRunning(this@AmbientDreamService)) {
switchToClockMode()
}

shiftUi()
handler.postDelayed(this, 60000) // Every minute
}
Expand All @@ -140,6 +147,13 @@ class AmbientDreamService : DreamService() {
private val progressUpdateRunnable = object : Runnable {
override fun run() {
if (isDetached) return

// Revert to clock if Android Auto is running
if (com.sameerasw.essentials.utils.AppUtil.isAndroidAutoRunning(this@AmbientDreamService)) {
switchToClockMode()
return
}

handler.postDelayed(this, 1000L)
}
}
Expand Down Expand Up @@ -452,6 +466,13 @@ class AmbientDreamService : DreamService() {

private fun handleIntent(intent: Intent) {
if (isDetached) return

// Skip if Android Auto is running
if (com.sameerasw.essentials.utils.AppUtil.isAndroidAutoRunning(this)) {
switchToClockMode()
return
}

eventType = intent.getStringExtra("event_type")
targetPackage = intent.getStringExtra("package_name")
val newTitle = intent.getStringExtra("track_title")
Expand Down Expand Up @@ -565,6 +586,11 @@ class AmbientDreamService : DreamService() {

private fun switchToMusicMode() {
if (isMusicMode) return

// Skip if Android Auto is running
if (com.sameerasw.essentials.utils.AppUtil.isAndroidAutoRunning(this)) {
return
}
isMusicMode = true

// Move Clock to Top
Expand Down
Loading