diff options
| author | 2022-01-05 17:41:38 +0000 | |
|---|---|---|
| committer | 2022-01-05 17:41:38 +0000 | |
| commit | 6832b223360ddd1a2cc7dfd51d64e9d290d7056a (patch) | |
| tree | 9b621de560c4a1dc8a3a85960d21580cd61ff60b | |
| parent | 855774347e0b832c527e1583e8a6d630734e39ca (diff) | |
| parent | 73300b8abf7e993b92d1a11d6f3de716efc1725e (diff) | |
Merge "Add logic to parse previewImage from dreams."
| -rw-r--r-- | packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java | 89 |
1 files changed, 59 insertions, 30 deletions
diff --git a/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java b/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java index c5e1c8d359f3..6b9b75011f5b 100644 --- a/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java +++ b/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java @@ -17,6 +17,7 @@ package com.android.settingslib.dream; import android.annotation.IntDef; +import android.annotation.Nullable; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -59,6 +60,7 @@ public class DreamBackend { public ComponentName componentName; public ComponentName settingsComponentName; public CharSequence description; + public Drawable previewImage; @Override public String toString() { @@ -120,15 +122,22 @@ public class DreamBackend { PackageManager.GET_META_DATA); List<DreamInfo> dreamInfos = new ArrayList<>(resolveInfos.size()); for (ResolveInfo resolveInfo : resolveInfos) { - if (resolveInfo.serviceInfo == null) + if (resolveInfo.serviceInfo == null) { continue; + } DreamInfo dreamInfo = new DreamInfo(); dreamInfo.caption = resolveInfo.loadLabel(pm); dreamInfo.icon = resolveInfo.loadIcon(pm); dreamInfo.description = getDescription(resolveInfo, pm); dreamInfo.componentName = getDreamComponentName(resolveInfo); dreamInfo.isActive = dreamInfo.componentName.equals(activeDream); - dreamInfo.settingsComponentName = getSettingsComponentName(pm, resolveInfo); + + final DreamMetadata dreamMetadata = getDreamMetadata(pm, resolveInfo); + if (dreamMetadata != null) { + dreamInfo.settingsComponentName = dreamMetadata.mSettingsActivity; + dreamInfo.previewImage = dreamMetadata.mPreviewImage; + } + dreamInfos.add(dreamInfo); } Collections.sort(dreamInfos, mComparator); @@ -325,57 +334,77 @@ public class DreamBackend { } private static ComponentName getDreamComponentName(ResolveInfo resolveInfo) { - if (resolveInfo == null || resolveInfo.serviceInfo == null) + if (resolveInfo == null || resolveInfo.serviceInfo == null) { return null; + } return new ComponentName(resolveInfo.serviceInfo.packageName, resolveInfo.serviceInfo.name); } - private static ComponentName getSettingsComponentName(PackageManager pm, ResolveInfo resolveInfo) { - if (resolveInfo == null - || resolveInfo.serviceInfo == null - || resolveInfo.serviceInfo.metaData == null) + private static final class DreamMetadata { + @Nullable + Drawable mPreviewImage; + @Nullable + ComponentName mSettingsActivity; + } + + @Nullable + private static TypedArray readMetadata(PackageManager pm, ServiceInfo serviceInfo) { + if (serviceInfo == null || serviceInfo.metaData == null) { return null; - String cn = null; - XmlResourceParser parser = null; - Exception caughtException = null; - try { - parser = resolveInfo.serviceInfo.loadXmlMetaData(pm, DreamService.DREAM_META_DATA); + } + try (XmlResourceParser parser = + serviceInfo.loadXmlMetaData(pm, DreamService.DREAM_META_DATA)) { if (parser == null) { Log.w(TAG, "No " + DreamService.DREAM_META_DATA + " meta-data"); return null; } - Resources res = pm.getResourcesForApplication(resolveInfo.serviceInfo.applicationInfo); + Resources res = pm.getResourcesForApplication(serviceInfo.applicationInfo); AttributeSet attrs = Xml.asAttributeSet(parser); - int type; - while ((type=parser.next()) != XmlPullParser.END_DOCUMENT - && type != XmlPullParser.START_TAG) { + while (true) { + final int type = parser.next(); + if (type == XmlPullParser.END_DOCUMENT || type == XmlPullParser.START_TAG) { + break; + } } String nodeName = parser.getName(); if (!"dream".equals(nodeName)) { Log.w(TAG, "Meta-data does not start with dream tag"); return null; } - TypedArray sa = res.obtainAttributes(attrs, com.android.internal.R.styleable.Dream); - cn = sa.getString(com.android.internal.R.styleable.Dream_settingsActivity); - sa.recycle(); - } catch (PackageManager.NameNotFoundException|IOException|XmlPullParserException e) { - caughtException = e; - } finally { - if (parser != null) parser.close(); - } - if (caughtException != null) { - Log.w(TAG, "Error parsing : " + resolveInfo.serviceInfo.packageName, caughtException); + return res.obtainAttributes(attrs, com.android.internal.R.styleable.Dream); + } catch (PackageManager.NameNotFoundException | IOException | XmlPullParserException e) { + Log.w(TAG, "Error parsing : " + serviceInfo.packageName, e); return null; } - if (cn != null && cn.indexOf('/') < 0) { - cn = resolveInfo.serviceInfo.packageName + "/" + cn; + } + + private static ComponentName convertToComponentName(String flattenedString, + ServiceInfo serviceInfo) { + if (flattenedString == null) return null; + + if (flattenedString.indexOf('/') < 0) { + flattenedString = serviceInfo.packageName + "/" + flattenedString; } - return cn == null ? null : ComponentName.unflattenFromString(cn); + return ComponentName.unflattenFromString(flattenedString); + } + + private static DreamMetadata getDreamMetadata(PackageManager pm, ResolveInfo resolveInfo) { + DreamMetadata result = new DreamMetadata(); + if (resolveInfo == null) return result; + TypedArray rawMetadata = readMetadata(pm, resolveInfo.serviceInfo); + if (rawMetadata == null) return result; + result.mSettingsActivity = convertToComponentName(rawMetadata.getString( + com.android.internal.R.styleable.Dream_settingsActivity), resolveInfo.serviceInfo); + result.mPreviewImage = rawMetadata.getDrawable( + com.android.internal.R.styleable.Dream_previewImage); + rawMetadata.recycle(); + return result; } private static void logd(String msg, Object... args) { - if (DEBUG) + if (DEBUG) { Log.d(TAG, args == null || args.length == 0 ? msg : String.format(msg, args)); + } } private static class DreamInfoComparator implements Comparator<DreamInfo> { |