stripe-android icon indicating copy to clipboard operation
stripe-android copied to clipboard

Pass `hosted_surface` correctly across surfaces.

Open carlosmuvi-stripe opened this issue 1 year ago โ€ข 2 comments

Summary

We're not properly handling hosted surfaces across Connections integrations:

  • L1 (direct integrations): hosted surface should be null
  • PaymentSheet: hosted surface should be payment_element
  • CustomerSheet: hosted surface will be customer_sheet.

This PR allows CollectBankAccountLauncher internal implementations to receive a hosted surface. That surface will be sent when calling the create LAS endpoint. Public L1 integrations will not expose this parameter, that will instead be null.

Motivation

:notebook_with_decorative_cover: ย [๐Ÿงต] Update ACH payment flow to pass hosted_surface during deferred intent session creation :globe_with_meridians: ย BANKCON-11012

Make sure that on ACH / ID flows:

  • On L1 surfaces (collectBankAccountFor... publicly exposed entry points):
    • We don't send hosted_surface when creating the FCsession
  • On L3 surfaces (currently just MPE)
    • We send hosted_surface = payment_element

Testing

  • [ ] Added tests
  • [ ] Modified tests
  • [X] Manually verified

Screenshots

From customer sheet: image

From payment sheet: image

Changelog

carlosmuvi-stripe avatar Jun 10 '24 20:06 carlosmuvi-stripe

Diffuse output:

OLD: paymentsheet-example-release-master.apk (signature: V1, V2)
NEW: paymentsheet-example-release-pr.apk (signature: V1, V2)

          โ”‚            compressed            โ”‚           uncompressed           
          โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 APK      โ”‚ old       โ”‚ new       โ”‚ diff     โ”‚ old       โ”‚ new       โ”‚ diff     
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
      dex โ”‚     4 MiB โ”‚     4 MiB โ”‚   +475 B โ”‚   8.7 MiB โ”‚   8.7 MiB โ”‚ +1.7 KiB 
     arsc โ”‚   2.3 MiB โ”‚   2.3 MiB โ”‚      0 B โ”‚   2.3 MiB โ”‚   2.3 MiB โ”‚      0 B 
 manifest โ”‚   5.1 KiB โ”‚   5.1 KiB โ”‚      0 B โ”‚  25.6 KiB โ”‚  25.6 KiB โ”‚      0 B 
      res โ”‚ 918.5 KiB โ”‚ 918.5 KiB โ”‚      0 B โ”‚   1.5 MiB โ”‚   1.5 MiB โ”‚      0 B 
   native โ”‚   2.6 MiB โ”‚   2.6 MiB โ”‚      0 B โ”‚     6 MiB โ”‚     6 MiB โ”‚      0 B 
    asset โ”‚   2.9 MiB โ”‚   2.9 MiB โ”‚ +1.4 KiB โ”‚   2.9 MiB โ”‚   2.9 MiB โ”‚ +1.4 KiB 
    other โ”‚   195 KiB โ”‚   195 KiB โ”‚     -2 B โ”‚ 428.4 KiB โ”‚ 428.4 KiB โ”‚      0 B 
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    total โ”‚  12.8 MiB โ”‚  12.8 MiB โ”‚ +1.9 KiB โ”‚  21.8 MiB โ”‚  21.8 MiB โ”‚   +3 KiB 

 DEX     โ”‚ old   โ”‚ new   โ”‚ diff          
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
   files โ”‚     1 โ”‚     1 โ”‚   0           
 strings โ”‚ 43585 โ”‚ 43589 โ”‚  +4 (+7 -3)   
   types โ”‚ 14988 โ”‚ 14990 โ”‚  +2 (+2 -0)   
 classes โ”‚ 12670 โ”‚ 12672 โ”‚  +2 (+2 -0)   
 methods โ”‚ 62032 โ”‚ 62038 โ”‚  +6 (+40 -34) 
  fields โ”‚ 40957 โ”‚ 40970 โ”‚ +13 (+24 -11) 

 ARSC    โ”‚ old  โ”‚ new  โ”‚ diff 
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€
 configs โ”‚  242 โ”‚  242 โ”‚  0   
 entries โ”‚ 6043 โ”‚ 6043 โ”‚  0
APK
     compressed      โ”‚     uncompressed     โ”‚                               
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค                               
 size     โ”‚ diff     โ”‚ size      โ”‚ diff     โ”‚ path                          
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
  7.4 KiB โ”‚ +1.4 KiB โ”‚   7.2 KiB โ”‚ +1.4 KiB โ”‚ โˆ† assets/dexopt/baseline.prof 
    4 MiB โ”‚   +475 B โ”‚   8.7 MiB โ”‚ +1.7 KiB โ”‚ โˆ† classes.dex                 
 52.9 KiB โ”‚     -7 B โ”‚ 117.2 KiB โ”‚      0 B โ”‚ โˆ† META-INF/CERT.SF            
  1.2 KiB โ”‚     +5 B โ”‚   1.2 KiB โ”‚      0 B โ”‚ โˆ† META-INF/CERT.RSA           
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    4 MiB โ”‚ +1.9 KiB โ”‚   8.9 MiB โ”‚   +3 KiB โ”‚ (total)
DEX
STRINGS:

   old   โ”‚ new   โ”‚ diff       
  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
   43585 โ”‚ 43589 โ”‚ +4 (+7 -3) 
  
  + , hostedSurface=
  + Lv6/f;
  + Lv6/g;
  + VZLZZZLLLLLL
  + VZLZZZLLLLLLLLLLL
  + hostedSurface
  + ~~R8{backend:dex,compilation-mode:release,has-checksums:false,min-api:21,pg-map-id:82244ec,r8-mode:full,version:8.3.37}
  
  - VZLZZZLLLLL
  - VZLZZZLLLLLLLLLL
  - ~~R8{backend:dex,compilation-mode:release,has-checksums:false,min-api:21,pg-map-id:1932dbd,r8-mode:full,version:8.3.37}
  

