Search code examples
androidkiosk-mode

Block/Disable Statusbar in android Tablet/Mobile


I have seen Kioware and SureLock applications. They simply block every control in tablet. I'm aware about overriding back button and handling the home and recent task options as well. But I'm not sure how they managed to control the setting option on system bar. Settings appear for a fraction of seconds and then disappear. In the same way Statusbar of mobile which appear on swipe down need to be block.

If anyone have idea about it please share it. Any guidance/help is appreciated.

See the attached image selected portion which I need to block/disable


Solution

  • Finally I found the solution of the above problem. onWindowFocus change I just closed the system generated Dialogs and my problem was solved. below is the sample code.

    @Override
         public void onWindowFocusChanged(boolean hasFocus) {
             super.onWindowFocusChanged(hasFocus);
    
          if(!hasFocus)
          {// Close every kind of system dialog 
              Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); 
              sendBroadcast(closeDialog); 
    
          }
    
         }
    

    Update:

    In Mobile to block the status bar which appear on swipe down on the screen use below way.

    private Handler collapseNotificationHandler;
                @Override
                public void onWindowFocusChanged(boolean hasFocus) {
                    boolean currentFocus = hasFocus;
                    if (!hasFocus) {
                        collapseNow(true,currentFocus);
    
                    }
    
                }
    
    
        public void collapseNow(final boolean shouldCollapse, final boolean currentFocus ) {
    
                    // Initialize 'collapseNotificationHandler'
                    if (collapseNotificationHandler == null) {
                        collapseNotificationHandler = new Handler();
                    }
    
                    // If window focus has been lost && activity is not in a paused state
                    // Its a valid check because showing of notification panel
                    // steals the focus from current activity's window, but does not 
                    // 'pause' the activity
                    if (!currentFocus && !isPaused) {
    
                        // Post a Runnable with some delay - currently set to 50 ms
                        collapseNotificationHandler.postDelayed(new Runnable() {
    
                            @Override
                            public void run() {
    
                                // Use reflection to trigger a method from 'StatusBarManager'                
    
                                Object statusBarService = getSystemService("statusbar");
                                Class<?> statusBarManager = null;
    
                                try {
                                    statusBarManager = Class.forName("android.app.StatusBarManager");
                                } catch (ClassNotFoundException e) {
                                    e.printStackTrace();
                                }
    
                                Method collapseStatusBar = null;
    
                                try {
    
                                    // Prior to API 17, the method to call is 'collapse()'
                                    // API 17 onwards, the method to call is `collapsePanels()`
    
                                    if (Build.VERSION.SDK_INT > 16) {
                                        collapseStatusBar = statusBarManager.getMethod("collapsePanels");
                                    } else {
                                        collapseStatusBar = statusBarManager.getMethod("collapse");
                                    }
                                } catch (NoSuchMethodException e) {
                                    e.printStackTrace();
                                }
    
                                collapseStatusBar.setAccessible(shouldCollapse);
    
                                try {
                                    collapseStatusBar.invoke(statusBarService);
                                } catch (IllegalArgumentException e) {
                                    e.printStackTrace();
                                } catch (IllegalAccessException e) {
                                    e.printStackTrace();
                                } catch (InvocationTargetException e) {
                                    e.printStackTrace();
                                }
    
                                // Check if the window focus has been returned
                                // If it hasn't been returned, post this Runnable again
                                // Currently, the delay is 50 ms. You can change this
                                // value to suit your needs.
                                if (!currentFocus && !isPaused) {
                                    collapseNotificationHandler.postDelayed(this, 50);
                                }
    
                            }
                        }, 0);
                    }   
                }
    

    "isPaused" boolean which set true when app is in Pause state.