Merge branch 'main' into issue5502

This commit is contained in:
Kanahia 2024-03-20 12:24:06 +05:30 committed by GitHub
commit 7b917afa82
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
70 changed files with 1250 additions and 1373 deletions

View file

@ -53,7 +53,6 @@ their contribution to the product.
* Butterknife
* GSON
* Timber
* MapBox
3rd party open source apps from which significant code has been reused:
* Android Wikipedia app https://github.com/wikimedia/apps-android-wikipedia

View file

@ -3,6 +3,7 @@ package fr.free.nrw.commons.LocationPicker;
import android.app.Activity;
import android.content.Intent;
import com.mapbox.mapboxsdk.camera.CameraPosition;
import fr.free.nrw.commons.Media;
/**
* Helper class for starting the activity
@ -52,6 +53,17 @@ public final class LocationPicker {
return this;
}
/**
* Gets and puts media in intent
* @param media Media
* @return LocationPicker.IntentBuilder
*/
public LocationPicker.IntentBuilder media(
final Media media) {
intent.putExtra(LocationPickerConstants.MEDIA, media);
return this;
}
/**
* Gets and sets the activity
* @param activity Activity

View file

@ -31,8 +31,10 @@ import androidx.core.content.ContextCompat;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.mapbox.mapboxsdk.camera.CameraPosition;
import com.mapbox.mapboxsdk.geometry.LatLng;
import fr.free.nrw.commons.Media;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.Utils;
import fr.free.nrw.commons.coordinates.CoordinateEditHelper;
import fr.free.nrw.commons.filepicker.Constants;
import fr.free.nrw.commons.kvstore.JsonKvStore;
import fr.free.nrw.commons.location.LocationPermissionsHelper;
@ -41,6 +43,9 @@ import fr.free.nrw.commons.location.LocationPermissionsHelper.LocationPermission
import fr.free.nrw.commons.location.LocationServiceManager;
import fr.free.nrw.commons.theme.BaseActivity;
import fr.free.nrw.commons.utils.SystemThemeUtils;
import fr.free.nrw.commons.utils.ViewUtilWrapper;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
@ -52,13 +57,22 @@ import org.osmdroid.views.overlay.Marker;
import org.osmdroid.views.overlay.Overlay;
import org.osmdroid.views.overlay.ScaleDiskOverlay;
import org.osmdroid.views.overlay.TilesOverlay;
import timber.log.Timber;
/**
* Helps to pick location and return the result with an intent
*/
public class LocationPickerActivity extends BaseActivity implements
LocationPermissionCallback {
/**
* coordinateEditHelper: helps to edit coordinates
*/
@Inject
CoordinateEditHelper coordinateEditHelper;
/**
* media : Media object
*/
private Media media;
/**
* cameraPosition : position of picker
*/
@ -125,6 +139,13 @@ public class LocationPickerActivity extends BaseActivity implements
@Inject
LocationServiceManager locationManager;
/**
* Constants
*/
private static final String CAMERA_POS = "cameraPosition";
private static final String ACTIVITY = "activity";
@SuppressLint("ClickableViewAccessibility")
@Override
protected void onCreate(@Nullable final Bundle savedInstanceState) {
@ -145,8 +166,12 @@ public class LocationPickerActivity extends BaseActivity implements
cameraPosition = getIntent()
.getParcelableExtra(LocationPickerConstants.MAP_CAMERA_POSITION);
activity = getIntent().getStringExtra(LocationPickerConstants.ACTIVITY_KEY);
media = getIntent().getParcelableExtra(LocationPickerConstants.MEDIA);
}else{
cameraPosition = savedInstanceState.getParcelable(CAMERA_POS);
activity = savedInstanceState.getString(ACTIVITY);
media = savedInstanceState.getParcelable("sMedia");
}
bindViews();
addBackButtonListener();
addPlaceSelectedButton();
@ -220,7 +245,10 @@ public class LocationPickerActivity extends BaseActivity implements
*/
private void addBackButtonListener() {
final ImageView backButton = findViewById(R.id.maplibre_place_picker_toolbar_back_button);
backButton.setOnClickListener(view -> finish());
backButton.setOnClickListener(v -> {
finish();
});
}
/**
@ -311,14 +339,42 @@ public class LocationPickerActivity extends BaseActivity implements
+ mapView.getMapCenter().getLongitude());
applicationKvStore.putString(LAST_ZOOM, mapView.getZoomLevel() + "");
}
final Intent returningIntent = new Intent();
returningIntent.putExtra(LocationPickerConstants.MAP_CAMERA_POSITION,
new CameraPosition(new LatLng(mapView.getMapCenter().getLatitude(),
mapView.getMapCenter().getLongitude()), 14f, 0, 0));
setResult(AppCompatActivity.RESULT_OK, returningIntent);
if (media == null) {
final Intent returningIntent = new Intent();
returningIntent.putExtra(LocationPickerConstants.MAP_CAMERA_POSITION,
new CameraPosition(new LatLng(mapView.getMapCenter().getLatitude(),
mapView.getMapCenter().getLongitude()), 14f, 0, 0));
setResult(AppCompatActivity.RESULT_OK, returningIntent);
} else {
updateCoordinates(String.valueOf(mapView.getMapCenter().getLatitude()),
String.valueOf(mapView.getMapCenter().getLongitude()),
String.valueOf(0.0f));
}
finish();
}
/**
* Fetched coordinates are replaced with existing coordinates by a POST API call.
* @param Latitude to be added
* @param Longitude to be added
* @param Accuracy to be added
*/
public void updateCoordinates(final String Latitude, final String Longitude,
final String Accuracy) {
if (media == null) {
return;
}
compositeDisposable.add(coordinateEditHelper.makeCoordinatesEdit(getApplicationContext(),media,
Latitude, Longitude, Accuracy)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(s -> {
Timber.d("Coordinates are added.");
}));
}
/**
* Center the camera on the last saved location
*/
@ -458,4 +514,22 @@ public class LocationPickerActivity extends BaseActivity implements
mapView.getOverlays().add(startMarker);
}
/**
* Saves the state of the activity
* @param outState Bundle
*/
@Override
public void onSaveInstanceState(@NonNull final Bundle outState) {
super.onSaveInstanceState(outState);
if(cameraPosition!=null){
outState.putParcelable(CAMERA_POS, cameraPosition);
}
if(activity!=null){
outState.putString(ACTIVITY, activity);
}
if(media!=null){
outState.putParcelable("sMedia", media);
}
}
}

View file

