How Libraries can silently add permissions to your Android App

final Manifest file :

app/build/intermediates/manifests/full/debug/AndroidManifest.xml

where did it exactly these permissions came from?

app/build/outputs/logs/manifest-merger-debug-report.txt

So the solution is :

<uses-permission android:name=”android.permission.RECORD_AUDIO” tools:node=”remove” />

Even if another library is asking for this specific permission, the build will be forced to not merge it in your final Manifest file

References
https://medium.com/glucosio-project/how-libraries-can-silently-add-permissions-to-your-android-app-620911d7de6c

Hide FloatingActionButton on Scroll of RecyclerView

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener()
{
    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy)
    {
        if (dy > 0 ||dy<0 && fab.isShown())
        {
            fab.hide();
        }
    }

    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState)
    {
        if (newState == RecyclerView.SCROLL_STATE_IDLE)
        {
            fab.show();
        }

        super.onScrollStateChanged(recyclerView, newState);
    }
});

References
https://github.com/mhdr/AndroidSamples/tree/master/095
https://stackoverflow.com/questions/33208613/hide-floatingactionbutton-on-scroll-of-recyclerview

Get current fragment displayed in ViewPager on Android

First define a SparseArray in your ViewPagers’ adapters like below. In this array we’ll hold the instance of fragments.

SparseArray<Fragment> registeredFragments = new SparseArray<>();

And Override your Adapters’ instantiateItem method.

@Override
public Object instantiateItem(ViewGroup container, int position) {
    Fragment fragment = (Fragment) super.instantiateItem(container, position);
    registeredFragments.put(position, fragment);
    return fragment;
}

Also Override destroyItem method of your ViewPagers

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    registeredFragments.remove(position);
    super.destroyItem(container, position, object);
}
And define a new method to get your ViewPager Fragments instance.

public Fragment getRegisteredFragment(int position) {
    return registeredFragments.get(position);
}

And finally set add a PageChangeListener to your ViewPagers:

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

    }

    @Override
    public void onPageSelected(int position) {
        // Here's your instance
        YourFragment fragment =(YourFragment)yourPagerAdapter.getRegisteredFragment(position);

    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }
});

Or

int position = viewPager.getCurrentItem();
YourFragment fragment =(YourFragment)yourPagerAdapter.getRegisteredFragment(position);

References
https://stackoverflow.com/questions/39143087/how-to-get-the-current-fragment-displayed-in-a-specific-tab-of-a-viewpager
https://stackoverflow.com/questions/8258759/getting-the-current-position-of-a-viewpager