Skip to content

Conversation

@Pearapps
Copy link
Collaborator

@Pearapps Pearapps commented Oct 27, 2025

Updates the document capture camera info to include ISO, focal length, isVirtualCamera, and the exposure duration to the uploaded camera info. This matches the iOS implementation and parameters name.

While the name "Virtual Camera" might sound like a software camera - the definition used on iOS is whether or not the camera is a "multi camera" or something similar. This means that the camera is a composite of multiple physical cameras or uses multiple in some way.

I kept this definition for the field here.

Overall, this adds another field to the camera info into the parameters to further match the iOS parameters.

See these:

2025-10-27 14:57:06.359 24074-24074 IdentityViewModel       com...droid.identity.example.theme1  D  DocumentUploadParam[front] back_score=0.11, front_card_score=0.81, high_res_image=file_1SMvbJGMZYGNxJkB3bAEQzGD, invalid_score=0.17, low_res_image=file_1SMvbJGMZYGNxJkBQaRPSrsq, passport_score=0.05, upload_method=AUTOCAPTURE, force_confirm=null, camera_lens_model=Google Pixel 7a (back), exposure_iso=45.0, focal_length=5.43, exposure_duration=7, is_virtual_camera=true
2025-10-27 14:57:11.364 24074-24074 IdentityViewModel       com...droid.identity.example.theme1  D  DocumentUploadParam[back] back_score=0.82, front_card_score=0.14, high_res_image=file_1SMvbOGMZYGNxJkB2QvsYzOW, invalid_score=0.06, low_res_image=file_1SMvbOGMZYGNxJkB8goh42wb, passport_score=0.01, upload_method=AUTOCAPTURE, force_confirm=null, camera_lens_model=Google Pixel 7a (back), exposure_iso=352.0, focal_length=5.43, exposure_duration=33, is_virtual_camera=true

Or more succinctly, just the new params:

image

@github-actions
Copy link
Contributor

github-actions bot commented Oct 27, 2025

Diffuse output:

OLD: identity-example-release-base.apk (signature: V1, V2)
NEW: identity-example-release-pr.apk (signature: V1, V2)

          │            compressed            │           uncompressed           
          ├───────────┬───────────┬──────────┼───────────┬───────────┬──────────
 APK      │ old       │ new       │ diff     │ old       │ new       │ diff     
──────────┼───────────┼───────────┼──────────┼───────────┼───────────┼──────────
      dex │   2.1 MiB │   2.1 MiB │ +1.8 KiB │   4.3 MiB │   4.3 MiB │ +2.7 KiB 
     arsc │   1.1 MiB │   1.1 MiB │      0 B │   1.1 MiB │   1.1 MiB │      0 B 
 manifest │   2.3 KiB │   2.3 KiB │      0 B │     8 KiB │     8 KiB │      0 B 
      res │ 302.7 KiB │ 302.7 KiB │      0 B │ 456.5 KiB │ 456.5 KiB │      0 B 
   native │   7.9 MiB │   7.9 MiB │      0 B │  19.3 MiB │  19.3 MiB │      0 B 
    asset │   7.7 KiB │   7.7 KiB │    +12 B │   7.4 KiB │   7.4 KiB │    +12 B 
    other │  95.7 KiB │  95.7 KiB │     +5 B │ 183.5 KiB │ 183.5 KiB │      0 B 
──────────┼───────────┼───────────┼──────────┼───────────┼───────────┼──────────
    total │  11.5 MiB │  11.5 MiB │ +1.8 KiB │  25.4 MiB │  25.4 MiB │ +2.8 KiB 

 DEX     │ old   │ new   │ diff            
─────────┼───────┼───────┼─────────────────
   files │     1 │     1 │   0             
 strings │ 20710 │ 20723 │ +13 (+21 -8)    
   types │  6515 │  6514 │  -1 (+4 -5)     
 classes │  5279 │  5278 │  -1 (+1 -2)     
 methods │ 31555 │ 31557 │  +2 (+518 -516) 
  fields │ 18279 │ 18292 │ +13 (+340 -327) 

 ARSC    │ old  │ new  │ diff 
─────────┼──────┼──────┼──────
 configs │  163 │  163 │  0   
 entries │ 3665 │ 3665 │  0
APK
     compressed      │    uncompressed     │                                           
