Skip to content

Advanced topics

Alex Gotev edited this page Jan 24, 2021 · 33 revisions

Contents

ProGuard

Add this to your ProGuard configuration:

-keep class net.gotev.uploadservice.** { *; }

This keeps all the classes of the library. If you want to fine tune it, you have to discover which parts of the library are you using. Open a terminal, navigate to your src folder and execute:

grep -roh . -e 'net.gotev.uploadservice.*' | sort | uniq

This will print out something like this:

net.gotev.uploadservice.BinaryUploadRequest;
net.gotev.uploadservice.Logger;
net.gotev.uploadservice.MultipartUploadRequest;
net.gotev.uploadservice.ServerResponse;
net.gotev.uploadservice.UploadInfo;
net.gotev.uploadservice.UploadNotificationAction;
net.gotev.uploadservice.UploadNotificationConfig;
net.gotev.uploadservice.UploadService;
net.gotev.uploadservice.UploadServiceBroadcastReceiver;
net.gotev.uploadservice.UploadStatusDelegate;
net.gotev.uploadservice.ftp.FTPUploadRequest;
net.gotev.uploadservice.ftp.UnixPermissions;
net.gotev.uploadservice.okhttp.OkHttpStack;

And those are the classes you are importing. Refer to this excellent article by Jeroen Mols to discover how to improve your ProGuard configuration file based on the output you got. Beware it's a trial and error process, so you may spend some time to find the proper configuration for your case.

How to use self-signed certificates

If in 2019+ you are still reading this, consider Let's encrypt. For security reasons, the library doesn't accept self-signed certificates by default when using HTTPS connections, but you can enable them if you need it. Read this as a last resort.

Retrying failed uploads

Android Upload Service tries its best to upload files. You can in fact set the maximum number of automatic upload retries before notifying an error, by calling the setMaxRetries on the upload request. Since network on mobile devices is unreliable and it may also happen that your server is not reachable when you try to upload something, it may happen that your files are not uploaded even after 100 automatic retries (which is a bad practice btw 😄). So, what I suggest you to do is to keep a reference to the uploadID and the upload request object somewhere in your code, so you can trigger upload again by calling the startUpload method on the request object when certain conditions (e.g. server is reachable again) are met. How to properly implement that behaviour for your specific scenario is up to you. If you can't figure it out how to do it and you need some further help, you're welcome, but that's called consulting 😃 .

Uploading only when a connection is available

If you want to start uploads or retry them based on the remote server's reachability status, ReactiveNetwork may be useful to you in combination with this library.

Custom HTTP stack implementation

By default, the library uses the HttpURLConnection stack to perform uploads. However, starting from release 2.1+, you can use also OkHttp (check Setup wiki page) or provide your own implementation! To provide a new stack implementation, you should implement the following interfaces in three classes:

  • HttpStack
  • HttpStackConnection
  • BodyWriter

Check interfaces source codes and default implementation. You can also see how to create a completely new project which provides a custom HTTP stack by looking at how the uploadservice-okhttp module is made.