Skip to content

Commit 6fa8cc6

Browse files
authored
Increase chunk size to 1MB (commons-app#4011)
* Increase chunk size to 1MB * Increase timeouts * Add logs * Enable HTTP logging * Encode file name * Update chunk size * Add toast
1 parent 71d200e commit 6fa8cc6

File tree

8 files changed

+51
-22
lines changed

8 files changed

+51
-22
lines changed

app/src/main/java/fr/free/nrw/commons/OkHttpConnectionFactory.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@ private static OkHttpClient createClient() {
3737
return new OkHttpClient.Builder()
3838
.cookieJar(SharedPreferenceCookieManager.getInstance())
3939
.cache(NET_CACHE)
40-
.connectTimeout(60, TimeUnit.SECONDS)
41-
.writeTimeout(60, TimeUnit.SECONDS)
42-
.readTimeout(60, TimeUnit.SECONDS)
40+
.connectTimeout(120, TimeUnit.SECONDS)
41+
.writeTimeout(120, TimeUnit.SECONDS)
42+
.readTimeout(120, TimeUnit.SECONDS)
4343
.addInterceptor(getLoggingInterceptor())
4444
.addInterceptor(new UnsuccessfulResponseInterceptor())
4545
.addInterceptor(new CommonHeaderRequestInterceptor())

app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.java

+13-4
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import fr.free.nrw.commons.R;
1919
import fr.free.nrw.commons.contributions.ContributionsListAdapter.Callback;
2020
import fr.free.nrw.commons.media.MediaClient;
21+
import fr.free.nrw.commons.utils.ViewUtil;
2122
import io.reactivex.android.schedulers.AndroidSchedulers;
2223
import io.reactivex.disposables.CompositeDisposable;
2324
import io.reactivex.schedulers.Schedulers;
@@ -224,14 +225,22 @@ public void wikipediaButtonClicked() {
224225
@OnClick(R.id.pauseResumeButton)
225226
public void onPauseResumeButtonClicked() {
226227
if (pauseResumeButton.getTag().toString().equals("pause")) {
227-
callback.pauseUpload(contribution);
228-
setResume();
228+
pause();
229229
} else {
230-
callback.resumeUpload(contribution);
231-
setPaused();
230+
resume();
232231
}
233232
}
234233

234+
private void resume() {
235+
callback.resumeUpload(contribution);
236+
setPaused();
237+
}
238+
239+
private void pause() {
240+
callback.pauseUpload(contribution);
241+
setResume();
242+
}
243+
235244
/**
236245
* Update pause/resume button to show pause state
237246
*/

app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java

+3
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
3333
import fr.free.nrw.commons.utils.DialogUtil;
3434
import fr.free.nrw.commons.media.MediaClient;
35+
import fr.free.nrw.commons.utils.ViewUtil;
3536
import java.util.Locale;
3637
import javax.inject.Inject;
3738
import javax.inject.Named;
@@ -283,6 +284,7 @@ public void addImageToWikipedia(Contribution contribution) {
283284
*/
284285
@Override
285286
public void pauseUpload(Contribution contribution) {
287+
ViewUtil.showShortToast(getContext(), R.string.pausing_upload);
286288
callback.pauseUpload(contribution);
287289
}
288290

@@ -292,6 +294,7 @@ public void pauseUpload(Contribution contribution) {
292294
*/
293295
@Override
294296
public void resumeUpload(Contribution contribution) {
297+
ViewUtil.showShortToast(getContext(), R.string.resuming_upload);
295298
callback.retryUpload(contribution);
296299
}
297300

app/src/main/java/fr/free/nrw/commons/di/NetworkingModule.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,10 @@ public OkHttpClient provideOkHttpClient(Context context,
6363
HttpLoggingInterceptor httpLoggingInterceptor) {
6464
File dir = new File(context.getCacheDir(), "okHttpCache");
6565
return new OkHttpClient.Builder()
66-
.connectTimeout(60, TimeUnit.SECONDS)
67-
.writeTimeout(60, TimeUnit.SECONDS)
66+
.connectTimeout(120, TimeUnit.SECONDS)
67+
.writeTimeout(120, TimeUnit.SECONDS)
6868
.addInterceptor(httpLoggingInterceptor)
69-
.readTimeout(60, TimeUnit.SECONDS)
69+
.readTimeout(120, TimeUnit.SECONDS)
7070
.cache(new Cache(dir, OK_HTTP_CACHE_SIZE))
7171
.build();
7272
}

app/src/main/java/fr/free/nrw/commons/upload/UploadClient.java

+13-3
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
import io.reactivex.disposables.CompositeDisposable;
1515
import java.io.File;
1616
import java.io.IOException;
17+
import java.io.UnsupportedEncodingException;
18+
import java.net.URLEncoder;
1719
import java.util.Date;
1820
import java.util.HashMap;
1921
import java.util.List;
@@ -34,7 +36,7 @@
3436
@Singleton
3537
public class UploadClient {
3638

37-
private final int CHUNK_SIZE = 256 * 1024; // 256 KB
39+
private final int CHUNK_SIZE = 512 * 1024; // 512 KB
3840

3941
//This is maximum duration for which a stash is persisted on MediaWiki
4042
// https://www.mediawiki.org/wiki/Manual:$wgUploadStashMaxAge
@@ -134,18 +136,23 @@ Observable<StashUploadResult> uploadFileToStash(
134136
new ChunkInfo(uploadResult, index.get(), totalChunks));
135137
notificationUpdater.onChunkUploaded(contribution, chunkInfo.get());
136138
}, throwable -> {
139+
Timber.e(throwable, "Received error in chunk upload");
137140
failures.set(true);
138141
}));
139142
}));
140143

