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 a251c27ec..0fd838cb6 100644 --- a/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java +++ b/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java @@ -4,9 +4,6 @@ import android.accounts.Account; import android.accounts.AccountManager; import android.accounts.AuthenticatorException; import android.accounts.OperationCanceledException; -import android.app.Activity; -import android.app.Application; -import android.content.ContentProvider; import android.content.Context; import android.content.SharedPreferences; import android.content.pm.PackageManager; @@ -29,9 +26,6 @@ import javax.inject.Inject; import dagger.android.AndroidInjector; import dagger.android.DaggerApplication; -import dagger.android.DispatchingAndroidInjector; -import dagger.android.HasActivityInjector; -import dagger.android.HasContentProviderInjector; import fr.free.nrw.commons.auth.AccountUtil; import fr.free.nrw.commons.caching.CacheController; import fr.free.nrw.commons.contributions.Contribution; @@ -79,20 +73,12 @@ 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 MediaWikiApi api = null; private LruCache thumbnailUrlCache = new LruCache<>(1024); private CacheController cacheData = null; private DBOpenHelper dbOpenHelper = null; private NearbyPlaces nearbyPlaces = null; private CommonsApplicationComponent component; - public MediaWikiApi getMWApi() { - if (api == null) { - api = new ApacheHttpClientMediaWikiApi(API_URL); - } - return api; - } - public CacheController getCacheData() { if (cacheData == null) { cacheData = new CacheController(); 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 46ca80b46..5d7a4cc48 100644 --- a/app/src/main/java/fr/free/nrw/commons/MediaWikiImageView.java +++ b/app/src/main/java/fr/free/nrw/commons/MediaWikiImageView.java @@ -11,10 +11,14 @@ import android.widget.Toast; import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder; import com.facebook.drawee.view.SimpleDraweeView; +import javax.inject.Inject; + import fr.free.nrw.commons.mwapi.MediaWikiApi; import timber.log.Timber; public class MediaWikiImageView extends SimpleDraweeView { + @Inject CommonsApplication application; + @Inject MediaWikiApi mwApi; private ThumbnailFetchTask currentThumbnailTask; public MediaWikiImageView(Context context) { @@ -40,13 +44,11 @@ public class MediaWikiImageView extends SimpleDraweeView { return; } - CommonsApplication app = (CommonsApplication) getContext().getApplicationContext(); - if (app.getThumbnailUrlCache().get(media.getFilename()) != null) { - setImageUrl(app.getThumbnailUrlCache().get(media.getFilename())); + if (application.getThumbnailUrlCache().get(media.getFilename()) != null) { + setImageUrl(application.getThumbnailUrlCache().get(media.getFilename())); } else { setImageUrl(null); - MediaWikiApi mediaWikiApi = app.getMWApi(); - currentThumbnailTask = new ThumbnailFetchTask(media, mediaWikiApi); + currentThumbnailTask = new ThumbnailFetchTask(media, mwApi); currentThumbnailTask.execute(media.getFilename()); } } @@ -60,6 +62,7 @@ public class MediaWikiImageView extends SimpleDraweeView { } private void init() { + ((CommonsApplication) getContext().getApplicationContext()).injector().inject(this); setHierarchy(GenericDraweeHierarchyBuilder .newInstance(getResources()) .setPlaceholderImage(VectorDrawableCompat.create(getResources(), diff --git a/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java b/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java index cd83ca8f7..96367950a 100644 --- a/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java @@ -25,6 +25,7 @@ import fr.free.nrw.commons.WelcomeActivity; import fr.free.nrw.commons.PageTitle; import fr.free.nrw.commons.contributions.ContributionsActivity; +import fr.free.nrw.commons.mwapi.MediaWikiApi; import timber.log.Timber; import static android.view.KeyEvent.KEYCODE_ENTER; @@ -36,6 +37,7 @@ public class LoginActivity extends AccountAuthenticatorActivity { public static final String PARAM_USERNAME = "fr.free.nrw.commons.login.username"; @Inject CommonsApplication application; + @Inject MediaWikiApi mwApi; @Inject AccountUtil accountUtil; private SharedPreferences prefs = null; @@ -145,7 +147,7 @@ public class LoginActivity extends AccountAuthenticatorActivity { canonicializeUsername(usernameEdit.getText().toString()), passwordEdit.getText().toString(), twoFactorEdit.getText().toString(), - accountUtil, application + accountUtil, application, mwApi ); } diff --git a/app/src/main/java/fr/free/nrw/commons/auth/LoginTask.java b/app/src/main/java/fr/free/nrw/commons/auth/LoginTask.java index 49e2f93b8..7c63551eb 100644 --- a/app/src/main/java/fr/free/nrw/commons/auth/LoginTask.java +++ b/app/src/main/java/fr/free/nrw/commons/auth/LoginTask.java @@ -11,6 +11,7 @@ import java.io.IOException; import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.R; import fr.free.nrw.commons.mwapi.EventLog; +import fr.free.nrw.commons.mwapi.MediaWikiApi; import timber.log.Timber; class LoginTask extends AsyncTask { @@ -21,14 +22,16 @@ class LoginTask extends AsyncTask { private String twoFactorCode = ""; private AccountUtil accountUtil; private CommonsApplication app; + private MediaWikiApi mwApi; - public LoginTask(LoginActivity loginActivity, String username, String password, String twoFactorCode, AccountUtil accountUtil, CommonsApplication application) { + public LoginTask(LoginActivity loginActivity, String username, String password, String twoFactorCode, AccountUtil accountUtil, CommonsApplication application, MediaWikiApi mwApi) { this.loginActivity = loginActivity; this.username = username; this.password = password; this.twoFactorCode = twoFactorCode; this.accountUtil = accountUtil; this.app = application; + this.mwApi = mwApi; } @Override @@ -46,9 +49,9 @@ class LoginTask extends AsyncTask { protected String doInBackground(String... params) { try { if (twoFactorCode.isEmpty()) { - return app.getMWApi().login(username, password); + return mwApi.login(username, password); } else { - return app.getMWApi().login(username, password, twoFactorCode); + return mwApi.login(username, password, twoFactorCode); } } catch (IOException e) { // Do something better! @@ -61,7 +64,7 @@ class LoginTask extends AsyncTask { super.onPostExecute(result); Timber.d("Login done!"); - EventLog.schema(CommonsApplication.EVENT_LOGIN_ATTEMPT, app) + EventLog.schema(CommonsApplication.EVENT_LOGIN_ATTEMPT, app, mwApi) .param("username", username) .param("result", result) .log(); diff --git a/app/src/main/java/fr/free/nrw/commons/auth/WikiAccountAuthenticatorService.java b/app/src/main/java/fr/free/nrw/commons/auth/WikiAccountAuthenticatorService.java index 2d1dc20fc..617f974b2 100644 --- a/app/src/main/java/fr/free/nrw/commons/auth/WikiAccountAuthenticatorService.java +++ b/app/src/main/java/fr/free/nrw/commons/auth/WikiAccountAuthenticatorService.java @@ -8,10 +8,11 @@ import android.os.IBinder; import javax.inject.Inject; import fr.free.nrw.commons.CommonsApplication; +import fr.free.nrw.commons.mwapi.MediaWikiApi; public class WikiAccountAuthenticatorService extends Service { - @Inject CommonsApplication application; + @Inject MediaWikiApi mwApi; @Inject AccountUtil accountUtil; private WikiAccountAuthenticator wikiAccountAuthenticator = null; @@ -23,7 +24,7 @@ public class WikiAccountAuthenticatorService extends Service { ((CommonsApplication)getApplication()).injector().inject(this); if (wikiAccountAuthenticator == null) { - wikiAccountAuthenticator = new WikiAccountAuthenticator(this, accountUtil, application.getMWApi()); + wikiAccountAuthenticator = new WikiAccountAuthenticator(this, accountUtil, mwApi); } return wikiAccountAuthenticator.getIBinder(); } diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java b/app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java index e87195f22..726c18dfd 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java @@ -38,6 +38,7 @@ import dagger.android.support.DaggerFragment; import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.R; import fr.free.nrw.commons.data.Category; +import fr.free.nrw.commons.mwapi.MediaWikiApi; import fr.free.nrw.commons.upload.MwVolleyApi; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -66,7 +67,7 @@ public class CategorizationFragment extends DaggerFragment { @BindView(R.id.categoriesExplanation) TextView categoriesSkip; - @Inject CommonsApplication application; + @Inject MediaWikiApi mwApi; private RVRendererAdapter categoriesAdapter; private OnCategoriesSaveHandler onCategoriesSaveHandler; @@ -253,7 +254,7 @@ public class CategorizationFragment extends DaggerFragment { SharedPreferences titleDesc = PreferenceManager.getDefaultSharedPreferences(getActivity()); String title = titleDesc.getString("Title", ""); - return application.getMWApi() + return mwApi .searchTitles(title, SEARCH_CATS_LIMIT) .map(name -> new CategoryItem(name, false)); } @@ -276,7 +277,7 @@ public class CategorizationFragment extends DaggerFragment { } //otherwise, search API for matching categories - return application.getMWApi() + return mwApi .allCategories(term, SEARCH_CATS_LIMIT) .map(name -> new CategoryItem(name, false)); } @@ -287,7 +288,7 @@ public class CategorizationFragment extends DaggerFragment { return Observable.empty(); } - return application.getMWApi() + return mwApi .searchCategories(term, SEARCH_CATS_LIMIT) .map(s -> new CategoryItem(s, false)); } diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsSyncAdapter.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsSyncAdapter.java index e9e20c9f2..c354a995c 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsSyncAdapter.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsSyncAdapter.java @@ -28,7 +28,7 @@ import timber.log.Timber; public class ContributionsSyncAdapter extends AbstractThreadedSyncAdapter { private static int COMMIT_THRESHOLD = 10; - @Inject CommonsApplication application; + @Inject MediaWikiApi mwApi; public ContributionsSyncAdapter(Context context, boolean autoInitialize) { super(context, autoInitialize); @@ -41,22 +41,23 @@ public class ContributionsSyncAdapter extends AbstractThreadedSyncAdapter { return limit; // FIXME: Parameterize! } - private static final String[] existsQuery = { Contribution.Table.COLUMN_FILENAME }; + 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 { cursor = client.query(ContributionsContentProvider.BASE_URI, existsQuery, existsSelection, - new String[] { filename }, + new String[]{filename}, "" ); return cursor.getCount() != 0; } catch (RemoteException e) { throw new RuntimeException(e); } finally { - if ( cursor != null ) { + if (cursor != null) { cursor.close(); } } @@ -64,21 +65,20 @@ public class ContributionsSyncAdapter extends AbstractThreadedSyncAdapter { @Override public void onPerformSync(Account account, Bundle bundle, String s, ContentProviderClient contentProviderClient, SyncResult syncResult) { - ((CommonsApplication)getContext().getApplicationContext()).injector().inject(this); + ((CommonsApplication) getContext().getApplicationContext()).injector().inject(this); // This code is fraught with possibilities of race conditions, but lalalalala I can't hear you! String user = account.name; - MediaWikiApi api = application.getMWApi(); SharedPreferences prefs = getContext().getSharedPreferences("prefs", Context.MODE_PRIVATE); String lastModified = prefs.getString("lastSyncTimestamp", ""); Date curTime = new Date(); LogEventResult result; Boolean done = false; String queryContinue = null; - while(!done) { + while (!done) { try { - result = api.logEvents(user, lastModified, queryContinue, getLimit()); + result = mwApi.logEvents(user, lastModified, queryContinue, getLimit()); } catch (IOException e) { // There isn't really much we can do, eh? // FIXME: Perhaps add EventLogging? @@ -97,7 +97,7 @@ public class ContributionsSyncAdapter extends AbstractThreadedSyncAdapter { continue; } String filename = image.getFilename(); - if(fileExists(contentProviderClient, filename)) { + if (fileExists(contentProviderClient, filename)) { Timber.d("Skipping %s", filename); continue; } @@ -107,7 +107,7 @@ public class ContributionsSyncAdapter extends AbstractThreadedSyncAdapter { contrib.setState(Contribution.STATE_COMPLETED); imageValues.add(contrib.toContentValues()); - if(imageValues.size() % COMMIT_THRESHOLD == 0) { + if (imageValues.size() % COMMIT_THRESHOLD == 0) { try { contentProviderClient.bulkInsert(ContributionsContentProvider.BASE_URI, imageValues.toArray(new ContentValues[]{})); } catch (RemoteException e) { @@ -117,7 +117,7 @@ public class ContributionsSyncAdapter extends AbstractThreadedSyncAdapter { } } - if(imageValues.size() != 0) { + if (imageValues.size() != 0) { try { contentProviderClient.bulkInsert(ContributionsContentProvider.BASE_URI, imageValues.toArray(new ContentValues[]{})); } catch (RemoteException e) { @@ -126,7 +126,7 @@ public class ContributionsSyncAdapter extends AbstractThreadedSyncAdapter { } queryContinue = result.getQueryContinue(); - if(TextUtils.isEmpty(queryContinue)) { + if (TextUtils.isEmpty(queryContinue)) { done = true; } } diff --git a/app/src/main/java/fr/free/nrw/commons/di/CommonsApplicationComponent.java b/app/src/main/java/fr/free/nrw/commons/di/CommonsApplicationComponent.java index 8ea0a86d0..ede3d6a20 100644 --- a/app/src/main/java/fr/free/nrw/commons/di/CommonsApplicationComponent.java +++ b/app/src/main/java/fr/free/nrw/commons/di/CommonsApplicationComponent.java @@ -7,6 +7,7 @@ import dagger.android.AndroidInjectionModule; import dagger.android.AndroidInjector; import dagger.android.support.AndroidSupportInjectionModule; import fr.free.nrw.commons.CommonsApplication; +import fr.free.nrw.commons.MediaWikiImageView; import fr.free.nrw.commons.auth.WikiAccountAuthenticatorService; import fr.free.nrw.commons.contributions.ContributionsSyncAdapter; import fr.free.nrw.commons.modifications.ModificationsSyncAdapter; @@ -31,6 +32,8 @@ public interface CommonsApplicationComponent extends AndroidInjector photosList = null; @@ -181,7 +182,7 @@ public class MultipleShareActivity // 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(application.getCurrentAccount(), ModificationsContentProvider.AUTHORITY, true); // Enable sync by default! - EventLog.schema(CommonsApplication.EVENT_CATEGORIZATION_ATTEMPT, application) + EventLog.schema(CommonsApplication.EVENT_CATEGORIZATION_ATTEMPT, application, mwApi) .param("username", application.getCurrentAccount().name) .param("categories-count", categories.size()) .param("files-count", photosList.size()) @@ -248,7 +249,7 @@ public class MultipleShareActivity @Override protected void onAuthCookieAcquired(String authCookie) { - application.getMWApi().setAuthCookie(authCookie); + mwApi.setAuthCookie(authCookie); Intent intent = getIntent(); if(intent.getAction().equals(Intent.ACTION_SEND_MULTIPLE)) { @@ -291,7 +292,7 @@ public class MultipleShareActivity public void onBackPressed() { super.onBackPressed(); if(categorizationFragment != null && categorizationFragment.isVisible()) { - EventLog.schema(CommonsApplication.EVENT_CATEGORIZATION_ATTEMPT, application) + EventLog.schema(CommonsApplication.EVENT_CATEGORIZATION_ATTEMPT, application, mwApi) .param("username", application.getCurrentAccount().name) .param("categories-count", categorizationFragment.getCurrentSelectedCount()) .param("files-count", photosList.size()) @@ -299,7 +300,7 @@ public class MultipleShareActivity .param("result", "cancelled") .log(); } else { - EventLog.schema(CommonsApplication.EVENT_UPLOAD_ATTEMPT, application) + EventLog.schema(CommonsApplication.EVENT_UPLOAD_ATTEMPT, application, mwApi) .param("username", application.getCurrentAccount().name) .param("source", getIntent().getStringExtra(UploadService.EXTRA_SOURCE)) .param("multiple", true) 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 3043e506d..0ac51cc8c 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 @@ -45,6 +45,7 @@ import fr.free.nrw.commons.modifications.ModificationsContentProvider; import fr.free.nrw.commons.modifications.ModifierSequence; import fr.free.nrw.commons.modifications.TemplateRemoveModifier; import fr.free.nrw.commons.mwapi.EventLog; +import fr.free.nrw.commons.mwapi.MediaWikiApi; import timber.log.Timber; import static fr.free.nrw.commons.upload.ExistingFileAsync.Result.DUPLICATE_PROCEED; @@ -66,6 +67,7 @@ public class ShareActivity private CategorizationFragment categorizationFragment; @Inject CommonsApplication application; + @Inject MediaWikiApi mwApi; private String source; private String mimeType; @@ -169,7 +171,7 @@ public class ShareActivity // 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(application.getCurrentAccount(), ModificationsContentProvider.AUTHORITY, true); // Enable sync by default! - EventLog.schema(CommonsApplication.EVENT_CATEGORIZATION_ATTEMPT, application) + EventLog.schema(CommonsApplication.EVENT_CATEGORIZATION_ATTEMPT, application, mwApi) .param("username", application.getCurrentAccount().name) .param("categories-count", categories.size()) .param("files-count", 1) @@ -191,7 +193,7 @@ public class ShareActivity public void onBackPressed() { super.onBackPressed(); if(categorizationFragment != null && categorizationFragment.isVisible()) { - EventLog.schema(CommonsApplication.EVENT_CATEGORIZATION_ATTEMPT, application) + EventLog.schema(CommonsApplication.EVENT_CATEGORIZATION_ATTEMPT, application, mwApi) .param("username", application.getCurrentAccount().name) .param("categories-count", categorizationFragment.getCurrentSelectedCount()) .param("files-count", 1) @@ -199,7 +201,7 @@ public class ShareActivity .param("result", "cancelled") .log(); } else { - EventLog.schema(CommonsApplication.EVENT_UPLOAD_ATTEMPT, application) + EventLog.schema(CommonsApplication.EVENT_UPLOAD_ATTEMPT, application, mwApi) .param("username", application.getCurrentAccount().name) .param("source", getIntent().getStringExtra(UploadService.EXTRA_SOURCE)) .param("multiple", true) @@ -210,8 +212,7 @@ public class ShareActivity @Override protected void onAuthCookieAcquired(String authCookie) { - application.getMWApi().setAuthCookie(authCookie); - + mwApi.setAuthCookie(authCookie); } @Override @@ -385,7 +386,7 @@ public class ShareActivity Timber.d("%s duplicate check: %s", mediaUri.toString(), result); duplicateCheckPassed = (result == DUPLICATE_PROCEED || result == NO_DUPLICATE); - }, application.getMWApi()); + }, mwApi); fileAsyncTask.execute(); } catch (IOException e) { Timber.d(e, "IO Exception: "); 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 fb1535dce..6b099f32c 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 @@ -48,6 +48,7 @@ public class UploadService extends HandlerService { public static final String EXTRA_CAMPAIGN = EXTRA_PREFIX + ".campaign"; @Inject CommonsApplication application; + @Inject MediaWikiApi mwApi; private NotificationManager notificationManager; private ContentProviderClient contributionsProviderClient; @@ -182,8 +183,6 @@ public class UploadService extends HandlerService { @SuppressLint("StringFormatInvalid") private void uploadContribution(Contribution contribution) { - MediaWikiApi api = application.getMWApi(); - InputStream file = null; String notificationTag = contribution.getLocalUri().toString(); @@ -222,7 +221,7 @@ public class UploadService extends HandlerService { filename = findUniqueFilename(filename); unfinishedUploads.add(filename); } - if (!api.validateLogin()) { + if (!mwApi.validateLogin()) { // Need to revalidate! if (application.revalidateAuthToken()) { Timber.d("Successfully revalidated token!"); @@ -240,7 +239,7 @@ public class UploadService extends HandlerService { getString(R.string.upload_progress_notification_title_finishing, contribution.getDisplayTitle()), contribution ); - UploadResult uploadResult = api.uploadFile(filename, file, contribution.getDataLength(), contribution.getPageContents(), contribution.getEditSummary(), notificationUpdater); + UploadResult uploadResult = mwApi.uploadFile(filename, file, contribution.getDataLength(), contribution.getPageContents(), contribution.getEditSummary(), notificationUpdater); Timber.d("Response is %s", uploadResult.toString()); @@ -249,7 +248,7 @@ public class UploadService extends HandlerService { String resultStatus = uploadResult.getResultStatus(); if (!resultStatus.equals("Success")) { showFailedNotification(contribution); - EventLog.schema(CommonsApplication.EVENT_UPLOAD_ATTEMPT, application) + EventLog.schema(CommonsApplication.EVENT_UPLOAD_ATTEMPT, application, mwApi) .param("username", application.getCurrentAccount().name) .param("source", contribution.getSource()) .param("multiple", contribution.getMultiple()) @@ -263,7 +262,7 @@ public class UploadService extends HandlerService { contribution.setDateUploaded(uploadResult.getDateUploaded()); contribution.save(); - EventLog.schema(CommonsApplication.EVENT_UPLOAD_ATTEMPT, application) + EventLog.schema(CommonsApplication.EVENT_UPLOAD_ATTEMPT, application, mwApi) .param("username", application.getCurrentAccount().name) .param("source", contribution.getSource()) //FIXME .param("filename", contribution.getFilename()) @@ -304,7 +303,6 @@ public class UploadService extends HandlerService { } private String findUniqueFilename(String fileName) throws IOException { - MediaWikiApi api = application.getMWApi(); String sequenceFileName; for (int sequenceNumber = 1; true; sequenceNumber++) { if (sequenceNumber == 1) { @@ -320,7 +318,7 @@ public class UploadService extends HandlerService { sequenceFileName = regexMatcher.replaceAll("$1 " + sequenceNumber + "$2"); } } - if (!api.fileExistsWithName(sequenceFileName) + if (!mwApi.fileExistsWithName(sequenceFileName) && !unfinishedUploads.contains(sequenceFileName)) { break; }