Merge from master and add icons to clickable fields

This commit is contained in:
Mikel 2017-08-02 21:57:13 +01:00
parent a025cc97d5
commit d314964018
5 changed files with 197 additions and 103 deletions

View file

@ -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);
}
}
}

View file

@ -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 + '\'' +
'}';
}
}

View file

@ -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);
}
}

View file

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M11,17h2v-6h-2v6zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM11,9h2L13,7h-2v2z"/>
</vector>

View file

@ -26,121 +26,111 @@
/>
<ScrollView
android:id="@+id/mediaDetailScrollView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/mediaDetailScrollView"
android:fillViewport="true"
android:background="@android:color/transparent"
android:cacheColorHint="@android:color/transparent"
>
android:fillViewport="true">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
android:orientation="vertical">
<!-- Placeholder. Height gets set at runtime based on container size; the initial value is a hack to keep
the detail info offscreen until it's placed properly. May be a better way to do this. -->
<fr.free.nrw.commons.media.MediaDetailSpacer
android:layout_width="match_parent"
android:layout_height="16dp"
android:id="@+id/mediaDetailSpacer"
/>
android:layout_width="match_parent"
android:layout_height="16dp" />
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/fragmentCategorisationBackground"
android:padding="16dp"
>
android:orientation="vertical"
android:padding="16dp">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/subBackground"
android:padding="16dp"
>
android:orientation="vertical"
android:padding="16dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@android:color/white"
android:text="@string/media_detail_title"
android:textSize="16sp"
android:textStyle="bold"
android:paddingBottom="6dp"
/>
android:text="@string/media_detail_title"
android:textColor="@android:color/white"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:id="@+id/mediaDetailTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/media_detail_media_title"
android:id="@+id/mediaDetailTitle"
android:layout_gravity="start"
android:textColor="@android:color/white"
android:background="?attr/subBackground"
android:textSize="14sp"
android:padding="12dp"
/>
android:text="@string/media_detail_media_title"
android:textColor="@android:color/white"
android:textSize="14sp" />
</LinearLayout>
<fr.free.nrw.commons.media.MediaDetailSpacer
android:layout_width="match_parent"
android:layout_height="8dp"
/>
android:layout_height="8dp" />
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/subBackground"
android:padding="16dp"
>
android:orientation="vertical"
android:padding="16dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="6dp"
android:text="@string/media_detail_description"
android:textColor="@android:color/white"
android:textSize="16sp"
android:textStyle="bold"
android:paddingBottom="6dp"
/>
android:textStyle="bold" />
<TextView
android:id="@+id/mediaDetailDesc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/media_detail_description_explanation"
android:background="?attr/subBackground"
android:id="@+id/mediaDetailDesc"
android:textColor="@android:color/white"
android:layout_gravity="start"
android:textSize="14sp"
android:background="?attr/subBackground"
android:padding="12dp"
/>
android:text="@string/media_detail_description_explanation"
android:textColor="@android:color/white"
android:textSize="14sp" />
</LinearLayout>
<fr.free.nrw.commons.media.MediaDetailSpacer
android:layout_width="match_parent"
android:layout_height="8dp"
/>
android:layout_height="8dp" />
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/subBackground"
android:padding="16dp"
>
android:orientation="vertical"
android:padding="16dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="6dp"
android:text="@string/media_detail_license"
android:textColor="@android:color/white"
android:textSize="16sp"
android:textStyle="bold"
android:paddingBottom="6dp"
/>
android:textStyle="bold" />
<TextView
android:id="@+id/mediaDetailLicense"
@ -148,106 +138,111 @@
android:layout_height="wrap_content"
android:layout_gravity="start"
android:background="?attr/subBackground"
android:foreground="?attr/selectableItemBackground"
android:drawableLeft="@drawable/ic_info_outline_white_24dp"
android:drawablePadding="6dp"
android:drawableStart="@drawable/ic_info_outline_white_24dp"
android:gravity="center_vertical"
android:padding="12dp"
android:text="@string/media_detail_license"
android:textColor="@android:color/white"
android:textSize="14sp"
android:padding="12dp"
tools:text="License link" />
</LinearLayout>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/subBackground"
android:padding="16dp"
>
android:orientation="vertical"
android:padding="16dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@android:color/white"
android:text="@string/media_detail_coordinates"
android:textSize="16sp"
android:textStyle="bold"
android:paddingBottom="6dp"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/media_detail_coordinates"
android:textColor="@android:color/white"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:id="@+id/mediaDetailCoordinates"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="start"
android:background="?attr/subBackground"
android:drawableLeft="@drawable/ic_map_white_24dp"
android:drawablePadding="6dp"
android:drawableStart="@drawable/ic_map_white_24dp"
android:foreground="?attr/selectableItemBackground"
android:gravity="center_vertical"
android:padding="12dp"
android:text="@string/media_detail_coordinates"
android:textColor="@android:color/white"
android:textSize="14sp"
android:padding="12dp"
tools:text="Coordinates link"
/>
tools:text="Coordinates link" />
</LinearLayout>
<fr.free.nrw.commons.media.MediaDetailSpacer
android:layout_width="match_parent"
android:layout_height="8dp"
/>
android:layout_height="8dp" />
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/subBackground"
android:orientation="vertical"
android:padding="16dp"
android:textStyle="bold"
>
android:textStyle="bold">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="start"
android:paddingBottom="6dp"
android:text="@string/detail_panel_cats_label"
android:textSize="16sp"
android:layout_gravity="start"
android:textColor="@android:color/white"
android:paddingBottom="6dp"
/>
android:textSize="16sp"
android:textStyle="bold" />
<LinearLayout
android:orientation="vertical"
android:id="@+id/mediaDetailCategoryContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/mediaDetailCategoryContainer"
/>
android:orientation="vertical" />
</LinearLayout>
<fr.free.nrw.commons.media.MediaDetailSpacer
android:layout_width="match_parent"
android:layout_height="8dp"
/>
android:layout_height="8dp" />
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/subBackground"
android:padding="16dp"
>
android:orientation="vertical"
android:padding="16dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="6dp"
android:text="@string/media_detail_uploaded_date"
android:textColor="@android:color/white"
android:textSize="16sp"
android:textStyle="bold"
android:paddingBottom="6dp"
/>
android:textStyle="bold" />
<TextView
android:id="@+id/mediaDetailuploadeddate"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/media_detail_uploaded_date"
android:background="?attr/subBackground"
android:id="@+id/mediaDetailuploadeddate"
android:textColor="@android:color/white"
android:layout_gravity="start"
android:textSize="14sp"
android:background="?attr/subBackground"
android:padding="12dp"
/>
android:text="@string/media_detail_uploaded_date"
android:textColor="@android:color/white"
android:textSize="14sp" />
</LinearLayout>
</LinearLayout>