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 4a784e449..9ac476714 100644 --- a/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java +++ b/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java @@ -16,10 +16,6 @@ import androidx.annotation.NonNull; import com.facebook.drawee.backends.pipeline.Fresco; import com.facebook.imagepipeline.core.ImagePipeline; import com.facebook.imagepipeline.core.ImagePipelineConfig; -import com.facebook.imagepipeline.producers.Consumer; -import com.facebook.imagepipeline.producers.FetchState; -import com.facebook.imagepipeline.producers.NetworkFetcher; -import com.facebook.imagepipeline.producers.ProducerContext; import com.mapbox.mapboxsdk.Mapbox; import com.squareup.leakcanary.LeakCanary; import com.squareup.leakcanary.RefWatcher; @@ -58,7 +54,6 @@ import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.internal.functions.Functions; import io.reactivex.plugins.RxJavaPlugins; import io.reactivex.schedulers.Schedulers; -import okhttp3.OkHttpClient; import timber.log.Timber; import static fr.free.nrw.commons.data.DBOpenHelper.CONTRIBUTIONS_TABLE; @@ -94,9 +89,6 @@ public class CommonsApplication extends Application { @Inject @Named("default_preferences") JsonKvStore defaultPrefs; - @Inject - OkHttpClient okHttpClient; - /** * Constants begin */ @@ -162,15 +154,9 @@ public class CommonsApplication extends Application { } // Set DownsampleEnabled to True to downsample the image in case it's heavy - ImagePipelineConfig.Builder imagePipelineConfigBuilder = ImagePipelineConfig.newBuilder(this) - .setDownsampleEnabled(true); - - if(ConfigUtils.isBetaFlavour()){ - NetworkFetcher networkFetcher=new CustomNetworkFetcher(okHttpClient); - imagePipelineConfigBuilder.setNetworkFetcher(networkFetcher); - } - - ImagePipelineConfig config = imagePipelineConfigBuilder.build(); + ImagePipelineConfig config = ImagePipelineConfig.newBuilder(this) + .setDownsampleEnabled(true) + .build(); try { Fresco.initialize(this, config); } catch (Exception e) { diff --git a/app/src/main/java/fr/free/nrw/commons/CustomNetworkFetcher.java b/app/src/main/java/fr/free/nrw/commons/CustomNetworkFetcher.java deleted file mode 100644 index 4879b143b..000000000 --- a/app/src/main/java/fr/free/nrw/commons/CustomNetworkFetcher.java +++ /dev/null @@ -1,206 +0,0 @@ -package fr.free.nrw.commons; - -import android.net.Uri; -import android.os.Looper; -import android.os.SystemClock; -import com.facebook.imagepipeline.common.BytesRange; -import com.facebook.imagepipeline.image.EncodedImage; -import com.facebook.imagepipeline.producers.BaseNetworkFetcher; -import com.facebook.imagepipeline.producers.BaseProducerContextCallbacks; -import com.facebook.imagepipeline.producers.Consumer; -import com.facebook.imagepipeline.producers.FetchState; -import com.facebook.imagepipeline.producers.NetworkFetcher; -import com.facebook.imagepipeline.producers.ProducerContext; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.Executor; -import okhttp3.CacheControl; -import okhttp3.Call; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.Response; -import okhttp3.ResponseBody; - -/** Network fetcher that uses OkHttp 3 as a backend. */ -public class CustomNetworkFetcher - extends BaseNetworkFetcher { - - public static class OkHttpNetworkFetchState extends FetchState { - - public long submitTime; - public long responseTime; - public long fetchCompleteTime; - - public OkHttpNetworkFetchState( - Consumer consumer, ProducerContext producerContext) { - super(consumer, producerContext); - } - } - - private static final String QUEUE_TIME = "queue_time"; - private static final String FETCH_TIME = "fetch_time"; - private static final String TOTAL_TIME = "total_time"; - private static final String IMAGE_SIZE = "image_size"; - - private final Call.Factory mCallFactory; - private final CacheControl mCacheControl; - - private Executor mCancellationExecutor; - - /** @param okHttpClient client to use */ - public CustomNetworkFetcher(OkHttpClient okHttpClient) { - this(okHttpClient, okHttpClient.dispatcher().executorService()); - } - - /** - * @param callFactory custom {@link Call.Factory} for fetching image from the network - * @param cancellationExecutor executor on which fetching cancellation is performed if - * cancellation is requested from the UI Thread - */ - public CustomNetworkFetcher(Call.Factory callFactory, Executor cancellationExecutor) { - this(callFactory, cancellationExecutor, true); - } - - /** - * @param callFactory custom {@link Call.Factory} for fetching image from the network - * @param cancellationExecutor executor on which fetching cancellation is performed if - * cancellation is requested from the UI Thread - * @param disableOkHttpCache true if network requests should not be cached by OkHttp - */ - public CustomNetworkFetcher( - Call.Factory callFactory, Executor cancellationExecutor, boolean disableOkHttpCache) { - mCallFactory = callFactory; - mCancellationExecutor = cancellationExecutor; - mCacheControl = disableOkHttpCache ? new CacheControl.Builder().noStore().build() : null; - } - - @Override - public OkHttpNetworkFetchState createFetchState( - Consumer consumer, ProducerContext context) { - return new OkHttpNetworkFetchState(consumer, context); - } - - @Override - public void fetch( - final OkHttpNetworkFetchState fetchState, final NetworkFetcher.Callback callback) { - fetchState.submitTime = SystemClock.elapsedRealtime(); - final Uri uri = fetchState.getUri(); - - try { - final Request.Builder requestBuilder = new Request.Builder().url(uri.toString()).get(); - - if (mCacheControl != null) { - requestBuilder.cacheControl(mCacheControl); - } - - final BytesRange bytesRange = fetchState.getContext().getImageRequest().getBytesRange(); - if (bytesRange != null) { - requestBuilder.addHeader("Range", bytesRange.toHttpRangeHeaderValue()); - } - - fetchWithRequest(fetchState, callback, requestBuilder.build()); - } catch (Exception e) { - // handle error while creating the request - callback.onFailure(e); - } - } - - @Override - public void onFetchCompletion(OkHttpNetworkFetchState fetchState, int byteSize) { - fetchState.fetchCompleteTime = SystemClock.elapsedRealtime(); - } - - @Override - public Map getExtraMap(OkHttpNetworkFetchState fetchState, int byteSize) { - Map extraMap = new HashMap<>(4); - extraMap.put(QUEUE_TIME, Long.toString(fetchState.responseTime - fetchState.submitTime)); - extraMap.put(FETCH_TIME, Long.toString(fetchState.fetchCompleteTime - fetchState.responseTime)); - extraMap.put(TOTAL_TIME, Long.toString(fetchState.fetchCompleteTime - fetchState.submitTime)); - extraMap.put(IMAGE_SIZE, Integer.toString(byteSize)); - return extraMap; - } - - protected void fetchWithRequest( - final OkHttpNetworkFetchState fetchState, - final NetworkFetcher.Callback callback, - final Request request) { - final Call call = mCallFactory.newCall(request); - - fetchState - .getContext() - .addCallbacks( - new BaseProducerContextCallbacks() { - @Override - public void onCancellationRequested() { - if (Looper.myLooper() != Looper.getMainLooper()) { - call.cancel(); - } else { - mCancellationExecutor.execute( - new Runnable() { - @Override - public void run() { - call.cancel(); - } - }); - } - } - }); - - call.enqueue( - new okhttp3.Callback() { - @Override - public void onResponse(Call call, Response response) throws IOException { - fetchState.responseTime = SystemClock.elapsedRealtime(); - final ResponseBody body = response.body(); - try { - if (!response.isSuccessful()) { - handleException( - call, new IOException("Unexpected HTTP code " + response), callback); - return; - } - - BytesRange responseRange = - BytesRange.fromContentRangeHeader(response.header("Content-Range")); - if (responseRange != null - && !(responseRange.from == 0 - && responseRange.to == BytesRange.TO_END_OF_CONTENT)) { - // Only treat as a partial image if the range is not all of the content - fetchState.setResponseBytesRange(responseRange); - fetchState.setOnNewResultStatusFlags(Consumer.IS_PARTIAL_RESULT); - } - - long contentLength = body.contentLength(); - if (contentLength < 0) { - contentLength = 0; - } - callback.onResponse(body.byteStream(), (int) contentLength); - } catch (Exception e) { - handleException(call, e, callback); - } finally { - body.close(); - } - } - - @Override - public void onFailure(Call call, IOException e) { - handleException(call, e, callback); - } - }); - } - - /** - * Handles exceptions. - * - *

OkHttp notifies callers of cancellations via an IOException. If IOException is caught after - * request cancellation, then the exception is interpreted as successful cancellation and - * onCancellation is called. Otherwise onFailure is called. - */ - private void handleException(final Call call, final Exception e, final Callback callback) { - if (call.isCanceled()) { - callback.onCancellation(); - } else { - callback.onFailure(e); - } - } -} \ No newline at end of file diff --git a/app/src/main/java/fr/free/nrw/commons/OkHttpConnectionFactory.java b/app/src/main/java/fr/free/nrw/commons/OkHttpConnectionFactory.java index 8b12ee5f0..6fe317c0a 100644 --- a/app/src/main/java/fr/free/nrw/commons/OkHttpConnectionFactory.java +++ b/app/src/main/java/fr/free/nrw/commons/OkHttpConnectionFactory.java @@ -8,8 +8,6 @@ import org.wikipedia.dataclient.okhttp.HttpStatusException; import java.io.File; import java.io.IOException; -import fr.free.nrw.commons.di.SslUtils; -import fr.free.nrw.commons.utils.ConfigUtils; import okhttp3.Cache; import okhttp3.Interceptor; import okhttp3.OkHttpClient; @@ -31,17 +29,13 @@ public final class OkHttpConnectionFactory { @NonNull private static OkHttpClient createClient() { - OkHttpClient.Builder builder = new OkHttpClient.Builder() + return new OkHttpClient.Builder() .cookieJar(SharedPreferenceCookieManager.getInstance()) .cache(NET_CACHE) .addInterceptor(getLoggingInterceptor()) .addInterceptor(new UnsuccessfulResponseInterceptor()) - .addInterceptor(new CommonHeaderRequestInterceptor()); - - if(ConfigUtils.isBetaFlavour()){ - builder.sslSocketFactory(SslUtils.INSTANCE.getTrustAllHostsSSLSocketFactory()); - } - return builder.build(); + .addInterceptor(new CommonHeaderRequestInterceptor()) + .build(); } private static HttpLoggingInterceptor getLoggingInterceptor() { diff --git a/app/src/main/java/fr/free/nrw/commons/di/NetworkingModule.java b/app/src/main/java/fr/free/nrw/commons/di/NetworkingModule.java index 830b14202..c6e6033f5 100644 --- a/app/src/main/java/fr/free/nrw/commons/di/NetworkingModule.java +++ b/app/src/main/java/fr/free/nrw/commons/di/NetworkingModule.java @@ -18,8 +18,6 @@ import java.util.concurrent.TimeUnit; import javax.inject.Named; import javax.inject.Singleton; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSocketFactory; import dagger.Module; import dagger.Provides; @@ -33,7 +31,6 @@ import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient; import fr.free.nrw.commons.mwapi.UserInterface; import fr.free.nrw.commons.review.ReviewInterface; import fr.free.nrw.commons.upload.UploadInterface; -import fr.free.nrw.commons.utils.ConfigUtils; import fr.free.nrw.commons.wikidata.WikidataInterface; import okhttp3.Cache; import okhttp3.HttpUrl; @@ -61,20 +58,14 @@ public class NetworkingModule { public OkHttpClient provideOkHttpClient(Context context, HttpLoggingInterceptor httpLoggingInterceptor) { File dir = new File(context.getCacheDir(), "okHttpCache"); - OkHttpClient.Builder builder = new OkHttpClient.Builder().connectTimeout(60, TimeUnit.SECONDS) - .writeTimeout(60, TimeUnit.SECONDS) + return new OkHttpClient.Builder().connectTimeout(60, TimeUnit.SECONDS) + .writeTimeout(60, TimeUnit.SECONDS) .addInterceptor(httpLoggingInterceptor) - .readTimeout(60, TimeUnit.SECONDS) - .cache(new Cache(dir, OK_HTTP_CACHE_SIZE)); - - if(ConfigUtils.isBetaFlavour()){ - builder.sslSocketFactory(SslUtils.INSTANCE.getTrustAllHostsSSLSocketFactory()); - } - return builder.build(); + .readTimeout(60, TimeUnit.SECONDS) + .cache(new Cache(dir, OK_HTTP_CACHE_SIZE)) + .build(); } - - @Provides @Singleton public HttpLoggingInterceptor provideHttpLoggingInterceptor() { diff --git a/app/src/main/java/fr/free/nrw/commons/di/SslUtils.kt b/app/src/main/java/fr/free/nrw/commons/di/SslUtils.kt deleted file mode 100644 index 043cdbc60..000000000 --- a/app/src/main/java/fr/free/nrw/commons/di/SslUtils.kt +++ /dev/null @@ -1,47 +0,0 @@ -package fr.free.nrw.commons.di - -import java.security.KeyManagementException -import java.security.NoSuchAlgorithmException -import java.security.cert.CertificateException -import java.security.cert.X509Certificate -import javax.net.ssl.SSLContext -import javax.net.ssl.SSLSocketFactory -import javax.net.ssl.TrustManager -import javax.net.ssl.X509TrustManager - -object SslUtils { - - fun getTrustAllHostsSSLSocketFactory(): SSLSocketFactory? { - try { - // Create a trust manager that does not validate certificate chains - val trustAllCerts = arrayOf(object : X509TrustManager { - - override fun getAcceptedIssuers(): Array { - return arrayOf() - } - - @Throws(CertificateException::class) - override fun checkClientTrusted(chain: Array, authType: String) { - } - - @Throws(CertificateException::class) - override fun checkServerTrusted(chain: Array, authType: String) { - } - }) - - // Install the all-trusting trust manager - val sslContext = SSLContext.getInstance("SSL") - sslContext.init(null, trustAllCerts, java.security.SecureRandom()) - // Create an ssl socket factory with our all-trusting manager - - return sslContext.socketFactory - } catch (e: KeyManagementException) { - e.printStackTrace() - return null - } catch (e: NoSuchAlgorithmException) { - e.printStackTrace() - return null - } - - } -} \ No newline at end of file