@ -11,6 +11,9 @@ public final class LocationPickerConstants {
public static final String MAP_CAMERA_POSITION
= "location.picker.cameraPosition";
public static final String MEDIA
= "location.picker.media";
private LocationPickerConstants() {
}

View file

@ -5,23 +5,15 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.FragmentManager;
import com.google.android.material.tabs.TabLayout;
import fr.free.nrw.commons.contributions.MainActivity;
import fr.free.nrw.commons.databinding.FragmentBookmarksBinding;
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
import fr.free.nrw.commons.explore.ParentViewPager;
import fr.free.nrw.commons.kvstore.JsonKvStore;
import fr.free.nrw.commons.theme.BaseActivity;
import javax.inject.Inject;
import butterknife.BindView;
import butterknife.ButterKnife;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.contributions.ContributionController;
import javax.inject.Named;
@ -29,12 +21,7 @@ public class BookmarkFragment extends CommonsDaggerSupportFragment {
private FragmentManager supportFragmentManager;
private BookmarksPagerAdapter adapter;
@BindView(R.id.viewPagerBookmarks)
ParentViewPager viewPager;
@BindView(R.id.tab_layout)
TabLayout tabLayout;
@BindView(R.id.fragmentContainer)
FrameLayout fragmentContainer;
FragmentBookmarksBinding binding;
@Inject
ContributionController controller;
@ -54,7 +41,9 @@ public class BookmarkFragment extends CommonsDaggerSupportFragment {
}
public void setScroll(boolean canScroll) {
viewPager.setCanScroll(canScroll);
if (binding!=null) {
binding.viewPagerBookmarks.setCanScroll(canScroll);
}
}
@Override
@ -68,8 +57,7 @@ public class BookmarkFragment extends CommonsDaggerSupportFragment {
@Nullable final ViewGroup container,
@Nullable final Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View view = inflater.inflate(R.layout.fragment_bookmarks, container, false);
ButterKnife.bind(this, view);
binding = FragmentBookmarksBinding.inflate(inflater, container, false);
// Activity can call methods in the fragment by acquiring a
// reference to the Fragment from FragmentManager, using findFragmentById()
@ -77,14 +65,14 @@ public class BookmarkFragment extends CommonsDaggerSupportFragment {
adapter = new BookmarksPagerAdapter(supportFragmentManager, getContext(),
applicationKvStore.getBoolean("login_skipped"));
viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
binding.viewPagerBookmarks.setAdapter(adapter);
binding.tabLayout.setupWithViewPager(binding.viewPagerBookmarks);
((MainActivity) getActivity()).showTabs();
((BaseActivity) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(false);
setupTabLayout();
return view;
return binding.getRoot();
}
/**
@ -92,15 +80,15 @@ public class BookmarkFragment extends CommonsDaggerSupportFragment {
* visibility of tabLayout to gone.
*/
public void setupTabLayout() {
tabLayout.setVisibility(View.VISIBLE);
binding.tabLayout.setVisibility(View.VISIBLE);
if (adapter.getCount() == 1) {
tabLayout.setVisibility(View.GONE);
binding.tabLayout.setVisibility(View.GONE);
}
}
public void onBackPressed() {
if (((BookmarkListRootFragment) (adapter.getItem(tabLayout.getSelectedTabPosition())))
if (((BookmarkListRootFragment) (adapter.getItem(binding.tabLayout.getSelectedTabPosition())))
.backPressed()) {
// The event is handled internally by the adapter , no further action required.
return;
@ -108,4 +96,10 @@ public class BookmarkFragment extends CommonsDaggerSupportFragment {
// Event is not handled by the adapter ( performed back action ) change action bar.
((BaseActivity) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(false);
}
@Override
public void onDestroy() {
super.onDestroy();
binding = null;
}
}

View file

@ -12,8 +12,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import butterknife.BindView;
import butterknife.ButterKnife;
import fr.free.nrw.commons.Media;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.bookmarks.items.BookmarkItemsFragment;
@ -22,6 +20,7 @@ import fr.free.nrw.commons.bookmarks.pictures.BookmarkPicturesFragment;
import fr.free.nrw.commons.category.CategoryImagesCallback;
import fr.free.nrw.commons.category.GridViewAdapter;
import fr.free.nrw.commons.contributions.MainActivity;
import fr.free.nrw.commons.databinding.FragmentFeaturedRootBinding;
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
import fr.free.nrw.commons.media.MediaDetailPagerFragment;
import fr.free.nrw.commons.navtab.NavTab;
@ -39,8 +38,7 @@ public class BookmarkListRootFragment extends CommonsDaggerSupportFragment imple
public Fragment listFragment;
private BookmarksPagerAdapter bookmarksPagerAdapter;
@BindView(R.id.explore_container)
FrameLayout container;
FragmentFeaturedRootBinding binding;
public BookmarkListRootFragment() {
//empty constructor necessary otherwise crashes on recreate
@ -70,9 +68,8 @@ public class BookmarkListRootFragment extends CommonsDaggerSupportFragment imple
@Nullable final ViewGroup container,
@Nullable final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View view = inflater.inflate(R.layout.fragment_featured_root, container, false);
ButterKnife.bind(this, view);
return view;
binding = FragmentFeaturedRootBinding.inflate(inflater, container, false);
return binding.getRoot();
}
@Override
@ -241,8 +238,8 @@ public class BookmarkListRootFragment extends CommonsDaggerSupportFragment imple
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.d("deneme8", "on media clicked");
container.setVisibility(View.VISIBLE);
((BookmarkFragment) getParentFragment()).tabLayout.setVisibility(View.GONE);
binding.exploreContainer.setVisibility(View.VISIBLE);
((BookmarkFragment) getParentFragment()).binding.tabLayout.setVisibility(View.GONE);
mediaDetails = MediaDetailPagerFragment.newInstance(false, true);
((BookmarkFragment) getParentFragment()).setScroll(false);
setFragment(mediaDetails, listFragment);
@ -253,4 +250,10 @@ public class BookmarkListRootFragment extends CommonsDaggerSupportFragment imple
public void onBackStackChanged() {
}
@Override
public void onDestroy() {
super.onDestroy();
binding = null;
}
}

View file

@ -12,10 +12,9 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView;
import butterknife.ButterKnife;
import dagger.android.support.DaggerFragment;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.databinding.FragmentBookmarksItemsBinding;
import fr.free.nrw.commons.upload.structure.depictions.DepictedItem;
import java.util.List;
import javax.inject.Inject;
@ -26,17 +25,7 @@ import org.jetbrains.annotations.NotNull;
*/
public class BookmarkItemsFragment extends DaggerFragment {
@BindView(R.id.status_message)
TextView statusTextView;
@BindView(R.id.loading_images_progress_bar)
ProgressBar progressBar;
@BindView(R.id.list_view)
RecyclerView recyclerView;
@BindView(R.id.parent_layout)
RelativeLayout parentLayout;
private FragmentBookmarksItemsBinding binding;
@Inject
BookmarkItemsController controller;
@ -51,16 +40,13 @@ public class BookmarkItemsFragment extends DaggerFragment {
final ViewGroup container,
final Bundle savedInstanceState
) {
final View v = inflater.inflate(R.layout.fragment_bookmarks_items, container, false);
ButterKnife.bind(this, v);
return v;
binding = FragmentBookmarksItemsBinding.inflate(inflater, container, false);
return binding.getRoot();
}
@Override
public void onViewCreated(final @NotNull View view, @Nullable final Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
progressBar.setVisibility(View.VISIBLE);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
initList(requireContext());
}
@ -77,13 +63,19 @@ public class BookmarkItemsFragment extends DaggerFragment {
private void initList(final Context context) {
final List<DepictedItem> depictItems = controller.loadFavoritesItems();
final BookmarkItemsAdapter adapter = new BookmarkItemsAdapter(depictItems, context);
recyclerView.setAdapter(adapter);
progressBar.setVisibility(View.GONE);
binding.listView.setAdapter(adapter);
binding.loadingImagesProgressBar.setVisibility(View.GONE);
if (depictItems.isEmpty()) {
statusTextView.setText(R.string.bookmark_empty);
statusTextView.setVisibility(View.VISIBLE);
binding.statusMessage.setText(R.string.bookmark_empty);
binding.statusMessage.setVisibility(View.VISIBLE);
} else {
statusTextView.setVisibility(View.GONE);
binding.statusMessage.setVisibility(View.GONE);
}
}
@Override
public void onDestroy() {
super.onDestroy();
binding = null;
}
}

View file

@ -21,6 +21,7 @@ import butterknife.ButterKnife;
import dagger.android.support.DaggerFragment;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.contributions.ContributionController;
import fr.free.nrw.commons.databinding.FragmentBookmarksLocationsBinding;
import fr.free.nrw.commons.nearby.Place;
import fr.free.nrw.commons.nearby.fragments.CommonPlaceClickActions;
import fr.free.nrw.commons.nearby.fragments.PlaceAdapter;
@ -31,10 +32,7 @@ import kotlin.Unit;
public class BookmarkLocationsFragment extends DaggerFragment {
@BindView(R.id.statusMessage) TextView statusTextView;
@BindView(R.id.loadingImagesProgressBar) ProgressBar progressBar;
@BindView(R.id.listView) RecyclerView recyclerView;
@BindView(R.id.parentLayout) RelativeLayout parentLayout;
public FragmentBookmarksLocationsBinding binding;
@Inject BookmarkLocationsController controller;
@Inject ContributionController contributionController;
@ -75,16 +73,15 @@ public class BookmarkLocationsFragment extends DaggerFragment {
ViewGroup container,
Bundle savedInstanceState
) {
View v = inflater.inflate(R.layout.fragment_bookmarks_locations, container, false);
ButterKnife.bind(this, v);
return v;
binding = FragmentBookmarksLocationsBinding.inflate(inflater, container, false);
return binding.getRoot();
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
progressBar.setVisibility(View.VISIBLE);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
binding.loadingImagesProgressBar.setVisibility(View.VISIBLE);
binding.listView.setLayoutManager(new LinearLayoutManager(getContext()));
adapter = new PlaceAdapter(bookmarkLocationDao,
place -> Unit.INSTANCE,
(place, isBookmarked) -> {
@ -94,7 +91,7 @@ public class BookmarkLocationsFragment extends DaggerFragment {
commonPlaceClickActions,
inAppCameraLocationPermissionLauncher
);
recyclerView.setAdapter(adapter);
binding.listView.setAdapter(adapter);
}
@Override
@ -109,12 +106,12 @@ public class BookmarkLocationsFragment extends DaggerFragment {
private void initList() {
List<Place> places = controller.loadFavoritesLocations();
adapter.setItems(places);
progressBar.setVisibility(View.GONE);
binding.loadingImagesProgressBar.setVisibility(View.GONE);
if (places.size() <= 0) {
statusTextView.setText(R.string.bookmark_empty);
statusTextView.setVisibility(View.VISIBLE);
binding.statusMessage.setText(R.string.bookmark_empty);
binding.statusMessage.setVisibility(View.VISIBLE);
} else {
statusTextView.setVisibility(View.GONE);
binding.statusMessage.setVisibility(View.GONE);
}
}
@ -122,4 +119,10 @@ public class BookmarkLocationsFragment extends DaggerFragment {
public void onActivityResult(int requestCode, int resultCode, Intent data) {
contributionController.handleActivityResult(getActivity(), requestCode, resultCode, data);
}
@Override
public void onDestroy() {
super.onDestroy();
binding = null;
}
}

View file

@ -9,20 +9,15 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.ListAdapter;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import butterknife.BindView;
import butterknife.ButterKnife;
import dagger.android.support.DaggerFragment;
import fr.free.nrw.commons.Media;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.bookmarks.BookmarkListRootFragment;
import fr.free.nrw.commons.category.GridViewAdapter;
import fr.free.nrw.commons.databinding.FragmentBookmarksPicturesBinding;
import fr.free.nrw.commons.utils.NetworkUtils;
import fr.free.nrw.commons.utils.ViewUtil;
import io.reactivex.android.schedulers.AndroidSchedulers;
@ -37,11 +32,7 @@ public class BookmarkPicturesFragment extends DaggerFragment {
private GridViewAdapter gridAdapter;
private CompositeDisposable compositeDisposable = new CompositeDisposable();
@BindView(R.id.statusMessage) TextView statusTextView;
@BindView(R.id.loadingImagesProgressBar) ProgressBar progressBar;
@BindView(R.id.bookmarkedPicturesList) GridView gridView;
@BindView(R.id.parentLayout) RelativeLayout parentLayout;
private FragmentBookmarksPicturesBinding binding;
@Inject
BookmarkPicturesController controller;
@ -59,15 +50,14 @@ public class BookmarkPicturesFragment extends DaggerFragment {
ViewGroup container,
Bundle savedInstanceState
) {
View v = inflater.inflate(R.layout.fragment_bookmarks_pictures, container, false);
ButterKnife.bind(this, v);
return v;
binding = FragmentBookmarksPicturesBinding.inflate(inflater, container, false);
return binding.getRoot();
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
gridView.setOnItemClickListener((AdapterView.OnItemClickListener) getParentFragment());
binding.bookmarkedPicturesList.setOnItemClickListener((AdapterView.OnItemClickListener) getParentFragment());
initList();
}
@ -81,13 +71,14 @@ public class BookmarkPicturesFragment extends DaggerFragment {
public void onDestroy() {
super.onDestroy();
compositeDisposable.clear();
binding = null;
}
@Override
public void onResume() {
super.onResume();
if (controller.needRefreshBookmarkedPictures()) {
gridView.setVisibility(GONE);
binding.bookmarkedPicturesList.setVisibility(GONE);
if (gridAdapter != null) {
gridAdapter.clear();
((BookmarkListRootFragment)getParentFragment()).viewPagerNotifyDataSetChanged();
@ -107,8 +98,8 @@ public class BookmarkPicturesFragment extends DaggerFragment {
return;
}
progressBar.setVisibility(VISIBLE);
statusTextView.setVisibility(GONE);
binding.loadingImagesProgressBar.setVisibility(VISIBLE);
binding.statusMessage.setVisibility(GONE);
compositeDisposable.add(controller.loadBookmarkedPictures()
.subscribeOn(Schedulers.io())
@ -120,12 +111,12 @@ public class BookmarkPicturesFragment extends DaggerFragment {
* Handles the UI updates for no internet scenario
*/
private void handleNoInternet() {
progressBar.setVisibility(GONE);
binding.loadingImagesProgressBar.setVisibility(GONE);
if (gridAdapter == null || gridAdapter.isEmpty()) {
statusTextView.setVisibility(VISIBLE);
statusTextView.setText(getString(R.string.no_internet));
binding.statusMessage.setVisibility(VISIBLE);
binding.statusMessage.setText(getString(R.string.no_internet));
} else {
ViewUtil.showShortSnackbar(parentLayout, R.string.no_internet);
ViewUtil.showShortSnackbar(binding.parentLayout, R.string.no_internet);
}
}
@ -136,7 +127,7 @@ public class BookmarkPicturesFragment extends DaggerFragment {
private void handleError(Throwable throwable) {
Timber.e(throwable, "Error occurred while loading images inside a category");
try{
ViewUtil.showShortSnackbar(parentLayout, R.string.error_loading_images);
ViewUtil.showShortSnackbar(binding.getRoot(), R.string.error_loading_images);
initErrorView();
}catch (Exception e){
e.printStackTrace();
@ -147,12 +138,12 @@ public class BookmarkPicturesFragment extends DaggerFragment {
* Handles the UI updates for a error scenario
*/
private void initErrorView() {
progressBar.setVisibility(GONE);
binding.loadingImagesProgressBar.setVisibility(GONE);
if (gridAdapter == null || gridAdapter.isEmpty()) {
statusTextView.setVisibility(VISIBLE);
statusTextView.setText(getString(R.string.no_images_found));
binding.statusMessage.setVisibility(VISIBLE);
binding.statusMessage.setText(getString(R.string.no_images_found));
} else {
statusTextView.setVisibility(GONE);
binding.statusMessage.setVisibility(GONE);
}
}
@ -160,12 +151,12 @@ public class BookmarkPicturesFragment extends DaggerFragment {
* Handles the UI updates when there is no bookmarks
*/
private void initEmptyBookmarkListView() {
progressBar.setVisibility(GONE);
binding.loadingImagesProgressBar.setVisibility(GONE);
if (gridAdapter == null || gridAdapter.isEmpty()) {
statusTextView.setVisibility(VISIBLE);
statusTextView.setText(getString(R.string.bookmark_empty));
binding.statusMessage.setVisibility(VISIBLE);
binding.statusMessage.setText(getString(R.string.bookmark_empty));
} else {
statusTextView.setVisibility(GONE);
binding.statusMessage.setVisibility(GONE);
}
}
@ -188,18 +179,18 @@ public class BookmarkPicturesFragment extends DaggerFragment {
setAdapter(collection);
} else {
if (gridAdapter.containsAll(collection)) {
progressBar.setVisibility(GONE);
statusTextView.setVisibility(GONE);
gridView.setVisibility(VISIBLE);
gridView.setAdapter(gridAdapter);
binding.loadingImagesProgressBar.setVisibility(GONE);
binding.statusMessage.setVisibility(GONE);
binding.bookmarkedPicturesList.setVisibility(VISIBLE);
binding.bookmarkedPicturesList.setAdapter(gridAdapter);
return;
}
gridAdapter.addItems(collection);
((BookmarkListRootFragment) getParentFragment()).viewPagerNotifyDataSetChanged();
}
progressBar.setVisibility(GONE);
statusTextView.setVisibility(GONE);
gridView.setVisibility(VISIBLE);
binding.loadingImagesProgressBar.setVisibility(GONE);
binding.statusMessage.setVisibility(GONE);
binding.bookmarkedPicturesList.setVisibility(VISIBLE);
}
/**
@ -212,7 +203,7 @@ public class BookmarkPicturesFragment extends DaggerFragment {
R.layout.layout_category_images,
mediaList
);
gridView.setAdapter(gridAdapter);
binding.bookmarkedPicturesList.setAdapter(gridAdapter);
}
/**
@ -221,6 +212,7 @@ public class BookmarkPicturesFragment extends DaggerFragment {
* @return GridView Adapter
*/
public ListAdapter getAdapter() {
return gridView.getAdapter();
return binding.bookmarkedPicturesList.getAdapter();
}
}

View file

@ -15,13 +15,12 @@ import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.viewpager.widget.ViewPager;
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.Utils;
import fr.free.nrw.commons.ViewPagerAdapter;
import fr.free.nrw.commons.databinding.ActivityCategoryDetailsBinding;
import fr.free.nrw.commons.explore.categories.media.CategoriesMediaFragment;
import fr.free.nrw.commons.explore.categories.parent.ParentCategoriesFragment;
import fr.free.nrw.commons.explore.categories.sub.SubCategoriesFragment;
@ -45,23 +44,23 @@ public class CategoryDetailsActivity extends BaseActivity
private CategoriesMediaFragment categoriesMediaFragment;
private MediaDetailPagerFragment mediaDetails;
private String categoryName;
@BindView(R.id.mediaContainer) FrameLayout mediaContainer;
@BindView(R.id.tab_layout) TabLayout tabLayout;
@BindView(R.id.viewPager) ViewPager viewPager;
@BindView(R.id.toolbar) Toolbar toolbar;
ViewPagerAdapter viewPagerAdapter;
private ActivityCategoryDetailsBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_category_details);
ButterKnife.bind(this);
binding = ActivityCategoryDetailsBinding.inflate(getLayoutInflater());
final View view = binding.getRoot();
setContentView(view);
supportFragmentManager = getSupportFragmentManager();
viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(viewPagerAdapter);
viewPager.setOffscreenPageLimit(2);
tabLayout.setupWithViewPager(viewPager);
setSupportActionBar(toolbar);
binding.viewPager.setAdapter(viewPagerAdapter);
binding.viewPager.setOffscreenPageLimit(2);
binding.tabLayout.setupWithViewPager(binding.viewPager);
setSupportActionBar(binding.toolbarBinding.toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
setTabs();
setPageTitle();
@ -110,9 +109,9 @@ public class CategoryDetailsActivity extends BaseActivity
*/
@Override
public void onMediaClicked(int position) {
tabLayout.setVisibility(View.GONE);
viewPager.setVisibility(View.GONE);
mediaContainer.setVisibility(View.VISIBLE);
binding.tabLayout.setVisibility(View.GONE);
binding.viewPager.setVisibility(View.GONE);
binding.mediaContainer.setVisibility(View.VISIBLE);
if (mediaDetails == null || !mediaDetails.isVisible()) {
// set isFeaturedImage true for featured images, to include author field on media detail
mediaDetails = MediaDetailPagerFragment.newInstance(false, true);
@ -216,9 +215,9 @@ public class CategoryDetailsActivity extends BaseActivity
@Override
public void onBackPressed() {
if (supportFragmentManager.getBackStackEntryCount() == 1){
tabLayout.setVisibility(View.VISIBLE);
viewPager.setVisibility(View.VISIBLE);
mediaContainer.setVisibility(View.GONE);
binding.tabLayout.setVisibility(View.VISIBLE);
binding.viewPager.setVisibility(View.VISIBLE);
binding.mediaContainer.setVisibility(View.GONE);
}
super.onBackPressed();
}

View file

@ -12,14 +12,12 @@ import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AlertDialog.Builder;
import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import com.facebook.drawee.view.SimpleDraweeView;
import com.facebook.imagepipeline.request.ImageRequest;
import com.facebook.imagepipeline.request.ImageRequestBuilder;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.contributions.ContributionsListAdapter.Callback;
import fr.free.nrw.commons.databinding.LayoutContributionBinding;
import fr.free.nrw.commons.media.MediaClient;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
@ -29,29 +27,8 @@ import java.io.File;
public class ContributionViewHolder extends RecyclerView.ViewHolder {
private final Callback callback;
@BindView(R.id.contributionImage)
SimpleDraweeView imageView;
@BindView(R.id.contributionTitle)
TextView titleView;
@BindView(R.id.authorView)
TextView authorView;
@BindView(R.id.contributionState)
TextView stateView;
@BindView(R.id.contributionSequenceNumber)
TextView seqNumView;
@BindView(R.id.contributionProgress)
ProgressBar progressView;
@BindView(R.id.image_options)
RelativeLayout imageOptions;
@BindView(R.id.wikipediaButton)
ImageButton addToWikipediaButton;
@BindView(R.id.retryButton)
ImageButton retryButton;
@BindView(R.id.cancelButton)
ImageButton cancelButton;
@BindView(R.id.pauseResumeButton)
ImageButton pauseResumeButton;
LayoutContributionBinding binding;
private int position;
private Contribution contribution;
@ -67,9 +44,16 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
super(parent);
this.parent = parent;
this.mediaClient = mediaClient;
ButterKnife.bind(this, parent);
this.callback = callback;
binding = LayoutContributionBinding.bind(parent);
binding.retryButton.setOnClickListener(v -> retryUpload());
binding.cancelButton.setOnClickListener(v -> deleteUpload());
binding.contributionImage.setOnClickListener(v -> imageClicked());
binding.wikipediaButton.setOnClickListener(v -> wikipediaButtonClicked());
binding.pauseResumeButton.setOnClickListener(v -> onPauseResumeButtonClicked());
/* Set a dialog indicating that the upload is being paused. This is needed because pausing
an upload might take a dozen seconds. */
AlertDialog.Builder builder = new Builder(parent.getContext());
@ -87,14 +71,17 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
this.contribution = contribution;
this.position = position;
titleView.setText(contribution.getMedia().getMostRelevantCaption());
authorView.setText(contribution.getMedia().getAuthor());
binding.contributionTitle.setText(contribution.getMedia().getMostRelevantCaption());
binding.authorView.setText(contribution.getMedia().getAuthor());
//Removes flicker of loading image.
imageView.getHierarchy().setFadeDuration(0);
binding.contributionImage.getHierarchy().setFadeDuration(0);
imageView.getHierarchy().setPlaceholderImage(R.drawable.image_placeholder);
imageView.getHierarchy().setFailureImage(R.drawable.image_placeholder);
binding.contributionImage.getHierarchy().setPlaceholderImage(R.drawable.image_placeholder);
binding.contributionImage.getHierarchy().setFailureImage(R.drawable.image_placeholder);
final String imageSource = chooseImageSource(contribution.getMedia().getThumbUrl(),
contribution.getLocalUri());
@ -109,67 +96,67 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
}
if(imageRequest != null){
imageView.setImageRequest(imageRequest);
binding.contributionImage.setImageRequest(imageRequest);
}
}
seqNumView.setText(String.valueOf(position + 1));
seqNumView.setVisibility(View.VISIBLE);
binding.contributionSequenceNumber.setText(String.valueOf(position + 1));
binding.contributionSequenceNumber.setVisibility(View.VISIBLE);
addToWikipediaButton.setVisibility(View.GONE);
binding.wikipediaButton.setVisibility(View.GONE);
switch (contribution.getState()) {
case Contribution.STATE_COMPLETED:
stateView.setVisibility(View.GONE);
progressView.setVisibility(View.GONE);
imageOptions.setVisibility(View.GONE);
stateView.setText("");
binding.contributionState.setVisibility(View.GONE);
binding.contributionProgress.setVisibility(View.GONE);
binding.imageOptions.setVisibility(View.GONE);
binding.contributionState.setText("");
checkIfMediaExistsOnWikipediaPage(contribution);
break;
case Contribution.STATE_QUEUED:
case Contribution.STATE_QUEUED_LIMITED_CONNECTION_MODE:
progressView.setVisibility(View.GONE);
stateView.setVisibility(View.VISIBLE);
stateView.setText(R.string.contribution_state_queued);
imageOptions.setVisibility(View.GONE);
binding.contributionProgress.setVisibility(View.GONE);
binding.contributionState.setVisibility(View.VISIBLE);
binding.contributionState.setText(R.string.contribution_state_queued);
binding.imageOptions.setVisibility(View.GONE);
break;
case Contribution.STATE_IN_PROGRESS:
stateView.setVisibility(View.GONE);
progressView.setVisibility(View.VISIBLE);
addToWikipediaButton.setVisibility(View.GONE);
pauseResumeButton.setVisibility(View.VISIBLE);
cancelButton.setVisibility(View.GONE);
retryButton.setVisibility(View.GONE);
imageOptions.setVisibility(View.VISIBLE);
binding.contributionState.setVisibility(View.GONE);
binding.contributionProgress.setVisibility(View.VISIBLE);
binding.wikipediaButton.setVisibility(View.GONE);
binding.pauseResumeButton.setVisibility(View.VISIBLE);
binding.cancelButton.setVisibility(View.GONE);
binding.retryButton.setVisibility(View.GONE);
binding.imageOptions.setVisibility(View.VISIBLE);
final long total = contribution.getDataLength();
final long transferred = contribution.getTransferred();
if (transferred == 0 || transferred >= total) {
progressView.setIndeterminate(true);
binding.contributionProgress.setIndeterminate(true);
} else {
progressView.setIndeterminate(false);
progressView.setProgress((int) (((double) transferred / (double) total) * 100));
binding.contributionProgress.setIndeterminate(false);
binding.contributionProgress.setProgress((int) (((double) transferred / (double) total) * 100));
}
break;
case Contribution.STATE_PAUSED:
progressView.setVisibility(View.GONE);
stateView.setVisibility(View.VISIBLE);
stateView.setText(R.string.paused);
cancelButton.setVisibility(View.VISIBLE);
retryButton.setVisibility(View.GONE);
pauseResumeButton.setVisibility(View.VISIBLE);
imageOptions.setVisibility(View.VISIBLE);
binding.contributionProgress.setVisibility(View.GONE);
binding.contributionState.setVisibility(View.VISIBLE);
binding.contributionState.setText(R.string.paused);
binding.cancelButton.setVisibility(View.VISIBLE);
binding.retryButton.setVisibility(View.GONE);
binding.pauseResumeButton.setVisibility(View.VISIBLE);
binding.imageOptions.setVisibility(View.VISIBLE);
setResume();
if(pausingPopUp.isShowing()){
pausingPopUp.hide();
}
break;
case Contribution.STATE_FAILED:
stateView.setVisibility(View.VISIBLE);
stateView.setText(R.string.contribution_state_failed);
progressView.setVisibility(View.GONE);
cancelButton.setVisibility(View.VISIBLE);
retryButton.setVisibility(View.VISIBLE);
pauseResumeButton.setVisibility(View.GONE);
imageOptions.setVisibility(View.VISIBLE);
binding.contributionState.setVisibility(View.VISIBLE);
binding.contributionState.setText(R.string.contribution_state_failed);
binding.contributionProgress.setVisibility(View.GONE);
binding.cancelButton.setVisibility(View.VISIBLE);
binding.retryButton.setVisibility(View.VISIBLE);
binding.pauseResumeButton.setVisibility(View.GONE);
binding.imageOptions.setVisibility(View.VISIBLE);
break;
}
}
@ -203,11 +190,11 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
*/
private void displayWikipediaButton(Boolean mediaExists) {
if (!mediaExists) {
addToWikipediaButton.setVisibility(View.VISIBLE);
binding.wikipediaButton.setVisibility(View.VISIBLE);
isWikipediaButtonDisplayed = true;
cancelButton.setVisibility(View.GONE);
retryButton.setVisibility(View.GONE);
imageOptions.setVisibility(View.VISIBLE);
binding.cancelButton.setVisibility(View.GONE);
binding.retryButton.setVisibility(View.GONE);
binding.imageOptions.setVisibility(View.VISIBLE);
}
}
@ -229,7 +216,6 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
/**
* Retry upload when it is failed
*/
@OnClick(R.id.retryButton)
public void retryUpload() {
callback.retryUpload(contribution);
}
@ -237,17 +223,14 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
/**
* Delete a failed upload attempt
*/
@OnClick(R.id.cancelButton)
public void deleteUpload() {
callback.deleteUpload(contribution);
}
@OnClick(R.id.contributionImage)
public void imageClicked() {
callback.openMediaDetail(position, isWikipediaButtonDisplayed);
}
@OnClick(R.id.wikipediaButton)
public void wikipediaButtonClicked() {
callback.addImageToWikipedia(contribution);
}
@ -255,9 +238,8 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
/**
* Triggers a callback for pause/resume
*/
@OnClick(R.id.pauseResumeButton)
public void onPauseResumeButtonClicked() {
if (pauseResumeButton.getTag().toString().equals("pause")) {
if (binding.pauseResumeButton.getTag().toString().equals("pause")) {
pause();
} else {
resume();
@ -279,16 +261,16 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
* Update pause/resume button to show pause state
*/
private void setPaused() {
pauseResumeButton.setImageResource(R.drawable.pause_icon);
pauseResumeButton.setTag(parent.getContext().getString(R.string.pause));
binding.pauseResumeButton.setImageResource(R.drawable.pause_icon);
binding.pauseResumeButton.setTag(parent.getContext().getString(R.string.pause));
}
/**
* Update pause/resume button to show resume state
*/
private void setResume() {
pauseResumeButton.setImageResource(R.drawable.play_icon);
pauseResumeButton.setTag(parent.getContext().getString(R.string.resume));
binding.pauseResumeButton.setImageResource(R.drawable.play_icon);
binding.pauseResumeButton.setTag(parent.getContext().getString(R.string.resume));
}
public ImageRequest getImageRequest() {

View file

@ -39,6 +39,7 @@ import androidx.fragment.app.FragmentTransaction;
import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.Utils;
import fr.free.nrw.commons.auth.SessionManager;
import fr.free.nrw.commons.databinding.FragmentContributionsBinding;
import fr.free.nrw.commons.notification.models.Notification;
import fr.free.nrw.commons.notification.NotificationController;
import fr.free.nrw.commons.profile.ProfileActivity;
@ -49,8 +50,6 @@ import java.util.Map;
import javax.inject.Inject;
import javax.inject.Named;
import androidx.work.WorkManager;
import butterknife.BindView;
import butterknife.ButterKnife;
import fr.free.nrw.commons.Media;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.campaigns.models.Campaign;
@ -106,10 +105,8 @@ public class ContributionsFragment
static final String MEDIA_DETAIL_PAGER_FRAGMENT_TAG = "MediaDetailFragmentTag";
private static final int MAX_RETRIES = 10;
@BindView(R.id.card_view_nearby) public NearbyNotificationCardView nearbyNotificationCardView;
@BindView(R.id.campaigns_view) CampaignView campaignView;
@BindView(R.id.limited_connection_enabled_layout) LinearLayout limitedConnectionEnabledLayout;
@BindView(R.id.limited_connection_description_text_view) TextView limitedConnectionDescriptionTextView;
public FragmentContributionsBinding binding;
@Inject ContributionsPresenter contributionsPresenter;
@ -147,7 +144,7 @@ public class ContributionsFragment
&& store.getBoolean("displayLocationPermissionForCardView", true)
&& !store.getBoolean("doNotAskForLocationPermission", false)
&& (((MainActivity) getActivity()).activeFragment == ActiveFragment.CONTRIBUTIONS)) {
nearbyNotificationCardView.permissionType = NearbyNotificationCardView.PermissionType.ENABLE_LOCATION_PERMISSION;
binding.cardViewNearby.permissionType = NearbyNotificationCardView.PermissionType.ENABLE_LOCATION_PERMISSION;
showNearbyCardPermissionRationale();
} else {
displayYouWontSeeNearbyMessage();
@ -179,12 +176,13 @@ public class ContributionsFragment
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_contributions, container, false);
ButterKnife.bind(this, view);
binding = FragmentContributionsBinding.inflate(inflater, container, false);
initWLMCampaign();
presenter.onAttachView(this);
contributionsPresenter.onAttachView(this);
campaignView.setVisibility(View.GONE);
binding.campaignsView.setVisibility(View.GONE);
checkBoxView = View.inflate(getActivity(), R.layout.nearby_permission_dialog, null);
checkBox = (CheckBox) checkBoxView.findViewById(R.id.never_ask_again);
checkBox.setOnCheckedChangeListener((buttonView, isChecked) -> {
@ -204,7 +202,7 @@ public class ContributionsFragment
initFragments();
if(isUserProfile) {
limitedConnectionEnabledLayout.setVisibility(View.GONE);
binding.limitedConnectionEnabledLayout.setVisibility(View.GONE);
}else {
upDateUploadCount();
}
@ -221,9 +219,9 @@ public class ContributionsFragment
&& sessionManager.getCurrentAccount() != null && !isUserProfile) {
setUploadCount();
}
limitedConnectionEnabledLayout.setOnClickListener(toggleDescriptionListener);
binding.limitedConnectionEnabledLayout.setOnClickListener(toggleDescriptionListener);
setHasOptionsMenu(true);
return view;
return binding.getRoot();
}
/**
@ -283,22 +281,17 @@ public class ContributionsFragment
.getBoolean(CommonsApplication.IS_LIMITED_CONNECTION_MODE_ENABLED, false);
checkable.setChecked(isEnabled);
if (isEnabled) {
limitedConnectionEnabledLayout.setVisibility(View.VISIBLE);
} else {
limitedConnectionEnabledLayout.setVisibility(View.GONE);
if (binding!=null) {
binding.limitedConnectionEnabledLayout.setVisibility(isEnabled ? View.VISIBLE : View.GONE);
}
checkable.setIcon((isEnabled) ? R.drawable.ic_baseline_cloud_off_24:R.drawable.ic_baseline_cloud_queue_24);
checkable.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
((MainActivity) getActivity()).toggleLimitedConnectionMode();
boolean isEnabled = store.getBoolean(CommonsApplication.IS_LIMITED_CONNECTION_MODE_ENABLED, false);
if (isEnabled) {
limitedConnectionEnabledLayout.setVisibility(View.VISIBLE);
} else {
limitedConnectionEnabledLayout.setVisibility(View.GONE);
}
binding.limitedConnectionEnabledLayout.setVisibility(isEnabled ? View.VISIBLE : View.GONE);
checkable.setIcon((isEnabled) ? R.drawable.ic_baseline_cloud_off_24:R.drawable.ic_baseline_cloud_queue_24);
return false;
}
@ -326,14 +319,14 @@ public class ContributionsFragment
*/
private void showContributionsListFragment() {
// show nearby card view on contributions list is visible
if (nearbyNotificationCardView != null && !isUserProfile) {
if (binding.cardViewNearby != null && !isUserProfile) {
if (store.getBoolean("displayNearbyCardView", true)) {
if (nearbyNotificationCardView.cardViewVisibilityState
if (binding.cardViewNearby.cardViewVisibilityState
== NearbyNotificationCardView.CardViewVisibilityState.READY) {
nearbyNotificationCardView.setVisibility(View.VISIBLE);
binding.cardViewNearby.setVisibility(View.VISIBLE);
}
} else {
nearbyNotificationCardView.setVisibility(View.GONE);
binding.cardViewNearby.setVisibility(View.GONE);
}
}
showFragment(contributionsListFragment, CONTRIBUTION_LIST_FRAGMENT_TAG, mediaDetailPagerFragment);
@ -346,8 +339,9 @@ public class ContributionsFragment
}
private void setupViewForMediaDetails() {
campaignView.setVisibility(View.GONE);
nearbyNotificationCardView.setVisibility(View.GONE);
if (binding!=null) {
binding.campaignsView.setVisibility(View.GONE);
}
}
@Override
@ -453,7 +447,12 @@ public class ContributionsFragment
super.onResume();
contributionsPresenter.onAttachView(this);
locationManager.addLocationListener(this);
nearbyNotificationCardView.permissionRequestButton.setOnClickListener(v -> {
if (binding==null) {
return;
}
binding.cardViewNearby.permissionRequestButton.setOnClickListener(v -> {
showNearbyCardPermissionRationale();
});
@ -468,13 +467,13 @@ public class ContributionsFragment
} catch (Exception e) {
Timber.e(e);
}
if (nearbyNotificationCardView.cardViewVisibilityState == NearbyNotificationCardView.CardViewVisibilityState.READY) {
nearbyNotificationCardView.setVisibility(View.VISIBLE);
if (binding.cardViewNearby.cardViewVisibilityState == NearbyNotificationCardView.CardViewVisibilityState.READY) {
binding.cardViewNearby.setVisibility(View.VISIBLE);
}
} else {
// Hide nearby notification card view if related shared preferences is false
nearbyNotificationCardView.setVisibility(View.GONE);
binding.cardViewNearby.setVisibility(View.GONE);
}
// Notification Count and Campaigns should not be set, if it is used in User Profile
@ -493,7 +492,7 @@ public class ContributionsFragment
&& store.getBoolean("displayLocationPermissionForCardView", true)
&& !store.getBoolean("doNotAskForLocationPermission", false)
&& (((MainActivity) getActivity()).activeFragment == ActiveFragment.CONTRIBUTIONS)) {
nearbyNotificationCardView.permissionType = NearbyNotificationCardView.PermissionType.ENABLE_LOCATION_PERMISSION;
binding.cardViewNearby.permissionType = NearbyNotificationCardView.PermissionType.ENABLE_LOCATION_PERMISSION;
showNearbyCardPermissionRationale();
}
}
@ -503,7 +502,7 @@ public class ContributionsFragment
}
private void onLocationPermissionGranted() {
nearbyNotificationCardView.permissionType = NearbyNotificationCardView.PermissionType.NO_PERMISSION_NEEDED;
binding.cardViewNearby.permissionType = NearbyNotificationCardView.PermissionType.NO_PERMISSION_NEEDED;
locationManager.registerLocationManager();
}
@ -548,21 +547,21 @@ public class ContributionsFragment
}
if(closestNearbyPlace == null) {
nearbyNotificationCardView.setVisibility(View.GONE);
binding.cardViewNearby.setVisibility(View.GONE);
}else{
String distance = formatDistanceBetween(curLatLng, closestNearbyPlace.location);
closestNearbyPlace.setDistance(distance);
direction = (float) computeBearing(curLatLng, closestNearbyPlace.location);
nearbyNotificationCardView.updateContent(closestNearbyPlace);
binding.cardViewNearby.updateContent(closestNearbyPlace);
}
} else {
// Means that no close nearby place is found
nearbyNotificationCardView.setVisibility(View.GONE);
binding.cardViewNearby.setVisibility(View.GONE);
}
// Prevent Nearby banner from appearing in Media Details, fixing bug https://github.com/commons-app/apps-android-commons/issues/4731
if (mediaDetailPagerFragment != null && !contributionsListFragment.isVisible()) {
nearbyNotificationCardView.setVisibility(View.GONE);
binding.cardViewNearby.setVisibility(View.GONE);
}
}
@ -614,12 +613,16 @@ public class ContributionsFragment
*/
private void fetchCampaigns() {
if (Utils.isMonumentsEnabled(new Date())) {
campaignView.setCampaign(wlmCampaign);
campaignView.setVisibility(View.VISIBLE);
if (binding!=null) {
binding.campaignsView.setCampaign(wlmCampaign);
binding.campaignsView.setVisibility(View.VISIBLE);
}
} else if (store.getBoolean(CampaignView.CAMPAIGNS_DEFAULT_PREFERENCE, true)) {
presenter.getCampaigns();
} else {
campaignView.setVisibility(View.GONE);
if (binding!=null) {
binding.campaignsView.setVisibility(View.GONE);
}
}
}
@ -629,7 +632,9 @@ public class ContributionsFragment
@Override public void showCampaigns(Campaign campaign) {
if (campaign != null && !isUserProfile) {
campaignView.setCampaign(campaign);
if (binding!=null) {
binding.campaignsView.setCampaign(campaign);
}
}
}
@ -746,11 +751,11 @@ public class ContributionsFragment
public boolean backButtonClicked() {
if (mediaDetailPagerFragment != null && mediaDetailPagerFragment.isVisible()) {
if (store.getBoolean("displayNearbyCardView", true) && !isUserProfile) {
if (nearbyNotificationCardView.cardViewVisibilityState == NearbyNotificationCardView.CardViewVisibilityState.READY) {
nearbyNotificationCardView.setVisibility(View.VISIBLE);
if (binding.cardViewNearby.cardViewVisibilityState == NearbyNotificationCardView.CardViewVisibilityState.READY) {
binding.cardViewNearby.setVisibility(View.VISIBLE);
}
} else {
nearbyNotificationCardView.setVisibility(View.GONE);
binding.cardViewNearby.setVisibility(View.GONE);
}
removeFragment(mediaDetailPagerFragment);
showFragment(contributionsListFragment, CONTRIBUTION_LIST_FRAGMENT_TAG, mediaDetailPagerFragment);
@ -812,7 +817,7 @@ public class ContributionsFragment
@Override
public void onClick(View view) {
View view2 = limitedConnectionDescriptionTextView;
View view2 = binding.limitedConnectionDescriptionTextView;
if (view2.getVisibility() == View.GONE) {
view2.setVisibility(View.VISIBLE);
} else {
@ -827,7 +832,7 @@ public class ContributionsFragment
@Override
public void onSensorChanged(SensorEvent event) {
float rotateDegree = Math.round(event.values[0]);
nearbyNotificationCardView.rotateCompass(rotateDegree, direction);
binding.cardViewNearby.rotateCompass(rotateDegree, direction);
}
@Override

View file

@ -12,15 +12,13 @@ import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.FrameLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.viewpager.widget.ViewPager;
import androidx.work.ExistingWorkPolicy;
import butterknife.BindView;
import butterknife.ButterKnife;
import fr.free.nrw.commons.databinding.MainBinding;
import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.WelcomeActivity;
@ -63,14 +61,6 @@ public class MainActivity extends BaseActivity
ContributionController controller;
@Inject
ContributionDao contributionDao;
@BindView(R.id.toolbar)
Toolbar toolbar;
@BindView(R.id.pager)
public UnswipableViewPager viewPager;
@BindView(R.id.fragmentContainer)
public FrameLayout fragmentContainer;
@BindView(R.id.fragment_main_nav_tab_layout)
NavTabLayout tabLayout;
private ContributionsFragment contributionsFragment;
private NearbyParentFragment nearbyParentFragment;
@ -95,6 +85,11 @@ public class MainActivity extends BaseActivity
public Menu menu;
public MainBinding binding;
NavTabLayout tabLayout;
/**
* Consumers should be simply using this method to use this activity.
*
@ -122,11 +117,13 @@ public class MainActivity extends BaseActivity
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = MainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
setSupportActionBar(binding.toolbarBinding.toolbar);
tabLayout = binding.fragmentMainNavTabLayout;
loadLocale();
setContentView(R.layout.main);
ButterKnife.bind(this);
setSupportActionBar(toolbar);
toolbar.setNavigationOnClickListener(view -> {
binding.toolbarBinding.toolbar.setNavigationOnClickListener(view -> {
onSupportNavigateUp();
});
/*
@ -177,11 +174,11 @@ public class MainActivity extends BaseActivity
}
public void setSelectedItemId(int id) {
tabLayout.setSelectedItemId(id);
binding.fragmentMainNavTabLayout.setSelectedItemId(id);
}
private void setUpPager() {
tabLayout.setOnNavigationItemSelectedListener(navListener = (item) -> {
binding.fragmentMainNavTabLayout.setOnNavigationItemSelectedListener(navListener = (item) -> {
if (!item.getTitle().equals(getString(R.string.more))) {
// do not change title for more fragment
setTitle(item.getTitle());
@ -196,7 +193,7 @@ public class MainActivity extends BaseActivity
private void setUpLoggedOutPager() {
loadFragment(ExploreFragment.newInstance(),false);
tabLayout.setOnNavigationItemSelectedListener(item -> {
binding.fragmentMainNavTabLayout.setOnNavigationItemSelectedListener(item -> {
if (!item.getTitle().equals(getString(R.string.more))) {
// do not change title for more fragment
setTitle(item.getTitle());
@ -258,11 +255,11 @@ public class MainActivity extends BaseActivity
}
public void hideTabs() {
tabLayout.setVisibility(View.GONE);
binding.fragmentMainNavTabLayout.setVisibility(View.GONE);
}
public void showTabs() {
tabLayout.setVisibility(View.VISIBLE);
binding.fragmentMainNavTabLayout.setVisibility(View.VISIBLE);
}
/**
@ -317,7 +314,7 @@ public class MainActivity extends BaseActivity
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("viewPagerCurrentItem", viewPager.getCurrentItem());
outState.putInt("viewPagerCurrentItem", binding.pager.getCurrentItem());
outState.putString("activeFragment", activeFragment.name());
}
@ -472,7 +469,7 @@ public class MainActivity extends BaseActivity
* Public method to show nearby from the reference of this.
*/
public void showNearby() {
tabLayout.setSelectedItemId(NavTab.NEARBY.code());
binding.fragmentMainNavTabLayout.setSelectedItemId(NavTab.NEARBY.code());
}
public enum ActiveFragment {

View file

@ -119,6 +119,7 @@ class ImageAdapter(
* Bind View holder, load image, selected view, click listeners.
*/
override fun onBindViewHolder(holder: ImageViewHolder, position: Int) {
var image=images[position]
holder.image.setImageDrawable (null)
if (context.contentResolver.getType(image.uri) == null) {
@ -174,9 +175,11 @@ class ImageAdapter(
// inside map, so it will fetch the image from the map and load in the holder
} else {
val actionableImages: List<Image> = ArrayList(actionableImagesMap.values)
image = actionableImages[position]
Glide.with(holder.image).load(image.uri)
.thumbnail(0.3f).into(holder.image)
if(actionableImages.size > position) {
image = actionableImages[position]
Glide.with(holder.image).load(image.uri)
.thumbnail(0.3f).into(holder.image)
}
}
// If switch is turned off, it just fetches the image from all images without any
@ -364,6 +367,48 @@ class ImageAdapter(
notifyDataSetChanged()
}
/**
* Clear selected images and empty the list.
*/
fun clearSelectedImages(){
numberOfSelectedImagesMarkedAsNotForUpload = 0
selectedImages.clear()
selectedImages = arrayListOf()
}
/**
* Remove image from actionable images map.
*/
fun removeImageFromActionableImageMap(image: Image) {
val sharedPreferences: SharedPreferences =
context.getSharedPreferences(CUSTOM_SELECTOR_PREFERENCE_KEY, 0)
val showAlreadyActionedImages =
sharedPreferences.getBoolean(SHOW_ALREADY_ACTIONED_IMAGES_PREFERENCE_KEY, true)
if(showAlreadyActionedImages) {
refresh(allImages, allImages)
} else {
val iterator = actionableImagesMap.entries.iterator()
var index = 0
while (iterator.hasNext()) {
val entry = iterator.next()
if (entry.value == image) {
imagePositionAsPerIncreasingOrder -= 2
iterator.remove()
alreadyAddedPositions.removeAt(alreadyAddedPositions.size - 1)
notifyItemRemoved(index)
notifyItemRangeChanged(index, itemCount )
break
}
index++
}
}
}
/**
* Returns the total number of items in the data set held by the adapter.
*
@ -511,4 +556,4 @@ class ImageAdapter(
return images[position].date
}
}
}

View file

@ -276,8 +276,10 @@ class CustomSelectorActivity : BaseActivity(), FolderClickListener, ImageSelectL
imageSHA1
)
)
}
imageFragment!!.removeImage(it)
}
imageFragment!!.clearSelectedImages()
// if all images is already marked as not for upload, delete all images from
// not for upload table
} else {
@ -290,9 +292,9 @@ class CustomSelectorActivity : BaseActivity(), FolderClickListener, ImageSelectL
)
notForUploadStatusDao.deleteNotForUploadWithImageSHA1(imageSHA1)
}
imageFragment!!.refresh()
}
imageFragment!!.refresh()
imageFragment!!.dismissMarkUnmarkProgressDialog()
val bottomLayout: ConstraintLayout = findViewById(R.id.bottom_layout)
@ -497,4 +499,4 @@ class CustomSelectorActivity : BaseActivity(), FolderClickListener, ImageSelectL
const val FOLDER_NAME: String = "FolderName"
const val ITEM_ID: String = "ItemId"
}
}
}

View file

@ -339,6 +339,19 @@ class ImageFragment : CommonsDaggerSupportFragment(), RefreshUIListener, PassDat
imageAdapter.refresh(filteredImages, allImages)
}
/**
* Removes the image from the actionable image map
*/
fun removeImage(image : Image){
imageAdapter.removeImageFromActionableImageMap(image)
}
/**
* Clears the selected images
*/
fun clearSelectedImages() {
imageAdapter.clearSelectedImages()
}
/**
* Passes selected images and other information from Activity to Fragment and connects it with
* the adapter
@ -371,4 +384,4 @@ class ImageFragment : CommonsDaggerSupportFragment(), RefreshUIListener, PassDat
}
}
}
}

View file

@ -11,12 +11,11 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.viewpager.widget.ViewPager.OnPageChangeListener;
import butterknife.BindView;
import butterknife.ButterKnife;
import com.google.android.material.tabs.TabLayout;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.ViewPagerAdapter;
import fr.free.nrw.commons.contributions.MainActivity;
import fr.free.nrw.commons.databinding.FragmentExploreBinding;
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
import fr.free.nrw.commons.kvstore.JsonKvStore;
import fr.free.nrw.commons.theme.BaseActivity;
@ -33,10 +32,8 @@ public class ExploreFragment extends CommonsDaggerSupportFragment {
private static final String EXPLORE_MAP = "Map";
private static final String MEDIA_DETAILS_FRAGMENT_TAG = "MediaDetailsFragment";
@BindView(R.id.tab_layout)
TabLayout tabLayout;
@BindView(R.id.viewPager)
ParentViewPager viewPager;
public FragmentExploreBinding binding;
ViewPagerAdapter viewPagerAdapter;
private ExploreListRootFragment featuredRootFragment;
private ExploreListRootFragment mobileRootFragment;
@ -46,7 +43,10 @@ public class ExploreFragment extends CommonsDaggerSupportFragment {
public JsonKvStore applicationKvStore;
public void setScroll(boolean canScroll){
viewPager.setCanScroll(canScroll);
if (binding != null)
{
binding.viewPager.setCanScroll(canScroll);
}
}
@NonNull
@ -56,22 +56,17 @@ public class ExploreFragment extends CommonsDaggerSupportFragment {
return fragment;
}
@Override
public void onCreate(@Nullable final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View view = inflater.inflate(R.layout.fragment_explore, container, false);
ButterKnife.bind(this, view);
binding = FragmentExploreBinding.inflate(inflater, container, false);
viewPagerAdapter = new ViewPagerAdapter(getChildFragmentManager());
viewPager.setAdapter(viewPagerAdapter);
viewPager.setId(R.id.viewPager);
tabLayout.setupWithViewPager(viewPager);
viewPager.addOnPageChangeListener(new OnPageChangeListener() {
binding.viewPager.setAdapter(viewPagerAdapter);
binding.viewPager.setId(R.id.viewPager);
binding.tabLayout.setupWithViewPager(binding.viewPager);
binding.viewPager.addOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
@ -81,9 +76,9 @@ public class ExploreFragment extends CommonsDaggerSupportFragment {
@Override
public void onPageSelected(int position) {
if (position == 2) {
viewPager.setCanScroll(false);
binding.viewPager.setCanScroll(false);
} else {
viewPager.setCanScroll(true);
binding.viewPager.setCanScroll(true);
}
}
@ -94,7 +89,7 @@ public class ExploreFragment extends CommonsDaggerSupportFragment {
});
setTabs();
setHasOptionsMenu(true);
return view;
return binding.getRoot();
}
/**
@ -133,13 +128,13 @@ public class ExploreFragment extends CommonsDaggerSupportFragment {
}
public boolean onBackPressed() {
if (tabLayout.getSelectedTabPosition() == 0) {
if (binding.tabLayout.getSelectedTabPosition() == 0) {
if (featuredRootFragment.backPressed()) {
((BaseActivity) getActivity()).getSupportActionBar()
.setDisplayHomeAsUpEnabled(false);
return true;
}
} else if (tabLayout.getSelectedTabPosition() == 1) { //Mobile root fragment
} else if (binding.tabLayout.getSelectedTabPosition() == 1) { //Mobile root fragment
if (mobileRootFragment.backPressed()) {
((BaseActivity) getActivity()).getSupportActionBar()
.setDisplayHomeAsUpEnabled(false);
@ -180,6 +175,12 @@ public class ExploreFragment extends CommonsDaggerSupportFragment {
return super.onOptionsItemSelected(item);
}
}
@Override
public void onDestroy() {
super.onDestroy();
binding = null;
}
}

View file

@ -9,12 +9,11 @@ import android.widget.FrameLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import butterknife.BindView;
import butterknife.ButterKnife;
import fr.free.nrw.commons.Media;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.category.CategoryImagesCallback;
import fr.free.nrw.commons.contributions.MainActivity;
import fr.free.nrw.commons.databinding.FragmentFeaturedRootBinding;
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
import fr.free.nrw.commons.explore.categories.media.CategoriesMediaFragment;
import fr.free.nrw.commons.media.MediaDetailPagerFragment;
@ -26,8 +25,7 @@ public class ExploreListRootFragment extends CommonsDaggerSupportFragment implem
private MediaDetailPagerFragment mediaDetails;
private CategoriesMediaFragment listFragment;
@BindView(R.id.explore_container)
FrameLayout container;
private FragmentFeaturedRootBinding binding;
public ExploreListRootFragment() {
//empty constructor necessary otherwise crashes on recreate
@ -47,9 +45,9 @@ public class ExploreListRootFragment extends CommonsDaggerSupportFragment implem
@Nullable final ViewGroup container,
@Nullable final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View view = inflater.inflate(R.layout.fragment_featured_root, container, false);
ButterKnife.bind(this, view);
return view;
binding = FragmentFeaturedRootBinding.inflate(inflater, container, false);
return binding.getRoot();
}
@Override
@ -109,8 +107,12 @@ public class ExploreListRootFragment extends CommonsDaggerSupportFragment implem
@Override
public void onMediaClicked(int position) {
container.setVisibility(View.VISIBLE);
((ExploreFragment) getParentFragment()).tabLayout.setVisibility(View.GONE);
if (binding!=null) {
binding.exploreContainer.setVisibility(View.VISIBLE);
}
if (((ExploreFragment) getParentFragment()).binding!=null) {
((ExploreFragment) getParentFragment()).binding.tabLayout.setVisibility(View.GONE);
}
mediaDetails = MediaDetailPagerFragment.newInstance(false, true);
((ExploreFragment) getParentFragment()).setScroll(false);
setFragment(mediaDetails, listFragment);
@ -185,16 +187,29 @@ public class ExploreListRootFragment extends CommonsDaggerSupportFragment implem
*/
public boolean backPressed() {
if (null != mediaDetails && mediaDetails.isVisible()) {
((ExploreFragment) getParentFragment()).tabLayout.setVisibility(View.VISIBLE);
if (((ExploreFragment) getParentFragment()).binding != null) {
((ExploreFragment) getParentFragment()).binding.tabLayout.setVisibility(View.VISIBLE);
}
removeFragment(mediaDetails);
((ExploreFragment) getParentFragment()).setScroll(true);
setFragment(listFragment, mediaDetails);
((MainActivity) getActivity()).showTabs();
return true;
} else {
((MainActivity) getActivity()).setSelectedItemId(NavTab.CONTRIBUTIONS.code());
if (((MainActivity) getActivity()) != null) {
((MainActivity) getActivity()).setSelectedItemId(NavTab.CONTRIBUTIONS.code());
}
}
if (((MainActivity) getActivity()) != null) {
((MainActivity) getActivity()).showTabs();
}
((MainActivity) getActivity()).showTabs();
return false;
}
@Override
public void onDestroy() {
super.onDestroy();
binding = null;
}
}

View file

@ -9,12 +9,11 @@ import android.widget.FrameLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import butterknife.BindView;
import butterknife.ButterKnife;
import fr.free.nrw.commons.Media;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.category.CategoryImagesCallback;
import fr.free.nrw.commons.contributions.MainActivity;
import fr.free.nrw.commons.databinding.FragmentFeaturedRootBinding;
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
import fr.free.nrw.commons.explore.map.ExploreMapFragment;
import fr.free.nrw.commons.media.MediaDetailPagerFragment;
@ -26,8 +25,7 @@ public class ExploreMapRootFragment extends CommonsDaggerSupportFragment impleme
private MediaDetailPagerFragment mediaDetails;
private ExploreMapFragment mapFragment;
@BindView(R.id.explore_container)
FrameLayout container;
private FragmentFeaturedRootBinding binding;
public ExploreMapRootFragment() {
//empty constructor necessary otherwise crashes on recreate
@ -54,9 +52,10 @@ public class ExploreMapRootFragment extends CommonsDaggerSupportFragment impleme
@Nullable final ViewGroup container,
@Nullable final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View view = inflater.inflate(R.layout.fragment_featured_root, container, false);
ButterKnife.bind(this, view);
return view;
binding = FragmentFeaturedRootBinding.inflate(inflater, container, false);
return binding.getRoot();
}
@Override
@ -116,8 +115,8 @@ public class ExploreMapRootFragment extends CommonsDaggerSupportFragment impleme
@Override
public void onMediaClicked(int position) {
container.setVisibility(View.VISIBLE);
((ExploreFragment) getParentFragment()).tabLayout.setVisibility(View.GONE);
binding.exploreContainer.setVisibility(View.VISIBLE);
((ExploreFragment) getParentFragment()).binding.tabLayout.setVisibility(View.GONE);
mediaDetails = MediaDetailPagerFragment.newInstance(false, true);
((ExploreFragment) getParentFragment()).setScroll(false);
setFragment(mediaDetails, mapFragment);
@ -192,7 +191,7 @@ public class ExploreMapRootFragment extends CommonsDaggerSupportFragment impleme
*/
public boolean backPressed() {
if (null != mediaDetails && mediaDetails.isVisible()) {
((ExploreFragment) getParentFragment()).tabLayout.setVisibility(View.VISIBLE);
((ExploreFragment) getParentFragment()).binding.tabLayout.setVisibility(View.VISIBLE);
removeFragment(mediaDetails);
((ExploreFragment) getParentFragment()).setScroll(true);
setFragment(mapFragment, mediaDetails);
@ -213,4 +212,11 @@ public class ExploreMapRootFragment extends CommonsDaggerSupportFragment impleme
((MainActivity) getActivity()).showTabs();
return false;
}
@Override
public void onDestroy() {
super.onDestroy();
binding = null;
}
}

View file

@ -3,23 +3,17 @@ package fr.free.nrw.commons.explore;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.SearchView;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import androidx.viewpager.widget.ViewPager;
import butterknife.BindView;
import butterknife.ButterKnife;
import com.google.android.material.tabs.TabLayout;
import com.jakewharton.rxbinding2.view.RxView;
import com.jakewharton.rxbinding2.widget.RxSearchView;
import fr.free.nrw.commons.Media;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.ViewPagerAdapter;
import fr.free.nrw.commons.category.CategoryImagesCallback;
import fr.free.nrw.commons.databinding.ActivitySearchBinding;
import fr.free.nrw.commons.explore.categories.search.SearchCategoryFragment;
import fr.free.nrw.commons.explore.depictions.search.SearchDepictionsFragment;
import fr.free.nrw.commons.explore.media.SearchMediaFragment;
@ -45,13 +39,6 @@ import timber.log.Timber;
public class SearchActivity extends BaseActivity
implements MediaDetailPagerFragment.MediaDetailProvider, CategoryImagesCallback {
@BindView(R.id.toolbar_search) Toolbar toolbar;
@BindView(R.id.searchHistoryContainer) FrameLayout searchHistoryContainer;
@BindView(R.id.mediaContainer) FrameLayout mediaContainer;
@BindView(R.id.searchBox) SearchView searchView;
@BindView(R.id.tab_layout) TabLayout tabLayout;
@BindView(R.id.viewPager) ViewPager viewPager;
@Inject
RecentSearchesDao recentSearchesDao;
@ -63,25 +50,28 @@ public class SearchActivity extends BaseActivity
private MediaDetailPagerFragment mediaDetails;
ViewPagerAdapter viewPagerAdapter;
private ActivitySearchBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);
ButterKnife.bind(this);
binding = ActivitySearchBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
setTitle(getString(R.string.title_activity_search));
setSupportActionBar(toolbar);
setSupportActionBar(binding.toolbarSearch);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
toolbar.setNavigationOnClickListener(v->onBackPressed());
binding.toolbarSearch.setNavigationOnClickListener(v->onBackPressed());
supportFragmentManager = getSupportFragmentManager();
setSearchHistoryFragment();
viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(viewPagerAdapter);
viewPager.setOffscreenPageLimit(2); // Because we want all the fragments to be alive
tabLayout.setupWithViewPager(viewPager);
binding.viewPager.setAdapter(viewPagerAdapter);
binding.viewPager.setOffscreenPageLimit(2); // Because we want all the fragments to be alive
binding.tabLayout.setupWithViewPager(binding.viewPager);
setTabs();
searchView.setQueryHint(getString(R.string.search_commons));
searchView.onActionViewExpanded();
searchView.clearFocus();
binding.searchBox.setQueryHint(getString(R.string.search_commons));
binding.searchBox.onActionViewExpanded();
binding.searchBox.clearFocus();
}
@ -113,8 +103,8 @@ public class SearchActivity extends BaseActivity
viewPagerAdapter.setTabData(fragmentList, titleList);
viewPagerAdapter.notifyDataSetChanged();
compositeDisposable.add(RxSearchView.queryTextChanges(searchView)
.takeUntil(RxView.detaches(searchView))
compositeDisposable.add(RxSearchView.queryTextChanges(binding.searchBox)
.takeUntil(RxView.detaches(binding.searchBox))
.debounce(500, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::handleSearch, Timber::e
@ -124,9 +114,9 @@ public class SearchActivity extends BaseActivity
private void handleSearch(final CharSequence query) {
if (!TextUtils.isEmpty(query)) {
saveRecentSearch(query.toString());
viewPager.setVisibility(View.VISIBLE);
tabLayout.setVisibility(View.VISIBLE);
searchHistoryContainer.setVisibility(View.GONE);
binding.viewPager.setVisibility(View.VISIBLE);
binding.tabLayout.setVisibility(View.VISIBLE);
binding.searchHistoryContainer.setVisibility(View.GONE);
if (FragmentUtils.isFragmentUIActive(searchDepictionsFragment)) {
searchDepictionsFragment.onQueryUpdated(query.toString());
@ -144,10 +134,10 @@ public class SearchActivity extends BaseActivity
else {
//Open RecentSearchesFragment
recentSearchesFragment.updateRecentSearches();
viewPager.setVisibility(View.GONE);
tabLayout.setVisibility(View.GONE);
binding.viewPager.setVisibility(View.GONE);
binding.tabLayout.setVisibility(View.GONE);
setSearchHistoryFragment();
searchHistoryContainer.setVisibility(View.VISIBLE);
binding.searchHistoryContainer.setVisibility(View.VISIBLE);
}
}
@ -215,10 +205,10 @@ public class SearchActivity extends BaseActivity
@Override
public void onMediaClicked(int index) {
ViewUtil.hideKeyboard(this.findViewById(R.id.searchBox));
tabLayout.setVisibility(View.GONE);
viewPager.setVisibility(View.GONE);
mediaContainer.setVisibility(View.VISIBLE);
searchView.setVisibility(View.GONE);// to remove searchview when mediaDetails fragment open
binding.tabLayout.setVisibility(View.GONE);
binding.viewPager.setVisibility(View.GONE);
binding.mediaContainer.setVisibility(View.VISIBLE);
binding.searchBox.setVisibility(View.GONE);// to remove searchview when mediaDetails fragment open
if (mediaDetails == null || !mediaDetails.isVisible()) {
// set isFeaturedImage true for featured images, to include author field on media detail
mediaDetails = MediaDetailPagerFragment.newInstance(false, true);
@ -269,12 +259,12 @@ public class SearchActivity extends BaseActivity
}
if (getSupportFragmentManager().getBackStackEntryCount() == 1) {
// back to search so show search toolbar and hide navigation toolbar
searchView.setVisibility(View.VISIBLE);//set the searchview
tabLayout.setVisibility(View.VISIBLE);
viewPager.setVisibility(View.VISIBLE);
mediaContainer.setVisibility(View.GONE);
binding.searchBox.setVisibility(View.VISIBLE);//set the searchview
binding.tabLayout.setVisibility(View.VISIBLE);
binding.viewPager.setVisibility(View.VISIBLE);
binding.mediaContainer.setVisibility(View.GONE);
} else {
toolbar.setVisibility(View.GONE);
binding.toolbarSearch.setVisibility(View.GONE);
}
super.onBackPressed();
}
@ -284,15 +274,16 @@ public class SearchActivity extends BaseActivity
* @param query Recent Search Query
*/
public void updateText(String query) {
searchView.setQuery(query, true);
binding.searchBox.setQuery(query, true);
// Clear focus of searchView now. searchView.clearFocus(); does not seem to work Check the below link for more details.
// https://stackoverflow.com/questions/6117967/how-to-remove-focus-without-setting-focus-to-another-control/15481511
viewPager.requestFocus();
binding.viewPager.requestFocus();
}
@Override protected void onDestroy() {
super.onDestroy();
//Dispose the disposables when the activity is destroyed
compositeDisposable.dispose();
binding = null;
}
}

View file

@ -13,8 +13,6 @@ import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.viewpager.widget.ViewPager;
import butterknife.BindView;
import butterknife.ButterKnife;
import com.google.android.material.snackbar.Snackbar;
import com.google.android.material.tabs.TabLayout;
import fr.free.nrw.commons.Media;
@ -23,6 +21,7 @@ import fr.free.nrw.commons.Utils;
import fr.free.nrw.commons.ViewPagerAdapter;
import fr.free.nrw.commons.bookmarks.items.BookmarkItemsDao;
import fr.free.nrw.commons.category.CategoryImagesCallback;
import fr.free.nrw.commons.databinding.ActivityWikidataItemDetailsBinding;
import fr.free.nrw.commons.explore.depictions.child.ChildDepictionsFragment;
import fr.free.nrw.commons.explore.depictions.media.DepictedImagesFragment;
import fr.free.nrw.commons.explore.depictions.parent.ParentDepictionsFragment;
@ -57,14 +56,7 @@ public class WikidataItemDetailsActivity extends BaseActivity implements MediaDe
@Inject
DepictModel depictModel;
private String wikidataItemName;
@BindView(R.id.mediaContainer)
FrameLayout mediaContainer;
@BindView(R.id.tab_layout)
TabLayout tabLayout;
@BindView(R.id.viewPager)
ViewPager viewPager;
@BindView(R.id.toolbar)
Toolbar toolbar;
private ActivityWikidataItemDetailsBinding binding;
ViewPagerAdapter viewPagerAdapter;
private DepictedItem wikidataItem;
@ -72,19 +64,20 @@ public class WikidataItemDetailsActivity extends BaseActivity implements MediaDe
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wikidata_item_details);
ButterKnife.bind(this);
binding = ActivityWikidataItemDetailsBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
compositeDisposable = new CompositeDisposable();
supportFragmentManager = getSupportFragmentManager();
viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(viewPagerAdapter);
viewPager.setOffscreenPageLimit(2);
tabLayout.setupWithViewPager(viewPager);
binding.viewPager.setAdapter(viewPagerAdapter);
binding.viewPager.setOffscreenPageLimit(2);
binding.tabLayout.setupWithViewPager(binding.viewPager);
final DepictedItem depictedItem = getIntent().getParcelableExtra(
WikidataConstants.BOOKMARKS_ITEMS);
wikidataItem = depictedItem;
setSupportActionBar(toolbar);
setSupportActionBar(binding.toolbarBinding.toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
setTabs();
setPageTitle();
@ -137,7 +130,7 @@ public class WikidataItemDetailsActivity extends BaseActivity implements MediaDe
fragmentList.add(parentDepictionsFragment);
titleList.add(getResources().getString(R.string.title_for_parent_classes));
viewPagerAdapter.setTabData(fragmentList, titleList);
viewPager.setOffscreenPageLimit(2);
binding.viewPager.setOffscreenPageLimit(2);
viewPagerAdapter.notifyDataSetChanged();
}
@ -148,9 +141,9 @@ public class WikidataItemDetailsActivity extends BaseActivity implements MediaDe
*/
@Override
public void onMediaClicked(int position) {
tabLayout.setVisibility(View.GONE);
viewPager.setVisibility(View.GONE);
mediaContainer.setVisibility(View.VISIBLE);
binding.tabLayout.setVisibility(View.GONE);
binding.viewPager.setVisibility(View.GONE);
binding.mediaContainer.setVisibility(View.VISIBLE);
if (mediaDetailPagerFragment == null || !mediaDetailPagerFragment.isVisible()) {
// set isFeaturedImage true for featured images, to include author field on media detail
mediaDetailPagerFragment = MediaDetailPagerFragment.newInstance(false, true);
@ -183,9 +176,9 @@ public class WikidataItemDetailsActivity extends BaseActivity implements MediaDe
@Override
public void onBackPressed() {
if (supportFragmentManager.getBackStackEntryCount() == 1){
tabLayout.setVisibility(View.VISIBLE);
viewPager.setVisibility(View.VISIBLE);
mediaContainer.setVisibility(View.GONE);
binding.tabLayout.setVisibility(View.VISIBLE);
binding.viewPager.setVisibility(View.VISIBLE);
binding.mediaContainer.setVisibility(View.GONE);
}
super.onBackPressed();
}

View file

@ -27,10 +27,6 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
@ -39,8 +35,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatTextView;
import androidx.core.content.ContextCompat;
import butterknife.BindView;
import butterknife.ButterKnife;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
@ -50,6 +44,7 @@ import fr.free.nrw.commons.Media;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.Utils;
import fr.free.nrw.commons.bookmarks.locations.BookmarkLocationsDao;
import fr.free.nrw.commons.databinding.FragmentExploreMapBinding;
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
import fr.free.nrw.commons.explore.ExploreMapRootFragment;
import fr.free.nrw.commons.explore.paging.LiveDataConverter;
@ -130,31 +125,7 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment
private ExploreMapPresenter presenter;
@BindView(R.id.map_view)
org.osmdroid.views.MapView mapView;
@BindView(R.id.bottom_sheet_details)
View bottomSheetDetails;
@BindView(R.id.map_progress_bar)
ProgressBar progressBar;
@BindView(R.id.fab_recenter)
FloatingActionButton fabRecenter;
@BindView(R.id.search_this_area_button)
Button searchThisAreaButton;
@BindView(R.id.tv_attribution)
AppCompatTextView tvAttribution;
@BindView(R.id.directionsButton)
LinearLayout directionsButton;
@BindView(R.id.commonsButton)
LinearLayout commonsButton;
@BindView(R.id.mediaDetailsButton)
LinearLayout mediaDetailsButton;
@BindView(R.id.description)
TextView description;
@BindView(R.id.title)
TextView title;
@BindView(R.id.category)
TextView distance;
public FragmentExploreMapBinding binding;
private ActivityResultLauncher<String[]> activityResultLauncher = registerForActivityResult(
new ActivityResultContracts.RequestMultiplePermissions(),
@ -200,27 +171,21 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment
return fragment;
}
@Override
public void onCreate(@Nullable final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(
@NonNull LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState
) {
View v = inflater.inflate(R.layout.fragment_explore_map, container, false);
ButterKnife.bind(this, v);
return v;
binding = FragmentExploreMapBinding.inflate(getLayoutInflater());
return binding.getRoot();
}
@Override
public void onViewCreated(@NonNull final View view, @Nullable final Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
setSearchThisAreaButtonVisibility(false);
tvAttribution.setText(Html.fromHtml(getString(R.string.map_attribution)));
binding.tvAttribution.setText(Html.fromHtml(getString(R.string.map_attribution)));
initNetworkBroadCastReceiver();
if (presenter == null) {
@ -238,32 +203,32 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment
org.osmdroid.config.Configuration.getInstance().load(this.getContext(),
PreferenceManager.getDefaultSharedPreferences(this.getContext()));
mapView.setTileSource(TileSourceFactory.WIKIMEDIA);
mapView.setTilesScaledToDpi(true);
binding.mapView.setTileSource(TileSourceFactory.WIKIMEDIA);
binding.mapView.setTilesScaledToDpi(true);
org.osmdroid.config.Configuration.getInstance().getAdditionalHttpRequestProperties().put(
"Referer", "http://maps.wikimedia.org/"
);
ScaleBarOverlay scaleBarOverlay = new ScaleBarOverlay(mapView);
ScaleBarOverlay scaleBarOverlay = new ScaleBarOverlay(binding.mapView);
scaleBarOverlay.setScaleBarOffset(15, 25);
Paint barPaint = new Paint();
barPaint.setARGB(200, 255, 250, 250);
scaleBarOverlay.setBackgroundPaint(barPaint);
scaleBarOverlay.enableScaleBar();
mapView.getOverlays().add(scaleBarOverlay);
mapView.getZoomController().setVisibility(CustomZoomButtonsController.Visibility.NEVER);
mapView.setMultiTouchControls(true);
mapView.getController().setZoom(ZOOM_LEVEL);
binding.mapView.getOverlays().add(scaleBarOverlay);
binding.mapView.getZoomController().setVisibility(CustomZoomButtonsController.Visibility.NEVER);
binding.mapView.setMultiTouchControls(true);
binding.mapView.getController().setZoom(ZOOM_LEVEL);
performMapReadyActions();
mapView.getOverlays().add(new MapEventsOverlay(new MapEventsReceiver() {
binding.mapView.getOverlays().add(new MapEventsOverlay(new MapEventsReceiver() {
@Override
public boolean singleTapConfirmedHelper(GeoPoint p) {
if (clickedMarker != null) {
removeMarker(clickedMarker);
addMarkerToMap(clickedMarker);
mapView.invalidate();
binding.mapView.invalidate();
} else {
Timber.e("CLICKED MARKER IS NULL");
}
@ -282,14 +247,14 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment
}
}));
mapView.addMapListener(new MapListener() {
binding.mapView.addMapListener(new MapListener() {
@Override
public boolean onScroll(ScrollEvent event) {
if (getLastMapFocus() != null) {
Location mylocation = new Location("");
Location dest_location = new Location("");
dest_location.setLatitude(mapView.getMapCenter().getLatitude());
dest_location.setLongitude(mapView.getMapCenter().getLongitude());
dest_location.setLatitude(binding.mapView.getMapCenter().getLatitude());
dest_location.setLongitude(binding.mapView.getMapCenter().getLongitude());
mylocation.setLatitude(getLastMapFocus().getLatitude());
mylocation.setLongitude(getLastMapFocus().getLongitude());
Float distance = mylocation.distanceTo(dest_location);//in meters
@ -322,7 +287,7 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment
@Override
public void onResume() {
super.onResume();
mapView.onResume();
binding.mapView.onResume();
presenter.attachView(this);
registerNetworkReceiver();
if (isResumed()) {
@ -351,7 +316,7 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment
private void performMapReadyActions() {
if (isDarkTheme) {
mapView.getOverlayManager().getTilesOverlay()
binding.mapView.getOverlayManager().getTilesOverlay()
.setColorFilter(TilesOverlay.INVERT_COLORS);
}
if (!applicationKvStore.getBoolean("doNotAskForLocationPermission", false) ||
@ -376,16 +341,16 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment
*/
@SuppressLint("ClickableViewAccessibility")
private void initBottomSheets() {
bottomSheetDetailsBehavior = BottomSheetBehavior.from(bottomSheetDetails);
bottomSheetDetailsBehavior = BottomSheetBehavior.from(binding.bottomSheetDetailsBinding.getRoot());
bottomSheetDetailsBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
bottomSheetDetails.setVisibility(View.VISIBLE);
binding.bottomSheetDetailsBinding.getRoot().setVisibility(View.VISIBLE);
}
/**
* Defines how bottom sheets will act on click
*/
private void setBottomSheetCallbacks() {
bottomSheetDetails.setOnClickListener(v -> {
binding.bottomSheetDetailsBinding.getRoot().setOnClickListener(v -> {
if (bottomSheetDetailsBehavior.getState() == BottomSheetBehavior.STATE_COLLAPSED) {
bottomSheetDetailsBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
} else if (bottomSheetDetailsBehavior.getState()
@ -496,7 +461,7 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment
if (lastKnownLocation != null) {
GeoPoint targetP = new GeoPoint(target.getLatitude(), target.getLongitude());
mapCenter = targetP;
mapView.getController().setCenter(targetP);
binding.mapView.getController().setCenter(targetP);
recenterMarkerToPosition(targetP);
moveCameraToPosition(targetP);
} else if (locationManager.isGPSProviderEnabled()
@ -528,13 +493,13 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment
return;
}
recenterMarkerToPosition(new GeoPoint(curLatLng.getLatitude(), curLatLng.getLongitude()));
mapView.getController()
binding.mapView.getController()
.animateTo(new GeoPoint(curLatLng.getLatitude(), curLatLng.getLongitude()));
if (lastMapFocus != null) {
Location mylocation = new Location("");
Location dest_location = new Location("");
dest_location.setLatitude(mapView.getMapCenter().getLatitude());
dest_location.setLongitude(mapView.getMapCenter().getLongitude());
dest_location.setLatitude(binding.mapView.getMapCenter().getLatitude());
dest_location.setLongitude(binding.mapView.getMapCenter().getLongitude());
mylocation.setLatitude(lastMapFocus.getLatitude());
mylocation.setLongitude(lastMapFocus.getLongitude());
Float distance = mylocation.distanceTo(dest_location);//in meters
@ -598,60 +563,52 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment
* @param place Place of clicked nearby marker
*/
private void passInfoToSheet(final Place place) {
directionsButton.setOnClickListener(view -> Utils.handleGeoCoordinates(getActivity(),
binding.bottomSheetDetailsBinding.directionsButton.setOnClickListener(view -> Utils.handleGeoCoordinates(getActivity(),
place.getLocation()));
commonsButton.setVisibility(place.hasCommonsLink() ? View.VISIBLE : View.GONE);
commonsButton.setOnClickListener(
binding.bottomSheetDetailsBinding.commonsButton.setVisibility(place.hasCommonsLink() ? View.VISIBLE : View.GONE);
binding.bottomSheetDetailsBinding.commonsButton.setOnClickListener(
view -> Utils.handleWebUrl(getContext(), place.siteLinks.getCommonsLink()));
int index = 0;
for (Media media : mediaList) {
if (media.getFilename().equals(place.name)) {
int finalIndex = index;
mediaDetailsButton.setOnClickListener(view -> {
binding.bottomSheetDetailsBinding.mediaDetailsButton.setOnClickListener(view -> {
((ExploreMapRootFragment) getParentFragment()).onMediaClicked(finalIndex);
});
}
index++;
}
title.setText(place.name.substring(5, place.name.lastIndexOf(".")));
distance.setText(place.distance);
binding.bottomSheetDetailsBinding.title.setText(place.name.substring(5, place.name.lastIndexOf(".")));
binding.bottomSheetDetailsBinding.category.setText(place.distance);
// Remove label since it is double information
String descriptionText = place.getLongDescription()
.replace(place.getName() + " (", "");
descriptionText = (descriptionText.equals(place.getLongDescription()) ? descriptionText
: descriptionText.replaceFirst(".$", ""));
// Set the short description after we remove place name from long description
description.setText(descriptionText);
binding.bottomSheetDetailsBinding.description.setText(descriptionText);
}
@Override
public void addSearchThisAreaButtonAction() {
searchThisAreaButton.setOnClickListener(presenter.onSearchThisAreaClicked());
binding.searchThisAreaButton.setOnClickListener(presenter.onSearchThisAreaClicked());
}
@Override
public void setSearchThisAreaButtonVisibility(boolean isVisible) {
if (isVisible) {
searchThisAreaButton.setVisibility(View.VISIBLE);
} else {
searchThisAreaButton.setVisibility(View.GONE);
}
binding.searchThisAreaButton.setVisibility(isVisible ? View.VISIBLE : View.GONE);
}
@Override
public void setProgressBarVisibility(boolean isVisible) {
if (isVisible) {
progressBar.setVisibility(View.VISIBLE);
} else {
progressBar.setVisibility(View.GONE);
}
binding.mapProgressBar.setVisibility(isVisible ? View.VISIBLE : View.GONE);
}
@Override
public boolean isDetailsBottomSheetVisible() {
if (bottomSheetDetails.getVisibility() == View.VISIBLE) {
if (binding.bottomSheetDetailsBinding.getRoot().getVisibility() == View.VISIBLE) {
return true;
} else {
return false;
@ -660,11 +617,7 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment
@Override
public boolean isSearchThisAreaButtonVisible() {
if (searchThisAreaButton.getVisibility() == View.VISIBLE) {
return true;
} else {
return false;
}
return binding.bottomSheetDetailsBinding.getRoot().getVisibility() == View.VISIBLE;
}
@Override
@ -677,12 +630,12 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment
@Override
public void disableFABRecenter() {
fabRecenter.setEnabled(false);
binding.fabRecenter.setEnabled(false);
}
@Override
public void enableFABRecenter() {
fabRecenter.setEnabled(true);
binding.fabRecenter.setEnabled(true);
}
/**
@ -696,7 +649,7 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment
for (int i = 0; i < nearbyBaseMarkers.size(); i++) {
addMarkerToMap(nearbyBaseMarkers.get(i));
}
mapView.invalidate();
binding.mapView.invalidate();
}
/**
@ -738,7 +691,7 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment
}, getContext());
overlay.setFocusItemsOnTap(true);
mapView.getOverlays().add(overlay); // Add the overlay to the map
binding.mapView.getOverlays().add(overlay); // Add the overlay to the map
}
/**
@ -748,7 +701,7 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment
*/
private void removeMarker(NearbyBaseMarker nearbyBaseMarker) {
Place place = nearbyBaseMarker.getPlace();
List<Overlay> overlays = mapView.getOverlays();
List<Overlay> overlays = binding.mapView.getOverlays();
ItemizedOverlayWithFocus item;
for (int i = 0; i < overlays.size(); i++) {
@ -758,8 +711,8 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment
if (place.location.getLatitude() == overlayItem.getPoint().getLatitude()
&& place.location.getLongitude() == overlayItem.getPoint().getLongitude()) {
mapView.getOverlays().remove(i);
mapView.invalidate();
binding.mapView.getOverlays().remove(i);
binding.mapView.invalidate();
break;
}
}
@ -772,10 +725,10 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment
*/
@Override
public void clearAllMarkers() {
mapView.getOverlayManager().clear();
binding.mapView.getOverlayManager().clear();
GeoPoint geoPoint = mapCenter;
if (geoPoint != null) {
List<Overlay> overlays = mapView.getOverlays();
List<Overlay> overlays = binding.mapView.getOverlays();
ScaleDiskOverlay diskOverlay =
new ScaleDiskOverlay(this.getContext(),
geoPoint, 2000, GeoConstants.UnitOfMeasure.foot);
@ -790,9 +743,9 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment
diskOverlay.setCirclePaint1(diskPaint);
diskOverlay.setDisplaySizeMin(900);
diskOverlay.setDisplaySizeMax(1700);
mapView.getOverlays().add(diskOverlay);
binding.mapView.getOverlays().add(diskOverlay);
org.osmdroid.views.overlay.Marker startMarker = new org.osmdroid.views.overlay.Marker(
mapView);
binding.mapView);
startMarker.setPosition(geoPoint);
startMarker.setAnchor(org.osmdroid.views.overlay.Marker.ANCHOR_CENTER,
org.osmdroid.views.overlay.Marker.ANCHOR_BOTTOM);
@ -800,22 +753,22 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment
ContextCompat.getDrawable(this.getContext(), R.drawable.current_location_marker));
startMarker.setTitle("Your Location");
startMarker.setTextLabelFontSize(24);
mapView.getOverlays().add(startMarker);
binding.mapView.getOverlays().add(startMarker);
}
ScaleBarOverlay scaleBarOverlay = new ScaleBarOverlay(mapView);
ScaleBarOverlay scaleBarOverlay = new ScaleBarOverlay(binding.mapView);
scaleBarOverlay.setScaleBarOffset(15, 25);
Paint barPaint = new Paint();
barPaint.setARGB(200, 255, 250, 250);
scaleBarOverlay.setBackgroundPaint(barPaint);
scaleBarOverlay.enableScaleBar();
mapView.getOverlays().add(scaleBarOverlay);
mapView.getOverlays().add(new MapEventsOverlay(new MapEventsReceiver() {
binding.mapView.getOverlays().add(scaleBarOverlay);
binding.mapView.getOverlays().add(new MapEventsOverlay(new MapEventsReceiver() {
@Override
public boolean singleTapConfirmedHelper(GeoPoint p) {
if (clickedMarker != null) {
removeMarker(clickedMarker);
addMarkerToMap(clickedMarker);
mapView.invalidate();
binding.mapView.invalidate();
} else {
Timber.e("CLICKED MARKER IS NULL");
}
@ -833,7 +786,7 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment
return false;
}
}));
mapView.setMultiTouchControls(true);
binding.mapView.setMultiTouchControls(true);
}
/**
@ -844,13 +797,13 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment
*/
private void recenterMarkerToPosition(GeoPoint geoPoint) {
if (geoPoint != null) {
mapView.getController().setCenter(geoPoint);
List<Overlay> overlays = mapView.getOverlays();
binding.mapView.getController().setCenter(geoPoint);
List<Overlay> overlays = binding.mapView.getOverlays();
for (int i = 0; i < overlays.size(); i++) {
if (overlays.get(i) instanceof org.osmdroid.views.overlay.Marker) {
mapView.getOverlays().remove(i);
binding.mapView.getOverlays().remove(i);
} else if (overlays.get(i) instanceof ScaleDiskOverlay) {
mapView.getOverlays().remove(i);
binding.mapView.getOverlays().remove(i);
}
}
ScaleDiskOverlay diskOverlay =
@ -867,9 +820,9 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment
diskOverlay.setCirclePaint1(diskPaint);
diskOverlay.setDisplaySizeMin(900);
diskOverlay.setDisplaySizeMax(1700);
mapView.getOverlays().add(diskOverlay);
binding.mapView.getOverlays().add(diskOverlay);
org.osmdroid.views.overlay.Marker startMarker = new org.osmdroid.views.overlay.Marker(
mapView);
binding.mapView);
startMarker.setPosition(geoPoint);
startMarker.setAnchor(org.osmdroid.views.overlay.Marker.ANCHOR_CENTER,
org.osmdroid.views.overlay.Marker.ANCHOR_BOTTOM);
@ -877,7 +830,7 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment
ContextCompat.getDrawable(this.getContext(), R.drawable.current_location_marker));
startMarker.setTitle("Your Location");
startMarker.setTextLabelFontSize(24);
mapView.getOverlays().add(startMarker);
binding.mapView.getOverlays().add(startMarker);
}
}
@ -887,7 +840,7 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment
* @param geoPoint The GeoPoint representing the new camera position for the map.
*/
private void moveCameraToPosition(GeoPoint geoPoint) {
mapView.getController().animateTo(geoPoint);
binding.mapView.getController().animateTo(geoPoint);
}
@Override
@ -909,13 +862,13 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment
@Override
public fr.free.nrw.commons.location.LatLng getMapFocus() {
fr.free.nrw.commons.location.LatLng mapFocusedLatLng = new fr.free.nrw.commons.location.LatLng(
mapView.getMapCenter().getLatitude(), mapView.getMapCenter().getLongitude(), 100);
binding.mapView.getMapCenter().getLatitude(), binding.mapView.getMapCenter().getLongitude(), 100);
return mapFocusedLatLng;
}
@Override
public void setFABRecenterAction(OnClickListener onClickListener) {
fabRecenter.setOnClickListener(onClickListener);
binding.fabRecenter.setOnClickListener(onClickListener);
}
@Override

View file

@ -7,15 +7,11 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import butterknife.BindView;
import butterknife.ButterKnife;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.databinding.FragmentSearchHistoryBinding;
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
import fr.free.nrw.commons.explore.SearchActivity;
import java.util.List;
@ -29,42 +25,39 @@ public class RecentSearchesFragment extends CommonsDaggerSupportFragment {
@Inject
RecentSearchesDao recentSearchesDao;
@BindView(R.id.recent_searches_list)
ListView recentSearchesList;
List<String> recentSearches;
ArrayAdapter adapter;
@BindView(R.id.recent_searches_delete_button)
ImageView recent_searches_delete_button;
@BindView(R.id.recent_searches_text_view)
TextView recent_searches_text_view;
private FragmentSearchHistoryBinding binding;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_search_history, container, false);
ButterKnife.bind(this, rootView);
binding = FragmentSearchHistoryBinding.inflate(inflater, container, false);
recentSearches = recentSearchesDao.recentSearches(10);
if (recentSearches.isEmpty()) {
recent_searches_delete_button.setVisibility(View.GONE);
recent_searches_text_view.setText(R.string.no_recent_searches);
binding.recentSearchesDeleteButton.setVisibility(View.GONE);
binding.recentSearchesTextView.setText(R.string.no_recent_searches);
}
recent_searches_delete_button.setOnClickListener(v -> {
binding.recentSearchesDeleteButton.setOnClickListener(v -> {
showDeleteRecentAlertDialog(requireContext());
});
adapter = new ArrayAdapter<>(requireContext(), R.layout.item_recent_searches,
recentSearches);
recentSearchesList.setAdapter(adapter);
recentSearchesList.setOnItemClickListener((parent, view, position, id) -> (
binding.recentSearchesList.setAdapter(adapter);
binding.recentSearchesList.setOnItemClickListener((parent, view, position, id) -> (
(SearchActivity) getContext()).updateText(recentSearches.get(position)));
recentSearchesList.setOnItemLongClickListener((parent, view, position, id) -> {
binding.recentSearchesList.setOnItemLongClickListener((parent, view, position, id) -> {
showDeleteAlertDialog(requireContext(), position);
return true;
});
updateRecentSearches();
return rootView;
return binding.getRoot();
}
private void showDeleteRecentAlertDialog(@NonNull final Context context) {
@ -80,15 +73,17 @@ public class RecentSearchesFragment extends CommonsDaggerSupportFragment {
private void setDeleteRecentPositiveButton(@NonNull final Context context,
final DialogInterface dialog) {
recentSearchesDao.deleteAll();
recent_searches_delete_button.setVisibility(View.GONE);
recent_searches_text_view.setText(R.string.no_recent_searches);
Toast.makeText(getContext(), getString(R.string.search_history_deleted),
Toast.LENGTH_SHORT).show();
recentSearches = recentSearchesDao.recentSearches(10);
adapter = new ArrayAdapter<>(context, R.layout.item_recent_searches,
recentSearches);
recentSearchesList.setAdapter(adapter);
adapter.notifyDataSetChanged();
if (binding != null) {
binding.recentSearchesDeleteButton.setVisibility(View.GONE);
binding.recentSearchesTextView.setText(R.string.no_recent_searches);
Toast.makeText(getContext(), getString(R.string.search_history_deleted),
Toast.LENGTH_SHORT).show();
recentSearches = recentSearchesDao.recentSearches(10);
adapter = new ArrayAdapter<>(context, R.layout.item_recent_searches,
recentSearches);
binding.recentSearchesList.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
dialog.dismiss();
}
@ -108,8 +103,10 @@ public class RecentSearchesFragment extends CommonsDaggerSupportFragment {
recentSearches = recentSearchesDao.recentSearches(10);
adapter = new ArrayAdapter<>(context, R.layout.item_recent_searches,
recentSearches);
recentSearchesList.setAdapter(adapter);
adapter.notifyDataSetChanged();
if (binding != null){
binding.recentSearchesList.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
dialog.dismiss();
}
@ -131,8 +128,19 @@ public class RecentSearchesFragment extends CommonsDaggerSupportFragment {
adapter.notifyDataSetChanged();
if (!recentSearches.isEmpty()) {
recent_searches_delete_button.setVisibility(View.VISIBLE);
recent_searches_text_view.setText(R.string.search_recent_header);
if (binding!= null) {
binding.recentSearchesDeleteButton.setVisibility(View.VISIBLE);
binding.recentSearchesTextView.setText(R.string.search_recent_header);
}
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (binding != null) {
binding = null;
}
}
}

View file

@ -428,7 +428,7 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment implements
// in the case when MediaDetailPagerFragment is directly started by the CategoryImagesActivity
if (getParentFragment() instanceof ContributionsFragment) {
((ContributionsFragment) (getParentFragment()
.getParentFragment())).nearbyNotificationCardView
.getParentFragment())).binding.cardViewNearby
.setVisibility(View.GONE);
}
}
@ -938,12 +938,14 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment implements
}
}
startActivityForResult(new LocationPicker.IntentBuilder()
startActivity(new LocationPicker.IntentBuilder()
.defaultLocation(new CameraPosition.Builder()
.target(new LatLng(defaultLatitude, defaultLongitude))
.zoom(16).build())
.activityKey("MediaActivity")
.build(getActivity()), REQUEST_CODE);
.media(media)
.build(getActivity()));
}
@OnClick(R.id.description_edit)
@ -1121,32 +1123,7 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment implements
@Nullable final Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
assert data != null;
final CameraPosition cameraPosition = LocationPicker.getCameraPosition(data);
if (cameraPosition != null) {
final String latitude = String.valueOf(cameraPosition.target.getLatitude());
final String longitude = String.valueOf(cameraPosition.target.getLongitude());
final String accuracy = String.valueOf(cameraPosition.target.getAltitude());
String currentLatitude = null;
String currentLongitude = null;
if (media.getCoordinates() != null) {
currentLatitude = String.valueOf(media.getCoordinates().getLatitude());
currentLongitude = String.valueOf(media.getCoordinates().getLongitude());
}
if (!latitude.equals(currentLatitude) || !longitude.equals(currentLongitude)) {
updateCoordinates(latitude, longitude, accuracy);
} else if (media.getCoordinates() == null) {
updateCoordinates(latitude, longitude, accuracy);
}
}
} else if (requestCode == REQUEST_CODE_EDIT_DESCRIPTION && resultCode == RESULT_OK) {
if (requestCode == REQUEST_CODE_EDIT_DESCRIPTION && resultCode == RESULT_OK) {
final String updatedWikiText = data.getStringExtra(UPDATED_WIKITEXT);
compositeDisposable.add(descriptionEditHelper.addDescription(getContext(), media,
updatedWikiText)
@ -1174,11 +1151,6 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment implements
progressBarEditDescription.setVisibility(GONE);
editDescription.setVisibility(VISIBLE);
} else if (requestCode == REQUEST_CODE && resultCode == RESULT_CANCELED) {
viewUtil.showShortToast(getContext(),
requireContext()
.getString(R.string.coordinates_picking_unsuccessful));
} else if (requestCode == REQUEST_CODE_EDIT_DESCRIPTION && resultCode == RESULT_CANCELED) {
progressBarEditDescription.setVisibility(GONE);
editDescription.setVisibility(VISIBLE);
@ -1196,24 +1168,6 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment implements
media.setCaptions(updatedCaptions);
}
/**
* Fetched coordinates are replaced with existing coordinates by a POST API call.
* @param Latitude to be added
* @param Longitude to be added
* @param Accuracy to be added
*/
public void updateCoordinates(final String Latitude, final String Longitude,
final String Accuracy) {
compositeDisposable.add(coordinateEditHelper.makeCoordinatesEdit(getContext(), media,
Latitude, Longitude, Accuracy)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(s -> {
Timber.d("Coordinates are added.");
coordinates.setText(prettyCoordinates(media));
}));
}
@SuppressLint("StringFormatInvalid")
@OnClick(R.id.nominateDeletion)
public void onDeleteButtonClicked(){
@ -1598,4 +1552,5 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment implements
SharedPreferences imageBackgroundColorPref = this.getImageBackgroundColorPref();
return imageBackgroundColorPref.getInt(IMAGE_BACKGROUND_COLOR, DEFAULT_IMAGE_BACKGROUND_COLOR);
}
}

View file

@ -131,7 +131,7 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple
// If fragment is associated with ProfileActivity, then hide the tabLayout
if (getActivity() instanceof ProfileActivity) {
((ProfileActivity)getActivity()).tabLayout.setVisibility(View.GONE);
((ProfileActivity)getActivity()).setTabLayoutVisibility(false);
}
// Else if fragment is associated with MainActivity then hide that tab layout

View file

@ -1322,7 +1322,7 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
@Override
public void setTabItemContributions() {
((MainActivity) getActivity()).viewPager.setCurrentItem(0);
((MainActivity) getActivity()).binding.pager.setCurrentItem(0);
// TODO
}

View file

@ -13,19 +13,16 @@ import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.FileProvider;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import butterknife.BindView;
import butterknife.ButterKnife;
import com.google.android.material.tabs.TabLayout;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.Utils;
import fr.free.nrw.commons.ViewPagerAdapter;
import fr.free.nrw.commons.auth.SessionManager;
import fr.free.nrw.commons.contributions.ContributionsFragment;
import fr.free.nrw.commons.explore.ParentViewPager;
import fr.free.nrw.commons.databinding.ActivityProfileBinding;
import fr.free.nrw.commons.profile.achievements.AchievementsFragment;
import fr.free.nrw.commons.profile.leaderboard.LeaderboardFragment;
import fr.free.nrw.commons.theme.BaseActivity;
@ -45,14 +42,7 @@ public class ProfileActivity extends BaseActivity {
private FragmentManager supportFragmentManager;
@BindView(R.id.viewPager)
ParentViewPager viewPager;
@BindView(R.id.tab_layout)
public TabLayout tabLayout;
@BindView(R.id.toolbar)
Toolbar toolbar;
public ActivityProfileBinding binding;
@Inject
SessionManager sessionManager;
@ -70,7 +60,7 @@ public class ProfileActivity extends BaseActivity {
ContributionsFragment contributionsFragment;
public void setScroll(boolean canScroll){
viewPager.setCanScroll(canScroll);
binding.viewPager.setCanScroll(canScroll);
}
@Override
protected void onRestoreInstanceState(final Bundle savedInstanceState) {
@ -85,11 +75,13 @@ public class ProfileActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_profile);
ButterKnife.bind(this);
setSupportActionBar(toolbar);
toolbar.setNavigationOnClickListener(view -> {
binding = ActivityProfileBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
setSupportActionBar(binding.toolbarBinding.toolbar);
binding.toolbarBinding.toolbar.setNavigationOnClickListener(view -> {
onSupportNavigateUp();
});
@ -99,8 +91,8 @@ public class ProfileActivity extends BaseActivity {
supportFragmentManager = getSupportFragmentManager();
viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(viewPagerAdapter);
tabLayout.setupWithViewPager(viewPager);
binding.viewPager.setAdapter(viewPagerAdapter);
binding.tabLayout.setupWithViewPager(binding.viewPager);
setTabs();
}
@ -257,9 +249,17 @@ public class ProfileActivity extends BaseActivity {
// Checking if MediaDetailPagerFragment is visible, If visible then show ContributionListFragment else close the ProfileActivity
if(contributionsFragment != null && contributionsFragment.getMediaDetailPagerFragment() != null && contributionsFragment.getMediaDetailPagerFragment().isVisible()) {
contributionsFragment.backButtonClicked();
tabLayout.setVisibility(View.VISIBLE);
binding.tabLayout.setVisibility(View.VISIBLE);
}else {
super.onBackPressed();
}
}
}
/**
* To set the visibility of tab layout
* @param isVisible boolean
*/
public void setTabLayoutVisibility(boolean isVisible) {
binding.tabLayout.setVisibility(isVisible ? View.VISIBLE : View.GONE);
}
}

View file

@ -14,19 +14,14 @@ import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.Spinner;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.MergeAdapter;
import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView;
import butterknife.ButterKnife;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.auth.SessionManager;
import fr.free.nrw.commons.databinding.FragmentLeaderboardBinding;
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient;
import fr.free.nrw.commons.profile.ProfileActivity;
@ -44,20 +39,6 @@ import timber.log.Timber;
*/
public class LeaderboardFragment extends CommonsDaggerSupportFragment {
@BindView(R.id.leaderboard_list)
RecyclerView leaderboardListRecyclerView;
@BindView(R.id.progressBar)
ProgressBar progressBar;
@BindView(R.id.category_spinner)
Spinner categorySpinner;
@BindView(R.id.duration_spinner)
Spinner durationSpinner;
@BindView(R.id.scroll)
Button scrollButton;
@Inject
SessionManager sessionManager;
@ -110,6 +91,8 @@ public class LeaderboardFragment extends CommonsDaggerSupportFragment {
private String userName;
private FragmentLeaderboardBinding binding;
@Override
public void onCreate(@Nullable final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@ -120,19 +103,18 @@ public class LeaderboardFragment extends CommonsDaggerSupportFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_leaderboard, container, false);
ButterKnife.bind(this, rootView);
binding = FragmentLeaderboardBinding.inflate(inflater, container, false);
hideLayouts();
// Leaderboard currently unimplemented in Beta flavor. Skip all API calls and disable menu
if(ConfigUtils.isBetaFlavour()) {
progressBar.setVisibility(View.GONE);
scrollButton.setVisibility(View.GONE);
return rootView;
binding.progressBar.setVisibility(View.GONE);
binding.scroll.setVisibility(View.GONE);
return binding.getRoot();
}
progressBar.setVisibility(View.VISIBLE);
binding.progressBar.setVisibility(View.VISIBLE);
setSpinners();
/**
@ -152,11 +134,11 @@ public class LeaderboardFragment extends CommonsDaggerSupportFragment {
setLeaderboard(duration, category, limit, offset);
durationSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
binding.durationSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
duration = durationValues[durationSpinner.getSelectedItemPosition()];
duration = durationValues[binding.durationSpinner.getSelectedItemPosition()];
refreshLeaderboard();
}
@ -165,10 +147,10 @@ public class LeaderboardFragment extends CommonsDaggerSupportFragment {
}
});
categorySpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
binding.categorySpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
category = categoryValues[categorySpinner.getSelectedItemPosition()];
category = categoryValues[binding.categorySpinner.getSelectedItemPosition()];
refreshLeaderboard();
}
@ -178,10 +160,10 @@ public class LeaderboardFragment extends CommonsDaggerSupportFragment {
});
scrollButton.setOnClickListener(view -> scrollToUserRank());
binding.scroll.setOnClickListener(view -> scrollToUserRank());
return rootView;
return binding.getRoot();
}
@Override
@ -226,9 +208,12 @@ public class LeaderboardFragment extends CommonsDaggerSupportFragment {
if(userRank==0){
Toast.makeText(getContext(),R.string.no_achievements_yet,Toast.LENGTH_SHORT).show();
}else {
if (Objects.requireNonNull(leaderboardListRecyclerView.getAdapter()).getItemCount()
if (binding == null) {
return;
}
if (Objects.requireNonNull(binding.leaderboardList.getAdapter()).getItemCount()
> userRank + 1) {
leaderboardListRecyclerView.smoothScrollToPosition(userRank + 1);
binding.leaderboardList.smoothScrollToPosition(userRank + 1);
} else {
if (viewModel != null) {
viewModel.refresh(duration, category, userRank + 1, 0);
@ -247,12 +232,12 @@ public class LeaderboardFragment extends CommonsDaggerSupportFragment {
ArrayAdapter<CharSequence> categoryAdapter = ArrayAdapter.createFromResource(getContext(),
R.array.leaderboard_categories, android.R.layout.simple_spinner_item);
categoryAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
categorySpinner.setAdapter(categoryAdapter);
binding.categorySpinner.setAdapter(categoryAdapter);
ArrayAdapter<CharSequence> durationAdapter = ArrayAdapter.createFromResource(getContext(),
R.array.leaderboard_durations, android.R.layout.simple_spinner_item);
durationAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
durationSpinner.setAdapter(durationAdapter);
binding.durationSpinner.setAdapter(durationAdapter);
}
/**
@ -297,8 +282,8 @@ public class LeaderboardFragment extends CommonsDaggerSupportFragment {
UserDetailAdapter userDetailAdapter= new UserDetailAdapter(response);
MergeAdapter mergeAdapter = new MergeAdapter(userDetailAdapter, leaderboardListAdapter);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
leaderboardListRecyclerView.setLayoutManager(linearLayoutManager);
leaderboardListRecyclerView.setAdapter(mergeAdapter);
binding.leaderboardList.setLayoutManager(linearLayoutManager);
binding.leaderboardList.setAdapter(mergeAdapter);
viewModel.getListLiveData().observe(getViewLifecycleOwner(), leaderboardListAdapter::submitList);
viewModel.getProgressLoadStatus().observe(getViewLifecycleOwner(), status -> {
if (Objects.requireNonNull(status).equalsIgnoreCase(LOADING)) {
@ -306,7 +291,7 @@ public class LeaderboardFragment extends CommonsDaggerSupportFragment {
} else if (status.equalsIgnoreCase(LOADED)) {
hideProgressBar();
if (scrollToRank) {
leaderboardListRecyclerView.smoothScrollToPosition(userRank + 1);
binding.leaderboardList.smoothScrollToPosition(userRank + 1);
}
}
});
@ -316,12 +301,12 @@ public class LeaderboardFragment extends CommonsDaggerSupportFragment {
* to hide progressbar
*/
private void hideProgressBar() {
if (progressBar != null) {
progressBar.setVisibility(View.GONE);
categorySpinner.setVisibility(View.VISIBLE);
durationSpinner.setVisibility(View.VISIBLE);
scrollButton.setVisibility(View.VISIBLE);
leaderboardListRecyclerView.setVisibility(View.VISIBLE);
if (binding != null) {
binding.progressBar.setVisibility(View.GONE);
binding.categorySpinner.setVisibility(View.VISIBLE);
binding.durationSpinner.setVisibility(View.VISIBLE);
binding.scroll.setVisibility(View.VISIBLE);
binding.leaderboardList.setVisibility(View.VISIBLE);
}
}
@ -329,19 +314,19 @@ public class LeaderboardFragment extends CommonsDaggerSupportFragment {
* to show progressbar
*/
private void showProgressBar() {
if (progressBar != null) {
progressBar.setVisibility(View.VISIBLE);
if (binding != null) {
binding.progressBar.setVisibility(View.VISIBLE);
binding.scroll.setVisibility(View.INVISIBLE);
}
scrollButton.setVisibility(View.INVISIBLE);
}
/**
* used to hide the layouts while fetching results from api
*/
private void hideLayouts(){
categorySpinner.setVisibility(View.INVISIBLE);
durationSpinner.setVisibility(View.INVISIBLE);
leaderboardListRecyclerView.setVisibility(View.INVISIBLE);
binding.categorySpinner.setVisibility(View.INVISIBLE);
binding.durationSpinner.setVisibility(View.INVISIBLE);
binding.leaderboardList.setVisibility(View.INVISIBLE);
}
/**
@ -364,7 +349,15 @@ public class LeaderboardFragment extends CommonsDaggerSupportFragment {
*/
private void onError() {
ViewUtil.showLongToast(getActivity(), getResources().getString(R.string.error_occurred));
progressBar.setVisibility(View.GONE);
if (binding!=null) {
binding.progressBar.setVisibility(View.GONE);
}
}
@Override
public void onDestroy() {
super.onDestroy();
compositeDisposable.clear();
binding = null;
}
}

View file

@ -1,70 +1,69 @@
package fr.free.nrw.commons.settings;
import android.os.Bundle;
import android.view.MenuItem;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.appcompat.widget.Toolbar;
import butterknife.BindView;
import butterknife.ButterKnife;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.theme.BaseActivity;
/**
* allows the user to change the settings
*/
public class SettingsActivity extends BaseActivity {
private AppCompatDelegate settingsDelegate;
@BindView(R.id.toolbar)
Toolbar toolbar;
/**
* to be called when the activity starts
* @param savedInstanceState the previously saved state
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
ButterKnife.bind(this);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
// Get an action bar
/**
* takes care of actions taken after the creation has happened
* @param savedInstanceState the saved state
*/
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
if (settingsDelegate == null) {
settingsDelegate = AppCompatDelegate.create(this, null);
}
settingsDelegate.onPostCreate(savedInstanceState);
}
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return true;
}
/**
* Handle action-bar clicks
* @param item the selected item
* @return true on success, false on failure
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
package fr.free.nrw.commons.settings;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import androidx.appcompat.app.AppCompatDelegate;
import fr.free.nrw.commons.databinding.ActivitySettingsBinding;
import fr.free.nrw.commons.theme.BaseActivity;
/**
* allows the user to change the settings
*/
public class SettingsActivity extends BaseActivity {
private ActivitySettingsBinding binding;
private AppCompatDelegate settingsDelegate;
/**
* to be called when the activity starts
* @param savedInstanceState the previously saved state
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivitySettingsBinding.inflate(getLayoutInflater());
final View view = binding.getRoot();
setContentView(view);
setSupportActionBar(binding.toolbarBinding.toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
// Get an action bar
/**
* takes care of actions taken after the creation has happened
* @param savedInstanceState the saved state
*/
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
if (settingsDelegate == null) {
settingsDelegate = AppCompatDelegate.create(this, null);
}
settingsDelegate.onPostCreate(savedInstanceState);
}
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return true;
}
/**
* Handle action-bar clicks
* @param item the selected item
* @return true on success, false on failure
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}

View file

@ -8,16 +8,12 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.Button;
import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder;
import com.facebook.drawee.view.SimpleDraweeView;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.databinding.FragmentSimilarImageDialogBinding;
import java.io.File;
/**
@ -26,17 +22,11 @@ import java.io.File;
public class SimilarImageDialogFragment extends DialogFragment {
@BindView(R.id.orginalImage)
SimpleDraweeView originalImage;
@BindView(R.id.possibleImage)
SimpleDraweeView possibleImage;
@BindView(R.id.postive_button)
Button positiveButton;
@BindView(R.id.negative_button)
Button negativeButton;
Callback callback;//Implemented interface from shareActivity
Boolean gotResponse = false;
private FragmentSimilarImageDialogBinding binding;
public SimilarImageDialogFragment() {
}
public interface Callback {
@ -51,17 +41,17 @@ public class SimilarImageDialogFragment extends DialogFragment {
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_similar_image_dialog, container, false);
ButterKnife.bind(this,view);
binding = FragmentSimilarImageDialogBinding.inflate(inflater, container, false);
originalImage.setHierarchy(GenericDraweeHierarchyBuilder
binding.orginalImage.setHierarchy(GenericDraweeHierarchyBuilder
.newInstance(getResources())
.setPlaceholderImage(VectorDrawableCompat.create(getResources(),
R.drawable.ic_image_black_24dp,getContext().getTheme()))
.setFailureImage(VectorDrawableCompat.create(getResources(),
R.drawable.ic_error_outline_black_24dp, getContext().getTheme()))
.build());
possibleImage.setHierarchy(GenericDraweeHierarchyBuilder
binding.possibleImage.setHierarchy(GenericDraweeHierarchyBuilder
.newInstance(getResources())
.setPlaceholderImage(VectorDrawableCompat.create(getResources(),
R.drawable.ic_image_black_24dp,getContext().getTheme()))
@ -69,10 +59,13 @@ public class SimilarImageDialogFragment extends DialogFragment {
R.drawable.ic_error_outline_black_24dp, getContext().getTheme()))
.build());
originalImage.setImageURI(Uri.fromFile(new File(getArguments().getString("originalImagePath"))));
possibleImage.setImageURI(Uri.fromFile(new File(getArguments().getString("possibleImagePath"))));
binding.orginalImage.setImageURI(Uri.fromFile(new File(getArguments().getString("originalImagePath"))));
binding.possibleImage.setImageURI(Uri.fromFile(new File(getArguments().getString("possibleImagePath"))));
return view;
binding.postiveButton.setOnClickListener(v -> onPositiveButtonClicked());
binding.negativeButton.setOnClickListener(v -> onNegativeButtonClicked());
return binding.getRoot();
}
@Override
@ -96,17 +89,21 @@ public class SimilarImageDialogFragment extends DialogFragment {
super.onDismiss(dialog);
}
@OnClick(R.id.negative_button)
public void onNegativeButtonClicked() {
callback.onNegativeResponse();
gotResponse = true;
dismiss();
}
@OnClick(R.id.postive_button)
public void onPositiveButtonClicked() {
callback.onPositiveResponse();
gotResponse = true;
dismiss();
}
@Override
public void onDestroy() {
super.onDestroy();
binding = null;
}
}

View file

@ -10,21 +10,16 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.facebook.drawee.view.SimpleDraweeView;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.databinding.ItemUploadThumbnailBinding;
import fr.free.nrw.commons.filepicker.UploadableFile;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.filepicker.UploadableFile;
/**
* The adapter class for image thumbnails to be shown while uploading.
*/
@ -33,6 +28,8 @@ class ThumbnailsAdapter extends RecyclerView.Adapter<ThumbnailsAdapter.ViewHolde
List<UploadableFile> uploadableFiles;
private Callback callback;
private ItemUploadThumbnailBinding binding;
public ThumbnailsAdapter(Callback callback) {
this.uploadableFiles = new ArrayList<>();
this.callback = callback;
@ -51,8 +48,8 @@ class ThumbnailsAdapter extends RecyclerView.Adapter<ThumbnailsAdapter.ViewHolde
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
return new ViewHolder(LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.item_upload_thumbnail, viewGroup, false));
binding = ItemUploadThumbnailBinding.inflate(LayoutInflater.from(viewGroup.getContext()), viewGroup, false);
return new ViewHolder(binding.getRoot());
}
@Override
@ -67,16 +64,16 @@ class ThumbnailsAdapter extends RecyclerView.Adapter<ThumbnailsAdapter.ViewHolde
public class ViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.rl_container)
RelativeLayout rlContainer;
@BindView(R.id.iv_thumbnail)
SimpleDraweeView background;
@BindView(R.id.iv_error)
ImageView ivError;
public ViewHolder(@NonNull View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
rlContainer = binding.rlContainer;
background = binding.ivThumbnail;
ivError = binding.ivError;
}
/**

View file

@ -21,28 +21,21 @@ import android.os.Bundle;
import android.provider.Settings;
import android.util.DisplayMetrics;
import android.view.View;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.cardview.widget.CardView;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;
import androidx.work.ExistingWorkPolicy;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.auth.LoginActivity;
import fr.free.nrw.commons.auth.SessionManager;
import fr.free.nrw.commons.contributions.ContributionController;
import fr.free.nrw.commons.databinding.ActivityUploadBinding;
import fr.free.nrw.commons.filepicker.Constants.RequestCodes;
import fr.free.nrw.commons.filepicker.UploadableFile;
import fr.free.nrw.commons.kvstore.BasicKvStore;
@ -93,28 +86,6 @@ public class UploadActivity extends BaseActivity implements UploadContract.View,
@Inject
LocationServiceManager locationManager;
@BindView(R.id.cv_container_top_card)
CardView cvContainerTopCard;
@BindView(R.id.ll_container_top_card)
LinearLayout llContainerTopCard;
@BindView(R.id.rl_container_title)
RelativeLayout rlContainerTitle;
@BindView(R.id.tv_top_card_title)
TextView tvTopCardTitle;
@BindView(R.id.ib_toggle_top_card)
ImageButton ibToggleTopCard;
@BindView(R.id.rv_thumbnails)
RecyclerView rvThumbnails;
@BindView(R.id.vp_upload)
ViewPager vpUpload;
private boolean isTitleExpanded = true;
private CompositeDisposable compositeDisposable;
@ -169,12 +140,15 @@ public class UploadActivity extends BaseActivity implements UploadContract.View,
*/
private boolean isFragmentsSaved = false;
private ActivityUploadBinding binding;
@SuppressLint("CheckResult")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_upload);
binding = ActivityUploadBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
/*
If Configuration of device is changed then get the new fragments
@ -190,7 +164,6 @@ public class UploadActivity extends BaseActivity implements UploadContract.View,
}
ButterKnife.bind(this);
compositeDisposable = new CompositeDisposable();
init();
nearbyPopupAnswers = new HashMap<>();
@ -223,17 +196,17 @@ public class UploadActivity extends BaseActivity implements UploadContract.View,
}
private void initThumbnailsRecyclerView() {
rvThumbnails.setLayoutManager(new LinearLayoutManager(this,
binding.rvThumbnails.setLayoutManager(new LinearLayoutManager(this,
LinearLayoutManager.HORIZONTAL, false));
thumbnailsAdapter = new ThumbnailsAdapter(() -> currentSelectedPosition);
rvThumbnails.setAdapter(thumbnailsAdapter);
binding.rvThumbnails.setAdapter(thumbnailsAdapter);
}
private void initViewPager() {
uploadImagesAdapter = new UploadImageAdapter(getSupportFragmentManager());
vpUpload.setAdapter(uploadImagesAdapter);
vpUpload.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
binding.vpUpload.setAdapter(uploadImagesAdapter);
binding.vpUpload.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
@ -244,10 +217,10 @@ public class UploadActivity extends BaseActivity implements UploadContract.View,
public void onPageSelected(int position) {
currentSelectedPosition = position;
if (position >= uploadableFiles.size()) {
cvContainerTopCard.setVisibility(View.GONE);
binding.cvContainerTopCard.setVisibility(View.GONE);
} else {
thumbnailsAdapter.notifyDataSetChanged();
cvContainerTopCard.setVisibility(View.VISIBLE);
binding.cvContainerTopCard.setVisibility(View.VISIBLE);
}
}
@ -298,14 +271,14 @@ public class UploadActivity extends BaseActivity implements UploadContract.View,
if (hasAllPermissions) {
// All required permissions are granted, so enable UI elements and perform actions
receiveSharedItems();
cvContainerTopCard.setVisibility(View.VISIBLE);
binding.cvContainerTopCard.setVisibility(View.VISIBLE);
} else {
// Permissions are missing
cvContainerTopCard.setVisibility(View.INVISIBLE);
binding.cvContainerTopCard.setVisibility(View.INVISIBLE);
if(showPermissionsDialog){
checkPermissionsAndPerformAction(this,
() -> {
cvContainerTopCard.setVisibility(View.VISIBLE);
binding.cvContainerTopCard.setVisibility(View.VISIBLE);
this.receiveSharedItems();
},() -> {
this.showPermissionsDialog = true;
@ -379,7 +352,7 @@ public class UploadActivity extends BaseActivity implements UploadContract.View,
@Override
public void showHideTopCard(boolean shouldShow) {
llContainerTopCard.setVisibility(shouldShow ? View.VISIBLE : View.GONE);
binding.llContainerTopCard.setVisibility(shouldShow ? View.VISIBLE : View.GONE);
}
@Override
@ -392,7 +365,7 @@ public class UploadActivity extends BaseActivity implements UploadContract.View,
@Override
public void updateTopCardTitle() {
tvTopCardTitle.setText(getResources()
binding.tvTopCardTitle.setText(getResources()
.getQuantityString(R.plurals.upload_count_title, uploadableFiles.size(), uploadableFiles.size()));
}
@ -475,9 +448,9 @@ public class UploadActivity extends BaseActivity implements UploadContract.View,
> 1) {//If there is only file, no need to show the image thumbnails
thumbnailsAdapter.setUploadableFiles(uploadableFiles);
} else {
llContainerTopCard.setVisibility(View.GONE);
binding.llContainerTopCard.setVisibility(View.GONE);
}
tvTopCardTitle.setText(getResources()
binding.tvTopCardTitle.setText(getResources()
.getQuantityString(R.plurals.upload_count_title, uploadableFiles.size(), uploadableFiles.size()));
@ -568,7 +541,7 @@ public class UploadActivity extends BaseActivity implements UploadContract.View,
public void changeThumbnail(int index, String filepath) {
uploadableFiles.remove(index);
uploadableFiles.add(index, new UploadableFile(new File(filepath)));
rvThumbnails.getAdapter().notifyDataSetChanged();
binding.rvThumbnails.getAdapter().notifyDataSetChanged();
}
@Override
@ -642,9 +615,9 @@ public class UploadActivity extends BaseActivity implements UploadContract.View,
@Override
public void onNextButtonClicked(int index) {
if (index < fragments.size() - 1) {
vpUpload.setCurrentItem(index + 1, false);
binding.vpUpload.setCurrentItem(index + 1, false);
fragments.get(index + 1).onBecameVisible();
((LinearLayoutManager) rvThumbnails.getLayoutManager())
((LinearLayoutManager) binding.rvThumbnails.getLayoutManager())
.scrollToPositionWithOffset((index > 0) ? index-1 : 0, 0);
} else {
presenter.handleSubmit();
@ -654,9 +627,9 @@ public class UploadActivity extends BaseActivity implements UploadContract.View,
@Override
public void onPreviousButtonClicked(int index) {
if (index != 0) {
vpUpload.setCurrentItem(index - 1, true);
binding.vpUpload.setCurrentItem(index - 1, true);
fragments.get(index - 1).onBecameVisible();
((LinearLayoutManager) rvThumbnails.getLayoutManager())
((LinearLayoutManager) binding.rvThumbnails.getLayoutManager())
.scrollToPositionWithOffset((index > 3) ? index-2 : 0, 0);
}
}
@ -691,7 +664,7 @@ public class UploadActivity extends BaseActivity implements UploadContract.View,
}
uploadImagesAdapter.setFragments(fragments);
vpUpload.setOffscreenPageLimit(fragments.size());
binding.vpUpload.setOffscreenPageLimit(fragments.size());
}
}
@ -719,9 +692,9 @@ public class UploadActivity extends BaseActivity implements UploadContract.View,
*/
@Override
public void highlightNextImageOnCancelledImage(int index, int maxSize) {
if (vpUpload != null && index < (maxSize)) {
vpUpload.setCurrentItem(index + 1, false);
vpUpload.setCurrentItem(index, false);
if (binding.vpUpload != null && index < (maxSize)) {
binding.vpUpload.setCurrentItem(index + 1, false);
binding.vpUpload.setCurrentItem(index, false);
}
}
@ -810,9 +783,9 @@ public class UploadActivity extends BaseActivity implements UploadContract.View,
@Override
public void onNextButtonClicked(int index) {
if (index < fragments.size() - 1) {
vpUpload.setCurrentItem(index + 1, false);
binding.vpUpload.setCurrentItem(index + 1, false);
fragments.get(index + 1).onBecameVisible();
((LinearLayoutManager) rvThumbnails.getLayoutManager())
((LinearLayoutManager) binding.rvThumbnails.getLayoutManager())
.scrollToPositionWithOffset((index > 0) ? index-1 : 0, 0);
} else {
presenter.handleSubmit();
@ -822,9 +795,9 @@ public class UploadActivity extends BaseActivity implements UploadContract.View,
@Override
public void onPreviousButtonClicked(int index) {
if (index != 0) {
vpUpload.setCurrentItem(index - 1, true);
binding.vpUpload.setCurrentItem(index - 1, true);
fragments.get(index - 1).onBecameVisible();
((LinearLayoutManager) rvThumbnails.getLayoutManager())
((LinearLayoutManager) binding.rvThumbnails.getLayoutManager())
.scrollToPositionWithOffset((index > 3) ? index-2 : 0, 0);
}
}
@ -866,9 +839,9 @@ public class UploadActivity extends BaseActivity implements UploadContract.View,
@OnClick(R.id.rl_container_title)
public void onRlContainerTitleClicked() {
rvThumbnails.setVisibility(isTitleExpanded ? View.GONE : View.VISIBLE);
binding.rvThumbnails.setVisibility(isTitleExpanded ? View.GONE : View.VISIBLE);
isTitleExpanded = !isTitleExpanded;
ibToggleTopCard.setRotation(ibToggleTopCard.getRotation() + 180);
binding.ibToggleTopCard.setRotation(binding.ibToggleTopCard.getRotation() + 180);
}
@Override

View file

@ -1,9 +1,7 @@
package fr.free.nrw.commons.upload;
import android.os.Bundle;
import androidx.annotation.Nullable;
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
/**

View file

@ -25,10 +25,9 @@ import androidx.annotation.Nullable;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView;
import butterknife.ButterKnife;
import com.google.android.material.textfield.TextInputLayout;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.databinding.RowItemDescriptionBinding;
import fr.free.nrw.commons.recentlanguages.Language;
import fr.free.nrw.commons.recentlanguages.RecentLanguagesAdapter;
import fr.free.nrw.commons.recentlanguages.RecentLanguagesDao;
@ -61,6 +60,8 @@ public class UploadMediaDetailAdapter extends
private SelectedVoiceIcon selectedVoiceIcon;
private static final int REQUEST_CODE_FOR_VOICE_INPUT = 1213;
private RowItemDescriptionBinding binding;
public UploadMediaDetailAdapter(Fragment fragment, String savedLanguageValue,
RecentLanguagesDao recentLanguagesDao) {
uploadMediaDetails = new ArrayList<>();
@ -100,8 +101,9 @@ public class UploadMediaDetailAdapter extends
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ViewHolder(LayoutInflater.from(parent.getContext())
.inflate(R.layout.row_item_description, parent, false));
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
binding = RowItemDescriptionBinding.inflate(inflater, parent, false);
return new ViewHolder(binding.getRoot());
}
/**
@ -203,44 +205,34 @@ public class UploadMediaDetailAdapter extends
public class ViewHolder extends RecyclerView.ViewHolder {
@Nullable
@BindView(R.id.description_languages)
TextView descriptionLanguages;
TextView descriptionLanguages ;
@BindView(R.id.description_item_edit_text)
PasteSensitiveTextInputEditText descItemEditText;
@BindView(R.id.description_item_edit_text_input_layout)
TextInputLayout descInputLayout;
@BindView(R.id.caption_item_edit_text)
PasteSensitiveTextInputEditText captionItemEditText;
@BindView(R.id.caption_item_edit_text_input_layout)
TextInputLayout captionInputLayout;
@BindView(R.id.btn_remove)
ImageView removeButton;
@BindView(R.id.btn_add)
ImageView addButton;
@BindView(R.id.cl_parent)
ConstraintLayout clParent;
@BindView(R.id.ll_write_better_caption)
LinearLayout betterCaptionLinearLayout;
@BindView(R.id.ll_write_better_description)
LinearLayout betterDescriptionLinearLayout;
private
AbstractTextWatcher captionListener;
AbstractTextWatcher descriptionListener;
public ViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
Timber.i("descItemEditText:" + descItemEditText);
}
@ -248,6 +240,18 @@ public class UploadMediaDetailAdapter extends
UploadMediaDetail uploadMediaDetail = uploadMediaDetails.get(position);
Timber.d("UploadMediaDetail is " + uploadMediaDetail);
descriptionLanguages = binding.descriptionLanguages;
descItemEditText = binding.descriptionItemEditText;
descInputLayout = binding.descriptionItemEditTextInputLayout;
captionItemEditText = binding.captionItemEditText;
captionInputLayout = binding.captionItemEditTextInputLayout;
removeButton = binding.btnRemove;
addButton = binding.btnAdd;
clParent = binding.clParent;
betterCaptionLinearLayout = binding.llWriteBetterCaption;
betterDescriptionLinearLayout = binding.llWriteBetterDescription;
descriptionLanguages.setFocusable(false);
captionItemEditText.addTextChangedListener(new AbstractTextWatcher(
value -> {
@ -495,7 +499,9 @@ public class UploadMediaDetailAdapter extends
((RecentLanguagesAdapter) adapterView
.getAdapter()).setSelectedLangCode(languageCode);
Timber.d("Description language code is: %s", languageCode);
descriptionLanguages.setText(languageCode);
if (descriptionLanguages!=null) {
descriptionLanguages.setText(languageCode);
}
dialog.dismiss();
}
@ -528,12 +534,15 @@ public class UploadMediaDetailAdapter extends
languageHistoryListView.setVisibility(View.VISIBLE);
recentLanguagesTextView.setVisibility(View.VISIBLE);
separator.setVisibility(View.VISIBLE);
final RecentLanguagesAdapter recentLanguagesAdapter
= new RecentLanguagesAdapter(
descriptionLanguages.getContext(),
recentLanguagesDao.getRecentLanguages(),
selectedLanguages);
languageHistoryListView.setAdapter(recentLanguagesAdapter);
if (descriptionLanguages!=null) {
final RecentLanguagesAdapter recentLanguagesAdapter
= new RecentLanguagesAdapter(
descriptionLanguages.getContext(),
recentLanguagesDao.getRecentLanguages(),
selectedLanguages);
languageHistoryListView.setAdapter(recentLanguagesAdapter);
}
}
}

View file

@ -201,8 +201,9 @@ class CategoriesPresenter @Inject constructor(
* @param wikiText current WikiText from server
*/
override fun updateCategories(media: Media, wikiText: String) {
//check if view.existingCategories is null
if (repository.selectedCategories.isNotEmpty()
|| repository.selectedExistingCategories.size != view.existingCategories.size
|| (view.existingCategories != null && repository.selectedExistingCategories.size != view.existingCategories.size)
) {
val selectedCategories: MutableList<String> =
(repository.selectedCategories.map { it.name }.toMutableList()

View file

@ -12,28 +12,19 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import com.google.android.material.textfield.TextInputLayout;
import com.jakewharton.rxbinding2.view.RxView;
import com.jakewharton.rxbinding2.widget.RxTextView;
import fr.free.nrw.commons.Media;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.category.CategoryItem;
import fr.free.nrw.commons.contributions.ContributionsFragment;
import fr.free.nrw.commons.databinding.UploadCategoriesFragmentBinding;
import fr.free.nrw.commons.media.MediaDetailFragment;
import fr.free.nrw.commons.ui.PasteSensitiveTextInputEditText;
import fr.free.nrw.commons.upload.UploadActivity;
import fr.free.nrw.commons.upload.UploadBaseFragment;
import fr.free.nrw.commons.utils.DialogUtil;
@ -48,25 +39,6 @@ import timber.log.Timber;
public class UploadCategoriesFragment extends UploadBaseFragment implements CategoriesContract.View {
@BindView(R.id.tv_title)
TextView tvTitle;
@BindView(R.id.tv_subtitle)
TextView tvSubTitle;
@BindView(R.id.til_container_search)
TextInputLayout tilContainerEtSearch;
@BindView(R.id.et_search)
PasteSensitiveTextInputEditText etSearch;
@BindView(R.id.pb_categories)
ProgressBar pbCategories;
@BindView(R.id.rv_categories)
RecyclerView rvCategories;
@BindView(R.id.tooltip)
ImageView tooltip;
@BindView(R.id.btn_next)
Button btnNext;
@BindView(R.id.btn_previous)
Button btnPrevious;
@Inject
CategoriesContract.UserActionListener presenter;
private UploadCategoryAdapter adapter;
@ -85,17 +57,19 @@ public class UploadCategoriesFragment extends UploadBaseFragment implements Cate
private String wikiText;
private String nearbyPlaceCategory;
private UploadCategoriesFragmentBinding binding;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.upload_categories_fragment, container, false);
binding = UploadCategoriesFragmentBinding.inflate(inflater, container, false);
return binding.getRoot();
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
ButterKnife.bind(this, view);
final Bundle bundle = getArguments();
if (bundle != null) {
media = bundle.getParcelable("Existing_Categories");
@ -108,20 +82,23 @@ public class UploadCategoriesFragment extends UploadBaseFragment implements Cate
}
private void init() {
if (binding == null) {
return;
}
if (media == null) {
if (callback != null) {
tvTitle.setText(getString(R.string.step_count, callback.getIndexInViewFlipper(this) + 1,
binding.tvTitle.setText(getString(R.string.step_count, callback.getIndexInViewFlipper(this) + 1,
callback.getTotalNumberOfSteps(), getString(R.string.categories_activity_title)));
}
} else {
tvTitle.setText(R.string.edit_categories);
tvSubTitle.setVisibility(View.GONE);
btnNext.setText(R.string.menu_save_categories);
btnPrevious.setText(R.string.menu_cancel_upload);
binding.tvTitle.setText(R.string.edit_categories);
binding.tvSubtitle.setVisibility(View.GONE);
binding.btnNext.setText(R.string.menu_save_categories);
binding.btnPrevious.setText(R.string.menu_cancel_upload);
}
setTvSubTitle();
tooltip.setOnClickListener(new OnClickListener() {
binding.tooltip.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
DialogUtil.showAlertDialog(getActivity(), getString(R.string.categories_activity_title), getString(R.string.categories_tooltip), getString(android.R.string.ok), null, true);
@ -132,14 +109,20 @@ public class UploadCategoriesFragment extends UploadBaseFragment implements Cate
} else {
presenter.onAttachViewWithMedia(this, media);
}
binding.btnNext.setOnClickListener(v -> onNextButtonClicked());
binding.btnPrevious.setOnClickListener(v -> onPreviousButtonClicked());
initRecyclerView();
addTextChangeListenerToEtSearch();
}
private void addTextChangeListenerToEtSearch() {
subscribe = RxTextView.textChanges(etSearch)
.doOnEach(v -> tilContainerEtSearch.setError(null))
.takeUntil(RxView.detaches(etSearch))
if (binding == null) {
return;
}
subscribe = RxTextView.textChanges(binding.etSearch)
.doOnEach(v -> binding.tilContainerSearch.setError(null))
.takeUntil(RxView.detaches(binding.etSearch))
.debounce(500, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(filter -> searchForCategory(filter.toString()), Timber::e);
@ -154,7 +137,7 @@ public class UploadCategoriesFragment extends UploadBaseFragment implements Cate
if (activity instanceof UploadActivity) {
final boolean isMultipleFileSelected = ((UploadActivity) activity).getIsMultipleFilesSelected();
if (!isMultipleFileSelected) {
tvSubTitle.setVisibility(View.GONE);
binding.tvSubtitle.setVisibility(View.GONE);
}
}
}
@ -168,8 +151,11 @@ public class UploadCategoriesFragment extends UploadBaseFragment implements Cate
presenter.onCategoryItemClicked(categoryItem);
return Unit.INSTANCE;
}, nearbyPlaceCategory);
rvCategories.setLayoutManager(new LinearLayoutManager(getContext()));
rvCategories.setAdapter(adapter);
if (binding!=null) {
binding.rvCategories.setLayoutManager(new LinearLayoutManager(getContext()));
binding.rvCategories.setAdapter(adapter);
}
}
@Override
@ -181,17 +167,23 @@ public class UploadCategoriesFragment extends UploadBaseFragment implements Cate
@Override
public void showProgress(boolean shouldShow) {
pbCategories.setVisibility(shouldShow ? View.VISIBLE : View.GONE);
if (binding != null) {
binding.pbCategories.setVisibility(shouldShow ? View.VISIBLE : View.GONE);
}
}
@Override
public void showError(String error) {
tilContainerEtSearch.setError(error);
if (binding != null) {
binding.tilContainerSearch.setError(error);
}
}
@Override
public void showError(int stringResourceId) {
tilContainerEtSearch.setError(getString(stringResourceId));
if (binding != null) {
binding.tilContainerSearch.setError(getString(stringResourceId));
}
}
@Override
@ -203,16 +195,20 @@ public class UploadCategoriesFragment extends UploadBaseFragment implements Cate
}
adapter.notifyDataSetChanged();
if (binding == null) {
return;
}
// Nested waiting for search result data to load into the category
// list and smoothly scroll to the top of the search result list.
rvCategories.post(new Runnable() {
binding.rvCategories.post(new Runnable() {
@Override
public void run() {
rvCategories.smoothScrollToPosition(0);
rvCategories.post(new Runnable() {
binding.rvCategories.smoothScrollToPosition(0);
binding.rvCategories.post(new Runnable() {
@Override
public void run() {
rvCategories.smoothScrollToPosition(0);
binding.rvCategories.smoothScrollToPosition(0);
}
});
}
@ -284,7 +280,9 @@ public class UploadCategoriesFragment extends UploadBaseFragment implements Cate
*/
@Override
public void dismissProgressDialog() {
progressDialog.dismiss();
if (progressDialog != null) {
progressDialog.dismiss();
}
}
/**
@ -297,7 +295,6 @@ public class UploadCategoriesFragment extends UploadBaseFragment implements Cate
mediaDetailFragment.updateCategories();
}
@OnClick(R.id.btn_next)
public void onNextButtonClicked() {
if (media != null) {
presenter.updateCategories(media, wikiText);
@ -306,7 +303,6 @@ public class UploadCategoriesFragment extends UploadBaseFragment implements Cate
}
}
@OnClick(R.id.btn_previous)
public void onPreviousButtonClicked() {
if (media != null) {
presenter.clearPreviousSelection();
@ -325,8 +321,11 @@ public class UploadCategoriesFragment extends UploadBaseFragment implements Cate
@Override
protected void onBecameVisible() {
super.onBecameVisible();
if (binding == null) {
return;
}
presenter.selectCategories();
final Editable text = etSearch.getText();
final Editable text = binding.etSearch.getText();
if (text != null) {
presenter.searchForCategories(text.toString());
}
@ -340,9 +339,9 @@ public class UploadCategoriesFragment extends UploadBaseFragment implements Cate
super.onResume();
if (media != null) {
etSearch.setOnKeyListener((v, keyCode, event) -> {
binding.etSearch.setOnKeyListener((v, keyCode, event) -> {
if (keyCode == KeyEvent.KEYCODE_BACK) {
etSearch.clearFocus();
binding.etSearch.clearFocus();
presenter.clearPreviousSelection();
final MediaDetailFragment mediaDetailFragment = (MediaDetailFragment) getParentFragment();
assert mediaDetailFragment != null;
@ -374,7 +373,7 @@ public class UploadCategoriesFragment extends UploadBaseFragment implements Cate
if (getParentFragment().getParentFragment().getParentFragment()
instanceof ContributionsFragment) {
((ContributionsFragment) (getParentFragment()
.getParentFragment().getParentFragment())).nearbyNotificationCardView
.getParentFragment().getParentFragment())).binding.cardViewNearby
.setVisibility(View.GONE);
}
}
@ -392,4 +391,10 @@ public class UploadCategoriesFragment extends UploadBaseFragment implements Cate
.show();
}
}
@Override
public void onDestroy() {
super.onDestroy();
binding = null;
}
}

View file

@ -10,29 +10,20 @@ import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import com.google.android.material.textfield.TextInputLayout;
import com.jakewharton.rxbinding2.view.RxView;
import com.jakewharton.rxbinding2.widget.RxTextView;
import fr.free.nrw.commons.Media;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.contributions.ContributionsFragment;
import fr.free.nrw.commons.databinding.UploadDepictsFragmentBinding;
import fr.free.nrw.commons.kvstore.JsonKvStore;
import fr.free.nrw.commons.media.MediaDetailFragment;
import fr.free.nrw.commons.nearby.Place;
import fr.free.nrw.commons.ui.PasteSensitiveTextInputEditText;
import fr.free.nrw.commons.upload.UploadActivity;
import fr.free.nrw.commons.upload.UploadBaseFragment;
import fr.free.nrw.commons.upload.structure.depictions.DepictedItem;
@ -53,24 +44,6 @@ import timber.log.Timber;
*/
public class DepictsFragment extends UploadBaseFragment implements DepictsContract.View {
@BindView(R.id.depicts_title)
TextView depictsTitle;
@BindView(R.id.depicts_subtitle)
TextView depictsSubTitle;
@BindView(R.id.depicts_search_container)
TextInputLayout depictsSearchContainer;
@BindView(R.id.depicts_search)
PasteSensitiveTextInputEditText depictsSearch;
@BindView(R.id.depictsSearchInProgress)
ProgressBar depictsSearchInProgress;
@BindView(R.id.depicts_recycler_view)
RecyclerView depictsRecyclerView;
@BindView(R.id.tooltip)
ImageView tooltip;
@BindView(R.id.depicts_next)
Button btnNext;
@BindView(R.id.depicts_previous)
Button btnPrevious;
@Inject
@Named("default_preferences")
public
@ -88,18 +61,20 @@ public class DepictsFragment extends UploadBaseFragment implements DepictsContra
private int count;
private Place nearbyPlace;
private UploadDepictsFragmentBinding binding;
@Nullable
@Override
public android.view.View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.upload_depicts_fragment, container, false);
binding = UploadDepictsFragmentBinding.inflate(inflater, container, false);
return binding.getRoot();
}
@Override
public void onViewCreated(@NonNull android.view.View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
ButterKnife.bind(this, view);
Bundle bundle = getArguments();
if (bundle != null) {
media = bundle.getParcelable("Existing_Depicts");
@ -117,18 +92,22 @@ public class DepictsFragment extends UploadBaseFragment implements DepictsContra
*/
private void init() {
if (binding == null) {
return;
}
if (media == null) {
depictsTitle.setText(String.format(getString(R.string.step_count), callback.getIndexInViewFlipper(this) + 1,
binding.depictsTitle.setText(String.format(getString(R.string.step_count), callback.getIndexInViewFlipper(this) + 1,
callback.getTotalNumberOfSteps(), getString(R.string.depicts_step_title)));
} else {
depictsTitle.setText(R.string.edit_depictions);
depictsSubTitle.setVisibility(View.GONE);
btnNext.setText(R.string.menu_save_categories);
btnPrevious.setText(R.string.menu_cancel_upload);
binding.depictsTitle.setText(R.string.edit_depictions);
binding.depictsSubtitle.setVisibility(View.GONE);
binding.depictsNext.setText(R.string.menu_save_categories);
binding.depictsPrevious.setText(R.string.menu_cancel_upload);
}
setDepictsSubTitle();
tooltip.setOnClickListener(v -> DialogUtil
binding.tooltip.setOnClickListener(v -> DialogUtil
.showAlertDialog(getActivity(), getString(R.string.depicts_step_title),
getString(R.string.depicts_tooltip), getString(android.R.string.ok), null, true));
if (media == null) {
@ -138,6 +117,9 @@ public class DepictsFragment extends UploadBaseFragment implements DepictsContra
}
initRecyclerView();
addTextChangeListenerToSearchBox();
binding.depictsNext.setOnClickListener(v->onNextButtonClicked());
binding.depictsPrevious.setOnClickListener(v->onPreviousButtonClicked());
}
/**
@ -149,7 +131,7 @@ public class DepictsFragment extends UploadBaseFragment implements DepictsContra
if (activity instanceof UploadActivity) {
final boolean isMultipleFileSelected = ((UploadActivity) activity).getIsMultipleFilesSelected();
if (!isMultipleFileSelected) {
depictsSubTitle.setVisibility(View.GONE);
binding.depictsSubtitle.setVisibility(View.GONE);
}
}
}
@ -169,8 +151,11 @@ public class DepictsFragment extends UploadBaseFragment implements DepictsContra
return Unit.INSTANCE;
}, nearbyPlace);
}
depictsRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
depictsRecyclerView.setAdapter(adapter);
if (binding == null) {
return;
}
binding.depictsRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
binding.depictsRecyclerView.setAdapter(adapter);
}
@Override
@ -221,15 +206,21 @@ public class DepictsFragment extends UploadBaseFragment implements DepictsContra
@Override
public void showProgress(boolean shouldShow) {
depictsSearchInProgress.setVisibility(shouldShow ? View.VISIBLE : View.GONE);
if (binding == null) {
return;
}
binding.depictsSearchInProgress.setVisibility(shouldShow ? View.VISIBLE : View.GONE);
}
@Override
public void showError(Boolean value) {
if (binding == null) {
return;
}
if (value) {
depictsSearchContainer.setError(getString(R.string.no_depiction_found));
binding.depictsSearchContainer.setError(getString(R.string.no_depiction_found));
} else {
depictsSearchContainer.setErrorEnabled(false);
binding.depictsSearchContainer.setErrorEnabled(false);
}
}
@ -249,16 +240,19 @@ public class DepictsFragment extends UploadBaseFragment implements DepictsContra
}
}
if (binding == null) {
return;
}
// Nested waiting for search result data to load into the depicted item
// list and smoothly scroll to the top of the search result list.
depictsRecyclerView.post(new Runnable() {
binding.depictsRecyclerView.post(new Runnable() {
@Override
public void run() {
depictsRecyclerView.smoothScrollToPosition(0);
depictsRecyclerView.post(new Runnable() {
binding.depictsRecyclerView.smoothScrollToPosition(0);
binding.depictsRecyclerView.post(new Runnable() {
@Override
public void run() {
depictsRecyclerView.smoothScrollToPosition(0);
binding.depictsRecyclerView.smoothScrollToPosition(0);
}
});
}
@ -320,7 +314,6 @@ public class DepictsFragment extends UploadBaseFragment implements DepictsContra
/**
* Determines the calling fragment by media nullability and act accordingly
*/
@OnClick(R.id.depicts_next)
public void onNextButtonClicked() {
if(media != null){
presenter.updateDepictions(media);
@ -332,7 +325,6 @@ public class DepictsFragment extends UploadBaseFragment implements DepictsContra
/**
* Determines the calling fragment by media nullability and act accordingly
*/
@OnClick(R.id.depicts_previous)
public void onPreviousButtonClicked() {
if(media != null){
presenter.clearPreviousSelection();
@ -347,9 +339,9 @@ public class DepictsFragment extends UploadBaseFragment implements DepictsContra
* Text change listener for the edit text view of depicts
*/
private void addTextChangeListenerToSearchBox() {
subscribe = RxTextView.textChanges(depictsSearch)
.doOnEach(v -> depictsSearchContainer.setError(null))
.takeUntil(RxView.detaches(depictsSearch))
subscribe = RxTextView.textChanges(binding.depictsSearch)
.doOnEach(v -> binding.depictsSearchContainer.setError(null))
.takeUntil(RxView.detaches(binding.depictsSearch))
.debounce(500, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(filter -> searchForDepictions(filter.toString()), Timber::e);
@ -374,9 +366,9 @@ public class DepictsFragment extends UploadBaseFragment implements DepictsContra
super.onResume();
if (media != null) {
depictsSearch.setOnKeyListener((v, keyCode, event) -> {
binding.depictsSearch.setOnKeyListener((v, keyCode, event) -> {
if (keyCode == KeyEvent.KEYCODE_BACK) {
depictsSearch.clearFocus();
binding.depictsSearch.clearFocus();
presenter.clearPreviousSelection();
updateDepicts();
goBackToPreviousScreen();
@ -404,7 +396,7 @@ public class DepictsFragment extends UploadBaseFragment implements DepictsContra
if (getParentFragment().getParentFragment().getParentFragment()
instanceof ContributionsFragment) {
((ContributionsFragment) (getParentFragment()
.getParentFragment().getParentFragment())).nearbyNotificationCardView
.getParentFragment().getParentFragment())).binding.cardViewNearby
.setVisibility(View.GONE);
}
}
@ -422,4 +414,10 @@ public class DepictsFragment extends UploadBaseFragment implements DepictsContra
.show();
}
}
@Override
public void onDestroy() {
super.onDestroy();
binding = null;
}
}

View file

@ -10,10 +10,14 @@ import android.text.style.ClickableSpan;
import android.text.style.URLSpan;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@ -21,10 +25,18 @@ import androidx.annotation.Nullable;
import fr.free.nrw.commons.databinding.FragmentMediaLicenseBinding;
import fr.free.nrw.commons.upload.UploadActivity;
import fr.free.nrw.commons.utils.DialogUtil;
import java.util.List;
import javax.inject.Inject;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.Utils;
import fr.free.nrw.commons.databinding.FragmentMediaLicenseBinding;
import fr.free.nrw.commons.upload.UploadActivity;
import fr.free.nrw.commons.upload.UploadBaseFragment;
import fr.free.nrw.commons.utils.DialogUtil;
import java.util.List;
import javax.inject.Inject;
import timber.log.Timber;

View file

@ -7,8 +7,10 @@ import static fr.free.nrw.commons.utils.ImageUtils.getErrorMessageForResult;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Parcelable;
import android.speech.RecognizerIntent;
import android.text.TextUtils;
import android.view.LayoutInflater;
@ -16,25 +18,16 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import android.graphics.drawable.Drawable;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatButton;
import androidx.appcompat.widget.AppCompatImageButton;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import com.github.chrisbanes.photoview.PhotoView;
import com.mapbox.mapboxsdk.camera.CameraPosition;
import fr.free.nrw.commons.LocationPicker.LocationPicker;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.edit.EditActivity;
import fr.free.nrw.commons.contributions.MainActivity;
import fr.free.nrw.commons.databinding.FragmentUploadMediaDetailFragmentBinding;
import fr.free.nrw.commons.edit.EditActivity;
import fr.free.nrw.commons.filepicker.UploadableFile;
import fr.free.nrw.commons.kvstore.JsonKvStore;
import fr.free.nrw.commons.location.LatLng;
@ -60,7 +53,6 @@ import javax.inject.Inject;
import javax.inject.Named;
import org.apache.commons.lang3.StringUtils;
import timber.log.Timber;
import android.os.Parcelable;
public class UploadMediaDetailFragment extends UploadBaseFragment implements
UploadMediaDetailsContract.View, UploadMediaDetailAdapter.EventListener {
@ -85,34 +77,9 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements
public static final String UPLOADABLE_FILE = "uploadable_file";
public static final String UPLOAD_MEDIA_DETAILS = "upload_media_detail_adapter";
@BindView(R.id.tv_title)
TextView tvTitle;
@BindView(R.id.location_image_view)
ImageView locationImageView;
@BindView(R.id.location_text_view)
TextView locationTextView;
@BindView(R.id.ll_location_status)
LinearLayout llLocationStatus;
@BindView(R.id.ib_expand_collapse)
AppCompatImageButton ibExpandCollapse;
@BindView(R.id.ll_container_media_detail)
LinearLayout llContainerMediaDetail;
@BindView(R.id.rv_descriptions)
RecyclerView rvDescriptions;
@BindView(R.id.backgroundImage)
PhotoView photoViewBackgroundImage;
@BindView(R.id.btn_next)
AppCompatButton btnNext;
@BindView(R.id.btn_previous)
AppCompatButton btnPrevious;
@BindView(R.id.ll_edit_image)
LinearLayout llEditImage;
@BindView(R.id.tooltip)
ImageView tooltip;
private UploadMediaDetailAdapter uploadMediaDetailAdapter;
@BindView(R.id.btn_copy_subsequent_media)
AppCompatButton btnCopyToSubsequentMedia;
@Inject
UploadMediaDetailsContract.UserActionListener presenter;
@ -158,6 +125,8 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements
private UploadMediaDetailFragmentCallback callback;
private FragmentUploadMediaDetailFragmentBinding binding;
public void setCallback(UploadMediaDetailFragmentCallback callback) {
this.callback = callback;
}
@ -186,14 +155,14 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_upload_media_detail_fragment, container, false);
binding = FragmentUploadMediaDetailFragmentBinding.inflate(inflater, container, false);
return binding.getRoot();
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
ButterKnife.bind(this, view);
if (callback != null) {
init();
@ -209,43 +178,54 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements
}
private void init() {
tvTitle.setText(getString(R.string.step_count, callback.getIndexInViewFlipper(this) + 1,
if (binding == null) {
return;
}
binding.tvTitle.setText(getString(R.string.step_count, callback.getIndexInViewFlipper(this) + 1,
callback.getTotalNumberOfSteps(), getString(R.string.media_detail_step_title)));
tooltip.setOnClickListener(
binding.tooltip.setOnClickListener(
v -> showInfoAlert(R.string.media_detail_step_title, R.string.media_details_tooltip));
initPresenter();
presenter.receiveImage(uploadableFile, place, inAppPictureLocation);
initRecyclerView();
if (callback.getIndexInViewFlipper(this) == 0) {
btnPrevious.setEnabled(false);
btnPrevious.setAlpha(0.5f);
binding.btnPrevious.setEnabled(false);
binding.btnPrevious.setAlpha(0.5f);
} else {
btnPrevious.setEnabled(true);
btnPrevious.setAlpha(1.0f);
binding.btnPrevious.setEnabled(true);
binding.btnPrevious.setAlpha(1.0f);
}
// If the image EXIF data contains the location, show the map icon with a green tick
if (inAppPictureLocation != null ||
(uploadableFile != null && uploadableFile.hasLocation())) {
Drawable mapTick = getResources().getDrawable(R.drawable.ic_map_available_20dp);
locationImageView.setImageDrawable(mapTick);
locationTextView.setText(R.string.edit_location);
binding.locationImageView.setImageDrawable(mapTick);
binding.locationTextView.setText(R.string.edit_location);
} else {
// Otherwise, show the map icon with a red question mark
Drawable mapQuestionMark =
getResources().getDrawable(R.drawable.ic_map_not_available_20dp);
locationImageView.setImageDrawable(mapQuestionMark);
locationTextView.setText(R.string.add_location);
binding.locationImageView.setImageDrawable(mapQuestionMark);
binding.locationTextView.setText(R.string.add_location);
}
//If this is the last media, we have nothing to copy, lets not show the button
if (callback.getIndexInViewFlipper(this) == callback.getTotalNumberOfSteps() - 4) {
btnCopyToSubsequentMedia.setVisibility(View.GONE);
binding.btnCopySubsequentMedia.setVisibility(View.GONE);
} else {
btnCopyToSubsequentMedia.setVisibility(View.VISIBLE);
binding.btnCopySubsequentMedia.setVisibility(View.VISIBLE);
}
binding.btnNext.setOnClickListener(v -> onNextButtonClicked());
binding.btnPrevious.setOnClickListener(v -> onPreviousButtonClicked());
binding.llEditImage.setOnClickListener(v -> onEditButtonClicked());
binding.llContainerTitle.setOnClickListener(v -> onLlContainerTitleClicked());
binding.llLocationStatus.setOnClickListener(v -> onIbMapClicked());
binding.btnCopySubsequentMedia.setOnClickListener(v -> onButtonCopyTitleDescToSubsequentMedia());
attachImageViewScaleChangeListener();
}
@ -253,7 +233,7 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements
* Attaches the scale change listener to the image view
*/
private void attachImageViewScaleChangeListener() {
photoViewBackgroundImage.setOnScaleChangeListener(
binding.backgroundImage.setOnScaleChangeListener(
(scaleFactor, focusX, focusY) -> {
//Whenever the uses plays with the image, lets collapse the media detail container
expandCollapseLlMediaDetail(false);
@ -275,8 +255,8 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements
defaultKvStore.getString(Prefs.DESCRIPTION_LANGUAGE, ""), recentLanguagesDao);
uploadMediaDetailAdapter.setCallback(this::showInfoAlert);
uploadMediaDetailAdapter.setEventListener(this);
rvDescriptions.setLayoutManager(new LinearLayoutManager(getContext()));
rvDescriptions.setAdapter(uploadMediaDetailAdapter);
binding.rvDescriptions.setLayoutManager(new LinearLayoutManager(getContext()));
binding.rvDescriptions.setAdapter(uploadMediaDetailAdapter);
}
/**
@ -289,8 +269,11 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements
getString(messageStringId), getString(android.R.string.ok), null, true);
}
@OnClick(R.id.btn_next)
public void onNextButtonClicked() {
if (callback == null) {
return;
}
boolean isValidUploads = presenter.verifyImageQuality(callback.getIndexInViewFlipper(this), inAppPictureLocation);
if (!isValidUploads) {
startActivityWithFlags(
@ -299,12 +282,13 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements
}
}
@OnClick(R.id.btn_previous)
public void onPreviousButtonClicked() {
if (callback == null) {
return;
}
callback.onPreviousButtonClicked(callback.getIndexInViewFlipper(this));
}
@OnClick(R.id.ll_edit_image)
public void onEditButtonClicked() {
presenter.onEditButtonClicked(callback.getIndexInViewFlipper(this));
}
@ -340,7 +324,10 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements
@Override
public void onImageProcessed(UploadItem uploadItem, Place place) {
photoViewBackgroundImage.setImageURI(uploadItem.getMediaUri());
if (binding == null) {
return;
}
binding.backgroundImage.setImageURI(uploadItem.getMediaUri());
}
/**
@ -353,12 +340,17 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements
nearbyPlace = place;
this.uploadItem = uploadItem;
showNearbyFound = true;
if (callback == null) {
return;
}
if (callback.getIndexInViewFlipper(this) == 0) {
if (UploadActivity.nearbyPopupAnswers.containsKey(nearbyPlace)) {
final boolean response = UploadActivity.nearbyPopupAnswers.get(nearbyPlace);
if (response) {
presenter.onUserConfirmedUploadIsOfPlace(nearbyPlace,
callback.getIndexInViewFlipper(this));
if (callback != null) {
presenter.onUserConfirmedUploadIsOfPlace(nearbyPlace,
callback.getIndexInViewFlipper(this));
}
}
} else {
showNearbyPlaceFound(nearbyPlace);
@ -394,11 +386,17 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements
@Override
public void showProgress(boolean shouldShow) {
if (callback == null) {
return;
}
callback.showProgress(shouldShow);
}
@Override
public void onImageValidationSuccess() {
if (callback == null) {
return;
}
callback.onNextButtonClicked(callback.getIndexInViewFlipper(this));
}
@ -408,13 +406,18 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements
@Override
protected void onBecameVisible() {
super.onBecameVisible();
if (callback == null) {
return;
}
presenter.fetchTitleAndDescription(callback.getIndexInViewFlipper(this));
if (showNearbyFound) {
if (UploadActivity.nearbyPopupAnswers.containsKey(nearbyPlace)) {
final boolean response = UploadActivity.nearbyPopupAnswers.get(nearbyPlace);
if (response) {
presenter.onUserConfirmedUploadIsOfPlace(nearbyPlace,
callback.getIndexInViewFlipper(this));
if (callback != null) {
presenter.onUserConfirmedUploadIsOfPlace(nearbyPlace,
callback.getIndexInViewFlipper(this));
}
}
} else {
showNearbyPlaceFound(nearbyPlace);
@ -615,10 +618,13 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements
return;
}
try {
photoViewBackgroundImage.setImageURI(Uri.fromFile(new File(result)));
if (binding != null){
binding.backgroundImage.setImageURI(Uri.fromFile(new File(result)));
}
editableUploadItem.setContentUri(Uri.fromFile(new File(result)));
callback.changeThumbnail(callback.getIndexInViewFlipper(this),
result);
if (callback != null) {
callback.changeThumbnail(callback.getIndexInViewFlipper(this), result);
}
} catch (Exception e) {
Timber.e(e);
}
@ -649,8 +655,11 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements
// Replace the map icon using the one with a green tick
Drawable mapTick = getResources().getDrawable(R.drawable.ic_map_available_20dp);
locationImageView.setImageDrawable(mapTick);
locationTextView.setText(R.string.edit_location);
if (binding != null) {
binding.locationImageView.setImageDrawable(mapTick);
binding.locationTextView.setText(R.string.edit_location);
}
Toast.makeText(getContext(), "Location Updated", Toast.LENGTH_LONG).show();
@ -703,6 +712,9 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements
}
private void deleteThisPicture() {
if (callback == null) {
return;
}
callback.deletePictureAtIndex(callback.getIndexInViewFlipper(this));
}
@ -712,7 +724,6 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements
presenter.onDetachView();
}
@OnClick(R.id.ll_container_title)
public void onLlContainerTitleClicked() {
expandCollapseLlMediaDetail(!isExpanded);
}
@ -722,23 +733,32 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements
* @param shouldExpand
*/
private void expandCollapseLlMediaDetail(boolean shouldExpand){
llContainerMediaDetail.setVisibility(shouldExpand ? View.VISIBLE : View.GONE);
if (binding == null) {
return;
}
binding.llContainerMediaDetail.setVisibility(shouldExpand ? View.VISIBLE : View.GONE);
isExpanded = !isExpanded;
ibExpandCollapse.setRotation(ibExpandCollapse.getRotation() + 180);
binding.ibExpandCollapse.setRotation(binding.ibExpandCollapse.getRotation() + 180);
}
@OnClick(R.id.ll_location_status) public void onIbMapClicked() {
public void onIbMapClicked() {
if (callback == null) {
return;
}
presenter.onMapIconClicked(callback.getIndexInViewFlipper(this));
}
@Override
public void onPrimaryCaptionTextChange(boolean isNotEmpty) {
btnCopyToSubsequentMedia.setEnabled(isNotEmpty);
btnCopyToSubsequentMedia.setClickable(isNotEmpty);
btnCopyToSubsequentMedia.setAlpha(isNotEmpty ? 1.0f : 0.5f);
btnNext.setEnabled(isNotEmpty);
btnNext.setClickable(isNotEmpty);
btnNext.setAlpha(isNotEmpty ? 1.0f : 0.5f);
if (binding == null) {
return;
}
binding.btnCopySubsequentMedia.setEnabled(isNotEmpty);
binding.btnCopySubsequentMedia.setClickable(isNotEmpty);
binding.btnCopySubsequentMedia.setAlpha(isNotEmpty ? 1.0f : 0.5f);
binding.btnNext.setEnabled(isNotEmpty);
binding.btnNext.setClickable(isNotEmpty);
binding.btnNext.setAlpha(isNotEmpty ? 1.0f : 0.5f);
}
/**
@ -749,7 +769,7 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements
UploadMediaDetail uploadMediaDetail = new UploadMediaDetail();
uploadMediaDetail.setManuallyAdded(true);//This was manually added by the user
uploadMediaDetailAdapter.addDescription(uploadMediaDetail);
rvDescriptions.smoothScrollToPosition(uploadMediaDetailAdapter.getItemCount()-1);
binding.rvDescriptions.smoothScrollToPosition(uploadMediaDetailAdapter.getItemCount()-1);
}
public interface UploadMediaDetailFragmentCallback extends Callback {
@ -760,8 +780,10 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements
}
@OnClick(R.id.btn_copy_subsequent_media)
public void onButtonCopyTitleDescToSubsequentMedia(){
if (callback == null) {
return;
}
presenter.copyTitleAndDescriptionToSubsequentMedia(callback.getIndexInViewFlipper(this));
Toast.makeText(getContext(), getResources().getString(R.string.copied_successfully), Toast.LENGTH_SHORT).show();
}
@ -779,5 +801,9 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements
}
}
@Override
public void onDestroy() {
super.onDestroy();
binding = null;
}
}

View file

@ -15,7 +15,9 @@
android:layout_height="wrap_content"
android:background="?attr/mainBackground">
<include layout="@layout/toolbar"/>
<include
android:id="@+id/toolbarBinding"
layout="@layout/toolbar"/>
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab_layout"
@ -44,4 +46,4 @@
android:layout_below="@id/toolbar_layout" />
</RelativeLayout>
</androidx.drawerlayout.widget.DrawerLayout>
</androidx.drawerlayout.widget.DrawerLayout>

View file

@ -11,6 +11,7 @@
android:orientation="vertical">
<include
android:id="@+id/toolbarBinding"
layout="@layout/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
@ -45,4 +46,4 @@
</RelativeLayout>
</LinearLayout>
</androidx.drawerlayout.widget.DrawerLayout>
</androidx.drawerlayout.widget.DrawerLayout>

View file

@ -11,7 +11,9 @@
android:id="@+id/toolbarLayout"
android:layout_width="wrap_content"
android:layout_height="?attr/actionBarSize">
<include layout="@layout/toolbar" />
<include
android:id="@+id/toolbarBinding"
layout="@layout/toolbar" />
</LinearLayout>
<RelativeLayout
android:layout_width="match_parent"
@ -27,4 +29,4 @@
tools:layout="@xml/preferences"
/>
</RelativeLayout>
</androidx.drawerlayout.widget.DrawerLayout>
</androidx.drawerlayout.widget.DrawerLayout>

View file

@ -15,7 +15,9 @@
android:layout_height="wrap_content"
android:background="?attr/mainBackground">
<include layout="@layout/toolbar"/>
<include
android:id="@+id/toolbarBinding"
layout="@layout/toolbar"/>
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab_layout"
@ -44,4 +46,4 @@
android:layout_below="@id/toolbar_layout" />
</RelativeLayout>
</androidx.drawerlayout.widget.DrawerLayout>
</androidx.drawerlayout.widget.DrawerLayout>

View file

@ -67,7 +67,7 @@
app:elevation="@dimen/dimen_6" />
<include
android:id="@+id/bottom_sheet_details"
android:id="@+id/bottom_sheet_details_binding"
layout="@layout/bottom_sheet_details_explore" />
<ProgressBar
@ -78,4 +78,4 @@
android:visibility="gone"
app:elevation="@dimen/dimen_6" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View file

@ -7,7 +7,9 @@
android:gravity="center_horizontal"
android:orientation="vertical">
<include layout="@layout/toolbar" />
<include
android:id="@+id/toolbarBinding"
layout="@layout/toolbar" />
<RelativeLayout
android:layout_width="match_parent"

View file

@ -84,6 +84,7 @@
<string name="login_success">Kirjautuminen onnistui!</string>
<string name="login_failed">Kirjautuminen epäonnistui!</string>
<string name="upload_failed">Tiedostoa ei löytynyt. Yritä toista tiedostoa.</string>
<string name="unrestricted_battery_mode">Poistetaanko akun optimointi käytöstä?</string>
<string name="authentication_failed">Tunnistautuminen epäonnistui, kirjaudu uudelleen sisään</string>
<string name="uploading_started">Tallentaminen aloitettiin!</string>
<string name="uploading_queued">Lataus jonossa (rajoitettu yhteystila käytössä)</string>
@ -314,7 +315,7 @@
<string name="search_tab_title_categories">Luokat</string>
<string name="search_tab_title_depictions">Kohteet</string>
<string name="explore_tab_title_featured">Suositeltu</string>
<string name="explore_tab_title_mobile">Tallennettu mobiilin kautta</string>
<string name="explore_tab_title_mobile">Tallennettu mobiililaitteella</string>
<string name="explore_tab_title_map">Kartta</string>
<string name="successful_wikidata_edit">Kuva lisätty Wikidata-kohteeseen %1$s!</string>
<string name="wikidata_edit_failure">Vastaavaa Wikidata-kohdetta ei voitu päivittää!</string>
@ -651,11 +652,16 @@
<string name="mark_as_not_for_upload">Merkitse ei-tallennettavaksi</string>
<string name="this_image_is_already_uploaded">Tämä kuva on jo tallennettu</string>
<string name="image_selected">Kuva valittu</string>
<string name="menu_view_report">Ilmoita</string>
<string name="menu_view_set_white_background">Aseta valkoinen tausta</string>
<string name="menu_view_set_black_background">Aseta musta tausta</string>
<string name="report_user">Ilmianna käyttäjä</string>
<string name="report_content">Ilmianna sisältö</string>
<string name="request_user_block">Pyydä tämän käyttäjän estämistä</string>
<string name="welcome_to_full_screen_mode_text">Tervetuloa koko näytön valintatilaan</string>
<string name="full_screen_mode_zoom_info">Käytä kahta sormea lähentääksesi ja loitontaaksesi.</string>
<string name="full_screen_mode_features_info">Pyyhkäise nopeasti ja pitkään suorittaaksesi nämä toiminnot: \n- Vasen/Oikea: Siirry edelliseen/seuraavaan \n- Ylös: Valitse\n- Alas: Merkitse ei-tallennettavaksi.</string>
<string name="see_your_achievements">Näytä omat saavutukset</string>
<string name="edit_image">Muokkaa kuvaa</string>
<string name="edit_location">Muokkaa sijaintia</string>
<string name="send_thanks_to_author">Kiitä tekijää</string>

View file

@ -1,10 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Authors:
* Maksat
* Элдин беги
-->
<resources>
<string name="crash_dialog_title">Кыйроо</string>
<string name="crash_dialog_text">Уупс. Бир нерсе туура эмес болду!</string>
<string name="crash_dialog_comment_prompt">Сиздин иш аракетиңиз тууралуу бизге электрондук кат жөнөтүңүз. Бул кийнки каталарды оңдоого жарам берет!</string>
<string name="crash_dialog_text">Ай ботом, бир нерсе туура эмес болду!</string>
<string name="crash_dialog_comment_prompt">Сиздин иш аракетиңиз тууралуу бизге электрондук кат жөнөтүңүз. Бул кийнки каталарды оңдоого жардам берет!</string>
<string name="crash_dialog_ok_toast">Ыракмат!</string>
</resources>

View file

@ -366,6 +366,7 @@
<string name="share_app_title">Toepassing delen</string>
<string name="rotate">Draaien</string>
<string name="error_fetching_nearby_places">Fout bij het ophalen van plaatsen in de buurt.</string>
<string name="no_pictures_in_this_area">Geen foto\'s in dit gebied.</string>
<string name="no_nearby_places_around">Geen plaatsen in de buurt</string>
<string name="error_fetching_nearby_monuments">Fout bij het ophalen van monumenten.</string>
<string name="no_recent_searches">Geen recente zoekopdrachten</string>
@ -759,7 +760,13 @@
<string name="storage_permissions_denied">Opslagtoestemming geweigerd</string>
<string name="unable_to_share_upload_item">Kan dit item niet delen</string>
<string name="permissions_are_required_for_functionality">Voor deze functionaliteit zijn toestemmingen vereist</string>
<string name="learn_how_to_write_a_useful_description">Leer hoe u een nuttige beschrijving schrijft</string>
<string name="learn_how_to_write_a_useful_caption">Leer hoe u een nuttig bijschrift schrijft</string>
<string name="see_your_achievements">Bekijk uw prestaties</string>
<string name="edit_image">Afbeelding Bewerken</string>
<string name="edit_location">Locatie bewerken</string>
<string name="send_thanks_to_author">Auteur bedanken</string>
<string name="error_sending_thanks">Fout bij het bedanken van de auteur.</string>
<plurals name="custom_picker_images_selected_title_appendix">
<item quantity="one">%d afbeelding geselecteerd</item>
<item quantity="other">%d afbeeldingen geselecteerd</item>

View file

@ -700,6 +700,7 @@
<string name="custom_selector_info_text2">W przeciwieństwie do zdjęcia po lewej, zdjęcie po prawej ma logo Commons wskazujące, że zostało już przesłane.\n Dotknij i przytrzymaj, aby wyświetlić podgląd obrazu.</string>
<string name="welcome_custom_selector_ok">Niesamowite</string>
<string name="custom_selector_already_uploaded_image_text">Tez plik został już przesłany do Commons.</string>
<string name="custom_selector_dismiss_limit_warning_button_text">Odrzuć</string>
<string name="custom_selector_button_limit_text">Maks.: %1$d</string>
<string name="custom_selector_limit_error_desc">Błąd: przekroczono limit przesyłania</string>
<string name="wlm_upload_info">Ten obraz zostanie zgłoszony do konkursu Wiki Loves Monuments</string>
@ -762,4 +763,8 @@
<string name="set_up_avatar_toast_string">Aby skonfigurować swojego awatara rankingu, dotknij \'Ustaw jako awatar\' w menu z trzema kropkami dowolnego obrazu.</string>
<string name="similar_coordinate_description_auto_set">Współrzędne nie są dokładnymi współrzędnymi, ale osoba, która przesłała to zdjęcie, uważa, że są wystarczająco blisko.</string>
<string name="unable_to_share_upload_item">Nie można udostępnić tego elementu</string>
<string name="edit_image">Edytuj obraz</string>
<string name="edit_location">Edytuj lokalizację</string>
<string name="send_thanks_to_author">Dziękuję autorowi</string>
<string name="error_sending_thanks">Błąd wysyłania podziękowań do autora.</string>
</resources>

View file

@ -230,6 +230,7 @@
<string name="caption_edit_helper_edit_message_else">Govvateavstta lasiheapmi ii lihkostuvvan.</string>
<string name="description_activity_title">Rievdat govvádusaid ja govvateavsttaid</string>
<string name="nearby_search_hint">Šaldi, musea, hotealla jna.</string>
<string name="add_picture_to_wikipedia_article_title">Lasit gova Wikipediai</string>
<string name="resume">joatkke</string>
<string name="leaderboard_column_user">Geavaheaddji</string>
<string name="cancelling_upload">Fiilla vurkema gaskkalduhttomin…</string>

View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Authors:
* Winston Sung
-->
<resources>
<string name="crash_dialog_title">同享壞咗</string>
<string name="crash_dialog_text">哎呀。出咗錯!</string>
<string name="crash_dialog_ok_toast">多謝你!</string>
</resources>

View file

@ -17,6 +17,7 @@ import fr.free.nrw.commons.location.LocationServiceManager
class TestCommonsApplication : Application() {
private var mockApplicationComponent: CommonsApplicationComponent? = null
override fun onCreate() {
if (mockApplicationComponent == null) {
mockApplicationComponent = DaggerCommonsApplicationComponent.builder()
@ -64,4 +65,4 @@ class MockCommonsApplicationModule(appContext: Context) : CommonsApplicationModu
override fun provideDBOpenHelper(context: Context): DBOpenHelper = mockDbOpenHelper
override fun provideLruCache(): LruCache<String, String> = lruCache
}
}

View file

@ -21,6 +21,8 @@ import fr.free.nrw.commons.TestCommonsApplication
import fr.free.nrw.commons.createTestClient
import fr.free.nrw.commons.bookmarks.pictures.BookmarkPicturesFragment
import fr.free.nrw.commons.contributions.MainActivity
import fr.free.nrw.commons.databinding.FragmentBookmarksBinding
import fr.free.nrw.commons.databinding.FragmentFeaturedRootBinding
import fr.free.nrw.commons.explore.ParentViewPager
import fr.free.nrw.commons.media.MediaDetailPagerFragment
import org.junit.Assert
@ -81,6 +83,8 @@ class BookmarkListRootFragmentUnitTest {
@Mock
private lateinit var adapter: BookmarksPagerAdapter
private lateinit var binding: FragmentFeaturedRootBinding
@Before
fun setUp() {
MockitoAnnotations.openMocks(this)
@ -95,14 +99,17 @@ class BookmarkListRootFragmentUnitTest {
fragmentTransaction.commitNowAllowingStateLoss()
bookmarkFragment = BookmarkFragment()
bookmarkFragment.binding = FragmentBookmarksBinding.inflate(LayoutInflater.from(activity))
binding = FragmentFeaturedRootBinding.inflate(LayoutInflater.from(activity))
Whitebox.setInternalState(fragment, "mChildFragmentManager", childFragmentManager)
Whitebox.setInternalState(fragment, "mParentFragment", bookmarkFragment)
Whitebox.setInternalState(fragment, "listFragment", listFragment)
Whitebox.setInternalState(fragment, "mediaDetails", mediaDetails)
Whitebox.setInternalState(fragment, "bookmarksPagerAdapter", bookmarksPagerAdapter)
Whitebox.setInternalState(bookmarkFragment, "tabLayout", tabLayout)
Whitebox.setInternalState(bookmarkFragment, "viewPager", viewPager)
Whitebox.setInternalState(bookmarkFragment.binding, "tabLayout", tabLayout)
Whitebox.setInternalState(bookmarkFragment.binding, "viewPagerBookmarks", viewPager)
Whitebox.setInternalState(bookmarkFragment, "adapter", adapter)
whenever(childFragmentManager.beginTransaction()).thenReturn(childFragmentTransaction)
@ -322,4 +329,4 @@ class BookmarkListRootFragmentUnitTest {
Assert.assertEquals(fragment.backPressed(), false)
}
}
}

View file

@ -17,6 +17,7 @@ import fr.free.nrw.commons.R
import fr.free.nrw.commons.TestCommonsApplication
import fr.free.nrw.commons.createTestClient
import fr.free.nrw.commons.category.CategoryItem
import fr.free.nrw.commons.databinding.FragmentBookmarksItemsBinding
import fr.free.nrw.commons.profile.ProfileActivity
import fr.free.nrw.commons.upload.structure.depictions.DepictedItem
import org.junit.Assert
@ -25,6 +26,7 @@ import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.MockitoAnnotations
import org.powermock.reflect.Whitebox
import org.robolectric.Robolectric
import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config
@ -45,8 +47,7 @@ class BookmarkItemsFragmentUnitTest {
private lateinit var recyclerView: RecyclerView
private lateinit var layoutInflater: LayoutInflater
@Mock
private lateinit var parentLayout: RelativeLayout
private lateinit var binding: FragmentBookmarksItemsBinding
@Mock
private lateinit var savedInstanceState: Bundle
@ -89,17 +90,16 @@ class BookmarkItemsFragmentUnitTest {
layoutInflater = LayoutInflater.from(activity)
view = layoutInflater
.inflate(R.layout.fragment_bookmarks_items, null) as View
binding = FragmentBookmarksItemsBinding.inflate(layoutInflater)
statusTextView = view.findViewById(R.id.status_message)
progressBar = view.findViewById(R.id.loading_images_progress_bar)
recyclerView = view.findViewById(R.id.list_view)
fragment.statusTextView = statusTextView
fragment.progressBar = progressBar
fragment.recyclerView = recyclerView
fragment.parentLayout = parentLayout
fragment.controller = controller
Whitebox.setInternalState(fragment, "binding", binding)
}
/**
@ -132,4 +132,4 @@ class BookmarkItemsFragmentUnitTest {
fun checkFragmentNotNull() {
Assert.assertNotNull(fragment)
}
}
}

View file

@ -17,6 +17,7 @@ import fr.free.nrw.commons.R
import fr.free.nrw.commons.TestCommonsApplication
import fr.free.nrw.commons.createTestClient
import fr.free.nrw.commons.contributions.ContributionController
import fr.free.nrw.commons.databinding.FragmentBookmarksLocationsBinding
import fr.free.nrw.commons.kvstore.JsonKvStore
import fr.free.nrw.commons.nearby.Place
import fr.free.nrw.commons.nearby.fragments.CommonPlaceClickActions
@ -52,9 +53,6 @@ class BookmarkLocationFragmentUnitTests {
@Mock
lateinit var store: JsonKvStore
@Mock
private lateinit var parentLayout: RelativeLayout
@Mock
private lateinit var savedInstanceState: Bundle
@ -70,6 +68,8 @@ class BookmarkLocationFragmentUnitTests {
@Mock
private lateinit var adapter: PlaceAdapter
private lateinit var binding: FragmentBookmarksLocationsBinding
/**
* Get Mock bookmark list.
*/
@ -109,20 +109,18 @@ class BookmarkLocationFragmentUnitTests {
layoutInflater = LayoutInflater.from(activity)
view = layoutInflater
.inflate(R.layout.fragment_bookmarks_locations, null) as View
binding = FragmentBookmarksLocationsBinding.bind(view)
statusTextView = view.findViewById(R.id.statusMessage)
progressBar = view.findViewById(R.id.loadingImagesProgressBar)
recyclerView = view.findViewById(R.id.listView)
commonPlaceClickActions = CommonPlaceClickActions(store,activity,contributionController)
fragment.statusTextView = statusTextView
fragment.progressBar = progressBar
fragment.recyclerView = recyclerView
fragment.parentLayout = parentLayout
fragment.bookmarkLocationDao = bookmarkLocationDao
fragment.controller = controller
fragment.commonPlaceClickActions = commonPlaceClickActions
Whitebox.setInternalState(fragment, "adapter", adapter)
Whitebox.setInternalState(fragment, "binding", binding)
}
@ -173,4 +171,4 @@ class BookmarkLocationFragmentUnitTests {
fun testOnResume() {
fragment.onResume()
}
}
}

View file

@ -18,12 +18,14 @@ import androidx.test.core.app.ApplicationProvider
import com.nhaarman.mockitokotlin2.any
import com.nhaarman.mockitokotlin2.times
import com.nhaarman.mockitokotlin2.verify
import com.nhaarman.mockitokotlin2.whenever
import fr.free.nrw.commons.Media
import fr.free.nrw.commons.OkHttpConnectionFactory
import fr.free.nrw.commons.R
import fr.free.nrw.commons.TestCommonsApplication
import fr.free.nrw.commons.createTestClient
import fr.free.nrw.commons.category.GridViewAdapter
import fr.free.nrw.commons.databinding.FragmentBookmarksPicturesBinding
import fr.free.nrw.commons.media.MediaClient
import fr.free.nrw.commons.profile.ProfileActivity
import media
@ -49,9 +51,9 @@ class BookmarkPicturesFragmentUnitTests {
private lateinit var fragment: BookmarkPicturesFragment
private lateinit var context: Context
private lateinit var binding: FragmentBookmarksPicturesBinding
private lateinit var view: View
private lateinit var context: Context
@Mock
lateinit var statusTextView: TextView
@ -97,13 +99,7 @@ class BookmarkPicturesFragmentUnitTests {
fragmentTransaction.add(fragment, null)
fragmentTransaction.commit()
view = LayoutInflater.from(activity)
.inflate(R.layout.fragment_bookmarks_pictures, null) as View
fragment.statusTextView = statusTextView
fragment.progressBar = progressBar
fragment.gridView = gridView
fragment.parentLayout = parentLayout
binding = FragmentBookmarksPicturesBinding.inflate(LayoutInflater.from(activity))
val bookmarkDao = BookmarkPicturesDao { client }
@ -116,6 +112,12 @@ class BookmarkPicturesFragmentUnitTests {
0,
listOf(media())
))
Whitebox.setInternalState(fragment, "binding", binding)
Whitebox.setInternalState(binding, "statusMessage", statusTextView)
Whitebox.setInternalState(binding, "loadingImagesProgressBar", progressBar)
Whitebox.setInternalState(binding, "bookmarkedPicturesList", gridView)
Whitebox.setInternalState(binding, "parentLayout", parentLayout)
}
@Test
@ -127,7 +129,7 @@ class BookmarkPicturesFragmentUnitTests {
@Test
@Throws(Exception::class)
fun testOnViewCreated() {
fragment.onViewCreated(view, savedInstanceState)
fragment.onViewCreated(binding.root, savedInstanceState)
}
@Test
@ -216,4 +218,4 @@ class BookmarkPicturesFragmentUnitTests {
method.isAccessible = true
method.invoke(fragment)
}
}
}

View file

@ -16,6 +16,7 @@ import fr.free.nrw.commons.Media
import fr.free.nrw.commons.R
import fr.free.nrw.commons.TestCommonsApplication
import fr.free.nrw.commons.TestUtility.setFinalStatic
import fr.free.nrw.commons.databinding.LayoutContributionBinding
import fr.free.nrw.commons.media.MediaClient
import fr.free.nrw.commons.profile.ProfileActivity
import io.reactivex.disposables.CompositeDisposable
@ -46,17 +47,6 @@ class ContributionViewHolderUnitTests {
private lateinit var contributionViewHolder: ContributionViewHolder
private lateinit var activity: ProfileActivity
private lateinit var parent: View
private lateinit var pauseResumeButton: ImageButton
private lateinit var addToWikipediaButton: ImageButton
private lateinit var cancelButton: ImageButton
private lateinit var retryButton: ImageButton
private lateinit var imageOptions: RelativeLayout
private lateinit var imageView: SimpleDraweeView
private lateinit var titleView: TextView
private lateinit var authorView: TextView
private lateinit var stateView: TextView
private lateinit var seqNumView: TextView
private lateinit var progressView: ProgressBar
@Mock
private lateinit var callback: ContributionsListAdapter.Callback
@ -76,6 +66,8 @@ class ContributionViewHolderUnitTests {
@Mock
private lateinit var media: Media
private lateinit var bindind : LayoutContributionBinding
@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
@ -85,42 +77,10 @@ class ContributionViewHolderUnitTests {
parent = LayoutInflater.from(activity).inflate(R.layout.layout_contribution, null)
contributionViewHolder = ContributionViewHolder(parent, callback, mediaClient)
pauseResumeButton = parent.findViewById(R.id.pauseResumeButton)
Whitebox.setInternalState(contributionViewHolder, "pauseResumeButton", pauseResumeButton)
bindind = LayoutContributionBinding.bind(parent)
addToWikipediaButton = parent.findViewById(R.id.wikipediaButton)
Whitebox.setInternalState(
contributionViewHolder,
"addToWikipediaButton",
addToWikipediaButton
)
Whitebox.setInternalState(contributionViewHolder, "binding", bindind)
cancelButton = parent.findViewById(R.id.cancelButton)
Whitebox.setInternalState(contributionViewHolder, "cancelButton", cancelButton)
retryButton = parent.findViewById(R.id.retryButton)
Whitebox.setInternalState(contributionViewHolder, "retryButton", retryButton)
imageOptions = parent.findViewById(R.id.image_options)
Whitebox.setInternalState(contributionViewHolder, "imageOptions", imageOptions)
imageView = parent.findViewById(R.id.contributionImage)
Whitebox.setInternalState(contributionViewHolder, "imageView", imageView)
titleView = parent.findViewById(R.id.contributionTitle)
Whitebox.setInternalState(contributionViewHolder, "titleView", titleView)
authorView = parent.findViewById(R.id.authorView)
Whitebox.setInternalState(contributionViewHolder, "authorView", authorView)
stateView = parent.findViewById(R.id.contributionState)
Whitebox.setInternalState(contributionViewHolder, "stateView", stateView)
seqNumView = parent.findViewById(R.id.contributionSequenceNumber)
Whitebox.setInternalState(contributionViewHolder, "seqNumView", seqNumView)
progressView = parent.findViewById(R.id.contributionProgress)
Whitebox.setInternalState(contributionViewHolder, "progressView", progressView)
setFinalStatic(
ContributionViewHolder::class.java.getDeclaredField("compositeDisposable"),
compositeDisposable)
@ -185,7 +145,7 @@ class ContributionViewHolderUnitTests {
@Test
@Throws(Exception::class)
fun testOnPauseResumeButtonClickedCaseFalse() {
pauseResumeButton.tag = ""
bindind.pauseResumeButton.tag = ""
contributionViewHolder.onPauseResumeButtonClicked()
}
@ -356,4 +316,4 @@ class ContributionViewHolderUnitTests {
contributionViewHolder.init(0, contribution)
Assert.assertNotNull(contributionViewHolder.imageRequest)
}
}
}

View file

@ -15,6 +15,7 @@ import fr.free.nrw.commons.TestCommonsApplication
import fr.free.nrw.commons.createTestClient
import fr.free.nrw.commons.campaigns.CampaignView
import fr.free.nrw.commons.campaigns.models.Campaign
import fr.free.nrw.commons.databinding.FragmentContributionsBinding
import fr.free.nrw.commons.kvstore.JsonKvStore
import fr.free.nrw.commons.media.MediaDetailPagerFragment
import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient
@ -120,21 +121,10 @@ class ContributionsFragmentUnitTests {
Whitebox.setInternalState(fragment, "contributionsListFragment", contributionsListFragment)
Whitebox.setInternalState(fragment, "store", store)
Whitebox.setInternalState(
fragment,
"limitedConnectionEnabledLayout",
limitedConnectionEnabledLayout
)
Whitebox.setInternalState(fragment, "notificationCount", notificationCount)
Whitebox.setInternalState(fragment, "notificationController", notificationController)
Whitebox.setInternalState(fragment, "compositeDisposable", compositeDisposable)
Whitebox.setInternalState(fragment, "okHttpJsonApiClient", okHttpJsonApiClient)
Whitebox.setInternalState(
fragment,
"nearbyNotificationCardView",
nearbyNotificationCardView
)
Whitebox.setInternalState(fragment, "campaignView", campaignView)
}
@Test
@ -360,4 +350,4 @@ class ContributionsFragmentUnitTests {
fragment.showDetail(0, false)
}
}
}

View file

@ -481,4 +481,4 @@ class MainActivityUnitTests {
.putBoolean("last_opened_nearby",false)
}
}
}

View file

@ -14,6 +14,7 @@ import fr.free.nrw.commons.createTestClient
import fr.free.nrw.commons.contributions.MainActivity
import org.junit.Assert
import org.junit.Before
import org.junit.Ignore
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
@ -69,8 +70,6 @@ class ExploreFragmentUnitTest {
view = fragment.onCreateView(layoutInflater, null, null) as View
viewPager = view.findViewById(R.id.viewPager)
Whitebox.setInternalState(fragment, "viewPager", viewPager)
Whitebox.setInternalState(fragment, "tabLayout", tabLayout)
}
@Test
@ -102,7 +101,7 @@ class ExploreFragmentUnitTest {
Assert.assertEquals(fragment.onBackPressed(), true)
}
@Test
@Test @Ignore("TODO fix this test")
@Throws(Exception::class)
fun testOnBackPressedCaseTrueSelectedTabNonZero() {
Whitebox.setInternalState(fragment, "mobileRootFragment", exploreRootFragment)
@ -152,4 +151,4 @@ class ExploreFragmentUnitTest {
verify(inflater).inflate(R.menu.menu_search, menu)
}
}
}

View file

@ -2,12 +2,9 @@ package fr.free.nrw.commons.explore
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.widget.FrameLayout
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentTransaction
import androidx.test.core.app.ApplicationProvider
import com.google.android.material.tabs.TabLayout
import com.nhaarman.mockitokotlin2.any
import com.nhaarman.mockitokotlin2.times
import fr.free.nrw.commons.Media
@ -16,6 +13,7 @@ import fr.free.nrw.commons.R
import fr.free.nrw.commons.TestCommonsApplication
import fr.free.nrw.commons.createTestClient
import fr.free.nrw.commons.contributions.MainActivity
import fr.free.nrw.commons.databinding.FragmentFeaturedRootBinding
import fr.free.nrw.commons.explore.categories.media.CategoriesMediaFragment
import fr.free.nrw.commons.media.MediaDetailPagerFragment
import org.junit.Assert
@ -42,11 +40,11 @@ class ExploreListRootFragmentUnitTest {
private lateinit var fragment: ExploreListRootFragment
private lateinit var fragmentManager: FragmentManager
private lateinit var context: Context
private lateinit var view: View
private lateinit var layoutInflater: LayoutInflater
private lateinit var activity: MainActivity
private lateinit var exploreFragment: ExploreFragment
private lateinit var binding: FragmentFeaturedRootBinding
@Mock
private lateinit var mediaDetails: MediaDetailPagerFragment
@ -59,15 +57,6 @@ class ExploreListRootFragmentUnitTest {
@Mock
private lateinit var childFragmentTransaction: FragmentTransaction
@Mock
private lateinit var container: FrameLayout
@Mock
private lateinit var tabLayout: TabLayout
@Mock
private lateinit var viewPager: ParentViewPager
@Mock
private lateinit var media: Media
@ -87,16 +76,13 @@ class ExploreListRootFragmentUnitTest {
exploreFragment = ExploreFragment()
layoutInflater = LayoutInflater.from(activity)
view = fragment.onCreateView(layoutInflater, null, null) as View
binding = FragmentFeaturedRootBinding.inflate(LayoutInflater.from(activity))
Whitebox.setInternalState(fragment, "mChildFragmentManager", childFragmentManager)
Whitebox.setInternalState(fragment, "mParentFragment", exploreFragment)
Whitebox.setInternalState(fragment, "mediaDetails", mediaDetails)
Whitebox.setInternalState(fragment, "listFragment", listFragment)
Whitebox.setInternalState(fragment, "container", container)
Whitebox.setInternalState(exploreFragment, "tabLayout", tabLayout)
Whitebox.setInternalState(exploreFragment, "viewPager", viewPager)
`when`(childFragmentManager.beginTransaction()).thenReturn(childFragmentTransaction)
`when`(childFragmentTransaction.hide(any())).thenReturn(childFragmentTransaction)
@ -116,7 +102,7 @@ class ExploreListRootFragmentUnitTest {
@Test
@Throws(Exception::class)
fun testOnViewCreated() {
fragment.onViewCreated(view, null)
fragment.onViewCreated(binding.root, null)
verify(childFragmentManager).beginTransaction()
verify(childFragmentTransaction).hide(mediaDetails)
verify(childFragmentTransaction).add(R.id.explore_container, listFragment)
@ -179,8 +165,6 @@ class ExploreListRootFragmentUnitTest {
@Throws(Exception::class)
fun testOnMediaClicked() {
fragment.onMediaClicked(0)
verify(container).visibility = View.VISIBLE
verify(tabLayout).visibility = View.GONE
verify(childFragmentManager).beginTransaction()
verify(childFragmentTransaction).hide(listFragment)
verify(childFragmentTransaction).addToBackStack("CONTRIBUTION_LIST_FRAGMENT_TAG")
@ -235,8 +219,6 @@ class ExploreListRootFragmentUnitTest {
verify(childFragmentTransaction).remove(mediaDetails)
verify(childFragmentTransaction, times(2)).commit()
verify(childFragmentManager, times(2)).executePendingTransactions()
verify(container).visibility = View.VISIBLE
verify(tabLayout).visibility = View.GONE
verify(childFragmentTransaction).hide(listFragment)
verify(childFragmentTransaction).addToBackStack("CONTRIBUTION_LIST_FRAGMENT_TAG")
}
@ -268,4 +250,4 @@ class ExploreListRootFragmentUnitTest {
Assert.assertEquals(fragment.backPressed(), false)
}
}
}

View file

@ -12,6 +12,7 @@ import fr.free.nrw.commons.OkHttpConnectionFactory
import fr.free.nrw.commons.R
import fr.free.nrw.commons.TestCommonsApplication
import fr.free.nrw.commons.createTestClient
import fr.free.nrw.commons.databinding.ActivityWikidataItemDetailsBinding
import fr.free.nrw.commons.explore.depictions.media.DepictedImagesFragment
import fr.free.nrw.commons.media.MediaDetailPagerFragment
import fr.free.nrw.commons.upload.structure.depictions.DepictedItem
@ -36,7 +37,6 @@ import org.robolectric.fakes.RoboMenuItem
class WikidataItemDetailsActivityUnitTests {
private lateinit var activity: WikidataItemDetailsActivity
private lateinit var parent: View
@Mock
private lateinit var mediaDetailPagerFragment: MediaDetailPagerFragment
@ -53,14 +53,6 @@ class WikidataItemDetailsActivityUnitTests {
@Mock
private lateinit var wikidataItem: DepictedItem
@Mock
private lateinit var mediaContainer: FrameLayout
@Mock
private lateinit var tabLayout: TabLayout
@Mock
private lateinit var viewPager: ViewPager
@Before
fun setUp() {
@ -83,17 +75,6 @@ class WikidataItemDetailsActivityUnitTests {
)
Whitebox.setInternalState(activity, "supportFragmentManager", supportFragmentManager)
parent =
LayoutInflater.from(activity).inflate(R.layout.activity_wikidata_item_details, null)
mediaContainer = parent.findViewById(R.id.mediaContainer)
Whitebox.setInternalState(activity, "mediaContainer", mediaContainer)
tabLayout = parent.findViewById(R.id.tab_layout)
Whitebox.setInternalState(activity, "tabLayout", tabLayout)
viewPager = parent.findViewById(R.id.viewPager)
Whitebox.setInternalState(activity, "viewPager", viewPager)
Whitebox.setInternalState(activity, "wikidataItem", wikidataItem)
@ -189,4 +170,4 @@ class WikidataItemDetailsActivityUnitTests {
activity.onMediaClicked(0)
}
}
}

View file

@ -38,20 +38,11 @@ class RecentSearchesFragmentUnitTest {
private lateinit var fragment: RecentSearchesFragment
private lateinit var fragmentManager: FragmentManager
private lateinit var context: Context
private lateinit var view: View
private lateinit var layoutInflater: LayoutInflater
@Mock
private lateinit var recentSearchesDao: RecentSearchesDao
@Mock
private lateinit var imageView: ImageView
@Mock
private lateinit var textView: TextView
@Mock
private lateinit var listView: ListView
@Mock
private lateinit var adapter: ArrayAdapter<*>
@ -77,14 +68,9 @@ class RecentSearchesFragmentUnitTest {
fragmentTransaction.commitNowAllowingStateLoss()
layoutInflater = LayoutInflater.from(activity)
view = LayoutInflater.from(activity)
.inflate(R.layout.fragment_leaderboard, null) as View
Whitebox.setInternalState(fragment, "recentSearchesDao", recentSearchesDao)
Whitebox.setInternalState(fragment, "recent_searches_delete_button", imageView)
Whitebox.setInternalState(fragment, "recent_searches_text_view", textView)
Whitebox.setInternalState(fragment, "adapter", adapter)
Whitebox.setInternalState(fragment, "recentSearchesList", listView)
Whitebox.setInternalState(fragment, "recentSearches", listOf("string"))
}
@ -155,4 +141,4 @@ class RecentSearchesFragmentUnitTest {
method.invoke(fragment, context, dialog, 0)
}
}
}

View file

@ -10,6 +10,7 @@ import com.nhaarman.mockitokotlin2.verify
import fr.free.nrw.commons.Media
import fr.free.nrw.commons.TestCommonsApplication
import fr.free.nrw.commons.ViewPagerAdapter
import fr.free.nrw.commons.databinding.ActivitySearchBinding
import fr.free.nrw.commons.explore.SearchActivity
import fr.free.nrw.commons.explore.categories.search.SearchCategoryFragment
import fr.free.nrw.commons.explore.depictions.search.SearchDepictionsFragment
@ -45,15 +46,6 @@ class SearchActivityUnitTests {
@Mock
private lateinit var activity: SearchActivity
@Mock
private lateinit var searchView: SearchView
@Mock
private lateinit var viewPager: ViewPager
@Mock
private lateinit var context: Context
@Mock
private lateinit var compositeDisposable: CompositeDisposable
@ -81,6 +73,8 @@ class SearchActivityUnitTests {
@Mock
private lateinit var searchCategoryFragment: SearchCategoryFragment
private lateinit var context: Context
@Before
fun setUp() {
MockitoAnnotations.openMocks(this)
@ -102,17 +96,6 @@ class SearchActivityUnitTests {
verify(viewPagerAdapter).notifyDataSetChanged()
}
@Test
@Throws(Exception::class)
fun testUpdateText() {
val query = "test"
Whitebox.setInternalState(activity, "searchView", searchView)
Whitebox.setInternalState(activity, "viewPager", viewPager)
activity.updateText(query)
verify(searchView).setQuery(query, true)
verify(viewPager).requestFocus()
}
@Test
@Throws(Exception::class)
fun testOnBackPressed() {
@ -238,4 +221,4 @@ class SearchActivityUnitTests {
verify(searchCategoryFragment).onQueryUpdated(query)
}
}
}

View file

@ -18,6 +18,7 @@ import fr.free.nrw.commons.R
import fr.free.nrw.commons.TestCommonsApplication
import fr.free.nrw.commons.createTestClient
import fr.free.nrw.commons.auth.SessionManager
import fr.free.nrw.commons.databinding.FragmentLeaderboardBinding
import fr.free.nrw.commons.profile.ProfileActivity
import fr.free.nrw.commons.profile.leaderboard.LeaderboardFragment
import fr.free.nrw.commons.profile.leaderboard.LeaderboardListAdapter
@ -47,21 +48,12 @@ class LeaderboardFragmentUnitTests {
private lateinit var fragment: LeaderboardFragment
private lateinit var fragmentManager: FragmentManager
private lateinit var context: Context
private lateinit var view: View
private lateinit var layoutInflater: LayoutInflater
@Mock
private lateinit var progressBar: ProgressBar
@Mock
private lateinit var spinner: Spinner
@Mock
private lateinit var viewModel: LeaderboardListViewModel
@Mock
private lateinit var recyclerView: RecyclerView
@Mock
private lateinit var adapter: LeaderboardListAdapter
@ -71,12 +63,11 @@ class LeaderboardFragmentUnitTests {
@Mock
private lateinit var account: Account
@Mock
private lateinit var button: Button
@Mock
private lateinit var parentView: ViewGroup
private lateinit var binding: FragmentLeaderboardBinding
@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
@ -92,15 +83,9 @@ class LeaderboardFragmentUnitTests {
fragmentTransaction.commitNowAllowingStateLoss()
layoutInflater = LayoutInflater.from(activity)
view = LayoutInflater.from(activity)
.inflate(R.layout.fragment_leaderboard, null) as View
binding = FragmentLeaderboardBinding.inflate(layoutInflater)
Whitebox.setInternalState(fragment, "progressBar", progressBar)
Whitebox.setInternalState(fragment, "categorySpinner", spinner)
Whitebox.setInternalState(fragment, "durationSpinner", spinner)
Whitebox.setInternalState(fragment, "viewModel", viewModel)
Whitebox.setInternalState(fragment, "scrollButton", button)
Whitebox.setInternalState(fragment, "leaderboardListRecyclerView", recyclerView)
Whitebox.setInternalState(fragment, "mView", parentView)
}
@ -140,7 +125,6 @@ class LeaderboardFragmentUnitTests {
@Throws(Exception::class)
fun testScrollToUserRankCaseNonZeroTrue() {
Whitebox.setInternalState(fragment, "userRank", 1)
`when`(recyclerView.adapter).thenReturn(adapter)
`when`(adapter.itemCount).thenReturn(3)
val method: Method = LeaderboardFragment::class.java.getDeclaredMethod(
"scrollToUserRank"
@ -153,7 +137,6 @@ class LeaderboardFragmentUnitTests {
@Throws(Exception::class)
fun testScrollToUserRankCaseNonZeroFalse() {
Whitebox.setInternalState(fragment, "userRank", 1)
`when`(recyclerView.adapter).thenReturn(adapter)
`when`(adapter.itemCount).thenReturn(1)
val method: Method = LeaderboardFragment::class.java.getDeclaredMethod(
"scrollToUserRank"
@ -245,4 +228,4 @@ class LeaderboardFragmentUnitTests {
}
}
}

View file

@ -2,6 +2,7 @@ package fr.free.nrw.commons.locationpicker
import android.content.Context
import android.os.Looper
import android.util.Log
import android.view.View
import android.widget.Button
import android.widget.ImageView
@ -20,10 +21,14 @@ import com.nhaarman.mockitokotlin2.times
import com.nhaarman.mockitokotlin2.verify
import com.nhaarman.mockitokotlin2.whenever
import fr.free.nrw.commons.LocationPicker.LocationPickerActivity
import fr.free.nrw.commons.Media
import fr.free.nrw.commons.TestCommonsApplication
import fr.free.nrw.commons.coordinates.CoordinateEditHelper
import fr.free.nrw.commons.kvstore.JsonKvStore
import fr.free.nrw.commons.upload.mediaDetails.UploadMediaDetailFragment.LAST_LOCATION
import fr.free.nrw.commons.upload.mediaDetails.UploadMediaDetailFragment.LAST_ZOOM
import io.reactivex.android.plugins.RxAndroidPlugins
import io.reactivex.schedulers.Schedulers
import org.junit.Assert
import org.junit.Assert.*
import org.junit.Before
@ -93,6 +98,7 @@ class LocationPickerActivityUnitTests {
MockitoAnnotations.initMocks(this)
context = RuntimeEnvironment.getApplication().applicationContext
activity = Robolectric.buildActivity(LocationPickerActivity::class.java).get()
RxAndroidPlugins.setInitMainThreadSchedulerHandler { Schedulers.trampoline() }
Whitebox.setInternalState(activity, "mapView", mapView)
Whitebox.setInternalState(activity, "applicationKvStore", applicationKvStore)
@ -165,4 +171,5 @@ class LocationPickerActivityUnitTests {
}
}
}

View file

@ -109,7 +109,7 @@ class ProfileActivityTest {
}
@Test
fun testToolbarNotNull() {
val toolbar = activity.findViewById<Toolbar>(R.id.toolbar)
val toolbar = activity.binding.toolbarBinding.toolbar
Assert.assertNotNull(toolbar)
}
@ -120,4 +120,4 @@ class ProfileActivityTest {
Assert.assertEquals(1, menu.size())
}
}
}

View file

@ -23,6 +23,7 @@ import fr.free.nrw.commons.OkHttpConnectionFactory
import fr.free.nrw.commons.R
import fr.free.nrw.commons.TestCommonsApplication
import fr.free.nrw.commons.createTestClient
import fr.free.nrw.commons.databinding.UploadCategoriesFragmentBinding
import fr.free.nrw.commons.ui.PasteSensitiveTextInputEditText
import fr.free.nrw.commons.upload.UploadActivity
import fr.free.nrw.commons.upload.UploadBaseFragment
@ -51,41 +52,10 @@ class UploadCategoriesFragmentUnitTests {
private lateinit var context: Context
private lateinit var fragmentManager: FragmentManager
private lateinit var layoutInflater: LayoutInflater
private lateinit var view: View
@Mock
private lateinit var subscribe: Disposable
@Mock
private lateinit var pbCategories: ProgressBar
@Mock
private lateinit var progressDialog: ProgressDialog
@Mock
private lateinit var tilContainerEtSearch: TextInputLayout
@Mock
private lateinit var etSearch: PasteSensitiveTextInputEditText
@Mock
private lateinit var rvCategories: RecyclerView
@Mock
private lateinit var tvTitle: TextView
@Mock
private lateinit var tvSubTitle: TextView
@Mock
private lateinit var tooltip: ImageView
@Mock
private lateinit var editable: Editable
@Mock
private lateinit var button: Button
@Mock
private lateinit var adapter: UploadCategoryAdapter
@ -98,6 +68,8 @@ class UploadCategoriesFragmentUnitTests {
@Mock
private lateinit var media: Media
private lateinit var binding : UploadCategoriesFragmentBinding
@Before
fun setUp() {
@ -110,22 +82,13 @@ class UploadCategoriesFragmentUnitTests {
val fragmentTransaction: FragmentTransaction = fragmentManager.beginTransaction()
fragmentTransaction.add(fragment, null)
fragmentTransaction.commit()
layoutInflater = LayoutInflater.from(activity)
view = LayoutInflater.from(activity)
.inflate(R.layout.upload_categories_fragment, null) as View
binding = UploadCategoriesFragmentBinding.inflate(layoutInflater)
Whitebox.setInternalState(fragment, "subscribe", subscribe)
Whitebox.setInternalState(fragment, "pbCategories", pbCategories)
Whitebox.setInternalState(fragment, "tilContainerEtSearch", tilContainerEtSearch)
Whitebox.setInternalState(fragment, "adapter", adapter)
Whitebox.setInternalState(fragment, "presenter", presenter)
Whitebox.setInternalState(fragment, "etSearch", etSearch)
Whitebox.setInternalState(fragment, "rvCategories", rvCategories)
Whitebox.setInternalState(fragment, "tvTitle", tvTitle)
Whitebox.setInternalState(fragment, "tooltip", tooltip)
Whitebox.setInternalState(fragment, "tvSubTitle", tvSubTitle)
Whitebox.setInternalState(fragment, "btnNext", button)
Whitebox.setInternalState(fragment, "btnPrevious", button)
Whitebox.setInternalState(fragment, "progressDialog", progressDialog)
Whitebox.setInternalState(fragment, "wikiText", "[[Category:Test]]")
}
@ -255,7 +218,6 @@ class UploadCategoriesFragmentUnitTests {
fun testShowProgressDialog() {
Shadows.shadowOf(Looper.getMainLooper()).idle()
fragment.showProgressDialog()
verify(progressDialog, times(0)).show()
}
@Test
@ -263,7 +225,6 @@ class UploadCategoriesFragmentUnitTests {
fun testDismissProgressDialog() {
Shadows.shadowOf(Looper.getMainLooper()).idle()
fragment.dismissProgressDialog()
verify(progressDialog, times(1)).dismiss()
}
@Test
@ -300,7 +261,6 @@ class UploadCategoriesFragmentUnitTests {
@Throws(Exception::class)
fun testOnBecameVisible() {
Shadows.shadowOf(Looper.getMainLooper()).idle()
`when`(etSearch.text).thenReturn(editable)
val method: Method = UploadCategoriesFragment::class.java.getDeclaredMethod(
"onBecameVisible"
)

View file

@ -5,10 +5,6 @@ import android.content.Context
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.widget.Button
import android.widget.ImageView
import android.widget.ProgressBar
import android.widget.TextView
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentTransaction
import androidx.recyclerview.widget.RecyclerView
@ -53,27 +49,6 @@ class DepictsFragmentUnitTests {
@Mock
private lateinit var savedInstanceState: Bundle
@Mock
private lateinit var textView: TextView
@Mock
private lateinit var imageView: ImageView
@Mock
private lateinit var recyclerView: RecyclerView
@Mock
private lateinit var textInputEditText: PasteSensitiveTextInputEditText
@Mock
private lateinit var progressBar: ProgressBar
@Mock
private lateinit var button: Button
@Mock
private lateinit var textInputLayout: TextInputLayout
@Mock
private lateinit var callback: UploadBaseFragment.Callback
@ -110,16 +85,8 @@ class DepictsFragmentUnitTests {
view = LayoutInflater.from(activity)
.inflate(R.layout.upload_depicts_fragment, null) as View
Whitebox.setInternalState(fragment, "depictsTitle", textView)
Whitebox.setInternalState(fragment, "callback", callback)
Whitebox.setInternalState(fragment, "tooltip", imageView)
Whitebox.setInternalState(fragment, "btnNext", button)
Whitebox.setInternalState(fragment, "btnPrevious", button)
Whitebox.setInternalState(fragment, "depictsSubTitle", textView)
Whitebox.setInternalState(fragment, "depictsRecyclerView", recyclerView)
Whitebox.setInternalState(fragment, "depictsSearch", textInputEditText)
Whitebox.setInternalState(fragment, "depictsSearchContainer", textInputLayout)
Whitebox.setInternalState(fragment, "depictsSearchInProgress", progressBar)
Whitebox.setInternalState(fragment, "subscribe", disposable)
Whitebox.setInternalState(fragment, "adapter", adapter)
}
@ -309,4 +276,4 @@ class DepictsFragmentUnitTests {
Whitebox.setInternalState(fragment, "progressDialog", progressDialog)
fragment.dismissProgressDialog()
}
}
}

View file

@ -142,20 +142,7 @@ class UploadMediaDetailFragmentUnitTest {
llContainerMediaDetail = view.findViewById(R.id.ll_container_media_detail)
ibExpandCollapse = view.findViewById(R.id.ib_expand_collapse)
Whitebox.setInternalState(fragment, "tvTitle", tvTitle)
Whitebox.setInternalState(fragment, "tooltip", tooltip)
Whitebox.setInternalState(fragment, "callback", callback)
Whitebox.setInternalState(fragment, "rvDescriptions", rvDescriptions)
Whitebox.setInternalState(fragment, "btnPrevious", btnPrevious)
Whitebox.setInternalState(fragment, "btnNext", btnNext)
Whitebox.setInternalState(fragment, "btnCopyToSubsequentMedia", btnCopyToSubsequentMedia)
Whitebox.setInternalState(fragment, "photoViewBackgroundImage", photoViewBackgroundImage)
Whitebox.setInternalState(fragment, "uploadMediaDetailAdapter", uploadMediaDetailAdapter)
Whitebox.setInternalState(fragment, "llLocationStatus", locationStatusLl)
Whitebox.setInternalState(fragment, "locationImageView", locationImageView)
Whitebox.setInternalState(fragment, "locationTextView", locationTextView)
Whitebox.setInternalState(fragment, "llContainerMediaDetail", llContainerMediaDetail)
Whitebox.setInternalState(fragment, "ibExpandCollapse", ibExpandCollapse)
}
@Test
@ -388,6 +375,7 @@ class UploadMediaDetailFragmentUnitTest {
val cameraPosition = Mockito.mock(CameraPosition::class.java)
val latLng = Mockito.mock(LatLng::class.java)
Whitebox.setInternalState(fragment, "callback", callback)
Whitebox.setInternalState(cameraPosition, "target", latLng)
Whitebox.setInternalState(fragment, "editableUploadItem", uploadItem)
Whitebox.setInternalState(fragment,"isMissingLocationDialog",true)
@ -497,4 +485,4 @@ class UploadMediaDetailFragmentUnitTest {
Assert.assertEquals(shadowIntent.intentClass, LocationPickerActivity::class.java)
}
}
}