Skip to content

Commit f8a8f92

Browse files
authored
Fixes commons-app#4329 "Back button in edit categories triggers back of media details." (commons-app#4346)
* Back button on fragment * Handled back events * minor changes * removed extra lines
1 parent fd247f6 commit f8a8f92

10 files changed

+115
-8
lines changed

app/src/main/java/fr/free/nrw/commons/bookmarks/BookmarkFragment.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,11 @@ public void setupTabLayout(){
100100

101101

102102
public void onBackPressed() {
103-
((BookmarkListRootFragment) (adapter.getItem(tabLayout.getSelectedTabPosition())))
104-
.backPressed();
103+
if(((BookmarkListRootFragment)(adapter.getItem(tabLayout.getSelectedTabPosition()))).backPressed()) {
104+
// The event is handled internally by the adapter , no further action required.
105+
return;
106+
}
107+
// Event is not handled by the adapter ( performed back action ) change action bar.
105108
((BaseActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(false);
106109
}
107110
}

app/src/main/java/fr/free/nrw/commons/bookmarks/BookmarkListRootFragment.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,10 +180,14 @@ public void viewPagerNotifyDataSetChanged() {
180180
}
181181
}
182182

183-
public void backPressed() {
183+
public boolean backPressed() {
184184
//check mediaDetailPage fragment is not null then we check mediaDetail.is Visible or not to avoid NullPointerException
185185
if(mediaDetails!=null) {
186186
if (mediaDetails.isVisible()) {
187+
if(mediaDetails.backButtonClicked()) {
188+
// mediaDetails handled the back clicked , no further action required.
189+
return true;
190+
}
187191
// todo add get list fragment
188192
((BookmarkFragment) getParentFragment()).setupTabLayout();
189193
ArrayList<Integer> removed=mediaDetails.getRemovedItems();
@@ -206,6 +210,8 @@ public void backPressed() {
206210
} else {
207211
moveToContributionsFragment();
208212
}
213+
// notify mediaDetails did not handled the backPressed further actions required.
214+
return false;
209215
}
210216

211217
void moveToContributionsFragment(){

app/src/main/java/fr/free/nrw/commons/category/CategoryDetailsActivity.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,12 @@ public boolean onOptionsItemSelected(MenuItem item) {
203203
@Override
204204
public void onBackPressed() {
205205
if (supportFragmentManager.getBackStackEntryCount() == 1){
206-
// back to search so show search toolbar and hide navigation toolbar
206+
207+
// the back press is handled by the mediaDetails , no further action required.
208+
if(mediaDetails.backButtonClicked()){
209+
return;
210+
}
211+
207212
tabLayout.setVisibility(View.VISIBLE);
208213
viewPager.setVisibility(View.VISIBLE);
209214
mediaContainer.setVisibility(View.GONE);

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,6 +594,10 @@ public Integer getContributionStateAt(int position) {
594594

595595
public void backButtonClicked() {
596596
if (mediaDetailPagerFragment.isVisible()) {
597+
if(mediaDetailPagerFragment.backButtonClicked()) {
598+
// MediaDetailed handled the backPressed no further action required.
599+
return;
600+
}
597601
if (store.getBoolean("displayNearbyCardView", true)) {
598602
if (nearbyNotificationCardView.cardViewVisibilityState == NearbyNotificationCardView.CardViewVisibilityState.READY) {
599603
nearbyNotificationCardView.setVisibility(View.VISIBLE);

app/src/main/java/fr/free/nrw/commons/explore/ExploreFragment.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,17 @@ public void setTabs() {
9797

9898
public void onBackPressed() {
9999
if (tabLayout.getSelectedTabPosition() == 0) {
100-
featuredRootFragment.backPressed();
100+
if(featuredRootFragment.backPressed()){
101+
// Event is handled by the Fragment we need not do anything.
102+
return;
103+
}
101104
} else {
102-
mobileRootFragment.backPressed();
105+
if(mobileRootFragment.backPressed()){
106+
// Event is handled by the Fragment we need not do anything.
107+
return;
108+
}
103109
}
110+
// Event is not handled by the fragment ( i.e performed back action ) therefore change action bar.
104111
((BaseActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(false);
105112
}
106113

app/src/main/java/fr/free/nrw/commons/explore/ExploreListRootFragment.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,9 +164,18 @@ public void viewPagerNotifyDataSetChanged() {
164164
}
165165
}
166166

167-
public void backPressed() {
167+
/**
168+
* Performs back pressed action on the fragment.
169+
* Return true if the event was handled by the mediaDetails otherwise returns false.
170+
* @return
171+
*/
172+
public boolean backPressed() {
168173
if (null!=mediaDetails && mediaDetails.isVisible()) {
169174
// todo add get list fragment
175+
if(mediaDetails.backButtonClicked()) {
176+
// MediaDetails handled the event no further action required.
177+
return true;
178+
}
170179
((ExploreFragment)getParentFragment()).tabLayout.setVisibility(View.VISIBLE);
171180
removeFragment(mediaDetails);
172181
((ExploreFragment) getParentFragment()).setScroll(true);
@@ -175,5 +184,6 @@ public void backPressed() {
175184
((MainActivity) getActivity()).setSelectedItemId(NavTab.CONTRIBUTIONS.code());
176185
}
177186
((MainActivity)getActivity()).showTabs();
187+
return false;
178188
}
179189
}

app/src/main/java/fr/free/nrw/commons/explore/SearchActivity.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,12 @@ protected void onResume() {
245245
@Override
246246
public void onBackPressed() {
247247
if (getSupportFragmentManager().getBackStackEntryCount() == 1){
248+
249+
// the back press is handled by the mediaDetails , no further action required.
250+
if(mediaDetails.backButtonClicked()){
251+
return;
252+
}
253+
248254
// back to search so show search toolbar and hide navigation toolbar
249255
searchView.setVisibility(View.VISIBLE);//set the searchview
250256
tabLayout.setVisibility(View.VISIBLE);

app/src/main/java/fr/free/nrw/commons/explore/depictions/WikidataItemDetailsActivity.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,12 @@ public Media getMediaAtPosition(int i) {
163163
@Override
164164
public void onBackPressed() {
165165
if (supportFragmentManager.getBackStackEntryCount() == 1){
166-
// back to search so show search toolbar and hide navigation toolbar
166+
167+
// back pressed is handled by the mediaDetails , no further action required.
168+
if(mediaDetailPagerFragment.backButtonClicked()){
169+
return;
170+
}
171+
167172
tabLayout.setVisibility(View.VISIBLE);
168173
viewPager.setVisibility(View.VISIBLE);
169174
mediaContainer.setVisibility(View.GONE);

app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,11 @@
1616
import android.text.Editable;
1717
import android.text.TextUtils;
1818
import android.text.TextWatcher;
19+
import android.util.Log;
20+
import android.view.KeyEvent;
1921
import android.view.LayoutInflater;
2022
import android.view.View;
23+
import android.view.View.OnKeyListener;
2124
import android.view.ViewGroup;
2225
import android.view.ViewTreeObserver;
2326
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
@@ -298,6 +301,7 @@ public void run() {
298301
updateAspectRatio(scrollView.getWidth());
299302
}
300303
});
304+
301305
return view;
302306
}
303307

@@ -702,6 +706,22 @@ public void onCategoryEditButtonClicked(){
702706
displayHideCategorySearch();
703707
}
704708

709+
/**
710+
* Hides the categoryEditContainer.
711+
* returns true after closing the categoryEditContainer if open, implying that event was handled.
712+
* else returns false
713+
* @return
714+
*/
715+
public boolean hideCategoryEditContainerIfOpen(){
716+
if (dummyCategoryEditContainer.getVisibility() == VISIBLE) {
717+
// editCategory is open, close it and return true as the event was handled.
718+
dummyCategoryEditContainer.setVisibility(GONE);
719+
return true;
720+
}
721+
// Event was not handled.
722+
return false;
723+
}
724+
705725
public void displayHideCategorySearch() {
706726
if (dummyCategoryEditContainer.getVisibility() != VISIBLE) {
707727
dummyCategoryEditContainer.setVisibility(VISIBLE);

app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import android.view.MenuItem;
1414
import android.view.View;
1515
import android.view.ViewGroup;
16+
import androidx.annotation.NonNull;
1617
import androidx.fragment.app.Fragment;
1718
import androidx.fragment.app.FragmentManager;
1819
import androidx.fragment.app.FragmentStatePagerAdapter;
@@ -381,6 +382,16 @@ public void onDataSetChanged() {
381382
}
382383
}
383384

385+
/**
386+
* backButtonClicked is called on a back event in the media details pager.
387+
* returns true after closing the categoryEditContainer if open, implying that event was handled.
388+
* else returns false
389+
* @return
390+
*/
391+
public boolean backButtonClicked(){
392+
return ((MediaDetailFragment)(adapter.getCurrentFragment())).hideCategoryEditContainerIfOpen();
393+
}
394+
384395
public interface MediaDetailProvider {
385396
Media getMediaAtPosition(int i);
386397

@@ -392,6 +403,11 @@ public interface MediaDetailProvider {
392403
//FragmentStatePagerAdapter allows user to swipe across collection of images (no. of images undetermined)
393404
private class MediaDetailAdapter extends FragmentStatePagerAdapter {
394405

406+
/**
407+
* Keeps track of the current displayed fragment.
408+
*/
409+
private Fragment mCurrentFragment;
410+
395411
public MediaDetailAdapter(FragmentManager fm) {
396412
super(fm);
397413
}
@@ -421,5 +437,30 @@ public int getCount() {
421437
}
422438
return provider.getTotalMediaCount();
423439
}
440+
441+
/**
442+
* Get the currently displayed fragment.
443+
* @return
444+
*/
445+
public Fragment getCurrentFragment() {
446+
return mCurrentFragment;
447+
}
448+
449+
/**
450+
* Called to inform the adapter of which item is currently considered to be the "primary",
451+
* that is the one show to the user as the current page.
452+
* @param container
453+
* @param position
454+
* @param object
455+
*/
456+
@Override
457+
public void setPrimaryItem(@NonNull final ViewGroup container, final int position,
458+
@NonNull final Object object) {
459+
// Update the current fragment if changed
460+
if(getCurrentFragment() != object) {
461+
mCurrentFragment = ((Fragment)object);
462+
}
463+
super.setPrimaryItem(container, position, object);
464+
}
424465
}
425466
}

0 commit comments

Comments
 (0)