summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--api/current.xml26
-rw-r--r--cmds/pm/src/com/android/commands/pm/Pm.java45
-rw-r--r--core/java/android/app/ApplicationContext.java9
-rw-r--r--core/java/android/content/pm/IPackageManager.aidl2
-rw-r--r--core/java/android/content/pm/PackageManager.java10
-rw-r--r--data/etc/android.hardware.touchscreen.multitouch.xml21
-rw-r--r--data/etc/required_hardware.xml1
-rw-r--r--services/java/com/android/server/PackageManagerService.java6
-rw-r--r--test-runner/android/test/mock/MockPackageManager.java5
9 files changed, 124 insertions, 1 deletions
diff --git a/api/current.xml b/api/current.xml
index a331c64..b430e2c 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -41626,6 +41626,19 @@
<parameter name="appInfo" type="android.content.pm.ApplicationInfo">
</parameter>
</method>
+<method name="hasSystemFeature"
+ return="boolean"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="name" type="java.lang.String">
+</parameter>
+</method>
<method name="isSafeMode"
return="boolean"
abstract="true"
@@ -131377,6 +131390,19 @@
<parameter name="appInfo" type="android.content.pm.ApplicationInfo">
</parameter>
</method>
+<method name="hasSystemFeature"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="name" type="java.lang.String">
+</parameter>
+</method>
<method name="isSafeMode"
return="boolean"
abstract="false"
diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java
index b877098..79eb310 100644
--- a/cmds/pm/src/com/android/commands/pm/Pm.java
+++ b/cmds/pm/src/com/android/commands/pm/Pm.java
@@ -18,6 +18,7 @@ package com.android.commands.pm;
import android.content.ComponentName;
import android.content.pm.ApplicationInfo;
+import android.content.pm.FeatureInfo;
import android.content.pm.IPackageDeleteObserver;
import android.content.pm.IPackageInstallObserver;
import android.content.pm.IPackageManager;
@@ -137,6 +138,7 @@ public final class Pm {
* pm list [package | packages]
* pm list permission-groups
* pm list permissions
+ * pm list features
* pm list instrumentation
*/
private void runList() {
@@ -152,6 +154,8 @@ public final class Pm {
runListPermissionGroups();
} else if ("permissions".equals(type)) {
runListPermissions();
+ } else if ("features".equals(type)) {
+ runListFeatures();
} else if ("instrumentation".equals(type)) {
runListInstrumentation();
} else {
@@ -205,6 +209,44 @@ public final class Pm {
}
/**
+ * Lists all of the features supported by the current device.
+ *
+ * pm list features
+ */
+ private void runListFeatures() {
+ try {
+ List<FeatureInfo> list = new ArrayList<FeatureInfo>();
+ FeatureInfo[] rawList = mPm.getSystemAvailableFeatures();
+ for (int i=0; i<rawList.length; i++) {
+ list.add(rawList[i]);
+ }
+
+
+ // Sort by name
+ Collections.sort(list, new Comparator<FeatureInfo>() {
+ public int compare(FeatureInfo o1, FeatureInfo o2) {
+ if (o1.name == o2.name) return 0;
+ if (o1.name == null) return -1;
+ if (o2.name == null) return 1;
+ return o1.name.compareTo(o2.name);
+ }
+ });
+
+ int count = (list != null) ? list.size() : 0;
+ for (int p = 0; p < count; p++) {
+ FeatureInfo fi = list.get(p);
+ System.out.print("feature:");
+ if (fi.name != null) System.out.println(fi.name);
+ else System.out.println("reqGlEsVersion=0x"
+ + Integer.toHexString(fi.reqGlEsVersion));
+ }
+ } catch (RemoteException e) {
+ System.err.println(e.toString());
+ System.err.println(PM_NOT_RUNNING_ERR);
+ }
+ }
+
+ /**
* Lists all of the installed instrumentation, or all for a given package
*
* pm list instrumentation [package] [-f]
@@ -778,6 +820,7 @@ public final class Pm {
System.err.println(" pm list permission-groups");
System.err.println(" pm list permissions [-g] [-f] [-d] [-u] [GROUP]");
System.err.println(" pm list instrumentation [-f] [TARGET-PACKAGE]");
+ System.err.println(" pm list features");
System.err.println(" pm path PACKAGE");
System.err.println(" pm install [-l] [-r] [-t] [-i INSTALLER_PACKAGE_NAME] PATH");
System.err.println(" pm uninstall [-k] PACKAGE");
@@ -802,6 +845,8 @@ public final class Pm {
System.err.println("or only those that target a specified package. Options:");
System.err.println(" -f: see their associated file.");
System.err.println("");
+ System.err.println("The list features command prints all features of the system.");
+ System.err.println("");
System.err.println("The path command prints the path to the .apk of a package.");
System.err.println("");
System.err.println("The install command installs a package to the system. Options:");
diff --git a/core/java/android/app/ApplicationContext.java b/core/java/android/app/ApplicationContext.java
index 8896015..0582e34 100644
--- a/core/java/android/app/ApplicationContext.java
+++ b/core/java/android/app/ApplicationContext.java
@@ -1686,6 +1686,15 @@ class ApplicationContext extends Context {
}
@Override
+ public boolean hasSystemFeature(String name) {
+ try {
+ return mPM.hasSystemFeature(name);
+ } catch (RemoteException e) {
+ throw new RuntimeException("Package manager has died", e);
+ }
+ }
+
+ @Override
public int checkPermission(String permName, String pkgName) {
try {
return mPM.checkPermission(permName, pkgName);
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index c322951..fc6538f 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -283,6 +283,8 @@ interface IPackageManager {
*/
FeatureInfo[] getSystemAvailableFeatures();
+ boolean hasSystemFeature(String name);
+
void enterSafeMode();
boolean isSafeMode();
void systemReady();
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 825eb85..cd48dcb 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -995,11 +995,19 @@ public abstract class PackageManager {
*
* @return An array of FeatureInfo classes describing the features
* that are available on the system, or null if there are none(!!).
- *
*/
public abstract FeatureInfo[] getSystemAvailableFeatures();
/**
+ * Check whether the given feature name is one of the available
+ * features as returned by {@link #getSystemAvailableFeatures()}.
+ *
+ * @return Returns true if the devices supports the feature, else
+ * false.
+ */
+ public abstract boolean hasSystemFeature(String name);
+
+ /**
* Determine the best action to perform for a given Intent. This is how
* {@link Intent#resolveActivity} finds an activity if a class has not
* been explicitly specified.
diff --git a/data/etc/android.hardware.touchscreen.multitouch.xml b/data/etc/android.hardware.touchscreen.multitouch.xml
new file mode 100644
index 0000000..3d2399a
--- /dev/null
+++ b/data/etc/android.hardware.touchscreen.multitouch.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!-- This is the standard set of features for a touchscreen that supports
+ multitouch. -->
+<permissions>
+ <feature name="android.hardware.touchscreen.multitouch" />
+</permissions>
diff --git a/data/etc/required_hardware.xml b/data/etc/required_hardware.xml
index 896a148..05e7f8a 100644
--- a/data/etc/required_hardware.xml
+++ b/data/etc/required_hardware.xml
@@ -22,4 +22,5 @@
<feature name="android.hardware.sensor.accelerometer" />
<feature name="android.hardware.bluetooth" />
<feature name="android.hardware.wifi" />
+ <feature name="android.hardware.touchscreen" />
</permissions>
diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java
index 323a11f..867f215 100644
--- a/services/java/com/android/server/PackageManagerService.java
+++ b/services/java/com/android/server/PackageManagerService.java
@@ -1103,6 +1103,12 @@ class PackageManagerService extends IPackageManager.Stub {
return null;
}
+ public boolean hasSystemFeature(String name) {
+ synchronized (mPackages) {
+ return mAvailableFeatures.containsKey(name);
+ }
+ }
+
public int checkPermission(String permName, String pkgName) {
synchronized (mPackages) {
PackageParser.Package p = mPackages.get(pkgName);
diff --git a/test-runner/android/test/mock/MockPackageManager.java b/test-runner/android/test/mock/MockPackageManager.java
index beb9044..2f313af 100644
--- a/test-runner/android/test/mock/MockPackageManager.java
+++ b/test-runner/android/test/mock/MockPackageManager.java
@@ -430,6 +430,11 @@ public class MockPackageManager extends PackageManager {
}
@Override
+ public boolean hasSystemFeature(String name) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public boolean isSafeMode() {
throw new UnsupportedOperationException();
}