mirror of
				https://github.com/commons-app/apps-android-commons.git
				synced 2025-10-31 06:43:56 +01:00 
			
		
		
		
	Fix conflicts
This commit is contained in:
		
						commit
						5b88111289
					
				
					 324 changed files with 9238 additions and 2883 deletions
				
			
		|  | @ -1,14 +1,8 @@ | |||
| package fr.free.nrw.commons.contributions; | ||||
| 
 | ||||
| import android.content.ContentProviderClient; | ||||
| import android.content.ContentValues; | ||||
| import android.database.Cursor; | ||||
| import android.database.sqlite.SQLiteDatabase; | ||||
| import android.net.Uri; | ||||
| import android.os.Parcel; | ||||
| import android.os.RemoteException; | ||||
| import android.support.annotation.NonNull; | ||||
| import android.text.TextUtils; | ||||
| 
 | ||||
| import java.text.SimpleDateFormat; | ||||
| import java.util.Date; | ||||
|  | @ -43,7 +37,6 @@ public class Contribution extends Media { | |||
|     public static final String SOURCE_GALLERY = "gallery"; | ||||
|     public static final String SOURCE_EXTERNAL = "external"; | ||||
| 
 | ||||
|     private ContentProviderClient client; | ||||
|     private Uri contentUri; | ||||
|     private String source; | ||||
|     private String editSummary; | ||||
|  | @ -51,24 +44,42 @@ public class Contribution extends Media { | |||
|     private int state; | ||||
|     private long transferred; | ||||
|     private String decimalCoords; | ||||
| 
 | ||||
|     private boolean isMultiple; | ||||
| 
 | ||||
|     public boolean getMultiple() { | ||||
|         return isMultiple; | ||||
|     public Contribution(Uri contentUri, String filename, Uri localUri, String imageUrl, Date timestamp, | ||||
|                         int state, long dataLength, Date dateUploaded, long transferred, | ||||
|                         String source, String description, String creator, boolean isMultiple, | ||||
|                         int width, int height, String license) { | ||||
|         super(localUri, imageUrl, filename, description, dataLength, timestamp, dateUploaded, creator); | ||||
|         this.contentUri = contentUri; | ||||
|         this.state = state; | ||||
|         this.timestamp = timestamp; | ||||
|         this.transferred = transferred; | ||||
|         this.source = source; | ||||
|         this.isMultiple = isMultiple; | ||||
|         this.width = width; | ||||
|         this.height = height; | ||||
|         this.license = license; | ||||
|     } | ||||
| 
 | ||||
|     public void setMultiple(boolean multiple) { | ||||
|         isMultiple = multiple; | ||||
|     } | ||||
| 
 | ||||
|     public Contribution(Uri localUri, String remoteUri, String filename, String description, long dataLength, Date dateCreated, Date dateUploaded, String creator, String editSummary, String decimalCoords) { | ||||
|         super(localUri, remoteUri, filename, description, dataLength, dateCreated, dateUploaded, creator); | ||||
|     public Contribution(Uri localUri, String imageUrl, String filename, String description, long dataLength, | ||||
|                         Date dateCreated, Date dateUploaded, String creator, String editSummary, String decimalCoords) { | ||||
|         super(localUri, imageUrl, filename, description, dataLength, dateCreated, dateUploaded, creator); | ||||
|         this.decimalCoords = decimalCoords; | ||||
|         this.editSummary = editSummary; | ||||
|         timestamp = new Date(System.currentTimeMillis()); | ||||
|     } | ||||
| 
 | ||||
|     public Contribution(Parcel in) { | ||||
|         super(in); | ||||
|         contentUri = in.readParcelable(Uri.class.getClassLoader()); | ||||
|         source = in.readString(); | ||||
|         timestamp = (Date) in.readSerializable(); | ||||
|         state = in.readInt(); | ||||
|         transferred = in.readLong(); | ||||
|         isMultiple = in.readInt() == 1; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void writeToParcel(Parcel parcel, int flags) { | ||||
|         super.writeToParcel(parcel, flags); | ||||
|  | @ -80,14 +91,12 @@ public class Contribution extends Media { | |||
|         parcel.writeInt(isMultiple ? 1 : 0); | ||||
|     } | ||||
| 
 | ||||
|     public Contribution(Parcel in) { | ||||
|         super(in); | ||||
|         contentUri = in.readParcelable(Uri.class.getClassLoader()); | ||||
|         source = in.readString(); | ||||
|         timestamp = (Date) in.readSerializable(); | ||||
|         state = in.readInt(); | ||||
|         transferred = in.readLong(); | ||||
|         isMultiple = in.readInt() == 1; | ||||
|     public boolean getMultiple() { | ||||
|         return isMultiple; | ||||
|     } | ||||
| 
 | ||||
|     public void setMultiple(boolean multiple) { | ||||
|         isMultiple = multiple; | ||||
|     } | ||||
| 
 | ||||
|     public long getTransferred() { | ||||
|  | @ -106,10 +115,18 @@ public class Contribution extends Media { | |||
|         return contentUri; | ||||
|     } | ||||
| 
 | ||||
|     public void setContentUri(Uri contentUri) { | ||||
|         this.contentUri = contentUri; | ||||
|     } | ||||
| 
 | ||||
|     public Date getTimestamp() { | ||||
|         return timestamp; | ||||
|     } | ||||
| 
 | ||||
|     public void setTimestamp(Date timestamp) { | ||||
|         this.timestamp = timestamp; | ||||
|     } | ||||
| 
 | ||||
|     public int getState() { | ||||
|         return state; | ||||
|     } | ||||
|  | @ -155,62 +172,6 @@ public class Contribution extends Media { | |||
|         return buffer.toString(); | ||||
|     } | ||||
| 
 | ||||
|     public void setContentProviderClient(ContentProviderClient client) { | ||||
|         this.client = client; | ||||
|     } | ||||
| 
 | ||||
|     public void save() { | ||||
|         try { | ||||
|             if (contentUri == null) { | ||||
|                 contentUri = client.insert(ContributionsContentProvider.BASE_URI, this.toContentValues()); | ||||
|             } else { | ||||
|                 client.update(contentUri, toContentValues(), null, null); | ||||
|             } | ||||
|         } catch (RemoteException e) { | ||||
|             throw new RuntimeException(e); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public void delete() { | ||||
|         try { | ||||
|             if (contentUri == null) { | ||||
|                 // noooo | ||||
|                 throw new RuntimeException("tried to delete item with no content URI"); | ||||
|             } else { | ||||
|                 client.delete(contentUri, null, null); | ||||
|             } | ||||
|         } catch (RemoteException e) { | ||||
|             throw new RuntimeException(e); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     public ContentValues toContentValues() { | ||||
|         ContentValues cv = new ContentValues(); | ||||
|         cv.put(Table.COLUMN_FILENAME, getFilename()); | ||||
|         if (getLocalUri() != null) { | ||||
|             cv.put(Table.COLUMN_LOCAL_URI, getLocalUri().toString()); | ||||
|         } | ||||
|         if (getImageUrl() != null) { | ||||
|             cv.put(Table.COLUMN_IMAGE_URL, getImageUrl()); | ||||
|         } | ||||
|         if (getDateUploaded() != null) { | ||||
|             cv.put(Table.COLUMN_UPLOADED, getDateUploaded().getTime()); | ||||
|         } | ||||
|         cv.put(Table.COLUMN_LENGTH, getDataLength()); | ||||
|         cv.put(Table.COLUMN_TIMESTAMP, getTimestamp().getTime()); | ||||
|         cv.put(Table.COLUMN_STATE, getState()); | ||||
|         cv.put(Table.COLUMN_TRANSFERRED, transferred); | ||||
|         cv.put(Table.COLUMN_SOURCE, source); | ||||
|         cv.put(Table.COLUMN_DESCRIPTION, description); | ||||
|         cv.put(Table.COLUMN_CREATOR, creator); | ||||
|         cv.put(Table.COLUMN_MULTIPLE, isMultiple ? 1 : 0); | ||||
|         cv.put(Table.COLUMN_WIDTH, width); | ||||
|         cv.put(Table.COLUMN_HEIGHT, height); | ||||
|         cv.put(Table.COLUMN_LICENSE, license); | ||||
|         return cv; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void setFilename(String filename) { | ||||
|         this.filename = filename; | ||||
|  | @ -224,33 +185,6 @@ public class Contribution extends Media { | |||
|         timestamp = new Date(System.currentTimeMillis()); | ||||
|     } | ||||
| 
 | ||||
|     public static Contribution fromCursor(Cursor cursor) { | ||||
|         // Hardcoding column positions! | ||||
|         Contribution c = new Contribution(); | ||||
| 
 | ||||
|         //Check that cursor has a value to avoid CursorIndexOutOfBoundsException | ||||
|         if (cursor.getCount() > 0) { | ||||
|             c.contentUri = ContributionsContentProvider.uriForId(cursor.getInt(0)); | ||||
|             c.filename = cursor.getString(1); | ||||
|             c.localUri = TextUtils.isEmpty(cursor.getString(2)) ? null : Uri.parse(cursor.getString(2)); | ||||
|             c.imageUrl = cursor.getString(3); | ||||
|             c.timestamp = cursor.getLong(4) == 0 ? null : new Date(cursor.getLong(4)); | ||||
|             c.state = cursor.getInt(5); | ||||
|             c.dataLength = cursor.getLong(6); | ||||
|             c.dateUploaded = cursor.getLong(7) == 0 ? null : new Date(cursor.getLong(7)); | ||||
|             c.transferred = cursor.getLong(8); | ||||
|             c.source = cursor.getString(9); | ||||
|             c.description = cursor.getString(10); | ||||
|             c.creator = cursor.getString(11); | ||||
|             c.isMultiple = cursor.getInt(12) == 1; | ||||
|             c.width = cursor.getInt(13); | ||||
|             c.height = cursor.getInt(14); | ||||
|             c.license = cursor.getString(15); | ||||
|         } | ||||
| 
 | ||||
|         return c; | ||||
|     } | ||||
| 
 | ||||
|     public String getSource() { | ||||
|         return source; | ||||
|     } | ||||
|  | @ -263,119 +197,8 @@ public class Contribution extends Media { | |||
|         this.localUri = localUri; | ||||
|     } | ||||
| 
 | ||||
|     public static class Table { | ||||
|         public static final String TABLE_NAME = "contributions"; | ||||
| 
 | ||||
|         public static final String COLUMN_ID = "_id"; | ||||
|         public static final String COLUMN_FILENAME = "filename"; | ||||
|         public static final String COLUMN_LOCAL_URI = "local_uri"; | ||||
|         public static final String COLUMN_IMAGE_URL = "image_url"; | ||||
|         public static final String COLUMN_TIMESTAMP = "timestamp"; | ||||
|         public static final String COLUMN_STATE = "state"; | ||||
|         public static final String COLUMN_LENGTH = "length"; | ||||
|         public static final String COLUMN_UPLOADED = "uploaded"; | ||||
|         public static final String COLUMN_TRANSFERRED = "transferred"; // Currently transferred number of bytes | ||||
|         public static final String COLUMN_SOURCE = "source"; | ||||
|         public static final String COLUMN_DESCRIPTION = "description"; | ||||
|         public static final String COLUMN_CREATOR = "creator"; // Initial uploader | ||||
|         public static final String COLUMN_MULTIPLE = "multiple"; | ||||
|         public static final String COLUMN_WIDTH = "width"; | ||||
|         public static final String COLUMN_HEIGHT = "height"; | ||||
|         public static final String COLUMN_LICENSE = "license"; | ||||
| 
 | ||||
|         // 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_FILENAME, | ||||
|                 COLUMN_LOCAL_URI, | ||||
|                 COLUMN_IMAGE_URL, | ||||
|                 COLUMN_TIMESTAMP, | ||||
|                 COLUMN_STATE, | ||||
|                 COLUMN_LENGTH, | ||||
|                 COLUMN_UPLOADED, | ||||
|                 COLUMN_TRANSFERRED, | ||||
|                 COLUMN_SOURCE, | ||||
|                 COLUMN_DESCRIPTION, | ||||
|                 COLUMN_CREATOR, | ||||
|                 COLUMN_MULTIPLE, | ||||
|                 COLUMN_WIDTH, | ||||
|                 COLUMN_HEIGHT, | ||||
|                 COLUMN_LICENSE | ||||
|         }; | ||||
| 
 | ||||
| 
 | ||||
|         private static final String CREATE_TABLE_STATEMENT = "CREATE TABLE " + TABLE_NAME + " (" | ||||
|                 + "_id INTEGER PRIMARY KEY," | ||||
|                 + "filename STRING," | ||||
|                 + "local_uri STRING," | ||||
|                 + "image_url STRING," | ||||
|                 + "uploaded INTEGER," | ||||
|                 + "timestamp INTEGER," | ||||
|                 + "state INTEGER," | ||||
|                 + "length INTEGER," | ||||
|                 + "transferred INTEGER," | ||||
|                 + "source STRING," | ||||
|                 + "description STRING," | ||||
|                 + "creator STRING," | ||||
|                 + "multiple INTEGER," | ||||
|                 + "width INTEGER," | ||||
|                 + "height INTEGER," | ||||
|                 + "LICENSE STRING" | ||||
|                 + ");"; | ||||
| 
 | ||||
| 
 | ||||
|         public static void onCreate(SQLiteDatabase db) { | ||||
|             db.execSQL(CREATE_TABLE_STATEMENT); | ||||
|         } | ||||
| 
 | ||||
|         public static void onDelete(SQLiteDatabase db) { | ||||
|             db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); | ||||
|             onCreate(db); | ||||
|         } | ||||
| 
 | ||||
|         public static void onUpdate(SQLiteDatabase db, int from, int to) { | ||||
|             if (from == to) { | ||||
|                 return; | ||||
|             } | ||||
|             if (from == 1) { | ||||
|                 db.execSQL("ALTER TABLE " + TABLE_NAME + " ADD COLUMN description STRING;"); | ||||
|                 db.execSQL("ALTER TABLE " + TABLE_NAME + " ADD COLUMN creator STRING;"); | ||||
|                 from++; | ||||
|                 onUpdate(db, from, to); | ||||
|                 return; | ||||
|             } | ||||
|             if (from == 2) { | ||||
|                 db.execSQL("ALTER TABLE " + TABLE_NAME + " ADD COLUMN multiple INTEGER;"); | ||||
|                 db.execSQL("UPDATE " + TABLE_NAME + " SET multiple = 0"); | ||||
|                 from++; | ||||
|                 onUpdate(db, from, to); | ||||
|                 return; | ||||
|             } | ||||
|             if (from == 3) { | ||||
|                 // Do nothing | ||||
|                 from++; | ||||
|                 onUpdate(db, from, to); | ||||
|                 return; | ||||
|             } | ||||
|             if (from == 4) { | ||||
|                 // Do nothing -- added Category | ||||
|                 from++; | ||||
|                 onUpdate(db, from, to); | ||||
|                 return; | ||||
|             } | ||||
|             if (from == 5) { | ||||
|                 // Added width and height fields | ||||
|                 db.execSQL("ALTER TABLE " + TABLE_NAME + " ADD COLUMN width INTEGER;"); | ||||
|                 db.execSQL("UPDATE " + TABLE_NAME + " SET width = 0"); | ||||
|                 db.execSQL("ALTER TABLE " + TABLE_NAME + " ADD COLUMN height INTEGER;"); | ||||
|                 db.execSQL("UPDATE " + TABLE_NAME + " SET height = 0"); | ||||
|                 db.execSQL("ALTER TABLE " + TABLE_NAME + " ADD COLUMN license STRING;"); | ||||
|                 db.execSQL("UPDATE " + TABLE_NAME + " SET license='" + Prefs.Licenses.CC_BY_SA_3 + "';"); | ||||
|                 from++; | ||||
|                 onUpdate(db, from, to); | ||||
|                 return; | ||||
|             } | ||||
|         } | ||||
|     public void setDecimalCoords(String decimalCoords) { | ||||
|         this.decimalCoords = decimalCoords; | ||||
|     } | ||||
| 
 | ||||
|     @NonNull | ||||
|  | @ -396,6 +219,7 @@ public class Contribution extends Media { | |||
|             case Prefs.Licenses.CC_BY_SA: | ||||
|                 return "{{self|cc-by-sa-3.0}}"; | ||||
|         } | ||||
| 
 | ||||
|         throw new RuntimeException("Unrecognized license value: " + license); | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -80,11 +80,20 @@ public class ContributionController { | |||
|         //FIXME: Starts gallery (opens Google Photos) | ||||
|         Intent pickImageIntent = new Intent(ACTION_GET_CONTENT); | ||||
|         pickImageIntent.setType("image/*"); | ||||
| <<<<<<< HEAD | ||||
|         Timber.d("startGalleryPick() called with pickImageIntent"); | ||||
|         // See https://stackoverflow.com/questions/22366596/android-illegalstateexception-fragment-not-attached-to-activity-webview | ||||
|         if (!fragment.isAdded()) { | ||||
|             return; | ||||
|         } | ||||
| ======= | ||||
|         // See https://stackoverflow.com/questions/22366596/android-illegalstateexception-fragment-not-attached-to-activity-webview | ||||
|         if (!fragment.isAdded()) { | ||||
|             Timber.d("Fragment is not added, startActivityForResult cannot be called"); | ||||
|             return; | ||||
|         } | ||||
|         Timber.d("startGalleryPick() called with pickImageIntent"); | ||||
| >>>>>>> directNearbyUploadsNewLocal | ||||
|         fragment.startActivityForResult(pickImageIntent, SELECT_FROM_GALLERY); | ||||
|     } | ||||
| 
 | ||||
|  | @ -105,12 +114,20 @@ public class ContributionController { | |||
|                 } | ||||
|                 break; | ||||
|             case SELECT_FROM_CAMERA: | ||||
|                 shareIntent.setType("image/jpeg"); //FIXME: Find out appropriate mime type | ||||
|                 //FIXME: Find out appropriate mime type | ||||
|                 // AFAIK this is the right type for a JPEG image | ||||
|                 // https://developer.android.com/training/sharing/send.html#send-binary-content | ||||
|                 shareIntent.setType("image/jpeg"); | ||||
|                 shareIntent.putExtra(EXTRA_STREAM, lastGeneratedCaptureUri); | ||||
|                 shareIntent.putExtra(EXTRA_SOURCE, SOURCE_CAMERA); | ||||
|                 if (isDirectUpload) { | ||||
|                     shareIntent.putExtra("isDirectUpload", true); | ||||
|                 } | ||||
| <<<<<<< HEAD | ||||
| ======= | ||||
|                 break; | ||||
|             default: | ||||
| >>>>>>> directNearbyUploadsNewLocal | ||||
|                 break; | ||||
|         } | ||||
|         Timber.i("Image selected"); | ||||
|  | @ -132,5 +149,4 @@ public class ContributionController { | |||
|             lastGeneratedCaptureUri = savedInstanceState.getParcelable("lastGeneratedCaptureURI"); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| } | ||||
|  |  | |||
|  | @ -0,0 +1,281 @@ | |||
| package fr.free.nrw.commons.contributions; | ||||
| 
 | ||||
| import android.content.ContentProviderClient; | ||||
| import android.content.ContentValues; | ||||
| import android.database.Cursor; | ||||
| import android.database.sqlite.SQLiteDatabase; | ||||
| import android.net.Uri; | ||||
| import android.os.RemoteException; | ||||
| import android.support.annotation.Nullable; | ||||
| import android.text.TextUtils; | ||||
| 
 | ||||
| import java.util.Date; | ||||
| 
 | ||||
| import javax.inject.Inject; | ||||
| import javax.inject.Named; | ||||
| import javax.inject.Provider; | ||||
| 
 | ||||
| import fr.free.nrw.commons.settings.Prefs; | ||||
| 
 | ||||
| import static fr.free.nrw.commons.contributions.ContributionDao.Table.ALL_FIELDS; | ||||
| import static fr.free.nrw.commons.contributions.ContributionsContentProvider.BASE_URI; | ||||
| import static fr.free.nrw.commons.contributions.ContributionsContentProvider.uriForId; | ||||
| 
 | ||||
| public class ContributionDao { | ||||
|     /* | ||||
|         This sorts in the following order: | ||||
|         Currently Uploading | ||||
|         Failed (Sorted in ascending order of time added - FIFO) | ||||
|         Queued to Upload (Sorted in ascending order of time added - FIFO) | ||||
|         Completed (Sorted in descending order of time added) | ||||
| 
 | ||||
|         This is why Contribution.STATE_COMPLETED is -1. | ||||
|      */ | ||||
|     static final String CONTRIBUTION_SORT = Table.COLUMN_STATE + " DESC, " | ||||
|             + Table.COLUMN_UPLOADED + " DESC , (" | ||||
|             + Table.COLUMN_TIMESTAMP + " * " | ||||
|             + Table.COLUMN_STATE + ")"; | ||||
| 
 | ||||
|     private final Provider<ContentProviderClient> clientProvider; | ||||
| 
 | ||||
|     @Inject | ||||
|     public ContributionDao(@Named("contribution") Provider<ContentProviderClient> clientProvider) { | ||||
|         this.clientProvider = clientProvider; | ||||
|     } | ||||
| 
 | ||||
|     Cursor loadAllContributions() { | ||||
|         ContentProviderClient db = clientProvider.get(); | ||||
|         try { | ||||
|             return db.query(BASE_URI, ALL_FIELDS, "", null, CONTRIBUTION_SORT); | ||||
|         } catch (RemoteException e) { | ||||
|             return null; | ||||
|         } finally { | ||||
|             db.release(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public void save(Contribution contribution) { | ||||
|         ContentProviderClient db = clientProvider.get(); | ||||
|         try { | ||||
|             if (contribution.getContentUri() == null) { | ||||
|                 contribution.setContentUri(db.insert(BASE_URI, toContentValues(contribution))); | ||||
|             } else { | ||||
|                 db.update(contribution.getContentUri(), toContentValues(contribution), null, null); | ||||
|             } | ||||
|         } catch (RemoteException e) { | ||||
|             throw new RuntimeException(e); | ||||
|         } finally { | ||||
|             db.release(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public void delete(Contribution contribution) { | ||||
|         ContentProviderClient db = clientProvider.get(); | ||||
|         try { | ||||
|             if (contribution.getContentUri() == null) { | ||||
|                 // noooo | ||||
|                 throw new RuntimeException("tried to delete item with no content URI"); | ||||
|             } else { | ||||
|                 db.delete(contribution.getContentUri(), null, null); | ||||
|             } | ||||
|         } catch (RemoteException e) { | ||||
|             throw new RuntimeException(e); | ||||
|         } finally { | ||||
|             db.release(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     ContentValues toContentValues(Contribution contribution) { | ||||
|         ContentValues cv = new ContentValues(); | ||||
|         cv.put(Table.COLUMN_FILENAME, contribution.getFilename()); | ||||
|         if (contribution.getLocalUri() != null) { | ||||
|             cv.put(Table.COLUMN_LOCAL_URI, contribution.getLocalUri().toString()); | ||||
|         } | ||||
|         if (contribution.getImageUrl() != null) { | ||||
|             cv.put(Table.COLUMN_IMAGE_URL, contribution.getImageUrl()); | ||||
|         } | ||||
|         if (contribution.getDateUploaded() != null) { | ||||
|             cv.put(Table.COLUMN_UPLOADED, contribution.getDateUploaded().getTime()); | ||||
|         } | ||||
|         cv.put(Table.COLUMN_LENGTH, contribution.getDataLength()); | ||||
|         cv.put(Table.COLUMN_TIMESTAMP, contribution.getTimestamp().getTime()); | ||||
|         cv.put(Table.COLUMN_STATE, contribution.getState()); | ||||
|         cv.put(Table.COLUMN_TRANSFERRED, contribution.getTransferred()); | ||||
|         cv.put(Table.COLUMN_SOURCE, contribution.getSource()); | ||||
|         cv.put(Table.COLUMN_DESCRIPTION, contribution.getDescription()); | ||||
|         cv.put(Table.COLUMN_CREATOR, contribution.getCreator()); | ||||
|         cv.put(Table.COLUMN_MULTIPLE, contribution.getMultiple() ? 1 : 0); | ||||
|         cv.put(Table.COLUMN_WIDTH, contribution.getWidth()); | ||||
|         cv.put(Table.COLUMN_HEIGHT, contribution.getHeight()); | ||||
|         cv.put(Table.COLUMN_LICENSE, contribution.getLicense()); | ||||
|         return cv; | ||||
|     } | ||||
| 
 | ||||
|     public Contribution fromCursor(Cursor cursor) { | ||||
|         // Hardcoding column positions! | ||||
|         //Check that cursor has a value to avoid CursorIndexOutOfBoundsException | ||||
|         if (cursor.getCount() > 0) { | ||||
|             return new Contribution( | ||||
|                     uriForId(cursor.getInt(0)), | ||||
|                     cursor.getString(1), | ||||
|                     parseUri(cursor.getString(2)), | ||||
|                     cursor.getString(3), | ||||
|                     parseTimestamp(cursor.getLong(4)), | ||||
|                     cursor.getInt(5), | ||||
|                     cursor.getLong(6), | ||||
|                     parseTimestamp(cursor.getLong(7)), | ||||
|                     cursor.getLong(8), | ||||
|                     cursor.getString(9), | ||||
|                     cursor.getString(10), | ||||
|                     cursor.getString(11), | ||||
|                     cursor.getInt(12) == 1, | ||||
|                     cursor.getInt(13), | ||||
|                     cursor.getInt(14), | ||||
|                     cursor.getString(15)); | ||||
|         } | ||||
| 
 | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     @Nullable | ||||
|     private static Date parseTimestamp(long timestamp) { | ||||
|         return timestamp == 0 ? null : new Date(timestamp); | ||||
|     } | ||||
| 
 | ||||
|     @Nullable | ||||
|     private static Uri parseUri(String uriString) { | ||||
|         return TextUtils.isEmpty(uriString) ? null : Uri.parse(uriString); | ||||
|     } | ||||
| 
 | ||||
|     public static class Table { | ||||
|         public static final String TABLE_NAME = "contributions"; | ||||
| 
 | ||||
|         public static final String COLUMN_ID = "_id"; | ||||
|         public static final String COLUMN_FILENAME = "filename"; | ||||
|         public static final String COLUMN_LOCAL_URI = "local_uri"; | ||||
|         public static final String COLUMN_IMAGE_URL = "image_url"; | ||||
|         public static final String COLUMN_TIMESTAMP = "timestamp"; | ||||
|         public static final String COLUMN_STATE = "state"; | ||||
|         public static final String COLUMN_LENGTH = "length"; | ||||
|         public static final String COLUMN_UPLOADED = "uploaded"; | ||||
|         public static final String COLUMN_TRANSFERRED = "transferred"; // Currently transferred number of bytes | ||||
|         public static final String COLUMN_SOURCE = "source"; | ||||
|         public static final String COLUMN_DESCRIPTION = "description"; | ||||
|         public static final String COLUMN_CREATOR = "creator"; // Initial uploader | ||||
|         public static final String COLUMN_MULTIPLE = "multiple"; | ||||
|         public static final String COLUMN_WIDTH = "width"; | ||||
|         public static final String COLUMN_HEIGHT = "height"; | ||||
|         public static final String COLUMN_LICENSE = "license"; | ||||
| 
 | ||||
|         // 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_FILENAME, | ||||
|                 COLUMN_LOCAL_URI, | ||||
|                 COLUMN_IMAGE_URL, | ||||
|                 COLUMN_TIMESTAMP, | ||||
|                 COLUMN_STATE, | ||||
|                 COLUMN_LENGTH, | ||||
|                 COLUMN_UPLOADED, | ||||
|                 COLUMN_TRANSFERRED, | ||||
|                 COLUMN_SOURCE, | ||||
|                 COLUMN_DESCRIPTION, | ||||
|                 COLUMN_CREATOR, | ||||
|                 COLUMN_MULTIPLE, | ||||
|                 COLUMN_WIDTH, | ||||
|                 COLUMN_HEIGHT, | ||||
|                 COLUMN_LICENSE | ||||
|         }; | ||||
| 
 | ||||
|         public static final String DROP_TABLE_STATEMENT = "DROP TABLE IF EXISTS " + TABLE_NAME; | ||||
| 
 | ||||
|         public static final String CREATE_TABLE_STATEMENT = "CREATE TABLE " + TABLE_NAME + " (" | ||||
|                 + "_id INTEGER PRIMARY KEY," | ||||
|                 + "filename STRING," | ||||
|                 + "local_uri STRING," | ||||
|                 + "image_url STRING," | ||||
|                 + "uploaded INTEGER," | ||||
|                 + "timestamp INTEGER," | ||||
|                 + "state INTEGER," | ||||
|                 + "length INTEGER," | ||||
|                 + "transferred INTEGER," | ||||
|                 + "source STRING," | ||||
|                 + "description STRING," | ||||
|                 + "creator STRING," | ||||
|                 + "multiple INTEGER," | ||||
|                 + "width INTEGER," | ||||
|                 + "height INTEGER," | ||||
|                 + "LICENSE STRING" | ||||
|                 + ");"; | ||||
| 
 | ||||
|         // Upgrade from version 1 -> | ||||
|         static final String ADD_CREATOR_FIELD = "ALTER TABLE " + TABLE_NAME + " ADD COLUMN creator STRING;"; | ||||
|         static final String ADD_DESCRIPTION_FIELD = "ALTER TABLE " + TABLE_NAME + " ADD COLUMN description STRING;"; | ||||
| 
 | ||||
|         // Upgrade from version 2 -> | ||||
|         static final String ADD_MULTIPLE_FIELD = "ALTER TABLE " + TABLE_NAME + " ADD COLUMN multiple INTEGER;"; | ||||
|         static final String SET_DEFAULT_MULTIPLE = "UPDATE " + TABLE_NAME + " SET multiple = 0"; | ||||
| 
 | ||||
|         // Upgrade from version 5 -> | ||||
|         static final String ADD_WIDTH_FIELD = "ALTER TABLE " + TABLE_NAME + " ADD COLUMN width INTEGER;"; | ||||
|         static final String SET_DEFAULT_WIDTH = "UPDATE " + TABLE_NAME + " SET width = 0"; | ||||
|         static final String ADD_HEIGHT_FIELD = "ALTER TABLE " + TABLE_NAME + " ADD COLUMN height INTEGER;"; | ||||
|         static final String SET_DEFAULT_HEIGHT = "UPDATE " + TABLE_NAME + " SET height = 0"; | ||||
|         static final String ADD_LICENSE_FIELD = "ALTER TABLE " + TABLE_NAME + " ADD COLUMN license STRING;"; | ||||
|         static final String SET_DEFAULT_LICENSE = "UPDATE " + TABLE_NAME + " SET license='" + Prefs.Licenses.CC_BY_SA_3 + "';"; | ||||
| 
 | ||||
| 
 | ||||
|         public static void onCreate(SQLiteDatabase db) { | ||||
|             db.execSQL(CREATE_TABLE_STATEMENT); | ||||
|         } | ||||
| 
 | ||||
|         public static void onDelete(SQLiteDatabase db) { | ||||
|             db.execSQL(DROP_TABLE_STATEMENT); | ||||
|             onCreate(db); | ||||
|         } | ||||
| 
 | ||||
|         public static void onUpdate(SQLiteDatabase db, int from, int to) { | ||||
|             if (from == to) { | ||||
|                 return; | ||||
|             } | ||||
|             if (from == 1) { | ||||
|                 db.execSQL(ADD_DESCRIPTION_FIELD); | ||||
|                 db.execSQL(ADD_CREATOR_FIELD); | ||||
|                 from++; | ||||
|                 onUpdate(db, from, to); | ||||
|                 return; | ||||
|             } | ||||
|             if (from == 2) { | ||||
|                 db.execSQL(ADD_MULTIPLE_FIELD); | ||||
|                 db.execSQL(SET_DEFAULT_MULTIPLE); | ||||
|                 from++; | ||||
|                 onUpdate(db, from, to); | ||||
|                 return; | ||||
|             } | ||||
|             if (from == 3) { | ||||
|                 // Do nothing | ||||
|                 from++; | ||||
|                 onUpdate(db, from, to); | ||||
|                 return; | ||||
|             } | ||||
|             if (from == 4) { | ||||
|                 // Do nothing -- added Category | ||||
|                 from++; | ||||
|                 onUpdate(db, from, to); | ||||
|                 return; | ||||
|             } | ||||
|             if (from == 5) { | ||||
|                 // Added width and height fields | ||||
|                 db.execSQL(ADD_WIDTH_FIELD); | ||||
|                 db.execSQL(SET_DEFAULT_WIDTH); | ||||
|                 db.execSQL(ADD_HEIGHT_FIELD); | ||||
|                 db.execSQL(SET_DEFAULT_HEIGHT); | ||||
|                 db.execSQL(ADD_LICENSE_FIELD); | ||||
|                 db.execSQL(SET_DEFAULT_LICENSE); | ||||
|                 from++; | ||||
|                 onUpdate(db, from, to); | ||||
|                 return; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | @ -42,8 +42,7 @@ import timber.log.Timber; | |||
| 
 | ||||
| import static android.content.ContentResolver.requestSync; | ||||
| import static fr.free.nrw.commons.contributions.Contribution.STATE_FAILED; | ||||
| import static fr.free.nrw.commons.contributions.Contribution.Table.ALL_FIELDS; | ||||
| import static fr.free.nrw.commons.contributions.ContributionsContentProvider.AUTHORITY; | ||||
| import static fr.free.nrw.commons.contributions.ContributionDao.Table.ALL_FIELDS; | ||||
| import static fr.free.nrw.commons.contributions.ContributionsContentProvider.BASE_URI; | ||||
| import static fr.free.nrw.commons.settings.Prefs.UPLOADS_SHOWING; | ||||
| 
 | ||||
|  | @ -58,6 +57,7 @@ public  class       ContributionsActivity | |||
|     @Inject MediaWikiApi mediaWikiApi; | ||||
|     @Inject SessionManager sessionManager; | ||||
|     @Inject @Named("default_preferences") SharedPreferences prefs; | ||||
|     @Inject ContributionDao contributionDao; | ||||
| 
 | ||||
|     private Cursor allContributions; | ||||
|     private ContributionsListFragment contributionsList; | ||||
|  | @ -65,21 +65,6 @@ public  class       ContributionsActivity | |||
|     private UploadService uploadService; | ||||
|     private boolean isUploadServiceConnected; | ||||
|     private ArrayList<DataSetObserver> observersWaitingForLoad = new ArrayList<>(); | ||||
|     private String CONTRIBUTION_SELECTION = ""; | ||||
| 
 | ||||
|     /* | ||||
|         This sorts in the following order: | ||||
|         Currently Uploading | ||||
|         Failed (Sorted in ascending order of time added - FIFO) | ||||
|         Queued to Upload (Sorted in ascending order of time added - FIFO) | ||||
|         Completed (Sorted in descending order of time added) | ||||
| 
 | ||||
|         This is why Contribution.STATE_COMPLETED is -1. | ||||
|      */ | ||||
|     private String CONTRIBUTION_SORT = Contribution.Table.COLUMN_STATE + " DESC, " | ||||
|             + Contribution.Table.COLUMN_UPLOADED + " DESC , (" | ||||
|             + Contribution.Table.COLUMN_TIMESTAMP + " * " | ||||
|             + Contribution.Table.COLUMN_STATE + ")"; | ||||
| 
 | ||||
|     private CompositeDisposable compositeDisposable = new CompositeDisposable(); | ||||
| 
 | ||||
|  | @ -94,7 +79,7 @@ public  class       ContributionsActivity | |||
|         @Override | ||||
|         public void onServiceDisconnected(ComponentName componentName) { | ||||
|             // this should never happen | ||||
|             throw new RuntimeException("UploadService died but the rest of the process did not!"); | ||||
|             Timber.e(new RuntimeException("UploadService died but the rest of the process did not!")); | ||||
|         } | ||||
|     }; | ||||
| 
 | ||||
|  | @ -121,14 +106,13 @@ public  class       ContributionsActivity | |||
|     @Override | ||||
|     protected void onAuthCookieAcquired(String authCookie) { | ||||
|         // Do a sync everytime we get here! | ||||
|         requestSync(sessionManager.getCurrentAccount(), ContributionsContentProvider.AUTHORITY, new Bundle()); | ||||
|         requestSync(sessionManager.getCurrentAccount(), ContributionsContentProvider.CONTRIBUTION_AUTHORITY, new Bundle()); | ||||
|         Intent uploadServiceIntent = new Intent(this, UploadService.class); | ||||
|         uploadServiceIntent.setAction(UploadService.ACTION_START_SERVICE); | ||||
|         startService(uploadServiceIntent); | ||||
|         bindService(uploadServiceIntent, uploadServiceConnection, Context.BIND_AUTO_CREATE); | ||||
| 
 | ||||
|         allContributions = getContentResolver().query(BASE_URI, ALL_FIELDS, | ||||
|                 CONTRIBUTION_SELECTION, null, CONTRIBUTION_SORT); | ||||
|         allContributions = contributionDao.loadAllContributions(); | ||||
| 
 | ||||
|         getSupportLoaderManager().initLoader(0, null, this); | ||||
|     } | ||||
|  | @ -186,24 +170,23 @@ public  class       ContributionsActivity | |||
| 
 | ||||
|     public void retryUpload(int i) { | ||||
|         allContributions.moveToPosition(i); | ||||
|         Contribution c = Contribution.fromCursor(allContributions); | ||||
|         Contribution c = contributionDao.fromCursor(allContributions); | ||||
|         if (c.getState() == STATE_FAILED) { | ||||
|             uploadService.queue(UploadService.ACTION_UPLOAD_FILE, c); | ||||
|             Timber.d("Restarting for %s", c.toContentValues()); | ||||
|             Timber.d("Restarting for %s", c.toString()); | ||||
|         } else { | ||||
|             Timber.d("Skipping re-upload for non-failed %s", c.toContentValues()); | ||||
|             Timber.d("Skipping re-upload for non-failed %s", c.toString()); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public void deleteUpload(int i) { | ||||
|         allContributions.moveToPosition(i); | ||||
|         Contribution c = Contribution.fromCursor(allContributions); | ||||
|         Contribution c = contributionDao.fromCursor(allContributions); | ||||
|         if (c.getState() == STATE_FAILED) { | ||||
|             Timber.d("Deleting failed contrib %s", c.toContentValues()); | ||||
|             c.setContentProviderClient(getContentResolver().acquireContentProviderClient(AUTHORITY)); | ||||
|             c.delete(); | ||||
|             Timber.d("Deleting failed contrib %s", c.toString()); | ||||
|             contributionDao.delete(c); | ||||
|         } else { | ||||
|             Timber.d("Skipping deletion for non-failed contrib %s", c.toContentValues()); | ||||
|             Timber.d("Skipping deletion for non-failed contrib %s", c.toString()); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|  | @ -239,8 +222,8 @@ public  class       ContributionsActivity | |||
|     public Loader<Cursor> onCreateLoader(int i, Bundle bundle) { | ||||
|         int uploads = prefs.getInt(UPLOADS_SHOWING, 100); | ||||
|         return new CursorLoader(this, BASE_URI, | ||||
|                 ALL_FIELDS, CONTRIBUTION_SELECTION, null, | ||||
|                 CONTRIBUTION_SORT + "LIMIT " + uploads); | ||||
|                 ALL_FIELDS, "", null, | ||||
|                 ContributionDao.CONTRIBUTION_SORT + "LIMIT " + uploads); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|  | @ -249,7 +232,7 @@ public  class       ContributionsActivity | |||
| 
 | ||||
|         if (contributionsList.getAdapter() == null) { | ||||
|             contributionsList.setAdapter(new ContributionsListAdapter(getApplicationContext(), | ||||
|                     cursor, 0)); | ||||
|                     cursor, 0, contributionDao)); | ||||
|         } else { | ||||
|             ((CursorAdapter) contributionsList.getAdapter()).swapCursor(cursor); | ||||
|         } | ||||
|  | @ -270,7 +253,7 @@ public  class       ContributionsActivity | |||
|             // not yet ready to return data | ||||
|             return null; | ||||
|         } else { | ||||
|             return Contribution.fromCursor((Cursor) contributionsList.getAdapter().getItem(i)); | ||||
|             return contributionDao.fromCursor((Cursor) contributionsList.getAdapter().getItem(i)); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,6 +1,5 @@ | |||
| package fr.free.nrw.commons.contributions; | ||||
| 
 | ||||
| import android.content.ContentProvider; | ||||
| import android.content.ContentValues; | ||||
| import android.content.UriMatcher; | ||||
| import android.database.Cursor; | ||||
|  | @ -12,27 +11,27 @@ import android.text.TextUtils; | |||
| 
 | ||||
| import javax.inject.Inject; | ||||
| 
 | ||||
| import dagger.android.AndroidInjection; | ||||
| import fr.free.nrw.commons.data.DBOpenHelper; | ||||
| import fr.free.nrw.commons.di.CommonsDaggerContentProvider; | ||||
| import timber.log.Timber; | ||||
| 
 | ||||
| import static android.content.UriMatcher.NO_MATCH; | ||||
| import static fr.free.nrw.commons.contributions.Contribution.Table.ALL_FIELDS; | ||||
| import static fr.free.nrw.commons.contributions.Contribution.Table.TABLE_NAME; | ||||
| import static fr.free.nrw.commons.contributions.ContributionDao.Table.ALL_FIELDS; | ||||
| import static fr.free.nrw.commons.contributions.ContributionDao.Table.TABLE_NAME; | ||||
| 
 | ||||
| public class ContributionsContentProvider extends ContentProvider { | ||||
| public class ContributionsContentProvider extends CommonsDaggerContentProvider { | ||||
| 
 | ||||
|     private static final int CONTRIBUTIONS = 1; | ||||
|     private static final int CONTRIBUTIONS_ID = 2; | ||||
|     private static final String BASE_PATH = "contributions"; | ||||
|     private static final UriMatcher uriMatcher = new UriMatcher(NO_MATCH); | ||||
|     public static final String AUTHORITY = "fr.free.nrw.commons.contributions.contentprovider"; | ||||
|     public static final String CONTRIBUTION_AUTHORITY = "fr.free.nrw.commons.contributions.contentprovider"; | ||||
| 
 | ||||
|     public static final Uri BASE_URI = Uri.parse("content://" + AUTHORITY + "/" + BASE_PATH); | ||||
|     public static final Uri BASE_URI = Uri.parse("content://" + CONTRIBUTION_AUTHORITY + "/" + BASE_PATH); | ||||
| 
 | ||||
|     static { | ||||
|         uriMatcher.addURI(AUTHORITY, BASE_PATH, CONTRIBUTIONS); | ||||
|         uriMatcher.addURI(AUTHORITY, BASE_PATH + "/#", CONTRIBUTIONS_ID); | ||||
|         uriMatcher.addURI(CONTRIBUTION_AUTHORITY, BASE_PATH, CONTRIBUTIONS); | ||||
|         uriMatcher.addURI(CONTRIBUTION_AUTHORITY, BASE_PATH + "/#", CONTRIBUTIONS_ID); | ||||
|     } | ||||
| 
 | ||||
|     public static Uri uriForId(int id) { | ||||
|  | @ -41,12 +40,6 @@ public class ContributionsContentProvider extends ContentProvider { | |||
| 
 | ||||
|     @Inject DBOpenHelper dbOpenHelper; | ||||
| 
 | ||||
|     @Override | ||||
|     public boolean onCreate() { | ||||
|         AndroidInjection.inject(this); | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
|     @SuppressWarnings("ConstantConditions") | ||||
|     @Override | ||||
|     public Cursor query(@NonNull Uri uri, String[] projection, String selection, | ||||
|  | @ -93,7 +86,7 @@ public class ContributionsContentProvider extends ContentProvider { | |||
|     public Uri insert(@NonNull Uri uri, ContentValues contentValues) { | ||||
|         int uriType = uriMatcher.match(uri); | ||||
|         SQLiteDatabase sqlDB = dbOpenHelper.getWritableDatabase(); | ||||
|         long id = 0; | ||||
|         long id; | ||||
|         switch (uriType) { | ||||
|             case CONTRIBUTIONS: | ||||
|                 id = sqlDB.insert(TABLE_NAME, null, contentValues); | ||||
|  | @ -165,7 +158,7 @@ public class ContributionsContentProvider extends ContentProvider { | |||
|          */ | ||||
|         int uriType = uriMatcher.match(uri); | ||||
|         SQLiteDatabase sqlDB = dbOpenHelper.getWritableDatabase(); | ||||
|         int rowsUpdated = 0; | ||||
|         int rowsUpdated; | ||||
|         switch (uriType) { | ||||
|             case CONTRIBUTIONS: | ||||
|                 rowsUpdated = sqlDB.update(TABLE_NAME, contentValues, selection, selectionArgs); | ||||
|  | @ -176,7 +169,7 @@ public class ContributionsContentProvider extends ContentProvider { | |||
|                 if (TextUtils.isEmpty(selection)) { | ||||
|                     rowsUpdated = sqlDB.update(TABLE_NAME, | ||||
|                             contentValues, | ||||
|                             Contribution.Table.COLUMN_ID + " = ?", | ||||
|                             ContributionDao.Table.COLUMN_ID + " = ?", | ||||
|                             new String[]{String.valueOf(id)}); | ||||
|                 } else { | ||||
|                     throw new IllegalArgumentException( | ||||
|  |  | |||
|  | @ -11,8 +11,11 @@ import fr.free.nrw.commons.R; | |||
| 
 | ||||
| class ContributionsListAdapter extends CursorAdapter { | ||||
| 
 | ||||
|     public ContributionsListAdapter(Context context, Cursor c, int flags) { | ||||
|     private final ContributionDao contributionDao; | ||||
| 
 | ||||
|     public ContributionsListAdapter(Context context, Cursor c, int flags, ContributionDao contributionDao) { | ||||
|         super(context, c, flags); | ||||
|         this.contributionDao = contributionDao; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|  | @ -26,7 +29,7 @@ class ContributionsListAdapter extends CursorAdapter { | |||
|     @Override | ||||
|     public void bindView(View view, Context context, Cursor cursor) { | ||||
|         final ContributionViewHolder views = (ContributionViewHolder)view.getTag(); | ||||
|         final Contribution contribution = Contribution.fromCursor(cursor); | ||||
|         final Contribution contribution = contributionDao.fromCursor(cursor); | ||||
| 
 | ||||
|         views.imageView.setMedia(contribution); | ||||
|         views.titleView.setText(contribution.getDisplayTitle()); | ||||
|  |  | |||
|  | @ -20,13 +20,15 @@ import android.widget.ListAdapter; | |||
| import android.widget.ProgressBar; | ||||
| import android.widget.TextView; | ||||
| 
 | ||||
| import java.util.Arrays; | ||||
| 
 | ||||
| import javax.inject.Inject; | ||||
| import javax.inject.Named; | ||||
| 
 | ||||
| import butterknife.BindView; | ||||
| import butterknife.ButterKnife; | ||||
| import dagger.android.support.DaggerFragment; | ||||
| import fr.free.nrw.commons.R; | ||||
| import fr.free.nrw.commons.di.CommonsDaggerSupportFragment; | ||||
| import fr.free.nrw.commons.nearby.NearbyActivity; | ||||
| import timber.log.Timber; | ||||
| 
 | ||||
|  | @ -36,7 +38,7 @@ import static android.app.Activity.RESULT_OK; | |||
| import static android.content.pm.PackageManager.PERMISSION_GRANTED; | ||||
| import static android.view.View.GONE; | ||||
| 
 | ||||
| public class ContributionsListFragment extends DaggerFragment { | ||||
| public class ContributionsListFragment extends CommonsDaggerSupportFragment { | ||||
| 
 | ||||
|     @BindView(R.id.contributionsList) | ||||
|     GridView contributionsList; | ||||
|  | @ -45,8 +47,12 @@ public class ContributionsListFragment extends DaggerFragment { | |||
|     @BindView(R.id.loadingContributionsProgressBar) | ||||
|     ProgressBar progressBar; | ||||
| 
 | ||||
|     @Inject @Named("prefs") SharedPreferences prefs; | ||||
|     @Inject @Named("default_preferences") SharedPreferences defaultPrefs; | ||||
|     @Inject | ||||
|     @Named("prefs") | ||||
|     SharedPreferences prefs; | ||||
|     @Inject | ||||
|     @Named("default_preferences") | ||||
|     SharedPreferences defaultPrefs; | ||||
| 
 | ||||
|     private ContributionController controller; | ||||
| 
 | ||||
|  | @ -208,7 +214,7 @@ public class ContributionsListFragment extends DaggerFragment { | |||
|     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, | ||||
|                                            @NonNull int[] grantResults) { | ||||
|         Timber.d("onRequestPermissionsResult: req code = " + " perm = " | ||||
|                 + permissions + " grant =" + grantResults); | ||||
|                 + Arrays.toString(permissions) + " grant =" + Arrays.toString(grantResults)); | ||||
| 
 | ||||
|         switch (requestCode) { | ||||
|             // 1 = Storage allowed when gallery selected | ||||
|  |  | |||
|  | @ -23,14 +23,14 @@ import java.util.TimeZone; | |||
| import javax.inject.Inject; | ||||
| import javax.inject.Named; | ||||
| 
 | ||||
| import fr.free.nrw.commons.CommonsApplication; | ||||
| import fr.free.nrw.commons.Utils; | ||||
| import fr.free.nrw.commons.di.ApplicationlessInjection; | ||||
| import fr.free.nrw.commons.mwapi.LogEventResult; | ||||
| import fr.free.nrw.commons.mwapi.MediaWikiApi; | ||||
| import timber.log.Timber; | ||||
| 
 | ||||
| import static fr.free.nrw.commons.contributions.Contribution.STATE_COMPLETED; | ||||
| import static fr.free.nrw.commons.contributions.Contribution.Table.COLUMN_FILENAME; | ||||
| import static fr.free.nrw.commons.contributions.ContributionDao.Table.COLUMN_FILENAME; | ||||
| import static fr.free.nrw.commons.contributions.ContributionsContentProvider.BASE_URI; | ||||
| 
 | ||||
| @SuppressWarnings("WeakerAccess") | ||||
|  | @ -81,7 +81,11 @@ public class ContributionsSyncAdapter extends AbstractThreadedSyncAdapter { | |||
|     @Override | ||||
|     public void onPerformSync(Account account, Bundle bundle, String authority, | ||||
|                               ContentProviderClient contentProviderClient, SyncResult syncResult) { | ||||
|         ((CommonsApplication) getContext().getApplicationContext()).injector().inject(this); | ||||
|         ApplicationlessInjection | ||||
|                 .getInstance(getContext() | ||||
|                         .getApplicationContext()) | ||||
|                 .getCommonsApplicationComponent() | ||||
|                 .inject(this); | ||||
|         // This code is fraught with possibilities of race conditions, but lalalalala I can't hear you! | ||||
|         String user = account.name; | ||||
|         String lastModified = prefs.getString("lastSyncTimestamp", ""); | ||||
|  | @ -89,6 +93,7 @@ public class ContributionsSyncAdapter extends AbstractThreadedSyncAdapter { | |||
|         LogEventResult result; | ||||
|         Boolean done = false; | ||||
|         String queryContinue = null; | ||||
|         ContributionDao contributionDao = new ContributionDao(() -> contentProviderClient); | ||||
|         while (!done) { | ||||
| 
 | ||||
|             try { | ||||
|  | @ -121,7 +126,7 @@ public class ContributionsSyncAdapter extends AbstractThreadedSyncAdapter { | |||
|                         "", -1, dateUpdated, dateUpdated, user, | ||||
|                         "", ""); | ||||
|                 contrib.setState(STATE_COMPLETED); | ||||
|                 imageValues.add(contrib.toContentValues()); | ||||
|                 imageValues.add(contributionDao.toContentValues(contrib)); | ||||
| 
 | ||||
|                 if (imageValues.size() % COMMIT_THRESHOLD == 0) { | ||||
|                     try { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 neslihanturan
						neslihanturan