Re-enable dreams: frameworks/base

Enable feature in config. Expose Dream in public api for unbundled apps.
Unhide package.  Add isDreaming() method to service.

Re-arrange the Dream api a bit.  (use onStart as hook for subclasses).
Coordinate properly with power manager.

Replace old dock mode (don't fire old intent).

Change-Id: I1318d20cc1613e5d862f2913f2fcdc9719302cf7
Bug: 6921930
diff --git a/services/java/com/android/server/DockObserver.java b/services/java/com/android/server/DockObserver.java
index e7dac72..8bac52c 100644
--- a/services/java/com/android/server/DockObserver.java
+++ b/services/java/com/android/server/DockObserver.java
@@ -29,9 +29,12 @@
 import android.net.Uri;
 import android.os.Handler;
 import android.os.Message;
+import android.os.RemoteException;
+import android.os.ServiceManager;
 import android.os.SystemClock;
 import android.os.UEventObserver;
 import android.provider.Settings;
+import android.service.dreams.IDreamManager;
 import android.util.Log;
 import android.util.Slog;
 
@@ -194,7 +197,29 @@
                             }
                         }
 
-                        mContext.sendStickyBroadcast(intent);
+                        IDreamManager mgr = IDreamManager.Stub.asInterface(ServiceManager.getService("dreams"));
+                        if (mgr != null) {
+                            // dreams feature enabled
+                            boolean undocked = mDockState == Intent.EXTRA_DOCK_STATE_UNDOCKED;
+                            if (undocked) {
+                                try {
+                                    if (mgr.isDreaming()) {
+                                        mgr.awaken();
+                                    }
+                                } catch (RemoteException e) {
+                                    Slog.w(TAG, "Unable to awaken!", e);
+                                }
+                            } else {
+                                try {
+                                    mgr.dream();
+                                } catch (RemoteException e) {
+                                    Slog.w(TAG, "Unable to dream!", e);
+                                }
+                            }
+                        } else {
+                            // dreams feature not enabled, send legacy intent
+                            mContext.sendStickyBroadcast(intent);
+                        }
                     }
                     break;
             }