Removed dead code behind Campaigns feature

- Removed entire Campaigns folder and associated classes
- Removed associated code in other classes (mostly that test for
campaign == null). I am assuming we want  to keep the behaviour where
campaign == null (ie campaigns are disabled) and discard the behaviour
where campaign != null
- Refactored code to fix spacing
This commit is contained in:
misaochan 2015-10-21 19:29:08 +13:00
parent 235d290252
commit c64a64c905
48 changed files with 462 additions and 1137 deletions

View file

@ -7,6 +7,7 @@ import android.util.*;
import in.yuvi.http.fluent.Http;
import org.apache.http.HttpResponse;
import org.json.*;
import java.io.IOException;
import java.net.*;
@ -45,6 +46,7 @@ public class EventLog {
}
private static final String DEVICE;
static {
if (Build.MODEL.startsWith(Build.MANUFACTURER)) {
DEVICE = Utils.capitalize(Build.MODEL);

View file

@ -35,6 +35,7 @@ public abstract class HandlerService<T> extends Service {
}
private final IBinder localBinder = new HandlerServiceLocalBinder();
@Override
public IBinder onBind(Intent intent) {
return localBinder;

View file

@ -34,6 +34,7 @@ public class Media implements Parcelable {
}
public static Pattern displayTitlePattern = Pattern.compile("(.*)(\\.\\w+)", Pattern.CASE_INSENSITIVE);
public String getDisplayTitle() {
if (filename == null) {
return "";

View file

@ -20,7 +20,7 @@ import java.util.regex.Pattern;
/**
* Fetch additional media data from the network that we don't store locally.
*
* <p>
* This includes things like category lists and multilingual descriptions,
* which are not intrinsic to the media and may change due to editing.
*/
@ -51,7 +51,7 @@ public class MediaDataExtractor {
/**
* Actually fetch the data over the network.
* todo: use local caching?
*
* <p>
* Warning: synchronous i/o, call on a background thread
*/
public void fetch() throws IOException {
@ -278,6 +278,7 @@ public class MediaDataExtractor {
/**
* Take our metadata and inject it into a live Media object.
* Media object might contain stale or cached data, or emptiness.
*
* @param media
*/
public void fill(Media media) {

View file

@ -1,12 +1,12 @@
/**
* Copyright (C) 2013 The Android Open Source Project
*
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
*
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

View file

@ -9,6 +9,7 @@ import com.actionbarsherlock.app.SherlockPreferenceActivity;
public class SettingsActivity extends SherlockPreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener {
CommonsApplication app;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

View file

@ -72,8 +72,7 @@ public class Utils {
T... params) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
}
else {
} else {
task.execute(params);
}
}
@ -83,14 +82,14 @@ public class Utils {
// FIXME: We're simply ignoring the executor on older androids
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
task.executeOnExecutor(executor, params);
}
else {
} else {
task.execute(params);
}
}
private static DisplayImageOptions.Builder defaultImageOptionsBuilder;
public static DisplayImageOptions.Builder getGenericDisplayOptions() {
if (defaultImageOptionsBuilder == null) {
defaultImageOptionsBuilder = new DisplayImageOptions.Builder().cacheInMemory()

View file

@ -27,6 +27,7 @@ public class AuthenticatedActivity extends SherlockFragmentActivity {
private class GetAuthCookieTask extends AsyncTask<Void, String, String> {
private Account account;
private AccountManager accountManager;
public GetAuthCookieTask(Account account, AccountManager accountManager) {
this.account = account;
this.accountManager = accountManager;
@ -63,6 +64,7 @@ public class AuthenticatedActivity extends SherlockFragmentActivity {
private class AddAccountTask extends AsyncTask<Void, String, String> {
private AccountManager accountManager;
public AddAccountTask(AccountManager accountManager) {
this.accountManager = accountManager;
}
@ -106,6 +108,7 @@ public class AuthenticatedActivity extends SherlockFragmentActivity {
}
}
protected void requestAuthToken() {
if (authCookie != null) {
onAuthCookieAcquired(authCookie);
@ -146,6 +149,7 @@ public class AuthenticatedActivity extends SherlockFragmentActivity {
protected void onAuthCookieAcquired(String authCookie) {
}
protected void onAuthFailure() {
}

View file

@ -17,7 +17,6 @@ import android.support.v4.app.NavUtils;
import fr.free.nrw.commons.*;
import fr.free.nrw.commons.WelcomeActivity;
import fr.free.nrw.commons.campaigns.CampaignsContentProvider;
import fr.free.nrw.commons.modifications.ModificationsContentProvider;
import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.EventLog;
@ -72,7 +71,6 @@ public class LoginActivity extends AccountAuthenticatorActivity {
// FIXME: If the user turns it off, it shouldn't be auto turned back on
ContentResolver.setSyncAutomatically(account, ContributionsContentProvider.AUTHORITY, true); // Enable sync by default!
ContentResolver.setSyncAutomatically(account, ModificationsContentProvider.AUTHORITY, true); // Enable sync by default!
ContentResolver.setSyncAutomatically(account, CampaignsContentProvider.AUTHORITY, true); // Enable sync by default!
context.finish();
} else {
int response;
@ -139,9 +137,11 @@ public class LoginActivity extends AccountAuthenticatorActivity {
final LoginActivity that = this;
TextWatcher loginEnabler = new TextWatcher() {
public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) { }
public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
}
public void onTextChanged(CharSequence charSequence, int start, int count, int after) { }
public void onTextChanged(CharSequence charSequence, int start, int count, int after) {
}
public void afterTextChanged(Editable editable) {
if (usernameEdit.getText().length() != 0 && passwordEdit.getText().length() != 0) {

View file

@ -13,6 +13,7 @@ public class WikiAccountAuthenticator extends AbstractAccountAuthenticator {
public static final String COMMONS_ACCOUNT_TYPE = "fr.free.nrw.commons";
private Context context;
public WikiAccountAuthenticator(Context context) {
super(context);
this.context = context;
@ -49,6 +50,7 @@ public class WikiAccountAuthenticator extends AbstractAccountAuthenticator {
return null;
}
}
@Override
public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException {
// Extract the username and password from the Account Manager, and ask

View file

@ -1,190 +0,0 @@
package fr.free.nrw.commons.campaigns;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.Serializable;
import java.util.ArrayList;
// FIXME: Implement Parcelable
public class Campaign implements Serializable {
private boolean enabled;
private String autoAddWikitext;
private ArrayList<String> autoAddCategories;
private String name;
private String ownWorkLicenseDefault;
private String defaultDescription;
private JSONObject config;
private String body;
private boolean isParsed;
private String trackingCategory;
private String description;
private String title;
public boolean isEnabled() {
return enabled;
}
public String getAutoAddWikitext() {
if(!this.isParsed) {
this.parseConfig();
}
return autoAddWikitext;
}
public ArrayList<String> getAutoAddCategories() {
if(!this.isParsed) {
this.parseConfig();
}
return autoAddCategories;
}
public String getName() {
return name;
}
public String getOwnWorkLicenseDefault() {
if(!this.isParsed) {
this.parseConfig();
}
return ownWorkLicenseDefault;
}
public String getDefaultDescription() {
if(!this.isParsed) {
this.parseConfig();
}
return defaultDescription;
}
public JSONObject getConfig() {
if(!this.isParsed) {
this.parseConfig();
}
return config;
}
private void parseConfig() {
try {
this.config = new JSONObject(body);
} catch (JSONException e) {
throw new RuntimeException(e); // because what else are you gonna do?
}
if(config.has("autoAdd")) {
this.autoAddWikitext = config.optJSONObject("autoAdd").optString("wikitext", null);
if(config.optJSONObject("autoAdd").has("categories")) {
this.autoAddCategories = new ArrayList<String>();
JSONArray catsArray = config.optJSONObject("autoAdd").optJSONArray("categories");
for(int i=0; i < catsArray.length(); i++) {
autoAddCategories.add(catsArray.optString(i));
}
}
}
this.title = config.optString("title", name);
this.description = config.optString("description", "");
this.isParsed = true;
}
private Campaign(String name, String body, String trackingCategory) {
this.name = name;
this.body = body;
this.trackingCategory = trackingCategory;
}
public ContentValues toContentValues() {
ContentValues cv = new ContentValues();
cv.put(Table.COLUMN_NAME, this.getName());
cv.put(Table.COLUMN_ENABLED, this.isEnabled() ? 1 : 0);
cv.put(Table.COLUMN_TITLE, this.getTitle());
cv.put(Table.COLUMN_DESCRIPTION, this.getDescription());
cv.put(Table.COLUMN_TRACKING_CATEGORY, this.getTrackingCategory());
cv.put(Table.COLUMN_BODY, this.body);
return cv;
}
public static Campaign parse(String name, String body, String trackingCategory) {
Campaign c = new Campaign(name, body, trackingCategory);
c.parseConfig();
return c;
}
public static Campaign fromCursor(Cursor cursor) {
String name = cursor.getString(1);
Boolean enabled = cursor.getInt(2) == 1;
String title = cursor.getString(3);
String description = cursor.getString(4);
String trackingCategory = cursor.getString(5);
String body = cursor.getString(6);
Campaign c = new Campaign(name, body, trackingCategory);
c.title = title;
c.description = description;
c.enabled = enabled;
return c;
}
public String getTrackingCategory() {
return trackingCategory;
}
public String getDescription() {
return description;
}
public String getTitle() {
return title;
}
public static class Table {
public static final String TABLE_NAME = "campaigns";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_NAME = "name";
public static final String COLUMN_ENABLED = "enabled";
public static final String COLUMN_TITLE = "title";
public static final String COLUMN_DESCRIPTION = "description";
public static final String COLUMN_TRACKING_CATEGORY = "tracking_category";
public static final String COLUMN_BODY = "body";
// NOTE! KEEP IN SAME ORDER AS THEY ARE DEFINED UP THERE. HELPS HARD CODE COLUMN INDICES.
public static final String[] ALL_FIELDS = {
COLUMN_ID,
COLUMN_NAME,
COLUMN_ENABLED,
COLUMN_TITLE,
COLUMN_DESCRIPTION,
COLUMN_TRACKING_CATEGORY,
COLUMN_BODY
};
private static final String CREATE_TABLE_STATEMENT = "CREATE TABLE " + TABLE_NAME + " ("
+ "_id INTEGER PRIMARY KEY,"
+ "name STRING,"
+ "enabled INTEGER,"
+ "title STRING,"
+ "description STRING,"
+ "tracking_category STRING,"
+ "body STRING"
+ ");";
public static void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE_STATEMENT);
}
public static void onUpdate(SQLiteDatabase db, int from, int to) {
if(to <= 6) {
onCreate(db);
return;
}
return;
}
}
}

View file

@ -1,59 +0,0 @@
package fr.free.nrw.commons.campaigns;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import fr.free.nrw.commons.contributions.ContributionsActivity;
import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.R;
public class CampaignActivity
extends SherlockFragmentActivity
implements LoaderManager.LoaderCallbacks<Cursor> {
private ListView campaignsListView;
private CampaignsListAdapter campaignsListAdapter;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_campaigns);
ContentResolver.setSyncAutomatically(((CommonsApplication)getApplicationContext()).getCurrentAccount(), CampaignsContentProvider.AUTHORITY, true); // Enable sync by default!
campaignsListView = (ListView) findViewById(R.id.campaignsList);
campaignsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Campaign c = Campaign.fromCursor((Cursor) adapterView.getItemAtPosition(i));
Intent intent = new Intent(CampaignActivity.this, ContributionsActivity.class);
intent.putExtra("campaign", c);
startActivity(intent);
}
});
getSupportLoaderManager().initLoader(0, null, this);
}
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
return new CursorLoader(this, CampaignsContentProvider.BASE_URI, Campaign.Table.ALL_FIELDS, "", null, "");
}
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
if(campaignsListAdapter == null) {
campaignsListAdapter = new CampaignsListAdapter(this, cursor, 0);
campaignsListView.setAdapter(campaignsListAdapter);
} else {
campaignsListAdapter.swapCursor(cursor);
}
}
public void onLoaderReset(Loader<Cursor> cursorLoader) {
campaignsListAdapter.swapCursor(null);
}
}

View file

@ -1,49 +0,0 @@
package fr.free.nrw.commons.campaigns;
import android.net.Uri;
import fr.free.nrw.commons.contributions.Contribution;
import java.util.ArrayList;
import java.util.Date;
public class CampaignContribution extends Contribution {
private Campaign campaign;
private ArrayList<String> fieldValues;
public CampaignContribution(Uri localUri, String remoteUri, String filename, String description, long dataLength, Date dateCreated, Date dateUploaded, String creator, String editSummary, Campaign campaign) {
super(localUri, remoteUri, filename, description, dataLength, dateCreated, dateUploaded, creator, editSummary);
this.campaign = campaign;
}
public Campaign getCampaign() {
return campaign;
}
public void setCampaign(Campaign campaign) {
this.campaign = campaign;
}
@Override
public String getTrackingTemplates() {
StringBuffer buffer = new StringBuffer();
if(campaign.getAutoAddWikitext() != null) {
buffer.append(campaign.getAutoAddWikitext()).append("\n");
}
if(campaign.getAutoAddCategories() != null && campaign.getAutoAddCategories().size() != 0) {
for(String cat : campaign.getAutoAddCategories()) {
buffer.append("[[Category:").append(cat).append("]]").append("\n");
}
} else {
buffer.append("{{subst:unc}}\n");
}
buffer.append("[[Category:").append(campaign.getTrackingCategory()).append("]]").append("\n");
return buffer.toString();
}
@Override
public String getDescription() {
return super.getDescription();
}
}

View file

@ -1,206 +0,0 @@
package fr.free.nrw.commons.campaigns;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;
import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.data.DBOpenHelper;
public class CampaignsContentProvider extends ContentProvider{
private static final int CAMPAIGNS = 1;
private static final int CAMPAIGNS_ID = 2;
public static final String AUTHORITY = "fr.free.nrw.commons.campaigns.contentprovider";
private static final String BASE_PATH = "campiagns";
public static final Uri BASE_URI = Uri.parse("content://" + AUTHORITY + "/" + BASE_PATH);
private static final UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
uriMatcher.addURI(AUTHORITY, BASE_PATH, CAMPAIGNS);
uriMatcher.addURI(AUTHORITY, BASE_PATH + "/#", CAMPAIGNS_ID);
}
public static Uri uriForId(int id) {
return Uri.parse(BASE_URI.toString() + "/" + id);
}
private DBOpenHelper dbOpenHelper;
@Override
public boolean onCreate() {
dbOpenHelper = ((CommonsApplication)this.getContext().getApplicationContext()).getDbOpenHelper();
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
queryBuilder.setTables(Campaign.Table.TABLE_NAME);
int uriType = uriMatcher.match(uri);
SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
Cursor cursor;
switch(uriType) {
case CAMPAIGNS:
cursor = queryBuilder.query(db, projection, selection, selectionArgs, null, null, sortOrder);
break;
case CAMPAIGNS_ID:
cursor = queryBuilder.query(db,
Campaign.Table.ALL_FIELDS,
"_id = ?",
new String[] { uri.getLastPathSegment() },
null,
null,
sortOrder
);
break;
default:
throw new IllegalArgumentException("Unknown URI" + uri);
}
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
}
@Override
public String getType(Uri uri) {
return null;
}
@Override
public Uri insert(Uri uri, ContentValues contentValues) {
int uriType = uriMatcher.match(uri);
SQLiteDatabase sqlDB = dbOpenHelper.getWritableDatabase();
long id = 0;
switch (uriType) {
case CAMPAIGNS:
sqlDB.beginTransaction();
// if the campaign already exists, rip it out and then re-insert
if(campaignExists(sqlDB, contentValues)) {
sqlDB.delete(
Campaign.Table.TABLE_NAME,
Campaign.Table.COLUMN_NAME + " = ?",
new String[]{contentValues.getAsString(Campaign.Table.COLUMN_NAME)}
);
}
id = sqlDB.insert(Campaign.Table.TABLE_NAME, null, contentValues);
sqlDB.endTransaction();
break;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return Uri.parse(BASE_URI + "/" + id);
}
@Override
public int delete(Uri uri, String s, String[] strings) {
int rows = 0;
int uriType = uriMatcher.match(uri);
SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
switch(uriType) {
case CAMPAIGNS_ID:
rows = db.delete(Campaign.Table.TABLE_NAME,
"_id = ?",
new String[] { uri.getLastPathSegment() }
);
break;
default:
throw new IllegalArgumentException("Unknown URI" + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return rows;
}
private boolean campaignExists(SQLiteDatabase db, ContentValues campaign) {
Cursor cr = db.query(
Campaign.Table.TABLE_NAME,
new String[]{Campaign.Table.COLUMN_NAME},
Campaign.Table.COLUMN_NAME + " = ?",
new String[]{campaign.getAsString(Campaign.Table.COLUMN_NAME)},
"", "", ""
);
return cr != null && cr.getCount() != 0;
}
@Override
public int bulkInsert(Uri uri, ContentValues[] values) {
Log.d("Commons", "Hello, bulk insert!");
int uriType = uriMatcher.match(uri);
SQLiteDatabase sqlDB = dbOpenHelper.getWritableDatabase();
sqlDB.beginTransaction();
switch (uriType) {
case CAMPAIGNS:
for(ContentValues value: values) {
Log.d("Commons", "Inserting! " + value.toString());
// if the campaign already exists, rip it out and then re-insert
if(campaignExists(sqlDB, value)) {
sqlDB.delete(
Campaign.Table.TABLE_NAME,
Campaign.Table.COLUMN_NAME + " = ?",
new String[]{value.getAsString(Campaign.Table.COLUMN_NAME)}
);
}
sqlDB.insert(Campaign.Table.TABLE_NAME, null, value);
}
break;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
sqlDB.setTransactionSuccessful();
sqlDB.endTransaction();
getContext().getContentResolver().notifyChange(uri, null);
return values.length;
}
@Override
public int update(Uri uri, ContentValues contentValues, String selection, String[] selectionArgs) {
/*
SQL Injection warnings: First, note that we're not exposing this to the outside world (exported="false")
Even then, we should make sure to sanitize all user input appropriately. Input that passes through ContentValues
should be fine. So only issues are those that pass in via concating.
In here, the only concat created argument is for id. It is cast to an int, and will error out otherwise.
*/
int uriType = uriMatcher.match(uri);
SQLiteDatabase sqlDB = dbOpenHelper.getWritableDatabase();
int rowsUpdated = 0;
switch (uriType) {
case CAMPAIGNS:
rowsUpdated = sqlDB.update(Campaign.Table.TABLE_NAME,
contentValues,
selection,
selectionArgs);
break;
case CAMPAIGNS_ID:
int id = Integer.valueOf(uri.getLastPathSegment());
if (TextUtils.isEmpty(selection)) {
rowsUpdated = sqlDB.update(Campaign.Table.TABLE_NAME,
contentValues,
Campaign.Table.COLUMN_ID + " = ?",
new String[] { String.valueOf(id) } );
} else {
throw new IllegalArgumentException("Parameter `selection` should be empty when updating an ID");
}
break;
default:
throw new IllegalArgumentException("Unknown URI: " + uri + " with type " + uriType);
}
getContext().getContentResolver().notifyChange(uri, null);
return rowsUpdated;
}
}

View file

@ -1,38 +0,0 @@
package fr.free.nrw.commons.campaigns;
import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.support.v4.widget.CursorAdapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import fr.free.nrw.commons.Utils;
class CampaignsListAdapter extends CursorAdapter {
private DisplayImageOptions contributionDisplayOptions = Utils.getGenericDisplayOptions().build();;
private Activity activity;
public CampaignsListAdapter(Activity activity, Cursor c, int flags) {
super(activity, c, flags);
this.activity = activity;
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup viewGroup) {
View parent = activity.getLayoutInflater().inflate(android.R.layout.simple_list_item_1, viewGroup, false);
return parent;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
TextView campaignName = (TextView)view.findViewById(android.R.id.text1);
Campaign campaign = Campaign.fromCursor(cursor);
campaignName.setText(campaign.getTitle());
}
}

View file

@ -1,90 +0,0 @@
package fr.free.nrw.commons.campaigns;
import android.accounts.Account;
import android.content.*;
import android.os.Bundle;
import android.os.RemoteException;
import android.text.TextUtils;
import android.util.Log;
import org.mediawiki.api.ApiResult;
import org.mediawiki.api.MWApi;
import fr.free.nrw.commons.CommonsApplication;
import java.io.IOException;
import java.util.ArrayList;
public class CampaignsSyncAdapter extends AbstractThreadedSyncAdapter {
private static int COMMIT_THRESHOLD = 10;
public CampaignsSyncAdapter(Context context, boolean autoInitialize) {
super(context, autoInitialize);
}
private int getLimit() {
return 500; // FIXME: Parameterize!
}
@Override
public void onPerformSync(Account account, Bundle bundle, String s, ContentProviderClient contentProviderClient, SyncResult syncResult) {
// This code is fraught with possibilities of race conditions, but lalalalala I can't hear you!
String user = account.name;
MWApi api = CommonsApplication.createMWApi();
ApiResult result;
Boolean done = false;
String queryContinue = null;
while(!done) {
try {
MWApi.RequestBuilder builder = api.action("query")
.param("list", "allcampaigns")
// Disabled, since we want to modify local state if the campaign was disabled
// FIXME: To be more effecient, delete the disabled campaigns locally
//.param("ucenabledonly", "true")
.param("uclimit", getLimit());
if(!TextUtils.isEmpty(queryContinue)) {
builder.param("uccontinue", queryContinue);
}
result = builder.get();
} catch (IOException e) {
// There isn't really much we can do, eh?
// FIXME: Perhaps add EventLogging?
syncResult.stats.numIoExceptions += 1; // Not sure if this does anything. Shitty docs
Log.d("Commons", "Syncing failed due to " + e.toString());
return;
}
ArrayList<ApiResult> campaigns = result.getNodes("/api/query/allcampaigns/campaign");
Log.d("Commons", campaigns.size() + " results!");
ArrayList<ContentValues> campaignValues = new ArrayList<ContentValues>();
for(ApiResult campaignItem: campaigns) {
String name = campaignItem.getString("@name");
String body = campaignItem.getString(".");
Log.d("Commons", "Campaign body is " + body);
String trackingCat = campaignItem.getString("@trackingCategory");
Campaign campaign = Campaign.parse(name, body, trackingCat);
campaignValues.add(campaign.toContentValues());
if(campaignValues.size() % COMMIT_THRESHOLD == 0) {
try {
contentProviderClient.bulkInsert(CampaignsContentProvider.BASE_URI, campaignValues.toArray(new ContentValues[]{}));
} catch (RemoteException e) {
throw new RuntimeException(e);
}
campaignValues.clear();
}
}
if(campaignValues.size() != 0) {
try {
contentProviderClient.bulkInsert(CampaignsContentProvider.BASE_URI, campaignValues.toArray(new ContentValues[]{}));
} catch (RemoteException e) {
throw new RuntimeException(e);
}
}
queryContinue = result.getString("/api/query-continue/allcampaigns/@uccontinue");
if(TextUtils.isEmpty(queryContinue)) {
done = true;
}
}
}
}

View file

@ -1,26 +0,0 @@
package fr.free.nrw.commons.campaigns;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class CampaignsSyncService extends Service {
private static final Object sSyncAdapterLock = new Object();
private static CampaignsSyncAdapter sSyncAdapter = null;
@Override
public void onCreate() {
synchronized (sSyncAdapterLock) {
if (sSyncAdapter == null) {
sSyncAdapter = new CampaignsSyncAdapter(getApplicationContext(), true);
}
}
}
@Override
public IBinder onBind(Intent intent) {
return sSyncAdapter.getSyncAdapterBinder();
}
}

View file

@ -86,6 +86,7 @@ public class CategorizationFragment extends SherlockFragment{
private class CategoriesUpdater extends AsyncTask<Void, Void, ArrayList<String>> {
private String filter;
@Override
protected void onPreExecute() {
super.onPreExecute();

View file

@ -24,6 +24,7 @@ public class CategoryContentProvider extends ContentProvider {
public static final Uri BASE_URI = Uri.parse("content://" + AUTHORITY + "/" + BASE_PATH);
private static final UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
uriMatcher.addURI(AUTHORITY, BASE_PATH, CATEGORIES);
uriMatcher.addURI(AUTHORITY, BASE_PATH + "/#", CATEGORIES_ID);
@ -35,6 +36,7 @@ public class CategoryContentProvider extends ContentProvider {
}
private DBOpenHelper dbOpenHelper;
@Override
public boolean onCreate() {
dbOpenHelper = ((CommonsApplication) this.getContext().getApplicationContext()).getDbOpenHelper();

View file

@ -10,7 +10,7 @@ import android.util.Log;
import com.actionbarsherlock.app.SherlockFragment;
import fr.free.nrw.commons.upload.ShareActivity;
import fr.free.nrw.commons.upload.UploadService;
import fr.free.nrw.commons.campaigns.Campaign;
import java.io.File;
import java.io.IOException;
@ -19,15 +19,15 @@ import java.util.Date;
public class ContributionController {
private SherlockFragment fragment;
private Activity activity;
private Campaign campaign;
private final static int SELECT_FROM_GALLERY = 1;
private final static int SELECT_FROM_CAMERA = 2;
public ContributionController(SherlockFragment fragment, Campaign campaign) {
public ContributionController(SherlockFragment fragment) {
this.fragment = fragment;
this.activity = fragment.getActivity();
this.campaign = campaign;
}
// See http://stackoverflow.com/a/5054673/17865 for why this is done
@ -71,7 +71,6 @@ public class ContributionController {
public void handleImagePicked(int requestCode, Intent data) {
Intent shareIntent = new Intent(activity, ShareActivity.class);
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(UploadService.EXTRA_CAMPAIGN, campaign);
switch (requestCode) {
case SELECT_FROM_GALLERY:
shareIntent.setType(activity.getContentResolver().getType(data.getData()));
@ -89,13 +88,11 @@ public class ContributionController {
public void saveState(Bundle outState) {
outState.putParcelable("lastGeneratedCaptureURI", lastGeneratedCaptureURI);
outState.putSerializable("campaign", campaign);
}
public void loadState(Bundle savedInstanceState) {
if (savedInstanceState != null) {
lastGeneratedCaptureURI = (Uri) savedInstanceState.getParcelable("lastGeneratedCaptureURI");
campaign = (Campaign) savedInstanceState.getSerializable("campaign");
}
}

View file

@ -22,7 +22,6 @@ import fr.free.nrw.commons.auth.*;
import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.HandlerService;
import fr.free.nrw.commons.Media;
import fr.free.nrw.commons.campaigns.Campaign;
import fr.free.nrw.commons.media.*;
import fr.free.nrw.commons.upload.UploadService;
@ -33,7 +32,6 @@ public class ContributionsActivity
implements LoaderManager.LoaderCallbacks<Object>,
AdapterView.OnItemClickListener,
MediaDetailPagerFragment.MediaDetailProvider,
ContributionsListFragment.CurrentCampaignProvider,
FragmentManager.OnBackStackChangedListener,
ContributionsListFragment.SourceRefresher {
@ -43,7 +41,6 @@ public class ContributionsActivity
private MediaDetailPagerFragment mediaDetails;
private ArrayList<DataSetObserver> observersWaitingForLoad = new ArrayList<DataSetObserver>();
private Campaign campaign;
public ContributionsActivity() {
super(WikiAccountAuthenticator.COMMONS_ACCOUNT_TYPE);
@ -64,7 +61,6 @@ public class ContributionsActivity
};
@Override
protected void onDestroy() {
super.onDestroy();
@ -115,11 +111,6 @@ public class ContributionsActivity
setTitle(R.string.title_activity_contributions);
setContentView(R.layout.activity_contributions);
if(getIntent().hasExtra("campaign")) {
this.campaign = (Campaign) getIntent().getSerializableExtra("campaign");
this.setTitle(campaign.getTitle());
}
contributionsList = (ContributionsListFragment) getSupportFragmentManager().findFragmentById(R.id.contributionsListFragment);
getSupportFragmentManager().addOnBackStackChangedListener(this);
@ -208,15 +199,13 @@ public class ContributionsActivity
}
public Loader onCreateLoader(int i, Bundle bundle) {
if(campaign == null) {
return new CursorLoader(this, ContributionsContentProvider.BASE_URI, Contribution.Table.ALL_FIELDS, CONTRIBUTION_SELECTION, null, CONTRIBUTION_SORT);
} else {
return new CategoryImagesLoader(this, campaign.getTrackingCategory());
}
}
public void onLoadFinished(Loader cursorLoader, Object result) {
if(campaign == null) {
Cursor cursor = (Cursor) result;
if (contributionsList.getAdapter() == null) {
contributionsList.setAdapter(new ContributionsListAdapter(this, cursor, 0));
@ -225,32 +214,22 @@ public class ContributionsActivity
}
getSupportActionBar().setSubtitle(getResources().getQuantityString(R.plurals.contributions_subtitle, cursor.getCount(), cursor.getCount()));
} else {
if(contributionsList.getAdapter() == null) {
contributionsList.setAdapter(new MediaListAdapter(this, (ArrayList<Media>) result));
} else {
((MediaListAdapter)contributionsList.getAdapter()).updateMediaList((ArrayList<Media>) result);
}
}
notifyAndMigrateDataSetObservers();
}
public void onLoaderReset(Loader cursorLoader) {
if(campaign == null) {
((CursorAdapter) contributionsList.getAdapter()).swapCursor(null);
} else {
contributionsList.setAdapter(null);
}
}
public Media getMediaAtPosition(int i) {
if (contributionsList.getAdapter() == null) {
// not yet ready to return data
return null;
} else if(campaign == null) {
return Contribution.fromCursor((Cursor) contributionsList.getAdapter().getItem(i));
} else {
return (Media) contributionsList.getAdapter().getItem(i);
return Contribution.fromCursor((Cursor) contributionsList.getAdapter().getItem(i));
}
}
@ -306,9 +285,6 @@ public class ContributionsActivity
}
}
public Campaign getCurrentCampaign() {
return campaign;
}
public void refreshSource() {
getSupportLoaderManager().restartLoader(0, null, this);

View file

@ -21,6 +21,7 @@ public class ContributionsContentProvider extends ContentProvider{
public static final Uri BASE_URI = Uri.parse("content://" + AUTHORITY + "/" + BASE_PATH);
private static final UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
uriMatcher.addURI(AUTHORITY, BASE_PATH, CONTRIBUTIONS);
uriMatcher.addURI(AUTHORITY, BASE_PATH + "/#", CONTRIBUTIONS_ID);
@ -32,6 +33,7 @@ public class ContributionsContentProvider extends ContentProvider{
}
private DBOpenHelper dbOpenHelper;
@Override
public boolean onCreate() {
dbOpenHelper = ((CommonsApplication) this.getContext().getApplicationContext()).getDbOpenHelper();

View file

@ -19,7 +19,8 @@ import fr.free.nrw.commons.R;
class ContributionsListAdapter extends CursorAdapter {
private DisplayImageOptions contributionDisplayOptions = Utils.getGenericDisplayOptions().build();;
private DisplayImageOptions contributionDisplayOptions = Utils.getGenericDisplayOptions().build();
;
private Activity activity;
public ContributionsListAdapter(Activity activity, Cursor c, int flags) {

View file

@ -20,13 +20,9 @@ import fr.free.nrw.commons.R;
import fr.free.nrw.commons.AboutActivity;
import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.SettingsActivity;
import fr.free.nrw.commons.campaigns.Campaign;
public class ContributionsListFragment extends SherlockFragment {
public interface CurrentCampaignProvider {
Campaign getCurrentCampaign();
}
public interface SourceRefresher {
void refreshSource();
@ -35,7 +31,7 @@ public class ContributionsListFragment extends SherlockFragment {
private GridView contributionsList;
private TextView waitingMessage;
private TextView emptyMessage;
private Campaign campaign;
private ContributionController controller;
@ -109,9 +105,9 @@ public class ContributionsListFragment extends SherlockFragment {
if (!app.deviceHasCamera()) {
menu.findItem(R.id.menu_from_camera).setEnabled(false);
}
if(campaign == null) {
menu.findItem(R.id.menu_refresh).setVisible(false);
}
}
@Override
@ -129,8 +125,8 @@ public class ContributionsListFragment extends SherlockFragment {
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
campaign = ((CurrentCampaignProvider)getActivity()).getCurrentCampaign();
controller = new ContributionController(this, campaign);
controller = new ContributionController(this);
controller.loadState(savedInstanceState);
contributionsList = (GridView) getView().findViewById(R.id.contributionsList);

View file

@ -18,6 +18,7 @@ import fr.free.nrw.commons.Utils;
public class ContributionsSyncAdapter extends AbstractThreadedSyncAdapter {
private static int COMMIT_THRESHOLD = 10;
public ContributionsSyncAdapter(Context context, boolean autoInitialize) {
super(context, autoInitialize);
}
@ -28,6 +29,7 @@ public class ContributionsSyncAdapter extends AbstractThreadedSyncAdapter {
private static final String[] existsQuery = {Contribution.Table.COLUMN_FILENAME};
private static final String existsSelection = Contribution.Table.COLUMN_FILENAME + " = ?";
private boolean fileExists(ContentProviderClient client, String filename) {
Cursor cursor = null;
try {

View file

@ -34,6 +34,7 @@ public class MediaListAdapter extends BaseAdapter {
}
}
}
public int getCount() {
return mediaList.size();
}

View file

@ -4,7 +4,6 @@ import android.content.*;
import android.database.sqlite.*;
import fr.free.nrw.commons.modifications.ModifierSequence;
import fr.free.nrw.commons.campaigns.Campaign;
import fr.free.nrw.commons.category.Category;
import fr.free.nrw.commons.contributions.*;
@ -22,7 +21,6 @@ public class DBOpenHelper extends SQLiteOpenHelper{
Contribution.Table.onCreate(sqLiteDatabase);
ModifierSequence.Table.onCreate(sqLiteDatabase);
Category.Table.onCreate(sqLiteDatabase);
Campaign.Table.onCreate(sqLiteDatabase);
}
@Override
@ -30,6 +28,5 @@ public class DBOpenHelper extends SQLiteOpenHelper{
Contribution.Table.onUpdate(sqLiteDatabase, from, to);
ModifierSequence.Table.onUpdate(sqLiteDatabase, from, to);
Category.Table.onUpdate(sqLiteDatabase, from, to);
Campaign.Table.onUpdate(sqLiteDatabase, from, to);
}
}

View file

@ -42,11 +42,16 @@ public class MediaDetailPagerFragment extends SherlockFragment implements ViewPa
public interface MediaDetailProvider {
public Media getMediaAtPosition(int i);
public int getTotalMediaCount();
public void notifyDatasetChanged();
public void registerDataSetObserver(DataSetObserver observer);
public void unregisterDataSetObserver(DataSetObserver observer);
}
private class MediaDetailAdapter extends FragmentStatePagerAdapter {
public MediaDetailAdapter(FragmentManager fm) {

View file

@ -21,6 +21,7 @@ public class ModificationsContentProvider extends ContentProvider{
public static final Uri BASE_URI = Uri.parse("content://" + AUTHORITY + "/" + BASE_PATH);
private static final UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
uriMatcher.addURI(AUTHORITY, BASE_PATH, MODIFICATIONS);
uriMatcher.addURI(AUTHORITY, BASE_PATH + "/#", MODIFICATIONS_ID);
@ -32,6 +33,7 @@ public class ModificationsContentProvider extends ContentProvider{
}
private DBOpenHelper dbOpenHelper;
@Override
public boolean onCreate() {
dbOpenHelper = ((CommonsApplication) this.getContext().getApplicationContext()).getDbOpenHelper();

View file

@ -13,7 +13,6 @@ import fr.free.nrw.commons.modifications.CategoryModifier;
import fr.free.nrw.commons.modifications.TemplateRemoveModifier;
import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.EventLog;
import fr.free.nrw.commons.campaigns.Campaign;
import fr.free.nrw.commons.category.CategorizationFragment;
import fr.free.nrw.commons.contributions.*;
import fr.free.nrw.commons.auth.*;
@ -151,11 +150,8 @@ public class ShareActivity
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Campaign campaign = null;
if(getIntent().hasExtra(UploadService.EXTRA_CAMPAIGN)) {
campaign = (Campaign) getIntent().getSerializableExtra(UploadService.EXTRA_CAMPAIGN);
}
uploadController = new UploadController(this, campaign);
uploadController = new UploadController(this);
setContentView(R.layout.activity_share);
app = (CommonsApplication) this.getApplicationContext();

View file

@ -64,9 +64,11 @@ public class SingleUploadFragment extends SherlockFragment {
licenseSummaryView = (TextView) rootView.findViewById(R.id.share_license_summary);
TextWatcher uploadEnabler = new TextWatcher() {
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { }
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
}
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {}
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
}
public void afterTextChanged(Editable editable) {
if (getSherlockActivity() != null) {

View file

@ -15,8 +15,7 @@ import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.HandlerService;
import fr.free.nrw.commons.Prefs;
import fr.free.nrw.commons.Utils;
import fr.free.nrw.commons.campaigns.Campaign;
import fr.free.nrw.commons.campaigns.CampaignContribution;
import java.io.IOException;
import java.util.Date;
@ -25,7 +24,6 @@ public class UploadController {
private UploadService uploadService;
private final Activity activity;
private Campaign campaign;
final CommonsApplication app;
public interface ContributionUploadProgress {
@ -37,10 +35,6 @@ public class UploadController {
app = (CommonsApplication) activity.getApplicationContext();
}
public UploadController(Activity activity, Campaign campaign) {
this(activity);
this.campaign = campaign;
}
private boolean isUploadServiceConnected;
private ServiceConnection uploadServiceConnection = new ServiceConnection() {
@ -81,11 +75,9 @@ public class UploadController {
title += "." + extension;
}
if(campaign == null) {
contribution = new Contribution(mediaUri, null, title, description, -1, null, null, app.getCurrentAccount().name, CommonsApplication.DEFAULT_EDIT_SUMMARY);
} else {
contribution = new CampaignContribution(mediaUri, null, title, description, -1, null, null, app.getCurrentAccount().name, CommonsApplication.DEFAULT_EDIT_SUMMARY, campaign);
}
contribution.setTag("mimeType", mimeType);
contribution.setSource(source);