Skip to content

Commit e0cae93

Browse files
committed
Display contributions from other people to the campaign
Attempts to be as minimally invasive as possible Change-Id: I1c9d7080d046199d5277385da625c180a8bacbfa
1 parent 2da5453 commit e0cae93

File tree

11 files changed

+194
-48
lines changed

11 files changed

+194
-48
lines changed

commons/src/main/java/org/wikimedia/commons/Media.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,9 @@ public void setLicense(String license) {
144144

145145
protected String creator;
146146

147+
public Media(String filename) {
148+
this.filename = filename;
149+
}
147150

148151
public Media(Uri localUri, String imageUrl, String filename, String description, long dataLength, Date dateCreated, Date dateUploaded, String creator) {
149152
this.localUri = localUri;

commons/src/main/java/org/wikimedia/commons/Utils.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.wikimedia.commons;
22

33
import android.os.*;
4+
import android.util.Log;
45
import com.nostra13.universalimageloader.core.*;
56
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
67
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;

commons/src/main/java/org/wikimedia/commons/campaigns/Campaign.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@
77
import org.json.JSONException;
88
import org.json.JSONObject;
99

10+
import java.io.Serializable;
1011
import java.util.ArrayList;
1112

12-
public class Campaign {
13+
// FIXME: Implement Parcelable
14+
public class Campaign implements Serializable {
1315
private boolean enabled;
1416

1517
private String autoAddWikitext;

commons/src/main/java/org/wikimedia/commons/campaigns/CampaignActivity.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,39 @@
11
package org.wikimedia.commons.campaigns;
22

33
import android.app.Activity;
4+
import android.content.Intent;
45
import android.database.Cursor;
56
import android.os.Bundle;
67
import android.support.v4.app.LoaderManager;
78
import android.support.v4.content.CursorLoader;
89
import android.support.v4.content.Loader;
10+
import android.view.View;
11+
import android.widget.AdapterView;
912
import android.widget.ListView;
1013
import com.actionbarsherlock.app.SherlockFragmentActivity;
1114
import org.wikimedia.commons.R;
15+
import org.wikimedia.commons.contributions.ContributionsActivity;
1216

1317
public class CampaignActivity
1418
extends SherlockFragmentActivity
1519
implements LoaderManager.LoaderCallbacks<Cursor> {
1620

1721
private ListView campaignsListView;
1822
private CampaignsListAdapter campaignsListAdapter;
19-
private Cursor allCampaigns;
2023

2124
public void onCreate(Bundle savedInstanceState) {
2225
super.onCreate(savedInstanceState);
2326
setContentView(R.layout.activity_campaigns);
2427
campaignsListView = (ListView) findViewById(R.id.campaignsList);
28+
29+
campaignsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
30+
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
31+
Campaign c = Campaign.fromCursor((Cursor) adapterView.getItemAtPosition(i));
32+
Intent intent = new Intent(CampaignActivity.this, ContributionsActivity.class);
33+
intent.putExtra("campaign", c);
34+
startActivity(intent);
35+
}
36+
});
2537
getSupportLoaderManager().initLoader(0, null, this);
2638
}
2739

commons/src/main/java/org/wikimedia/commons/contributions/ContributionsActivity.java

Lines changed: 43 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import android.content.*;
99
import android.database.Cursor;
1010
import android.os.Bundle;
11+
import android.support.v4.widget.CursorAdapter;
1112
import android.util.Log;
1213
import android.view.View;
1314
import android.widget.AdapterView;
@@ -16,12 +17,15 @@
1617

1718
import org.wikimedia.commons.*;
1819
import org.wikimedia.commons.auth.*;
20+
import org.wikimedia.commons.campaigns.Campaign;
1921
import org.wikimedia.commons.media.*;
2022
import org.wikimedia.commons.upload.UploadService;
2123

24+
import java.util.ArrayList;
25+
2226
public class ContributionsActivity
2327
extends AuthenticatedActivity
24-
implements LoaderManager.LoaderCallbacks<Cursor>,
28+
implements LoaderManager.LoaderCallbacks<Object>,
2529
AdapterView.OnItemClickListener,
2630
MediaDetailPagerFragment.MediaDetailProvider,
2731
FragmentManager.OnBackStackChangedListener {
@@ -31,6 +35,8 @@ public class ContributionsActivity
3135
private ContributionsListFragment contributionsList;
3236
private MediaDetailPagerFragment mediaDetails;
3337

38+
private Campaign campaign;
39+
3440
public ContributionsActivity() {
3541
super(WikiAccountAuthenticator.COMMONS_ACCOUNT_TYPE);
3642
}
@@ -101,6 +107,10 @@ protected void onCreate(Bundle savedInstanceState) {
101107
setTitle(R.string.title_activity_contributions);
102108
setContentView(R.layout.activity_contributions);
103109

110+
if(getIntent().hasExtra("campaign")) {
111+
this.campaign = (Campaign) getIntent().getSerializableExtra("campaign");
112+
}
113+
104114
contributionsList = (ContributionsListFragment)getSupportFragmentManager().findFragmentById(R.id.contributionsListFragment);
105115

106116
getSupportFragmentManager().addOnBackStackChangedListener(this);
@@ -180,45 +190,59 @@ protected void onAuthFailure() {
180190

181191

182192
public void onItemClick(AdapterView<?> adapterView, View view, int position, long item) {
183-
Cursor cursor = (Cursor)adapterView.getItemAtPosition(position);
184-
Contribution c = Contribution.fromCursor(cursor);
185-
186-
Log.d("Commons", "Clicking for " + c.toContentValues());
187193
showDetail(position);
188-
189-
Log.d("Commons", "You clicked on:" + c.toContentValues().toString());
190194
}
191195

192196
@Override
193197
public boolean onCreateOptionsMenu(Menu menu) {
194198
return super.onCreateOptionsMenu(menu);
195199
}
196200

197-
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
198-
return new CursorLoader(this, ContributionsContentProvider.BASE_URI, Contribution.Table.ALL_FIELDS, CONTRIBUTION_SELECTION, null, CONTRIBUTION_SORT);
201+
public Loader onCreateLoader(int i, Bundle bundle) {
202+
if(campaign == null) {
203+
return new CursorLoader(this, ContributionsContentProvider.BASE_URI, Contribution.Table.ALL_FIELDS, CONTRIBUTION_SELECTION, null, CONTRIBUTION_SORT);
204+
} else {
205+
return new CategoryImagesLoader(this, campaign.getTrackingCategory());
206+
}
199207
}
200208

201-
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
202-
allContributions = cursor;
203-
contributionsList.setCursor(cursor);
209+
public void onLoadFinished(Loader cursorLoader, Object result) {
210+
if(campaign == null) {
211+
Cursor cursor = (Cursor) result;
212+
if(contributionsList.getAdapter() == null) {
213+
contributionsList.setAdapter(new ContributionsListAdapter(this, cursor, 0));
214+
} else {
215+
((CursorAdapter)contributionsList.getAdapter()).swapCursor(cursor);
216+
}
204217

205-
getSupportActionBar().setSubtitle(getResources().getQuantityString(R.plurals.contributions_subtitle, cursor.getCount(), cursor.getCount()));
218+
getSupportActionBar().setSubtitle(getResources().getQuantityString(R.plurals.contributions_subtitle, cursor.getCount(), cursor.getCount()));
219+
} else {
220+
contributionsList.setAdapter(new MediaListAdapter(this, (ArrayList<Media>) result));
221+
}
206222
}
207223

208-
public void onLoaderReset(Loader<Cursor> cursorLoader) {
209-
contributionsList.setCursor(null);
224+
public void onLoaderReset(Loader cursorLoader) {
225+
if(campaign == null) {
226+
((CursorAdapter) contributionsList.getAdapter()).swapCursor(null);
227+
} else {
228+
//((MediaListAdapter) contributionsList.getAdapter()).
229+
// DO SOMETHING!
230+
}
210231
}
211232

212233
public Media getMediaAtPosition(int i) {
213-
allContributions.moveToPosition(i);
214-
return Contribution.fromCursor(allContributions);
234+
if(campaign == null) {
235+
return Contribution.fromCursor((Cursor) contributionsList.getAdapter().getItem(i));
236+
} else {
237+
return (Media) contributionsList.getAdapter().getItem(i);
238+
}
215239
}
216240

217241
public int getTotalMediaCount() {
218-
if(allContributions == null) {
242+
if(contributionsList.getAdapter() == null) {
219243
return 0;
220244
}
221-
return allContributions.getCount();
245+
return contributionsList.getAdapter().getCount();
222246
}
223247

224248
public void notifyDatasetChanged() {

commons/src/main/java/org/wikimedia/commons/contributions/ContributionsListAdapter.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.wikimedia.commons.contributions;
22

3+
import android.app.Activity;
34
import android.content.Context;
45
import android.database.Cursor;
56
import android.graphics.Bitmap;
@@ -19,16 +20,16 @@
1920
class ContributionsListAdapter extends CursorAdapter {
2021

2122
private DisplayImageOptions contributionDisplayOptions = Utils.getGenericDisplayOptions().build();;
22-
private SherlockFragment fragment;
23+
private Activity activity;
2324

24-
public ContributionsListAdapter(SherlockFragment fragment, Cursor c, int flags) {
25-
super(fragment.getActivity(), c, flags);
26-
this.fragment = fragment;
25+
public ContributionsListAdapter(Activity activity, Cursor c, int flags) {
26+
super(activity, c, flags);
27+
this.activity = activity;
2728
}
2829

2930
@Override
3031
public View newView(Context context, Cursor cursor, ViewGroup viewGroup) {
31-
View parent = fragment.getActivity().getLayoutInflater().inflate(R.layout.layout_contribution, viewGroup, false);
32+
View parent = activity.getLayoutInflater().inflate(R.layout.layout_contribution, viewGroup, false);
3233
parent.setTag(new ContributionViewHolder(parent));
3334
return parent;
3435
}
@@ -38,12 +39,12 @@ public void bindView(View view, Context context, Cursor cursor) {
3839
final ContributionViewHolder views = (ContributionViewHolder)view.getTag();
3940
Contribution contribution = Contribution.fromCursor(cursor);
4041

41-
String actualUrl = TextUtils.isEmpty(contribution.getImageUrl()) ? contribution.getLocalUri().toString() : contribution.getThumbnailUrl(320);
42+
String actualUrl = (contribution.getLocalUri() != null && TextUtils.isEmpty(contribution.getLocalUri().toString())) ? contribution.getLocalUri().toString() : contribution.getThumbnailUrl(640);
4243

4344
if(views.url == null || !views.url.equals(actualUrl)) {
4445
if(actualUrl.startsWith("http")) {
4546
MediaWikiImageView mwImageView = (MediaWikiImageView)views.imageView;
46-
mwImageView.setMedia(contribution, ((CommonsApplication) fragment.getActivity().getApplicationContext()).getImageLoader());
47+
mwImageView.setMedia(contribution, ((CommonsApplication) activity.getApplicationContext()).getImageLoader());
4748
// FIXME: For transparent images
4849
} else {
4950
com.nostra13.universalimageloader.core.ImageLoader.getInstance().displayImage(actualUrl, views.imageView, contributionDisplayOptions, new SimpleImageLoadingListener() {

commons/src/main/java/org/wikimedia/commons/contributions/ContributionsListFragment.java

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616
import com.actionbarsherlock.view.MenuInflater;
1717
import com.actionbarsherlock.view.MenuItem;
1818

19-
import com.nostra13.universalimageloader.core.DisplayImageOptions;
20-
2119

2220
import org.wikimedia.commons.*;
2321
import org.wikimedia.commons.R;
@@ -28,24 +26,19 @@ public class ContributionsListFragment extends SherlockFragment {
2826
private TextView waitingMessage;
2927
private TextView emptyMessage;
3028

31-
private ContributionsListAdapter contributionsAdapter;
32-
33-
private Cursor allContributions;
34-
3529
private ContributionController controller;
3630

3731
@Override
3832
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
3933
return inflater.inflate(R.layout.fragment_contributions, container, false);
4034
}
4135

42-
public void setCursor(Cursor cursor) {
43-
if(allContributions == null) {
44-
contributionsAdapter = new ContributionsListAdapter(this, cursor, 0);
45-
contributionsList.setAdapter(contributionsAdapter);
46-
}
47-
allContributions = cursor;
48-
contributionsAdapter.swapCursor(cursor);
36+
public ListAdapter getAdapter() {
37+
return contributionsList.getAdapter();
38+
}
39+
40+
public void setAdapter(ListAdapter adapter) {
41+
this.contributionsList.setAdapter(adapter);
4942
}
5043

5144
@Override
@@ -111,6 +104,11 @@ public void onCreate(Bundle savedInstanceState) {
111104
setHasOptionsMenu(true);
112105
}
113106

107+
@Override
108+
public void onDestroy() {
109+
super.onDestroy();
110+
}
111+
114112
@Override
115113
public void onActivityCreated(Bundle savedInstanceState) {
116114
super.onActivityCreated(savedInstanceState);
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package org.wikimedia.commons.contributions;
2+
3+
import android.app.Activity;
4+
import android.view.View;
5+
import android.view.ViewGroup;
6+
import android.widget.BaseAdapter;
7+
import com.android.volley.toolbox.ImageLoader;
8+
import org.wikimedia.commons.CommonsApplication;
9+
import org.wikimedia.commons.Media;
10+
import org.wikimedia.commons.R;
11+
12+
import java.util.ArrayList;
13+
14+
public class MediaListAdapter extends BaseAdapter {
15+
private ArrayList<Media> mediaList;
16+
private Activity activity;
17+
18+
public MediaListAdapter(Activity activity, ArrayList<Media> mediaList) {
19+
this.mediaList = mediaList;
20+
this.activity = activity;
21+
}
22+
23+
public int getCount() {
24+
return mediaList.size();
25+
}
26+
27+
public Object getItem(int i) {
28+
return mediaList.get(i);
29+
}
30+
31+
public long getItemId(int i) {
32+
return i;
33+
}
34+
35+
public View getView(int i, View view, ViewGroup viewGroup) {
36+
if(view == null) {
37+
view = activity.getLayoutInflater().inflate(R.layout.layout_contribution, null, false);
38+
view.setTag(new ContributionViewHolder(view));
39+
}
40+
41+
Media m = (Media) getItem(i);
42+
ContributionViewHolder holder = (ContributionViewHolder) view.getTag();
43+
holder.imageView.setMedia(m, ((CommonsApplication)activity.getApplicationContext()).getImageLoader());
44+
holder.titleView.setText(m.getDisplayTitle());
45+
return view;
46+
}
47+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package org.wikimedia.commons.media;
2+
3+
import android.content.Context;
4+
import android.support.v4.content.AsyncTaskLoader;
5+
import android.util.Log;
6+
import org.mediawiki.api.ApiResult;
7+
import org.wikimedia.commons.CommonsApplication;
8+
import org.wikimedia.commons.Media;
9+
import org.wikimedia.commons.Utils;
10+
11+
import java.io.IOException;
12+
import java.util.ArrayList;
13+
import java.util.List;
14+
15+
public class CategoryImagesLoader extends AsyncTaskLoader<List<Media>>{
16+
private final CommonsApplication app;
17+
private final String category;
18+
19+
public CategoryImagesLoader(Context context, String category) {
20+
super(context);
21+
this.app = (CommonsApplication) context.getApplicationContext();
22+
this.category = category;
23+
}
24+
25+
@Override
26+
protected void onStartLoading() {
27+
super.onStartLoading();
28+
super.forceLoad();
29+
}
30+
31+
@Override
32+
public List<Media> loadInBackground() {
33+
ArrayList<Media> mediaList = new ArrayList<Media>();
34+
ApiResult result;
35+
try {
36+
result = app.getApi().action("query")
37+
.param("list", "categorymembers")
38+
.param("cmtitle", "Category:" + category)
39+
.param("cmprop", "title|timestamp")
40+
.param("cmtype", "file")
41+
.param("cmsort", "timestamp")
42+
.param("cmdir", "descending")
43+
.param("cmlimit", 50)
44+
.get();
45+
} catch (IOException e) {
46+
throw new RuntimeException(e);
47+
}
48+
49+
Log.d("Commons", Utils.getStringFromDOM(result.getDocument()));
50+
51+
List<ApiResult> members = result.getNodes("/api/query/categorymembers/cm");
52+
for(ApiResult member : members) {
53+
mediaList.add(new Media(member.getString("@title")));
54+
}
55+
return mediaList;
56+
}
57+
}

0 commit comments

Comments
 (0)