├── uploadservice ├── .gitignore ├── proguard-rules.pro └── src │ ├── main │ ├── java │ │ └── net │ │ │ └── gotev │ │ │ └── uploadservice │ │ │ ├── data │ │ │ ├── UploadStatus.kt │ │ │ ├── UploadElapsedTime.kt │ │ │ ├── UploadRate.kt │ │ │ ├── UploadNotificationConfig.kt │ │ │ ├── UploadNotificationAction.kt │ │ │ ├── BroadcastData.kt │ │ │ ├── NameValue.kt │ │ │ ├── RetryPolicyConfig.kt │ │ │ ├── UploadFile.kt │ │ │ ├── UploadTaskParameters.kt │ │ │ ├── HttpUploadTaskParameters.kt │ │ │ └── UploadNotificationStatusConfig.kt │ │ │ ├── persistence │ │ │ └── Persistable.kt │ │ │ ├── exceptions │ │ │ └── Exceptions.kt │ │ │ ├── extensions │ │ │ ├── CollectionsExtensions.kt │ │ │ ├── NotificationManagerExtensions.kt │ │ │ ├── WakeLockExtensions.kt │ │ │ └── StringExtensions.kt │ │ │ ├── placeholders │ │ │ ├── PlaceholdersProcessor.kt │ │ │ ├── Placeholder.kt │ │ │ └── DefaultPlaceholdersProcessor.kt │ │ │ ├── observer │ │ │ ├── request │ │ │ │ ├── GlobalRequestObserver.kt │ │ │ │ ├── BaseRequestObserver.kt │ │ │ │ ├── NotificationActionsObserver.kt │ │ │ │ ├── RequestObserver.kt │ │ │ │ └── RequestObserverDelegate.kt │ │ │ └── task │ │ │ │ ├── UploadTaskObserver.kt │ │ │ │ ├── TaskCompletionNotifier.kt │ │ │ │ └── BroadcastEmitter.kt │ │ │ ├── network │ │ │ ├── HttpStack.kt │ │ │ ├── hurl │ │ │ │ ├── HurlBodyWriter.kt │ │ │ │ └── HurlStack.kt │ │ │ ├── ServerResponse.kt │ │ │ ├── HttpRequest.kt │ │ │ └── BodyWriter.kt │ │ │ ├── logger │ │ │ ├── DefaultLoggerDelegate.kt │ │ │ └── UploadServiceLogger.kt │ │ │ ├── schemehandlers │ │ │ ├── SchemeHandler.kt │ │ │ ├── FileSchemeHandler.kt │ │ │ └── ContentResolverSchemeHandler.kt │ │ │ └── protocols │ │ │ ├── binary │ │ │ ├── BinaryUploadTask.kt │ │ │ └── BinaryUploadRequest.kt │ │ │ └── multipart │ │ │ ├── UploadFileExtensions.kt │ │ │ └── MultipartUploadRequest.kt │ └── AndroidManifest.xml │ ├── androidTest │ └── java │ │ └── net │ │ └── gotev │ │ └── uploadservice │ │ └── testcore │ │ ├── UploadServiceTestSuite.kt │ │ └── ContextExtensions.kt │ └── test │ └── java │ └── net │ └── gotev │ └── uploadservice │ ├── HTTPURLTests.kt │ ├── MimeTypeTests.kt │ └── ASCIIStringsTests.kt ├── examples ├── app │ ├── demoapp │ │ ├── .gitignore │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ ├── gradle-wrapper.jar │ │ │ │ └── gradle-wrapper.properties │ │ ├── src │ │ │ └── main │ │ │ │ ├── res │ │ │ │ ├── drawable-hdpi │ │ │ │ │ ├── ic_code.png │ │ │ │ │ ├── ic_clear.png │ │ │ │ │ ├── ic_dehaze.png │ │ │ │ │ ├── ic_upload.png │ │ │ │ │ ├── ic_cancelled.png │ │ │ │ │ ├── ic_action_check.png │ │ │ │ │ ├── ic_action_info.png │ │ │ │ │ ├── ic_add_circle.png │ │ │ │ │ ├── ic_description.png │ │ │ │ │ ├── ic_upload_error.png │ │ │ │ │ ├── ic_upload_success.png │ │ │ │ │ └── ic_action_settings.png │ │ │ │ ├── drawable-mdpi │ │ │ │ │ ├── ic_code.png │ │ │ │ │ ├── ic_clear.png │ │ │ │ │ ├── ic_dehaze.png │ │ │ │ │ ├── ic_upload.png │ │ │ │ │ ├── ic_cancelled.png │ │ │ │ │ ├── ic_action_check.png │ │ │ │ │ ├── ic_action_info.png │ │ │ │ │ ├── ic_add_circle.png │ │ │ │ │ ├── ic_description.png │ │ │ │ │ ├── ic_upload_error.png │ │ │ │ │ ├── ic_upload_success.png │ │ │ │ │ └── ic_action_settings.png │ │ │ │ ├── drawable-xhdpi │ │ │ │ │ ├── ic_clear.png │ │ │ │ │ ├── ic_code.png │ │ │ │ │ ├── ic_dehaze.png │ │ │ │ │ ├── ic_upload.png │ │ │ │ │ ├── ic_action_info.png │ │ │ │ │ ├── ic_add_circle.png │ │ │ │ │ ├── ic_cancelled.png │ │ │ │ │ ├── ic_description.png │ │ │ │ │ ├── ic_action_check.png │ │ │ │ │ ├── ic_upload_error.png │ │ │ │ │ ├── ic_action_settings.png │ │ │ │ │ └── ic_upload_success.png │ │ │ │ ├── drawable-xxhdpi │ │ │ │ │ ├── ic_clear.png │ │ │ │ │ ├── ic_code.png │ │ │ │ │ ├── ic_dehaze.png │ │ │ │ │ ├── ic_upload.png │ │ │ │ │ ├── ic_add_circle.png │ │ │ │ │ ├── ic_cancelled.png │ │ │ │ │ ├── ic_action_check.png │ │ │ │ │ ├── ic_action_info.png │ │ │ │ │ ├── ic_description.png │ │ │ │ │ ├── ic_upload_error.png │ │ │ │ │ ├── ic_action_settings.png │ │ │ │ │ └── ic_upload_success.png │ │ │ │ ├── drawable-xxxhdpi │ │ │ │ │ ├── ic_code.png │ │ │ │ │ ├── ic_clear.png │ │ │ │ │ ├── ic_dehaze.png │ │ │ │ │ ├── ic_upload.png │ │ │ │ │ ├── ic_cancelled.png │ │ │ │ │ ├── ic_action_info.png │ │ │ │ │ ├── ic_add_circle.png │ │ │ │ │ ├── ic_description.png │ │ │ │ │ ├── ic_action_check.png │ │ │ │ │ ├── ic_upload_error.png │ │ │ │ │ ├── ic_upload_success.png │ │ │ │ │ └── ic_action_settings.png │ │ │ │ ├── mipmap-hdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── drawable-hdpi-v11 │ │ │ │ │ ├── ic_upload.png │ │ │ │ │ ├── ic_upload_error.png │ │ │ │ │ └── ic_upload_success.png │ │ │ │ ├── drawable-mdpi-v11 │ │ │ │ │ ├── ic_upload.png │ │ │ │ │ ├── ic_upload_error.png │ │ │ │ │ └── ic_upload_success.png │ │ │ │ ├── drawable-xhdpi-v11 │ │ │ │ │ ├── ic_upload.png │ │ │ │ │ ├── ic_upload_error.png │ │ │ │ │ └── ic_upload_success.png │ │ │ │ ├── drawable-xxhdpi-v11 │ │ │ │ │ ├── ic_upload.png │ │ │ │ │ ├── ic_upload_error.png │ │ │ │ │ └── ic_upload_success.png │ │ │ │ ├── drawable-xxxhdpi-v11 │ │ │ │ │ ├── ic_upload.png │ │ │ │ │ ├── ic_upload_error.png │ │ │ │ │ └── ic_upload_success.png │ │ │ │ ├── values │ │ │ │ │ ├── attrs.xml │ │ │ │ │ ├── dimens.xml │ │ │ │ │ ├── colors.xml │ │ │ │ │ └── styles.xml │ │ │ │ ├── values-w820dp │ │ │ │ │ └── dimens.xml │ │ │ │ ├── layout │ │ │ │ │ ├── item_empty.xml │ │ │ │ │ ├── dialog_add_file_parameter_name.xml │ │ │ │ │ ├── dialog_add_name_value.xml │ │ │ │ │ ├── item_add.xml │ │ │ │ │ ├── item_upload.xml │ │ │ │ │ ├── activity_upload.xml │ │ │ │ │ ├── activity_main.xml │ │ │ │ │ └── activity_upload_ftp.xml │ │ │ │ └── menu │ │ │ │ │ └── menu_upload.xml │ │ │ │ ├── java │ │ │ │ └── net │ │ │ │ │ └── gotev │ │ │ │ │ └── uploadservicedemo │ │ │ │ │ ├── extensions │ │ │ │ │ ├── ContextExtensions.kt │ │ │ │ │ └── StringExtensions.kt │ │ │ │ │ ├── adapteritems │ │ │ │ │ ├── EmptyItem.kt │ │ │ │ │ └── UploadItem.kt │ │ │ │ │ ├── CustomPlaceholdersProcessor.kt │ │ │ │ │ ├── ExampleSingleNotificationHandler.kt │ │ │ │ │ ├── activities │ │ │ │ │ ├── MainActivity.kt │ │ │ │ │ └── FilePickerActivity.kt │ │ │ │ │ ├── GlobalRequestObserverDelegate.kt │ │ │ │ │ ├── utils │ │ │ │ │ └── UploadItemUtils.kt │ │ │ │ │ ├── views │ │ │ │ │ └── AddItem.kt │ │ │ │ │ └── dialogs │ │ │ │ │ └── AddFileParameterNameDialog.kt │ │ │ │ └── AndroidManifest.xml │ │ ├── proguard-rules.pro │ │ └── gradlew.bat │ ├── keystore │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── show-method-count │ ├── settings.gradle │ ├── .gitignore │ ├── build.gradle │ ├── gradle.properties │ ├── .idea │ │ └── gradle.xml │ └── gradlew.bat ├── SimpleMultipartUpload │ ├── app │ │ ├── .gitignore │ │ ├── src │ │ │ ├── main │ │ │ │ ├── res │ │ │ │ │ ├── values │ │ │ │ │ │ ├── strings.xml │ │ │ │ │ │ ├── colors.xml │ │ │ │ │ │ └── styles.xml │ │ │ │ │ ├── mipmap-hdpi │ │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ │ └── ic_launcher_round.png │ │ │ │ │ ├── mipmap-mdpi │ │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ │ └── ic_launcher_round.png │ │ │ │ │ ├── mipmap-xhdpi │ │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ │ └── ic_launcher_round.png │ │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ │ └── ic_launcher_round.png │ │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ │ └── ic_launcher_round.png │ │ │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ │ │ ├── ic_launcher.xml │ │ │ │ │ │ └── ic_launcher_round.xml │ │ │ │ │ ├── layout │ │ │ │ │ │ └── activity_main.xml │ │ │ │ │ └── drawable-v24 │ │ │ │ │ │ └── ic_launcher_foreground.xml │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java │ │ │ │ │ └── it │ │ │ │ │ └── gotev │ │ │ │ │ └── testapp │ │ │ │ │ └── App.kt │ │ │ ├── test │ │ │ │ └── java │ │ │ │ │ └── it │ │ │ │ │ └── gotev │ │ │ │ │ └── testapp │ │ │ │ │ └── ExampleUnitTest.kt │ │ │ └── androidTest │ │ │ │ └── java │ │ │ │ └── it │ │ │ │ └── gotev │ │ │ │ └── testapp │ │ │ │ └── ExampleInstrumentedTest.kt │ │ ├── proguard-rules.pro │ │ └── build.gradle │ ├── settings.gradle │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── .gitignore │ ├── build.gradle │ ├── gradle.properties │ └── gradlew.bat ├── server-php │ └── upload.php └── server-nodejs │ └── package.json ├── uploadservice-okhttp ├── .gitignore ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── net │ └── gotev │ └── uploadservice │ └── okhttp │ ├── OkHttpExtensions.kt │ ├── OkHttpBodyWriter.kt │ └── OkHttpStack.kt ├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── config.yml │ ├── docs.md │ ├── feature_request.md │ └── bug_report.md ├── dependabot.yml ├── stale.yml ├── lock.yml └── workflows │ └── android.yml ├── .editorconfig ├── uploadservice-ftp ├── .gitignore ├── proguard-rules.pro ├── src │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── net │ │ │ └── gotev │ │ │ └── uploadservice │ │ │ └── ftp │ │ │ ├── UnixPermissions.kt │ │ │ └── UploadFileExtensions.kt │ └── androidTest │ │ └── java │ │ └── net │ │ └── gotev │ │ └── uploadservice │ │ └── ftp │ │ └── DataTypesPersistableDataTests.kt ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── test-server │ └── vsftpd-osx ├── README.md ├── gradlew.bat └── build.gradle ├── utils └── doze-test │ ├── doze-disable │ ├── doze-enable │ ├── app-standby-disable │ └── app-standby-enable ├── uploadservice-logo.png ├── assets ├── WhatDoYouNeed.png ├── uploadservice-architecture.png ├── WhatDoYouNeed.drawio └── uploadservice-architecture.xml ├── settings.gradle ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── local-release ├── generate-debug-apk ├── SECURITY.md ├── release ├── .gitignore ├── gradle.properties ├── manifest.gradle ├── gradlew.bat └── CONTRIBUTING.md /uploadservice/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /examples/app/demoapp/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /uploadservice-okhttp/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /examples/SimpleMultipartUpload/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | custom: ["https://paypal.me/alexgt"] 2 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | [*.{kt,kts}] 2 | disabled_rules = import-ordering 3 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | -------------------------------------------------------------------------------- /uploadservice-ftp/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | test-server/linux/.vagrant 3 | -------------------------------------------------------------------------------- /uploadservice/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | -keep class net.gotev.uploadservice.** { *; } 2 | -------------------------------------------------------------------------------- /utils/doze-test/doze-disable: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | adb shell dumpsys deviceidle disable 3 | -------------------------------------------------------------------------------- /uploadservice-ftp/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | -keep class net.gotev.uploadservice.ftp.** { *; } 2 | -------------------------------------------------------------------------------- /examples/SimpleMultipartUpload/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | rootProject.name='TestApp' 3 | -------------------------------------------------------------------------------- /uploadservice-okhttp/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | -keep class net.gotev.uploadservice.okhttp.** { *; } 2 | -------------------------------------------------------------------------------- /examples/app/keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/keystore -------------------------------------------------------------------------------- /uploadservice-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/uploadservice-logo.png -------------------------------------------------------------------------------- /assets/WhatDoYouNeed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/assets/WhatDoYouNeed.png -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':uploadservice' 2 | include ':uploadservice-okhttp' 3 | include ':uploadservice-ftp' 4 | -------------------------------------------------------------------------------- /uploadservice-ftp/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /uploadservice-okhttp/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /utils/doze-test/doze-enable: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | adb shell dumpsys deviceidle enable 3 | adb shell dumpsys deviceidle force-idle 4 | 5 | -------------------------------------------------------------------------------- /assets/uploadservice-architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/assets/uploadservice-architecture.png -------------------------------------------------------------------------------- /examples/app/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /examples/SimpleMultipartUpload/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | SimpleMultipartUpload 3 | 4 | -------------------------------------------------------------------------------- /uploadservice-ftp/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/uploadservice-ftp/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /examples/app/demoapp/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /local-release: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | export LOCAL_MAVEN_URL="file://$(pwd)/releases/" 3 | mkdir -p releases 4 | ./gradlew clean build publish -PmavPublishToInternalRepo=true 5 | 6 | -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-hdpi/ic_code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-hdpi/ic_code.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-mdpi/ic_code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-mdpi/ic_code.png -------------------------------------------------------------------------------- /generate-debug-apk: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | cd examples/app 3 | ./gradlew clean assembleDebug 4 | cp demoapp/build/outputs/apk/debug/demoapp-debug.apk ../../uploadservice-demo-debug.apk 5 | -------------------------------------------------------------------------------- /utils/doze-test/app-standby-disable: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | PACKAGE="net.gotev.uploadservicedemo" 3 | adb shell am set-inactive "$PACKAGE" false 4 | adb shell am get-inactive "$PACKAGE" 5 | -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-hdpi/ic_clear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-hdpi/ic_clear.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-hdpi/ic_dehaze.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-hdpi/ic_dehaze.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-hdpi/ic_upload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-hdpi/ic_upload.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-mdpi/ic_clear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-mdpi/ic_clear.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-mdpi/ic_dehaze.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-mdpi/ic_dehaze.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-mdpi/ic_upload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-mdpi/ic_upload.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xhdpi/ic_clear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xhdpi/ic_clear.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xhdpi/ic_code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xhdpi/ic_code.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xhdpi/ic_dehaze.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xhdpi/ic_dehaze.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xhdpi/ic_upload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xhdpi/ic_upload.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xxhdpi/ic_clear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xxhdpi/ic_clear.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xxhdpi/ic_code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xxhdpi/ic_code.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xxxhdpi/ic_code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xxxhdpi/ic_code.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /examples/SimpleMultipartUpload/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/SimpleMultipartUpload/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-hdpi/ic_cancelled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-hdpi/ic_cancelled.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-mdpi/ic_cancelled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-mdpi/ic_cancelled.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xxhdpi/ic_dehaze.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xxhdpi/ic_dehaze.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xxhdpi/ic_upload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xxhdpi/ic_upload.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xxxhdpi/ic_clear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xxxhdpi/ic_clear.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xxxhdpi/ic_dehaze.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xxxhdpi/ic_dehaze.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xxxhdpi/ic_upload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xxxhdpi/ic_upload.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-hdpi-v11/ic_upload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-hdpi-v11/ic_upload.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-hdpi/ic_action_check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-hdpi/ic_action_check.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-hdpi/ic_action_info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-hdpi/ic_action_info.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-hdpi/ic_add_circle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-hdpi/ic_add_circle.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-hdpi/ic_description.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-hdpi/ic_description.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-hdpi/ic_upload_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-hdpi/ic_upload_error.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-mdpi-v11/ic_upload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-mdpi-v11/ic_upload.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-mdpi/ic_action_check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-mdpi/ic_action_check.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-mdpi/ic_action_info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-mdpi/ic_action_info.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-mdpi/ic_add_circle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-mdpi/ic_add_circle.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-mdpi/ic_description.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-mdpi/ic_description.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-mdpi/ic_upload_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-mdpi/ic_upload_error.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xhdpi-v11/ic_upload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xhdpi-v11/ic_upload.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xhdpi/ic_action_info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xhdpi/ic_action_info.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xhdpi/ic_add_circle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xhdpi/ic_add_circle.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xhdpi/ic_cancelled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xhdpi/ic_cancelled.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xhdpi/ic_description.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xhdpi/ic_description.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xxhdpi-v11/ic_upload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xxhdpi-v11/ic_upload.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xxhdpi/ic_add_circle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xxhdpi/ic_add_circle.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xxhdpi/ic_cancelled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xxhdpi/ic_cancelled.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xxxhdpi/ic_cancelled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xxxhdpi/ic_cancelled.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-hdpi/ic_upload_success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-hdpi/ic_upload_success.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-mdpi/ic_upload_success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-mdpi/ic_upload_success.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xhdpi/ic_action_check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xhdpi/ic_action_check.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xhdpi/ic_upload_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xhdpi/ic_upload_error.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xxhdpi/ic_action_check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xxhdpi/ic_action_check.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xxhdpi/ic_action_info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xxhdpi/ic_action_info.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xxhdpi/ic_description.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xxhdpi/ic_description.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xxhdpi/ic_upload_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xxhdpi/ic_upload_error.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xxxhdpi-v11/ic_upload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xxxhdpi-v11/ic_upload.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xxxhdpi/ic_action_info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xxxhdpi/ic_action_info.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xxxhdpi/ic_add_circle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xxxhdpi/ic_add_circle.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xxxhdpi/ic_description.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xxxhdpi/ic_description.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-hdpi-v11/ic_upload_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-hdpi-v11/ic_upload_error.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-hdpi/ic_action_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-hdpi/ic_action_settings.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-mdpi-v11/ic_upload_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-mdpi-v11/ic_upload_error.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-mdpi/ic_action_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-mdpi/ic_action_settings.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xhdpi-v11/ic_upload_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xhdpi-v11/ic_upload_error.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xhdpi/ic_action_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xhdpi/ic_action_settings.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xhdpi/ic_upload_success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xhdpi/ic_upload_success.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xxhdpi/ic_action_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xxhdpi/ic_action_settings.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xxhdpi/ic_upload_success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xxhdpi/ic_upload_success.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xxxhdpi/ic_action_check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xxxhdpi/ic_action_check.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xxxhdpi/ic_upload_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xxxhdpi/ic_upload_error.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xxxhdpi/ic_upload_success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xxxhdpi/ic_upload_success.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-hdpi-v11/ic_upload_success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-hdpi-v11/ic_upload_success.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-mdpi-v11/ic_upload_success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-mdpi-v11/ic_upload_success.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xhdpi-v11/ic_upload_success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xhdpi-v11/ic_upload_success.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xxhdpi-v11/ic_upload_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xxhdpi-v11/ic_upload_error.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xxxhdpi-v11/ic_upload_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xxxhdpi-v11/ic_upload_error.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xxxhdpi/ic_action_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xxxhdpi/ic_action_settings.png -------------------------------------------------------------------------------- /examples/SimpleMultipartUpload/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/SimpleMultipartUpload/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /examples/SimpleMultipartUpload/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/SimpleMultipartUpload/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /examples/SimpleMultipartUpload/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/SimpleMultipartUpload/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /examples/SimpleMultipartUpload/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/SimpleMultipartUpload/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xxhdpi-v11/ic_upload_success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xxhdpi-v11/ic_upload_success.png -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/drawable-xxxhdpi-v11/ic_upload_success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/app/demoapp/src/main/res/drawable-xxxhdpi-v11/ic_upload_success.png -------------------------------------------------------------------------------- /utils/doze-test/app-standby-enable: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | PACKAGE="net.gotev.uploadservicedemo" 3 | adb shell dumpsys battery unplug 4 | adb shell am set-inactive "$PACKAGE" true 5 | adb shell am get-inactive "$PACKAGE" 6 | -------------------------------------------------------------------------------- /examples/SimpleMultipartUpload/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/SimpleMultipartUpload/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /examples/SimpleMultipartUpload/app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/SimpleMultipartUpload/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /examples/SimpleMultipartUpload/app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/SimpleMultipartUpload/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /examples/SimpleMultipartUpload/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/SimpleMultipartUpload/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /uploadservice/src/main/java/net/gotev/uploadservice/data/UploadStatus.kt: -------------------------------------------------------------------------------- 1 | package net.gotev.uploadservice.data 2 | 3 | enum class UploadStatus { 4 | InProgress, 5 | Success, 6 | Error, 7 | Completed 8 | } 9 | -------------------------------------------------------------------------------- /examples/SimpleMultipartUpload/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/SimpleMultipartUpload/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /examples/SimpleMultipartUpload/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gotev/android-upload-service/HEAD/examples/SimpleMultipartUpload/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /examples/app/show-method-count: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ./gradlew clean assembleDebug 3 | echo 4 | echo 5 | echo 6 | cat demoapp/build/outputs/dexcount/debug.txt | grep "net.gotev.uploadservice" | grep -v "net.gotev.uploadservicedemo" 7 | -------------------------------------------------------------------------------- /uploadservice/src/main/java/net/gotev/uploadservice/data/UploadElapsedTime.kt: -------------------------------------------------------------------------------- 1 | package net.gotev.uploadservice.data 2 | 3 | data class UploadElapsedTime(val minutes: Int, val seconds: Int) { 4 | val totalSeconds: Int 5 | get() = minutes * 60 + seconds 6 | } 7 | -------------------------------------------------------------------------------- /examples/SimpleMultipartUpload/app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #008577 4 | #00574B 5 | #D81B60 6 | 7 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Sun Jan 20 16:54:37 CET 2019 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip 7 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: gradle 4 | directory: "/" 5 | schedule: 6 | interval: daily 7 | time: "04:00" 8 | open-pull-requests-limit: 10 9 | ignore: 10 | - dependency-name: commons-net:commons-net 11 | versions: 12 | - 3.8.0 13 | -------------------------------------------------------------------------------- /examples/app/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Sun Jul 09 10:09:56 CEST 2023 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /examples/app/demoapp/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Sat Feb 06 09:00:25 CET 2021 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip 7 | -------------------------------------------------------------------------------- /uploadservice-ftp/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Sun Jul 09 09:53:21 CEST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip 7 | -------------------------------------------------------------------------------- /examples/SimpleMultipartUpload/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | -------------------------------------------------------------------------------- /examples/SimpleMultipartUpload/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Sat Jun 05 10:33:42 CEST 2021 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip 7 | -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /uploadservice/src/main/java/net/gotev/uploadservice/persistence/Persistable.kt: -------------------------------------------------------------------------------- 1 | package net.gotev.uploadservice.persistence 2 | 3 | interface Persistable { 4 | fun toPersistableData(): PersistableData 5 | 6 | interface Creator { 7 | fun createFromPersistableData(data: PersistableData): T 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /uploadservice/src/main/java/net/gotev/uploadservice/exceptions/Exceptions.kt: -------------------------------------------------------------------------------- 1 | package net.gotev.uploadservice.exceptions 2 | 3 | import net.gotev.uploadservice.network.ServerResponse 4 | 5 | class UserCancelledUploadException : Throwable("User cancelled upload") 6 | class UploadError(val serverResponse: ServerResponse) : Throwable("Upload error") 7 | -------------------------------------------------------------------------------- /uploadservice/src/main/java/net/gotev/uploadservice/data/UploadRate.kt: -------------------------------------------------------------------------------- 1 | package net.gotev.uploadservice.data 2 | 3 | data class UploadRate(val value: Int = 0, val unit: UploadRateUnit = UploadRateUnit.BitPerSecond) { 4 | enum class UploadRateUnit { 5 | BitPerSecond, 6 | KilobitPerSecond, 7 | MegabitPerSecond 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /examples/SimpleMultipartUpload/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /examples/SimpleMultipartUpload/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /examples/app/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':demoapp' 2 | include ':uploadservice' 3 | include ':uploadservice-okhttp' 4 | include ':uploadservice-ftp' 5 | project(':uploadservice').projectDir = file('../../uploadservice') 6 | project(':uploadservice-okhttp').projectDir = file('../../uploadservice-okhttp') 7 | project(':uploadservice-ftp').projectDir = file('../../uploadservice-ftp') 8 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/docs.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Docs improvement 3 | about: Broken link, missing info or misleading info? Let us know! Help us to improve the docs 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | 15 | -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 16dp 5 | 8dp 6 | 48dp 7 | 16sp 8 | 9 | -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 64dp 6 | 7 | -------------------------------------------------------------------------------- /examples/server-php/upload.php: -------------------------------------------------------------------------------- 1 | 0) { 3 | echo "Error: " . $_FILES["uploaded_file"]["error"] . "
"; 4 | } else { 5 | echo "Upload: " . $_FILES["uploaded_file"]["name"] . "
"; 6 | echo "Type: " . $_FILES["uploaded_file"]["type"] . "
"; 7 | echo "Size: " . ($_FILES["uploaded_file"]["size"] / 1024) . " kB
"; 8 | echo "Stored in: " . $_FILES["uploaded_file"]["tmp_name"]; 9 | } 10 | ?> -------------------------------------------------------------------------------- /examples/SimpleMultipartUpload/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | #03a9f4 5 | #0288d1 6 | #40c4ff 7 | #bbdefb 8 | 9 | -------------------------------------------------------------------------------- /examples/SimpleMultipartUpload/app/src/test/java/it/gotev/testapp/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package it.gotev.testapp 2 | 3 | import org.junit.Assert.assertEquals 4 | import org.junit.Test 5 | 6 | /** 7 | * Example local unit test, which will execute on the development machine (host). 8 | * 9 | * See [testing documentation](http://d.android.com/tools/testing). 10 | */ 11 | class ExampleUnitTest { 12 | @Test 13 | fun addition_isCorrect() { 14 | assertEquals(4, 2 + 2) 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /uploadservice-ftp/test-server/vsftpd-osx: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | docker pull fauria/vsftpd 3 | 4 | IPADDR=$(ifconfig en0 | grep "inet " | awk '{print $2}') 5 | PORT=21 6 | 7 | echo "Starting vsftpd on ${IPADDR}:${PORT}" 8 | 9 | docker run -t -i -v $(pwd):/home/vsftpd \ 10 | -p 20:20 -p 21:21 -p 21100-21110:21100-21110 \ 11 | -e FTP_USER=myuser -e FTP_PASS=mypass -e LOG_STDOUT=yes \ 12 | -e PASV_ADDRESS=$IPADDR -e PASV_MIN_PORT=21100 -e PASV_MAX_PORT=21110 \ 13 | fauria/vsftpd 14 | -------------------------------------------------------------------------------- /uploadservice/src/main/java/net/gotev/uploadservice/extensions/CollectionsExtensions.kt: -------------------------------------------------------------------------------- 1 | package net.gotev.uploadservice.extensions 2 | 3 | import net.gotev.uploadservice.data.NameValue 4 | 5 | fun ArrayList.addHeader(name: String, value: String) { 6 | add(NameValue(name, value).validateAsHeader()) 7 | } 8 | 9 | fun LinkedHashMap.setOrRemove(key: String, value: String?) { 10 | if (value == null) { 11 | remove(key) 12 | } else { 13 | this[key] = value 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Supported Versions 4 | 5 | | Version | Supported | 6 | | ------- | ------------------ | 7 | | 4.x.x | :white_check_mark: | 8 | | < 4.0 | :x: | 9 | 10 | ## Reporting a Vulnerability 11 | 12 | Please report (suspected) security vulnerabilities to 13 | **alex@gotev.net**. You will receive a response from 14 | me within 48 hours. If the issue is confirmed, I will release a patch as soon 15 | as possible depending on complexity but historically within a few days. 16 | -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/layout/item_empty.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 12 | 13 | -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/java/net/gotev/uploadservicedemo/extensions/ContextExtensions.kt: -------------------------------------------------------------------------------- 1 | package net.gotev.uploadservicedemo.extensions 2 | 3 | import android.content.Context 4 | import android.content.Intent 5 | import android.net.Uri 6 | import android.view.inputmethod.InputMethodManager 7 | 8 | val Context.inputMethodManager: InputMethodManager 9 | get() = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager 10 | 11 | fun Context.openBrowser(url: String) { 12 | startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url))) 13 | } 14 | -------------------------------------------------------------------------------- /release: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | echo "Releasing on Maven Central ..." 3 | ./gradlew clean test publish -PmavSigning=true -PmavPublishToRemoteRepo=true --max-workers 1 4 | 5 | echo "Generating Demo Apk ..." 6 | version=$(cat manifest.gradle | grep "library_version" | tr "'" '\n' | head -n 2 | tail -n 1) 7 | ./generate-debug-apk 8 | 9 | echo "Creating GitHub Release ..." 10 | hub release create -a uploadservice-demo-debug.apk -m "$version" "$version" 11 | 12 | echo 13 | echo "Done!" 14 | echo "Visit https://oss.sonatype.org/#stagingRepositories and confirm the release" 15 | -------------------------------------------------------------------------------- /uploadservice/src/main/java/net/gotev/uploadservice/placeholders/PlaceholdersProcessor.kt: -------------------------------------------------------------------------------- 1 | package net.gotev.uploadservice.placeholders 2 | 3 | import net.gotev.uploadservice.data.UploadInfo 4 | 5 | interface PlaceholdersProcessor { 6 | /** 7 | * Replace placeholders in a message string. 8 | * @param message string in which to replace placeholders 9 | * @param uploadInfo upload information data 10 | * @return string with replaced placeholders 11 | */ 12 | fun processPlaceholders(message: String?, uploadInfo: UploadInfo): String 13 | } 14 | -------------------------------------------------------------------------------- /uploadservice/src/main/java/net/gotev/uploadservice/observer/request/GlobalRequestObserver.kt: -------------------------------------------------------------------------------- 1 | package net.gotev.uploadservice.observer.request 2 | 3 | import android.app.Application 4 | import net.gotev.uploadservice.data.UploadInfo 5 | 6 | class GlobalRequestObserver @JvmOverloads constructor( 7 | application: Application, 8 | delegate: RequestObserverDelegate, 9 | shouldAcceptEventsFrom: (uploadInfo: UploadInfo) -> Boolean = { true } 10 | ) : BaseRequestObserver(application, delegate, shouldAcceptEventsFrom) { 11 | init { 12 | register() 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /uploadservice/src/main/java/net/gotev/uploadservice/extensions/NotificationManagerExtensions.kt: -------------------------------------------------------------------------------- 1 | package net.gotev.uploadservice.extensions 2 | 3 | import android.app.NotificationManager 4 | import android.os.Build 5 | 6 | internal fun NotificationManager.validateNotificationChannel(channelID: String) { 7 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { 8 | getNotificationChannel(channelID) 9 | ?: throw IllegalArgumentException("The provided notification channel ID $channelID does not exist! You must create it at app startup and before Upload Service!") 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Built application files 2 | build 3 | 4 | # Crashlytics configuations 5 | com_crashlytics_export_strings.xml 6 | 7 | # Local configuration file (sdk path, etc) 8 | local.properties 9 | 10 | # Gradle generated files 11 | .gradle 12 | 13 | # Signing files 14 | .signing 15 | 16 | # User-specific configurations 17 | .idea 18 | *.iml 19 | 20 | # OS-specific files 21 | .DS_Store 22 | .DS_Store? 23 | ._* 24 | .Spotlight-V100 25 | .Trashes 26 | ehthumbs.db 27 | Thumbs.db 28 | 29 | examples/server-nodejs/node_modules 30 | examples/server-nodejs/uploads 31 | npm-debug.log 32 | javadoc 33 | uploadservice-demo-debug.apk 34 | -------------------------------------------------------------------------------- /uploadservice/src/main/java/net/gotev/uploadservice/data/UploadNotificationConfig.kt: -------------------------------------------------------------------------------- 1 | package net.gotev.uploadservice.data 2 | 3 | import android.os.Parcelable 4 | import kotlinx.parcelize.Parcelize 5 | 6 | @Parcelize 7 | class UploadNotificationConfig( 8 | val notificationChannelId: String, 9 | // TODO: study how to apply this to notification channels 10 | val isRingToneEnabled: Boolean, 11 | val progress: UploadNotificationStatusConfig, 12 | val success: UploadNotificationStatusConfig, 13 | val error: UploadNotificationStatusConfig, 14 | val cancelled: UploadNotificationStatusConfig 15 | ) : Parcelable 16 | -------------------------------------------------------------------------------- /examples/server-nodejs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nodejs-upload-server-example", 3 | "version": "1.0.0", 4 | "description": "A simple node.js multipart form upload server", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index.js" 8 | }, 9 | "keywords": [ 10 | "android", 11 | "upload", 12 | "service", 13 | "nodejs", 14 | "form", 15 | "upload", 16 | "server" 17 | ], 18 | "author": "Aleksandar Gotev", 19 | "license": "ISC", 20 | "dependencies": { 21 | "express": "^4.14.0", 22 | "multer": "^1.4.2", 23 | "passport": "^0.3.2", 24 | "passport-http": "^0.3.0" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /uploadservice/src/main/java/net/gotev/uploadservice/network/HttpStack.kt: -------------------------------------------------------------------------------- 1 | package net.gotev.uploadservice.network 2 | 3 | import java.io.IOException 4 | 5 | interface HttpStack { 6 | /** 7 | * Creates a new connection for a given URL and HTTP Method. 8 | * @param uploadId ID of the upload which requested this connection 9 | * @param method HTTP Method 10 | * @param url URL to which to connect to 11 | * @return new connection object 12 | * @throws IOException if an error occurs while creating the connection object 13 | */ 14 | @Throws(IOException::class) 15 | fun newRequest(uploadId: String, method: String, url: String): HttpRequest 16 | } 17 | -------------------------------------------------------------------------------- /examples/app/demoapp/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/alex/workspace/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /.github/stale.yml: -------------------------------------------------------------------------------- 1 | # Number of days of inactivity before an issue becomes stale 2 | daysUntilStale: 60 3 | # Number of days of inactivity before a stale issue is closed 4 | daysUntilClose: 7 5 | # Issues with these labels will never be considered stale 6 | exemptLabels: 7 | - pinned 8 | - security 9 | # Label to use when marking an issue as stale 10 | staleLabel: wontfix 11 | # Comment to post when marking an issue as stale. Set to `false` to disable 12 | markComment: > 13 | This issue has been automatically marked as stale because it has not had 14 | recent activity. It will be closed in 7 days if no further activity occurs. Thank you 15 | for your contributions. 16 | # Comment to post when closing a stale issue. Set to `false` to disable 17 | closeComment: false 18 | -------------------------------------------------------------------------------- /examples/app/.gitignore: -------------------------------------------------------------------------------- 1 | # Built application files 2 | /*/build/ 3 | build 4 | 5 | # Crashlytics configuations 6 | com_crashlytics_export_strings.xml 7 | 8 | # Local configuration file (sdk path, etc) 9 | local.properties 10 | # Gradle generated files 11 | .gradle/ 12 | 13 | # Signing files 14 | .signing/ 15 | 16 | # User-specific configurations 17 | .idea/libraries/ 18 | .idea/workspace.xml 19 | .idea/tasks.xml 20 | .idea/.name 21 | .idea/compiler.xml 22 | .idea/copyright/profiles_settings.xml 23 | .idea/encodings.xml 24 | .idea/misc.xml 25 | .idea/modules.xml 26 | .idea/scopes/scope_settings.xml 27 | .idea/vcs.xml 28 | *.iml 29 | 30 | # OS-specific files 31 | .DS_Store 32 | .DS_Store? 33 | ._* 34 | .Spotlight-V100 35 | .Trashes 36 | ehthumbs.db 37 | Thumbs.db 38 | 39 | -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/java/net/gotev/uploadservicedemo/adapteritems/EmptyItem.kt: -------------------------------------------------------------------------------- 1 | package net.gotev.uploadservicedemo.adapteritems 2 | 3 | import android.view.View 4 | import android.widget.TextView 5 | import net.gotev.recycleradapter.AdapterItem 6 | import net.gotev.recycleradapter.RecyclerAdapterViewHolder 7 | import net.gotev.uploadservicedemo.R 8 | 9 | class EmptyItem(private val text: String) : AdapterItem(text) { 10 | override fun getLayoutId() = R.layout.item_empty 11 | 12 | override fun bind(firstTime: Boolean, holder: Holder) { 13 | holder.textView.text = text 14 | } 15 | 16 | class Holder(itemView: View) : RecyclerAdapterViewHolder(itemView) { 17 | val textView: TextView = itemView.findViewById(R.id.textView) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /uploadservice/src/main/java/net/gotev/uploadservice/extensions/WakeLockExtensions.kt: -------------------------------------------------------------------------------- 1 | package net.gotev.uploadservice.extensions 2 | 3 | import android.content.Context 4 | import android.os.PowerManager 5 | 6 | fun PowerManager.WakeLock?.safeRelease() { 7 | this?.apply { if (isHeld) release() } 8 | } 9 | 10 | fun Context.acquirePartialWakeLock( 11 | currentWakeLock: PowerManager.WakeLock?, 12 | tag: String 13 | ): PowerManager.WakeLock { 14 | if (currentWakeLock?.isHeld == true) { 15 | return currentWakeLock 16 | } 17 | 18 | val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager 19 | 20 | return powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, tag).apply { 21 | setReferenceCounted(false) 22 | if (!isHeld) acquire() 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /uploadservice/src/main/java/net/gotev/uploadservice/data/UploadNotificationAction.kt: -------------------------------------------------------------------------------- 1 | package net.gotev.uploadservice.data 2 | 3 | import android.app.PendingIntent 4 | import android.os.Parcelable 5 | import androidx.core.app.NotificationCompat 6 | import kotlinx.parcelize.Parcelize 7 | 8 | /** 9 | * Class which represents a notification action. 10 | * It is necessary because NotificationCompat.Action is not serializable or Parcelable, thus it's 11 | * not possible to pass it directly in the intents. 12 | */ 13 | @Parcelize 14 | data class UploadNotificationAction( 15 | val icon: Int, 16 | val title: CharSequence, 17 | val intent: PendingIntent 18 | ) : Parcelable { 19 | fun asAction(): NotificationCompat.Action { 20 | return NotificationCompat.Action.Builder(icon, title, intent).build() 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /examples/SimpleMultipartUpload/app/src/androidTest/java/it/gotev/testapp/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package it.gotev.testapp 2 | 3 | import androidx.test.ext.junit.runners.AndroidJUnit4 4 | import androidx.test.platform.app.InstrumentationRegistry 5 | import org.junit.Assert.assertEquals 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | /** 10 | * Instrumented test, which will execute on an Android device. 11 | * 12 | * See [testing documentation](http://d.android.com/tools/testing). 13 | */ 14 | @RunWith(AndroidJUnit4::class) 15 | class ExampleInstrumentedTest { 16 | @Test 17 | fun useAppContext() { 18 | // Context of the app under test. 19 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 20 | assertEquals("it.gotev.testapp", appContext.packageName) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /uploadservice/src/main/java/net/gotev/uploadservice/logger/DefaultLoggerDelegate.kt: -------------------------------------------------------------------------------- 1 | package net.gotev.uploadservice.logger 2 | 3 | import android.util.Log 4 | 5 | class DefaultLoggerDelegate : UploadServiceLogger.Delegate { 6 | 7 | companion object { 8 | private const val TAG = "UploadService" 9 | } 10 | 11 | override fun error(component: String, uploadId: String, message: String, exception: Throwable?) { 12 | Log.e(TAG, "$component - (uploadId: $uploadId) - $message", exception) 13 | } 14 | 15 | override fun debug(component: String, uploadId: String, message: String) { 16 | Log.i(TAG, "$component - (uploadId: $uploadId) - $message") 17 | } 18 | 19 | override fun info(component: String, uploadId: String, message: String) { 20 | Log.i(TAG, "$component - (uploadId: $uploadId) - $message") 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /examples/SimpleMultipartUpload/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /uploadservice/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /uploadservice/src/main/java/net/gotev/uploadservice/schemehandlers/SchemeHandler.kt: -------------------------------------------------------------------------------- 1 | package net.gotev.uploadservice.schemehandlers 2 | 3 | import android.content.Context 4 | import java.io.InputStream 5 | 6 | interface SchemeHandler { 7 | /** 8 | * Initialize instance with file path. 9 | */ 10 | fun init(path: String) 11 | 12 | /** 13 | * Gets file size in bytes. 14 | */ 15 | fun size(context: Context): Long 16 | 17 | /** 18 | * Gets file input stream to read it. 19 | */ 20 | fun stream(context: Context): InputStream 21 | 22 | /** 23 | * Gets file content type. 24 | */ 25 | fun contentType(context: Context): String 26 | 27 | /** 28 | * Gets file name. 29 | */ 30 | fun name(context: Context): String 31 | 32 | /** 33 | * Deletes the file. 34 | */ 35 | fun delete(context: Context): Boolean 36 | } 37 | -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/java/net/gotev/uploadservicedemo/CustomPlaceholdersProcessor.kt: -------------------------------------------------------------------------------- 1 | package net.gotev.uploadservicedemo 2 | 3 | import net.gotev.uploadservice.data.UploadInfo 4 | import net.gotev.uploadservice.placeholders.DefaultPlaceholdersProcessor 5 | 6 | class CustomPlaceholdersProcessor : DefaultPlaceholdersProcessor() { 7 | companion object { 8 | const val FILENAME_PLACEHOLDER = "[[FILENAME]]" 9 | } 10 | 11 | override fun processPlaceholders(message: String?, uploadInfo: UploadInfo): String { 12 | val processedMessage = super.processPlaceholders(message, uploadInfo) 13 | 14 | // if you have more than one file, change this accordingly to your needs 15 | val fileName = 16 | uploadInfo.files.firstOrNull()?.properties?.get("multipartRemoteFileName") ?: "" 17 | 18 | return processedMessage.replace(FILENAME_PLACEHOLDER, fileName) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/res/layout/dialog_add_file_parameter_name.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 16 | 17 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /uploadservice-okhttp/src/main/java/net/gotev/uploadservice/okhttp/OkHttpExtensions.kt: -------------------------------------------------------------------------------- 1 | package net.gotev.uploadservice.okhttp 2 | 3 | import net.gotev.uploadservice.network.ServerResponse 4 | import okhttp3.Response 5 | 6 | /** 7 | * @author Aleksandar Gotev 8 | */ 9 | private fun String.requiresRequestBody() = 10 | this == "POST" || this == "PUT" || this == "PATCH" || this == "PROPPATCH" || this == "REPORT" 11 | 12 | private fun String.permitsRequestBody() = !(this == "GET" || this == "HEAD") 13 | 14 | internal fun String.hasBody(): Boolean { 15 | val method = trim().uppercase() 16 | return method.permitsRequestBody() || method.requiresRequestBody() 17 | } 18 | 19 | private fun Response.headersHashMap() = LinkedHashMap(headers.toMap()) 20 | 21 | private fun Response.bodyBytes() = body?.bytes() ?: ByteArray(0) 22 | 23 | internal fun Response.asServerResponse() = ServerResponse(code, bodyBytes(), headersHashMap()) 24 | -------------------------------------------------------------------------------- /uploadservice/src/main/java/net/gotev/uploadservice/network/hurl/HurlBodyWriter.kt: -------------------------------------------------------------------------------- 1 | package net.gotev.uploadservice.network.hurl 2 | 3 | import java.io.IOException 4 | import java.io.OutputStream 5 | import net.gotev.uploadservice.network.BodyWriter 6 | 7 | class HurlBodyWriter(private val stream: OutputStream, listener: OnStreamWriteListener) : 8 | BodyWriter(listener) { 9 | @Throws(IOException::class) 10 | override fun internalWrite(bytes: ByteArray) { 11 | stream.write(bytes) 12 | } 13 | 14 | @Throws(IOException::class) 15 | override fun internalWrite(bytes: ByteArray, lengthToWriteFromStart: Int) { 16 | stream.write(bytes, 0, lengthToWriteFromStart) 17 | } 18 | 19 | @Throws(IOException::class) 20 | override fun flush() { 21 | stream.flush() 22 | } 23 | 24 | @Throws(IOException::class) 25 | override fun close() { 26 | stream.close() 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /examples/app/demoapp/src/main/java/net/gotev/uploadservicedemo/extensions/StringExtensions.kt: -------------------------------------------------------------------------------- 1 | package net.gotev.uploadservicedemo.extensions 2 | 3 | import java.util.regex.Pattern 4 | 5 | private val ipAddressPattern by lazy { 6 | Pattern.compile("^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$") 7 | } 8 | 9 | private val hostnamePattern by lazy { 10 | Pattern.compile("^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\-]*[A-Za-z0-9])$") 11 | } 12 | 13 | fun String?.isValidIPAddress(): Boolean = if (isNullOrBlank()) 14 | false 15 | else 16 | ipAddressPattern.matcher(this).matches() 17 | 18 | fun String?.isValidHostname(): Boolean = if (isNullOrBlank()) 19 | false 20 | else 21 | hostnamePattern.matcher(this).matches() 22 | 23 | fun String?.isValidIPorHostname(): Boolean = isValidIPAddress() || isValidHostname() 24 | -------------------------------------------------------------------------------- /examples/SimpleMultipartUpload/app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 |