From d3149640186d989b81681c7a3e164150ecaee8ab Mon Sep 17 00:00:00 2001 From: Mikel Date: Wed, 2 Aug 2017 21:57:13 +0100 Subject: [PATCH] Merge from master and add icons to clickable fields --- .../commons/media/MediaDetailFragment.java | 79 ++++++-- .../free/nrw/commons/mwapi/UploadResult.java | 11 ++ .../fr/free/nrw/commons/utils/UiUtils.java | 32 ++++ .../drawable/ic_info_outline_white_24dp.xml | 9 + .../main/res/layout/fragment_media_detail.xml | 169 +++++++++--------- 5 files changed, 197 insertions(+), 103 deletions(-) create mode 100644 app/src/main/res/drawable/ic_info_outline_white_24dp.xml diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java index d739e9040..0837f905b 100644 --- a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java @@ -7,7 +7,9 @@ import android.os.AsyncTask; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; +import android.support.v7.content.res.AppCompatResources; import android.util.TypedValue; +import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -30,6 +32,7 @@ import fr.free.nrw.commons.MediaWikiImageView; import fr.free.nrw.commons.PageTitle; import fr.free.nrw.commons.R; import fr.free.nrw.commons.location.LatLng; +import fr.free.nrw.commons.utils.UiUtils; import timber.log.Timber; public class MediaDetailFragment extends Fragment { @@ -211,22 +214,8 @@ public class MediaDetailFragment extends Fragment { if (success) { extractor.fill(media); - // Set text of desc, license, and categories - desc.setText(prettyDescription(media)); - license.setText(prettyLicense(media)); - coordinates.setText(prettyCoordinates(media)); - uploadedDate.setText(prettyUploadedDate(media)); - - categoryNames.clear(); - categoryNames.addAll(media.getCategories()); - - categoriesLoaded = true; - categoriesPresent = (categoryNames.size() > 0); - if (!categoriesPresent) { - // Stick in a filler element. - categoryNames.add(getString(R.string.detail_panel_cats_none)); - } - rebuildCatList(); + setTextFields(media); + setOnClickListeners(media); } else { Timber.d("Failed to load photo details."); } @@ -260,6 +249,31 @@ public class MediaDetailFragment extends Fragment { super.onDestroyView(); } + private void setTextFields(Media media) { + desc.setText(prettyDescription(media)); + license.setText(prettyLicense(media)); + coordinates.setText(prettyCoordinates(media)); + uploadedDate.setText(prettyUploadedDate(media)); + + categoryNames.clear(); + categoryNames.addAll(media.getCategories()); + + categoriesLoaded = true; + categoriesPresent = (categoryNames.size() > 0); + if (!categoriesPresent) { + // Stick in a filler element. + categoryNames.add(getString(R.string.detail_panel_cats_none)); + } + rebuildCatList(); + } + + private void setOnClickListeners(final Media media) { + license.setOnClickListener(v -> openWebBrowser(licenseLink(media))); + if (media.getCoordinates() != null) { + coordinates.setOnClickListener(v -> openMap(media.getCoordinates())); + } + } + private void rebuildCatList() { categoryContainer.removeAllViews(); // @fixme add the category items @@ -275,6 +289,9 @@ public class MediaDetailFragment extends Fragment { textView.setText(catName); if (categoriesLoaded && categoriesPresent) { + textView.setCompoundDrawablesWithIntrinsicBounds(AppCompatResources.getDrawable(getContext(), R.drawable.ic_info_outline_white_24dp), null, null, null); + textView.setCompoundDrawablePadding((int) UiUtils.convertDpToPixel(6, getContext())); + textView.setGravity(Gravity.CENTER_VERTICAL); textView.setOnClickListener(view -> { String selectedCategoryTitle = "Category:" + catName; Intent viewIntent = new Intent(); @@ -342,4 +359,34 @@ public class MediaDetailFragment extends Fragment { } return media.getCoordinates().getPrettyCoordinateString(); } + + + private @Nullable String licenseLink(Media media) { + String licenseKey = media.getLicense(); + if (licenseKey == null || licenseKey.equals("")) { + return null; + } + License licenseObj = licenseList.get(licenseKey); + if (licenseObj == null) { + return null; + } else { + return licenseObj.getUrl(Locale.getDefault().getLanguage()); + } + } + + private void openWebBrowser(String url) { + Intent browser = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); + startActivity(browser); + } + + private void openMap(LatLng coordinates) { + //Open map app at given position + Uri gmmIntentUri = Uri.parse( + "geo:0,0?q=" + coordinates.getLatitude() + "," + coordinates.getLatitude()); + Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); + + if (mapIntent.resolveActivity(getActivity().getPackageManager()) != null) { + startActivity(mapIntent); + } + } } diff --git a/app/src/main/java/fr/free/nrw/commons/mwapi/UploadResult.java b/app/src/main/java/fr/free/nrw/commons/mwapi/UploadResult.java index 34d050b2c..8a53e4b8b 100644 --- a/app/src/main/java/fr/free/nrw/commons/mwapi/UploadResult.java +++ b/app/src/main/java/fr/free/nrw/commons/mwapi/UploadResult.java @@ -40,4 +40,15 @@ public class UploadResult { public String getResultStatus() { return resultStatus; } + + @Override + public String toString() { + return "UploadResult{" + + "errorCode='" + errorCode + '\'' + + ", resultStatus='" + resultStatus + '\'' + + ", dateUploaded=" + dateUploaded + + ", imageUrl='" + imageUrl + '\'' + + ", canonicalFilename='" + canonicalFilename + '\'' + + '}'; + } } diff --git a/app/src/main/java/fr/free/nrw/commons/utils/UiUtils.java b/app/src/main/java/fr/free/nrw/commons/utils/UiUtils.java index b2c073850..3d3dcafff 100644 --- a/app/src/main/java/fr/free/nrw/commons/utils/UiUtils.java +++ b/app/src/main/java/fr/free/nrw/commons/utils/UiUtils.java @@ -1,8 +1,16 @@ package fr.free.nrw.commons.utils; +import android.content.Context; +import android.content.res.Resources; +import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.Canvas; +import android.graphics.drawable.Drawable; import android.support.graphics.drawable.VectorDrawableCompat; +import android.support.v7.content.res.AppCompatResources; +import android.util.DisplayMetrics; + +import fr.free.nrw.commons.R; public class UiUtils { @@ -19,4 +27,28 @@ public class UiUtils { vectorDrawable.draw(canvas); return bitmap; } + + /** + * Converts dp unit to equivalent pixels. + * + * @param dp density independent pixels + * @param context + * @return px equivalent to dp value + */ + public static float convertDpToPixel(float dp, Context context){ + DisplayMetrics metrics = context.getResources().getDisplayMetrics(); + return dp * ((float)metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT); + } + + /** + * Converts device specific pixels to dp. + * + * @param px pixels + * @param context + * @return dp equivalent to px value + */ + public static float convertPixelsToDp(float px, Context context){ + DisplayMetrics metrics = context.getResources().getDisplayMetrics(); + return px / ((float)metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT); + } } diff --git a/app/src/main/res/drawable/ic_info_outline_white_24dp.xml b/app/src/main/res/drawable/ic_info_outline_white_24dp.xml new file mode 100644 index 000000000..9567ecd77 --- /dev/null +++ b/app/src/main/res/drawable/ic_info_outline_white_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/fragment_media_detail.xml b/app/src/main/res/layout/fragment_media_detail.xml index 333cfba25..5bdcea2d9 100644 --- a/app/src/main/res/layout/fragment_media_detail.xml +++ b/app/src/main/res/layout/fragment_media_detail.xml @@ -26,121 +26,111 @@ /> + android:fillViewport="true"> + android:orientation="vertical"> + android:layout_width="match_parent" + android:layout_height="16dp" /> + android:orientation="vertical" + android:padding="16dp"> + android:orientation="vertical" + android:padding="16dp"> + + android:text="@string/media_detail_title" + android:textColor="@android:color/white" + android:textSize="16sp" + android:textStyle="bold" /> + + android:text="@string/media_detail_media_title" + android:textColor="@android:color/white" + android:textSize="14sp" /> + android:layout_height="8dp" /> + android:orientation="vertical" + android:padding="16dp"> + + android:textStyle="bold" /> + + android:text="@string/media_detail_description_explanation" + android:textColor="@android:color/white" + android:textSize="14sp" /> + android:layout_height="8dp" /> + android:orientation="vertical" + android:padding="16dp"> + android:textStyle="bold" /> + android:orientation="vertical" + android:padding="16dp"> + - + + + tools:text="Coordinates link" /> + android:layout_height="8dp" /> + android:textStyle="bold"> + + android:textSize="16sp" + android:textStyle="bold" /> + + android:orientation="vertical" /> + android:layout_height="8dp" /> + android:orientation="vertical" + android:padding="16dp"> + + android:textStyle="bold" /> + + android:text="@string/media_detail_uploaded_date" + android:textColor="@android:color/white" + android:textSize="14sp" />