Remove dependency on old image-loading library, and remote a lot of code.

This commit is contained in:
Dmitry Brant 2017-05-19 16:24:04 +02:00
parent 85b15cd1c1
commit 9469bf29e4
11 changed files with 48 additions and 226 deletions

View file

@ -6,7 +6,6 @@ dependencies {
compile 'fr.avianey.com.viewpagerindicator:library:2.4.1.1@aar' compile 'fr.avianey.com.viewpagerindicator:library:2.4.1.1@aar'
compile 'in.yuvi:http.fluent:1.3' compile 'in.yuvi:http.fluent:1.3'
compile 'com.android.volley:volley:1.0.0' compile 'com.android.volley:volley:1.0.0'
compile 'com.nostra13.universalimageloader:universal-image-loader:1.8.4'
compile 'ch.acra:acra:4.7.0' compile 'ch.acra:acra:4.7.0'
compile 'org.mediawiki:api:1.3' compile 'org.mediawiki:api:1.3'
compile 'commons-codec:commons-codec:1.10' compile 'commons-codec:commons-codec:1.10'

View file

@ -12,16 +12,8 @@ import android.os.Build;
import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.BasicNetwork;
import com.android.volley.toolbox.DiskBasedCache;
import com.android.volley.toolbox.HurlStack;
import com.facebook.drawee.backends.pipeline.Fresco; import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.stetho.Stetho; import com.facebook.stetho.Stetho;
import com.nostra13.universalimageloader.cache.disc.impl.TotalSizeLimitedDiscCache;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.utils.StorageUtils;
import fr.free.nrw.commons.caching.CacheController; import fr.free.nrw.commons.caching.CacheController;
import fr.free.nrw.commons.category.Category; import fr.free.nrw.commons.category.Category;
@ -166,11 +158,6 @@ public class CommonsApplication extends Application {
// Fire progress callbacks for every 3% of uploaded content // Fire progress callbacks for every 3% of uploaded content
System.setProperty("in.yuvi.http.fluent.PROGRESS_TRIGGER_THRESHOLD", "3.0"); System.setProperty("in.yuvi.http.fluent.PROGRESS_TRIGGER_THRESHOLD", "3.0");
ImageLoaderConfiguration imageLoaderConfiguration = new ImageLoaderConfiguration.Builder(this)
.discCache(new TotalSizeLimitedDiscCache(StorageUtils.getCacheDirectory(this), 128 * 1024 * 1024))
.build();
ImageLoader.getInstance().init(imageLoaderConfiguration);
Fresco.initialize(this); Fresco.initialize(this);
// Initialize EventLogging // Initialize EventLogging
@ -178,9 +165,6 @@ public class CommonsApplication extends Application {
//For caching area -> categories //For caching area -> categories
cacheData = new CacheController(); cacheData = new CacheController();
DiskBasedCache cache = new DiskBasedCache(getCacheDir(), 16 * 1024 * 1024);
new RequestQueue(cache, new BasicNetwork(new HurlStack())).start();
} }
/** /**

View file

@ -116,10 +116,6 @@ public class Media implements Parcelable {
this.creator = creator; this.creator = creator;
} }
public String getThumbnailUrl(int width) {
return Utils.makeThumbUrl(getImageUrl(), getFilename(), width);
}
public int getWidth() { public int getWidth() {
return width; return width;
} }

View file

@ -2,13 +2,8 @@ package fr.free.nrw.commons;
import android.content.Context; import android.content.Context;
import android.net.Uri; import android.net.Uri;
import android.os.Build;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
import fr.free.nrw.commons.settings.Prefs; import fr.free.nrw.commons.settings.Prefs;
import timber.log.Timber; import timber.log.Timber;
@ -142,26 +137,6 @@ public class Utils {
return outputStream.toString(); return outputStream.toString();
} }
private static DisplayImageOptions.Builder defaultImageOptionsBuilder;
public static DisplayImageOptions.Builder getGenericDisplayOptions() {
if (defaultImageOptionsBuilder == null) {
defaultImageOptionsBuilder = new DisplayImageOptions.Builder().cacheInMemory()
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
// List views flicker badly during data updates on Android 2.3; we
// haven't quite figured out why but cells seem to be rearranged oddly.
// Disable the fade-in on 2.3 to reduce the effect.
defaultImageOptionsBuilder = defaultImageOptionsBuilder
.displayer(new FadeInBitmapDisplayer(300));
}
defaultImageOptionsBuilder = defaultImageOptionsBuilder
.cacheInMemory()
.resetViewBeforeLoading();
}
return defaultImageOptionsBuilder;
}
private static final URLCodec urlCodec = new URLCodec(); private static final URLCodec urlCodec = new URLCodec();
public static String urlEncode(String url) { public static String urlEncode(String url) {
@ -181,21 +156,6 @@ public class Utils {
return count; return count;
} }
public static String makeThumbUrl(String imageUrl, String filename, int width) {
// Ugly Hack!
// Update: OH DEAR GOD WHAT A HORRIBLE HACK I AM SO SORRY
if (imageUrl.endsWith("webm")) {
return imageUrl.replaceFirst("test/", "test/thumb/").replace("commons/", "commons/thumb/") + "/" + width + "px--" + filename.replaceAll("File:", "").replaceAll(" ", "_") + ".jpg";
} else {
String thumbUrl = imageUrl.replaceFirst("test/", "test/thumb/").replace("commons/", "commons/thumb/") + "/" + width + "px-" + filename.replaceAll("File:", "").replaceAll(" ", "_");
if (thumbUrl.endsWith("jpg") || thumbUrl.endsWith("png") || thumbUrl.endsWith("jpeg")) {
return thumbUrl;
} else {
return thumbUrl + ".png";
}
}
}
public static String capitalize(String string) { public static String capitalize(String string) {
return string.substring(0, 1).toUpperCase(Locale.getDefault()) + string.substring(1); return string.substring(0, 1).toUpperCase(Locale.getDefault()) + string.substring(1);
} }

View file

@ -14,8 +14,6 @@ class ContributionViewHolder {
final TextView seqNumView; final TextView seqNumView;
final ProgressBar progressView; final ProgressBar progressView;
String url;
ContributionViewHolder(View parent) { ContributionViewHolder(View parent) {
imageView = (MediaWikiImageView) parent.findViewById(R.id.contributionImage); imageView = (MediaWikiImageView) parent.findViewById(R.id.contributionImage);
titleView = (TextView)parent.findViewById(R.id.contributionTitle); titleView = (TextView)parent.findViewById(R.id.contributionTitle);

View file

@ -3,25 +3,13 @@ package fr.free.nrw.commons.contributions;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.database.Cursor; import android.database.Cursor;
import android.graphics.Bitmap;
import android.support.v4.widget.CursorAdapter; import android.support.v4.widget.CursorAdapter;
import android.text.TextUtils;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.assist.SimpleImageLoadingListener;
import fr.free.nrw.commons.MediaWikiImageView;
import fr.free.nrw.commons.R; import fr.free.nrw.commons.R;
import fr.free.nrw.commons.Utils;
class ContributionsListAdapter extends CursorAdapter { class ContributionsListAdapter extends CursorAdapter {
private DisplayImageOptions contributionDisplayOptions = Utils.getGenericDisplayOptions().build();
private Activity activity; private Activity activity;
public ContributionsListAdapter(Activity activity, Cursor c, int flags) { public ContributionsListAdapter(Activity activity, Cursor c, int flags) {
@ -42,36 +30,7 @@ class ContributionsListAdapter extends CursorAdapter {
final ContributionViewHolder views = (ContributionViewHolder)view.getTag(); final ContributionViewHolder views = (ContributionViewHolder)view.getTag();
final Contribution contribution = Contribution.fromCursor(cursor); final Contribution contribution = Contribution.fromCursor(cursor);
String actualUrl = (contribution.getLocalUri() != null && !TextUtils.isEmpty(contribution.getLocalUri().toString())) ? contribution.getLocalUri().toString() : contribution.getThumbnailUrl(640); views.imageView.setMedia(contribution);
if(views.url == null || !views.url.equals(actualUrl)) {
if(actualUrl.startsWith("http")) {
MediaWikiImageView mwImageView = views.imageView;
mwImageView.setMedia(contribution);
// FIXME: For transparent images
} else {
ImageLoader.getInstance().displayImage(actualUrl, views.imageView, contributionDisplayOptions, new SimpleImageLoadingListener() {
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
if(loadedImage.hasAlpha()) {
views.imageView.setBackgroundResource(android.R.color.white);
}
views.seqNumView.setVisibility(View.GONE);
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
super.onLoadingFailed(imageUri, view, failReason);
MediaWikiImageView mwImageView = views.imageView;
mwImageView.setMedia(contribution);
}
});
}
views.url = actualUrl;
}
views.titleView.setText(contribution.getDisplayTitle()); views.titleView.setText(contribution.getDisplayTitle());
views.seqNumView.setText(String.valueOf(cursor.getPosition() + 1)); views.seqNumView.setText(String.valueOf(cursor.getPosition() + 1));

View file

@ -2,7 +2,6 @@ package fr.free.nrw.commons.media;
import android.content.Intent; import android.content.Intent;
import android.database.DataSetObserver; import android.database.DataSetObserver;
import android.graphics.Bitmap;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.os.Bundle; import android.os.Bundle;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
@ -17,10 +16,6 @@ import android.widget.ProgressBar;
import android.widget.ScrollView; import android.widget.ScrollView;
import android.widget.TextView; import android.widget.TextView;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.assist.ImageLoadingListener;
import java.io.IOException; import java.io.IOException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
@ -38,14 +33,9 @@ import timber.log.Timber;
public class MediaDetailFragment extends Fragment { public class MediaDetailFragment extends Fragment {
private boolean editable; private boolean editable;
private DisplayImageOptions displayOptions;
private MediaDetailPagerFragment.MediaDetailProvider detailProvider; private MediaDetailPagerFragment.MediaDetailProvider detailProvider;
private int index; private int index;
public static MediaDetailFragment forMedia(int index) {
return forMedia(index, false);
}
public static MediaDetailFragment forMedia(int index, boolean editable) { public static MediaDetailFragment forMedia(int index, boolean editable) {
MediaDetailFragment mf = new MediaDetailFragment(); MediaDetailFragment mf = new MediaDetailFragment();
@ -188,93 +178,44 @@ public class MediaDetailFragment extends Fragment {
private void displayMediaDetails(final Media media) { private void displayMediaDetails(final Media media) {
//Always load image from Internet to allow viewing the desc, license, and cats //Always load image from Internet to allow viewing the desc, license, and cats
String actualUrl = media.getThumbnailUrl(640); MediaWikiImageView mwImage = (MediaWikiImageView) image;
if(actualUrl.startsWith("http")) { mwImage.setMedia(media);
Timber.d("Actual URL starts with http and is: %s", actualUrl);
MediaWikiImageView mwImage = (MediaWikiImageView)image; // FIXME: For transparent images
mwImage.setMedia(media); // FIXME: keep the spinner going while we load data
// FIXME: cache this data
// Load image metadata: desc, license, categories
detailFetchTask = new AsyncTask<Void, Void, Boolean>() {
private MediaDataExtractor extractor;
// FIXME: For transparent images @Override
// FIXME: keep the spinner going while we load data protected void onPreExecute() {
// FIXME: cache this data extractor = new MediaDataExtractor(media.getFilename(), licenseList);
// Load image metadata: desc, license, categories }
detailFetchTask = new AsyncTask<Void, Void, Boolean>() {
private MediaDataExtractor extractor;
@Override @Override
protected void onPreExecute() { protected Boolean doInBackground(Void... voids) {
extractor = new MediaDataExtractor(media.getFilename(), licenseList); try {
extractor.fetch();
return Boolean.TRUE;
} catch (IOException e) {
e.printStackTrace();
} }
return Boolean.FALSE;
}
@Override @Override
protected Boolean doInBackground(Void... voids) { protected void onPostExecute(Boolean success) {
try { detailFetchTask = null;
extractor.fetch();
return Boolean.TRUE;
} catch (IOException e) {
e.printStackTrace();
}
return Boolean.FALSE;
}
@Override if (success) {
protected void onPostExecute(Boolean success) { extractor.fill(media);
detailFetchTask = null;
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();
} else {
Timber.d("Failed to load photo details.");
}
}
};
detailFetchTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
//This should not usually happen, image along with associated details should always be loaded from Internet, but keeping this for now for backup.
//Even if image is loaded from device storage, it will display, albeit with empty desc and cat.
Timber.d("Actual URL does not start with http and is: %s", actualUrl);
com.nostra13.universalimageloader.core.ImageLoader.getInstance().displayImage(actualUrl, image, displayOptions, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String s, View view) {
loadingProgress.setVisibility(View.VISIBLE);
}
@Override
public void onLoadingFailed(String s, View view, FailReason failReason) {
loadingProgress.setVisibility(View.GONE);
loadingFailed.setVisibility(View.VISIBLE);
}
@Override
public void onLoadingComplete(String s, View view, Bitmap bitmap) {
loadingProgress.setVisibility(View.GONE);
loadingFailed.setVisibility(View.GONE);
image.setVisibility(View.VISIBLE);
if(bitmap.hasAlpha()) {
image.setBackgroundResource(android.R.color.white);
}
// Set text of desc, license, and categories // Set text of desc, license, and categories
desc.setText(prettyDescription(media)); desc.setText(prettyDescription(media));
license.setText(prettyLicense(media)); license.setText(prettyLicense(media));
coordinates.setText(prettyCoordinates(media));
uploadedDate.setText(prettyUploadedDate(media));
categoryNames.clear(); categoryNames.clear();
categoryNames.addAll(media.getCategories()); categoryNames.addAll(media.getCategories());
@ -286,27 +227,18 @@ public class MediaDetailFragment extends Fragment {
categoryNames.add(getString(R.string.detail_panel_cats_none)); categoryNames.add(getString(R.string.detail_panel_cats_none));
} }
rebuildCatList(); rebuildCatList();
} else {
Timber.d("Failed to load photo details.");
} }
}
@Override };
public void onLoadingCancelled(String s, View view) { detailFetchTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
Timber.e("Image loading cancelled. But why?");
}
});
}
title.setText(media.getDisplayTitle()); title.setText(media.getDisplayTitle());
desc.setText(""); // fill in from network... desc.setText(""); // fill in from network...
license.setText(""); // fill in from network... license.setText(""); // fill in from network...
} }
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
displayOptions = Utils.getGenericDisplayOptions().build();
}
@Override @Override
public void onDestroyView() { public void onDestroyView() {
if (detailFetchTask != null) { if (detailFetchTask != null) {

View file

@ -21,15 +21,11 @@ import android.widget.BaseAdapter;
import android.widget.EditText; import android.widget.EditText;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.GridView; import android.widget.GridView;
import android.widget.ImageView;
import android.widget.RelativeLayout; import android.widget.RelativeLayout;
import android.widget.TextView; import android.widget.TextView;
import com.nostra13.universalimageloader.core.DisplayImageOptions; import fr.free.nrw.commons.MediaWikiImageView;
import com.nostra13.universalimageloader.core.ImageLoader;
import fr.free.nrw.commons.R; import fr.free.nrw.commons.R;
import fr.free.nrw.commons.Utils;
import fr.free.nrw.commons.contributions.Contribution; import fr.free.nrw.commons.contributions.Contribution;
import fr.free.nrw.commons.media.MediaDetailPagerFragment; import fr.free.nrw.commons.media.MediaDetailPagerFragment;
@ -48,14 +44,12 @@ public class MultipleUploadListFragment extends Fragment {
private MediaDetailPagerFragment.MediaDetailProvider detailProvider; private MediaDetailPagerFragment.MediaDetailProvider detailProvider;
private OnMultipleUploadInitiatedHandler multipleUploadInitiatedHandler; private OnMultipleUploadInitiatedHandler multipleUploadInitiatedHandler;
private DisplayImageOptions uploadDisplayOptions;
private boolean imageOnlyMode; private boolean imageOnlyMode;
private static class UploadHolderView { private static class UploadHolderView {
Uri imageUri; Uri imageUri;
ImageView image; MediaWikiImageView image;
TextView title; TextView title;
RelativeLayout overlay; RelativeLayout overlay;
@ -85,7 +79,7 @@ public class MultipleUploadListFragment extends Fragment {
if(view == null) { if(view == null) {
view = getLayoutInflater(null).inflate(R.layout.layout_upload_item, null); view = getLayoutInflater(null).inflate(R.layout.layout_upload_item, null);
holder = new UploadHolderView(); holder = new UploadHolderView();
holder.image = (ImageView) view.findViewById(R.id.uploadImage); holder.image = (MediaWikiImageView) view.findViewById(R.id.uploadImage);
holder.title = (TextView) view.findViewById(R.id.uploadTitle); holder.title = (TextView) view.findViewById(R.id.uploadTitle);
holder.overlay = (RelativeLayout) view.findViewById(R.id.uploadOverlay); holder.overlay = (RelativeLayout) view.findViewById(R.id.uploadOverlay);
@ -100,7 +94,7 @@ public class MultipleUploadListFragment extends Fragment {
Contribution up = (Contribution)this.getItem(i); Contribution up = (Contribution)this.getItem(i);
if(holder.imageUri == null || !holder.imageUri.equals(up.getLocalUri())) { if(holder.imageUri == null || !holder.imageUri.equals(up.getLocalUri())) {
ImageLoader.getInstance().displayImage(up.getLocalUri().toString(), holder.image, uploadDisplayOptions); holder.image.setImageURI(up.getLocalUri().toString());
holder.imageUri = up.getLocalUri(); holder.imageUri = up.getLocalUri();
} }
@ -221,7 +215,6 @@ public class MultipleUploadListFragment extends Fragment {
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
uploadDisplayOptions = Utils.getGenericDisplayOptions().build();
detailProvider = (MediaDetailPagerFragment.MediaDetailProvider)getActivity(); detailProvider = (MediaDetailPagerFragment.MediaDetailProvider)getActivity();
multipleUploadInitiatedHandler = (OnMultipleUploadInitiatedHandler) getActivity(); multipleUploadInitiatedHandler = (OnMultipleUploadInitiatedHandler) getActivity();

View file

@ -14,11 +14,10 @@ import android.support.v4.app.NavUtils;
import android.support.v4.content.ContextCompat; import android.support.v4.content.ContextCompat;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import com.nostra13.universalimageloader.core.ImageLoader; import com.facebook.drawee.view.SimpleDraweeView;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
@ -59,7 +58,7 @@ public class ShareActivity
private Uri mediaUri; private Uri mediaUri;
private Contribution contribution; private Contribution contribution;
private ImageView backgroundImageView; private SimpleDraweeView backgroundImageView;
private UploadController uploadController; private UploadController uploadController;
private CommonsApplication cacheObj; private CommonsApplication cacheObj;
@ -222,7 +221,7 @@ public class ShareActivity
ButterKnife.bind(this); ButterKnife.bind(this);
initDrawer(); initDrawer();
app = CommonsApplication.getInstance(); app = CommonsApplication.getInstance();
backgroundImageView = (ImageView)findViewById(R.id.backgroundImage); backgroundImageView = (SimpleDraweeView)findViewById(R.id.backgroundImage);
//Receive intent from ContributionController.java when user selects picture to upload //Receive intent from ContributionController.java when user selects picture to upload
Intent intent = getIntent(); Intent intent = getIntent();
@ -239,7 +238,7 @@ public class ShareActivity
if (mediaUri != null) { if (mediaUri != null) {
mediaUriString = mediaUri.toString(); mediaUriString = mediaUri.toString();
ImageLoader.getInstance().displayImage(mediaUriString, backgroundImageView); backgroundImageView.setImageURI(mediaUriString);
//Test SHA1 of image to see if it matches SHA1 of a file on Commons //Test SHA1 of image to see if it matches SHA1 of a file on Commons
try { try {

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout" android:id="@+id/drawer_layout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
@ -20,11 +21,11 @@
android:layout_below="@id/toolbar" android:layout_below="@id/toolbar"
android:background="?attr/mainBackground"> android:background="?attr/mainBackground">
<ImageView <com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/backgroundImage" android:id="@+id/backgroundImage"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:scaleType="centerCrop" /> app:actualImageScaleType="centerCrop" />
<FrameLayout <FrameLayout
android:id="@+id/single_upload_fragment_container" android:id="@+id/single_upload_fragment_container"

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical" android:orientation="vertical"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -8,11 +9,11 @@
android:background="#000000" android:background="#000000"
> >
<ImageView <com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/uploadImage" android:id="@+id/uploadImage"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="192dp" android:layout_height="192dp"
android:scaleType="centerCrop" app:actualImageScaleType="centerCrop"
/> />
<RelativeLayout <RelativeLayout