141144
if (pauseUploads.get(contribution.getPageId())) {
145+
Timber.d("Upload stash paused %s", contribution.getPageId());
142146
return Observable.just(new StashUploadResult(StashUploadState.PAUSED, null));
143147
} else if (failures.get()) {
148+
Timber.d("Upload stash contains failures %s", contribution.getPageId());
144149
return Observable.just(new StashUploadResult(StashUploadState.FAILED, null));
145150
} else if (chunkInfo.get() != null) {
151+
Timber.d("Upload stash success %s", contribution.getPageId());
146152
return Observable.just(new StashUploadResult(StashUploadState.SUCCESS,
147153
chunkInfo.get().getUploadResult().getFilekey()));
148154
} else {
155+
Timber.d("Upload stash failed %s", contribution.getPageId());
149156
return Observable.just(new StashUploadResult(StashUploadState.FAILED, null));
150157
}
151158
}
@@ -176,9 +183,11 @@ Observable<UploadResult> uploadChunkToStash(final String filename,
176183
final long offset,
177184
final String fileKey,
178185
final CountingRequestBody countingRequestBody) {
179-
final MultipartBody.Part filePart = MultipartBody.Part
180-
.createFormData("chunk", filename, countingRequestBody);
186+
final MultipartBody.Part filePart;
181187
try {
188+
filePart = MultipartBody.Part
189+
.createFormData("chunk", URLEncoder.encode(filename, "utf-8"), countingRequestBody);
190+
182191
return uploadInterface.uploadFileToStash(toRequestBody(filename),
183192
toRequestBody(String.valueOf(fileSize)),
184193
toRequestBody(String.valueOf(offset)),
@@ -227,6 +236,7 @@ Observable<UploadResult> uploadFileFromStash(final Context context,
227236
UploadResponse uploadResult = gson.fromJson(uploadResponse, UploadResponse.class);
228237
if (uploadResult.getUpload() == null) {
229238
final MwException exception = gson.fromJson(uploadResponse, MwException.class);
239+
Timber.e(exception, "Error in uploading file from stash");
230240
throw new RuntimeException(exception.getErrorCode());
231241
}
232242
return uploadResult.getUpload();

app/src/main/java/fr/free/nrw/commons/upload/UploadService.java

+1
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,7 @@ private void uploadContribution(Contribution contribution) {
310310
}
311311
})
312312
.flatMap(uploadStash -> {
313+
Timber.d("Upload stash result %s", uploadStash.toString());
313314
notificationManager.cancel(notificationTag, NOTIFICATION_UPLOAD_IN_PROGRESS);
314315

315316
if (uploadStash.getState() == StashUploadState.SUCCESS) {

app/src/main/java/fr/free/nrw/commons/upload/license/MediaLicenseFragment.java

+13-9
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,16 @@
1515
import android.widget.ArrayAdapter;
1616
import android.widget.Spinner;
1717
import android.widget.TextView;
18-
1918
import androidx.annotation.NonNull;
2019
import androidx.annotation.Nullable;
21-
22-
import java.util.List;
23-
24-
import javax.inject.Inject;
25-
2620
import butterknife.BindView;
2721
import butterknife.ButterKnife;
2822
import butterknife.OnClick;
2923
import fr.free.nrw.commons.R;
3024
import fr.free.nrw.commons.Utils;
3125
import fr.free.nrw.commons.upload.UploadBaseFragment;
26+
import java.util.List;
27+
import javax.inject.Inject;
3228
import timber.log.Timber;
3329

3430
public class MediaLicenseFragment extends UploadBaseFragment implements MediaLicenseContract.View {
@@ -81,12 +77,15 @@ private void initPresenter() {
8177
* Initialise the license spinner
8278
*/
8379
private void initLicenseSpinner() {
80+
if (getContext() == null) {
81+
return;
82+
}
8483
adapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_spinner_dropdown_item);
8584
spinnerLicenseList.setAdapter(adapter);
8685
spinnerLicenseList.setOnItemSelectedListener(new OnItemSelectedListener() {
8786
@Override
8887
public void onItemSelected(AdapterView<?> adapterView, View view, int position,
89-
long l) {
88+
long l) {
9089
String licenseName = adapterView.getItemAtPosition(position).toString();
9190
presenter.selectLicense(licenseName);
9291
}
@@ -145,6 +144,7 @@ private void makeLinkClickable(SpannableStringBuilder strBuilder, final URLSpan
145144
int end = strBuilder.getSpanEnd(span);
146145
int flags = strBuilder.getSpanFlags(span);
147146
ClickableSpan clickable = new ClickableSpan() {
147+
@Override
148148
public void onClick(View view) {
149149
// Handle hyperlink click
150150
String hyperLink = span.getURL();
@@ -161,12 +161,16 @@ private void launchBrowser(String hyperLink) {
161161

162162
@Override
163163
public void onDestroyView() {
164-
super.onDestroyView();
165164
presenter.onDetachView();
166165
//Free the adapter to avoid memory leaks
167-
adapter=null;
166+
adapter = null;
167+
super.onDestroyView();
168168
}
169169

170+
@Override
171+
public void onDestroy() {
172+
super.onDestroy();
173+
}
170174

171175
@OnClick(R.id.btn_previous)
172176
public void onPreviousButtonClicked() {

app/src/main/res/values/strings.xml

+2
Original file line numberDiff line numberDiff line change
@@ -701,4 +701,6 @@ Upload your first media by tapping on the add button.</string>
701701
<string name="limited_connection">Limited Connection</string>
702702
<string name="statistics_quality">Quality Images</string>
703703
<string name="quality_images_info">Quality images are diagrams or photographs that meet certain quality standards (which are mostly technical in nature) and are valuable for Wikimedia projects</string>
704+
<string name="resuming_upload">Resuming upload…</string>
705+
<string name="pausing_upload">Pausing upload…</string>
704706
</resources>

0 commit comments

Comments
 (0)