diff --git a/app/build.gradle b/app/build.gradle index 4e7647a5e..a6f6dff5f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -36,7 +36,8 @@ dependencies { implementation 'com.android.support:design:27.0.1' implementation 'com.android.support:support-v4:27.0.1' implementation 'com.android.support:recyclerview-v7:27.0.1' - implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5' + implementation 'com.github.bumptech.glide:glide:4.3.1' + annotationProcessor 'com.github.bumptech.glide:compiler:4.3.1' implementation 'com.evernote:android-job:1.2.1' implementation 'com.github.chrisbanes:PhotoView:2.0.0' implementation 'com.google.code.gson:gson:2.8.0' diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/activities/BaseMainActivity.java b/app/src/main/java/fr/gouv/etalab/mastodon/activities/BaseMainActivity.java index ddb22d378..fd725ced4 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/activities/BaseMainActivity.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/activities/BaseMainActivity.java @@ -62,11 +62,6 @@ import android.widget.SeekBar; import android.widget.TextView; import android.widget.Toast; -import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache; -import com.nostra13.universalimageloader.core.DisplayImageOptions; -import com.nostra13.universalimageloader.core.ImageLoader; -import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; -import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer; import java.io.File; import java.util.ArrayList; @@ -84,7 +79,6 @@ import fr.gouv.etalab.mastodon.client.Entities.Account; import fr.gouv.etalab.mastodon.client.Entities.Notification; import fr.gouv.etalab.mastodon.client.Entities.Status; import fr.gouv.etalab.mastodon.client.Entities.Version; -import fr.gouv.etalab.mastodon.client.PatchBaseImageDownloader; import fr.gouv.etalab.mastodon.fragments.DisplayAccountsFragment; import fr.gouv.etalab.mastodon.fragments.DisplayDraftsFragment; import fr.gouv.etalab.mastodon.fragments.DisplayFollowRequestSentFragment; @@ -126,8 +120,6 @@ public abstract class BaseMainActivity extends AppCompatActivity private HashMap tagItem = new HashMap<>(); private TextView toolbarTitle; private SearchView toolbar_search; - private ImageLoader imageLoader; - private DisplayImageOptions options; private View headerLayout; public static String currentLocale; private TabLayout tabLayout; @@ -589,18 +581,6 @@ public abstract class BaseMainActivity extends AppCompatActivity return; } //Image loader configuration - imageLoader = ImageLoader.getInstance(); - File cacheDir = new File(getCacheDir(), getString(R.string.app_name)); - ImageLoaderConfiguration configImg = new ImageLoaderConfiguration.Builder(this) - .imageDownloader(new PatchBaseImageDownloader(getApplicationContext())) - .threadPoolSize(5) - .threadPriority(Thread.MIN_PRIORITY + 3) - .denyCacheImageMultipleSizesInMemory() - .diskCache(new UnlimitedDiskCache(cacheDir)) - .build(); - imageLoader.init(configImg); - options = new DisplayImageOptions.Builder().displayer(new RoundedBitmapDisplayer(20)).cacheInMemory(false) - .cacheOnDisk(true).resetViewBeforeLoading(true).build(); final DrawerLayout drawer = findViewById(R.id.drawer_layout); @@ -758,7 +738,7 @@ public abstract class BaseMainActivity extends AppCompatActivity startActivity(intent); } }); - updateHeaderAccountInfo(BaseMainActivity.this, account, headerLayout, imageLoader, options); + updateHeaderAccountInfo(BaseMainActivity.this, account, headerLayout); //Locked account can see follow request if (account.isLocked()) { navigationView.getMenu().findItem(R.id.nav_follow_request).setVisible(true); @@ -1365,7 +1345,7 @@ public abstract class BaseMainActivity extends AppCompatActivity String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); SQLiteDatabase db = Sqlite.getInstance(BaseMainActivity.this, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); Account account = new AccountDAO(getApplicationContext(), db).getAccountByID(userId); - updateHeaderAccountInfo(BaseMainActivity.this, account, headerLayout, imageLoader, options); + updateHeaderAccountInfo(BaseMainActivity.this, account, headerLayout); } } diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/activities/EditProfileActivity.java b/app/src/main/java/fr/gouv/etalab/mastodon/activities/EditProfileActivity.java index 54f61a38f..eeea9a210 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/activities/EditProfileActivity.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/activities/EditProfileActivity.java @@ -49,17 +49,13 @@ import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; -import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache; -import com.nostra13.universalimageloader.core.DisplayImageOptions; -import com.nostra13.universalimageloader.core.ImageLoader; -import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; -import com.nostra13.universalimageloader.core.assist.FailReason; -import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer; -import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.SimpleTarget; +import com.bumptech.glide.request.transition.Transition; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; -import java.io.File; import java.io.FileNotFoundException; import java.io.InputStream; @@ -69,7 +65,6 @@ import fr.gouv.etalab.mastodon.asynctasks.UpdateCredentialAsyncTask; import fr.gouv.etalab.mastodon.client.APIResponse; import fr.gouv.etalab.mastodon.client.Entities.Account; import fr.gouv.etalab.mastodon.client.Entities.Error; -import fr.gouv.etalab.mastodon.client.PatchBaseImageDownloader; import fr.gouv.etalab.mastodon.helper.Helper; import fr.gouv.etalab.mastodon.interfaces.OnRetrieveAccountInterface; import fr.gouv.etalab.mastodon.interfaces.OnUpdateCredentialInterface; @@ -92,8 +87,6 @@ public class EditProfileActivity extends AppCompatActivity implements OnRetrieve private ImageView set_profile_picture, set_header_picture; private Button set_change_profile_picture, set_change_header_picture, set_profile_save; private TextView set_header_picture_overlay; - private ImageLoader imageLoader; - private DisplayImageOptions options; private static final int PICK_IMAGE_HEADER = 4565; private static final int PICK_IMAGE_PROFILE = 6545; private String profile_picture, header_picture, profile_username, profile_note; @@ -144,40 +137,25 @@ public class EditProfileActivity extends AppCompatActivity implements OnRetrieve if( url.startsWith("/") ){ url = "https://" + Helper.getLiveInstance(getApplicationContext()) + account.getAvatar(); } - ImageLoader imageLoader = ImageLoader.getInstance(); - File cacheDir = new File(getCacheDir(), getString(R.string.app_name)); - ImageLoaderConfiguration configImg = new ImageLoaderConfiguration.Builder(this) - .imageDownloader(new PatchBaseImageDownloader(getApplicationContext())) - .threadPoolSize(5) - .threadPriority(Thread.MIN_PRIORITY + 3) - .denyCacheImageMultipleSizesInMemory() - .diskCache(new UnlimitedDiskCache(cacheDir)) - .build(); - this.imageLoader = ImageLoader.getInstance(); - this.options = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) - .cacheOnDisk(true).resetViewBeforeLoading(true).build(); - imageLoader.init(configImg); - DisplayImageOptions options = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) - .cacheOnDisk(true).resetViewBeforeLoading(true).build(); - imageLoader.loadImage(url, options, new SimpleImageLoadingListener(){ - @Override - public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { - super.onLoadingComplete(imageUri, view, loadedImage); - BitmapDrawable ppDrawable = new BitmapDrawable(getResources(), Bitmap.createScaledBitmap(loadedImage, (int) Helper.convertDpToPixel(25, getApplicationContext()), (int) Helper.convertDpToPixel(25, getApplicationContext()), true)); - if( pp_actionBar != null){ - pp_actionBar.setImageDrawable(ppDrawable); - } else if( getSupportActionBar() != null){ + Glide.with(getApplicationContext()) + .asBitmap() + .load(url) + .into(new SimpleTarget() { + @Override + public void onResourceReady(Bitmap resource, Transition transition) { + BitmapDrawable ppDrawable = new BitmapDrawable(getResources(), Bitmap.createScaledBitmap(resource, (int) Helper.convertDpToPixel(25, getApplicationContext()), (int) Helper.convertDpToPixel(25, getApplicationContext()), true)); + if( pp_actionBar != null){ + pp_actionBar.setImageDrawable(ppDrawable); + } else if( getSupportActionBar() != null){ - getSupportActionBar().setIcon(ppDrawable); - getSupportActionBar().setDisplayShowHomeEnabled(true); - } - } - @Override - public void onLoadingFailed(java.lang.String imageUri, android.view.View view, FailReason failReason){ + getSupportActionBar().setIcon(ppDrawable); + getSupportActionBar().setDisplayShowHomeEnabled(true); + } + } + }); - }}); set_profile_name = findViewById(R.id.set_profile_name); set_profile_description = findViewById(R.id.set_profile_description); @@ -317,9 +295,12 @@ public class EditProfileActivity extends AppCompatActivity implements OnRetrieve } }); - imageLoader.displayImage(account.getAvatar(), set_profile_picture, options); - imageLoader.displayImage(account.getHeader(), set_header_picture, options); - + Glide.with(getApplicationContext()) + .load(account.getAvatar()) + .into(set_profile_picture); + Glide.with(getApplicationContext()) + .load(account.getHeader()) + .into(set_header_picture); if( account.getHeader() == null || account.getHeader().contains("missing.png")) set_header_picture_overlay.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/activities/InstanceHealthActivity.java b/app/src/main/java/fr/gouv/etalab/mastodon/activities/InstanceHealthActivity.java index e25fc6116..8c4ee801d 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/activities/InstanceHealthActivity.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/activities/InstanceHealthActivity.java @@ -29,7 +29,6 @@ import android.graphics.drawable.BitmapDrawable; import android.net.Uri; import android.os.Build; import android.os.Bundle; -import android.support.annotation.RequiresApi; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.text.SpannableString; @@ -42,24 +41,19 @@ import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; -import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache; -import com.nostra13.universalimageloader.core.DisplayImageOptions; -import com.nostra13.universalimageloader.core.ImageLoader; -import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; -import com.nostra13.universalimageloader.core.assist.FailReason; -import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer; -import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.SimpleTarget; +import com.bumptech.glide.request.transition.Transition; import org.json.JSONObject; -import java.io.File; import java.util.HashMap; import fr.gouv.etalab.mastodon.R; import fr.gouv.etalab.mastodon.client.API; import fr.gouv.etalab.mastodon.client.Entities.InstanceSocial; import fr.gouv.etalab.mastodon.client.HttpsConnection; -import fr.gouv.etalab.mastodon.client.PatchBaseImageDownloader; import fr.gouv.etalab.mastodon.helper.Helper; import static fr.gouv.etalab.mastodon.helper.Helper.withSuffix; @@ -74,8 +68,6 @@ public class InstanceHealthActivity extends AppCompatActivity { private InstanceSocial instanceSocial; private TextView name, values, checked_at, up, uptime; - private ImageLoader imageLoader; - private DisplayImageOptions option; private String instance; private LinearLayout container; @@ -121,18 +113,6 @@ public class InstanceHealthActivity extends AppCompatActivity { } }); - option = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) - .cacheOnDisk(true).resetViewBeforeLoading(true).build(); - imageLoader = ImageLoader.getInstance(); - File cacheDir = new File(getCacheDir(), getString(R.string.app_name)); - ImageLoaderConfiguration configImg = new ImageLoaderConfiguration.Builder(this) - .imageDownloader(new PatchBaseImageDownloader(getApplicationContext())) - .threadPoolSize(5) - .threadPriority(Thread.MIN_PRIORITY + 3) - .denyCacheImageMultipleSizesInMemory() - .diskCache(new UnlimitedDiskCache(cacheDir)) - .build(); - imageLoader.init(configImg); checkInstance(); } @@ -165,26 +145,27 @@ public class InstanceHealthActivity extends AppCompatActivity { @SuppressLint({"SetTextI18n", "DefaultLocale"}) public void run() { if( instanceSocial.getThumbnail() != null && !instanceSocial.getThumbnail().equals("null")) - imageLoader.loadImage(instanceSocial.getThumbnail(), option, new SimpleImageLoadingListener() { - @RequiresApi(Build.VERSION_CODES.JELLY_BEAN) - @Override - public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { - super.onLoadingComplete(imageUri, view, loadedImage); - Bitmap workingBitmap = Bitmap.createBitmap(loadedImage); - Bitmap mutableBitmap = workingBitmap.copy(Bitmap.Config.ARGB_8888, true); - Canvas canvas = new Canvas(mutableBitmap); - Paint p = new Paint(Color.BLACK); - ColorFilter filter = new LightingColorFilter(0xFF7F7F7F, 0x00000000); - p.setColorFilter(filter); - canvas.drawBitmap(mutableBitmap, new Matrix(), p); - BitmapDrawable background = new BitmapDrawable(getResources(), mutableBitmap); - container.setBackground(background); - - } - @Override - public void onLoadingFailed(java.lang.String imageUri, android.view.View view, FailReason failReason) { - } - }); + Glide.with(getApplicationContext()) + .asBitmap() + .load(instanceSocial.getThumbnail()) + .into(new SimpleTarget() { + @Override + public void onResourceReady(Bitmap resource, Transition transition) { + Bitmap workingBitmap = Bitmap.createBitmap(resource); + Bitmap mutableBitmap = workingBitmap.copy(Bitmap.Config.ARGB_8888, true); + Canvas canvas = new Canvas(mutableBitmap); + Paint p = new Paint(Color.BLACK); + ColorFilter filter = new LightingColorFilter(0xFF7F7F7F, 0x00000000); + p.setColorFilter(filter); + canvas.drawBitmap(mutableBitmap, new Matrix(), p); + BitmapDrawable background = new BitmapDrawable(getResources(), mutableBitmap); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + container.setBackground(background); + }else{ + container.setBackgroundDrawable(background); + } + } + }); name.setText(instanceSocial.getName()); if( instanceSocial.isUp()) { up.setText("Is up!"); diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/activities/MediaActivity.java b/app/src/main/java/fr/gouv/etalab/mastodon/activities/MediaActivity.java index ce3497eb4..094480faf 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/activities/MediaActivity.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/activities/MediaActivity.java @@ -26,6 +26,7 @@ import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Handler; +import android.support.annotation.Nullable; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.ActionBar; @@ -41,22 +42,22 @@ import android.widget.MediaController; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.VideoView; + +import com.bumptech.glide.Glide; +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.SimpleTarget; +import com.bumptech.glide.request.target.Target; +import com.bumptech.glide.request.transition.Transition; import com.github.chrisbanes.photoview.OnMatrixChangedListener; import com.github.chrisbanes.photoview.PhotoView; -import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache; -import com.nostra13.universalimageloader.core.DisplayImageOptions; -import com.nostra13.universalimageloader.core.ImageLoader; -import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; -import com.nostra13.universalimageloader.core.assist.FailReason; -import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer; -import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; import java.io.File; import java.util.ArrayList; import fr.gouv.etalab.mastodon.R; import fr.gouv.etalab.mastodon.client.Entities.Attachment; import fr.gouv.etalab.mastodon.client.Entities.Error; import fr.gouv.etalab.mastodon.client.HttpsConnection; -import fr.gouv.etalab.mastodon.client.PatchBaseImageDownloader; import fr.gouv.etalab.mastodon.helper.Helper; import fr.gouv.etalab.mastodon.interfaces.OnDownloadInterface; @@ -80,8 +81,6 @@ public class MediaActivity extends AppCompatActivity implements OnDownloadInterf private float downX; private int mediaPosition; MediaActivity.actionSwipe currentAction; - private ImageLoader imageLoader; - private DisplayImageOptions options; static final int MIN_DISTANCE = 100; private String finalUrlDownload; private String preview_url; @@ -211,18 +210,6 @@ public class MediaActivity extends AppCompatActivity implements OnDownloadInterf setTitle(""); isHiding = false; - imageLoader = ImageLoader.getInstance(); - File cacheDir = new File(getCacheDir(), getString(R.string.app_name)); - ImageLoaderConfiguration configImg = new ImageLoaderConfiguration.Builder(this) - .imageDownloader(new PatchBaseImageDownloader(getApplicationContext())) - .threadPoolSize(5) - .threadPriority(Thread.MIN_PRIORITY + 3) - .denyCacheImageMultipleSizesInMemory() - .diskCache(new UnlimitedDiskCache(cacheDir)) - .build(); - imageLoader.init(configImg); - options = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) - .cacheOnDisk(true).resetViewBeforeLoading(true).build(); setTitle(""); displayMediaAtPosition(actionSwipe.POP); } @@ -321,22 +308,31 @@ public class MediaActivity extends AppCompatActivity implements OnDownloadInterf final String finalUrl = url; switch (type){ case "image": + Glide.with(getApplicationContext()) + .asBitmap() + .load(url) + .listener(new RequestListener() { - imageLoader.displayImage(url, imageView, options, new SimpleImageLoadingListener(){ - @Override - public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { - super.onLoadingComplete(imageUri, view, loadedImage); - loader.setVisibility(View.GONE); - imageView.setVisibility(View.VISIBLE); - downloadedImage = loadedImage; - fileVideo = null; - } - @Override - public void onLoadingFailed(java.lang.String imageUri, android.view.View view, FailReason failReason){ - imageLoader.displayImage(finalUrl, imageView, options); - loader.setVisibility(View.GONE); - } - }); + @Override + public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { + loader.setVisibility(View.GONE); + return false; + } + + @Override + public boolean onResourceReady(Object resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { + return false; + } + }) + .into(new SimpleTarget() { + @Override + public void onResourceReady(Bitmap resource, Transition transition) { + loader.setVisibility(View.GONE); + imageView.setVisibility(View.VISIBLE); + downloadedImage = resource; + fileVideo = null; + } + }); break; case "video": case "gifv": diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/activities/RemoteFollowActivity.java b/app/src/main/java/fr/gouv/etalab/mastodon/activities/RemoteFollowActivity.java index 4863f456c..22a6f1fb0 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/activities/RemoteFollowActivity.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/activities/RemoteFollowActivity.java @@ -44,19 +44,15 @@ import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; -import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache; -import com.nostra13.universalimageloader.core.DisplayImageOptions; -import com.nostra13.universalimageloader.core.ImageLoader; -import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; -import com.nostra13.universalimageloader.core.assist.FailReason; -import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer; -import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.SimpleTarget; +import com.bumptech.glide.request.transition.Transition; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; -import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -71,7 +67,6 @@ import fr.gouv.etalab.mastodon.client.Entities.Error; import fr.gouv.etalab.mastodon.client.Entities.Relationship; import fr.gouv.etalab.mastodon.client.Entities.Results; import fr.gouv.etalab.mastodon.client.HttpsConnection; -import fr.gouv.etalab.mastodon.client.PatchBaseImageDownloader; import fr.gouv.etalab.mastodon.drawers.AccountSearchDevAdapter; import fr.gouv.etalab.mastodon.helper.ExpandableHeightListView; import fr.gouv.etalab.mastodon.helper.Helper; @@ -152,35 +147,22 @@ public class RemoteFollowActivity extends AppCompatActivity implements OnRetriev if( url.startsWith("/") ){ url = "https://" + Helper.getLiveInstance(getApplicationContext()) + account.getAvatar(); } - ImageLoader imageLoader = ImageLoader.getInstance(); - File cacheDir = new File(getCacheDir(), getString(R.string.app_name)); - ImageLoaderConfiguration configImg = new ImageLoaderConfiguration.Builder(this) - .imageDownloader(new PatchBaseImageDownloader(getApplicationContext())) - .threadPoolSize(5) - .threadPriority(Thread.MIN_PRIORITY + 3) - .denyCacheImageMultipleSizesInMemory() - .diskCache(new UnlimitedDiskCache(cacheDir)) - .build(); - imageLoader.init(configImg); - DisplayImageOptions options = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) - .cacheOnDisk(true).resetViewBeforeLoading(true).build(); - imageLoader.loadImage(url, options, new SimpleImageLoadingListener(){ - @Override - public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { - super.onLoadingComplete(imageUri, view, loadedImage); - BitmapDrawable ppDrawable = new BitmapDrawable(getResources(), Bitmap.createScaledBitmap(loadedImage, (int) Helper.convertDpToPixel(25, getApplicationContext()), (int) Helper.convertDpToPixel(25, getApplicationContext()), true)); - if( pp_actionBar != null){ - pp_actionBar.setImageDrawable(ppDrawable); - } else if( getSupportActionBar() != null){ + Glide.with(getApplicationContext()) + .asBitmap() + .load(url) + .into(new SimpleTarget() { + @Override + public void onResourceReady(Bitmap resource, Transition transition) { + BitmapDrawable ppDrawable = new BitmapDrawable(getResources(), Bitmap.createScaledBitmap(resource, (int) Helper.convertDpToPixel(25, getApplicationContext()), (int) Helper.convertDpToPixel(25, getApplicationContext()), true)); + if( pp_actionBar != null){ + pp_actionBar.setImageDrawable(ppDrawable); + } else if( getSupportActionBar() != null){ - getSupportActionBar().setIcon(ppDrawable); - getSupportActionBar().setDisplayShowHomeEnabled(true); - } - } - @Override - public void onLoadingFailed(String imageUri, View view, FailReason failReason){ - - }}); + getSupportActionBar().setIcon(ppDrawable); + getSupportActionBar().setDisplayShowHomeEnabled(true); + } + } + }); rf_instance.addTextChangedListener(new TextWatcher() { diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/activities/ShowAccountActivity.java b/app/src/main/java/fr/gouv/etalab/mastodon/activities/ShowAccountActivity.java index 8a8fa5fec..c41473b99 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/activities/ShowAccountActivity.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/activities/ShowAccountActivity.java @@ -31,7 +31,6 @@ import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; -import android.support.annotation.RequiresApi; import android.support.design.widget.AppBarLayout; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.TabLayout; @@ -57,17 +56,11 @@ import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; -import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache; -import com.nostra13.universalimageloader.core.DisplayImageOptions; -import com.nostra13.universalimageloader.core.ImageLoader; -import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; -import com.nostra13.universalimageloader.core.assist.FailReason; -import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer; -import com.nostra13.universalimageloader.core.listener.ImageLoadingListener; -import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.SimpleTarget; +import com.bumptech.glide.request.transition.Transition; -import java.io.File; import java.util.ArrayList; import java.util.List; @@ -83,8 +76,6 @@ import fr.gouv.etalab.mastodon.client.APIResponse; import fr.gouv.etalab.mastodon.client.Entities.Account; import fr.gouv.etalab.mastodon.client.Entities.Error; import fr.gouv.etalab.mastodon.client.Entities.Status; -import fr.gouv.etalab.mastodon.client.HttpsConnection; -import fr.gouv.etalab.mastodon.client.PatchBaseImageDownloader; import fr.gouv.etalab.mastodon.drawers.StatusListAdapter; import fr.gouv.etalab.mastodon.fragments.DisplayAccountsFragment; import fr.gouv.etalab.mastodon.fragments.DisplayStatusFragment; @@ -107,8 +98,6 @@ import static fr.gouv.etalab.mastodon.helper.Helper.withSuffix; public class ShowAccountActivity extends AppCompatActivity implements OnPostActionInterface, OnRetrieveAccountInterface, OnRetrieveFeedsAccountInterface, OnRetrieveRelationshipInterface, OnRetrieveFeedsInterface { - private ImageLoader imageLoader; - private DisplayImageOptions options; private List statuses; private StatusListAdapter statusListAdapter; private FloatingActionButton account_follow; @@ -177,24 +166,14 @@ public class ShowAccountActivity extends AppCompatActivity implements OnPostActi accountUrl = null; showMediaOnly = false; showPinned = false; - imageLoader = ImageLoader.getInstance(); - File cacheDir = new File(getCacheDir(), getString(R.string.app_name)); - ImageLoaderConfiguration configImg = new ImageLoaderConfiguration.Builder(this) - .imageDownloader(new PatchBaseImageDownloader(getApplicationContext())) - .threadPoolSize(5) - .threadPriority(Thread.MIN_PRIORITY + 3) - .denyCacheImageMultipleSizesInMemory() - .diskCache(new UnlimitedDiskCache(cacheDir)) - .build(); - imageLoader.init(configImg); + statuses = new ArrayList<>(); boolean isOnWifi = Helper.isOnWIFI(getApplicationContext()); int behaviorWithAttachments = sharedpreferences.getInt(Helper.SET_ATTACHMENT_ACTION, Helper.ATTACHMENT_ALWAYS); int positionSpinnerTrans = sharedpreferences.getInt(Helper.SET_TRANSLATOR, Helper.TRANS_YANDEX); statusListAdapter = new StatusListAdapter(getApplicationContext(), RetrieveFeedsAsyncTask.Type.USER, accountId, isOnWifi, behaviorWithAttachments, positionSpinnerTrans, this.statuses); - options = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) - .cacheOnDisk(true).resetViewBeforeLoading(true).build(); + @@ -436,30 +415,25 @@ public class ShowAccountActivity extends AppCompatActivity implements OnPostActi } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN && !urlHeader.contains("missing.png")) { - DisplayImageOptions optionNew = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) - .cacheOnDisk(true).resetViewBeforeLoading(true).build(); - imageLoader.loadImage(urlHeader, optionNew, new SimpleImageLoadingListener() { - @RequiresApi(Build.VERSION_CODES.JELLY_BEAN) - @Override - public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { - super.onLoadingComplete(imageUri, view, loadedImage); - ImageView banner_pp = findViewById(R.id.banner_pp); - Bitmap workingBitmap = Bitmap.createBitmap(loadedImage); - Bitmap mutableBitmap = workingBitmap.copy(Bitmap.Config.ARGB_8888, true); - Canvas canvas = new Canvas(mutableBitmap); - Paint p = new Paint(Color.BLACK); - ColorFilter filter = new LightingColorFilter(0xFF7F7F7F, 0x00000000); - p.setColorFilter(filter); - canvas.drawBitmap(mutableBitmap, new Matrix(), p); - BitmapDrawable background = new BitmapDrawable(getResources(), mutableBitmap); - banner_pp.setImageDrawable(background); - } + Glide.with(getApplicationContext()) + .asBitmap() + .load(urlHeader) + .into(new SimpleTarget() { + @Override + public void onResourceReady(Bitmap resource, Transition transition) { + ImageView banner_pp = findViewById(R.id.banner_pp); + Bitmap workingBitmap = Bitmap.createBitmap(resource); + Bitmap mutableBitmap = workingBitmap.copy(Bitmap.Config.ARGB_8888, true); + Canvas canvas = new Canvas(mutableBitmap); + Paint p = new Paint(Color.BLACK); + ColorFilter filter = new LightingColorFilter(0xFF7F7F7F, 0x00000000); + p.setColorFilter(filter); + canvas.drawBitmap(mutableBitmap, new Matrix(), p); + BitmapDrawable background = new BitmapDrawable(getResources(), mutableBitmap); + banner_pp.setImageDrawable(background); + } + }); - @Override - public void onLoadingFailed(String imageUri, View view, FailReason failReason) { - - } - }); } //Redraws icon for locked accounts final float scale = getResources().getDisplayMetrics().density; @@ -481,21 +455,19 @@ public class ShowAccountActivity extends AppCompatActivity implements OnPostActi if( url.startsWith("/") ){ url = "https://" + Helper.getLiveInstance(getApplicationContext()) + account.getAvatar(); } - DisplayImageOptions optionsPP = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) - .cacheOnDisk(true).resetViewBeforeLoading(true).build(); - imageLoader.loadImage(url, optionsPP, new SimpleImageLoadingListener(){ - @Override - public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { - super.onLoadingComplete(imageUri, view, loadedImage); - BitmapDrawable ppDrawable = new BitmapDrawable(getResources(), Bitmap.createScaledBitmap(loadedImage, (int) Helper.convertDpToPixel(25, getApplicationContext()), (int) Helper.convertDpToPixel(25, getApplicationContext()), true)); - if( pp_actionBar != null){ - pp_actionBar.setImageDrawable(ppDrawable); - } - } - @Override - public void onLoadingFailed(String imageUri, View view, FailReason failReason){ + Glide.with(getApplicationContext()) + .asBitmap() + .load(url) + .into(new SimpleTarget() { + @Override + public void onResourceReady(Bitmap resource, Transition transition) { + BitmapDrawable ppDrawable = new BitmapDrawable(getResources(), Bitmap.createScaledBitmap(resource, (int) Helper.convertDpToPixel(25, getApplicationContext()), (int) Helper.convertDpToPixel(25, getApplicationContext()), true)); + if( pp_actionBar != null){ + pp_actionBar.setImageDrawable(ppDrawable); + } + } + }); - }}); final AppBarLayout appBar = findViewById(R.id.appBar); maxScrollSize = appBar.getTotalScrollRange(); @@ -642,8 +614,9 @@ public class ShowAccountActivity extends AppCompatActivity implements OnPostActi } - imageLoader.displayImage(account.getAvatar(), account_pp, options); - + Glide.with(getApplicationContext()) + .load(account.getAvatar()) + .into(account_pp); } diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/activities/ShowConversationActivity.java b/app/src/main/java/fr/gouv/etalab/mastodon/activities/ShowConversationActivity.java index 7066f31d2..04c148eb8 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/activities/ShowConversationActivity.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/activities/ShowConversationActivity.java @@ -39,15 +39,11 @@ import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; -import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache; -import com.nostra13.universalimageloader.core.DisplayImageOptions; -import com.nostra13.universalimageloader.core.ImageLoader; -import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; -import com.nostra13.universalimageloader.core.assist.FailReason; -import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer; -import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; -import java.io.File; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.SimpleTarget; +import com.bumptech.glide.request.transition.Transition; + import java.util.ArrayList; import java.util.List; @@ -59,7 +55,6 @@ import fr.gouv.etalab.mastodon.client.Entities.Account; import fr.gouv.etalab.mastodon.client.Entities.Context; import fr.gouv.etalab.mastodon.client.Entities.Error; import fr.gouv.etalab.mastodon.client.Entities.Status; -import fr.gouv.etalab.mastodon.client.PatchBaseImageDownloader; import fr.gouv.etalab.mastodon.drawers.StatusListAdapter; import fr.gouv.etalab.mastodon.helper.Helper; import fr.gouv.etalab.mastodon.interfaces.OnRetrieveContextInterface; @@ -146,35 +141,22 @@ public class ShowConversationActivity extends AppCompatActivity implements OnRet if( url.startsWith("/") ){ url = "https://" + Helper.getLiveInstance(getApplicationContext()) + account.getAvatar(); } - ImageLoader imageLoader = ImageLoader.getInstance(); - File cacheDir = new File(getCacheDir(), getString(R.string.app_name)); - ImageLoaderConfiguration configImg = new ImageLoaderConfiguration.Builder(this) - .imageDownloader(new PatchBaseImageDownloader(getApplicationContext())) - .threadPoolSize(5) - .threadPriority(Thread.MIN_PRIORITY + 3) - .denyCacheImageMultipleSizesInMemory() - .diskCache(new UnlimitedDiskCache(cacheDir)) - .build(); - imageLoader.init(configImg); - DisplayImageOptions options = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) - .cacheOnDisk(true).resetViewBeforeLoading(true).build(); - imageLoader.loadImage(url, options, new SimpleImageLoadingListener(){ - @Override - public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { - super.onLoadingComplete(imageUri, view, loadedImage); - BitmapDrawable ppDrawable = new BitmapDrawable(getResources(), Bitmap.createScaledBitmap(loadedImage, (int) Helper.convertDpToPixel(25, getApplicationContext()), (int) Helper.convertDpToPixel(25, getApplicationContext()), true)); - if( pp_actionBar != null){ - pp_actionBar.setImageDrawable(ppDrawable); - } else if( getSupportActionBar() != null){ + Glide.with(getApplicationContext()) + .asBitmap() + .load(url) + .into(new SimpleTarget() { + @Override + public void onResourceReady(Bitmap resource, Transition transition) { + BitmapDrawable ppDrawable = new BitmapDrawable(getResources(), Bitmap.createScaledBitmap(resource, (int) Helper.convertDpToPixel(25, getApplicationContext()), (int) Helper.convertDpToPixel(25, getApplicationContext()), true)); + if( pp_actionBar != null){ + pp_actionBar.setImageDrawable(ppDrawable); + } else if( getSupportActionBar() != null){ - getSupportActionBar().setIcon(ppDrawable); - getSupportActionBar().setDisplayShowHomeEnabled(true); - } - } - @Override - public void onLoadingFailed(java.lang.String imageUri, android.view.View view, FailReason failReason){ - - }}); + getSupportActionBar().setIcon(ppDrawable); + getSupportActionBar().setDisplayShowHomeEnabled(true); + } + } + }); Bundle b = getIntent().getExtras(); if(b != null) diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/activities/TootActivity.java b/app/src/main/java/fr/gouv/etalab/mastodon/activities/TootActivity.java index 93608d8c1..08e305d21 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/activities/TootActivity.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/activities/TootActivity.java @@ -82,22 +82,18 @@ import android.widget.TextView; import android.widget.TimePicker; import android.widget.Toast; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.SimpleTarget; +import com.bumptech.glide.request.transition.Transition; import com.github.stom79.localepicker.CountryPicker; import com.github.stom79.localepicker.CountryPickerListener; import com.github.stom79.mytransl.MyTransL; import com.github.stom79.mytransl.client.HttpsConnectionException; import com.github.stom79.mytransl.translate.Translate; -import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache; -import com.nostra13.universalimageloader.core.DisplayImageOptions; -import com.nostra13.universalimageloader.core.ImageLoader; -import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; -import com.nostra13.universalimageloader.core.assist.FailReason; -import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer; -import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; + import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; -import java.io.File; import java.io.FileNotFoundException; import java.io.InputStream; import java.util.ArrayList; @@ -131,7 +127,6 @@ import fr.gouv.etalab.mastodon.interfaces.OnDownloadInterface; import fr.gouv.etalab.mastodon.interfaces.OnRetrieveEmojiInterface; import fr.gouv.etalab.mastodon.sqlite.CustomEmojiDAO; import fr.gouv.etalab.mastodon.client.Entities.Version; -import fr.gouv.etalab.mastodon.client.PatchBaseImageDownloader; import fr.gouv.etalab.mastodon.drawers.AccountsReplyAdapter; import fr.gouv.etalab.mastodon.drawers.AccountsSearchAdapter; import fr.gouv.etalab.mastodon.drawers.DraftsListAdapter; @@ -163,8 +158,6 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc private String visibility; private final int PICK_IMAGE = 56556; private ImageButton toot_picture; - private ImageLoader imageLoader; - private DisplayImageOptions options; private LinearLayout toot_picture_container; private ArrayList attachments; private boolean isSensitive = false; @@ -236,18 +229,7 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc //By default the toot is not restored so the id -1 is defined currentToId = -1; boolean restoredScheduled = false; - imageLoader = ImageLoader.getInstance(); - File cacheDir = new File(getCacheDir(), getString(R.string.app_name)); - ImageLoaderConfiguration configImg = new ImageLoaderConfiguration.Builder(this) - .imageDownloader(new PatchBaseImageDownloader(getApplicationContext())) - .threadPoolSize(5) - .threadPriority(Thread.MIN_PRIORITY + 3) - .denyCacheImageMultipleSizesInMemory() - .diskCache(new UnlimitedDiskCache(cacheDir)) - .build(); - imageLoader.init(configImg); - options = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) - .cacheOnDisk(true).resetViewBeforeLoading(true).build(); + toot_it = findViewById(R.id.toot_it); Button toot_cw = findViewById(R.id.toot_cw); @@ -363,23 +345,23 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc if( url.startsWith("/") ){ url = "https://" + Helper.getLiveInstance(getApplicationContext()) + account.getAvatar(); } - imageLoader.loadImage(url, options, new SimpleImageLoadingListener(){ - @Override - public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { - super.onLoadingComplete(imageUri, view, loadedImage); - BitmapDrawable ppDrawable = new BitmapDrawable(getResources(), Bitmap.createScaledBitmap(loadedImage, (int) Helper.convertDpToPixel(25, getApplicationContext()), (int) Helper.convertDpToPixel(25, getApplicationContext()), true)); - if( pp_actionBar != null){ - pp_actionBar.setImageDrawable(ppDrawable); - } else if( getSupportActionBar() != null){ + Glide.with(getApplicationContext()) + .asBitmap() + .load(url) + .into(new SimpleTarget() { + @Override + public void onResourceReady(Bitmap resource, Transition transition) { + BitmapDrawable ppDrawable = new BitmapDrawable(getResources(), Bitmap.createScaledBitmap(resource, (int) Helper.convertDpToPixel(25, getApplicationContext()), (int) Helper.convertDpToPixel(25, getApplicationContext()), true)); + if( pp_actionBar != null){ + pp_actionBar.setImageDrawable(ppDrawable); + } else if( getSupportActionBar() != null){ - getSupportActionBar().setIcon(ppDrawable); - getSupportActionBar().setDisplayShowHomeEnabled(true); - } - } - @Override - public void onLoadingFailed(java.lang.String imageUri, android.view.View view, FailReason failReason){ + getSupportActionBar().setIcon(ppDrawable); + getSupportActionBar().setDisplayShowHomeEnabled(true); + } + } + }); - }}); if( sharedContent != null ){ //Shared content @@ -1221,7 +1203,9 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc final ImageView imageView = new ImageView(getApplicationContext()); imageView.setId(Integer.parseInt(attachment.getId())); - imageLoader.displayImage(url, imageView, options); + Glide.with(getApplicationContext()) + .load(url) + .into(imageView); LinearLayout.LayoutParams imParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT); imParams.setMargins(20, 5, 20, 5); imParams.height = (int) Helper.convertDpToPixel(100, getApplicationContext()); @@ -1725,7 +1709,9 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc url = attachment.getUrl(); final ImageView imageView = new ImageView(getApplicationContext()); imageView.setId(Integer.parseInt(attachment.getId())); - imageLoader.displayImage(url, imageView, options); + Glide.with(getApplicationContext()) + .load(url) + .into(imageView); LinearLayout.LayoutParams imParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT); imParams.setMargins(20, 5, 20, 5); imParams.height = (int) Helper.convertDpToPixel(100, getApplicationContext()); 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 9d899fea4..1fcd2d872 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 @@ -16,15 +16,9 @@ package fr.gouv.etalab.mastodon.client; import android.content.Context; import android.content.SharedPreferences; import android.os.Build; -import android.support.v7.app.AppCompatActivity; import android.text.Html; import android.text.SpannableString; -import android.widget.ImageView; -import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache; -import com.nostra13.universalimageloader.core.DisplayImageOptions; -import com.nostra13.universalimageloader.core.ImageLoader; -import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; import org.json.JSONObject; import java.io.BufferedInputStream; @@ -42,8 +36,6 @@ import java.net.HttpURLConnection; import java.net.URL; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; -import java.util.Calendar; -import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/client/PatchBaseImageDownloader.java b/app/src/main/java/fr/gouv/etalab/mastodon/client/PatchBaseImageDownloader.java deleted file mode 100644 index 274a60505..000000000 --- a/app/src/main/java/fr/gouv/etalab/mastodon/client/PatchBaseImageDownloader.java +++ /dev/null @@ -1,147 +0,0 @@ -package fr.gouv.etalab.mastodon.client; -/* Copyright 2017 Thomas Schneider - * - * This file is a part of Mastalab - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 3 of the - * License, or (at your option) any later version. - * - * Mastalab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General - * Public License for more details. - * - * You should have received a copy of the GNU General Public License along with Mastalab; if not, - * see . */ -import android.annotation.SuppressLint; -import android.content.Context; - -import com.nostra13.universalimageloader.core.assist.ContentLengthInputStream; -import com.nostra13.universalimageloader.core.download.BaseImageDownloader; - -import java.io.BufferedInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.HttpURLConnection; -import java.net.InetAddress; -import java.net.Socket; -import java.security.cert.CertificateException; -import java.security.cert.X509Certificate; - -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSocket; -import javax.net.ssl.SSLSocketFactory; -import javax.net.ssl.TrustManager; -import javax.net.ssl.X509TrustManager; - -/** - * Created by Thomas on 21/05/2017. - * Patch for universal image loader to support TLS 1.1+ - */ - -public class PatchBaseImageDownloader extends BaseImageDownloader { - - private SSLSocketFactory sf; - public PatchBaseImageDownloader(Context context) { - super(context); - - initSSLSocketFactory(); - } - - private void initSSLSocketFactory() { - sf = (SSLSocketFactory) SSLSocketFactory.getDefault(); - try { - sf = new MySSLSocketFactory(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Override - public InputStream getStreamFromNetwork(String imageUri, Object extra) throws IOException { - HttpURLConnection conn = createConnection(imageUri, extra); - if (conn instanceof HttpsURLConnection) { - ((HttpsURLConnection) conn).setSSLSocketFactory(sf); - } - try { - return new ContentLengthInputStream(new BufferedInputStream(conn.getInputStream(), BUFFER_SIZE), conn.getContentLength()); - }catch (Exception e){ - return null; - } - - } - - private static class MySSLSocketFactory extends SSLSocketFactory { - SSLContext sslContext = SSLContext.getInstance("TLS"); - - MySSLSocketFactory() throws Exception { - super(); - TrustManager tm = new X509TrustManager() { - @SuppressLint("TrustAllX509TrustManager") - public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { - } - - @SuppressLint("TrustAllX509TrustManager") - public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { - } - - public X509Certificate[] getAcceptedIssuers() { - return null; - } - }; - - sslContext.init(null, new TrustManager[]{tm}, null); - } - - @Override - public String[] getDefaultCipherSuites() { - return new String[0]; - } - - @Override - public String[] getSupportedCipherSuites() { - return new String[0]; - } - - - @Override - public Socket createSocket(String host, int port) throws IOException { - return enableTLSOnSocket(sslContext.getSocketFactory().createSocket(host, port)); - } - - @Override - public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException { - return enableTLSOnSocket(sslContext.getSocketFactory().createSocket(host, port, localHost, localPort)); - } - - @Override - public Socket createSocket(InetAddress host, int port) throws IOException { - return enableTLSOnSocket(sslContext.getSocketFactory().createSocket(host, port)); - } - - @Override - public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException { - return enableTLSOnSocket(sslContext.getSocketFactory().createSocket(address, port, localAddress, localPort)); - } - - @Override - public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException { - return enableTLSOnSocket(sslContext.getSocketFactory().createSocket(socket, host, port, autoClose)); - } - - @Override - public Socket createSocket() throws IOException { - return enableTLSOnSocket(sslContext.getSocketFactory().createSocket()); - } - - private Socket enableTLSOnSocket(Socket socket) { - if(socket != null && (socket instanceof SSLSocket)) { - ((SSLSocket)socket).setEnabledProtocols(new String[] {"TLSv1.1", "TLSv1.2"}); - } - return socket; - } - - } - -} \ No newline at end of file diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountSearchDevAdapter.java b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountSearchDevAdapter.java index 8283c6c41..abfdf2bc5 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountSearchDevAdapter.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountSearchDevAdapter.java @@ -32,13 +32,9 @@ import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; -import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache; -import com.nostra13.universalimageloader.core.DisplayImageOptions; -import com.nostra13.universalimageloader.core.ImageLoader; -import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; -import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer; -import java.io.File; +import com.bumptech.glide.Glide; + import java.util.List; import fr.gouv.etalab.mastodon.R; @@ -47,7 +43,6 @@ import fr.gouv.etalab.mastodon.asynctasks.PostActionAsyncTask; import fr.gouv.etalab.mastodon.client.API; import fr.gouv.etalab.mastodon.client.Entities.Account; import fr.gouv.etalab.mastodon.client.Entities.Error; -import fr.gouv.etalab.mastodon.client.PatchBaseImageDownloader; import fr.gouv.etalab.mastodon.helper.Helper; import fr.gouv.etalab.mastodon.interfaces.OnPostActionInterface; @@ -91,19 +86,7 @@ public class AccountSearchDevAdapter extends BaseAdapter implements OnPostAction @Override public View getView(final int position, View convertView, ViewGroup parent) { - ImageLoader imageLoader = ImageLoader.getInstance(); - File cacheDir = new File(context.getCacheDir(), context.getString(R.string.app_name)); - ImageLoaderConfiguration configImg = new ImageLoaderConfiguration.Builder(context) - .imageDownloader(new PatchBaseImageDownloader(context)) - .threadPoolSize(5) - .threadPriority(Thread.MIN_PRIORITY + 3) - .denyCacheImageMultipleSizesInMemory() - .diskCache(new UnlimitedDiskCache(cacheDir)) - .build(); - if( !imageLoader.isInited()) - imageLoader.init(configImg); - DisplayImageOptions options = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) - .cacheOnDisk(true).resetViewBeforeLoading(true).build(); + final Account account = accounts.get(position); if (convertView == null) { @@ -141,8 +124,9 @@ public class AccountSearchDevAdapter extends BaseAdapter implements OnPostAction } Helper.changeDrawableColor(context, R.drawable.ic_lock_outline,R.color.mastodonC4); //Profile picture - imageLoader.displayImage(account.getAvatar(), holder.account_pp, options); - + Glide.with(context) + .load(account.getAvatar()) + .into(holder.account_pp); if( account.isFollowing()){ holder.account_follow.setVisibility(View.GONE); }else{ diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountsFollowRequestAdapter.java b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountsFollowRequestAdapter.java index 5a281009e..c15457127 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountsFollowRequestAdapter.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountsFollowRequestAdapter.java @@ -31,9 +31,8 @@ import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; -import com.nostra13.universalimageloader.core.DisplayImageOptions; -import com.nostra13.universalimageloader.core.ImageLoader; -import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer; + +import com.bumptech.glide.Glide; import java.util.ArrayList; import java.util.List; @@ -56,18 +55,13 @@ public class AccountsFollowRequestAdapter extends RecyclerView.Adapter implement private List accounts; private LayoutInflater layoutInflater; - private ImageLoader imageLoader; - private DisplayImageOptions options; private Context context; private AccountsFollowRequestAdapter accountsFollowRequestAdapter; public AccountsFollowRequestAdapter(Context context, List accounts){ this.accounts = accounts; layoutInflater = LayoutInflater.from(context); - imageLoader = ImageLoader.getInstance(); this.context = context; - options = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) - .cacheOnDisk(true).resetViewBeforeLoading(true).build(); accountsFollowRequestAdapter = this; } @@ -86,7 +80,9 @@ public class AccountsFollowRequestAdapter extends RecyclerView.Adapter implement holder.btn_reject.getBackground().setColorFilter(ContextCompat.getColor(context, R.color.red_1), PorterDuff.Mode.MULTIPLY); holder.account_un.setText(String.format("@%s", account.getUsername())); //Profile picture - imageLoader.displayImage(account.getAvatar(), holder.account_pp, options); + Glide.with(context) + .load(account.getAvatar()) + .into(holder.account_pp); holder.account_pp.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountsListAdapter.java b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountsListAdapter.java index c0e00aac2..d5354ebde 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountsListAdapter.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountsListAdapter.java @@ -31,12 +31,9 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; -import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache; -import com.nostra13.universalimageloader.core.DisplayImageOptions; -import com.nostra13.universalimageloader.core.ImageLoader; -import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; -import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer; -import java.io.File; + +import com.bumptech.glide.Glide; + import java.util.ArrayList; import java.util.List; @@ -45,7 +42,6 @@ import fr.gouv.etalab.mastodon.asynctasks.RetrieveAccountsAsyncTask; import fr.gouv.etalab.mastodon.client.API; import fr.gouv.etalab.mastodon.client.Entities.Account; import fr.gouv.etalab.mastodon.client.Entities.Error; -import fr.gouv.etalab.mastodon.client.PatchBaseImageDownloader; import fr.gouv.etalab.mastodon.helper.Helper; import fr.gouv.etalab.mastodon.interfaces.OnPostActionInterface; import fr.gouv.etalab.mastodon.activities.ShowAccountActivity; @@ -88,19 +84,6 @@ public class AccountsListAdapter extends RecyclerView.Adapter implements OnPostA @Override public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { final AccountsListAdapter.ViewHolder holder = (AccountsListAdapter.ViewHolder) viewHolder; - ImageLoader imageLoader = ImageLoader.getInstance(); - File cacheDir = new File(context.getCacheDir(), context.getString(R.string.app_name)); - ImageLoaderConfiguration configImg = new ImageLoaderConfiguration.Builder(context) - .imageDownloader(new PatchBaseImageDownloader(context)) - .threadPoolSize(5) - .threadPriority(Thread.MIN_PRIORITY + 3) - .denyCacheImageMultipleSizesInMemory() - .diskCache(new UnlimitedDiskCache(cacheDir)) - .build(); - if( !imageLoader.isInited()) - imageLoader.init(configImg); - DisplayImageOptions options = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) - .cacheOnDisk(true).resetViewBeforeLoading(true).build(); final Account account = accounts.get(position); @@ -166,9 +149,9 @@ public class AccountsListAdapter extends RecyclerView.Adapter implements OnPostA holder.account_fgc.setText(withSuffix(account.getFollowing_count())); holder.account_frc.setText(withSuffix(account.getFollowers_count())); //Profile picture - imageLoader.displayImage(account.getAvatar(), holder.account_pp, options); - - + Glide.with(context) + .load(account.getAvatar()) + .into(holder.account_pp); if( account.isMakingAction()){ holder.account_follow.setEnabled(false); diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountsReplyAdapter.java b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountsReplyAdapter.java index 947d767d9..da8fc1dd4 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountsReplyAdapter.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountsReplyAdapter.java @@ -26,9 +26,9 @@ import android.widget.CompoundButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; -import com.nostra13.universalimageloader.core.DisplayImageOptions; -import com.nostra13.universalimageloader.core.ImageLoader; -import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer; + +import com.bumptech.glide.Glide; + import java.util.List; import fr.gouv.etalab.mastodon.R; @@ -45,8 +45,6 @@ public class AccountsReplyAdapter extends BaseAdapter{ private List accounts; private LayoutInflater layoutInflater; - private ImageLoader imageLoader; - private DisplayImageOptions options; private boolean[] checked; private Context context; @@ -54,9 +52,6 @@ public class AccountsReplyAdapter extends BaseAdapter{ this.accounts = accounts; this.context = context; layoutInflater = LayoutInflater.from(context); - imageLoader = ImageLoader.getInstance(); - options = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) - .cacheOnDisk(true).resetViewBeforeLoading(true).build(); this.checked = checked; } @@ -113,8 +108,9 @@ public class AccountsReplyAdapter extends BaseAdapter{ } }); //Profile picture - imageLoader.displayImage(account.getAvatar(), holder.account_pp, options); - + Glide.with(context) + .load(account.getAvatar()) + .into(holder.account_pp); return convertView; } diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountsSearchAdapter.java b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountsSearchAdapter.java index 87cba4582..72e74c0f8 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountsSearchAdapter.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/AccountsSearchAdapter.java @@ -29,9 +29,8 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; -import com.nostra13.universalimageloader.core.DisplayImageOptions; -import com.nostra13.universalimageloader.core.ImageLoader; -import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer; + +import com.bumptech.glide.Glide; import java.util.ArrayList; import java.util.List; @@ -53,8 +52,6 @@ public class AccountsSearchAdapter extends ArrayAdapter implements Filt private List accounts, tempAccounts, suggestions ; private LayoutInflater layoutInflater; - private ImageLoader imageLoader; - private DisplayImageOptions options; private boolean owner; private Context context; @@ -65,9 +62,6 @@ public class AccountsSearchAdapter extends ArrayAdapter implements Filt this.tempAccounts = new ArrayList<>(accounts); this.suggestions = new ArrayList<>(accounts); layoutInflater = LayoutInflater.from(context); - imageLoader = ImageLoader.getInstance(); - options = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) - .cacheOnDisk(true).resetViewBeforeLoading(true).build(); this.owner = false; } public AccountsSearchAdapter(Context context, List accounts, boolean owner){ @@ -77,9 +71,6 @@ public class AccountsSearchAdapter extends ArrayAdapter implements Filt this.tempAccounts = new ArrayList<>(accounts); this.suggestions = new ArrayList<>(accounts); layoutInflater = LayoutInflater.from(context); - imageLoader = ImageLoader.getInstance(); - options = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) - .cacheOnDisk(true).resetViewBeforeLoading(true).build(); this.owner = owner; } @@ -133,8 +124,9 @@ public class AccountsSearchAdapter extends ArrayAdapter implements Filt holder.account_dn.setVisibility(View.VISIBLE); } //Profile picture - imageLoader.displayImage(account.getAvatar(), holder.account_pp, options); - + Glide.with(context) + .load(account.getAvatar()) + .into(holder.account_pp); return convertView; } diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/CustomEmojiAdapter.java b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/CustomEmojiAdapter.java index 9bcf4be5e..2b98cc6d6 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/CustomEmojiAdapter.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/CustomEmojiAdapter.java @@ -25,20 +25,14 @@ import android.widget.ArrayAdapter; import android.widget.GridView; import android.widget.ImageView; -import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache; -import com.nostra13.universalimageloader.core.DisplayImageOptions; -import com.nostra13.universalimageloader.core.ImageLoader; -import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; -import com.nostra13.universalimageloader.core.assist.FailReason; -import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer; -import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; -import java.io.File; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.SimpleTarget; +import com.bumptech.glide.request.transition.Transition; + import java.util.List; import fr.gouv.etalab.mastodon.client.Entities.Emojis; -import fr.gouv.etalab.mastodon.client.PatchBaseImageDownloader; -import fr.gouv.etalab.mastodon.R; /** * Created by Thomas on 03/11/2017. @@ -86,31 +80,16 @@ public class CustomEmojiAdapter extends ArrayAdapter { } else { imageView = (ImageView) convertView; } - ImageLoader imageLoader = ImageLoader.getInstance(); - File cacheDir = new File(context.getCacheDir(), context.getString(R.string.app_name)); - ImageLoaderConfiguration configImg = new ImageLoaderConfiguration.Builder(context) - .imageDownloader(new PatchBaseImageDownloader(context)) - .threadPoolSize(5) - .threadPriority(Thread.MIN_PRIORITY + 3) - .denyCacheImageMultipleSizesInMemory() - .diskCache(new UnlimitedDiskCache(cacheDir)) - .build(); - DisplayImageOptions optionNew = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) - .cacheOnDisk(true).resetViewBeforeLoading(true).build(); - if( !imageLoader.isInited()) - imageLoader.init(configImg); - imageLoader.loadImage(emoji.getUrl(), optionNew, new SimpleImageLoadingListener() { - @Override - public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { - super.onLoadingComplete(imageUri, view, loadedImage); - BitmapDrawable icon = new BitmapDrawable(context.getResources(), loadedImage); - imageView.setImageDrawable(icon); - } - - @Override - public void onLoadingFailed(String imageUri, View view, FailReason failReason) { - } - }); + Glide.with(context) + .asBitmap() + .load(emoji.getUrl()) + .into(new SimpleTarget() { + @Override + public void onResourceReady(Bitmap resource, Transition transition) { + BitmapDrawable icon = new BitmapDrawable(context.getResources(), resource); + imageView.setImageDrawable(icon); + } + }); return imageView; } diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/EmojisSearchAdapter.java b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/EmojisSearchAdapter.java index 6e1ea2d87..64717f3ce 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/EmojisSearchAdapter.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/EmojisSearchAdapter.java @@ -26,9 +26,8 @@ import android.widget.Filterable; import android.widget.ImageView; import android.widget.TextView; -import com.nostra13.universalimageloader.core.DisplayImageOptions; -import com.nostra13.universalimageloader.core.ImageLoader; -import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer; + +import com.bumptech.glide.Glide; import java.util.ArrayList; import java.util.List; @@ -46,18 +45,15 @@ public class EmojisSearchAdapter extends ArrayAdapter implements Filtera private List emojis, tempEmojis, suggestions ; private LayoutInflater layoutInflater; - private ImageLoader imageLoader; - private DisplayImageOptions options; + private Context context; public EmojisSearchAdapter(Context context, List emojis){ super(context, android.R.layout.simple_list_item_1, emojis); this.emojis = emojis; + this.context = context; this.tempEmojis = new ArrayList<>(emojis); this.suggestions = new ArrayList<>(emojis); layoutInflater = LayoutInflater.from(context); - imageLoader = ImageLoader.getInstance(); - options = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) - .cacheOnDisk(true).resetViewBeforeLoading(true).build(); } @@ -95,8 +91,9 @@ public class EmojisSearchAdapter extends ArrayAdapter implements Filtera holder.emoji_shortcode.setText(String.format("%s", emoji.getShortcode())); //Profile picture - imageLoader.displayImage(emoji.getUrl(), holder.emoji_icon, options); - + Glide.with(context) + .load(emoji.getUrl()) + .into(holder.emoji_icon); return convertView; } diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/NotificationsListAdapter.java b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/NotificationsListAdapter.java index b52004aca..8293d3775 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/NotificationsListAdapter.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/NotificationsListAdapter.java @@ -48,9 +48,8 @@ import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; -import com.nostra13.universalimageloader.core.DisplayImageOptions; -import com.nostra13.universalimageloader.core.ImageLoader; -import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer; + +import com.bumptech.glide.Glide; import java.io.File; import java.io.FileOutputStream; @@ -92,8 +91,6 @@ public class NotificationsListAdapter extends RecyclerView.Adapter implements On private Context context; private List notifications; private LayoutInflater layoutInflater; - private ImageLoader imageLoader; - private DisplayImageOptions options; private NotificationsListAdapter notificationsListAdapter; private int behaviorWithAttachments; private boolean isOnWifi; @@ -103,12 +100,9 @@ public class NotificationsListAdapter extends RecyclerView.Adapter implements On this.context = context; this.notifications = notifications; layoutInflater = LayoutInflater.from(this.context); - imageLoader = ImageLoader.getInstance(); notificationsListAdapter = this; this.isOnWifi = isOnWifi; this.behaviorWithAttachments = behaviorWithAttachments; - options = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) - .cacheOnDisk(true).resetViewBeforeLoading(true).build(); } @@ -681,7 +675,9 @@ public class NotificationsListAdapter extends RecyclerView.Adapter implements On } //Profile picture - imageLoader.displayImage(notification.getAccount().getAvatar(), holder.notification_account_profile, options); + Glide.with(context) + .load(notification.getAccount().getAvatar()) + .into(holder.notification_account_profile); } @@ -880,7 +876,9 @@ public class NotificationsListAdapter extends RecyclerView.Adapter implements On if( url == null || url.trim().equals("")) url = attachment.getUrl(); if( !url.trim().contains("missing.png")) - imageLoader.displayImage(url, imageView, options); + Glide.with(context) + .load(url) + .into(imageView); final int finalPosition = position; imageView.setOnClickListener(new View.OnClickListener() { @Override diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/SearchListAdapter.java b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/SearchListAdapter.java index 06c495f03..5c5d7ee4e 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/SearchListAdapter.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/SearchListAdapter.java @@ -31,13 +31,9 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; -import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache; -import com.nostra13.universalimageloader.core.DisplayImageOptions; -import com.nostra13.universalimageloader.core.ImageLoader; -import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; -import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer; -import java.io.File; +import com.bumptech.glide.Glide; + import java.util.ArrayList; import java.util.List; @@ -46,7 +42,6 @@ import fr.gouv.etalab.mastodon.activities.ShowAccountActivity; import fr.gouv.etalab.mastodon.activities.ShowConversationActivity; import fr.gouv.etalab.mastodon.client.Entities.Account; import fr.gouv.etalab.mastodon.client.Entities.Status; -import fr.gouv.etalab.mastodon.client.PatchBaseImageDownloader; import fr.gouv.etalab.mastodon.helper.Helper; import fr.gouv.etalab.mastodon.R; @@ -114,19 +109,6 @@ public class SearchListAdapter extends BaseAdapter { @Override public View getView(final int position, View convertView, ViewGroup parent) { - ImageLoader imageLoader = ImageLoader.getInstance(); - File cacheDir = new File(context.getCacheDir(), context.getString(R.string.app_name)); - ImageLoaderConfiguration configImg = new ImageLoaderConfiguration.Builder(context) - .imageDownloader(new PatchBaseImageDownloader(context)) - .threadPoolSize(5) - .threadPriority(Thread.MIN_PRIORITY + 3) - .denyCacheImageMultipleSizesInMemory() - .diskCache(new UnlimitedDiskCache(cacheDir)) - .build(); - if( !imageLoader.isInited()) - imageLoader.init(configImg); - DisplayImageOptions options = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) - .cacheOnDisk(true).resetViewBeforeLoading(true).build(); int type = getItemViewType(position); if( type == STATUS_TYPE){ View v = convertView; @@ -203,8 +185,9 @@ public class SearchListAdapter extends BaseAdapter { holder.status_content.setAutoLinkMask(Linkify.WEB_URLS); holder.status_toot_date.setText(Helper.dateDiff(context, status.getCreated_at())); - imageLoader.displayImage(ppurl, holder.status_account_profile, options); - + Glide.with(context) + .load(ppurl) + .into(holder.status_account_profile); holder.status_account_profile.setOnClickListener(new View.OnClickListener() { @Override @@ -258,8 +241,9 @@ public class SearchListAdapter extends BaseAdapter { holder.account_fgc.setText(String.valueOf(account.getFollowing_count())); holder.account_frc.setText(String.valueOf(account.getFollowers_count())); //Profile picture - imageLoader.displayImage(account.getAvatar(), holder.account_pp, options); - + Glide.with(context) + .load(account.getAvatar()) + .into(holder.account_pp); holder.main_container.setOnClickListener(new View.OnClickListener() { @Override diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java index eba67d13a..f5f0883c2 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java @@ -56,18 +56,11 @@ import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; +import com.bumptech.glide.Glide; import com.github.stom79.mytransl.MyTransL; import com.github.stom79.mytransl.client.HttpsConnectionException; import com.github.stom79.mytransl.client.Results; import com.github.stom79.mytransl.translate.Translate; -import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache; -import com.nostra13.universalimageloader.core.DisplayImageOptions; -import com.nostra13.universalimageloader.core.ImageLoader; -import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; -import com.nostra13.universalimageloader.core.assist.FailReason; -import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer; -import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer; -import com.nostra13.universalimageloader.core.listener.ImageLoadingListener; import java.io.File; @@ -91,8 +84,6 @@ import fr.gouv.etalab.mastodon.client.Entities.Attachment; import fr.gouv.etalab.mastodon.client.Entities.Emojis; import fr.gouv.etalab.mastodon.client.Entities.Error; import fr.gouv.etalab.mastodon.client.Entities.Status; -import fr.gouv.etalab.mastodon.client.HttpsConnection; -import fr.gouv.etalab.mastodon.client.PatchBaseImageDownloader; import fr.gouv.etalab.mastodon.helper.CrossActions; import fr.gouv.etalab.mastodon.helper.Helper; import fr.gouv.etalab.mastodon.interfaces.OnPostActionInterface; @@ -114,7 +105,6 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct private Context context; private List statuses; private LayoutInflater layoutInflater; - private ImageLoader imageLoader; private boolean isOnWifi; private int translator; private int behaviorWithAttachments; @@ -376,19 +366,6 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct if( viewHolder.getItemViewType() == DISPLAYED_STATUS){ final ViewHolder holder = (ViewHolder) viewHolder; final Status status = statuses.get(position); - imageLoader = ImageLoader.getInstance(); - File cacheDir = new File(context.getCacheDir(), context.getString(R.string.app_name)); - ImageLoaderConfiguration configImg = new ImageLoaderConfiguration.Builder(context) - .imageDownloader(new PatchBaseImageDownloader(context)) - .threadPoolSize(5) - .threadPriority(Thread.MIN_PRIORITY + 3) - .denyCacheImageMultipleSizesInMemory() - .diskCache(new UnlimitedDiskCache(cacheDir)) - .build(); - if( !imageLoader.isInited()) - imageLoader.init(configImg); - final DisplayImageOptions options = new DisplayImageOptions.Builder().displayer(new RoundedBitmapDisplayer(10)).cacheInMemory(false) - .cacheOnDisk(true).resetViewBeforeLoading(true).build(); final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); //Retrieves replies @@ -426,7 +403,6 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct ImageView imageView = new ImageView(context); imageView.setMaxHeight((int) Helper.convertDpToPixel(30, context)); imageView.setMaxWidth((int) Helper.convertDpToPixel(30, context)); - imageLoader.displayImage(replies.getAccount().getAvatar(), imageView, options); LinearLayout.LayoutParams imParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); imParams.setMargins(10, 5, 10, 5); imParams.height = (int) Helper.convertDpToPixel(30, context); @@ -615,13 +591,19 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct if( status.getReblog() != null) { - imageLoader.displayImage(ppurl, holder.status_account_profile_boost, options); - imageLoader.displayImage(status.getAccount().getAvatar(), holder.status_account_profile_boost_by, options); + Glide.with(context) + .load(ppurl) + .into(holder.status_account_profile_boost); + Glide.with(context) + .load(status.getAccount().getAvatar()) + .into(holder.status_account_profile_boost_by); holder.status_account_profile_boost.setVisibility(View.VISIBLE); holder.status_account_profile_boost_by.setVisibility(View.VISIBLE); holder.status_account_profile.setVisibility(View.GONE); }else{ - imageLoader.displayImage(ppurl, holder.status_account_profile, options); + Glide.with(context) + .load(ppurl) + .into(holder.status_account_profile); holder.status_account_profile_boost.setVisibility(View.GONE); holder.status_account_profile_boost_by.setVisibility(View.GONE); holder.status_account_profile.setVisibility(View.VISIBLE); @@ -1270,10 +1252,10 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct url = attachment.getUrl(); else if( attachment.getType().equals("unknown")) url = attachment.getRemote_url(); - DisplayImageOptions optionsAttachment = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) - .cacheOnDisk(true).resetViewBeforeLoading(true).build(); if( !url.trim().contains("missing.png")) - imageLoader.displayImage(url, imageView, optionsAttachment); + Glide.with(context) + .load(url) + .into(imageView); final int finalPosition = position; if( attachment.getDescription() != null && !attachment.getDescription().equals("null")) imageView.setContentDescription(attachment.getDescription()); diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/helper/Helper.java b/app/src/main/java/fr/gouv/etalab/mastodon/helper/Helper.java index 17a653b28..f649a4c0d 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/helper/Helper.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/helper/Helper.java @@ -25,7 +25,7 @@ import android.graphics.Color; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.RectF; -import android.support.annotation.RequiresApi; +import android.support.annotation.Nullable; import android.support.v4.graphics.drawable.DrawableCompat; import android.support.v7.app.AlertDialog; import android.app.DownloadManager; @@ -38,7 +38,6 @@ import android.content.SharedPreferences; import android.content.res.Resources; import android.database.sqlite.SQLiteDatabase; import android.graphics.Bitmap; -import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.LightingColorFilter; @@ -85,18 +84,14 @@ import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; +import com.bumptech.glide.Glide; +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.SimpleTarget; +import com.bumptech.glide.request.target.Target; +import com.bumptech.glide.request.transition.Transition; import com.google.gson.Gson; -import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache; -import com.nostra13.universalimageloader.core.DisplayImageOptions; -import com.nostra13.universalimageloader.core.ImageLoader; -import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; -import com.nostra13.universalimageloader.core.assist.FailReason; -import com.nostra13.universalimageloader.core.assist.ImageSize; -import com.nostra13.universalimageloader.core.assist.ViewScaleType; -import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer; -import com.nostra13.universalimageloader.core.imageaware.NonViewAware; -import com.nostra13.universalimageloader.core.listener.ImageLoadingListener; -import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; @@ -137,7 +132,6 @@ import fr.gouv.etalab.mastodon.client.Entities.Emojis; import fr.gouv.etalab.mastodon.client.Entities.Mention; import fr.gouv.etalab.mastodon.client.Entities.Results; import fr.gouv.etalab.mastodon.client.Entities.Status; -import fr.gouv.etalab.mastodon.client.PatchBaseImageDownloader; import fr.gouv.etalab.mastodon.interfaces.OnRetrieveEmojiInterface; import fr.gouv.etalab.mastodon.sqlite.AccountDAO; import fr.gouv.etalab.mastodon.sqlite.Sqlite; @@ -746,31 +740,17 @@ public class Helper { Uri uri = Uri.parse("file://" + file.getAbsolutePath()); intent.setDataAndType(uri, getMimeType(url)); - DisplayImageOptions options = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) - .cacheOnDisk(true).resetViewBeforeLoading(true).build(); - ImageLoader imageLoaderNoty = ImageLoader.getInstance(); - File cacheDir = new File(context.getCacheDir(), context.getString(R.string.app_name)); - ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context) - .imageDownloader(new PatchBaseImageDownloader(context)) - .threadPoolSize(5) - .threadPriority(Thread.MIN_PRIORITY + 3) - .denyCacheImageMultipleSizesInMemory() - .diskCache(new UnlimitedDiskCache(cacheDir)) - .build(); - imageLoaderNoty.init(config); - imageLoaderNoty.loadImage(preview_url, options, new SimpleImageLoadingListener(){ - @Override - public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { - super.onLoadingComplete(imageUri, view, loadedImage); - notify_user(context, intent, notificationIdTmp, loadedImage, context.getString(R.string.save_over), context.getString(R.string.download_from, fileName)); - Toast.makeText(context, R.string.toast_saved,Toast.LENGTH_LONG).show(); - } - @Override - public void onLoadingFailed(java.lang.String imageUri, android.view.View view, FailReason failReason){ - notify_user(context, intent, notificationIdTmp, BitmapFactory.decodeResource(context.getResources(), - R.drawable.ic_save_white), context.getString(R.string.save_over), context.getString(R.string.download_from, fileName)); - Toast.makeText(context, R.string.toast_saved,Toast.LENGTH_LONG).show(); - }}); + + Glide.with(context) + .asBitmap() + .load(preview_url) + .into(new SimpleTarget() { + @Override + public void onResourceReady(Bitmap resource, Transition transition) { + notify_user(context, intent, notificationIdTmp, resource, context.getString(R.string.save_over), context.getString(R.string.download_from, fileName)); + Toast.makeText(context, R.string.toast_saved,Toast.LENGTH_LONG).show(); + } + }); } catch (Exception e) { e.printStackTrace(); } @@ -879,35 +859,23 @@ public class Helper { if( currentSubmenu == null) continue; final MenuItem item = currentSubmenu.add("@" + account.getAcct()); - ImageLoader imageLoader; - DisplayImageOptions options = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) - .cacheOnDisk(true).resetViewBeforeLoading(true).build(); - imageLoader = ImageLoader.getInstance(); + final ImageView imageView = new ImageView(activity); item.setIcon(R.drawable.ic_person); String url = account.getAvatar(); if( url.startsWith("/") ){ url = "https://" + Helper.getLiveInstance(activity) + account.getAvatar(); } - imageLoader.displayImage(url, imageView, options, new ImageLoadingListener() { - @Override - public void onLoadingStarted(String s, View view) { - } - - @Override - public void onLoadingFailed(String s, View view, FailReason failReason) { - } - - @Override - public void onLoadingComplete(String s, View view, Bitmap bitmap) { - item.setIcon(new BitmapDrawable(activity.getResources(), bitmap)); - item.getIcon().setColorFilter(0xFFFFFFFF, PorterDuff.Mode.MULTIPLY); - } - - @Override - public void onLoadingCancelled(String s, View view) { - } - }); + Glide.with(activity.getApplicationContext()) + .asBitmap() + .load(url) + .into(new SimpleTarget() { + @Override + public void onResourceReady(Bitmap resource, Transition transition) { + item.setIcon(new BitmapDrawable(activity.getResources(), resource)); + item.getIcon().setColorFilter(0xFFFFFFFF, PorterDuff.Mode.MULTIPLY); + } + }); item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @Override @@ -1029,26 +997,21 @@ public class Helper { * @param url String the url of the profile picture */ public static void loadPictureIcon(final Activity activity, String url, final ImageView imageView){ - ImageLoader imageLoader; - DisplayImageOptions options = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) - .cacheOnDisk(true).resetViewBeforeLoading(true).build(); - imageLoader = ImageLoader.getInstance(); if( url.startsWith("/") ){ url = "https://" + Helper.getLiveInstance(activity) + url; } - imageLoader.loadImage(url, options, new SimpleImageLoadingListener(){ - @SuppressWarnings("ConstantConditions") - @Override - public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { - super.onLoadingComplete(imageUri, view, loadedImage); - Resources res = activity.getResources(); - BitmapDrawable icon = new BitmapDrawable(res, getRoundedCornerBitmap(loadedImage, 20)); - imageView.setImageDrawable(icon); - } - @Override - public void onLoadingFailed(java.lang.String imageUri, android.view.View view, FailReason failReason){ - }}); + Glide.with(activity.getApplicationContext()) + .asBitmap() + .load(url) + .into(new SimpleTarget() { + @Override + public void onResourceReady(Bitmap resource, Transition transition) { + Resources res = activity.getResources(); + BitmapDrawable icon = new BitmapDrawable(res, getRoundedCornerBitmap(resource, 20)); + imageView.setImageDrawable(icon); + } + }); } @@ -1057,10 +1020,8 @@ public class Helper { * @param activity Activity * @param account Account - new account in use * @param headerLayout View - the menu header - * @param imageLoader ImageLoader - instance of ImageLoader - * @param options DisplayImageOptions - current configuration of ImageLoader */ - public static void updateHeaderAccountInfo(final Activity activity, final Account account, final View headerLayout, ImageLoader imageLoader, DisplayImageOptions options){ + public static void updateHeaderAccountInfo(final Activity activity, final Account account, final View headerLayout){ ImageView profilePicture = headerLayout.findViewById(R.id.profilePicture); TextView username = headerLayout.findViewById(R.id.username); @@ -1078,38 +1039,37 @@ public class Helper { if( url.startsWith("/") ){ url = "https://" + Helper.getLiveInstance(activity) + account.getAvatar(); } - imageLoader.displayImage(url, profilePicture, options); + Glide.with(activity) + .load(url) + .into(profilePicture); String urlHeader = account.getHeader(); if( urlHeader.startsWith("/") ){ urlHeader = "https://" + Helper.getLiveInstance(activity) + account.getHeader(); } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN && !urlHeader.contains("missing.png")) { - DisplayImageOptions optionNew = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) - .cacheOnDisk(true).resetViewBeforeLoading(true).build(); - imageLoader.loadImage(urlHeader, optionNew, new SimpleImageLoadingListener() { - @RequiresApi(Build.VERSION_CODES.JELLY_BEAN) - @Override - public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { - super.onLoadingComplete(imageUri, view, loadedImage); - LinearLayout main_header_container = headerLayout.findViewById(R.id.main_header_container); - Bitmap workingBitmap = Bitmap.createBitmap(loadedImage); - Bitmap mutableBitmap = workingBitmap.copy(Bitmap.Config.ARGB_8888, true); - Canvas canvas = new Canvas(mutableBitmap); - Paint p = new Paint(Color.BLACK); - ColorFilter filter = new LightingColorFilter(0xFF7F7F7F, 0x00000000); - p.setColorFilter(filter); - canvas.drawBitmap(mutableBitmap, new Matrix(), p); - BitmapDrawable background = new BitmapDrawable(activity.getResources(), mutableBitmap); - main_header_container.setBackground(background); + if (!urlHeader.contains("missing.png")) { - } - - @Override - public void onLoadingFailed(java.lang.String imageUri, android.view.View view, FailReason failReason) { - LinearLayout main_header_container = headerLayout.findViewById(R.id.main_header_container); - main_header_container.setBackgroundResource(R.drawable.side_nav_bar); - } - }); + Glide.with(activity.getApplicationContext()) + .asBitmap() + .load(urlHeader) + .into(new SimpleTarget() { + @Override + public void onResourceReady(Bitmap resource, Transition transition) { + LinearLayout main_header_container = headerLayout.findViewById(R.id.main_header_container); + Bitmap workingBitmap = Bitmap.createBitmap(resource); + Bitmap mutableBitmap = workingBitmap.copy(Bitmap.Config.ARGB_8888, true); + Canvas canvas = new Canvas(mutableBitmap); + Paint p = new Paint(Color.BLACK); + ColorFilter filter = new LightingColorFilter(0xFF7F7F7F, 0x00000000); + p.setColorFilter(filter); + canvas.drawBitmap(mutableBitmap, new Matrix(), p); + BitmapDrawable background = new BitmapDrawable(activity.getResources(), mutableBitmap); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + main_header_container.setBackground(background); + }else { + main_header_container.setBackgroundDrawable(background); + } + } + }); } } profilePicture.setOnClickListener(null); @@ -1232,39 +1192,49 @@ public class Helper { if( emojis != null && emojis.size() > 0 ) { final int[] i = {0}; - ImageLoader imageLoader; - DisplayImageOptions options = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) - .cacheOnDisk(true).resetViewBeforeLoading(true).build(); - imageLoader = ImageLoader.getInstance(); + for (final Emojis emoji : emojis) { - NonViewAware imageAware = new NonViewAware(new ImageSize(50, 50), ViewScaleType.CROP); - imageLoader.displayImage(emoji.getUrl(), imageAware, options, new SimpleImageLoadingListener() { - @Override - public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { - super.onLoadingComplete(imageUri, view, loadedImage); - final String targetedEmoji = ":" + emoji.getShortcode() + ":"; - if (spannableString.toString().contains(targetedEmoji)) { - //emojis can be used several times so we have to loop - for (int startPosition = -1; (startPosition = spannableString.toString().indexOf(targetedEmoji, startPosition + 1)) != -1; startPosition++) { - final int endPosition = startPosition + targetedEmoji.length(); - spannableString.setSpan( - new ImageSpan(context, - Bitmap.createScaledBitmap(loadedImage, (int) Helper.convertDpToPixel(20, context), - (int) Helper.convertDpToPixel(20, context), false)), startPosition, - endPosition, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); + + + Glide.with(context) + .asBitmap() + .load(emoji.getUrl()) + .listener(new RequestListener() { + + @Override + public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { + i[0]++; + if( i[0] == (emojis.size())) + listener.onRetrieveEmoji(status, spannableString, false); + return false; } - } - i[0]++; - if( i[0] == (emojis.size())) - listener.onRetrieveEmoji(status, spannableString, false); - } - @Override - public void onLoadingFailed(java.lang.String imageUri, android.view.View view, FailReason failReason) { - i[0]++; - if( i[0] == (emojis.size())) - listener.onRetrieveEmoji(status, spannableString, false); - } - }); + + @Override + public boolean onResourceReady(Object resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { + return false; + } + }) + .into(new SimpleTarget() { + @Override + public void onResourceReady(Bitmap resource, Transition transition) { + final String targetedEmoji = ":" + emoji.getShortcode() + ":"; + if (spannableString.toString().contains(targetedEmoji)) { + //emojis can be used several times so we have to loop + for (int startPosition = -1; (startPosition = spannableString.toString().indexOf(targetedEmoji, startPosition + 1)) != -1; startPosition++) { + final int endPosition = startPosition + targetedEmoji.length(); + spannableString.setSpan( + new ImageSpan(context, + Bitmap.createScaledBitmap(resource, (int) Helper.convertDpToPixel(20, context), + (int) Helper.convertDpToPixel(20, context), false)), startPosition, + endPosition, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); + } + } + i[0]++; + if( i[0] == (emojis.size())) + listener.onRetrieveEmoji(status, spannableString, false); + } + }); + } diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/jobs/HomeTimelineSyncJob.java b/app/src/main/java/fr/gouv/etalab/mastodon/jobs/HomeTimelineSyncJob.java index 916155fff..f66a688d7 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/jobs/HomeTimelineSyncJob.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/jobs/HomeTimelineSyncJob.java @@ -22,20 +22,19 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.support.annotation.NonNull; -import android.view.View; +import android.support.annotation.Nullable; +import com.bumptech.glide.Glide; +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.SimpleTarget; +import com.bumptech.glide.request.target.Target; +import com.bumptech.glide.request.transition.Transition; import com.evernote.android.job.Job; import com.evernote.android.job.JobManager; import com.evernote.android.job.JobRequest; -import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache; -import com.nostra13.universalimageloader.core.DisplayImageOptions; -import com.nostra13.universalimageloader.core.ImageLoader; -import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; -import com.nostra13.universalimageloader.core.assist.FailReason; -import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer; -import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; -import java.io.File; import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; @@ -46,7 +45,6 @@ import fr.gouv.etalab.mastodon.asynctasks.RetrieveHomeTimelineServiceAsyncTask; import fr.gouv.etalab.mastodon.client.APIResponse; import fr.gouv.etalab.mastodon.client.Entities.Account; import fr.gouv.etalab.mastodon.client.Entities.Status; -import fr.gouv.etalab.mastodon.client.PatchBaseImageDownloader; import fr.gouv.etalab.mastodon.helper.Helper; import fr.gouv.etalab.mastodon.interfaces.OnRetrieveHomeTimelineServiceInterface; import fr.gouv.etalab.mastodon.sqlite.AccountDAO; @@ -158,18 +156,7 @@ public class HomeTimelineSyncJob extends Job implements OnRetrieveHomeTimelineSe final int notificationId = ((notif_id + 2) > 2147483647) ? (int) (2147483647 - notif_id - 2) : (int) (notif_id + 2); if( notificationUrl != null){ - ImageLoader imageLoaderNoty = ImageLoader.getInstance(); - File cacheDir = new File(getContext().getCacheDir(), getContext().getString(R.string.app_name)); - ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getContext()) - .imageDownloader(new PatchBaseImageDownloader(getContext())) - .threadPoolSize(5) - .threadPriority(Thread.MIN_PRIORITY + 3) - .denyCacheImageMultipleSizesInMemory() - .diskCache(new UnlimitedDiskCache(cacheDir)) - .build(); - imageLoaderNoty.init(config); - DisplayImageOptions options = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) - .cacheOnDisk(true).resetViewBeforeLoading(true).build(); + final String finalMessage = message; String title; if( status.getAccount().getDisplay_name() != null && status.getAccount().getDisplay_name().length() > 0 ) @@ -177,24 +164,35 @@ public class HomeTimelineSyncJob extends Job implements OnRetrieveHomeTimelineSe else title = getContext().getResources().getString(R.string.notif_pouet, status.getAccount().getUsername()); final String finalTitle = title; + Glide.with(getContext()) + .asBitmap() + .load(notificationUrl) + .listener(new RequestListener() { - imageLoaderNoty.loadImage(notificationUrl, options, new SimpleImageLoadingListener(){ - @Override - public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { - super.onLoadingComplete(imageUri, view, loadedImage); - notify_user(getContext(), intent, notificationId, loadedImage, finalTitle, finalMessage); - SharedPreferences.Editor editor = sharedpreferences.edit(); - editor.putString(Helper.LAST_HOMETIMELINE_MAX_ID + userId, statuses.get(0).getId()); - editor.apply(); - } - @Override - public void onLoadingFailed(java.lang.String imageUri, android.view.View view, FailReason failReason){ - notify_user(getContext(), intent, notificationId, BitmapFactory.decodeResource(getContext().getResources(), - R.drawable.mastodonlogo), finalTitle, finalMessage); - SharedPreferences.Editor editor = sharedpreferences.edit(); - editor.putString(Helper.LAST_HOMETIMELINE_MAX_ID + userId, statuses.get(0).getId()); - editor.apply(); - }}); + @Override + public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { + notify_user(getContext(), intent, notificationId, BitmapFactory.decodeResource(getContext().getResources(), + R.drawable.mastodonlogo), finalTitle, finalMessage); + SharedPreferences.Editor editor = sharedpreferences.edit(); + editor.putString(Helper.LAST_HOMETIMELINE_MAX_ID + userId, statuses.get(0).getId()); + editor.apply(); + return false; + } + + @Override + public boolean onResourceReady(Object resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { + return false; + } + }) + .into(new SimpleTarget() { + @Override + public void onResourceReady(Bitmap resource, Transition transition) { + notify_user(getContext(), intent, notificationId, resource, finalTitle, finalMessage); + SharedPreferences.Editor editor = sharedpreferences.edit(); + editor.putString(Helper.LAST_HOMETIMELINE_MAX_ID + userId, statuses.get(0).getId()); + editor.apply(); + } + }); } } diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/jobs/NotificationsSyncJob.java b/app/src/main/java/fr/gouv/etalab/mastodon/jobs/NotificationsSyncJob.java index 6043fd573..22dd7b4b3 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/jobs/NotificationsSyncJob.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/jobs/NotificationsSyncJob.java @@ -22,27 +22,25 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.support.annotation.NonNull; -import android.view.View; +import android.support.annotation.Nullable; +import com.bumptech.glide.Glide; +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.SimpleTarget; +import com.bumptech.glide.request.target.Target; +import com.bumptech.glide.request.transition.Transition; import com.evernote.android.job.Job; import com.evernote.android.job.JobManager; import com.evernote.android.job.JobRequest; -import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache; -import com.nostra13.universalimageloader.core.DisplayImageOptions; -import com.nostra13.universalimageloader.core.ImageLoader; -import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; -import com.nostra13.universalimageloader.core.assist.FailReason; -import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer; -import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; -import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; import fr.gouv.etalab.mastodon.activities.MainActivity; import fr.gouv.etalab.mastodon.client.APIResponse; -import fr.gouv.etalab.mastodon.client.PatchBaseImageDownloader; import fr.gouv.etalab.mastodon.helper.Helper; import fr.gouv.etalab.mastodon.R; import fr.gouv.etalab.mastodon.asynctasks.RetrieveNotificationsAsyncTask; @@ -229,43 +227,44 @@ public class NotificationsSyncJob extends Job implements OnRetrieveNotifications long notif_id = Long.parseLong(userId); final int notificationId = ((notif_id + 1) > 2147483647) ? (int) (2147483647 - notif_id - 1) : (int) (notif_id + 1); if( notificationUrl != null ){ - ImageLoader imageLoaderNoty = ImageLoader.getInstance(); - File cacheDir = new File(getContext().getCacheDir(), getContext().getString(R.string.app_name)); - ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getContext()) - .imageDownloader(new PatchBaseImageDownloader(getContext())) - .threadPoolSize(5) - .threadPriority(Thread.MIN_PRIORITY + 3) - .denyCacheImageMultipleSizesInMemory() - .diskCache(new UnlimitedDiskCache(cacheDir)) - .build(); - imageLoaderNoty.init(config); - DisplayImageOptions options = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) - .cacheOnDisk(true).resetViewBeforeLoading(true).build(); + final String finalTitle = title; - imageLoaderNoty.loadImage(notificationUrl, options, new SimpleImageLoadingListener(){ - @Override - public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { - super.onLoadingComplete(imageUri, view, loadedImage); - notify_user(getContext(), intent, notificationId, loadedImage, finalTitle, message); - String lastNotif = sharedpreferences.getString(Helper.LAST_NOTIFICATION_MAX_ID + userId, null); - if( lastNotif == null || Long.parseLong(notifications.get(0).getId()) > Long.parseLong(lastNotif)){ - SharedPreferences.Editor editor = sharedpreferences.edit(); - editor.putString(Helper.LAST_NOTIFICATION_MAX_ID + userId, notifications.get(0).getId()); - editor.apply(); - } - } - @Override - public void onLoadingFailed(java.lang.String imageUri, android.view.View view, FailReason failReason){ - notify_user(getContext(), intent, notificationId, BitmapFactory.decodeResource(getContext().getResources(), - R.drawable.mastodonlogo), finalTitle, message); - String lastNotif = sharedpreferences.getString(Helper.LAST_NOTIFICATION_MAX_ID + userId, null); - if( lastNotif == null || Long.parseLong(notifications.get(0).getId()) > Long.parseLong(lastNotif)){ - SharedPreferences.Editor editor = sharedpreferences.edit(); - editor.putString(Helper.LAST_NOTIFICATION_MAX_ID + userId, notifications.get(0).getId()); - editor.apply(); - } - }}); + Glide.with(getContext()) + .asBitmap() + .load(notificationUrl) + .listener(new RequestListener() { + + @Override + public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { + notify_user(getContext(), intent, notificationId, BitmapFactory.decodeResource(getContext().getResources(), + R.drawable.mastodonlogo), finalTitle, message); + String lastNotif = sharedpreferences.getString(Helper.LAST_NOTIFICATION_MAX_ID + userId, null); + if( lastNotif == null || Long.parseLong(notifications.get(0).getId()) > Long.parseLong(lastNotif)){ + SharedPreferences.Editor editor = sharedpreferences.edit(); + editor.putString(Helper.LAST_NOTIFICATION_MAX_ID + userId, notifications.get(0).getId()); + editor.apply(); + } + return false; + } + + @Override + public boolean onResourceReady(Object resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { + return false; + } + }) + .into(new SimpleTarget() { + @Override + public void onResourceReady(Bitmap resource, Transition transition) { + notify_user(getContext(), intent, notificationId, resource, finalTitle, message); + String lastNotif = sharedpreferences.getString(Helper.LAST_NOTIFICATION_MAX_ID + userId, null); + if( lastNotif == null || Long.parseLong(notifications.get(0).getId()) > Long.parseLong(lastNotif)){ + SharedPreferences.Editor editor = sharedpreferences.edit(); + editor.putString(Helper.LAST_NOTIFICATION_MAX_ID + userId, notifications.get(0).getId()); + editor.apply(); + } + } + }); } } diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/services/LiveNotificationService.java b/app/src/main/java/fr/gouv/etalab/mastodon/services/LiveNotificationService.java index e9c68d1eb..414fb53b6 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/services/LiveNotificationService.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/services/LiveNotificationService.java @@ -25,15 +25,18 @@ import android.os.IBinder; import android.os.SystemClock; import android.support.annotation.Nullable; import android.support.v4.content.LocalBroadcastManager; +import android.text.Spannable; +import android.text.style.ImageSpan; import android.view.View; -import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache; -import com.nostra13.universalimageloader.core.DisplayImageOptions; -import com.nostra13.universalimageloader.core.ImageLoader; -import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; -import com.nostra13.universalimageloader.core.assist.FailReason; -import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer; -import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; + +import com.bumptech.glide.Glide; +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.SimpleTarget; +import com.bumptech.glide.request.target.Target; +import com.bumptech.glide.request.transition.Transition; import org.json.JSONException; import org.json.JSONObject; @@ -59,7 +62,6 @@ import fr.gouv.etalab.mastodon.client.API; import fr.gouv.etalab.mastodon.client.Entities.Account; import fr.gouv.etalab.mastodon.client.Entities.Notification; import fr.gouv.etalab.mastodon.client.Entities.Status; -import fr.gouv.etalab.mastodon.client.PatchBaseImageDownloader; import fr.gouv.etalab.mastodon.client.TLSSocketFactory; import fr.gouv.etalab.mastodon.helper.Helper; import fr.gouv.etalab.mastodon.sqlite.AccountDAO; @@ -322,46 +324,46 @@ public class LiveNotificationService extends IntentService { long notif_id = Long.parseLong(account.getId()); final int notificationId = ((notif_id + 1) > 2147483647) ? (int) (2147483647 - notif_id - 1) : (int) (notif_id + 1); if( notification.getAccount().getAvatar() != null ) { - ImageLoader imageLoaderNoty = ImageLoader.getInstance(); - File cacheDir = new File(getCacheDir(), getString(R.string.app_name)); - ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext()) - .imageDownloader(new PatchBaseImageDownloader(getApplicationContext())) - .threadPoolSize(5) - .threadPriority(Thread.MIN_PRIORITY + 3) - .denyCacheImageMultipleSizesInMemory() - .diskCache(new UnlimitedDiskCache(cacheDir)) - .build(); - imageLoaderNoty.init(config); - DisplayImageOptions options = new DisplayImageOptions.Builder().displayer(new SimpleBitmapDisplayer()).cacheInMemory(false) - .cacheOnDisk(true).resetViewBeforeLoading(true).build(); + final String finalTitle = title; if( title != null) { - imageLoaderNoty.loadImage(notification.getAccount().getAvatar(), options, new SimpleImageLoadingListener() { - @Override - public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { - super.onLoadingComplete(imageUri, view, loadedImage); - notify_user(getApplicationContext(), intent, notificationId, loadedImage, finalTitle, "@"+account.getAcct()+"@"+account.getInstance()); - String lastNotif = sharedpreferences.getString(Helper.LAST_NOTIFICATION_MAX_ID + account.getId(), null); - if (lastNotif == null || Long.parseLong(notification.getId()) > Long.parseLong(lastNotif)) { - SharedPreferences.Editor editor = sharedpreferences.edit(); - editor.putString(Helper.LAST_NOTIFICATION_MAX_ID + account.getId(), notification.getId()); - editor.apply(); - } - } - @Override - public void onLoadingFailed(java.lang.String imageUri, android.view.View view, FailReason failReason) { - notify_user(getApplicationContext(), intent, notificationId, BitmapFactory.decodeResource(getResources(), - R.drawable.mastodonlogo), finalTitle, "@"+account.getAcct()+"@"+account.getInstance()); - String lastNotif = sharedpreferences.getString(Helper.LAST_NOTIFICATION_MAX_ID + account.getId(), null); - if (lastNotif == null || Long.parseLong(notification.getId()) > Long.parseLong(lastNotif)) { - SharedPreferences.Editor editor = sharedpreferences.edit(); - editor.putString(Helper.LAST_NOTIFICATION_MAX_ID + account.getId(), notification.getId()); - editor.apply(); - } - } - }); + Glide.with(getApplicationContext()) + .asBitmap() + .load(notification.getAccount().getAvatar()) + .listener(new RequestListener() { + + @Override + public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { + notify_user(getApplicationContext(), intent, notificationId, BitmapFactory.decodeResource(getResources(), + R.drawable.mastodonlogo), finalTitle, "@"+account.getAcct()+"@"+account.getInstance()); + String lastNotif = sharedpreferences.getString(Helper.LAST_NOTIFICATION_MAX_ID + account.getId(), null); + if (lastNotif == null || Long.parseLong(notification.getId()) > Long.parseLong(lastNotif)) { + SharedPreferences.Editor editor = sharedpreferences.edit(); + editor.putString(Helper.LAST_NOTIFICATION_MAX_ID + account.getId(), notification.getId()); + editor.apply(); + } + return false; + } + + @Override + public boolean onResourceReady(Object resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { + return false; + } + }) + .into(new SimpleTarget() { + @Override + public void onResourceReady(Bitmap resource, Transition transition) { + notify_user(getApplicationContext(), intent, notificationId, resource, finalTitle, "@"+account.getAcct()+"@"+account.getInstance()); + String lastNotif = sharedpreferences.getString(Helper.LAST_NOTIFICATION_MAX_ID + account.getId(), null); + if (lastNotif == null || Long.parseLong(notification.getId()) > Long.parseLong(lastNotif)) { + SharedPreferences.Editor editor = sharedpreferences.edit(); + editor.putString(Helper.LAST_NOTIFICATION_MAX_ID + account.getId(), notification.getId()); + editor.apply(); + } + } + }); } } }