Skip to content

Commit 064dbb0

Browse files
committed
Merge branch 'campaigns'
Conflicts: commons/res/values/strings.xml commons/src/main/java/org/wikimedia/commons/Media.java Change-Id: Ib8c74cbf88630f11b3fbfee903800e7acf7b2fd4
2 parents b7c1f44 + 4da4f7c commit 064dbb0

32 files changed

+1374
-462
lines changed

commons/AndroidManifest.xml

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,15 @@
8282
android:label="@string/title_activity_settings"
8383
/>
8484
<activity android:name=".AboutActivity" android:label="@string/title_activity_about"/>
85+
<activity android:name=".campaigns.CampaignActivity" android:label="Campaigns"
86+
android:icon="@drawable/ic_launcher"
87+
>
88+
<intent-filter>
89+
<action android:name="android.intent.action.MAIN"/>
90+
<category android:name="android.intent.category.LAUNCHER"/>
91+
</intent-filter>
92+
</activity>
93+
8594
<service android:name=".upload.UploadService" >
8695
</service>
8796
<service
@@ -96,6 +105,17 @@
96105
android:name="android.accounts.AccountAuthenticator"
97106
android:resource="@xml/authenticator" />
98107
</service>
108+
<service
109+
android:name=".campaigns.CampaignsSyncService"
110+
android:exported="true">
111+
<intent-filter>
112+
<action
113+
android:name="android.content.SyncAdapter" />
114+
</intent-filter>
115+
<meta-data
116+
android:name="android.content.SyncAdapter"
117+
android:resource="@xml/campaigns_sync_adapter" />
118+
</service>
99119
<service
100120
android:name=".contributions.ContributionsSyncService"
101121
android:exported="true">
@@ -127,6 +147,13 @@
127147
android:authorities="org.wikimedia.commons.contributions.contentprovider"
128148
android:exported="false">
129149
</provider>
150+
<provider
151+
android:name=".campaigns.CampaignsContentProvider"
152+
android:label="@string/provider_campaigns"
153+
android:syncable="true"
154+
android:authorities="org.wikimedia.commons.campaigns.contentprovider"
155+
android:exported="false">
156+
</provider>
130157
<provider
131158
android:name=".modifications.ModificationsContentProvider"
132159
android:label="@string/provider_modifications"

commons/pom.xml

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,8 @@
2424
<dependency>
2525
<groupId>com.actionbarsherlock</groupId>
2626
<artifactId>actionbarsherlock</artifactId>
27-
<version>4.2.0</version>
27+
<version>4.4.0</version>
2828
<type>apklib</type>
29-
<exclusions>
30-
<exclusion>
31-
<groupId>com.google.android</groupId>
32-
<artifactId>support-v4</artifactId>
33-
</exclusion>
34-
</exclusions>
3529
</dependency>
3630
<dependency>
3731
<groupId>android</groupId>
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
3+
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
4+
android:orientation="vertical"
5+
android:layout_width="match_parent"
6+
android:layout_height="match_parent">
7+
8+
<ListView
9+
android:id="@+id/campaignsList"
10+
android:layout_width="match_parent"
11+
android:layout_height="match_parent"
12+
/>
13+
</FrameLayout>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
3+
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
4+
android:orientation="vertical"
5+
android:layout_width="match_parent"
6+
android:layout_height="match_parent">
7+
8+
<GridView android:id="@+id/campaignsList"
9+
android:layout_height="fill_parent"
10+
android:layout_width="fill_parent"
11+
android:stretchMode="columnWidth"
12+
android:columnWidth="240dp"
13+
android:numColumns="auto_fit"
14+
android:listSelector="@null"
15+
android:fadingEdge="none"
16+
android:fastScrollEnabled="false"
17+
/>
18+
</LinearLayout>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
3+
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
4+
android:orientation="vertical"
5+
android:layout_width="match_parent"
6+
android:layout_height="match_parent">
7+
<TextView
8+
android:id="@+id/campaignItemName"
9+
android:layout_height="wrap_content"
10+
android:layout_width="match_parent"
11+
/>
12+
</LinearLayout>

commons/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,4 +138,5 @@
138138
<string name="detail_panel_cats_label">Categories</string>
139139
<string name="detail_panel_cats_loading">Loading...</string>
140140
<string name="detail_panel_cats_none">None selected</string>
141+
<string name="provider_campaigns">Campaigns</string>
141142
</resources>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
3+
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
4+
android:contentAuthority="org.wikimedia.commons.campaigns.contentprovider"
5+
android:accountType="org.wikimedia.commons"
6+
android:supportsUploading="false"
7+
android:userVisible="true"
8+
android:isAlwaysSyncable="true"
9+
/>

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ public Uri getLocalUri() {
5959
}
6060

