diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/activities/BaseActivity.java b/app/src/main/java/fr/gouv/etalab/mastodon/activities/BaseActivity.java index 73fd4b94c..d65840773 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/activities/BaseActivity.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/activities/BaseActivity.java @@ -1,5 +1,6 @@ package fr.gouv.etalab.mastodon.activities; +import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import org.conscrypt.Conscrypt; @@ -16,4 +17,5 @@ public class BaseActivity extends AppCompatActivity { Security.addProvider(Conscrypt.newProvider()); } + } diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/client/CustomStreamFetcher.java b/app/src/main/java/fr/gouv/etalab/mastodon/client/CustomStreamFetcher.java new file mode 100644 index 000000000..4665d3759 --- /dev/null +++ b/app/src/main/java/fr/gouv/etalab/mastodon/client/CustomStreamFetcher.java @@ -0,0 +1,57 @@ +package fr.gouv.etalab.mastodon.client; + +import android.support.annotation.NonNull; +import android.util.Log; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.Priority; +import com.bumptech.glide.load.DataSource; +import com.bumptech.glide.load.data.DataFetcher; +import com.bumptech.glide.load.model.GlideUrl; + +import java.io.IOException; +import java.io.InputStream; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; + +import fr.gouv.etalab.mastodon.helper.Helper; + +/** + * Created by Thomas on 13/12/2017. + */ + +public class CustomStreamFetcher implements DataFetcher { + + private GlideUrl url; + + public CustomStreamFetcher(GlideUrl url) { + this.url = url; + } + + @Override + public void loadData(Priority priority, DataCallback callback) { + new HttpsConnection().getPicture(url.toStringUrl()); + } + + @Override + public void cleanup() { + + } + + @Override + public void cancel() { + + } + + @NonNull + @Override + public Class getDataClass() { + return InputStream.class; + } + + @NonNull + @Override + public DataSource getDataSource() { + return DataSource.REMOTE; + } +} diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/client/HttpsConnection.java b/app/src/main/java/fr/gouv/etalab/mastodon/client/HttpsConnection.java index a249adf27..b7a632cea 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/client/HttpsConnection.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/client/HttpsConnection.java @@ -314,6 +314,30 @@ public class HttpsConnection { } + + public InputStream getPicture(final String downloadUrl) { + try { + URL url = new URL(downloadUrl); + httpsURLConnection = (HttpsURLConnection) url.openConnection(); + httpsURLConnection.setSSLSocketFactory(new TLSSocketFactory()); + httpsURLConnection.setRequestProperty("User-Agent", Helper.USER_AGENT); + int responseCode = httpsURLConnection.getResponseCode(); + // always check HTTP response code first + if (responseCode == HttpURLConnection.HTTP_OK) { + String disposition = httpsURLConnection.getHeaderField("Content-Disposition"); + // opens input stream from the HTTP connection + return httpsURLConnection.getInputStream(); + } + httpsURLConnection.disconnect(); + } catch (IOException | NoSuchAlgorithmException | KeyManagementException e) { + e.printStackTrace(); + } + if(httpsURLConnection != null) + httpsURLConnection.disconnect(); + return null; + } + + public void upload(final InputStream inputStream, final OnRetrieveAttachmentInterface listener) { new Thread(new Runnable() { diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/client/HttpsUrlLoader.java b/app/src/main/java/fr/gouv/etalab/mastodon/client/HttpsUrlLoader.java new file mode 100644 index 000000000..e96d37bb4 --- /dev/null +++ b/app/src/main/java/fr/gouv/etalab/mastodon/client/HttpsUrlLoader.java @@ -0,0 +1,56 @@ +package fr.gouv.etalab.mastodon.client; + +import android.content.Context; +import android.support.annotation.Nullable; +import android.util.Log; + +import com.bumptech.glide.load.Options; +import com.bumptech.glide.load.model.GlideUrl; +import com.bumptech.glide.load.model.ModelLoader; +import com.bumptech.glide.load.model.ModelLoaderFactory; +import com.bumptech.glide.load.model.MultiModelLoaderFactory; +import com.bumptech.glide.load.model.stream.UrlLoader; + +import java.io.InputStream; + +import fr.gouv.etalab.mastodon.helper.Helper; + + +/** + * Created by Thomas on 13/12/2017. + */ + +public class HttpsUrlLoader implements ModelLoader { + + + + @SuppressWarnings("WeakerAccess") + public HttpsUrlLoader() { + } + + @Nullable + @Override + public LoadData buildLoadData(GlideUrl glideUrl, int width, int height, Options options) { + return new LoadData<>(glideUrl, new CustomStreamFetcher(glideUrl)); + } + + @Override + public boolean handles(GlideUrl glideUrl) { + return true; + } + + + public static class Factory implements ModelLoaderFactory { + + + @Override + public ModelLoader build(MultiModelLoaderFactory multiFactory) { + return new HttpsUrlLoader(); + } + + @Override + public void teardown() { + + } + } +} diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/client/TLSLibraryGlideModule.java b/app/src/main/java/fr/gouv/etalab/mastodon/client/TLSLibraryGlideModule.java new file mode 100644 index 000000000..fbed8c37f --- /dev/null +++ b/app/src/main/java/fr/gouv/etalab/mastodon/client/TLSLibraryGlideModule.java @@ -0,0 +1,33 @@ +package fr.gouv.etalab.mastodon.client; + +import android.content.Context; +import android.util.Log; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.GlideBuilder; +import com.bumptech.glide.Registry; +import com.bumptech.glide.load.model.GlideUrl; +import com.bumptech.glide.module.AppGlideModule; +import com.bumptech.glide.annotation.GlideModule; + +import java.io.InputStream; + +import fr.gouv.etalab.mastodon.helper.Helper; + +/** + * Created by Thomas on 13/12/2017. + */ + +@GlideModule +public final class TLSLibraryGlideModule extends AppGlideModule { + + @Override + public void registerComponents(Context context, Glide glide, Registry registry) { + registry.replace(GlideUrl.class, InputStream.class, new HttpsUrlLoader.Factory()); + } + + @Override + public void applyOptions(Context context, GlideBuilder builder) { + + } +} \ No newline at end of file