diff --git a/app/build.gradle b/app/build.gradle index d212c5a50..02bd6a5d6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,7 +6,6 @@ dependencies { compile 'fr.avianey.com.viewpagerindicator:library:2.4.1.1@aar' compile 'in.yuvi:http.fluent:1.3' 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 'org.mediawiki:api:1.3' compile 'commons-codec:commons-codec:1.10' diff --git a/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java b/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java index 57c360385..bb4c4a85a 100644 --- a/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java +++ b/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java @@ -12,16 +12,8 @@ import android.os.Build; import android.database.sqlite.SQLiteDatabase; 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.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.category.Category; @@ -166,11 +158,6 @@ public class CommonsApplication extends Application { // Fire progress callbacks for every 3% of uploaded content 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); // Initialize EventLogging @@ -178,9 +165,6 @@ public class CommonsApplication extends Application { //For caching area -> categories cacheData = new CacheController(); - - DiskBasedCache cache = new DiskBasedCache(getCacheDir(), 16 * 1024 * 1024); - new RequestQueue(cache, new BasicNetwork(new HurlStack())).start(); } /** diff --git a/app/src/main/java/fr/free/nrw/commons/Media.java b/app/src/main/java/fr/free/nrw/commons/Media.java index 1bd0344b7..e3fb2baaf 100644 --- a/app/src/main/java/fr/free/nrw/commons/Media.java +++ b/app/src/main/java/fr/free/nrw/commons/Media.java @@ -116,10 +116,6 @@ public class Media implements Parcelable { this.creator = creator; } - public String getThumbnailUrl(int width) { - return Utils.makeThumbUrl(getImageUrl(), getFilename(), width); - } - public int getWidth() { return width; } diff --git a/app/src/main/java/fr/free/nrw/commons/Utils.java b/app/src/main/java/fr/free/nrw/commons/Utils.java index d296fdbcf..9d38cd92a 100644 --- a/app/src/main/java/fr/free/nrw/commons/Utils.java +++ b/app/src/main/java/fr/free/nrw/commons/Utils.java @@ -2,13 +2,8 @@ package fr.free.nrw.commons; import android.content.Context; import android.net.Uri; -import android.os.Build; 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 timber.log.Timber; @@ -142,26 +137,6 @@ public class Utils { 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(); public static String urlEncode(String url) { @@ -181,21 +156,6 @@ public class Utils { 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) { return string.substring(0, 1).toUpperCase(Locale.getDefault()) + string.substring(1); } diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.java index 77450cbf8..a944cf866 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.java @@ -14,8 +14,6 @@ class ContributionViewHolder { final TextView seqNumView; final ProgressBar progressView; - String url; - ContributionViewHolder(View parent) { imageView = (MediaWikiImageView) parent.findViewById(R.id.contributionImage); titleView = (TextView)parent.findViewById(R.id.contributionTitle); diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListAdapter.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListAdapter.java index cb23ac955..604bf645e 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListAdapter.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListAdapter.java @@ -3,25 +3,13 @@ package fr.free.nrw.commons.contributions; import android.app.Activity; import android.content.Context; import android.database.Cursor; -import android.graphics.Bitmap; import android.support.v4.widget.CursorAdapter; -import android.text.TextUtils; import android.view.View; 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.Utils; class ContributionsListAdapter extends CursorAdapter { - - private DisplayImageOptions contributionDisplayOptions = Utils.getGenericDisplayOptions().build(); - private Activity activity; public ContributionsListAdapter(Activity activity, Cursor c, int flags) { @@ -42,36 +30,7 @@ class ContributionsListAdapter extends CursorAdapter { final ContributionViewHolder views = (ContributionViewHolder)view.getTag(); final Contribution contribution = Contribution.fromCursor(cursor); - String actualUrl = (contribution.getLocalUri() != null && !TextUtils.isEmpty(contribution.getLocalUri().toString())) ? contribution.getLocalUri().toString() : contribution.getThumbnailUrl(640); - - 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.imageView.setMedia(contribution); views.titleView.setText(contribution.getDisplayTitle()); views.seqNumView.setText(String.valueOf(cursor.getPosition() + 1)); 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 fc947e5fc..cff5a8971 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 @@ -2,7 +2,6 @@ package fr.free.nrw.commons.media; import android.content.Intent; import android.database.DataSetObserver; -import android.graphics.Bitmap; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.Fragment; @@ -17,10 +16,6 @@ import android.widget.ProgressBar; import android.widget.ScrollView; 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.text.SimpleDateFormat; import java.util.ArrayList; @@ -38,14 +33,9 @@ import timber.log.Timber; public class MediaDetailFragment extends Fragment { private boolean editable; - private DisplayImageOptions displayOptions; private MediaDetailPagerFragment.MediaDetailProvider detailProvider; private int index; - public static MediaDetailFragment forMedia(int index) { - return forMedia(index, false); - } - public static MediaDetailFragment forMedia(int index, boolean editable) { MediaDetailFragment mf = new MediaDetailFragment(); @@ -188,93 +178,44 @@ public class MediaDetailFragment extends Fragment { private void displayMediaDetails(final Media media) { //Always load image from Internet to allow viewing the desc, license, and cats - String actualUrl = media.getThumbnailUrl(640); - if(actualUrl.startsWith("http")) { - Timber.d("Actual URL starts with http and is: %s", actualUrl); + MediaWikiImageView mwImage = (MediaWikiImageView) image; + mwImage.setMedia(media); - MediaWikiImageView mwImage = (MediaWikiImageView)image; - mwImage.setMedia(media); + // FIXME: For transparent images + // FIXME: keep the spinner going while we load data + // FIXME: cache this data + // Load image metadata: desc, license, categories + detailFetchTask = new AsyncTask() { + private MediaDataExtractor extractor; - // FIXME: For transparent images - // FIXME: keep the spinner going while we load data - // FIXME: cache this data - // Load image metadata: desc, license, categories - detailFetchTask = new AsyncTask() { - private MediaDataExtractor extractor; + @Override + protected void onPreExecute() { + extractor = new MediaDataExtractor(media.getFilename(), licenseList); + } - @Override - protected void onPreExecute() { - extractor = new MediaDataExtractor(media.getFilename(), licenseList); + @Override + protected Boolean doInBackground(Void... voids) { + try { + extractor.fetch(); + return Boolean.TRUE; + } catch (IOException e) { + e.printStackTrace(); } + return Boolean.FALSE; + } - @Override - protected Boolean doInBackground(Void... voids) { - try { - extractor.fetch(); - return Boolean.TRUE; - } catch (IOException e) { - e.printStackTrace(); - } - return Boolean.FALSE; - } + @Override + protected void onPostExecute(Boolean success) { + detailFetchTask = null; - @Override - protected void onPostExecute(Boolean success) { - 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); - } + 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()); @@ -286,27 +227,18 @@ public class MediaDetailFragment extends Fragment { categoryNames.add(getString(R.string.detail_panel_cats_none)); } rebuildCatList(); + } else { + Timber.d("Failed to load photo details."); } - - @Override - public void onLoadingCancelled(String s, View view) { - Timber.e("Image loading cancelled. But why?"); - } - }); - } + } + }; + detailFetchTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); title.setText(media.getDisplayTitle()); desc.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 public void onDestroyView() { if (detailFetchTask != null) { diff --git a/app/src/main/java/fr/free/nrw/commons/upload/MultipleUploadListFragment.java b/app/src/main/java/fr/free/nrw/commons/upload/MultipleUploadListFragment.java index 01526d202..06e18c679 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/MultipleUploadListFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/MultipleUploadListFragment.java @@ -21,15 +21,11 @@ import android.widget.BaseAdapter; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.GridView; -import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; -import com.nostra13.universalimageloader.core.DisplayImageOptions; -import com.nostra13.universalimageloader.core.ImageLoader; - +import fr.free.nrw.commons.MediaWikiImageView; import fr.free.nrw.commons.R; -import fr.free.nrw.commons.Utils; import fr.free.nrw.commons.contributions.Contribution; import fr.free.nrw.commons.media.MediaDetailPagerFragment; @@ -48,14 +44,12 @@ public class MultipleUploadListFragment extends Fragment { private MediaDetailPagerFragment.MediaDetailProvider detailProvider; private OnMultipleUploadInitiatedHandler multipleUploadInitiatedHandler; - private DisplayImageOptions uploadDisplayOptions; - private boolean imageOnlyMode; private static class UploadHolderView { Uri imageUri; - ImageView image; + MediaWikiImageView image; TextView title; RelativeLayout overlay; @@ -85,7 +79,7 @@ public class MultipleUploadListFragment extends Fragment { if(view == null) { view = getLayoutInflater(null).inflate(R.layout.layout_upload_item, null); 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.overlay = (RelativeLayout) view.findViewById(R.id.uploadOverlay); @@ -100,7 +94,7 @@ public class MultipleUploadListFragment extends Fragment { Contribution up = (Contribution)this.getItem(i); 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(); } @@ -221,7 +215,6 @@ public class MultipleUploadListFragment extends Fragment { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - uploadDisplayOptions = Utils.getGenericDisplayOptions().build(); detailProvider = (MediaDetailPagerFragment.MediaDetailProvider)getActivity(); multipleUploadInitiatedHandler = (OnMultipleUploadInitiatedHandler) getActivity(); diff --git a/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java b/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java index 2353dd465..cffdd35f0 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java @@ -14,11 +14,10 @@ import android.support.v4.app.NavUtils; import android.support.v4.content.ContextCompat; import android.view.MenuItem; import android.view.View; -import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; -import com.nostra13.universalimageloader.core.ImageLoader; +import com.facebook.drawee.view.SimpleDraweeView; import java.io.IOException; import java.io.InputStream; @@ -59,7 +58,7 @@ public class ShareActivity private Uri mediaUri; private Contribution contribution; - private ImageView backgroundImageView; + private SimpleDraweeView backgroundImageView; private UploadController uploadController; private CommonsApplication cacheObj; @@ -222,7 +221,7 @@ public class ShareActivity ButterKnife.bind(this); initDrawer(); 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 Intent intent = getIntent(); @@ -239,7 +238,7 @@ public class ShareActivity if (mediaUri != null) { 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 try { diff --git a/app/src/main/res/layout/activity_share.xml b/app/src/main/res/layout/activity_share.xml index 00ad0ecd9..6287cbc91 100644 --- a/app/src/main/res/layout/activity_share.xml +++ b/app/src/main/res/layout/activity_share.xml @@ -1,5 +1,6 @@ @@ -20,11 +21,11 @@ android:layout_below="@id/toolbar" android:background="?attr/mainBackground"> - + app:actualImageScaleType="centerCrop" /> -