am bc21ba24: am 093f5810: Merge change 27238 into eclair

Merge commit 'bc21ba2410233b40b21a190b26285a791ac5cc58'

* commit 'bc21ba2410233b40b21a190b26285a791ac5cc58':
  The touch screen is probably a feature.
This commit is contained in:
Dianne Hackborn
2009-09-28 01:09:32 -07:00
committed by Android Git Automerger
9 changed files with 124 additions and 1 deletions

View File

@ -41626,6 +41626,19 @@
<parameter name="appInfo" type="android.content.pm.ApplicationInfo"> <parameter name="appInfo" type="android.content.pm.ApplicationInfo">
</parameter> </parameter>
</method> </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" <method name="isSafeMode"
return="boolean" return="boolean"
abstract="true" abstract="true"
@ -131377,6 +131390,19 @@
<parameter name="appInfo" type="android.content.pm.ApplicationInfo"> <parameter name="appInfo" type="android.content.pm.ApplicationInfo">
</parameter> </parameter>
</method> </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" <method name="isSafeMode"
return="boolean" return="boolean"
abstract="false" abstract="false"

View File

@ -18,6 +18,7 @@ package com.android.commands.pm;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
import android.content.pm.FeatureInfo;
import android.content.pm.IPackageDeleteObserver; import android.content.pm.IPackageDeleteObserver;
import android.content.pm.IPackageInstallObserver; import android.content.pm.IPackageInstallObserver;
import android.content.pm.IPackageManager; import android.content.pm.IPackageManager;
@ -137,6 +138,7 @@ public final class Pm {
* pm list [package | packages] * pm list [package | packages]
* pm list permission-groups * pm list permission-groups
* pm list permissions * pm list permissions
* pm list features
* pm list instrumentation * pm list instrumentation
*/ */
private void runList() { private void runList() {
@ -152,6 +154,8 @@ public final class Pm {
runListPermissionGroups(); runListPermissionGroups();
} else if ("permissions".equals(type)) { } else if ("permissions".equals(type)) {
runListPermissions(); runListPermissions();
} else if ("features".equals(type)) {
runListFeatures();
} else if ("instrumentation".equals(type)) { } else if ("instrumentation".equals(type)) {
runListInstrumentation(); runListInstrumentation();
} else { } else {
@ -204,6 +208,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 * Lists all of the installed instrumentation, or all for a given package
* *
@ -778,6 +820,7 @@ public final class Pm {
System.err.println(" pm list permission-groups"); System.err.println(" pm list permission-groups");
System.err.println(" pm list permissions [-g] [-f] [-d] [-u] [GROUP]"); 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 instrumentation [-f] [TARGET-PACKAGE]");
System.err.println(" pm list features");
System.err.println(" pm path PACKAGE"); System.err.println(" pm path PACKAGE");
System.err.println(" pm install [-l] [-r] [-t] [-i INSTALLER_PACKAGE_NAME] PATH"); System.err.println(" pm install [-l] [-r] [-t] [-i INSTALLER_PACKAGE_NAME] PATH");
System.err.println(" pm uninstall [-k] PACKAGE"); 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("or only those that target a specified package. Options:");
System.err.println(" -f: see their associated file."); System.err.println(" -f: see their associated file.");
System.err.println(""); 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("The path command prints the path to the .apk of a package.");
System.err.println(""); System.err.println("");
System.err.println("The install command installs a package to the system. Options:"); System.err.println("The install command installs a package to the system. Options:");

View File

@ -1685,6 +1685,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 @Override
public int checkPermission(String permName, String pkgName) { public int checkPermission(String permName, String pkgName) {
try { try {

View File

@ -283,6 +283,8 @@ interface IPackageManager {
*/ */
FeatureInfo[] getSystemAvailableFeatures(); FeatureInfo[] getSystemAvailableFeatures();
boolean hasSystemFeature(String name);
void enterSafeMode(); void enterSafeMode();
boolean isSafeMode(); boolean isSafeMode();
void systemReady(); void systemReady();

View File

@ -995,10 +995,18 @@ public abstract class PackageManager {
* *
* @return An array of FeatureInfo classes describing the features * @return An array of FeatureInfo classes describing the features
* that are available on the system, or null if there are none(!!). * that are available on the system, or null if there are none(!!).
*
*/ */
public abstract FeatureInfo[] getSystemAvailableFeatures(); 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 * Determine the best action to perform for a given Intent. This is how
* {@link Intent#resolveActivity} finds an activity if a class has not * {@link Intent#resolveActivity} finds an activity if a class has not

View File

@ -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>

View File

@ -22,4 +22,5 @@
<feature name="android.hardware.sensor.accelerometer" /> <feature name="android.hardware.sensor.accelerometer" />
<feature name="android.hardware.bluetooth" /> <feature name="android.hardware.bluetooth" />
<feature name="android.hardware.wifi" /> <feature name="android.hardware.wifi" />
<feature name="android.hardware.touchscreen" />
</permissions> </permissions>

View File

@ -1103,6 +1103,12 @@ class PackageManagerService extends IPackageManager.Stub {
return null; return null;
} }
public boolean hasSystemFeature(String name) {
synchronized (mPackages) {
return mAvailableFeatures.containsKey(name);
}
}
public int checkPermission(String permName, String pkgName) { public int checkPermission(String permName, String pkgName) {
synchronized (mPackages) { synchronized (mPackages) {
PackageParser.Package p = mPackages.get(pkgName); PackageParser.Package p = mPackages.get(pkgName);

View File

@ -429,6 +429,11 @@ public class MockPackageManager extends PackageManager {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
@Override
public boolean hasSystemFeature(String name) {
throw new UnsupportedOperationException();
}
@Override @Override
public boolean isSafeMode() { public boolean isSafeMode() {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();