Skip to content

Commit

Permalink
User a NetworkBitmapClient as a wrapper for Picasso
Browse files Browse the repository at this point in the history
  • Loading branch information
lenguyenthanh committed Mar 28, 2016
1 parent 0c13a5b commit 662479a
Show file tree
Hide file tree
Showing 9 changed files with 116 additions and 56 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import android.os.Looper;
import android.support.annotation.NonNull;

import com.artemzin.qualitymatters.models.NetworkBitmapClient;
import com.artemzin.qualitymatters.models.PicassoBitmapClient;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.jakewharton.picasso.OkHttp3Downloader;
import com.squareup.picasso.Picasso;
Expand Down Expand Up @@ -49,4 +51,9 @@ public Picasso providePicasso(@NonNull Application qualityMattersApp, @NonNull O
.downloader(new OkHttp3Downloader(okHttpClient))
.build();
}

@Provides @NonNull @Singleton
public NetworkBitmapClient provideNetworkBitmapClient(@NonNull Picasso picasso) {
return new PicassoBitmapClient(picasso);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.artemzin.qualitymatters.models;

import android.widget.ImageView;

public interface NetworkBitmapClient {
void downloadInto(String url, ImageView imageView);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.artemzin.qualitymatters.models;

import android.widget.ImageView;
import com.squareup.picasso.Picasso;

public class PicassoBitmapClient implements NetworkBitmapClient {

private final Picasso picasso;

public PicassoBitmapClient(final Picasso picasso) {
this.picasso = picasso;
}

@Override
public void downloadInto(String url, ImageView imageView) {
picasso.load(url).fit().centerCrop().into(imageView);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,32 +5,31 @@
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import com.artemzin.qualitymatters.R;
import com.artemzin.qualitymatters.api.entities.Item;
import com.squareup.picasso.Picasso;
import com.artemzin.qualitymatters.models.NetworkBitmapClient;

class ItemViewHolder extends RecyclerView.ViewHolder {

@NonNull
private final Picasso picasso;
private final NetworkBitmapClient networkBitmapClient;

private final ImageView imageView;

private final TextView titleTextView;

private final TextView shortDescriptionTextView;

ItemViewHolder(@NonNull View itemView, @NonNull Picasso picasso) {
ItemViewHolder(@NonNull View itemView, @NonNull NetworkBitmapClient networkBitmapClient) {
super(itemView);
this.picasso = picasso;
this.networkBitmapClient = networkBitmapClient;
imageView = (ImageView) itemView.findViewById(R.id.list_item_image_view);
titleTextView = (TextView) itemView.findViewById(R.id.list_item_title_text_view);
shortDescriptionTextView = (TextView) itemView.findViewById(R.id.list_item_short_description_text_view);
}

public void bind(@NonNull Item item) {
picasso.load(item.imagePreviewUrl()).fit().centerCrop().into(imageView);
networkBitmapClient.downloadInto(item.imagePreviewUrl(), imageView);
titleTextView.setText(item.title());
shortDescriptionTextView.setText(item.shortDescription());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

import com.artemzin.qualitymatters.R;
import com.artemzin.qualitymatters.api.entities.Item;
import com.squareup.picasso.Picasso;
import com.artemzin.qualitymatters.models.NetworkBitmapClient;

import java.util.List;

Expand All @@ -20,14 +20,14 @@ public class ItemsAdapter extends RecyclerView.Adapter<ItemViewHolder> {
private final LayoutInflater layoutInflater;

@NonNull
private final Picasso picasso;
private final NetworkBitmapClient networkBitmapClient;

@NonNull
private List<Item> items = emptyList();

public ItemsAdapter(@NonNull LayoutInflater layoutInflater, @NonNull Picasso picasso) {
public ItemsAdapter(@NonNull LayoutInflater layoutInflater, @NonNull NetworkBitmapClient networkBitmapClient) {
this.layoutInflater = layoutInflater;
this.picasso = picasso;
this.networkBitmapClient = networkBitmapClient;
}

@Override
Expand All @@ -42,7 +42,7 @@ public void setData(@NonNull List<Item> items) {

@Override @NonNull
public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ItemViewHolder(layoutInflater.inflate(R.layout.list_item, parent, false), picasso);
return new ItemViewHolder(layoutInflater.inflate(R.layout.list_item, parent, false), networkBitmapClient);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,33 +9,29 @@
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;
import com.artemzin.qualitymatters.ApplicationModule;
import com.artemzin.qualitymatters.QualityMattersApp;
import com.artemzin.qualitymatters.R;
import com.artemzin.qualitymatters.api.entities.Item;
import com.artemzin.qualitymatters.models.AnalyticsModel;
import com.artemzin.qualitymatters.models.ItemsModel;
import com.artemzin.qualitymatters.models.NetworkBitmapClient;
import com.artemzin.qualitymatters.performance.AnyThread;
import com.artemzin.qualitymatters.performance.AsyncJobsObserver;
import com.artemzin.qualitymatters.ui.adapters.ItemsAdapter;
import com.artemzin.qualitymatters.ui.adapters.VerticalSpaceItemDecoration;
import com.artemzin.qualitymatters.ui.presenters.ItemsPresenter;
import com.artemzin.qualitymatters.ui.presenters.ItemsPresenterConfiguration;
import com.artemzin.qualitymatters.ui.views.ItemsView;
import com.squareup.picasso.Picasso;

import java.util.List;

import javax.inject.Inject;
import javax.inject.Named;

import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;
import dagger.Module;
import dagger.Provides;
import dagger.Subcomponent;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import rx.schedulers.Schedulers;

import static android.support.v7.widget.LinearLayoutManager.VERTICAL;
Expand All @@ -62,7 +58,7 @@ public class ItemsFragment extends BaseFragment implements ItemsView {
ItemsPresenter itemsPresenter;

@Inject
Picasso picasso;
NetworkBitmapClient networkBitmapClient;

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
Expand All @@ -81,7 +77,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
ButterKnife.bind(this, view);
contentUiRecyclerView.setLayoutManager(new LinearLayoutManager(getContext(), VERTICAL, false));
contentUiRecyclerView.addItemDecoration(new VerticalSpaceItemDecoration((int) getResources().getDimension(R.dimen.list_item_vertical_space_between_items)));
itemsAdapter = new ItemsAdapter(getActivity().getLayoutInflater(), picasso);
itemsAdapter = new ItemsAdapter(getActivity().getLayoutInflater(), networkBitmapClient);
contentUiRecyclerView.setAdapter(itemsAdapter);
itemsPresenter.bindView(this);
itemsPresenter.reloadData();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package com.artemzin.qualitymatters.models;

import android.support.annotation.NonNull;
import android.widget.ImageView;

import com.artemzin.qualitymatters.QualityMattersRobolectricUnitTestRunner;
import com.squareup.picasso.Picasso;
import com.squareup.picasso.RequestCreator;

import org.junit.Test;
import org.junit.runner.RunWith;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

@RunWith(QualityMattersRobolectricUnitTestRunner.class)
public class PicassoBitmapClientTest {

@SuppressWarnings("NullableProblems") // Initialized in @Before.
@NonNull
private ImageView imageView;

@SuppressWarnings("NullableProblems") // Initialized in @Before.
@NonNull
private Picasso picasso;

private String url = "http://url.com";

@SuppressWarnings("NullableProblems") // Initialized in @Before.
@NonNull
private PicassoBitmapClient picassoBitmapClient;

@Test
public void downloadInto_should_load_then_fit_then_centerCrop() throws Exception {
picasso = mock(Picasso.class);
imageView = mock(ImageView.class);

RequestCreator loadRequestCreator = mock(RequestCreator.class);
RequestCreator fitRequestCreator = mock(RequestCreator.class);
RequestCreator centerCropRequestCreator = mock(RequestCreator.class);

when(picasso.load(url)).thenReturn(loadRequestCreator);
when(loadRequestCreator.fit()).thenReturn(fitRequestCreator);
when(fitRequestCreator.centerCrop()).thenReturn(centerCropRequestCreator);

picassoBitmapClient = new PicassoBitmapClient(picasso);
picassoBitmapClient.downloadInto(url, imageView);

verify(picasso).load(url);
verify(loadRequestCreator).fit();
verify(fitRequestCreator).centerCrop();
verify(centerCropRequestCreator).into(imageView);

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,27 +5,22 @@
import android.widget.ImageView;
import android.widget.TextView;

import com.artemzin.qualitymatters.QualityMattersRobolectricUnitTestRunner;
import com.artemzin.qualitymatters.R;
import com.artemzin.qualitymatters.api.entities.Item;
import com.squareup.picasso.Picasso;
import com.squareup.picasso.RequestCreator;
import com.artemzin.qualitymatters.models.NetworkBitmapClient;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

@RunWith(QualityMattersRobolectricUnitTestRunner.class)
public class ItemViewHolderTest {

@SuppressWarnings("NullableProblems") // Initialized in @Before.
@NonNull
private Picasso picasso;
private NetworkBitmapClient networkBitmapClient;

@SuppressWarnings("NullableProblems") // Initialized in @Before.
@NonNull
Expand Down Expand Up @@ -53,13 +48,7 @@ public class ItemViewHolderTest {

@Before
public void beforeEachTest() {
picasso = mock(Picasso.class);

// Just mock the "Fluent API"…
RequestCreator requestCreator = mock(RequestCreator.class);
when(picasso.load(anyString())).thenReturn(requestCreator);
when(requestCreator.fit()).thenReturn(requestCreator);
when(requestCreator.centerCrop()).thenReturn(requestCreator);
networkBitmapClient = mock(NetworkBitmapClient.class);

itemView = mock(View.class);

Expand All @@ -71,7 +60,7 @@ public void beforeEachTest() {
when(itemView.findViewById(R.id.list_item_title_text_view)).thenReturn(titleTextView);
when(itemView.findViewById(R.id.list_item_short_description_text_view)).thenReturn(shortDescriptionTextView);

itemViewHolder = new ItemViewHolder(itemView, picasso);
itemViewHolder = new ItemViewHolder(itemView, networkBitmapClient);

item = Item.builder()
.id("1")
Expand All @@ -83,20 +72,8 @@ public void beforeEachTest() {

@Test
public void bind_shouldLoadPreviewImage() {
RequestCreator loadRequestCreator = mock(RequestCreator.class);
RequestCreator fitRequestCreator = mock(RequestCreator.class);
RequestCreator centerCropRequestCreator = mock(RequestCreator.class);

when(picasso.load(item.imagePreviewUrl())).thenReturn(loadRequestCreator);
when(loadRequestCreator.fit()).thenReturn(fitRequestCreator);
when(fitRequestCreator.centerCrop()).thenReturn(centerCropRequestCreator);

itemViewHolder.bind(item);

verify(picasso).load(item.imagePreviewUrl());
verify(loadRequestCreator).fit();
verify(fitRequestCreator).centerCrop();
verify(centerCropRequestCreator).into(imageView);
verify(networkBitmapClient).downloadInto(item.imagePreviewUrl(), imageView);
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import com.artemzin.qualitymatters.QualityMattersRobolectricUnitTestRunner;
import com.artemzin.qualitymatters.R;
import com.artemzin.qualitymatters.api.entities.Item;
import com.squareup.picasso.Picasso;
import com.artemzin.qualitymatters.models.NetworkBitmapClient;

import org.junit.Before;
import org.junit.Test;
Expand All @@ -36,7 +36,7 @@ public class ItemsAdapterTest {

@SuppressWarnings("NullableProblems") // Initialized in @Before.
@NonNull
private Picasso picasso;
private NetworkBitmapClient networkBitmapClient;

@SuppressWarnings("NullableProblems") // Initialized in @Before.
@NonNull
Expand All @@ -45,8 +45,8 @@ public class ItemsAdapterTest {
@Before
public void beforeEachTest() {
layoutInflater = mock(LayoutInflater.class);
picasso = mock(Picasso.class);
adapter = new ItemsAdapter(layoutInflater, picasso);
networkBitmapClient = mock(NetworkBitmapClient.class);
adapter = new ItemsAdapter(layoutInflater, networkBitmapClient);
}

@Test
Expand Down

0 comments on commit 662479a

Please sign in to comment.