org.bouncycastle
@@ -79,6 +81,44 @@
org.apache.maven.plugins
maven-javadoc-plugin
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+ package
+
+
+
+
+
+ org.springframework.build
+ aws-maven
+ 5.0.0.RELEASE
+
+
+
+
+
+ snapshot.repo.ebuilder.io
+ ebuilder-snapshot
+ https://artifacts.ebuilder.io/repository/eBuilder-maven-snapshot/
+ true
+ default
+
+
+ repo.ebuilder.io
+ ebuilder-release
+ https://artifacts.ebuilder.io/repository/eBuilder-maven-release/
+ false
+ default
+
+
+
diff --git a/aws-android-sdk-s3/src/main/java/com/amazonaws/auth/AwsChunkedEncodingInputStream.java b/aws-android-sdk-s3/src/main/java/com/amazonaws/auth/AwsChunkedEncodingInputStream.java
index dc048762ff2..142c11a6f3f 100644
--- a/aws-android-sdk-s3/src/main/java/com/amazonaws/auth/AwsChunkedEncodingInputStream.java
+++ b/aws-android-sdk-s3/src/main/java/com/amazonaws/auth/AwsChunkedEncodingInputStream.java
@@ -15,18 +15,17 @@
package com.amazonaws.auth;
-import static com.amazonaws.util.StringUtils.UTF8;
-
import com.amazonaws.AmazonClientException;
import com.amazonaws.internal.SdkInputStream;
import com.amazonaws.util.BinaryUtils;
-
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.io.IOException;
import java.io.InputStream;
+import static com.amazonaws.util.StringUtils.UTF8;
+
/**
* A wrapper class of InputStream that implements chunked-encoding.
*/
diff --git a/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/receiver/NetworkInfoReceiver.java b/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/receiver/NetworkInfoReceiver.java
new file mode 100644
index 00000000000..7b64a070224
--- /dev/null
+++ b/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/receiver/NetworkInfoReceiver.java
@@ -0,0 +1,126 @@
+package com.amazonaws.mobileconnectors.s3.receiver;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+import android.os.Handler;
+import android.util.Log;
+
+/**
+ * A Broadcast receiver to receive network connection change events.
+ */
+public class NetworkInfoReceiver extends BroadcastReceiver {
+
+ private static final String TAG = "NetworkInfoReceiver";
+
+ private final Handler handler;
+
+ private final ConnectivityManager connectivityManager;
+
+ private int checkFlag;
+
+ private int disconnectFlag;
+
+ /**
+ * Constructs a NetworkInfoReceiver.
+ * @param context Service context
+ * @param handler a handle to send message to
+ */
+ public NetworkInfoReceiver(final Context context,
+ final Handler handler,
+ final int checkFlag, final int disconnectFlag) {
+ this.connectivityManager = (ConnectivityManager) context
+ .getSystemService(Context.CONNECTIVITY_SERVICE);
+ this.handler = handler;
+ this.checkFlag = checkFlag;
+ this.disconnectFlag = disconnectFlag;
+ }
+
+ @Override
+ public void onReceive(final Context context, final Intent intent) {
+ if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
+ Type checkType = connectionCheckType;
+ if (connectionCheckType == null) {
+ checkType = DEFAULT_CONNECTION_CHECK_TYPE;
+ Log.w(TAG, "Using default type: " + checkType.name());
+ }
+ boolean networkConnected = checkType.isConnected(connectivityManager);
+ Log.d(TAG, "Network connected: " + networkConnected);
+ handler.sendEmptyMessage(networkConnected ?
+ checkFlag : disconnectFlag);
+ }
+ }
+
+ public static final Type DEFAULT_CONNECTION_CHECK_TYPE = Type.ANY;
+
+ Type connectionCheckType = DEFAULT_CONNECTION_CHECK_TYPE;
+
+ public void setConnectionCheckType(Type connectionCheckType) {
+ this.connectionCheckType = connectionCheckType;
+ }
+
+ public boolean isNetworkConnected() {
+ return connectionCheckType.isConnected(connectivityManager);
+ }
+
+ public enum Type {
+ ANY("any") {
+ @Override
+ public boolean verify(final NetworkInfo info) {
+ return info != null && info.isConnected();
+ }
+ },
+ MOBILE_ONLY("mobile_only") {
+ @Override
+ public boolean verify(final NetworkInfo info) {
+ return info != null && info.isConnected()
+ && info.getType() == ConnectivityManager.TYPE_MOBILE;
+ }
+ },
+ WIFI_ONLY("wifi_only") {
+ @Override
+ public boolean verify(final NetworkInfo info) {
+ return (info != null && info.isConnected()
+ && info.getType() == ConnectivityManager.TYPE_WIFI);
+ }
+ };
+
+ private String intentKey;
+
+ Type(String intentKey) {
+ this.intentKey = intentKey;
+ }
+
+ /**
+ * Gets the status of network connectivity.
+ *
+ * @return true if network is connected, false otherwise.
+ */
+ boolean isConnected(final ConnectivityManager connectivityManager) {
+ return verify(connectivityManager.getActiveNetworkInfo());
+ }
+
+ protected abstract boolean verify(final NetworkInfo networkInfo);
+
+ public static Type from(final String name) {
+ if (name != null) {
+ for (final Type type : values()) {
+ if (type.intentKey.toLowerCase().equals(name.toLowerCase())) {
+ return type;
+ }
+ }
+ }
+ return null;
+ }
+
+ public static Type from(final String name, final Type defaultType) {
+ Type type = from(name);
+ if (type == null) {
+ return defaultType;
+ }
+ return type;
+ }
+ }
+}
diff --git a/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/DownloadTask.java b/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/DownloadTask.java
index adea8a6adf2..32323d47188 100644
--- a/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/DownloadTask.java
+++ b/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/DownloadTask.java
@@ -16,9 +16,8 @@
package com.amazonaws.mobileconnectors.s3.transferutility;
import android.util.Log;
-
import com.amazonaws.AmazonClientException;
-import com.amazonaws.mobileconnectors.s3.transferutility.TransferService.NetworkInfoReceiver;
+import com.amazonaws.mobileconnectors.s3.receiver.NetworkInfoReceiver;
import com.amazonaws.retry.RetryUtils;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.GetObjectRequest;
diff --git a/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/Function.java b/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/Function.java
new file mode 100644
index 00000000000..cd841c2e943
--- /dev/null
+++ b/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/Function.java
@@ -0,0 +1,5 @@
+package com.amazonaws.mobileconnectors.s3.transferutility;
+
+public interface Function {
+ R call(P p);
+}
diff --git a/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/S3ClientReference.java b/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/S3ClientReference.java
index 60d9aa44413..a29c3472ae1 100644
--- a/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/S3ClientReference.java
+++ b/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/S3ClientReference.java
@@ -4,9 +4,9 @@
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
- *
- * http://aws.amazon.com/apache2.0
- *
+ *
+ * http://aws.amazon.com/apache2.0
+ *
* or in the "license" file accompanying this file. This file is distributed
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing
@@ -15,11 +15,10 @@
package com.amazonaws.mobileconnectors.s3.transferutility;
+import android.content.Context;
+import android.util.Log;
import com.amazonaws.services.s3.AmazonS3;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
/**
* A holder of S3 clients for {@link TransferUtility} to pass a reference of
* AmazonS3 to {@link TransferService}. Usually objects are passed to a service
@@ -28,26 +27,38 @@
*/
class S3ClientReference {
- private static Map map = new ConcurrentHashMap();
+ private static final String TAG = S3ClientReference.class.getSimpleName();
- public static void put(String key, AmazonS3 s3) {
- map.put(key, s3);
- }
+ private static AmazonS3 amazonS3 = null;
+
+ private static final Object lock = new Object();
/**
- * Retrieves the AmazonS3 client on the given key.
+ * Retrieves the AmazonS3 client
*
- * @param key key of the client
- * @return an AmazonS3 instance, or null if the key doesn't exist
+ * @return an AmazonS3 instance, or null
*/
- public static AmazonS3 get(String key) {
- return map.remove(key);
+ public static AmazonS3 get(Context ctx) {
+ if (amazonS3 == null && TransferUtility.clientRetrieve != null) {
+ synchronized (lock) {
+ try {
+ Log.w(TAG, "S3 client's retrieval attempt");
+ amazonS3 = TransferUtility.clientRetrieve.call(ctx);
+ } catch (final Exception ex) {
+ Log.e(TAG, "Failed to retrieve s3 client", ex);
+ }
+ }
+ }
+ if (TransferUtility.clientRetrieve == null) {
+ Log.e(TAG," TransferUtility.clientRetrieve is NULL");
+ }
+ return amazonS3;
}
/**
* Clears all references.
*/
public static void clear() {
- map.clear();
+ amazonS3 = null;
}
}
diff --git a/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/ServiceStatus.java b/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/ServiceStatus.java
new file mode 100644
index 00000000000..7c2e8e6243d
--- /dev/null
+++ b/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/ServiceStatus.java
@@ -0,0 +1,31 @@
+package com.amazonaws.mobileconnectors.s3.transferutility;
+
+/**
+ * Created by Dmitry Gorohov
+ */
+public enum ServiceStatus {
+ DESTROYED("destroyed"),
+ PAUSED("paused"),
+ RESUMED("resumed");
+
+ private String name;
+
+ ServiceStatus(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public static ServiceStatus from(final String value) {
+ if (value != null) {
+ for (final ServiceStatus serviceStatus : values()) {
+ if (serviceStatus.getName().equalsIgnoreCase(value)) {
+ return serviceStatus;
+ }
+ }
+ }
+ return null;
+ }
+}
diff --git a/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/TransferConfiguration.java b/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/TransferConfiguration.java
new file mode 100644
index 00000000000..713ca029bb9
--- /dev/null
+++ b/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/TransferConfiguration.java
@@ -0,0 +1,31 @@
+package com.amazonaws.mobileconnectors.s3.transferutility;
+
+import com.amazonaws.mobileconnectors.s3.receiver.NetworkInfoReceiver;
+
+/**
+ * Created by Dmitry Gorohov
+ */
+public class TransferConfiguration {
+
+ public TransferConfiguration() {
+ connectionCheckType = NetworkInfoReceiver.Type.ANY;
+ }
+
+ /**
+ * Type of network connection validator.
+ */
+ private NetworkInfoReceiver.Type connectionCheckType;
+
+ public NetworkInfoReceiver.Type getConnectionCheckType() {
+ return connectionCheckType;
+ }
+
+ public void setConnectionCheckType(final NetworkInfoReceiver.Type connectionCheckType) {
+ this.connectionCheckType = connectionCheckType;
+ }
+
+ public TransferConfiguration withConnectionCheckType(final NetworkInfoReceiver.Type connectionCheckType) {
+ this.connectionCheckType = connectionCheckType;
+ return this;
+ }
+}
diff --git a/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/TransferRecord.java b/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/TransferRecord.java
index a91d6c49efa..528f9027ebf 100644
--- a/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/TransferRecord.java
+++ b/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/TransferRecord.java
@@ -17,9 +17,8 @@
import android.database.Cursor;
import android.util.Log;
-
import com.amazonaws.AmazonClientException;
-import com.amazonaws.mobileconnectors.s3.transferutility.TransferService.NetworkInfoReceiver;
+import com.amazonaws.mobileconnectors.s3.receiver.NetworkInfoReceiver;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.AbortMultipartUploadRequest;
import com.amazonaws.util.json.JsonUtils;
diff --git a/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/TransferService.java b/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/TransferService.java
index 5ee556d42d9..f55347de343 100644
--- a/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/TransferService.java
+++ b/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/TransferService.java
@@ -16,21 +16,18 @@
package com.amazonaws.mobileconnectors.s3.transferutility;
import android.app.Service;
-import android.content.BroadcastReceiver;
-import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ApplicationInfo;
import android.database.Cursor;
import android.net.ConnectivityManager;
-import android.net.NetworkInfo;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
-
+import com.amazonaws.mobileconnectors.s3.receiver.NetworkInfoReceiver;
import com.amazonaws.services.s3.AmazonS3;
import java.io.FileDescriptor;
@@ -65,7 +62,7 @@ public class TransferService extends Service {
static final String INTENT_ACTION_TRANSFER_RESUME = "resume_transfer";
static final String INTENT_ACTION_TRANSFER_CANCEL = "cancel_transfer";
static final String INTENT_BUNDLE_TRANSFER_ID = "id";
- static final String INTENT_BUNDLE_S3_REFERENCE_KEY = "s3_reference_key";
+ static final String INTENT_BUNDLE_CONNECTION_CHECK_TYPE = "connection_check_type";
private AmazonS3 s3;
@@ -116,52 +113,12 @@ public IBinder onBind(Intent intent) {
@Override
public void onCreate() {
super.onCreate();
-
Log.d(TAG, "Starting Transfer Service");
dbUtil = new TransferDBUtil(getApplicationContext());
- updater = new TransferStatusUpdater(dbUtil);
-
handlerThread = new HandlerThread(TAG + "-AWSTransferUpdateHandlerThread");
handlerThread.start();
setHandlerLooper(handlerThread.getLooper());
- }
-
- /**
- * A Broadcast receiver to receive network connection change events.
- */
- static class NetworkInfoReceiver extends BroadcastReceiver {
- private final Handler handler;
- private final ConnectivityManager connManager;
-
- /**
- * Constructs a NetworkInfoReceiver.
- *
- * @param handler a handle to send message to
- */
- public NetworkInfoReceiver(Context context, Handler handler) {
- this.handler = handler;
- connManager = (ConnectivityManager) context
- .getSystemService(Context.CONNECTIVITY_SERVICE);
- }
-
- @Override
- public void onReceive(Context context, Intent intent) {
- if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
- final boolean networkConnected = isNetworkConnected();
- Log.d(TAG, "Network connected: " + networkConnected);
- handler.sendEmptyMessage(networkConnected ? MSG_CHECK : MSG_DISCONNECT);
- }
- }
-
- /**
- * Gets the status of network connectivity.
- *
- * @return true if network is connected, false otherwise.
- */
- boolean isNetworkConnected() {
- final NetworkInfo info = connManager.getActiveNetworkInfo();
- return info != null && info.isConnected();
- }
+ updater = new TransferStatusUpdater(dbUtil, updateHandler);
}
@Override
@@ -171,15 +128,19 @@ public int onStartCommand(Intent intent, int flags, int startId) {
if (intent == null) {
return START_REDELIVER_INTENT;
}
-
- final String keyForS3Client = intent.getStringExtra(INTENT_BUNDLE_S3_REFERENCE_KEY);
- s3 = S3ClientReference.get(keyForS3Client);
+
+ s3 = S3ClientReference.get(getApplicationContext());
if (s3 == null) {
Log.w(TAG, "TransferService can't get s3 client, and it will stop.");
stopSelf(startId);
return START_NOT_STICKY;
}
-
+ String networkCheckType = intent.getStringExtra(INTENT_BUNDLE_CONNECTION_CHECK_TYPE);
+ if (networkCheckType != null) {
+ networkInfoReceiver.setConnectionCheckType(
+ NetworkInfoReceiver.Type.from(networkCheckType,
+ NetworkInfoReceiver.DEFAULT_CONNECTION_CHECK_TYPE));
+ }
updateHandler.sendMessage(updateHandler.obtainMessage(MSG_EXEC, intent));
if (isFirst) {
registerReceiver(networkInfoReceiver, new IntentFilter(
@@ -239,6 +200,7 @@ void checkTransfers() {
if (shouldScan && networkInfoReceiver.isNetworkConnected() && s3 != null) {
loadTransfersFromDB();
shouldScan = false;
+ broadcastServiceStatus(ServiceStatus.RESUMED);
}
removeCompletedTransfers();
@@ -252,6 +214,7 @@ void checkTransfers() {
* Stop the service when it's been idled for more than a minute.
*/
Log.d(TAG, "Stop self");
+ broadcastServiceStatus(ServiceStatus.DESTROYED);
stopSelf(startId);
}
}
@@ -307,7 +270,9 @@ void execCommand(Intent intent) {
Log.e(TAG, "Can't find transfer: " + id);
}
}
- transfer.start(s3, dbUtil, updater, networkInfoReceiver);
+ if (transfer != null) {
+ transfer.start(s3, dbUtil, updater, networkInfoReceiver);
+ }
} else if (INTENT_ACTION_TRANSFER_CANCEL.equals(action)) {
TransferRecord transfer = updater.getTransfer(id);
if (transfer == null) {
@@ -413,6 +378,7 @@ void pauseAllForNetwork() {
}
}
shouldScan = true;
+ broadcastServiceStatus(ServiceStatus.PAUSED);
}
/**
@@ -420,9 +386,10 @@ void pauseAllForNetwork() {
*
* @param looper new looper
*/
- void setHandlerLooper(Looper looper) {
+ void setHandlerLooper(final Looper looper) {
updateHandler = new UpdateHandler(looper);
- networkInfoReceiver = new NetworkInfoReceiver(getApplicationContext(), updateHandler);
+ networkInfoReceiver = new NetworkInfoReceiver(getApplicationContext(), updateHandler,
+ MSG_CHECK, MSG_DISCONNECT);
}
@Override
@@ -444,5 +411,16 @@ protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
}
writer.flush();
}
+
+ public static final String TRANSFER_SERVICE_STATUS_ACTION = "transfer-service-action";
+
+ public static final String BUNDLE_TRANSFER_SERVICE_STATUS = "status";
+
+ private void broadcastServiceStatus(final ServiceStatus status) {
+ final Intent intent = new Intent();
+ intent.setAction(TRANSFER_SERVICE_STATUS_ACTION);
+ intent.putExtra(BUNDLE_TRANSFER_SERVICE_STATUS, status.getName());
+ sendBroadcast(intent);
+ }
}
diff --git a/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/TransferStatusUpdater.java b/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/TransferStatusUpdater.java
index 2bf204bc27f..da885344794 100644
--- a/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/TransferStatusUpdater.java
+++ b/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/TransferStatusUpdater.java
@@ -70,14 +70,24 @@ class TransferStatusUpdater {
/**
* The handler of main thread that runs callbacks.
*/
- private final Handler mainHandler;
+ private final Handler eventHandler;
/**
* This class is instantiated by TransferService.
*/
TransferStatusUpdater(TransferDBUtil dbUtil) {
this.dbUtil = dbUtil;
- mainHandler = new Handler(Looper.getMainLooper());
+ eventHandler = new Handler(Looper.getMainLooper());
+ transfers = new HashMap();
+ lastUpdateTime = new HashMap();
+ }
+
+ /**
+ * This class is instantiated by TransferService.
+ */
+ TransferStatusUpdater(TransferDBUtil dbUtil, Handler eventHandler) {
+ this.dbUtil = dbUtil;
+ this.eventHandler = eventHandler;
transfers = new HashMap();
lastUpdateTime = new HashMap();
}
@@ -165,7 +175,7 @@ void updateState(final int id, final TransferState newState) {
}
// invoke on main thread
- mainHandler.post(new Runnable() {
+ eventHandler.post(new Runnable() {
@Override
public void run() {
for (final TransferListener l : list) {
@@ -219,7 +229,7 @@ void updateProgress(final int id, final long bytesCurrent, final long bytesTotal
lastUpdateTime.put(id, timeInMillis);
// invoke on main thread
- mainHandler.post(new Runnable() {
+ eventHandler.post(new Runnable() {
@Override
public void run() {
for (final TransferListener l : list) {
@@ -244,7 +254,7 @@ void throwError(final int id, final Exception e) {
return;
}
// invoke on main thread
- mainHandler.post(new Runnable() {
+ eventHandler.post(new Runnable() {
@Override
public void run() {
for (final TransferListener l : list) {
diff --git a/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/TransferUtility.java b/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/TransferUtility.java
index fe1832f5258..8711ef89920 100644
--- a/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/TransferUtility.java
+++ b/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/TransferUtility.java
@@ -15,17 +15,14 @@
package com.amazonaws.mobileconnectors.s3.transferutility;
-import static com.amazonaws.services.s3.internal.Constants.MAXIMUM_UPLOAD_PARTS;
-import static com.amazonaws.services.s3.internal.Constants.MB;
-
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.util.Log;
-
import com.amazonaws.AmazonWebServiceRequest;
+import com.amazonaws.mobileconnectors.s3.receiver.NetworkInfoReceiver;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.CannedAccessControlList;
import com.amazonaws.services.s3.model.ObjectMetadata;
@@ -34,7 +31,9 @@
import java.io.File;
import java.util.ArrayList;
import java.util.List;
-import java.util.UUID;
+
+import static com.amazonaws.services.s3.internal.Constants.MAXIMUM_UPLOAD_PARTS;
+import static com.amazonaws.services.s3.internal.Constants.MB;
/**
* The transfer utility is a high-level class for applications to upload and
@@ -94,23 +93,24 @@ public class TransferUtility {
*/
static final int MINIMUM_UPLOAD_PART_SIZE = 5 * MB;
- private final AmazonS3 s3;
private final Context appContext;
private final TransferDBUtil dbUtil;
+ public static Function clientRetrieve;
+ private final TransferConfiguration transferConfiguration;
/**
* Constructs a new TransferUtility specifying the client to use and
* initializes configuration of TransferUtility and a key for S3 client weak
* reference.
*
- * @param s3 The client to use when making requests to Amazon S3
+ * @param clientRetrieve The client callback to retrieve instance
* @param context The current context
- * @param configuration Configuration parameters for this TransferUtility
*/
- public TransferUtility(AmazonS3 s3, Context context) {
- this.s3 = s3;
+ public TransferUtility(final Function clientRetrieve, final Context context, final TransferConfiguration transferConfiguration) {
this.appContext = context.getApplicationContext();
this.dbUtil = new TransferDBUtil(appContext);
+ this.transferConfiguration = transferConfiguration;
+ TransferUtility.clientRetrieve = clientRetrieve;
}
/**
* Starts downloading the S3 object specified by the bucket and the key to
@@ -150,8 +150,9 @@ public TransferObserver download(String bucket, String key, File file,
file.delete();
}
- sendIntent(TransferService.INTENT_ACTION_TRANSFER_ADD, recordId);
- return new TransferObserver(recordId, dbUtil, bucket, key, file, listener);
+ sendIntent(TransferService.INTENT_ACTION_TRANSFER_ADD, recordId,
+ transferConfiguration.getConnectionCheckType());
+ return new TransferObserver(recordId, dbUtil, bucket, key, file);
}
/**
@@ -181,7 +182,7 @@ public TransferObserver upload(String bucket, String key, File file) {
* @return A TransferObserver used to track upload progress and state
*/
public TransferObserver upload(String bucket, String key, File file,
- CannedAccessControlList cannedAcl) {
+ CannedAccessControlList cannedAcl) {
return upload(bucket, key, file, new ObjectMetadata(), cannedAcl);
}
@@ -246,8 +247,8 @@ public TransferObserver upload(String bucket, String key, File file, ObjectMetad
recordId = Integer.parseInt(uri.getLastPathSegment());
}
- sendIntent(TransferService.INTENT_ACTION_TRANSFER_ADD, recordId);
- return new TransferObserver(recordId, dbUtil, bucket, key, file, listener);
+ sendIntent(TransferService.INTENT_ACTION_TRANSFER_ADD, recordId, transferConfiguration.getConnectionCheckType());
+ return new TransferObserver(recordId, dbUtil, bucket, key, file);
}
@@ -342,7 +343,6 @@ public List getTransfersWithTypeAndState(TransferType type,
* @param key The key in the specified bucket by which to store the new
* object.
* @param file The file to upload.
- * @param isUsingEncryption Whether the upload is encrypted.
* @return Number of records created in database
*/
private int createMultipartUploadRecords(String bucket, String key, File file,
@@ -477,13 +477,16 @@ public boolean deleteTransferRecord(int id) {
* @param action action to perform
* @param id id of the transfer
*/
- private synchronized void sendIntent(String action, int id) {
- final String s3Key = UUID.randomUUID().toString();
- S3ClientReference.put(s3Key, s3);
+ private void sendIntent(String action, int id) {
+ sendIntent(action, id, transferConfiguration.getConnectionCheckType());
+ }
+
+ private void sendIntent(final String action, final int id, final NetworkInfoReceiver.Type networkCheckType) {
final Intent intent = new Intent(appContext, TransferService.class);
intent.setAction(action);
intent.putExtra(TransferService.INTENT_BUNDLE_TRANSFER_ID, id);
- intent.putExtra(TransferService.INTENT_BUNDLE_S3_REFERENCE_KEY, s3Key);
+ intent.putExtra(TransferService.INTENT_BUNDLE_CONNECTION_CHECK_TYPE,
+ networkCheckType.name());
appContext.startService(intent);
}
@@ -509,11 +512,5 @@ static X appendMultipartTransferServiceUserA
+ VersionInfoUtils.getVersion());
return request;
}
-
- TransferDBUtil getDbUtil() {
- return dbUtil;
- }
-
}
-
diff --git a/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/UploadTask.java b/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/UploadTask.java
index 9cca9003d45..be933c3238c 100644
--- a/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/UploadTask.java
+++ b/aws-android-sdk-s3/src/main/java/com/amazonaws/mobileconnectors/s3/transferutility/UploadTask.java
@@ -16,29 +16,16 @@
package com.amazonaws.mobileconnectors.s3.transferutility;
import android.util.Log;
-
import com.amazonaws.AmazonClientException;
-import com.amazonaws.mobileconnectors.s3.transferutility.TransferService.NetworkInfoReceiver;
+import com.amazonaws.mobileconnectors.s3.receiver.NetworkInfoReceiver;
import com.amazonaws.retry.RetryUtils;
import com.amazonaws.services.s3.AmazonS3;
-import com.amazonaws.services.s3.model.CannedAccessControlList;
-import com.amazonaws.services.s3.model.CompleteMultipartUploadRequest;
-import com.amazonaws.services.s3.model.InitiateMultipartUploadRequest;
-import com.amazonaws.services.s3.model.ObjectMetadata;
-import com.amazonaws.services.s3.model.PartETag;
-import com.amazonaws.services.s3.model.PutObjectRequest;
-import com.amazonaws.services.s3.model.SSEAwsKeyManagementParams;
-import com.amazonaws.services.s3.model.UploadPartRequest;
+import com.amazonaws.services.s3.model.*;
import com.amazonaws.services.s3.util.Mimetypes;
-import com.google.gson.Gson;
import java.io.File;
import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
@@ -260,7 +247,6 @@ private String initiateMultipartUpload(PutObjectRequest putObjectRequest)
/**
* Creates a PutObjectRequest from the data in the TransferRecord
*
- * @param por The request to fill
* @param upload The data for the Object Metadata
* @return Returns a PutObjectRequest with filled in metadata and parameters
*/