Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

native link dagger setup #9465

Merged
merged 9 commits into from
Oct 21, 2024
Merged

native link dagger setup #9465

merged 9 commits into from
Oct 21, 2024

Conversation

toluo-stripe
Copy link
Contributor

@toluo-stripe toluo-stripe commented Oct 16, 2024

Summary

native link dagger setup

Motivation

This PR adds the dagger setup necessary to launch the native link flow.

Part of JIRA

Screen.Recording.2024-10-18.at.6.15.15.PM.mov

Testing

  • Added tests
  • Modified tests
  • Manually verified

Changelog

Copy link
Contributor

github-actions bot commented Oct 16, 2024

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.1 MiB │   4.1 MiB │ +594 B │   8.9 MiB │   8.9 MiB │ +3 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 │  +37 B │  25.6 KiB │  25.6 KiB │  +40 B 
      res │ 933.8 KiB │ 933.8 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 │  -18 B │   2.9 MiB │   2.9 MiB │  -18 B 
    other │ 201.3 KiB │ 201.3 KiB │   -6 B │ 443.4 KiB │ 443.4 KiB │    0 B 
──────────┼───────────┼───────────┼────────┼───────────┼───────────┼────────
    total │    13 MiB │    13 MiB │ +607 B │  22.1 MiB │  22.1 MiB │ +3 KiB 

 DEX     │ old   │ new   │ diff              
─────────┼───────┼───────┼───────────────────
   files │     1 │     1 │   0               
 strings │ 42980 │ 42993 │ +13 (+98 -85)     
   types │ 14504 │ 14510 │  +6 (+89 -83)     
 classes │ 12091 │ 12096 │  +5 (+13 -8)      
 methods │ 62451 │ 62461 │ +10 (+3489 -3479) 
  fields │ 41040 │ 41052 │ +12 (+2045 -2033) 

 ARSC    │ old  │ new  │ diff 
─────────┼──────┼──────┼──────
 configs │  242 │  242 │  0   
 entries │ 6273 │ 6273 │  0
APK
    compressed     │    uncompressed    │                                
──────────┬────────┼───────────┬────────┤                                
 size     │ diff   │ size      │ diff   │ path                           
──────────┼────────┼───────────┼────────┼────────────────────────────────
  4.1 MiB │ +594 B │   8.9 MiB │ +3 KiB │ ∆ classes.dex                  
  5.1 KiB │  +37 B │  25.6 KiB │  +40 B │ ∆ AndroidManifest.xml          
 53.7 KiB │  -17 B │ 119.2 KiB │    0 B │ ∆ META-INF/CERT.SF             
  8.1 KiB │  -14 B │     8 KiB │  -14 B │ ∆ assets/dexopt/baseline.prof  
 50.5 KiB │  +11 B │ 119.1 KiB │    0 B │ ∆ META-INF/MANIFEST.MF         
    1 KiB │   -4 B │     918 B │   -4 B │ ∆ assets/dexopt/baseline.profm 
──────────┼────────┼───────────┼────────┼────────────────────────────────
  4.2 MiB │ +607 B │   9.1 MiB │ +3 KiB │ (total)
MANIFEST
@@ -211,5 +211,7 @@
         android:configChanges="0x3504"
-        android:launchMode="1"
+        android:exported="false"
+        android:label="@string/stripe_link"
         android:name="com.stripe.android.link.LinkActivity"
-        android:theme="@style/StripeTransparentTheme"
+        android:theme="@style/StripeLinkBaseTheme"
+        android:windowSoftInputMode="0x16"
         />
