androidandroid-windowmanager

System Overlay not covering Status bar & Navigation bar Android


I am using Window Service to draw Overlay over screen. But my Overlay not covering the whole screen, It leaves out Status bar and Navigation Bar. I have tried different approaches to solve it, but didn't find any solution. But the solution is available, as some Apps (Edge Lighting) on Play Store drawing border over full screen(Even on Android O).

My code snippet to achieve the task.

  1. Window Manager

        int Layout_Flag;
    
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        Layout_Flag = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
    }else {
        Layout_Flag = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
    }
    
    final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.MATCH_PARENT,
            Layout_Flag,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED,
            PixelFormat.TRANSLUCENT);
    params.gravity = Gravity.CENTER;
    windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    windowManager.addView(customView, params);
    
  2. Drawing Edge

    `override fun onDraw(canvas: Canvas) { super.onDraw(canvas) // draw a shape val width = measuredWidth val height = measuredHeight

     val strokeWidthCalculation = paint.strokeWidth / 2
     path?.moveTo(strokeWidthCalculation, strokeWidthCalculation)
     path?.lineTo(width - strokeWidthCalculation, strokeWidthCalculation)
     path?.lineTo(width - strokeWidthCalculation, height - strokeWidthCalculation)
     path?.lineTo(strokeWidthCalculation, height - strokeWidthCalculation)
     path?.close()
    
     paint.pathEffect = cornerPathEffect
     canvas.drawPath(path!!, paint)
    

    }`

  3. Result sample image, not covering status and navigation bar


Solution

  • In order to achieve it, the fourth parameter of WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS.

    That's it.

    The whole complete code:

    val LAYOUT_FLAG: Int
        LAYOUT_FLAG = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
        } else {
            WindowManager.LayoutParams.TYPE_TOAST
        }
        params = WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.MATCH_PARENT,
            LAYOUT_FLAG,  // NOTE
            WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
                    or WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
            PixelFormat.TRANSLUCENT
        )