Skip to content

Commit 3cd591f

Browse files
ymarianikim24
authored andcommitted
Change OnTabSelectedListener back to extend BaseOnTabSelectedListener
This brings back binary compatibility with 1.0.0 and 1.1.0-RC. The reason this broke was because members were removed from the OnTabSelectedListener superclass set. Which is not supported, regardless of whether tab OnTabSelectedListener still kept the same members. https://docs.oracle.com/javase/specs/jls/se7/html/jls-13.html#jls-13.4.4 Resolves #903? PiperOrigin-RevId: 290152502
1 parent dc4efe7 commit 3cd591f

File tree

1 file changed

+19
-80
lines changed

1 file changed

+19
-80
lines changed

lib/java/com/google/android/material/tabs/TabLayout.java

Lines changed: 19 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,6 @@
102102
import java.lang.annotation.RetentionPolicy;
103103
import java.lang.ref.WeakReference;
104104
import java.util.ArrayList;
105-
import java.util.HashMap;
106105
import java.util.Iterator;
107106

108107
/**
@@ -358,28 +357,7 @@ public class TabLayout extends HorizontalScrollView {
358357
public @interface TabIndicatorGravity {}
359358

360359
/** Callback interface invoked when a tab's selection state changes. */
361-
public interface OnTabSelectedListener {
362-
/**
363-
* Called when a tab enters the selected state.
364-
*
365-
* @param tab The tab that was selected
366-
*/
367-
public void onTabSelected(Tab tab);
368-
369-
/**
370-
* Called when a tab exits the selected state.
371-
*
372-
* @param tab The tab that was unselected
373-
*/
374-
public void onTabUnselected(Tab tab);
375-
376-
/**
377-
* Called when a tab that is already selected is chosen again by the user. Some applications may
378-
* use this action to return to the top level of a category.
379-
*
380-
* @param tab The tab that was reselected.
381-
*/
382-
public void onTabReselected(Tab tab);
360+
public interface OnTabSelectedListener extends BaseOnTabSelectedListener<Tab> {
383361
}
384362

385363
/** Callback interface invoked when a tab's selection state changes. */
@@ -447,12 +425,10 @@ public interface BaseOnTabSelectedListener<T extends Tab> {
447425
boolean tabIndicatorFullWidth;
448426
boolean unboundedRipple;
449427

450-
@Nullable private OnTabSelectedListener selectedListener;
428+
@Nullable private BaseOnTabSelectedListener selectedListener;
451429

452-
private final ArrayList<OnTabSelectedListener> selectedListeners = new ArrayList<>();
453-
@Nullable private OnTabSelectedListener currentVpSelectedListener;
454-
private final HashMap<BaseOnTabSelectedListener<? extends Tab>, OnTabSelectedListener>
455-
selectedListenerMap = new HashMap<>();
430+
private final ArrayList<BaseOnTabSelectedListener> selectedListeners = new ArrayList<>();
431+
@Nullable private BaseOnTabSelectedListener currentVpSelectedListener;
456432

457433
private ValueAnimator scrollAnimator;
458434

@@ -744,6 +720,15 @@ private void addTabFromItemView(@NonNull TabItem item) {
744720
*/
745721
@Deprecated
746722
public void setOnTabSelectedListener(@Nullable OnTabSelectedListener listener) {
723+
setOnTabSelectedListener((BaseOnTabSelectedListener) listener);
724+
}
725+
726+
/**
727+
* @deprecated Use {@link #addOnTabSelectedListener(OnTabSelectedListener)} and {@link
728+
* #removeOnTabSelectedListener(OnTabSelectedListener)}.
729+
*/
730+
@Deprecated
731+
public void setOnTabSelectedListener(@Nullable BaseOnTabSelectedListener listener) {
747732
// The logic in this method emulates what we had before support for multiple
748733
// registered listeners.
749734
if (selectedListener != null) {
@@ -757,16 +742,6 @@ public void setOnTabSelectedListener(@Nullable OnTabSelectedListener listener) {
757742
}
758743
}
759744

760-
/**
761-
* @deprecated Use {@link #addOnTabSelectedListener(OnTabSelectedListener)} and {@link
762-
* #removeOnTabSelectedListener(OnTabSelectedListener)}.
763-
*/
764-
@Deprecated
765-
public void setOnTabSelectedListener(@Nullable BaseOnTabSelectedListener listener) {
766-
clearOnTabSelectedListeners();
767-
addOnTabSelectedListener(wrapOnTabSelectedListener(listener));
768-
}
769-
770745
/**
771746
* Add a {@link TabLayout.OnTabSelectedListener} that will be invoked when tab selection changes.
772747
*
@@ -776,9 +751,7 @@ public void setOnTabSelectedListener(@Nullable BaseOnTabSelectedListener listene
776751
* @param listener listener to add
777752
*/
778753
public void addOnTabSelectedListener(@NonNull OnTabSelectedListener listener) {
779-
if (!selectedListeners.contains(listener)) {
780-
selectedListeners.add(listener);
781-
}
754+
addOnTabSelectedListener((BaseOnTabSelectedListener) listener);
782755
}
783756

784757
/**
@@ -793,7 +766,9 @@ public void addOnTabSelectedListener(@NonNull OnTabSelectedListener listener) {
793766
*/
794767
@Deprecated
795768
public void addOnTabSelectedListener(@Nullable BaseOnTabSelectedListener listener) {
796-
addOnTabSelectedListener(wrapOnTabSelectedListener(listener));
769+
if (!selectedListeners.contains(listener)) {
770+
selectedListeners.add(listener);
771+
}
797772
}
798773

799774
/**
@@ -803,7 +778,7 @@ public void addOnTabSelectedListener(@Nullable BaseOnTabSelectedListener listene
803778
* @param listener listener to remove
804779
*/
805780
public void removeOnTabSelectedListener(@NonNull OnTabSelectedListener listener) {
806-
selectedListeners.remove(listener);
781+
removeOnTabSelectedListener((BaseOnTabSelectedListener) listener);
807782
}
808783

809784
/**
@@ -815,48 +790,12 @@ public void removeOnTabSelectedListener(@NonNull OnTabSelectedListener listener)
815790
*/
816791
@Deprecated
817792
public void removeOnTabSelectedListener(@Nullable BaseOnTabSelectedListener listener) {
818-
removeOnTabSelectedListener(wrapOnTabSelectedListener(listener));
819-
}
820-
821-
/** @hide */
822-
@Nullable
823-
@RestrictTo(LIBRARY_GROUP)
824-
protected OnTabSelectedListener wrapOnTabSelectedListener(
825-
@Nullable final BaseOnTabSelectedListener baseListener) {
826-
if (baseListener == null) {
827-
return null;
828-
}
829-
830-
if (selectedListenerMap.containsKey(baseListener)) {
831-
return selectedListenerMap.get(baseListener);
832-
}
833-
834-
OnTabSelectedListener listener =
835-
new OnTabSelectedListener() {
836-
@Override
837-
public void onTabSelected(Tab tab) {
838-
baseListener.onTabSelected(tab);
839-
}
840-
841-
@Override
842-
public void onTabUnselected(Tab tab) {
843-
baseListener.onTabUnselected(tab);
844-
}
845-
846-
@Override
847-
public void onTabReselected(Tab tab) {
848-
baseListener.onTabReselected(tab);
849-
}
850-
};
851-
852-
selectedListenerMap.put(baseListener, listener);
853-
return listener;
793+
selectedListeners.remove(listener);
854794
}
855795

856796
/** Remove all previously added {@link TabLayout.OnTabSelectedListener}s. */
857797
public void clearOnTabSelectedListeners() {
858798
selectedListeners.clear();
859-
selectedListenerMap.clear();
860799
}
861800

862801
/**

0 commit comments

Comments
 (0)