OSDN Git Service

ambient display: Fix volume key music control
authorChristopher R. Palmer <crpalmer@gmail.com>
Fri, 1 May 2015 10:15:47 +0000 (06:15 -0400)
committerSteve Kondik <steve@cyngn.com>
Sun, 4 Sep 2016 09:38:45 +0000 (02:38 -0700)
Previously the dream service would only report whether or not it was dreaming.
Ambient display counts as dreaming.  When dreaming, the volume inputs are
passed back to the application which is not what we want for ambient
display.

Fix this by exposing isDozing() and allow volume keys to control music
when we are dreaming and have moved into doze mode (aka, sleeping).

Change-Id: I3b1e72b95ec8b1b63ef0219259dfee77a5d339d3

core/java/android/service/dreams/DreamManagerInternal.java
core/java/android/service/dreams/IDreamManager.aidl
services/core/java/com/android/server/dreams/DreamManagerService.java
services/core/java/com/android/server/policy/PhoneWindowManager.java

index ff7cef9..c750b5e 100644 (file)
@@ -42,4 +42,9 @@ public abstract class DreamManagerInternal {
      * Called by the power manager to determine whether a dream is running.
      */
     public abstract boolean isDreaming();
+
+    /**
+     * Called by the power manager to determine whether the dream has gone to doze mode.
+     */
+    public abstract boolean isDozing();
 }
index be3f3b3..983d8a3 100644 (file)
@@ -30,6 +30,7 @@ interface IDreamManager {
     ComponentName getDefaultDreamComponent();
     void testDream(in ComponentName componentName);
     boolean isDreaming();
+    boolean isDozing();
     void finishSelf(in IBinder token, boolean immediate);
     void startDozing(in IBinder token, int screenState, int screenBrightness);
     void stopDozing(in IBinder token);
index 1f6616e..5fc3d55 100644 (file)
@@ -150,6 +150,12 @@ public final class DreamManagerService extends SystemService {
         }
     }
 
+    private boolean isDozingInternal() {
+        synchronized (mLock) {
+            return mCurrentDreamIsDozing;
+        }
+    }
+
     private void requestDreamInternal() {
         // Ask the power manager to nap.  It will eventually call back into
         // startDream() if/when it is appropriate to start dreaming.
@@ -531,6 +537,18 @@ public final class DreamManagerService extends SystemService {
         }
 
         @Override // Binder call
+        public boolean isDozing() {
+            checkPermission(android.Manifest.permission.READ_DREAM_STATE);
+
+            final long ident = Binder.clearCallingIdentity();
+            try {
+                return isDozingInternal();
+            } finally {
+                Binder.restoreCallingIdentity(ident);
+            }
+        }
+
+        @Override // Binder call
         public void dream() {
             checkPermission(android.Manifest.permission.WRITE_DREAM_STATE);
 
@@ -639,6 +657,11 @@ public final class DreamManagerService extends SystemService {
         public boolean isDreaming() {
             return isDreamingInternal();
         }
+
+        @Override
+        public boolean isDozing() {
+            return isDozingInternal();
+        }
     }
 
     private final Runnable mSystemPropertiesChanged = new Runnable() {
index 3560be9..b2b7397 100644 (file)
@@ -6588,7 +6588,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
         IDreamManager dreamManager = getDreamManager();
 
         try {
-            if (dreamManager != null && dreamManager.isDreaming()) {
+            if (dreamManager != null && dreamManager.isDreaming() && !dreamManager.isDozing()) {
                 return true;
             }
         } catch (RemoteException e) {