Skip to content

Commit 55c0b07

Browse files
author
codingtosh
authored
[Contributions-Tab] Scroll to top on NavBar Button Pressed (commons-app#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
1 parent 88b21a6 commit 55c0b07

File tree

6 files changed

+47
-1
lines changed

6 files changed

+47
-1
lines changed

app/src/main/java/fr/free/nrw/commons/contributions/ContributionsFragment.java

+6
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,12 @@ public void setNotificationCount() {
204204
throwable -> Timber.e(throwable, "Error occurred while loading notifications")));
205205
}
206206

207+
public void scrollToTop( ){
208+
if (contributionsListFragment != null) {
209+
contributionsListFragment.scrollToTop();
210+
}
211+
}
212+
207213
private void initNotificationViews(List<Notification> notificationList) {
208214
Timber.d("Number of notifications is %d", notificationList.size());
209215
if (notificationList.isEmpty()) {

app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java

+4
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,10 @@ void launchCustomSelector(){
312312
animateFAB(isFabOpen);
313313
}
314314

315+
public void scrollToTop() {
316+
rvContributionsList.smoothScrollToPosition(0);
317+
}
318+
315319
private void animateFAB(final boolean isFabOpen) {
316320
this.isFabOpen = !isFabOpen;
317321
if (fabPlus.isShown()) {

app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,9 @@ private boolean loadFragment(Fragment fragment,boolean showBottom ) {
163163
//showBottom so that we do not show the bottom tray again when constructing
164164
//from the saved instance state.
165165
if (fragment instanceof ContributionsFragment) {
166-
if (activeFragment == ActiveFragment.CONTRIBUTIONS) { // Do nothing if same tab
166+
if (activeFragment == ActiveFragment.CONTRIBUTIONS) {
167+
// scroll to top if already on the Contributions tab
168+
contributionsFragment.scrollToTop();
167169
return true;
168170
}
169171
contributionsFragment = (ContributionsFragment) fragment;

app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionsFragmentUnitTests.kt

+9
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import org.junit.runner.RunWith
2929
import org.mockito.ArgumentMatchers.*
3030
import org.mockito.Mock
3131
import org.mockito.Mockito.`when`
32+
import org.mockito.Mockito.verify
3233
import org.mockito.MockitoAnnotations
3334
import org.powermock.reflect.Whitebox
3435
import org.robolectric.Robolectric
@@ -217,6 +218,14 @@ class ContributionsFragmentUnitTests {
217218
fragment.updateLimitedConnectionToggle(menu)
218219
}
219220

221+
@Test
222+
@Throws(Exception::class)
223+
fun testScrollToTop(){
224+
Shadows.shadowOf(Looper.getMainLooper()).idle()
225+
fragment.scrollToTop()
226+
verify(contributionsListFragment).scrollToTop()
227+
}
228+
220229
@Test
221230
@Throws(Exception::class)
222231
fun testOnAttach() {

app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionsListFragmentUnitTests.kt

+9
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import org.junit.runner.RunWith
2424
import org.mockito.ArgumentMatchers.anyInt
2525
import org.mockito.Mock
2626
import org.mockito.Mockito.`when`
27+
import org.mockito.Mockito.verify
2728
import org.mockito.MockitoAnnotations
2829
import org.powermock.reflect.Whitebox
2930
import org.robolectric.Robolectric
@@ -160,6 +161,14 @@ class ContributionsListFragmentUnitTests {
160161
fragment.getContributionStateAt(0)
161162
}
162163

164+
@Test
165+
@Throws(Exception::class)
166+
fun testOnScrollToTop() {
167+
Shadows.shadowOf(Looper.getMainLooper()).idle()
168+
fragment.scrollToTop()
169+
verify(rvContributionsList).smoothScrollToPosition(0)
170+
}
171+
163172
@Test
164173
@Throws(Exception::class)
165174
fun testOnConfirmClicked() {

app/src/test/kotlin/fr/free/nrw/commons/contributions/MainActivityUnitTests.kt

+16
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import org.junit.Test
2424
import org.junit.runner.RunWith
2525
import org.mockito.Mock
2626
import org.mockito.Mockito.`when`
27+
import org.mockito.Mockito.verify
2728
import org.mockito.MockitoAnnotations
2829
import org.powermock.api.mockito.PowerMockito
2930
import org.robolectric.Robolectric
@@ -243,6 +244,21 @@ class MainActivityUnitTests {
243244
method.invoke(activity, contributionsFragment, false)
244245
}
245246

247+
@Test
248+
@Throws(Exception::class)
249+
fun testLoadFragmentCaseContributionsFragmentCaseTrue() {
250+
activeFragment = ActiveFragment.CONTRIBUTIONS
251+
activity.activeFragment = activeFragment
252+
val method: Method = MainActivity::class.java.getDeclaredMethod(
253+
"loadFragment",
254+
Fragment::class.java,
255+
Boolean::class.java
256+
)
257+
method.isAccessible = true
258+
method.invoke(activity, contributionsFragment, false)
259+
verify(contributionsFragment).scrollToTop();
260+
}
261+
246262
@Test
247263
@Throws(Exception::class)
248264
fun testLoadFragmentCaseNearbyParentFragmentCaseTrue() {

0 commit comments

Comments
 (0)