am d33caa4d
: Dream settings now looks for the settings activity in xml.
* commit 'd33caa4dea521677431f86e719ac1df290a24c69': Dream settings now looks for the settings activity in xml.
This commit is contained in:
@@ -25,13 +25,24 @@ import android.content.Context;
|
|||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.content.pm.ResolveInfo;
|
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.graphics.drawable.Drawable;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.os.ServiceManager;
|
import android.os.ServiceManager;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
|
import android.service.dreams.Dream;
|
||||||
import android.service.dreams.IDreamManager;
|
import android.service.dreams.IDreamManager;
|
||||||
|
import android.util.AttributeSet;
|
||||||
import android.util.Log;
|
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.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
@@ -40,11 +51,6 @@ import java.util.List;
|
|||||||
public class DreamBackend {
|
public class DreamBackend {
|
||||||
private static final String TAG = DreamSettings.class.getSimpleName() + ".Backend";
|
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 {
|
public static class DreamInfo {
|
||||||
CharSequence caption;
|
CharSequence caption;
|
||||||
Drawable icon;
|
Drawable icon;
|
||||||
@@ -92,7 +98,7 @@ public class DreamBackend {
|
|||||||
dreamInfo.icon = resolveInfo.loadIcon(pm);
|
dreamInfo.icon = resolveInfo.loadIcon(pm);
|
||||||
dreamInfo.componentName = getDreamComponentName(resolveInfo);
|
dreamInfo.componentName = getDreamComponentName(resolveInfo);
|
||||||
dreamInfo.isActive = dreamInfo.componentName.equals(activeDream);
|
dreamInfo.isActive = dreamInfo.componentName.equals(activeDream);
|
||||||
dreamInfo.settingsComponentName = getSettingsComponentName(resolveInfo);
|
dreamInfo.settingsComponentName = getSettingsComponentName(pm, resolveInfo);
|
||||||
dreamInfos.add(dreamInfo);
|
dreamInfos.add(dreamInfo);
|
||||||
}
|
}
|
||||||
Collections.sort(dreamInfos, mComparator);
|
Collections.sort(dreamInfos, mComparator);
|
||||||
@@ -204,12 +210,47 @@ public class DreamBackend {
|
|||||||
return new ComponentName(resolveInfo.serviceInfo.packageName, resolveInfo.serviceInfo.name);
|
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
|
if (resolveInfo == null
|
||||||
|| resolveInfo.serviceInfo == null
|
|| resolveInfo.serviceInfo == null
|
||||||
|| resolveInfo.serviceInfo.metaData == null)
|
|| resolveInfo.serviceInfo.metaData == null)
|
||||||
return 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);
|
return cn == null ? null : ComponentName.unflattenFromString(cn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user