By sticky I mean a window that doesn't get closed by calling the launcher intent (intent.addCategory(Intent.CATEGORY_HOME
).
Previously this was done with WindowManager.LayoutParams.TYPE_PHONE
, but this type is now deprecated and throws an exception on api 28:
WindowManager$BadTokenException ... permission denied for window type 2002
The behavious is still possible since Facebook's Messenger does it with its chat "Heads", based on the assumption that facebook doesn't get system app permissions since it's pre-installed on a lot of roms.
Using WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
doesn't work (i.e. pressing the home button also hides the overlay window).
Edit: The question is how to have an overlay window that doesn't get removed when user clicks the home button / calling the launcher intent. It's not the case for TYPE_APPLICATION_OVERLAY
, it was the case for TYPE_PHONE
but that's deprecated.
Edit 2: Apparently this does work for some people, this is the code I'm running:
class MyClass {
var params: WindowManager.LayoutParams = WindowManager.LayoutParams(
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
else WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG,
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
PixelFormat.TRANSLUCENT
).apply {
windowAnimations = android.R.style.Animation_Dialog
gravity = Gravity.CENTER or Gravity.CENTER
x = 0
y = 0
}
var windowManager: WindowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
init {
val layoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
rootView = layoutInflater.inflate(R.layout.view_overlay, null)
windowManager.addView(rootView, params)
}
}