diff --git a/app/src/main/java/fr/free/nrw/commons/description/DescriptionEditActivity.kt b/app/src/main/java/fr/free/nrw/commons/description/DescriptionEditActivity.kt
index d2231e4165..ac01398804 100644
--- a/app/src/main/java/fr/free/nrw/commons/description/DescriptionEditActivity.kt
+++ b/app/src/main/java/fr/free/nrw/commons/description/DescriptionEditActivity.kt
@@ -73,7 +73,6 @@ class DescriptionEditActivity : BaseActivity(), UploadMediaDetailAdapter.EventLi
savedLanguageValue = bundle.getString(Prefs.DESCRIPTION_LANGUAGE)!!
initRecyclerView(descriptionAndCaptions)
- binding.btnAddDescription.setOnClickListener(::onButtonAddDescriptionClicked)
binding.btnEditSubmit.setOnClickListener(::onSubmitButtonClicked)
binding.toolbarBackButton.setOnClickListener(::onBackButtonClicked)
}
@@ -112,17 +111,20 @@ class DescriptionEditActivity : BaseActivity(), UploadMediaDetailAdapter.EventLi
override fun onPrimaryCaptionTextChange(isNotEmpty: Boolean) {}
- private fun onBackButtonClicked(view: View) {
- onBackPressed()
- }
-
- private fun onButtonAddDescriptionClicked(view: View) {
+ /**
+ * Adds new language item to RecyclerView
+ */
+ override fun addLanguage() {
val uploadMediaDetail = UploadMediaDetail()
uploadMediaDetail.isManuallyAdded = true //This was manually added by the user
uploadMediaDetailAdapter.addDescription(uploadMediaDetail)
rvDescriptions!!.smoothScrollToPosition(uploadMediaDetailAdapter.itemCount - 1)
}
+ private fun onBackButtonClicked(view: View) {
+ onBackPressed()
+ }
+
private fun onSubmitButtonClicked(view: View) {
showLoggingProgressBar()
val uploadMediaDetails = uploadMediaDetailAdapter.items
diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadMediaDetailAdapter.java b/app/src/main/java/fr/free/nrw/commons/upload/UploadMediaDetailAdapter.java
index 70901fba9e..2669e426ef 100644
--- a/app/src/main/java/fr/free/nrw/commons/upload/UploadMediaDetailAdapter.java
+++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadMediaDetailAdapter.java
@@ -15,12 +15,14 @@
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.EditText;
+import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView;
@@ -190,6 +192,7 @@ public void removeDescription(final UploadMediaDetail uploadMediaDetail, final i
}
notifyItemRemoved(position);
notifyItemRangeChanged(position, uploadMediaDetails.size() - position);
+ updateAddButtonVisibility();
}
public class ViewHolder extends RecyclerView.ViewHolder {
@@ -213,6 +216,12 @@ public class ViewHolder extends RecyclerView.ViewHolder {
@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;
@@ -292,6 +301,17 @@ public void bind(int position) {
descItemEditText.addTextChangedListener(descriptionListener);
initLanguage(position, uploadMediaDetail);
+ if (fragment != null) {
+ FrameLayout.LayoutParams newLayoutParams = (FrameLayout.LayoutParams) clParent.getLayoutParams();
+ newLayoutParams.topMargin = 0;
+ newLayoutParams.leftMargin = 0;
+ newLayoutParams.rightMargin = 0;
+ newLayoutParams.bottomMargin = 0;
+ clParent.setLayoutParams(newLayoutParams);
+ }
+ updateAddButtonVisibility();
+ addButton.setOnClickListener(v -> eventListener.addLanguage());
+
//If the description was manually added by the user, it deserves focus, if not, let the user decide
if (uploadMediaDetail.isManuallyAdded()) {
captionItemEditText.requestFocus();
@@ -557,6 +577,55 @@ public String convertIdeographicSpaceToLatinSpace(String source) {
}
+ /**
+ * Hides the visibility of the "Add" button for all items in the RecyclerView except
+ * the last item in RecyclerView
+ */
+ private void updateAddButtonVisibility() {
+ int lastItemPosition = getItemCount() - 1;
+ // Hide Add Button for all items
+ for (int i = 0; i < getItemCount(); i++) {
+ if (fragment != null) {
+ if (fragment.getView() != null) {
+ ViewHolder holder = (ViewHolder) ((RecyclerView) fragment.getView()
+ .findViewById(R.id.rv_descriptions)).findViewHolderForAdapterPosition(i);
+ if (holder != null) {
+ holder.addButton.setVisibility(View.GONE);
+ }
+ }
+ } else {
+ if (this.activity != null) {
+ ViewHolder holder = (ViewHolder) ((RecyclerView) activity.findViewById(
+ R.id.rv_descriptions_captions)).findViewHolderForAdapterPosition(i);
+ if (holder != null) {
+ holder.addButton.setVisibility(View.GONE);
+ }
+ }
+ }
+ }
+
+ // Show Add Button for the last item
+ if (fragment != null) {
+ if (fragment.getView() != null) {
+ ViewHolder lastItemHolder = (ViewHolder) ((RecyclerView) fragment.getView()
+ .findViewById(R.id.rv_descriptions)).findViewHolderForAdapterPosition(
+ lastItemPosition);
+ if (lastItemHolder != null) {
+ lastItemHolder.addButton.setVisibility(View.VISIBLE);
+ }
+ }
+ } else {
+ if (this.activity != null) {
+ ViewHolder lastItemHolder = (ViewHolder) ((RecyclerView) activity
+ .findViewById(R.id.rv_descriptions_captions)).findViewHolderForAdapterPosition(
+ lastItemPosition);
+ if (lastItemHolder != null) {
+ lastItemHolder.addButton.setVisibility(View.VISIBLE);
+ }
+ }
+ }
+ }
+
public interface Callback {
void showAlert(int mediaDetailDescription, int descriptionInfo);
@@ -565,6 +634,8 @@ public interface Callback {
public interface EventListener {
void onPrimaryCaptionTextChange(boolean isNotEmpty);
+
+ void addLanguage();
}
enum SelectedVoiceIcon {
diff --git a/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.java b/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.java
index a3e58ac679..3ac1007190 100644
--- a/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.java
+++ b/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.java
@@ -76,8 +76,12 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements
public static final String LAST_ZOOM = "last_zoom_level_while_uploading";
@BindView(R.id.tv_title)
TextView tvTitle;
- @BindView(R.id.ib_map)
- AppCompatImageButton ibMap;
+ @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)
@@ -90,8 +94,8 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements
AppCompatButton btnNext;
@BindView(R.id.btn_previous)
AppCompatButton btnPrevious;
- @BindView(R.id.edit_image)
- AppCompatButton editImage;
+ @BindView(R.id.ll_edit_image)
+ LinearLayout llEditImage;
@BindView(R.id.tooltip)
ImageView tooltip;
@@ -195,13 +199,15 @@ private void init() {
// 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_tick_white_24dp);
- ibMap.setImageDrawable(mapTick);
+ Drawable mapTick = getResources().getDrawable(R.drawable.ic_map_available_20dp);
+ locationImageView.setImageDrawable(mapTick);
+ 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_question_white_24dp);
- ibMap.setImageDrawable(mapQuestionMark);
+ getResources().getDrawable(R.drawable.ic_map_not_available_20dp);
+ locationImageView.setImageDrawable(mapQuestionMark);
+ locationTextView.setText(R.string.add_location);
}
//If this is the last media, we have nothing to copy, lets not show the button
@@ -269,15 +275,7 @@ public void onPreviousButtonClicked() {
callback.onPreviousButtonClicked(callback.getIndexInViewFlipper(this));
}
- @OnClick(R.id.btn_add_description)
- public void onButtonAddDescriptionClicked() {
- UploadMediaDetail uploadMediaDetail = new UploadMediaDetail();
- uploadMediaDetail.setManuallyAdded(true);//This was manually added by the user
- uploadMediaDetailAdapter.addDescription(uploadMediaDetail);
- rvDescriptions.smoothScrollToPosition(uploadMediaDetailAdapter.getItemCount()-1);
- }
-
- @OnClick(R.id.edit_image)
+ @OnClick(R.id.ll_edit_image)
public void onEditButtonClicked() {
presenter.onEditButtonClicked(callback.getIndexInViewFlipper(this));
}
@@ -619,8 +617,9 @@ public void editLocation(final String latitude, final String longitude, final do
editableUploadItem.getGpsCoords().setZoomLevel(zoom);
// Replace the map icon using the one with a green tick
- Drawable mapTick = getResources().getDrawable(R.drawable.ic_map_tick_white_24dp);
- ibMap.setImageDrawable(mapTick);
+ Drawable mapTick = getResources().getDrawable(R.drawable.ic_map_available_20dp);
+ locationImageView.setImageDrawable(mapTick);
+ locationTextView.setText(R.string.edit_location);
Toast.makeText(getContext(), "Location Updated", Toast.LENGTH_LONG).show();
@@ -682,8 +681,8 @@ public void onDestroyView() {
presenter.onDetachView();
}
- @OnClick(R.id.rl_container_title)
- public void onRlContainerTitleClicked() {
+ @OnClick(R.id.ll_container_title)
+ public void onLlContainerTitleClicked() {
expandCollapseLlMediaDetail(!isExpanded);
}
@@ -697,7 +696,7 @@ private void expandCollapseLlMediaDetail(boolean shouldExpand){
ibExpandCollapse.setRotation(ibExpandCollapse.getRotation() + 180);
}
- @OnClick(R.id.ib_map) public void onIbMapClicked() {
+ @OnClick(R.id.ll_location_status) public void onIbMapClicked() {
presenter.onMapIconClicked(callback.getIndexInViewFlipper(this));
}
@@ -711,6 +710,17 @@ public void onPrimaryCaptionTextChange(boolean isNotEmpty) {
btnNext.setAlpha(isNotEmpty ? 1.0f : 0.5f);
}
+ /**
+ * Adds new language item to RecyclerView
+ */
+ @Override
+ public void addLanguage() {
+ UploadMediaDetail uploadMediaDetail = new UploadMediaDetail();
+ uploadMediaDetail.setManuallyAdded(true);//This was manually added by the user
+ uploadMediaDetailAdapter.addDescription(uploadMediaDetail);
+ rvDescriptions.smoothScrollToPosition(uploadMediaDetailAdapter.getItemCount()-1);
+ }
+
public interface UploadMediaDetailFragmentCallback extends Callback {
void deletePictureAtIndex(int index);
diff --git a/app/src/main/res/drawable/ic_add.xml b/app/src/main/res/drawable/ic_add.xml
new file mode 100644
index 0000000000..4549ee4e21
--- /dev/null
+++ b/app/src/main/res/drawable/ic_add.xml
@@ -0,0 +1,6 @@
+
+