set UIL DisplayImageOptions at startup

Instead of setting the same thing at each place its used, this puts all the
settings in one place.  For the most part, they are the same everywhere.
This makes it a lot easier to optimize how UIL works since all the settings
are in one place.
This commit is contained in:
Hans-Christoph Steiner 2018-03-23 17:46:38 +01:00
parent b19eb1f91d
commit 2a3aaacf23
12 changed files with 85 additions and 112 deletions

View File

@ -173,7 +173,7 @@ public class AppDetails2 extends AppCompatActivity
// Load the feature graphic, if present // Load the feature graphic, if present
final FeatureImage featureImage = (FeatureImage) findViewById(R.id.feature_graphic); final FeatureImage featureImage = (FeatureImage) findViewById(R.id.feature_graphic);
DisplayImageOptions displayImageOptions = Utils.getImageLoadingOptions().build(); DisplayImageOptions displayImageOptions = Utils.getRepoAppDisplayImageOptions();
String featureGraphicUrl = app.getFeatureGraphicUrl(this); String featureGraphicUrl = app.getFeatureGraphicUrl(this);
featureImage.loadImageAndDisplay(ImageLoader.getInstance(), displayImageOptions, featureImage.loadImageAndDisplay(ImageLoader.getInstance(), displayImageOptions,
featureGraphicUrl, app.iconUrl); featureGraphicUrl, app.iconUrl);

View File

@ -382,6 +382,7 @@ public class FDroidApp extends Application {
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext()) ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
.imageDownloader(new ImageLoaderForUIL(getApplicationContext())) .imageDownloader(new ImageLoaderForUIL(getApplicationContext()))
.defaultDisplayImageOptions(Utils.getDefaultDisplayImageOptionsBuilder().build())
.threadPoolSize(4) .threadPoolSize(4)
.build(); .build();
ImageLoader.getInstance().init(config); ImageLoader.getInstance().init(config);

View File

