summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/DreamBackend.java
diff options
context:
space:
mode:
authorJohn Spurlock <jspurlock@google.com>2012-09-26 12:40:54 -0400
committerJohn Spurlock <jspurlock@google.com>2012-09-26 12:40:54 -0400
commitd33caa4dea521677431f86e719ac1df290a24c69 (patch)
tree5a2cc369860e3aeb39a96d678a23b374f4ef88c3 /src/com/android/settings/DreamBackend.java
parent49dc9825569d0c555466303d7d78f1bc75e1602b (diff)
downloadpackages_apps_Settings-d33caa4dea521677431f86e719ac1df290a24c69.zip
packages_apps_Settings-d33caa4dea521677431f86e719ac1df290a24c69.tar.gz
packages_apps_Settings-d33caa4dea521677431f86e719ac1df290a24c69.tar.bz2
Dream settings now looks for the settings activity in xml.
Uses the new api for obtaining dream metadata, no longer looks for the settings activity using the old metadata key. Bug:7172816 Change-Id: I5f9f9ea2a59df6a55c2f17bca5cdbe206f89d780
Diffstat (limited to 'src/com/android/settings/DreamBackend.java')
-rw-r--r--src/com/android/settings/DreamBackend.java57
1 files changed, 49 insertions, 8 deletions
diff --git a/src/com/android/settings/DreamBackend.java b/src/com/android/settings/DreamBackend.java
index 68a31a1..1a2f520 100644
--- a/src/com/android/settings/DreamBackend.java
+++ b/src/com/android/settings/DreamBackend.java
@@ -25,13 +25,24 @@ import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.content.res.XmlResourceParser;
import android.graphics.drawable.Drawable;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.provider.Settings;
+import android.service.dreams.Dream;
import android.service.dreams.IDreamManager;
+import android.util.AttributeSet;
import android.util.Log;
+import android.util.Xml;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -40,11 +51,6 @@ import java.util.List;
public class DreamBackend {
private static final String TAG = DreamSettings.class.getSimpleName() + ".Backend";
- // avoid breaking when the api changes.
- // FIXME: use the new xml file when available
- private static final String OLD_METADATA_NAME_CONFIG_ACTIVITY =
- "android.service.dreams.config_activity";
-
public static class DreamInfo {
CharSequence caption;
Drawable icon;
@@ -92,7 +98,7 @@ public class DreamBackend {
dreamInfo.icon = resolveInfo.loadIcon(pm);
dreamInfo.componentName = getDreamComponentName(resolveInfo);
dreamInfo.isActive = dreamInfo.componentName.equals(activeDream);
- dreamInfo.settingsComponentName = getSettingsComponentName(resolveInfo);
+ dreamInfo.settingsComponentName = getSettingsComponentName(pm, resolveInfo);
dreamInfos.add(dreamInfo);
}
Collections.sort(dreamInfos, mComparator);
@@ -204,12 +210,47 @@ public class DreamBackend {
return new ComponentName(resolveInfo.serviceInfo.packageName, resolveInfo.serviceInfo.name);
}
- private static ComponentName getSettingsComponentName(ResolveInfo resolveInfo) {
+ private static ComponentName getSettingsComponentName(PackageManager pm, ResolveInfo resolveInfo) {
if (resolveInfo == null
|| resolveInfo.serviceInfo == null
|| resolveInfo.serviceInfo.metaData == null)
return null;
- String cn = resolveInfo.serviceInfo.metaData.getString(OLD_METADATA_NAME_CONFIG_ACTIVITY);
+ String cn = null;
+ XmlResourceParser parser = null;
+ Exception caughtException = null;
+ try {
+ parser = resolveInfo.serviceInfo.loadXmlMetaData(pm, Dream.DREAM_META_DATA);
+ if (parser == null) {
+ Log.w(TAG, "No " + Dream.DREAM_META_DATA + " meta-data");
+ return null;
+ }
+ Resources res = pm.getResourcesForApplication(resolveInfo.serviceInfo.applicationInfo);
+ AttributeSet attrs = Xml.asAttributeSet(parser);
+ int type;
+ while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
+ && type != XmlPullParser.START_TAG) {
+ }
+ 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 (NameNotFoundException e) {
+ caughtException = e;
+ } catch (IOException e) {
+ caughtException = e;
+ } catch (XmlPullParserException e) {
+ caughtException = e;
+ } finally {
+ if (parser != null) parser.close();
+ }
+ if (caughtException != null) {
+ Log.w(TAG, "Error parsing : " + resolveInfo.serviceInfo.packageName, caughtException);
+ return null;
+ }
return cn == null ? null : ComponentName.unflattenFromString(cn);
}