6161
public String getImageUrl() {
62+
if(imageUrl == null) {
63+
imageUrl = Utils.makeThumbBaseUrl(this.getFilename());
64+
}
6265
return imageUrl;
6366
}
6467

@@ -103,7 +106,7 @@ public void setCreator(String creator) {
103106
}
104107

105108
public String getThumbnailUrl(int width) {
106-
return Utils.makeThumbUrl(imageUrl, filename, width);
109+
return Utils.makeThumbUrl(getImageUrl(), getFilename(), width);
107110
}
108111

109112
public int getWidth() {
@@ -182,6 +185,10 @@ public String getDescription(String preferredLanguage) {
182185
}
183186
}
184187

188+
public Media(String filename) {
189+
this.filename = filename;
190+
}
191+
185192
public Media(Uri localUri, String imageUrl, String filename, String description, long dataLength, Date dateCreated, Date dateUploaded, String creator) {
186193
this();
187194
this.localUri = localUri;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ public void run() {
182182

183183
if (response.getBitmap() != null) {
184184
setImageBitmap(response.getBitmap());
185-
if(tryOriginal && mMedia instanceof Contribution && response.getBitmap().getWidth() > mMedia.getWidth() || response.getBitmap().getHeight() > mMedia.getHeight()) {
185+
if(tryOriginal && mMedia instanceof Contribution && (response.getBitmap().getWidth() > mMedia.getWidth() || response.getBitmap().getHeight() > mMedia.getHeight())) {
186186
// If there is no width information for this image, save it. This speeds up image loading massively for smaller images
187187
mMedia.setHeight(response.getBitmap().getHeight());
188188
mMedia.setWidth(response.getBitmap().getWidth());

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import android.net.Uri;
44
import android.os.*;
5+
import android.util.Log;
56
import com.nostra13.universalimageloader.core.*;
67
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
78
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;

commons/src/main/java/org/wikimedia/commons/auth/LoginActivity.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import org.wikimedia.commons.*;
1818
import org.wikimedia.commons.EventLog;
19+
import org.wikimedia.commons.campaigns.CampaignsContentProvider;
1920
import org.wikimedia.commons.contributions.*;
2021
import org.wikimedia.commons.modifications.ModificationsContentProvider;
2122

@@ -67,6 +68,7 @@ protected void onPostExecute(String result) {
6768
// FIXME: If the user turns it off, it shouldn't be auto turned back on
6869
ContentResolver.setSyncAutomatically(account, ContributionsContentProvider.AUTHORITY, true); // Enable sync by default!
6970
ContentResolver.setSyncAutomatically(account, ModificationsContentProvider.AUTHORITY, true); // Enable sync by default!
71+
ContentResolver.setSyncAutomatically(account, CampaignsContentProvider.AUTHORITY, true); // Enable sync by default!
7072
context.finish();
7173
} else {
7274
int response;
Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
package org.wikimedia.commons.campaigns;
2+
3+
import android.content.ContentValues;
4+
import android.database.Cursor;
5+
import android.database.sqlite.SQLiteDatabase;
6+
import org.json.JSONArray;
7+
import org.json.JSONException;
8+
import org.json.JSONObject;
9+
10+
import java.io.Serializable;
11+
import java.util.ArrayList;
12+
13+
// FIXME: Implement Parcelable
14+
public class Campaign implements Serializable {
15+
private boolean enabled;
16+
17+
private String autoAddWikitext;
18+
private ArrayList<String> autoAddCategories;
19+
20+
private String name;
21+
private String ownWorkLicenseDefault;
22+
23+
private String defaultDescription;
24+
25+
private JSONObject config;
26+
private String body;
27+
private boolean isParsed;
28+
private String trackingCategory;
29+
private String description;
30+
private String title;
31+
32+
public boolean isEnabled() {
33+
return enabled;
34+
}
35+
36+
public String getAutoAddWikitext() {
37+
if(!this.isParsed) {
38+
this.parseConfig();
39+
}
40+
return autoAddWikitext;
41+
}
42+
43+
public ArrayList<String> getAutoAddCategories() {
44+
if(!this.isParsed) {
45+
this.parseConfig();
46+
}
47+
return autoAddCategories;
48+
}
49+
50+
public String getName() {
51+
return name;
52+
}
53+
54+
public String getOwnWorkLicenseDefault() {
55+
if(!this.isParsed) {
56+
this.parseConfig();
57+
}
58+
return ownWorkLicenseDefault;
59+
}
60+
61+
public String getDefaultDescription() {
62+
if(!this.isParsed) {
63+
this.parseConfig();
64+
}
65+
return defaultDescription;
66+
}
67+
68+
public JSONObject getConfig() {
69+
if(!this.isParsed) {
70+
this.parseConfig();
71+
}
72+
return config;
73+
}
74+
75+
private void parseConfig() {
76+
try {
77+
this.config = new JSONObject(body);
78+
} catch (JSONException e) {
79+
throw new RuntimeException(e); // because what else are you gonna do?
80+
}
81+
if(config.has("autoAdd")) {
82+
this.autoAddWikitext = config.optJSONObject("autoAdd").optString("wikitext", null);
83+
if(config.optJSONObject("autoAdd").has("categories")) {
84+
this.autoAddCategories = new ArrayList<String>();
85+
JSONArray catsArray = config.optJSONObject("autoAdd").optJSONArray("categories");
86+
for(int i=0; i < catsArray.length(); i++) {
87+
autoAddCategories.add(catsArray.optString(i));
88+
}
89+
}
90+
}
91+
this.title = config.optString("title", name);
92+
this.description = config.optString("description", "");
93+
this.isParsed = true;
94+
}
95+
private Campaign(String name, String body, String trackingCategory) {
96+
this.name = name;
97+
this.body = body;
98+
this.trackingCategory = trackingCategory;
99+
}
100+
101+
public ContentValues toContentValues() {
102+
ContentValues cv = new ContentValues();
103+
cv.put(Table.COLUMN_NAME, this.getName());
104+
cv.put(Table.COLUMN_ENABLED, this.isEnabled() ? 1 : 0);
105+
cv.put(Table.COLUMN_TITLE, this.getTitle());
106+
cv.put(Table.COLUMN_DESCRIPTION, this.getDescription());
107+
cv.put(Table.COLUMN_TRACKING_CATEGORY, this.getTrackingCategory());
108+
cv.put(Table.COLUMN_BODY, this.body);
109+
return cv;
110+
}
111+
112+
public static Campaign parse(String name, String body, String trackingCategory) {
113+
Campaign c = new Campaign(name, body, trackingCategory);
114+
c.parseConfig();
115+
return c;
116+
}
117+
118+
public static Campaign fromCursor(Cursor cursor) {
119+
String name = cursor.getString(1);
120+
Boolean enabled = cursor.getInt(2) == 1;
121+
String title = cursor.getString(3);
122+
String description = cursor.getString(4);
123+
String trackingCategory = cursor.getString(5);
124+
String body = cursor.getString(6);
125+
Campaign c = new Campaign(name, body, trackingCategory);
126+
c.title = title;
127+
c.description = description;
128+
c.enabled = enabled;
129+
return c;
130+
}
131+
132+
public String getTrackingCategory() {
133+
return trackingCategory;
134+
}
135+
136+
public String getDescription() {
137+
return description;
138+
}
139+
140+
public String getTitle() {
141+
return title;
142+
}
143+
144+
public static class Table {
145+
public static final String TABLE_NAME = "campaigns";
146+
147+
public static final String COLUMN_ID = "_id";
148+
public static final String COLUMN_NAME = "name";
149+
public static final String COLUMN_ENABLED = "enabled";
150+
public static final String COLUMN_TITLE = "title";
151+
public static final String COLUMN_DESCRIPTION = "description";
152+
public static final String COLUMN_TRACKING_CATEGORY = "tracking_category";
153+
public static final String COLUMN_BODY = "body";
154+
155+
// NOTE! KEEP IN SAME ORDER AS THEY ARE DEFINED UP THERE. HELPS HARD CODE COLUMN INDICES.
156+
public static final String[] ALL_FIELDS = {
157+
COLUMN_ID,
158+
COLUMN_NAME,
159+
COLUMN_ENABLED,
160+
COLUMN_TITLE,
161+
COLUMN_DESCRIPTION,
162+
COLUMN_TRACKING_CATEGORY,
163+
COLUMN_BODY
164+
};
165+
166+
167+
private static final String CREATE_TABLE_STATEMENT = "CREATE TABLE " + TABLE_NAME + " ("
168+
+ "_id INTEGER PRIMARY KEY,"
169+
+ "name STRING,"
170+
+ "enabled INTEGER,"
171+
+ "title STRING,"
172+
+ "description STRING,"
173+
+ "tracking_category STRING,"
174+
+ "body STRING"
175+
+ ");";
176+
177+
178+
public static void onCreate(SQLiteDatabase db) {
179+
db.execSQL(CREATE_TABLE_STATEMENT);
180+
}
181+
182+
public static void onUpdate(SQLiteDatabase db, int from, int to) {
183+
if(to <= 6) {
184+
onCreate(db);
185+
return;
186+
}
187+
return;
188+
}
189+
}
190+
}

0 commit comments

Comments
 (0)