Skip to content

Conversation

@samer-stripe
Copy link
Collaborator

@samer-stripe samer-stripe commented Nov 3, 2025

Summary

Support Jetpack Compose 1.9.4

Motivation

Keep Jetpack Compose up to date.

Testing

  • Added tests
  • Modified tests
  • Manually verified

@github-actions
Copy link
Contributor

github-actions bot commented Nov 3, 2025

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.

@samer-stripe samer-stripe force-pushed the samer/support-jetpack-compose-1.9.4 branch from 9830040 to a4ae818 Compare November 3, 2025 17:23
@samer-stripe samer-stripe added the accept-risky-change accept-risky-change label Nov 3, 2025
@github-actions
Copy link
Contributor

github-actions bot commented Nov 3, 2025

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.6 MiB │   4.7 MiB │  +99.2 KiB │ 10.2 MiB │  10.4 MiB │ +177.1 KiB 
     arsc │   2.7 MiB │   2.8 MiB │  +10.3 KiB │  2.7 MiB │   2.8 MiB │  +10.3 KiB 
 manifest │   5.5 KiB │   5.5 KiB │       -2 B │ 29.2 KiB │  29.2 KiB │        0 B 
      res │ 928.5 KiB │ 928.6 KiB │      +32 B │  1.5 MiB │   1.5 MiB │        0 B 
   native │ 949.9 KiB │ 949.9 KiB │        0 B │  2.5 MiB │   2.5 MiB │        0 B 
    asset │  24.8 KiB │  26.4 KiB │   +1.6 KiB │ 45.1 KiB │  46.8 KiB │   +1.7 KiB 
    other │ 193.9 KiB │ 209.5 KiB │  +15.6 KiB │  366 KiB │ 407.5 KiB │  +41.5 KiB 
──────────┼───────────┼───────────┼────────────┼──────────┼───────────┼────────────
    total │   9.4 MiB │   9.5 MiB │ +126.7 KiB │ 17.3 MiB │  17.6 MiB │ +230.6 KiB 

         │          raw          │                unique                
         ├───────┬───────┬───────┼───────┬───────┬──────────────────────
 DEX     │ old   │ new   │ diff  │ old   │ new   │ diff                 
─────────┼───────┼───────┼───────┼───────┼───────┼──────────────────────
   files │     2 │     2 │     0 │       │       │                      
 strings │ 50711 │ 52110 │ +1399 │ 47940 │ 48116 │ +176 (+7859 -7683)   
   types │ 18267 │ 19123 │  +856 │ 16950 │ 17018 │  +68 (+7317 -7249)   
 classes │ 14304 │ 14339 │   +35 │ 14304 │ 14339 │  +35 (+6123 -6088)   
 methods │ 71394 │ 72894 │ +1500 │ 69482 │ 69885 │ +403 (+45633 -45230) 
  fields │ 47675 │ 48347 │  +672 │ 46700 │ 46939 │ +239 (+35340 -35101) 

 ARSC    │ old  │ new  │ diff         
─────────┼──────┼──────┼──────────────
 configs │  242 │  242 │   0          
 entries │ 6245 │ 6269 │ +24 (+24 -0)
APK
       compressed       │      uncompressed      │                                                                  
───────────┬────────────┼───────────┬────────────┤                                                                  
 size      │ diff       │ size      │ diff       │ path                                                             
