Skip to content

Commit 9e42433

Browse files
committed
Redid API interface, adding support for Bing Images (still uses Google, no user choice yet)
1 parent efd3ea4 commit 9e42433

21 files changed

Lines changed: 636 additions & 188 deletions

app/app.iml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,13 @@
9393
<orderEntry type="library" exported="" name="appcompat-v7-21.0.3" level="project" />
9494
<orderEntry type="library" exported="" name="androidasync-2.0.2" level="project" />
9595
<orderEntry type="library" exported="" name="ion-2.0.2" level="project" />
96+
<orderEntry type="library" exported="" name="okhttp-2.1.0" level="project" />
9697
<orderEntry type="library" exported="" name="recyclerview-v7-21.0.3" level="project" />
9798
<orderEntry type="library" exported="" name="support-annotations-21.0.3" level="project" />
99+
<orderEntry type="library" exported="" name="okio-1.0.1" level="project" />
98100
<orderEntry type="library" exported="" name="material-dialogs-0.4.7" level="project" />
99101
<orderEntry type="library" exported="" name="library-1.2.2" level="project" />
102+
<orderEntry type="library" exported="" name="okhttp-urlconnection-2.1.0" level="project" />
100103
</component>
101104
</module>
102105

app/build.gradle

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ android {
99
applicationId "com.stevenschoen.imagesearcher"
1010
minSdkVersion 15
1111
targetSdkVersion 21
12-
versionCode 3
13-
versionName "0.2.1"
12+
versionCode 5
13+
versionName "0.3"
1414
}
1515

