Feature/add options menu (#2962)

* reslolved merge conflicts

* synced remote

* bug fix, nearby show map

* set support action bar in toolbar
This commit is contained in:
Ashish Kumar 2019-05-19 15:03:06 +05:30 committed by Vivek Maskara
parent 85dfa0699b
commit 64780259f0
14 changed files with 274 additions and 140 deletions

View file

@ -5,18 +5,18 @@ import android.content.Intent;
import android.database.DataSetObserver;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.FragmentManager;
import androidx.viewpager.widget.ViewPager;
import com.google.android.material.tabs.TabLayout;
import butterknife.BindView;
import butterknife.ButterKnife;
import com.google.android.material.tabs.TabLayout;
import fr.free.nrw.commons.Media;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
@ -34,6 +34,12 @@ public class BookmarksFragment extends CommonsDaggerSupportFragment
private BookmarksPagerAdapter adapter;
private MediaDetailPagerFragment mediaDetails;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
/**
* Consumers should be simply using this method to use this activity.
*
@ -58,6 +64,16 @@ public class BookmarksFragment extends CommonsDaggerSupportFragment
initViewPager();
}
/**
* Inflate the toolbar menu options for this fragment
*/
@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
menu.clear();
super.onCreateOptionsMenu(menu, inflater);
}
private void initViewPager() {
// Activity can call methods in the fragment by acquiring a
// reference to the Fragment from FragmentManager, using findFragmentById()

View file

@ -1,5 +1,11 @@
package fr.free.nrw.commons.contributions;
import static fr.free.nrw.commons.contributions.ContributionDao.Table.ALL_FIELDS;
import static fr.free.nrw.commons.contributions.ContributionsContentProvider.BASE_URI;
import static fr.free.nrw.commons.location.LocationServiceManager.LOCATION_REQUEST;
import static fr.free.nrw.commons.settings.Prefs.UPLOADS_SHOWING;
import static fr.free.nrw.commons.utils.LengthUtils.formatDistanceBetween;
import android.Manifest;
import android.content.ComponentName;
import android.content.Context;
@ -11,28 +17,26 @@ import android.database.DataSetObserver;
import android.os.Build;
import android.os.Bundle;
import android.os.IBinder;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.CheckBox;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.cursoradapter.widget.CursorAdapter;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import androidx.loader.app.LoaderManager;
import androidx.loader.content.CursorLoader;
import androidx.loader.content.Loader;
import androidx.cursoradapter.widget.CursorAdapter;
import androidx.appcompat.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.CheckBox;
import android.widget.Toast;
import java.util.ArrayList;
import javax.inject.Inject;
import javax.inject.Named;
import butterknife.BindView;
import butterknife.ButterKnife;
import fr.free.nrw.commons.HandlerService;
@ -53,6 +57,9 @@ import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient;
import fr.free.nrw.commons.nearby.NearbyController;
import fr.free.nrw.commons.nearby.NearbyNotificationCardView;
import fr.free.nrw.commons.nearby.Place;
import fr.free.nrw.commons.notification.Notification;
import fr.free.nrw.commons.notification.NotificationActivity;
import fr.free.nrw.commons.notification.NotificationController;
import fr.free.nrw.commons.settings.Prefs;
import fr.free.nrw.commons.upload.UploadService;
import fr.free.nrw.commons.utils.ConfigUtils;
@ -62,14 +69,12 @@ import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.schedulers.Schedulers;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import timber.log.Timber;
import static fr.free.nrw.commons.contributions.ContributionDao.Table.ALL_FIELDS;
import static fr.free.nrw.commons.contributions.ContributionsContentProvider.BASE_URI;
import static fr.free.nrw.commons.location.LocationServiceManager.LOCATION_REQUEST;
import static fr.free.nrw.commons.settings.Prefs.UPLOADS_SHOWING;
import static fr.free.nrw.commons.utils.LengthUtils.formatDistanceBetween;
public class ContributionsFragment
extends CommonsDaggerSupportFragment
implements LoaderManager.LoaderCallbacks<Cursor>,
@ -86,6 +91,8 @@ public class ContributionsFragment
@Inject OkHttpJsonApiClient okHttpJsonApiClient;
@Inject CampaignsPresenter presenter;
@Inject LocationServiceManager locationManager;
@Inject
NotificationController notificationController;
private ArrayList<DataSetObserver> observersWaitingForLoad = new ArrayList<>();
private UploadService uploadService;
@ -106,6 +113,13 @@ public class ContributionsFragment
private boolean isFragmentAttachedBefore = false;
private View checkBoxView;
private CheckBox checkBox;
private TextView notificationCount;
public static Fragment newInstance() {
ContributionsFragment contributionsFragment = new ContributionsFragment();
contributionsFragment.setRetainInstance(true);
return contributionsFragment;
}
/**
* Since we will need to use parent activity on onAuthCookieAcquired, we have to wait
@ -129,9 +143,11 @@ public class ContributionsFragment
}
};
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
setRetainInstance(true);
}
@ -209,6 +225,59 @@ public class ContributionsFragment
}
}
@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
menu.clear();
inflater.inflate(R.menu.menu_item_notifications, menu);
final View notification = menu.findItem(R.id.notifications).getActionView();
notificationCount = notification.findViewById(R.id.notification_count_badge);
notificationCount.setOnClickListener(view -> {
onMenuItemNotificationClicked();
});
updateNotificationCount();
super.onCreateOptionsMenu(menu, inflater);
}
/**
* Starts notification activity on click to notification icon
*/
private void onMenuItemNotificationClicked() {
NotificationActivity
.startYourself(getActivity(), "unread");//TODO figure this out, why not constant
}
private void updateNotificationCount() {
compositeDisposable.add(Observable.fromCallable(() -> notificationController.getNotifications(false))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::initNotificationViews,
throwable -> Timber.e(throwable, "Error occurred while loading notifications")));
}
/**
* Update the menu item with the number of notifications
*/
private void initNotificationViews(List<Notification> notifications) {
if (notifications == null || notifications.isEmpty()) {
notificationCount.setVisibility(View.GONE);
} else {
notificationCount.setVisibility(View.VISIBLE);
notificationCount.setText(String.valueOf(notifications.size()));
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.notifications:
onMenuItemNotificationClicked();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
/**
* Replace FrameLayout with ContributionsListFragment, user will see contributions list.
* Creates new one if null.

View file

@ -99,6 +99,7 @@ public class ContributionsMainFragment extends CommonsDaggerSupportFragment impl
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
/*Todo: after
@ -178,7 +179,6 @@ public class ContributionsMainFragment extends CommonsDaggerSupportFragment impl
// If auth cookie already acquired notify contrib fragment so that it san operate auth required actions
((ContributionsFragment) contributionsActivityPagerAdapter.getItem(CONTRIBUTIONS_TAB_POSITION)).onAuthCookieAcquired(uploadServiceIntent);
}
setTabAndViewPagerSynchronisation();
}
/**
@ -193,10 +193,8 @@ public class ContributionsMainFragment extends CommonsDaggerSupportFragment impl
uploadCount, uploadCount));
}
/**
* Normally tab layout and view pager has no relation, which means when you swipe view pager
* tab won't change and vice versa. So we have to notify each of them.
*/
//This has become obsolete now
/*
private void setTabAndViewPagerSynchronisation() {
//viewPager.canScrollHorizontally(false);
viewPager.setFocusableInTouchMode(true);
@ -253,7 +251,7 @@ public class ContributionsMainFragment extends CommonsDaggerSupportFragment impl
}
});
}
}*/
public void hideTabs() {
//Todo: after changeDrawerIconToBackButton();
@ -363,27 +361,9 @@ public class ContributionsMainFragment extends CommonsDaggerSupportFragment impl
}
}
/**
* Responsible with displaying required menu items according to displayed fragment.
* Notifications icon when contributions list is visible, list sheet icon when nearby is visible
*/
private void updateMenuItem() {
if (menu != null) {
if (isContributionsFragmentVisible) {
// Display notifications menu item
menu.findItem(R.id.notifications).setVisible(true);
menu.findItem(R.id.list_sheet).setVisible(false);
Timber.d("Contributions activity notifications menu item is visible");
} else {
// Display bottom list menu item
menu.findItem(R.id.notifications).setVisible(false);
menu.findItem(R.id.list_sheet).setVisible(true);
Timber.d("Contributions activity list sheet menu item is visible");
}
}
}
//This is not required, in fact we can delete this fragment, keeping it for now for references
@Override
/*@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.notifications:
@ -398,7 +378,7 @@ public class ContributionsMainFragment extends CommonsDaggerSupportFragment impl
default:
return super.onOptionsItemSelected(item);
}
}
}*/
private boolean deviceHasCamera() {
PackageManager pm = requireActivity().getPackageManager();

View file

@ -8,6 +8,7 @@ import android.view.View;
import android.widget.AdapterView;
import android.widget.TextView;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.FragmentManager;
import java.util.List;
@ -42,6 +43,8 @@ public class MainActivity extends AuthenticatedActivity implements FragmentManag
SessionManager sessionManager;
@Inject
ContributionController controller;
@BindView(R.id.toolbar)
Toolbar toolbar;
@BindView(R.id.pager)
public UnswipableViewPager viewPager;
@BindView(R.id.fragment_main_nav_tab_layout)
@ -73,7 +76,7 @@ public class MainActivity extends AuthenticatedActivity implements FragmentManag
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ButterKnife.bind(this);
setSupportActionBar(toolbar);
requestAuthToken();
initDrawer();
setTitle(getString(R.string.navigation_item_home)); // Should I create a new string variable with another name instead?

View file

@ -4,6 +4,9 @@ package fr.free.nrw.commons.explore;
import android.database.DataSetObserver;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
@ -16,6 +19,7 @@ import androidx.viewpager.widget.ViewPager;
import com.google.android.material.tabs.TabLayout;
import fr.free.nrw.commons.theme.NavigationBaseActivity;
import java.util.ArrayList;
import java.util.List;
@ -76,6 +80,7 @@ public class ExploreFragment
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
//Todo: after setContentView(R.layout.activity_explore);
ButterKnife.bind(requireActivity());
//Todo:after setTitle(getString(R.string.title_activity_explore));
@ -84,6 +89,36 @@ public class ExploreFragment
}
/**
* Inflate the toolbar menu options for this fragment
* @param menu
* @param inflater
*/
@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
menu.clear();
inflater.inflate(R.menu.menu_search, menu);
super.onCreateOptionsMenu(menu, inflater);
}
/**
* This method handles the logic on ItemSelect in toolbar menu
* Currently only 1 choice is available to open search page of the app
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
switch (item.getItemId()) {
case R.id.action_search:
NavigationBaseActivity.startActivityWithFlags(getActivity(), SearchActivity.class);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
/**
* Sets the titles in the tabLayout and fragments in the viewPager
*/
@ -232,34 +267,5 @@ public class ExploreFragment
mediaDetails.showImage(i);
//Todo: after forceInitBackButton();
}
/*Todo: after
*//**
* This method inflates the menu in the toolbar
*//*
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = requireActivity().getMenuInflater();
inflater.inflate(R.menu.menu_search, menu);
return super.onCreateOptionsMenu(menu);
}
*//**
* This method handles the logic on ItemSelect in toolbar menu
* Currently only 1 choice is available to open search page of the app
*//*
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
switch (item.getItemId()) {
case R.id.action_search:
NavigationBaseActivity.startActivityWithFlags(this, SearchActivity.class);
return true;
default:
return super.onOptionsItemSelected(item);
}
}*/
}

