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