TYPES:

   old   โ”‚ new   โ”‚ diff       
  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
   14988 โ”‚ 14990 โ”‚ +2 (+2 -0) 
  
  + Lv6/f;
  + Lv6/g;
  

METHODS:

   old   โ”‚ new   โ”‚ diff         
  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
   62032 โ”‚ 62038 โ”‚ +6 (+40 -34) 
  
  + H5.j a(a)
  + H5.l a(a)
  + H5.q a(a)
  + i7.D <init>(boolean, a, boolean, boolean, boolean, String, String, String, v, a, String)
  + i7.n <init>(boolean, String, boolean, boolean, boolean, String, String, String, a, A, e, c, q0, c, c, c)
  + q6.K <init>(String, String, String, String, Integer, String)
  + q6.L <init>(String, String, String)
  + q6.M <init>(String, String, String, String)
  + v6.d <init>(g, String)
  + v6.d a(String, String, b, String, String)
  + v6.d b(String, String, String, c)
  + v6.d c(String, String, b, String, String, Integer, String)
  + v6.d d()
  + v6.d e(String, String, String, c)
  + v6.e <init>(int, c)
  + v6.e a(Object)
  + v6.f <init>(g, String)
  + v6.f a(String, String, b, String, String)
  + v6.f b(String, String, String, c)
  + v6.f c(String, String, b, String, String, Integer, String)
  + v6.f d()
  + v6.f e(String, String, String, c)
  + v6.g a(String, String, b, String, String)
  + v6.g b(String, String, String, c)
  + v6.g c(String, String, b, String, String, Integer, String)
  + v6.g d()
  + v6.g e(String, String, String, c)
  + x6.g a(String, String, String, String, String, String, Integer, String, e) โ†’ Object
  + x6.g b(String, String, String, String, c, e) โ†’ Object
  + x6.g c(String, String, String, String, c, e) โ†’ Object
  + x6.g e(c, String, String) โ†’ N
  + y6.a <init>(String, String, c, String, String, String, String, Integer, String)
  + y6.a A() โ†’ String
  + y6.b <init>(String, String, c, String, String, String, String)
  + y6.b A() โ†’ String
  + y6.c <init>(String, String, String, c, boolean, String)
  + y6.c A() โ†’ String
  + y6.d <init>(String, String, String, c, boolean, String)
  + y6.d A() โ†’ String
  + y6.e A() โ†’ String
  
  - H5.j a(String, String, b, String, String)
  - H5.j b(String, String, String, c)
  - H5.j c(String, String, b, String, String, Integer, String)
  - H5.j d()
  - H5.j e(a)
  - H5.j f(String, String, String, c)
  - H5.l <init>(g)
  - H5.l a(String, String, b, String, String)
  - H5.l b(String, String, String, c)
  - H5.l c(String, String, b, String, String, Integer, String)
  - H5.l d()
  - H5.l e(a)
  - H5.l f(String, String, String, c)
  - H5.q e(a)
  - i7.D <init>(boolean, a, boolean, boolean, boolean, String, String, String, v, a)
  - i7.n <init>(boolean, String, boolean, boolean, boolean, String, String, a, A, e, c, q0, c, c, c)
  - q6.K <init>(String, String, String, Integer, String)
  - q6.L <init>(String, String)
  - q6.M <init>(String, String, String)
  - v6.d <init>(int, c)
  - v6.d a(Object)
  - v6.e a(String, String, b, String, String)
  - v6.e b(String, String, String, c)
  - v6.e c(String, String, b, String, String, Integer, String)
  - v6.e d()
  - v6.e f(String, String, String, c)
  - x6.g a(String, String, String, String, String, Integer, String, e) โ†’ Object
  - x6.g b(String, String, String, c, e) โ†’ Object
  - x6.g c(String, String, String, c, e) โ†’ Object
  - x6.g e(c, String) โ†’ N
  - y6.a <init>(String, String, c, String, String, String, Integer, String)
  - y6.b <init>(String, String, c, String, String, String)
  - y6.c <init>(String, String, String, c, boolean)
  - y6.d <init>(String, String, String, c, boolean)
  

FIELDS:

   old   โ”‚ new   โ”‚ diff          
  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
   40957 โ”‚ 40970 โ”‚ +13 (+24 -11) 
  
  + i7.D k: String
  + i7.F y: g
  + i7.n h: String
  + i7.n i: a
  + i7.n j: A
  + i7.n k: e
  + i7.n p: c
  + q6.K h: String
  + q6.K i: Integer
  + q6.K j: String
  + q6.L c: String
  + q6.M d: String
  + v6.d a: e
  + v6.d b: String
  + v6.e S: int
  + v6.e T: c
  + v6.f a: e
  + v6.f b: String
  + y6.a a0: String
  + y6.a b0: Integer
  + y6.a c0: String
  + y6.b a0: String
  + y6.c Z: String
  + y6.d Z: String
  
  - 
...โœ‚

github-actions[bot] avatar Jun 10 '24 22:06 github-actions[bot]

@tillh-stripe needs another โœ… after the AddPaymentMethod refactor : )

carlosmuvi-stripe avatar Jul 01 '24 16:07 carlosmuvi-stripe