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