17d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler/** 27d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * 37d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler */ 47d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandlerpackage android.service.dreams; 57d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 67d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandlerimport com.android.internal.policy.PolicyManager; 77d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 87d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandlerimport android.annotation.SdkConstant; 97d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandlerimport android.annotation.SdkConstant.SdkConstantType; 107d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandlerimport android.app.Service; 117d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandlerimport android.content.Context; 127d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandlerimport android.content.Intent; 137d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandlerimport android.content.pm.ActivityInfo; 147d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandlerimport android.graphics.drawable.ColorDrawable; 157d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandlerimport android.os.Binder; 167d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandlerimport android.os.Handler; 177d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandlerimport android.os.IBinder; 187d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandlerimport android.os.Looper; 197d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandlerimport android.os.RemoteException; 207d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandlerimport android.os.ServiceManager; 217d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandlerimport android.util.Slog; 227d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandlerimport android.view.ActionMode; 237d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandlerimport android.view.IWindowManager; 247d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandlerimport android.view.KeyEvent; 257d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandlerimport android.view.Menu; 267d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandlerimport android.view.MenuItem; 277d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandlerimport android.view.MotionEvent; 287d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandlerimport android.view.View; 297d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandlerimport android.view.ViewGroup; 307d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandlerimport android.view.Window; 317d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandlerimport android.view.WindowManager.LayoutParams; 327d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandlerimport android.view.accessibility.AccessibilityEvent; 337d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandlerimport android.view.WindowManager; 347d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandlerimport android.view.WindowManagerImpl; 357d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 367d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler/** 377d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * @hide 387d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * 397d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler */ 407d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandlerpublic class Dream extends Service implements Window.Callback { 417d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler private final static boolean DEBUG = true; 427d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler private final static String TAG = "Dream"; 437d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 447d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler /** 457d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * The {@link Intent} that must be declared as handled by the service. 467d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * To be supported, the service must also require the 477d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * {@link android.Manifest.permission#BIND_WALLPAPER} permission so 487d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * that other applications can not abuse it. 497d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler */ 507d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler @SdkConstant(SdkConstantType.SERVICE_ACTION) 517d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public static final String SERVICE_INTERFACE = 527d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler "android.service.dreams.Dream"; 537d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 547d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler private Window mWindow; 557d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 567d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler private WindowManager mWindowManager; 577d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler private IDreamManager mSandman; 587d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 597d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler private boolean mInteractive; 607d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 617d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler final Handler mHandler = new Handler(); 627d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 637d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler boolean mFinished = false; 647d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 657d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler // begin Window.Callback methods 667d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler @Override 677d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public boolean dispatchKeyEvent(KeyEvent event) { 687d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler if (!mInteractive) { 697d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler finish(); 707d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler return true; 717d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 727d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler return mWindow.superDispatchKeyEvent(event); 737d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 747d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 757d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler @Override 767d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public boolean dispatchKeyShortcutEvent(KeyEvent event) { 777d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler if (!mInteractive) { 787d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler finish(); 797d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler return true; 807d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 817d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler return mWindow.superDispatchKeyShortcutEvent(event); 827d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 837d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 847d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler @Override 857d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public boolean dispatchTouchEvent(MotionEvent event) { 867d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler if (!mInteractive) { 877d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler finish(); 887d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler return true; 897d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 907d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler return mWindow.superDispatchTouchEvent(event); 917d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 927d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 937d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler @Override 947d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public boolean dispatchTrackballEvent(MotionEvent event) { 957d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler if (!mInteractive) { 967d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler finish(); 977d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler return true; 987d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 997d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler return mWindow.superDispatchTrackballEvent(event); 1007d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 1017d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 1027d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler @Override 1037d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public boolean dispatchGenericMotionEvent(MotionEvent event) { 1047d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler if (!mInteractive) { 1057d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler finish(); 1067d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler return true; 1077d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 1087d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler return mWindow.superDispatchGenericMotionEvent(event); 1097d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 1107d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 1117d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler @Override 1127d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { 1137d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler return false; 1147d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 1157d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 1167d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler @Override 1177d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public View onCreatePanelView(int featureId) { 1187d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler return null; 1197d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 1207d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 1217d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler @Override 1227d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public boolean onCreatePanelMenu(int featureId, Menu menu) { 1237d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler return false; 1247d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 1257d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 1267d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler @Override 1277d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public boolean onPreparePanel(int featureId, View view, Menu menu) { 1287d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler return false; 1297d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 1307d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 1317d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler @Override 1327d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public boolean onMenuOpened(int featureId, Menu menu) { 1337d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler return false; 1347d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 1357d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 1367d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler @Override 1377d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public boolean onMenuItemSelected(int featureId, MenuItem item) { 1387d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler return false; 1397d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 1407d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 1417d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler @Override 1427d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public void onWindowAttributesChanged(LayoutParams attrs) { 1437d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 1447d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 1457d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 1467d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler @Override 1477d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public void onContentChanged() { 1487d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 1497d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 1507d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 1517d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler @Override 1527d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public void onWindowFocusChanged(boolean hasFocus) { 1537d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 1547d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 1557d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 1567d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler @Override 1577d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public void onAttachedToWindow() { 1587d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler mWindow.addFlags( 1597d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON 1607d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 1617d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler ); 1627d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler lightsOut(); 1637d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 1647d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 1657d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler @Override 1667d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public void onDetachedFromWindow() { 1677d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 1687d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 1697d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler @Override 1707d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public void onPanelClosed(int featureId, Menu menu) { 1717d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 1727d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 1737d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler @Override 1747d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public boolean onSearchRequested() { 1757d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler return false; 1767d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 1777d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 1787d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler @Override 1797d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public ActionMode onWindowStartingActionMode(android.view.ActionMode.Callback callback) { 1807d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler return null; 1817d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 1827d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 1837d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler @Override 1847d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public void onActionModeStarted(ActionMode mode) { 1857d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 1867d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 1877d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler @Override 1887d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public void onActionModeFinished(ActionMode mode) { 1897d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 1907d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler // end Window.Callback methods 1917d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 1927d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public WindowManager getWindowManager() { 1937d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler return mWindowManager; 1947d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 1957d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 1967d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public Window getWindow() { 1977d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler return mWindow; 1987d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 1997d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 2007d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler /** 2017d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * Called when this Dream is constructed. Place your initialization here. 2027d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * 2037d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * Subclasses must call through to the superclass implementation. 2047d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler */ 2057d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler @Override 2067d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public void onCreate() { 2077d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler super.onCreate(); 2087d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 2097d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler if (DEBUG) Slog.v(TAG, "Dream created on thread " + Thread.currentThread().getId()); 2107d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 2117d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler mSandman = IDreamManager.Stub.asInterface(ServiceManager.getService("dreams")); 2127d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 2137d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 2147d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler /** 2157d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * Called when this Dream is started. Place your initialization here. 2167d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * 2177d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * Subclasses must call through to the superclass implementation. 2187d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * 2197d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * XXX(dsandler) Might want to make this final and have a different method for clients to override 2207d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler */ 2217d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler @Override 2227d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public int onStartCommand(Intent intent, int flags, int startId) { 2237d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler return super.onStartCommand(intent, flags, startId); 2247d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 2257d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 2267d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler /** 2277d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * Inflate a layout resource and set it to be the content view for this Dream. 2287d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * Behaves similarly to {@link android.app.Activity#setContentView(int)}. 2297d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * 2307d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * @param layoutResID Resource ID to be inflated. 2317d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * 2327d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * @see #setContentView(android.view.View) 2337d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * @see #setContentView(android.view.View, android.view.ViewGroup.LayoutParams) 2347d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler */ 2357d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public void setContentView(int layoutResID) { 2367d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler getWindow().setContentView(layoutResID); 2377d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 2387d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 2397d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler /** 2407d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * Set a view to be the content view for this Dream. 2417d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * Behaves similarly to {@link android.app.Activity#setContentView(android.view.View)}, 2427d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * including using {@link ViewGroup.LayoutParams#MATCH_PARENT} as the layout height and width of the view. 2437d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * 2447d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * @param view The desired content to display. 2457d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * 2467d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * @see #setContentView(int) 2477d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * @see #setContentView(android.view.View, android.view.ViewGroup.LayoutParams) 2487d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler */ 2497d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public void setContentView(View view) { 2507d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler getWindow().setContentView(view); 2517d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 2527d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 2537d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler /** 2547d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * Set a view to be the content view for this Dream. 2557d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * Behaves similarly to 2567d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * {@link android.app.Activity#setContentView(android.view.View, android.view.ViewGroup.LayoutParams)}. 2577d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * 2587d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * @param view The desired content to display. 2597d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * @param params Layout parameters for the view. 2607d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * 2617d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * @see #setContentView(android.view.View) 2627d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * @see #setContentView(int) 2637d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler */ 2647d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public void setContentView(View view, ViewGroup.LayoutParams params) { 2657d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler getWindow().setContentView(view, params); 2667d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 2677d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 2687d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler /** 2697d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * Add a view to the Dream's window, leaving other content views in place. 2707d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * 2717d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * @param view The desired content to display. 2727d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * @param params Layout parameters for the view. 2737d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler */ 2747d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public void addContentView(View view, ViewGroup.LayoutParams params) { 2757d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler getWindow().addContentView(view, params); 2767d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 2777d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 2787d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler /** 2797d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * @param mInteractive the mInteractive to set 2807d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler */ 2817d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public void setInteractive(boolean mInteractive) { 2827d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler this.mInteractive = mInteractive; 2837d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 2847d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 2857d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler /** 2867d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * @return the mInteractive 2877d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler */ 2887d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public boolean isInteractive() { 2897d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler return mInteractive; 2907d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 2917d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 2927d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler /** Convenience method for setting View.SYSTEM_UI_FLAG_LOW_PROFILE on the content view. */ 2937d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler protected void lightsOut() { 2947d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler // turn the lights down low 2957d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler final View v = mWindow.getDecorView(); 2967d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler if (v != null) { 2977d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler v.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE); 2987d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 2997d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 3007d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 3017d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler /** 3027d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * Finds a view that was identified by the id attribute from the XML that 3037d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * was processed in {@link #onCreate}. 3047d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * 3057d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * @return The view if found or null otherwise. 3067d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler */ 3077d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public View findViewById(int id) { 3087d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler return getWindow().findViewById(id); 3097d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 3107d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 3117d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler /** 3127d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * Called when this Dream is being removed from the screen and stopped. 3137d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler */ 3147d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler @Override 3157d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public void onDestroy() { 3167d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler super.onDestroy(); 3177d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler mWindowManager.removeView(mWindow.getDecorView()); 3187d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 3197d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 3207d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler /** 3217d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * Creates a new dream window, attaches the current content view, and shows it. 3227d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * 3237d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * @param windowToken Binder to attach to the window to allow access to the correct window type. 3247d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * @hide 3257d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler */ 3267d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler final /*package*/ void attach(IBinder windowToken) { 3277d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler if (DEBUG) Slog.v(TAG, "Dream attached on thread " + Thread.currentThread().getId()); 3287d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 3297d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler mWindow = PolicyManager.makeNewWindow(this); 3307d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler mWindow.setCallback(this); 3317d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler mWindow.requestFeature(Window.FEATURE_NO_TITLE); 3327d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler mWindow.setBackgroundDrawable(new ColorDrawable(0xFF000000)); 3337d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 3347d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler if (DEBUG) Slog.v(TAG, "attaching window token: " + windowToken 3357d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler + " to window of type " + WindowManager.LayoutParams.TYPE_DREAM); 3367d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 3377d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler WindowManager.LayoutParams lp = mWindow.getAttributes(); 3387d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler lp.type = WindowManager.LayoutParams.TYPE_DREAM; 3397d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler lp.token = windowToken; 3407d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler lp.windowAnimations = com.android.internal.R.style.Animation_Dream; 3417d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 3427d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler //WindowManagerImpl.getDefault().addView(mWindow.getDecorView(), lp); 3437d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 3447d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler if (DEBUG) Slog.v(TAG, "created and attached window: " + mWindow); 3457d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 3467d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler mWindow.setWindowManager(null, windowToken, "dream", true); 3477d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler mWindowManager = mWindow.getWindowManager(); 3487d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 3497d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler // now make it visible 3507d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler mHandler.post(new Runnable(){ 3517d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler @Override 3527d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public void run() { 3537d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler if (DEBUG) Slog.v(TAG, "Dream window added on thread " + Thread.currentThread().getId()); 3547d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 3557d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler getWindowManager().addView(mWindow.getDecorView(), mWindow.getAttributes()); 3567d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler }}); 3577d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 3587d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 3597d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler /** 3607d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * Stop the dream and wake up. 3617d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * 3627d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * After this method is called, the service will be stopped. 3637d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler */ 3647d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public void finish() { 3657d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler if (mFinished) return; 3667d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler try { 3677d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler mSandman.awaken(); // assuming we were started by the DreamManager 3687d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler stopSelf(); // if launched via any other means 3697d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler mFinished = true; 3707d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } catch (RemoteException ex) { 3717d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler // sigh 3727d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 3737d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 3747d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 3757d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler class IDreamServiceWrapper extends IDreamService.Stub { 3767d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public IDreamServiceWrapper() { 3777d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 3787d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 3797d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public void attach(IBinder windowToken) { 3807d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler Dream.this.attach(windowToken); 3817d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 3827d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 3837d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler 3847d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler /** 3857d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * Implement to return the implementation of the internal accessibility 3867d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler * service interface. Subclasses should not override. 3877d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler */ 3887d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler @Override 3897d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler public final IBinder onBind(Intent intent) { 3907d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler return new IDreamServiceWrapper(); 3917d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler } 3927d276c377ce0c56630c06a6da431a6cb9bd76d1eDaniel Sandler} 393