diff options
author | Anonymous <no-reply@google.com> | 2021-07-09 16:55:01 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2021-07-09 16:55:01 +0000 |
commit | f77c53c3a34a3e52bbe132e24735ec2bab9f7cee (patch) | |
tree | cf5d56ccdb862fd9676c855f919408ef940bc019 | |
parent | b47af415ba74754b442c1f9f3960b29537d07e6e (diff) | |
parent | 212e7004acfdce76c900fd97070e2e5e8476be20 (diff) | |
download | volley-f77c53c3a34a3e52bbe132e24735ec2bab9f7cee.tar.gz |
Import of Volley from GitHub to AOSP. am: 212e7004ac
Original change: https://android-review.googlesource.com/c/platform/external/volley/+/1758419
Change-Id: I7e5a57dbc305b55fc03388a51b71daaaa7b10a16
-rw-r--r-- | .github/workflows/gradle-build.yaml | 28 | ||||
-rw-r--r-- | .travis.yml | 41 | ||||
-rw-r--r-- | Android.bp | 3 | ||||
-rw-r--r-- | bintray.gradle | 78 | ||||
-rw-r--r-- | build.gradle | 104 | ||||
-rw-r--r-- | core/build.gradle | 28 | ||||
-rw-r--r-- | core/consumer-proguard-rules.pro (renamed from consumer-proguard-rules.pro) | 0 | ||||
-rw-r--r-- | core/src/main/AndroidManifest.xml (renamed from src/main/AndroidManifest.xml) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/AsyncCache.java (renamed from src/main/java/com/android/volley/AsyncCache.java) | 7 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/AsyncNetwork.java (renamed from src/main/java/com/android/volley/AsyncNetwork.java) | 7 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/AsyncRequestQueue.java (renamed from src/main/java/com/android/volley/AsyncRequestQueue.java) | 124 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/AuthFailureError.java (renamed from src/main/java/com/android/volley/AuthFailureError.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/Cache.java (renamed from src/main/java/com/android/volley/Cache.java) | 12 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/CacheDispatcher.java (renamed from src/main/java/com/android/volley/CacheDispatcher.java) | 10 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/ClientError.java (renamed from src/main/java/com/android/volley/ClientError.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/DefaultRetryPolicy.java (renamed from src/main/java/com/android/volley/DefaultRetryPolicy.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/ExecutorDelivery.java (renamed from src/main/java/com/android/volley/ExecutorDelivery.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/Header.java (renamed from src/main/java/com/android/volley/Header.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/Network.java (renamed from src/main/java/com/android/volley/Network.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/NetworkDispatcher.java (renamed from src/main/java/com/android/volley/NetworkDispatcher.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/NetworkError.java (renamed from src/main/java/com/android/volley/NetworkError.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/NetworkResponse.java (renamed from src/main/java/com/android/volley/NetworkResponse.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/NoConnectionError.java (renamed from src/main/java/com/android/volley/NoConnectionError.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/ParseError.java (renamed from src/main/java/com/android/volley/ParseError.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/Request.java (renamed from src/main/java/com/android/volley/Request.java) | 12 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/RequestQueue.java (renamed from src/main/java/com/android/volley/RequestQueue.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/RequestTask.java (renamed from src/main/java/com/android/volley/RequestTask.java) | 7 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/Response.java (renamed from src/main/java/com/android/volley/Response.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/ResponseDelivery.java (renamed from src/main/java/com/android/volley/ResponseDelivery.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/RetryPolicy.java (renamed from src/main/java/com/android/volley/RetryPolicy.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/ServerError.java (renamed from src/main/java/com/android/volley/ServerError.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/TimeoutError.java (renamed from src/main/java/com/android/volley/TimeoutError.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/VolleyError.java (renamed from src/main/java/com/android/volley/VolleyError.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/VolleyLog.java (renamed from src/main/java/com/android/volley/VolleyLog.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/WaitingRequestManager.java (renamed from src/main/java/com/android/volley/WaitingRequestManager.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/toolbox/AdaptedHttpStack.java (renamed from src/main/java/com/android/volley/toolbox/AdaptedHttpStack.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/toolbox/AndroidAuthenticator.java (renamed from src/main/java/com/android/volley/toolbox/AndroidAuthenticator.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/toolbox/AsyncHttpStack.java (renamed from src/main/java/com/android/volley/toolbox/AsyncHttpStack.java) | 7 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/toolbox/Authenticator.java (renamed from src/main/java/com/android/volley/toolbox/Authenticator.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/toolbox/BaseHttpStack.java (renamed from src/main/java/com/android/volley/toolbox/BaseHttpStack.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/toolbox/BasicAsyncNetwork.java (renamed from src/main/java/com/android/volley/toolbox/BasicAsyncNetwork.java) | 42 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/toolbox/BasicNetwork.java (renamed from src/main/java/com/android/volley/toolbox/BasicNetwork.java) | 8 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/toolbox/ByteArrayPool.java (renamed from src/main/java/com/android/volley/toolbox/ByteArrayPool.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/toolbox/ClearCacheRequest.java (renamed from src/main/java/com/android/volley/toolbox/ClearCacheRequest.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/toolbox/DiskBasedCache.java (renamed from src/main/java/com/android/volley/toolbox/DiskBasedCache.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/toolbox/FileSupplier.java (renamed from src/main/java/com/android/volley/toolbox/FileSupplier.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/toolbox/HttpClientStack.java (renamed from src/main/java/com/android/volley/toolbox/HttpClientStack.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/toolbox/HttpHeaderParser.java (renamed from src/main/java/com/android/volley/toolbox/HttpHeaderParser.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/toolbox/HttpResponse.java (renamed from src/main/java/com/android/volley/toolbox/HttpResponse.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/toolbox/HttpStack.java (renamed from src/main/java/com/android/volley/toolbox/HttpStack.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/toolbox/HurlStack.java (renamed from src/main/java/com/android/volley/toolbox/HurlStack.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/toolbox/ImageLoader.java (renamed from src/main/java/com/android/volley/toolbox/ImageLoader.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/toolbox/ImageRequest.java (renamed from src/main/java/com/android/volley/toolbox/ImageRequest.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/toolbox/JsonArrayRequest.java (renamed from src/main/java/com/android/volley/toolbox/JsonArrayRequest.java) | 7 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/toolbox/JsonObjectRequest.java (renamed from src/main/java/com/android/volley/toolbox/JsonObjectRequest.java) | 37 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/toolbox/JsonRequest.java (renamed from src/main/java/com/android/volley/toolbox/JsonRequest.java) | 10 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/toolbox/NetworkImageView.java (renamed from src/main/java/com/android/volley/toolbox/NetworkImageView.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/toolbox/NetworkUtility.java (renamed from src/main/java/com/android/volley/toolbox/NetworkUtility.java) | 62 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/toolbox/NoAsyncCache.java (renamed from src/main/java/com/android/volley/toolbox/NoAsyncCache.java) | 7 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/toolbox/NoCache.java (renamed from src/main/java/com/android/volley/toolbox/NoCache.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/toolbox/PoolingByteArrayOutputStream.java (renamed from src/main/java/com/android/volley/toolbox/PoolingByteArrayOutputStream.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/toolbox/RequestFuture.java (renamed from src/main/java/com/android/volley/toolbox/RequestFuture.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/toolbox/StringRequest.java (renamed from src/main/java/com/android/volley/toolbox/StringRequest.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/toolbox/Threads.java (renamed from src/main/java/com/android/volley/toolbox/Threads.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/toolbox/UrlRewriter.java (renamed from src/main/java/com/android/volley/toolbox/UrlRewriter.java) | 0 | ||||
-rw-r--r-- | core/src/main/java/com/android/volley/toolbox/Volley.java (renamed from src/main/java/com/android/volley/toolbox/Volley.java) | 5 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/AsyncRequestQueueTest.java (renamed from src/test/java/com/android/volley/AsyncRequestQueueTest.java) | 88 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/CacheDispatcherTest.java (renamed from src/test/java/com/android/volley/CacheDispatcherTest.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/NetworkDispatcherTest.java (renamed from src/test/java/com/android/volley/NetworkDispatcherTest.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/NetworkResponseTest.java (renamed from src/test/java/com/android/volley/NetworkResponseTest.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/RequestQueueIntegrationTest.java (renamed from src/test/java/com/android/volley/RequestQueueIntegrationTest.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/RequestQueueTest.java (renamed from src/test/java/com/android/volley/RequestQueueTest.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/RequestTest.java (renamed from src/test/java/com/android/volley/RequestTest.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/ResponseDeliveryTest.java (renamed from src/test/java/com/android/volley/ResponseDeliveryTest.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/mock/MockAsyncStack.java (renamed from src/test/java/com/android/volley/mock/MockAsyncStack.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/mock/MockHttpStack.java (renamed from src/test/java/com/android/volley/mock/MockHttpStack.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/mock/MockRequest.java (renamed from src/test/java/com/android/volley/mock/MockRequest.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/mock/ShadowSystemClock.java (renamed from src/test/java/com/android/volley/mock/ShadowSystemClock.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/toolbox/AdaptedHttpStackTest.java (renamed from src/test/java/com/android/volley/toolbox/AdaptedHttpStackTest.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/toolbox/AndroidAuthenticatorTest.java (renamed from src/test/java/com/android/volley/toolbox/AndroidAuthenticatorTest.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/toolbox/BaseHttpStackTest.java (renamed from src/test/java/com/android/volley/toolbox/BaseHttpStackTest.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/toolbox/BasicAsyncNetworkTest.java (renamed from src/test/java/com/android/volley/toolbox/BasicAsyncNetworkTest.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/toolbox/BasicNetworkTest.java (renamed from src/test/java/com/android/volley/toolbox/BasicNetworkTest.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/toolbox/ByteArrayPoolTest.java (renamed from src/test/java/com/android/volley/toolbox/ByteArrayPoolTest.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/toolbox/CacheTest.java (renamed from src/test/java/com/android/volley/toolbox/CacheTest.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/toolbox/DiskBasedCacheTest.java (renamed from src/test/java/com/android/volley/toolbox/DiskBasedCacheTest.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/toolbox/HttpClientStackTest.java (renamed from src/test/java/com/android/volley/toolbox/HttpClientStackTest.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/toolbox/HttpHeaderParserTest.java (renamed from src/test/java/com/android/volley/toolbox/HttpHeaderParserTest.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/toolbox/HttpStackConformanceTest.java (renamed from src/test/java/com/android/volley/toolbox/HttpStackConformanceTest.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/toolbox/HurlStackTest.java (renamed from src/test/java/com/android/volley/toolbox/HurlStackTest.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/toolbox/ImageLoaderTest.java (renamed from src/test/java/com/android/volley/toolbox/ImageLoaderTest.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/toolbox/ImageRequestTest.java (renamed from src/test/java/com/android/volley/toolbox/ImageRequestTest.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/toolbox/JsonRequestCharsetTest.java (renamed from src/test/java/com/android/volley/toolbox/JsonRequestCharsetTest.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/toolbox/JsonRequestTest.java (renamed from src/test/java/com/android/volley/toolbox/JsonRequestTest.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/toolbox/NetworkImageViewTest.java (renamed from src/test/java/com/android/volley/toolbox/NetworkImageViewTest.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/toolbox/PoolingByteArrayOutputStreamTest.java (renamed from src/test/java/com/android/volley/toolbox/PoolingByteArrayOutputStreamTest.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/toolbox/RequestFutureTest.java (renamed from src/test/java/com/android/volley/toolbox/RequestFutureTest.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/toolbox/RequestQueueTest.java (renamed from src/test/java/com/android/volley/toolbox/RequestQueueTest.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/toolbox/RequestTest.java (renamed from src/test/java/com/android/volley/toolbox/RequestTest.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/toolbox/ResponseTest.java (renamed from src/test/java/com/android/volley/toolbox/ResponseTest.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/toolbox/StringRequestTest.java (renamed from src/test/java/com/android/volley/toolbox/StringRequestTest.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/utils/CacheTestUtils.java (renamed from src/test/java/com/android/volley/utils/CacheTestUtils.java) | 0 | ||||
-rw-r--r-- | core/src/test/java/com/android/volley/utils/ImmediateResponseDelivery.java (renamed from src/test/java/com/android/volley/utils/ImmediateResponseDelivery.java) | 0 | ||||
-rw-r--r-- | core/src/test/resources/org.robolectric.Config.properties (renamed from src/test/resources/org.robolectric.Config.properties) | 0 | ||||
-rw-r--r-- | cronet/build.gradle | 24 | ||||
-rw-r--r-- | cronet/src/main/AndroidManifest.xml | 2 | ||||
-rw-r--r-- | cronet/src/main/java/com/android/volley/cronet/CronetHttpStack.java (renamed from src/main/java/com/android/volley/cronet/CronetHttpStack.java) | 3 | ||||
-rw-r--r-- | cronet/src/test/java/com/android/volley/cronet/CronetHttpStackTest.java (renamed from src/test/java/com/android/volley/cronet/CronetHttpStackTest.java) | 0 | ||||
-rwxr-xr-x | publish-snapshot-on-commit.sh | 16 | ||||
-rw-r--r-- | publish.gradle | 72 | ||||
-rw-r--r-- | rules.gradle | 36 | ||||
-rw-r--r-- | settings.gradle | 4 | ||||
-rw-r--r-- | testing/build.gradle | 4 | ||||
-rw-r--r-- | testing/src/main/AndroidManifest.xml | 2 | ||||
-rw-r--r-- | testing/src/main/java/com/android/volley/mock/TestRequest.java (renamed from src/test/java/com/android/volley/mock/TestRequest.java) | 0 |
115 files changed, 560 insertions, 337 deletions
diff --git a/.github/workflows/gradle-build.yaml b/.github/workflows/gradle-build.yaml new file mode 100644 index 0000000..c42648c --- /dev/null +++ b/.github/workflows/gradle-build.yaml @@ -0,0 +1,28 @@ +name: Gradle + +on: [push, pull_request] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + - name: Cache Gradle packages + uses: actions/cache@v2 + with: + path: ~/.gradle/caches + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} + restore-keys: ${{ runner.os }}-gradle + - name: Build with Gradle + run: ./gradlew --continue verifyGoogleJavaFormat build connectedCheck + - name: Publish snapshot + if: github.event_name == 'push' + env: + OSSRH_DEPLOY_USERNAME: ${{ secrets.OSSRH_DEPLOY_USERNAME }} + OSSRH_DEPLOY_PASSWORD: ${{ secrets.OSSRH_DEPLOY_PASSWORD }} + run: ./publish-snapshot-on-commit.sh diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index fb6481a..0000000 --- a/.travis.yml +++ /dev/null @@ -1,41 +0,0 @@ -language: android -android: - licenses: - - 'android-sdk-preview-license-.+' - - 'android-sdk-license-.+' - - 'google-gdk-license-.+' - - components: - # Workaround to be able to install v28 SDK and build tools. - # See https://github.com/travis-ci/travis-ci/issues/6040 - - tools # to update the repository XML files - - tools # to update the SDK tools themselves - - - platform-tools - - build-tools-28.0.3 - - android-28 - -jdk: - - oraclejdk8 - -# Avoid uploading the cache after every build -# See https://docs.travis-ci.com/user/languages/android/ -before_cache: - - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock - - rm -fr $HOME/.gradle/caches/*/plugin-resolution/ - - rm -fr $HOME/.gradle/caches/*/classAnalysis/ - - rm -fr $HOME/.gradle/caches/*/workerMain/ -cache: - directories: - - $HOME/.gradle/caches/ - - $HOME/.gradle/wrapper/ - - $HOME/.android/build-cache - -env: - global: - - secure: "ObTSgg1H/RoQwhf9735Cr0OEs7r296aQTKiVOmQYSIxZPzc7o2KveSVV8IVeQ+VQtDxPFij6Odk4gaQSKVytliTlgtSsrEaYt67yWWYLWBLWbnzLNYoWMMy+36O5BK78RNtVJ3Xr1mdMcZ2+SRj2TcEvQBqMWlUkJfEcmJttreq0Wd7jiNitv5MbyYRcd2AvKaqNilx5rEm1ihbE0wT3lH20EdAjjjckaBT04r+VXU9e0dg6tmZjqG8dxGzxYHLRTz7nmKXlUnOJ3steNPrmR/AsGqKW6Ppowi31t3iLpL3zdT0+mvzfvnQwBodqHWSU/JhVDGlePv+4a5aU80s+5nN1IKL7tTLGYWoKdoIuQLovRkdcdkuj8UNyftPj6qOO2C9Tk8j64WXwUIDRnmNfjXbFzqN51oiT94G6hPcEDQSxLwuqlmgNm9I9WxZidb5YotIN2BcIKthAvdL4ecxE5INJvss8DVdYUZ53000GqSoMv8WET6jYkSJPKfvmTgpqqYIW0sgMiDfO/ta/MTFG5kSqECL+sAFZNmugwmTc7NIdy29myCyLH/A6oM4n3QeFDDHhOl2cRYlsX3juzw2goRppR9sEosFN0D1T7Fije5RmJsPgVLGwYMxSGukAHufcatKfhccUVl+haSJ3PLQ1z+25Ug2kpJwMAHbUYWCBnew=" - - secure: "Ac95rbJd5dgNdK8ZlaeXpkKYXHGNj8pm4eNv1Oe8YtsByshHtBAK1m55H4Ex55oRXaLXntvQwnnJfqeTDPuqvd7QP1fjvp4Yjdaqa8MkC6qdVtm6LaqsGuE38uSiU6oxJKfnlCywNe2LfFlbzBtPd3ejNI7tfJcO3s1mD2aBT46vmwUy0t5ESxNdP2zUs6DFcbaOUWeJhQn8iNdRm2VbHEMdevzvvXXIUB9YUdBZQIuAZ5E8NRP5/dzPE8P0CY6/yXqQ/6bkXRV3Pf9QsRzJ+oEQVJAIFfC4JAGasgaBIVpaJ2C2At39jrNFpGYUNbHxvkBEal+WiaPk5TfmVbpyWJOTPRaaY3tIRdBbYf6kklnQk2jRJB6GCi4/yvT6oNjTQQEwsuYlaivkibwNehQqtqyjj12CcTI7lwbgNXeLvIWE6LNLIxrY4pnNy3bKjA0oLFoG/FuP3Wi9WldBtVXwvUBVFFXeOgzP6lCDkzGYTwYZi20lRmSgma3Q5e3/BbPtos3BZ9dSY3lUjttGxvHEDCJ48U1aw6usR91ZKD78Thb5OxWLkvs4rjWEDU2I649wiYSyqFldNEnv+2SJSRB+097XEcnCopGXorlMhBMAlhwHyiRY1u0D+9qrpfIl9Z07j0ZiG5uIscDXQZZjMivqe/+u8NJ3kN0zrDO5BQEgNls=" - -# Publish a SNAPSHOT build for all commits to master. -script: - - ./gradlew --continue verifyGoogleJavaFormat build connectedCheck && ./publish-snapshot-on-commit.sh @@ -36,11 +36,10 @@ java_library { name: "volley", sdk_version: "28", min_sdk_version: "8", - srcs: ["src/main/java/**/*.java"], + srcs: ["core/src/main/java/**/*.java"], // Exclude Cronet support for now. Can be enabled later if/when Cronet is made available as a // compilation dependency for Volley clients. - exclude_srcs: ["src/main/java/com/android/volley/cronet/**/*"], libs: [ // Only needed at compile-time. diff --git a/bintray.gradle b/bintray.gradle deleted file mode 100644 index b642b41..0000000 --- a/bintray.gradle +++ /dev/null @@ -1,78 +0,0 @@ -buildscript { - repositories { - jcenter() - } - dependencies { - classpath "org.jfrog.buildinfo:build-info-extractor-gradle:4.8.1" - } -} - -// apply the plugin with its class name rather than its Id to work around gradle limitation of -// not being able to find the plugin by Id despite the dependencies being added right above. Gradle -// is currently not capable of loading plugins by Id if the dependency is anywhere else than -// in the main project build.gradle. This file is "imported" into the project's build.gradle -// through a "apply from:". -apply plugin: org.jfrog.gradle.plugin.artifactory.ArtifactoryPlugin -apply plugin: 'maven-publish' - -task sourcesJar(type: Jar) { - classifier = 'sources' - from android.sourceSets.main.java.srcDirs -} - -task javadoc(type: Javadoc) { - source = android.sourceSets.main.java.srcDirs - classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) -} - -task javadocJar(type: Jar, dependsOn: javadoc) { - classifier = 'javadoc' - from javadoc.destinationDir -} - -artifacts { - archives javadocJar - archives sourcesJar -} - -publishing { - publications { - library(MavenPublication) { - groupId 'com.android.volley' - artifactId 'volley' - version project.version - pom { - packaging 'aar' - licenses { - license { - name = "The Apache License, Version 2.0" - url = "http://www.apache.org/licenses/LICENSE-2.0.txt" - } - } - } - - // Release AAR, Sources, and JavaDoc - artifact "$buildDir/outputs/aar/volley-release.aar" - artifact sourcesJar - artifact javadocJar - } - } -} - -artifactory { - contextUrl = "https://oss.jfrog.org" - publish { - repository { - repoKey = 'oss-snapshot-local' - username = System.env.CI_DEPLOY_USERNAME - password = System.env.CI_DEPLOY_PASSWORD - } - defaults { - publications('library') - publishArtifacts = true - } - } - resolve { - repoKey = 'jcenter' - } -} diff --git a/build.gradle b/build.gradle index 544771c..b8db952 100644 --- a/build.gradle +++ b/build.gradle @@ -1,76 +1,72 @@ -// NOTE: The only changes that belong in this file are the definitions -// of tool versions (gradle plugin, compile SDK, build tools), so that -// Volley can be built via gradle as a standalone project. -// -// Any other changes to the build config belong in rules.gradle, which -// is used by projects that depend on Volley but define their own -// tools versions across all dependencies to ensure a consistent build. -// -// Most users should just add this line to settings.gradle: -// include(":volley") -// -// If you have a more complicated Gradle setup you can choose to use -// this instead: -// include(":volley") -// project(':volley').buildFileName = 'rules.gradle' - -import net.ltgt.gradle.errorprone.CheckSeverity - buildscript { repositories { + gradlePluginPortal() jcenter() google() } dependencies { classpath 'com.android.tools.build:gradle:3.2.1' + classpath 'gradle.plugin.com.github.sherter.google-java-format:google-java-format-gradle-plugin:0.6' + // NOTE: 0.7 or newer will require upgrading to a newer Android gradle plugin: + // https://github.com/tbroyer/gradle-errorprone-plugin/commit/65b1026ebeae1b7ed8c28578c7f6eea512c16bea + classpath 'net.ltgt.errorprone:net.ltgt.errorprone.gradle.plugin:0.6.1' } } -plugins { - id "com.github.sherter.google-java-format" version "0.6" - // NOTE: 0.7 or newer will require upgrading to a newer Android gradle plugin: - // https://github.com/tbroyer/gradle-errorprone-plugin/commit/65b1026ebeae1b7ed8c28578c7f6eea512c16bea - id "net.ltgt.errorprone" version "0.6.1" +allprojects { + repositories { + jcenter() + google() + } } -googleJavaFormat { - toolVersion = '1.5' - options style: 'AOSP' -} +subprojects { + apply plugin: 'com.github.sherter.google-java-format' + apply plugin: 'net.ltgt.errorprone' -apply plugin: 'com.android.library' + googleJavaFormat { + toolVersion = '1.5' + options style: 'AOSP' + } -repositories { - jcenter() - google() -} + apply plugin: 'com.android.library' -dependencies { - // NOTE: Updating ErrorProne introduces new checks that may cause the build to fail. Pin to a - // specific version to control these updates. - errorprone("com.google.errorprone:error_prone_core:2.3.2") - // ErrorProne requires a JDK 9 compiler, so pull one in as a dependency since we use Java 8: - // https://github.com/tbroyer/gradle-errorprone-plugin#jdk-8-support - errorproneJavac("com.google.errorprone:javac:9+181-r4173-1") -} + dependencies { + // NOTE: Updating ErrorProne introduces new checks that may cause the build to fail. Pin to a + // specific version to control these updates. + errorprone("com.google.errorprone:error_prone_core:2.3.2") + // ErrorProne requires a JDK 9 compiler, so pull one in as a dependency since we use Java 8: + // https://github.com/tbroyer/gradle-errorprone-plugin#jdk-8-support + errorproneJavac("com.google.errorprone:javac:9+181-r4173-1") + } + + group = 'com.android.volley' + version = '1.2.1-SNAPSHOT' + + android { + useLibrary 'org.apache.http.legacy' -group = 'com.android.volley' -version = '1.2.0-SNAPSHOT' + compileSdkVersion 28 + buildToolsVersion = '28.0.3' -android { - compileSdkVersion 28 - buildToolsVersion = '28.0.3' + defaultConfig { + minSdkVersion 8 + } - defaultConfig { - minSdkVersion 8 + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_7 + targetCompatibility JavaVersion.VERSION_1_7 + } } -} -tasks.withType(JavaCompile) { - options.errorprone { - check("ParameterComment", CheckSeverity.ERROR) + tasks.withType(JavaCompile) { + options.errorprone { + check("ParameterComment", net.ltgt.gradle.errorprone.CheckSeverity.ERROR) + } + options.compilerArgs << "-Xlint:unchecked" << "-Werror" } -} -apply from: 'rules.gradle' -apply from: 'bintray.gradle' + if (it.name != 'testing') { + apply from: '../publish.gradle' + } +} diff --git a/core/build.gradle b/core/build.gradle new file mode 100644 index 0000000..812968c --- /dev/null +++ b/core/build.gradle @@ -0,0 +1,28 @@ +android { + defaultConfig { + consumerProguardFiles 'consumer-proguard-rules.pro' + } +} + +dependencies { + implementation "androidx.annotation:annotation:1.0.1" + + testImplementation project(":testing") + testImplementation "junit:junit:4.12" + testImplementation "org.hamcrest:hamcrest-library:1.3" + testImplementation "org.mockito:mockito-core:2.19.0" + testImplementation "org.robolectric:robolectric:3.4.2" +} + +publishing { + publications { + library(MavenPublication) { + artifactId 'volley' + pom { + name = 'Volley' + description = 'An HTTP library that makes networking for Android apps easier and, most importantly, faster.' + } + artifact "$buildDir/outputs/aar/core-release.aar" + } + } +} diff --git a/consumer-proguard-rules.pro b/core/consumer-proguard-rules.pro index 38d2cf1..38d2cf1 100644 --- a/consumer-proguard-rules.pro +++ b/core/consumer-proguard-rules.pro diff --git a/src/main/AndroidManifest.xml b/core/src/main/AndroidManifest.xml index ba3a2a7..ba3a2a7 100644 --- a/src/main/AndroidManifest.xml +++ b/core/src/main/AndroidManifest.xml diff --git a/src/main/java/com/android/volley/AsyncCache.java b/core/src/main/java/com/android/volley/AsyncCache.java index 3cddb4b..8b2dbcc 100644 --- a/src/main/java/com/android/volley/AsyncCache.java +++ b/core/src/main/java/com/android/volley/AsyncCache.java @@ -18,7 +18,12 @@ package com.android.volley; import androidx.annotation.Nullable; -/** Asynchronous equivalent to the {@link Cache} interface. */ +/** + * Asynchronous equivalent to the {@link Cache} interface. + * + * <p><b>WARNING</b>: This API is experimental and subject to breaking changes. Please see + * https://github.com/google/volley/wiki/Asynchronous-Volley for more details. + */ public abstract class AsyncCache { public interface OnGetCompleteCallback { diff --git a/src/main/java/com/android/volley/AsyncNetwork.java b/core/src/main/java/com/android/volley/AsyncNetwork.java index ad19c03..47f35ea 100644 --- a/src/main/java/com/android/volley/AsyncNetwork.java +++ b/core/src/main/java/com/android/volley/AsyncNetwork.java @@ -22,7 +22,12 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.atomic.AtomicReference; -/** An asynchronous implementation of {@link Network} to perform requests. */ +/** + * An asynchronous implementation of {@link Network} to perform requests. + * + * <p><b>WARNING</b>: This API is experimental and subject to breaking changes. Please see + * https://github.com/google/volley/wiki/Asynchronous-Volley for more details. + */ public abstract class AsyncNetwork implements Network { private ExecutorService mBlockingExecutor; private ExecutorService mNonBlockingExecutor; diff --git a/src/main/java/com/android/volley/AsyncRequestQueue.java b/core/src/main/java/com/android/volley/AsyncRequestQueue.java index 3754866..7bf8c21 100644 --- a/src/main/java/com/android/volley/AsyncRequestQueue.java +++ b/core/src/main/java/com/android/volley/AsyncRequestQueue.java @@ -25,9 +25,10 @@ import com.android.volley.AsyncCache.OnGetCompleteCallback; import com.android.volley.AsyncNetwork.OnRequestComplete; import com.android.volley.Cache.Entry; import java.net.HttpURLConnection; +import java.util.ArrayList; import java.util.Comparator; +import java.util.List; import java.util.concurrent.BlockingQueue; -import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.PriorityBlockingQueue; @@ -41,7 +42,10 @@ import java.util.concurrent.TimeUnit; * An asynchronous request dispatch queue. * * <p>Add requests to the queue with {@link #add(Request)}. Once completed, responses will be - * delivered on the main thread (unless a custom {@link ResponseDelivery} has been provided) + * delivered on the main thread (unless a custom {@link ResponseDelivery} has been provided). + * + * <p><b>WARNING</b>: This API is experimental and subject to breaking changes. Please see + * https://github.com/google/volley/wiki/Asynchronous-Volley for more details. */ public class AsyncRequestQueue extends RequestQueue { /** Default number of blocking threads to start. */ @@ -83,6 +87,17 @@ public class AsyncRequestQueue extends RequestQueue { private final WaitingRequestManager mWaitingRequestManager = new WaitingRequestManager(this); /** + * Requests which have been queued before cache initialization has completed. + * + * <p>These requests are kicked off once cache initialization finishes. We avoid enqueuing them + * sooner as the cache may not yet be ready. + */ + private final List<Request<?>> mRequestsAwaitingCacheInitialization = new ArrayList<>(); + + private volatile boolean mIsCacheInitialized = false; + private final Object mCacheInitializationLock = new Object[0]; + + /** * Sets all the variables, but processing does not begin until {@link #start()} is called. * * @param cache to use for persisting responses to disk. If an AsyncCache was provided, then @@ -119,34 +134,37 @@ public class AsyncRequestQueue extends RequestQueue { mNetwork.setNonBlockingExecutor(mNonBlockingExecutor); mNetwork.setNonBlockingScheduledExecutor(mNonBlockingScheduledExecutor); - mNonBlockingExecutor.execute( - new Runnable() { - @Override - public void run() { - // This is intentionally blocking, because we don't want to process any - // requests until the cache is initialized. - if (mAsyncCache != null) { - final CountDownLatch latch = new CountDownLatch(1); + // Kick off cache initialization, which must complete before any requests can be processed. + if (mAsyncCache != null) { + mNonBlockingExecutor.execute( + new Runnable() { + @Override + public void run() { mAsyncCache.initialize( new AsyncCache.OnWriteCompleteCallback() { @Override public void onWriteComplete() { - latch.countDown(); + onCacheInitializationComplete(); } }); - try { - latch.await(); - } catch (InterruptedException e) { - VolleyLog.e( - e, "Thread was interrupted while initializing the cache."); - Thread.currentThread().interrupt(); - throw new RuntimeException(e); - } - } else { + } + }); + } else { + mBlockingExecutor.execute( + new Runnable() { + @Override + public void run() { getCache().initialize(); + mNonBlockingExecutor.execute( + new Runnable() { + @Override + public void run() { + onCacheInitializationComplete(); + } + }); } - } - }); + }); + } } /** Shuts down and nullifies both executors */ @@ -169,6 +187,17 @@ public class AsyncRequestQueue extends RequestQueue { /** Begins the request by sending it to the Cache or Network. */ @Override <T> void beginRequest(Request<T> request) { + // If the cache hasn't been initialized yet, add the request to a temporary queue to be + // flushed once initialization completes. + if (!mIsCacheInitialized) { + synchronized (mCacheInitializationLock) { + if (!mIsCacheInitialized) { + mRequestsAwaitingCacheInitialization.add(request); + return; + } + } + } + // If the request is uncacheable, send it over the network. if (request.shouldCache()) { if (mAsyncCache != null) { @@ -181,6 +210,20 @@ public class AsyncRequestQueue extends RequestQueue { } } + private void onCacheInitializationComplete() { + List<Request<?>> requestsToDispatch; + synchronized (mCacheInitializationLock) { + requestsToDispatch = new ArrayList<>(mRequestsAwaitingCacheInitialization); + mRequestsAwaitingCacheInitialization.clear(); + mIsCacheInitialized = true; + } + + // Kick off any requests that were queued while waiting for cache initialization. + for (Request<?> request : requestsToDispatch) { + beginRequest(request); + } + } + @Override <T> void sendRequestOverNetwork(Request<T> request) { mNonBlockingExecutor.execute(new NetworkTask<>(request)); @@ -230,8 +273,14 @@ public class AsyncRequestQueue extends RequestQueue { return; } + // Use a single instant to evaluate cache expiration. Otherwise, a cache entry with + // identical soft and hard TTL times may appear to be valid when checking isExpired but + // invalid upon checking refreshNeeded(), triggering a soft TTL refresh which should be + // impossible. + long currentTimeMillis = System.currentTimeMillis(); + // If it is completely expired, just send it to the network. - if (entry.isExpired()) { + if (entry.isExpired(currentTimeMillis)) { mRequest.addMarker("cache-hit-expired"); mRequest.setCacheEntry(entry); if (!mWaitingRequestManager.maybeAddToWaitingRequests(mRequest)) { @@ -241,15 +290,17 @@ public class AsyncRequestQueue extends RequestQueue { } // We have a cache hit; parse its data for delivery back to the request. - mBlockingExecutor.execute(new CacheParseTask<>(mRequest, entry)); + mBlockingExecutor.execute(new CacheParseTask<>(mRequest, entry, currentTimeMillis)); } private class CacheParseTask<T> extends RequestTask<T> { Cache.Entry entry; + long startTimeMillis; - CacheParseTask(Request<T> request, Cache.Entry entry) { + CacheParseTask(Request<T> request, Cache.Entry entry, long startTimeMillis) { super(request); this.entry = entry; + this.startTimeMillis = startTimeMillis; } @Override @@ -265,7 +316,7 @@ public class AsyncRequestQueue extends RequestQueue { entry.allResponseHeaders)); mRequest.addMarker("cache-hit-parsed"); - if (!entry.refreshNeeded()) { + if (!entry.refreshNeeded(startTimeMillis)) { // Completely unexpired cache hit. Just deliver the response. getResponseDelivery().postResponse(mRequest, response); } else { @@ -436,17 +487,24 @@ public class AsyncRequestQueue extends RequestQueue { } /** - * This class may be used by advanced applications to provide custom executors according to - * their needs. Apps must create ExecutorServices dynamically given a blocking queue rather than - * providing them directly so that Volley can provide a PriorityQueue which will prioritize - * requests according to Request#getPriority. + * Factory to create/provide the executors which Volley will use. + * + * <p>This class may be used by advanced applications to provide custom executors according to + * their needs. + * + * <p>For applications which rely on setting request priority via {@link Request#getPriority}, a + * task queue is provided which will prioritize requests of higher priority should the thread + * pool itself be exhausted. If a shared pool is provided which does not make use of the given + * queue, then lower-priority requests may have tasks executed before higher-priority requests + * when enough tasks are in flight to fully saturate the shared pool. */ public abstract static class ExecutorFactory { - abstract ExecutorService createNonBlockingExecutor(BlockingQueue<Runnable> taskQueue); + public abstract ExecutorService createNonBlockingExecutor( + BlockingQueue<Runnable> taskQueue); - abstract ExecutorService createBlockingExecutor(BlockingQueue<Runnable> taskQueue); + public abstract ExecutorService createBlockingExecutor(BlockingQueue<Runnable> taskQueue); - abstract ScheduledExecutorService createNonBlockingScheduledExecutor(); + public abstract ScheduledExecutorService createNonBlockingScheduledExecutor(); } /** Provides a BlockingQueue to be used to create executors. */ diff --git a/src/main/java/com/android/volley/AuthFailureError.java b/core/src/main/java/com/android/volley/AuthFailureError.java index fc6417e..fc6417e 100644 --- a/src/main/java/com/android/volley/AuthFailureError.java +++ b/core/src/main/java/com/android/volley/AuthFailureError.java diff --git a/src/main/java/com/android/volley/Cache.java b/core/src/main/java/com/android/volley/Cache.java index b8908ac..7348d0f 100644 --- a/src/main/java/com/android/volley/Cache.java +++ b/core/src/main/java/com/android/volley/Cache.java @@ -102,12 +102,20 @@ public interface Cache { /** True if the entry is expired. */ public boolean isExpired() { - return this.ttl < System.currentTimeMillis(); + return isExpired(System.currentTimeMillis()); + } + + boolean isExpired(long currentTimeMillis) { + return this.ttl < currentTimeMillis; } /** True if a refresh is needed from the original data source. */ public boolean refreshNeeded() { - return this.softTtl < System.currentTimeMillis(); + return refreshNeeded(System.currentTimeMillis()); + } + + boolean refreshNeeded(long currentTimeMillis) { + return this.softTtl < currentTimeMillis; } } } diff --git a/src/main/java/com/android/volley/CacheDispatcher.java b/core/src/main/java/com/android/volley/CacheDispatcher.java index 1bfc0ea..4443143 100644 --- a/src/main/java/com/android/volley/CacheDispatcher.java +++ b/core/src/main/java/com/android/volley/CacheDispatcher.java @@ -138,8 +138,14 @@ public class CacheDispatcher extends Thread { return; } + // Use a single instant to evaluate cache expiration. Otherwise, a cache entry with + // identical soft and hard TTL times may appear to be valid when checking isExpired but + // invalid upon checking refreshNeeded(), triggering a soft TTL refresh which should be + // impossible. + long currentTimeMillis = System.currentTimeMillis(); + // If it is completely expired, just send it to the network. - if (entry.isExpired()) { + if (entry.isExpired(currentTimeMillis)) { request.addMarker("cache-hit-expired"); request.setCacheEntry(entry); if (!mWaitingRequestManager.maybeAddToWaitingRequests(request)) { @@ -164,7 +170,7 @@ public class CacheDispatcher extends Thread { } return; } - if (!entry.refreshNeeded()) { + if (!entry.refreshNeeded(currentTimeMillis)) { // Completely unexpired cache hit. Just deliver the response. mDelivery.postResponse(request, response); } else { diff --git a/src/main/java/com/android/volley/ClientError.java b/core/src/main/java/com/android/volley/ClientError.java index 521b76f..521b76f 100644 --- a/src/main/java/com/android/volley/ClientError.java +++ b/core/src/main/java/com/android/volley/ClientError.java diff --git a/src/main/java/com/android/volley/DefaultRetryPolicy.java b/core/src/main/java/com/android/volley/DefaultRetryPolicy.java index 4be6b50..4be6b50 100644 --- a/src/main/java/com/android/volley/DefaultRetryPolicy.java +++ b/core/src/main/java/com/android/volley/DefaultRetryPolicy.java diff --git a/src/main/java/com/android/volley/ExecutorDelivery.java b/core/src/main/java/com/android/volley/ExecutorDelivery.java index fd992f9..fd992f9 100644 --- a/src/main/java/com/android/volley/ExecutorDelivery.java +++ b/core/src/main/java/com/android/volley/ExecutorDelivery.java diff --git a/src/main/java/com/android/volley/Header.java b/core/src/main/java/com/android/volley/Header.java index cd9c6ec..cd9c6ec 100644 --- a/src/main/java/com/android/volley/Header.java +++ b/core/src/main/java/com/android/volley/Header.java diff --git a/src/main/java/com/android/volley/Network.java b/core/src/main/java/com/android/volley/Network.java index 16d5858..16d5858 100644 --- a/src/main/java/com/android/volley/Network.java +++ b/core/src/main/java/com/android/volley/Network.java diff --git a/src/main/java/com/android/volley/NetworkDispatcher.java b/core/src/main/java/com/android/volley/NetworkDispatcher.java index 06057c3..06057c3 100644 --- a/src/main/java/com/android/volley/NetworkDispatcher.java +++ b/core/src/main/java/com/android/volley/NetworkDispatcher.java diff --git a/src/main/java/com/android/volley/NetworkError.java b/core/src/main/java/com/android/volley/NetworkError.java index 6b2b19f..6b2b19f 100644 --- a/src/main/java/com/android/volley/NetworkError.java +++ b/core/src/main/java/com/android/volley/NetworkError.java diff --git a/src/main/java/com/android/volley/NetworkResponse.java b/core/src/main/java/com/android/volley/NetworkResponse.java index cfbc371..cfbc371 100644 --- a/src/main/java/com/android/volley/NetworkResponse.java +++ b/core/src/main/java/com/android/volley/NetworkResponse.java diff --git a/src/main/java/com/android/volley/NoConnectionError.java b/core/src/main/java/com/android/volley/NoConnectionError.java index 185eb35..185eb35 100644 --- a/src/main/java/com/android/volley/NoConnectionError.java +++ b/core/src/main/java/com/android/volley/NoConnectionError.java diff --git a/src/main/java/com/android/volley/ParseError.java b/core/src/main/java/com/android/volley/ParseError.java index 04a9d58..04a9d58 100644 --- a/src/main/java/com/android/volley/ParseError.java +++ b/core/src/main/java/com/android/volley/ParseError.java diff --git a/src/main/java/com/android/volley/Request.java b/core/src/main/java/com/android/volley/Request.java index b60dc74..df0d18f 100644 --- a/src/main/java/com/android/volley/Request.java +++ b/core/src/main/java/com/android/volley/Request.java @@ -135,8 +135,8 @@ public abstract class Request<T> implements Comparable<Request<T>> { * @deprecated Use {@link #Request(int, String, com.android.volley.Response.ErrorListener)}. */ @Deprecated - public Request(String url, Response.ErrorListener listener) { - this(Method.DEPRECATED_GET_OR_POST, url, listener); + public Request(String url, Response.ErrorListener errorListener) { + this(Method.DEPRECATED_GET_OR_POST, url, errorListener); } /** @@ -144,11 +144,15 @@ public abstract class Request<T> implements Comparable<Request<T>> { * error listener. Note that the normal response listener is not provided here as delivery of * responses is provided by subclasses, who have a better idea of how to deliver an * already-parsed response. + * + * @param method the HTTP method to use + * @param url URL to fetch the response from + * @param errorListener Error listener, or null to ignore errors. */ - public Request(int method, String url, @Nullable Response.ErrorListener listener) { + public Request(int method, String url, @Nullable Response.ErrorListener errorListener) { mMethod = method; mUrl = url; - mErrorListener = listener; + mErrorListener = errorListener; setRetryPolicy(new DefaultRetryPolicy()); mDefaultTrafficStatsTag = findDefaultTrafficStatsTag(url); diff --git a/src/main/java/com/android/volley/RequestQueue.java b/core/src/main/java/com/android/volley/RequestQueue.java index 6db0b1c..6db0b1c 100644 --- a/src/main/java/com/android/volley/RequestQueue.java +++ b/core/src/main/java/com/android/volley/RequestQueue.java diff --git a/src/main/java/com/android/volley/RequestTask.java b/core/src/main/java/com/android/volley/RequestTask.java index 8eeaf2c..b429f79 100644 --- a/src/main/java/com/android/volley/RequestTask.java +++ b/core/src/main/java/com/android/volley/RequestTask.java @@ -1,6 +1,11 @@ package com.android.volley; -/** Abstract runnable that's a task to be completed by the RequestQueue. */ +/** + * Abstract runnable that's a task to be completed by the RequestQueue. + * + * <p><b>WARNING</b>: This API is experimental and subject to breaking changes. Please see + * https://github.com/google/volley/wiki/Asynchronous-Volley for more details. + */ public abstract class RequestTask<T> implements Runnable { final Request<T> mRequest; diff --git a/src/main/java/com/android/volley/Response.java b/core/src/main/java/com/android/volley/Response.java index 622bdc4..622bdc4 100644 --- a/src/main/java/com/android/volley/Response.java +++ b/core/src/main/java/com/android/volley/Response.java diff --git a/src/main/java/com/android/volley/ResponseDelivery.java b/core/src/main/java/com/android/volley/ResponseDelivery.java index 10aa137..10aa137 100644 --- a/src/main/java/com/android/volley/ResponseDelivery.java +++ b/core/src/main/java/com/android/volley/ResponseDelivery.java diff --git a/src/main/java/com/android/volley/RetryPolicy.java b/core/src/main/java/com/android/volley/RetryPolicy.java index 3ef26de..3ef26de 100644 --- a/src/main/java/com/android/volley/RetryPolicy.java +++ b/core/src/main/java/com/android/volley/RetryPolicy.java diff --git a/src/main/java/com/android/volley/ServerError.java b/core/src/main/java/com/android/volley/ServerError.java index 84b2eb4..84b2eb4 100644 --- a/src/main/java/com/android/volley/ServerError.java +++ b/core/src/main/java/com/android/volley/ServerError.java diff --git a/src/main/java/com/android/volley/TimeoutError.java b/core/src/main/java/com/android/volley/TimeoutError.java index 227ae08..227ae08 100644 --- a/src/main/java/com/android/volley/TimeoutError.java +++ b/core/src/main/java/com/android/volley/TimeoutError.java diff --git a/src/main/java/com/android/volley/VolleyError.java b/core/src/main/java/com/android/volley/VolleyError.java index 45086da..45086da 100644 --- a/src/main/java/com/android/volley/VolleyError.java +++ b/core/src/main/java/com/android/volley/VolleyError.java diff --git a/src/main/java/com/android/volley/VolleyLog.java b/core/src/main/java/com/android/volley/VolleyLog.java index 8477668..8477668 100644 --- a/src/main/java/com/android/volley/VolleyLog.java +++ b/core/src/main/java/com/android/volley/VolleyLog.java diff --git a/src/main/java/com/android/volley/WaitingRequestManager.java b/core/src/main/java/com/android/volley/WaitingRequestManager.java index 682e339..682e339 100644 --- a/src/main/java/com/android/volley/WaitingRequestManager.java +++ b/core/src/main/java/com/android/volley/WaitingRequestManager.java diff --git a/src/main/java/com/android/volley/toolbox/AdaptedHttpStack.java b/core/src/main/java/com/android/volley/toolbox/AdaptedHttpStack.java index c75c25f..c75c25f 100644 --- a/src/main/java/com/android/volley/toolbox/AdaptedHttpStack.java +++ b/core/src/main/java/com/android/volley/toolbox/AdaptedHttpStack.java diff --git a/src/main/java/com/android/volley/toolbox/AndroidAuthenticator.java b/core/src/main/java/com/android/volley/toolbox/AndroidAuthenticator.java index f3381ae..f3381ae 100644 --- a/src/main/java/com/android/volley/toolbox/AndroidAuthenticator.java +++ b/core/src/main/java/com/android/volley/toolbox/AndroidAuthenticator.java diff --git a/src/main/java/com/android/volley/toolbox/AsyncHttpStack.java b/core/src/main/java/com/android/volley/toolbox/AsyncHttpStack.java index bafab8c..4165637 100644 --- a/src/main/java/com/android/volley/toolbox/AsyncHttpStack.java +++ b/core/src/main/java/com/android/volley/toolbox/AsyncHttpStack.java @@ -28,7 +28,12 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.atomic.AtomicReference; -/** Asynchronous extension of the {@link BaseHttpStack} class. */ +/** + * Asynchronous extension of the {@link BaseHttpStack} class. + * + * <p><b>WARNING</b>: This API is experimental and subject to breaking changes. Please see + * https://github.com/google/volley/wiki/Asynchronous-Volley for more details. + */ public abstract class AsyncHttpStack extends BaseHttpStack { private ExecutorService mBlockingExecutor; private ExecutorService mNonBlockingExecutor; diff --git a/src/main/java/com/android/volley/toolbox/Authenticator.java b/core/src/main/java/com/android/volley/toolbox/Authenticator.java index 2ba43db..2ba43db 100644 --- a/src/main/java/com/android/volley/toolbox/Authenticator.java +++ b/core/src/main/java/com/android/volley/toolbox/Authenticator.java diff --git a/src/main/java/com/android/volley/toolbox/BaseHttpStack.java b/core/src/main/java/com/android/volley/toolbox/BaseHttpStack.java index 99a9899..99a9899 100644 --- a/src/main/java/com/android/volley/toolbox/BaseHttpStack.java +++ b/core/src/main/java/com/android/volley/toolbox/BaseHttpStack.java diff --git a/src/main/java/com/android/volley/toolbox/BasicAsyncNetwork.java b/core/src/main/java/com/android/volley/toolbox/BasicAsyncNetwork.java index 55892a0..cdedaff 100644 --- a/src/main/java/com/android/volley/toolbox/BasicAsyncNetwork.java +++ b/core/src/main/java/com/android/volley/toolbox/BasicAsyncNetwork.java @@ -29,6 +29,7 @@ import com.android.volley.NetworkResponse; import com.android.volley.Request; import com.android.volley.RequestTask; import com.android.volley.VolleyError; +import com.android.volley.toolbox.NetworkUtility.RetryInfo; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; @@ -36,7 +37,12 @@ import java.util.List; import java.util.Map; import java.util.concurrent.ExecutorService; -/** A network performing Volley requests over an {@link HttpStack}. */ +/** + * A network performing Volley requests over an {@link HttpStack}. + * + * <p><b>WARNING</b>: This API is experimental and subject to breaking changes. Please see + * https://github.com/google/volley/wiki/Asynchronous-Volley for more details. + */ public class BasicAsyncNetwork extends AsyncNetwork { private final AsyncHttpStack mAsyncStack; @@ -126,13 +132,39 @@ public class BasicAsyncNetwork extends AsyncNetwork { @Nullable HttpResponse httpResponse, @Nullable byte[] responseContents) { try { - NetworkUtility.handleException( - request, exception, requestStartMs, httpResponse, responseContents); + RetryInfo retryInfo = + NetworkUtility.shouldRetryException( + request, exception, requestStartMs, httpResponse, responseContents); + // RetryPolicy#retry may need a background thread, so invoke in the blocking executor. + getBlockingExecutor() + .execute(new InvokeRetryPolicyTask<>(request, retryInfo, callback)); } catch (VolleyError volleyError) { callback.onError(volleyError); - return; } - performRequest(request, callback); + } + + private class InvokeRetryPolicyTask<T> extends RequestTask<T> { + final Request<T> request; + final RetryInfo retryInfo; + final OnRequestComplete callback; + + InvokeRetryPolicyTask(Request<T> request, RetryInfo retryInfo, OnRequestComplete callback) { + super(request); + this.request = request; + this.retryInfo = retryInfo; + this.callback = callback; + } + + @Override + public void run() { + try { + NetworkUtility.attemptRetryOnException(request, retryInfo); + // attemptRetryOnException didn't throw, so proceed with the next attempt. + performRequest(request, callback); + } catch (VolleyError e) { + callback.onError(e); + } + } } @Override diff --git a/src/main/java/com/android/volley/toolbox/BasicNetwork.java b/core/src/main/java/com/android/volley/toolbox/BasicNetwork.java index 06427fe..552e628 100644 --- a/src/main/java/com/android/volley/toolbox/BasicNetwork.java +++ b/core/src/main/java/com/android/volley/toolbox/BasicNetwork.java @@ -22,6 +22,7 @@ import com.android.volley.Network; import com.android.volley.NetworkResponse; import com.android.volley.Request; import com.android.volley.VolleyError; +import com.android.volley.toolbox.NetworkUtility.RetryInfo; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; @@ -140,8 +141,11 @@ public class BasicNetwork implements Network { } catch (IOException e) { // This will either throw an exception, breaking us from the loop, or will loop // again and retry the request. - NetworkUtility.handleException( - request, e, requestStart, httpResponse, responseContents); + RetryInfo retryInfo = + NetworkUtility.shouldRetryException( + request, e, requestStart, httpResponse, responseContents); + // We should already be on a background thread, so we can invoke the retry inline. + NetworkUtility.attemptRetryOnException(request, retryInfo); } } } diff --git a/src/main/java/com/android/volley/toolbox/ByteArrayPool.java b/core/src/main/java/com/android/volley/toolbox/ByteArrayPool.java index 0134fa2..0134fa2 100644 --- a/src/main/java/com/android/volley/toolbox/ByteArrayPool.java +++ b/core/src/main/java/com/android/volley/toolbox/ByteArrayPool.java diff --git a/src/main/java/com/android/volley/toolbox/ClearCacheRequest.java b/core/src/main/java/com/android/volley/toolbox/ClearCacheRequest.java index 856ef80..856ef80 100644 --- a/src/main/java/com/android/volley/toolbox/ClearCacheRequest.java +++ b/core/src/main/java/com/android/volley/toolbox/ClearCacheRequest.java diff --git a/src/main/java/com/android/volley/toolbox/DiskBasedCache.java b/core/src/main/java/com/android/volley/toolbox/DiskBasedCache.java index d4310e0..d4310e0 100644 --- a/src/main/java/com/android/volley/toolbox/DiskBasedCache.java +++ b/core/src/main/java/com/android/volley/toolbox/DiskBasedCache.java diff --git a/src/main/java/com/android/volley/toolbox/FileSupplier.java b/core/src/main/java/com/android/volley/toolbox/FileSupplier.java index 70898a6..70898a6 100644 --- a/src/main/java/com/android/volley/toolbox/FileSupplier.java +++ b/core/src/main/java/com/android/volley/toolbox/FileSupplier.java diff --git a/src/main/java/com/android/volley/toolbox/HttpClientStack.java b/core/src/main/java/com/android/volley/toolbox/HttpClientStack.java index 1e9e4b0..1e9e4b0 100644 --- a/src/main/java/com/android/volley/toolbox/HttpClientStack.java +++ b/core/src/main/java/com/android/volley/toolbox/HttpClientStack.java diff --git a/src/main/java/com/android/volley/toolbox/HttpHeaderParser.java b/core/src/main/java/com/android/volley/toolbox/HttpHeaderParser.java index 0b29e80..0b29e80 100644 --- a/src/main/java/com/android/volley/toolbox/HttpHeaderParser.java +++ b/core/src/main/java/com/android/volley/toolbox/HttpHeaderParser.java diff --git a/src/main/java/com/android/volley/toolbox/HttpResponse.java b/core/src/main/java/com/android/volley/toolbox/HttpResponse.java index 595f926..595f926 100644 --- a/src/main/java/com/android/volley/toolbox/HttpResponse.java +++ b/core/src/main/java/com/android/volley/toolbox/HttpResponse.java diff --git a/src/main/java/com/android/volley/toolbox/HttpStack.java b/core/src/main/java/com/android/volley/toolbox/HttpStack.java index 85179a7..85179a7 100644 --- a/src/main/java/com/android/volley/toolbox/HttpStack.java +++ b/core/src/main/java/com/android/volley/toolbox/HttpStack.java diff --git a/src/main/java/com/android/volley/toolbox/HurlStack.java b/core/src/main/java/com/android/volley/toolbox/HurlStack.java index 35c6a72..35c6a72 100644 --- a/src/main/java/com/android/volley/toolbox/HurlStack.java +++ b/core/src/main/java/com/android/volley/toolbox/HurlStack.java diff --git a/src/main/java/com/android/volley/toolbox/ImageLoader.java b/core/src/main/java/com/android/volley/toolbox/ImageLoader.java index eece2cf..eece2cf 100644 --- a/src/main/java/com/android/volley/toolbox/ImageLoader.java +++ b/core/src/main/java/com/android/volley/toolbox/ImageLoader.java diff --git a/src/main/java/com/android/volley/toolbox/ImageRequest.java b/core/src/main/java/com/android/volley/toolbox/ImageRequest.java index 32b5aa3..32b5aa3 100644 --- a/src/main/java/com/android/volley/toolbox/ImageRequest.java +++ b/core/src/main/java/com/android/volley/toolbox/ImageRequest.java diff --git a/src/main/java/com/android/volley/toolbox/JsonArrayRequest.java b/core/src/main/java/com/android/volley/toolbox/JsonArrayRequest.java index 86ed9e9..9f56746 100644 --- a/src/main/java/com/android/volley/toolbox/JsonArrayRequest.java +++ b/core/src/main/java/com/android/volley/toolbox/JsonArrayRequest.java @@ -26,7 +26,10 @@ import java.io.UnsupportedEncodingException; import org.json.JSONArray; import org.json.JSONException; -/** A request for retrieving a {@link JSONArray} response body at a given URL. */ +/** + * A request for retrieving a {@link JSONArray} response body at a given URL, allowing for an + * optional {@link JSONArray} to be passed in as part of the request body. + */ public class JsonArrayRequest extends JsonRequest<JSONArray> { /** @@ -60,7 +63,7 @@ public class JsonArrayRequest extends JsonRequest<JSONArray> { super( method, url, - (jsonRequest == null) ? null : jsonRequest.toString(), + jsonRequest != null ? jsonRequest.toString() : null, listener, errorListener); } diff --git a/src/main/java/com/android/volley/toolbox/JsonObjectRequest.java b/core/src/main/java/com/android/volley/toolbox/JsonObjectRequest.java index 8dca0ec..eccb54b 100644 --- a/src/main/java/com/android/volley/toolbox/JsonObjectRequest.java +++ b/core/src/main/java/com/android/volley/toolbox/JsonObjectRequest.java @@ -35,42 +35,55 @@ public class JsonObjectRequest extends JsonRequest<JSONObject> { /** * Creates a new request. * - * @param method the HTTP method to use * @param url URL to fetch the JSON from - * @param jsonRequest A {@link JSONObject} to post with the request. Null indicates no - * parameters will be posted along with request. * @param listener Listener to receive the JSON response * @param errorListener Error listener, or null to ignore errors. */ public JsonObjectRequest( - int method, + String url, Listener<JSONObject> listener, @Nullable ErrorListener errorListener) { + super(Method.GET, url, null, listener, errorListener); + } + + /** + * Constructor which defaults to <code>GET</code> if <code>jsonRequest</code> is <code>null + * </code> , <code>POST</code> otherwise. + * + * @deprecated Use {@link #JsonObjectRequest(int, String, JSONObject, Listener, ErrorListener)}. + */ + @Deprecated + public JsonObjectRequest( String url, @Nullable JSONObject jsonRequest, Listener<JSONObject> listener, @Nullable ErrorListener errorListener) { super( - method, + jsonRequest == null ? Method.GET : Method.POST, url, - (jsonRequest == null) ? null : jsonRequest.toString(), + jsonRequest != null ? jsonRequest.toString() : null, listener, errorListener); } /** - * Constructor which defaults to <code>GET</code> if <code>jsonRequest</code> is <code>null - * </code> , <code>POST</code> otherwise. + * Creates a new request. * - * @see #JsonObjectRequest(int, String, JSONObject, Listener, ErrorListener) + * @param method the HTTP method to use + * @param url URL to fetch the JSON from + * @param jsonRequest A {@link JSONObject} to post with the request. Null indicates no + * parameters will be posted along with request. + * @param listener Listener to receive the JSON response + * @param errorListener Error listener, or null to ignore errors. */ public JsonObjectRequest( + int method, String url, @Nullable JSONObject jsonRequest, Listener<JSONObject> listener, @Nullable ErrorListener errorListener) { - this( - jsonRequest == null ? Method.GET : Method.POST, + super( + method, url, - jsonRequest, + jsonRequest != null ? jsonRequest.toString() : null, listener, errorListener); } diff --git a/src/main/java/com/android/volley/toolbox/JsonRequest.java b/core/src/main/java/com/android/volley/toolbox/JsonRequest.java index bc035ae..c2d1fad 100644 --- a/src/main/java/com/android/volley/toolbox/JsonRequest.java +++ b/core/src/main/java/com/android/volley/toolbox/JsonRequest.java @@ -61,6 +61,16 @@ public abstract class JsonRequest<T> extends Request<T> { this(Method.DEPRECATED_GET_OR_POST, url, requestBody, listener, errorListener); } + /** + * Creates a new request. + * + * @param method the HTTP method to use + * @param url URL to fetch the JSON from + * @param requestBody The content to post as the body of the request. Null indicates no + * parameters will be posted along with request. + * @param listener Listener to receive the JSON response + * @param errorListener Error listener, or null to ignore errors. + */ public JsonRequest( int method, String url, diff --git a/src/main/java/com/android/volley/toolbox/NetworkImageView.java b/core/src/main/java/com/android/volley/toolbox/NetworkImageView.java index a24b3e2..a24b3e2 100644 --- a/src/main/java/com/android/volley/toolbox/NetworkImageView.java +++ b/core/src/main/java/com/android/volley/toolbox/NetworkImageView.java diff --git a/src/main/java/com/android/volley/toolbox/NetworkUtility.java b/core/src/main/java/com/android/volley/toolbox/NetworkUtility.java index 44d5904..58a3bb3 100644 --- a/src/main/java/com/android/volley/toolbox/NetworkUtility.java +++ b/core/src/main/java/com/android/volley/toolbox/NetworkUtility.java @@ -42,7 +42,7 @@ import java.util.List; * Utility class for methods that are shared between {@link BasicNetwork} and {@link * BasicAsyncNetwork} */ -public final class NetworkUtility { +final class NetworkUtility { private static final int SLOW_REQUEST_THRESHOLD_MS = 3000; private NetworkUtility() {} @@ -113,30 +113,45 @@ public final class NetworkUtility { /** * Attempts to prepare the request for a retry. If there are no more attempts remaining in the - * request's retry policy, a timeout exception is thrown. + * request's retry policy, the provided exception is thrown. + * + * <p>Must be invoked from a background thread, as client implementations of RetryPolicy#retry + * may make blocking calls. * * @param request The request to use. */ - private static void attemptRetryOnException( - final String logPrefix, final Request<?> request, final VolleyError exception) + static void attemptRetryOnException(final Request<?> request, final RetryInfo retryInfo) throws VolleyError { final RetryPolicy retryPolicy = request.getRetryPolicy(); final int oldTimeout = request.getTimeoutMs(); try { - retryPolicy.retry(exception); + retryPolicy.retry(retryInfo.errorToRetry); } catch (VolleyError e) { request.addMarker( - String.format("%s-timeout-giveup [timeout=%s]", logPrefix, oldTimeout)); + String.format( + "%s-timeout-giveup [timeout=%s]", retryInfo.logPrefix, oldTimeout)); throw e; } - request.addMarker(String.format("%s-retry [timeout=%s]", logPrefix, oldTimeout)); + request.addMarker(String.format("%s-retry [timeout=%s]", retryInfo.logPrefix, oldTimeout)); + } + + static class RetryInfo { + private final String logPrefix; + private final VolleyError errorToRetry; + + private RetryInfo(String logPrefix, VolleyError errorToRetry) { + this.logPrefix = logPrefix; + this.errorToRetry = errorToRetry; + } } /** * Based on the exception thrown, decides whether to attempt to retry, or to throw the error. - * Also handles logging. + * + * <p>If this method returns without throwing, {@link #attemptRetryOnException} should be called + * with the provided {@link RetryInfo} to consult the client's retry policy. */ - static void handleException( + static RetryInfo shouldRetryException( Request<?> request, IOException exception, long requestStartMs, @@ -144,7 +159,7 @@ public final class NetworkUtility { @Nullable byte[] responseContents) throws VolleyError { if (exception instanceof SocketTimeoutException) { - attemptRetryOnException("socket", request, new TimeoutError()); + return new RetryInfo("socket", new TimeoutError()); } else if (exception instanceof MalformedURLException) { throw new RuntimeException("Bad URL " + request.getUrl(), exception); } else { @@ -153,11 +168,9 @@ public final class NetworkUtility { statusCode = httpResponse.getStatusCode(); } else { if (request.shouldRetryConnectionErrors()) { - attemptRetryOnException("connection", request, new NoConnectionError()); - return; - } else { - throw new NoConnectionError(exception); + return new RetryInfo("connection", new NoConnectionError()); } + throw new NoConnectionError(exception); } VolleyLog.e("Unexpected response code %d for %s", statusCode, request.getUrl()); NetworkResponse networkResponse; @@ -173,24 +186,21 @@ public final class NetworkUtility { responseHeaders); if (statusCode == HttpURLConnection.HTTP_UNAUTHORIZED || statusCode == HttpURLConnection.HTTP_FORBIDDEN) { - attemptRetryOnException("auth", request, new AuthFailureError(networkResponse)); - } else if (statusCode >= 400 && statusCode <= 499) { + return new RetryInfo("auth", new AuthFailureError(networkResponse)); + } + if (statusCode >= 400 && statusCode <= 499) { // Don't retry other client errors. throw new ClientError(networkResponse); - } else if (statusCode >= 500 && statusCode <= 599) { + } + if (statusCode >= 500 && statusCode <= 599) { if (request.shouldRetryServerErrors()) { - attemptRetryOnException( - "server", request, new ServerError(networkResponse)); - } else { - throw new ServerError(networkResponse); + return new RetryInfo("server", new ServerError(networkResponse)); } - } else { - // 3xx? No reason to retry. - throw new ServerError(networkResponse); } - } else { - attemptRetryOnException("network", request, new NetworkError()); + // Server error and client has opted out of retries, or 3xx. No reason to retry. + throw new ServerError(networkResponse); } + return new RetryInfo("network", new NetworkError()); } } } diff --git a/src/main/java/com/android/volley/toolbox/NoAsyncCache.java b/core/src/main/java/com/android/volley/toolbox/NoAsyncCache.java index aa4aeea..1fda58f 100644 --- a/src/main/java/com/android/volley/toolbox/NoAsyncCache.java +++ b/core/src/main/java/com/android/volley/toolbox/NoAsyncCache.java @@ -3,7 +3,12 @@ package com.android.volley.toolbox; import com.android.volley.AsyncCache; import com.android.volley.Cache; -/** An AsyncCache that doesn't cache anything. */ +/** + * An AsyncCache that doesn't cache anything. + * + * <p><b>WARNING</b>: This API is experimental and subject to breaking changes. Please see + * https://github.com/google/volley/wiki/Asynchronous-Volley for more details. + */ public class NoAsyncCache extends AsyncCache { @Override public void get(String key, OnGetCompleteCallback callback) { diff --git a/src/main/java/com/android/volley/toolbox/NoCache.java b/core/src/main/java/com/android/volley/toolbox/NoCache.java index 51f9945..51f9945 100644 --- a/src/main/java/com/android/volley/toolbox/NoCache.java +++ b/core/src/main/java/com/android/volley/toolbox/NoCache.java diff --git a/src/main/java/com/android/volley/toolbox/PoolingByteArrayOutputStream.java b/core/src/main/java/com/android/volley/toolbox/PoolingByteArrayOutputStream.java index bdcc45e..bdcc45e 100644 --- a/src/main/java/com/android/volley/toolbox/PoolingByteArrayOutputStream.java +++ b/core/src/main/java/com/android/volley/toolbox/PoolingByteArrayOutputStream.java diff --git a/src/main/java/com/android/volley/toolbox/RequestFuture.java b/core/src/main/java/com/android/volley/toolbox/RequestFuture.java index f9cbce2..f9cbce2 100644 --- a/src/main/java/com/android/volley/toolbox/RequestFuture.java +++ b/core/src/main/java/com/android/volley/toolbox/RequestFuture.java diff --git a/src/main/java/com/android/volley/toolbox/StringRequest.java b/core/src/main/java/com/android/volley/toolbox/StringRequest.java index df7b386..df7b386 100644 --- a/src/main/java/com/android/volley/toolbox/StringRequest.java +++ b/core/src/main/java/com/android/volley/toolbox/StringRequest.java diff --git a/src/main/java/com/android/volley/toolbox/Threads.java b/core/src/main/java/com/android/volley/toolbox/Threads.java index 66c3e41..66c3e41 100644 --- a/src/main/java/com/android/volley/toolbox/Threads.java +++ b/core/src/main/java/com/android/volley/toolbox/Threads.java diff --git a/src/main/java/com/android/volley/toolbox/UrlRewriter.java b/core/src/main/java/com/android/volley/toolbox/UrlRewriter.java index 8bbb770..8bbb770 100644 --- a/src/main/java/com/android/volley/toolbox/UrlRewriter.java +++ b/core/src/main/java/com/android/volley/toolbox/UrlRewriter.java diff --git a/src/main/java/com/android/volley/toolbox/Volley.java b/core/src/main/java/com/android/volley/toolbox/Volley.java index bc65c9c..6ab34bb 100644 --- a/src/main/java/com/android/volley/toolbox/Volley.java +++ b/core/src/main/java/com/android/volley/toolbox/Volley.java @@ -21,6 +21,7 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager.NameNotFoundException; import android.net.http.AndroidHttpClient; import android.os.Build; +import androidx.annotation.NonNull; import com.android.volley.Network; import com.android.volley.RequestQueue; import java.io.File; @@ -37,6 +38,7 @@ public class Volley { * @param stack A {@link BaseHttpStack} to use for the network, or null for default. * @return A started {@link RequestQueue} instance. */ + @NonNull public static RequestQueue newRequestQueue(Context context, BaseHttpStack stack) { BasicNetwork network; if (stack == null) { @@ -78,6 +80,7 @@ public class Volley { */ @Deprecated @SuppressWarnings("deprecation") + @NonNull public static RequestQueue newRequestQueue(Context context, HttpStack stack) { if (stack == null) { return newRequestQueue(context, (BaseHttpStack) null); @@ -85,6 +88,7 @@ public class Volley { return newRequestQueue(context, new BasicNetwork(stack)); } + @NonNull private static RequestQueue newRequestQueue(Context context, Network network) { final Context appContext = context.getApplicationContext(); // Use a lazy supplier for the cache directory so that newRequestQueue() can be called on @@ -112,6 +116,7 @@ public class Volley { * @param context A {@link Context} to use for creating the cache dir. * @return A started {@link RequestQueue} instance. */ + @NonNull public static RequestQueue newRequestQueue(Context context) { return newRequestQueue(context, (BaseHttpStack) null); } diff --git a/src/test/java/com/android/volley/AsyncRequestQueueTest.java b/core/src/test/java/com/android/volley/AsyncRequestQueueTest.java index 54ff0a1..aef4f01 100644 --- a/src/test/java/com/android/volley/AsyncRequestQueueTest.java +++ b/core/src/test/java/com/android/volley/AsyncRequestQueueTest.java @@ -16,6 +16,9 @@ package com.android.volley; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; @@ -23,6 +26,8 @@ import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; +import com.android.volley.AsyncCache.OnGetCompleteCallback; +import com.android.volley.AsyncCache.OnWriteCompleteCallback; import com.android.volley.mock.ShadowSystemClock; import com.android.volley.toolbox.NoAsyncCache; import com.android.volley.toolbox.StringRequest; @@ -34,6 +39,7 @@ import java.util.concurrent.ScheduledExecutorService; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; @@ -45,37 +51,13 @@ public class AsyncRequestQueueTest { @Mock private AsyncNetwork mMockNetwork; @Mock private ScheduledExecutorService mMockScheduledExecutor; + private final ResponseDelivery mDelivery = new ImmediateResponseDelivery(); private AsyncRequestQueue queue; @Before public void setUp() throws Exception { - ResponseDelivery mDelivery = new ImmediateResponseDelivery(); initMocks(this); - queue = - new AsyncRequestQueue.Builder(mMockNetwork) - .setAsyncCache(new NoAsyncCache()) - .setResponseDelivery(mDelivery) - .setExecutorFactory( - new AsyncRequestQueue.ExecutorFactory() { - @Override - public ExecutorService createNonBlockingExecutor( - BlockingQueue<Runnable> taskQueue) { - return MoreExecutors.newDirectExecutorService(); - } - - @Override - public ExecutorService createBlockingExecutor( - BlockingQueue<Runnable> taskQueue) { - return MoreExecutors.newDirectExecutorService(); - } - - @Override - public ScheduledExecutorService - createNonBlockingScheduledExecutor() { - return mMockScheduledExecutor; - } - }) - .build(); + queue = createRequestQueue(new NoAsyncCache()); } @Test @@ -161,4 +143,58 @@ public class AsyncRequestQueueTest { verifyNoMoreInteractions(listener); queue.stop(); } + + @Test + public void requestsQueuedBeforeCacheInitialization_asyncCache() { + // Create a new queue with a mock cache in order to verify the initialization. + AsyncCache mockAsyncCache = mock(AsyncCache.class); + AsyncRequestQueue queue = createRequestQueue(mockAsyncCache); + queue.start(); + + ArgumentCaptor<OnWriteCompleteCallback> callbackCaptor = + ArgumentCaptor.forClass(OnWriteCompleteCallback.class); + verify(mockAsyncCache).initialize(callbackCaptor.capture()); + + StringRequest req = mock(StringRequest.class); + req.setShouldCache(true); + when(req.getCacheKey()).thenReturn("cache-key"); + queue.add(req); + + // Cache should not be read before initialization completes. + verify(mockAsyncCache, never()).get(anyString(), any(OnGetCompleteCallback.class)); + + callbackCaptor.getValue().onWriteComplete(); + + // Once the write completes, the request should be kicked off (in the form of a cache + // lookup). + verify(mockAsyncCache).get(eq("cache-key"), any(OnGetCompleteCallback.class)); + + queue.stop(); + } + + private AsyncRequestQueue createRequestQueue(AsyncCache asyncCache) { + return new AsyncRequestQueue.Builder(mMockNetwork) + .setResponseDelivery(mDelivery) + .setAsyncCache(asyncCache) + .setExecutorFactory( + new AsyncRequestQueue.ExecutorFactory() { + @Override + public ExecutorService createNonBlockingExecutor( + BlockingQueue<Runnable> taskQueue) { + return MoreExecutors.newDirectExecutorService(); + } + + @Override + public ExecutorService createBlockingExecutor( + BlockingQueue<Runnable> taskQueue) { + return MoreExecutors.newDirectExecutorService(); + } + + @Override + public ScheduledExecutorService createNonBlockingScheduledExecutor() { + return mMockScheduledExecutor; + } + }) + .build(); + } } diff --git a/src/test/java/com/android/volley/CacheDispatcherTest.java b/core/src/test/java/com/android/volley/CacheDispatcherTest.java index aef6785..aef6785 100644 --- a/src/test/java/com/android/volley/CacheDispatcherTest.java +++ b/core/src/test/java/com/android/volley/CacheDispatcherTest.java diff --git a/src/test/java/com/android/volley/NetworkDispatcherTest.java b/core/src/test/java/com/android/volley/NetworkDispatcherTest.java index 74dfe8a..74dfe8a 100644 --- a/src/test/java/com/android/volley/NetworkDispatcherTest.java +++ b/core/src/test/java/com/android/volley/NetworkDispatcherTest.java diff --git a/src/test/java/com/android/volley/NetworkResponseTest.java b/core/src/test/java/com/android/volley/NetworkResponseTest.java index 70210da..70210da 100644 --- a/src/test/java/com/android/volley/NetworkResponseTest.java +++ b/core/src/test/java/com/android/volley/NetworkResponseTest.java diff --git a/src/test/java/com/android/volley/RequestQueueIntegrationTest.java b/core/src/test/java/com/android/volley/RequestQueueIntegrationTest.java index a2bfbc6..a2bfbc6 100644 --- a/src/test/java/com/android/volley/RequestQueueIntegrationTest.java +++ b/core/src/test/java/com/android/volley/RequestQueueIntegrationTest.java diff --git a/src/test/java/com/android/volley/RequestQueueTest.java b/core/src/test/java/com/android/volley/RequestQueueTest.java index ba9b0f8..ba9b0f8 100644 --- a/src/test/java/com/android/volley/RequestQueueTest.java +++ b/core/src/test/java/com/android/volley/RequestQueueTest.java diff --git a/src/test/java/com/android/volley/RequestTest.java b/core/src/test/java/com/android/volley/RequestTest.java index cced39f..cced39f 100644 --- a/src/test/java/com/android/volley/RequestTest.java +++ b/core/src/test/java/com/android/volley/RequestTest.java diff --git a/src/test/java/com/android/volley/ResponseDeliveryTest.java b/core/src/test/java/com/android/volley/ResponseDeliveryTest.java index 6e71c3b..6e71c3b 100644 --- a/src/test/java/com/android/volley/ResponseDeliveryTest.java +++ b/core/src/test/java/com/android/volley/ResponseDeliveryTest.java diff --git a/src/test/java/com/android/volley/mock/MockAsyncStack.java b/core/src/test/java/com/android/volley/mock/MockAsyncStack.java index 5ea8343..5ea8343 100644 --- a/src/test/java/com/android/volley/mock/MockAsyncStack.java +++ b/core/src/test/java/com/android/volley/mock/MockAsyncStack.java diff --git a/src/test/java/com/android/volley/mock/MockHttpStack.java b/core/src/test/java/com/android/volley/mock/MockHttpStack.java index b86e7a0..b86e7a0 100644 --- a/src/test/java/com/android/volley/mock/MockHttpStack.java +++ b/core/src/test/java/com/android/volley/mock/MockHttpStack.java diff --git a/src/test/java/com/android/volley/mock/MockRequest.java b/core/src/test/java/com/android/volley/mock/MockRequest.java index 6fc26b4..6fc26b4 100644 --- a/src/test/java/com/android/volley/mock/MockRequest.java +++ b/core/src/test/java/com/android/volley/mock/MockRequest.java diff --git a/src/test/java/com/android/volley/mock/ShadowSystemClock.java b/core/src/test/java/com/android/volley/mock/ShadowSystemClock.java index 6d75d4b..6d75d4b 100644 --- a/src/test/java/com/android/volley/mock/ShadowSystemClock.java +++ b/core/src/test/java/com/android/volley/mock/ShadowSystemClock.java diff --git a/src/test/java/com/android/volley/toolbox/AdaptedHttpStackTest.java b/core/src/test/java/com/android/volley/toolbox/AdaptedHttpStackTest.java index dbd6535..dbd6535 100644 --- a/src/test/java/com/android/volley/toolbox/AdaptedHttpStackTest.java +++ b/core/src/test/java/com/android/volley/toolbox/AdaptedHttpStackTest.java diff --git a/src/test/java/com/android/volley/toolbox/AndroidAuthenticatorTest.java b/core/src/test/java/com/android/volley/toolbox/AndroidAuthenticatorTest.java index 982eda2..982eda2 100644 --- a/src/test/java/com/android/volley/toolbox/AndroidAuthenticatorTest.java +++ b/core/src/test/java/com/android/volley/toolbox/AndroidAuthenticatorTest.java diff --git a/src/test/java/com/android/volley/toolbox/BaseHttpStackTest.java b/core/src/test/java/com/android/volley/toolbox/BaseHttpStackTest.java index 1049ad0..1049ad0 100644 --- a/src/test/java/com/android/volley/toolbox/BaseHttpStackTest.java +++ b/core/src/test/java/com/android/volley/toolbox/BaseHttpStackTest.java diff --git a/src/test/java/com/android/volley/toolbox/BasicAsyncNetworkTest.java b/core/src/test/java/com/android/volley/toolbox/BasicAsyncNetworkTest.java index 91d4062..91d4062 100644 --- a/src/test/java/com/android/volley/toolbox/BasicAsyncNetworkTest.java +++ b/core/src/test/java/com/android/volley/toolbox/BasicAsyncNetworkTest.java diff --git a/src/test/java/com/android/volley/toolbox/BasicNetworkTest.java b/core/src/test/java/com/android/volley/toolbox/BasicNetworkTest.java index 3630379..3630379 100644 --- a/src/test/java/com/android/volley/toolbox/BasicNetworkTest.java +++ b/core/src/test/java/com/android/volley/toolbox/BasicNetworkTest.java diff --git a/src/test/java/com/android/volley/toolbox/ByteArrayPoolTest.java b/core/src/test/java/com/android/volley/toolbox/ByteArrayPoolTest.java index 62da207..62da207 100644 --- a/src/test/java/com/android/volley/toolbox/ByteArrayPoolTest.java +++ b/core/src/test/java/com/android/volley/toolbox/ByteArrayPoolTest.java diff --git a/src/test/java/com/android/volley/toolbox/CacheTest.java b/core/src/test/java/com/android/volley/toolbox/CacheTest.java index 22dae22..22dae22 100644 --- a/src/test/java/com/android/volley/toolbox/CacheTest.java +++ b/core/src/test/java/com/android/volley/toolbox/CacheTest.java diff --git a/src/test/java/com/android/volley/toolbox/DiskBasedCacheTest.java b/core/src/test/java/com/android/volley/toolbox/DiskBasedCacheTest.java index db6e491..db6e491 100644 --- a/src/test/java/com/android/volley/toolbox/DiskBasedCacheTest.java +++ b/core/src/test/java/com/android/volley/toolbox/DiskBasedCacheTest.java diff --git a/src/test/java/com/android/volley/toolbox/HttpClientStackTest.java b/core/src/test/java/com/android/volley/toolbox/HttpClientStackTest.java index 2a451dc..2a451dc 100644 --- a/src/test/java/com/android/volley/toolbox/HttpClientStackTest.java +++ b/core/src/test/java/com/android/volley/toolbox/HttpClientStackTest.java diff --git a/src/test/java/com/android/volley/toolbox/HttpHeaderParserTest.java b/core/src/test/java/com/android/volley/toolbox/HttpHeaderParserTest.java index 7780c3e..7780c3e 100644 --- a/src/test/java/com/android/volley/toolbox/HttpHeaderParserTest.java +++ b/core/src/test/java/com/android/volley/toolbox/HttpHeaderParserTest.java diff --git a/src/test/java/com/android/volley/toolbox/HttpStackConformanceTest.java b/core/src/test/java/com/android/volley/toolbox/HttpStackConformanceTest.java index 6794af8..6794af8 100644 --- a/src/test/java/com/android/volley/toolbox/HttpStackConformanceTest.java +++ b/core/src/test/java/com/android/volley/toolbox/HttpStackConformanceTest.java diff --git a/src/test/java/com/android/volley/toolbox/HurlStackTest.java b/core/src/test/java/com/android/volley/toolbox/HurlStackTest.java index 7508244..7508244 100644 --- a/src/test/java/com/android/volley/toolbox/HurlStackTest.java +++ b/core/src/test/java/com/android/volley/toolbox/HurlStackTest.java diff --git a/src/test/java/com/android/volley/toolbox/ImageLoaderTest.java b/core/src/test/java/com/android/volley/toolbox/ImageLoaderTest.java index 59a0b1b..59a0b1b 100644 --- a/src/test/java/com/android/volley/toolbox/ImageLoaderTest.java +++ b/core/src/test/java/com/android/volley/toolbox/ImageLoaderTest.java diff --git a/src/test/java/com/android/volley/toolbox/ImageRequestTest.java b/core/src/test/java/com/android/volley/toolbox/ImageRequestTest.java index 6b50319..6b50319 100644 --- a/src/test/java/com/android/volley/toolbox/ImageRequestTest.java +++ b/core/src/test/java/com/android/volley/toolbox/ImageRequestTest.java diff --git a/src/test/java/com/android/volley/toolbox/JsonRequestCharsetTest.java b/core/src/test/java/com/android/volley/toolbox/JsonRequestCharsetTest.java index 70bb2ea..70bb2ea 100644 --- a/src/test/java/com/android/volley/toolbox/JsonRequestCharsetTest.java +++ b/core/src/test/java/com/android/volley/toolbox/JsonRequestCharsetTest.java diff --git a/src/test/java/com/android/volley/toolbox/JsonRequestTest.java b/core/src/test/java/com/android/volley/toolbox/JsonRequestTest.java index 44c0ad9..44c0ad9 100644 --- a/src/test/java/com/android/volley/toolbox/JsonRequestTest.java +++ b/core/src/test/java/com/android/volley/toolbox/JsonRequestTest.java diff --git a/src/test/java/com/android/volley/toolbox/NetworkImageViewTest.java b/core/src/test/java/com/android/volley/toolbox/NetworkImageViewTest.java index fd2073e..fd2073e 100644 --- a/src/test/java/com/android/volley/toolbox/NetworkImageViewTest.java +++ b/core/src/test/java/com/android/volley/toolbox/NetworkImageViewTest.java diff --git a/src/test/java/com/android/volley/toolbox/PoolingByteArrayOutputStreamTest.java b/core/src/test/java/com/android/volley/toolbox/PoolingByteArrayOutputStreamTest.java index 266edcd..266edcd 100644 --- a/src/test/java/com/android/volley/toolbox/PoolingByteArrayOutputStreamTest.java +++ b/core/src/test/java/com/android/volley/toolbox/PoolingByteArrayOutputStreamTest.java diff --git a/src/test/java/com/android/volley/toolbox/RequestFutureTest.java b/core/src/test/java/com/android/volley/toolbox/RequestFutureTest.java index 5b5c975..5b5c975 100644 --- a/src/test/java/com/android/volley/toolbox/RequestFutureTest.java +++ b/core/src/test/java/com/android/volley/toolbox/RequestFutureTest.java diff --git a/src/test/java/com/android/volley/toolbox/RequestQueueTest.java b/core/src/test/java/com/android/volley/toolbox/RequestQueueTest.java index 1899b71..1899b71 100644 --- a/src/test/java/com/android/volley/toolbox/RequestQueueTest.java +++ b/core/src/test/java/com/android/volley/toolbox/RequestQueueTest.java diff --git a/src/test/java/com/android/volley/toolbox/RequestTest.java b/core/src/test/java/com/android/volley/toolbox/RequestTest.java index 0911ad6..0911ad6 100644 --- a/src/test/java/com/android/volley/toolbox/RequestTest.java +++ b/core/src/test/java/com/android/volley/toolbox/RequestTest.java diff --git a/src/test/java/com/android/volley/toolbox/ResponseTest.java b/core/src/test/java/com/android/volley/toolbox/ResponseTest.java index 44438fa..44438fa 100644 --- a/src/test/java/com/android/volley/toolbox/ResponseTest.java +++ b/core/src/test/java/com/android/volley/toolbox/ResponseTest.java diff --git a/src/test/java/com/android/volley/toolbox/StringRequestTest.java b/core/src/test/java/com/android/volley/toolbox/StringRequestTest.java index 0ecb06b..0ecb06b 100644 --- a/src/test/java/com/android/volley/toolbox/StringRequestTest.java +++ b/core/src/test/java/com/android/volley/toolbox/StringRequestTest.java diff --git a/src/test/java/com/android/volley/utils/CacheTestUtils.java b/core/src/test/java/com/android/volley/utils/CacheTestUtils.java index 5980712..5980712 100644 --- a/src/test/java/com/android/volley/utils/CacheTestUtils.java +++ b/core/src/test/java/com/android/volley/utils/CacheTestUtils.java diff --git a/src/test/java/com/android/volley/utils/ImmediateResponseDelivery.java b/core/src/test/java/com/android/volley/utils/ImmediateResponseDelivery.java index 67e5923..67e5923 100644 --- a/src/test/java/com/android/volley/utils/ImmediateResponseDelivery.java +++ b/core/src/test/java/com/android/volley/utils/ImmediateResponseDelivery.java diff --git a/src/test/resources/org.robolectric.Config.properties b/core/src/test/resources/org.robolectric.Config.properties index 9daf692..9daf692 100644 --- a/src/test/resources/org.robolectric.Config.properties +++ b/core/src/test/resources/org.robolectric.Config.properties diff --git a/cronet/build.gradle b/cronet/build.gradle new file mode 100644 index 0000000..5ee53d6 --- /dev/null +++ b/cronet/build.gradle @@ -0,0 +1,24 @@ +dependencies { + implementation project(":core") + implementation "androidx.annotation:annotation:1.0.1" + compileOnly "org.chromium.net:cronet-embedded:76.3809.111" + + testImplementation project(":testing") + testImplementation "org.chromium.net:cronet-embedded:76.3809.111" + testImplementation "junit:junit:4.12" + testImplementation "org.mockito:mockito-core:2.19.0" + testImplementation "org.robolectric:robolectric:3.4.2" +} + +publishing { + publications { + library(MavenPublication) { + artifactId 'volley-cronet' + pom { + name = 'Volley Cronet' + description = 'Cronet support for Volley.' + } + artifact "$buildDir/outputs/aar/cronet-release.aar" + } + } +} diff --git a/cronet/src/main/AndroidManifest.xml b/cronet/src/main/AndroidManifest.xml new file mode 100644 index 0000000..0dec093 --- /dev/null +++ b/cronet/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest package="com.android.volley.cronet" /> diff --git a/src/main/java/com/android/volley/cronet/CronetHttpStack.java b/cronet/src/main/java/com/android/volley/cronet/CronetHttpStack.java index f3baace..874029b 100644 --- a/src/main/java/com/android/volley/cronet/CronetHttpStack.java +++ b/cronet/src/main/java/com/android/volley/cronet/CronetHttpStack.java @@ -53,6 +53,9 @@ import org.chromium.net.UrlResponseInfo; /** * A {@link AsyncHttpStack} that's based on Cronet's fully asynchronous API for network requests. + * + * <p><b>WARNING</b>: This API is experimental and subject to breaking changes. Please see + * https://github.com/google/volley/wiki/Asynchronous-Volley for more details. */ public class CronetHttpStack extends AsyncHttpStack { diff --git a/src/test/java/com/android/volley/cronet/CronetHttpStackTest.java b/cronet/src/test/java/com/android/volley/cronet/CronetHttpStackTest.java index cedb6ff..cedb6ff 100644 --- a/src/test/java/com/android/volley/cronet/CronetHttpStackTest.java +++ b/cronet/src/test/java/com/android/volley/cronet/CronetHttpStackTest.java diff --git a/publish-snapshot-on-commit.sh b/publish-snapshot-on-commit.sh index 0d0e034..ba02b79 100755 --- a/publish-snapshot-on-commit.sh +++ b/publish-snapshot-on-commit.sh @@ -1,13 +1,15 @@ set -eu -if [ "$TRAVIS_REPO_SLUG" == "google/volley" ] && \ - [ "$TRAVIS_PULL_REQUEST" == "false" ] && \ - [ "$TRAVIS_BRANCH" == "master" ]; then - echo -e "Publishing snapshot build to OJO...\n" +GITHUB_BRANCH=${GITHUB_REF#refs/heads/} - ./gradlew artifactoryPublish +if [ "$GITHUB_REPOSITORY" == "google/volley" ] && \ + [ "$GITHUB_EVENT_NAME" == "push" ] && \ + [ "$GITHUB_BRANCH" == "master" ]; then + echo -e "Publishing snapshot build...\n" - echo -e "Published snapshot build to OJO" + ./gradlew publish + + echo -e "Published snapshot build" else echo -e "Not publishing snapshot" -fi
\ No newline at end of file +fi diff --git a/publish.gradle b/publish.gradle new file mode 100644 index 0000000..429df4d --- /dev/null +++ b/publish.gradle @@ -0,0 +1,72 @@ +apply plugin: 'maven-publish' + +task sourcesJar(type: Jar) { + classifier = 'sources' + from android.sourceSets.main.java.srcDirs +} + +task javadoc(type: Javadoc) { + source = android.sourceSets.main.java.srcDirs + classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) +} + +afterEvaluate { + javadoc.classpath += files(android.libraryVariants.collect { variant -> + variant.getJavaCompile().classpath.files + }) +} + +task javadocJar(type: Jar, dependsOn: javadoc) { + classifier = 'javadoc' + from javadoc.destinationDir +} + +artifacts { + archives javadocJar + archives sourcesJar +} + +publishing { + publications { + library(MavenPublication) { + groupId 'com.android.volley' + version project.version + pom { + name = 'Volley' + url = 'https://github.com/google/volley' + packaging 'aar' + licenses { + license { + name = "The Apache License, Version 2.0" + url = "http://www.apache.org/licenses/LICENSE-2.0.txt" + } + } + scm { + connection = 'scm:git:git://github.com/google/volley.git' + developerConnection = 'scm:git:ssh://git@github.com/google/volley.git' + url = 'https://github.com/google/volley' + } + developers { + developer { + name = 'The Volley Team' + email = 'noreply+volley@google.com' + } + } + } + + // Release AAR, Sources, and JavaDoc + artifact sourcesJar + artifact javadocJar + } + } + + repositories { + maven { + url = "https://oss.sonatype.org/content/repositories/snapshots/" + credentials { + username = System.env.OSSRH_DEPLOY_USERNAME + password = System.env.OSSRH_DEPLOY_PASSWORD + } + } + } +} diff --git a/rules.gradle b/rules.gradle deleted file mode 100644 index e0aef80..0000000 --- a/rules.gradle +++ /dev/null @@ -1,36 +0,0 @@ -// See build.gradle for an explanation of what this file is. - -apply plugin: 'com.android.library' - -android { - useLibrary 'org.apache.http.legacy' - - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_7 - targetCompatibility JavaVersion.VERSION_1_7 - } - - defaultConfig { - consumerProguardFiles 'consumer-proguard-rules.pro' - } -} - -tasks.withType(JavaCompile) { - options.compilerArgs << "-Xlint:unchecked" << "-Werror" -} - -dependencies { - implementation "androidx.annotation:annotation:1.0.1" - compileOnly "org.chromium.net:cronet-embedded:76.3809.111" -} - -// Check if the android plugin version supports unit testing. -if (configurations.findByName("testImplementation")) { - dependencies { - testImplementation "org.chromium.net:cronet-embedded:76.3809.111" - testImplementation "junit:junit:4.12" - testImplementation "org.hamcrest:hamcrest-library:1.3" - testImplementation "org.mockito:mockito-core:2.19.0" - testImplementation "org.robolectric:robolectric:3.4.2" - } -} diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..ace4000 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,4 @@ +rootProject.name = 'volley' +include 'core' +include 'cronet' +include 'testing' diff --git a/testing/build.gradle b/testing/build.gradle new file mode 100644 index 0000000..b374088 --- /dev/null +++ b/testing/build.gradle @@ -0,0 +1,4 @@ +dependencies { + implementation project(":core") +} + diff --git a/testing/src/main/AndroidManifest.xml b/testing/src/main/AndroidManifest.xml new file mode 100644 index 0000000..24b1376 --- /dev/null +++ b/testing/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest package="com.android.volley.testing" /> diff --git a/src/test/java/com/android/volley/mock/TestRequest.java b/testing/src/main/java/com/android/volley/mock/TestRequest.java index f397f01..f397f01 100644 --- a/src/test/java/com/android/volley/mock/TestRequest.java +++ b/testing/src/main/java/com/android/volley/mock/TestRequest.java |