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..f2461fcf0 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
@@ -30,6 +30,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.ui.widget.CompatTextView;
import timber.log.Timber;
public class MediaDetailFragment extends Fragment {
@@ -211,22 +212,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 +247,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
@@ -271,7 +283,7 @@ public class MediaDetailFragment extends Fragment {
private View buildCatLabel(final String catName) {
final View item = getLayoutInflater(null).inflate(R.layout.detail_category_item, null, false);
- final TextView textView = (TextView)item.findViewById(R.id.mediaDetailCategoryItemText);
+ final CompatTextView textView = (CompatTextView)item.findViewById(R.id.mediaDetailCategoryItemText);
textView.setText(catName);
if (categoriesLoaded && categoriesPresent) {
@@ -342,4 +354,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/ui/widget/CompatTextView.java b/app/src/main/java/fr/free/nrw/commons/ui/widget/CompatTextView.java
new file mode 100644
index 000000000..2508877ed
--- /dev/null
+++ b/app/src/main/java/fr/free/nrw/commons/ui/widget/CompatTextView.java
@@ -0,0 +1,73 @@
+package fr.free.nrw.commons.ui.widget;
+
+/**
+ * Created by mikel on 07/08/2017.
+ */
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.drawable.Drawable;
+import android.support.annotation.Nullable;
+import android.support.v4.view.ViewCompat;
+import android.support.v7.widget.AppCompatDrawableManager;
+import android.support.v7.widget.AppCompatTextView;
+import android.util.AttributeSet;
+
+import fr.free.nrw.commons.R;
+import fr.free.nrw.commons.utils.UiUtils;
+
+public class CompatTextView extends AppCompatTextView {
+ public CompatTextView(Context context) {
+ super(context);
+ init(null);
+ }
+
+ public CompatTextView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init(attrs);
+ }
+
+ public CompatTextView(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ init(attrs);
+ }
+
+ private void init(@Nullable AttributeSet attrs) {
+ if (attrs != null) {
+ Context context = getContext();
+ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CompatTextView);
+
+ // Obtain DrawableManager used to pull Drawables safely, and check if we're in RTL
+ AppCompatDrawableManager dm = AppCompatDrawableManager.get();
+ boolean rtl = ViewCompat.getLayoutDirection(this) == ViewCompat.LAYOUT_DIRECTION_RTL;
+
+ // Grab the compat drawable padding from the XML
+ float drawablePadding = a.getDimension(R.styleable.CompatTextView_drawablePadding, 0);
+
+ // Grab the compat drawable resources from the XML
+ int startDrawableRes = a.getResourceId(R.styleable.CompatTextView_drawableStart, 0);
+ int topDrawableRes = a.getResourceId(R.styleable.CompatTextView_drawableTop, 0);
+ int endDrawableRes = a.getResourceId(R.styleable.CompatTextView_drawableEnd, 0);
+ int bottomDrawableRes = a.getResourceId(R.styleable.CompatTextView_drawableBottom, 0);
+
+ // Load the used drawables, fall back to whatever was set in an "android:"
+ Drawable[] currentDrawables = getCompoundDrawables();
+ Drawable left = startDrawableRes != 0
+ ? dm.getDrawable(context, startDrawableRes) : currentDrawables[0];
+ Drawable right = endDrawableRes != 0
+ ? dm.getDrawable(context, endDrawableRes) : currentDrawables[1];
+ Drawable top = topDrawableRes != 0
+ ? dm.getDrawable(context, topDrawableRes) : currentDrawables[2];
+ Drawable bottom = bottomDrawableRes != 0
+ ? dm.getDrawable(context, bottomDrawableRes) : currentDrawables[3];
+
+ // Account for RTL and apply the compound Drawables
+ Drawable start = rtl ? right : left;
+ Drawable end = rtl ? left : right;
+ setCompoundDrawablesWithIntrinsicBounds(start, top, end, bottom);
+ setCompoundDrawablePadding((int) UiUtils.convertDpToPixel(drawablePadding, getContext()));
+
+ a.recycle();
+ }
+ }
+}
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..e038ec097 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,10 @@
package fr.free.nrw.commons.utils;
+import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.support.graphics.drawable.VectorDrawableCompat;
+import android.util.DisplayMetrics;
public class UiUtils {
@@ -19,4 +21,26 @@ public class UiUtils {
vectorDrawable.draw(canvas);
return bitmap;
}
+
+ /**
+ * Converts dp unit to equivalent pixels.
+ * @param dp density independent pixels
+ * @param context Context to access display metrics
+ * @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 Context to access display metrics
+ * @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/detail_category_item.xml b/app/src/main/res/layout/detail_category_item.xml
index 3b74af4d4..89197db5d 100644
--- a/app/src/main/res/layout/detail_category_item.xml
+++ b/app/src/main/res/layout/detail_category_item.xml
@@ -1,20 +1,24 @@
-
+ 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">
+
-
+
+
+ app:drawablePadding="6dp"
+ app:drawableStart="@drawable/ic_map_white_24dp"
+ 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" />
diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml
index e56bddc85..22da8c207 100644
--- a/app/src/main/res/values/attrs.xml
+++ b/app/src/main/res/values/attrs.xml
@@ -13,4 +13,12 @@
+
+
+
+
+
+
+
+
\ No newline at end of file