diff --git a/README.md b/README.md index 57ba0db03..70a5128aa 100644 --- a/README.md +++ b/README.md @@ -39,11 +39,9 @@ We try to have an extensive documentation at [our wiki here at Github][5]: * [Fresco][27] * [Stetho][28] * [Dagger][29] -* [AndroidSVG][30] -* [Java-HTTP-Fluent][31] -* [CircleProgressBar][32] -* [Glide][33] -* [Leak Canary][34] +* [Java-HTTP-Fluent][30] +* [CircleProgressBar][31] +* [Leak Canary][32] ## License ## @@ -80,8 +78,6 @@ This software is open source, licensed under the [Apache License 2.0][4]. [27]: https://github.com/facebook/fresco [28]: https://github.com/facebook/stetho [29]: https://github.com/google/dagger -[30]: https://github.com/BigBadaboom/androidsvg -[31]: https://github.com/yuvipanda/java-http-fluent/blob/master/src/main/java/in/yuvi/http/fluent/Http.java -[32]: https://github.com/dinuscxj/CircleProgressBar -[33]: https://github.com/bumptech/glide -[34]: https://github.com/square/leakcanary +[30]: https://github.com/yuvipanda/java-http-fluent/blob/master/src/main/java/in/yuvi/http/fluent/Http.java +[31]: https://github.com/dinuscxj/CircleProgressBar +[32]: https://github.com/square/leakcanary diff --git a/app/build.gradle b/app/build.gradle index c056fb429..5ab6b479e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,7 +7,6 @@ apply from: 'quality.gradle' apply plugin: 'com.getkeepsafe.dexcount' dependencies { - implementation 'com.squareup.picasso:picasso:2.71828' implementation 'com.prof.rssparser:rssparser:1.1' implementation 'com.github.nicolas-raoul:Quadtree:ac16ea8035bf07' implementation 'fr.avianey.com.viewpagerindicator:library:2.4.1.1@aar' @@ -40,7 +39,6 @@ dependencies { implementation 'io.reactivex.rxjava2:rxandroid:2.0.1' // Because RxAndroid releases are few and far between, it is recommended you also // explicitly depend on RxJava's latest version for bug fixes and new features. - implementation 'com.android.support:multidex:1.0.3' implementation 'io.reactivex.rxjava2:rxjava:2.1.2' implementation 'com.jakewharton.rxbinding2:rxbinding:2.0.0' implementation 'com.jakewharton.rxbinding2:rxbinding-support-v4:2.0.0' @@ -53,7 +51,6 @@ dependencies { implementation "com.google.dagger:dagger-android-support:$DAGGER_VERSION" kapt "com.google.dagger:dagger-android-processor:$DAGGER_VERSION" kapt "com.google.dagger:dagger-compiler:$DAGGER_VERSION" - testImplementation 'org.robolectric:multidex:3.4.2' testImplementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" testImplementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" testImplementation 'junit:junit:4.12' @@ -62,10 +59,6 @@ dependencies { testImplementation 'com.squareup.okhttp3:mockwebserver:3.8.1' implementation 'com.dinuscxj:circleprogressbar:1.1.1' - implementation 'com.caverock:androidsvg:1.2.1' - implementation 'com.github.bumptech.glide:glide:4.7.1' - kapt 'com.github.bumptech.glide:compiler:4.7.1' - androidTestImplementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" androidTestImplementation 'com.squareup.okhttp3:mockwebserver:3.8.1' androidTestImplementation "com.android.support:support-annotations:$SUPPORT_LIB_VERSION" @@ -95,8 +88,6 @@ android { targetSdkVersion project.targetSdkVersion testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true - - multiDexEnabled true } testOptions { @@ -117,7 +108,7 @@ android { buildTypes { release { minifyEnabled false // See https://stackoverflow.com/questions/40232404/google-play-apk-and-android-studio-apk-usb-debug-behaving-differently - proguard.cfg modification alone insufficient. - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt', 'proguard-glide.txt' + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } debug { testCoverageEnabled true diff --git a/app/proguard-glide.txt b/app/proguard-glide.txt deleted file mode 100644 index ef3437660..000000000 --- a/app/proguard-glide.txt +++ /dev/null @@ -1,9 +0,0 @@ --keep public class * implements com.bumptech.glide.module.GlideModule --keep public class * extends com.bumptech.glide.module.AppGlideModule --keep public enum com.bumptech.glide.load.ImageHeaderParser$** { - **[] $VALUES; - public *; -} - -# for DexGuard only --keepresourcexmlelements manifest/application/meta-data@value=GlideModule \ No newline at end of file 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 494754964..51b8b0b0f 100644 --- a/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java +++ b/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java @@ -1,5 +1,6 @@ package fr.free.nrw.commons; +import android.app.Application; import android.app.NotificationChannel; import android.app.NotificationManager; import android.content.Context; @@ -7,7 +8,6 @@ import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; import android.os.Build; import android.support.annotation.RequiresApi; -import android.support.multidex.MultiDexApplication; import com.facebook.drawee.backends.pipeline.Fresco; import com.facebook.imagepipeline.core.ImagePipelineConfig; @@ -45,7 +45,7 @@ import timber.log.Timber; resDialogCommentPrompt = R.string.crash_dialog_comment_prompt, resDialogOkToast = R.string.crash_dialog_ok_toast ) -public class CommonsApplication extends MultiDexApplication { +public class CommonsApplication extends Application { @Inject SessionManager sessionManager; @Inject DBOpenHelper dbOpenHelper; diff --git a/app/src/main/java/fr/free/nrw/commons/glide/SvgDecoder.java b/app/src/main/java/fr/free/nrw/commons/glide/SvgDecoder.java deleted file mode 100644 index 9087f9501..000000000 --- a/app/src/main/java/fr/free/nrw/commons/glide/SvgDecoder.java +++ /dev/null @@ -1,36 +0,0 @@ -package fr.free.nrw.commons.glide; - -import android.support.annotation.NonNull; - -import com.bumptech.glide.load.Options; -import com.bumptech.glide.load.ResourceDecoder; -import com.bumptech.glide.load.engine.Resource; -import com.bumptech.glide.load.resource.SimpleResource; -import com.caverock.androidsvg.SVG; -import com.caverock.androidsvg.SVGParseException; - -import java.io.IOException; -import java.io.InputStream; - -/** - * Decodes an SVG internal representation from an {@link InputStream}. - */ -public class SvgDecoder implements ResourceDecoder { - - @Override - public boolean handles(@NonNull InputStream source, @NonNull Options options) { - // TODO: Can we tell? - return true; - } - - public Resource decode(@NonNull InputStream source, int width, int height, - @NonNull Options options) - throws IOException { - try { - SVG svg = SVG.getFromInputStream(source); - return new SimpleResource<>(svg); - } catch (SVGParseException ex) { - throw new IOException("Cannot load SVG from stream", ex); - } - } -} \ No newline at end of file diff --git a/app/src/main/java/fr/free/nrw/commons/glide/SvgDrawableTranscoder.java b/app/src/main/java/fr/free/nrw/commons/glide/SvgDrawableTranscoder.java deleted file mode 100644 index 89910c8fb..000000000 --- a/app/src/main/java/fr/free/nrw/commons/glide/SvgDrawableTranscoder.java +++ /dev/null @@ -1,28 +0,0 @@ -package fr.free.nrw.commons.glide; - -import android.graphics.Picture; -import android.graphics.drawable.PictureDrawable; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import com.bumptech.glide.load.Options; -import com.bumptech.glide.load.engine.Resource; -import com.bumptech.glide.load.resource.SimpleResource; -import com.bumptech.glide.load.resource.transcode.ResourceTranscoder; -import com.caverock.androidsvg.SVG; - -/** - * Convert the {@link SVG}'s internal representation to an Android-compatible one - * ({@link Picture}). - */ -public class SvgDrawableTranscoder implements ResourceTranscoder { - @Nullable - @Override - public Resource transcode(@NonNull Resource toTranscode, - @NonNull Options options) { - SVG svg = toTranscode.get(); - Picture picture = svg.renderToPicture(); - PictureDrawable drawable = new PictureDrawable(picture); - return new SimpleResource<>(drawable); - } -} \ No newline at end of file diff --git a/app/src/main/java/fr/free/nrw/commons/glide/SvgSoftwareLayerSetter.java b/app/src/main/java/fr/free/nrw/commons/glide/SvgSoftwareLayerSetter.java deleted file mode 100644 index 66a3bd6bf..000000000 --- a/app/src/main/java/fr/free/nrw/commons/glide/SvgSoftwareLayerSetter.java +++ /dev/null @@ -1,51 +0,0 @@ -package fr.free.nrw.commons.glide; - -import android.graphics.drawable.PictureDrawable; -import android.widget.ImageView; - -import com.bumptech.glide.load.DataSource; -import com.bumptech.glide.load.engine.GlideException; -import com.bumptech.glide.request.RequestListener; -import com.bumptech.glide.request.target.ImageViewTarget; -import com.bumptech.glide.request.target.Target; - -/** - * Listener which updates the {@link ImageView} to be software rendered, because - * {@link com.caverock.androidsvg.SVG SVG}/{@link android.graphics.Picture Picture} can't render on - * a hardware backed {@link android.graphics.Canvas Canvas}. - */ -public class SvgSoftwareLayerSetter implements RequestListener { - - /** - * Sets the layer type to none if the load fails - * @param e - * @param model - * @param target - * @param isFirstResource - * @return - */ - @Override - public boolean onLoadFailed(GlideException e, Object model, Target target, - boolean isFirstResource) { - ImageView view = ((ImageViewTarget) target).getView(); - view.setLayerType(ImageView.LAYER_TYPE_NONE, null); - return false; - } - - /** - * Sets the layer type to software when the resource is ready - * @param resource - * @param model - * @param target - * @param dataSource - * @param isFirstResource - * @return - */ - @Override - public boolean onResourceReady(PictureDrawable resource, Object model, - Target target, DataSource dataSource, boolean isFirstResource) { - ImageView view = ((ImageViewTarget) target).getView(); - view.setLayerType(ImageView.LAYER_TYPE_SOFTWARE, null); - return false; - } -} \ No newline at end of file diff --git a/app/src/main/java/fr/free/nrw/commons/notification/NotificationRenderer.java b/app/src/main/java/fr/free/nrw/commons/notification/NotificationRenderer.java index 6dcfca35d..1164d9d57 100644 --- a/app/src/main/java/fr/free/nrw/commons/notification/NotificationRenderer.java +++ b/app/src/main/java/fr/free/nrw/commons/notification/NotificationRenderer.java @@ -1,6 +1,5 @@ package fr.free.nrw.commons.notification; -import android.graphics.drawable.PictureDrawable; import android.text.Html; import android.view.LayoutInflater; import android.view.View; @@ -9,23 +8,17 @@ import android.widget.ImageView; import android.widget.TextView; import com.borjabravo.readmoretextview.ReadMoreTextView; -import com.bumptech.glide.RequestBuilder; import com.pedrogomez.renderers.Renderer; import butterknife.BindView; import butterknife.ButterKnife; import fr.free.nrw.commons.R; -import fr.free.nrw.commons.glide.SvgSoftwareLayerSetter; - -import static com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions.withCrossFade; /** * Created by root on 19.12.2017. */ public class NotificationRenderer extends Renderer { - private RequestBuilder requestBuilder; - @BindView(R.id.title) ReadMoreTextView title; @BindView(R.id.time) TextView time; @BindView(R.id.icon) ImageView icon; @@ -48,11 +41,6 @@ public class NotificationRenderer extends Renderer { protected View inflate(LayoutInflater layoutInflater, ViewGroup viewGroup) { View inflatedView = layoutInflater.inflate(R.layout.item_notification, viewGroup, false); ButterKnife.bind(this, inflatedView); - requestBuilder = GlideApp.with(inflatedView.getContext()) - .as(PictureDrawable.class) - .error(R.drawable.round_icon_unknown) - .transition(withCrossFade()) - .listener(new SvgSoftwareLayerSetter()); return inflatedView; } @@ -61,7 +49,6 @@ public class NotificationRenderer extends Renderer { Notification notification = getContent(); setTitle(notification.notificationText); time.setText(notification.date); - requestBuilder.load(notification.iconUrl).into(icon); } /** diff --git a/app/src/main/java/fr/free/nrw/commons/notification/SvgModule.java b/app/src/main/java/fr/free/nrw/commons/notification/SvgModule.java deleted file mode 100644 index 5a1e8ae63..000000000 --- a/app/src/main/java/fr/free/nrw/commons/notification/SvgModule.java +++ /dev/null @@ -1,35 +0,0 @@ -package fr.free.nrw.commons.notification; - -import android.content.Context; -import android.graphics.drawable.PictureDrawable; -import android.support.annotation.NonNull; - -import com.bumptech.glide.Glide; -import com.bumptech.glide.Registry; -import com.bumptech.glide.annotation.GlideModule; -import com.bumptech.glide.module.AppGlideModule; -import com.caverock.androidsvg.SVG; - -import java.io.InputStream; - -import fr.free.nrw.commons.glide.SvgDecoder; -import fr.free.nrw.commons.glide.SvgDrawableTranscoder; - -/** - * Module for the SVG sample app. - */ -@GlideModule -public class SvgModule extends AppGlideModule { - @Override - public void registerComponents(@NonNull Context context, @NonNull Glide glide, - @NonNull Registry registry) { - registry.register(SVG.class, PictureDrawable.class, new SvgDrawableTranscoder()) - .append(InputStream.class, SVG.class, new SvgDecoder()); - } - - // Disable manifest parsing to avoid adding similar modules twice. - @Override - public boolean isManifestParsingEnabled() { - return false; - } -} \ No newline at end of file diff --git a/app/src/main/java/fr/free/nrw/commons/widget/PicOfDayAppWidget.java b/app/src/main/java/fr/free/nrw/commons/widget/PicOfDayAppWidget.java index 82bad3f09..c7c0cfb81 100644 --- a/app/src/main/java/fr/free/nrw/commons/widget/PicOfDayAppWidget.java +++ b/app/src/main/java/fr/free/nrw/commons/widget/PicOfDayAppWidget.java @@ -3,18 +3,27 @@ package fr.free.nrw.commons.widget; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.net.Uri; +import android.support.annotation.Nullable; import android.widget.RemoteViews; +import com.facebook.common.executors.CallerThreadExecutor; +import com.facebook.common.references.CloseableReference; +import com.facebook.datasource.DataSource; +import com.facebook.drawee.backends.pipeline.Fresco; +import com.facebook.imagepipeline.core.ImagePipeline; +import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber; +import com.facebook.imagepipeline.image.CloseableImage; +import com.facebook.imagepipeline.request.ImageRequest; +import com.facebook.imagepipeline.request.ImageRequestBuilder; import com.prof.rssparser.Article; import com.prof.rssparser.Parser; -import com.squareup.picasso.Picasso; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.util.ArrayList; @@ -27,10 +36,7 @@ import fr.free.nrw.commons.R; */ public class PicOfDayAppWidget extends AppWidgetProvider { - static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, - int appWidgetId) { - - // Construct the RemoteViews object + static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) { RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.pic_of_day_app_widget); String urlString = BuildConfig.WIKIMEDIA_API_POTD; @@ -45,19 +51,37 @@ public class PicOfDayAppWidget extends AppWidgetProvider { Elements elements = document.select("img"); String imageUrl = elements.get(0).attr("src"); if (imageUrl != null && imageUrl.length() > 0) { - Picasso.get().load(imageUrl).into(views, R.id.appwidget_image, new int[]{appWidgetId}); + + ImageRequest request = ImageRequestBuilder.newBuilderWithSource(Uri.parse(imageUrl)).build(); + ImagePipeline imagePipeline = Fresco.getImagePipeline(); + DataSource> dataSource + = imagePipeline.fetchDecodedImage(request, context); + dataSource.subscribe(new BaseBitmapDataSubscriber() { + @Override + protected void onNewResultImpl(@Nullable Bitmap tempBitmap) { + Bitmap bitmap = null; + if (tempBitmap != null) { + bitmap = Bitmap.createBitmap(tempBitmap.getWidth(), tempBitmap.getHeight(), Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(bitmap); + canvas.drawBitmap(tempBitmap, 0f, 0f, new Paint()); + } + views.setImageViewBitmap(R.id.appwidget_image, bitmap); + appWidgetManager.updateAppWidget(appWidgetId, views); + } + + @Override + protected void onFailureImpl(DataSource> dataSource) { + // Ignore failure for now. + } + }, CallerThreadExecutor.getInstance()); } } - } @Override public void onError() { } }); - - // Instruct the widget manager to update the widget - appWidgetManager.updateAppWidget(appWidgetId, views); } @Override diff --git a/app/src/main/res/layout/item_notification.xml b/app/src/main/res/layout/item_notification.xml index 8eae8a4d2..ec777ba52 100644 --- a/app/src/main/res/layout/item_notification.xml +++ b/app/src/main/res/layout/item_notification.xml @@ -6,7 +6,7 @@ android:foreground="?selectableItemBackground" android:minHeight="72dp"> -