───────────┼────────────┼───────────┼────────────┼──────────────────────────────────────────────────────────────────
 384.3 KiB │  +98.7 KiB │ 889.7 KiB │   +200 KiB │ ∆ classes2.dex                                                   
   2.8 MiB │  +10.3 KiB │   2.8 MiB │  +10.3 KiB │ ∆ resources.arsc                                                 
   3.7 KiB │   +3.7 KiB │   9.9 KiB │   +9.9 KiB │ + META-INF/androidx/lifecycle/lifecycle-common-java8/LICENSE.txt 
   3.7 KiB │   +3.7 KiB │   9.9 KiB │   +9.9 KiB │ + META-INF/androidx/lifecycle/lifecycle-common/LICENSE.txt       
   3.7 KiB │   +3.7 KiB │   9.9 KiB │   +9.9 KiB │ + META-INF/androidx/collection/collection-ktx/LICENSE.txt        
   3.7 KiB │   +3.7 KiB │   9.9 KiB │   +9.9 KiB │ + META-INF/androidx/collection/collection/LICENSE.txt            
  10.1 KiB │   +1.3 KiB │   9.9 KiB │   +1.3 KiB │ ∆ assets/dexopt/baseline.prof                                    
   4.3 MiB │     +521 B │   9.5 MiB │  -22.9 KiB │ ∆ classes.dex                                                    
  53.9 KiB │     +323 B │ 119.4 KiB │     +887 B │ ∆ META-INF/CERT.SF                                               
   1.3 KiB │     +215 B │   1.2 KiB │     +215 B │ ∆ assets/dexopt/baseline.profm                                   
     204 B │     +204 B │       6 B │       +6 B │ + META-INF/androidx.compose.runtime_runtime-annotation.version   
     194 B │     +194 B │       6 B │       +6 B │ + META-INF/androidx.savedstate_savedstate-compose.version        
     172 B │     +172 B │       6 B │       +6 B │ + META-INF/androidx.core_core-viewtree.version                   
     127 B │     +127 B │       5 B │       +5 B │ + META-INF/services/ja.y                                         
     127 B │     +127 B │       5 B │       +5 B │ + META-INF/services/ka.a                                         
           │     -127 B │           │       -5 B │ - META-INF/services/W9.x                                         
           │     -127 B │           │       -5 B │ - META-INF/services/X9.a                                         
  50.5 KiB │      +91 B │ 119.4 KiB │     +887 B │ ∆ META-INF/MANIFEST.MF                                           
   1.8 KiB │      +19 B │   7.3 KiB │     +161 B │ ∆ assets/sentry-external-modules.txt                             
     541 B │       +8 B │     984 B │        0 B │ ∆ res/J7.xml                                                     
     524 B │       +7 B │     956 B │        0 B │ ∆ res/66.xml                                                     
     270 B │       -2 B │     120 B │        0 B │ ∆ META-INF/version-control-info.textproto                        
     210 B │       -2 B │      88 B │        0 B │ ∆ META-INF/ui_release.kotlin_module                              
   5.5 KiB │       -2 B │  29.2 KiB │        0 B │ ∆ AndroidManifest.xml                                            
     800 B │       -2 B │   1.7 KiB │        0 B │ ∆ res/0H.xml                                                     
     813 B │       +2 B │   2.3 KiB │        0 B │ ∆ res/1w.xml                                                     
   1.2 KiB │       -2 B │   3.9 KiB │        0 B │ ∆ res/2d.xml                                                     
     542 B │       +2 B │   1.1 KiB │        0 B │ ∆ res/ZM.xml                                                     
     532 B │       -2 B │     984 B │        0 B │ ∆ res/aT.xml                                                     
     695 B │       +2 B │   1.4 KiB │        0 B │ ∆ res/vG.xml                                                     
     771 B │       +2 B │   1.6 KiB │        0 B │ ∆ res/xd.xml                                                     
     543 B │       -2 B │     952 B │        0 B │ ∆ res/zR.xml                                                     
     472 B │       +1 B │     712 B │        0 B │ ∆ res/-7.xml                                                     
     732 B │       -1 B │   1.4 KiB │        0 B │ ∆ res/0o.xml                                                     
     409 B │       -1 B │     592 B │        0 B │ ∆ r
...✂
MANIFEST
@@ -459,2 +459,13 @@
     <provider
+        android:authorities="com.stripe.android.paymentsheet.example.SentryInitProvider"
+        android:exported="false"
+        android:name="io.sentry.android.core.SentryInitProvider"
+        />
+    <provider
+        android:authorities="com.stripe.android.paymentsheet.example.SentryPerformanceProvider"
+        android:exported="false"
+        android:initOrder="200"
+        android:name="io.sentry.android.core.SentryPerformanceProvider"
+        />
+    <provider
         android:authorities="com.stripe.android.paymentsheet.example.androidx-startup"
@@ -476,13 +487,2 @@
     </provider>
