diff --git a/aws-android-sdk-s3/pom.xml b/aws-android-sdk-s3/pom.xml index 47e25d57ffb..8a1fd700507 100644 --- a/aws-android-sdk-s3/pom.xml +++ b/aws-android-sdk-s3/pom.xml @@ -2,19 +2,21 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 - com.amazonaws + io.ebuilder.aws aws-android-sdk-s3 jar AWS SDK for Android - Amazon S3 The AWS Android SDK for Amazon S3 module holds the client classes that are used for communicating with Amazon Simple Storage Service http://aws.amazon.com/sdkforandroid - + com.amazonaws aws-android-sdk-pom 2.4.0 + 2.4.0 + com.amazonaws @@ -60,7 +62,7 @@ commons-io commons-io - 2.4 + 2.5 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 */