From 2c74424d07a272d65bca662f196597698610e5ce Mon Sep 17 00:00:00 2001 From: Ian Lake Date: Tue, 31 Jan 2017 10:53:22 -0800 Subject: [PATCH 1/2] Only enable Wear BOOT_COMPLETED receiver when complication is active We only need to reschedule the Artwork Complication Job on boot when there is a complication currently active. We can reduce overall memory pressure on boot by only having our BOOT_COMPLETED receiver active when needed. --- wearable/src/main/AndroidManifest.xml | 3 ++- .../complications/ArtworkComplicationJobService.java | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/wearable/src/main/AndroidManifest.xml b/wearable/src/main/AndroidManifest.xml index ab04b06f9..c1de155b0 100644 --- a/wearable/src/main/AndroidManifest.xml +++ b/wearable/src/main/AndroidManifest.xml @@ -84,7 +84,8 @@ android:exported="true" android:permission="android.permission.BIND_JOB_SERVICE" /> + android:name="com.google.android.apps.muzei.complications.ArtworkComplicationBootReceiver" + android:enabled="false"> diff --git a/wearable/src/main/java/com/google/android/apps/muzei/complications/ArtworkComplicationJobService.java b/wearable/src/main/java/com/google/android/apps/muzei/complications/ArtworkComplicationJobService.java index e07301f73..e6ddf6fe9 100644 --- a/wearable/src/main/java/com/google/android/apps/muzei/complications/ArtworkComplicationJobService.java +++ b/wearable/src/main/java/com/google/android/apps/muzei/complications/ArtworkComplicationJobService.java @@ -24,6 +24,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.SharedPreferences; +import android.content.pm.PackageManager; import android.os.Build; import android.preference.PreferenceManager; import android.support.wearable.complications.ProviderUpdateRequester; @@ -48,11 +49,21 @@ static void scheduleComplicationUpdateJob(Context context) { MuzeiContract.Artwork.CONTENT_URI, JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS)) .build()); + // Enable the BOOT_COMPLETED receiver to reschedule the job on reboot + ComponentName bootReceivedComponentName = new ComponentName(context, + ArtworkComplicationBootReceiver.class); + context.getPackageManager().setComponentEnabledSetting(bootReceivedComponentName, + PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); } static void cancelComplicationUpdateJob(Context context) { JobScheduler jobScheduler = context.getSystemService(JobScheduler.class); jobScheduler.cancel(ARTWORK_COMPLICATION_JOB_ID); + // Disable the BOOT_COMPLETED receiver to reduce memory pressure on boot + ComponentName bootReceivedComponentName = new ComponentName(context, + ArtworkComplicationBootReceiver.class); + context.getPackageManager().setComponentEnabledSetting(bootReceivedComponentName, + PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); } @Override From b2801c8fc5166475a7c7d6eeadb8c4b3c490db55 Mon Sep 17 00:00:00 2001 From: Ian Lake Date: Tue, 31 Jan 2017 14:40:42 -0800 Subject: [PATCH 2/2] Add LONG_TEXT and SMALL_IMAGE complication support Allow watches to add a LONG_TEXT type complication which shows the title and/or byline of the current artwork or a SMALL_IMAGE complication which shows a small version of the current artwork. --- art/ic_complication.svg | 5 ++ wearable/src/main/AndroidManifest.xml | 3 +- .../ArtworkComplicationProviderService.java | 51 +++++++++++++++++-- .../src/main/res/drawable/ic_complication.xml | 25 +++++++++ 4 files changed, 80 insertions(+), 4 deletions(-) create mode 100644 art/ic_complication.svg create mode 100644 wearable/src/main/res/drawable/ic_complication.xml diff --git a/art/ic_complication.svg b/art/ic_complication.svg new file mode 100644 index 000000000..6e038fded --- /dev/null +++ b/art/ic_complication.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/wearable/src/main/AndroidManifest.xml b/wearable/src/main/AndroidManifest.xml index c1de155b0..bbeb901a1 100644 --- a/wearable/src/main/AndroidManifest.xml +++ b/wearable/src/main/AndroidManifest.xml @@ -65,6 +65,7 @@ @@ -74,7 +75,7 @@ + android:value="LONG_TEXT,SMALL_IMAGE,LARGE_IMAGE" /> diff --git a/wearable/src/main/java/com/google/android/apps/muzei/complications/ArtworkComplicationProviderService.java b/wearable/src/main/java/com/google/android/apps/muzei/complications/ArtworkComplicationProviderService.java index c0f7e8531..e94b48928 100644 --- a/wearable/src/main/java/com/google/android/apps/muzei/complications/ArtworkComplicationProviderService.java +++ b/wearable/src/main/java/com/google/android/apps/muzei/complications/ArtworkComplicationProviderService.java @@ -17,14 +17,21 @@ package com.google.android.apps.muzei.complications; import android.annotation.TargetApi; +import android.app.PendingIntent; +import android.content.Intent; import android.content.SharedPreferences; import android.graphics.drawable.Icon; import android.os.Build; +import android.os.Bundle; import android.preference.PreferenceManager; import android.support.wearable.complications.ComplicationData; import android.support.wearable.complications.ComplicationManager; import android.support.wearable.complications.ComplicationProviderService; +import android.support.wearable.complications.ComplicationText; +import android.text.TextUtils; +import com.google.android.apps.muzei.FullScreenActivity; +import com.google.android.apps.muzei.api.Artwork; import com.google.android.apps.muzei.api.MuzeiContract; import com.google.firebase.analytics.FirebaseAnalytics; @@ -49,7 +56,9 @@ public void onCreate() { @Override public void onComplicationActivated(int complicationId, int type, ComplicationManager manager) { addComplication(complicationId); - FirebaseAnalytics.getInstance(this).logEvent("complication_artwork_activated", null); + Bundle bundle = new Bundle(); + bundle.putString(FirebaseAnalytics.Param.CONTENT_TYPE, Integer.toString(type)); + FirebaseAnalytics.getInstance(this).logEvent("complication_artwork_activated", bundle); } private void addComplication(int complicationId) { @@ -84,8 +93,44 @@ public void onComplicationUpdate(int complicationId, int type, ComplicationManag if (!complications.contains(Integer.toString(complicationId))) { addComplication(complicationId); } - ComplicationData.Builder builder = new ComplicationData.Builder(type) - .setLargeImage(Icon.createWithContentUri(MuzeiContract.Artwork.CONTENT_URI)); + Artwork artwork = MuzeiContract.Artwork.getCurrentArtwork(this); + if (artwork == null) { + complicationManager.updateComplicationData(complicationId, + new ComplicationData.Builder(ComplicationData.TYPE_NO_DATA).build()); + return; + } + ComplicationData.Builder builder = new ComplicationData.Builder(type); + Intent intent = new Intent(this, FullScreenActivity.class); + PendingIntent tapAction = PendingIntent.getActivity(this, 0, intent, 0); + switch (type) { + case ComplicationData.TYPE_LONG_TEXT: + String title = artwork.getTitle(); + String byline = artwork.getByline(); + if (TextUtils.isEmpty(title) && TextUtils.isEmpty(byline)) { + // Both are empty so we don't have any data to show + complicationManager.updateComplicationData(complicationId, + new ComplicationData.Builder(ComplicationData.TYPE_NO_DATA).build()); + return; + } else if (TextUtils.isEmpty(title)) { + // We only have the byline, so use that as the long text + builder.setLongText(ComplicationText.plainText(byline)); + } else { + if (!TextUtils.isEmpty(byline)) { + builder.setLongTitle(ComplicationText.plainText(byline)); + } + builder.setLongText(ComplicationText.plainText(title)); + } + builder.setTapAction(tapAction); + break; + case ComplicationData.TYPE_SMALL_IMAGE: + builder.setImageStyle(ComplicationData.IMAGE_STYLE_PHOTO) + .setSmallImage(Icon.createWithContentUri(MuzeiContract.Artwork.CONTENT_URI)); + builder.setTapAction(tapAction); + break; + case ComplicationData.TYPE_LARGE_IMAGE: + builder.setLargeImage(Icon.createWithContentUri(MuzeiContract.Artwork.CONTENT_URI)); + break; + } complicationManager.updateComplicationData(complicationId, builder.build()); } } diff --git a/wearable/src/main/res/drawable/ic_complication.xml b/wearable/src/main/res/drawable/ic_complication.xml new file mode 100644 index 000000000..f99ff7183 --- /dev/null +++ b/wearable/src/main/res/drawable/ic_complication.xml @@ -0,0 +1,25 @@ + + + + +