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() {