diff --git a/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java b/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java index 0fd838cb6..c888660e1 100644 --- a/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java +++ b/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java @@ -9,7 +9,6 @@ import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.database.sqlite.SQLiteDatabase; import android.preference.PreferenceManager; -import android.support.v4.util.LruCache; import com.facebook.drawee.backends.pipeline.Fresco; import com.facebook.stetho.Stetho; @@ -27,7 +26,6 @@ import javax.inject.Inject; import dagger.android.AndroidInjector; import dagger.android.DaggerApplication; import fr.free.nrw.commons.auth.AccountUtil; -import fr.free.nrw.commons.caching.CacheController; import fr.free.nrw.commons.contributions.Contribution; import fr.free.nrw.commons.data.Category; import fr.free.nrw.commons.data.DBOpenHelper; @@ -35,9 +33,7 @@ import fr.free.nrw.commons.di.CommonsApplicationComponent; import fr.free.nrw.commons.di.CommonsApplicationModule; import fr.free.nrw.commons.di.DaggerCommonsApplicationComponent; import fr.free.nrw.commons.modifications.ModifierSequence; -import fr.free.nrw.commons.mwapi.ApacheHttpClientMediaWikiApi; import fr.free.nrw.commons.mwapi.MediaWikiApi; -import fr.free.nrw.commons.nearby.NearbyPlaces; import fr.free.nrw.commons.utils.FileUtils; import timber.log.Timber; @@ -54,6 +50,7 @@ public class CommonsApplication extends DaggerApplication { @Inject MediaWikiApi mediaWikiApi; @Inject AccountUtil accountUtil; + @Inject DBOpenHelper dbOpenHelper; private Account currentAccount = null; // Unlike a savings account... public static final String API_URL = "https://commons.wikimedia.org/w/api.php"; @@ -73,37 +70,8 @@ public class CommonsApplication extends DaggerApplication { public static final String FEEDBACK_EMAIL = "commons-app-android@googlegroups.com"; public static final String FEEDBACK_EMAIL_SUBJECT = "Commons Android App (%s) Feedback"; - private LruCache thumbnailUrlCache = new LruCache<>(1024); - private CacheController cacheData = null; - private DBOpenHelper dbOpenHelper = null; - private NearbyPlaces nearbyPlaces = null; private CommonsApplicationComponent component; - public CacheController getCacheData() { - if (cacheData == null) { - cacheData = new CacheController(); - } - return cacheData; - } - - public LruCache getThumbnailUrlCache() { - return thumbnailUrlCache; - } - - public synchronized DBOpenHelper getDBOpenHelper() { - if (dbOpenHelper == null) { - dbOpenHelper = new DBOpenHelper(this); - } - return dbOpenHelper; - } - - public synchronized NearbyPlaces getNearbyPlaces() { - if (nearbyPlaces == null) { - nearbyPlaces = new NearbyPlaces(); - } - return nearbyPlaces; - } - @Override public void onCreate() { super.onCreate(); @@ -127,9 +95,6 @@ public class CommonsApplication extends DaggerApplication { System.setProperty("in.yuvi.http.fluent.PROGRESS_TRIGGER_THRESHOLD", "3.0"); Fresco.initialize(this); - - //For caching area -> categories - cacheData = new CacheController(); } @Override @@ -150,24 +115,24 @@ public class CommonsApplication extends DaggerApplication { * @return Account|null */ public Account getCurrentAccount() { - if(currentAccount == null) { + if (currentAccount == null) { AccountManager accountManager = AccountManager.get(this); Account[] allAccounts = accountManager.getAccountsByType(accountUtil.accountType()); - if(allAccounts.length != 0) { + if (allAccounts.length != 0) { currentAccount = allAccounts[0]; } } return currentAccount; } - + public Boolean revalidateAuthToken() { AccountManager accountManager = AccountManager.get(this); Account curAccount = getCurrentAccount(); - - if(curAccount == null) { + + if (curAccount == null) { return false; // This should never happen } - + accountManager.invalidateAuthToken(accountUtil.accountType(), mediaWikiApi.getAuthCookie()); try { String authCookie = accountManager.blockingGetAuthToken(curAccount, "", false); @@ -218,7 +183,6 @@ public class CommonsApplication extends DaggerApplication { * Deletes all tables and re-creates them. */ public void updateAllDatabases() { - DBOpenHelper dbOpenHelper = getDBOpenHelper(); dbOpenHelper.getReadableDatabase().close(); SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); diff --git a/app/src/main/java/fr/free/nrw/commons/MediaWikiImageView.java b/app/src/main/java/fr/free/nrw/commons/MediaWikiImageView.java index 5d7a4cc48..836793aff 100644 --- a/app/src/main/java/fr/free/nrw/commons/MediaWikiImageView.java +++ b/app/src/main/java/fr/free/nrw/commons/MediaWikiImageView.java @@ -4,6 +4,7 @@ import android.content.Context; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.graphics.drawable.VectorDrawableCompat; +import android.support.v4.util.LruCache; import android.text.TextUtils; import android.util.AttributeSet; import android.widget.Toast; @@ -19,6 +20,8 @@ import timber.log.Timber; public class MediaWikiImageView extends SimpleDraweeView { @Inject CommonsApplication application; @Inject MediaWikiApi mwApi; + @Inject LruCache thumbnailUrlCache; + private ThumbnailFetchTask currentThumbnailTask; public MediaWikiImageView(Context context) { @@ -44,8 +47,8 @@ public class MediaWikiImageView extends SimpleDraweeView { return; } - if (application.getThumbnailUrlCache().get(media.getFilename()) != null) { - setImageUrl(application.getThumbnailUrlCache().get(media.getFilename())); + if (thumbnailUrlCache.get(media.getFilename()) != null) { + setImageUrl(thumbnailUrlCache.get(media.getFilename())); } else { setImageUrl(null); currentThumbnailTask = new ThumbnailFetchTask(media, mwApi); @@ -91,8 +94,7 @@ public class MediaWikiImageView extends SimpleDraweeView { } else { // only cache meaningful thumbnails received from network. try { - CommonsApplication app = (CommonsApplication) getContext().getApplicationContext(); - app.getThumbnailUrlCache().put(media.getFilename(), result); + thumbnailUrlCache.put(media.getFilename(), result); } catch (NullPointerException npe) { Timber.e("error when adding pic to cache " + npe); diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategoryContentProvider.java b/app/src/main/java/fr/free/nrw/commons/category/CategoryContentProvider.java index 9d493b30c..e4aa4fe1f 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/CategoryContentProvider.java +++ b/app/src/main/java/fr/free/nrw/commons/category/CategoryContentProvider.java @@ -40,13 +40,11 @@ public class CategoryContentProvider extends ContentProvider { } @Inject CommonsApplication application; - - private DBOpenHelper dbOpenHelper; + @Inject DBOpenHelper dbOpenHelper; @Override public boolean onCreate() { AndroidInjection.inject(this); - dbOpenHelper = application.getDBOpenHelper(); return false; } diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsContentProvider.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsContentProvider.java index 59603f898..2ac0ad360 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsContentProvider.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsContentProvider.java @@ -14,6 +14,7 @@ import javax.inject.Inject; import dagger.android.AndroidInjection; import fr.free.nrw.commons.CommonsApplication; +import fr.free.nrw.commons.data.DBOpenHelper; import timber.log.Timber; public class ContributionsContentProvider extends ContentProvider{ @@ -37,6 +38,7 @@ public class ContributionsContentProvider extends ContentProvider{ } @Inject CommonsApplication application; + @Inject DBOpenHelper dbOpenHelper; @Override public boolean onCreate() { @@ -51,7 +53,7 @@ public class ContributionsContentProvider extends ContentProvider{ int uriType = uriMatcher.match(uri); - SQLiteDatabase db = application.getDBOpenHelper().getReadableDatabase(); + SQLiteDatabase db = dbOpenHelper.getReadableDatabase(); Cursor cursor; switch(uriType) { @@ -85,7 +87,7 @@ public class ContributionsContentProvider extends ContentProvider{ @Override public Uri insert(@NonNull Uri uri, ContentValues contentValues) { int uriType = uriMatcher.match(uri); - SQLiteDatabase sqlDB = application.getDBOpenHelper().getWritableDatabase(); + SQLiteDatabase sqlDB = dbOpenHelper.getWritableDatabase(); long id = 0; switch (uriType) { case CONTRIBUTIONS: @@ -103,7 +105,7 @@ public class ContributionsContentProvider extends ContentProvider{ int rows = 0; int uriType = uriMatcher.match(uri); - SQLiteDatabase db = application.getDBOpenHelper().getReadableDatabase(); + SQLiteDatabase db = dbOpenHelper.getReadableDatabase(); switch(uriType) { case CONTRIBUTIONS_ID: @@ -124,7 +126,7 @@ public class ContributionsContentProvider extends ContentProvider{ public int bulkInsert(@NonNull Uri uri, @NonNull ContentValues[] values) { Timber.d("Hello, bulk insert! (ContributionsContentProvider)"); int uriType = uriMatcher.match(uri); - SQLiteDatabase sqlDB = application.getDBOpenHelper().getWritableDatabase(); + SQLiteDatabase sqlDB = dbOpenHelper.getWritableDatabase(); sqlDB.beginTransaction(); switch (uriType) { case CONTRIBUTIONS: @@ -152,7 +154,7 @@ public class ContributionsContentProvider extends ContentProvider{ 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 = application.getDBOpenHelper().getWritableDatabase(); + SQLiteDatabase sqlDB = dbOpenHelper.getWritableDatabase(); int rowsUpdated = 0; switch (uriType) { case CONTRIBUTIONS: 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 9af4e3853..019eec6a9 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 @@ -1,12 +1,17 @@ package fr.free.nrw.commons.di; +import android.support.v4.util.LruCache; + import javax.inject.Singleton; import dagger.Module; import dagger.Provides; import fr.free.nrw.commons.CommonsApplication; +import fr.free.nrw.commons.caching.CacheController; +import fr.free.nrw.commons.data.DBOpenHelper; import fr.free.nrw.commons.mwapi.ApacheHttpClientMediaWikiApi; import fr.free.nrw.commons.mwapi.MediaWikiApi; +import fr.free.nrw.commons.nearby.NearbyPlaces; @Module public class CommonsApplicationModule { @@ -26,4 +31,28 @@ public class CommonsApplicationModule { public MediaWikiApi provideMediaWikiApi() { return new ApacheHttpClientMediaWikiApi(CommonsApplication.API_URL); } + + @Provides + @Singleton + public CacheController provideCacheController() { + return new CacheController(); + } + + @Provides + @Singleton + public DBOpenHelper provideDBOpenHelper(CommonsApplication application) { + return new DBOpenHelper(application); + } + + @Provides + @Singleton + public NearbyPlaces provideNearbyPlaces() { + return new NearbyPlaces(); + } + + @Provides + @Singleton + public LruCache provideLruCache() { + return new LruCache<>(1024); + } } 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 8b8d965e3..d3b0a3283 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 @@ -14,6 +14,7 @@ import javax.inject.Inject; import dagger.android.AndroidInjection; import fr.free.nrw.commons.CommonsApplication; +import fr.free.nrw.commons.data.DBOpenHelper; import timber.log.Timber; public class ModificationsContentProvider extends ContentProvider{ @@ -37,6 +38,7 @@ public class ModificationsContentProvider extends ContentProvider{ } @Inject CommonsApplication application; + @Inject DBOpenHelper dbOpenHelper; @Override public boolean onCreate() { @@ -58,7 +60,7 @@ public class ModificationsContentProvider extends ContentProvider{ throw new IllegalArgumentException("Unknown URI" + uri); } - SQLiteDatabase db = application.getDBOpenHelper().getReadableDatabase(); + SQLiteDatabase db = dbOpenHelper.getReadableDatabase(); Cursor cursor = queryBuilder.query(db, projection, selection, selectionArgs, null, null, sortOrder); cursor.setNotificationUri(getContext().getContentResolver(), uri); @@ -74,7 +76,7 @@ public class ModificationsContentProvider extends ContentProvider{ @Override public Uri insert(@NonNull Uri uri, ContentValues contentValues) { int uriType = uriMatcher.match(uri); - SQLiteDatabase sqlDB = application.getDBOpenHelper().getWritableDatabase(); + SQLiteDatabase sqlDB = dbOpenHelper.getWritableDatabase(); long id = 0; switch (uriType) { case MODIFICATIONS: @@ -90,7 +92,7 @@ public class ModificationsContentProvider extends ContentProvider{ @Override public int delete(@NonNull Uri uri, String s, String[] strings) { int uriType = uriMatcher.match(uri); - SQLiteDatabase sqlDB = application.getDBOpenHelper().getWritableDatabase(); + SQLiteDatabase sqlDB = dbOpenHelper.getWritableDatabase(); switch (uriType) { case MODIFICATIONS_ID: String id = uri.getLastPathSegment(); @@ -108,7 +110,7 @@ public class ModificationsContentProvider extends ContentProvider{ public int bulkInsert(@NonNull Uri uri, @NonNull ContentValues[] values) { Timber.d("Hello, bulk insert! (ModificationsContentProvider)"); int uriType = uriMatcher.match(uri); - SQLiteDatabase sqlDB = application.getDBOpenHelper().getWritableDatabase(); + SQLiteDatabase sqlDB = dbOpenHelper.getWritableDatabase(); sqlDB.beginTransaction(); switch (uriType) { case MODIFICATIONS: @@ -136,7 +138,7 @@ public class ModificationsContentProvider extends ContentProvider{ 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 = application.getDBOpenHelper().getWritableDatabase(); + SQLiteDatabase sqlDB = dbOpenHelper.getWritableDatabase(); int rowsUpdated = 0; switch (uriType) { case MODIFICATIONS: diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java index 7e7d4f719..70bb38476 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java @@ -31,7 +31,6 @@ import javax.inject.Inject; import butterknife.BindView; import butterknife.ButterKnife; -import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.R; import fr.free.nrw.commons.location.LatLng; import fr.free.nrw.commons.location.LocationServiceManager; @@ -43,7 +42,7 @@ public class NearbyActivity extends NavigationBaseActivity { @BindView(R.id.progressBar) ProgressBar progressBar; - @Inject CommonsApplication application; + @Inject NearbyPlaces nearbyPlaces; private boolean isMapViewActive = false; private static final int LOCATION_REQUEST = 1; @@ -94,7 +93,7 @@ public class NearbyActivity extends NavigationBaseActivity { locationManager = new LocationServiceManager(this); locationManager.registerLocationManager(); curLatLang = locationManager.getLatestLocation(); - nearbyAsyncTask = new NearbyAsyncTask(this, new NearbyController(application)); + nearbyAsyncTask = new NearbyAsyncTask(this, new NearbyController(nearbyPlaces)); nearbyAsyncTask.execute(); } @@ -233,7 +232,7 @@ public class NearbyActivity extends NavigationBaseActivity { } private void refreshView() { - nearbyAsyncTask = new NearbyAsyncTask(this, new NearbyController(application)); + nearbyAsyncTask = new NearbyAsyncTask(this, new NearbyController(nearbyPlaces)); nearbyAsyncTask.execute(); } @@ -262,7 +261,7 @@ public class NearbyActivity extends NavigationBaseActivity { @Override protected List doInBackground(Void... params) { - return nearbyController.loadAttractionsFromLocation(curLatLang, application); + return nearbyController.loadAttractionsFromLocation(curLatLang, NearbyActivity.this); } @Override diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyController.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyController.java index 46ad80dad..619db6e0a 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyController.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyController.java @@ -15,7 +15,6 @@ import java.util.List; import java.util.Locale; import java.util.Map; -import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.R; import fr.free.nrw.commons.location.LatLng; import fr.free.nrw.commons.utils.UiUtils; @@ -27,11 +26,10 @@ import static fr.free.nrw.commons.utils.LengthUtils.formatDistanceBetween; public class NearbyController { private static final int MAX_RESULTS = 1000; + private final NearbyPlaces nearbyPlaces; - private final CommonsApplication application; - - public NearbyController(CommonsApplication application) { - this.application = application; + public NearbyController(NearbyPlaces nearbyPlaces) { + this.nearbyPlaces = nearbyPlaces; } /** @@ -45,7 +43,6 @@ public class NearbyController { if (curLatLng == null) { return Collections.emptyList(); } - NearbyPlaces nearbyPlaces = application.getNearbyPlaces(); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); List places = prefs.getBoolean("useWikidata", true) ? nearbyPlaces.getFromWikidataQuery(curLatLng, Locale.getDefault().getLanguage()) 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 0ac51cc8c..15aad438e 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 @@ -37,6 +37,7 @@ import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.R; import fr.free.nrw.commons.Utils; import fr.free.nrw.commons.auth.AuthenticatedActivity; +import fr.free.nrw.commons.caching.CacheController; import fr.free.nrw.commons.category.CategorizationFragment; import fr.free.nrw.commons.category.OnCategoriesSaveHandler; import fr.free.nrw.commons.contributions.Contribution; @@ -68,6 +69,7 @@ public class ShareActivity @Inject CommonsApplication application; @Inject MediaWikiApi mwApi; + @Inject CacheController cacheController; private String source; private String mimeType; @@ -137,7 +139,7 @@ public class ShareActivity if (!cacheFound) { //Has to be called after apiCall.request() - application.getCacheData().cacheCategory(); + cacheController.cacheCategory(); Timber.d("Cache the categories found"); } @@ -482,12 +484,12 @@ public class ShareActivity if (imageObj.imageCoordsExists) { double decLongitude = imageObj.getDecLongitude(); double decLatitude = imageObj.getDecLatitude(); - application.getCacheData().setQtPoint(decLongitude, decLatitude); + cacheController.setQtPoint(decLongitude, decLatitude); } MwVolleyApi apiCall = new MwVolleyApi(application); - List displayCatList = application.getCacheData().findCategory(); + List displayCatList = cacheController.findCategory(); boolean catListEmpty = displayCatList.isEmpty(); // If no categories found in cache, call MediaWiki API to match image coords with nearby Commons categories