diff options
author | Dianne Hackborn <hackbod@google.com> | 2009-09-26 16:39:23 -0700 |
---|---|---|
committer | Dianne Hackborn <hackbod@google.com> | 2009-09-26 16:39:23 -0700 |
commit | 039c68e75606e837cf021815a0210836724574ad (patch) | |
tree | c65d4f12f6401a113421e3d6b59601da3d7ea97d | |
parent | 075a18d607c3aa8386b4d06aea22f4bfacbe447b (diff) | |
download | frameworks_base-039c68e75606e837cf021815a0210836724574ad.zip frameworks_base-039c68e75606e837cf021815a0210836724574ad.tar.gz frameworks_base-039c68e75606e837cf021815a0210836724574ad.tar.bz2 |
The touch screen is probably a feature.
Also extend the feature APIs a bit.
Change-Id: I99e932d7f4e61edb0e20f75c55e9831e4b59a14d
-rw-r--r-- | api/current.xml | 26 | ||||
-rw-r--r-- | cmds/pm/src/com/android/commands/pm/Pm.java | 45 | ||||
-rw-r--r-- | core/java/android/app/ApplicationContext.java | 9 | ||||
-rw-r--r-- | core/java/android/content/pm/IPackageManager.aidl | 2 | ||||
-rw-r--r-- | core/java/android/content/pm/PackageManager.java | 10 | ||||
-rw-r--r-- | data/etc/android.hardware.touchscreen.multitouch.xml | 21 | ||||
-rw-r--r-- | data/etc/required_hardware.xml | 1 | ||||
-rw-r--r-- | services/java/com/android/server/PackageManagerService.java | 6 | ||||
-rw-r--r-- | test-runner/android/test/mock/MockPackageManager.java | 5 |
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(); } |