diff --git a/app/build.gradle b/app/build.gradle index 19c570a6b..b00fcb153 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -350,8 +350,8 @@ android { compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 } kotlinOptions { jvmTarget = "1.8" diff --git a/app/src/main/java/fr/free/nrw/commons/LocationPicker/LocationPickerActivity.java b/app/src/main/java/fr/free/nrw/commons/LocationPicker/LocationPickerActivity.java index 035f542b3..59de8e0fe 100644 --- a/app/src/main/java/fr/free/nrw/commons/LocationPicker/LocationPickerActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/LocationPicker/LocationPickerActivity.java @@ -237,6 +237,16 @@ public class LocationPickerActivity extends BaseActivity implements cameraPosition.getLongitude())); } setupMapView(); + + if("UploadActivity".equals(activity)){ + if(mapView != null && mapView.getController() != null && cameraPosition != null){ + GeoPoint cameraGeoPoint = new GeoPoint(cameraPosition.getLatitude(), + cameraPosition.getLongitude()); + + mapView.getController().setCenter(cameraGeoPoint); + mapView.getController().animateTo(cameraGeoPoint); + } + } } /** diff --git a/app/src/main/java/fr/free/nrw/commons/explore/map/ExploreMapController.java b/app/src/main/java/fr/free/nrw/commons/explore/map/ExploreMapController.java index 99c755814..c944f75a1 100644 --- a/app/src/main/java/fr/free/nrw/commons/explore/map/ExploreMapController.java +++ b/app/src/main/java/fr/free/nrw/commons/explore/map/ExploreMapController.java @@ -143,7 +143,7 @@ public class ExploreMapController extends MapController { VectorDrawableCompat vectorDrawable = null; try { vectorDrawable = VectorDrawableCompat.create( - context.getResources(), R.drawable.ic_custom_map_marker, context.getTheme()); + context.getResources(), R.drawable.ic_custom_map_marker_dark, context.getTheme()); } catch (Resources.NotFoundException e) { // ignore when running tests. diff --git a/app/src/main/java/fr/free/nrw/commons/feedback/FeedbackDialog.java b/app/src/main/java/fr/free/nrw/commons/feedback/FeedbackDialog.java index 4768791e8..2308623ec 100644 --- a/app/src/main/java/fr/free/nrw/commons/feedback/FeedbackDialog.java +++ b/app/src/main/java/fr/free/nrw/commons/feedback/FeedbackDialog.java @@ -3,6 +3,9 @@ package fr.free.nrw.commons.feedback; import android.app.Dialog; import android.content.Context; import android.os.Bundle; +import android.text.Html; +import android.text.Spanned; +import android.text.method.LinkMovementMethod; import android.view.View; import android.view.WindowManager.LayoutParams; import fr.free.nrw.commons.R; @@ -21,15 +24,20 @@ public class FeedbackDialog extends Dialog { private OnFeedbackSubmitCallback onFeedbackSubmitCallback; + private Spanned feedbackDestinationHtml; + public FeedbackDialog(Context context, OnFeedbackSubmitCallback onFeedbackSubmitCallback) { super(context); this.onFeedbackSubmitCallback = onFeedbackSubmitCallback; + feedbackDestinationHtml = Html.fromHtml(context.getString(R.string.feedback_destination_note)); } @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); dialogFeedbackBinding = DialogFeedbackBinding.inflate(getLayoutInflater()); + dialogFeedbackBinding.feedbackDestination.setText(feedbackDestinationHtml); + dialogFeedbackBinding.feedbackDestination.setMovementMethod(LinkMovementMethod.getInstance()); Objects.requireNonNull(getWindow()).setSoftInputMode(LayoutParams.SOFT_INPUT_ADJUST_RESIZE); final View view = dialogFeedbackBinding.getRoot(); setContentView(view); diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java index 451423e9e..f6ef824e7 100644 --- a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java @@ -2,6 +2,9 @@ package fr.free.nrw.commons.media; import static fr.free.nrw.commons.Utils.handleWebUrl; +import android.os.Handler; +import android.os.Looper; +import android.widget.ProgressBar; import android.content.ActivityNotFoundException; import android.content.Intent; import android.graphics.Bitmap; @@ -76,6 +79,11 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple private boolean isFromFeaturedRootFragment; private int position; + /** + * ProgressBar used to indicate the loading status of media items. + */ + private ProgressBar imageProgressBar; + private ArrayList removedItems=new ArrayList(); public void clearRemoved(){ @@ -89,7 +97,7 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple /** * Use this factory method to create a new instance of this fragment using the provided * parameters. - * + * * This method will create a new instance of MediaDetailPagerFragment and the arguments will be * saved to a bundle which will be later available in the {@link #onCreate(Bundle)} * @param editable @@ -108,7 +116,7 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple public MediaDetailPagerFragment() { // Required empty public constructor }; - + @Override public View onCreateView(LayoutInflater inflater, @@ -116,7 +124,8 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple Bundle savedInstanceState) { binding = FragmentMediaDetailPagerBinding.inflate(inflater, container, false); binding.mediaDetailsPager.addOnPageChangeListener(this); - + // Initialize the ProgressBar by finding it in the layout + imageProgressBar = binding.getRoot().findViewById(R.id.itemProgressBar); adapter = new MediaDetailAdapter(getChildFragmentManager()); // ActionBar is now supported in both activities - if this crashes something is quite wrong @@ -397,7 +406,7 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple } catch (Exception e) { Timber.e("Cant detect media transparency"); } - + // Initialize bookmark object bookmark = new Bookmark( m.getFilename(), @@ -497,19 +506,27 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple * @param position current item that to be shown */ private void setViewPagerCurrentItem(int position) { - final Boolean[] currentItemNotShown = {true}; - Runnable runnable = new Runnable() { + + final Handler handler = new Handler(Looper.getMainLooper()); + final Runnable runnable = new Runnable() { @Override public void run() { - while(currentItemNotShown[0]){ - if(adapter.getCount() > position){ - binding.mediaDetailsPager.setCurrentItem(position, false); - currentItemNotShown[0] = false; - } + // Show the ProgressBar while waiting for the item to load + imageProgressBar.setVisibility(View.VISIBLE); + // Check if the adapter has enough items loaded + if(adapter.getCount() > position){ + // Set the current item in the ViewPager + binding.mediaDetailsPager.setCurrentItem(position, false); + // Hide the ProgressBar once the item is loaded + imageProgressBar.setVisibility(View.GONE); + } else { + // If the item is not ready yet, post the Runnable again + handler.post(this); } } }; - new Thread(runnable).start(); + // Start the Runnable + handler.post(runnable); } /** diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.java b/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.java index e35f6a78e..179b895d6 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.java @@ -144,7 +144,7 @@ import timber.log.Timber; public class NearbyParentFragment extends CommonsDaggerSupportFragment implements NearbyParentFragmentContract.View, - WikidataP18EditListener, LocationUpdateListener, + WikidataEditListener.WikidataP18EditListener, LocationUpdateListener, LocationPermissionCallback { 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 d7fe5ffd5..a4e0d1029 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 @@ -160,18 +160,30 @@ public class UploadMediaDetailAdapter extends } } + /** + * Handles the result of the speech input by processing the spoken text. + * If the spoken text is not empty, it capitalizes the first letter of the spoken text + * and updates the appropriate field (caption or description) of the current + * UploadMediaDetail based on the selected voice icon. + * Finally, it notifies the adapter that the data set has changed. + * + * @param spokenText the text input received from speech recognition. + */ public void handleSpeechResult(String spokenText) { if (!spokenText.isEmpty()) { String spokenTextCapitalized = spokenText.substring(0, 1).toUpperCase() + spokenText.substring(1); if (currentPosition < uploadMediaDetails.size()) { UploadMediaDetail uploadMediaDetail = uploadMediaDetails.get(currentPosition); - if (selectedVoiceIcon == SelectedVoiceIcon.CAPTION) { - uploadMediaDetail.setCaptionText(spokenTextCapitalized); - } else { - uploadMediaDetail.setDescriptionText(spokenTextCapitalized); + switch (selectedVoiceIcon) { + case CAPTION: + uploadMediaDetail.setCaptionText(spokenTextCapitalized); + break; + case DESCRIPTION: + uploadMediaDetail.setDescriptionText(spokenTextCapitalized); + break; } - notifyItemChanged(currentPosition); + notifyDataSetChanged(); } } } @@ -185,14 +197,7 @@ public class UploadMediaDetailAdapter extends */ public void removeDescription(final UploadMediaDetail uploadMediaDetail, final int position) { selectedLanguages.remove(position); - int listPosition = 0; - List keysList = new ArrayList<>(selectedLanguages.keySet()); - for (Integer key : keysList) { - if (key < position) { - listPosition++; - } - } - this.uploadMediaDetails.remove(uploadMediaDetails.get(listPosition)); + this.uploadMediaDetails.remove(uploadMediaDetail); int i = position + 1; while (selectedLanguages.containsKey(i)) { selectedLanguages.remove(i); @@ -299,12 +304,10 @@ public class UploadMediaDetailAdapter extends removeButton.setOnClickListener(v -> removeDescription(uploadMediaDetail, position)); captionListener = new AbstractTextWatcher( - captionText -> uploadMediaDetails.get(position) - .setCaptionText(convertIdeographicSpaceToLatinSpace( + captionText -> uploadMediaDetail.setCaptionText(convertIdeographicSpaceToLatinSpace( removeLeadingAndTrailingWhitespace(captionText)))); descriptionListener = new AbstractTextWatcher( - descriptionText -> uploadMediaDetails.get(position) - .setDescriptionText(descriptionText)); + descriptionText -> uploadMediaDetail.setDescriptionText(descriptionText)); captionItemEditText.addTextChangedListener(captionListener); initLanguage(position, uploadMediaDetail); diff --git a/app/src/main/res/drawable/ic_custom_map_marker.xml b/app/src/main/res/drawable/ic_custom_map_marker.xml index 1ad4c730f..3959b4aa2 100644 --- a/app/src/main/res/drawable/ic_custom_map_marker.xml +++ b/app/src/main/res/drawable/ic_custom_map_marker.xml @@ -1,3 +1,4 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_custom_map_marker_blue_bookmarked.xml b/app/src/main/res/drawable/ic_custom_map_marker_blue_bookmarked_dark.xml similarity index 98% rename from app/src/main/res/drawable/ic_custom_map_marker_blue_bookmarked.xml rename to app/src/main/res/drawable/ic_custom_map_marker_blue_bookmarked_dark.xml index 97cb7081c..0237d6049 100644 --- a/app/src/main/res/drawable/ic_custom_map_marker_blue_bookmarked.xml +++ b/app/src/main/res/drawable/ic_custom_map_marker_blue_bookmarked_dark.xml @@ -16,14 +16,14 @@ diff --git a/app/src/main/res/drawable/ic_custom_map_marker_dark.xml b/app/src/main/res/drawable/ic_custom_map_marker_dark.xml new file mode 100644 index 000000000..58d4af211 --- /dev/null +++ b/app/src/main/res/drawable/ic_custom_map_marker_dark.xml @@ -0,0 +1,23 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_custom_map_marker_green.xml b/app/src/main/res/drawable/ic_custom_map_marker_green.xml index 6c7eb95fe..8cf28626c 100644 --- a/app/src/main/res/drawable/ic_custom_map_marker_green.xml +++ b/app/src/main/res/drawable/ic_custom_map_marker_green.xml @@ -1,23 +1,24 @@ + - - - + android:width="@dimen/half_standard_height" + android:height="28dp" + android:viewportWidth="24.0" + android:viewportHeight="28.0"> + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_custom_map_marker_green_bookmarked.xml b/app/src/main/res/drawable/ic_custom_map_marker_green_bookmarked.xml index 609c96ee1..7b28ebb1a 100644 --- a/app/src/main/res/drawable/ic_custom_map_marker_green_bookmarked.xml +++ b/app/src/main/res/drawable/ic_custom_map_marker_green_bookmarked.xml @@ -1,29 +1,29 @@ + android:width="24dp" + android:height="28dp" + android:viewportWidth="24" + android:viewportHeight="28"> + android:pathData="M6.072,22.223a6.031,3.672 0,1 0,12.062 0a6.031,3.672 0,1 0,-12.062 0z" + android:strokeAlpha="0.1" + android:strokeWidth="1" + android:fillColor="#000000" + android:fillAlpha="0.1"/> + android:pathData="M11.575,11.62C10.689,11.462 9.902,10.759 9.625,9.878 9.553,9.65 9.535,9.499 9.538,9.14c0.004,-0.397 0.019,-0.492 0.13,-0.787 0.236,-0.631 0.646,-1.099 1.212,-1.382 0.386,-0.193 0.709,-0.272 1.116,-0.272 0.676,0 1.263,0.247 1.744,0.734 0.355,0.359 0.541,0.682 0.657,1.136 0.327,1.278 -0.442,2.611 -1.723,2.987 -0.282,0.083 -0.817,0.114 -1.099,0.063z" + android:strokeWidth="1" + android:fillColor="#1F7123"/> + android:pathData="M11.617,21.707C10.518,20.424 9.338,18.864 8.395,17.449 6.524,14.641 5.455,12.305 5.102,10.255 5.014,9.744 5.006,8.628 5.088,8.137 5.348,6.561 6.043,5.221 7.158,4.148 9.148,2.231 12.016,1.668 14.593,2.688c2.043,0.809 3.607,2.581 4.162,4.719 0.174,0.67 0.204,0.933 0.203,1.761 -0.001,0.81 -0.035,1.098 -0.22,1.857 -0.614,2.524 -2.571,5.977 -5.383,9.501 -0.645,0.809 -1.321,1.61 -1.358,1.61 -0.008,0 -0.179,-0.193 -0.381,-0.428zM12.617,11.603c0.783,-0.188 1.457,-0.795 1.738,-1.564 0.516,-1.415 -0.317,-2.962 -1.783,-3.312 -0.216,-0.052 -0.317,-0.059 -0.661,-0.047 -0.354,0.012 -0.441,0.025 -0.682,0.104 -0.673,0.221 -1.205,0.695 -1.506,1.344 -0.176,0.38 -0.218,0.584 -0.217,1.054 0.001,0.324 0.014,0.452 0.064,0.635 0.266,0.97 1.077,1.689 2.079,1.844 0.243,0.038 0.68,0.012 0.968,-0.057z" + android:strokeWidth="1" + android:fillColor="#1F7123" + android:strokeColor="#003b59" + android:fillAlpha="1"/> + android:pathData="M17.9025,7.0798 L14.1612,6.7552 12.7003,3.3154c-0.2628,-0.6261 -1.1595,-0.6261 -1.4223,0L9.817,6.7629 6.0835,7.0798C5.4032,7.134 5.125,7.9842 5.6429,8.4326l2.8369,2.4581 -0.8503,3.6485c-0.1546,0.6648 0.5643,1.1904 1.1518,0.8348l3.2079,-1.9325 3.2079,1.9402c0.5875,0.3556 1.3064,-0.1701 1.1518,-0.8348L15.4985,10.8907 18.3354,8.4326C18.8533,7.9842 18.5827,7.134 17.9025,7.0798Z" + android:strokeAlpha="1" + android:strokeWidth="1" + android:fillColor="#f84d4d" + android:fillAlpha="1" + android:strokeColor="#003b59"/> diff --git a/app/src/main/res/drawable/ic_custom_map_marker_green_bookmarked_dark.xml b/app/src/main/res/drawable/ic_custom_map_marker_green_bookmarked_dark.xml new file mode 100644 index 000000000..545e140c8 --- /dev/null +++ b/app/src/main/res/drawable/ic_custom_map_marker_green_bookmarked_dark.xml @@ -0,0 +1,29 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_custom_map_marker_green_dark.xml b/app/src/main/res/drawable/ic_custom_map_marker_green_dark.xml new file mode 100644 index 000000000..6c7eb95fe --- /dev/null +++ b/app/src/main/res/drawable/ic_custom_map_marker_green_dark.xml @@ -0,0 +1,23 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_feedback.xml b/app/src/main/res/layout/dialog_feedback.xml index 9817da9eb..272cd4eef 100644 --- a/app/src/main/res/layout/dialog_feedback.xml +++ b/app/src/main/res/layout/dialog_feedback.xml @@ -122,6 +122,16 @@ android:layout_margin="@dimen/dimen_6" /> + +