Skip to content

Commit 09d87fe

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 (cherry picked from commit 3cd591f)
1 parent 6c41388 commit 09d87fe

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
@@ -99,7 +99,6 @@
9999
import java.lang.annotation.RetentionPolicy;
100100
import java.lang.ref.WeakReference;
101101
import java.util.ArrayList;
102-
import java.util.HashMap;
103102
import java.util.Iterator;
104103

105104
/**
@@ -343,28 +342,7 @@ public class TabLayout extends HorizontalScrollView {
343342
public @interface TabIndicatorGravity {}
344343

345344
/** Callback interface invoked when a tab's selection state changes. */
346-
public interface OnTabSelectedListener {
347-
/**
348-
* Called when a tab enters the selected state.
349-
*
350-
* @param tab The tab that was selected
351-
*/
352-
public void onTabSelected(Tab tab);
353-
354-
/**
355-
* Called when a tab exits the selected state.
356-
*
357-
* @param tab The tab that was unselected
358-
*/
359-
public void onTabUnselected(Tab tab);
360-
361-
/**
362-
* Called when a tab that is already selected is chosen again by the user. Some applications may
363-
* use this action to return to the top level of a category.
364-
*
365-
* @param tab The tab that was reselected.
366-
*/
367-
public void onTabReselected(Tab tab);
345+
public interface OnTabSelectedListener extends BaseOnTabSelectedListener<Tab> {
368346
}
369347

370348
/** Callback interface invoked when a tab's selection state changes. */
@@ -432,12 +410,10 @@ public interface BaseOnTabSelectedListener<T extends Tab> {
432410
boolean tabIndicatorFullWidth;
433411
boolean unboundedRipple;
434412

435-
@Nullable private OnTabSelectedListener selectedListener;
413+
@Nullable private BaseOnTabSelectedListener selectedListener;
436414

437-
private final ArrayList<OnTabSelectedListener> selectedListeners = new ArrayList<>();
438-
@Nullable private OnTabSelectedListener currentVpSelectedListener;
439-
private final HashMap<BaseOnTabSelectedListener<? extends Tab>, OnTabSelectedListener>
440-
selectedListenerMap = new HashMap<>();
415+
private final ArrayList<BaseOnTabSelectedListener> selectedListeners = new ArrayList<>();
416+
@Nullable private BaseOnTabSelectedListener currentVpSelectedListener;
441417

442418
private ValueAnimator scrollAnimator;
443419

@@ -729,6 +705,15 @@ private void addTabFromItemView(@NonNull TabItem item) {
729705
*/
730706
@Deprecated
731707
public void setOnTabSelectedListener(@Nullable OnTabSelectedListener listener) {
708+
setOnTabSelectedListener((BaseOnTabSelectedListener) listener);
709+
}
710+
711+
/**
712+
* @deprecated Use {@link #addOnTabSelectedListener(OnTabSelectedListener)} and {@link
713+
* #removeOnTabSelectedListener(OnTabSelectedListener)}.
714+
*/
715+
@Deprecated
716+
public void setOnTabSelectedListener(@Nullable BaseOnTabSelectedListener listener) {
732717
// The logic in this method emulates what we had before support for multiple
733718
// registered listeners.
734719
if (selectedListener != null) {
@@ -742,16 +727,6 @@ public void setOnTabSelectedListener(@Nullable OnTabSelectedListener listener) {
742727
}
743728
}
744729

745-
/**
746-
* @deprecated Use {@link #addOnTabSelectedListener(OnTabSelectedListener)} and {@link
747-
* #removeOnTabSelectedListener(OnTabSelectedListener)}.
748-
*/
749-
@Deprecated
750-
public void setOnTabSelectedListener(@Nullable BaseOnTabSelectedListener listener) {
751-
clearOnTabSelectedListeners();
752-
addOnTabSelectedListener(wrapOnTabSelectedListener(listener));
753-
}
754-
755730
/**
756731
* Add a {@link TabLayout.OnTabSelectedListener} that will be invoked when tab selection changes.
757732
*
@@ -761,9 +736,7 @@ public void setOnTabSelectedListener(@Nullable BaseOnTabSelectedListener listene
761736
* @param listener listener to add
762737
*/
763738
public void addOnTabSelectedListener(@NonNull OnTabSelectedListener listener) {
764-
if (!selectedListeners.contains(listener)) {
765-
selectedListeners.add(listener);
766-
}
739+
addOnTabSelectedListener((BaseOnTabSelectedListener) listener);
767740
}
768741

769742
/**
@@ -778,7 +751,9 @@ public void addOnTabSelectedListener(@NonNull OnTabSelectedListener listener) {
778751
*/
779752
@Deprecated
780753
public void addOnTabSelectedListener(@Nullable BaseOnTabSelectedListener listener) {
781-
addOnTabSelectedListener(wrapOnTabSelectedListener(listener));
754+
if (!selectedListeners.contains(listener)) {
755+
selectedListeners.add(listener);
756+
}
782757
}
783758

784759
/**
@@ -788,7 +763,7 @@ public void addOnTabSelectedListener(@Nullable BaseOnTabSelectedListener listene
788763
* @param listener listener to remove
789764
*/
790765
public void removeOnTabSelectedListener(@NonNull OnTabSelectedListener listener) {
791-
selectedListeners.remove(listener);
766+
removeOnTabSelectedListener((BaseOnTabSelectedListener) listener);
792767
}
793768

794769
/**
@@ -800,48 +775,12 @@ public void removeOnTabSelectedListener(@NonNull OnTabSelectedListener listener)
800775
*/
801776
@Deprecated
802777
public void removeOnTabSelectedListener(@Nullable BaseOnTabSelectedListener listener) {
803-
removeOnTabSelectedListener(wrapOnTabSelectedListener(listener));
804-
}
805-
806-
/** @hide */
807-
@Nullable
808-
@RestrictTo(LIBRARY_GROUP)
809-
protected OnTabSelectedListener wrapOnTabSelectedListener(
810-
@Nullable final BaseOnTabSelectedListener baseListener) {
811-
if (baseListener == null) {
812-
return null;
813-
}
814-
815-
if (selectedListenerMap.containsKey(baseListener)) {
816-
return selectedListenerMap.get(baseListener);
817-
}
818-
819-
OnTabSelectedListener listener =
820-
new OnTabSelectedListener() {
821-
@Override
822-
public void onTabSelected(Tab tab) {
823-
baseListener.onTabSelected(tab);
824-
}
825-
826-
@Override
827-
public void onTabUnselected(Tab tab) {
828-
baseListener.onTabUnselected(tab);
829-
}
830-
831-
@Override
832-
public void onTabReselected(Tab tab) {
833-
baseListener.onTabReselected(tab);
834-
}
835-
};
836-
837-
selectedListenerMap.put(baseListener, listener);
838-
return listener;
778+
selectedListeners.remove(listener);
839779
}
840780

841781
/** Remove all previously added {@link TabLayout.OnTabSelectedListener}s. */
842782
public void clearOnTabSelectedListeners() {
843783
selectedListeners.clear();
844-
selectedListenerMap.clear();
845784
}
846785

847786
/**

0 commit comments

Comments
 (0)