mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-27 21:03:54 +01:00
Ability to show captions and descriptions in all entered languages (#4355)
* implement Ability to show captions and descriptions in all entered languages *Add Javadoc * handle Back event of fragment(mediaDetailFragment) * fix minor bugs * add internationalization * revert previous changes * fix visibility bug * resolve conflict
This commit is contained in:
parent
808f21a1f2
commit
b202f553f0
12 changed files with 308 additions and 9 deletions
|
|
@ -48,4 +48,6 @@ class MediaDataExtractor @Inject constructor(private val mediaClient: MediaClien
|
|||
)
|
||||
|
||||
}
|
||||
|
||||
fun getHtmlOfPage(title: String) = mediaClient.getPageHtml(title);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,67 @@
|
|||
package fr.free.nrw.commons.media;
|
||||
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.BaseAdapter;
|
||||
import android.widget.TextView;
|
||||
import fr.free.nrw.commons.R;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Adapter for Caption Listview
|
||||
*/
|
||||
public class CaptionListViewAdapter extends BaseAdapter {
|
||||
|
||||
List<Caption> captions;
|
||||
|
||||
public CaptionListViewAdapter(final List<Caption> captions) {
|
||||
this.captions = captions;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return size of captions list
|
||||
*/
|
||||
@Override
|
||||
public int getCount() {
|
||||
return captions.size();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Object at position i
|
||||
*/
|
||||
@Override
|
||||
public Object getItem(final int i) {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return id for current item
|
||||
*/
|
||||
@Override
|
||||
public long getItemId(final int i) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* inflate the view and bind data with UI
|
||||
*/
|
||||
@Override
|
||||
public View getView(final int i, final View view, final ViewGroup viewGroup) {
|
||||
final TextView captionLanguageTextView;
|
||||
final TextView captionTextView;
|
||||
final View captionLayout = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.caption_item, null);
|
||||
captionLanguageTextView = captionLayout.findViewById(R.id.caption_language_textview);
|
||||
captionTextView = captionLayout.findViewById(R.id.caption_text);
|
||||
if (captions.size() == 1 && captions.get(0).getValue().equals("No Caption")) {
|
||||
captionLanguageTextView.setText(captions.get(i).getLanguage());
|
||||
captionTextView.setText(captions.get(i).getValue());
|
||||
} else {
|
||||
captionLanguageTextView.setText(captions.get(i).getLanguage() + ":");
|
||||
captionTextView.setText(captions.get(i).getValue());
|
||||
}
|
||||
|
||||
return captionLayout;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -18,16 +18,20 @@ import android.os.Bundle;
|
|||
import android.text.Editable;
|
||||
import android.text.TextUtils;
|
||||
import android.text.TextWatcher;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.View.OnKeyListener;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.ViewTreeObserver;
|
||||
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
|
||||
import android.webkit.WebView;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.ListView;
|
||||
import android.widget.ProgressBar;
|
||||
import android.widget.ScrollView;
|
||||
import android.widget.SearchView;
|
||||
|
|
@ -86,6 +90,7 @@ import java.util.concurrent.TimeUnit;
|
|||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.wikipedia.language.AppLanguageLookUpTable;
|
||||
import org.wikipedia.util.DateUtil;
|
||||
import timber.log.Timber;
|
||||
|
||||
|
|
@ -140,7 +145,8 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment implements
|
|||
JsonKvStore applicationKvStore;
|
||||
|
||||
private int initialListTop = 0;
|
||||
|
||||
@BindView(R.id.description_webview)
|
||||
WebView descriptionWebView;
|
||||
@BindView(R.id.mediaDetailFrameLayout)
|
||||
FrameLayout frameLayout;
|
||||
@BindView(R.id.mediaDetailImageView)
|
||||
|
|
@ -203,6 +209,19 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment implements
|
|||
TextView existingCategories;
|
||||
@BindView(R.id.no_results_found)
|
||||
TextView noResultsFound;
|
||||
@BindView(R.id.dummy_caption_description_container)
|
||||
LinearLayout showCaptionAndDescriptionContainer;
|
||||
@BindView(R.id.show_caption_description_textview)
|
||||
TextView showCaptionDescriptionTextView;
|
||||
@BindView(R.id.caption_listview)
|
||||
ListView captionsListView;
|
||||
@BindView(R.id.caption_label)
|
||||
TextView captionLabel;
|
||||
@BindView(R.id.description_label)
|
||||
TextView descriptionLabel;
|
||||
@BindView(R.id.pb_circular)
|
||||
ProgressBar progressBar;
|
||||
String descriptionHtmlCode;
|
||||
@BindView(R.id.progressBarDeletion)
|
||||
ProgressBar progressBarDeletion;
|
||||
|
||||
|
|
@ -302,6 +321,9 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment implements
|
|||
if(applicationKvStore.getBoolean("login_skipped")){
|
||||
delete.setVisibility(GONE);
|
||||
}
|
||||
|
||||
handleBackEvent(view);
|
||||
|
||||
/**
|
||||
* Gets the height of the frame layout as soon as the view is ready and updates aspect ratio
|
||||
* of the picture.
|
||||
|
|
@ -317,14 +339,6 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment implements
|
|||
return view;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAttach(final Context context) {
|
||||
super.onAttach(context);
|
||||
if (getParentFragment() != null) {
|
||||
callback = (Callback) getParentFragment();
|
||||
}
|
||||
}
|
||||
|
||||
@OnClick(R.id.mediaDetailImageViewSpacer)
|
||||
public void launchZoomActivity(View view) {
|
||||
if (media.getImageUrl() != null) {
|
||||
|
|
@ -769,6 +783,7 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment implements
|
|||
}
|
||||
|
||||
public void displayHideCategorySearch() {
|
||||
showCaptionAndDescriptionContainer.setVisibility(GONE);
|
||||
if (dummyCategoryEditContainer.getVisibility() != VISIBLE) {
|
||||
dummyCategoryEditContainer.setVisibility(VISIBLE);
|
||||
} else {
|
||||
|
|
@ -1136,6 +1151,97 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment implements
|
|||
}
|
||||
}
|
||||
|
||||
@OnClick(R.id.show_caption_description_textview)
|
||||
void showCaptionAndDescription() {
|
||||
dummyCategoryEditContainer.setVisibility(GONE);
|
||||
if (showCaptionAndDescriptionContainer.getVisibility() == GONE) {
|
||||
showCaptionAndDescriptionContainer.setVisibility(VISIBLE);
|
||||
setUpCaptionAndDescriptionLayout();
|
||||
} else {
|
||||
showCaptionAndDescriptionContainer.setVisibility(GONE);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* setUp Caption And Description Layout
|
||||
*/
|
||||
private void setUpCaptionAndDescriptionLayout() {
|
||||
List<Caption> captions = getCaptions();
|
||||
|
||||
if (descriptionHtmlCode == null) {
|
||||
progressBar.setVisibility(VISIBLE);
|
||||
}
|
||||
|
||||
getDescription();
|
||||
CaptionListViewAdapter adapter = new CaptionListViewAdapter(captions);
|
||||
captionsListView.setAdapter(adapter);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate the caption with language
|
||||
*/
|
||||
private List<Caption> getCaptions() {
|
||||
List<Caption> captionList = new ArrayList<>();
|
||||
Map<String, String> captions = media.getCaptions();
|
||||
AppLanguageLookUpTable appLanguageLookUpTable = new AppLanguageLookUpTable(getContext());
|
||||
for (Map.Entry<String, String> map : captions.entrySet()) {
|
||||
String language = appLanguageLookUpTable.getLocalizedName(map.getKey());
|
||||
String languageCaption = map.getValue();
|
||||
captionList.add(new Caption(language, languageCaption));
|
||||
}
|
||||
|
||||
if (captionList.size() == 0) {
|
||||
captionList.add(new Caption("", "No Caption"));
|
||||
}
|
||||
return captionList;
|
||||
}
|
||||
|
||||
private void getDescription() {
|
||||
compositeDisposable.add(mediaDataExtractor.getHtmlOfPage(media.getFilename())
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(this::extractDescription, Timber::e));
|
||||
}
|
||||
|
||||
/**
|
||||
* extract the description from html of imagepage
|
||||
*/
|
||||
private void extractDescription(String s) {
|
||||
String descriptionClassName = "<td class=\"description\">";
|
||||
int start = s.indexOf(descriptionClassName) + descriptionClassName.length();
|
||||
int end = s.indexOf("</td>", start);
|
||||
descriptionHtmlCode = "";
|
||||
for (int i = start; i < end; i++) {
|
||||
descriptionHtmlCode = descriptionHtmlCode + s.toCharArray()[i];
|
||||
}
|
||||
|
||||
descriptionWebView
|
||||
.loadDataWithBaseURL(null, descriptionHtmlCode, "text/html", "utf-8", null);
|
||||
progressBar.setVisibility(GONE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle back event when fragment when showCaptionAndDescriptionContainer is visible
|
||||
*/
|
||||
private void handleBackEvent(View view) {
|
||||
view.setFocusableInTouchMode(true);
|
||||
view.requestFocus();
|
||||
view.setOnKeyListener(new OnKeyListener() {
|
||||
@Override
|
||||
public boolean onKey(View view, int keycode, KeyEvent keyEvent) {
|
||||
if (keycode == KeyEvent.KEYCODE_BACK) {
|
||||
if (showCaptionAndDescriptionContainer.getVisibility() == VISIBLE) {
|
||||
showCaptionAndDescriptionContainer.setVisibility(GONE);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
public interface Callback {
|
||||
void nominatingForDeletion(int index);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ package fr.free.nrw.commons.media;
|
|||
import io.reactivex.Observable;
|
||||
import io.reactivex.Single;
|
||||
import org.wikipedia.wikidata.Entities;
|
||||
import retrofit2.Call;
|
||||
import retrofit2.http.GET;
|
||||
import retrofit2.http.Query;
|
||||
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ package fr.free.nrw.commons.media;
|
|||
import io.reactivex.Single;
|
||||
import java.util.Map;
|
||||
import org.wikipedia.dataclient.mwapi.MwQueryResponse;
|
||||
import retrofit2.Call;
|
||||
import retrofit2.http.GET;
|
||||
import retrofit2.http.Query;
|
||||
import retrofit2.http.QueryMap;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue