title: Simulating power button press to display switch off dialog box
body: <p>I am trying to invoke the switch off dialog box that appears when we press power button. But i want to accomplish this task from an android application or a Junit test case. I will choose the most feasible approach in this case. I have been trying to do this but was not able to succeed. I am trying to use the following five approaches:</p>
  
  <h1>First approach:</h1>
  
  <pre><code>long eventTime = SystemClock.uptimeMillis(); boolean
                    dispateched = launcherButtonWInst.dispatchKeyEvent(new
                    KeyEvent(eventTime, eventTime, KeyEvent.ACTION_DOWN,
                    KeyEvent.KEYCODE_POWER, 0, 0, 0, 0, 0) );
                    Log.i(LOG_TAG,String.valueOf(dispateched)); boolean
                    dispateched2=launcherButtonWInst.dispatchKeyEvent(new
                    KeyEvent(eventTime+2000, eventTime+2000, KeyEvent.ACTION_UP,
                    KeyEvent.KEYCODE_POWER, 0, 0, 0, 0, 0) );
                    Log.i(LOG_TAG,String.valueOf(dispateched2));
  </code></pre>
  
  <p>=======================================================</p>
  
  <h1>Second apporach:</h1>
  
  <pre><code>private void generateKeys() {
          // Obtain the WindowManager system service interface
          IBinder wmbinder = ServiceManager.getService("window");
          Log.d(LOG_TAG, "WindowManager: " + wmbinder);
          IWindowManager wm = IWindowManager.Stub.asInterface(wmbinder);
          keyUpDown(wm, KeyEvent.KEYCODE_POWER);
      }
  
      private void keyUpDown(IWindowManager wm, int keycode) {
          try {
              Log.d(LOG_TAG, "keyDown: " + keycode);
              wm.injectKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, keycode), true);
              Log.d(LOG_TAG, "keyUp: " + keycode);
              wm.injectKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, keycode), true);
          } catch (RemoteException e) {
              // TODO Auto-generated catch block
              Log.e("ERROR!!!!!", e.toString());
              e.printStackTrace();
          }
      }
  </code></pre>
  
  <p>============================================================</p>
  
  <h1>Third approach:</h1>
  
  <pre><code>Instrumentation inst = new Instrumentation();
          inst.sendKeyDownUpSync(KeyEvent.KEYCODE_POWER);
  </code></pre>
  
  <p>======================================================</p>
  
  <h1>Fourth approach:</h1>
  
  <pre><code>try {
                           long now =SystemClock.uptimeMillis();
                           KeyEvent down = new KeyEvent(now, now,
                           KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_POWER, 0);
  
                           Log.d( LOG_TAG,down.toString() );
                           KeyEvent up = new KeyEvent(now+2000, now+2000,
                           KeyEvent.ACTION_UP, KeyEvent.KEYCODE_POWER, 0);
                           Log.d( LOG_TAG,up.toString() );
                           (IWindowManager.Stub.asInterface(ServiceManager.getService("window"))).injectKeyEvent(down,
                           true);
                           try {
                           Thread.sleep(2000);
                           } catch (InterruptedException e) {
                           // TODO Auto-generated catch block
                           e.printStackTrace();
                           }
                           (IWindowManager.Stub.asInterface(ServiceManager.getService("window"))).injectKeyEvent(up,
                           true);
                           } catch (RemoteException e) {
                           Log.d("LOGTAG",
                           "SendKeyEvent exception:"+e.getMessage());
  </code></pre>
  
  <h1>                             }</h1>
  
  <h1>Fifth approach:</h1>
  
  <pre><code>try {
                      Context mContext = getBaseContext();
                      Dialog dialog=new Dialog(mContext);
                      dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
                      ShutdownThread.shutdown(mContext, true);
  
                  } catch (Exception e) {
                      Log.e("ERROR!!!", e.toString());
                      e.printStackTrace();
                  }
  </code></pre>
  
  <p>===================================================================</p>
  
  <p>But none of them is working for me. The fifth approach is invoking shutdown() method of ShutdownThread class. But it gives me following error:</p>
  
  <pre><code>07-05 10:18:21.489: W/System.err(709): android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@4104d798 -- permission denied for this window type
  07-05 10:18:21.499: W/System.err(709):     at android.view.ViewRootImpl.setView(ViewRootImpl.java:537)
  07-05 10:18:21.499: W/System.err(709):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:301)
  07-05 10:18:21.499: W/System.err(709):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215)
  07-05 10:18:21.499: W/System.err(709):     at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140)
  07-05 10:18:21.499: W/System.err(709):     at android.app.Dialog.show(Dialog.java:278)
  07-05 10:18:21.499: W/System.err(709):     at com.android.internal.app.ShutdownThread.shutdown(ShutdownThread.java:124)
  07-05 10:18:21.499: W/System.err(709):     at aexp.keygen.KeyGen$1.onClick(KeyGen.java:47)
  07-05 10:18:21.499: W/System.err(709):     at android.view.View.performClick(View.java:3511)
  07-05 10:18:21.499: W/System.err(709):     at android.view.View$PerformClick.run(View.java:14105)
  07-05 10:18:21.509: W/System.err(709):     at android.os.Handler.handleCallback(Handler.java:605)
  07-05 10:18:21.509: W/System.err(709):     at android.os.Handler.dispatchMessage(Handler.java:92)
  07-05 10:18:21.509: W/System.err(709):     at android.os.Looper.loop(Looper.java:137)
  07-05 10:18:21.509: W/System.err(709):     at android.app.ActivityThread.main(ActivityThread.java:4424)
  07-05 10:18:21.509: W/System.err(709):     at java.lang.reflect.Method.invokeNative(Native Method)
  07-05 10:18:21.509: W/System.err(709):     at java.lang.reflect.Method.invoke(Method.java:511)
  07-05 10:18:21.509: W/System.err(709):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
  07-05 10:18:21.509: W/System.err(709):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
  07-05 10:18:21.509: W/System.err(709):     at dalvik.system.NativeStart.main(Native Method)
  </code></pre>
  
  <p>Other approaches do not throw any error. I need help to accomplish this task, which ever way it takes even though I have to invoke native methods to accomplish I will do that, but I have to display the switch off UI.</p>
  
  <p>Thanks</p>
  
  <p>Ashwani</p>