diff --git a/app/build.gradle b/app/build.gradle index 120feed2e..133d39b6e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -333,7 +333,6 @@ android { buildConfigField "String", "TEST_USERNAME", "\"" + getTestUserName() + "\"" buildConfigField "String", "TEST_PASSWORD", "\"" + getTestPassword() + "\"" buildConfigField "String", "DEPICTS_PROPERTY", "\"P180\"" - buildConfigField "String", "CREATOR_PROPERTY", "\"P170\"" dimension 'tier' } @@ -371,7 +370,6 @@ android { buildConfigField "String", "TEST_USERNAME", "\"" + getTestUserName() + "\"" buildConfigField "String", "TEST_PASSWORD", "\"" + getTestPassword() + "\"" buildConfigField "String", "DEPICTS_PROPERTY", "\"P245962\"" - buildConfigField "String", "CREATOR_PROPERTY", "\"P253075\"" dimension 'tier' } } diff --git a/app/src/main/java/fr/free/nrw/commons/Media.kt b/app/src/main/java/fr/free/nrw/commons/Media.kt index d07bc0265..1222cd8b0 100644 --- a/app/src/main/java/fr/free/nrw/commons/Media.kt +++ b/app/src/main/java/fr/free/nrw/commons/Media.kt @@ -53,7 +53,6 @@ class Media constructor( */ var author: String? = null, var user: String? = null, - var creatorName: String? = null, /** * Gets the categories the file falls under. * @return file categories as an ArrayList of Strings @@ -67,7 +66,6 @@ class Media constructor( var captions: Map = emptyMap(), var descriptions: Map = emptyMap(), var depictionIds: List = emptyList(), - var creatorIds: List = emptyList(), /** * This field was added to find non-hidden categories * Stores the mapping of category title to hidden attribute @@ -132,7 +130,6 @@ class Media constructor( * returns user * @return Author or User */ - @Deprecated("Use user for uploader username. Use attributedAuthor() for attribution. Note that the uploader may not be the creator/author.") fun getAuthorOrUser(): String? { return if (!author.isNullOrEmpty()) { author @@ -141,19 +138,6 @@ class Media constructor( } } - /** - * Returns author if it's not null or empty, otherwise - * returns creator name - * @return name of author or creator - */ - fun getAttributedAuthor(): String? { - return if (!author.isNullOrEmpty()) { - author - } else{ - creatorName - } - } - /** * Gets media display title * @return Media title diff --git a/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.kt b/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.kt index 970413283..2ff54959d 100644 --- a/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.kt +++ b/app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.kt @@ -1,7 +1,7 @@ package fr.free.nrw.commons import androidx.core.text.HtmlCompat -import fr.free.nrw.commons.media.IdAndLabels +import fr.free.nrw.commons.media.IdAndCaptions import fr.free.nrw.commons.media.MediaClient import fr.free.nrw.commons.media.PAGE_ID_PREFIX import io.reactivex.Single @@ -23,23 +23,13 @@ class MediaDataExtractor private val mediaClient: MediaClient, ) { fun fetchDepictionIdsAndLabels(media: Media) = - mediaClient + mediaClient .getEntities(media.depictionIds) .map { it .entities() .mapValues { entry -> entry.value.labels().mapValues { it.value.value() } } - }.map { it.map { (key, value) -> IdAndLabels(key, value) } } - .onErrorReturn { emptyList() } - - fun fetchCreatorIdsAndLabels(media: Media) = - mediaClient - .getEntities(media.creatorIds) - .map { - it - .entities() - .mapValues { entry -> entry.value.labels().mapValues { it.value.value() } } - }.map { it.map { (key, value) -> IdAndLabels(key, value) } } + }.map { it.map { (key, value) -> IdAndCaptions(key, value) } } .onErrorReturn { emptyList() } fun checkDeletionRequestExists(media: Media) = mediaClient.checkPageExistsUsingTitle("Commons:Deletion_requests/" + media.filename) diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.kt b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.kt index 899ef458f..32028cfd2 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.kt +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.kt @@ -8,29 +8,23 @@ import androidx.appcompat.app.AlertDialog import androidx.recyclerview.widget.RecyclerView import com.facebook.imagepipeline.request.ImageRequest import com.facebook.imagepipeline.request.ImageRequestBuilder -import fr.free.nrw.commons.Media -import fr.free.nrw.commons.utils.MediaAttributionUtil -import fr.free.nrw.commons.MediaDataExtractor import fr.free.nrw.commons.R 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 import io.reactivex.schedulers.Schedulers -import timber.log.Timber import java.io.File class ContributionViewHolder internal constructor( - parent: View, - private val callback: ContributionsListAdapter.Callback, - private val compositeDisposable: CompositeDisposable, - private val mediaClient: MediaClient, - private val mediaDataExtractor: MediaDataExtractor + private val parent: View, private val callback: ContributionsListAdapter.Callback, + private val mediaClient: MediaClient ) : RecyclerView.ViewHolder(parent) { var binding: LayoutContributionBinding = LayoutContributionBinding.bind(parent) private var position = 0 private var contribution: Contribution? = null + private val compositeDisposable = CompositeDisposable() private var isWikipediaButtonDisplayed = false private val pausingPopUp: AlertDialog var imageRequest: ImageRequest? = null @@ -60,7 +54,7 @@ an upload might take a dozen seconds. */ this.contribution = contribution this.position = position binding.contributionTitle.text = contribution.media.mostRelevantCaption - setAuthorText(contribution.media) + binding.authorView.text = contribution.media.getAuthorOrUser() //Removes flicker of loading image. binding.contributionImage.hierarchy.fadeDuration = 0 @@ -99,30 +93,6 @@ an upload might take a dozen seconds. */ checkIfMediaExistsOnWikipediaPage(contribution) } - fun updateAttribution() { - if (contribution != null) { - val media = contribution!!.media - if (!media.getAttributedAuthor().isNullOrEmpty()) { - return - } - compositeDisposable.addAll( - mediaDataExtractor.fetchCreatorIdsAndLabels(media) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe( - { idAndLabels -> - media.creatorName = MediaAttributionUtil.getCreatorName(idAndLabels) - setAuthorText(media) - }, - { t: Throwable? -> Timber.e(t) }) - ) - } - } - - private fun setAuthorText(media: Media) { - binding.authorView.text = MediaAttributionUtil.getTagLine(media, itemView.context) - } - /** * Checks if a media exists on the corresponding Wikipedia article Currently the check is made * for the device's current language Wikipedia diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListAdapter.kt b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListAdapter.kt index e5f721721..b41de1c6e 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListAdapter.kt +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListAdapter.kt @@ -4,26 +4,21 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.paging.PagedListAdapter import androidx.recyclerview.widget.DiffUtil -import fr.free.nrw.commons.MediaDataExtractor import fr.free.nrw.commons.R import fr.free.nrw.commons.media.MediaClient -import io.reactivex.disposables.CompositeDisposable /** * Represents The View Adapter for the List of Contributions */ class ContributionsListAdapter internal constructor( private val callback: Callback, - private val mediaClient: MediaClient, - private val mediaDataExtractor: MediaDataExtractor, - private val compositeDisposable: CompositeDisposable + private val mediaClient: MediaClient ) : PagedListAdapter(DIFF_CALLBACK) { /** * Initializes the view holder with contribution data */ override fun onBindViewHolder(holder: ContributionViewHolder, position: Int) { holder.init(position, getItem(position)) - holder.updateAttribution() } fun getContributionForPosition(position: Int): Contribution? { @@ -41,7 +36,7 @@ class ContributionsListAdapter internal constructor( val viewHolder = ContributionViewHolder( LayoutInflater.from(parent.context) .inflate(R.layout.layout_contribution, parent, false), - callback, compositeDisposable, mediaClient, mediaDataExtractor + callback, mediaClient ) return viewHolder } diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.kt b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.kt index 9ecb35b24..bfe1161c7 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.kt +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.kt @@ -27,7 +27,6 @@ import androidx.recyclerview.widget.RecyclerView.AdapterDataObserver import androidx.recyclerview.widget.RecyclerView.OnItemTouchListener import androidx.recyclerview.widget.SimpleItemAnimator import fr.free.nrw.commons.Media -import fr.free.nrw.commons.MediaDataExtractor import fr.free.nrw.commons.R import fr.free.nrw.commons.Utils import fr.free.nrw.commons.auth.SessionManager @@ -64,10 +63,6 @@ class ContributionsListFragment : CommonsDaggerSupportFragment(), ContributionsL @Inject var mediaClient: MediaClient? = null - @JvmField - @Inject - var mediaDataExtractor: MediaDataExtractor? = null - @JvmField @Named(NetworkingModule.NAMED_LANGUAGE_WIKI_PEDIA_WIKI_SITE) @Inject @@ -236,7 +231,7 @@ class ContributionsListFragment : CommonsDaggerSupportFragment(), ContributionsL } private fun initAdapter() { - adapter = ContributionsListAdapter(this, mediaClient!!, mediaDataExtractor!!, compositeDisposable) + adapter = ContributionsListAdapter(this, mediaClient!!) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { diff --git a/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt b/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt index 20a2fe70a..abb2dc84a 100644 --- a/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt +++ b/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt @@ -348,12 +348,12 @@ class ImageAdapter( scope.launch(ioDispatcher) { val imageSHA1 = imageLoader.getSHA1(image, defaultDispatcher) withContext(Dispatchers.Main) { - if (holder.isItemUploaded()) { - Toast.makeText(context, R.string.custom_selector_already_uploaded_image_text, Toast.LENGTH_SHORT).show() + if (holder.isItemUploaded()) { + Toast.makeText(context, R.string.custom_selector_already_uploaded_image_text, Toast.LENGTH_SHORT).show() return@withContext } - if (imageSHA1.isNotEmpty() && imageLoader.getFromUploaded(imageSHA1) != null) { + if (imageSHA1.isNotEmpty() && imageLoader.getFromUploaded(imageSHA1) != null) { holder.itemUploaded() Toast.makeText(context, R.string.custom_selector_already_uploaded_image_text, Toast.LENGTH_SHORT).show() return@withContext @@ -369,7 +369,7 @@ class ImageAdapter( selectedImages.add(image) notifyItemChanged(position, ImageSelectedOrUpdated()) - imageSelectListener.onSelectedImagesChanged(selectedImages, numberOfSelectedImagesMarkedAsNotForUpload) + imageSelectListener.onSelectedImagesChanged(selectedImages, numberOfSelectedImagesMarkedAsNotForUpload) } } } diff --git a/app/src/main/java/fr/free/nrw/commons/explore/map/ExploreMapFragment.java b/app/src/main/java/fr/free/nrw/commons/explore/map/ExploreMapFragment.java index feebd20c6..f7dafcc8d 100644 --- a/app/src/main/java/fr/free/nrw/commons/explore/map/ExploreMapFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/explore/map/ExploreMapFragment.java @@ -721,20 +721,8 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment authorUser = Html.fromHtml(authorUser, Html.FROM_HTML_MODE_LEGACY).toString(); } - String title = nearbyBaseMarker.getPlace().name; - // Remove "File:" if present at start - if (title.startsWith("File:")) { - title = title.substring(5); - } - // Remove extensions like .jpg, .jpeg, .png, .svg (case insensitive) - title = title.replaceAll("(?i)\\.(jpg|jpeg|png|svg)$", ""); - title = title.replace("_", " "); - //Truncate if too long because it doesn't fit the screen - if (title.length() > 43) { - title = title.substring(0, 40) + "…"; - } - - OverlayItem item = new OverlayItem(title, authorUser, point); + OverlayItem item = new OverlayItem(nearbyBaseMarker.getPlace().name, + authorUser, point); item.setMarker(d); items.add(item); ItemizedOverlayWithFocus overlay = new ItemizedOverlayWithFocus(items, diff --git a/app/src/main/java/fr/free/nrw/commons/explore/media/MediaConverter.kt b/app/src/main/java/fr/free/nrw/commons/explore/media/MediaConverter.kt index fe5c21a7e..0cfb270a3 100644 --- a/app/src/main/java/fr/free/nrw/commons/explore/media/MediaConverter.kt +++ b/app/src/main/java/fr/free/nrw/commons/explore/media/MediaConverter.kt @@ -18,12 +18,6 @@ import javax.inject.Inject class MediaConverter @Inject constructor() { - /** - * Creating Media object from MWQueryPage. - * - * @param page response from the API - * @return Media object - */ fun convert( page: MwQueryPage, entity: Entities.Entity, @@ -46,17 +40,24 @@ class MediaConverter metadata.prefixedLicenseUrl, getAuthor(metadata), imageInfo.getUser(), - null, MediaDataExtractorUtil.extractCategoriesFromList(metadata.categories()), metadata.latLng, entity.labels().mapValues { it.value.value() }, entity.descriptions().mapValues { it.value.value() }, entity.depictionIds(), - entity.creatorIds(), myMap, ) } + /** + * Creating Media object from MWQueryPage. + * Earlier only basic details were set for the media object but going forward, + * a full media object(with categories, descriptions, coordinates etc) can be constructed using this method + * + * @param page response from the API + * @return Media object + */ + private fun safeParseDate(dateStr: String): Date? = try { CommonsDateUtil.getMediaSimpleDateFormat().parse(dateStr) @@ -65,32 +66,24 @@ class MediaConverter } /** - * This method extracts the Commons Username from the artist HTML information. - * When the HTML is in customized formatting, it may fail to parse and return null. + * This method extracts the Commons Username from the artist HTML information * @param metadata * @return */ private fun getAuthor(metadata: ExtMetadata): String? { - val authorHtml = metadata.artist() - val anchorStartTagTerminalString = "\">" - val anchorCloseTag = "" + return try { + val authorHtml = metadata.artist() + val anchorStartTagTerminalChars = "\">" + val anchorCloseTag = "" - return if (!authorHtml.contains("<") && !authorHtml.contains(">") ) { - authorHtml.trim() - } else if (!authorHtml.contains(anchorStartTagTerminalString) || !authorHtml.endsWith(anchorCloseTag)) { - null - } else { - - val authorText = authorHtml.substring( - authorHtml.indexOf(anchorStartTagTerminalString) + - anchorStartTagTerminalString.length, + return authorHtml.substring( + authorHtml.indexOf(anchorStartTagTerminalChars) + + anchorStartTagTerminalChars + .length, authorHtml.indexOf(anchorCloseTag), ) - if (authorText.contains("<") || authorText.contains(">")) { - null - } else { - authorText - } + } catch (ex: java.lang.Exception) { + "" } } } @@ -99,10 +92,6 @@ private fun Entities.Entity.depictionIds() = this[WikidataProperties.DEPICTS]?.mapNotNull { (it.mainSnak.dataValue as? DataValue.EntityId)?.value?.id } ?: emptyList() -private fun Entities.Entity.creatorIds() = - this[WikidataProperties.CREATOR]?.mapNotNull { (it.mainSnak.dataValue as? DataValue.EntityId)?.value?.id } - ?: emptyList() - private val ExtMetadata.prefixedLicenseUrl: String get() = licenseUrl().let { diff --git a/app/src/main/java/fr/free/nrw/commons/explore/media/PageableMediaFragment.kt b/app/src/main/java/fr/free/nrw/commons/explore/media/PageableMediaFragment.kt index e19b1b056..987f4ca00 100644 --- a/app/src/main/java/fr/free/nrw/commons/explore/media/PageableMediaFragment.kt +++ b/app/src/main/java/fr/free/nrw/commons/explore/media/PageableMediaFragment.kt @@ -4,18 +4,16 @@ import android.content.Context import android.os.Bundle import android.view.View import fr.free.nrw.commons.Media -import fr.free.nrw.commons.MediaDataExtractor import fr.free.nrw.commons.R import fr.free.nrw.commons.category.CategoryImagesCallback import fr.free.nrw.commons.explore.paging.BasePagingFragment import fr.free.nrw.commons.media.MediaDetailPagerFragment.MediaDetailProvider -import javax.inject.Inject abstract class PageableMediaFragment : BasePagingFragment(), MediaDetailProvider { override val pagedListAdapter by lazy { - PagedMediaAdapter(categoryImagesCallback::onMediaClicked, mediaDataExtractor) + PagedMediaAdapter(categoryImagesCallback::onMediaClicked) } override val errorTextId: Int = R.string.error_loading_images @@ -24,9 +22,6 @@ abstract class PageableMediaFragment : lateinit var categoryImagesCallback: CategoryImagesCallback - @Inject - lateinit var mediaDataExtractor: MediaDataExtractor - override fun onAttach(context: Context) { super.onAttach(context) if (parentFragment != null) { diff --git a/app/src/main/java/fr/free/nrw/commons/explore/media/PagedMediaAdapter.kt b/app/src/main/java/fr/free/nrw/commons/explore/media/PagedMediaAdapter.kt index 521ba77c6..364b5d363 100644 --- a/app/src/main/java/fr/free/nrw/commons/explore/media/PagedMediaAdapter.kt +++ b/app/src/main/java/fr/free/nrw/commons/explore/media/PagedMediaAdapter.kt @@ -5,22 +5,13 @@ import android.view.ViewGroup import androidx.paging.PagedListAdapter import androidx.recyclerview.widget.DiffUtil import fr.free.nrw.commons.Media -import fr.free.nrw.commons.MediaDataExtractor -import fr.free.nrw.commons.utils.MediaAttributionUtil import fr.free.nrw.commons.R import fr.free.nrw.commons.databinding.LayoutCategoryImagesBinding import fr.free.nrw.commons.explore.paging.BaseViewHolder import fr.free.nrw.commons.explore.paging.inflate -import fr.free.nrw.commons.media.IdAndLabels -import io.reactivex.android.schedulers.AndroidSchedulers -import io.reactivex.disposables.CompositeDisposable -import io.reactivex.schedulers.Schedulers -import timber.log.Timber class PagedMediaAdapter( private val onImageClicked: (Int) -> Unit, - private val mediaDataExtractor: MediaDataExtractor, - private val compositeDisposable: CompositeDisposable = CompositeDisposable() ) : PagedListAdapter( object : DiffUtil.ItemCallback() { override fun areItemsTheSame( @@ -34,7 +25,6 @@ class PagedMediaAdapter( ) = oldItem.pageId == newItem.pageId }, ) { - override fun onCreateViewHolder( parent: ViewGroup, viewType: Int, @@ -47,24 +37,7 @@ class PagedMediaAdapter( holder: SearchImagesViewHolder, position: Int, ) { - val media = getItem(position) ?: return - holder.bind(media to position) - - if (!media.getAttributedAuthor().isNullOrEmpty()) { - return - } - - compositeDisposable.addAll( - mediaDataExtractor.fetchCreatorIdsAndLabels(media) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe( - { idAndLabels -> - media.creatorName = MediaAttributionUtil.getCreatorName(idAndLabels); - holder.setAuthorText(media) - }, - { t: Throwable? -> Timber.e(t) }) - ) + holder.bind(getItem(position)!! to position) } } @@ -79,10 +52,7 @@ class SearchImagesViewHolder( binding.categoryImageView.setOnClickListener { onImageClicked(item.second) } binding.categoryImageTitle.text = media.mostRelevantCaption binding.categoryImageView.setImageURI(media.thumbUrl) - setAuthorText(media) - } - - fun setAuthorText(media: Media) { - binding.categoryImageAuthor.text = MediaAttributionUtil.getTagLine(media, containerView.context) + binding.categoryImageAuthor.text = + containerView.context.getString(R.string.image_uploaded_by, media.getAuthorOrUser()) } } diff --git a/app/src/main/java/fr/free/nrw/commons/media/IdAndCaptions.kt b/app/src/main/java/fr/free/nrw/commons/media/IdAndCaptions.kt new file mode 100644 index 000000000..fe96eb8cb --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/media/IdAndCaptions.kt @@ -0,0 +1,6 @@ +package fr.free.nrw.commons.media + +data class IdAndCaptions( + val id: String, + val captions: Map, +) diff --git a/app/src/main/java/fr/free/nrw/commons/media/IdAndLabels.kt b/app/src/main/java/fr/free/nrw/commons/media/IdAndLabels.kt deleted file mode 100644 index c989ee7e3..000000000 --- a/app/src/main/java/fr/free/nrw/commons/media/IdAndLabels.kt +++ /dev/null @@ -1,18 +0,0 @@ -package fr.free.nrw.commons.media - -data class IdAndLabels( - val id: String, - val labels: Map, -) { - // if a label is available in user's locale, return it - // if not then check for english, else show any available. - fun getLocalizedLabel(locale: String): String? { - if (labels[locale] != null) { - return labels[locale] - } - if (labels["en"] != null) { - return labels["en"] - } - return labels.values.firstOrNull() ?: id - } -} \ No newline at end of file diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.kt b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.kt index 8a4d530c4..77ff1df0c 100644 --- a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.kt +++ b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.kt @@ -16,6 +16,7 @@ import android.view.KeyEvent import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.ViewTreeObserver import android.view.ViewTreeObserver.OnGlobalLayoutListener import android.widget.ArrayAdapter import android.widget.Button @@ -621,9 +622,10 @@ class MediaDetailFragment : CommonsDaggerSupportFragment(), CategoryEditHelper.C .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe( - { idAndCaptions: List -> onDepictionsLoaded(idAndCaptions) }, + { idAndCaptions: List -> onDepictionsLoaded(idAndCaptions) }, { t: Throwable? -> Timber.e(t) }) ) + // compositeDisposable.add(disposable); } private fun onDiscussionLoaded(discussion: String) { @@ -653,7 +655,7 @@ class MediaDetailFragment : CommonsDaggerSupportFragment(), CategoryEditHelper.C } } - private fun onDepictionsLoaded(idAndCaptions: List) { + private fun onDepictionsLoaded(idAndCaptions: List) { binding.depictsLayout.visibility = View.VISIBLE binding.depictionsEditButton.visibility = View.VISIBLE buildDepictionList(idAndCaptions) @@ -863,24 +865,24 @@ class MediaDetailFragment : CommonsDaggerSupportFragment(), CategoryEditHelper.C * Populates media details fragment with depiction list * @param idAndCaptions */ - private fun buildDepictionList(idAndCaptions: List) { + private fun buildDepictionList(idAndCaptions: List) { binding.mediaDetailDepictionContainer.removeAllViews() // Create a mutable list from the original list val mutableIdAndCaptions = idAndCaptions.toMutableList() if (mutableIdAndCaptions.isEmpty()) { - // Create a placeholder IdAndLabels object and add it to the list + // Create a placeholder IdAndCaptions object and add it to the list mutableIdAndCaptions.add( - IdAndLabels( + IdAndCaptions( id = media?.pageId ?: "", // Use an empty string if media?.pageId is null - labels = mapOf(Locale.getDefault().language to getString(R.string.detail_panel_cats_none)) // Create a Map with the language as the key and the message as the value + captions = mapOf(Locale.getDefault().language to getString(R.string.detail_panel_cats_none)) // Create a Map with the language as the key and the message as the value ) ) } val locale: String = Locale.getDefault().language - for (idAndCaption in mutableIdAndCaptions) { + for (idAndCaption: IdAndCaptions in mutableIdAndCaptions) { binding.mediaDetailDepictionContainer.addView( buildDepictLabel( getDepictionCaption(idAndCaption, locale), @@ -892,16 +894,16 @@ class MediaDetailFragment : CommonsDaggerSupportFragment(), CategoryEditHelper.C } - private fun getDepictionCaption(idAndCaption: IdAndLabels, locale: String): String? { + private fun getDepictionCaption(idAndCaption: IdAndCaptions, locale: String): String? { // Check if the Depiction Caption is available in user's locale // if not then check for english, else show any available. - if (idAndCaption.labels[locale] != null) { - return idAndCaption.labels[locale] + if (idAndCaption.captions[locale] != null) { + return idAndCaption.captions[locale] } - if (idAndCaption.labels["en"] != null) { - return idAndCaption.labels["en"] + if (idAndCaption.captions["en"] != null) { + return idAndCaption.captions["en"] } - return idAndCaption.labels.values.iterator().next() + return idAndCaption.captions.values.iterator().next() } private fun onMediaDetailLicenceClicked() { diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.kt b/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.kt index 7445a6526..25baf3a92 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.kt +++ b/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.kt @@ -1064,7 +1064,7 @@ class NearbyParentFragment : CommonsDaggerSupportFragment(), override fun updateListFragment(placeList: List) { adapter!!.clear() - adapter!!.items = placeList.filter{ it.name.isNotEmpty() } + adapter!!.items = placeList binding!!.bottomSheetNearby.noResultsMessage.visibility = if (placeList.isEmpty()) View.VISIBLE else View.GONE } diff --git a/app/src/main/java/fr/free/nrw/commons/utils/MediaAttributionUtil.kt b/app/src/main/java/fr/free/nrw/commons/utils/MediaAttributionUtil.kt deleted file mode 100644 index 7a66a87de..000000000 --- a/app/src/main/java/fr/free/nrw/commons/utils/MediaAttributionUtil.kt +++ /dev/null @@ -1,39 +0,0 @@ -package fr.free.nrw.commons.utils - -import android.content.Context -import android.icu.text.ListFormatter -import android.os.Build -import fr.free.nrw.commons.Media -import fr.free.nrw.commons.R -import fr.free.nrw.commons.media.IdAndLabels -import java.util.Locale - -object MediaAttributionUtil { - fun getTagLine(media: Media, context: Context): String { - val uploader = media.user - val author = media.getAttributedAuthor() - return if (author.isNullOrEmpty()) { - context.getString(R.string.image_uploaded_by, uploader) - } else if (author == uploader) { - context.getString(R.string.image_tag_line_created_and_uploaded_by, author) - } else { - context.getString( - R.string.image_tag_line_created_by_and_uploaded_by, - author, - uploader - ) - } - } - - fun getCreatorName(idAndLabels: List): String? { - val locale = Locale.getDefault() - val names = idAndLabels.map{ x -> x.getLocalizedLabel(locale.language)} - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - val formatter = ListFormatter.getInstance(locale) - return formatter.format(names) - } else { - return names.joinToString(", ") - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/fr/free/nrw/commons/utils/StringUtil.kt b/app/src/main/java/fr/free/nrw/commons/utils/StringUtil.kt index 59c6aea97..b3c58d8b2 100644 --- a/app/src/main/java/fr/free/nrw/commons/utils/StringUtil.kt +++ b/app/src/main/java/fr/free/nrw/commons/utils/StringUtil.kt @@ -1,8 +1,9 @@ package fr.free.nrw.commons.utils +import android.os.Build +import android.text.Html import android.text.Spanned import android.text.SpannedString -import androidx.core.text.HtmlCompat object StringUtil { @@ -25,6 +26,12 @@ object StringUtil { .replace("‏", "\u200F") .replace("&", "&") - return HtmlCompat.fromHtml(processedSource, HtmlCompat.FROM_HTML_MODE_LEGACY) + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + Html.fromHtml(processedSource, Html.FROM_HTML_MODE_LEGACY) + } else { + //noinspection deprecation + @Suppress("DEPRECATION") + Html.fromHtml(processedSource) + } } } diff --git a/app/src/main/java/fr/free/nrw/commons/wikidata/WikidataProperties.kt b/app/src/main/java/fr/free/nrw/commons/wikidata/WikidataProperties.kt index c4b95d0c5..5e82c3c80 100644 --- a/app/src/main/java/fr/free/nrw/commons/wikidata/WikidataProperties.kt +++ b/app/src/main/java/fr/free/nrw/commons/wikidata/WikidataProperties.kt @@ -7,7 +7,6 @@ enum class WikidataProperties( ) { IMAGE("P18"), DEPICTS(BuildConfig.DEPICTS_PROPERTY), - CREATOR(BuildConfig.CREATOR_PROPERTY), COMMONS_CATEGORY("P373"), INSTANCE_OF("P31"), MEDIA_LEGENDS("P2096"), diff --git a/app/src/main/java/fr/free/nrw/commons/wikidata/model/gallery/ExtMetadata.kt b/app/src/main/java/fr/free/nrw/commons/wikidata/model/gallery/ExtMetadata.kt index 53fc44bc9..63c018252 100644 --- a/app/src/main/java/fr/free/nrw/commons/wikidata/model/gallery/ExtMetadata.kt +++ b/app/src/main/java/fr/free/nrw/commons/wikidata/model/gallery/ExtMetadata.kt @@ -1,6 +1,7 @@ package fr.free.nrw.commons.wikidata.model.gallery import com.google.gson.annotations.SerializedName +import org.apache.commons.lang3.StringUtils class ExtMetadata { @SerializedName("DateTime") private val dateTime: Values? = null diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 9122f4767..5c9e7bec9 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -889,6 +889,4 @@ مبروك، جميع الصور الموجودة في هذا الألبوم تم تحميلها أو تم وضع علامة عليها بأنها غير قابلة للتحميل. عرض في استكشاف عرض في المناطق القريبة - تم الإنشاء والتحميل بواسطة: %1$s - تم إنشاؤه بواسطة %1$s وتم تحميله بواسطة %2$s diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 9b2fde313..a7a3da9a7 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -2,7 +2,6 @@