diff --git a/core/java/android/service/dreams/DreamService.java b/core/java/android/service/dreams/DreamService.java index 6a4710f9475a5..47b5f003ed6c0 100644 --- a/core/java/android/service/dreams/DreamService.java +++ b/core/java/android/service/dreams/DreamService.java @@ -1300,9 +1300,10 @@ public class DreamService extends Service implements Window.Callback { * Must run on mHandler. * * @param dreamToken Token for this dream service. - * @param started A callback that will be invoked once onDreamingStarted has completed. + * @param started A callback that will be invoked once onDreamingStarted has completed. */ - private void attach(IBinder dreamToken, boolean canDoze, IRemoteCallback started) { + private void attach(IBinder dreamToken, boolean canDoze, boolean isPreviewMode, + IRemoteCallback started) { if (mDreamToken != null) { Slog.e(mTag, "attach() called when dream with token=" + mDreamToken + " already attached"); @@ -1350,7 +1351,8 @@ public class DreamService extends Service implements Window.Callback { i.putExtra(DreamActivity.EXTRA_CALLBACK, new DreamActivityCallbacks(mDreamToken)); final ServiceInfo serviceInfo = fetchServiceInfo(this, new ComponentName(this, getClass())); - i.putExtra(DreamActivity.EXTRA_DREAM_TITLE, fetchDreamLabel(this, serviceInfo)); + i.putExtra(DreamActivity.EXTRA_DREAM_TITLE, + fetchDreamLabel(this, serviceInfo, isPreviewMode)); try { if (!ActivityTaskManager.getService().startDreamActivity(i)) { @@ -1466,10 +1468,18 @@ public class DreamService extends Service implements Window.Callback { @Nullable private static CharSequence fetchDreamLabel(Context context, - @Nullable ServiceInfo serviceInfo) { - if (serviceInfo == null) return null; + @Nullable ServiceInfo serviceInfo, + boolean isPreviewMode) { + if (serviceInfo == null) { + return null; + } final PackageManager pm = context.getPackageManager(); - return serviceInfo.loadLabel(pm); + final CharSequence dreamLabel = serviceInfo.loadLabel(pm); + if (!isPreviewMode || dreamLabel == null) { + return dreamLabel; + } + // When in preview mode, return a special label indicating the dream is in preview. + return context.getResources().getString(R.string.dream_preview_title, dreamLabel); } @Nullable @@ -1525,8 +1535,9 @@ public class DreamService extends Service implements Window.Callback { final class DreamServiceWrapper extends IDreamService.Stub { @Override public void attach(final IBinder dreamToken, final boolean canDoze, - IRemoteCallback started) { - mHandler.post(() -> DreamService.this.attach(dreamToken, canDoze, started)); + final boolean isPreviewMode, IRemoteCallback started) { + mHandler.post( + () -> DreamService.this.attach(dreamToken, canDoze, isPreviewMode, started)); } @Override diff --git a/core/java/android/service/dreams/IDreamService.aidl b/core/java/android/service/dreams/IDreamService.aidl index ce04354989179..8b5d8754647c2 100644 --- a/core/java/android/service/dreams/IDreamService.aidl +++ b/core/java/android/service/dreams/IDreamService.aidl @@ -22,7 +22,7 @@ import android.os.IRemoteCallback; * @hide */ oneway interface IDreamService { - void attach(IBinder windowToken, boolean canDoze, IRemoteCallback started); + void attach(IBinder windowToken, boolean canDoze, boolean isPreviewMode, IRemoteCallback started); void detach(); void wakeUp(); } diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index ba541839ee0c4..2091c0502b6f7 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -975,6 +975,11 @@ Can take a screenshot of the display. + + + + Preview, %1$s + diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 200ea44e9845e..00d11888ff390 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -4281,6 +4281,8 @@ + + diff --git a/services/core/java/com/android/server/dreams/DreamController.java b/services/core/java/com/android/server/dreams/DreamController.java index 61f7928095252..f74356debd0f0 100644 --- a/services/core/java/com/android/server/dreams/DreamController.java +++ b/services/core/java/com/android/server/dreams/DreamController.java @@ -270,7 +270,7 @@ final class DreamController { try { service.asBinder().linkToDeath(mCurrentDream, 0); service.attach(mCurrentDream.mToken, mCurrentDream.mCanDoze, - mCurrentDream.mDreamingStartedCallback); + mCurrentDream.mIsPreviewMode, mCurrentDream.mDreamingStartedCallback); } catch (RemoteException ex) { Slog.e(TAG, "The dream service died unexpectedly.", ex); stopDream(true /*immediate*/, "attach failed"); diff --git a/services/tests/servicestests/src/com/android/server/dreams/DreamControllerTest.java b/services/tests/servicestests/src/com/android/server/dreams/DreamControllerTest.java index 303a370b0ba9a..1ef11974292b2 100644 --- a/services/tests/servicestests/src/com/android/server/dreams/DreamControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/dreams/DreamControllerTest.java @@ -99,7 +99,24 @@ public class DreamControllerTest { mLooper.dispatchAll(); // Verify that dream service is called to attach. - verify(mIDreamService).attach(eq(mToken), eq(false) /*doze*/, any()); + verify(mIDreamService).attach(eq(mToken), eq(false) /*doze*/, + eq(false) /*preview*/, any()); + } + + @Test + public void startDream_attachOnServiceConnectedInPreviewMode() throws RemoteException { + // Call dream controller to start dreaming. + mDreamController.startDream(mToken, mDreamName, true /*isPreview*/, false /*doze*/, + 0 /*userId*/, null /*wakeLock*/, mOverlayName, "test" /*reason*/); + + // Mock service connected. + final ServiceConnection serviceConnection = captureServiceConnection(); + serviceConnection.onServiceConnected(mDreamName, mIBinder); + mLooper.dispatchAll(); + + // Verify that dream service is called to attach. + verify(mIDreamService).attach(eq(mToken), eq(false) /*doze*/, + eq(true) /*preview*/, any()); } @Test @@ -129,7 +146,7 @@ public class DreamControllerTest { // Mock second dream started. verify(newDreamService).attach(eq(newToken), eq(false) /*doze*/, - mRemoteCallbackCaptor.capture()); + eq(false) /*preview*/, mRemoteCallbackCaptor.capture()); mRemoteCallbackCaptor.getValue().sendResult(null /*data*/); mLooper.dispatchAll();