Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e5276a74 authored by Dianne Hackborn's avatar Dianne Hackborn
Browse files

Fix issue #2084148: Define the format for the auto focus preview for barcode scanning

Add new manifest/aapt support for specifying device features an application
requires.  The aapt badging now returns these (as well as uses-permission since
I need to look for those anyway); if an app doesn't explicitly request the
camera feature but does request the permission, then aapt will say that it has
requested both the basic camera feature as well as the autofocus feature.

Here's what you put in your manifest to say you need a camera but don't need
autofocus:

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />

Here's what will be seen from aapt:

uses-permission:'android.permission.CAMERA'
uses-feature:'android.hardware.camera'
uses-feature-not-required:'android.hardware.camera.autofocus'

Change-Id: I4dd19cee0486cc54771f5bf14fc9db0e892115d5
parent d6ac7c73
Loading
Loading
Loading
Loading
+20 −9
Original line number Diff line number Diff line
@@ -1663,7 +1663,7 @@
 type="int"
 transient="false"
 volatile="false"
 value="16843406"
 value="16843407"
 static="true"
 final="true"
 deprecated="not deprecated"
@@ -2664,7 +2664,7 @@
 type="int"
 transient="false"
 volatile="false"
 value="16843407"
 value="16843408"
 static="true"
 final="true"
 deprecated="not deprecated"
@@ -6422,6 +6422,17 @@
 visibility="public"
>
</field>
<field name="required"
 type="int"
 transient="false"
 volatile="false"
 value="16843406"
 static="true"
 final="true"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="resizeable"
 type="int"
 transient="false"
@@ -7449,7 +7460,7 @@
 type="int"
 transient="false"
 volatile="false"
 value="16843414"
 value="16843415"
 static="true"
 final="true"
 deprecated="not deprecated"
@@ -8362,7 +8373,7 @@
 type="int"
 transient="false"
 volatile="false"
 value="16843408"
 value="16843409"
 static="true"
 final="true"
 deprecated="not deprecated"
@@ -8538,7 +8549,7 @@
 type="int"
 transient="false"
 volatile="false"
 value="16843412"
 value="16843413"
 static="true"
 final="true"
 deprecated="not deprecated"
@@ -8549,7 +8560,7 @@
 type="int"
 transient="false"
 volatile="false"
 value="16843413"
 value="16843414"
 static="true"
 final="true"
 deprecated="not deprecated"
@@ -8560,7 +8571,7 @@
 type="int"
 transient="false"
 volatile="false"
 value="16843410"
 value="16843411"
 static="true"
 final="true"
 deprecated="not deprecated"
@@ -8571,7 +8582,7 @@
 type="int"
 transient="false"
 volatile="false"
 value="16843411"
 value="16843412"
 static="true"
 final="true"
 deprecated="not deprecated"
@@ -8780,7 +8791,7 @@
 type="int"
 transient="false"
 volatile="false"
 value="16843409"
 value="16843410"
 static="true"
 final="true"
 deprecated="not deprecated"
+9 −0
Original line number Diff line number Diff line
@@ -781,6 +781,15 @@
             represent the minor number. For example for GL 1.2 referring to
             0x00000102, the actual value should be set as 0x00010002. -->
        <attr name="glEsVersion" format="integer"/>
        <!--  The name of the feature that is being used. -->
        <attr name="name" />
        <!--  Specify whether this feature is required for the application.
              The default is true, meaning the application requires the
              feature, and does not want to be installed on devices that
              don't support it.  If you set this to false, then this will
              not impose a restriction on where the application can be
              installed. -->
        <attr name="required" format="boolean" />
    </declare-styleable>

    <!-- The <code>uses-sdk</code> tag describes the SDK features that the
+1 −0
Original line number Diff line number Diff line
@@ -1150,6 +1150,7 @@
     =============================================================== -->
  <eat-comment />

  <public type="attr" name="required" id="0x0101028e" />
  <public type="attr" name="accountType" />
  <public type="attr" name="contentAuthority" />
  <public type="attr" name="userVisible" />
+44 −0
Original line number Diff line number Diff line
@@ -332,9 +332,11 @@ enum {
    TARGET_SDK_VERSION_ATTR = 0x01010270,
    TEST_ONLY_ATTR = 0x01010272,
    DENSITY_ATTR = 0x0101026c,
    GL_ES_VERSION_ATTR = 0x01010281,
    SMALL_SCREEN_ATTR = 0x01010284,
    NORMAL_SCREEN_ATTR = 0x01010285,
    LARGE_SCREEN_ATTR = 0x01010286,
    REQUIRED_ATTR = 0x0101028e,
};

const char *getComponentName(String8 &pkgName, String8 &componentName) {
@@ -520,6 +522,8 @@ int doDump(Bundle* bundle)
            bool actWidgetReceivers = false;
            bool actImeService = false;
            bool actWallpaperService = false;
            bool specCameraFeature = false;
            bool hasCameraPermission = false;
            int targetSdk = 0;
            int smallScreen = 1;
            int normalScreen = 1;
@@ -706,6 +710,37 @@ int doDump(Bundle* bundle)
                                NORMAL_SCREEN_ATTR, NULL, 1);
                        largeScreen = getIntegerAttribute(tree,
                                LARGE_SCREEN_ATTR, NULL, 1);
                    } else if (tag == "uses-feature") {
                        String8 name = getAttribute(tree, NAME_ATTR, &error);
                        if (error == "") {
                            int req = getIntegerAttribute(tree,
                                    REQUIRED_ATTR, NULL, 1);
                            if (name == "android.hardware.camera") {
                                specCameraFeature = true;
                            }
                            printf("uses-feature%s:'%s'\n",
                                    req ? "" : "-not-required", name.string());
                        } else {
                            int vers = getIntegerAttribute(tree,
                                    GL_ES_VERSION_ATTR, &error);
                            if (error == "") {
                                printf("uses-gl-es:'0x%x'\n", vers);
                            }
                        }
                    } else if (tag == "uses-permission") {
                        String8 name = getAttribute(tree, NAME_ATTR, &error);
                        if (error == "") {
                            int opt = getIntegerAttribute(tree,
                                    REQUIRED_ATTR, NULL, 1);
                            if (name == "android.permission.CAMERA") {
                                hasCameraPermission = true;
                            }
                            printf("uses-permission:'%s'\n", name.string());
                        } else {
                            fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n",
                                    error.string());
                            goto bail;
                        }
                    }
                } else if (depth == 3 && withinApplication) {
                    withinActivity = false;
@@ -803,6 +838,15 @@ int doDump(Bundle* bundle)
                }
            }

            if (!specCameraFeature && hasCameraPermission) {
                // For applications that have not explicitly stated their
                // camera feature requirements, but have requested the camera
                // permission, we are going to give them compatibility treatment
                // of requiring the equivalent to original android devices.
                printf("uses-feature:'android.hardware.camera'\n");
                printf("uses-feature:'android.hardware.camera.autofocus'\n");
            }
            
            if (hasMainActivity) {
                printf("main\n");
            }