──────────┬──────────┼──────────┬──────────┤                                           
 size     │ diff     │ size     │ diff     │ path                                      
──────────┼──────────┼──────────┼──────────┼───────────────────────────────────────────
  2.1 MiB │ +1.8 KiB │  4.3 MiB │ +2.7 KiB │ ∆ classes.dex                             
 25.9 KiB │     +9 B │ 64.5 KiB │      0 B │ ∆ META-INF/MANIFEST.MF                    
  6.8 KiB │     +8 B │  6.7 KiB │     +8 B │ ∆ assets/dexopt/baseline.prof             
 29.2 KiB │     -6 B │ 64.6 KiB │      0 B │ ∆ META-INF/CERT.SF                        
    912 B │     +4 B │    780 B │     +4 B │ ∆ assets/dexopt/baseline.profm            
    272 B │     +1 B │    120 B │      0 B │ ∆ META-INF/version-control-info.textproto 
  1.2 KiB │     +1 B │  1.2 KiB │      0 B │ ∆ META-INF/CERT.RSA                       
──────────┼──────────┼──────────┼──────────┼───────────────────────────────────────────
  2.1 MiB │ +1.8 KiB │  4.5 MiB │ +2.8 KiB │ (total)
DEX
STRINGS:

   old   │ new   │ diff         
  ───────┼───────┼──────────────
   20710 │ 20723 │ +13 (+21 -8) 
  
  + , exposureDuration=
  + , exposureIso=
  + , focalLength=
  + , isVirtualCamera=
  + LENS_INFO_AVAILABLE_FOCAL_LENGTHS
  + Lt3/n;
  + SENSOR_EXPOSURE_TIME
  + SENSOR_SENSITIVITY
  + VILLLLLLLLLLLLL
  + [LF/E0;
  + [LF/y0;
  + [Lw/V;
  + exposure_duration
  + exposure_iso
  + focal_length
  + getCameraCharacteristics(...)
  + getCameraId(...)
  + is_virtual_camera
  + null cannot be cast to non-null type android.hardware.camera2.CameraManager
  + session
  + ~~R8{"backend":"dex","compilation-mode":"release","has-checksums":false,"min-api":21,"pg-map-id":"cc39937","r8-mode":"full","version":"8.8.34"}
  
  - LF/G0;
  - Lw/h0;
  - Selfie camera lens model set to: 
  - VILLLLLLLLL
  - [LF/F0;
  - [LF/z0;
  - [Lw/W;
  - ~~R8{"backend":"dex","compilation-mode":"release","has-checksums":false,"min-api":21,"pg-map-id":"0c766fd","r8-mode":"full","version":"8.8.34"}
  

TYPES:

   old  │ new  │ diff       
  ──────┼──────┼────────────
   6515 │ 6514 │ -1 (+4 -5) 
  
  + Lt3/n;
  + [LF/E0;
  + [LF/y0;
  + [Lw/V;
  
  - LF/G0;
  - Lw/h0;
  - [LF/F0;
  - [LF/z0;
  - [Lw/W;
  

METHODS:

   old   │ new   │ diff           
  ───────┼───────┼────────────────
   31555 │ 31557 │ +2 (+518 -516) 
  
  + A.a <init>(m0, int)
  + A.a d(q0)
  + A.a j0(u) → a
  + A.a k0() → ByteBuffer
  + A.a m0() → int
  + A.a n0()
  + A.a o0(float, float, float, float)
  + A.a p0(Throwable)
  + A.a q0(a, String) → ArrayList
  + A.a r0(float, float, long)
  + A.a s0(float, float)
  + A.b <init>(m0, int)
  + A.d <init>(m0, m0)
  + A.m <init>(m0)
  + A1.l X(H, H) → g0
  + A1.l Y(a0, H, H, c)
  + A1.l a(n0, c) → boolean
  + A1.l c(n0, f)
  + A1.l d(C0) → E0
  + A1.l e(C0) → v
  + A1.l f(n0, c) → G
  + A1.l g(C0) → int
  + A1.l h(n0, c) → Set
  + A1.l i(C0) → int
  + A1.l j(C0) → String
  + A1.l k(C0, String) → String
  + A1.l l(C0) → int
  + A1.l m(C0) → boolean
  + A1.l n(C0) → boolean
  + A1.l o(n0) → Set
  + A1.l q(n0, c) → Object
  + A1.l r(n0, c, Object) → Object
  + A1.l s(n0, c, G) → Object
  + C.g <init>(a0, int)
  + C.g d() → C0
  + D.D B(P, g) → q0
  + D.D e(boolean, F0) → C0
  + D.D r(u, g) → C0
  + D.O C(String, Q, g) → q0
  + D.O e(boolean, F0) → C0
  + D.O r(u, g) → C0
  + D.P a() → z0
  + D.b0 D(h0, g)
  + D.b0 e(boolean, F0) → C0
  + D.b0 r(u, g) → C0
  + D.g <init>(z0, long, int, Matrix)
  + D.g a() → z0
  + D.q0 <init>(C0)
  + D.q0 a(w, w, C0, C0)
  + D.q0 e(boolean, F0) → C0
  + D.q0 l(u, C0, C0) → C0
  + D.q0 r(u, g) → C0
  + D.u <init>(g0)
  + D.z a(u0)
  + F.A0 <init>(long, e0)
  + F.A0 a() → long
  + F.A0 b(x) → d0
  + F.B0 <init>(u0, C0, g, List)
  + F.B0 toString() → String
  + F.C0 <clinit>()
  + F.C0 B() → u0
  + F.C0 M() → boolean
  + F.C0 V() → Range
  + F.C0 e0() → int
  + F.C0 l() → E0
  + F.C0 m() → int
  + F.C0 q() → u0
  + F.C0 r() → int
  + F.C0 t() → A
  + F.C0 u() → boolean
  + F.D0 a(E0, int) → H
  + F.E0 <clinit>()
  + F.E0 valueOf(String) → E0
  + F.E0 values() → E0[]
  + F.F0 a(E0, int) → H
  + F.F <init>(ArrayList, g0, int, ArrayList, boolean, z0, p)
  + F.O e() → m0
  + F.P <init>(g0)
  + F.P B() → u0
  + F.P l() → E0
  + F.P q() → u0
  + F.P t() → A
  + F.Q <init>(g0)
  + F.Q B() → u0
  + F.Q l() → E0
  + F.Q q() → u0
  + F.Q t() → A
  + F.a0 b() → a0
  + F.a0 c(H) → a0
  + F.a0 d(c, G, Object)
  + F.a0 i(c, Object)
  + F.b0 <init>(j0)
  + F.b0 <init>(W, n, int, d, d, boolean)
  + F.b0 a(Executor, d0)
  + F.b0 b(int, int) → boolean
  + F.b0 c() → k
  + F.b0 d(d0)
  + F.c0 a() → c0
  + F.d0 E(Throwable)
  + F.d0 a0(Object)
  + F.e0 a(Executor, d0)
  + F.e0 d(d0)
  + F.f0 <init>(int)
  + F.f0 compare(Object, Object) → int
  + F.g0 <clinit>()
  + F.g0 <init>(TreeMap)
  + F.g0 C(c) → boolean
  + F.g0 S(c) → G
  + F.g0 W(f)
  + F.g0 a(H) → g0
  + F.g0 f(c, G) → Object
  + F.g0 k(c) → Set
  + F.g0 n(c, Object) → Object
  + F.g0 o() → Set
  + F.g0 x(c) → Object
  + F.h0 <init>(g0)
  + F.h0 B() → u0
  + F.h0 F() → Size
  + F.h0 H() → String
  + F.h0 J() → boolean
  + F.h0 K(String) → String
  + F.h0 M() → boolean
  + F.h0 O() → Size
  + F.h0 Q() → List
  + F.h0 R() → int
  + F.h0 T() → b
  + F.h0 U() → H
  + F.h0 V() → Range
  + F.h0 Z() → int
  + F.h0 d0() → int
  + F.h0 e() → int
  + F.h0 e0() → int
  + F.h0 g() → int
  + F.h0 h() → Size
  + F.h0 l() → E0
  + F.h0 m() → int
  + F.h0 q() → u0
  + F.h0 r() → int
  + F.h0 t() → A
  + F.h0 u() → boolean
  + F.h0 v() → ArrayList
  + F.h0 w() → b
  + F.h0 z() → v
  
...✂

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants