Skip to content

Commit 6e4116d

Browse files
committed
Migrate ChatFragment to ViewPager2 (needs slight fixing)
1 parent 4513c82 commit 6e4116d

File tree

2 files changed

+61
-58
lines changed

2 files changed

+61
-58
lines changed

app/src/main/java/com/perflyst/twire/fragments/ChatFragment.java

Lines changed: 60 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -31,20 +31,21 @@
3131
import android.widget.TextView;
3232
import android.widget.Toast;
3333

34+
import androidx.annotation.NonNull;
3435
import androidx.annotation.Nullable;
3536
import androidx.core.content.ContextCompat;
3637
import androidx.fragment.app.Fragment;
37-
import androidx.fragment.app.FragmentManager;
38-
import androidx.fragment.app.FragmentPagerAdapter;
3938
import androidx.recyclerview.widget.LinearLayoutManager;
4039
import androidx.recyclerview.widget.RecyclerView;
41-
import androidx.viewpager.widget.ViewPager;
40+
import androidx.viewpager2.adapter.FragmentStateAdapter;
41+
import androidx.viewpager2.widget.ViewPager2;
4242

4343
import com.bumptech.glide.Glide;
4444
import com.bumptech.glide.request.target.Target;
4545
import com.google.android.material.bottomsheet.BottomSheetBehavior;
4646
import com.google.android.material.bottomsheet.BottomSheetDialog;
4747
import com.google.android.material.tabs.TabLayout;
48+
import com.google.android.material.tabs.TabLayoutMediator;
4849
import com.perflyst.twire.R;
4950
import com.perflyst.twire.activities.stream.LiveStreamActivity;
5051
import com.perflyst.twire.adapters.ChatAdapter;
@@ -79,6 +80,11 @@ interface EmoteKeyboardDelegate {
7980
}
8081

8182
public 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
}

app/src/main/res/layout/fragment_chat.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@
7878
android:layout_height="@dimen/chat_emote_divider"
7979
android:background="?attr/chatStatusBarColor" />
8080

81-
<androidx.viewpager.widget.ViewPager
81+
<androidx.viewpager2.widget.ViewPager2
8282
android:id="@+id/tabs_viewpager"
8383
android:layout_width="match_parent"
8484
android:layout_height="match_parent"

0 commit comments

Comments
 (0)