OSDN Git Service

The touch screen is probably a feature.
authorDianne Hackborn <hackbod@google.com>
Sat, 26 Sep 2009 23:39:23 +0000 (16:39 -0700)
committerDianne Hackborn <hackbod@google.com>
Sat, 26 Sep 2009 23:39:23 +0000 (16:39 -0700)
Also extend the feature APIs a bit.

Change-Id: I99e932d7f4e61edb0e20f75c55e9831e4b59a14d

api/current.xml
cmds/pm/src/com/android/commands/pm/Pm.java
core/java/android/app/ApplicationContext.java
core/java/android/content/pm/IPackageManager.aidl
core/java/android/content/pm/PackageManager.java
data/etc/android.hardware.touchscreen.multitouch.xml [new file with mode: 0644]
data/etc/required_hardware.xml
services/java/com/android/server/PackageManagerService.java
test-runner/android/test/mock/MockPackageManager.java

index a331c64..b430e2c 100644 (file)
 <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"
 <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"
index b877098..79eb310 100644 (file)
@@ -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:");
index 8896015..0582e34 100644 (file)
@@ -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);
index c322951..fc6538f 100644 (file)
@@ -283,6 +283,8 @@ interface IPackageManager {
      */
     FeatureInfo[] getSystemAvailableFeatures();
 
+    boolean hasSystemFeature(String name);
+    
     void enterSafeMode();
     boolean isSafeMode();
     void systemReady();
index 825eb85..cd48dcb 100644 (file)
@@ -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 (file)
index 0000000..3d2399a
--- /dev/null
@@ -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>
index 896a148..05e7f8a 100644 (file)
@@ -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>
index 323a11f..867f215 100644 (file)
@@ -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);
index beb9044..2f313af 100644 (file)
@@ -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();
     }