View file

@ -11,8 +11,12 @@ import org.wikipedia.model.EnumCodeMap;
import fr.free.nrw.commons.MoreFragment;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.bookmarks.BookmarksFragment;
import fr.free.nrw.commons.contributions.ContributionsFragment;
import fr.free.nrw.commons.contributions.ContributionsMainFragment;
import fr.free.nrw.commons.explore.ExploreFragment;
import fr.free.nrw.commons.nearby.NearbyFragment;
import org.wikipedia.model.EnumCode;
import org.wikipedia.model.EnumCodeMap;
public enum NavTab implements EnumCode {
@ -20,9 +24,17 @@ public enum NavTab implements EnumCode {
@NonNull
@Override
public Fragment newInstance() {
return ContributionsMainFragment.newInstance();
return ContributionsFragment.newInstance();
}
}, EXPLORE(R.string.navigation_item_explore, R.drawable.ic_globe) {
},
NEARBY(R.string.nearby_fragment, R.drawable.round_icon_milestone){//TODO change this icon
@NonNull
@Override
public Fragment newInstance() {
return NearbyFragment.newInstance();
}
},
EXPLORE(R.string.navigation_item_explore, R.drawable.ic_globe) {
@NonNull
@Override
public Fragment newInstance() {

View file

@ -1,35 +1,41 @@
package fr.free.nrw.commons.nearby;
import static fr.free.nrw.commons.location.LocationServiceManager.LOCATION_REQUEST;
import static fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType.LOCATION_SIGNIFICANTLY_CHANGED;
import static fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType.LOCATION_SLIGHTLY_CHANGED;
import static fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType.MAP_UPDATED;
import static fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType.PERMISSION_JUST_GRANTED;
import android.Manifest.permission;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.constraintlayout.widget.ConstraintLayout;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.snackbar.Snackbar;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import androidx.appcompat.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import com.google.gson.Gson;
import java.util.List;
import javax.inject.Inject;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import butterknife.BindView;
import butterknife.ButterKnife;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.snackbar.Snackbar;
import com.google.gson.Gson;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.contributions.MainActivity;
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
@ -43,13 +49,10 @@ import fr.free.nrw.commons.wikidata.WikidataEditListener;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import java.util.List;
import javax.inject.Inject;
import timber.log.Timber;
import static fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType.LOCATION_SIGNIFICANTLY_CHANGED;
import static fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType.LOCATION_SLIGHTLY_CHANGED;
import static fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType.MAP_UPDATED;
import static fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType.PERMISSION_JUST_GRANTED;
public class NearbyFragment extends CommonsDaggerSupportFragment
implements LocationUpdateListener,
WikidataEditListener.WikidataP18EditListener {
@ -98,9 +101,18 @@ public class NearbyFragment extends CommonsDaggerSupportFragment
private boolean populateForCurrentLocation = false;
private boolean isNetworkErrorOccured = false;
@NonNull
public static Fragment newInstance() {
NearbyFragment fragment = new NearbyFragment();
fragment.setRetainInstance(true);
return fragment;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
setRetainInstance(true);
}
@ -126,6 +138,24 @@ public class NearbyFragment extends CommonsDaggerSupportFragment
}
}
@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
menu.clear();
inflater.inflate(R.menu.menu_nearby,menu);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.item_list_nearby:
listOptionMenuItemClicked();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
/**
* Hide or expand bottom sheet according to states of all sheets
*/
@ -749,7 +779,10 @@ public class NearbyFragment extends CommonsDaggerSupportFragment
super.onResume();
// Resume the fragment if exist
resumeFragment();
if(isVisible()){
secureLocationPermission();
}
}
/**
* Perform nearby operations on nearby tab selected
@ -758,8 +791,6 @@ public class NearbyFragment extends CommonsDaggerSupportFragment
public void onTabSelected(boolean onOrientationChanged) {
Timber.d("On nearby tab selected");
this.onOrientationChanged = onOrientationChanged;
performNearbyOperations();
}
/**
@ -818,6 +849,26 @@ public class NearbyFragment extends CommonsDaggerSupportFragment
public boolean isBottomSheetExpanded() { return bottomSheetBehavior.getState() == BottomSheetBehavior.STATE_EXPANDED;
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(isVisibleToUser && isResumed()){
secureLocationPermission();
}
}
private void secureLocationPermission() {
if (ContextCompat.checkSelfPermission(getContext(), permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
requestPermissions(
new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION,
android.Manifest.permission.ACCESS_FINE_LOCATION},
LOCATION_REQUEST);
}else{
performNearbyOperations();
}
}
}

View file

@ -5,6 +5,7 @@ import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import androidx.appcompat.widget.Toolbar;
import androidx.constraintlayout.widget.ConstraintLayout;
import com.google.android.material.snackbar.Snackbar;
import androidx.recyclerview.widget.DividerItemDecoration;
@ -54,6 +55,8 @@ public class NotificationActivity extends NavigationBaseActivity {
ConstraintLayout no_notification;
@BindView(R.id.no_notification_text)
TextView noNotificationText;
@BindView(R.id.toolbar)
Toolbar toolbar;
@Inject
NotificationController controller;
@ -69,6 +72,7 @@ public class NotificationActivity extends NavigationBaseActivity {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_notification);
ButterKnife.bind(this);
setSupportActionBar(toolbar);
mNotificationWorkerFragment = (NotificationWorkerFragment) getFragmentManager()
.findFragmentByTag(TAG_NOTIFICATION_WORKER_FRAGMENT);
initListView();

View file

@ -15,8 +15,6 @@
android:layout_height="wrap_content"
android:background="@color/primaryDarkColor">
<include layout="@layout/toolbar"/>
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"

View file

@ -45,7 +45,7 @@
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_marginRight="12dp"
android:layout_marginBottom="8dp"
android:layout_marginBottom="48dp"
android:orientation="vertical"
android:gravity="center"
>

View file

@ -10,31 +10,28 @@
android:layout_height="match_parent"
android:background="@color/status_bar_blue">
<LinearLayout
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/toolbar"
android:gravity="center_vertical"
android:orientation="horizontal">
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="match_parent"
android:layout_width="wrap_content"
android:layout_centerInParent="true"
android:layout_height="wrap_content"
/>
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
</RelativeLayout>
<View
android:id="@+id/transparentView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/toolbar"
android:layout_alignParentLeft="true"
android:background="#aa969696"
android:elevation="6dp">

View file

@ -1,27 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical">
<include layout="@layout/toolbar" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/contributionsFragmentContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<FrameLayout
android:id="@+id/contributionsFragmentContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/tab_layout"
android:orientation="horizontal">
<fr.free.nrw.commons.contributions.UnswipableViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<fr.free.nrw.commons.contributions.UnswipableViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
</FrameLayout>
<fr.free.nrw.commons.navtab.NavTabLayout
android:id="@+id/fragment_main_nav_tab_layout"
@ -36,4 +38,5 @@
app:tabGravity="fill"
app:tabIndicatorColor="@android:color/transparent" />
</RelativeLayout>
</LinearLayout>

View file

@ -6,9 +6,4 @@
android:menuCategory="secondary"
app:actionLayout="@layout/notification_icon"
/>
<item android:id="@+id/list_sheet"
android:title="@string/list_sheet"
app:showAsAction="ifRoom|withText"
android:icon="@drawable/ic_list_white_24dp"
/>
</menu>

View file

@ -3,11 +3,11 @@
xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity">
<item
android:id="@+id/action_display_list"
android:id="@+id/item_list_nearby"
android:title="@string/display_list_button"
android:icon="@drawable/ic_list_white_24dp"
android:orderInCategory="1"
app:showAsAction="ifRoom"
app:showAsAction="always"
/>
</menu>