From 55c0b07ebf306bd444365c086f61776124e8b30b Mon Sep 17 00:00:00 2001 From: codingtosh Date: Wed, 27 Oct 2021 19:56:16 +0530 Subject: [PATCH] [Contributions-Tab] Scroll to top on NavBar Button Pressed (#4668) * [Contributions-Tab] Scroll to top on NavBar Button Pressed On NavBar Contributions Button pressed, if already on the Contributions tab, scroll to the top of the recyclerView in ContributionsListFragment. * [UnitTest][Contributions-Tab] Scroll to Top on NavBar Button Pressed --- .../contributions/ContributionsFragment.java | 6 ++++++ .../contributions/ContributionsListFragment.java | 4 ++++ .../nrw/commons/contributions/MainActivity.java | 4 +++- .../ContributionsFragmentUnitTests.kt | 9 +++++++++ .../ContributionsListFragmentUnitTests.kt | 9 +++++++++ .../contributions/MainActivityUnitTests.kt | 16 ++++++++++++++++ 6 files changed, 47 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsFragment.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsFragment.java index ca1f6d0df..b5339bbeb 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsFragment.java @@ -204,6 +204,12 @@ public class ContributionsFragment throwable -> Timber.e(throwable, "Error occurred while loading notifications"))); } + public void scrollToTop( ){ + if (contributionsListFragment != null) { + contributionsListFragment.scrollToTop(); + } + } + private void initNotificationViews(List notificationList) { Timber.d("Number of notifications is %d", notificationList.size()); if (notificationList.isEmpty()) { diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java index 86ab4f016..cf76cf2d5 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java @@ -312,6 +312,10 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment impl animateFAB(isFabOpen); } + public void scrollToTop() { + rvContributionsList.smoothScrollToPosition(0); + } + private void animateFAB(final boolean isFabOpen) { this.isFabOpen = !isFabOpen; if (fabPlus.isShown()) { diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.java b/app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.java index 6a5fa177e..10075ac90 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.java @@ -163,7 +163,9 @@ public class MainActivity extends BaseActivity //showBottom so that we do not show the bottom tray again when constructing //from the saved instance state. if (fragment instanceof ContributionsFragment) { - if (activeFragment == ActiveFragment.CONTRIBUTIONS) { // Do nothing if same tab + if (activeFragment == ActiveFragment.CONTRIBUTIONS) { + // scroll to top if already on the Contributions tab + contributionsFragment.scrollToTop(); return true; } contributionsFragment = (ContributionsFragment) fragment; diff --git a/app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionsFragmentUnitTests.kt b/app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionsFragmentUnitTests.kt index 81cb2fd49..8b3a010c7 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionsFragmentUnitTests.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionsFragmentUnitTests.kt @@ -29,6 +29,7 @@ import org.junit.runner.RunWith import org.mockito.ArgumentMatchers.* import org.mockito.Mock import org.mockito.Mockito.`when` +import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations import org.powermock.reflect.Whitebox import org.robolectric.Robolectric @@ -217,6 +218,14 @@ class ContributionsFragmentUnitTests { fragment.updateLimitedConnectionToggle(menu) } + @Test + @Throws(Exception::class) + fun testScrollToTop(){ + Shadows.shadowOf(Looper.getMainLooper()).idle() + fragment.scrollToTop() + verify(contributionsListFragment).scrollToTop() + } + @Test @Throws(Exception::class) fun testOnAttach() { diff --git a/app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionsListFragmentUnitTests.kt b/app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionsListFragmentUnitTests.kt index 7230633f0..c9ef72267 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionsListFragmentUnitTests.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionsListFragmentUnitTests.kt @@ -24,6 +24,7 @@ import org.junit.runner.RunWith import org.mockito.ArgumentMatchers.anyInt import org.mockito.Mock import org.mockito.Mockito.`when` +import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations import org.powermock.reflect.Whitebox import org.robolectric.Robolectric @@ -160,6 +161,14 @@ class ContributionsListFragmentUnitTests { fragment.getContributionStateAt(0) } + @Test + @Throws(Exception::class) + fun testOnScrollToTop() { + Shadows.shadowOf(Looper.getMainLooper()).idle() + fragment.scrollToTop() + verify(rvContributionsList).smoothScrollToPosition(0) + } + @Test @Throws(Exception::class) fun testOnConfirmClicked() { diff --git a/app/src/test/kotlin/fr/free/nrw/commons/contributions/MainActivityUnitTests.kt b/app/src/test/kotlin/fr/free/nrw/commons/contributions/MainActivityUnitTests.kt index 0c1818f06..0c32ccdcc 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/contributions/MainActivityUnitTests.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/contributions/MainActivityUnitTests.kt @@ -24,6 +24,7 @@ import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock import org.mockito.Mockito.`when` +import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations import org.powermock.api.mockito.PowerMockito import org.robolectric.Robolectric @@ -243,6 +244,21 @@ class MainActivityUnitTests { method.invoke(activity, contributionsFragment, false) } + @Test + @Throws(Exception::class) + fun testLoadFragmentCaseContributionsFragmentCaseTrue() { + activeFragment = ActiveFragment.CONTRIBUTIONS + activity.activeFragment = activeFragment + val method: Method = MainActivity::class.java.getDeclaredMethod( + "loadFragment", + Fragment::class.java, + Boolean::class.java + ) + method.isAccessible = true + method.invoke(activity, contributionsFragment, false) + verify(contributionsFragment).scrollToTop(); + } + @Test @Throws(Exception::class) fun testLoadFragmentCaseNearbyParentFragmentCaseTrue() {