Merge changes I26362ce1,I4ec34b99 into tm-dev

* changes:
  Pipe the dream label to the dream overlay service.
  Pipe the preview boolean to the dream overlay service.
This commit is contained in:
Lucas Silva
2022-02-23 15:28:14 +00:00
committed by Android (Google) Code Review
6 changed files with 116 additions and 34 deletions

View File

@@ -2347,6 +2347,8 @@ package android.service.dreams {
public abstract class DreamOverlayService extends android.app.Service { public abstract class DreamOverlayService extends android.app.Service {
ctor public DreamOverlayService(); ctor public DreamOverlayService();
method @Nullable public final CharSequence getDreamLabel();
method public final boolean isPreviewMode();
method @Nullable public final android.os.IBinder onBind(@NonNull android.content.Intent); method @Nullable public final android.os.IBinder onBind(@NonNull android.content.Intent);
method public abstract void onStartDream(@NonNull android.view.WindowManager.LayoutParams); method public abstract void onStartDream(@NonNull android.view.WindowManager.LayoutParams);
method public final void requestExit(); method public final void requestExit();

View File

@@ -36,6 +36,9 @@ public abstract class DreamOverlayService extends Service {
private static final String TAG = "DreamOverlayService"; private static final String TAG = "DreamOverlayService";
private static final boolean DEBUG = false; private static final boolean DEBUG = false;
private boolean mShowComplications; private boolean mShowComplications;
private boolean mIsPreviewMode;
@Nullable
private CharSequence mDreamLabel;
private IDreamOverlay mDreamOverlay = new IDreamOverlay.Stub() { private IDreamOverlay mDreamOverlay = new IDreamOverlay.Stub() {
@Override @Override
@@ -56,6 +59,8 @@ public abstract class DreamOverlayService extends Service {
public final IBinder onBind(@NonNull Intent intent) { public final IBinder onBind(@NonNull Intent intent) {
mShowComplications = intent.getBooleanExtra(DreamService.EXTRA_SHOW_COMPLICATIONS, mShowComplications = intent.getBooleanExtra(DreamService.EXTRA_SHOW_COMPLICATIONS,
DreamService.DEFAULT_SHOW_COMPLICATIONS); DreamService.DEFAULT_SHOW_COMPLICATIONS);
mIsPreviewMode = intent.getBooleanExtra(DreamService.EXTRA_IS_PREVIEW, false);
mDreamLabel = intent.getCharSequenceExtra(DreamService.EXTRA_DREAM_LABEL);
return mDreamOverlay.asBinder(); return mDreamOverlay.asBinder();
} }
@@ -84,4 +89,19 @@ public abstract class DreamOverlayService extends Service {
public final boolean shouldShowComplications() { public final boolean shouldShowComplications() {
return mShowComplications; return mShowComplications;
} }
/**
* Returns whether the dream is running in preview mode.
*/
public final boolean isPreviewMode() {
return mIsPreviewMode;
}
/**
* Returns the user-facing label of the currently running dream.
*/
@Nullable
public final CharSequence getDreamLabel() {
return mDreamLabel;
}
} }

View File

@@ -215,6 +215,18 @@ public class DreamService extends Service implements Window.Callback {
public static final String EXTRA_SHOW_COMPLICATIONS = public static final String EXTRA_SHOW_COMPLICATIONS =
"android.service.dreams.SHOW_COMPLICATIONS"; "android.service.dreams.SHOW_COMPLICATIONS";
/**
* Extra containing a boolean for whether we are showing this dream in preview mode.
* @hide
*/
public static final String EXTRA_IS_PREVIEW = "android.service.dreams.IS_PREVIEW";
/**
* The user-facing label of the current dream service.
* @hide
*/
public static final String EXTRA_DREAM_LABEL = "android.service.dreams.DREAM_LABEL";
/** /**
* The default value for whether to show complications on the overlay. * The default value for whether to show complications on the overlay.
* @hide * @hide
@@ -258,15 +270,19 @@ public class DreamService extends Service implements Window.Callback {
} }
public void bind(Context context, @Nullable ComponentName overlayService, public void bind(Context context, @Nullable ComponentName overlayService,
ComponentName dreamService) { ComponentName dreamService, boolean isPreviewMode) {
if (overlayService == null) { if (overlayService == null) {
return; return;
} }
final ServiceInfo serviceInfo = fetchServiceInfo(context, dreamService);
final Intent overlayIntent = new Intent(); final Intent overlayIntent = new Intent();
overlayIntent.setComponent(overlayService); overlayIntent.setComponent(overlayService);
overlayIntent.putExtra(EXTRA_SHOW_COMPLICATIONS, overlayIntent.putExtra(EXTRA_SHOW_COMPLICATIONS,
fetchShouldShowComplications(context, dreamService)); fetchShouldShowComplications(context, serviceInfo));
overlayIntent.putExtra(EXTRA_DREAM_LABEL, fetchDreamLabel(context, serviceInfo));
overlayIntent.putExtra(EXTRA_IS_PREVIEW, isPreviewMode);
context.bindService(overlayIntent, context.bindService(overlayIntent,
this, Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE); this, Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE);
@@ -988,8 +1004,11 @@ public class DreamService extends Service implements Window.Callback {
// Connect to the overlay service if present. // Connect to the overlay service if present.
if (!mWindowless) { if (!mWindowless) {
mOverlayConnection.bind(this, intent.getParcelableExtra(EXTRA_DREAM_OVERLAY_COMPONENT), mOverlayConnection.bind(
new ComponentName(this, getClass())); /* context= */ this,
intent.getParcelableExtra(EXTRA_DREAM_OVERLAY_COMPONENT),
new ComponentName(this, getClass()),
intent.getBooleanExtra(EXTRA_IS_PREVIEW, /* defaultValue= */ false));
} }
return mDreamServiceWrapper; return mDreamServiceWrapper;
@@ -1111,7 +1130,10 @@ public class DreamService extends Service implements Window.Callback {
* @hide * @hide
*/ */
@Nullable @Nullable
public static DreamMetadata getDreamMetadata(Context context, ServiceInfo serviceInfo) { public static DreamMetadata getDreamMetadata(Context context,
@Nullable ServiceInfo serviceInfo) {
if (serviceInfo == null) return null;
final PackageManager pm = context.getPackageManager(); final PackageManager pm = context.getPackageManager();
final TypedArray rawMetadata = readMetadata(pm, serviceInfo); final TypedArray rawMetadata = readMetadata(pm, serviceInfo);
@@ -1350,22 +1372,33 @@ public class DreamService extends Service implements Window.Callback {
* {@link DreamService#DEFAULT_SHOW_COMPLICATIONS}. * {@link DreamService#DEFAULT_SHOW_COMPLICATIONS}.
*/ */
private static boolean fetchShouldShowComplications(Context context, private static boolean fetchShouldShowComplications(Context context,
ComponentName componentName) { @Nullable ServiceInfo serviceInfo) {
final DreamMetadata metadata = getDreamMetadata(context, serviceInfo);
if (metadata != null) {
return metadata.showComplications;
}
return DEFAULT_SHOW_COMPLICATIONS;
}
@Nullable
private static CharSequence fetchDreamLabel(Context context,
@Nullable ServiceInfo serviceInfo) {
if (serviceInfo == null) return null;
final PackageManager pm = context.getPackageManager();
return serviceInfo.loadLabel(pm);
}
@Nullable
private static ServiceInfo fetchServiceInfo(Context context, ComponentName componentName) {
final PackageManager pm = context.getPackageManager(); final PackageManager pm = context.getPackageManager();
try { try {
final ServiceInfo si = pm.getServiceInfo(componentName, return pm.getServiceInfo(componentName,
PackageManager.ComponentInfoFlags.of(PackageManager.GET_META_DATA)); PackageManager.ComponentInfoFlags.of(PackageManager.GET_META_DATA));
final DreamMetadata metadata = getDreamMetadata(context, si);
if (metadata != null) {
return metadata.showComplications;
}
} catch (PackageManager.NameNotFoundException e) { } catch (PackageManager.NameNotFoundException e) {
if (DEBUG) Log.w(TAG, "cannot find component " + componentName.flattenToShortString()); if (DEBUG) Log.w(TAG, "cannot find component " + componentName.flattenToShortString());
} }
return null;
return DEFAULT_SHOW_COMPLICATIONS;
} }
@Override @Override

View File

@@ -162,6 +162,31 @@ public class DreamOverlayServiceTest extends SysuiTestCase {
assertThat(mService.shouldShowComplications()).isFalse(); assertThat(mService.shouldShowComplications()).isFalse();
} }
@Test
public void testPreviewModeFalseByDefault() {
mService.onBind(new Intent());
assertThat(mService.isPreviewMode()).isFalse();
}
@Test
public void testPreviewModeSetByIntentExtra() {
final Intent intent = new Intent();
intent.putExtra(DreamService.EXTRA_IS_PREVIEW, true);
mService.onBind(intent);
assertThat(mService.isPreviewMode()).isTrue();
}
@Test
public void testDreamLabel() {
final Intent intent = new Intent();
intent.putExtra(DreamService.EXTRA_DREAM_LABEL, "TestDream");
mService.onBind(intent);
assertThat(mService.getDreamLabel()).isEqualTo("TestDream");
}
@Test @Test
public void testDestroy() { public void testDestroy() {
mService.onDestroy(); mService.onDestroy();

View File

@@ -104,7 +104,7 @@ final class DreamController {
pw.println(" mCurrentDream:"); pw.println(" mCurrentDream:");
pw.println(" mToken=" + mCurrentDream.mToken); pw.println(" mToken=" + mCurrentDream.mToken);
pw.println(" mName=" + mCurrentDream.mName); pw.println(" mName=" + mCurrentDream.mName);
pw.println(" mIsTest=" + mCurrentDream.mIsTest); pw.println(" mIsPreviewMode=" + mCurrentDream.mIsPreviewMode);
pw.println(" mCanDoze=" + mCurrentDream.mCanDoze); pw.println(" mCanDoze=" + mCurrentDream.mCanDoze);
pw.println(" mUserId=" + mCurrentDream.mUserId); pw.println(" mUserId=" + mCurrentDream.mUserId);
pw.println(" mBound=" + mCurrentDream.mBound); pw.println(" mBound=" + mCurrentDream.mBound);
@@ -117,7 +117,7 @@ final class DreamController {
} }
public void startDream(Binder token, ComponentName name, public void startDream(Binder token, ComponentName name,
boolean isTest, boolean canDoze, int userId, PowerManager.WakeLock wakeLock, boolean isPreviewMode, boolean canDoze, int userId, PowerManager.WakeLock wakeLock,
ComponentName overlayComponentName) { ComponentName overlayComponentName) {
stopDream(true /*immediate*/, "starting new dream"); stopDream(true /*immediate*/, "starting new dream");
@@ -127,10 +127,10 @@ final class DreamController {
mContext.sendBroadcastAsUser(mCloseNotificationShadeIntent, UserHandle.ALL); mContext.sendBroadcastAsUser(mCloseNotificationShadeIntent, UserHandle.ALL);
Slog.i(TAG, "Starting dream: name=" + name Slog.i(TAG, "Starting dream: name=" + name
+ ", isTest=" + isTest + ", canDoze=" + canDoze + ", isPreviewMode=" + isPreviewMode + ", canDoze=" + canDoze
+ ", userId=" + userId); + ", userId=" + userId);
mCurrentDream = new DreamRecord(token, name, isTest, canDoze, userId, wakeLock); mCurrentDream = new DreamRecord(token, name, isPreviewMode, canDoze, userId, wakeLock);
mDreamStartTime = SystemClock.elapsedRealtime(); mDreamStartTime = SystemClock.elapsedRealtime();
MetricsLogger.visible(mContext, MetricsLogger.visible(mContext,
@@ -140,6 +140,7 @@ final class DreamController {
intent.setComponent(name); intent.setComponent(name);
intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
intent.putExtra(DreamService.EXTRA_DREAM_OVERLAY_COMPONENT, overlayComponentName); intent.putExtra(DreamService.EXTRA_DREAM_OVERLAY_COMPONENT, overlayComponentName);
intent.putExtra(DreamService.EXTRA_IS_PREVIEW, isPreviewMode);
try { try {
if (!mContext.bindServiceAsUser(intent, mCurrentDream, if (!mContext.bindServiceAsUser(intent, mCurrentDream,
Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE, Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE,
@@ -190,7 +191,8 @@ final class DreamController {
final DreamRecord oldDream = mCurrentDream; final DreamRecord oldDream = mCurrentDream;
mCurrentDream = null; mCurrentDream = null;
Slog.i(TAG, "Stopping dream: name=" + oldDream.mName Slog.i(TAG, "Stopping dream: name=" + oldDream.mName
+ ", isTest=" + oldDream.mIsTest + ", canDoze=" + oldDream.mCanDoze + ", isPreviewMode=" + oldDream.mIsPreviewMode
+ ", canDoze=" + oldDream.mCanDoze
+ ", userId=" + oldDream.mUserId + ", userId=" + oldDream.mUserId
+ ", reason='" + reason + "'" + ", reason='" + reason + "'"
+ (mSavedStopReason == null ? "" : "(from '" + mSavedStopReason + "')")); + (mSavedStopReason == null ? "" : "(from '" + mSavedStopReason + "')"));
@@ -247,7 +249,7 @@ final class DreamController {
mCurrentDream.mService = service; mCurrentDream.mService = service;
if (!mCurrentDream.mIsTest) { if (!mCurrentDream.mIsPreviewMode) {
mContext.sendBroadcastAsUser(mDreamingStartedIntent, UserHandle.ALL); mContext.sendBroadcastAsUser(mDreamingStartedIntent, UserHandle.ALL);
mCurrentDream.mSentStartBroadcast = true; mCurrentDream.mSentStartBroadcast = true;
} }
@@ -263,7 +265,7 @@ final class DreamController {
private final class DreamRecord implements DeathRecipient, ServiceConnection { private final class DreamRecord implements DeathRecipient, ServiceConnection {
public final Binder mToken; public final Binder mToken;
public final ComponentName mName; public final ComponentName mName;
public final boolean mIsTest; public final boolean mIsPreviewMode;
public final boolean mCanDoze; public final boolean mCanDoze;
public final int mUserId; public final int mUserId;
@@ -275,11 +277,11 @@ final class DreamController {
public boolean mWakingGently; public boolean mWakingGently;
public DreamRecord(Binder token, ComponentName name, DreamRecord(Binder token, ComponentName name, boolean isPreviewMode,
boolean isTest, boolean canDoze, int userId, PowerManager.WakeLock wakeLock) { boolean canDoze, int userId, PowerManager.WakeLock wakeLock) {
mToken = token; mToken = token;
mName = name; mName = name;
mIsTest = isTest; mIsPreviewMode = isPreviewMode;
mCanDoze = canDoze; mCanDoze = canDoze;
mUserId = userId; mUserId = userId;
mWakeLock = wakeLock; mWakeLock = wakeLock;

View File

@@ -87,7 +87,7 @@ public final class DreamManagerService extends SystemService {
private Binder mCurrentDreamToken; private Binder mCurrentDreamToken;
private ComponentName mCurrentDreamName; private ComponentName mCurrentDreamName;
private int mCurrentDreamUserId; private int mCurrentDreamUserId;
private boolean mCurrentDreamIsTest; private boolean mCurrentDreamIsPreview;
private boolean mCurrentDreamCanDoze; private boolean mCurrentDreamCanDoze;
private boolean mCurrentDreamIsDozing; private boolean mCurrentDreamIsDozing;
private boolean mCurrentDreamIsWaking; private boolean mCurrentDreamIsWaking;
@@ -169,7 +169,7 @@ public final class DreamManagerService extends SystemService {
pw.println("mCurrentDreamToken=" + mCurrentDreamToken); pw.println("mCurrentDreamToken=" + mCurrentDreamToken);
pw.println("mCurrentDreamName=" + mCurrentDreamName); pw.println("mCurrentDreamName=" + mCurrentDreamName);
pw.println("mCurrentDreamUserId=" + mCurrentDreamUserId); pw.println("mCurrentDreamUserId=" + mCurrentDreamUserId);
pw.println("mCurrentDreamIsTest=" + mCurrentDreamIsTest); pw.println("mCurrentDreamIsPreview=" + mCurrentDreamIsPreview);
pw.println("mCurrentDreamCanDoze=" + mCurrentDreamCanDoze); pw.println("mCurrentDreamCanDoze=" + mCurrentDreamCanDoze);
pw.println("mCurrentDreamIsDozing=" + mCurrentDreamIsDozing); pw.println("mCurrentDreamIsDozing=" + mCurrentDreamIsDozing);
pw.println("mCurrentDreamIsWaking=" + mCurrentDreamIsWaking); pw.println("mCurrentDreamIsWaking=" + mCurrentDreamIsWaking);
@@ -190,7 +190,7 @@ public final class DreamManagerService extends SystemService {
private boolean isDreamingInternal() { private boolean isDreamingInternal() {
synchronized (mLock) { synchronized (mLock) {
return mCurrentDreamToken != null && !mCurrentDreamIsTest return mCurrentDreamToken != null && !mCurrentDreamIsPreview
&& !mCurrentDreamIsWaking; && !mCurrentDreamIsWaking;
} }
} }
@@ -235,7 +235,7 @@ public final class DreamManagerService extends SystemService {
private void testDreamInternal(ComponentName dream, int userId) { private void testDreamInternal(ComponentName dream, int userId) {
synchronized (mLock) { synchronized (mLock) {
startDreamLocked(dream, true /*isTest*/, false /*canDoze*/, userId); startDreamLocked(dream, true /*isPreviewMode*/, false /*canDoze*/, userId);
} }
} }
@@ -244,7 +244,7 @@ public final class DreamManagerService extends SystemService {
final ComponentName dream = chooseDreamForUser(doze, userId); final ComponentName dream = chooseDreamForUser(doze, userId);
if (dream != null) { if (dream != null) {
synchronized (mLock) { synchronized (mLock) {
startDreamLocked(dream, false /*isTest*/, doze, userId); startDreamLocked(dream, false /*isPreviewMode*/, doze, userId);
} }
} }
} }
@@ -395,10 +395,10 @@ public final class DreamManagerService extends SystemService {
} }
private void startDreamLocked(final ComponentName name, private void startDreamLocked(final ComponentName name,
final boolean isTest, final boolean canDoze, final int userId) { final boolean isPreviewMode, final boolean canDoze, final int userId) {
if (!mCurrentDreamIsWaking if (!mCurrentDreamIsWaking
&& Objects.equals(mCurrentDreamName, name) && Objects.equals(mCurrentDreamName, name)
&& mCurrentDreamIsTest == isTest && mCurrentDreamIsPreview == isPreviewMode
&& mCurrentDreamCanDoze == canDoze && mCurrentDreamCanDoze == canDoze
&& mCurrentDreamUserId == userId) { && mCurrentDreamUserId == userId) {
Slog.i(TAG, "Already in target dream."); Slog.i(TAG, "Already in target dream.");
@@ -412,7 +412,7 @@ public final class DreamManagerService extends SystemService {
final Binder newToken = new Binder(); final Binder newToken = new Binder();
mCurrentDreamToken = newToken; mCurrentDreamToken = newToken;
mCurrentDreamName = name; mCurrentDreamName = name;
mCurrentDreamIsTest = isTest; mCurrentDreamIsPreview = isPreviewMode;
mCurrentDreamCanDoze = canDoze; mCurrentDreamCanDoze = canDoze;
mCurrentDreamUserId = userId; mCurrentDreamUserId = userId;
@@ -424,7 +424,7 @@ public final class DreamManagerService extends SystemService {
.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "startDream"); .newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "startDream");
mHandler.post(wakeLock.wrap(() -> { mHandler.post(wakeLock.wrap(() -> {
mAtmInternal.notifyDreamStateChanged(true); mAtmInternal.notifyDreamStateChanged(true);
mController.startDream(newToken, name, isTest, canDoze, userId, wakeLock, mController.startDream(newToken, name, isPreviewMode, canDoze, userId, wakeLock,
mDreamOverlayServiceName); mDreamOverlayServiceName);
})); }));
} }
@@ -457,7 +457,7 @@ public final class DreamManagerService extends SystemService {
} }
mCurrentDreamToken = null; mCurrentDreamToken = null;
mCurrentDreamName = null; mCurrentDreamName = null;
mCurrentDreamIsTest = false; mCurrentDreamIsPreview = false;
mCurrentDreamCanDoze = false; mCurrentDreamCanDoze = false;
mCurrentDreamUserId = 0; mCurrentDreamUserId = 0;
mCurrentDreamIsWaking = false; mCurrentDreamIsWaking = false;