diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 5ba49201a..79640049b 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,262 +1,247 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ xmlns:tools="http://schemas.android.com/tools">
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
-
+
-
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
-
+
+
-
+
+
+
+
+
+
-
-
-
+
-
-
+
+
+
+
+
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
-
+
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
+
+
+
+
-
-
-
-
-
-
-
+
+
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
\ No newline at end of file
diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionDao.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionDao.java
index b4889b6a2..5fb002319 100644
--- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionDao.java
+++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionDao.java
@@ -20,6 +20,10 @@ public abstract class ContributionDao {
@Query("SELECT * FROM contribution order by media_dateUploaded DESC")
abstract DataSource.Factory fetchContributions();
+ @Query("SELECT * FROM contribution WHERE state = -1 ORDER BY media_dateUploaded DESC")
+ abstract DataSource.Factory fetchContributionsWithStateCompleted();
+
+
@Insert(onConflict = OnConflictStrategy.REPLACE)
public abstract void saveSynchronous(Contribution contribution);
diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.java
index 7ea5163bb..568ac9a37 100644
--- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.java
+++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.java
@@ -48,11 +48,8 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
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. */
@@ -79,9 +76,6 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
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());
@@ -90,79 +84,27 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
imageRequest = ImageRequestBuilder.newBuilderWithSource(Uri.parse(imageSource))
.setProgressiveRenderingEnabled(true)
.build();
- }
- else if (URLUtil.isFileUrl(imageSource)){
- imageRequest=ImageRequest.fromUri(Uri.parse(imageSource));
- }
- else if(imageSource != null) {
+ } else if (URLUtil.isFileUrl(imageSource)) {
+ imageRequest = ImageRequest.fromUri(Uri.parse(imageSource));
+ } else if (imageSource != null) {
final File file = new File(imageSource);
imageRequest = ImageRequest.fromFile(file);
}
- if(imageRequest != null){
+ if (imageRequest != null) {
binding.contributionImage.setImageRequest(imageRequest);
}
}
binding.contributionSequenceNumber.setText(String.valueOf(position + 1));
binding.contributionSequenceNumber.setVisibility(View.VISIBLE);
-
binding.wikipediaButton.setVisibility(View.GONE);
- switch (contribution.getState()) {
- case Contribution.STATE_COMPLETED:
- 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:
- 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:
- 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) {
- binding.contributionProgress.setIndeterminate(true);
- } else {
- binding.contributionProgress.setIndeterminate(false);
- binding.contributionProgress.setProgress((int) (((double) transferred / (double) total) * 100));
- }
- break;
- case Contribution.STATE_PAUSED:
- 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:
- 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;
- }
+ binding.contributionState.setVisibility(View.GONE);
+ binding.contributionProgress.setVisibility(View.GONE);
+ binding.imageOptions.setVisibility(View.GONE);
+ binding.contributionState.setText("");
+ checkIfMediaExistsOnWikipediaPage(contribution);
+
}
/**
@@ -196,8 +138,6 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
if (!mediaExists) {
binding.wikipediaButton.setVisibility(View.VISIBLE);
isWikipediaButtonDisplayed = true;
- binding.cancelButton.setVisibility(View.GONE);
- binding.retryButton.setVisibility(View.GONE);
binding.imageOptions.setVisibility(View.VISIBLE);
}
}
@@ -217,20 +157,6 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
null;
}
- /**
- * Retry upload when it is failed
- */
- public void retryUpload() {
- callback.retryUpload(contribution);
- }
-
- /**
- * Delete a failed upload attempt
- */
- public void deleteUpload() {
- callback.deleteUpload(contribution);
- }
-
public void imageClicked() {
callback.openMediaDetail(position, isWikipediaButtonDisplayed);
}
@@ -239,44 +165,6 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
callback.addImageToWikipedia(contribution);
}
- /**
- * Triggers a callback for pause/resume
- */
- public void onPauseResumeButtonClicked() {
- if (binding.pauseResumeButton.getTag().toString().equals("pause")) {
- pause();
- } else {
- resume();
- }
- }
-
- private void resume() {
- callback.resumeUpload(contribution);
- setPaused();
- }
-
- private void pause() {
- pausingPopUp.show();
- callback.pauseUpload(contribution);
- setResume();
- }
-
- /**
- * Update pause/resume button to show pause state
- */
- private void setPaused() {
- 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() {
- binding.pauseResumeButton.setImageResource(R.drawable.play_icon);
- binding.pauseResumeButton.setTag(parent.getContext().getString(R.string.resume));
- }
-
public ImageRequest getImageRequest() {
return imageRequest;
}
diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsFragment.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsFragment.java
index 189b2665f..c995cb582 100644
--- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsFragment.java
+++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsFragment.java
@@ -12,6 +12,7 @@ import android.Manifest;
import android.Manifest.permission;
import android.annotation.SuppressLint;
import android.content.Context;
+import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
@@ -25,6 +26,7 @@ import android.view.MenuItem.OnMenuItemClickListener;
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;
@@ -44,6 +46,7 @@ import fr.free.nrw.commons.notification.models.Notification;
import fr.free.nrw.commons.notification.NotificationController;
import fr.free.nrw.commons.profile.ProfileActivity;
import fr.free.nrw.commons.theme.BaseActivity;
+import fr.free.nrw.commons.upload.UploadProgressActivity;
import java.util.Date;
import java.util.List;
import java.util.Map;
@@ -129,6 +132,10 @@ public class ContributionsFragment
public TextView notificationCount;
+ public TextView pendingUploadsCountTextView;
+
+ public TextView uploadsErrorTextView;
+
private Campaign wlmCampaign;
String userName;
@@ -212,9 +219,7 @@ public class ContributionsFragment
}
initFragments();
- if(isUserProfile) {
- binding.limitedConnectionEnabledLayout.setVisibility(View.GONE);
- }else {
+ if(!isUserProfile) {
upDateUploadCount();
}
if (shouldShowMediaDetailsFragment) {
@@ -230,7 +235,6 @@ public class ContributionsFragment
&& sessionManager.getCurrentAccount() != null && !isUserProfile) {
setUploadCount();
}
- binding.limitedConnectionEnabledLayout.setOnClickListener(toggleDescriptionListener);
setHasOptionsMenu(true);
return binding.getRoot();
}
@@ -258,10 +262,27 @@ public class ContributionsFragment
MenuItem notificationsMenuItem = menu.findItem(R.id.notifications);
final View notification = notificationsMenuItem.getActionView();
notificationCount = notification.findViewById(R.id.notification_count_badge);
+ MenuItem uploadMenuItem = menu.findItem(R.id.upload_tab);
+ final View uploadMenuItemActionView = uploadMenuItem.getActionView();
+ pendingUploadsCountTextView = uploadMenuItemActionView.findViewById(R.id.pending_uploads_count_badge);
+ uploadsErrorTextView = uploadMenuItemActionView.findViewById(R.id.uploads_error_count_badge);
+ final ImageView pendingUploadsImageView = uploadMenuItemActionView.findViewById(R.id.pending_uploads_image_view);
+
+ pendingUploadsImageView.setOnClickListener(view -> {
+ startActivity(new Intent(getContext(), UploadProgressActivity.class));
+ });
+
+ pendingUploadsCountTextView.setOnClickListener(view -> {
+ startActivity(new Intent(getContext(), UploadProgressActivity.class));
+ });
+
+ uploadsErrorTextView.setOnClickListener(view -> {
+ startActivity(new Intent(getContext(), UploadProgressActivity.class));
+ });
+
notification.setOnClickListener(view -> {
NotificationActivity.startYourself(getContext(), "unread");
});
- updateLimitedConnectionToggle(menu);
}
@SuppressLint("CheckResult")
@@ -289,29 +310,6 @@ public class ContributionsFragment
}
}
- public void updateLimitedConnectionToggle(Menu menu) {
- MenuItem checkable = menu.findItem(R.id.toggle_limited_connection_mode);
- boolean isEnabled = store
- .getBoolean(CommonsApplication.IS_LIMITED_CONNECTION_MODE_ENABLED, false);
-
- checkable.setChecked(isEnabled);
- 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);
- 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;
- }
- });
- }
-
@Override
public void onAttach(Context context) {
super.onAttach(context);
@@ -747,6 +745,26 @@ public class ContributionsFragment
}
}
+ @Override
+ public void updateUploadsIcon(int pendingCount, int errorCount) {
+ if (pendingUploadsCountTextView != null){
+ if (pendingCount != 0){
+ pendingUploadsCountTextView.setVisibility(View.VISIBLE);
+ pendingUploadsCountTextView.setText(String.valueOf(pendingCount));
+ }else {
+ pendingUploadsCountTextView.setVisibility(View.INVISIBLE);
+ }
+
+ if (errorCount != 0){
+ uploadsErrorTextView.setVisibility(View.VISIBLE);
+ uploadsErrorTextView.setText(String.valueOf(errorCount));
+ }else {
+ uploadsErrorTextView.setVisibility(View.GONE);
+ }
+
+ }
+ }
+
/**
* Replace whatever is in the current contributionsFragmentContainer view with
* mediaDetailPagerFragment, and preserve previous state in back stack. Called when user selects
@@ -844,21 +862,6 @@ public class ContributionsFragment
}
}
- // click listener to toggle description that means uses can press the limited connection
- // banner and description will hide. Tap again to show description.
- private View.OnClickListener toggleDescriptionListener = new View.OnClickListener() {
-
- @Override
- public void onClick(View view) {
- View view2 = binding.limitedConnectionDescriptionTextView;
- if (view2.getVisibility() == View.GONE) {
- view2.setVisibility(View.VISIBLE);
- } else {
- view2.setVisibility(View.GONE);
- }
- }
- };
-
/**
* When the device rotates, rotate the Nearby banner's compass arrow in tandem.
*/
diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java
index 2dbe8aff0..330d35ff4 100644
--- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java
+++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java
@@ -19,7 +19,7 @@ import android.view.animation.AnimationUtils;
import android.widget.LinearLayout;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
-import androidx.activity.result.contract.ActivityResultContracts;
+import androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
@@ -35,6 +35,7 @@ import fr.free.nrw.commons.Media;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.Utils;
import fr.free.nrw.commons.auth.SessionManager;
+import fr.free.nrw.commons.contributions.ContributionsListAdapter.Callback;
import fr.free.nrw.commons.databinding.FragmentContributionsListBinding;
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
import fr.free.nrw.commons.media.MediaClient;
@@ -49,6 +50,7 @@ import javax.inject.Inject;
import javax.inject.Named;
import org.apache.commons.lang3.StringUtils;
import fr.free.nrw.commons.wikidata.model.WikiSite;
+import timber.log.Timber;
/**
@@ -56,7 +58,7 @@ import fr.free.nrw.commons.wikidata.model.WikiSite;
*/
public class ContributionsListFragment extends CommonsDaggerSupportFragment implements
- ContributionsListContract.View, ContributionsListAdapter.Callback,
+ ContributionsListContract.View, Callback,
WikipediaInstructionsDialogFragment.Callback {
private static final String RV_STATE = "rv_scroll_state";
@@ -81,7 +83,8 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment impl
private Animation rotate_forward;
private Animation rotate_backward;
private boolean isFabOpen;
-
+ public int pendingUploadsCount = 0;
+ public int uploadErrorCount = 0;
@VisibleForTesting
protected RecyclerView rvContributionsList;
@@ -99,7 +102,7 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment impl
private String userName;
private ActivityResultLauncher inAppCameraLocationPermissionLauncher = registerForActivityResult(
- new ActivityResultContracts.RequestMultiplePermissions(),
+ new RequestMultiplePermissions(),
new ActivityResultCallback