From 30711f85612b8db57a79090429c6dbd00abfcf74 Mon Sep 17 00:00:00 2001 From: Darrell Shi Date: Wed, 2 Feb 2022 01:58:31 +0000 Subject: [PATCH] Read "showClockAndComplications" metadata. Read "showClockAndComplications" from dream metadata when binding to DreamOverlayService, and pass in the value in intent extra. Test: atest DreamServiceTest Test: manually on device Bug: 211519550 Change-Id: Id80899468ad76c77aec2057bbf2348eee47a8ac2 --- .../android/service/dreams/DreamService.java | 44 +++++++++++++++++-- .../res/xml/test_dream_metadata.xml | 3 +- .../server/dreams/DreamServiceTest.java | 2 + 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/core/java/android/service/dreams/DreamService.java b/core/java/android/service/dreams/DreamService.java index d27bc9b6a424b..fde8bfe7cadd8 100644 --- a/core/java/android/service/dreams/DreamService.java +++ b/core/java/android/service/dreams/DreamService.java @@ -65,6 +65,7 @@ import android.view.WindowManager; import android.view.WindowManager.LayoutParams; import android.view.accessibility.AccessibilityEvent; +import com.android.internal.R; import com.android.internal.util.DumpUtils; import org.xmlpull.v1.XmlPullParser; @@ -257,13 +258,16 @@ public class DreamService extends Service implements Window.Callback { mRequests = new ArrayDeque<>(); } - public void bind(Context context, @Nullable ComponentName overlayService) { + public void bind(Context context, @Nullable ComponentName overlayService, + ComponentName dreamService) { if (overlayService == null) { return; } final Intent overlayIntent = new Intent(); overlayIntent.setComponent(overlayService); + overlayIntent.putExtra(EXTRA_SHOW_COMPLICATIONS, + fetchShouldShowComplications(context, dreamService)); context.bindService(overlayIntent, this, Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE); @@ -985,7 +989,8 @@ public class DreamService extends Service implements Window.Callback { // Connect to the overlay service if present. if (!mWindowless) { - mOverlayConnection.bind(this, intent.getParcelableExtra(EXTRA_DREAM_OVERLAY_COMPONENT)); + mOverlayConnection.bind(this, intent.getParcelableExtra(EXTRA_DREAM_OVERLAY_COMPONENT), + new ComponentName(this, getClass())); } return mDreamServiceWrapper; @@ -1117,7 +1122,9 @@ public class DreamService extends Service implements Window.Callback { convertToComponentName(rawMetadata.getString( com.android.internal.R.styleable.Dream_settingsActivity), serviceInfo), rawMetadata.getDrawable( - com.android.internal.R.styleable.Dream_previewImage)); + com.android.internal.R.styleable.Dream_previewImage), + rawMetadata.getBoolean(R.styleable.Dream_showClockAndComplications, + DEFAULT_SHOW_COMPLICATIONS)); rawMetadata.recycle(); return metadata; } @@ -1336,6 +1343,30 @@ public class DreamService extends Service implements Window.Callback { return (oldFlags&~mask) | (flags&mask); } + /** + * Fetches metadata of the dream indicated by the ${@link ComponentName}, and returns whether + * the dream should show complications on the overlay. If not defined, returns + * ${@link DreamService#DEFAULT_SHOW_COMPLICATIONS}. + */ + private static boolean fetchShouldShowComplications(Context context, + ComponentName componentName) { + final PackageManager pm = context.getPackageManager(); + + try { + final ServiceInfo si = pm.getServiceInfo(componentName, + PackageManager.ComponentInfoFlags.of(PackageManager.GET_META_DATA)); + final DreamMetadata metadata = getDreamMetadata(context, si); + + if (metadata != null) { + return metadata.showComplications; + } + } catch (PackageManager.NameNotFoundException e) { + if (DEBUG) Log.w(TAG, "cannot find component " + componentName.flattenToShortString()); + } + + return DEFAULT_SHOW_COMPLICATIONS; + } + @Override protected void dump(final FileDescriptor fd, PrintWriter pw, final String[] args) { DumpUtils.dumpAsync(mHandler, (pw1, prefix) -> dumpOnHandler(fd, pw1, args), pw, "", 1000); @@ -1409,9 +1440,14 @@ public class DreamService extends Service implements Window.Callback { @Nullable public final Drawable previewImage; - DreamMetadata(ComponentName settingsActivity, Drawable previewImage) { + @Nullable + public final boolean showComplications; + + DreamMetadata(ComponentName settingsActivity, Drawable previewImage, + boolean showComplications) { this.settingsActivity = settingsActivity; this.previewImage = previewImage; + this.showComplications = showComplications; } } } diff --git a/services/tests/servicestests/res/xml/test_dream_metadata.xml b/services/tests/servicestests/res/xml/test_dream_metadata.xml index 8d765917ab374..aa054f1e9fa4f 100644 --- a/services/tests/servicestests/res/xml/test_dream_metadata.xml +++ b/services/tests/servicestests/res/xml/test_dream_metadata.xml @@ -15,4 +15,5 @@ --> + android:settingsActivity="com.android.server.dreams/.TestDreamSettingsActivity" + android:showClockAndComplications="false" /> diff --git a/services/tests/servicestests/src/com/android/server/dreams/DreamServiceTest.java b/services/tests/servicestests/src/com/android/server/dreams/DreamServiceTest.java index 305d6f4842de2..b489a2a6b6c25 100644 --- a/services/tests/servicestests/src/com/android/server/dreams/DreamServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/dreams/DreamServiceTest.java @@ -17,6 +17,7 @@ package com.android.server.dreams; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import android.content.ComponentName; import android.content.Context; @@ -49,6 +50,7 @@ public class DreamServiceTest { assertEquals(0, metadata.settingsActivity.compareTo( ComponentName.unflattenFromString(testSettingsActivity))); + assertFalse(metadata.showComplications); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); }