summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorKenny Root <kroot@google.com>2011-08-10 14:28:13 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2011-08-10 14:28:13 -0700
commit4a51773e4aa6b447e9cbf70030eaf92e4e6d7b90 (patch)
tree97fc0de169fc471c910909ee941405e21b56e5f3 /core
parente963ebdb443e400161e01ae744bb3296c86a5483 (diff)
parentd2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607 (diff)
downloadframeworks_base-4a51773e4aa6b447e9cbf70030eaf92e4e6d7b90.zip
frameworks_base-4a51773e4aa6b447e9cbf70030eaf92e4e6d7b90.tar.gz
frameworks_base-4a51773e4aa6b447e9cbf70030eaf92e4e6d7b90.tar.bz2
Merge "Eliminate warnings from PackageParser"
Diffstat (limited to 'core')
-rw-r--r--core/java/android/content/IntentFilter.java2
-rw-r--r--core/java/android/content/pm/PackageParser.java215
2 files changed, 117 insertions, 100 deletions
diff --git a/core/java/android/content/IntentFilter.java b/core/java/android/content/IntentFilter.java
index f3b1d94..f9b3fd5 100644
--- a/core/java/android/content/IntentFilter.java
+++ b/core/java/android/content/IntentFilter.java
@@ -996,6 +996,8 @@ public class IntentFilter implements Parcelable {
/**
* Return an iterator over the filter's categories.
+ *
+ * @return Iterator if this filter has categories or {@code null} if none.
*/
public final Iterator<String> categoriesIterator() {
return mCategories != null ? mCategories.iterator() : null;
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 22fdc98..5f4625b 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -24,13 +24,12 @@ import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.content.res.XmlResourceParser;
-import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
import android.os.PatternMatcher;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
-import android.util.Log;
+import android.util.Slog;
import android.util.TypedValue;
import com.android.internal.util.XmlUtils;
import org.xmlpull.v1.XmlPullParser;
@@ -48,6 +47,7 @@ import java.util.Enumeration;
import java.util.Iterator;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
+import java.util.jar.Manifest;
/**
* Package archive parsing
@@ -55,6 +55,10 @@ import java.util.jar.JarFile;
* {@hide}
*/
public class PackageParser {
+ private static final boolean DEBUG_JAR = false;
+ private static final boolean DEBUG_PARSER = false;
+ private static final boolean DEBUG_BACKUP = false;
+
/** @hide */
public static class NewPermissionInfo {
public final String name;
@@ -342,10 +346,10 @@ public class PackageParser {
is.close();
return je != null ? je.getCertificates() : null;
} catch (IOException e) {
- Log.w(TAG, "Exception reading " + je.getName() + " in "
+ Slog.w(TAG, "Exception reading " + je.getName() + " in "
+ jarFile.getName(), e);
} catch (RuntimeException e) {
- Log.w(TAG, "Exception reading " + je.getName() + " in "
+ Slog.w(TAG, "Exception reading " + je.getName() + " in "
+ jarFile.getName(), e);
}
return null;
@@ -369,7 +373,7 @@ public class PackageParser {
mArchiveSourcePath = sourceFile.getPath();
if (!sourceFile.isFile()) {
- Log.w(TAG, "Skipping dir: " + mArchiveSourcePath);
+ Slog.w(TAG, "Skipping dir: " + mArchiveSourcePath);
mParseError = PackageManager.INSTALL_PARSE_FAILED_NOT_APK;
return null;
}
@@ -378,14 +382,14 @@ public class PackageParser {
if ((flags&PARSE_IS_SYSTEM) == 0) {
// We expect to have non-.apk files in the system dir,
// so don't warn about them.
- Log.w(TAG, "Skipping non-package file: " + mArchiveSourcePath);
+ Slog.w(TAG, "Skipping non-package file: " + mArchiveSourcePath);
}
mParseError = PackageManager.INSTALL_PARSE_FAILED_NOT_APK;
return null;
}
- if ((flags&PARSE_CHATTY) != 0 && false) Log.d(
- TAG, "Scanning package: " + mArchiveSourcePath);
+ if (DEBUG_JAR)
+ Slog.d(TAG, "Scanning package: " + mArchiveSourcePath);
XmlResourceParser parser = null;
AssetManager assmgr = null;
@@ -401,10 +405,10 @@ public class PackageParser {
parser = assmgr.openXmlResourceParser(cookie, "AndroidManifest.xml");
assetError = false;
} else {
- Log.w(TAG, "Failed adding asset path:"+mArchiveSourcePath);
+ Slog.w(TAG, "Failed adding asset path:"+mArchiveSourcePath);
}
} catch (Exception e) {
- Log.w(TAG, "Unable to read AndroidManifest.xml of "
+ Slog.w(TAG, "Unable to read AndroidManifest.xml of "
+ mArchiveSourcePath, e);
}
if (assetError) {
@@ -426,9 +430,9 @@ public class PackageParser {
if (pkg == null) {
if (errorException != null) {
- Log.w(TAG, mArchiveSourcePath, errorException);
+ Slog.w(TAG, mArchiveSourcePath, errorException);
} else {
- Log.w(TAG, mArchiveSourcePath + " (at "
+ Slog.w(TAG, mArchiveSourcePath + " (at "
+ parser.getPositionDescription()
+ "): " + errorText[0]);
}
@@ -483,20 +487,20 @@ public class PackageParser {
JarEntry jarEntry = jarFile.getJarEntry("AndroidManifest.xml");
certs = loadCertificates(jarFile, jarEntry, readBuffer);
if (certs == null) {
- Log.e(TAG, "Package " + pkg.packageName
+ Slog.e(TAG, "Package " + pkg.packageName
+ " has no certificates at entry "
+ jarEntry.getName() + "; ignoring!");
jarFile.close();
mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES;
return false;
}
- if (false) {
- Log.i(TAG, "File " + mArchiveSourcePath + ": entry=" + jarEntry
+ if (DEBUG_JAR) {
+ Slog.i(TAG, "File " + mArchiveSourcePath + ": entry=" + jarEntry
+ " certs=" + (certs != null ? certs.length : 0));
if (certs != null) {
final int N = certs.length;
for (int i=0; i<N; i++) {
- Log.i(TAG, " Public key: "
+ Slog.i(TAG, " Public key: "
+ certs[i].getPublicKey().getEncoded()
+ " " + certs[i].getPublicKey());
}
@@ -504,20 +508,21 @@ public class PackageParser {
}
} else {
- Enumeration entries = jarFile.entries();
+ Enumeration<JarEntry> entries = jarFile.entries();
while (entries.hasMoreElements()) {
- JarEntry je = (JarEntry)entries.nextElement();
+ final JarEntry je = entries.nextElement();
if (je.isDirectory()) continue;
if (je.getName().startsWith("META-INF/")) continue;
- Certificate[] localCerts = loadCertificates(jarFile, je,
+
+ final Certificate[] localCerts = loadCertificates(jarFile, je,
readBuffer);
- if (false) {
- Log.i(TAG, "File " + mArchiveSourcePath + " entry " + je.getName()
+ if (DEBUG_JAR) {
+ Slog.i(TAG, "File " + mArchiveSourcePath + " entry " + je.getName()
+ ": certs=" + certs + " ("
+ (certs != null ? certs.length : 0) + ")");
}
if (localCerts == null) {
- Log.e(TAG, "Package " + pkg.packageName
+ Slog.e(TAG, "Package " + pkg.packageName
+ " has no certificates at entry "
+ je.getName() + "; ignoring!");
jarFile.close();
@@ -537,7 +542,7 @@ public class PackageParser {
}
}
if (!found || certs.length != localCerts.length) {
- Log.e(TAG, "Package " + pkg.packageName
+ Slog.e(TAG, "Package " + pkg.packageName
+ " has mismatched certificates at entry "
+ je.getName() + "; ignoring!");
jarFile.close();
@@ -562,21 +567,21 @@ public class PackageParser {
certs[i].getEncoded());
}
} else {
- Log.e(TAG, "Package " + pkg.packageName
+ Slog.e(TAG, "Package " + pkg.packageName
+ " has no certificates; ignoring!");
mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES;
return false;
}
} catch (CertificateEncodingException e) {
- Log.w(TAG, "Exception reading " + mArchiveSourcePath, e);
+ Slog.w(TAG, "Exception reading " + mArchiveSourcePath, e);
mParseError = PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING;
return false;
} catch (IOException e) {
- Log.w(TAG, "Exception reading " + mArchiveSourcePath, e);
+ Slog.w(TAG, "Exception reading " + mArchiveSourcePath, e);
mParseError = PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING;
return false;
} catch (RuntimeException e) {
- Log.w(TAG, "Exception reading " + mArchiveSourcePath, e);
+ Slog.w(TAG, "Exception reading " + mArchiveSourcePath, e);
mParseError = PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION;
return false;
}
@@ -607,7 +612,7 @@ public class PackageParser {
parser = assmgr.openXmlResourceParser(cookie, "AndroidManifest.xml");
} catch (Exception e) {
if (assmgr != null) assmgr.close();
- Log.w(TAG, "Unable to read AndroidManifest.xml of "
+ Slog.w(TAG, "Unable to read AndroidManifest.xml of "
+ packageFilePath, e);
return null;
}
@@ -617,15 +622,15 @@ public class PackageParser {
try {
packageLite = parsePackageLite(parser, attrs, flags, errors);
} catch (IOException e) {
- Log.w(TAG, packageFilePath, e);
+ Slog.w(TAG, packageFilePath, e);
} catch (XmlPullParserException e) {
- Log.w(TAG, packageFilePath, e);
+ Slog.w(TAG, packageFilePath, e);
} finally {
if (parser != null) parser.close();
if (assmgr != null) assmgr.close();
}
if (packageLite == null) {
- Log.e(TAG, "parsePackageLite error: " + errors[0]);
+ Slog.e(TAG, "parsePackageLite error: " + errors[0]);
return null;
}
return packageLite;
@@ -662,17 +667,17 @@ public class PackageParser {
throws IOException, XmlPullParserException {
int type;
- while ((type=parser.next()) != parser.START_TAG
- && type != parser.END_DOCUMENT) {
+ while ((type = parser.next()) != XmlPullParser.START_TAG
+ && type != XmlPullParser.END_DOCUMENT) {
;
}
- if (type != parser.START_TAG) {
+ if (type != XmlPullParser.START_TAG) {
outError[0] = "No start tag found";
return null;
}
- if ((flags&PARSE_CHATTY) != 0 && false) Log.v(
- TAG, "Root element name: '" + parser.getName() + "'");
+ if (DEBUG_PARSER)
+ Slog.v(TAG, "Root element name: '" + parser.getName() + "'");
if (!parser.getName().equals("manifest")) {
outError[0] = "No <manifest> tag";
return null;
@@ -697,17 +702,17 @@ public class PackageParser {
throws IOException, XmlPullParserException {
int type;
- while ((type=parser.next()) != parser.START_TAG
- && type != parser.END_DOCUMENT) {
+ while ((type = parser.next()) != XmlPullParser.START_TAG
+ && type != XmlPullParser.END_DOCUMENT) {
;
}
- if (type != parser.START_TAG) {
+ if (type != XmlPullParser.START_TAG) {
outError[0] = "No start tag found";
return null;
}
- if ((flags&PARSE_CHATTY) != 0 && false) Log.v(
- TAG, "Root element name: '" + parser.getName() + "'");
+ if (DEBUG_PARSER)
+ Slog.v(TAG, "Root element name: '" + parser.getName() + "'");
if (!parser.getName().equals("manifest")) {
outError[0] = "No <manifest> tag";
return null;
@@ -806,9 +811,9 @@ public class PackageParser {
int anyDensity = 1;
int outerDepth = parser.getDepth();
- while ((type=parser.next()) != parser.END_DOCUMENT
- && (type != parser.END_TAG || parser.getDepth() > outerDepth)) {
- if (type == parser.END_TAG || type == parser.TEXT) {
+ while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
+ && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
+ if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
continue;
}
@@ -820,7 +825,7 @@ public class PackageParser {
mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
return null;
} else {
- Log.w(TAG, "<manifest> has more than one <application>");
+ Slog.w(TAG, "<manifest> has more than one <application>");
XmlUtils.skipCurrentTag(parser);
continue;
}
@@ -1118,7 +1123,7 @@ public class PackageParser {
return null;
} else {
- Log.w(TAG, "Unknown element under <manifest>: " + parser.getName()
+ Slog.w(TAG, "Unknown element under <manifest>: " + parser.getName()
+ " at " + mArchiveSourcePath + " "
+ parser.getPositionDescription());
XmlUtils.skipCurrentTag(parser);
@@ -1152,7 +1157,7 @@ public class PackageParser {
}
}
if (implicitPerms != null) {
- Log.i(TAG, implicitPerms.toString());
+ Slog.i(TAG, implicitPerms.toString());
}
if (supportsSmallScreens < 0 || (supportsSmallScreens > 0
@@ -1504,8 +1509,8 @@ public class PackageParser {
com.android.internal.R.styleable.AndroidManifestApplication_backupAgent, 0);
if (backupAgent != null) {
ai.backupAgentName = buildClassName(pkgName, backupAgent, outError);
- if (false) {
- Log.v(TAG, "android:backupAgent = " + ai.backupAgentName
+ if (DEBUG_BACKUP) {
+ Slog.v(TAG, "android:backupAgent = " + ai.backupAgentName
+ " from " + pkgName + "+" + backupAgent);
}
@@ -1663,9 +1668,9 @@ public class PackageParser {
final int innerDepth = parser.getDepth();
int type;
- while ((type=parser.next()) != parser.END_DOCUMENT
- && (type != parser.END_TAG || parser.getDepth() > innerDepth)) {
- if (type == parser.END_TAG || type == parser.TEXT) {
+ while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
+ && (type != XmlPullParser.END_TAG || parser.getDepth() > innerDepth)) {
+ if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
continue;
}
@@ -1767,7 +1772,7 @@ public class PackageParser {
} else {
if (!RIGID_PARSER) {
- Log.w(TAG, "Unknown element under <application>: " + tagName
+ Slog.w(TAG, "Unknown element under <application>: " + tagName
+ " at " + mArchiveSourcePath + " "
+ parser.getPositionDescription());
XmlUtils.skipCurrentTag(parser);
@@ -1990,7 +1995,7 @@ public class PackageParser {
return null;
}
if (intent.countActions() == 0) {
- Log.w(TAG, "No actions in intent filter at "
+ Slog.w(TAG, "No actions in intent filter at "
+ mArchiveSourcePath + " "
+ parser.getPositionDescription());
} else {
@@ -2003,25 +2008,26 @@ public class PackageParser {
}
} else {
if (!RIGID_PARSER) {
- Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":");
+ Slog.w(TAG, "Problem in package " + mArchiveSourcePath + ":");
if (receiver) {
- Log.w(TAG, "Unknown element under <receiver>: " + parser.getName()
+ Slog.w(TAG, "Unknown element under <receiver>: " + parser.getName()
+ " at " + mArchiveSourcePath + " "
+ parser.getPositionDescription());
} else {
- Log.w(TAG, "Unknown element under <activity>: " + parser.getName()
+ Slog.w(TAG, "Unknown element under <activity>: " + parser.getName()
+ " at " + mArchiveSourcePath + " "
+ parser.getPositionDescription());
}
XmlUtils.skipCurrentTag(parser);
continue;
- }
- if (receiver) {
- outError[0] = "Bad element under <receiver>: " + parser.getName();
} else {
- outError[0] = "Bad element under <activity>: " + parser.getName();
+ if (receiver) {
+ outError[0] = "Bad element under <receiver>: " + parser.getName();
+ } else {
+ outError[0] = "Bad element under <activity>: " + parser.getName();
+ }
+ return null;
}
- return null;
}
}
@@ -2146,7 +2152,7 @@ public class PackageParser {
return null;
}
if (intent.countActions() == 0) {
- Log.w(TAG, "No actions in intent filter at "
+ Slog.w(TAG, "No actions in intent filter at "
+ mArchiveSourcePath + " "
+ parser.getPositionDescription());
} else {
@@ -2159,14 +2165,15 @@ public class PackageParser {
}
} else {
if (!RIGID_PARSER) {
- Log.w(TAG, "Unknown element under <activity-alias>: " + parser.getName()
+ Slog.w(TAG, "Unknown element under <activity-alias>: " + parser.getName()
+ " at " + mArchiveSourcePath + " "
+ parser.getPositionDescription());
XmlUtils.skipCurrentTag(parser);
continue;
+ } else {
+ outError[0] = "Bad element under <activity-alias>: " + parser.getName();
+ return null;
}
- outError[0] = "Bad element under <activity-alias>: " + parser.getName();
- return null;
}
}
@@ -2335,14 +2342,15 @@ public class PackageParser {
outInfo.info.grantUriPermissions = true;
} else {
if (!RIGID_PARSER) {
- Log.w(TAG, "Unknown element under <path-permission>: "
+ Slog.w(TAG, "Unknown element under <path-permission>: "
+ parser.getName() + " at " + mArchiveSourcePath + " "
+ parser.getPositionDescription());
XmlUtils.skipCurrentTag(parser);
continue;
+ } else {
+ outError[0] = "No path, pathPrefix, or pathPattern for <path-permission>";
+ return false;
}
- outError[0] = "No path, pathPrefix, or pathPattern for <path-permission>";
- return false;
}
XmlUtils.skipCurrentTag(parser);
@@ -2377,14 +2385,15 @@ public class PackageParser {
if (!havePerm) {
if (!RIGID_PARSER) {
- Log.w(TAG, "No readPermission or writePermssion for <path-permission>: "
+ Slog.w(TAG, "No readPermission or writePermssion for <path-permission>: "
+ parser.getName() + " at " + mArchiveSourcePath + " "
+ parser.getPositionDescription());
XmlUtils.skipCurrentTag(parser);
continue;
+ } else {
+ outError[0] = "No readPermission or writePermssion for <path-permission>";
+ return false;
}
- outError[0] = "No readPermission or writePermssion for <path-permission>";
- return false;
}
String path = sa.getNonConfigurationString(
@@ -2423,7 +2432,7 @@ public class PackageParser {
}
} else {
if (!RIGID_PARSER) {
- Log.w(TAG, "No path, pathPrefix, or pathPattern for <path-permission>: "
+ Slog.w(TAG, "No path, pathPrefix, or pathPattern for <path-permission>: "
+ parser.getName() + " at " + mArchiveSourcePath + " "
+ parser.getPositionDescription());
XmlUtils.skipCurrentTag(parser);
@@ -2436,15 +2445,15 @@ public class PackageParser {
} else {
if (!RIGID_PARSER) {
- Log.w(TAG, "Unknown element under <provider>: "
+ Slog.w(TAG, "Unknown element under <provider>: "
+ parser.getName() + " at " + mArchiveSourcePath + " "
+ parser.getPositionDescription());
XmlUtils.skipCurrentTag(parser);
continue;
+ } else {
+ outError[0] = "Bad element under <provider>: " + parser.getName();
+ return false;
}
- outError[0] = "Bad element under <provider>: "
- + parser.getName();
- return false;
}
}
return true;
@@ -2534,15 +2543,15 @@ public class PackageParser {
}
} else {
if (!RIGID_PARSER) {
- Log.w(TAG, "Unknown element under <service>: "
+ Slog.w(TAG, "Unknown element under <service>: "
+ parser.getName() + " at " + mArchiveSourcePath + " "
+ parser.getPositionDescription());
XmlUtils.skipCurrentTag(parser);
continue;
+ } else {
+ outError[0] = "Bad element under <service>: " + parser.getName();
+ return null;
}
- outError[0] = "Bad element under <service>: "
- + parser.getName();
- return null;
}
}
@@ -2573,15 +2582,15 @@ public class PackageParser {
}
} else {
if (!RIGID_PARSER) {
- Log.w(TAG, "Unknown element under " + tag + ": "
+ Slog.w(TAG, "Unknown element under " + tag + ": "
+ parser.getName() + " at " + mArchiveSourcePath + " "
+ parser.getPositionDescription());
XmlUtils.skipCurrentTag(parser);
continue;
+ } else {
+ outError[0] = "Bad element under " + tag + ": " + parser.getName();
+ return false;
}
- outError[0] = "Bad element under " + tag + ": "
- + parser.getName();
- return false;
}
}
return true;
@@ -2612,12 +2621,12 @@ public class PackageParser {
TypedValue v = sa.peekValue(
com.android.internal.R.styleable.AndroidManifestMetaData_resource);
if (v != null && v.resourceId != 0) {
- //Log.i(TAG, "Meta data ref " + name + ": " + v);
+ //Slog.i(TAG, "Meta data ref " + name + ": " + v);
data.putInt(name, v.resourceId);
} else {
v = sa.peekValue(
com.android.internal.R.styleable.AndroidManifestMetaData_value);
- //Log.i(TAG, "Meta data " + name + ": " + v);
+ //Slog.i(TAG, "Meta data " + name + ": " + v);
if (v != null) {
if (v.type == TypedValue.TYPE_STRING) {
CharSequence cs = v.coerceToString();
@@ -2631,7 +2640,7 @@ public class PackageParser {
data.putFloat(name, v.getFloat());
} else {
if (!RIGID_PARSER) {
- Log.w(TAG, "<meta-data> only supports string, integer, float, color, boolean, and resource reference types: "
+ Slog.w(TAG, "<meta-data> only supports string, integer, float, color, boolean, and resource reference types: "
+ parser.getName() + " at " + mArchiveSourcePath + " "
+ parser.getPositionDescription());
} else {
@@ -2683,9 +2692,9 @@ public class PackageParser {
int outerDepth = parser.getDepth();
int type;
- while ((type=parser.next()) != parser.END_DOCUMENT
- && (type != parser.END_TAG || parser.getDepth() > outerDepth)) {
- if (type == parser.END_TAG || type == parser.TEXT) {
+ while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
+ && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
+ if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
continue;
}
@@ -2762,7 +2771,7 @@ public class PackageParser {
sa.recycle();
XmlUtils.skipCurrentTag(parser);
} else if (!RIGID_PARSER) {
- Log.w(TAG, "Unknown element under <intent-filter>: "
+ Slog.w(TAG, "Unknown element under <intent-filter>: "
+ parser.getName() + " at " + mArchiveSourcePath + " "
+ parser.getPositionDescription());
XmlUtils.skipCurrentTag(parser);
@@ -2773,14 +2782,20 @@ public class PackageParser {
}
outInfo.hasDefault = outInfo.hasCategory(Intent.CATEGORY_DEFAULT);
- if (false) {
- String cats = "";
- Iterator<String> it = outInfo.categoriesIterator();
- while (it != null && it.hasNext()) {
- cats += " " + it.next();
- }
- System.out.println("Intent d=" +
- outInfo.hasDefault + ", cat=" + cats);
+
+ if (DEBUG_PARSER) {
+ final StringBuilder cats = new StringBuilder("Intent d=");
+ cats.append(outInfo.hasDefault);
+ cats.append(", cat=");
+
+ final Iterator<String> it = outInfo.categoriesIterator();
+ if (it != null) {
+ while (it.hasNext()) {
+ cats.append(' ');
+ cats.append(it.next());
+ }
+ }
+ Slog.d(TAG, cats.toString());
}
return true;