-    <provider
-        android:authorities="com.stripe.android.paymentsheet.example.SentryInitProvider"
-        android:exported="false"
-        android:name="io.sentry.android.core.SentryInitProvider"
-        />
-    <provider
-        android:authorities="com.stripe.android.paymentsheet.example.SentryPerformanceProvider"
-        android:exported="false"
-        android:initOrder="200"
-        android:name="io.sentry.android.core.SentryPerformanceProvider"
-        />
     <uses-library
DEX
STRINGS:

   old   │ new   │ diff               
  ───────┼───────┼────────────────────
   47940 │ 48116 │ +176 (+7859 -7683) 
  
  + 	at 
  + 
  
  + 
            
  + 
              |Exception while applying pausable composition. Last 10 operations:
              |
  + 
  ]
  +  because it already has a parent or an owner. This tree: 
  +  can't be saved: 
  +  deactivated: 
  +  error: 
  +  is shutting down
  +  maximum
  +  should be in range [0, 
  +  should be less than or equal to 
  +  source
  +  target
  +  to 2, 2131952110
  +  to: 
  + ", leadingIcon=
  + ' and cannot be moved to 
  + ' in component 
  + ' to be moved to '
  + '. It may be missing, null, or not of the expected type. This can occur if the value was saved with a different type or if the saved state was modified unexpectedly.
  + 'wght' 
  + ) and end (
  + ) is more than end (
  + ) must be in 0..
  + ).
  Debug info: index=
  + , 0.0, 
  + , b=0.0, c=
  + , colorFilter=null)
  + , compositingStrategy=CompositingStrategy(value=0), blendMode=
  + , constraints=_)
  + , dataOffset=
  + , focusRequester=
  + , groupOffset=
  + , history=
  + , imeOptions=
  + , index=
  + , isLayoutDirectionAware=true)
  + , isPassword=false, offsetMapping=
  + , label="
  + , manager=
  + , overrideDescendants=false, touchBoundsExpansion=
  + , paragraphs=[
  + , readOnly=
  + , shouldApplyImmediately=
  + , structureCompat=
  + , textClassification=
  + , timeMillis=
  + ,mode=Mode(value=0))
  + <TextLayoutResult>
  + <get-entries>(...)
  + A pausable composition is in progress
  + A previous pausable composition for this composition was cancelled. This composition must be disposed.
  + AccessibilityClassName
  + AndroidContentDataType(androidAutofillType=1)
  + AndroidOwner:outOfFrameExecutor
  + Applied
  + Applier operation size mismatch
  + ApplyPending
  + Attempting to drawContent for a null node. This usually means that a call to ContentDrawScope#drawContent() has been captured inside a lambda, and is being invoked outside of the draw pass. Capturing the scope this way is unsupported - if you are trying to record drawContent with graphicsLayer.record(), make sure you are using the GraphicsLayer#record function within DrawScope, instead of the member function on GraphicsLayer.
  + Auto filling Date fields is not yet supported.
  + Auto filling dropdown lists is not yet supported.
  + Auto filling toggle fields are not yet supported.
  + Autofill
  + BT2020_HLG
  + BT2020_PQ
  + BackgroundTextMeasurement
  + Bottom must be non-negative
  + CHARACTER_PALETTE
  + COPY
  + CUT
  + Carousel
  + Clockwise
  + ComposeAutofillManager
  + ComposeStackTraceFrame(sourceInfo=
  + Composition stack when thrown:
  
  + CompositionErrorContext
  + CompositionLocal LocalSavedStateRegistryOwner not present
  + ContentCapture:changeChecker
  + ContentCapture:sendAppearEvents
  + ContentCaptureEvent(id=
  + ContentDataType
  + ContentQueryWrapper.query
  + ContentType
  + Copy
  + CoreTextFieldSemanticsModifier(transformedText=
  + Could not resolve state for movable content
  + CounterClockwise
  + CreationExtras(extras=
  + Cut
  + DEFERRED
  + DELETE_FROM_LINE_START
  + DELETE_NEXT_CHAR
  + DELETE_NEXT_WORD
  + DELETE_PREV_CHAR
  + DELETE_PREV_WORD
  + DELETE_TO_LINE_END
  + DESELECT
  + Deactivate is not supported while pausable composition is in progress
  + Dispatching
  + DpTouchBoundsExpansion(start=
  + DragAndDropTarget self reference must be null at the start of a drag and drop session
  + Drawing order is not available, was AccessibilityNodeInfo requested for a child node before its parent?
  + E2.n
  + Error: currentApproachIndex cannot be greater than the size of theapproachComposedSlotIds list.
  + FLFFL
  + FLZLF
  + Fallbacks with blocking fetches are not supported for performance reasons
  + FocusOwnerImpl:dispatchKeyEvent
  + FocusRelatedWarning: 
     FocusRequester is not initialized. Here are some possible fixes:
  
     1. Remember the FocusRequester: val focusRequester = remember { FocusRequester() }
     2. Did you forget to add a Modifier.focusRequester() ?
     3. Are you attempting to request focus during composition? Focus requests should be made in
     response to some event. Eg Modifier.clickable { focusRequester.requestFocus() }
  
  + FocusRelatedWarning: Dispatching indirect touch event while the focus system is invalidated.
  + FocusRelatedWarning: Dispatching rotary event while the focus system is invalidated.
  + FocusTransactions:r
...✂
ARSC
ENTRIES:

   old  │ new  │ diff         
  ──────┼──────┼──────────────
   6245 │ 6269 │ +24 (+24 -0) 
  + attr/fontProviderFallbackQuery
  + dimen/m3_alert_dialog_corner_size
  + dimen/m3_fab_corner_size
  + id/compose_prefetch_scheduler
  + id/view_tree_disjoint_parent
  + string/autofill
  + string/mc2_snackbar_pane_title
  + style/FloatingDialogWindowTheme
  + style/ShapeAppearance.M3.Comp.Badge.Large.Shape
  + style/ShapeAppearance.M3.Comp.BottomAppBar.Container.Shape
  + style/ShapeAppearance.M3.Comp.NavigationDrawer.ActiveIndicator.Shape
  + style/ShapeAppearance.M3.Comp.SearchBar.Avatar.Shape
  + style/ShapeAppearance.M3.Comp.Switch.Handle.Shape
  + style/ShapeAppearance.M3.Comp.Switch.StateLayer.Shape
  + style/ShapeAppearance.M3.Comp.Switch.Track.Shape
  + style/ShapeAppearance.Material3.NavigationBarView.ActiveIndicator
  + style/ShapeAppearanceOverlay.Material3.Button
  + style/ShapeAppearanceOverlay.Material3.Chip
  + style/ShapeAppearanceOverlay.Material3.Corner.Bottom
  + style/ShapeAppearanceOverlay.Material3.Corner.Left
  + style/ShapeAppearanceOverlay.Material3.Corner.Right
  + style/ShapeAppearanceOverlay.Material3.FloatingActionButton
  + style/ShapeAppearanceOverlay.Material3.NavigationView.Item
  + style/ShapeAppearanceOverlay.MaterialAlertDialog.Material3

@samer-stripe samer-stripe force-pushed the samer/support-jetpack-compose-1.9.4 branch 7 times, most recently from 575a658 to ca5be4d Compare November 5, 2025 17:58
private fun ComposeTestRule.otpInputBox() = onNodeWithTag(OTP_ELEMENT_TAG)
.onChildAt(0)
.onChildAt(0)
.onChildAt(0)
Copy link
Collaborator Author

@samer-stripe samer-stripe Nov 5, 2025

Choose a reason for hiding this comment

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

Change in the internal Compose basic text field. Component now nested in 3 layers.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

No longer required with new autofill changes. Setting the ContentType is now the recommended approach.

addSpacer(id = LINK_DIVIDER_SPACER_ID, width = 0.5.em)
}.build(),
modifier = Modifier.semantics { this.invisibleToUser() },
modifier = Modifier.semantics { this.hideFromAccessibility() },
Copy link
Collaborator Author

@samer-stripe samer-stripe Nov 5, 2025

Choose a reason for hiding this comment

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

Replacement for invisibleToUser

)
)
)
}
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Mitigates a Compose behavior change in which annotation links automatically add an underline text decoration now.

