From 874627e3f5944e857992f7436856b474a7e927ec Mon Sep 17 00:00:00 2001 From: Paul Hawke Date: Fri, 5 Jan 2018 13:01:20 -0600 Subject: [PATCH] Injected the ModifierSequenceDao where needed. --- .../fr/free/nrw/commons/auth/AccountUtil.java | 4 +-- .../commons/di/CommonsApplicationModule.java | 7 ++++++ .../ModificationsContentProvider.java | 8 +++--- .../ModificationsSyncAdapter.java | 6 ++--- .../modifications/ModifierSequenceDao.java | 25 +++++++++++++------ .../commons/upload/MultipleShareActivity.java | 7 +++--- .../nrw/commons/upload/ShareActivity.java | 6 ++--- .../nrw/commons/upload/UploadService.java | 2 +- .../ModifierSequenceDaoTest.java | 16 ++++++------ 9 files changed, 49 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/auth/AccountUtil.java b/app/src/main/java/fr/free/nrw/commons/auth/AccountUtil.java index fa132130c..a020c1fb7 100644 --- a/app/src/main/java/fr/free/nrw/commons/auth/AccountUtil.java +++ b/app/src/main/java/fr/free/nrw/commons/auth/AccountUtil.java @@ -14,7 +14,7 @@ import static android.accounts.AccountManager.ERROR_CODE_REMOTE_EXCEPTION; import static android.accounts.AccountManager.KEY_ACCOUNT_NAME; import static android.accounts.AccountManager.KEY_ACCOUNT_TYPE; import static fr.free.nrw.commons.contributions.ContributionsContentProvider.CONTRIBUTION_AUTHORITY; -import static fr.free.nrw.commons.modifications.ModificationsContentProvider.AUTHORITY; +import static fr.free.nrw.commons.modifications.ModificationsContentProvider.MODIFICATIONS_AUTHORITY; public class AccountUtil { @@ -52,7 +52,7 @@ public class AccountUtil { // FIXME: If the user turns it off, it shouldn't be auto turned back on ContentResolver.setSyncAutomatically(account, CONTRIBUTION_AUTHORITY, true); // Enable sync by default! - ContentResolver.setSyncAutomatically(account, AUTHORITY, true); // Enable sync by default! + ContentResolver.setSyncAutomatically(account, MODIFICATIONS_AUTHORITY, true); // Enable sync by default! } private AccountManager accountManager() { diff --git a/app/src/main/java/fr/free/nrw/commons/di/CommonsApplicationModule.java b/app/src/main/java/fr/free/nrw/commons/di/CommonsApplicationModule.java index 7231bf28f..913eef57e 100644 --- a/app/src/main/java/fr/free/nrw/commons/di/CommonsApplicationModule.java +++ b/app/src/main/java/fr/free/nrw/commons/di/CommonsApplicationModule.java @@ -24,6 +24,7 @@ import fr.free.nrw.commons.upload.UploadController; import static android.content.Context.MODE_PRIVATE; import static fr.free.nrw.commons.contributions.ContributionsContentProvider.CONTRIBUTION_AUTHORITY; +import static fr.free.nrw.commons.modifications.ModificationsContentProvider.MODIFICATIONS_AUTHORITY; @Module @SuppressWarnings({"WeakerAccess", "unused"}) @@ -53,6 +54,12 @@ public class CommonsApplicationModule { return application.getContentResolver().acquireContentProviderClient(CONTRIBUTION_AUTHORITY); } + @Provides + @Named("modification") + public ContentProviderClient provideModificationContentProviderClient() { + return application.getContentResolver().acquireContentProviderClient(MODIFICATIONS_AUTHORITY); + } + @Provides @Named("application_preferences") public SharedPreferences providesApplicationSharedPreferences() { diff --git a/app/src/main/java/fr/free/nrw/commons/modifications/ModificationsContentProvider.java b/app/src/main/java/fr/free/nrw/commons/modifications/ModificationsContentProvider.java index e1877e79c..3f2c01930 100644 --- a/app/src/main/java/fr/free/nrw/commons/modifications/ModificationsContentProvider.java +++ b/app/src/main/java/fr/free/nrw/commons/modifications/ModificationsContentProvider.java @@ -23,15 +23,15 @@ public class ModificationsContentProvider extends ContentProvider { private static final int MODIFICATIONS = 1; private static final int MODIFICATIONS_ID = 2; - public static final String AUTHORITY = "fr.free.nrw.commons.modifications.contentprovider"; + public static final String MODIFICATIONS_AUTHORITY = "fr.free.nrw.commons.modifications.contentprovider"; public static final String BASE_PATH = "modifications"; - public static final Uri BASE_URI = Uri.parse("content://" + AUTHORITY + "/" + BASE_PATH); + public static final Uri BASE_URI = Uri.parse("content://" + MODIFICATIONS_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); + uriMatcher.addURI(MODIFICATIONS_AUTHORITY, BASE_PATH, MODIFICATIONS); + uriMatcher.addURI(MODIFICATIONS_AUTHORITY, BASE_PATH + "/#", MODIFICATIONS_ID); } public static Uri uriForId(int id) { diff --git a/app/src/main/java/fr/free/nrw/commons/modifications/ModificationsSyncAdapter.java b/app/src/main/java/fr/free/nrw/commons/modifications/ModificationsSyncAdapter.java index 7f6438d82..f81c273d2 100644 --- a/app/src/main/java/fr/free/nrw/commons/modifications/ModificationsSyncAdapter.java +++ b/app/src/main/java/fr/free/nrw/commons/modifications/ModificationsSyncAdapter.java @@ -27,6 +27,7 @@ public class ModificationsSyncAdapter extends AbstractThreadedSyncAdapter { @Inject MediaWikiApi mwApi; @Inject ContributionDao contributionDao; + @Inject ModifierSequenceDao modifierSequenceDao; public ModificationsSyncAdapter(Context context, boolean autoInitialize) { super(context, autoInitialize); @@ -84,8 +85,7 @@ public class ModificationsSyncAdapter extends AbstractThreadedSyncAdapter { contributionsClient = getContext().getContentResolver().acquireContentProviderClient(ContributionsContentProvider.CONTRIBUTION_AUTHORITY); while (!allModifications.isAfterLast()) { - ModifierSequence sequence = ModifierSequenceDao.fromCursor(allModifications); - ModifierSequenceDao dao = new ModifierSequenceDao(contributionsClient); + ModifierSequence sequence = modifierSequenceDao.fromCursor(allModifications); Contribution contrib; Cursor contributionCursor; @@ -123,7 +123,7 @@ public class ModificationsSyncAdapter extends AbstractThreadedSyncAdapter { // FIXME: Log this somewhere else Timber.d("Non success result! %s", editResult); } else { - dao.delete(sequence); + modifierSequenceDao.delete(sequence); } } allModifications.moveToNext(); diff --git a/app/src/main/java/fr/free/nrw/commons/modifications/ModifierSequenceDao.java b/app/src/main/java/fr/free/nrw/commons/modifications/ModifierSequenceDao.java index c98081c72..d6abbe276 100644 --- a/app/src/main/java/fr/free/nrw/commons/modifications/ModifierSequenceDao.java +++ b/app/src/main/java/fr/free/nrw/commons/modifications/ModifierSequenceDao.java @@ -11,15 +11,20 @@ import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Provider; + public class ModifierSequenceDao { - private final ContentProviderClient client; + private final Provider clientProvider; - public ModifierSequenceDao(ContentProviderClient client) { - this.client = client; + @Inject + public ModifierSequenceDao(@Named("modification") Provider clientProvider) { + this.clientProvider = clientProvider; } - public static ModifierSequence fromCursor(Cursor cursor) { + public ModifierSequence fromCursor(Cursor cursor) { // Hardcoding column positions! ModifierSequence ms = null; try { @@ -34,22 +39,28 @@ public class ModifierSequenceDao { } public void save(ModifierSequence sequence) { + ContentProviderClient db = clientProvider.get(); try { if (sequence.getContentUri() == null) { - sequence.setContentUri(client.insert(ModificationsContentProvider.BASE_URI, toContentValues(sequence))); + sequence.setContentUri(db.insert(ModificationsContentProvider.BASE_URI, toContentValues(sequence))); } else { - client.update(sequence.getContentUri(), toContentValues(sequence), null, null); + db.update(sequence.getContentUri(), toContentValues(sequence), null, null); } } catch (RemoteException e) { throw new RuntimeException(e); + } finally { + db.release(); } } public void delete(ModifierSequence sequence) { + ContentProviderClient db = clientProvider.get(); try { - client.delete(sequence.getContentUri(), null, null); + db.delete(sequence.getContentUri(), null, null); } catch (RemoteException e) { throw new RuntimeException(e); + } finally { + db.release(); } } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/MultipleShareActivity.java b/app/src/main/java/fr/free/nrw/commons/upload/MultipleShareActivity.java index 15acdcd4a..a41938cf7 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/MultipleShareActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/MultipleShareActivity.java @@ -2,7 +2,6 @@ package fr.free.nrw.commons.upload; import android.Manifest; import android.app.ProgressDialog; -import android.content.ContentProviderClient; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; @@ -55,6 +54,7 @@ public class MultipleShareActivity extends AuthenticatedActivity @Inject MediaWikiApi mwApi; @Inject SessionManager sessionManager; @Inject UploadController uploadController; + @Inject ModifierSequenceDao modifierSequenceDao; @Inject @Named("default_preferences") SharedPreferences prefs; private ArrayList photosList = null; @@ -166,19 +166,18 @@ public class MultipleShareActivity extends AuthenticatedActivity @Override public void onCategoriesSave(List categories) { if (categories.size() > 0) { - ModifierSequenceDao dao = new ModifierSequenceDao(getContentResolver().acquireContentProviderClient(ModificationsContentProvider.AUTHORITY)); for (Contribution contribution : photosList) { ModifierSequence categoriesSequence = new ModifierSequence(contribution.getContentUri()); categoriesSequence.queueModifier(new CategoryModifier(categories.toArray(new String[]{}))); categoriesSequence.queueModifier(new TemplateRemoveModifier("Uncategorized")); - dao.save(categoriesSequence); + modifierSequenceDao.save(categoriesSequence); } } // FIXME: Make sure that the content provider is up // This is the wrong place for it, but bleh - better than not having it turned on by default for people who don't go throughl ogin - ContentResolver.setSyncAutomatically(sessionManager.getCurrentAccount(), ModificationsContentProvider.AUTHORITY, true); // Enable sync by default! + ContentResolver.setSyncAutomatically(sessionManager.getCurrentAccount(), ModificationsContentProvider.MODIFICATIONS_AUTHORITY, true); // Enable sync by default! finish(); } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java b/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java index 0992cbb31..2f0a4977e 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java @@ -76,6 +76,7 @@ public class ShareActivity @Inject CacheController cacheController; @Inject SessionManager sessionManager; @Inject UploadController uploadController; + @Inject ModifierSequenceDao modifierSequenceDao; @Inject @Named("default_preferences") SharedPreferences prefs; private String source; @@ -166,13 +167,12 @@ public class ShareActivity categoriesSequence.queueModifier(new CategoryModifier(categories.toArray(new String[]{}))); categoriesSequence.queueModifier(new TemplateRemoveModifier("Uncategorized")); - ModifierSequenceDao dao = new ModifierSequenceDao(getContentResolver().acquireContentProviderClient(ModificationsContentProvider.AUTHORITY)); - dao.save(categoriesSequence); + modifierSequenceDao.save(categoriesSequence); } // FIXME: Make sure that the content provider is up // This is the wrong place for it, but bleh - better than not having it turned on by default for people who don't go throughl ogin - ContentResolver.setSyncAutomatically(sessionManager.getCurrentAccount(), ModificationsContentProvider.AUTHORITY, true); // Enable sync by default! + ContentResolver.setSyncAutomatically(sessionManager.getCurrentAccount(), ModificationsContentProvider.MODIFICATIONS_AUTHORITY, true); // Enable sync by default! finish(); } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadService.java b/app/src/main/java/fr/free/nrw/commons/upload/UploadService.java index 1e49680e2..98f6d4889 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadService.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadService.java @@ -273,7 +273,7 @@ public class UploadService extends HandlerService { toUpload--; if (toUpload == 0) { // Sync modifications right after all uplaods are processed - ContentResolver.requestSync(sessionManager.getCurrentAccount(), ModificationsContentProvider.AUTHORITY, new Bundle()); + ContentResolver.requestSync(sessionManager.getCurrentAccount(), ModificationsContentProvider.MODIFICATIONS_AUTHORITY, new Bundle()); stopForeground(true); } } diff --git a/app/src/test/java/fr/free/nrw/commons/modifications/ModifierSequenceDaoTest.java b/app/src/test/java/fr/free/nrw/commons/modifications/ModifierSequenceDaoTest.java index 888c758ff..ef290500d 100644 --- a/app/src/test/java/fr/free/nrw/commons/modifications/ModifierSequenceDaoTest.java +++ b/app/src/test/java/fr/free/nrw/commons/modifications/ModifierSequenceDaoTest.java @@ -52,14 +52,14 @@ public class ModifierSequenceDaoTest { @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - testObject = new ModifierSequenceDao(client); + testObject = new ModifierSequenceDao(() -> client); } @Test public void createFromCursorWithEmptyModifiers() { MatrixCursor cursor = createCursor(""); - ModifierSequence seq = ModifierSequenceDao.fromCursor(cursor); + ModifierSequence seq = testObject.fromCursor(cursor); assertEquals(EXPECTED_MEDIA_URI, seq.getMediaUri().toString()); assertEquals(BASE_URI.buildUpon().appendPath("1").toString(), seq.getContentUri().toString()); @@ -70,7 +70,7 @@ public class ModifierSequenceDaoTest { public void createFromCursorWtihCategoryModifier() { MatrixCursor cursor = createCursor("{\"name\": \"CategoriesModifier\", \"data\": {}}"); - ModifierSequence seq = ModifierSequenceDao.fromCursor(cursor); + ModifierSequence seq = testObject.fromCursor(cursor); assertEquals(1, seq.getModifiers().size()); assertTrue(seq.getModifiers().get(0) instanceof CategoryModifier); @@ -80,7 +80,7 @@ public class ModifierSequenceDaoTest { public void createFromCursorWithRemoveModifier() { MatrixCursor cursor = createCursor("{\"name\": \"TemplateRemoverModifier\", \"data\": {}}"); - ModifierSequence seq = ModifierSequenceDao.fromCursor(cursor); + ModifierSequence seq = testObject.fromCursor(cursor); assertEquals(1, seq.getModifiers().size()); assertTrue(seq.getModifiers().get(0) instanceof TemplateRemoveModifier); @@ -89,7 +89,7 @@ public class ModifierSequenceDaoTest { @Test public void deleteSequence() throws Exception { when(client.delete(isA(Uri.class), isNull(String.class), isNull(String[].class))).thenReturn(1); - ModifierSequence seq = ModifierSequenceDao.fromCursor(createCursor("")); + ModifierSequence seq = testObject.fromCursor(createCursor("")); testObject.delete(seq); @@ -99,7 +99,7 @@ public class ModifierSequenceDaoTest { @Test(expected = RuntimeException.class) public void deleteTranslatesRemoteExceptions() throws Exception { when(client.delete(isA(Uri.class), isNull(String.class), isNull(String[].class))).thenThrow(new RemoteException("")); - ModifierSequence seq = ModifierSequenceDao.fromCursor(createCursor("")); + ModifierSequence seq = testObject.fromCursor(createCursor("")); testObject.delete(seq); } @@ -110,9 +110,9 @@ public class ModifierSequenceDaoTest { String expectedData = "{\"modifiers\":[" + modifierJson + "]}"; MatrixCursor cursor = createCursor(modifierJson); - testObject.save(ModifierSequenceDao.fromCursor(cursor)); + testObject.save(testObject.fromCursor(cursor)); - verify(client).update(eq(ModifierSequenceDao.fromCursor(cursor).getContentUri()), contentValuesCaptor.capture(), isNull(String.class), isNull(String[].class)); + verify(client).update(eq(testObject.fromCursor(cursor).getContentUri()), contentValuesCaptor.capture(), isNull(String.class), isNull(String[].class)); ContentValues cv = contentValuesCaptor.getValue(); assertEquals(2, cv.size()); assertEquals(EXPECTED_MEDIA_URI, cv.get(ModifierSequenceDao.Table.COLUMN_MEDIA_URI));