3131import android .widget .TextView ;
3232import android .widget .Toast ;
3333
34+ import androidx .annotation .NonNull ;
3435import androidx .annotation .Nullable ;
3536import androidx .core .content .ContextCompat ;
3637import androidx .fragment .app .Fragment ;
37- import androidx .fragment .app .FragmentManager ;
38- import androidx .fragment .app .FragmentPagerAdapter ;
3938import androidx .recyclerview .widget .LinearLayoutManager ;
4039import androidx .recyclerview .widget .RecyclerView ;
41- import androidx .viewpager .widget .ViewPager ;
40+ import androidx .viewpager2 .adapter .FragmentStateAdapter ;
41+ import androidx .viewpager2 .widget .ViewPager2 ;
4242
4343import com .bumptech .glide .Glide ;
4444import com .bumptech .glide .request .target .Target ;
4545import com .google .android .material .bottomsheet .BottomSheetBehavior ;
4646import com .google .android .material .bottomsheet .BottomSheetDialog ;
4747import com .google .android .material .tabs .TabLayout ;
48+ import com .google .android .material .tabs .TabLayoutMediator ;
4849import com .perflyst .twire .R ;
4950import com .perflyst .twire .activities .stream .LiveStreamActivity ;
5051import com .perflyst .twire .adapters .ChatAdapter ;
@@ -79,6 +80,11 @@ interface EmoteKeyboardDelegate {
7980}
8081
8182public class ChatFragment extends Fragment implements EmoteKeyboardDelegate , ChatAdapter .ChatAdapterCallback {
83+ private static final int POSITION_RECENT = 0 ;
84+ private static final int POSITION_TWITCH = 1 ;
85+ private static final int POSITION_SUBSCRIBE = 2 ;
86+ private static final int POSITION_CUSTOM = 3 ;
87+ private static final int POSITION_EMOJI = 4 ;
8288 private static Integer [] supportedUnicodeEmotes = {
8389 0x1F600 , 0x1F601 , 0x1F602 , 0x1F603 , 0x1F604 , 0x1F605 , 0x1F606 , 0x1F607 , 0x1F608 , 0x1F609 , 0x1F60A , 0x1F60B , 0x1F60C , 0x1F60D , 0x1F60E , 0x1F60F ,
8490 0x1F610 , 0x1F611 , 0x1F612 , 0x1F613 , 0x1F614 , 0x1F615 , 0x1F616 , 0x1F617 , 0x1F618 , 0x1F619 , 0x1F61A , 0x1F61B , 0x1F61C , 0x1F61D , 0x1F61E , 0x1F61F ,
@@ -118,7 +124,7 @@ public class ChatFragment extends Fragment implements EmoteKeyboardDelegate, Cha
118124 private ViewGroup emoteKeyboardContainer ;
119125 private boolean isEmoteKeyboardOpen = false ;
120126 private TabLayout mEmoteTabs ;
121- private ViewPager mEmoteViewPager ;
127+ private ViewPager2 mEmoteViewPager ;
122128 private Integer selectedTabColorRes , unselectedTabColorRes ;
123129 private boolean hasSoftKeyboardBeenShown = false ,
124130 hideKeyboardWhenShown = false ,
@@ -473,7 +479,7 @@ private void subscriberEmotesLoaded(List<Emote> subscriberEmotesLoaded, EmotesPa
473479
474480 TabLayout .Tab newTab = mEmoteTabs .newTab ();
475481 newTab .setIcon (icon );
476- mEmoteTabs .addTab (newTab , adapter . SUBSCRIBE_POSITION , false );
482+ mEmoteTabs .addTab (newTab , POSITION_SUBSCRIBE , false );
477483 adapter .showSubscriberEmote = true ;
478484 adapter .notifyDataSetChanged ();
479485
@@ -598,28 +604,10 @@ private void setupEmoteViews() {
598604 }
599605
600606 private void setupEmoteTabs () {
601- final EmotesPagerAdapter pagerAdapter = new EmotesPagerAdapter (getActivity ().getSupportFragmentManager ());
602-
603- for (int i = 0 ; i < mEmoteTabs .getTabCount (); i ++) {
604- TabLayout .Tab tab = mEmoteTabs .getTabAt (i );
605- Drawable icon = tab != null ? tab .getIcon () : null ;
606-
607- if (icon != null ) {
608- if (i == 0 ) {
609- icon .setColorFilter (new PorterDuffColorFilter (selectedTabColorRes , PorterDuff .Mode .SRC_IN ));
610- } else {
611- icon .setColorFilter (new PorterDuffColorFilter (unselectedTabColorRes , PorterDuff .Mode .SRC_IN ));
612- }
613- }
614- }
607+ final EmotesPagerAdapter pagerAdapter = new EmotesPagerAdapter (this );
615608
616609 mEmoteViewPager .setAdapter (pagerAdapter );
617- mEmoteViewPager .addOnPageChangeListener (new ViewPager .OnPageChangeListener () {
618- @ Override
619- public void onPageScrolled (int position , float positionOffset , int positionOffsetPixels ) {
620-
621- }
622-
610+ mEmoteViewPager .registerOnPageChangeCallback (new ViewPager2 .OnPageChangeCallback () {
623611 @ Override
624612 public void onPageSelected (int position ) {
625613 if (mEmoteTabs .getTabCount () - 1 >= position ) {
@@ -628,33 +616,57 @@ public void onPageSelected(int position) {
628616 tab .select ();
629617 }
630618 }
619+ });
631620
632- @ Override
633- public void onPageScrollStateChanged (int state ) {
621+ new TabLayoutMediator (mEmoteTabs , mEmoteViewPager , (tab , position ) -> {
622+ for (int i = 0 ; i < mEmoteTabs .getTabCount (); i ++) {
623+ TabLayout .Tab tab1 = mEmoteTabs .getTabAt (i );
624+ Drawable icon = tab1 != null ? tab1 .getIcon () : null ;
634625
626+ if (icon != null ) {
627+ if (i == 0 ) {
628+ icon .setColorFilter (new PorterDuffColorFilter (selectedTabColorRes , PorterDuff .Mode .SRC_IN ));
629+ } else {
630+ icon .setColorFilter (new PorterDuffColorFilter (unselectedTabColorRes , PorterDuff .Mode .SRC_IN ));
631+ }
632+ }
635633 }
636- });
634+ switch (position ) {
635+ default : // Deliberate fall-through to recent tab
636+ case POSITION_RECENT :
637+ tab .setIcon (R .drawable .ic_clock );
638+ break ;
639+ case POSITION_TWITCH :
640+ tab .setIcon (R .drawable .ic_twitch );
641+ break ;
642+ case POSITION_SUBSCRIBE :
643+ tab .setIcon (R .drawable .ic_money );
644+ break ;
645+ case POSITION_CUSTOM :
646+ tab .setIcon (R .drawable .ic_betterttv_500px );
647+ break ;
648+ case POSITION_EMOJI :
649+ tab .setIcon (R .drawable .ic_mood );
650+ break ;
651+ }
652+ }).attach ();
637653
638654 mEmoteTabs .addOnTabSelectedListener (
639- new TabLayout .ViewPagerOnTabSelectedListener ( mEmoteViewPager ) {
655+ new TabLayout .OnTabSelectedListener ( ) {
640656 @ Override
641657 public void onTabSelected (TabLayout .Tab tab ) {
642- super .onTabSelected (tab );
643-
644658 if (tab .getIcon () != null )
645659 tab .getIcon ().setColorFilter (new PorterDuffColorFilter (selectedTabColorRes , PorterDuff .Mode .SRC_IN ));
646660 }
647661
648662 @ Override
649663 public void onTabUnselected (TabLayout .Tab tab ) {
650- super .onTabUnselected (tab );
651664 if (tab .getIcon () != null )
652665 tab .getIcon ().setColorFilter (new PorterDuffColorFilter (unselectedTabColorRes , PorterDuff .Mode .SRC_IN ));
653666 }
654667
655668 @ Override
656669 public void onTabReselected (TabLayout .Tab tab ) {
657- super .onTabReselected (tab );
658670 }
659671 }
660672 );
@@ -940,10 +952,6 @@ static EmoteGridFragment newInstance(EmoteFragmentType fragmentType, EmoteKeyboa
940952 return emoteGridFragment ;
941953 }
942954
943- static EmoteGridFragment newInstance () {
944- return new EmoteGridFragment ();
945- }
946-
947955 @ Override
948956 public void onCreate (@ Nullable Bundle savedInstanceState ) {
949957 super .onCreate (savedInstanceState );
@@ -1153,50 +1161,45 @@ class EmoteViewHolder extends RecyclerView.ViewHolder {
11531161 }
11541162 }
11551163
1156- private class EmotesPagerAdapter extends FragmentPagerAdapter {
1157- final int RECENT_POSITION = 0 ,
1158- TWITCH_POSITION = 1 ,
1159- SUBSCRIBE_POSITION = 2 ,
1160- CUSTOM_POSITION = 3 ,
1161- EMOJI_POSITION = 4 ;
1164+ private class EmotesPagerAdapter extends FragmentStateAdapter {
11621165 boolean showSubscriberEmote = false ;
11631166
1164- EmotesPagerAdapter (FragmentManager fm ) {
1165- super (fm , BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT );
1167+ EmotesPagerAdapter (Fragment fragment ) {
1168+ super (fragment );
11661169 EmoteKeyboardDelegate delegate = ChatFragment .this ;
11671170
1168- textEmotesFragment = EmoteGridFragment .newInstance (EmoteFragmentType .UNICODE , delegate );
11691171 recentEmotesFragment = EmoteGridFragment .newInstance (EmoteFragmentType .ALL , delegate );
11701172 twitchEmotesFragment = EmoteGridFragment .newInstance (EmoteFragmentType .TWITCH , delegate );
11711173 subscriberEmotesFragment = EmoteGridFragment .newInstance (EmoteFragmentType .SUBSCRIBER , delegate );
11721174 customEmotesFragment = EmoteGridFragment .newInstance (EmoteFragmentType .CUSTOM , delegate );
1175+ textEmotesFragment = EmoteGridFragment .newInstance (EmoteFragmentType .UNICODE , delegate );
11731176 }
11741177
1178+ @ NonNull
11751179 @ Override
1176- public Fragment getItem (int position ) {
1177- if (!showSubscriberEmote && position >= SUBSCRIBE_POSITION ) {
1180+ public Fragment createFragment (int position ) {
1181+ if (!showSubscriberEmote && position >= POSITION_SUBSCRIBE ) {
11781182 position ++;
11791183 }
11801184
11811185 switch (position ) {
1182- case RECENT_POSITION :
1186+ default : // Deliberate fall-through to recent tab
1187+ case POSITION_RECENT :
11831188 return recentEmotesFragment ;
1184- case TWITCH_POSITION :
1189+ case POSITION_TWITCH :
11851190 return twitchEmotesFragment ;
1186- case SUBSCRIBE_POSITION :
1191+ case POSITION_SUBSCRIBE :
11871192 return subscriberEmotesFragment ;
1188- case CUSTOM_POSITION :
1193+ case POSITION_CUSTOM :
11891194 return customEmotesFragment ;
1190- case EMOJI_POSITION :
1195+ case POSITION_EMOJI :
11911196 return textEmotesFragment ;
1192- default :
1193- return EmoteGridFragment .newInstance ();
11941197 }
11951198 }
11961199
11971200 @ Override
1198- public int getCount () {
1199- int count = EMOJI_POSITION + 1 ;
1201+ public int getItemCount () {
1202+ int count = POSITION_EMOJI + 1 ;
12001203 if (!showSubscriberEmote ) {
12011204 count --;
12021205 }
0 commit comments