@samer-stripe samer-stripe force-pushed the samer/support-jetpack-compose-1.9.4 branch 5 times, most recently from fca9350 to 0e41600 Compare November 17, 2025 18:17
@samer-stripe samer-stripe force-pushed the samer/support-jetpack-compose-1.9.4 branch from 0e41600 to 79249ab Compare November 20, 2025 16:21
@emerge-tools
Copy link

emerge-tools bot commented Nov 20, 2025

3 builds increased size

Name Version Download Change Install Change Approval
Stripe Identity Example
com.stripe.android.identity.example.theme1
22.2.0-theme1 (20) 4.3 MB ⬆️ 78.0 kB (1.83%) 10.1 MB ⬆️ 163.5 kB (1.65%) N/A
Financial Connections Example
com.stripe.android.financialconnections.example
22.2.0 (220200) 4.7 MB ⬆️ 74.1 kB (1.6%) 10.5 MB ⬆️ 161.1 kB (1.56%) N/A
PaymentSheet Example
com.stripe.android.paymentsheet.example
22.2.0 (11) 6.1 MB ⬆️ 106.4 kB (1.77%) 14.1 MB ⬆️ 226.1 kB (1.63%) N/A

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

⚖️ Compare build
⏱️ Analyze build performance

Total install size change: ⬆️ 163.5 kB (1.65%)
Total download size change: ⬆️ 78.0 kB (1.83%)

