Loading docs/html/guide/topics/manifest/uses-feature-element.jd +5 −24 Original line number Original line Diff line number Diff line Loading @@ -1230,7 +1230,7 @@ densities: '160' </p> </p> <p> <p> When declared as required, this feature indicates that the app is By default, your app requires this feature. This feature indicates that the app is compatible with a device only if that device emulates a touchscreen compatible with a device only if that device emulates a touchscreen ("fake touch" interface) or has an actual touchscreen. ("fake touch" interface) or has an actual touchscreen. </p> </p> Loading @@ -1240,19 +1240,12 @@ densities: '160' that emulates a subset of a touchscreen's capabilities. For example, a that emulates a subset of a touchscreen's capabilities. For example, a mouse or remote control could drive an on-screen cursor. If your app mouse or remote control could drive an on-screen cursor. If your app requires basic point and click interaction (in other words, it won't work requires basic point and click interaction (in other words, it won't work with only a d-pad controller), you should declare this feature. Because with only a d-pad controller), you should declare this feature or simply avoid declaring any {@code android.hardware.touchscreen.*} features. Because this is the minimum level of touch interaction, you can also use an app this is the minimum level of touch interaction, you can also use an app that declares this feature on devices that offer more complex touch that declares this feature on devices that offer more complex touch interfaces. interfaces. </p> </p> <p class="note"> <strong>Note:</strong> Apps require the {@code android.hardware.touchscreen} feature by default. If you want your app to be available to devices that provide a fake touch interface, you must also explicitly declare that a touchscreen is not required as follows: </p> <pre><uses-feature android:name="android.hardware.touchscreen" <strong>android:required="false"</strong> /></pre> </dd> </dd> <dt> <dt> Loading Loading @@ -1326,22 +1319,10 @@ densities: '160' superset of the <code>android.hardware.faketouch</code> feature. superset of the <code>android.hardware.faketouch</code> feature. </p> </p> <p> By default, your app requires this feature. As such, your app is not available to devices that provide only an emulated touch interface ("fake touch") by default. If you want to make your app available on devices that provide a fake touch interface (or even on devices that provide only a d-pad controller), you must explicitly declare that a touchscreen is not required by declaring {@code android.hardware.touchscreen} with {@code android:required="false"}. You should add this declaration if your app uses—but does not require—a real touchscreen interface. </p> <p> <p> If your app in fact requires a touch interface (to perform more advanced If your app in fact requires a touch interface (to perform more advanced touch gestures such as fling), then you don't need to declare any touch touch gestures such as fling), then you must explicitly declare this feature interface features because they're required by default. However, it's or any advanced touchscreen features. best if you explicitly declare all features that your app uses. </p> </p> <p> <p> Loading tools/aapt/Command.cpp +24 −3 Original line number Original line Diff line number Diff line Loading @@ -529,6 +529,16 @@ struct FeatureGroup { int openGLESVersion; int openGLESVersion; }; }; static bool hasFeature(const char* name, const FeatureGroup& grp, const KeyedVector<String8, ImpliedFeature>& implied) { String8 name8(name); ssize_t idx = grp.features.indexOfKey(name8); if (idx < 0) { idx = implied.indexOfKey(name8); } return idx >= 0; } static void addImpliedFeature(KeyedVector<String8, ImpliedFeature>* impliedFeatures, static void addImpliedFeature(KeyedVector<String8, ImpliedFeature>* impliedFeatures, const char* name, const char* reason, bool sdk23) { const char* name, const char* reason, bool sdk23) { String8 name8(name); String8 name8(name); Loading Loading @@ -616,9 +626,16 @@ static void addParentFeatures(FeatureGroup* grp, const String8& name) { } else if (name == "android.hardware.location.gps" || } else if (name == "android.hardware.location.gps" || name == "android.hardware.location.network") { name == "android.hardware.location.network") { grp->features.add(String8("android.hardware.location"), Feature(true)); grp->features.add(String8("android.hardware.location"), Feature(true)); } else if (name == "android.hardware.faketouch.multitouch") { grp->features.add(String8("android.hardware.faketouch"), Feature(true)); } else if (name == "android.hardware.faketouch.multitouch.distinct" || name == "android.hardware.faketouch.multitouch.jazzhands") { grp->features.add(String8("android.hardware.faketouch.multitouch"), Feature(true)); grp->features.add(String8("android.hardware.faketouch"), Feature(true)); } else if (name == "android.hardware.touchscreen.multitouch") { } else if (name == "android.hardware.touchscreen.multitouch") { grp->features.add(String8("android.hardware.touchscreen"), Feature(true)); grp->features.add(String8("android.hardware.touchscreen"), Feature(true)); } else if (name == "android.hardware.touchscreen.multitouch.distinct") { } else if (name == "android.hardware.touchscreen.multitouch.distinct" || name == "android.hardware.touchscreen.multitouch.jazzhands") { grp->features.add(String8("android.hardware.touchscreen.multitouch"), Feature(true)); grp->features.add(String8("android.hardware.touchscreen.multitouch"), Feature(true)); grp->features.add(String8("android.hardware.touchscreen"), Feature(true)); grp->features.add(String8("android.hardware.touchscreen"), Feature(true)); } else if (name == "android.hardware.opengles.aep") { } else if (name == "android.hardware.opengles.aep") { Loading Loading @@ -2005,8 +2022,12 @@ int doDump(Bundle* bundle) } } } } addImpliedFeature(&impliedFeatures, "android.hardware.touchscreen", // If the app hasn't declared the touchscreen as a feature requirement (either // directly or implied, required or not), then the faketouch feature is implied. if (!hasFeature("android.hardware.touchscreen", commonFeatures, impliedFeatures)) { addImpliedFeature(&impliedFeatures, "android.hardware.faketouch", "default feature for all apps", false); "default feature for all apps", false); } const size_t numFeatureGroups = featureGroups.size(); const size_t numFeatureGroups = featureGroups.size(); if (numFeatureGroups == 0) { if (numFeatureGroups == 0) { Loading Loading
docs/html/guide/topics/manifest/uses-feature-element.jd +5 −24 Original line number Original line Diff line number Diff line Loading @@ -1230,7 +1230,7 @@ densities: '160' </p> </p> <p> <p> When declared as required, this feature indicates that the app is By default, your app requires this feature. This feature indicates that the app is compatible with a device only if that device emulates a touchscreen compatible with a device only if that device emulates a touchscreen ("fake touch" interface) or has an actual touchscreen. ("fake touch" interface) or has an actual touchscreen. </p> </p> Loading @@ -1240,19 +1240,12 @@ densities: '160' that emulates a subset of a touchscreen's capabilities. For example, a that emulates a subset of a touchscreen's capabilities. For example, a mouse or remote control could drive an on-screen cursor. If your app mouse or remote control could drive an on-screen cursor. If your app requires basic point and click interaction (in other words, it won't work requires basic point and click interaction (in other words, it won't work with only a d-pad controller), you should declare this feature. Because with only a d-pad controller), you should declare this feature or simply avoid declaring any {@code android.hardware.touchscreen.*} features. Because this is the minimum level of touch interaction, you can also use an app this is the minimum level of touch interaction, you can also use an app that declares this feature on devices that offer more complex touch that declares this feature on devices that offer more complex touch interfaces. interfaces. </p> </p> <p class="note"> <strong>Note:</strong> Apps require the {@code android.hardware.touchscreen} feature by default. If you want your app to be available to devices that provide a fake touch interface, you must also explicitly declare that a touchscreen is not required as follows: </p> <pre><uses-feature android:name="android.hardware.touchscreen" <strong>android:required="false"</strong> /></pre> </dd> </dd> <dt> <dt> Loading Loading @@ -1326,22 +1319,10 @@ densities: '160' superset of the <code>android.hardware.faketouch</code> feature. superset of the <code>android.hardware.faketouch</code> feature. </p> </p> <p> By default, your app requires this feature. As such, your app is not available to devices that provide only an emulated touch interface ("fake touch") by default. If you want to make your app available on devices that provide a fake touch interface (or even on devices that provide only a d-pad controller), you must explicitly declare that a touchscreen is not required by declaring {@code android.hardware.touchscreen} with {@code android:required="false"}. You should add this declaration if your app uses—but does not require—a real touchscreen interface. </p> <p> <p> If your app in fact requires a touch interface (to perform more advanced If your app in fact requires a touch interface (to perform more advanced touch gestures such as fling), then you don't need to declare any touch touch gestures such as fling), then you must explicitly declare this feature interface features because they're required by default. However, it's or any advanced touchscreen features. best if you explicitly declare all features that your app uses. </p> </p> <p> <p> Loading
tools/aapt/Command.cpp +24 −3 Original line number Original line Diff line number Diff line Loading @@ -529,6 +529,16 @@ struct FeatureGroup { int openGLESVersion; int openGLESVersion; }; }; static bool hasFeature(const char* name, const FeatureGroup& grp, const KeyedVector<String8, ImpliedFeature>& implied) { String8 name8(name); ssize_t idx = grp.features.indexOfKey(name8); if (idx < 0) { idx = implied.indexOfKey(name8); } return idx >= 0; } static void addImpliedFeature(KeyedVector<String8, ImpliedFeature>* impliedFeatures, static void addImpliedFeature(KeyedVector<String8, ImpliedFeature>* impliedFeatures, const char* name, const char* reason, bool sdk23) { const char* name, const char* reason, bool sdk23) { String8 name8(name); String8 name8(name); Loading Loading @@ -616,9 +626,16 @@ static void addParentFeatures(FeatureGroup* grp, const String8& name) { } else if (name == "android.hardware.location.gps" || } else if (name == "android.hardware.location.gps" || name == "android.hardware.location.network") { name == "android.hardware.location.network") { grp->features.add(String8("android.hardware.location"), Feature(true)); grp->features.add(String8("android.hardware.location"), Feature(true)); } else if (name == "android.hardware.faketouch.multitouch") { grp->features.add(String8("android.hardware.faketouch"), Feature(true)); } else if (name == "android.hardware.faketouch.multitouch.distinct" || name == "android.hardware.faketouch.multitouch.jazzhands") { grp->features.add(String8("android.hardware.faketouch.multitouch"), Feature(true)); grp->features.add(String8("android.hardware.faketouch"), Feature(true)); } else if (name == "android.hardware.touchscreen.multitouch") { } else if (name == "android.hardware.touchscreen.multitouch") { grp->features.add(String8("android.hardware.touchscreen"), Feature(true)); grp->features.add(String8("android.hardware.touchscreen"), Feature(true)); } else if (name == "android.hardware.touchscreen.multitouch.distinct") { } else if (name == "android.hardware.touchscreen.multitouch.distinct" || name == "android.hardware.touchscreen.multitouch.jazzhands") { grp->features.add(String8("android.hardware.touchscreen.multitouch"), Feature(true)); grp->features.add(String8("android.hardware.touchscreen.multitouch"), Feature(true)); grp->features.add(String8("android.hardware.touchscreen"), Feature(true)); grp->features.add(String8("android.hardware.touchscreen"), Feature(true)); } else if (name == "android.hardware.opengles.aep") { } else if (name == "android.hardware.opengles.aep") { Loading Loading @@ -2005,8 +2022,12 @@ int doDump(Bundle* bundle) } } } } addImpliedFeature(&impliedFeatures, "android.hardware.touchscreen", // If the app hasn't declared the touchscreen as a feature requirement (either // directly or implied, required or not), then the faketouch feature is implied. if (!hasFeature("android.hardware.touchscreen", commonFeatures, impliedFeatures)) { addImpliedFeature(&impliedFeatures, "android.hardware.faketouch", "default feature for all apps", false); "default feature for all apps", false); } const size_t numFeatureGroups = featureGroups.size(); const size_t numFeatureGroups = featureGroups.size(); if (numFeatureGroups == 0) { if (numFeatureGroups == 0) { Loading