diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyTestFragmentLayersActivity.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyTestFragmentLayersActivity.java index 256039440..c3772e2fb 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyTestFragmentLayersActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyTestFragmentLayersActivity.java @@ -1,14 +1,183 @@ package fr.free.nrw.commons.nearby; import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; +import androidx.viewpager.widget.ViewPager; + +import com.google.android.material.tabs.TabLayout; + +import butterknife.BindView; +import butterknife.ButterKnife; import fr.free.nrw.commons.R; +import fr.free.nrw.commons.contributions.UnswipableViewPager; import fr.free.nrw.commons.theme.NavigationBaseActivity; +import timber.log.Timber; public class NearbyTestFragmentLayersActivity extends NavigationBaseActivity { + + @BindView(R.id.tab_layout) + TabLayout tabLayout; + @BindView(R.id.pager) + UnswipableViewPager viewPager; + public static final int CONTRIBUTIONS_TAB_POSITION = 0; + public static final int NEARBY_TAB_POSITION = 1; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_nearby_test_fragment_layers); + ButterKnife.bind(this); + addTabsAndFragments(); + } + + private void addTabsAndFragments() { + ContributionsActivityPagerAdapter contributionsActivityPagerAdapter = new ContributionsActivityPagerAdapter(getSupportFragmentManager()); + viewPager.setAdapter(contributionsActivityPagerAdapter); + + tabLayout.addTab(tabLayout.newTab().setText(getResources().getString(R.string.contributions_fragment))); + tabLayout.addTab(tabLayout.newTab().setText(getResources().getString(R.string.nearby_fragment))); + + // Set custom view to add nearby info icon next to text + View nearbyTabLinearLayout = LayoutInflater.from(this).inflate(R.layout.custom_nearby_tab_layout, null); + tabLayout.getTabAt(1).setCustomView(nearbyTabLinearLayout); + + setTabAndViewPagerSynchronisation(); + } + + private void setTabAndViewPagerSynchronisation() { + //viewPager.canScrollHorizontally(false); + viewPager.setFocusableInTouchMode(true); + + viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + + } + + @Override + public void onPageSelected(int position) { + switch (position) { + case CONTRIBUTIONS_TAB_POSITION: + Timber.d("Contributions tab selected"); + tabLayout.getTabAt(CONTRIBUTIONS_TAB_POSITION).select(); + + break; + case NEARBY_TAB_POSITION: + Timber.d("Nearby tab selected"); + tabLayout.getTabAt(NEARBY_TAB_POSITION).select(); + break; + default: + tabLayout.getTabAt(CONTRIBUTIONS_TAB_POSITION).select(); + break; + } + } + + @Override + public void onPageScrollStateChanged(int state) { + + } + }); + + tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { + @Override + public void onTabSelected(TabLayout.Tab tab) { + viewPager.setCurrentItem(tab.getPosition()); + } + + @Override + public void onTabUnselected(TabLayout.Tab tab) { + + } + + @Override + public void onTabReselected(TabLayout.Tab tab) { + + } + }); + } + + + public class ContributionsActivityPagerAdapter extends FragmentPagerAdapter { + FragmentManager fragmentManager; + private boolean isContributionsListFragment = true; // to know what to put in first tab, Contributions of Media Details + + + public ContributionsActivityPagerAdapter(FragmentManager fragmentManager) { + super(fragmentManager); + this.fragmentManager = fragmentManager; + } + + @Override + public int getCount() { + return 2; + } + + /* + * Do not use getItem method to access fragments on pager adapter. User reference variables + * instead. + * */ + @Override + public Fragment getItem(int position) { + switch (position){ + case 0: + NearbyTestLayersFragment retainedContributionsFragment = getContributionsFragment(0); + if (retainedContributionsFragment != null) { + return retainedContributionsFragment; + } else { + // If we reach here, retainedContributionsFragment is null + return new NearbyTestLayersFragment(); + + } + + case 1: + NearbyTestLayersFragment retainedNearbyFragment = getNearbyFragment(1); + if (retainedNearbyFragment != null) { + return retainedNearbyFragment; + } else { + // If we reach here, retainedNearbyFragment is null + return new NearbyTestLayersFragment(); + } + default: + return null; + } + } + + /** + * Generates fragment tag with makeFragmentName method to get retained contributions fragment + * @param position index of tabs, in our case 0 or 1 + * @return + */ + private NearbyTestLayersFragment getContributionsFragment(int position) { + String tag = makeFragmentName(R.id.pager, position); + return (NearbyTestLayersFragment)fragmentManager.findFragmentByTag(tag); + } + + /** + * Generates fragment tag with makeFragmentName method to get retained nearby fragment + * @param position index of tabs, in our case 0 or 1 + * @return + */ + private NearbyTestLayersFragment getNearbyFragment(int position) { + String tag = makeFragmentName(R.id.pager, position); + return (NearbyTestLayersFragment)fragmentManager.findFragmentByTag(tag); + } + + /** + * A simple hack to use retained fragment when getID is called explicitly, if we don't use + * this method, a new fragment will be initialized on each explicit calls of getID + * @param viewId id of view pager + * @param index index of tabs, in our case 0 or 1 + * @return + */ + public String makeFragmentName(int viewId, int index) { + return "android:switcher:" + viewId + ":" + index; + } + + } + } diff --git a/app/src/main/res/layout/activity_nearby_test_fragment_layers.xml b/app/src/main/res/layout/activity_nearby_test_fragment_layers.xml index 090a87885..f53c434e2 100644 --- a/app/src/main/res/layout/activity_nearby_test_fragment_layers.xml +++ b/app/src/main/res/layout/activity_nearby_test_fragment_layers.xml @@ -1,12 +1,46 @@ - + - + android:gravity="center_horizontal" + > + - \ No newline at end of file + + + + + + + + + + + + + \ No newline at end of file