1616
buildTypes {
@@ -30,6 +30,8 @@ dependencies {
3030
compile 'com.google.android.gms:play-services-base:6.5.+'
3131
compile 'commons-io:commons-io:2.4'
3232
compile 'com.squareup.retrofit:retrofit:1.8.0'
33+
compile 'com.squareup.okhttp:okhttp:2.1.0'
34+
compile 'com.squareup.okhttp:okhttp-urlconnection:2.1.0'
3335
compile 'com.koushikdutta.ion:ion:2.0.2'
3436
compile 'com.github.chrisbanes.photoview:library:1.2.2'
3537
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.stevenschoen.imagesearcher;
2+
3+
import com.stevenschoen.imagesearcher.model.bing.BingSearchResponse;
4+
5+
import retrofit.http.GET;
6+
import retrofit.http.Query;
7+
8+
public interface BingSearchInterface {
9+
public static final String BASE_URL = "https://api.datamarket.azure.com/Bing/Search/v1";
10+
public static final String API_KEY = "IzzjGEoDbc6kUVakkclWmrAYURcokmSrevY8bzm+R+U";
11+
12+
public static final String SOURCE_IMAGE = "image";
13+
public static final String FORMAT_JSON = "json";
14+
15+
@GET("/Composite")
16+
public BingSearchResponse search(@Query("Sources") String sources,
17+
@Query("Query") String query,
18+
@Query("$skip") long skip,
19+
@Query("$format") String format);
20+
}

app/src/main/java/com/stevenschoen/imagesearcher/FakeSearchInterface.java renamed to app/src/main/java/com/stevenschoen/imagesearcher/FakeGoogleSearchInterface.java

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
package com.stevenschoen.imagesearcher;
22

3-
import com.stevenschoen.imagesearcher.model.ImageResult;
4-
import com.stevenschoen.imagesearcher.model.SearchResponse;
3+
import com.stevenschoen.imagesearcher.model.google.GoogleImage;
4+
import com.stevenschoen.imagesearcher.model.google.GoogleSearchResponse;
55

6-
public class FakeSearchInterface implements SearchInterface {
6+
public class FakeGoogleSearchInterface {
77

88
private static final int ITEMS_COUNT = 10;
99

10-
@Override
11-
public SearchResponse search(String query, int startIndex, String searchType) {
12-
SearchResponse response = new SearchResponse();
10+
public GoogleSearchResponse search() {
11+
GoogleSearchResponse response = new GoogleSearchResponse();
1312

1413
makeItems(response);
1514
makeQueries(response);
@@ -24,16 +23,16 @@ public SearchResponse search(String query, int startIndex, String searchType) {
2423
return response;
2524
}
2625

27-
private void makeItems(SearchResponse response) {
28-
ImageResult[] items = new ImageResult[ITEMS_COUNT];
26+
private void makeItems(GoogleSearchResponse response) {
27+
GoogleImage[] items = new GoogleImage[ITEMS_COUNT];
2928

3029
for (int i = 0; i < items.length; i++) {
31-
ImageResult result = new ImageResult();
30+
GoogleImage result = new GoogleImage();
3231
result.title = "Test result " + i;
3332
result.link = "http://www.breastcancerwellness.org/bcw/wp-content/uploads/2014/09/test.gif";
3433
result.displayLink = "www.test.com";
3534
result.mime = "image/gif";
36-
result.image = new ImageResult.Image();
35+
result.image = new GoogleImage.Image();
3736
result.image.height = 828;
3837
result.image.width = 1646;
3938
result.image.byteSize = 22544;
@@ -45,19 +44,19 @@ private void makeItems(SearchResponse response) {
4544
response.items = items;
4645
}
4746

48-
private void makeQueries(SearchResponse response) {
49-
SearchResponse.Queries queries = new SearchResponse.Queries();
47+
private void makeQueries(GoogleSearchResponse response) {
48+
GoogleSearchResponse.GoogleQueries queries = new GoogleSearchResponse.GoogleQueries();
5049

51-
SearchResponse.Queries.Page currentPage = new SearchResponse.Queries.Page();
50+
GoogleSearchResponse.GoogleQueries.GooglePage currentPage = new GoogleSearchResponse.GoogleQueries.GooglePage();
5251
currentPage.count = ITEMS_COUNT;
5352
currentPage.startIndex = 1;
5453
queries.request[0] = currentPage;
5554

5655
response.queries = queries;
5756
}
5857

59-
private void makeSearchInformation(SearchResponse response) {
60-
SearchResponse.SearchInformation searchInformation = new SearchResponse.SearchInformation();
58+
private void makeSearchInformation(GoogleSearchResponse response) {
59+
GoogleSearchResponse.GoogleSearchInformation searchInformation = new GoogleSearchResponse.GoogleSearchInformation();
6160

6261
searchInformation.totalResults = 7000000;
6362

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.stevenschoen.imagesearcher;
2+
3+
import com.stevenschoen.imagesearcher.model.google.GoogleSearchResponse;
4+
5+
import retrofit.http.GET;
6+
import retrofit.http.Query;
7+
8+
public interface GoogleSearchInterface {
9+
public static final String BASE_URL = "https://www.googleapis.com/customsearch";
10+
public static final String API_KEY = "AIzaSyCCuxxVLzm2sZP-adhRNYKeSck1mMMgsAM"; // Allows all
11+
// public static final String API_KEY = "AIzaSyBxS4Ocy29KrmGZkr2uibqc78JBdtEyxz8"; // Android, not working
12+
public static final String CUSTOM_SEARCH_ID = "006276545175240274241:4xzxdv12bjw";
13+
14+
public static final String SEARCH_TYPE_IMAGE = "image";
15+
16+
@GET("/v1")
17+
public GoogleSearchResponse search(@Query("q") String query,
18+
@Query("start") long startIndex,
19+
@Query("searchType") String searchType);
20+
}

app/src/main/java/com/stevenschoen/imagesearcher/ImagesAdapter.java

Lines changed: 69 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,30 @@
77
import android.widget.ImageView;
88

99
import com.koushikdutta.ion.Ion;
10-
import com.stevenschoen.imagesearcher.model.ImageResult;
10+
import com.stevenschoen.imagesearcher.model.Image;
1111

1212
import java.util.List;
1313

1414
public class ImagesAdapter extends RecyclerView.Adapter<ImagesAdapter.ImageHolder> {
1515

16-
public List<ImageResult> images;
16+
private static final int TYPE_IMAGE = 1;
17+
private static final int TYPE_MORE_BUTTON = 2;
18+
19+
private MoreImagesCallback moreImagesCallback;
20+
21+
public List<Image> images;
1722

1823
private OnItemClickListener itemClickListener;
1924

20-
public ImagesAdapter(List<ImageResult> images) {
25+
public ImagesAdapter(List<Image> images) {
2126
super();
2227
this.images = images;
2328
}
2429

2530
@Override
2631
public ImageHolder onCreateViewHolder(ViewGroup parent, int viewType) {
27-
View view = LayoutInflater.from(parent.getContext())
28-
.inflate(R.layout.imageresult_grid, parent, false);
32+
int layoutResourceId = R.layout.imageresult_grid;
33+
View view = LayoutInflater.from(parent.getContext()).inflate(layoutResourceId, parent, false);
2934

3035
ImageHolder holder = new ImageHolder(view);
3136
holder.root = view;
@@ -36,34 +41,61 @@ public ImageHolder onCreateViewHolder(ViewGroup parent, int viewType) {
3641

3742
@Override
3843
public void onBindViewHolder(final ImageHolder holder, final int position) {
39-
final ImageResult image = images.get(position);
40-
41-
holder.root.setOnClickListener(new View.OnClickListener() {
42-
@Override
43-
public void onClick(View v) {
44-
if (itemClickListener != null) {
45-
itemClickListener.onItemClick(holder.root, position);
46-
}
47-
}
48-
});
49-
holder.root.setOnLongClickListener(new View.OnLongClickListener() {
50-
@Override
51-
public boolean onLongClick(View v) {
52-
if (itemClickListener != null) {
53-
itemClickListener.onItemLongClick(holder.root, position);
54-
return true;
55-
}
56-
return false;
57-
}
58-
});
59-
60-
Ion.with(holder.image.getContext()).load(image.image.thumbnailLink).withBitmap().fadeIn(true).intoImageView(holder.image);
61-
holder.image.setContentDescription(image.title);
44+
switch (getItemViewType(position)) {
45+
case TYPE_IMAGE:
46+
final Image image = images.get(position);
47+
holder.root.setOnClickListener(new View.OnClickListener() {
48+
@Override
49+
public void onClick(View v) {
50+
if (itemClickListener != null) {
51+
itemClickListener.onItemClick(holder.root, position);
52+
}
53+
}
54+
});
55+
holder.root.setOnLongClickListener(new View.OnLongClickListener() {
56+
@Override
57+
public boolean onLongClick(View v) {
58+
if (itemClickListener != null) {
59+
itemClickListener.onItemLongClick(holder.root, position);
60+
return true;
61+
}
62+
return false;
63+
}
64+
});
65+
Ion.with(holder.image.getContext()).load(image.thumbnailLink).withBitmap().fadeIn(true).intoImageView(holder.image);
66+
holder.image.setContentDescription(image.title);
67+
break;
68+
case TYPE_MORE_BUTTON:
69+
holder.root.setOnClickListener(new View.OnClickListener() {
70+
@Override
71+
public void onClick(View v) {
72+
if (moreImagesCallback != null) {
73+
moreImagesCallback.onMoreImagesPressed();
74+
}
75+
}
76+
});
77+
holder.root.setOnLongClickListener(null);
78+
holder.image.setImageResource(R.drawable.more);
79+
holder.image.setContentDescription("More");
80+
}
6281
}
6382

6483
@Override
6584
public int getItemCount() {
66-
return images.size();
85+
if (images.isEmpty()) {
86+
return 0;
87+
} else {
88+
return images.size() + 1;
89+
}
90+
}
91+
92+
@Override
93+
public int getItemViewType(int position) {
94+
if (position < images.size()) {
95+
return TYPE_IMAGE;
96+
} else {
97+
return TYPE_MORE_BUTTON;
98+
}
6799
}
68100

69101
public void setOnItemClickListener(OnItemClickListener itemClickListener) {
@@ -75,6 +107,10 @@ public interface OnItemClickListener {
75107
public void onItemLongClick(View view, int position);
76108
}
77109

110+
public void setMoreImagesCallback(MoreImagesCallback callback) {
111+
this.moreImagesCallback = callback;
112+
}
113+
78114
public static class ImageHolder extends RecyclerView.ViewHolder {
79115
public View root;
80116
public ImageView image;
@@ -83,4 +119,8 @@ public ImageHolder(View itemView) {
83119
super(itemView);
84120
}
85121
}
122+
123+
public static interface MoreImagesCallback {
124+
public void onMoreImagesPressed();
125+
}
86126
}

0 commit comments

Comments
 (0)