Largest size changes

Item Install Size Change Download Size Change
🗑 android.support.v4.media.session.MediaSessionCompat ⬇️ -55.2 kB ⬇️ -26.5 kB
📝 com.stripe.android.identity.ui.NameSectionKt ⬆️ 29.5 kB ⬆️ 14.2 kB
📝 com.stripe.android.identity.ui.LoadingScreenKt ⬆️ 28.8 kB ⬆️ 13.9 kB
🗑 androidx.compose.foundation.lazy.layout.LazySaveableStateHolderKt ⬇️ -26.6 kB ⬇️ -12.8 kB
📝 com.stripe.android.identity.ui.LoadingButtonKt ⬆️ 25.8 kB ⬆️ 12.5 kB
View Treemap

Image of diff

Financial Connections Example 22.2.0 (220200)
com.stripe.android.financialconnections.example

⚖️ Compare build
⏱️ Analyze build performance

Total install size change: ⬆️ 161.1 kB (1.56%)
Total download size change: ⬆️ 74.1 kB (1.6%)

Largest size changes

Item Install Size Change Download Size Change
🗑 com.stripe.android.ui.core.elements.MandateTextUIKt ⬇️ -73.7 kB ⬇️ -34.5 kB
🗑 com.stripe.android.ui.core.elements.SaveForFutureUseElementUIKt ⬇️ -67.5 kB ⬇️ -31.6 kB
🗑 com.stripe.android.ui.core.elements.H4TextKt ⬇️ -63.2 kB ⬇️ -29.6 kB
androidx.fragment.app.FragmentContainer ⬇️ -61.9 kB ⬇️ -29.0 kB
🗑 com.stripe.android.ui.core.elements.SimpleDialogElementUIKt ⬇️ -55.0 kB ⬇️ -25.8 kB
View Treemap

Image of diff

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

⚖️ Compare build
⏱️ Analyze build performance

Total install size change: ⬆️ 226.1 kB (1.63%)
Total download size change: ⬆️ 106.4 kB (1.77%)

Largest size changes

Item Install Size Change Download Size Change
📝 com.nimbusds.jose.util.Base64Codec ⬆️ 93.0 kB ⬆️ 42.1 kB
📝 com.stripe.android.financialconnections.features.common.AccountIt... ⬆️ 69.8 kB ⬆️ 31.6 kB
📝 com.nimbusds.jose.util.IntegerUtils ⬆️ 69.6 kB ⬆️ 31.5 kB
🗑 com.stripe.android.uicore.elements.bottomsheet.StripeBottomSheetS... ⬇️ -62.3 kB ⬇️ -28.2 kB
kotlin.comparisons.ComparisonsKt ⬆️ 64.6 kB ⬆️ 27.8 kB
View Treemap

Image of diff


🛸 Powered by Emerge Tools

Comment trigger: Size diff threshold of 100.00kB exceeded

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

Labels

accept-risky-change accept-risky-change v22

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants