diff --git a/clients/android/NewsBlur/src/com/newsblur/activity/NewsBlurApplication.java b/clients/android/NewsBlur/src/com/newsblur/activity/NewsBlurApplication.java index 31359b01f..123975f12 100644 --- a/clients/android/NewsBlur/src/com/newsblur/activity/NewsBlurApplication.java +++ b/clients/android/NewsBlur/src/com/newsblur/activity/NewsBlurApplication.java @@ -8,6 +8,9 @@ import com.newsblur.util.ImageLoader; public class NewsBlurApplication extends Application { + // these need to be app-level singletons, but they can't be safely initiated until + // the app is fully started. create them here and then vend them via FeedUtils like + // most other utility functions. private ImageLoader imageLoader; private BlurDatabaseHelper dbHelper; @@ -17,10 +20,7 @@ public class NewsBlurApplication extends Application { imageLoader = new ImageLoader(this); dbHelper = new BlurDatabaseHelper(this); FeedUtils.offerDB(dbHelper); + FeedUtils.offerImageLoader(imageLoader); } - public ImageLoader getImageLoader() { - return imageLoader; - } - } diff --git a/clients/android/NewsBlur/src/com/newsblur/database/FolderListAdapter.java b/clients/android/NewsBlur/src/com/newsblur/database/FolderListAdapter.java index 24e9d8ab0..cb015275a 100644 --- a/clients/android/NewsBlur/src/com/newsblur/database/FolderListAdapter.java +++ b/clients/android/NewsBlur/src/com/newsblur/database/FolderListAdapter.java @@ -32,8 +32,8 @@ import com.newsblur.activity.NewsBlurApplication; import com.newsblur.domain.Feed; import com.newsblur.domain.Folder; import com.newsblur.domain.SocialFeed; +import com.newsblur.util.FeedUtils; import com.newsblur.util.AppConstants; -import com.newsblur.util.ImageLoader; import com.newsblur.util.StateFilter; /** @@ -86,16 +86,12 @@ public class FolderListAdapter extends BaseExpandableListAdapter { private int savedStoriesCount; private Context context; - private LayoutInflater inflater; - private ImageLoader imageLoader; - private StateFilter currentState; public FolderListAdapter(Context context, StateFilter currentState) { this.context = context; this.currentState = currentState; - imageLoader = ((NewsBlurApplication) context.getApplicationContext()).getImageLoader(); this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @@ -187,7 +183,7 @@ public class FolderListAdapter extends BaseExpandableListAdapter { } SocialFeed f = socialFeedsOrdered.get(childPosition); ((TextView) v.findViewById(R.id.row_socialfeed_name)).setText(f.feedTitle); - imageLoader.displayImage(f.photoUrl, ((ImageView) v.findViewById(R.id.row_socialfeed_icon)), false); + FeedUtils.imageLoader.displayImage(f.photoUrl, ((ImageView) v.findViewById(R.id.row_socialfeed_icon)), false); TextView neutCounter = ((TextView) v.findViewById(R.id.row_socialsumneu)); if (f.neutralCount > 0 && currentState != StateFilter.BEST) { neutCounter.setVisibility(View.VISIBLE); @@ -210,7 +206,7 @@ public class FolderListAdapter extends BaseExpandableListAdapter { v = convertView; } ((TextView) v.findViewById(R.id.row_feedname)).setText(f.title); - imageLoader.displayImage(f.faviconUrl, ((ImageView) v.findViewById(R.id.row_feedfavicon)), false); + FeedUtils.imageLoader.displayImage(f.faviconUrl, ((ImageView) v.findViewById(R.id.row_feedfavicon)), false); TextView neutCounter = ((TextView) v.findViewById(R.id.row_feedneutral)); if (f.neutralCount > 0 && currentState != StateFilter.BEST) { neutCounter.setVisibility(View.VISIBLE); diff --git a/clients/android/NewsBlur/src/com/newsblur/database/MultipleFeedItemsAdapter.java b/clients/android/NewsBlur/src/com/newsblur/database/MultipleFeedItemsAdapter.java index 4af680ecd..5c630a606 100644 --- a/clients/android/NewsBlur/src/com/newsblur/database/MultipleFeedItemsAdapter.java +++ b/clients/android/NewsBlur/src/com/newsblur/database/MultipleFeedItemsAdapter.java @@ -12,19 +12,17 @@ import android.widget.TextView; import com.newsblur.R; import com.newsblur.activity.NewsBlurApplication; import com.newsblur.domain.Story; -import com.newsblur.util.ImageLoader; +import com.newsblur.util.FeedUtils; import com.newsblur.util.PrefsUtils; import com.newsblur.util.ThemeUtils; public class MultipleFeedItemsAdapter extends StoryItemsAdapter { - private ImageLoader imageLoader; private int storyTitleUnread, storyContentUnread, storyAuthorUnread, storyTitleRead, storyContentRead, storyAuthorRead, storyDateUnread, storyDateRead, storyFeedUnread, storyFeedRead; private boolean ignoreReadStatus; public MultipleFeedItemsAdapter(Context context, int layout, Cursor c, String[] from, int[] to, boolean ignoreReadStatus) { super(context, layout, c, from, to); - imageLoader = ((NewsBlurApplication) context.getApplicationContext()).getImageLoader(); storyTitleUnread = ThemeUtils.getStoryTitleUnreadColor(context); storyTitleRead = ThemeUtils.getStoryTitleReadColor(context); @@ -55,7 +53,7 @@ public class MultipleFeedItemsAdapter extends StoryItemsAdapter { String feedFade = cursor.getString(cursor.getColumnIndex(DatabaseConstants.FEED_FAVICON_COLOR)); String faviconUrl = cursor.getString(cursor.getColumnIndex(DatabaseConstants.FEED_FAVICON_URL)); - imageLoader.displayImage(faviconUrl, ((ImageView) v.findViewById(R.id.row_item_feedicon)), false); + FeedUtils.imageLoader.displayImage(faviconUrl, ((ImageView) v.findViewById(R.id.row_item_feedicon)), false); if (!TextUtils.equals(feedColor, "#null") && !TextUtils.equals(feedFade, "#null")) { borderOne.setBackgroundColor(Color.parseColor(feedColor)); diff --git a/clients/android/NewsBlur/src/com/newsblur/fragment/ProfileDetailsFragment.java b/clients/android/NewsBlur/src/com/newsblur/fragment/ProfileDetailsFragment.java index f33bdd76e..b403f8508 100644 --- a/clients/android/NewsBlur/src/com/newsblur/fragment/ProfileDetailsFragment.java +++ b/clients/android/NewsBlur/src/com/newsblur/fragment/ProfileDetailsFragment.java @@ -19,7 +19,7 @@ import com.newsblur.R; import com.newsblur.activity.NewsBlurApplication; import com.newsblur.domain.UserDetails; import com.newsblur.network.APIManager; -import com.newsblur.util.ImageLoader; +import com.newsblur.util.FeedUtils; import com.newsblur.util.PrefsUtils; import com.newsblur.util.UIUtils; @@ -30,14 +30,12 @@ public class ProfileDetailsFragment extends Fragment implements OnClickListener private View locationIcon; private ImageView imageView; private boolean viewingSelf = false; - private ImageLoader imageLoader; private Button followButton, unfollowButton; private APIManager apiManager; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - imageLoader = ((NewsBlurApplication) getActivity().getApplicationContext()).getImageLoader(); apiManager = new APIManager(getActivity()); } @@ -102,7 +100,7 @@ public class ProfileDetailsFragment extends Fragment implements OnClickListener followingCount.setText("" + user.followingCount); if (!viewingSelf) { - imageLoader.displayImage(user.photoUrl, imageView); + FeedUtils.imageLoader.displayImage(user.photoUrl, imageView); if (user.followedByYou) { unfollowButton.setVisibility(View.VISIBLE); followButton.setVisibility(View.GONE); diff --git a/clients/android/NewsBlur/src/com/newsblur/fragment/ReadingItemFragment.java b/clients/android/NewsBlur/src/com/newsblur/fragment/ReadingItemFragment.java index e0dca5b5c..854b1fe8d 100644 --- a/clients/android/NewsBlur/src/com/newsblur/fragment/ReadingItemFragment.java +++ b/clients/android/NewsBlur/src/com/newsblur/fragment/ReadingItemFragment.java @@ -45,7 +45,6 @@ import com.newsblur.service.NBSyncService; import com.newsblur.util.DefaultFeedView; import com.newsblur.util.FeedUtils; import com.newsblur.util.ImageCache; -import com.newsblur.util.ImageLoader; import com.newsblur.util.PrefsUtils; import com.newsblur.util.StoryUtils; import com.newsblur.util.UIUtils; @@ -65,7 +64,6 @@ public class ReadingItemFragment extends NbFragment implements ClassifierDialogF public static final String TEXT_SIZE_VALUE = "textSizeChangeValue"; public Story story; private LayoutInflater inflater; - private ImageLoader imageLoader; private String feedColor, feedTitle, feedFade, feedBorder, feedIconUrl, faviconText; private Classifier classifier; @FindView(R.id.reading_webview) NewsblurWebview web; @@ -133,7 +131,6 @@ public class ReadingItemFragment extends NbFragment implements ClassifierDialogF @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - imageLoader = ((NewsBlurApplication) getActivity().getApplicationContext()).getImageLoader(); story = getArguments() != null ? (Story) getArguments().getSerializable("story") : null; inflater = getActivity().getLayoutInflater(); @@ -307,7 +304,7 @@ public class ReadingItemFragment extends NbFragment implements ClassifierDialogF } private void setupItemCommentsAndShares() { - new SetupCommentSectionTask(this, view, inflater, story, imageLoader).execute(); + new SetupCommentSectionTask(this, view, inflater, story).execute(); } private void setupItemMetadata() { @@ -344,7 +341,7 @@ public class ReadingItemFragment extends NbFragment implements ClassifierDialogF itemFeed.setVisibility(View.GONE); feedIcon.setVisibility(View.GONE); } else { - imageLoader.displayImage(feedIconUrl, feedIcon, false); + FeedUtils.imageLoader.displayImage(feedIconUrl, feedIcon, false); itemFeed.setText(feedTitle); } diff --git a/clients/android/NewsBlur/src/com/newsblur/fragment/SetupCommentSectionTask.java b/clients/android/NewsBlur/src/com/newsblur/fragment/SetupCommentSectionTask.java index f9081e588..ad7a8e81a 100644 --- a/clients/android/NewsBlur/src/com/newsblur/fragment/SetupCommentSectionTask.java +++ b/clients/android/NewsBlur/src/com/newsblur/fragment/SetupCommentSectionTask.java @@ -31,7 +31,6 @@ import com.newsblur.domain.UserDetails; import com.newsblur.domain.UserProfile; import com.newsblur.fragment.ReplyDialogFragment; import com.newsblur.util.FeedUtils; -import com.newsblur.util.ImageLoader; import com.newsblur.util.PrefsUtils; import com.newsblur.util.ViewUtils; import com.newsblur.view.FlowLayout; @@ -45,20 +44,18 @@ public class SetupCommentSectionTask extends AsyncTask { private final ReadingItemFragment fragment; private final Story story; private final LayoutInflater inflater; - private final ImageLoader imageLoader; private WeakReference viewHolder; private final Context context; private UserDetails user; private final FragmentManager manager; private List comments; - public SetupCommentSectionTask(ReadingItemFragment fragment, View view, LayoutInflater inflater, Story story, ImageLoader imageLoader) { + public SetupCommentSectionTask(ReadingItemFragment fragment, View view, LayoutInflater inflater, Story story) { this.fragment = fragment; this.context = fragment.getActivity(); this.manager = fragment.getFragmentManager(); this.inflater = inflater; this.story = story; - this.imageLoader = imageLoader; viewHolder = new WeakReference(view); user = PrefsUtils.getUserDetails(context); } @@ -109,7 +106,7 @@ public class SetupCommentSectionTask extends AsyncTask { ImageView favouriteImage = new ImageView(context); UserProfile user = FeedUtils.dbHelper.getUserProfile(id); if (user != null) { - imageLoader.displayImage(user.photoUrl, favouriteImage, 10f); + FeedUtils.imageLoader.displayImage(user.photoUrl, favouriteImage, 10f); favouriteContainer.addView(favouriteImage); } } @@ -153,7 +150,7 @@ public class SetupCommentSectionTask extends AsyncTask { final UserProfile replyUser = FeedUtils.dbHelper.getUserProfile(reply.userId); if (replyUser != null) { - imageLoader.displayImage(replyUser.photoUrl, replyImage); + FeedUtils.imageLoader.displayImage(replyUser.photoUrl, replyImage); replyImage.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { @@ -200,11 +197,11 @@ public class SetupCommentSectionTask extends AsyncTask { UserProfile sourceUser = FeedUtils.dbHelper.getUserProfile(comment.sourceUserId); if (sourceUser != null) { - imageLoader.displayImage(sourceUser.photoUrl, sourceUserImage, 10f); - imageLoader.displayImage(userPhoto, usershareImage, 10f); + FeedUtils.imageLoader.displayImage(sourceUser.photoUrl, sourceUserImage, 10f); + FeedUtils.imageLoader.displayImage(userPhoto, usershareImage, 10f); } } else { - imageLoader.displayImage(userPhoto, commentImage, 10f); + FeedUtils.imageLoader.displayImage(userPhoto, commentImage, 10f); } commentImage.setOnClickListener(new OnClickListener() { @@ -265,7 +262,7 @@ public class SetupCommentSectionTask extends AsyncTask { if (!commentingUserIds.contains(userId)) { UserProfile user = FeedUtils.dbHelper.getUserProfile(userId); if (user != null) { - ImageView image = ViewUtils.createSharebarImage(context, imageLoader, user.photoUrl, user.userId); + ImageView image = ViewUtils.createSharebarImage(context, user.photoUrl, user.userId); sharedGrid.addView(image); } } @@ -275,7 +272,7 @@ public class SetupCommentSectionTask extends AsyncTask { for (String userId : commentingUserIds) { UserProfile user = FeedUtils.dbHelper.getUserProfile(userId); if (user != null) { - ImageView image = ViewUtils.createSharebarImage(context, imageLoader, user.photoUrl, user.userId); + ImageView image = ViewUtils.createSharebarImage(context, user.photoUrl, user.userId); commentGrid.addView(image); } } diff --git a/clients/android/NewsBlur/src/com/newsblur/util/FeedUtils.java b/clients/android/NewsBlur/src/com/newsblur/util/FeedUtils.java index 08acb7dd2..9872fd33e 100644 --- a/clients/android/NewsBlur/src/com/newsblur/util/FeedUtils.java +++ b/clients/android/NewsBlur/src/com/newsblur/util/FeedUtils.java @@ -25,7 +25,11 @@ import com.newsblur.service.NBSyncService; public class FeedUtils { + // these are app-level singletons stored here for convenience. however, they + // cannot be created lazily or via static init, they have to be created when + // the main app context is created and then pushed here. see NewsBlurApplication. public static BlurDatabaseHelper dbHelper; + public static ImageLoader imageLoader; public static void offerDB(BlurDatabaseHelper _dbHelper) { if (_dbHelper.isOpen()) { @@ -33,6 +37,10 @@ public class FeedUtils { } } + public static void offerImageLoader(ImageLoader _imageLoader) { + imageLoader = _imageLoader; + } + private static void triggerSync(Context c) { Intent i = new Intent(c, NBSyncService.class); c.startService(i); diff --git a/clients/android/NewsBlur/src/com/newsblur/util/UIUtils.java b/clients/android/NewsBlur/src/com/newsblur/util/UIUtils.java index ecd0f64b4..bd6fb7262 100644 --- a/clients/android/NewsBlur/src/com/newsblur/util/UIUtils.java +++ b/clients/android/NewsBlur/src/com/newsblur/util/UIUtils.java @@ -90,7 +90,7 @@ public class UIUtils { */ public static void setCustomActionBar(Activity activity, String imageUrl, String title) { ImageView iconView = setupCustomActionbar(activity, title); - ((NewsBlurApplication) activity.getApplicationContext()).getImageLoader().displayImage(imageUrl, iconView, false); + FeedUtils.imageLoader.displayImage(imageUrl, iconView, false); } public static void setCustomActionBar(Activity activity, int imageId, String title) { diff --git a/clients/android/NewsBlur/src/com/newsblur/util/ViewUtils.java b/clients/android/NewsBlur/src/com/newsblur/util/ViewUtils.java index 9ce8e9840..62989cdbf 100644 --- a/clients/android/NewsBlur/src/com/newsblur/util/ViewUtils.java +++ b/clients/android/NewsBlur/src/com/newsblur/util/ViewUtils.java @@ -47,7 +47,7 @@ public class ViewUtils { } } - public static ImageView createSharebarImage(final Context context, final ImageLoader imageLoader, final String photoUrl, final String userId) { + public static ImageView createSharebarImage(final Context context, final String photoUrl, final String userId) { ImageView image = new ImageView(context); int imageLength = UIUtils.dp2px(context, 15); image.setMaxHeight(imageLength); @@ -62,7 +62,7 @@ public class ViewUtils { image.setMaxWidth(imageLength); image.setLayoutParams(imageParameters); - imageLoader.displayImage(photoUrl, image, 10f); + FeedUtils.imageLoader.displayImage(photoUrl, image, 10f); image.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { diff --git a/clients/android/NewsBlur/src/com/newsblur/view/ActivityDetailsAdapter.java b/clients/android/NewsBlur/src/com/newsblur/view/ActivityDetailsAdapter.java index 0287ce985..3a785b677 100644 --- a/clients/android/NewsBlur/src/com/newsblur/view/ActivityDetailsAdapter.java +++ b/clients/android/NewsBlur/src/com/newsblur/view/ActivityDetailsAdapter.java @@ -16,25 +16,22 @@ import com.newsblur.domain.UserDetails; import com.newsblur.domain.ActivityDetails; import com.newsblur.domain.ActivityDetails.Category; import com.newsblur.network.APIConstants; +import com.newsblur.util.FeedUtils; import com.newsblur.util.ImageLoader; import com.newsblur.util.PrefsUtils; public abstract class ActivityDetailsAdapter extends ArrayAdapter { private LayoutInflater inflater; - private ImageLoader imageLoader; protected final String ago; protected ForegroundColorSpan linkColor, contentColor, quoteColor; private String TAG = "ActivitiesAdapter"; - private Context context; protected UserDetails currentUserDetails; protected final boolean userIsYou; public ActivityDetailsAdapter(final Context context, UserDetails user) { super(context, R.id.row_activity_text); inflater = LayoutInflater.from(context); - imageLoader = ((NewsBlurApplication) context.getApplicationContext()).getImageLoader(); - this.context = context; currentUserDetails = user; @@ -70,13 +67,13 @@ public abstract class ActivityDetailsAdapter extends ArrayAdapter