Migrated Contributions Package From Butterknife to ViewBinding (#5593)

* Butterknife to ViewBinding
* code fix to pass all tests
* test fix
* test fix
* test fix
* test fix
* Update ContributionsFragmentUnitTests.kt
* code cleanup and tests improved
* tests fixed
* adjustments and code cleanup
* adjustments and code cleanup
This commit is contained in:
Shashank Kumar 2024-03-13 07:46:55 +05:30 committed by GitHub
parent 2076bf9b29
commit c94f607107
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 127 additions and 190 deletions

View file

@ -12,14 +12,12 @@ import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AlertDialog.Builder; import androidx.appcompat.app.AlertDialog.Builder;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import com.facebook.drawee.view.SimpleDraweeView; import com.facebook.drawee.view.SimpleDraweeView;
import com.facebook.imagepipeline.request.ImageRequest; import com.facebook.imagepipeline.request.ImageRequest;
import com.facebook.imagepipeline.request.ImageRequestBuilder; import com.facebook.imagepipeline.request.ImageRequestBuilder;
import fr.free.nrw.commons.R; import fr.free.nrw.commons.R;
import fr.free.nrw.commons.contributions.ContributionsListAdapter.Callback; import fr.free.nrw.commons.contributions.ContributionsListAdapter.Callback;
import fr.free.nrw.commons.databinding.LayoutContributionBinding;
import fr.free.nrw.commons.media.MediaClient; import fr.free.nrw.commons.media.MediaClient;
import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.CompositeDisposable;
@ -29,29 +27,8 @@ import java.io.File;
public class ContributionViewHolder extends RecyclerView.ViewHolder { public class ContributionViewHolder extends RecyclerView.ViewHolder {
private final Callback callback; 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 int position;
private Contribution contribution; private Contribution contribution;
@ -67,9 +44,16 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
super(parent); super(parent);
this.parent = parent; this.parent = parent;
this.mediaClient = mediaClient; this.mediaClient = mediaClient;
ButterKnife.bind(this, parent);
this.callback = callback; 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 /* Set a dialog indicating that the upload is being paused. This is needed because pausing
an upload might take a dozen seconds. */ an upload might take a dozen seconds. */
AlertDialog.Builder builder = new Builder(parent.getContext()); AlertDialog.Builder builder = new Builder(parent.getContext());
@ -87,14 +71,17 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
this.contribution = contribution; this.contribution = contribution;
this.position = position; this.position = position;
titleView.setText(contribution.getMedia().getMostRelevantCaption()); binding.contributionTitle.setText(contribution.getMedia().getMostRelevantCaption());
authorView.setText(contribution.getMedia().getAuthor()); binding.authorView.setText(contribution.getMedia().getAuthor());
//Removes flicker of loading image. //Removes flicker of loading image.
imageView.getHierarchy().setFadeDuration(0); binding.contributionImage.getHierarchy().setFadeDuration(0);
binding.contributionImage.getHierarchy().setPlaceholderImage(R.drawable.image_placeholder);
binding.contributionImage.getHierarchy().setFailureImage(R.drawable.image_placeholder);
imageView.getHierarchy().setPlaceholderImage(R.drawable.image_placeholder);
imageView.getHierarchy().setFailureImage(R.drawable.image_placeholder);
final String imageSource = chooseImageSource(contribution.getMedia().getThumbUrl(), final String imageSource = chooseImageSource(contribution.getMedia().getThumbUrl(),
contribution.getLocalUri()); contribution.getLocalUri());
@ -109,67 +96,67 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
} }
if(imageRequest != null){ if(imageRequest != null){
imageView.setImageRequest(imageRequest); binding.contributionImage.setImageRequest(imageRequest);
} }
} }
seqNumView.setText(String.valueOf(position + 1)); binding.contributionSequenceNumber.setText(String.valueOf(position + 1));
seqNumView.setVisibility(View.VISIBLE); binding.contributionSequenceNumber.setVisibility(View.VISIBLE);
addToWikipediaButton.setVisibility(View.GONE); binding.wikipediaButton.setVisibility(View.GONE);
switch (contribution.getState()) { switch (contribution.getState()) {
case Contribution.STATE_COMPLETED: case Contribution.STATE_COMPLETED:
stateView.setVisibility(View.GONE); binding.contributionState.setVisibility(View.GONE);
progressView.setVisibility(View.GONE); binding.contributionProgress.setVisibility(View.GONE);
imageOptions.setVisibility(View.GONE); binding.imageOptions.setVisibility(View.GONE);
stateView.setText(""); binding.contributionState.setText("");
checkIfMediaExistsOnWikipediaPage(contribution); checkIfMediaExistsOnWikipediaPage(contribution);
break; break;
case Contribution.STATE_QUEUED: case Contribution.STATE_QUEUED:
case Contribution.STATE_QUEUED_LIMITED_CONNECTION_MODE: case Contribution.STATE_QUEUED_LIMITED_CONNECTION_MODE:
progressView.setVisibility(View.GONE); binding.contributionProgress.setVisibility(View.GONE);
stateView.setVisibility(View.VISIBLE); binding.contributionState.setVisibility(View.VISIBLE);
stateView.setText(R.string.contribution_state_queued); binding.contributionState.setText(R.string.contribution_state_queued);
imageOptions.setVisibility(View.GONE); binding.imageOptions.setVisibility(View.GONE);
break; break;
case Contribution.STATE_IN_PROGRESS: case Contribution.STATE_IN_PROGRESS:
stateView.setVisibility(View.GONE); binding.contributionState.setVisibility(View.GONE);
progressView.setVisibility(View.VISIBLE); binding.contributionProgress.setVisibility(View.VISIBLE);
addToWikipediaButton.setVisibility(View.GONE); binding.wikipediaButton.setVisibility(View.GONE);
pauseResumeButton.setVisibility(View.VISIBLE); binding.pauseResumeButton.setVisibility(View.VISIBLE);
cancelButton.setVisibility(View.GONE); binding.cancelButton.setVisibility(View.GONE);
retryButton.setVisibility(View.GONE); binding.retryButton.setVisibility(View.GONE);
imageOptions.setVisibility(View.VISIBLE); binding.imageOptions.setVisibility(View.VISIBLE);
final long total = contribution.getDataLength(); final long total = contribution.getDataLength();
final long transferred = contribution.getTransferred(); final long transferred = contribution.getTransferred();
if (transferred == 0 || transferred >= total) { if (transferred == 0 || transferred >= total) {
progressView.setIndeterminate(true); binding.contributionProgress.setIndeterminate(true);
} else { } else {
progressView.setIndeterminate(false); binding.contributionProgress.setIndeterminate(false);
progressView.setProgress((int) (((double) transferred / (double) total) * 100)); binding.contributionProgress.setProgress((int) (((double) transferred / (double) total) * 100));
} }
break; break;
case Contribution.STATE_PAUSED: case Contribution.STATE_PAUSED:
progressView.setVisibility(View.GONE); binding.contributionProgress.setVisibility(View.GONE);
stateView.setVisibility(View.VISIBLE); binding.contributionState.setVisibility(View.VISIBLE);
stateView.setText(R.string.paused); binding.contributionState.setText(R.string.paused);
cancelButton.setVisibility(View.VISIBLE); binding.cancelButton.setVisibility(View.VISIBLE);
retryButton.setVisibility(View.GONE); binding.retryButton.setVisibility(View.GONE);
pauseResumeButton.setVisibility(View.VISIBLE); binding.pauseResumeButton.setVisibility(View.VISIBLE);
imageOptions.setVisibility(View.VISIBLE); binding.imageOptions.setVisibility(View.VISIBLE);
setResume(); setResume();
if(pausingPopUp.isShowing()){ if(pausingPopUp.isShowing()){
pausingPopUp.hide(); pausingPopUp.hide();
} }
break; break;
case Contribution.STATE_FAILED: case Contribution.STATE_FAILED:
stateView.setVisibility(View.VISIBLE); binding.contributionState.setVisibility(View.VISIBLE);
stateView.setText(R.string.contribution_state_failed); binding.contributionState.setText(R.string.contribution_state_failed);
progressView.setVisibility(View.GONE); binding.contributionProgress.setVisibility(View.GONE);
cancelButton.setVisibility(View.VISIBLE); binding.cancelButton.setVisibility(View.VISIBLE);
retryButton.setVisibility(View.VISIBLE); binding.retryButton.setVisibility(View.VISIBLE);
pauseResumeButton.setVisibility(View.GONE); binding.pauseResumeButton.setVisibility(View.GONE);
imageOptions.setVisibility(View.VISIBLE); binding.imageOptions.setVisibility(View.VISIBLE);
break; break;
} }
} }
@ -203,11 +190,11 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
*/ */
private void displayWikipediaButton(Boolean mediaExists) { private void displayWikipediaButton(Boolean mediaExists) {
if (!mediaExists) { if (!mediaExists) {
addToWikipediaButton.setVisibility(View.VISIBLE); binding.wikipediaButton.setVisibility(View.VISIBLE);
isWikipediaButtonDisplayed = true; isWikipediaButtonDisplayed = true;
cancelButton.setVisibility(View.GONE); binding.cancelButton.setVisibility(View.GONE);
retryButton.setVisibility(View.GONE); binding.retryButton.setVisibility(View.GONE);
imageOptions.setVisibility(View.VISIBLE); binding.imageOptions.setVisibility(View.VISIBLE);
} }
} }
@ -229,7 +216,6 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
/** /**
* Retry upload when it is failed * Retry upload when it is failed
*/ */
@OnClick(R.id.retryButton)
public void retryUpload() { public void retryUpload() {
callback.retryUpload(contribution); callback.retryUpload(contribution);
} }
@ -237,17 +223,14 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
/** /**
* Delete a failed upload attempt * Delete a failed upload attempt
*/ */
@OnClick(R.id.cancelButton)
public void deleteUpload() { public void deleteUpload() {
callback.deleteUpload(contribution); callback.deleteUpload(contribution);
} }
@OnClick(R.id.contributionImage)
public void imageClicked() { public void imageClicked() {
callback.openMediaDetail(position, isWikipediaButtonDisplayed); callback.openMediaDetail(position, isWikipediaButtonDisplayed);
} }
@OnClick(R.id.wikipediaButton)
public void wikipediaButtonClicked() { public void wikipediaButtonClicked() {
callback.addImageToWikipedia(contribution); callback.addImageToWikipedia(contribution);
} }
@ -255,9 +238,8 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
/** /**
* Triggers a callback for pause/resume * Triggers a callback for pause/resume
*/ */
@OnClick(R.id.pauseResumeButton)
public void onPauseResumeButtonClicked() { public void onPauseResumeButtonClicked() {
if (pauseResumeButton.getTag().toString().equals("pause")) { if (binding.pauseResumeButton.getTag().toString().equals("pause")) {
pause(); pause();
} else { } else {
resume(); resume();
@ -279,16 +261,16 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
* Update pause/resume button to show pause state * Update pause/resume button to show pause state
*/ */
private void setPaused() { private void setPaused() {
pauseResumeButton.setImageResource(R.drawable.pause_icon); binding.pauseResumeButton.setImageResource(R.drawable.pause_icon);
pauseResumeButton.setTag(parent.getContext().getString(R.string.pause)); binding.pauseResumeButton.setTag(parent.getContext().getString(R.string.pause));
} }
/** /**
* Update pause/resume button to show resume state * Update pause/resume button to show resume state
*/ */
private void setResume() { private void setResume() {
pauseResumeButton.setImageResource(R.drawable.play_icon); binding.pauseResumeButton.setImageResource(R.drawable.play_icon);
pauseResumeButton.setTag(parent.getContext().getString(R.string.resume)); binding.pauseResumeButton.setTag(parent.getContext().getString(R.string.resume));
} }
public ImageRequest getImageRequest() { 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.CommonsApplication;
import fr.free.nrw.commons.Utils; import fr.free.nrw.commons.Utils;
import fr.free.nrw.commons.auth.SessionManager; 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.models.Notification;
import fr.free.nrw.commons.notification.NotificationController; import fr.free.nrw.commons.notification.NotificationController;
import fr.free.nrw.commons.profile.ProfileActivity; import fr.free.nrw.commons.profile.ProfileActivity;
@ -49,8 +50,6 @@ import java.util.Map;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
import androidx.work.WorkManager; import androidx.work.WorkManager;
import butterknife.BindView;
import butterknife.ButterKnife;
import fr.free.nrw.commons.Media; import fr.free.nrw.commons.Media;
import fr.free.nrw.commons.R; import fr.free.nrw.commons.R;
import fr.free.nrw.commons.campaigns.models.Campaign; import fr.free.nrw.commons.campaigns.models.Campaign;
@ -106,10 +105,8 @@ public class ContributionsFragment
static final String MEDIA_DETAIL_PAGER_FRAGMENT_TAG = "MediaDetailFragmentTag"; static final String MEDIA_DETAIL_PAGER_FRAGMENT_TAG = "MediaDetailFragmentTag";
private static final int MAX_RETRIES = 10; private static final int MAX_RETRIES = 10;
@BindView(R.id.card_view_nearby) public NearbyNotificationCardView nearbyNotificationCardView;
@BindView(R.id.campaigns_view) CampaignView campaignView; public FragmentContributionsBinding binding;
@BindView(R.id.limited_connection_enabled_layout) LinearLayout limitedConnectionEnabledLayout;
@BindView(R.id.limited_connection_description_text_view) TextView limitedConnectionDescriptionTextView;
@Inject ContributionsPresenter contributionsPresenter; @Inject ContributionsPresenter contributionsPresenter;
@ -147,7 +144,7 @@ public class ContributionsFragment
&& store.getBoolean("displayLocationPermissionForCardView", true) && store.getBoolean("displayLocationPermissionForCardView", true)
&& !store.getBoolean("doNotAskForLocationPermission", false) && !store.getBoolean("doNotAskForLocationPermission", false)
&& (((MainActivity) getActivity()).activeFragment == ActiveFragment.CONTRIBUTIONS)) { && (((MainActivity) getActivity()).activeFragment == ActiveFragment.CONTRIBUTIONS)) {
nearbyNotificationCardView.permissionType = NearbyNotificationCardView.PermissionType.ENABLE_LOCATION_PERMISSION; binding.cardViewNearby.permissionType = NearbyNotificationCardView.PermissionType.ENABLE_LOCATION_PERMISSION;
showNearbyCardPermissionRationale(); showNearbyCardPermissionRationale();
} else { } else {
displayYouWontSeeNearbyMessage(); displayYouWontSeeNearbyMessage();
@ -179,12 +176,13 @@ public class ContributionsFragment
@Nullable @Nullable
@Override @Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 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(); initWLMCampaign();
presenter.onAttachView(this); presenter.onAttachView(this);
contributionsPresenter.onAttachView(this); contributionsPresenter.onAttachView(this);
campaignView.setVisibility(View.GONE); binding.campaignsView.setVisibility(View.GONE);
checkBoxView = View.inflate(getActivity(), R.layout.nearby_permission_dialog, null); checkBoxView = View.inflate(getActivity(), R.layout.nearby_permission_dialog, null);
checkBox = (CheckBox) checkBoxView.findViewById(R.id.never_ask_again); checkBox = (CheckBox) checkBoxView.findViewById(R.id.never_ask_again);
checkBox.setOnCheckedChangeListener((buttonView, isChecked) -> { checkBox.setOnCheckedChangeListener((buttonView, isChecked) -> {
@ -204,7 +202,7 @@ public class ContributionsFragment
initFragments(); initFragments();
if(isUserProfile) { if(isUserProfile) {
limitedConnectionEnabledLayout.setVisibility(View.GONE); binding.limitedConnectionEnabledLayout.setVisibility(View.GONE);
}else { }else {
upDateUploadCount(); upDateUploadCount();
} }
@ -221,9 +219,9 @@ public class ContributionsFragment
&& sessionManager.getCurrentAccount() != null && !isUserProfile) { && sessionManager.getCurrentAccount() != null && !isUserProfile) {
setUploadCount(); setUploadCount();
} }
limitedConnectionEnabledLayout.setOnClickListener(toggleDescriptionListener); binding.limitedConnectionEnabledLayout.setOnClickListener(toggleDescriptionListener);
setHasOptionsMenu(true); setHasOptionsMenu(true);
return view; return binding.getRoot();
} }
/** /**
@ -283,22 +281,17 @@ public class ContributionsFragment
.getBoolean(CommonsApplication.IS_LIMITED_CONNECTION_MODE_ENABLED, false); .getBoolean(CommonsApplication.IS_LIMITED_CONNECTION_MODE_ENABLED, false);
checkable.setChecked(isEnabled); checkable.setChecked(isEnabled);
if (isEnabled) { if (binding!=null) {
limitedConnectionEnabledLayout.setVisibility(View.VISIBLE); binding.limitedConnectionEnabledLayout.setVisibility(isEnabled ? View.VISIBLE : View.GONE);
} else {
limitedConnectionEnabledLayout.setVisibility(View.GONE);
} }
checkable.setIcon((isEnabled) ? R.drawable.ic_baseline_cloud_off_24:R.drawable.ic_baseline_cloud_queue_24); checkable.setIcon((isEnabled) ? R.drawable.ic_baseline_cloud_off_24:R.drawable.ic_baseline_cloud_queue_24);
checkable.setOnMenuItemClickListener(new OnMenuItemClickListener() { checkable.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override @Override
public boolean onMenuItemClick(MenuItem item) { public boolean onMenuItemClick(MenuItem item) {
((MainActivity) getActivity()).toggleLimitedConnectionMode(); ((MainActivity) getActivity()).toggleLimitedConnectionMode();
boolean isEnabled = store.getBoolean(CommonsApplication.IS_LIMITED_CONNECTION_MODE_ENABLED, false); boolean isEnabled = store.getBoolean(CommonsApplication.IS_LIMITED_CONNECTION_MODE_ENABLED, false);
if (isEnabled) { binding.limitedConnectionEnabledLayout.setVisibility(isEnabled ? View.VISIBLE : View.GONE);
limitedConnectionEnabledLayout.setVisibility(View.VISIBLE);
} else {
limitedConnectionEnabledLayout.setVisibility(View.GONE);
}
checkable.setIcon((isEnabled) ? R.drawable.ic_baseline_cloud_off_24:R.drawable.ic_baseline_cloud_queue_24); checkable.setIcon((isEnabled) ? R.drawable.ic_baseline_cloud_off_24:R.drawable.ic_baseline_cloud_queue_24);
return false; return false;
} }
@ -326,14 +319,14 @@ public class ContributionsFragment
*/ */
private void showContributionsListFragment() { private void showContributionsListFragment() {
// show nearby card view on contributions list is visible // show nearby card view on contributions list is visible
if (nearbyNotificationCardView != null && !isUserProfile) { if (binding.cardViewNearby != null && !isUserProfile) {
if (store.getBoolean("displayNearbyCardView", true)) { if (store.getBoolean("displayNearbyCardView", true)) {
if (nearbyNotificationCardView.cardViewVisibilityState if (binding.cardViewNearby.cardViewVisibilityState
== NearbyNotificationCardView.CardViewVisibilityState.READY) { == NearbyNotificationCardView.CardViewVisibilityState.READY) {
nearbyNotificationCardView.setVisibility(View.VISIBLE); binding.cardViewNearby.setVisibility(View.VISIBLE);
} }
} else { } else {
nearbyNotificationCardView.setVisibility(View.GONE); binding.cardViewNearby.setVisibility(View.GONE);
} }
} }
showFragment(contributionsListFragment, CONTRIBUTION_LIST_FRAGMENT_TAG, mediaDetailPagerFragment); showFragment(contributionsListFragment, CONTRIBUTION_LIST_FRAGMENT_TAG, mediaDetailPagerFragment);
@ -346,8 +339,9 @@ public class ContributionsFragment
} }
private void setupViewForMediaDetails() { private void setupViewForMediaDetails() {
campaignView.setVisibility(View.GONE); if (binding!=null) {
nearbyNotificationCardView.setVisibility(View.GONE); binding.campaignsView.setVisibility(View.GONE);
}
} }
@Override @Override
@ -453,7 +447,12 @@ public class ContributionsFragment
super.onResume(); super.onResume();
contributionsPresenter.onAttachView(this); contributionsPresenter.onAttachView(this);
locationManager.addLocationListener(this); locationManager.addLocationListener(this);
nearbyNotificationCardView.permissionRequestButton.setOnClickListener(v -> {
if (binding==null) {
return;
}
binding.cardViewNearby.permissionRequestButton.setOnClickListener(v -> {
showNearbyCardPermissionRationale(); showNearbyCardPermissionRationale();
}); });
@ -468,13 +467,13 @@ public class ContributionsFragment
} catch (Exception e) { } catch (Exception e) {
Timber.e(e); Timber.e(e);
} }
if (nearbyNotificationCardView.cardViewVisibilityState == NearbyNotificationCardView.CardViewVisibilityState.READY) { if (binding.cardViewNearby.cardViewVisibilityState == NearbyNotificationCardView.CardViewVisibilityState.READY) {
nearbyNotificationCardView.setVisibility(View.VISIBLE); binding.cardViewNearby.setVisibility(View.VISIBLE);
} }
} else { } else {
// Hide nearby notification card view if related shared preferences is false // 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 // 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("displayLocationPermissionForCardView", true)
&& !store.getBoolean("doNotAskForLocationPermission", false) && !store.getBoolean("doNotAskForLocationPermission", false)
&& (((MainActivity) getActivity()).activeFragment == ActiveFragment.CONTRIBUTIONS)) { && (((MainActivity) getActivity()).activeFragment == ActiveFragment.CONTRIBUTIONS)) {
nearbyNotificationCardView.permissionType = NearbyNotificationCardView.PermissionType.ENABLE_LOCATION_PERMISSION; binding.cardViewNearby.permissionType = NearbyNotificationCardView.PermissionType.ENABLE_LOCATION_PERMISSION;
showNearbyCardPermissionRationale(); showNearbyCardPermissionRationale();
} }
} }
@ -503,7 +502,7 @@ public class ContributionsFragment
} }
private void onLocationPermissionGranted() { private void onLocationPermissionGranted() {
nearbyNotificationCardView.permissionType = NearbyNotificationCardView.PermissionType.NO_PERMISSION_NEEDED; binding.cardViewNearby.permissionType = NearbyNotificationCardView.PermissionType.NO_PERMISSION_NEEDED;
locationManager.registerLocationManager(); locationManager.registerLocationManager();
} }
@ -548,21 +547,21 @@ public class ContributionsFragment
} }
if(closestNearbyPlace == null) { if(closestNearbyPlace == null) {
nearbyNotificationCardView.setVisibility(View.GONE); binding.cardViewNearby.setVisibility(View.GONE);
}else{ }else{
String distance = formatDistanceBetween(curLatLng, closestNearbyPlace.location); String distance = formatDistanceBetween(curLatLng, closestNearbyPlace.location);
closestNearbyPlace.setDistance(distance); closestNearbyPlace.setDistance(distance);
direction = (float) computeBearing(curLatLng, closestNearbyPlace.location); direction = (float) computeBearing(curLatLng, closestNearbyPlace.location);
nearbyNotificationCardView.updateContent(closestNearbyPlace); binding.cardViewNearby.updateContent(closestNearbyPlace);
} }
} else { } else {
// Means that no close nearby place is found // 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 // 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()) { if (mediaDetailPagerFragment != null && !contributionsListFragment.isVisible()) {
nearbyNotificationCardView.setVisibility(View.GONE); binding.cardViewNearby.setVisibility(View.GONE);
} }
} }
@ -614,12 +613,16 @@ public class ContributionsFragment
*/ */
private void fetchCampaigns() { private void fetchCampaigns() {
if (Utils.isMonumentsEnabled(new Date())) { if (Utils.isMonumentsEnabled(new Date())) {
campaignView.setCampaign(wlmCampaign); if (binding!=null) {
campaignView.setVisibility(View.VISIBLE); binding.campaignsView.setCampaign(wlmCampaign);
binding.campaignsView.setVisibility(View.VISIBLE);
}
} else if (store.getBoolean(CampaignView.CAMPAIGNS_DEFAULT_PREFERENCE, true)) { } else if (store.getBoolean(CampaignView.CAMPAIGNS_DEFAULT_PREFERENCE, true)) {
presenter.getCampaigns(); presenter.getCampaigns();
} else { } 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) { @Override public void showCampaigns(Campaign campaign) {
if (campaign != null && !isUserProfile) { if (campaign != null && !isUserProfile) {
campaignView.setCampaign(campaign); if (binding!=null) {
binding.campaignsView.setCampaign(campaign);
}
} }
} }
@ -746,11 +751,11 @@ public class ContributionsFragment
public boolean backButtonClicked() { public boolean backButtonClicked() {
if (mediaDetailPagerFragment != null && mediaDetailPagerFragment.isVisible()) { if (mediaDetailPagerFragment != null && mediaDetailPagerFragment.isVisible()) {
if (store.getBoolean("displayNearbyCardView", true) && !isUserProfile) { if (store.getBoolean("displayNearbyCardView", true) && !isUserProfile) {
if (nearbyNotificationCardView.cardViewVisibilityState == NearbyNotificationCardView.CardViewVisibilityState.READY) { if (binding.cardViewNearby.cardViewVisibilityState == NearbyNotificationCardView.CardViewVisibilityState.READY) {
nearbyNotificationCardView.setVisibility(View.VISIBLE); binding.cardViewNearby.setVisibility(View.VISIBLE);
} }
} else { } else {
nearbyNotificationCardView.setVisibility(View.GONE); binding.cardViewNearby.setVisibility(View.GONE);
} }
removeFragment(mediaDetailPagerFragment); removeFragment(mediaDetailPagerFragment);
showFragment(contributionsListFragment, CONTRIBUTION_LIST_FRAGMENT_TAG, mediaDetailPagerFragment); showFragment(contributionsListFragment, CONTRIBUTION_LIST_FRAGMENT_TAG, mediaDetailPagerFragment);
@ -812,7 +817,7 @@ public class ContributionsFragment
@Override @Override
public void onClick(View view) { public void onClick(View view) {
View view2 = limitedConnectionDescriptionTextView; View view2 = binding.limitedConnectionDescriptionTextView;
if (view2.getVisibility() == View.GONE) { if (view2.getVisibility() == View.GONE) {
view2.setVisibility(View.VISIBLE); view2.setVisibility(View.VISIBLE);
} else { } else {
@ -827,7 +832,7 @@ public class ContributionsFragment
@Override @Override
public void onSensorChanged(SensorEvent event) { public void onSensorChanged(SensorEvent event) {
float rotateDegree = Math.round(event.values[0]); float rotateDegree = Math.round(event.values[0]);
nearbyNotificationCardView.rotateCompass(rotateDegree, direction); binding.cardViewNearby.rotateCompass(rotateDegree, direction);
} }
@Override @Override

View file

@ -428,7 +428,7 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment implements
// in the case when MediaDetailPagerFragment is directly started by the CategoryImagesActivity // in the case when MediaDetailPagerFragment is directly started by the CategoryImagesActivity
if (getParentFragment() instanceof ContributionsFragment) { if (getParentFragment() instanceof ContributionsFragment) {
((ContributionsFragment) (getParentFragment() ((ContributionsFragment) (getParentFragment()
.getParentFragment())).nearbyNotificationCardView .getParentFragment())).binding.cardViewNearby
.setVisibility(View.GONE); .setVisibility(View.GONE);
} }
} }

View file

@ -374,7 +374,7 @@ public class UploadCategoriesFragment extends UploadBaseFragment implements Cate
if (getParentFragment().getParentFragment().getParentFragment() if (getParentFragment().getParentFragment().getParentFragment()
instanceof ContributionsFragment) { instanceof ContributionsFragment) {
((ContributionsFragment) (getParentFragment() ((ContributionsFragment) (getParentFragment()
.getParentFragment().getParentFragment())).nearbyNotificationCardView .getParentFragment().getParentFragment())).binding.cardViewNearby
.setVisibility(View.GONE); .setVisibility(View.GONE);
} }
} }

View file

@ -404,7 +404,7 @@ public class DepictsFragment extends UploadBaseFragment implements DepictsContra
if (getParentFragment().getParentFragment().getParentFragment() if (getParentFragment().getParentFragment().getParentFragment()
instanceof ContributionsFragment) { instanceof ContributionsFragment) {
((ContributionsFragment) (getParentFragment() ((ContributionsFragment) (getParentFragment()
.getParentFragment().getParentFragment())).nearbyNotificationCardView .getParentFragment().getParentFragment())).binding.cardViewNearby
.setVisibility(View.GONE); .setVisibility(View.GONE);
} }
} }

View file

@ -16,6 +16,7 @@ import fr.free.nrw.commons.Media
import fr.free.nrw.commons.R import fr.free.nrw.commons.R
import fr.free.nrw.commons.TestCommonsApplication import fr.free.nrw.commons.TestCommonsApplication
import fr.free.nrw.commons.TestUtility.setFinalStatic 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.media.MediaClient
import fr.free.nrw.commons.profile.ProfileActivity import fr.free.nrw.commons.profile.ProfileActivity
import io.reactivex.disposables.CompositeDisposable import io.reactivex.disposables.CompositeDisposable
@ -46,17 +47,6 @@ class ContributionViewHolderUnitTests {
private lateinit var contributionViewHolder: ContributionViewHolder private lateinit var contributionViewHolder: ContributionViewHolder
private lateinit var activity: ProfileActivity private lateinit var activity: ProfileActivity
private lateinit var parent: View 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 @Mock
private lateinit var callback: ContributionsListAdapter.Callback private lateinit var callback: ContributionsListAdapter.Callback
@ -76,6 +66,8 @@ class ContributionViewHolderUnitTests {
@Mock @Mock
private lateinit var media: Media private lateinit var media: Media
private lateinit var bindind : LayoutContributionBinding
@Before @Before
fun setUp() { fun setUp() {
MockitoAnnotations.initMocks(this) MockitoAnnotations.initMocks(this)
@ -85,42 +77,10 @@ class ContributionViewHolderUnitTests {
parent = LayoutInflater.from(activity).inflate(R.layout.layout_contribution, null) parent = LayoutInflater.from(activity).inflate(R.layout.layout_contribution, null)
contributionViewHolder = ContributionViewHolder(parent, callback, mediaClient) contributionViewHolder = ContributionViewHolder(parent, callback, mediaClient)
pauseResumeButton = parent.findViewById(R.id.pauseResumeButton) bindind = LayoutContributionBinding.bind(parent)
Whitebox.setInternalState(contributionViewHolder, "pauseResumeButton", pauseResumeButton)
addToWikipediaButton = parent.findViewById(R.id.wikipediaButton) Whitebox.setInternalState(contributionViewHolder, "binding", bindind)
Whitebox.setInternalState(
contributionViewHolder,
"addToWikipediaButton",
addToWikipediaButton
)
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( setFinalStatic(
ContributionViewHolder::class.java.getDeclaredField("compositeDisposable"), ContributionViewHolder::class.java.getDeclaredField("compositeDisposable"),
compositeDisposable) compositeDisposable)
@ -185,7 +145,7 @@ class ContributionViewHolderUnitTests {
@Test @Test
@Throws(Exception::class) @Throws(Exception::class)
fun testOnPauseResumeButtonClickedCaseFalse() { fun testOnPauseResumeButtonClickedCaseFalse() {
pauseResumeButton.tag = "" bindind.pauseResumeButton.tag = ""
contributionViewHolder.onPauseResumeButtonClicked() contributionViewHolder.onPauseResumeButtonClicked()
} }

View file

@ -15,6 +15,7 @@ import fr.free.nrw.commons.TestCommonsApplication
import fr.free.nrw.commons.createTestClient import fr.free.nrw.commons.createTestClient
import fr.free.nrw.commons.campaigns.CampaignView import fr.free.nrw.commons.campaigns.CampaignView
import fr.free.nrw.commons.campaigns.models.Campaign 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.kvstore.JsonKvStore
import fr.free.nrw.commons.media.MediaDetailPagerFragment import fr.free.nrw.commons.media.MediaDetailPagerFragment
import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient
@ -120,21 +121,10 @@ class ContributionsFragmentUnitTests {
Whitebox.setInternalState(fragment, "contributionsListFragment", contributionsListFragment) Whitebox.setInternalState(fragment, "contributionsListFragment", contributionsListFragment)
Whitebox.setInternalState(fragment, "store", store) Whitebox.setInternalState(fragment, "store", store)
Whitebox.setInternalState(
fragment,
"limitedConnectionEnabledLayout",
limitedConnectionEnabledLayout
)
Whitebox.setInternalState(fragment, "notificationCount", notificationCount) Whitebox.setInternalState(fragment, "notificationCount", notificationCount)
Whitebox.setInternalState(fragment, "notificationController", notificationController) Whitebox.setInternalState(fragment, "notificationController", notificationController)
Whitebox.setInternalState(fragment, "compositeDisposable", compositeDisposable) Whitebox.setInternalState(fragment, "compositeDisposable", compositeDisposable)
Whitebox.setInternalState(fragment, "okHttpJsonApiClient", okHttpJsonApiClient) Whitebox.setInternalState(fragment, "okHttpJsonApiClient", okHttpJsonApiClient)
Whitebox.setInternalState(
fragment,
"nearbyNotificationCardView",
nearbyNotificationCardView
)
Whitebox.setInternalState(fragment, "campaignView", campaignView)
} }
@Test @Test