@ -21,10 +21,8 @@ import android.text.Spanned;
import android.text.TextUtils; import android.text.TextUtils;
import android.text.style.StyleSpan; import android.text.style.StyleSpan;
import android.view.View; import android.view.View;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.FailReason; import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.assist.ImageSize; import com.nostra13.universalimageloader.core.assist.ImageSize;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener; import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
import com.nostra13.universalimageloader.utils.DiskCacheUtils; import com.nostra13.universalimageloader.utils.DiskCacheUtils;
@ -54,7 +52,6 @@ class NotificationHelper {
private final Context context; private final Context context;
private final NotificationManagerCompat notificationManager; private final NotificationManagerCompat notificationManager;
private final AppUpdateStatusManager appUpdateStatusManager; private final AppUpdateStatusManager appUpdateStatusManager;
private final DisplayImageOptions displayImageOptions;
private final ArrayList<AppUpdateStatusManager.AppUpdateStatus> updates = new ArrayList<>(); private final ArrayList<AppUpdateStatusManager.AppUpdateStatus> updates = new ArrayList<>();
private final ArrayList<AppUpdateStatusManager.AppUpdateStatus> installed = new ArrayList<>(); private final ArrayList<AppUpdateStatusManager.AppUpdateStatus> installed = new ArrayList<>();
@ -62,12 +59,6 @@ class NotificationHelper {
this.context = context; this.context = context;
appUpdateStatusManager = AppUpdateStatusManager.getInstance(context); appUpdateStatusManager = AppUpdateStatusManager.getInstance(context);
notificationManager = NotificationManagerCompat.from(context); notificationManager = NotificationManagerCompat.from(context);
displayImageOptions = new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
.imageScaleType(ImageScaleType.NONE)
.bitmapConfig(Bitmap.Config.RGB_565)
.build();
IntentFilter filter = new IntentFilter(); IntentFilter filter = new IntentFilter();
filter.addAction(AppUpdateStatusManager.BROADCAST_APPSTATUS_LIST_CHANGED); filter.addAction(AppUpdateStatusManager.BROADCAST_APPSTATUS_LIST_CHANGED);
@ -506,7 +497,8 @@ class NotificationHelper {
Bitmap iconLarge = null; Bitmap iconLarge = null;
if (TextUtils.isEmpty(entry.app.iconUrl)) { if (TextUtils.isEmpty(entry.app.iconUrl)) {
return null; return null;
} else if (entry.status == AppUpdateStatusManager.Status.Downloading || entry.status == AppUpdateStatusManager.Status.Installing) { } else if (entry.status == AppUpdateStatusManager.Status.Downloading
|| entry.status == AppUpdateStatusManager.Status.Installing) {
Bitmap bitmap = Bitmap.createBitmap(largeIconSize.x, largeIconSize.y, Bitmap.Config.ARGB_8888); Bitmap bitmap = Bitmap.createBitmap(largeIconSize.x, largeIconSize.y, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap); Canvas canvas = new Canvas(bitmap);
Drawable downloadIcon = ContextCompat.getDrawable(context, R.drawable.ic_notification_download); Drawable downloadIcon = ContextCompat.getDrawable(context, R.drawable.ic_notification_download);
@ -516,10 +508,11 @@ class NotificationHelper {
} }
return bitmap; return bitmap;
} else if (DiskCacheUtils.findInCache(entry.app.iconUrl, ImageLoader.getInstance().getDiskCache()) != null) { } else if (DiskCacheUtils.findInCache(entry.app.iconUrl, ImageLoader.getInstance().getDiskCache()) != null) {
iconLarge = ImageLoader.getInstance().loadImageSync(entry.app.iconUrl, new ImageSize(largeIconSize.x, largeIconSize.y), displayImageOptions); iconLarge = ImageLoader.getInstance().loadImageSync(
entry.app.iconUrl, new ImageSize(largeIconSize.x, largeIconSize.y));
} else { } else {
// Load it for later! // Load it for later!
ImageLoader.getInstance().loadImage(entry.app.iconUrl, new ImageSize(largeIconSize.x, largeIconSize.y), displayImageOptions, new ImageLoadingListener() { ImageLoader.getInstance().loadImage(entry.app.iconUrl, new ImageSize(largeIconSize.x, largeIconSize.y), new ImageLoadingListener() {
AppUpdateStatusManager.AppUpdateStatus entry; AppUpdateStatusManager.AppUpdateStatus entry;

View File

@ -92,6 +92,9 @@ public final class Utils {
"%.0f B", "%.0f KiB", "%.1f MiB", "%.2f GiB", "%.0f B", "%.0f KiB", "%.1f MiB", "%.2f GiB",
}; };
private static DisplayImageOptions.Builder defaultDisplayImageOptionsBuilder;
private static DisplayImageOptions repoAppDisplayImageOptions;
public static final String FALLBACK_ICONS_DIR = "/icons/"; public static final String FALLBACK_ICONS_DIR = "/icons/";
/* /*
@ -369,15 +372,33 @@ public final class Utils {
return new Locale(languageTag); return new Locale(languageTag);
} }
public static DisplayImageOptions.Builder getImageLoadingOptions() { public static DisplayImageOptions.Builder getDefaultDisplayImageOptionsBuilder() {
return new DisplayImageOptions.Builder() if (defaultDisplayImageOptionsBuilder == null) {
.cacheInMemory(true) defaultDisplayImageOptionsBuilder = new DisplayImageOptions.Builder()
.cacheOnDisk(true) .cacheInMemory(true)
.imageScaleType(ImageScaleType.NONE) .cacheOnDisk(true)
.showImageOnLoading(R.drawable.ic_repo_app_default) .considerExifParams(false)
.showImageForEmptyUri(R.drawable.ic_repo_app_default) .bitmapConfig(Bitmap.Config.RGB_565)
.displayer(new FadeInBitmapDisplayer(200, true, true, false)) .imageScaleType(ImageScaleType.NONE);
.bitmapConfig(Bitmap.Config.RGB_565); }
return defaultDisplayImageOptionsBuilder;
}
/**
* Gets the {@link DisplayImageOptions} instance used to configure
* {@link com.nostra13.universalimageloader.core.ImageLoader} instances
* used to display app icons. It lazy loads a reusable static instance.
*/
public static DisplayImageOptions getRepoAppDisplayImageOptions() {
if (repoAppDisplayImageOptions == null) {
repoAppDisplayImageOptions = getDefaultDisplayImageOptionsBuilder()
.showImageOnLoading(R.drawable.ic_repo_app_default)
.showImageForEmptyUri(R.drawable.ic_repo_app_default)
.showImageOnFail(R.drawable.ic_repo_app_default)
.displayer(new FadeInBitmapDisplayer(200, true, true, false))
.build();
}
return repoAppDisplayImageOptions;
} }
// this is all new stuff being added // this is all new stuff being added
@ -554,8 +575,10 @@ public final class Utils {
} }
} }
// Need this to add the unimplemented support for ordered and unordered /**
// lists to Html.fromHtml(). * Need this to add the unimplemented support for ordered and unordered
* lists to Html.fromHtml().
*/
public static class HtmlTagHandler implements Html.TagHandler { public static class HtmlTagHandler implements Html.TagHandler {
int listNum; int listNum;

View File

@ -23,7 +23,6 @@ import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener; import android.content.DialogInterface.OnCancelListener;
import android.content.Intent; import android.content.Intent;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
import android.graphics.Bitmap;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentActivity;
@ -36,11 +35,10 @@ import android.widget.Button;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TabHost; import android.widget.TabHost;
import android.widget.TextView; import android.widget.TextView;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import org.fdroid.fdroid.FDroidApp; import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.R; import org.fdroid.fdroid.R;
import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.data.Apk; import org.fdroid.fdroid.data.Apk;
import org.fdroid.fdroid.data.ApkProvider; import org.fdroid.fdroid.data.ApkProvider;
import org.fdroid.fdroid.data.App; import org.fdroid.fdroid.data.App;
@ -71,15 +69,6 @@ public class InstallConfirmActivity extends FragmentActivity implements OnCancel
private App app; private App app;
private final DisplayImageOptions displayImageOptions = new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
.imageScaleType(ImageScaleType.NONE)
.showImageOnLoading(R.drawable.ic_repo_app_default)
.showImageForEmptyUri(R.drawable.ic_repo_app_default)
.bitmapConfig(Bitmap.Config.RGB_565)
.build();
private void startInstallConfirm() { private void startInstallConfirm() {
View appSnippet = findViewById(R.id.app_snippet); View appSnippet = findViewById(R.id.app_snippet);
TextView appName = (TextView) appSnippet.findViewById(R.id.app_name); TextView appName = (TextView) appSnippet.findViewById(R.id.app_name);
@ -87,7 +76,8 @@ public class InstallConfirmActivity extends FragmentActivity implements OnCancel
TabHost tabHost = (TabHost) findViewById(android.R.id.tabhost); TabHost tabHost = (TabHost) findViewById(android.R.id.tabhost);
appName.setText(app.name); appName.setText(app.name);
ImageLoader.getInstance().displayImage(app.iconUrl, appIcon, displayImageOptions); ImageLoader.getInstance().displayImage(app.iconUrl, appIcon,
Utils.getRepoAppDisplayImageOptions());
tabHost.setup(); tabHost.setup();
ViewPager viewPager = (ViewPager) findViewById(R.id.pager); ViewPager viewPager = (ViewPager) findViewById(R.id.pager);

View File

@ -6,7 +6,6 @@ import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.res.Resources; import android.content.res.Resources;
import android.graphics.Bitmap;
import android.net.Uri; import android.net.Uri;
import android.support.annotation.DrawableRes; import android.support.annotation.DrawableRes;
import android.support.annotation.LayoutRes; import android.support.annotation.LayoutRes;
@ -34,11 +33,7 @@ import android.widget.LinearLayout;
import android.widget.ProgressBar; import android.widget.ProgressBar;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import org.fdroid.fdroid.Preferences; import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.R; import org.fdroid.fdroid.R;
import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.Utils;
@ -317,7 +312,6 @@ public class AppDetailsRecyclerViewAdapter
final TextView progressLabel; final TextView progressLabel;
final TextView progressPercent; final TextView progressPercent;
final View progressCancel; final View progressCancel;
final DisplayImageOptions displayImageOptions;
boolean descriptionIsExpanded; boolean descriptionIsExpanded;
HeaderViewHolder(View view) { HeaderViewHolder(View view) {
@ -340,14 +334,6 @@ public class AppDetailsRecyclerViewAdapter
progressLabel = (TextView) view.findViewById(R.id.progress_label); progressLabel = (TextView) view.findViewById(R.id.progress_label);
progressPercent = (TextView) view.findViewById(R.id.progress_percent); progressPercent = (TextView) view.findViewById(R.id.progress_percent);
progressCancel = view.findViewById(R.id.progress_cancel); progressCancel = view.findViewById(R.id.progress_cancel);
displayImageOptions = new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
.imageScaleType(ImageScaleType.NONE)
.showImageOnLoading(R.drawable.ic_repo_app_default)
.showImageForEmptyUri(R.drawable.ic_repo_app_default)
.bitmapConfig(Bitmap.Config.RGB_565)
.build();
descriptionView.setMaxLines(MAX_LINES); descriptionView.setMaxLines(MAX_LINES);
descriptionView.setEllipsize(TextUtils.TruncateAt.MARQUEE); descriptionView.setEllipsize(TextUtils.TruncateAt.MARQUEE);
descriptionMoreView.setOnClickListener(new View.OnClickListener() { descriptionMoreView.setOnClickListener(new View.OnClickListener() {
@ -408,7 +394,7 @@ public class AppDetailsRecyclerViewAdapter
} }
public void bindModel() { public void bindModel() {
ImageLoader.getInstance().displayImage(app.iconUrl, iconView, displayImageOptions); ImageLoader.getInstance().displayImage(app.iconUrl, iconView, Utils.getRepoAppDisplayImageOptions());
titleView.setText(app.name); titleView.setText(app.name);
if (!TextUtils.isEmpty(app.authorName)) { if (!TextUtils.isEmpty(app.authorName)) {
authorView.setText(context.getString(R.string.by_author_format, app.authorName)); authorView.setText(context.getString(R.string.by_author_format, app.authorName));

View File

@ -3,7 +3,6 @@ package org.fdroid.fdroid.views;
import android.annotation.TargetApi; import android.annotation.TargetApi;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
@ -16,18 +15,21 @@ import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ImageView; import android.widget.ImageView;
import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import org.fdroid.fdroid.FDroidApp; import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.R; import org.fdroid.fdroid.R;
import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.data.App; import org.fdroid.fdroid.data.App;
import org.fdroid.fdroid.data.AppProvider; import org.fdroid.fdroid.data.AppProvider;
/** /**
* Full screen view of an apps screenshots to swipe through. * Full screen view of an apps screenshots to swipe through. This will always
* download the image, even if the user has said not to use "unmetered" networks,
* e.g. WiFi. That is because the user has to click on the thumbnail in
* {@link org.fdroid.fdroid.AppDetails2} in order to bring up this activity.
* That makes it a specific request for that image, rather than regular
* background loading.
*/ */
public class ScreenShotsActivity extends AppCompatActivity { public class ScreenShotsActivity extends AppCompatActivity {
@ -114,13 +116,9 @@ public class ScreenShotsActivity extends AppCompatActivity {
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) { @Nullable Bundle savedInstanceState) {
DisplayImageOptions displayImageOptions = new DisplayImageOptions.Builder() DisplayImageOptions displayImageOptions = Utils.getDefaultDisplayImageOptionsBuilder()
.cacheInMemory(true)
.cacheOnDisk(true)
.imageScaleType(ImageScaleType.NONE)
.showImageOnLoading(R.drawable.screenshot_placeholder) .showImageOnLoading(R.drawable.screenshot_placeholder)
.showImageForEmptyUri(R.drawable.screenshot_placeholder) .showImageForEmptyUri(R.drawable.screenshot_placeholder)
.bitmapConfig(Bitmap.Config.RGB_565)
.build(); .build();
View rootView = inflater.inflate(R.layout.activity_screenshots_page, container, false); View rootView = inflater.inflate(R.layout.activity_screenshots_page, container, false);

View File

@ -1,20 +1,20 @@
package org.fdroid.fdroid.views; package org.fdroid.fdroid.views;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ImageView; import android.widget.ImageView;
import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import org.fdroid.fdroid.R; import org.fdroid.fdroid.R;
import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.data.App; import org.fdroid.fdroid.data.App;
/**
* Loads and displays the small screenshots that are inline in {@link org.fdroid.fdroid.AppDetails2}
*/
class ScreenShotsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { class ScreenShotsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final String[] screenshots; private final String[] screenshots;
private final DisplayImageOptions displayImageOptions; private final DisplayImageOptions displayImageOptions;
@ -25,13 +25,9 @@ class ScreenShotsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.V
this.listener = listener; this.listener = listener;
screenshots = app.getAllScreenshots(context); screenshots = app.getAllScreenshots(context);
displayImageOptions = new DisplayImageOptions.Builder() displayImageOptions = Utils.getDefaultDisplayImageOptionsBuilder()
.cacheInMemory(true)
.cacheOnDisk(true)
.imageScaleType(ImageScaleType.NONE)
.showImageOnLoading(R.drawable.screenshot_placeholder) .showImageOnLoading(R.drawable.screenshot_placeholder)
.showImageForEmptyUri(R.drawable.screenshot_placeholder) .showImageForEmptyUri(R.drawable.screenshot_placeholder)
.bitmapConfig(Bitmap.Config.RGB_565)
.build(); .build();
} }

View File

@ -26,10 +26,7 @@ import android.widget.ImageButton;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.ProgressBar; import android.widget.ProgressBar;
import android.widget.TextView; import android.widget.TextView;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoader;
import org.fdroid.fdroid.AppDetails2; import org.fdroid.fdroid.AppDetails2;
import org.fdroid.fdroid.AppUpdateStatusManager; import org.fdroid.fdroid.AppUpdateStatusManager;
import org.fdroid.fdroid.AppUpdateStatusManager.AppUpdateStatus; import org.fdroid.fdroid.AppUpdateStatusManager.AppUpdateStatus;
@ -50,14 +47,14 @@ import java.util.Iterator;
/** /**
* Supports the following layouts: * Supports the following layouts:
* <ul> * <ul>
* <li>app_list_item (see {@link StandardAppListItemController}</li> * <li>app_list_item (see {@link StandardAppListItemController}</li>
* <li>updateable_app_list_status_item (see * <li>updateable_app_list_status_item (see
* {@link org.fdroid.fdroid.views.updates.items.AppStatusListItemController}</li> * {@link org.fdroid.fdroid.views.updates.items.AppStatusListItemController}</li>
* <li>updateable_app_list_item (see * <li>updateable_app_list_item (see
* {@link org.fdroid.fdroid.views.updates.items.UpdateableAppListItemController}</li> * {@link org.fdroid.fdroid.views.updates.items.UpdateableAppListItemController}</li>
* <li>installed_app_list_item (see {@link StandardAppListItemController}</li> * <li>installed_app_list_item (see {@link StandardAppListItemController}</li>
* </ul> * </ul>
* * <p>
* The state of the UI is defined in a dumb {@link AppListItemState} class, then applied to the UI * The state of the UI is defined in a dumb {@link AppListItemState} class, then applied to the UI
* in the {@link #refreshView(App, AppUpdateStatus)} method. * in the {@link #refreshView(App, AppUpdateStatus)} method.
*/ */
@ -98,8 +95,6 @@ public abstract class AppListItemController extends RecyclerView.ViewHolder {
@Nullable @Nullable
private final Button secondaryButton; private final Button secondaryButton;
private final DisplayImageOptions displayImageOptions;
@Nullable @Nullable
private App currentApp; private App currentApp;
@ -156,8 +151,6 @@ public abstract class AppListItemController extends RecyclerView.ViewHolder {
cancelButton.setOnClickListener(onCancelDownload); cancelButton.setOnClickListener(onCancelDownload);
} }
displayImageOptions = Utils.getImageLoadingOptions().build();
itemView.setOnClickListener(onAppClicked); itemView.setOnClickListener(onAppClicked);
} }
@ -169,7 +162,7 @@ public abstract class AppListItemController extends RecyclerView.ViewHolder {
public void bindModel(@NonNull App app) { public void bindModel(@NonNull App app) {
currentApp = app; currentApp = app;
ImageLoader.getInstance().displayImage(app.iconUrl, icon, displayImageOptions); ImageLoader.getInstance().displayImage(app.iconUrl, icon, Utils.getRepoAppDisplayImageOptions());
// Figures out the current install/update/download/etc status for the app we are viewing. // Figures out the current install/update/download/etc status for the app we are viewing.
// Then, asks the view to update itself to reflect this status. // Then, asks the view to update itself to reflect this status.
@ -193,7 +186,9 @@ public abstract class AppListItemController extends RecyclerView.ViewHolder {
broadcastManager.registerReceiver(onStatusChanged, intentFilter); broadcastManager.registerReceiver(onStatusChanged, intentFilter);
} }
/** To be overridden if required */ /**
* To be overridden if required
*/
public boolean canDismiss() { public boolean canDismiss() {
return false; return false;
} }
@ -214,6 +209,7 @@ public abstract class AppListItemController extends RecyclerView.ViewHolder {
/** /**
* Override to respond to the user swiping an app to dismiss it from the list. * Override to respond to the user swiping an app to dismiss it from the list.
*
* @return Optionally return a description of what you did if it is not obvious to the user. It will be shown as * @return Optionally return a description of what you did if it is not obvious to the user. It will be shown as
* a {@link android.widget.Toast} for a {@link android.widget.Toast#LENGTH_SHORT} time. * a {@link android.widget.Toast} for a {@link android.widget.Toast#LENGTH_SHORT} time.
* @see #canDismiss() This must also be overriden and should return true. * @see #canDismiss() This must also be overriden and should return true.
@ -235,7 +231,7 @@ public abstract class AppListItemController extends RecyclerView.ViewHolder {
/** /**
* Queries the current state via {@link #getCurrentViewState(App, AppUpdateStatus)} * Queries the current state via {@link #getCurrentViewState(App, AppUpdateStatus)}
* and then updates the relevant widgets depending on that state. * and then updates the relevant widgets depending on that state.
* * <p>
* Should contain little to no business logic, this all belongs to * Should contain little to no business logic, this all belongs to
* {@link #getCurrentViewState(App, AppUpdateStatus)}. * {@link #getCurrentViewState(App, AppUpdateStatus)}.
* *
@ -489,7 +485,8 @@ public abstract class AppListItemController extends RecyclerView.ViewHolder {
intent.getParcelableExtra(Installer.EXTRA_USER_INTERACTION_PI); intent.getParcelableExtra(Installer.EXTRA_USER_INTERACTION_PI);
try { try {
pendingIntent.send(); pendingIntent.send();
} catch (PendingIntent.CanceledException ignored) { } } catch (PendingIntent.CanceledException ignored) {
}
} }
} }
}; };
@ -503,8 +500,11 @@ public abstract class AppListItemController extends RecyclerView.ViewHolder {
} }
} }
/** To be overridden by subclasses if desired */ /**
protected void onSecondaryButtonPressed(@NonNull App app) { } * To be overridden by subclasses if desired
*/
protected void onSecondaryButtonPressed(@NonNull App app) {
}
@SuppressWarnings("FieldCanBeLocal") @SuppressWarnings("FieldCanBeLocal")
private final View.OnClickListener onCancelDownload = new View.OnClickListener() { private final View.OnClickListener onCancelDownload = new View.OnClickListener() {

View File

@ -18,7 +18,6 @@ import android.text.TextUtils;
import android.view.View; import android.view.View;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.FailReason; import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener; import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
@ -70,7 +69,6 @@ public class AppCardController extends RecyclerView.ViewHolder
private App currentApp; private App currentApp;
private final Activity activity; private final Activity activity;
private final DisplayImageOptions displayImageOptions;
public AppCardController(Activity activity, View itemView) { public AppCardController(Activity activity, View itemView) {
super(itemView); super(itemView);
@ -83,8 +81,6 @@ public class AppCardController extends RecyclerView.ViewHolder
featuredImage = (FeatureImage) itemView.findViewById(R.id.featured_image); featuredImage = (FeatureImage) itemView.findViewById(R.id.featured_image);
newTag = (TextView) itemView.findViewById(R.id.new_tag); newTag = (TextView) itemView.findViewById(R.id.new_tag);
displayImageOptions = Utils.getImageLoadingOptions().build();
itemView.setOnClickListener(this); itemView.setOnClickListener(this);
} }
@ -117,7 +113,7 @@ public class AppCardController extends RecyclerView.ViewHolder
} }
} }
ImageLoader.getInstance().displayImage(app.iconUrl, icon, displayImageOptions, this); ImageLoader.getInstance().displayImage(app.iconUrl, icon, Utils.getRepoAppDisplayImageOptions(), this);
if (featuredImage != null) { if (featuredImage != null) {
featuredImage.setColour(ContextCompat.getColor(activity, R.color.fdroid_blue)); featuredImage.setColour(ContextCompat.getColor(activity, R.color.fdroid_blue));
@ -133,7 +129,7 @@ public class AppCardController extends RecyclerView.ViewHolder
// feature image to be loaded). // feature image to be loaded).
if (!TextUtils.isEmpty(app.featureGraphic)) { if (!TextUtils.isEmpty(app.featureGraphic)) {
featuredImage.loadImageAndDisplay(ImageLoader.getInstance(), featuredImage.loadImageAndDisplay(ImageLoader.getInstance(),
displayImageOptions, app.getFeatureGraphicUrl(activity)); Utils.getRepoAppDisplayImageOptions(), app.getFeatureGraphicUrl(activity));
} }
} }
} }
@ -162,7 +158,8 @@ public class AppCardController extends RecyclerView.ViewHolder
Pair<View, String> iconTransitionPair = Pair.create((View) icon, Pair<View, String> iconTransitionPair = Pair.create((View) icon,
activity.getString(R.string.transition_app_item_icon)); activity.getString(R.string.transition_app_item_icon));
@SuppressWarnings("unchecked") // the right type is passed as 2nd varargs arg: Pair<View, String> // unchecked since the right type is passed as 2nd varargs arg: Pair<View, String>
@SuppressWarnings("unchecked")
Bundle b = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, iconTransitionPair).toBundle(); Bundle b = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, iconTransitionPair).toBundle();
activity.startActivity(intent, b); activity.startActivity(intent, b);
} else { } else {

View File

@ -5,7 +5,6 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.res.Resources; import android.content.res.Resources;
import android.database.Cursor; import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.Rect; import android.graphics.Rect;
import android.os.Bundle; import android.os.Bundle;
@ -23,9 +22,9 @@ import android.widget.FrameLayout;
import android.widget.TextView; import android.widget.TextView;
import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer; import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
import org.fdroid.fdroid.R; import org.fdroid.fdroid.R;
import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.data.AppProvider; import org.fdroid.fdroid.data.AppProvider;
import org.fdroid.fdroid.data.Schema; import org.fdroid.fdroid.data.Schema;
import org.fdroid.fdroid.views.apps.AppListActivity; import org.fdroid.fdroid.views.apps.AppListActivity;
@ -67,11 +66,8 @@ public class CategoryController extends RecyclerView.ViewHolder implements Loade
appCards.setAdapter(appCardsAdapter); appCards.setAdapter(appCardsAdapter);
appCards.addItemDecoration(new ItemDecorator(activity)); appCards.addItemDecoration(new ItemDecorator(activity));
displayImageOptions = new DisplayImageOptions.Builder() displayImageOptions = Utils.getDefaultDisplayImageOptionsBuilder()
.cacheInMemory(true)
.imageScaleType(ImageScaleType.NONE)
.displayer(new FadeInBitmapDisplayer(100, true, true, false)) .displayer(new FadeInBitmapDisplayer(100, true, true, false))
.bitmapConfig(Bitmap.Config.RGB_565)
.build(); .build();
} }

View File

@ -36,10 +36,7 @@ import android.widget.ListView;
import android.widget.ProgressBar; import android.widget.ProgressBar;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoader;
import org.fdroid.fdroid.BuildConfig; import org.fdroid.fdroid.BuildConfig;
import org.fdroid.fdroid.R; import org.fdroid.fdroid.R;
import org.fdroid.fdroid.UpdateService; import org.fdroid.fdroid.UpdateService;
@ -63,8 +60,6 @@ public class SwapAppsView extends ListView implements
LoaderManager.LoaderCallbacks<Cursor>, LoaderManager.LoaderCallbacks<Cursor>,
SearchView.OnQueryTextListener { SearchView.OnQueryTextListener {
private DisplayImageOptions displayImageOptions;
public SwapAppsView(Context context) { public SwapAppsView(Context context) {
super(context); super(context);
} }
@ -113,8 +108,6 @@ public class SwapAppsView extends ListView implements
// either reconnect with an existing loader or start a new one // either reconnect with an existing loader or start a new one
getActivity().getSupportLoaderManager().initLoader(LOADER_SWAPABLE_APPS, null, this); getActivity().getSupportLoaderManager().initLoader(LOADER_SWAPABLE_APPS, null, this);
displayImageOptions = Utils.getImageLoadingOptions().build();
LocalBroadcastManager.getInstance(getActivity()).registerReceiver( LocalBroadcastManager.getInstance(getActivity()).registerReceiver(
pollForUpdatesReceiver, new IntentFilter(UpdateService.LOCAL_ACTION_STATUS)); pollForUpdatesReceiver, new IntentFilter(UpdateService.LOCAL_ACTION_STATUS));
@ -354,7 +347,7 @@ public class SwapAppsView extends ListView implements
nameView.setText(app.name); nameView.setText(app.name);
} }
ImageLoader.getInstance().displayImage(app.iconUrl, iconView, displayImageOptions); ImageLoader.getInstance().displayImage(app.iconUrl, iconView, Utils.getRepoAppDisplayImageOptions());
if (app.hasUpdates()) { if (app.hasUpdates()) {
btnInstall.setText(R.string.menu_upgrade); btnInstall.setText(R.string.menu_upgrade);