|
319 | 319 | com.google.android.material.appbar.AppBarLayout |
320 | 320 | </attr> |
321 | 321 |
|
322 | | - <!-- Remove deprecated BaseOnChangeListener and BaseOnSliderTouchListener interfaces entirely. |
323 | | - These base interfaces use erased generics that cause ACW type erasure clashes when |
324 | | - implemented alongside their typed sub-interfaces (Slider.OnChangeListener, etc.). |
325 | | - The binding generator creates Implementor Java classes for any interface referenced in |
326 | | - add/removeListener pairs, but these implementors cannot satisfy the Java abstract method |
327 | | - contracts because of the erasure. Removing the base interfaces eliminates the |
328 | | - implementor generation (no interface type → no implementor). --> |
329 | | - <remove-node |
330 | | - path="/api/package[@name='com.google.android.material.slider']/interface[@name='BaseOnChangeListener']" /> |
331 | | - <remove-node |
332 | | - path="/api/package[@name='com.google.android.material.slider']/interface[@name='BaseOnSliderTouchListener']" /> |
| 322 | + <!-- Fix BaseSlider addOnChangeListener and removeOnChangeListener methods --> |
| 323 | + <attr |
| 324 | + path="/api/package[@name='com.google.android.material.slider']/class[@name='BaseSlider']/method[@name='addOnChangeListener' and count(parameter)=1 and parameter[1][@type='L']]/parameter[1]" |
| 325 | + name="type" |
| 326 | + > |
| 327 | + com.google.android.material.slider.BaseOnChangeListener |
| 328 | + </attr> |
| 329 | + <attr |
| 330 | + path="/api/package[@name='com.google.android.material.slider']/class[@name='BaseSlider']/method[@name='removeOnChangeListener' and count(parameter)=1 and parameter[1][@type='L']]/parameter[1]" |
| 331 | + name="type" |
| 332 | + > |
| 333 | + com.google.android.material.slider.BaseOnChangeListener |
| 334 | + </attr> |
| 335 | + |
| 336 | + <!-- Fix BaseSlider addOnSliderTouchListener and removeOnSliderTouchListener methods --> |
| 337 | + <attr |
| 338 | + path="/api/package[@name='com.google.android.material.slider']/class[@name='BaseSlider']/method[@name='addOnSliderTouchListener' and count(parameter)=1 and parameter[1][@type='T']]/parameter[1]" |
| 339 | + name="type" |
| 340 | + > |
| 341 | + com.google.android.material.slider.BaseOnSliderTouchListener |
| 342 | + </attr> |
| 343 | + <attr |
| 344 | + path="/api/package[@name='com.google.android.material.slider']/class[@name='BaseSlider']/method[@name='removeOnSliderTouchListener' and count(parameter)=1 and parameter[1][@type='T']]/parameter[1]" |
| 345 | + name="type" |
| 346 | + > |
| 347 | + com.google.android.material.slider.BaseOnSliderTouchListener |
| 348 | + </attr> |
333 | 349 |
|
334 | | - <!-- Remove the 'implements BaseOnChangeListener/BaseOnSliderTouchListener' from the typed |
335 | | - sub-interfaces so they don't reference the now-removed base types. |
336 | | - This makes them standalone interfaces with just their typed methods. --> |
| 350 | + <!-- Break the implements chain from typed sub-interfaces to the @RestrictTo base interfaces. |
| 351 | + This prevents ACW erasure clash when users implement Slider.IOnChangeListener or |
| 352 | + Slider.IOnSliderTouchListener — without this, the ACW generates both onValueChange(Object) |
| 353 | + and onValueChange(Slider), which have the same Java erasure. (#1482) |
| 354 | + The base interfaces and their methods remain intact, so the Implementor ACWs compile |
| 355 | + and their Java references keep the types alive for R8. --> |
337 | 356 | <remove-node |
338 | 357 | path="/api/package[@name='com.google.android.material.slider']/interface[@name='Slider.OnChangeListener']/implements[@name='com.google.android.material.slider.BaseOnChangeListener']" /> |
339 | | - <remove-node |
340 | | - path="/api/package[@name='com.google.android.material.slider']/interface[@name='Slider.OnSliderTouchListener']/implements[@name='com.google.android.material.slider.BaseOnSliderTouchListener']" /> |
341 | 358 | <remove-node |
342 | 359 | path="/api/package[@name='com.google.android.material.slider']/interface[@name='RangeSlider.OnChangeListener']/implements[@name='com.google.android.material.slider.BaseOnChangeListener']" /> |
| 360 | + <remove-node |
| 361 | + path="/api/package[@name='com.google.android.material.slider']/interface[@name='Slider.OnSliderTouchListener']/implements[@name='com.google.android.material.slider.BaseOnSliderTouchListener']" /> |
343 | 362 | <remove-node |
344 | 363 | path="/api/package[@name='com.google.android.material.slider']/interface[@name='RangeSlider.OnSliderTouchListener']/implements[@name='com.google.android.material.slider.BaseOnSliderTouchListener']" /> |
345 | 364 |
|
346 | | - <!-- Remove the add/remove listener methods from BaseSlider to prevent implementor generation. |
347 | | - These methods reference the removed base interfaces as parameter types. We re-implement |
348 | | - them manually in Additions with typed overloads (Slider.IOnChangeListener, etc.) that |
349 | | - use the correct JNI signatures. This is a standard binding pattern: remove problematic |
350 | | - auto-generated method, replace with hand-written Additions code. --> |
| 365 | + <!-- Remove the auto-generated add/remove listener methods from BaseSlider (which accept |
| 366 | + IBaseOnChangeListener/IBaseOnSliderTouchListener) and re-add them via hand-written |
| 367 | + Additions with typed params (Slider.IOnChangeListener etc.) for the Android-recommended API. |
| 368 | + Keeping the base interfaces intact ensures their Implementor ACWs generate Java code that |
| 369 | + references BaseOnChangeListener/BaseOnSliderTouchListener, preventing R8 from stripping |
| 370 | + the types at link time. --> |
351 | 371 | <remove-node |
352 | 372 | path="/api/package[@name='com.google.android.material.slider']/class[@name='BaseSlider']/method[@name='addOnChangeListener']" /> |
353 | 373 | <remove-node |
|
0 commit comments