summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/app/DreamManager.java15
-rw-r--r--core/java/android/service/dreams/IDreamManager.aidl2
-rw-r--r--services/core/java/com/android/server/dreams/DreamManagerService.java72
3 files changed, 79 insertions, 10 deletions
diff --git a/core/java/android/app/DreamManager.java b/core/java/android/app/DreamManager.java
index 4ac40a1f77b2..c597a9dcae7e 100644
--- a/core/java/android/app/DreamManager.java
+++ b/core/java/android/app/DreamManager.java
@@ -234,4 +234,19 @@ public class DreamManager {
throw e.rethrowFromSystemServer();
}
}
+
+ /**
+ * Notifies dream manager of device postured state, which may affect dream enablement.
+ *
+ * @hide
+ */
+ @FlaggedApi(Flags.FLAG_ALLOW_DREAM_WHEN_POSTURED)
+ @RequiresPermission(android.Manifest.permission.WRITE_DREAM_STATE)
+ public void setDevicePostured(boolean isPostured) {
+ try {
+ mService.setDevicePostured(isPostured);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
}
diff --git a/core/java/android/service/dreams/IDreamManager.aidl b/core/java/android/service/dreams/IDreamManager.aidl
index 1c0a2c021bca..3ca9d937b0ca 100644
--- a/core/java/android/service/dreams/IDreamManager.aidl
+++ b/core/java/android/service/dreams/IDreamManager.aidl
@@ -53,6 +53,8 @@ interface IDreamManager {
void startDreamActivity(in Intent intent);
@JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.WRITE_DREAM_STATE)")
oneway void setDreamIsObscured(in boolean isObscured);
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.WRITE_DREAM_STATE)")
+ oneway void setDevicePostured(in boolean isPostured);
oneway void startDozingOneway(in IBinder token, int screenState, int reason,
float screenBrightnessFloat, int screenBrightnessInt,
boolean useNormalBrightnessForDoze);
diff --git a/services/core/java/com/android/server/dreams/DreamManagerService.java b/services/core/java/com/android/server/dreams/DreamManagerService.java
index 0c04be10d06d..67b1ec305d7f 100644
--- a/services/core/java/com/android/server/dreams/DreamManagerService.java
+++ b/services/core/java/com/android/server/dreams/DreamManagerService.java
@@ -20,6 +20,7 @@ import static android.Manifest.permission.BIND_DREAM_SERVICE;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_DREAM;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
+import static android.service.dreams.Flags.allowDreamWhenPostured;
import static android.service.dreams.Flags.cleanupDreamSettingsOnUninstall;
import static android.service.dreams.Flags.dreamHandlesBeingObscured;
@@ -110,12 +111,13 @@ public final class DreamManagerService extends SystemService {
/** Constants for the when to activate dreams. */
@Retention(RetentionPolicy.SOURCE)
- @IntDef({DREAM_ON_DOCK, DREAM_ON_CHARGE, DREAM_ON_DOCK_OR_CHARGE})
+ @IntDef({DREAM_DISABLED, DREAM_ON_DOCK, DREAM_ON_CHARGE, DREAM_ON_POSTURED})
public @interface WhenToDream {}
- private static final int DREAM_DISABLED = 0x0;
- private static final int DREAM_ON_DOCK = 0x1;
- private static final int DREAM_ON_CHARGE = 0x2;
- private static final int DREAM_ON_DOCK_OR_CHARGE = 0x3;
+
+ private static final int DREAM_DISABLED = 0;
+ private static final int DREAM_ON_DOCK = 1 << 0;
+ private static final int DREAM_ON_CHARGE = 1 << 1;
+ private static final int DREAM_ON_POSTURED = 1 << 2;
private final Object mLock = new Object();
@@ -137,6 +139,7 @@ public final class DreamManagerService extends SystemService {
private final boolean mDreamsEnabledByDefaultConfig;
private final boolean mDreamsActivatedOnChargeByDefault;
private final boolean mDreamsActivatedOnDockByDefault;
+ private final boolean mDreamsActivatedOnPosturedByDefault;
private final boolean mKeepDreamingWhenUnpluggingDefault;
private final boolean mDreamsDisabledByAmbientModeSuppressionConfig;
@@ -152,6 +155,7 @@ public final class DreamManagerService extends SystemService {
@WhenToDream private int mWhenToDream;
private boolean mIsDocked;
private boolean mIsCharging;
+ private boolean mIsPostured;
// A temporary dream component that, when present, takes precedence over user configured dream
// component.
@@ -270,6 +274,8 @@ public final class DreamManagerService extends SystemService {
com.android.internal.R.bool.config_dreamsActivatedOnSleepByDefault);
mDreamsActivatedOnDockByDefault = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_dreamsActivatedOnDockByDefault);
+ mDreamsActivatedOnPosturedByDefault = mContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_dreamsActivatedOnPosturedByDefault);
mSettingsObserver = new SettingsObserver(mHandler);
mKeepDreamingWhenUnpluggingDefault = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_keepDreamingWhenUnplugging);
@@ -328,6 +334,9 @@ public final class DreamManagerService extends SystemService {
Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK),
false, mSettingsObserver, UserHandle.USER_ALL);
mContext.getContentResolver().registerContentObserver(Settings.Secure.getUriFor(
+ Settings.Secure.SCREENSAVER_ACTIVATE_ON_POSTURED),
+ false, mSettingsObserver, UserHandle.USER_ALL);
+ mContext.getContentResolver().registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.SCREENSAVER_ENABLED),
false, mSettingsObserver, UserHandle.USER_ALL);
@@ -392,6 +401,8 @@ public final class DreamManagerService extends SystemService {
pw.println("mDreamsEnabledSetting=" + mDreamsEnabledSetting);
pw.println("mDreamsActivatedOnDockByDefault=" + mDreamsActivatedOnDockByDefault);
pw.println("mDreamsActivatedOnChargeByDefault=" + mDreamsActivatedOnChargeByDefault);
+ pw.println("mDreamsActivatedOnPosturedByDefault="
+ + mDreamsActivatedOnPosturedByDefault);
pw.println("mIsDocked=" + mIsDocked);
pw.println("mIsCharging=" + mIsCharging);
pw.println("mWhenToDream=" + mWhenToDream);
@@ -409,15 +420,28 @@ public final class DreamManagerService extends SystemService {
synchronized (mLock) {
final ContentResolver resolver = mContext.getContentResolver();
- final int activateWhenCharging = (Settings.Secure.getIntForUser(resolver,
+ mWhenToDream = DREAM_DISABLED;
+
+ if ((Settings.Secure.getIntForUser(resolver,
Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP,
mDreamsActivatedOnChargeByDefault ? 1 : 0,
- UserHandle.USER_CURRENT) != 0) ? DREAM_ON_CHARGE : DREAM_DISABLED;
- final int activateWhenDocked = (Settings.Secure.getIntForUser(resolver,
+ UserHandle.USER_CURRENT) != 0)) {
+ mWhenToDream |= DREAM_ON_CHARGE;
+ }
+
+ if (Settings.Secure.getIntForUser(resolver,
Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK,
mDreamsActivatedOnDockByDefault ? 1 : 0,
- UserHandle.USER_CURRENT) != 0) ? DREAM_ON_DOCK : DREAM_DISABLED;
- mWhenToDream = activateWhenCharging + activateWhenDocked;
+ UserHandle.USER_CURRENT) != 0) {
+ mWhenToDream |= DREAM_ON_DOCK;
+ }
+
+ if (Settings.Secure.getIntForUser(resolver,
+ Settings.Secure.SCREENSAVER_ACTIVATE_ON_POSTURED,
+ mDreamsActivatedOnPosturedByDefault ? 1 : 0,
+ UserHandle.USER_CURRENT) != 0) {
+ mWhenToDream |= DREAM_ON_POSTURED;
+ }
mDreamsEnabledSetting = (Settings.Secure.getIntForUser(resolver,
Settings.Secure.SCREENSAVER_ENABLED,
@@ -508,6 +532,10 @@ public final class DreamManagerService extends SystemService {
return mIsDocked;
}
+ if ((mWhenToDream & DREAM_ON_POSTURED) == DREAM_ON_POSTURED) {
+ return mIsPostured;
+ }
+
return false;
}
}
@@ -646,6 +674,14 @@ public final class DreamManagerService extends SystemService {
}
}
+ private void setDevicePosturedInternal(boolean isPostured) {
+ Slog.d(TAG, "Device postured: " + isPostured);
+ synchronized (mLock) {
+ mIsPostured = isPostured;
+ mHandler.post(() -> mPowerManagerInternal.setDevicePostured(isPostured));
+ }
+ }
+
/**
* If doze is true, returns the doze component for the user.
* Otherwise, returns the system dream component, if present.
@@ -1294,6 +1330,22 @@ public final class DreamManagerService extends SystemService {
}
}
+ @Override
+ public void setDevicePostured(boolean isPostured) {
+ if (!allowDreamWhenPostured()) {
+ return;
+ }
+
+ checkPermission(android.Manifest.permission.WRITE_DREAM_STATE);
+
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ setDevicePosturedInternal(isPostured);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
boolean canLaunchDreamActivity(String dreamPackageName, String packageName,
int callingUid) {
if (dreamPackageName == null || packageName == null) {