import android.app.AlertDialog import android.app.Service import android.content.Intent import android.graphics.PixelFormat import android.os.Build import android.os.IBinder import android.util.TypedValue import android.view.Window import android.view.WindowManager import androidx.compose.foundation.background import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.material.Text import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.unit.sp import androidx.lifecycle.Lifecycle import androidx.lifecycle.ViewModelStore import androidx.lifecycle.ViewTreeLifecycleOwner import androidx.lifecycle.ViewTreeViewModelStoreOwner import androidx.savedstate.ViewTreeSavedStateRegistryOwner import com.viatek.fitnation.echelon_android.R class OverlayService : Service() { val windowManager get() = getSystemService(WINDOW_SERVICE) as WindowManager override fun onCreate() { super.onCreate() setTheme(R.style.ThemeOverlay_AppCompat_Light) showOverlay() } private fun showOverlay() { val layoutFlag: Int = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY } else { WindowManager.LayoutParams.TYPE_PHONE } val params = WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, layoutFlag, WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE or WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN or WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT ) val composeView = ComposeView(this) composeView.setContent { Text( text = "Hello", color = Color.Black, fontSize = 50.sp, modifier = Modifier .wrapContentSize() .background(Color.Green) ) } // Trick The ComposeView into thinking we are tracking lifecycle val viewModelStore = ViewModelStore() val lifecycleOwner = MyLifecycleOwner() lifecycleOwner.performRestore(null) lifecycleOwner.handleLifecycleEvent(Lifecycle.Event.ON_CREATE) ViewTreeLifecycleOwner.set(composeView, lifecycleOwner) ViewTreeViewModelStoreOwner.set(composeView) { viewModelStore } ViewTreeSavedStateRegistryOwner.set(composeView, lifecycleOwner) windowManager.addView(composeView, params) } override fun onBind(intent: Intent): IBinder? { return null } }