DEX
STRINGS:

   old   │ new   │ diff          
  ───────┼───────┼───────────────
   42980 │ 42993 │ +13 (+98 -85) 
  
  + LJ7/D0;
  + LL6/x;
  + LL6/y;
  + LL6/z;
  + LO6/b;
  + LO6/c;
  + LO6/d;
  + LW7/o;
  + LW7/p;
  + LY/a0;
  + Lc8/z;
  + Li8/d2;
  + Lu7/u;
  + Native Link
  + NativeLinkArgs not found
  + NativeLinkArgs(configuration=
  + VLJFJII
  + VLJFJIIII
  + [LJ7/D0;
  + [LJ7/e0;
  + [LJ7/l0;
  + [LJ7/o0;
  + [LJ7/r0;
  + [LJ7/x0;
  + [LL6/q;
  + [LL6/u;
  + [LO3/b;
  + [LX7/o;
  + [LY/A;
  + [LY7/i;
  + [Lc8/h;
  + [Lc8/l;
  + [Lcom/stripe/android/stripecardscan/scanui/b;
  + [Lh9/H0;
  + [Lh9/s0;
  + [Li7/G0;
  + [Li7/O2;
  + [Li7/v1;
  + [Li8/c2;
  + [Ls9/h;
  + [Lu7/n;
  + [Lv6/B2;
  + [Lv6/B;
  + [Lv6/D0;
  + [Lv6/D1;
  + [Lv6/E;
  + [Lv6/G0;
  + [Lv6/G1;
  + [Lv6/H2;
  + [Lv6/H;
  + [Lv6/K2;
  + [Lv6/K;
  + [Lv6/N2;
  + [Lv6/N;
  + [Lv6/O1;
  + [Lv6/Q0;
  + [Lv6/Q;
  + [Lv6/S0;
  + [Lv6/U1;
  + [Lv6/U;
  + [Lv6/X1;
  + [Lv6/X;
  + [Lv6/a0;
  + [Lv6/a2;
  + [Lv6/c3;
  + [Lv6/e0;
  + [Lv6/e2;
  + [Lv6/e;
  + [Lv6/g1;
  + [Lv6/h0;
  + [Lv6/h2;
  + [Lv6/h;
  + [Lv6/j1;
  + [Lv6/l;
  + [Lv6/m1;
  + [Lv6/n2;
  + [Lv6/p;
  + [Lv6/q2;
  + [Lv6/s1;
  + [Lv6/s;
  + [Lv6/v0;
  + [Lv6/v;
  + [Lv6/y0;
  + [Lv6/y2;
  + [Lv6/y;
  + [Lv8/u;
  + [Lw0/C;
  + [Lw0/Z;
  + [Lw0/d0;
  + [Lw0/t;
  + [Lz5/d;
  + [Lz7/f;
  + [Lz7/k;
  + [Lz7/o;
  + loading
  + nativeLink
  + native_link_args
  + ~~R8{"backend":"dex","compilation-mode":"release","has-checksums":false,"min-api":21,"pg-map-id":"266c9db","r8-mode":"full","version":"8.5.35"}
  
  - LS7/u;
  - LY7/y;
  - Ld5/V;
  - Lf8/c;
  - Lg3/g;
  - Li1/z1;
  - Lv6/d3;
  - Lz7/O;
  - VLJFJIII
  - [LJ7/C0;
  - [LJ7/d0;
  - [LJ7/j0;
  - [LJ7/m0;
  - [LJ7/q0;
  - [LJ7/w0;
  - [LL6/l;
  - [LO3/a;
  - [LX7/n;
  - [LY/z;
  - [LY7/j;
  - [Lc8/g;
  - [Lc8/i;
  - [Lcom/stripe/android/stripecardscan/scanui/a;
  - [Lh9/G0;
  - [Lh9/r0;
  - [Li7/F0;
  - [Li7/N2;
  - [Li7/u1;
  - [Li8/Z1;
  - [Ls9/g;
  - [Lu7/m;
  - [Lv6/C2;
  - [Lv6/C;
  - [Lv6/E0;
  - [Lv6/E1;
  - [Lv6/F;
  - [Lv6/H0;
  - [Lv6/H1;
  - [Lv6/I2;
  - [Lv6/I;
  - [Lv6/L2;
  - [Lv6/L;
  - [Lv6/O2;
  - [Lv6/O;
  - [Lv6/P1;
  - [Lv6/R0;
  - [Lv6/S;
  - [Lv6/U0;
  - [Lv6/V1;
  - [Lv6/V;
  - [Lv6/Y1;
  - [Lv6/Y;
  - [Lv6/b0;
  - [Lv6/b2;
  - [Lv6/d3;
  - [Lv6/f0;
  - [Lv6/f2;
  - [Lv6/f;
  - [Lv6/h1;
  - [Lv6/i0;
  - [Lv6/i2;
  - [Lv6/i;
  - [Lv6/k1;
  - [Lv6/m;
  - [Lv6/n1;
  - [Lv6/o2;
  - [Lv6/q;
  - [Lv6/s2;
  - [Lv6/t1;
  - [Lv6/t;
  - [Lv6/w0;
  - [Lv6/w;
  - [Lv6/z0;
  - [Lv6/z2;
  - [Lv6/z;
  - [Lv8/t;
  - [Lw0/D;
  - [Lw0/c0;
  - [Lw0/e0;
  - [Lw0/u;
  - [Lz5/c;
  - [Lz7/h;
  - [Lz7/n;
  - [Lz7/q;
  - ~~R8{"backend":"dex","compilation-mode":"release","has-checksums":false,"min-api":21,"pg-map-id":"af53648","r8-mode":"full","version":"8.5.35"}
  

TYPES:

   old   │ new   │ diff         
  ───────┼───────┼──────────────
   14504 │ 14510 │ +6 (+89 -83) 
  
  + LJ7/D0;
  + LL6/x;
  + LL6/y;
  + LL6/z;
  + LO6/b;
  + LO6/c;
  + LO6/d;
  + LW7/o;
  + LW7/p;
  + LY/a0;
  + Lc8/z;
  + Li8/d2;
  + Lu7/u;
  + [LJ7/D0;
  + [LJ7/e0;
  + [LJ7/l0;
  + [LJ7/o0;
  + [LJ7/r0;
  + [LJ7/x0;
  + [LL6/q;
  + [LL6/u;
  + [LO3/b;
  + [LX7/o;
  + [LY/A;
  + [LY7/i;
  + [Lc8/h;
  + [Lc8/l;
  + [Lcom/stripe/android/stripecardscan/scanui/b;
  + [Lh9/H0;
  + [Lh9/s0;
  + [Li7/G0;
  + [Li7/O2;
  + [Li7/v1;
  + [Li8/c2;
  + [Ls9/h;
  + [Lu7/n;
  + [Lv6/B2;
  + [Lv6/B;
  + [Lv6/D0;
  + [Lv6/D1;
  + [Lv6/E;
  + [Lv6/G0;
  + [Lv6/G1;
  + [Lv6/H2;
  + [Lv6/H;
  + [Lv6/K2;
  + [Lv6/K;
  + [Lv6/N2;
  + [Lv6/N;
  + [Lv6/O1;
  + [Lv6/Q0;
  + [Lv6/Q;
  + [Lv6/S0;
  + [Lv6/U1;
  + [Lv6/U;
  + [Lv6/X1;
  + [Lv6/X;
  + [Lv6/a0;
  + [Lv6/a2;
  + [Lv6/c3;
  + [Lv6/e0;
  + [Lv6/e2;
  + [Lv6/e;
  + [Lv6/g1;
  + [Lv6/h0;
  + [Lv6/h2;
  + [Lv6/h;
  + [Lv6/j1;
  + [Lv6/l;
  + [Lv6/m1;
  + [Lv6/n2;
  + [Lv6/p;
  + [Lv6/q2;
  + [Lv6/s1;
  + [Lv6/s;
  + [Lv6/v0;
  + [Lv6/v;
  + [Lv6/y0;
  + [Lv6/y2;
  + [Lv6/y;
  + [Lv8/u;
  + [Lw0/C;
  + [Lw0/Z;
  + [Lw0/d0;
  + [Lw0/t;
  + [Lz5/d;
  + [Lz7/f;
  + [Lz7/k;
  + [Lz7/o;
  
  - LS7/u;
  - LY7/y;
  - Ld5/V;
  - Lf8/c;
  - Lg3/g;
  - Li1/z1;
  - Lv6/d3;
  - Lz7/O;
  - [LJ7/C0;
  - [LJ7/d0;
  - [LJ7/j0;
  - [LJ7/m0;
  - [LJ7/q0;
  - [LJ7/w0;
  - [LL6/l;
  - [LO3/a;
  - [LX7/n;
  - [LY/z;
  - [LY7/j;
  - [Lc8/g;
  - [Lc8/i;
  - [Lcom/stripe/android/stripecardscan/scanui/a;
  - [Lh9/G0;
  - [Lh9/r0;
  - [Li7/F0;
  - [Li7/N2;
  - [Li7/u1;
  - [Li8/Z1;
  - [Ls9/g;
  - [Lu7/m;
  - [Lv6/C2;
  - [Lv6/C;
  - [Lv6/E0;
  - [Lv6/E1;
  - [Lv
...✂

Copy link
Contributor

Risky Change

This is considered a risky change because it adjusts the sample app build.gradle, please review carefully.
We've seen issues in the past which resulted in failed builds for merchants. Please make sure the build.gradle change is intended.

By adding the label accept-risky-change to this PR, I acknowledge that I'm changing an example app and have verified that the SDK remains in a shippable state.

@toluo-stripe toluo-stripe force-pushed the tolu/link_dagger_setup branch from 5a34cfb to c58d6e9 Compare October 17, 2024 17:41
@toluo-stripe toluo-stripe marked this pull request as ready for review October 17, 2024 17:42
@toluo-stripe toluo-stripe requested review from a team as code owners October 17, 2024 17:42
@toluo-stripe toluo-stripe changed the title native link component native link dagger setup Oct 17, 2024
* retained component) to the factory to facilitate its creation via dependency injection.
*/
@Composable
internal inline fun <reified T : ViewModel> paneViewModel(
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ViewModel creation logic and general DI setup was inspired by financial-connections

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks! This is useful context. out of curiosity, do you know why this is called "pane" view model?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And is this needed in this PR? It looks unused so far

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There's no specific reason for the name, I'll change it to linkViewModel. I'll remove it from this PR since we're not creating any viewmodel at the moment. It's going to be useful for the follow up, which is the sign up UI

* retained component) to the factory to facilitate its creation via dependency injection.
*/
@Composable
internal inline fun <reified T : ViewModel> paneViewModel(
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks! This is useful context. out of curiosity, do you know why this is called "pane" view model?

* retained component) to the factory to facilitate its creation via dependency injection.
*/
@Composable
internal inline fun <reified T : ViewModel> paneViewModel(
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And is this needed in this PR? It looks unused so far

val savedStateHandle: SavedStateHandle = createSavedStateHandle()
val app = this[APPLICATION_KEY] as Application
val args: NativeLinkArgs =
requireNotNull(getArgs(savedStateHandle))
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

how can we ensure that the args aren't null here when the savedStateHandle was just created? Where are the args set?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The createSavedStateHandle will obtain arguments from the viewModelStoreOwner, which is LinkActivity in this case. The args were set here. The LinkActivityContractTest will make sure these args are always set.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

gotcha, thank you!

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FWIW, we shouldn't do these kinds of things. Merchants get mad at us when they see crashes when pen testing tools launch these.

We should add a test that the activity is finished without throwing in the case we don't get the arguments we expect.

@@ -0,0 +1,6 @@
package com.stripe.android.link

object NativeLinkEnabled {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are there any security concerns with including this in the SDK? I think long-term we wouldn't want this setting to live client-side, because I think an app could theoretically access and manipulate this data. Are there similar concerns about exposing it now while testing?

If we are ok with adding this, it should definitely not be public

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yh, this should be restricted to library group, my bad. I'll update it.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should probably be a feature flag instead. We have the ability to not allow setting it to true when in release mode.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will be a flag in elementSession, but that's not ready yet. We'll also need a signal from the attestation module to tell us if hardware attestation is available. That's also not ready yet. I added this as a stop gap to manually enable native link. It will evolve into a proper gate when the pieces mentioned above are available.

Is this still a risk if it's restricted to the library group? If yes, I can take it out and hardcode the launcher when I'm testing or creating a test build.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can use a local feature flag for now, which will prevent anything happening in published versions of the SDK.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@@ -32,7 +33,7 @@ class LinkActivityContractTest {

@Test
fun `LinkActivityContract creates intent with URL with native link disabled`() {
NativeLinkEnabled.enabled = false
FeatureFlags.nativeLinkEnabled.setEnabled(false)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We have a test rule you should use (so that these don't leak to other tests).

Copy link
Collaborator

@amk-stripe amk-stripe left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you also fill out the description with motivation and testing and maybe a screen recording? Thanks!


@VisibleForTesting
internal lateinit var navController: NavHostController

@Suppress("SwallowedException")
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we can also just log the exception and then we don't have to suppress this here

try {
viewModel = ViewModelProvider(this, LinkActivityViewModel.factory())[LinkActivityViewModel::class.java]
} catch (e: NoArgsException) {
setResult(Activity.RESULT_CANCELED)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this canceled instead of being a failure?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I followed the pattern here, but I'm happy to change it to a failure

internal var viewModelFactory: ViewModelProvider.Factory = LinkActivityViewModel.Factory()
private val viewModel: LinkActivityViewModel by viewModels { viewModelFactory }
internal class LinkActivity : ComponentActivity() {
internal var viewModel: LinkActivityViewModel? = null
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can you make this a lateinit variable? I think then you won't need to make the type nullable

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I made it nullable because onDestroy will get called when we finish the activity and viewModel.unregisterActivity() will crash since it's not initialized

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ahh gotcha, thanks

@@ -7,6 +7,7 @@ import com.stripe.android.core.BuildConfig
@Suppress("unused")
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you can probably remove this suppression now that this is being used!

@toluo-stripe toluo-stripe force-pushed the tolu/link_dagger_setup branch from edf484e to 56ca299 Compare October 18, 2024 22:21
internal var viewModelFactory: ViewModelProvider.Factory = LinkActivityViewModel.Factory()
private val viewModel: LinkActivityViewModel by viewModels { viewModelFactory }
internal class LinkActivity : ComponentActivity() {
internal var viewModel: LinkActivityViewModel? = null
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ahh gotcha, thanks

try {
viewModel = ViewModelProvider(this, LinkActivityViewModel.factory())[LinkActivityViewModel::class.java]
} catch (e: NoArgsException) {
Log.e(TAG, "Failed to create LinkActivityViewModel", e)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can you use our Logger class here instead of Log? Logger helps us avoid creating noisy logs in user apps.

Copy link

emerge-tools bot commented Oct 21, 2024

1 build increased size, 2 builds decreased size

Name Version Download Change Install Change Approval
Stripe Identity Example
com.stripe.android.identity.example.theme1
20.52.1-theme1 (20) 3.8 MB ⬇️ 10.9 kB (-0.29%) 8.9 MB ⬇️ 19.0 kB (-0.21%) N/A
Financial Connections Example
com.stripe.android.financialconnections.example
20.52.1 (205201) 4.2 MB ⬇️ 2.2 kB (-0.05%) 9.4 MB ⬇️ 13.9 kB (-0.15%) N/A
PaymentSheet Example
com.stripe.android.paymentsheet.example
20.52.1 (11) 8.7 MB ⬆️ 107.7 kB (1.26%) 16.4 MB ⬆️ 217.6 kB (1.35%) N/A

Stripe Identity Example 20.52.1-theme1 (20)
com.stripe.android.identity.example.theme1

⚖️ Compare build
⏱️ Analyze build performance

Total install size change: ⬇️ 19.0 kB (-0.21%)
Total download size change: ⬇️ 10.9 kB (-0.29%)

Largest size changes

Item Install Size Change Download Size Change
androidx.compose.ui.input.key.KeyEvent_androidKt ⬆️ 28.5 kB ⬆️ 13.7 kB
android.support.v4.media.session.MediaSessionCompat ⬇️ -18.3 kB ⬇️ -8.8 kB
🗑 kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt ⬇️ -17.5 kB ⬇️ -8.4 kB
kotlin.math.MathKt ⬇️ -15.9 kB ⬇️ -7.6 kB
🗑 androidx.appcompat.app.ActionBar ⬇️ -15.0 kB ⬇️ -7.2 kB
View Treemap

Image of diff

Financial Connections Example 20.52.1 (205201)
com.stripe.android.financialconnections.example

⚖️ Compare build
⏱️ Analyze build performance

Total install size change: ⬇️ 13.9 kB (-0.15%)
Total download size change: ⬇️ 2.2 kB (-0.05%)

Largest size changes

Item Install Size Change Download Size Change
📝 com.stripe.android.financialconnections.features.linkaccountpicke... ⬆️ 53.2 kB ⬆️ 25.2 kB
🗑 _COROUTINE ⬇️ -50.4 kB ⬇️ -23.8 kB
📝 okhttp3.internal.platform.BouncyCastlePlatform$Companion ⬆️ 47.0 kB ⬆️ 22.2 kB
🗑 com.stripe.android.model.parsers.SourceJsonParser$KlarnaJsonParse... ⬇️ -41.1 kB ⬇️ -19.4 kB
com.google.android.material.sidesheet.LeftSheetDelegate ⬆️ 36.5 kB ⬆️ 17.2 kB
View Treemap

Image of diff

PaymentSheet Example 20.52.1 (11)
com.stripe.android.paymentsheet.example

⚖️ Compare build
⏱️ Analyze build performance

Total install size change: ⬆️ 217.6 kB (1.35%)
Total download size change: ⬆️ 107.7 kB (1.26%)

Largest size changes

Item Install Size Change Download Size Change
androidx.transition.FragmentTransitionSupport$1 ⬇️ -49.7 kB ⬇️ -22.7 kB
📝 androidx.camera.core.impl.utils.MainThreadAsyncHandler ⬆️ 42.8 kB ⬆️ 19.6 kB
📝 com.stripe.android.paymentsheet.ui.PaymentSheetScreenKt ⬆️ 41.6 kB ⬆️ 19.0 kB
📝 com.stripe.android.paymentsheet.ui.PaymentMethodFormKt ⬆️ 33.3 kB ⬆️ 15.2 kB
kotlin.math.MathKt ⬇️ -30.9 kB ⬇️ -14.1 kB
View Treemap

Image of diff


🛸 Powered by Emerge Tools

Comment trigger: Size diff threshold of 100.00kB exceeded

@toluo-stripe toluo-stripe merged commit cdb260f into master Oct 21, 2024
16 checks passed
@toluo-stripe toluo-stripe deleted the tolu/link_dagger_setup branch October 21, 2024 17:38
amk-stripe pushed a commit that referenced this pull request Oct 22, 2024
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.

3 participants