diff --git a/app/build.gradle b/app/build.gradle index 8fded63949..eb52315985 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -104,7 +104,7 @@ dependencies { // ConverterFactory的Gson依赖包 compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4' // ConverterFactory的String依赖包 - compile 'com.squareup.retrofit2:converter-scalars:2.0.0-beta4' +// compile 'com.squareup.retrofit2:converter-scalars:2.0.0-beta4' // ConverterFactory的RxJava依赖包 compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4' // gson diff --git a/app/src/main/java/com/android/volley/AuthFailureError.java b/app/src/main/java/com/android/volley/AuthFailureError.java deleted file mode 100644 index 87c811dfe4..0000000000 --- a/app/src/main/java/com/android/volley/AuthFailureError.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley; - -import android.content.Intent; - -/** - * Error indicating that there was an authentication failure when performing a Request. - */ -@SuppressWarnings("serial") -public class AuthFailureError extends VolleyError { - /** An intent that can be used to resolve this exception. (Brings up the password dialog.) */ - private Intent mResolutionIntent; - - public AuthFailureError() { } - - public AuthFailureError(Intent intent) { - mResolutionIntent = intent; - } - - public AuthFailureError(NetworkResponse response) { - super(response); - } - - public AuthFailureError(String message) { - super(message); - } - - public AuthFailureError(String message, Exception reason) { - super(message, reason); - } - - public Intent getResolutionIntent() { - return mResolutionIntent; - } - - @Override - public String getMessage() { - if (mResolutionIntent != null) { - return "User needs to (re)enter credentials."; - } - return super.getMessage(); - } -} diff --git a/app/src/main/java/com/android/volley/Cache.java b/app/src/main/java/com/android/volley/Cache.java deleted file mode 100644 index eafd118825..0000000000 --- a/app/src/main/java/com/android/volley/Cache.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley; - -import java.util.Collections; -import java.util.Map; - -/** - * An interface for a cache keyed by a String with a byte array as data. - */ -public interface Cache { - /** - * Retrieves an entry from the cache. - * @param key Cache key - * @return An {@link Entry} or null in the event of a cache miss - */ - public Entry get(String key); - - /** - * Adds or replaces an entry to the cache. - * @param key Cache key - * @param entry Data to store and metadata for cache coherency, TTL, etc. - */ - public void put(String key, Entry entry); - - /** - * Performs any potentially long-running actions needed to initialize the cache; - * will be called from a worker thread. - */ - public void initialize(); - - /** - * Invalidates an entry in the cache. - * @param key Cache key - * @param fullExpire True to fully expire the entry, false to soft expire - */ - public void invalidate(String key, boolean fullExpire); - - /** - * Removes an entry from the cache. - * @param key Cache key - */ - public void remove(String key); - - /** - * Empties the cache. - */ - public void clear(); - - /** - * Data and metadata for an entry returned by the cache. - */ - public static class Entry { - /** The data returned from cache. */ - public byte[] data; - - /** ETag for cache coherency. */ - public String etag; - - /** Date of this response as reported by the server. */ - public long serverDate; - - /** TTL for this record. */ - public long ttl; - - /** Soft TTL for this record. */ - public long softTtl; - - /** Immutable response headers as received from server; must be non-null. */ - public Map responseHeaders = Collections.emptyMap(); - - /** True if the entry is expired. */ - public boolean isExpired() { - return this.ttl < System.currentTimeMillis(); - } - - /** True if a refresh is needed from the original data source. */ - public boolean refreshNeeded() { - return this.softTtl < System.currentTimeMillis(); - } - } - -} diff --git a/app/src/main/java/com/android/volley/CacheDispatcher.java b/app/src/main/java/com/android/volley/CacheDispatcher.java deleted file mode 100644 index da31e1cfd6..0000000000 --- a/app/src/main/java/com/android/volley/CacheDispatcher.java +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley; - -import android.os.Process; - -import java.util.concurrent.BlockingQueue; - -/** - * Provides a thread for performing cache triage on a queue of requests. - * - * Requests added to the specified cache queue are resolved from cache. - * Any deliverable response is posted back to the caller via a - * {@link ResponseDelivery}. Cache misses and responses that require - * refresh are enqueued on the specified network queue for processing - * by a {@link NetworkDispatcher}. - */ -@SuppressWarnings("rawtypes") -public class CacheDispatcher extends Thread { - - private static final boolean DEBUG = VolleyLog.DEBUG; - - /** The queue of requests coming in for triage. */ - private final BlockingQueue mCacheQueue; - - /** The queue of requests going out to the network. */ - private final BlockingQueue mNetworkQueue; - - /** The cache to read from. */ - private final Cache mCache; - - /** For posting responses. */ - private final ResponseDelivery mDelivery; - - /** Used for telling us to die. */ - private volatile boolean mQuit = false; - - /** - * Creates a new cache triage dispatcher thread. You must call {@link #start()} - * in order to begin processing. - * - * @param cacheQueue Queue of incoming requests for triage - * @param networkQueue Queue to post requests that require network to - * @param cache Cache interface to use for resolution - * @param delivery Delivery interface to use for posting responses - */ - public CacheDispatcher( - BlockingQueue cacheQueue, BlockingQueue networkQueue, - Cache cache, ResponseDelivery delivery) { - mCacheQueue = cacheQueue; - mNetworkQueue = networkQueue; - mCache = cache; - mDelivery = delivery; - } - - /** - * Forces this dispatcher to quit immediately. If any requests are still in - * the queue, they are not guaranteed to be processed. - */ - public void quit() { - mQuit = true; - interrupt(); - } - - @Override - public void run() { - if (DEBUG) VolleyLog.v("start new dispatcher"); - Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); - - // Make a blocking call to initialize the cache. - mCache.initialize(); - - while (true) { - try { - // Get a request from the cache triage queue, blocking until - // at least one is available. - final Request request = mCacheQueue.take(); - request.addMarker("cache-queue-take"); - - // If the request has been canceled, don't bother dispatching it. - if (request.isCanceled()) { - request.finish("cache-discard-canceled"); - continue; - } - - // Attempt to retrieve this item from cache. - Cache.Entry entry = mCache.get(request.getCacheKey()); - if (entry == null) { - request.addMarker("cache-miss"); - // Cache miss; send off to the network dispatcher. - mNetworkQueue.put(request); - continue; - } - - // If it is completely expired, just send it to the network. - if (entry.isExpired()) { - request.addMarker("cache-hit-expired"); - request.setCacheEntry(entry); - mNetworkQueue.put(request); - continue; - } - - // We have a cache hit; parse its data for delivery back to the request. - request.addMarker("cache-hit"); - Response response = request.parseNetworkResponse( - new NetworkResponse(entry.data, entry.responseHeaders)); - request.addMarker("cache-hit-parsed"); - - if (!entry.refreshNeeded()) { - // Completely unexpired cache hit. Just deliver the response. - mDelivery.postResponse(request, response); - } else { - // Soft-expired cache hit. We can deliver the cached response, - // but we need to also send the request to the network for - // refreshing. - request.addMarker("cache-hit-refresh-needed"); - request.setCacheEntry(entry); - - // Mark the response as intermediate. - response.intermediate = true; - - // Post the intermediate response back to the user and have - // the delivery then forward the request along to the network. - mDelivery.postResponse(request, response, new Runnable() { - @Override - public void run() { - try { - mNetworkQueue.put(request); - } catch (InterruptedException e) { - // Not much we can do about this. - } - } - }); - } - - } catch (InterruptedException e) { - // We may have been interrupted because it was time to quit. - if (mQuit) { - return; - } - continue; - } - } - } -} diff --git a/app/src/main/java/com/android/volley/DefaultRetryPolicy.java b/app/src/main/java/com/android/volley/DefaultRetryPolicy.java deleted file mode 100644 index ce4f9e0a09..0000000000 --- a/app/src/main/java/com/android/volley/DefaultRetryPolicy.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley; - -/** - * Default retry policy for requests. - */ -public class DefaultRetryPolicy implements RetryPolicy { - /** The current timeout in milliseconds. */ - private int mCurrentTimeoutMs; - - /** The current retry count. */ - private int mCurrentRetryCount; - - /** The maximum number of attempts. */ - private final int mMaxNumRetries; - - /** The backoff multiplier for for the policy. */ - private final float mBackoffMultiplier; - - /** The default socket timeout in milliseconds */ - public static final int DEFAULT_TIMEOUT_MS = 2500; - - /** The default number of retries */ - public static final int DEFAULT_MAX_RETRIES = 1; - - /** The default backoff multiplier */ - public static final float DEFAULT_BACKOFF_MULT = 1f; - - /** - * Constructs a new retry policy using the default timeouts. - */ - public DefaultRetryPolicy() { - this(DEFAULT_TIMEOUT_MS, DEFAULT_MAX_RETRIES, DEFAULT_BACKOFF_MULT); - } - - /** - * Constructs a new retry policy. - * @param initialTimeoutMs The initial timeout for the policy. - * @param maxNumRetries The maximum number of retries. - * @param backoffMultiplier Backoff multiplier for the policy. - */ - public DefaultRetryPolicy(int initialTimeoutMs, int maxNumRetries, float backoffMultiplier) { - mCurrentTimeoutMs = initialTimeoutMs; - mMaxNumRetries = maxNumRetries; - mBackoffMultiplier = backoffMultiplier; - } - - /** - * Returns the current timeout. - */ - @Override - public int getCurrentTimeout() { - return mCurrentTimeoutMs; - } - - /** - * Returns the current retry count. - */ - @Override - public int getCurrentRetryCount() { - return mCurrentRetryCount; - } - - /** - * Prepares for the next retry by applying a backoff to the timeout. - * @param error The error code of the last attempt. - */ - @Override - public void retry(VolleyError error) throws VolleyError { - mCurrentRetryCount++; - mCurrentTimeoutMs += (mCurrentTimeoutMs * mBackoffMultiplier); - if (!hasAttemptRemaining()) { - throw error; - } - } - - /** - * Returns true if this policy has attempts remaining, false otherwise. - */ - protected boolean hasAttemptRemaining() { - return mCurrentRetryCount <= mMaxNumRetries; - } -} diff --git a/app/src/main/java/com/android/volley/ExecutorDelivery.java b/app/src/main/java/com/android/volley/ExecutorDelivery.java deleted file mode 100644 index 1babfcd195..0000000000 --- a/app/src/main/java/com/android/volley/ExecutorDelivery.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley; - -import android.os.Handler; - -import java.util.concurrent.Executor; - -/** - * Delivers responses and errors. - */ -public class ExecutorDelivery implements ResponseDelivery { - /** Used for posting responses, typically to the main thread. */ - private final Executor mResponsePoster; - - /** - * Creates a new response delivery interface. - * @param handler {@link Handler} to post responses on - */ - public ExecutorDelivery(final Handler handler) { - // Make an Executor that just wraps the handler. - mResponsePoster = new Executor() { - @Override - public void execute(Runnable command) { - handler.post(command); - } - }; - } - - /** - * Creates a new response delivery interface, mockable version - * for testing. - * @param executor For running delivery tasks - */ - public ExecutorDelivery(Executor executor) { - mResponsePoster = executor; - } - - @Override - public void postResponse(Request request, Response response) { - postResponse(request, response, null); - } - - @Override - public void postResponse(Request request, Response response, Runnable runnable) { - request.markDelivered(); - request.addMarker("post-response"); - mResponsePoster.execute(new ResponseDeliveryRunnable(request, response, runnable)); - } - - @Override - public void postError(Request request, VolleyError error) { - request.addMarker("post-error"); - Response response = Response.error(error); - mResponsePoster.execute(new ResponseDeliveryRunnable(request, response, null)); - } - - /** - * A Runnable used for delivering network responses to a listener on the - * main thread. - */ - @SuppressWarnings("rawtypes") - private class ResponseDeliveryRunnable implements Runnable { - private final Request mRequest; - private final Response mResponse; - private final Runnable mRunnable; - - public ResponseDeliveryRunnable(Request request, Response response, Runnable runnable) { - mRequest = request; - mResponse = response; - mRunnable = runnable; - } - - @SuppressWarnings("unchecked") - @Override - public void run() { - // If this request has canceled, finish it and don't deliver. - if (mRequest.isCanceled()) { - mRequest.finish("canceled-at-delivery"); - return; - } - - // Deliver a normal response or error, depending. - if (mResponse.isSuccess()) { - mRequest.deliverResponse(mResponse.result); - } else { - mRequest.deliverError(mResponse.error); - } - - // If this is an intermediate response, add a marker, otherwise we're done - // and the request can be finished. - if (mResponse.intermediate) { - mRequest.addMarker("intermediate-response"); - } else { - mRequest.finish("done"); - } - - // If we have been provided a post-delivery runnable, run it. - if (mRunnable != null) { - mRunnable.run(); - } - } - } -} diff --git a/app/src/main/java/com/android/volley/Network.java b/app/src/main/java/com/android/volley/Network.java deleted file mode 100644 index ab45830f6a..0000000000 --- a/app/src/main/java/com/android/volley/Network.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley; - -/** - * An interface for performing requests. - */ -public interface Network { - /** - * Performs the specified request. - * @param request Request to process - * @return A {@link NetworkResponse} with data and caching metadata; will never be null - * @throws VolleyError on errors - */ - public NetworkResponse performRequest(Request request) throws VolleyError; -} diff --git a/app/src/main/java/com/android/volley/NetworkDispatcher.java b/app/src/main/java/com/android/volley/NetworkDispatcher.java deleted file mode 100644 index 0a82c81c8a..0000000000 --- a/app/src/main/java/com/android/volley/NetworkDispatcher.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley; - -import android.net.TrafficStats; -import android.os.Build; -import android.os.Process; - -import java.util.concurrent.BlockingQueue; - -/** - * Provides a thread for performing network dispatch from a queue of requests. - * - * Requests added to the specified queue are processed from the network via a - * specified {@link Network} interface. Responses are committed to cache, if - * eligible, using a specified {@link Cache} interface. Valid responses and - * errors are posted back to the caller via a {@link ResponseDelivery}. - */ -@SuppressWarnings("rawtypes") -public class NetworkDispatcher extends Thread { - /** The queue of requests to service. */ - private final BlockingQueue mQueue; - /** The network interface for processing requests. */ - private final Network mNetwork; - /** The cache to write to. */ - private final Cache mCache; - /** For posting responses and errors. */ - private final ResponseDelivery mDelivery; - /** Used for telling us to die. */ - private volatile boolean mQuit = false; - - /** - * Creates a new network dispatcher thread. You must call {@link #start()} - * in order to begin processing. - * - * @param queue Queue of incoming requests for triage - * @param network Network interface to use for performing requests - * @param cache Cache interface to use for writing responses to cache - * @param delivery Delivery interface to use for posting responses - */ - public NetworkDispatcher(BlockingQueue queue, - Network network, Cache cache, - ResponseDelivery delivery) { - mQueue = queue; - mNetwork = network; - mCache = cache; - mDelivery = delivery; - } - - /** - * Forces this dispatcher to quit immediately. If any requests are still in - * the queue, they are not guaranteed to be processed. - */ - public void quit() { - mQuit = true; - interrupt(); - } - - @Override - public void run() { - Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); - Request request; - while (true) { - try { - // Take a request from the queue. - request = mQueue.take(); - } catch (InterruptedException e) { - // We may have been interrupted because it was time to quit. - if (mQuit) { - return; - } - continue; - } - - try { - request.addMarker("network-queue-take"); - - // If the request was cancelled already, do not perform the - // network request. - if (request.isCanceled()) { - request.finish("network-discard-cancelled"); - continue; - } - - // Tag the request (if API >= 14) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { - TrafficStats.setThreadStatsTag(request.getTrafficStatsTag()); - } - - // Perform the network request. - NetworkResponse networkResponse = mNetwork.performRequest(request); - request.addMarker("network-http-complete"); - - // If the server returned 304 AND we delivered a response already, - // we're done -- don't deliver a second identical response. - if (networkResponse.notModified && request.hasHadResponseDelivered()) { - request.finish("not-modified"); - continue; - } - - // Parse the response here on the worker thread. - Response response = request.parseNetworkResponse(networkResponse); - request.addMarker("network-parse-complete"); - - // Write to cache if applicable. - // TODO: Only update cache metadata instead of entire record for 304s. - if (request.shouldCache() && response.cacheEntry != null) { - mCache.put(request.getCacheKey(), response.cacheEntry); - request.addMarker("network-cache-written"); - } - - // Post the response back. - request.markDelivered(); - mDelivery.postResponse(request, response); - } catch (VolleyError volleyError) { - parseAndDeliverNetworkError(request, volleyError); - } catch (Exception e) { - VolleyLog.e(e, "Unhandled exception %s", e.toString()); - mDelivery.postError(request, new VolleyError(e)); - } - } - } - - private void parseAndDeliverNetworkError(Request request, VolleyError error) { - error = request.parseNetworkError(error); - mDelivery.postError(request, error); - } -} diff --git a/app/src/main/java/com/android/volley/NetworkError.java b/app/src/main/java/com/android/volley/NetworkError.java deleted file mode 100644 index 63c388e16b..0000000000 --- a/app/src/main/java/com/android/volley/NetworkError.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley; - - -/** - * Indicates that there was a network error when performing a Volley request. - */ -@SuppressWarnings("serial") -public class NetworkError extends VolleyError { - public NetworkError() { - super(); - } - - public NetworkError(Throwable cause) { - super(cause); - } - - public NetworkError(NetworkResponse networkResponse) { - super(networkResponse); - } -} diff --git a/app/src/main/java/com/android/volley/NetworkResponse.java b/app/src/main/java/com/android/volley/NetworkResponse.java deleted file mode 100644 index 6a0b5c2b5d..0000000000 --- a/app/src/main/java/com/android/volley/NetworkResponse.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley; - -import org.apache.http.HttpStatus; - -import java.util.Collections; -import java.util.Map; - -/** - * Data and headers returned from {@link Network#performRequest(Request)}. - */ -public class NetworkResponse { - /** - * Creates a new network response. - * @param statusCode the HTTP status code - * @param data Response body - * @param headers Headers returned with this response, or null for none - * @param notModified True if the server returned a 304 and the data was already in cache - */ - public NetworkResponse(int statusCode, byte[] data, Map headers, - boolean notModified) { - this.statusCode = statusCode; - this.data = data; - this.headers = headers; - this.notModified = notModified; - } - - public NetworkResponse(byte[] data) { - this(HttpStatus.SC_OK, data, Collections.emptyMap(), false); - } - - public NetworkResponse(byte[] data, Map headers) { - this(HttpStatus.SC_OK, data, headers, false); - } - - /** The HTTP status code. */ - public final int statusCode; - - /** Raw data from this response. */ - public final byte[] data; - - /** Response headers. */ - public final Map headers; - - /** True if the server returned a 304 (Not Modified). */ - public final boolean notModified; -} \ No newline at end of file diff --git a/app/src/main/java/com/android/volley/NoConnectionError.java b/app/src/main/java/com/android/volley/NoConnectionError.java deleted file mode 100644 index fc231562ad..0000000000 --- a/app/src/main/java/com/android/volley/NoConnectionError.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley; - -/** - * Error indicating that no connection could be established when performing a Volley request. - */ -@SuppressWarnings("serial") -public class NoConnectionError extends NetworkError { - public NoConnectionError() { - super(); - } - - public NoConnectionError(Throwable reason) { - super(reason); - } -} diff --git a/app/src/main/java/com/android/volley/ParseError.java b/app/src/main/java/com/android/volley/ParseError.java deleted file mode 100644 index 81f32e07c3..0000000000 --- a/app/src/main/java/com/android/volley/ParseError.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley; - - -/** - * Indicates that the server's response could not be parsed. - */ -@SuppressWarnings("serial") -public class ParseError extends VolleyError { - public ParseError() { } - - public ParseError(NetworkResponse networkResponse) { - super(networkResponse); - } - - public ParseError(Throwable cause) { - super(cause); - } -} diff --git a/app/src/main/java/com/android/volley/Request.java b/app/src/main/java/com/android/volley/Request.java deleted file mode 100644 index 9fee0a08ba..0000000000 --- a/app/src/main/java/com/android/volley/Request.java +++ /dev/null @@ -1,543 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley; - -import android.net.TrafficStats; -import android.net.Uri; -import android.os.Handler; -import android.os.Looper; -import android.os.SystemClock; -import android.text.TextUtils; - -import com.android.volley.VolleyLog.MarkerLog; - -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.util.Collections; -import java.util.Map; - -/** - * Base class for all network requests. - * - * @param The type of parsed response this request expects. - */ -public abstract class Request implements Comparable> { - - /** - * Default encoding for POST or PUT parameters. See {@link #getParamsEncoding()}. - */ - private static final String DEFAULT_PARAMS_ENCODING = "UTF-8"; - - /** - * Supported request methods. - */ - public interface Method { - int DEPRECATED_GET_OR_POST = -1; - int GET = 0; - int POST = 1; - int PUT = 2; - int DELETE = 3; - } - - /** An event log tracing the lifetime of this request; for debugging. */ - private final MarkerLog mEventLog = MarkerLog.ENABLED ? new MarkerLog() : null; - - /** Request method of this request. Currently supports GET, POST, PUT, and DELETE. */ - private final int mMethod; - - /** URL of this request. */ - private final String mUrl; - - /** Default tag for {@link TrafficStats}. */ - private final int mDefaultTrafficStatsTag; - - /** Listener interface for errors. */ - private final Response.ErrorListener mErrorListener; - - /** Sequence number of this request, used to enforce FIFO ordering. */ - private Integer mSequence; - - /** The request queue this request is associated with. */ - private RequestQueue mRequestQueue; - - /** Whether or not responses to this request should be cached. */ - private boolean mShouldCache = true; - - /** Whether or not this request has been canceled. */ - private boolean mCanceled = false; - - /** Whether or not a response has been delivered for this request yet. */ - private boolean mResponseDelivered = false; - - // A cheap variant of request tracing used to dump slow requests. - private long mRequestBirthTime = 0; - - /** Threshold at which we should log the request (even when debug logging is not enabled). */ - private static final long SLOW_REQUEST_THRESHOLD_MS = 3000; - - /** The retry policy for this request. */ - private RetryPolicy mRetryPolicy; - - /** - * When a request can be retrieved from cache but must be refreshed from - * the network, the cache entry will be stored here so that in the event of - * a "Not Modified" response, we can be sure it hasn't been evicted from cache. - */ - private Cache.Entry mCacheEntry = null; - - /** An opaque token tagging this request; used for bulk cancellation. */ - private Object mTag; - - /** - * Creates a new request with the given URL and 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. - * - * @deprecated Use {@link #Request(int, String, com.android.volley.Response.ErrorListener)}. - */ - public Request(String url, Response.ErrorListener listener) { - this(Method.DEPRECATED_GET_OR_POST, url, listener); - } - - /** - * Creates a new request with the given method (one of the values from {@link Method}), - * URL, and 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. - */ - public Request(int method, String url, Response.ErrorListener listener) { - mMethod = method; - mUrl = url; - mErrorListener = listener; - setRetryPolicy(new DefaultRetryPolicy()); - - mDefaultTrafficStatsTag = TextUtils.isEmpty(url) ? 0: Uri.parse(url).getHost().hashCode(); - } - - /** - * Return the method for this request. Can be one of the values in {@link Method}. - */ - public int getMethod() { - return mMethod; - } - - /** - * Set a tag on this request. Can be used to cancel all requests with this - * tag by {@link RequestQueue#cancelAll(Object)}. - */ - public void setTag(Object tag) { - mTag = tag; - } - - /** - * Returns this request's tag. - * @see Request#setTag(Object) - */ - public Object getTag() { - return mTag; - } - - /** - * @return A tag for use with {@link TrafficStats#setThreadStatsTag(int)} - */ - public int getTrafficStatsTag() { - return mDefaultTrafficStatsTag; - } - - /** - * Sets the retry policy for this request. - */ - public void setRetryPolicy(RetryPolicy retryPolicy) { - mRetryPolicy = retryPolicy; - } - - /** - * Adds an event to this request's event log; for debugging. - */ - public void addMarker(String tag) { - if (MarkerLog.ENABLED) { - mEventLog.add(tag, Thread.currentThread().getId()); - } else if (mRequestBirthTime == 0) { - mRequestBirthTime = SystemClock.elapsedRealtime(); - } - } - - /** - * Notifies the request queue that this request has finished (successfully or with error). - * - *

Also dumps all events from this request's event log; for debugging.

- */ - void finish(final String tag) { - if (mRequestQueue != null) { - mRequestQueue.finish(this); - } - if (MarkerLog.ENABLED) { - final long threadId = Thread.currentThread().getId(); - if (Looper.myLooper() != Looper.getMainLooper()) { - // If we finish marking off of the main thread, we need to - // actually do it on the main thread to ensure correct ordering. - Handler mainThread = new Handler(Looper.getMainLooper()); - mainThread.post(new Runnable() { - @Override - public void run() { - mEventLog.add(tag, threadId); - mEventLog.finish(this.toString()); - } - }); - return; - } - - mEventLog.add(tag, threadId); - mEventLog.finish(this.toString()); - } else { - long requestTime = SystemClock.elapsedRealtime() - mRequestBirthTime; - if (requestTime >= SLOW_REQUEST_THRESHOLD_MS) { - VolleyLog.d("%d ms: %s", requestTime, this.toString()); - } - } - } - - /** - * Associates this request with the given queue. The request queue will be notified when this - * request has finished. - */ - public void setRequestQueue(RequestQueue requestQueue) { - mRequestQueue = requestQueue; - } - - /** - * Sets the sequence number of this request. Used by {@link RequestQueue}. - */ - public final void setSequence(int sequence) { - mSequence = sequence; - } - - /** - * Returns the sequence number of this request. - */ - public final int getSequence() { - if (mSequence == null) { - throw new IllegalStateException("getSequence called before setSequence"); - } - return mSequence; - } - - /** - * Returns the URL of this request. - */ - public String getUrl() { - return mUrl; - } - - /** - * Returns the cache key for this request. By default, this is the URL. - */ - public String getCacheKey() { - return getUrl(); - } - - /** - * Annotates this request with an entry retrieved for it from cache. - * Used for cache coherency support. - */ - public void setCacheEntry(Cache.Entry entry) { - mCacheEntry = entry; - } - - /** - * Returns the annotated cache entry, or null if there isn't one. - */ - public Cache.Entry getCacheEntry() { - return mCacheEntry; - } - - /** - * Mark this request as canceled. No callback will be delivered. - */ - public void cancel() { - mCanceled = true; - } - - /** - * Returns true if this request has been canceled. - */ - public boolean isCanceled() { - return mCanceled; - } - - /** - * Returns a list of extra HTTP headers to go along with this request. Can - * throw {@link AuthFailureError} as authentication may be required to - * provide these values. - * @throws AuthFailureError In the event of auth failure - */ - public Map getHeaders() throws AuthFailureError { - return Collections.emptyMap(); - } - - /** - * Returns a Map of POST parameters to be used for this request, or null if - * a simple GET should be used. Can throw {@link AuthFailureError} as - * authentication may be required to provide these values. - * - *

Note that only one of getPostParams() and getPostBody() can return a non-null - * value.

- * @throws AuthFailureError In the event of auth failure - * - * @deprecated Use {@link #getParams()} instead. - */ - protected Map getPostParams() throws AuthFailureError { - return getParams(); - } - - /** - * Returns which encoding should be used when converting POST parameters returned by - * {@link #getPostParams()} into a raw POST body. - * - *

This controls both encodings: - *

    - *
  1. The string encoding used when converting parameter names and values into bytes prior - * to URL encoding them.
  2. - *
  3. The string encoding used when converting the URL encoded parameters into a raw - * byte array.
  4. - *
- * - * @deprecated Use {@link #getParamsEncoding()} instead. - */ - protected String getPostParamsEncoding() { - return getParamsEncoding(); - } - - /** - * @deprecated Use {@link #getBodyContentType()} instead. - */ - public String getPostBodyContentType() { - return getBodyContentType(); - } - - /** - * Returns the raw POST body to be sent. - * - * @throws AuthFailureError In the event of auth failure - * - * @deprecated Use {@link #getBody()} instead. - */ - public byte[] getPostBody() throws AuthFailureError { - // Note: For compatibility with legacy clients of volley, this implementation must remain - // here instead of simply calling the getBody() function because this function must - // call getPostParams() and getPostParamsEncoding() since legacy clients would have - // overridden these two member functions for POST requests. - Map postParams = getPostParams(); - if (postParams != null && postParams.size() > 0) { - return encodeParameters(postParams, getPostParamsEncoding()); - } - return null; - } - - /** - * Returns a Map of parameters to be used for a POST or PUT request. Can throw - * {@link AuthFailureError} as authentication may be required to provide these values. - * - *

Note that you can directly override {@link #getBody()} for custom data.

- * - * @throws AuthFailureError in the event of auth failure - */ - protected Map getParams() throws AuthFailureError { - return null; - } - - /** - * Returns which encoding should be used when converting POST or PUT parameters returned by - * {@link #getParams()} into a raw POST or PUT body. - * - *

This controls both encodings: - *

    - *
  1. The string encoding used when converting parameter names and values into bytes prior - * to URL encoding them.
  2. - *
  3. The string encoding used when converting the URL encoded parameters into a raw - * byte array.
  4. - *
- */ - protected String getParamsEncoding() { - return DEFAULT_PARAMS_ENCODING; - } - - public String getBodyContentType() { - return "application/x-www-form-urlencoded; charset=" + getParamsEncoding(); - } - - /** - * Returns the raw POST or PUT body to be sent. - * - * @throws AuthFailureError in the event of auth failure - */ - public byte[] getBody() throws AuthFailureError { - Map params = getParams(); - if (params != null && params.size() > 0) { - return encodeParameters(params, getParamsEncoding()); - } - return null; - } - - /** - * Converts params into an application/x-www-form-urlencoded encoded string. - */ - private byte[] encodeParameters(Map params, String paramsEncoding) { - StringBuilder encodedParams = new StringBuilder(); - try { - for (Map.Entry entry : params.entrySet()) { - encodedParams.append(URLEncoder.encode(entry.getKey(), paramsEncoding)); - encodedParams.append('='); - encodedParams.append(URLEncoder.encode(entry.getValue(), paramsEncoding)); - encodedParams.append('&'); - } - return encodedParams.toString().getBytes(paramsEncoding); - } catch (UnsupportedEncodingException uee) { - throw new RuntimeException("Encoding not supported: " + paramsEncoding, uee); - } - } - - /** - * Set whether or not responses to this request should be cached. - */ - public final void setShouldCache(boolean shouldCache) { - mShouldCache = shouldCache; - } - - /** - * Returns true if responses to this request should be cached. - */ - public final boolean shouldCache() { - return mShouldCache; - } - - /** - * Priority values. Requests will be processed from higher priorities to - * lower priorities, in FIFO order. - */ - public enum Priority { - LOW, - NORMAL, - HIGH, - IMMEDIATE - } - - /** - * Returns the {@link Priority} of this request; {@link Priority#NORMAL} by default. - */ - public Priority getPriority() { - return Priority.NORMAL; - } - - /** - * Returns the socket timeout in milliseconds per retry attempt. (This value can be changed - * per retry attempt if a backoff is specified via backoffTimeout()). If there are no retry - * attempts remaining, this will cause delivery of a {@link TimeoutError} error. - */ - public final int getTimeoutMs() { - return mRetryPolicy.getCurrentTimeout(); - } - - /** - * Returns the retry policy that should be used for this request. - */ - public RetryPolicy getRetryPolicy() { - return mRetryPolicy; - } - - /** - * Mark this request as having a response delivered on it. This can be used - * later in the request's lifetime for suppressing identical responses. - */ - public void markDelivered() { - mResponseDelivered = true; - } - - /** - * Returns true if this request has had a response delivered for it. - */ - public boolean hasHadResponseDelivered() { - return mResponseDelivered; - } - - /** - * Subclasses must implement this to parse the raw network response - * and return an appropriate response type. This method will be - * called from a worker thread. The response will not be delivered - * if you return null. - * @param response Response from the network - * @return The parsed response, or null in the case of an error - */ - abstract protected Response parseNetworkResponse(NetworkResponse response); - - /** - * Subclasses can override this method to parse 'networkError' and return a more specific error. - * - *

The default implementation just returns the passed 'networkError'.

- * - * @param volleyError the error retrieved from the network - * @return an NetworkError augmented with additional information - */ - protected VolleyError parseNetworkError(VolleyError volleyError) { - return volleyError; - } - - /** - * Subclasses must implement this to perform delivery of the parsed - * response to their listeners. The given response is guaranteed to - * be non-null; responses that fail to parse are not delivered. - * @param response The parsed response returned by - * {@link #parseNetworkResponse(NetworkResponse)} - */ - abstract protected void deliverResponse(T response); - - /** - * Delivers error message to the ErrorListener that the Request was - * initialized with. - * - * @param error Error details - */ - public void deliverError(VolleyError error) { - if (mErrorListener != null) { - mErrorListener.onErrorResponse(error); - } - } - - /** - * Our comparator sorts from high to low priority, and secondarily by - * sequence number to provide FIFO ordering. - */ - @Override - public int compareTo(Request other) { - Priority left = this.getPriority(); - Priority right = other.getPriority(); - - // High-priority requests are "lesser" so they are sorted to the front. - // Equal priorities are sorted by sequence number to provide FIFO ordering. - return left == right ? - this.mSequence - other.mSequence : - right.ordinal() - left.ordinal(); - } - - @Override - public String toString() { - String trafficStatsTag = "0x" + Integer.toHexString(getTrafficStatsTag()); - return (mCanceled ? "[X] " : "[ ] ") + getUrl() + " " + trafficStatsTag + " " - + getPriority() + " " + mSequence; - } -} diff --git a/app/src/main/java/com/android/volley/RequestQueue.java b/app/src/main/java/com/android/volley/RequestQueue.java deleted file mode 100644 index bcd86f6726..0000000000 --- a/app/src/main/java/com/android/volley/RequestQueue.java +++ /dev/null @@ -1,287 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley; - -import android.os.Handler; -import android.os.Looper; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.Map; -import java.util.Queue; -import java.util.Set; -import java.util.concurrent.PriorityBlockingQueue; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * A request dispatch queue with a thread pool of dispatchers. - * - * Calling {@link #add(Request)} will enqueue the given Request for dispatch, - * resolving from either cache or network on a worker thread, and then delivering - * a parsed response on the main thread. - */ -@SuppressWarnings("rawtypes") -public class RequestQueue { - - /** Used for generating monotonically-increasing sequence numbers for requests. */ - private AtomicInteger mSequenceGenerator = new AtomicInteger(); - - /** - * Staging area for requests that already have a duplicate request in flight. - * - *
    - *
  • containsKey(cacheKey) indicates that there is a request in flight for the given cache - * key.
  • - *
  • get(cacheKey) returns waiting requests for the given cache key. The in flight request - * is not contained in that list. Is null if no requests are staged.
  • - *
- */ - private final Map> mWaitingRequests = - new HashMap>(); - - /** - * The set of all requests currently being processed by this RequestQueue. A Request - * will be in this set if it is waiting in any queue or currently being processed by - * any dispatcher. - */ - private final Set mCurrentRequests = new HashSet(); - - /** The cache triage queue. */ - private final PriorityBlockingQueue mCacheQueue = - new PriorityBlockingQueue(); - - /** The queue of requests that are actually going out to the network. */ - private final PriorityBlockingQueue mNetworkQueue = - new PriorityBlockingQueue(); - - /** Number of network request dispatcher threads to start. */ - private static final int DEFAULT_NETWORK_THREAD_POOL_SIZE = 4; - - /** Cache interface for retrieving and storing respones. */ - private final Cache mCache; - - /** Network interface for performing requests. */ - private final Network mNetwork; - - /** Response delivery mechanism. */ - private final ResponseDelivery mDelivery; - - /** The network dispatchers. */ - private NetworkDispatcher[] mDispatchers; - - /** The cache dispatcher. */ - private CacheDispatcher mCacheDispatcher; - - /** - * Creates the worker pool. Processing will not begin until {@link #start()} is called. - * - * @param cache A Cache to use for persisting responses to disk - * @param network A Network interface for performing HTTP requests - * @param threadPoolSize Number of network dispatcher threads to create - * @param delivery A ResponseDelivery interface for posting responses and errors - */ - public RequestQueue(Cache cache, Network network, int threadPoolSize, - ResponseDelivery delivery) { - mCache = cache; - mNetwork = network; - mDispatchers = new NetworkDispatcher[threadPoolSize]; - mDelivery = delivery; - } - - /** - * Creates the worker pool. Processing will not begin until {@link #start()} is called. - * - * @param cache A Cache to use for persisting responses to disk - * @param network A Network interface for performing HTTP requests - * @param threadPoolSize Number of network dispatcher threads to create - */ - public RequestQueue(Cache cache, Network network, int threadPoolSize) { - this(cache, network, threadPoolSize, - new ExecutorDelivery(new Handler(Looper.getMainLooper()))); - } - - /** - * Creates the worker pool. Processing will not begin until {@link #start()} is called. - * - * @param cache A Cache to use for persisting responses to disk - * @param network A Network interface for performing HTTP requests - */ - public RequestQueue(Cache cache, Network network) { - this(cache, network, DEFAULT_NETWORK_THREAD_POOL_SIZE); - } - - /** - * Starts the dispatchers in this queue. - */ - public void start() { - stop(); // Make sure any currently running dispatchers are stopped. - // Create the cache dispatcher and start it. - mCacheDispatcher = new CacheDispatcher(mCacheQueue, mNetworkQueue, mCache, mDelivery); - mCacheDispatcher.start(); - - // Create network dispatchers (and corresponding threads) up to the pool size. - for (int i = 0; i < mDispatchers.length; i++) { - NetworkDispatcher networkDispatcher = new NetworkDispatcher(mNetworkQueue, mNetwork, - mCache, mDelivery); - mDispatchers[i] = networkDispatcher; - networkDispatcher.start(); - } - } - - /** - * Stops the cache and network dispatchers. - */ - public void stop() { - if (mCacheDispatcher != null) { - mCacheDispatcher.quit(); - } - for (int i = 0; i < mDispatchers.length; i++) { - if (mDispatchers[i] != null) { - mDispatchers[i].quit(); - } - } - } - - /** - * Gets a sequence number. - */ - public int getSequenceNumber() { - return mSequenceGenerator.incrementAndGet(); - } - - /** - * Gets the {@link Cache} instance being used. - */ - public Cache getCache() { - return mCache; - } - - /** - * A simple predicate or filter interface for Requests, for use by - * {@link RequestQueue#cancelAll(RequestFilter)}. - */ - public interface RequestFilter { - public boolean apply(Request request); - } - - /** - * Cancels all requests in this queue for which the given filter applies. - * @param filter The filtering function to use - */ - public void cancelAll(RequestFilter filter) { - synchronized (mCurrentRequests) { - for (Request request : mCurrentRequests) { - if (filter.apply(request)) { - request.cancel(); - } - } - } - } - - /** - * Cancels all requests in this queue with the given tag. Tag must be non-null - * and equality is by identity. - */ - public void cancelAll(final Object tag) { - if (tag == null) { - throw new IllegalArgumentException("Cannot cancelAll with a null tag"); - } - cancelAll(new RequestFilter() { - @Override - public boolean apply(Request request) { - return request.getTag() == tag; - } - }); - } - - /** - * Adds a Request to the dispatch queue. - * @param request The request to service - * @return The passed-in request - */ - public Request add(Request request) { - // Tag the request as belonging to this queue and add it to the set of current requests. - request.setRequestQueue(this); - synchronized (mCurrentRequests) { - mCurrentRequests.add(request); - } - - // Process requests in the order they are added. - request.setSequence(getSequenceNumber()); - request.addMarker("add-to-queue"); - - // If the request is uncacheable, skip the cache queue and go straight to the network. - if (!request.shouldCache()) { - mNetworkQueue.add(request); - return request; - } - - // Insert request into stage if there's already a request with the same cache key in flight. - synchronized (mWaitingRequests) { - String cacheKey = request.getCacheKey(); - if (mWaitingRequests.containsKey(cacheKey)) { - // There is already a request in flight. Queue up. - Queue stagedRequests = mWaitingRequests.get(cacheKey); - if (stagedRequests == null) { - stagedRequests = new LinkedList(); - } - stagedRequests.add(request); - mWaitingRequests.put(cacheKey, stagedRequests); - if (VolleyLog.DEBUG) { - VolleyLog.v("Request for cacheKey=%s is in flight, putting on hold.", cacheKey); - } - } else { - // Insert 'null' queue for this cacheKey, indicating there is now a request in - // flight. - mWaitingRequests.put(cacheKey, null); - mCacheQueue.add(request); - } - return request; - } - } - - /** - * Called from {@link Request#finish(String)}, indicating that processing of the given request - * has finished. - * - *

Releases waiting requests for request.getCacheKey() if - * request.shouldCache().

- */ - void finish(Request request) { - // Remove from the set of requests currently being processed. - synchronized (mCurrentRequests) { - mCurrentRequests.remove(request); - } - - if (request.shouldCache()) { - synchronized (mWaitingRequests) { - String cacheKey = request.getCacheKey(); - Queue waitingRequests = mWaitingRequests.remove(cacheKey); - if (waitingRequests != null) { - if (VolleyLog.DEBUG) { - VolleyLog.v("Releasing %d waiting requests for cacheKey=%s.", - waitingRequests.size(), cacheKey); - } - // Process all queued up requests. They won't be considered as in flight, but - // that's not a problem as the cache has been primed by 'request'. - mCacheQueue.addAll(waitingRequests); - } - } - } - } -} diff --git a/app/src/main/java/com/android/volley/Response.java b/app/src/main/java/com/android/volley/Response.java deleted file mode 100644 index 1165595da6..0000000000 --- a/app/src/main/java/com/android/volley/Response.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley; - -/** - * Encapsulates a parsed response for delivery. - * - * @param Parsed type of this response - */ -public class Response { - - /** Callback interface for delivering parsed responses. */ - public interface Listener { - /** Called when a response is received. */ - public void onResponse(T response); - } - - /** Callback interface for delivering error responses. */ - public interface ErrorListener { - /** - * Callback method that an error has been occurred with the - * provided error code and optional user-readable message. - */ - public void onErrorResponse(VolleyError error); - } - - /** Returns a successful response containing the parsed result. */ - public static Response success(T result, Cache.Entry cacheEntry) { - return new Response(result, cacheEntry); - } - - /** - * Returns a failed response containing the given error code and an optional - * localized message displayed to the user. - */ - public static Response error(VolleyError error) { - return new Response(error); - } - - /** Parsed response, or null in the case of error. */ - public final T result; - - /** Cache metadata for this response, or null in the case of error. */ - public final Cache.Entry cacheEntry; - - /** Detailed error information if errorCode != OK. */ - public final VolleyError error; - - /** True if this response was a soft-expired one and a second one MAY be coming. */ - public boolean intermediate = false; - - /** - * Returns whether this response is considered successful. - */ - public boolean isSuccess() { - return error == null; - } - - - private Response(T result, Cache.Entry cacheEntry) { - this.result = result; - this.cacheEntry = cacheEntry; - this.error = null; - } - - private Response(VolleyError error) { - this.result = null; - this.cacheEntry = null; - this.error = error; - } -} diff --git a/app/src/main/java/com/android/volley/ResponseDelivery.java b/app/src/main/java/com/android/volley/ResponseDelivery.java deleted file mode 100644 index 87706afcb7..0000000000 --- a/app/src/main/java/com/android/volley/ResponseDelivery.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley; - -public interface ResponseDelivery { - /** - * Parses a response from the network or cache and delivers it. - */ - public void postResponse(Request request, Response response); - - /** - * Parses a response from the network or cache and delivers it. The provided - * Runnable will be executed after delivery. - */ - public void postResponse(Request request, Response response, Runnable runnable); - - /** - * Posts an error for the given request. - */ - public void postError(Request request, VolleyError error); -} diff --git a/app/src/main/java/com/android/volley/RetryPolicy.java b/app/src/main/java/com/android/volley/RetryPolicy.java deleted file mode 100644 index 0dd198b206..0000000000 --- a/app/src/main/java/com/android/volley/RetryPolicy.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley; - -/** - * Retry policy for a request. - */ -public interface RetryPolicy { - - /** - * Returns the current timeout (used for logging). - */ - public int getCurrentTimeout(); - - /** - * Returns the current retry count (used for logging). - */ - public int getCurrentRetryCount(); - - /** - * Prepares for the next retry by applying a backoff to the timeout. - * @param error The error code of the last attempt. - * @throws VolleyError In the event that the retry could not be performed (for example if we - * ran out of attempts), the passed in error is thrown. - */ - public void retry(VolleyError error) throws VolleyError; -} diff --git a/app/src/main/java/com/android/volley/ServerError.java b/app/src/main/java/com/android/volley/ServerError.java deleted file mode 100644 index d76f979aae..0000000000 --- a/app/src/main/java/com/android/volley/ServerError.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley; - - -/** - * Indicates that the error responded with an error response. - */ -@SuppressWarnings("serial") -public class ServerError extends VolleyError { - public ServerError(NetworkResponse networkResponse) { - super(networkResponse); - } - - public ServerError() { - super(); - } -} diff --git a/app/src/main/java/com/android/volley/TimeoutError.java b/app/src/main/java/com/android/volley/TimeoutError.java deleted file mode 100644 index 0b5d6acb79..0000000000 --- a/app/src/main/java/com/android/volley/TimeoutError.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley; - -/** - * Indicates that the connection or the socket timed out. - */ -@SuppressWarnings("serial") -public class TimeoutError extends VolleyError { } diff --git a/app/src/main/java/com/android/volley/VolleyError.java b/app/src/main/java/com/android/volley/VolleyError.java deleted file mode 100644 index 4f7b883dbc..0000000000 --- a/app/src/main/java/com/android/volley/VolleyError.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley; - -/** - * Exception style class encapsulating Volley errors - */ -@SuppressWarnings("serial") -public class VolleyError extends Exception { - public final NetworkResponse networkResponse; - - public VolleyError() { - networkResponse = null; - } - - public VolleyError(NetworkResponse response) { - networkResponse = response; - } - - public VolleyError(String exceptionMessage) { - super(exceptionMessage); - networkResponse = null; - } - - public VolleyError(String exceptionMessage, Throwable reason) { - super(exceptionMessage, reason); - networkResponse = null; - } - - public VolleyError(Throwable cause) { - super(cause); - networkResponse = null; - } -} diff --git a/app/src/main/java/com/android/volley/VolleyLog.java b/app/src/main/java/com/android/volley/VolleyLog.java deleted file mode 100644 index 6684690216..0000000000 --- a/app/src/main/java/com/android/volley/VolleyLog.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley; - -import android.os.SystemClock; -import android.util.Log; - -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; - -/** Logging helper class. */ -public class VolleyLog { - public static String TAG = "Volley"; - - public static boolean DEBUG = Log.isLoggable(TAG, Log.VERBOSE); - - /** - * Customize the log tag for your application, so that other apps - * using Volley don't mix their logs with yours. - *
- * Enable the log property for your tag before starting your app: - *
- * {@code adb shell setprop log.tag.<tag>} - */ - public static void setTag(String tag) { - d("Changing log tag to %s", tag); - TAG = tag; - - // Reinitialize the DEBUG "constant" - DEBUG = Log.isLoggable(TAG, Log.VERBOSE); - } - - public static void v(String format, Object... args) { - if (DEBUG) { - Log.v(TAG, buildMessage(format, args)); - } - } - - public static void d(String format, Object... args) { - Log.d(TAG, buildMessage(format, args)); - } - - public static void e(String format, Object... args) { - Log.e(TAG, buildMessage(format, args)); - } - - public static void e(Throwable tr, String format, Object... args) { - Log.e(TAG, buildMessage(format, args), tr); - } - - public static void wtf(String format, Object... args) { - Log.wtf(TAG, buildMessage(format, args)); - } - - public static void wtf(Throwable tr, String format, Object... args) { - Log.wtf(TAG, buildMessage(format, args), tr); - } - - /** - * Formats the caller's provided message and prepends useful info like - * calling thread ID and method name. - */ - private static String buildMessage(String format, Object... args) { - String msg = (args == null) ? format : String.format(Locale.US, format, args); - StackTraceElement[] trace = new Throwable().fillInStackTrace().getStackTrace(); - - String caller = ""; - // Walk up the stack looking for the first caller outside of VolleyLog. - // It will be at least two frames up, so start there. - for (int i = 2; i < trace.length; i++) { - Class clazz = trace[i].getClass(); - if (!clazz.equals(VolleyLog.class)) { - String callingClass = trace[i].getClassName(); - callingClass = callingClass.substring(callingClass.lastIndexOf('.') + 1); - callingClass = callingClass.substring(callingClass.lastIndexOf('$') + 1); - - caller = callingClass + "." + trace[i].getMethodName(); - break; - } - } - return String.format(Locale.US, "[%d] %s: %s", - Thread.currentThread().getId(), caller, msg); - } - - /** - * A simple event log with records containing a name, thread ID, and timestamp. - */ - static class MarkerLog { - public static final boolean ENABLED = VolleyLog.DEBUG; - - /** Minimum duration from first marker to last in an marker log to warrant logging. */ - private static final long MIN_DURATION_FOR_LOGGING_MS = 0; - - private static class Marker { - public final String name; - public final long thread; - public final long time; - - public Marker(String name, long thread, long time) { - this.name = name; - this.thread = thread; - this.time = time; - } - } - - private final List mMarkers = new ArrayList(); - private boolean mFinished = false; - - /** Adds a marker to this log with the specified name. */ - public synchronized void add(String name, long threadId) { - if (mFinished) { - throw new IllegalStateException("Marker added to finished log"); - } - - mMarkers.add(new Marker(name, threadId, SystemClock.elapsedRealtime())); - } - - /** - * Closes the log, dumping it to logcat if the time difference between - * the first and last markers is greater than {@link #MIN_DURATION_FOR_LOGGING_MS}. - * @param header Header string to print above the marker log. - */ - public synchronized void finish(String header) { - mFinished = true; - - long duration = getTotalDuration(); - if (duration <= MIN_DURATION_FOR_LOGGING_MS) { - return; - } - - long prevTime = mMarkers.get(0).time; - d("(%-4d ms) %s", duration, header); - for (Marker marker : mMarkers) { - long thisTime = marker.time; - d("(+%-4d) [%2d] %s", (thisTime - prevTime), marker.thread, marker.name); - prevTime = thisTime; - } - } - - @Override - protected void finalize() throws Throwable { - // Catch requests that have been collected (and hence end-of-lifed) - // but had no debugging output printed for them. - if (!mFinished) { - finish("Request on the loose"); - e("Marker log finalized without finish() - uncaught exit point for request"); - } - } - - /** Returns the time difference between the first and last events in this log. */ - private long getTotalDuration() { - if (mMarkers.size() == 0) { - return 0; - } - - long first = mMarkers.get(0).time; - long last = mMarkers.get(mMarkers.size() - 1).time; - return last - first; - } - } -} diff --git a/app/src/main/java/com/android/volley/toolbox/AndroidAuthenticator.java b/app/src/main/java/com/android/volley/toolbox/AndroidAuthenticator.java deleted file mode 100644 index b5f43ec060..0000000000 --- a/app/src/main/java/com/android/volley/toolbox/AndroidAuthenticator.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley.toolbox; - -import android.accounts.Account; -import android.accounts.AccountManager; -import android.accounts.AccountManagerFuture; -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; - -import com.android.volley.AuthFailureError; - -/** - * An Authenticator that uses {@link AccountManager} to get auth - * tokens of a specified type for a specified account. - */ -public class AndroidAuthenticator implements Authenticator { - private final Context mContext; - private final Account mAccount; - private final String mAuthTokenType; - private final boolean mNotifyAuthFailure; - - /** - * Creates a new authenticator. - * @param context Context for accessing AccountManager - * @param account Account to authenticate as - * @param authTokenType Auth token type passed to AccountManager - */ - public AndroidAuthenticator(Context context, Account account, String authTokenType) { - this(context, account, authTokenType, false); - } - - /** - * Creates a new authenticator. - * @param context Context for accessing AccountManager - * @param account Account to authenticate as - * @param authTokenType Auth token type passed to AccountManager - * @param notifyAuthFailure Whether to raise a notification upon auth failure - */ - public AndroidAuthenticator(Context context, Account account, String authTokenType, - boolean notifyAuthFailure) { - mContext = context; - mAccount = account; - mAuthTokenType = authTokenType; - mNotifyAuthFailure = notifyAuthFailure; - } - - /** - * Returns the Account being used by this authenticator. - */ - public Account getAccount() { - return mAccount; - } - - @Override - public String getAuthToken() throws AuthFailureError { - final AccountManager accountManager = AccountManager.get(mContext); - AccountManagerFuture future = accountManager.getAuthToken(mAccount, - mAuthTokenType, mNotifyAuthFailure, null, null); - Bundle result; - try { - result = future.getResult(); - } catch (Exception e) { - throw new AuthFailureError("Error while retrieving auth token", e); - } - String authToken = null; - if (future.isDone() && !future.isCancelled()) { - if (result.containsKey(AccountManager.KEY_INTENT)) { - Intent intent = result.getParcelable(AccountManager.KEY_INTENT); - throw new AuthFailureError(intent); - } - authToken = result.getString(AccountManager.KEY_AUTHTOKEN); - } - if (authToken == null) { - throw new AuthFailureError("Got null auth token for type: " + mAuthTokenType); - } - - return authToken; - } - - @Override - public void invalidateAuthToken(String authToken) { - AccountManager.get(mContext).invalidateAuthToken(mAccount.type, authToken); - } -} diff --git a/app/src/main/java/com/android/volley/toolbox/Authenticator.java b/app/src/main/java/com/android/volley/toolbox/Authenticator.java deleted file mode 100644 index d9f5e3c2f2..0000000000 --- a/app/src/main/java/com/android/volley/toolbox/Authenticator.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley.toolbox; - -import com.android.volley.AuthFailureError; - -/** - * An interface for interacting with auth tokens. - */ -public interface Authenticator { - /** - * Synchronously retrieves an auth token. - * - * @throws AuthFailureError If authentication did not succeed - */ - public String getAuthToken() throws AuthFailureError; - - /** - * Invalidates the provided auth token. - */ - public void invalidateAuthToken(String authToken); -} diff --git a/app/src/main/java/com/android/volley/toolbox/BasicNetwork.java b/app/src/main/java/com/android/volley/toolbox/BasicNetwork.java deleted file mode 100644 index c5ef297500..0000000000 --- a/app/src/main/java/com/android/volley/toolbox/BasicNetwork.java +++ /dev/null @@ -1,303 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley.toolbox; - -import android.os.SystemClock; - -import com.android.volley.AuthFailureError; -import com.android.volley.Cache; -import com.android.volley.Network; -import com.android.volley.NetworkError; -import com.android.volley.NetworkResponse; -import com.android.volley.NoConnectionError; -import com.android.volley.Request; -import com.android.volley.RetryPolicy; -import com.android.volley.ServerError; -import com.android.volley.TimeoutError; -import com.android.volley.VolleyError; -import com.android.volley.VolleyLog; -import com.gh.common.constant.Config; -import com.gh.common.util.GzipUtils; -import com.gh.gamecenter.volley.extended.JsonArrayExtendedRequest; -import com.gh.gamecenter.volley.extended.JsonObjectExtendedRequest; - -import org.apache.http.Header; -import org.apache.http.HttpEntity; -import org.apache.http.HttpResponse; -import org.apache.http.HttpStatus; -import org.apache.http.StatusLine; -import org.apache.http.conn.ConnectTimeoutException; -import org.apache.http.impl.cookie.DateUtils; - -import java.io.IOException; -import java.io.InputStream; -import java.net.MalformedURLException; -import java.net.SocketTimeoutException; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -/** - * A network performing Volley requests over an {@link HttpStack}. - */ -public class BasicNetwork implements Network { - protected static final boolean DEBUG = VolleyLog.DEBUG; - - private static int SLOW_REQUEST_THRESHOLD_MS = 3000; - - private static int DEFAULT_POOL_SIZE = 4096; - - protected final HttpStack mHttpStack; - - protected final ByteArrayPool mPool; - - /** - * @param httpStack - * HTTP stack to be used - */ - public BasicNetwork(HttpStack httpStack) { - // If a pool isn't passed in, then build a small default pool that will - // give us a lot of - // benefit and not use too much memory. - this(httpStack, new ByteArrayPool(DEFAULT_POOL_SIZE)); - } - - /** - * @param httpStack - * HTTP stack to be used - * @param pool - * a buffer pool that improves GC performance in copy operations - */ - public BasicNetwork(HttpStack httpStack, ByteArrayPool pool) { - mHttpStack = httpStack; - mPool = pool; - } - - @Override - public NetworkResponse performRequest(Request request) - throws VolleyError { - long requestStart = SystemClock.elapsedRealtime(); - while (true) { - HttpResponse httpResponse = null; - byte[] responseContents = null; - Map responseHeaders = new HashMap(); - try { - // Gather headers. - Map headers = new HashMap(); - addCacheHeaders(headers, request.getCacheEntry()); - httpResponse = mHttpStack.performRequest(request, headers); - StatusLine statusLine = httpResponse.getStatusLine(); - int statusCode = statusLine.getStatusCode(); - - responseHeaders = convertHeaders(httpResponse.getAllHeaders()); - // Handle cache validation. - if (statusCode == HttpStatus.SC_NOT_MODIFIED) { - if (request.getUrl().startsWith(Config.HOST + "support/upgrade")) { - if (request.getCacheEntry() != null) { - return new NetworkResponse(HttpStatus.SC_NOT_MODIFIED, - request.getCacheEntry().data, responseHeaders, true); - } else { - return new NetworkResponse(HttpStatus.SC_NOT_MODIFIED, - GzipUtils.compressBytes("{}".getBytes()), responseHeaders, true); - } - } else { - return new NetworkResponse(HttpStatus.SC_NOT_MODIFIED, - request.getCacheEntry().data, responseHeaders, true); - } - } - - // Some responses such as 204s do not have content. We must - // check. - if (httpResponse.getEntity() != null) { - responseContents = entityToBytes(httpResponse.getEntity()); - } else { - // Add 0 byte response as a way of honestly representing a - // no-content request. - responseContents = new byte[0]; - } - - // if the request is slow, log it. - long requestLifetime = SystemClock.elapsedRealtime() - - requestStart; - logSlowRequests(requestLifetime, request, responseContents, - statusLine); - - if (statusCode != HttpStatus.SC_OK - && statusCode != HttpStatus.SC_NO_CONTENT) { - throw new IOException(); - } - return new NetworkResponse(statusCode, responseContents, - responseHeaders, false); - } catch (SocketTimeoutException e) { - attemptRetryOnException("socket", request, new TimeoutError()); - } catch (ConnectTimeoutException e) { - attemptRetryOnException("connection", request, - new TimeoutError()); - } catch (MalformedURLException e) { - throw new RuntimeException("Bad URL " + request.getUrl(), e); - } catch (IOException e) { - int statusCode = 0; - NetworkResponse networkResponse = null; - if (httpResponse != null) { - statusCode = httpResponse.getStatusLine().getStatusCode(); - } else { - // If there is no network connection, judge whether the url is cached - // If have cached, return cached - Cache.Entry entry = request.getCacheEntry(); - if (entry != null) { - return new NetworkResponse(HttpStatus.SC_OK, - entry.data, entry.responseHeaders, false); - } - // else throw NoConnectionError - throw new NoConnectionError(e); - } - VolleyLog.e("Unexpected response code %d for %s", statusCode, request.getUrl()); - if (responseContents != null) { - networkResponse = new NetworkResponse(statusCode, - responseContents, responseHeaders, false); - if (statusCode == HttpStatus.SC_UNAUTHORIZED - || statusCode == HttpStatus.SC_FORBIDDEN) { - attemptRetryOnException("auth", request, - new AuthFailureError(networkResponse)); - } else if (statusCode == HttpStatus.SC_NOT_FOUND) { - if (request.getClass().equals(JsonObjectExtendedRequest.class)) { - return new NetworkResponse(HttpStatus.SC_OK, - GzipUtils.compressBytes("{}".getBytes()), responseHeaders, true); - } else if (request.getClass().equals(JsonArrayExtendedRequest.class)) { - return new NetworkResponse(HttpStatus.SC_OK, - GzipUtils.compressBytes("[]".getBytes()), responseHeaders, true); - } else { - // TODO: Only throw ServerError for 5xx status codes. - throw new ServerError(networkResponse); - } - } else { - // TODO: Only throw ServerError for 5xx status codes. - throw new ServerError(networkResponse); - } - } else { - throw new NetworkError(networkResponse); - } - } - } - } - - /** - * Logs requests that took over SLOW_REQUEST_THRESHOLD_MS to complete. - */ - private void logSlowRequests(long requestLifetime, Request request, - byte[] responseContents, StatusLine statusLine) { - if (DEBUG || requestLifetime > SLOW_REQUEST_THRESHOLD_MS) { - VolleyLog - .d("HTTP response for request=<%s> [lifetime=%d], [size=%s], " - + "[rc=%d], [retryCount=%s]", request, - requestLifetime, - responseContents != null ? responseContents.length - : "null", statusLine.getStatusCode(), - request.getRetryPolicy().getCurrentRetryCount()); - } - } - - /** - * 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. - * - * @param request - * The request to use. - */ - private static void attemptRetryOnException(String logPrefix, - Request request, VolleyError exception) throws VolleyError { - RetryPolicy retryPolicy = request.getRetryPolicy(); - int oldTimeout = request.getTimeoutMs(); - - try { - retryPolicy.retry(exception); - } catch (VolleyError e) { - request.addMarker(String.format("%s-timeout-giveup [timeout=%s]", - logPrefix, oldTimeout)); - throw e; - } - request.addMarker(String.format("%s-retry [timeout=%s]", logPrefix, - oldTimeout)); - } - - private void addCacheHeaders(Map headers, Cache.Entry entry) { - // If there's no cache entry, we're done. - if (entry == null) { - return; - } - - if (entry.etag != null) { - headers.put("If-None-Match", entry.etag); - } - - if (entry.serverDate > 0) { - Date refTime = new Date(entry.serverDate); - headers.put("If-Modified-Since", DateUtils.formatDate(refTime)); - } - } - - protected void logError(String what, String url, long start) { - long now = SystemClock.elapsedRealtime(); - VolleyLog.v("HTTP ERROR(%s) %d ms to fetch %s", what, (now - start), - url); - } - - /** Reads the contents of HttpEntity into a byte[]. */ - private byte[] entityToBytes(HttpEntity entity) throws IOException, - ServerError { - PoolingByteArrayOutputStream bytes = new PoolingByteArrayOutputStream( - mPool, (int) entity.getContentLength()); - byte[] buffer = null; - try { - InputStream in = entity.getContent(); - if (in == null) { - throw new ServerError(); - } - buffer = mPool.getBuf(1024); - int count; - while ((count = in.read(buffer)) != -1) { - bytes.write(buffer, 0, count); - } - return bytes.toByteArray(); - } finally { - try { - // Close the InputStream and release the resources by - // "consuming the content". - entity.consumeContent(); - } catch (IOException e) { - // This can happen if there was an exception above that left the - // entity in - // an invalid state. - VolleyLog.v("Error occured when calling consumingContent"); - } - mPool.returnBuf(buffer); - bytes.close(); - } - } - - /** - * Converts Headers[] to Map. - */ - private static Map convertHeaders(Header[] headers) { - Map result = new HashMap(); - for (int i = 0; i < headers.length; i++) { - result.put(headers[i].getName(), headers[i].getValue()); - } - return result; - } -} diff --git a/app/src/main/java/com/android/volley/toolbox/ByteArrayPool.java b/app/src/main/java/com/android/volley/toolbox/ByteArrayPool.java deleted file mode 100644 index af95076ad1..0000000000 --- a/app/src/main/java/com/android/volley/toolbox/ByteArrayPool.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley.toolbox; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.LinkedList; -import java.util.List; - -/** - * ByteArrayPool is a source and repository of byte[] objects. Its purpose is to - * supply those buffers to consumers who need to use them for a short period of time and then - * dispose of them. Simply creating and disposing such buffers in the conventional manner can - * considerable heap churn and garbage collection delays on Android, which lacks good management of - * short-lived heap objects. It may be advantageous to trade off some memory in the form of a - * permanently allocated pool of buffers in order to gain heap performance improvements; that is - * what this class does. - *

- * A good candidate user for this class is something like an I/O system that uses large temporary - * byte[] buffers to copy data around. In these use cases, often the consumer wants - * the buffer to be a certain minimum size to ensure good performance (e.g. when copying data chunks - * off of a stream), but doesn't mind if the buffer is larger than the minimum. Taking this into - * account and also to maximize the odds of being able to reuse a recycled buffer, this class is - * free to return buffers larger than the requested size. The caller needs to be able to gracefully - * deal with getting buffers any size over the minimum. - *

- * If there is not a suitably-sized buffer in its recycling pool when a buffer is requested, this - * class will allocate a new buffer and return it. - *

- * This class has no special ownership of buffers it creates; the caller is free to take a buffer - * it receives from this pool, use it permanently, and never return it to the pool; additionally, - * it is not harmful to return to this pool a buffer that was allocated elsewhere, provided there - * are no other lingering references to it. - *

- * This class ensures that the total size of the buffers in its recycling pool never exceeds a - * certain byte limit. When a buffer is returned that would cause the pool to exceed the limit, - * least-recently-used buffers are disposed. - */ -public class ByteArrayPool { - /** The buffer pool, arranged both by last use and by buffer size */ - private List mBuffersByLastUse = new LinkedList(); - private List mBuffersBySize = new ArrayList(64); - - /** The total size of the buffers in the pool */ - private int mCurrentSize = 0; - - /** - * The maximum aggregate size of the buffers in the pool. Old buffers are discarded to stay - * under this limit. - */ - private final int mSizeLimit; - - /** Compares buffers by size */ - protected static final Comparator BUF_COMPARATOR = new Comparator() { - @Override - public int compare(byte[] lhs, byte[] rhs) { - return lhs.length - rhs.length; - } - }; - - /** - * @param sizeLimit the maximum size of the pool, in bytes - */ - public ByteArrayPool(int sizeLimit) { - mSizeLimit = sizeLimit; - } - - /** - * Returns a buffer from the pool if one is available in the requested size, or allocates a new - * one if a pooled one is not available. - * - * @param len the minimum size, in bytes, of the requested buffer. The returned buffer may be - * larger. - * @return a byte[] buffer is always returned. - */ - public synchronized byte[] getBuf(int len) { - for (int i = 0; i < mBuffersBySize.size(); i++) { - byte[] buf = mBuffersBySize.get(i); - if (buf.length >= len) { - mCurrentSize -= buf.length; - mBuffersBySize.remove(i); - mBuffersByLastUse.remove(buf); - return buf; - } - } - return new byte[len]; - } - - /** - * Returns a buffer to the pool, throwing away old buffers if the pool would exceed its allotted - * size. - * - * @param buf the buffer to return to the pool. - */ - public synchronized void returnBuf(byte[] buf) { - if (buf == null || buf.length > mSizeLimit) { - return; - } - mBuffersByLastUse.add(buf); - int pos = Collections.binarySearch(mBuffersBySize, buf, BUF_COMPARATOR); - if (pos < 0) { - pos = -pos - 1; - } - mBuffersBySize.add(pos, buf); - mCurrentSize += buf.length; - trim(); - } - - /** - * Removes buffers from the pool until it is under its size limit. - */ - private synchronized void trim() { - while (mCurrentSize > mSizeLimit) { - byte[] buf = mBuffersByLastUse.remove(0); - mBuffersBySize.remove(buf); - mCurrentSize -= buf.length; - } - } - -} diff --git a/app/src/main/java/com/android/volley/toolbox/ClearCacheRequest.java b/app/src/main/java/com/android/volley/toolbox/ClearCacheRequest.java deleted file mode 100644 index f61e34e01c..0000000000 --- a/app/src/main/java/com/android/volley/toolbox/ClearCacheRequest.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley.toolbox; - -import android.os.Handler; -import android.os.Looper; - -import com.android.volley.Cache; -import com.android.volley.NetworkResponse; -import com.android.volley.Request; -import com.android.volley.Response; - -/** - * A synthetic request used for clearing the cache. - */ -public class ClearCacheRequest extends Request { - private final Cache mCache; - private final Runnable mCallback; - - /** - * Creates a synthetic request for clearing the cache. - * @param cache Cache to clear - * @param callback Callback to make on the main thread once the cache is clear, - * or null for none - */ - public ClearCacheRequest(Cache cache, Runnable callback) { - super(Method.GET, null, null); - mCache = cache; - mCallback = callback; - } - - @Override - public boolean isCanceled() { - // This is a little bit of a hack, but hey, why not. - mCache.clear(); - if (mCallback != null) { - Handler handler = new Handler(Looper.getMainLooper()); - handler.postAtFrontOfQueue(mCallback); - } - return true; - } - - @Override - public Priority getPriority() { - return Priority.IMMEDIATE; - } - - @Override - protected Response parseNetworkResponse(NetworkResponse response) { - return null; - } - - @Override - protected void deliverResponse(Object response) { - } -} diff --git a/app/src/main/java/com/android/volley/toolbox/DiskBasedCache.java b/app/src/main/java/com/android/volley/toolbox/DiskBasedCache.java deleted file mode 100644 index 0ac9b34120..0000000000 --- a/app/src/main/java/com/android/volley/toolbox/DiskBasedCache.java +++ /dev/null @@ -1,648 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley.toolbox; - -import android.os.SystemClock; -import android.util.Log; - -import com.android.volley.Cache; -import com.android.volley.VolleyLog; -import com.gh.common.util.TimestampUtils; - -import java.io.EOFException; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.FilterInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.Map; - -/** - * Cache implementation that caches files directly onto the hard disk in the - * specified directory. The default disk usage size is 5MB, but is configurable. - */ -public class DiskBasedCache implements Cache { - - /** Map of the Key, CacheHeader pairs */ - private final Map mEntries = new LinkedHashMap( - 16, .75f, true); - - /** Total amount of space currently used by the cache in bytes. */ - private long mTotalSize = 0; - - /** The root directory to use for the cache. */ - private final File mRootDirectory; - - /** The maximum size of the cache in bytes. */ - private final int mMaxCacheSizeInBytes; - - /** Default maximum disk usage in bytes. */ - private static final int DEFAULT_DISK_USAGE_BYTES = 5 * 1024 * 1024; - - /** High water mark percentage for the cache */ - private static final float HYSTERESIS_FACTOR = 0.9f; - - /** Magic number for current version of cache file format. */ - private static final int CACHE_MAGIC = 0x20120504; - - /** - * Constructs an instance of the DiskBasedCache at the specified directory. - * - * @param rootDirectory - * The root directory of the cache. - * @param maxCacheSizeInBytes - * The maximum size of the cache in bytes. - */ - public DiskBasedCache(File rootDirectory, int maxCacheSizeInBytes) { - mRootDirectory = rootDirectory; - mMaxCacheSizeInBytes = maxCacheSizeInBytes; - } - - /** - * Constructs an instance of the DiskBasedCache at the specified directory - * using the default maximum cache size of 5MB. - * - * @param rootDirectory - * The root directory of the cache. - */ - public DiskBasedCache(File rootDirectory) { - this(rootDirectory, DEFAULT_DISK_USAGE_BYTES); - } - - /** - * Clears the cache. Deletes all cached files from disk. - */ - @Override - public synchronized void clear() { - File[] files = mRootDirectory.listFiles(); - if (files != null) { - for (File file : files) { - file.delete(); - } - } - mEntries.clear(); - mTotalSize = 0; - VolleyLog.d("Cache cleared."); - } - - /** - * Returns the cache entry with the specified key if it exists, null - * otherwise. - */ - @Override - public synchronized Entry get(String key) { - CacheHeader entry = mEntries.get(key); - // if the entry does not exist, return. - if (entry == null) { - if (key.contains("timestamp")) { - Log.i("result", "get entrey is null"); - entry = mEntries.get(TimestampUtils.removeTimestamp(key)); - if (entry == null){ - return null; - } - } else { - return null; - } - } - File file = getFileForKey(key); - if (!file.exists() && key.contains("timestamp")) { - Log.i("result", "file = " + file.getName() + " not exists"); - file = getFileForKey(TimestampUtils.removeTimestamp(key)); - } - Log.i("result", "key = " + key); - Log.i("result", "name = " + file.getName()); - CountingInputStream cis = null; - try { - cis = new CountingInputStream(new FileInputStream(file)); - CacheHeader.readHeader(cis); // eat header - byte[] data = streamToBytes(cis, - (int) (file.length() - cis.bytesRead)); - return entry.toCacheEntry(data); - } catch (IOException e) { - VolleyLog.d("%s: %s", file.getAbsolutePath(), e.toString()); - remove(key); - return null; - } finally { - if (cis != null) { - try { - cis.close(); - } catch (IOException ioe) { - return null; - } - } - } - } - - public synchronized byte[] getData(String key) { - File file = getFileForKey(key); - CountingInputStream cis = null; - try { - cis = new CountingInputStream(new FileInputStream(file)); - CacheHeader.readHeader(cis); // eat header - return streamToBytes(cis, (int) (file.length() - cis.bytesRead)); - } catch (IOException e) { - VolleyLog.d("%s: %s", file.getAbsolutePath(), e.toString()); - return null; - } finally { - if (cis != null) { - try { - cis.close(); - } catch (IOException ioe) { - return null; - } - } - } - } - - public synchronized void modify(String key, byte[] data) { - File file = getFileForKey(key); - try { - CountingInputStream cis = new CountingInputStream(new FileInputStream(file)); - CacheHeader e = CacheHeader.readHeader(cis); // eat header - Entry entry = e.toCacheEntry(data); - cis.close(); - put(key, entry); - } catch (IOException e) { - VolleyLog.d("%s: %s", file.getAbsolutePath(), e.toString()); - } - } - - /** - * Initializes the DiskBasedCache by scanning for all files currently in the - * specified root directory. Creates the root directory if necessary. - */ - @Override - public synchronized void initialize() { - if (!mRootDirectory.exists()) { - if (!mRootDirectory.mkdirs()) { - VolleyLog.e("Unable to create cache dir %s", - mRootDirectory.getAbsolutePath()); - } - return; - } - - File[] files = mRootDirectory.listFiles(); - if (files == null) { - return; - } - for (File file : files) { - FileInputStream fis = null; - try { - fis = new FileInputStream(file); - CacheHeader entry = CacheHeader.readHeader(fis); - entry.size = file.length(); - putEntry(entry.key, entry); - } catch (IOException e) { - if (file != null) { - file.delete(); - } - } finally { - try { - if (fis != null) { - fis.close(); - } - } catch (IOException ignored) { - } - } - } - } - - /** - * Invalidates an entry in the cache. - * - * @param key - * Cache key - * @param fullExpire - * True to fully expire the entry, false to soft expire - */ - @Override - public synchronized void invalidate(String key, boolean fullExpire) { - Entry entry = get(key); - if (entry != null) { - entry.softTtl = 0; - if (fullExpire) { - entry.ttl = 0; - } - put(key, entry); - } - - } - - /** - * Puts the entry with the specified key into the cache. - */ - @Override - public synchronized void put(String key, Entry entry) { - pruneIfNeeded(entry.data.length); - File file = getFileForKey(key); - try { - FileOutputStream fos = new FileOutputStream(file); - CacheHeader e = new CacheHeader(key, entry); - e.writeHeader(fos); - fos.write(entry.data); - fos.close(); - putEntry(key, e); - // 如果url包含timestamp参数,则去掉该参数再存一份缓存 - if (key.contains("timestamp")) { - put(TimestampUtils.removeTimestamp(key), entry); - } - return; - } catch (IOException e) { - } - boolean deleted = file.delete(); - if (!deleted) { - VolleyLog.d("Could not clean up file %s", file.getAbsolutePath()); - } - } - - /** - * Removes the specified key from the cache if it exists. - */ - @Override - public synchronized void remove(String key) { - boolean deleted = getFileForKey(key).delete(); - removeEntry(key); - if (!deleted) { - VolleyLog.d("Could not delete cache entry for key=%s, filename=%s", - key, getFilenameForKey(key)); - } - } - - /** - * Creates a pseudo-unique filename for the specified cache key. - * - * @param key - * The key to generate a file name for. - * @return A pseudo-unique filename. - */ - private String getFilenameForKey(String key) { - int firstHalfLength = key.length() / 2; - String localFilename = String.valueOf(key.substring(0, firstHalfLength) - .hashCode()); - localFilename += String.valueOf(key.substring(firstHalfLength) - .hashCode()); - return localFilename; - } - - /** - * Returns a file object for the given cache key. - */ - public File getFileForKey(String key) { - return new File(mRootDirectory, getFilenameForKey(key)); - } - - /** - * Prunes the cache to fit the amount of bytes specified. - * - * @param neededSpace - * The amount of bytes we are trying to fit into the cache. - */ - private void pruneIfNeeded(int neededSpace) { - if ((mTotalSize + neededSpace) < mMaxCacheSizeInBytes) { - return; - } - if (VolleyLog.DEBUG) { - VolleyLog.v("Pruning old cache entries."); - } - - long before = mTotalSize; - int prunedFiles = 0; - long startTime = SystemClock.elapsedRealtime(); - - Iterator> iterator = mEntries.entrySet() - .iterator(); - while (iterator.hasNext()) { - Map.Entry entry = iterator.next(); - CacheHeader e = entry.getValue(); - boolean deleted = getFileForKey(e.key).delete(); - if (deleted) { - mTotalSize -= e.size; - } else { - VolleyLog.d( - "Could not delete cache entry for key=%s, filename=%s", - e.key, getFilenameForKey(e.key)); - } - iterator.remove(); - prunedFiles++; - - if ((mTotalSize + neededSpace) < mMaxCacheSizeInBytes - * HYSTERESIS_FACTOR) { - break; - } - } - - if (VolleyLog.DEBUG) { - VolleyLog.v("pruned %d files, %d bytes, %d ms", prunedFiles, - (mTotalSize - before), SystemClock.elapsedRealtime() - - startTime); - } - } - - /** - * Puts the entry with the specified key into the cache. - * - * @param key - * The key to identify the entry by. - * @param entry - * The entry to cache. - */ - private void putEntry(String key, CacheHeader entry) { - if (!mEntries.containsKey(key)) { - mTotalSize += entry.size; - } else { - CacheHeader oldEntry = mEntries.get(key); - mTotalSize += (entry.size - oldEntry.size); - } - mEntries.put(key, entry); - } - - /** - * Removes the entry identified by 'key' from the cache. - */ - private void removeEntry(String key) { - CacheHeader entry = mEntries.get(key); - if (entry != null) { - mTotalSize -= entry.size; - mEntries.remove(key); - } - } - - /** - * Reads the contents of an InputStream into a byte[]. - * */ - private static byte[] streamToBytes(InputStream in, int length) - throws IOException { - byte[] bytes = new byte[length]; - int count; - int pos = 0; - while (pos < length - && ((count = in.read(bytes, pos, length - pos)) != -1)) { - pos += count; - } - if (pos != length) { - throw new IOException("Expected " + length + " bytes, read " + pos - + " bytes"); - } - return bytes; - } - - /** - * Handles holding onto the cache headers for an entry. - */ - // Visible for testing. - static class CacheHeader { - /** - * The size of the data identified by this CacheHeader. (This is not - * serialized to disk. - */ - public long size; - - /** The key that identifies the cache entry. */ - public String key; - - /** ETag for cache coherence. */ - public String etag; - - /** Date of this response as reported by the server. */ - public long serverDate; - - /** TTL for this record. */ - public long ttl; - - /** Soft TTL for this record. */ - public long softTtl; - - /** Headers from the response resulting in this cache entry. */ - public Map responseHeaders; - - private CacheHeader() { - } - - /** - * Instantiates a new CacheHeader object - * - * @param key - * The key that identifies the cache entry - * @param entry - * The cache entry. - */ - public CacheHeader(String key, Entry entry) { - this.key = key; - this.size = entry.data.length; - this.etag = entry.etag; - this.serverDate = entry.serverDate; - this.ttl = entry.ttl; - this.softTtl = entry.softTtl; - this.responseHeaders = entry.responseHeaders; - } - - /** - * Reads the header off of an InputStream and returns a CacheHeader - * object. - * - * @param is - * The InputStream to read from. - * @throws IOException - */ - public static CacheHeader readHeader(InputStream is) throws IOException { - CacheHeader entry = new CacheHeader(); - int magic = readInt(is); - if (magic != CACHE_MAGIC) { - // don't bother deleting, it'll get pruned eventually - throw new IOException(); - } - entry.key = readString(is); - entry.etag = readString(is); - if (entry.etag.equals("")) { - entry.etag = null; - } - entry.serverDate = readLong(is); - entry.ttl = readLong(is); - entry.softTtl = readLong(is); - entry.responseHeaders = readStringStringMap(is); - return entry; - } - - /** - * Creates a cache entry for the specified data. - */ - public Entry toCacheEntry(byte[] data) { - Entry e = new Entry(); - e.data = data; - e.etag = etag; - e.serverDate = serverDate; - e.ttl = ttl; - e.softTtl = softTtl; - e.responseHeaders = responseHeaders; - return e; - } - - /** - * Writes the contents of this CacheHeader to the specified - * OutputStream. - */ - public boolean writeHeader(OutputStream os) { - try { - writeInt(os, CACHE_MAGIC); - writeString(os, key); - writeString(os, etag == null ? "" : etag); - writeLong(os, serverDate); - writeLong(os, ttl); - writeLong(os, softTtl); - writeStringStringMap(responseHeaders, os); - os.flush(); - return true; - } catch (IOException e) { - VolleyLog.d("%s", e.toString()); - return false; - } - } - - } - - private static class CountingInputStream extends FilterInputStream { - private int bytesRead = 0; - - private CountingInputStream(InputStream in) { - super(in); - } - - @Override - public int read() throws IOException { - int result = super.read(); - if (result != -1) { - bytesRead++; - } - return result; - } - - @Override - public int read(byte[] buffer, int offset, int count) - throws IOException { - int result = super.read(buffer, offset, count); - if (result != -1) { - bytesRead += result; - } - return result; - } - } - - /* - * Homebrewed simple serialization system used for reading and writing cache - * headers on disk. Once upon a time, this used the standard Java - * Object{Input,Output}Stream, but the default implementation relies heavily - * on reflection (even for standard types) and generates a ton of garbage. - */ - - /** - * Simple wrapper around {@link InputStream#read()} that throws EOFException - * instead of returning -1. - */ - private static int read(InputStream is) throws IOException { - int b = is.read(); - if (b == -1) { - throw new EOFException(); - } - return b; - } - - static void writeInt(OutputStream os, int n) throws IOException { - os.write((n >> 0) & 0xff); - os.write((n >> 8) & 0xff); - os.write((n >> 16) & 0xff); - os.write((n >> 24) & 0xff); - } - - static int readInt(InputStream is) throws IOException { - int n = 0; - n |= (read(is) << 0); - n |= (read(is) << 8); - n |= (read(is) << 16); - n |= (read(is) << 24); - return n; - } - - static void writeLong(OutputStream os, long n) throws IOException { - os.write((byte) (n >>> 0)); - os.write((byte) (n >>> 8)); - os.write((byte) (n >>> 16)); - os.write((byte) (n >>> 24)); - os.write((byte) (n >>> 32)); - os.write((byte) (n >>> 40)); - os.write((byte) (n >>> 48)); - os.write((byte) (n >>> 56)); - } - - static long readLong(InputStream is) throws IOException { - long n = 0; - n |= ((read(is) & 0xFFL) << 0); - n |= ((read(is) & 0xFFL) << 8); - n |= ((read(is) & 0xFFL) << 16); - n |= ((read(is) & 0xFFL) << 24); - n |= ((read(is) & 0xFFL) << 32); - n |= ((read(is) & 0xFFL) << 40); - n |= ((read(is) & 0xFFL) << 48); - n |= ((read(is) & 0xFFL) << 56); - return n; - } - - static void writeString(OutputStream os, String s) throws IOException { - byte[] b = s.getBytes("UTF-8"); - writeLong(os, b.length); - os.write(b, 0, b.length); - } - - static String readString(InputStream is) throws IOException { - int n = (int) readLong(is); - byte[] b = streamToBytes(is, n); - return new String(b, "UTF-8"); - } - - static void writeStringStringMap(Map map, OutputStream os) - throws IOException { - if (map != null) { - writeInt(os, map.size()); - for (Map.Entry entry : map.entrySet()) { - writeString(os, entry.getKey()); - writeString(os, entry.getValue()); - } - } else { - writeInt(os, 0); - } - } - - static Map readStringStringMap(InputStream is) - throws IOException { - int size = readInt(is); - Map result = (size == 0) ? Collections - . emptyMap() - : new HashMap(size); - for (int i = 0; i < size; i++) { - String key = readString(is).intern(); - String value = readString(is).intern(); - result.put(key, value); - } - return result; - } - -} diff --git a/app/src/main/java/com/android/volley/toolbox/HttpClientStack.java b/app/src/main/java/com/android/volley/toolbox/HttpClientStack.java deleted file mode 100644 index f8dfdabc66..0000000000 --- a/app/src/main/java/com/android/volley/toolbox/HttpClientStack.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley.toolbox; - -import com.android.volley.AuthFailureError; -import com.android.volley.Request; -import com.android.volley.Request.Method; - -import org.apache.http.HttpEntity; -import org.apache.http.HttpResponse; -import org.apache.http.NameValuePair; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpDelete; -import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.client.methods.HttpPut; -import org.apache.http.client.methods.HttpUriRequest; -import org.apache.http.entity.ByteArrayEntity; -import org.apache.http.message.BasicNameValuePair; -import org.apache.http.params.HttpConnectionParams; -import org.apache.http.params.HttpParams; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * An HttpStack that performs request over an {@link HttpClient}. - */ -public class HttpClientStack implements HttpStack { - protected final HttpClient mClient; - - private final static String HEADER_CONTENT_TYPE = "Content-Type"; - - public HttpClientStack(HttpClient client) { - mClient = client; - } - - private static void addHeaders(HttpUriRequest httpRequest, Map headers) { - for (String key : headers.keySet()) { - httpRequest.setHeader(key, headers.get(key)); - } - } - - @SuppressWarnings("unused") - private static List getPostParameterPairs(Map postParams) { - List result = new ArrayList(postParams.size()); - for (String key : postParams.keySet()) { - result.add(new BasicNameValuePair(key, postParams.get(key))); - } - return result; - } - - @Override - public HttpResponse performRequest(Request request, Map additionalHeaders) - throws IOException, AuthFailureError { - HttpUriRequest httpRequest = createHttpRequest(request, additionalHeaders); - addHeaders(httpRequest, additionalHeaders); - addHeaders(httpRequest, request.getHeaders()); - onPrepareRequest(httpRequest); - HttpParams httpParams = httpRequest.getParams(); - int timeoutMs = request.getTimeoutMs(); - // TODO: Reevaluate this connection timeout based on more wide-scale - // data collection and possibly different for wifi vs. 3G. - HttpConnectionParams.setConnectionTimeout(httpParams, 5000); - HttpConnectionParams.setSoTimeout(httpParams, timeoutMs); - return mClient.execute(httpRequest); - } - - /** - * Creates the appropriate subclass of HttpUriRequest for passed in request. - */ - @SuppressWarnings("deprecation") - /* protected */ static HttpUriRequest createHttpRequest(Request request, - Map additionalHeaders) throws AuthFailureError { - switch (request.getMethod()) { - case Method.DEPRECATED_GET_OR_POST: { - // This is the deprecated way that needs to be handled for backwards compatibility. - // If the request's post body is null, then the assumption is that the request is - // GET. Otherwise, it is assumed that the request is a POST. - byte[] postBody = request.getPostBody(); - if (postBody != null) { - HttpPost postRequest = new HttpPost(request.getUrl()); - postRequest.addHeader(HEADER_CONTENT_TYPE, request.getPostBodyContentType()); - HttpEntity entity; - entity = new ByteArrayEntity(postBody); - postRequest.setEntity(entity); - return postRequest; - } else { - return new HttpGet(request.getUrl()); - } - } - case Method.GET: - return new HttpGet(request.getUrl()); - case Method.DELETE: - return new HttpDelete(request.getUrl()); - case Method.POST: { - HttpPost postRequest = new HttpPost(request.getUrl()); - postRequest.addHeader(HEADER_CONTENT_TYPE, request.getBodyContentType()); - setEntityIfNonEmptyBody(postRequest, request); - return postRequest; - } - case Method.PUT: { - HttpPut putRequest = new HttpPut(request.getUrl()); - putRequest.addHeader(HEADER_CONTENT_TYPE, request.getBodyContentType()); - setEntityIfNonEmptyBody(putRequest, request); - return putRequest; - } - default: - throw new IllegalStateException("Unknown request method."); - } - } - - private static void setEntityIfNonEmptyBody(HttpEntityEnclosingRequestBase httpRequest, - Request request) throws AuthFailureError { - byte[] body = request.getBody(); - if (body != null) { - HttpEntity entity = new ByteArrayEntity(body); - httpRequest.setEntity(entity); - } - } - - /** - * Called before the request is executed using the underlying HttpClient. - * - *

Overwrite in subclasses to augment the request.

- */ - protected void onPrepareRequest(HttpUriRequest request) throws IOException { - // Nothing. - } -} diff --git a/app/src/main/java/com/android/volley/toolbox/HttpHeaderParser.java b/app/src/main/java/com/android/volley/toolbox/HttpHeaderParser.java deleted file mode 100644 index 4ed5eba1e9..0000000000 --- a/app/src/main/java/com/android/volley/toolbox/HttpHeaderParser.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley.toolbox; - -import com.android.volley.Cache; -import com.android.volley.NetworkResponse; - -import org.apache.http.impl.cookie.DateParseException; -import org.apache.http.impl.cookie.DateUtils; -import org.apache.http.protocol.HTTP; - -import java.util.Map; - -/** - * Utility methods for parsing HTTP headers. - */ -public class HttpHeaderParser { - - /** - * Extracts a {@link Cache.Entry} from a {@link NetworkResponse}. - * - * @param response The network response to parse headers from - * @return a cache entry for the given response, or null if the response is not cacheable. - */ - public static Cache.Entry parseCacheHeaders(NetworkResponse response) { - long now = System.currentTimeMillis(); - - Map headers = response.headers; - - long serverDate = 0; - long serverExpires = 0; - long softExpire = 0; - long maxAge = 0; - boolean hasCacheControl = false; - - String serverEtag = null; - String headerValue; - - headerValue = headers.get("Date"); - if (headerValue != null) { - serverDate = parseDateAsEpoch(headerValue); - } - - headerValue = headers.get("Cache-Control"); - if (headerValue != null) { - hasCacheControl = true; - String[] tokens = headerValue.split(","); - for (int i = 0; i < tokens.length; i++) { - String token = tokens[i].trim(); - if (token.equals("no-cache") || token.equals("no-store")) { - return null; - } else if (token.startsWith("max-age=")) { - try { - maxAge = Long.parseLong(token.substring(8)); - } catch (Exception e) { - } - } else if (token.equals("must-revalidate") || token.equals("proxy-revalidate")) { - maxAge = 0; - } - } - } - - headerValue = headers.get("Expires"); - if (headerValue != null) { - serverExpires = parseDateAsEpoch(headerValue); - } - - serverEtag = headers.get("ETag"); - - // Cache-Control takes precedence over an Expires header, even if both exist and Expires - // is more restrictive. - if (hasCacheControl) { - softExpire = now + maxAge * 1000; - } else if (serverDate > 0 && serverExpires >= serverDate) { - // Default semantic for Expire header in HTTP specification is softExpire. - softExpire = now + (serverExpires - serverDate); - } - - Cache.Entry entry = new Cache.Entry(); - entry.data = response.data; - entry.etag = serverEtag; - entry.softTtl = softExpire; - entry.ttl = entry.softTtl; - entry.serverDate = serverDate; - entry.responseHeaders = headers; - - return entry; - } - - /** - * Parse date in RFC1123 format, and return its value as epoch - */ - public static long parseDateAsEpoch(String dateStr) { - try { - // Parse date in RFC1123 format if this header contains one - return DateUtils.parseDate(dateStr).getTime(); - } catch (DateParseException e) { - // Date in invalid format, fallback to 0 - return 0; - } - } - - /** - * Returns the charset specified in the Content-Type of this header, - * or the HTTP default (ISO-8859-1) if none can be found. - */ - public static String parseCharset(Map headers) { - String contentType = headers.get(HTTP.CONTENT_TYPE); - if (contentType != null) { - String[] params = contentType.split(";"); - for (int i = 1; i < params.length; i++) { - String[] pair = params[i].trim().split("="); - if (pair.length == 2) { - if (pair[0].equals("charset")) { - return pair[1]; - } - } - } - } - - return HTTP.UTF_8; - } -} diff --git a/app/src/main/java/com/android/volley/toolbox/HttpStack.java b/app/src/main/java/com/android/volley/toolbox/HttpStack.java deleted file mode 100644 index a52fd06ca7..0000000000 --- a/app/src/main/java/com/android/volley/toolbox/HttpStack.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley.toolbox; - -import com.android.volley.AuthFailureError; -import com.android.volley.Request; - -import org.apache.http.HttpResponse; - -import java.io.IOException; -import java.util.Map; - -/** - * An HTTP stack abstraction. - */ -public interface HttpStack { - /** - * Performs an HTTP request with the given parameters. - * - *

A GET request is sent if request.getPostBody() == null. A POST request is sent otherwise, - * and the Content-Type header is set to request.getPostBodyContentType().

- * - * @param request the request to perform - * @param additionalHeaders additional headers to be sent together with - * {@link Request#getHeaders()} - * @return the HTTP response - */ - public HttpResponse performRequest(Request request, Map additionalHeaders) - throws IOException, AuthFailureError; - -} diff --git a/app/src/main/java/com/android/volley/toolbox/HurlStack.java b/app/src/main/java/com/android/volley/toolbox/HurlStack.java deleted file mode 100644 index 404d4bb885..0000000000 --- a/app/src/main/java/com/android/volley/toolbox/HurlStack.java +++ /dev/null @@ -1,265 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley.toolbox; - -import com.android.volley.AuthFailureError; -import com.android.volley.Request; -import com.android.volley.Request.Method; - -import org.apache.http.Header; -import org.apache.http.HttpEntity; -import org.apache.http.HttpResponse; -import org.apache.http.ProtocolVersion; -import org.apache.http.StatusLine; -import org.apache.http.entity.BasicHttpEntity; -import org.apache.http.message.BasicHeader; -import org.apache.http.message.BasicHttpResponse; -import org.apache.http.message.BasicStatusLine; - -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.HttpURLConnection; -import java.net.URL; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLSocketFactory; - -/** - * An {@link HttpStack} based on {@link HttpURLConnection}. - */ -public class HurlStack implements HttpStack { - - private static final String HEADER_CONTENT_TYPE = "Content-Type"; - - /** - * An interface for transforming URLs before use. - */ - public interface UrlRewriter { - /** - * Returns a URL to use instead of the provided one, or null to indicate - * this URL should not be used at all. - */ - public String rewriteUrl(String originalUrl); - } - - private final UrlRewriter mUrlRewriter; - private final SSLSocketFactory mSslSocketFactory; - - public HurlStack() { - this(null); - } - - /** - * @param urlRewriter - * Rewriter to use for request URLs - */ - public HurlStack(UrlRewriter urlRewriter) { - this(urlRewriter, null); - } - - /** - * @param urlRewriter - * Rewriter to use for request URLs - * @param sslSocketFactory - * SSL factory to use for HTTPS connections - */ - public HurlStack(UrlRewriter urlRewriter, SSLSocketFactory sslSocketFactory) { - mUrlRewriter = urlRewriter; - mSslSocketFactory = sslSocketFactory; - } - - @Override - public HttpResponse performRequest(Request request, - Map additionalHeaders) throws IOException, - AuthFailureError { - String url = request.getUrl(); - HashMap map = new HashMap(); - map.putAll(request.getHeaders()); - map.putAll(additionalHeaders); - if (mUrlRewriter != null) { - String rewritten = mUrlRewriter.rewriteUrl(url); - if (rewritten == null) { - throw new IOException("URL blocked by rewriter: " + url); - } - url = rewritten; - } - URL parsedUrl = new URL(url); - HttpURLConnection connection = openConnection(parsedUrl, request); - - // if have etag, don't use lastmodified - // because the aliyun cnd will use lastmodified do something we don't know - if (map.containsKey("If-None-Match")) { - map.remove("If-Modified-Since"); - } - - for (String headerName : map.keySet()) { - connection.addRequestProperty(headerName, map.get(headerName)); - } - - setConnectionParametersForRequest(connection, request); - // Initialize HttpResponse with data from the HttpURLConnection. - ProtocolVersion protocolVersion = new ProtocolVersion("HTTP", 1, 1); - - int responseCode = connection.getResponseCode(); - - if (responseCode == -1) { - // -1 is returned by getResponseCode() if the response code could - // not be retrieved. - // Signal to the caller that something was wrong with the - // connection. - throw new IOException( - "Could not retrieve response code from HttpUrlConnection."); - } - StatusLine responseStatus = new BasicStatusLine(protocolVersion, - connection.getResponseCode(), connection.getResponseMessage()); - BasicHttpResponse response = new BasicHttpResponse(responseStatus); - response.setEntity(entityFromConnection(connection)); - for (Entry> header : connection.getHeaderFields() - .entrySet()) { - if (header.getKey() != null) { - Header h = new BasicHeader(header.getKey(), header.getValue() - .get(0)); - response.addHeader(h); - } - } - return response; - } - - /** - * Initializes an {@link HttpEntity} from the given - * {@link HttpURLConnection}. - * - * @param connection - * @return an HttpEntity populated with data from connection. - */ - private static HttpEntity entityFromConnection(HttpURLConnection connection) { - BasicHttpEntity entity = new BasicHttpEntity(); - InputStream inputStream; - try { - inputStream = connection.getInputStream(); - } catch (IOException ioe) { - inputStream = connection.getErrorStream(); - } - entity.setContent(inputStream); - entity.setContentLength(connection.getContentLength()); - entity.setContentEncoding(connection.getContentEncoding()); - entity.setContentType(connection.getContentType()); - return entity; - } - - /** - * Create an {@link HttpURLConnection} for the specified {@code url}. - */ - protected HttpURLConnection createConnection(URL url) throws IOException { - return (HttpURLConnection) url.openConnection(); - } - - /** - * Opens an {@link HttpURLConnection} with parameters. - * - * @param url - * @return an open connection - * @throws IOException - */ - private HttpURLConnection openConnection(URL url, Request request) - throws IOException { - HttpURLConnection connection = createConnection(url); - - int timeoutMs = request.getTimeoutMs(); - connection.setConnectTimeout(timeoutMs); - connection.setReadTimeout(timeoutMs); - connection.setUseCaches(false); - connection.setDoInput(true); - - // use caller-provided custom SslSocketFactory, if any, for HTTPS - if ("https".equals(url.getProtocol()) && mSslSocketFactory != null) { - ((HttpsURLConnection) connection) - .setSSLSocketFactory(mSslSocketFactory); - } - - return connection; - } - - @SuppressWarnings("deprecation") - /* package */static void setConnectionParametersForRequest( - HttpURLConnection connection, Request request) - throws IOException, AuthFailureError { - switch (request.getMethod()) { - case Method.DEPRECATED_GET_OR_POST: - // This is the deprecated way that needs to be handled for backwards - // compatibility. - // If the request's post body is null, then the assumption is that - // the request is - // GET. Otherwise, it is assumed that the request is a POST. - byte[] postBody = request.getPostBody(); - if (postBody != null) { - // Prepare output. There is no need to set Content-Length - // explicitly, - // since this is handled by HttpURLConnection using the size of - // the prepared - // output stream. - connection.setDoOutput(true); - connection.setRequestMethod("POST"); - connection.addRequestProperty(HEADER_CONTENT_TYPE, - request.getPostBodyContentType()); - DataOutputStream out = new DataOutputStream( - connection.getOutputStream()); - out.write(postBody); - out.close(); - } - break; - case Method.GET: - // Not necessary to set the request method because connection - // defaults to GET but - // being explicit here. - connection.setRequestMethod("GET"); - break; - case Method.DELETE: - connection.setRequestMethod("DELETE"); - break; - case Method.POST: - connection.setRequestMethod("POST"); - addBodyIfExists(connection, request); - break; - case Method.PUT: - connection.setRequestMethod("PUT"); - addBodyIfExists(connection, request); - break; - default: - throw new IllegalStateException("Unknown method type."); - } - } - - private static void addBodyIfExists(HttpURLConnection connection, - Request request) throws IOException, AuthFailureError { - byte[] body = request.getBody(); - if (body != null) { - connection.setDoOutput(true); - connection.addRequestProperty(HEADER_CONTENT_TYPE, - request.getBodyContentType()); - DataOutputStream out = new DataOutputStream( - connection.getOutputStream()); - out.write(body); - out.close(); - } - } -} diff --git a/app/src/main/java/com/android/volley/toolbox/ImageLoader.java b/app/src/main/java/com/android/volley/toolbox/ImageLoader.java deleted file mode 100644 index fda8660d85..0000000000 --- a/app/src/main/java/com/android/volley/toolbox/ImageLoader.java +++ /dev/null @@ -1,479 +0,0 @@ -/** - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.volley.toolbox; - -import android.graphics.Bitmap; -import android.graphics.Bitmap.Config; -import android.os.Handler; -import android.os.Looper; -import android.widget.ImageView; - -import com.android.volley.Request; -import com.android.volley.RequestQueue; -import com.android.volley.Response.ErrorListener; -import com.android.volley.Response.Listener; -import com.android.volley.VolleyError; - -import java.util.HashMap; -import java.util.LinkedList; - -/** - * Helper that handles loading and caching images from remote URLs. - * - * The simple way to use this class is to call {@link ImageLoader#get(String, ImageListener)} - * and to pass in the default image listener provided by - * {@link ImageLoader#getImageListener(ImageView, int, int)}. Note that all function calls to - * this class must be made from the main thead, and all responses will be delivered to the main - * thread as well. - */ -public class ImageLoader { - /** RequestQueue for dispatching ImageRequests onto. */ - private final RequestQueue mRequestQueue; - - /** Amount of time to wait after first response arrives before delivering all responses. */ - private int mBatchResponseDelayMs = 100; - - /** The cache implementation to be used as an L1 cache before calling into volley. */ - private final ImageCache mCache; - - /** - * HashMap of Cache keys -> BatchedImageRequest used to track in-flight requests so - * that we can coalesce multiple requests to the same URL into a single network request. - */ - private final HashMap mInFlightRequests = - new HashMap(); - - /** HashMap of the currently pending responses (waiting to be delivered). */ - private final HashMap mBatchedResponses = - new HashMap(); - - /** Handler to the main thread. */ - private final Handler mHandler = new Handler(Looper.getMainLooper()); - - /** Runnable for in-flight response delivery. */ - private Runnable mRunnable; - - /** - * Simple cache adapter interface. If provided to the ImageLoader, it - * will be used as an L1 cache before dispatch to Volley. Implementations - * must not block. Implementation with an LruCache is recommended. - */ - public interface ImageCache { - public Bitmap getBitmap(String url); - public void putBitmap(String url, Bitmap bitmap); - } - - /** - * Constructs a new ImageLoader. - * @param queue The RequestQueue to use for making image requests. - * @param imageCache The cache to use as an L1 cache. - */ - public ImageLoader(RequestQueue queue, ImageCache imageCache) { - mRequestQueue = queue; - mCache = imageCache; - } - - /** - * The default implementation of ImageListener which handles basic functionality - * of showing a default image until the network response is received, at which point - * it will switch to either the actual image or the error image. - * @param imageView The imageView that the listener is associated with. - * @param defaultImageResId Default image resource ID to use, or 0 if it doesn't exist. - * @param errorImageResId Error image resource ID to use, or 0 if it doesn't exist. - */ - public static ImageListener getImageListener(final ImageView view, - final int defaultImageResId, final int errorImageResId) { - return new ImageListener() { - @Override - public void onErrorResponse(VolleyError error) { - if (errorImageResId != 0) { - view.setImageResource(errorImageResId); - } - } - - @Override - public void onResponse(ImageContainer response, boolean isImmediate) { - if (response.getBitmap() != null) { - view.setImageBitmap(response.getBitmap()); - } else if (defaultImageResId != 0) { - view.setImageResource(defaultImageResId); - } - } - }; - } - - /** - * Interface for the response handlers on image requests. - * - * The call flow is this: - * 1. Upon being attached to a request, onResponse(response, true) will - * be invoked to reflect any cached data that was already available. If the - * data was available, response.getBitmap() will be non-null. - * - * 2. After a network response returns, only one of the following cases will happen: - * - onResponse(response, false) will be called if the image was loaded. - * or - * - onErrorResponse will be called if there was an error loading the image. - */ - public interface ImageListener extends ErrorListener { - /** - * Listens for non-error changes to the loading of the image request. - * - * @param response Holds all information pertaining to the request, as well - * as the bitmap (if it is loaded). - * @param isImmediate True if this was called during ImageLoader.get() variants. - * This can be used to differentiate between a cached image loading and a network - * image loading in order to, for example, run an animation to fade in network loaded - * images. - */ - public void onResponse(ImageContainer response, boolean isImmediate); - } - - /** - * Checks if the item is available in the cache. - * @param requestUrl The url of the remote image - * @param maxWidth The maximum width of the returned image. - * @param maxHeight The maximum height of the returned image. - * @return True if the item exists in cache, false otherwise. - */ - public boolean isCached(String requestUrl, int maxWidth, int maxHeight) { - throwIfNotOnMainThread(); - - String cacheKey = getCacheKey(requestUrl, maxWidth, maxHeight); - return mCache.getBitmap(cacheKey) != null; - } - - /** - * Returns an ImageContainer for the requested URL. - * - * The ImageContainer will contain either the specified default bitmap or the loaded bitmap. - * If the default was returned, the {@link ImageLoader} will be invoked when the - * request is fulfilled. - * - * @param requestUrl The URL of the image to be loaded. - * @param defaultImage Optional default image to return until the actual image is loaded. - */ - public ImageContainer get(String requestUrl, final ImageListener listener) { - return get(requestUrl, listener, 0, 0); - } - - /** - * Issues a bitmap request with the given URL if that image is not available - * in the cache, and returns a bitmap container that contains all of the data - * relating to the request (as well as the default image if the requested - * image is not available). - * @param requestUrl The url of the remote image - * @param imageListener The listener to call when the remote image is loaded - * @param maxWidth The maximum width of the returned image. - * @param maxHeight The maximum height of the returned image. - * @return A container object that contains all of the properties of the request, as well as - * the currently available image (default if remote is not loaded). - */ - public ImageContainer get(String requestUrl, ImageListener imageListener, - int maxWidth, int maxHeight) { - // only fulfill requests that were initiated from the main thread. - throwIfNotOnMainThread(); - - final String cacheKey = getCacheKey(requestUrl, maxWidth, maxHeight); - - // Try to look up the request in the cache of remote images. - Bitmap cachedBitmap = mCache.getBitmap(cacheKey); - if (cachedBitmap != null) { - // Return the cached bitmap. - ImageContainer container = new ImageContainer(cachedBitmap, requestUrl, null, null); - imageListener.onResponse(container, true); - return container; - } - - // The bitmap did not exist in the cache, fetch it! - ImageContainer imageContainer = - new ImageContainer(null, requestUrl, cacheKey, imageListener); - - // Update the caller to let them know that they should use the default bitmap. - imageListener.onResponse(imageContainer, true); - - // Check to see if a request is already in-flight. - BatchedImageRequest request = mInFlightRequests.get(cacheKey); - if (request != null) { - // If it is, add this request to the list of listeners. - request.addContainer(imageContainer); - return imageContainer; - } - - // The request is not already in flight. Send the new request to the network and - // track it. - Request newRequest = - new ImageRequest(requestUrl, new Listener() { - @Override - public void onResponse(Bitmap response) { - onGetImageSuccess(cacheKey, response); - } - }, maxWidth, maxHeight, - Config.RGB_565, new ErrorListener() { - @Override - public void onErrorResponse(VolleyError error) { - onGetImageError(cacheKey, error); - } - }); - - mRequestQueue.add(newRequest); - mInFlightRequests.put(cacheKey, - new BatchedImageRequest(newRequest, imageContainer)); - return imageContainer; - } - - /** - * Sets the amount of time to wait after the first response arrives before delivering all - * responses. Batching can be disabled entirely by passing in 0. - * @param newBatchedResponseDelayMs The time in milliseconds to wait. - */ - public void setBatchedResponseDelay(int newBatchedResponseDelayMs) { - mBatchResponseDelayMs = newBatchedResponseDelayMs; - } - - /** - * Handler for when an image was successfully loaded. - * @param cacheKey The cache key that is associated with the image request. - * @param response The bitmap that was returned from the network. - */ - private void onGetImageSuccess(String cacheKey, Bitmap response) { - // cache the image that was fetched. - mCache.putBitmap(cacheKey, response); - - // remove the request from the list of in-flight requests. - BatchedImageRequest request = mInFlightRequests.remove(cacheKey); - - if (request != null) { - // Update the response bitmap. - request.mResponseBitmap = response; - - // Send the batched response - batchResponse(cacheKey, request); - } - } - - /** - * Handler for when an image failed to load. - * @param cacheKey The cache key that is associated with the image request. - */ - private void onGetImageError(String cacheKey, VolleyError error) { - // Notify the requesters that something failed via a null result. - // Remove this request from the list of in-flight requests. - BatchedImageRequest request = mInFlightRequests.remove(cacheKey); - - // Set the error for this request - request.setError(error); - - if (request != null) { - // Send the batched response - batchResponse(cacheKey, request); - } - } - - /** - * Container object for all of the data surrounding an image request. - */ - public class ImageContainer { - /** - * The most relevant bitmap for the container. If the image was in cache, the - * Holder to use for the final bitmap (the one that pairs to the requested URL). - */ - private Bitmap mBitmap; - - private final ImageListener mListener; - - /** The cache key that was associated with the request */ - private final String mCacheKey; - - /** The request URL that was specified */ - private final String mRequestUrl; - - /** - * Constructs a BitmapContainer object. - * @param bitmap The final bitmap (if it exists). - * @param requestUrl The requested URL for this container. - * @param cacheKey The cache key that identifies the requested URL for this container. - */ - public ImageContainer(Bitmap bitmap, String requestUrl, - String cacheKey, ImageListener listener) { - mBitmap = bitmap; - mRequestUrl = requestUrl; - mCacheKey = cacheKey; - mListener = listener; - } - - /** - * Releases interest in the in-flight request (and cancels it if no one else is listening). - */ - public void cancelRequest() { - if (mListener == null) { - return; - } - - BatchedImageRequest request = mInFlightRequests.get(mCacheKey); - if (request != null) { - boolean canceled = request.removeContainerAndCancelIfNecessary(this); - if (canceled) { - mInFlightRequests.remove(mCacheKey); - } - } else { - // check to see if it is already batched for delivery. - request = mBatchedResponses.get(mCacheKey); - if (request != null) { - request.removeContainerAndCancelIfNecessary(this); - if (request.mContainers.size() == 0) { - mBatchedResponses.remove(mCacheKey); - } - } - } - } - - /** - * Returns the bitmap associated with the request URL if it has been loaded, null otherwise. - */ - public Bitmap getBitmap() { - return mBitmap; - } - - /** - * Returns the requested URL for this container. - */ - public String getRequestUrl() { - return mRequestUrl; - } - } - - /** - * Wrapper class used to map a Request to the set of active ImageContainer objects that are - * interested in its results. - */ - private class BatchedImageRequest { - /** The request being tracked */ - private final Request mRequest; - - /** The result of the request being tracked by this item */ - private Bitmap mResponseBitmap; - - /** Error if one occurred for this response */ - private VolleyError mError; - - /** List of all of the active ImageContainers that are interested in the request */ - private final LinkedList mContainers = new LinkedList(); - - /** - * Constructs a new BatchedImageRequest object - * @param request The request being tracked - * @param container The ImageContainer of the person who initiated the request. - */ - public BatchedImageRequest(Request request, ImageContainer container) { - mRequest = request; - mContainers.add(container); - } - - /** - * Set the error for this response - */ - public void setError(VolleyError error) { - mError = error; - } - - /** - * Get the error for this response - */ - public VolleyError getError() { - return mError; - } - - /** - * Adds another ImageContainer to the list of those interested in the results of - * the request. - */ - public void addContainer(ImageContainer container) { - mContainers.add(container); - } - - /** - * Detatches the bitmap container from the request and cancels the request if no one is - * left listening. - * @param container The container to remove from the list - * @return True if the request was canceled, false otherwise. - */ - public boolean removeContainerAndCancelIfNecessary(ImageContainer container) { - mContainers.remove(container); - if (mContainers.size() == 0) { - mRequest.cancel(); - return true; - } - return false; - } - } - - /** - * Starts the runnable for batched delivery of responses if it is not already started. - * @param cacheKey The cacheKey of the response being delivered. - * @param request The BatchedImageRequest to be delivered. - * @param error The volley error associated with the request (if applicable). - */ - private void batchResponse(String cacheKey, BatchedImageRequest request) { - mBatchedResponses.put(cacheKey, request); - // If we don't already have a batch delivery runnable in flight, make a new one. - // Note that this will be used to deliver responses to all callers in mBatchedResponses. - if (mRunnable == null) { - mRunnable = new Runnable() { - @Override - public void run() { - for (BatchedImageRequest bir : mBatchedResponses.values()) { - for (ImageContainer container : bir.mContainers) { - // If one of the callers in the batched request canceled the request - // after the response was received but before it was delivered, - // skip them. - if (container.mListener == null) { - continue; - } - if (bir.getError() == null) { - container.mBitmap = bir.mResponseBitmap; - container.mListener.onResponse(container, false); - } else { - container.mListener.onErrorResponse(bir.getError()); - } - } - } - mBatchedResponses.clear(); - mRunnable = null; - } - - }; - // Post the runnable. - mHandler.postDelayed(mRunnable, mBatchResponseDelayMs); - } - } - - private void throwIfNotOnMainThread() { - if (Looper.myLooper() != Looper.getMainLooper()) { - throw new IllegalStateException("ImageLoader must be invoked from the main thread."); - } - } - /** - * Creates a cache key for use with the L1 cache. - * @param url The URL of the request. - * @param maxWidth The max-width of the output. - * @param maxHeight The max-height of the output. - */ - private static String getCacheKey(String url, int maxWidth, int maxHeight) { - return new StringBuilder(url.length() + 12).append("#W").append(maxWidth) - .append("#H").append(maxHeight).append(url).toString(); - } -} diff --git a/app/src/main/java/com/android/volley/toolbox/ImageRequest.java b/app/src/main/java/com/android/volley/toolbox/ImageRequest.java deleted file mode 100644 index 7de78e40fd..0000000000 --- a/app/src/main/java/com/android/volley/toolbox/ImageRequest.java +++ /dev/null @@ -1,211 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley.toolbox; - -import android.graphics.Bitmap; -import android.graphics.Bitmap.Config; -import android.graphics.BitmapFactory; - -import com.android.volley.DefaultRetryPolicy; -import com.android.volley.NetworkResponse; -import com.android.volley.ParseError; -import com.android.volley.Request; -import com.android.volley.Response; -import com.android.volley.VolleyLog; - -/** - * A canned request for getting an image at a given URL and calling - * back with a decoded Bitmap. - */ -public class ImageRequest extends Request { - /** Socket timeout in milliseconds for image requests */ - private static final int IMAGE_TIMEOUT_MS = 1000; - - /** Default number of retries for image requests */ - private static final int IMAGE_MAX_RETRIES = 2; - - /** Default backoff multiplier for image requests */ - private static final float IMAGE_BACKOFF_MULT = 2f; - - private final Response.Listener mListener; - private final Config mDecodeConfig; - private final int mMaxWidth; - private final int mMaxHeight; - - /** Decoding lock so that we don't decode more than one image at a time (to avoid OOM's) */ - private static final Object sDecodeLock = new Object(); - - /** - * Creates a new image request, decoding to a maximum specified width and - * height. If both width and height are zero, the image will be decoded to - * its natural size. If one of the two is nonzero, that dimension will be - * clamped and the other one will be set to preserve the image's aspect - * ratio. If both width and height are nonzero, the image will be decoded to - * be fit in the rectangle of dimensions width x height while keeping its - * aspect ratio. - * - * @param url URL of the image - * @param listener Listener to receive the decoded bitmap - * @param maxWidth Maximum width to decode this bitmap to, or zero for none - * @param maxHeight Maximum height to decode this bitmap to, or zero for - * none - * @param decodeConfig Format to decode the bitmap to - * @param errorListener Error listener, or null to ignore errors - */ - public ImageRequest(String url, Response.Listener listener, int maxWidth, int maxHeight, - Config decodeConfig, Response.ErrorListener errorListener) { - super(Method.GET, url, errorListener); - setRetryPolicy( - new DefaultRetryPolicy(IMAGE_TIMEOUT_MS, IMAGE_MAX_RETRIES, IMAGE_BACKOFF_MULT)); - mListener = listener; - mDecodeConfig = decodeConfig; - mMaxWidth = maxWidth; - mMaxHeight = maxHeight; - } - - @Override - public Priority getPriority() { - return Priority.LOW; - } - - /** - * Scales one side of a rectangle to fit aspect ratio. - * - * @param maxPrimary Maximum size of the primary dimension (i.e. width for - * max width), or zero to maintain aspect ratio with secondary - * dimension - * @param maxSecondary Maximum size of the secondary dimension, or zero to - * maintain aspect ratio with primary dimension - * @param actualPrimary Actual size of the primary dimension - * @param actualSecondary Actual size of the secondary dimension - */ - private static int getResizedDimension(int maxPrimary, int maxSecondary, int actualPrimary, - int actualSecondary) { - // If no dominant value at all, just return the actual. - if (maxPrimary == 0 && maxSecondary == 0) { - return actualPrimary; - } - - // If primary is unspecified, scale primary to match secondary's scaling ratio. - if (maxPrimary == 0) { - double ratio = (double) maxSecondary / (double) actualSecondary; - return (int) (actualPrimary * ratio); - } - - if (maxSecondary == 0) { - return maxPrimary; - } - - double ratio = (double) actualSecondary / (double) actualPrimary; - int resized = maxPrimary; - if (resized * ratio > maxSecondary) { - resized = (int) (maxSecondary / ratio); - } - return resized; - } - - @Override - protected Response parseNetworkResponse(NetworkResponse response) { - // Serialize all decode on a global lock to reduce concurrent heap usage. - synchronized (sDecodeLock) { - try { - return doParse(response); - } catch (OutOfMemoryError e) { - VolleyLog.e("Caught OOM for %d byte image, url=%s", response.data.length, getUrl()); - return Response.error(new ParseError(e)); - } - } - } - - /** - * The real guts of parseNetworkResponse. Broken out for readability. - */ - private Response doParse(NetworkResponse response) { - byte[] data = response.data; - BitmapFactory.Options decodeOptions = new BitmapFactory.Options(); - Bitmap bitmap = null; - if (mMaxWidth == 0 && mMaxHeight == 0) { - decodeOptions.inPreferredConfig = mDecodeConfig; - bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, decodeOptions); - } else { - // If we have to resize this image, first get the natural bounds. - decodeOptions.inJustDecodeBounds = true; - BitmapFactory.decodeByteArray(data, 0, data.length, decodeOptions); - int actualWidth = decodeOptions.outWidth; - int actualHeight = decodeOptions.outHeight; - - // Then compute the dimensions we would ideally like to decode to. - int desiredWidth = getResizedDimension(mMaxWidth, mMaxHeight, - actualWidth, actualHeight); - int desiredHeight = getResizedDimension(mMaxHeight, mMaxWidth, - actualHeight, actualWidth); - - // Decode to the nearest power of two scaling factor. - decodeOptions.inJustDecodeBounds = false; - // TODO(ficus): Do we need this or is it okay since API 8 doesn't support it? - // decodeOptions.inPreferQualityOverSpeed = PREFER_QUALITY_OVER_SPEED; - decodeOptions.inSampleSize = - findBestSampleSize(actualWidth, actualHeight, desiredWidth, desiredHeight); - Bitmap tempBitmap = - BitmapFactory.decodeByteArray(data, 0, data.length, decodeOptions); - - // If necessary, scale down to the maximal acceptable size. - if (tempBitmap != null && (tempBitmap.getWidth() > desiredWidth || - tempBitmap.getHeight() > desiredHeight)) { - bitmap = Bitmap.createScaledBitmap(tempBitmap, - desiredWidth, desiredHeight, true); - tempBitmap.recycle(); - } else { - bitmap = tempBitmap; - } - } - - if (bitmap == null) { - return Response.error(new ParseError(response)); - } else { - return Response.success(bitmap, HttpHeaderParser.parseCacheHeaders(response)); - } - } - - @Override - protected void deliverResponse(Bitmap response) { - mListener.onResponse(response); - } - - /** - * Returns the largest power-of-two divisor for use in downscaling a bitmap - * that will not result in the scaling past the desired dimensions. - * - * @param actualWidth Actual width of the bitmap - * @param actualHeight Actual height of the bitmap - * @param desiredWidth Desired width of the bitmap - * @param desiredHeight Desired height of the bitmap - */ - // Visible for testing. - static int findBestSampleSize( - int actualWidth, int actualHeight, int desiredWidth, int desiredHeight) { - double wr = (double) actualWidth / desiredWidth; - double hr = (double) actualHeight / desiredHeight; - double ratio = Math.min(wr, hr); - float n = 1.0f; - while ((n * 2) <= ratio) { - n *= 2; - } - - return (int) n; - } -} diff --git a/app/src/main/java/com/android/volley/toolbox/JsonArrayRequest.java b/app/src/main/java/com/android/volley/toolbox/JsonArrayRequest.java deleted file mode 100644 index b1eae805f7..0000000000 --- a/app/src/main/java/com/android/volley/toolbox/JsonArrayRequest.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley.toolbox; - -import com.android.volley.NetworkResponse; -import com.android.volley.ParseError; -import com.android.volley.Response; -import com.android.volley.Response.ErrorListener; -import com.android.volley.Response.Listener; - -import org.json.JSONArray; -import org.json.JSONException; - -import java.io.UnsupportedEncodingException; - -/** - * A request for retrieving a {@link JSONArray} response body at a given URL. - */ -public class JsonArrayRequest extends JsonRequest { - - /** - * Creates a new request. - * @param url URL to fetch the JSON from - * @param listener Listener to receive the JSON response - * @param errorListener Error listener, or null to ignore errors. - */ - public JsonArrayRequest(String url, Listener listener, ErrorListener errorListener) { - super(Method.GET, url, null, listener, errorListener); - } - - @Override - protected Response parseNetworkResponse(NetworkResponse response) { - try { - String jsonString = - new String(response.data, HttpHeaderParser.parseCharset(response.headers)); - return Response.success(new JSONArray(jsonString), - HttpHeaderParser.parseCacheHeaders(response)); - } catch (UnsupportedEncodingException e) { - return Response.error(new ParseError(e)); - } catch (JSONException je) { - return Response.error(new ParseError(je)); - } - } -} diff --git a/app/src/main/java/com/android/volley/toolbox/JsonObjectRequest.java b/app/src/main/java/com/android/volley/toolbox/JsonObjectRequest.java deleted file mode 100644 index 93bc22af54..0000000000 --- a/app/src/main/java/com/android/volley/toolbox/JsonObjectRequest.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley.toolbox; - -import com.android.volley.NetworkResponse; -import com.android.volley.ParseError; -import com.android.volley.Response; -import com.android.volley.Response.ErrorListener; -import com.android.volley.Response.Listener; - -import org.json.JSONException; -import org.json.JSONObject; - -import java.io.UnsupportedEncodingException; - -/** - * A request for retrieving a {@link JSONObject} response body at a given URL, allowing for an - * optional {@link JSONObject} to be passed in as part of the request body. - */ -public class JsonObjectRequest extends JsonRequest { - - /** - * 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 is allowed and - * 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, JSONObject jsonRequest, - Listener listener, ErrorListener errorListener) { - super(method, url, (jsonRequest == null) ? null : jsonRequest.toString(), listener, - errorListener); - } - - /** - * Constructor which defaults to GET if jsonRequest is - * null, POST otherwise. - * - * @see #JsonObjectRequest(int, String, JSONObject, Listener, ErrorListener) - */ - public JsonObjectRequest(String url, JSONObject jsonRequest, Listener listener, - ErrorListener errorListener) { - this(jsonRequest == null ? Method.GET : Method.POST, url, jsonRequest, - listener, errorListener); - } - - @Override - protected Response parseNetworkResponse(NetworkResponse response) { - try { - String jsonString = - new String(response.data, HttpHeaderParser.parseCharset(response.headers)); - return Response.success(new JSONObject(jsonString), - HttpHeaderParser.parseCacheHeaders(response)); - } catch (UnsupportedEncodingException e) { - return Response.error(new ParseError(e)); - } catch (JSONException je) { - return Response.error(new ParseError(je)); - } - } -} diff --git a/app/src/main/java/com/android/volley/toolbox/JsonRequest.java b/app/src/main/java/com/android/volley/toolbox/JsonRequest.java deleted file mode 100644 index f11ac14e43..0000000000 --- a/app/src/main/java/com/android/volley/toolbox/JsonRequest.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley.toolbox; - -import com.android.volley.NetworkResponse; -import com.android.volley.Request; -import com.android.volley.Response; -import com.android.volley.Response.ErrorListener; -import com.android.volley.Response.Listener; -import com.android.volley.VolleyLog; - -import java.io.UnsupportedEncodingException; - -/** - * A request for retrieving a T type response body at a given URL that also - * optionally sends along a JSON body in the request specified. - * - * @param JSON type of response expected - */ -public abstract class JsonRequest extends Request { - /** Charset for request. */ - private static final String PROTOCOL_CHARSET = "utf-8"; - - /** Content type for request. */ - private static final String PROTOCOL_CONTENT_TYPE = - String.format("application/json; charset=%s", PROTOCOL_CHARSET); - - private final Listener mListener; - private final String mRequestBody; - - /** - * Deprecated constructor for a JsonRequest which defaults to GET unless {@link #getPostBody()} - * or {@link #getPostParams()} is overridden (which defaults to POST). - * - * @deprecated Use {@link #JsonRequest(int, String, String, Listener, ErrorListener)}. - */ - public JsonRequest(String url, String requestBody, Listener listener, - ErrorListener errorListener) { - this(Method.DEPRECATED_GET_OR_POST, url, requestBody, listener, errorListener); - } - - public JsonRequest(int method, String url, String requestBody, Listener listener, - ErrorListener errorListener) { - super(method, url, errorListener); - mListener = listener; - mRequestBody = requestBody; - } - - @Override - protected void deliverResponse(T response) { - mListener.onResponse(response); - } - - @Override - abstract protected Response parseNetworkResponse(NetworkResponse response); - - /** - * @deprecated Use {@link #getBodyContentType()}. - */ - @Override - public String getPostBodyContentType() { - return getBodyContentType(); - } - - /** - * @deprecated Use {@link #getBody()}. - */ - @Override - public byte[] getPostBody() { - return getBody(); - } - - @Override - public String getBodyContentType() { - return PROTOCOL_CONTENT_TYPE; - } - - @Override - public byte[] getBody() { - try { - return mRequestBody == null ? null : mRequestBody.getBytes(PROTOCOL_CHARSET); - } catch (UnsupportedEncodingException uee) { - VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s", - mRequestBody, PROTOCOL_CHARSET); - return null; - } - } -} diff --git a/app/src/main/java/com/android/volley/toolbox/NetworkImageView.java b/app/src/main/java/com/android/volley/toolbox/NetworkImageView.java deleted file mode 100644 index 74c91597ef..0000000000 --- a/app/src/main/java/com/android/volley/toolbox/NetworkImageView.java +++ /dev/null @@ -1,202 +0,0 @@ -/** - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.volley.toolbox; - -import android.content.Context; -import android.text.TextUtils; -import android.util.AttributeSet; -import android.view.ViewGroup.LayoutParams; -import android.widget.ImageView; - -import com.android.volley.VolleyError; -import com.android.volley.toolbox.ImageLoader.ImageContainer; -import com.android.volley.toolbox.ImageLoader.ImageListener; - -/** - * Handles fetching an image from a URL as well as the life-cycle of the - * associated request. - */ -public class NetworkImageView extends ImageView { - /** The URL of the network image to load */ - private String mUrl; - - /** - * Resource ID of the image to be used as a placeholder until the network image is loaded. - */ - private int mDefaultImageId; - - /** - * Resource ID of the image to be used if the network response fails. - */ - private int mErrorImageId; - - /** Local copy of the ImageLoader. */ - private ImageLoader mImageLoader; - - /** Current ImageContainer. (either in-flight or finished) */ - private ImageContainer mImageContainer; - - public NetworkImageView(Context context) { - this(context, null); - } - - public NetworkImageView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public NetworkImageView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - } - - /** - * Sets URL of the image that should be loaded into this view. Note that calling this will - * immediately either set the cached image (if available) or the default image specified by - * {@link NetworkImageView#setDefaultImageResId(int)} on the view. - * - * NOTE: If applicable, {@link NetworkImageView#setDefaultImageResId(int)} and - * {@link NetworkImageView#setErrorImageResId(int)} should be called prior to calling - * this function. - * - * @param url The URL that should be loaded into this ImageView. - * @param imageLoader ImageLoader that will be used to make the request. - */ - public void setImageUrl(String url, ImageLoader imageLoader) { - mUrl = url; - mImageLoader = imageLoader; - // The URL has potentially changed. See if we need to load it. - loadImageIfNecessary(false); - } - - /** - * Sets the default image resource ID to be used for this view until the attempt to load it - * completes. - */ - public void setDefaultImageResId(int defaultImage) { - mDefaultImageId = defaultImage; - } - - /** - * Sets the error image resource ID to be used for this view in the event that the image - * requested fails to load. - */ - public void setErrorImageResId(int errorImage) { - mErrorImageId = errorImage; - } - - /** - * Loads the image for the view if it isn't already loaded. - * @param isInLayoutPass True if this was invoked from a layout pass, false otherwise. - */ - private void loadImageIfNecessary(final boolean isInLayoutPass) { - int width = getWidth(); - int height = getHeight(); - - boolean isFullyWrapContent = getLayoutParams() != null - && getLayoutParams().height == LayoutParams.WRAP_CONTENT - && getLayoutParams().width == LayoutParams.WRAP_CONTENT; - // if the view's bounds aren't known yet, and this is not a wrap-content/wrap-content - // view, hold off on loading the image. - if (width == 0 && height == 0 && !isFullyWrapContent) { - return; - } - - // if the URL to be loaded in this view is empty, cancel any old requests and clear the - // currently loaded image. - if (TextUtils.isEmpty(mUrl)) { - if (mImageContainer != null) { - mImageContainer.cancelRequest(); - mImageContainer = null; - } - setImageBitmap(null); - return; - } - - // if there was an old request in this view, check if it needs to be canceled. - if (mImageContainer != null && mImageContainer.getRequestUrl() != null) { - if (mImageContainer.getRequestUrl().equals(mUrl)) { - // if the request is from the same URL, return. - return; - } else { - // if there is a pre-existing request, cancel it if it's fetching a different URL. - mImageContainer.cancelRequest(); - setImageBitmap(null); - } - } - - // The pre-existing content of this view didn't match the current URL. Load the new image - // from the network. - ImageContainer newContainer = mImageLoader.get(mUrl, - new ImageListener() { - @Override - public void onErrorResponse(VolleyError error) { - if (mErrorImageId != 0) { - setImageResource(mErrorImageId); - } - } - - @Override - public void onResponse(final ImageContainer response, boolean isImmediate) { - // If this was an immediate response that was delivered inside of a layout - // pass do not set the image immediately as it will trigger a requestLayout - // inside of a layout. Instead, defer setting the image by posting back to - // the main thread. - if (isImmediate && isInLayoutPass) { - post(new Runnable() { - @Override - public void run() { - onResponse(response, false); - } - }); - return; - } - - if (response.getBitmap() != null) { - setImageBitmap(response.getBitmap()); - } else if (mDefaultImageId != 0) { - setImageResource(mDefaultImageId); - } - } - }); - - // update the ImageContainer to be the new bitmap container. - mImageContainer = newContainer; - } - - @Override - protected void onLayout(boolean changed, int left, int top, int right, int bottom) { - super.onLayout(changed, left, top, right, bottom); - loadImageIfNecessary(true); - } - - @Override - protected void onDetachedFromWindow() { - if (mImageContainer != null) { - // If the view was bound to an image request, cancel it and clear - // out the image from the view. - mImageContainer.cancelRequest(); - setImageBitmap(null); - // also clear out the container so we can reload the image if necessary. - mImageContainer = null; - } - super.onDetachedFromWindow(); - } - - @Override - protected void drawableStateChanged() { - super.drawableStateChanged(); - invalidate(); - } -} diff --git a/app/src/main/java/com/android/volley/toolbox/NoCache.java b/app/src/main/java/com/android/volley/toolbox/NoCache.java deleted file mode 100644 index ab6625435c..0000000000 --- a/app/src/main/java/com/android/volley/toolbox/NoCache.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley.toolbox; - -import com.android.volley.Cache; - -/** - * A cache that doesn't. - */ -public class NoCache implements Cache { - @Override - public void clear() { - } - - @Override - public Entry get(String key) { - return null; - } - - @Override - public void put(String key, Entry entry) { - } - - @Override - public void invalidate(String key, boolean fullExpire) { - } - - @Override - public void remove(String key) { - } - - @Override - public void initialize() { - } -} diff --git a/app/src/main/java/com/android/volley/toolbox/PoolingByteArrayOutputStream.java b/app/src/main/java/com/android/volley/toolbox/PoolingByteArrayOutputStream.java deleted file mode 100644 index f9a0c29183..0000000000 --- a/app/src/main/java/com/android/volley/toolbox/PoolingByteArrayOutputStream.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley.toolbox; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -/** - * A variation of {@link ByteArrayOutputStream} that uses a pool of byte[] buffers instead - * of always allocating them fresh, saving on heap churn. - */ -public class PoolingByteArrayOutputStream extends ByteArrayOutputStream { - /** - * If the {@link #PoolingByteArrayOutputStream(ByteArrayPool)} constructor is called, this is - * the default size to which the underlying byte array is initialized. - */ - private static final int DEFAULT_SIZE = 256; - - private final ByteArrayPool mPool; - - /** - * Constructs a new PoolingByteArrayOutputStream with a default size. If more bytes are written - * to this instance, the underlying byte array will expand. - */ - public PoolingByteArrayOutputStream(ByteArrayPool pool) { - this(pool, DEFAULT_SIZE); - } - - /** - * Constructs a new {@code ByteArrayOutputStream} with a default size of {@code size} bytes. If - * more than {@code size} bytes are written to this instance, the underlying byte array will - * expand. - * - * @param size initial size for the underlying byte array. The value will be pinned to a default - * minimum size. - */ - public PoolingByteArrayOutputStream(ByteArrayPool pool, int size) { - mPool = pool; - buf = mPool.getBuf(Math.max(size, DEFAULT_SIZE)); - } - - @Override - public void close() throws IOException { - mPool.returnBuf(buf); - buf = null; - super.close(); - } - - @Override - public void finalize() { - mPool.returnBuf(buf); - } - - /** - * Ensures there is enough space in the buffer for the given number of additional bytes. - */ - private void expand(int i) { - /* Can the buffer handle @i more bytes, if not expand it */ - if (count + i <= buf.length) { - return; - } - byte[] newbuf = mPool.getBuf((count + i) * 2); - System.arraycopy(buf, 0, newbuf, 0, count); - mPool.returnBuf(buf); - buf = newbuf; - } - - @Override - public synchronized void write(byte[] buffer, int offset, int len) { - expand(len); - super.write(buffer, offset, len); - } - - @Override - public synchronized void write(int oneByte) { - expand(1); - super.write(oneByte); - } -} diff --git a/app/src/main/java/com/android/volley/toolbox/RequestFuture.java b/app/src/main/java/com/android/volley/toolbox/RequestFuture.java deleted file mode 100644 index 173c44ccbc..0000000000 --- a/app/src/main/java/com/android/volley/toolbox/RequestFuture.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley.toolbox; - -import com.android.volley.Request; -import com.android.volley.Response; -import com.android.volley.VolleyError; - -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -/** - * A Future that represents a Volley request. - * - * Used by providing as your response and error listeners. For example: - *
- * RequestFuture<JSONObject> future = RequestFuture.newFuture();
- * MyRequest request = new MyRequest(URL, future, future);
- *
- * // If you want to be able to cancel the request:
- * future.setRequest(requestQueue.add(request));
- *
- * // Otherwise:
- * requestQueue.add(request);
- *
- * try {
- *   JSONObject response = future.get();
- *   // do something with response
- * } catch (InterruptedException e) {
- *   // handle the error
- * } catch (ExecutionException e) {
- *   // handle the error
- * }
- * 
- * - * @param The type of parsed response this future expects. - */ -public class RequestFuture implements Future, Response.Listener, - Response.ErrorListener { - private Request mRequest; - private boolean mResultReceived = false; - private T mResult; - private VolleyError mException; - - public static RequestFuture newFuture() { - return new RequestFuture(); - } - - private RequestFuture() {} - - public void setRequest(Request request) { - mRequest = request; - } - - @Override - public synchronized boolean cancel(boolean mayInterruptIfRunning) { - if (mRequest == null) { - return false; - } - - if (!isDone()) { - mRequest.cancel(); - return true; - } else { - return false; - } - } - - @Override - public T get() throws InterruptedException, ExecutionException { - try { - return doGet(null); - } catch (TimeoutException e) { - throw new AssertionError(e); - } - } - - @Override - public T get(long timeout, TimeUnit unit) - throws InterruptedException, ExecutionException, TimeoutException { - return doGet(TimeUnit.MILLISECONDS.convert(timeout, unit)); - } - - private synchronized T doGet(Long timeoutMs) - throws InterruptedException, ExecutionException, TimeoutException { - if (mException != null) { - throw new ExecutionException(mException); - } - - if (mResultReceived) { - return mResult; - } - - if (timeoutMs == null) { - wait(0); - } else if (timeoutMs > 0) { - wait(timeoutMs); - } - - if (mException != null) { - throw new ExecutionException(mException); - } - - if (!mResultReceived) { - throw new TimeoutException(); - } - - return mResult; - } - - @Override - public boolean isCancelled() { - if (mRequest == null) { - return false; - } - return mRequest.isCanceled(); - } - - @Override - public synchronized boolean isDone() { - return mResultReceived || mException != null || isCancelled(); - } - - @Override - public synchronized void onResponse(T response) { - mResultReceived = true; - mResult = response; - notifyAll(); - } - - @Override - public synchronized void onErrorResponse(VolleyError error) { - mException = error; - notifyAll(); - } -} - diff --git a/app/src/main/java/com/android/volley/toolbox/StringRequest.java b/app/src/main/java/com/android/volley/toolbox/StringRequest.java deleted file mode 100644 index 6b3dfcf8ab..0000000000 --- a/app/src/main/java/com/android/volley/toolbox/StringRequest.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley.toolbox; - -import com.android.volley.NetworkResponse; -import com.android.volley.Request; -import com.android.volley.Response; -import com.android.volley.Response.ErrorListener; -import com.android.volley.Response.Listener; - -import java.io.UnsupportedEncodingException; - -/** - * A canned request for retrieving the response body at a given URL as a String. - */ -public class StringRequest extends Request { - private final Listener mListener; - - /** - * Creates a new request with the given method. - * - * @param method the request {@link Method} to use - * @param url URL to fetch the string at - * @param listener Listener to receive the String response - * @param errorListener Error listener, or null to ignore errors - */ - public StringRequest(int method, String url, Listener listener, - ErrorListener errorListener) { - super(method, url, errorListener); - mListener = listener; - } - - /** - * Creates a new GET request. - * - * @param url URL to fetch the string at - * @param listener Listener to receive the String response - * @param errorListener Error listener, or null to ignore errors - */ - public StringRequest(String url, Listener listener, ErrorListener errorListener) { - this(Method.GET, url, listener, errorListener); - } - - @Override - protected void deliverResponse(String response) { - mListener.onResponse(response); - } - - @Override - protected Response parseNetworkResponse(NetworkResponse response) { - String parsed; - try { - parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); - } catch (UnsupportedEncodingException e) { - parsed = new String(response.data); - } - return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response)); - } -} diff --git a/app/src/main/java/com/android/volley/toolbox/Volley.java b/app/src/main/java/com/android/volley/toolbox/Volley.java deleted file mode 100644 index 0e04e87698..0000000000 --- a/app/src/main/java/com/android/volley/toolbox/Volley.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.volley.toolbox; - -import android.content.Context; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager.NameNotFoundException; -import android.net.http.AndroidHttpClient; -import android.os.Build; - -import com.android.volley.Network; -import com.android.volley.RequestQueue; - -import java.io.File; - -public class Volley { - - /** Default on-disk cache directory. */ - private static final String DEFAULT_CACHE_DIR = "volley"; - - /** - * Creates a default instance of the worker pool and calls {@link RequestQueue#start()} on it. - * - * @param context A {@link Context} to use for creating the cache dir. - * @param stack An {@link HttpStack} to use for the network, or null for default. - * @return A started {@link RequestQueue} instance. - */ - public static RequestQueue newRequestQueue(Context context, HttpStack stack) { - File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR); - - String userAgent = "volley/0"; - try { - String packageName = context.getPackageName(); - PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0); - userAgent = packageName + "/" + info.versionCode; - } catch (NameNotFoundException e) { - } - - if (stack == null) { - if (Build.VERSION.SDK_INT >= 9) { - stack = new HurlStack(); - } else { - // Prior to Gingerbread, HttpUrlConnection was unreliable. - // See: http://android-developers.blogspot.com/2011/09/androids-http-clients.html - stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent)); - } - } - - Network network = new BasicNetwork(stack); - - RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network); - queue.start(); - - return queue; - } - - /** - * Creates a default instance of the worker pool and calls {@link RequestQueue#start()} on it. - * - * @param context A {@link Context} to use for creating the cache dir. - * @return A started {@link RequestQueue} instance. - */ - public static RequestQueue newRequestQueue(Context context) { - return newRequestQueue(context, null); - } -} diff --git a/app/src/main/java/com/gh/base/AppController.java b/app/src/main/java/com/gh/base/AppController.java index 2161f5af28..d0c7287e91 100644 --- a/app/src/main/java/com/gh/base/AppController.java +++ b/app/src/main/java/com/gh/base/AppController.java @@ -7,12 +7,8 @@ import android.app.Application; import android.content.Context; import android.os.Process; import android.support.v4.util.ArrayMap; -import android.text.TextUtils; import android.util.Log; -import com.android.volley.Request; -import com.android.volley.RequestQueue; -import com.android.volley.toolbox.Volley; import com.facebook.drawee.backends.pipeline.Fresco; import com.gh.common.util.DataUtils; import com.gh.common.util.HttpsUtils; @@ -35,8 +31,6 @@ public class AppController extends Application { private static AppController mInstance; private static ArrayMap objectMap = new ArrayMap<>(); - private RequestQueue mRequestQueue; - private ArrayList list = new ArrayList<>(); private boolean isFinish = false; @@ -160,31 +154,6 @@ public class AppController extends Application { return mInstance; } - public static void addToRequestQueue(Request request) { - request.setTag(TAG); - getInstance().addRequest(request); - } - - public static void canclePendingRequests(String tag) { - if (TextUtils.isEmpty(tag)) { - tag = TAG; - } - getInstance().cancleRequest(tag); - } - - public void addRequest(Request request) { - if (mRequestQueue == null) { - mRequestQueue = Volley.newRequestQueue(getApplicationContext()); - } - mRequestQueue.add(request); - } - - public void cancleRequest(Object tag){ - if (mRequestQueue != null) { - mRequestQueue.cancelAll(tag); - } - } - private boolean shouldInit() { ActivityManager am = ((ActivityManager) getSystemService(Context.ACTIVITY_SERVICE)); List processInfos = am.getRunningAppProcesses(); diff --git a/app/src/main/java/com/gh/common/util/ConcernUtils.java b/app/src/main/java/com/gh/common/util/ConcernUtils.java index 5bd982f8e6..3f24bb7e9d 100644 --- a/app/src/main/java/com/gh/common/util/ConcernUtils.java +++ b/app/src/main/java/com/gh/common/util/ConcernUtils.java @@ -1,154 +1,64 @@ package com.gh.common.util; -import android.content.Context; -import android.telephony.TelephonyManager; - -import com.android.volley.Request; -import com.android.volley.Response; -import com.android.volley.VolleyError; -import com.gh.base.AppController; -import com.gh.gamecenter.volley.extended.JsonArrayExtendedRequest; -import com.gh.gamecenter.volley.extended.StringExtendedRequest; +import com.gh.gamecenter.retrofit.Response; +import com.gh.gamecenter.retrofit.RetrofitManager; import org.json.JSONArray; -import java.util.UUID; +import okhttp3.MediaType; +import okhttp3.RequestBody; +import okhttp3.ResponseBody; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; /** * Created by khy on 2016/8/24. + * croncern 工具类 */ public class ConcernUtils { - public static void loadConcernData(final String url, final DownJsonListener listener) { + public static void postConcernGameId(final String deviceId, final String gameId) { new Thread(new Runnable() { @Override public void run() { - JsonArrayExtendedRequest request = new JsonArrayExtendedRequest(url, - new Response.Listener() { - @Override - public void onResponse(JSONArray response) { - if (listener != null){ - listener.downSucced(response.toString()); - } - } - }, new Response.ErrorListener() { - @Override - public void onErrorResponse(VolleyError error) { - if (listener != null){ - listener.downFailed(); - } - } - }); - request.setShouldCache(false); - AppController.addToRequestQueue(request); - } - }).start(); + JSONArray params = new JSONArray(); + params.put(gameId); - } - - public static void postConcernGameId(final String gameId, final String postUrl, final DownJsonListener listener){ - new Thread(new Runnable() { - @Override - public void run() { - - JSONArray data = new JSONArray(); - data.put(gameId); - - StringExtendedRequest request = new StringExtendedRequest( - Request.Method.POST, postUrl, data.toString(), - new Response.Listener() { - @Override - public void onResponse(String response) { - if (listener != null) { - listener.downSucced("关注成功"); - } - } - }, new Response.ErrorListener() { - @Override - public void onErrorResponse(VolleyError error) { - if (listener != null) { - listener.downFailed(); - } - } - }); - request.setShouldCache(false); - AppController.addToRequestQueue(request); + RequestBody body = RequestBody.create(MediaType.parse("application/json"), + params.toString()); + RetrofitManager.getApi().postConcern(deviceId, body) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response()); } }).start(); } - public static void deleteConcernData(final String url, final DownJsonListener listener){ + public static void deleteConcernData(final String deviceId, final String gameId) { new Thread(new Runnable() { @Override public void run() { - StringExtendedRequest request = new StringExtendedRequest( - Request.Method.DELETE, url, - new Response.Listener() { - @Override - public void onResponse(String response) { - if (listener != null) { - listener.downSucced("删除成功"); - } - } - }, new Response.ErrorListener() { - @Override - public void onErrorResponse(VolleyError error) { - if (listener != null) { - listener.downFailed(); - } - } - }); - request.setShouldCache(false); - AppController.addToRequestQueue(request); + RetrofitManager.getApi().deleteConcern(deviceId, gameId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response()); } }).start(); } - public static void updateConcernData(final String url, final JSONArray data, final DownJsonListener listener){ + public static void updateConcernData(final String deviceId, final JSONArray data) { new Thread(new Runnable() { @Override public void run() { - StringExtendedRequest request = new StringExtendedRequest( - Request.Method.PUT, url, data.toString(), - new Response.Listener() { - @Override - public void onResponse(String response) { - if (listener != null) { - listener.downSucced("更新设备关注成功"); - } - } - }, new Response.ErrorListener() { - @Override - public void onErrorResponse(VolleyError error) { - if (listener != null) { - listener.downFailed(); - } - } - }); - request.setShouldCache(false); - AppController.addToRequestQueue(request); + RequestBody body = RequestBody.create(MediaType.parse("application/json"), + data.toString()); + RetrofitManager.getApi().putConcern(deviceId, body) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response()); } - }).start(); } - public interface DownJsonListener { - void downSucced(String str); - void downFailed(); - } - - // 获取设备号ID - public static String uuid(Context context){ - final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); - - final String tmDevice, tmSerial, androidId; - tmDevice = "" + tm.getDeviceId(); - tmSerial = "" + tm.getSimSerialNumber(); - androidId = "" + android.provider.Settings.Secure.getString(context.getContentResolver(), android.provider.Settings.Secure.ANDROID_ID); - - UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode()); - return deviceUuid.toString(); - } - } diff --git a/app/src/main/java/com/gh/common/util/NewsUtils.java b/app/src/main/java/com/gh/common/util/NewsUtils.java index da1e8acbd4..27985e018a 100644 --- a/app/src/main/java/com/gh/common/util/NewsUtils.java +++ b/app/src/main/java/com/gh/common/util/NewsUtils.java @@ -5,15 +5,14 @@ import android.content.Intent; import android.graphics.Color; import android.widget.TextView; -import com.android.volley.Request; import com.gh.base.AppController; -import com.gh.common.constant.Config; import com.gh.gamecenter.MessageDetailActivity; import com.gh.gamecenter.NewsDetailActivity; import com.gh.gamecenter.R; import com.gh.gamecenter.entity.ConcernEntity; import com.gh.gamecenter.entity.NewsEntity; -import com.gh.gamecenter.volley.extended.JsonObjectExtendedRequest; +import com.gh.gamecenter.retrofit.Response; +import com.gh.gamecenter.retrofit.RetrofitManager; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -21,6 +20,10 @@ import java.util.Date; import java.util.List; import java.util.Locale; +import okhttp3.ResponseBody; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + public class NewsUtils { /** @@ -66,11 +69,10 @@ public class NewsUtils { * 统计阅读量 */ public static void statNewsViews(String news_id) { - String url = Config.DATA_HOST + "news/stat?news_id=" + news_id; - JsonObjectExtendedRequest request = new JsonObjectExtendedRequest( - Request.Method.POST, url, null, null); - request.setShouldCache(false); - AppController.addToRequestQueue(request); + RetrofitManager.getData().postNewsViews(news_id) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response()); } /** diff --git a/app/src/main/java/com/gh/common/util/PlatformUtils.java b/app/src/main/java/com/gh/common/util/PlatformUtils.java index 8e4bd63e33..e8711ba775 100644 --- a/app/src/main/java/com/gh/common/util/PlatformUtils.java +++ b/app/src/main/java/com/gh/common/util/PlatformUtils.java @@ -7,27 +7,24 @@ import android.os.Handler; import android.support.v4.util.ArrayMap; import android.text.TextUtils; -import com.android.volley.Response; -import com.android.volley.VolleyError; -import com.gh.base.AppController; -import com.gh.common.constant.Config; import com.gh.gamecenter.R; +import com.gh.gamecenter.entity.PlatformEntity; import com.gh.gamecenter.eventbus.EBReuse; -import com.gh.gamecenter.volley.extended.JsonArrayExtendedRequest; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; +import com.gh.gamecenter.retrofit.Response; +import com.gh.gamecenter.retrofit.RetrofitManager; import java.io.File; import java.io.IOException; import java.net.HttpURLConnection; import java.util.ArrayList; import java.util.HashSet; +import java.util.List; import java.util.Properties; import java.util.Set; import de.greenrobot.event.EventBus; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; public class PlatformUtils { @@ -264,38 +261,29 @@ public class PlatformUtils { return; } isUpdate = true; - JsonArrayExtendedRequest request = new JsonArrayExtendedRequest( - Config.HOST + "support/setting/platform", - new Response.Listener() { + RetrofitManager.getApi().getGamePlatform() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response>(){ @Override - public void onResponse(JSONArray response) { - try { - Set platformSet = new HashSet<>(); - for (int i = 0; i < response.length(); i++) { - JSONObject jsonObject = response.getJSONObject(i); - String code = jsonObject.getString("code"); - String name = jsonObject.getString("name"); - String pic = jsonObject.getString("pic"); - String color = jsonObject.getString("color"); - platformSet.add(code + "=" + name + "=" + pic + "=" + color); - } - SharedPreferences sp = context.getSharedPreferences( - "gh_platform", Context.MODE_PRIVATE); - sp.edit().putStringSet("platform", platformSet).apply(); - initMap(); - EventBus.getDefault().post(new EBReuse("PlatformChanged")); - } catch (JSONException e) { - e.printStackTrace(); + public void onResponse(List response) { + Set platformSet = new HashSet<>(); + for (PlatformEntity platformEntity : response) { + platformSet.add(platformEntity.toString()); } + SharedPreferences sp = context.getSharedPreferences("gh_platform", Context.MODE_PRIVATE); + sp.edit().putStringSet("platform", platformSet).apply(); + initMap(); + EventBus.getDefault().post(new EBReuse("PlatformChanged")); + isUpdate = false; } - }, new Response.ErrorListener() { + @Override - public void onErrorResponse(VolleyError error) { + public void onFailure(Throwable e) { isUpdate = false; } }); - AppController.addToRequestQueue(request); } } diff --git a/app/src/main/java/com/gh/common/util/PostCommentUtils.java b/app/src/main/java/com/gh/common/util/PostCommentUtils.java index e5557c7b43..1d460311cd 100644 --- a/app/src/main/java/com/gh/common/util/PostCommentUtils.java +++ b/app/src/main/java/com/gh/common/util/PostCommentUtils.java @@ -2,96 +2,109 @@ package com.gh.common.util; import android.content.Context; -import com.android.volley.Request; -import com.android.volley.Response; -import com.android.volley.VolleyError; -import com.gh.base.AppController; -import com.gh.common.constant.Config; -import com.gh.gamecenter.volley.extended.JsonObjectExtendedRequest; -import com.gh.gamecenter.volley.extended.StringExtendedRequest; +import com.gh.gamecenter.retrofit.JSONObjectResponse; +import com.gh.gamecenter.retrofit.Response; +import com.gh.gamecenter.retrofit.RetrofitManager; import org.json.JSONObject; +import okhttp3.MediaType; +import okhttp3.RequestBody; +import okhttp3.ResponseBody; +import retrofit2.adapter.rxjava.HttpException; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + /** * Created by khy on 2016/11/9. * */ public class PostCommentUtils { - public static void addCommentData(Context context, String url, String content, PostCommentListener listener) { - addCommentData(context, url, content, true, listener); + public static void addCommentData(Context context, String newsId, String content, PostCommentListener listener) { + addCommentData(context, newsId, content, true, listener); } - public static void addCommentData(final Context context, final String url, final String content, + public static void addCommentData(final Context context, final String newsId, final String content, final boolean isCheck, final PostCommentListener listener) { new Thread(new Runnable() { @Override public void run() { - JsonObjectExtendedRequest request = new JsonObjectExtendedRequest( - Request.Method.POST, url, content, - new Response.Listener() { + RequestBody body = RequestBody.create(MediaType.parse("application/json"), content); + RetrofitManager.getComment().postNewsComment(TokenUtils.getToken(context, isCheck), newsId, body) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new JSONObjectResponse() { @Override public void onResponse(JSONObject response) { - if (listener != null){ - listener.postSucced(response); + if (response.length() != 0) { + if (listener != null){ + listener.postSucced(response); + } + } else { + Utils.toast(context, "提交失败,请检查网络设置"); } } - }, new Response.ErrorListener() { + @Override - public void onErrorResponse(VolleyError error) { - if (error.networkResponse != null && error.networkResponse.statusCode == 401) { - addCommentData(context, url, content, false, listener); - return; + public void onFailure(Throwable e) { + if (e instanceof HttpException) { + HttpException exception = (HttpException) e; + if (exception.code() == 401) { + addCommentData(context, newsId, content, false, listener); + return; + } } if (listener != null){ - listener.postFailed(error); + listener.postFailed(e); } } }); - request.setShouldCache(false); - request.addHeader("TOKEN", TokenUtils.getToken(context, isCheck)); - AppController.addToRequestQueue(request); } }).start(); } - public static void addCommentVoto(final Context context, final String newsId, final PostCommentListener listener) { - addCommentVoto(context, newsId, true, listener); + public static void addCommentVoto(final Context context, final String commentId, final PostCommentListener listener) { + addCommentVoto(context, commentId, true, listener); } - public static void addCommentVoto(final Context context, final String newsId, final boolean isCheck + public static void addCommentVoto(final Context context, final String commentId, final boolean isCheck , final PostCommentListener listener) { new Thread(new Runnable() { @Override public void run() { - StringExtendedRequest request = new StringExtendedRequest( - Request.Method.POST, Config.COMMENT_HOST + "comment/" + newsId + "/vote", - new Response.Listener() { + RetrofitManager.getComment().postCommentVote(TokenUtils.getToken(context, isCheck), commentId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response() { @Override - public void onResponse(String response) { - listener.postSucced(null); + public void onResponse(ResponseBody response) { + if (listener != null) { + listener.postSucced(null); + } } - }, - new Response.ErrorListener() { + @Override - public void onErrorResponse(VolleyError error) { - if (error.networkResponse != null && error.networkResponse.statusCode == 401) { - addCommentVoto(context, newsId, false,listener); - } else { - listener.postFailed(error); + public void onFailure(Throwable e) { + if (e instanceof HttpException) { + HttpException exception = (HttpException) e; + if (exception.code() == 401) { + addCommentVoto(context, commentId, false, listener); + return; + } + } + if (listener != null) { + listener.postFailed(e); } } }); - request.setShouldCache(false); - request.addHeader("TOKEN", TokenUtils.getToken(context, isCheck)); - AppController.addToRequestQueue(request); } }).start(); } public interface PostCommentListener { void postSucced(JSONObject response); - void postFailed(VolleyError error); + void postFailed(Throwable error); } } diff --git a/app/src/main/java/com/gh/common/util/TokenUtils.java b/app/src/main/java/com/gh/common/util/TokenUtils.java index 9309547d32..d62014fa63 100644 --- a/app/src/main/java/com/gh/common/util/TokenUtils.java +++ b/app/src/main/java/com/gh/common/util/TokenUtils.java @@ -9,11 +9,9 @@ import android.provider.Settings; import android.telephony.TelephonyManager; import android.text.TextUtils; -import com.android.volley.Request; -import com.android.volley.Response; -import com.gh.base.AppController; import com.gh.common.constant.Config; -import com.gh.gamecenter.volley.extended.StringExtendedRequest; +import com.gh.gamecenter.retrofit.RetrofitManager; +import com.gh.gamecenter.retrofit.StringResponse; import com.tencent.stat.StatConfig; import org.json.JSONException; @@ -32,6 +30,9 @@ import java.net.URL; import java.util.HashMap; import java.util.Map; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + public class TokenUtils { // 注册设备 @@ -185,9 +186,10 @@ public class TokenUtils { // 获取服务器时间 public static synchronized void getTime(Context context) { final SharedPreferences sp = context.getSharedPreferences(Config.PREFERENCE, Context.MODE_PRIVATE); - StringExtendedRequest request = new StringExtendedRequest( - Request.Method.GET, Config.HOST + "support/time/current", - new Response.Listener() { + RetrofitManager.getApi().getTime() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new StringResponse() { @Override public void onResponse(String response) { if (response.matches("^[0-9]{10}$")) { @@ -201,9 +203,7 @@ public class TokenUtils { } } } - }, null); - request.setShouldCache(false); - AppController.addToRequestQueue(request); + }); } public static synchronized void saveDeviceId(Context context, String device_id){ diff --git a/app/src/main/java/com/gh/gamecenter/ConcernActivity.java b/app/src/main/java/com/gh/gamecenter/ConcernActivity.java index 58575ab9f9..f7b9ffd4af 100644 --- a/app/src/main/java/com/gh/gamecenter/ConcernActivity.java +++ b/app/src/main/java/com/gh/gamecenter/ConcernActivity.java @@ -9,7 +9,6 @@ import android.widget.LinearLayout; import android.widget.RelativeLayout; import com.gh.base.BaseActivity; -import com.gh.common.constant.Config; import com.gh.common.util.ConcernUtils; import com.gh.common.util.TokenUtils; import com.gh.common.util.Utils; @@ -212,17 +211,6 @@ public class ConcernActivity extends BaseActivity implements OnClickListener { for (ConcernInfo concernInfo : concernManager.getConcernGame()) { data.put(concernInfo.getId()); } - ConcernUtils.updateConcernData(Config.HOST + "device/" + uuid + "/concern", data, - new ConcernUtils.DownJsonListener() { - @Override - public void downSucced(String str) { - Utils.log("更新设备关注游戏成功"); - } - - @Override - public void downFailed() { - Utils.log("更新设备关注游戏失败"); - } - }); + ConcernUtils.updateConcernData(uuid, data); } } diff --git a/app/src/main/java/com/gh/gamecenter/GameDetailActivity.java b/app/src/main/java/com/gh/gamecenter/GameDetailActivity.java index e2149fc781..13af42504e 100644 --- a/app/src/main/java/com/gh/gamecenter/GameDetailActivity.java +++ b/app/src/main/java/com/gh/gamecenter/GameDetailActivity.java @@ -7,11 +7,8 @@ import android.view.KeyEvent; import android.view.View; import android.widget.RelativeLayout; -import com.android.volley.Response; -import com.android.volley.VolleyError; import com.gh.base.AppController; import com.gh.base.BaseDetailActivity; -import com.gh.common.constant.Config; import com.gh.common.util.DataUtils; import com.gh.common.util.DialogUtils; import com.gh.gamecenter.changeskin.ChangeSkinUtils; @@ -19,16 +16,18 @@ import com.gh.gamecenter.entity.GameEntity; import com.gh.gamecenter.eventbus.EBConcernChanged; import com.gh.gamecenter.gamedetail.GameDetailAdapter; import com.gh.gamecenter.manager.DataCollectionManager; -import com.gh.gamecenter.volley.extended.JsonObjectExtendedRequest; -import com.google.gson.Gson; - -import org.json.JSONObject; +import com.gh.gamecenter.retrofit.Response; +import com.gh.gamecenter.retrofit.RetrofitManager; import java.util.HashMap; import java.util.Map; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + /** * Created by khy on 2016/8/12. + * */ public class GameDetailActivity extends BaseDetailActivity implements View.OnClickListener{ @@ -157,29 +156,25 @@ public class GameDetailActivity extends BaseDetailActivity implements View.OnCli // 获取游戏摘要 private void getGameDigest() { - JsonObjectExtendedRequest request = new JsonObjectExtendedRequest( - Config.HOST + "game/" + gameId + "/digest", - new Response.Listener() { + RetrofitManager.getApi().getGameDigest(gameId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response() { @Override - public void onResponse(JSONObject response) { - if (response.length() != 0) { - Gson gson = new Gson(); - gameEntity = gson.fromJson(response.toString(), GameEntity.class); - title = gameEntity.getName(); - actionbar_tv_title.setText(gameEntity.getName()); - adapter.setGameEntity(gameEntity); - adapter.getGameDetail(); - } else { - reuse_no_connection.setVisibility(View.VISIBLE); - } + public void onResponse(GameEntity response) { + gameEntity = response; + + title = gameEntity.getName(); + actionbar_tv_title.setText(gameEntity.getName()); + adapter.setGameEntity(gameEntity); + adapter.getGameDetail(); } - }, new Response.ErrorListener() { + @Override - public void onErrorResponse(VolleyError error) { + public void onFailure(Throwable e) { reuse_no_connection.setVisibility(View.VISIBLE); } }); - AppController.addToRequestQueue(request); } // 关注事件 diff --git a/app/src/main/java/com/gh/gamecenter/MainActivity.java b/app/src/main/java/com/gh/gamecenter/MainActivity.java index 8465eef988..e62a59046e 100644 --- a/app/src/main/java/com/gh/gamecenter/MainActivity.java +++ b/app/src/main/java/com/gh/gamecenter/MainActivity.java @@ -28,14 +28,8 @@ import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; -import com.android.volley.Request; -import com.android.volley.Request.Method; -import com.android.volley.Response; -import com.android.volley.VolleyError; -import com.gh.base.AppController; import com.gh.base.BaseFragmentActivity; import com.gh.common.constant.Config; -import com.gh.common.util.ConcernUtils; import com.gh.common.util.DataUtils; import com.gh.common.util.DeviceUtils; import com.gh.common.util.DialogUtils; @@ -73,19 +67,15 @@ import com.gh.gamecenter.manager.GameManager; import com.gh.gamecenter.manager.PackageManager; import com.gh.gamecenter.news.NewsFragment; import com.gh.gamecenter.personal.PersonalFragment; -import com.gh.gamecenter.volley.extended.JsonArrayExtendedRequest; -import com.gh.gamecenter.volley.extended.JsonObjectExtendedRequest; -import com.gh.gamecenter.volley.extended.StringExtendedRequest; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; +import com.gh.gamecenter.retrofit.JSONObjectResponse; +import com.gh.gamecenter.retrofit.Response; +import com.gh.gamecenter.retrofit.RetrofitManager; -import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.File; import java.io.IOException; -import java.lang.reflect.Type; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; @@ -98,6 +88,12 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import de.greenrobot.event.EventBus; +import okhttp3.MediaType; +import okhttp3.RequestBody; +import okhttp3.ResponseBody; +import rx.Observable; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; /** * @@ -209,13 +205,15 @@ public class MainActivity extends BaseFragmentActivity implements OnClickListene // 统计下载 private void uploadData(String id, String platform) { - HashMap params = new HashMap<>(); + Map params = new HashMap<>(); params.put("game", id); params.put("platform", platform); - JSONObject jsonObject = new JSONObject(params); - JsonObjectExtendedRequest request = new JsonObjectExtendedRequest(Method.POST, - Config.HOST + "stat/download", jsonObject.toString(), null, null); - AppController.addToRequestQueue(request); + RequestBody body = RequestBody.create(MediaType.parse("application/json"), + new JSONObject(params).toString()); + RetrofitManager.getApi().postDownload(body) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response()); } // 统计下载完成事件 @@ -292,20 +290,20 @@ public class MainActivity extends BaseFragmentActivity implements OnClickListene map.put("user", user); map.put("device_id", TokenUtils.getDeviceId(this)); map.put("channel", channel); - String url = Config.DATA_HOST + "api/v1d0/log"; Map params = new HashMap<>(); params.put("topic", "lunbotu"); params.put("source", "GH-ASSIST-Client"); params.put("time", String.valueOf(Utils.getTime(this))); params.put("content", new JSONObject(map).toString()); - StringExtendedRequest request = new StringExtendedRequest(Request.Method.POST, url, null, null); - request.setParams(params); - request.setShouldCache(false); - AppController.addToRequestQueue(request); + + RequestBody body = RequestBody.create(MediaType.parse("application/json"), + new JSONObject(params).toString()); + RetrofitManager.getData().postLog(body) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response()); } - } - } private void processHijack(DownloadEntity downloadEntity) { @@ -335,16 +333,18 @@ public class MainActivity extends BaseFragmentActivity implements OnClickListene map.put("user", user); map.put("device_id", TokenUtils.getDeviceId(this)); map.put("channel", channel); - String url = Config.DATA_HOST + "api/v1d0/log"; Map params = new HashMap<>(); params.put("topic", "hijack"); params.put("source", "GH-ASSIST-Client"); params.put("time", String.valueOf(Utils.getTime(this))); params.put("content", new JSONObject(map).toString()); - StringExtendedRequest request = new StringExtendedRequest(Method.POST, url, null, null); - request.setParams(params); - request.setShouldCache(false); - AppController.addToRequestQueue(request); + + RequestBody body = RequestBody.create(MediaType.parse("application/json"), + new JSONObject(params).toString()); + RetrofitManager.getData().postLog(body) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response()); } // 上传网络错误log @@ -363,16 +363,18 @@ public class MainActivity extends BaseFragmentActivity implements OnClickListene map.put("device_id", TokenUtils.getDeviceId(this)); map.put("channel", channel); map.put("error", downloadEntity.getError()); - String url = Config.DATA_HOST + "api/v1d0/log"; Map params = new HashMap<>(); params.put("topic", "neterror"); params.put("source", "GH-ASSIST-Client"); params.put("time", String.valueOf(Utils.getTime(this))); params.put("content", new JSONObject(map).toString()); - StringExtendedRequest request = new StringExtendedRequest(Method.POST, url, null, null); - request.setParams(params); - request.setShouldCache(false); - AppController.addToRequestQueue(request); + + RequestBody body = RequestBody.create(MediaType.parse("application/json"), + new JSONObject(params).toString()); + RetrofitManager.getData().postLog(body) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response()); } /* @@ -518,32 +520,17 @@ public class MainActivity extends BaseFragmentActivity implements OnClickListene Log.e("TD_CHANNEL_ID", (String) PackageUtils.getMetaData(this, getPackageName(), "TD_CHANNEL_ID")); } - //初始化关注 + // 初始化关注 private void initConcern() { - final List arrGameId = new ArrayList<>(); - final String getConcernUrl = Config.HOST + "device/" + TokenUtils.getDeviceId(MainActivity.this) + "/concern"; - ConcernUtils.loadConcernData(getConcernUrl, new ConcernUtils.DownJsonListener() { - @Override - public void downSucced(String str) { - try { - JSONArray jsonArray = new JSONArray(str); - for (int i = 0; i < jsonArray.length(); i++) { - String gameId = (String) jsonArray.get(i); - arrGameId.add(gameId); + RetrofitManager.getApi().getConcern(TokenUtils.getDeviceId(MainActivity.this)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response>() { + @Override + public void onResponse(List response) { + getConcernDigest(response); } - - getConcernDigest(arrGameId); - } catch (JSONException e) { - e.printStackTrace(); - } - } - - @Override - public void downFailed() { - - } - }); - + }); } private int initConcernCount; @@ -565,26 +552,22 @@ public class MainActivity extends BaseFragmentActivity implements OnClickListene initConcernCount = 0; for (String gameId : arrGameId) { - JsonObjectExtendedRequest request = new JsonObjectExtendedRequest( - Config.HOST + "game/" + gameId + "/digest", - new Response.Listener() { + RetrofitManager.getApi().getGameDigest(gameId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response() { @Override - public void onResponse(JSONObject response) { - if (response.length() != 0) { - Gson gson = new Gson(); - GameEntity gameEntity = gson.fromJson(response.toString(), GameEntity.class); - concernDigest.add(gameEntity); - } - + public void onResponse(GameEntity response) { + concernDigest.add(response); addInitConcernCount(); if (size == initConcernCount && concernDigest.size() != 0) { concernManager.addByList(concernDigest); Utils.log("初始化关注成功=="); } } - }, new Response.ErrorListener() { + @Override - public void onErrorResponse(VolleyError error) { + public void onFailure(Throwable e) { addInitConcernCount(); if (size == initConcernCount && concernDigest.size() != 0) { concernManager.addByList(concernDigest); @@ -592,7 +575,6 @@ public class MainActivity extends BaseFragmentActivity implements OnClickListene } } }); - AppController.addToRequestQueue(request); } } @@ -664,38 +646,34 @@ public class MainActivity extends BaseFragmentActivity implements OnClickListene iCount = 0; for (int i = 0; i < size; i++) { final String packageName = list.get(i); - JsonArrayExtendedRequest request = new JsonArrayExtendedRequest( - Config.HOST + "support/package/" + packageName + "/game/digest", - new Response.Listener() { + RetrofitManager.getApi().getGameDigestByPackageName(packageName) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response>() { @Override - public void onResponse(JSONArray response) { - if (response.length() != 0) { - Type listType = new TypeToken>() {}.getType(); - Gson gson = new Gson(); - List list = gson.fromJson(response.toString(), listType); - for (GameDigestEntity gameDigestEntity : list) { - GameInfo gameInfo = new GameInfo(); - gameInfo.setId(gameDigestEntity.getId()); - gameInfo.setPackageName(packageName); - gameInfo.setGameName(gameDigestEntity.getName()); - concernManager.updateByEntity(gameInfo); - } + public void onResponse(List response) { + for (GameDigestEntity gameDigestEntity : response) { + GameInfo gameInfo = new GameInfo(); + gameInfo.setId(gameDigestEntity.getId()); + gameInfo.setPackageName(packageName); + gameInfo.setGameName(gameDigestEntity.getName()); + concernManager.updateByEntity(gameInfo); } + addInstalledCount(); if (iCount == size) { updateConcern(); } } - }, new Response.ErrorListener() { + @Override - public void onErrorResponse(VolleyError error) { + public void onFailure(Throwable e) { addInstalledCount(); if (iCount == size) { updateConcern(); } } }); - AppController.addToRequestQueue(request); } } @@ -718,47 +696,44 @@ public class MainActivity extends BaseFragmentActivity implements OnClickListene final int size = concernIdList.size(); cCount = 0; for (int i = 0; i < size; i++) { - JsonObjectExtendedRequest request = new JsonObjectExtendedRequest( - Config.HOST + "game/" + concernIdList.get(i) + "/digest", - new Response.Listener() { + RetrofitManager.getApi().getGameDigest(concernIdList.get(i)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response() { @Override - public void onResponse(JSONObject response) { - if (response.length() != 0) { - Gson gson = new Gson(); - GameEntity gameEntity = gson.fromJson(response.toString(), GameEntity.class); - ConcernInfo concernInfo = concernManager.findConcernById(gameEntity.getId()); - if (concernInfo != null && gameEntity.getApk() != null - && gameEntity.getApk().size() != 0) { - HashMap packageNames = new HashMap<>(); - String packageName; - for (int i = 0, size = gameEntity.getApk().size(); i < size; i++) { - packageName = gameEntity.getApk().get(i).getPackageName(); - if (PackageManager.isInstalled(packageName)) { - packageNames.put(packageName, true); - } else { - packageNames.put(packageName, false); - } + public void onResponse(GameEntity response) { + ConcernInfo concernInfo = concernManager.findConcernById(response.getId()); + if (concernInfo != null && response.getApk() != null + && response.getApk().size() != 0) { + HashMap packageNames = new HashMap<>(); + String packageName; + for (int i = 0, size = response.getApk().size(); i < size; i++) { + packageName = response.getApk().get(i).getPackageName(); + if (PackageManager.isInstalled(packageName)) { + packageNames.put(packageName, true); + } else { + packageNames.put(packageName, false); } - concernInfo.setTime(System.currentTimeMillis()); - concernInfo.setPackageNames(packageNames); - concernManager.updateByConcern(concernInfo); } + concernInfo.setTime(System.currentTimeMillis()); + concernInfo.setPackageNames(packageNames); + concernManager.updateByConcern(concernInfo); } + addConcernCount(); if (cCount == size) { update(); } } - }, new Response.ErrorListener() { + @Override - public void onErrorResponse(VolleyError error) { + public void onFailure(Throwable e) { addConcernCount(); if (cCount == size) { update(); } } }); - AppController.addToRequestQueue(request); } } } @@ -872,28 +847,23 @@ public class MainActivity extends BaseFragmentActivity implements OnClickListene private void checkGameUpdate(String packageName) { Object gh_id = PackageUtils.getMetaData(this, packageName, "gh_id"); - String url; + Observable observable; if (gh_id == null) { - url = Config.HOST + "update/package/" + packageName; + observable = RetrofitManager.getApi().getGameUpdate(packageName); } else { - url = Config.HOST + "update/game/" + gh_id + "/package/" + packageName; + observable = RetrofitManager.getApi().getGameUpdate((String) gh_id, packageName); } - JsonObjectExtendedRequest request = new JsonObjectExtendedRequest(url, - new Response.Listener() { + observable.subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response() { @Override - public void onResponse(JSONObject response) { - if (response.length() != 0) { - Gson gson = new Gson(); - GameUpdateEntity gameUpdateEntity = gson.fromJson( - response.toString(), GameUpdateEntity.class); - if (PackageUtils.isCanUpdate(MainActivity.this, gameUpdateEntity)) { - PackageManager.addUpdate(gameUpdateEntity); - EventBus.getDefault().post(new EBDownloadStatus("update")); - } + public void onResponse(GameUpdateEntity response) { + if (PackageUtils.isCanUpdate(MainActivity.this, response)) { + PackageManager.addUpdate(response); + EventBus.getDefault().post(new EBDownloadStatus("update")); } } - }, null); - AppController.addToRequestQueue(request); + }); } private int count; @@ -910,31 +880,28 @@ public class MainActivity extends BaseFragmentActivity implements OnClickListene final List list = new ArrayList<>(); count = 0; for (ConcernInfo info : infos) { - JsonObjectExtendedRequest request = new JsonObjectExtendedRequest( - Config.HOST + "game/" + info.getId() + "/digest", - new Response.Listener() { + RetrofitManager.getApi().getGameDigest(info.getId()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response() { @Override - public void onResponse(JSONObject response) { - if (response.length() != 0) { - Gson gson = new Gson(); - GameEntity gameEntity = gson.fromJson(response.toString(), GameEntity.class); - list.add(gameEntity); - } + public void onResponse(GameEntity response) { + list.add(response); + addCount(); if (count == size) { processPluginData(list); } } - }, new Response.ErrorListener() { + @Override - public void onErrorResponse(VolleyError error) { + public void onFailure(Throwable e) { addCount(); if (count == size) { processPluginData(list); } } }); - AppController.addToRequestQueue(request); } } @@ -1004,9 +971,10 @@ public class MainActivity extends BaseFragmentActivity implements OnClickListene // 获取免责声明 private void getDisclaimer(final boolean isFirst) { - JsonObjectExtendedRequest request = new JsonObjectExtendedRequest( - Config.HOST + "disclaimer", - new Response.Listener() { + RetrofitManager.getApi().getDisclaimer() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new JSONObjectResponse() { @Override public void onResponse(JSONObject response) { if (response.length() != 0) { @@ -1025,8 +993,7 @@ public class MainActivity extends BaseFragmentActivity implements OnClickListene } } } - }, null); - AppController.addToRequestQueue(request); + }); } private Class intentClass(String to) { @@ -1125,86 +1092,77 @@ public class MainActivity extends BaseFragmentActivity implements OnClickListene }; private void getSearchHints() { - JsonArrayExtendedRequest request = new JsonArrayExtendedRequest( - Config.HOST + "search/game/default", - new Response.Listener() { + RetrofitManager.getApi().getSearchHints() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response>() { @Override - public void onResponse(JSONArray response) { - if (response.length() != 0) { - Type listType = new TypeToken>() {}.getType(); - Gson gson = new Gson(); - List searchHintList = gson.fromJson(response.toString(), listType); - if (searchHintList != null && searchHintList.size() != 0) { - if (searchHintList.size() == 1) { - searchHint = searchHintList.get(0); - } else { - searchHint = searchHintList.get(RandomUtils.nextInt(searchHintList.size())); - } - if (gameFragment != null) { - gameFragment.setHint(searchHint); - } - if (newsFragment != null) { - newsFragment.setHint(searchHint); - } + public void onResponse(List response) { + if (response.size() != 0) { + if (response.size() == 1) { + searchHint = response.get(0); + } else { + searchHint = response.get(RandomUtils.nextInt(response.size())); + } + if (gameFragment != null) { + gameFragment.setHint(searchHint); + } + if (newsFragment != null) { + newsFragment.setHint(searchHint); } } } - }, null); - AppController.addToRequestQueue(request); + }); } private void checkUpdate() { String TD_CHANNEL_ID = (String) PackageUtils.getMetaData(this, getPackageName(), "TD_CHANNEL_ID"); - String url = Config.HOST + "support/upgrade?version=" + PackageUtils.getVersion(getApplicationContext()) - + "&channel=" + TD_CHANNEL_ID; - JsonObjectExtendedRequest request = new JsonObjectExtendedRequest(url, - new Response.Listener() { + RetrofitManager.getApi().getUpdate(PackageUtils.getVersion(getApplicationContext()), TD_CHANNEL_ID) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response() { @Override - public void onResponse(JSONObject response) { - if (response.length() != 0) { - Gson gson = new Gson(); - appEntity = gson.fromJson(response.toString(), AppEntity.class); + public void onResponse(AppEntity response) { + appEntity = response; - float version = Float.valueOf(appEntity.getVersion()); - float currentVersion = Float.valueOf(PackageUtils.getVersion(getApplicationContext())); - if (version > currentVersion) { - // 光环助手 有更新 - GameUpdateEntity game = new GameUpdateEntity(); - game.setName("光环助手V" + appEntity.getVersion()); - game.setPackageName(getPackageName()); - game.setSize(appEntity.getSize()); - game.setVersion(appEntity.getVersion()); - game.setUrl(appEntity.getUrl()); - game.setPlatform("官方版"); - game.setId("5618b86e8ab49e17088b4575"); - PackageManager.addUpdate(0, game); + float version = Float.valueOf(response.getVersion()); + float currentVersion = Float.valueOf(PackageUtils.getVersion(getApplicationContext())); + if (version > currentVersion) { + // 光环助手 有更新 + GameUpdateEntity game = new GameUpdateEntity(); + game.setName("光环助手V" + response.getVersion()); + game.setPackageName(getPackageName()); + game.setSize(response.getSize()); + game.setVersion(response.getVersion()); + game.setUrl(response.getUrl()); + game.setPlatform("官方版"); + game.setId("5618b86e8ab49e17088b4575"); + PackageManager.addUpdate(0, game); - String updateMD5 = MD5Utils.getUpdateMD5(appEntity.getUrl(), appEntity.getContent()); - if (appEntity.isForce()) { - // 强制更新 + String updateMD5 = MD5Utils.getUpdateMD5(response.getUrl(), response.getContent()); + if (response.isForce()) { + // 强制更新 + showUpdateDialog(updateMD5); + } else { + // 非强制更新 + if ("EVERY_TIME_OPEN".equals(response.getAlert())) { + // 每次都提示 showUpdateDialog(updateMD5); - } else { - // 非强制更新 - if ("EVERY_TIME_OPEN".equals(appEntity.getAlert())) { - // 每次都提示 + } else if (!"NEVER".equals(response.getAlert())){ + // 一天提示一次 + String showUpdateTime = sp.getString("show_update_tiem", null); + SimpleDateFormat format = new SimpleDateFormat( + "yyyy-MM-dd", Locale.getDefault()); + String today = format.format(new Date()); + if (!today.equals(showUpdateTime)) { + sp.edit().putString("show_update_tiem", today).apply(); showUpdateDialog(updateMD5); - } else if (!"NEVER".equals(appEntity.getAlert())){ - // 一天提示一次 - String showUpdateTime = sp.getString("show_update_tiem", null); - SimpleDateFormat format = new SimpleDateFormat( - "yyyy-MM-dd", Locale.getDefault()); - String today = format.format(new Date()); - if (!today.equals(showUpdateTime)) { - sp.edit().putString("show_update_tiem", today).apply(); - showUpdateDialog(updateMD5); - } } } } } } - }, null); - AppController.addToRequestQueue(request); + }); } private void showUpdateDialog(final String md5) { @@ -1339,17 +1297,18 @@ public class MainActivity extends BaseFragmentActivity implements OnClickListene map.put("user", user); map.put("device_id", TokenUtils.getDeviceId(this)); map.put("channel", channel); - String url = Config.DATA_HOST + "api/v1d0/log"; Map params = new HashMap<>(); params.put("topic", "upgrade"); params.put("source", "GH-ASSIST-Client"); params.put("time", String.valueOf(Utils.getTime(this))); params.put("content", new JSONObject(map).toString()); - StringExtendedRequest request = new StringExtendedRequest(Method.POST, url, null, null); - request.setParams(params); - request.setShouldCache(false); - AppController.addToRequestQueue(request); - Utils.log("提交更新数据" + new JSONObject(params).toString()); + + RequestBody body = RequestBody.create(MediaType.parse("application/json"), + new JSONObject(params).toString()); + RetrofitManager.getData().postLog(body) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response()); } // 获取META-INF中的plugin_update 文件,判断是否从游戏插件中下载的app,是则获取游戏id,启动游戏更新,下载该游戏 @@ -1581,31 +1540,26 @@ public class MainActivity extends BaseFragmentActivity implements OnClickListene } if ("安装".equals(busFour.getType()) && sp.getBoolean("concerngame", true)) {//设置页面控制是否安装后自动关注 // 安装后关注游戏 - JsonArrayExtendedRequest request = new JsonArrayExtendedRequest( - Config.HOST + "support/package/" + packageName + "/game/digest", - new Response.Listener() { + RetrofitManager.getApi().getGameDigestByPackageName(packageName) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response>() { @Override - public void onResponse(JSONArray response) { - if (response.length() != 0) { - Type listType = new TypeToken>() {}.getType(); - Gson gson = new Gson(); - List list = gson.fromJson(response.toString(), listType); - for (GameDigestEntity gameDigestEntity : list) { - GameInfo gameInfo = new GameInfo(); - gameInfo.setId(gameDigestEntity.getId()); - gameInfo.setPackageName(packageName); - gameInfo.setGameName(gameDigestEntity.getName()); - concernManager.updateByEntity(gameInfo); - concernGame(gameDigestEntity.getId(), packageName); - if (PackageUtils.getMetaData(getApplicationContext(), - packageName, "gh_version") != null) { - checkGameUpdate(packageName); - } + public void onResponse(List response) { + for (GameDigestEntity gameDigestEntity : response) { + GameInfo gameInfo = new GameInfo(); + gameInfo.setId(gameDigestEntity.getId()); + gameInfo.setPackageName(packageName); + gameInfo.setGameName(gameDigestEntity.getName()); + concernManager.updateByEntity(gameInfo); + concernGame(gameDigestEntity.getId(), packageName); + if (PackageUtils.getMetaData(getApplicationContext(), + packageName, "gh_version") != null) { + checkGameUpdate(packageName); } } } - }, null); - AppController.addToRequestQueue(request); + }); } Map map = new HashMap<>(); @@ -1615,36 +1569,32 @@ public class MainActivity extends BaseFragmentActivity implements OnClickListene } private void concernGame(final String id, final String packageName) { - JsonObjectExtendedRequest request = new JsonObjectExtendedRequest( - Config.HOST + "game/" + id + "/digest", - new Response.Listener() { + RetrofitManager.getApi().getGameDigest(id) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response() { @Override - public void onResponse(JSONObject response) { - if (response.length() != 0) { - Gson gson = new Gson(); - GameEntity gameEntity = gson.fromJson(response.toString(), GameEntity.class); - GameManager manager = new GameManager(getApplicationContext()); - manager.addOrUpdate(gameEntity.getApk(), gameEntity.getId(), gameEntity.getName()); - if (!concernManager.isConcern(id)) { - concernManager.addByEntity(gameEntity); - } - // 检查是否能插件化 - if (gameEntity.getTag() != null && gameEntity.getTag().size() != 0 - && gameEntity.getApk() != null) { - for (ApkEntity apkEntity : gameEntity.getApk()) { - if (apkEntity.getPackageName().equals(packageName) - && !TextUtils.isEmpty(apkEntity.getGhVersion()) - && !PackageUtils.isSignature(getApplicationContext(), apkEntity.getPackageName())) { - PackageManager.addUpdate(getGameUpdateEntity(gameEntity, apkEntity)); - EventBus.getDefault().post(new EBDownloadStatus("plugin")); - break; - } + public void onResponse(GameEntity response) { + GameManager manager = new GameManager(getApplicationContext()); + manager.addOrUpdate(response.getApk(), response.getId(), response.getName()); + if (!concernManager.isConcern(id)) { + concernManager.addByEntity(response); + } + // 检查是否能插件化 + if (response.getTag() != null && response.getTag().size() != 0 + && response.getApk() != null) { + for (ApkEntity apkEntity : response.getApk()) { + if (apkEntity.getPackageName().equals(packageName) + && !TextUtils.isEmpty(apkEntity.getGhVersion()) + && !PackageUtils.isSignature(getApplicationContext(), apkEntity.getPackageName())) { + PackageManager.addUpdate(getGameUpdateEntity(response, apkEntity)); + EventBus.getDefault().post(new EBDownloadStatus("plugin")); + break; } } } } - }, null); - AppController.addToRequestQueue(request); + }); } @Override diff --git a/app/src/main/java/com/gh/gamecenter/MessageDetailActivity.java b/app/src/main/java/com/gh/gamecenter/MessageDetailActivity.java index 6b1afe97be..8e0fcc99cc 100644 --- a/app/src/main/java/com/gh/gamecenter/MessageDetailActivity.java +++ b/app/src/main/java/com/gh/gamecenter/MessageDetailActivity.java @@ -22,15 +22,11 @@ import android.widget.RelativeLayout; import android.widget.ScrollView; import android.widget.TextView; -import com.android.volley.Response; -import com.android.volley.VolleyError; -import com.android.volley.toolbox.DiskBasedCache; import com.facebook.drawee.view.SimpleDraweeView; import com.gh.base.AppController; import com.gh.base.BaseActivity; import com.gh.common.constant.Config; import com.gh.common.util.DialogUtils; -import com.gh.common.util.GzipUtils; import com.gh.common.util.PostCommentUtils; import com.gh.common.util.TimestampUtils; import com.gh.common.util.TokenUtils; @@ -42,23 +38,22 @@ import com.gh.gamecenter.entity.CommentEntity; import com.gh.gamecenter.entity.ConcernEntity; import com.gh.gamecenter.entity.ViewsEntity; import com.gh.gamecenter.manager.CommentManager; +import com.gh.gamecenter.retrofit.OkHttpCache; +import com.gh.gamecenter.retrofit.Response; import com.gh.gamecenter.retrofit.RetrofitManager; -import com.gh.gamecenter.volley.extended.JsonObjectExtendedRequest; import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; -import java.io.File; -import java.lang.reflect.Type; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import butterknife.OnTouch; +import retrofit2.adapter.rxjava.HttpException; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action1; import rx.schedulers.Schedulers; @@ -205,13 +200,13 @@ public class MessageDetailActivity extends BaseActivity implements MessageDetail } private void getConcernDigest() { - JsonObjectExtendedRequest request = new JsonObjectExtendedRequest(Config.HOST + "article/"+ newsId +"/rich-digest", - new Response.Listener() { + RetrofitManager.getApi().getNewsRichDigest(newsId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response() { @Override - public void onResponse(JSONObject response) { - Type listType = new TypeToken() {}.getType(); - Gson gson = new Gson(); - mConcernEntity = gson.fromJson(response.toString(), listType); + public void onResponse(ConcernEntity response) { + mConcernEntity = response; mConcernEntity.setCommentnum(commentNum); adapter.addConcernEntity(mConcernEntity); @@ -223,14 +218,12 @@ public class MessageDetailActivity extends BaseActivity implements MessageDetail setSoftInput(true); } } - }, - new Response.ErrorListener() { + @Override - public void onErrorResponse(VolleyError error) { + public void onFailure(Throwable e) { showNoConnection(true); } }); - AppController.addToRequestQueue(request); } private void getNewsViews() { @@ -241,7 +234,7 @@ public class MessageDetailActivity extends BaseActivity implements MessageDetail .subscribe(new Action1>() { @Override public void call(List viewsEntities) { - if (viewsEntities.size() >0) { + if (viewsEntities.size() > 0) { mConcernEntity.setViews(viewsEntities.get(0).getViews()); adapter.notifyItemChanged(0); } @@ -316,20 +309,19 @@ public class MessageDetailActivity extends BaseActivity implements MessageDetail } catch (JSONException e) { e.printStackTrace(); } - if (newsId == null && mConcernEntity == null || - newsId == null && mConcernEntity!= null && mConcernEntity.getId() == null) { + if (newsId == null || mConcernEntity == null || mConcernEntity.getId() == null) { Utils.toast(this, "评论异常"); return; - } else if(newsId == null) { + } else if (newsId == null) { newsId = mConcernEntity.getId(); } - PostCommentUtils.addCommentData(MessageDetailActivity.this, - Config.COMMENT_HOST + "article/" + newsId + "/comment", jsonObject.toString(), + + PostCommentUtils.addCommentData(MessageDetailActivity.this, newsId, jsonObject.toString(), new PostCommentUtils.PostCommentListener() { @Override public void postSucced(JSONObject response) { mSendingDialog.dismiss(); - Utils.toast(MessageDetailActivity.this, "发表成功"); + toast("发表成功"); mMessageDetailEt.setText(""); setSoftInput(false); @@ -351,7 +343,7 @@ public class MessageDetailActivity extends BaseActivity implements MessageDetail adapter.addNormalComment(commentEntity); } - modifyNewsCommentVolleyCache(0, cacheObject, newsId); + modifyNewsCommentOkhttpCache(0, cacheObject, newsId); } catch (JSONException e) { e.printStackTrace(); } @@ -371,65 +363,58 @@ public class MessageDetailActivity extends BaseActivity implements MessageDetail } @Override - public void postFailed(VolleyError error) { + public void postFailed(Throwable e) { mSendingDialog.dismiss(); - if (error.networkResponse == null) { - Utils.toast(MessageDetailActivity.this, "提交失败,请检查网络设置"); - Utils.log("评论错误返回为空======"); - return; - } - - String errorData = new String(error.networkResponse.data); - try { - JSONObject errorJson = new JSONObject(errorData); - String detail = errorJson.getString("detail"); - if ("too frequent".equals(detail)) { - Utils.toast(MessageDetailActivity.this, "别话痨哦~休息一会再来评论吧~"); - } else if ("user blocked".equals(detail)) { - Utils.toast(MessageDetailActivity.this, "账号状态异常,暂时无法发表评论"); - } else if ("article blocked".equals(detail)) { - Utils.toast(MessageDetailActivity.this, "文章异常,无法发表评论"); - setSoftInput(false); - } else if ("illegal".equals(detail)) { - Utils.toast(MessageDetailActivity.this, "评论内容可能包括敏感信息,请修改后再发表"); - } else { - Utils.toast(MessageDetailActivity.this, "评论失败,未知原因"); + if (e instanceof HttpException) { + HttpException exception = (HttpException) e; + if (exception.code() == 403) { + try { + JSONObject errorJson = new JSONObject(exception.response().errorBody().string()); + String detail = errorJson.getString("detail"); + if ("too frequent".equals(detail)) { + toast("别话痨哦~休息一会再来评论吧~"); + } else if ("user blocked".equals(detail)) { + toast("账号状态异常,暂时无法发表评论"); + } else if ("article blocked".equals(detail)) { + toast("文章异常,无法发表评论"); + setSoftInput(false); + } else if ("illegal".equals(detail)) { + toast("评论内容可能包括敏感信息,请修改后再发表"); + } else { + toast("评论失败,未知原因"); + } + } catch (Exception ex) { + ex.printStackTrace(); + toast("评论异常"); + } + return; } - } catch (JSONException e) { - Utils.toast(MessageDetailActivity.this, "评论异常"); - e.printStackTrace(); } + toast("提交失败,请检查网络设置"); } }); } - private static final String DEFAULT_CACHE_DIR = "volley"; - - private void modifyNewsCommentVolleyCache(int offset, JSONObject commentData, String id) { - File cacheDir = new File(getCacheDir(), DEFAULT_CACHE_DIR); - DiskBasedCache cache = new DiskBasedCache(cacheDir); + private void modifyNewsCommentOkhttpCache(int offset, JSONObject commentData, String id) { String key = TimestampUtils.addTimestamp(Config.COMMENT_HOST + "article/" + id + "/comment?limit=10&offset=" + offset); - byte[] data = cache.getData(key); + byte[] data = OkHttpCache.getCache(key); if (data != null) { try { - JSONArray jsonArray = new JSONArray(new String(GzipUtils.decompressBytes(data))); + JSONArray jsonArray = new JSONArray(new String(data)); JSONArray newComment = new JSONArray(); newComment.put(commentData); for (int i = 0, size = jsonArray.length() > 9 ? 9 : jsonArray.length(); i < size; i++) { newComment.put(jsonArray.get(i)); } - Utils.log(newComment.toString()); - cache.modify(key, GzipUtils.compressBytes(newComment.toString().getBytes())); + OkHttpCache.updateCache(key, newComment.toString().getBytes()); if (jsonArray.length() == 10) { - modifyNewsCommentVolleyCache(offset + 10, jsonArray.getJSONObject(9), id); + modifyNewsCommentOkhttpCache(offset + 10, jsonArray.getJSONObject(9), id); } } catch (JSONException e) { e.printStackTrace(); } - } else { - Utils.log("modifyNewsCommentVolleyCache is null"); } } diff --git a/app/src/main/java/com/gh/gamecenter/NewsDetailActivity.java b/app/src/main/java/com/gh/gamecenter/NewsDetailActivity.java index 0fcf8d87e3..ec51e4c167 100644 --- a/app/src/main/java/com/gh/gamecenter/NewsDetailActivity.java +++ b/app/src/main/java/com/gh/gamecenter/NewsDetailActivity.java @@ -15,11 +15,6 @@ import android.view.View.OnClickListener; import android.view.Window; import android.widget.Toast; -import com.android.volley.NoConnectionError; -import com.android.volley.Response; -import com.android.volley.TimeoutError; -import com.android.volley.VolleyError; -import com.gh.base.AppController; import com.gh.base.BaseDetailActivity; import com.gh.common.constant.Config; import com.gh.common.util.DataUtils; @@ -30,14 +25,15 @@ import com.gh.gamecenter.eventbus.EBConcernChanged; import com.gh.gamecenter.eventbus.EBNetworkState; import com.gh.gamecenter.manager.DataCollectionManager; import com.gh.gamecenter.newsdetail.NewsDetailAdapter; -import com.gh.gamecenter.volley.extended.JsonObjectExtendedRequest; -import com.google.gson.Gson; - -import org.json.JSONObject; +import com.gh.gamecenter.retrofit.Response; +import com.gh.gamecenter.retrofit.RetrofitManager; import java.util.HashMap; import java.util.Map; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + /** * 文章详情页面 要启动该页面 需要传入一下参数 放入 EssayEntity中传过来 文章 id 文章标题 title 文章发表时间 time * @@ -225,50 +221,36 @@ public class NewsDetailActivity extends BaseDetailActivity implements OnClickLis return super.dispatchTouchEvent(ev); } - private void getNewsDigest(final String news_id) { - JsonObjectExtendedRequest request = new JsonObjectExtendedRequest( - Config.HOST + "news/" + news_id + "/digest", - new Response.Listener() { + private void getNewsDigest(final String newsId) { + RetrofitManager.getApi().getNewsDigest(newsId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response() { @Override - public void onResponse(JSONObject response) { - if (response.length() != 0) { - Gson gson = new Gson(); - NewsEntity newsEntity = gson.fromJson(response.toString(), NewsEntity.class); - if (newsEntity.getType() != null) { - actionbar_tv_title.setText(newsEntity.getType()); - } - - adapter.setId(news_id); - adapter.setType(newsEntity.getType()); - adapter.setTitle(newsEntity.getTitle()); - adapter.getNewsDetail(); - - title = newsEntity.getTitle(); - - iv_share.setVisibility(View.VISIBLE); - } else { - detail_rv_show.setVisibility(View.GONE); - reuse_ll_loading.setVisibility(View.GONE); - detail_ll_bottom.setVisibility(View.GONE); - detail_rv_show.setPadding(0, 0, 0, 0); - reuse_no_connection.setVisibility(View.VISIBLE); + public void onResponse(NewsEntity response) { + if (response.getType() != null) { + actionbar_tv_title.setText(response.getType()); } + + adapter.setId(newsId); + adapter.setType(response.getType()); + adapter.setTitle(response.getTitle()); + adapter.getNewsDetail(); + + title = response.getTitle(); + + iv_share.setVisibility(View.VISIBLE); } - }, new Response.ErrorListener() { + @Override - public void onErrorResponse(VolleyError error) { - // 无网络连接和访问超时 - if (error.getClass().equals(NoConnectionError.class) - || error.getClass().equals(TimeoutError.class)) { - detail_rv_show.setVisibility(View.GONE); - reuse_ll_loading.setVisibility(View.GONE); - detail_ll_bottom.setVisibility(View.GONE); - detail_rv_show.setPadding(0, 0, 0, 0); - reuse_no_connection.setVisibility(View.VISIBLE); - } + public void onFailure(Throwable e) { + detail_rv_show.setVisibility(View.GONE); + reuse_ll_loading.setVisibility(View.GONE); + detail_ll_bottom.setVisibility(View.GONE); + detail_rv_show.setPadding(0, 0, 0, 0); + reuse_no_connection.setVisibility(View.VISIBLE); } }); - AppController.addToRequestQueue(request); } private long[] mHits = new long[2]; @@ -335,23 +317,20 @@ public class NewsDetailActivity extends BaseDetailActivity implements OnClickLis detail_rv_show.setPadding(0, 0, 0, 0); return; } - JsonObjectExtendedRequest gameRequest = new JsonObjectExtendedRequest( - Config.HOST + "game/" + gameId + "/news_digest", - new Response.Listener() { + RetrofitManager.getApi().getGameNewsDigest(gameId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response() { @Override - public void onResponse(JSONObject response) { - if (response.length() != 0) { - Gson gson = new Gson(); - gameEntity = gson.fromJson(response.toString(), GameEntity.class); - adapter.setGameEntity(gameEntity); - adapter.notifyItemInserted(1); - downloadAddWord = gameEntity.getDownloadAddWord(); - downloadOffText = gameEntity.getDownloadOffText(); - initDownload(true); - } + public void onResponse(GameEntity response) { + gameEntity = response; + adapter.setGameEntity(gameEntity); + adapter.notifyItemInserted(1); + downloadAddWord = gameEntity.getDownloadAddWord(); + downloadOffText = gameEntity.getDownloadOffText(); + initDownload(true); } - }, null); - AppController.addToRequestQueue(gameRequest); + }); } // 关注事件 diff --git a/app/src/main/java/com/gh/gamecenter/NewsSearchActivity.java b/app/src/main/java/com/gh/gamecenter/NewsSearchActivity.java index e8e65b609c..72afc92891 100644 --- a/app/src/main/java/com/gh/gamecenter/NewsSearchActivity.java +++ b/app/src/main/java/com/gh/gamecenter/NewsSearchActivity.java @@ -3,7 +3,6 @@ package com.gh.gamecenter; import android.content.Context; import android.content.Intent; import android.graphics.Color; -import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.support.v7.widget.CardView; @@ -17,11 +16,7 @@ import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; -import com.android.volley.Response; -import com.android.volley.VolleyError; -import com.gh.base.AppController; import com.gh.base.BaseActivity; -import com.gh.common.constant.Config; import com.gh.common.util.DataUtils; import com.gh.common.util.DisplayUtils; import com.gh.common.util.MeasureHeightLayoutManager; @@ -30,18 +25,18 @@ import com.gh.common.view.VerticalItemDecoration; import com.gh.gamecenter.adapter.viewholder.FooterViewHolder; import com.gh.gamecenter.entity.NewsEntity; import com.gh.gamecenter.manager.DataCollectionManager; -import com.gh.gamecenter.volley.extended.JsonArrayExtendedRequest; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; +import com.gh.gamecenter.retrofit.Response; +import com.gh.gamecenter.retrofit.RetrofitManager; -import org.json.JSONArray; - -import java.lang.reflect.Type; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import rx.android.schedulers.AndroidSchedulers; +import rx.functions.Func1; +import rx.schedulers.Schedulers; + /** * Created by khy on 2016/8/22. * 新闻搜索界面 @@ -64,7 +59,6 @@ public class NewsSearchActivity extends BaseActivity { private boolean isRemove = false; private boolean isNetworkError = false; - private String gameName; private String searchKey; private String gameId; private String entrance; @@ -79,7 +73,7 @@ public class NewsSearchActivity extends BaseActivity { super.onCreate(savedInstanceState); Intent intent = getIntent(); - gameName = intent.getExtras().getString("gameName"); + String gameName = intent.getExtras().getString("gameName"); searchKey = intent.getExtras().getString("searchKey"); gameId = intent.getExtras().getString("gameId"); entrance = intent.getExtras().getString("entrance"); @@ -173,44 +167,39 @@ public class NewsSearchActivity extends BaseActivity { map.put("from", "游戏新闻搜索"); DataCollectionManager.onEvent(this, "search", map); - String url = Config.HOST + "search/news?game_id=" + gameId - + "&keyword=" + Uri.encode(searchKey) + "&page="+ page + "&limit=20"; - final JsonArrayExtendedRequest request = new JsonArrayExtendedRequest(url, - new Response.Listener() { + RetrofitManager.getApi().getSearchNews(gameId, searchKey, page, 20) + .map(new Func1, List>() { @Override - public void onResponse(JSONArray response) { - Type listType = new TypeToken>() {}.getType(); - Gson gson = new Gson(); - ArrayList newsList = gson.fromJson(response.toString(), listType); - - int listSize = newsList.size(); - - // 去除重复数据 - removeDuplicateData(newsList); - - if (!newsList.isEmpty()) { - newsEntities.addAll(newsList); - searchAdapter.notifyDataSetChanged(); - } + public List call(List list) { + // 去掉重复数据 + return NewsUtils.removeDuplicateData(newsEntities, list); + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response>() { + @Override + public void onResponse(List response) { isLoadOver = true; gamedetail_news_ll_loading.setVisibility(View.GONE); gamedetail_news_cardView.setVisibility(View.VISIBLE); - if (newsEntities.isEmpty()) { + reuse_none_data.setVisibility(View.GONE); + + if (response.size() != 0) { + newsEntities.addAll(response); + searchAdapter.notifyDataSetChanged(); + } else { gamedetail_news_cardView.setVisibility(View.GONE); reuse_none_data.setVisibility(View.VISIBLE); - } else { - gamedetail_news_cardView.setVisibility(View.VISIBLE); - reuse_none_data.setVisibility(View.GONE); - } - if (listSize == 0 || (page == 1 && listSize < 20)) { + isRemove = true; searchAdapter.notifyItemChanged(searchAdapter.getItemCount() - 1); } } - }, new Response.ErrorListener() { + @Override - public void onErrorResponse(VolleyError error) { - if (page ==1){ + public void onFailure(Throwable e) { + if (page == 1) { reuse_no_connection.setVisibility(View.VISIBLE); gamedetail_news_ll_loading.setVisibility(View.GONE); } @@ -220,24 +209,6 @@ public class NewsSearchActivity extends BaseActivity { searchAdapter.notifyItemChanged(searchAdapter.getItemCount() - 1); } }); - AppController.addToRequestQueue(request); - } - - private void removeDuplicateData(ArrayList newsList) { - if (newsEntities == null || newsEntities.isEmpty()) { - return; - } - String id; - for (int i = 0; i < newsList.size(); i++) { - id = newsList.get(i).getId(); - for (NewsEntity newsEntity : newsEntities) { - if (id.equals(newsEntity.getId())) { - newsList.remove(i); - i--; - break; - } - } - } } public class NewsSearchAdapter extends RecyclerView.Adapter{ diff --git a/app/src/main/java/com/gh/gamecenter/SettingActivity.java b/app/src/main/java/com/gh/gamecenter/SettingActivity.java index 2196a8f1ef..92f76f4089 100644 --- a/app/src/main/java/com/gh/gamecenter/SettingActivity.java +++ b/app/src/main/java/com/gh/gamecenter/SettingActivity.java @@ -20,9 +20,6 @@ import android.widget.RadioGroup; import android.widget.TextView; import android.widget.Toast; -import com.android.volley.Request; -import com.android.volley.Response; -import com.android.volley.VolleyError; import com.gh.base.AppController; import com.gh.base.BaseActivity; import com.gh.common.constant.Config; @@ -44,9 +41,8 @@ import com.gh.gamecenter.entity.GameUpdateEntity; import com.gh.gamecenter.eventbus.EBReuse; import com.gh.gamecenter.eventbus.EBSkip; import com.gh.gamecenter.manager.PackageManager; -import com.gh.gamecenter.volley.extended.JsonObjectExtendedRequest; -import com.gh.gamecenter.volley.extended.StringExtendedRequest; -import com.google.gson.Gson; +import com.gh.gamecenter.retrofit.Response; +import com.gh.gamecenter.retrofit.RetrofitManager; import com.kyleduo.switchbutton.SwitchButton; import org.json.JSONObject; @@ -56,6 +52,12 @@ import java.util.HashMap; import java.util.Map; import de.greenrobot.event.EventBus; +import okhttp3.MediaType; +import okhttp3.RequestBody; +import okhttp3.ResponseBody; +import retrofit2.adapter.rxjava.HttpException; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; /** * 游戏设置页面 @@ -388,66 +390,62 @@ public class SettingActivity extends BaseActivity implements OnClickListener { private void checkUpdate() { String TD_CHANNEL_ID = (String) PackageUtils.getMetaData(this, getPackageName(), "TD_CHANNEL_ID"); - String url = Config.HOST + "support/upgrade?version=" + PackageUtils.getVersion(getApplicationContext()) - + "&channel=" + TD_CHANNEL_ID; - JsonObjectExtendedRequest request = new JsonObjectExtendedRequest(url, - new Response.Listener() { + RetrofitManager.getApi().getUpdate(PackageUtils.getVersion(getApplicationContext()), TD_CHANNEL_ID) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response() { @Override - public void onResponse(JSONObject response) { - + public void onResponse(AppEntity response) { isChecking = false; if (loadingDialog != null) { loadingDialog.dismiss(); } - if (response.length() == 0) { - toast("您的光环助手已是最新版本"); + appEntity = response; + + float version = Float.valueOf(appEntity.getVersion()); + float currentVersion = Float.valueOf(PackageUtils.getVersion(getApplicationContext())); + + if (version > currentVersion) { + // 光环助手 有更新 + GameUpdateEntity game = new GameUpdateEntity(); + game.setName("光环助手V" + appEntity.getVersion()); + game.setPackageName(getPackageName()); + game.setSize(appEntity.getSize()); + game.setVersion(appEntity.getVersion()); + game.setUrl(appEntity.getUrl()); + game.setPlatform("官方版"); + game.setId("5618b86e8ab49e17088b4575"); + PackageManager.addUpdate(0, game); + + String updateMD5 = MD5Utils.getUpdateMD5( + appEntity.getUrl(), + appEntity.getContent()); + + showUpdateDialog(updateMD5); } else { - Gson gson = new Gson(); - appEntity = gson.fromJson(response.toString(), - AppEntity.class); - - float version = Float.valueOf(appEntity.getVersion()); - float currentVersion = Float.valueOf(PackageUtils.getVersion(getApplicationContext())); - - if (version > currentVersion) { - // 光环助手 有更新 - GameUpdateEntity game = new GameUpdateEntity(); - game.setName("光环助手V" + appEntity.getVersion()); - game.setPackageName(getPackageName()); - game.setSize(appEntity.getSize()); - game.setVersion(appEntity.getVersion()); - game.setUrl(appEntity.getUrl()); - game.setPlatform("官方版"); - game.setId("5618b86e8ab49e17088b4575"); - PackageManager.addUpdate(0, game); - - String updateMD5 = MD5Utils.getUpdateMD5( - appEntity.getUrl(), - appEntity.getContent()); - - showUpdateDialog(updateMD5); - } else { - toast("已是最新版本"); - } - + toast("已是最新版本"); } - } - }, new Response.ErrorListener() { + @Override - public void onErrorResponse(VolleyError error) { + public void onFailure(Throwable e) { isChecking = false; if (loadingDialog != null) { loadingDialog.dismiss(); } - Utils.log("error = " + error.toString()); + if (e instanceof HttpException) { + HttpException exception = (HttpException) e; + if (exception.code() == 304) { + toast("您的光环助手已是最新版本"); + return; + } + } toast("检查更新失败"); } }); - AppController.addToRequestQueue(request); } private void showUpdateDialog(final String md5) { @@ -568,17 +566,18 @@ public class SettingActivity extends BaseActivity implements OnClickListener { map.put("user", user); map.put("device_id", TokenUtils.getDeviceId(this)); map.put("channel", channel); - String url = Config.DATA_HOST + "api/v1d0/log"; Map params = new HashMap<>(); params.put("topic", "upgrade"); params.put("source", "GH-ASSIST-Client"); params.put("time", String.valueOf(Utils.getTime(this))); params.put("content", new JSONObject(map).toString()); - StringExtendedRequest request = new StringExtendedRequest(Request.Method.POST, url, null, null); - request.setParams(params); - request.setShouldCache(false); - AppController.addToRequestQueue(request); - Utils.log("提交更新数据" + new JSONObject(params).toString()); + + RequestBody body = RequestBody.create(MediaType.parse("application/json"), + new JSONObject(params).toString()); + RetrofitManager.getData().postLog(body) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response()); } @Override diff --git a/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java b/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java index c37992a4c7..cba1f88c57 100644 --- a/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java +++ b/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java @@ -19,8 +19,6 @@ import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; -import com.android.volley.Response; -import com.gh.base.AppController; import com.gh.base.BaseActivity; import com.gh.common.constant.Config; import com.gh.common.util.FileUtils; @@ -31,13 +29,14 @@ import com.gh.common.util.Utils; import com.gh.download.DownloadManager; import com.gh.download.DownloadService; import com.gh.gamecenter.db.info.FilterInfo; +import com.gh.gamecenter.entity.PlatformEntity; import com.gh.gamecenter.eventbus.EBReuse; import com.gh.gamecenter.manager.DataCollectionManager; import com.gh.gamecenter.manager.FilterManager; -import com.gh.gamecenter.volley.extended.JsonArrayExtendedRequest; -import com.gh.gamecenter.volley.extended.JsonObjectExtendedRequest; +import com.gh.gamecenter.retrofit.JSONObjectResponse; +import com.gh.gamecenter.retrofit.Response; +import com.gh.gamecenter.retrofit.RetrofitManager; -import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -54,6 +53,8 @@ import java.util.Locale; import java.util.Set; import de.greenrobot.event.EventBus; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; /** * 引导页面 @@ -278,9 +279,10 @@ public class SplashScreenActivity extends BaseActivity { * 获取界面设置 */ private void getUISetting() { - JsonObjectExtendedRequest request = new JsonObjectExtendedRequest( - Config.HOST + "support/setting/ui", - new Response.Listener() { + RetrofitManager.getApi().getUISetting() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new JSONObjectResponse() { @Override public void onResponse(JSONObject response) { if (response.length() != 0) { @@ -298,8 +300,7 @@ public class SplashScreenActivity extends BaseActivity { } } } - }, null); - AppController.addToRequestQueue(request); + }); } /* @@ -308,10 +309,10 @@ public class SplashScreenActivity extends BaseActivity { private void getDownloadStatus() { String TD_CHANNEL_ID = (String) PackageUtils.getMetaData(this, getPackageName(), "TD_CHANNEL_ID"); - JsonObjectExtendedRequest request = new JsonObjectExtendedRequest( - Config.HOST + "support/download_status?version=" + PackageUtils.getVersion(getApplicationContext()) - + "&channel=" + TD_CHANNEL_ID, - new Response.Listener() { + RetrofitManager.getApi().getDownloadStatus(PackageUtils.getVersion(getApplicationContext()), TD_CHANNEL_ID) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new JSONObjectResponse() { @Override public void onResponse(JSONObject response) { if (response.length() != 0) { @@ -331,8 +332,7 @@ public class SplashScreenActivity extends BaseActivity { } } } - }, null); - AppController.addToRequestQueue(request); + }); } /* @@ -359,34 +359,20 @@ public class SplashScreenActivity extends BaseActivity { } private void getPlatform() { - JsonArrayExtendedRequest request = new JsonArrayExtendedRequest( - Config.HOST + "support/setting/platform", - new Response.Listener() { + RetrofitManager.getApi().getGamePlatform() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response>(){ @Override - public void onResponse(JSONArray response) { - try { - Set pset = new HashSet<>(); - for (int i = 0; i < response.length(); i++) { - JSONObject jsonObject = response - .getJSONObject(i); - String code = jsonObject.getString("code"); - String name = jsonObject.getString("name"); - String pic = jsonObject.getString("pic"); - String color = jsonObject.getString("color"); - pset.add(code + "=" + name + "=" + pic + "=" - + color); - } - SharedPreferences sharedPreferences = getSharedPreferences( - "gh_platform", Context.MODE_PRIVATE); - Editor editor = sharedPreferences.edit(); - editor.putStringSet("platform", pset); - editor.apply(); - } catch (JSONException e) { - e.printStackTrace(); + public void onResponse(List response) { + Set platformSet = new HashSet<>(); + for (PlatformEntity platformEntity : response) { + platformSet.add(platformEntity.toString()); } + SharedPreferences sharedPreferences = getSharedPreferences("gh_platform", Context.MODE_PRIVATE); + sharedPreferences.edit().putStringSet("platform", platformSet).apply(); } - }, null); - AppController.addToRequestQueue(request); + }); } // 跳转到主界面 diff --git a/app/src/main/java/com/gh/gamecenter/SuggestionActivity.java b/app/src/main/java/com/gh/gamecenter/SuggestionActivity.java index fd994a2a8f..a2cf2a3c59 100644 --- a/app/src/main/java/com/gh/gamecenter/SuggestionActivity.java +++ b/app/src/main/java/com/gh/gamecenter/SuggestionActivity.java @@ -15,15 +15,11 @@ import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import android.widget.TextView; -import com.android.volley.Request.Method; -import com.android.volley.Response; -import com.android.volley.VolleyError; -import com.android.volley.toolbox.JsonObjectRequest; -import com.gh.base.AppController; import com.gh.base.BaseActivity; -import com.gh.common.constant.Config; import com.gh.common.util.DialogUtils; import com.gh.common.util.PackageUtils; +import com.gh.gamecenter.retrofit.JSONObjectResponse; +import com.gh.gamecenter.retrofit.RetrofitManager; import org.json.JSONException; import org.json.JSONObject; @@ -33,6 +29,11 @@ import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; +import okhttp3.MediaType; +import okhttp3.RequestBody; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + /** * @author fang * @from SettingActivity @@ -185,18 +186,22 @@ public class SuggestionActivity extends BaseActivity implements OnClickListener } private void sendSuggestion(final Dialog dialog, String email) { - Map map = new HashMap<>(); - map.put("message", et_suggest_content.getText().toString().trim()); - map.put("from", email); - map.put("ghversion", PackageUtils.getVersion(this)); - map.put("channel", (String) PackageUtils.getMetaData(this, getPackageName(), "TD_CHANNEL_ID")); - map.put("type", android.os.Build.MODEL); - map.put("sdk", String.valueOf(android.os.Build.VERSION.SDK_INT)); - map.put("version", android.os.Build.VERSION.RELEASE); - map.put("imei", ((TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId()); - JsonObjectRequest request = new JsonObjectRequest(Method.POST, - Config.HOST + "support/suggestion", new JSONObject(map), - new Response.Listener() { + Map params = new HashMap<>(); + params.put("message", et_suggest_content.getText().toString().trim()); + params.put("from", email); + params.put("ghversion", PackageUtils.getVersion(this)); + params.put("channel", (String) PackageUtils.getMetaData(this, getPackageName(), "TD_CHANNEL_ID")); + params.put("type", android.os.Build.MODEL); + params.put("sdk", String.valueOf(android.os.Build.VERSION.SDK_INT)); + params.put("version", android.os.Build.VERSION.RELEASE); + params.put("imei", ((TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId()); + + RequestBody body = RequestBody.create(MediaType.parse("application/json"), + new JSONObject(params).toString()); + RetrofitManager.getApi().postSuggestion(body) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new JSONObjectResponse() { @Override public void onResponse(JSONObject response) { isShowing = false; @@ -216,18 +221,16 @@ public class SuggestionActivity extends BaseActivity implements OnClickListener } else { toast("提交失败,请稍后尝试!"); } - } - }, new Response.ErrorListener() { + @Override - public void onErrorResponse(VolleyError error) { + public void onFailure(Throwable e) { isShowing = false; dialog.dismiss(); + toast("提交失败,请检查网络状态"); } }); - request.setShouldCache(false); - AppController.addToRequestQueue(request); } private boolean isEmailAddress(String email) { diff --git a/app/src/main/java/com/gh/gamecenter/adapter/ConcernAdapter.java b/app/src/main/java/com/gh/gamecenter/adapter/ConcernAdapter.java index f253df411b..e992764d32 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/ConcernAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/ConcernAdapter.java @@ -7,10 +7,6 @@ import android.view.View; import android.view.ViewGroup; import android.widget.Toast; -import com.android.volley.Response; -import com.android.volley.VolleyError; -import com.gh.base.AppController; -import com.gh.common.constant.Config; import com.gh.common.util.DataUtils; import com.gh.common.util.DialogUtils; import com.gh.common.util.GameUtils; @@ -22,18 +18,20 @@ import com.gh.gamecenter.entity.GameEntity; import com.gh.gamecenter.listener.OnCallBackListener; import com.gh.gamecenter.manager.ConcernManager; import com.gh.gamecenter.manager.DataCollectionManager; -import com.gh.gamecenter.volley.extended.JsonObjectExtendedRequest; -import com.google.gson.Gson; - -import org.json.JSONObject; +import com.gh.gamecenter.retrofit.Response; +import com.gh.gamecenter.retrofit.RetrofitManager; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + /** * Created by LGT on 2016/9/20. + * */ public class ConcernAdapter extends RecyclerView.Adapter { @@ -66,42 +64,36 @@ public class ConcernAdapter extends RecyclerView.Adapter { } private void initConcernGame() { - final List result = new ArrayList<>(); + final List result = new ArrayList<>(); final int count = concernList.size(); cCount = 0; for (int i = 0; i < count; i++) { - JsonObjectExtendedRequest concernObjectRequest = new JsonObjectExtendedRequest( - Config.HOST + "game/" + concernList.get(i).getId() + "/digest", - new Response.Listener() { + RetrofitManager.getApi().getGameDigest(concernList.get(i).getId()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response() { @Override - public void onResponse(JSONObject response) { - if (response.length() != 0) { - result.add(response); - } + public void onResponse(GameEntity response) { + result.add(response); + addConcernCount(); if (cCount == count) { processingConcernGame(result); } } - }, new Response.ErrorListener() { + @Override - public void onErrorResponse(VolleyError error) { + public void onFailure(Throwable e) { addConcernCount(); if (cCount == count) { processingConcernGame(result); } } }); - AppController.addToRequestQueue(concernObjectRequest); } } - private void processingConcernGame(List data) { - List gameList = new ArrayList<>(); - Gson gson = new Gson(); - for (int i = 0; i < data.size(); i++) { - gameList.add(gson.fromJson(data.get(i).toString(), GameEntity.class)); - } + private void processingConcernGame(List gameList) { concernGameList = new ArrayList<>(); for (int i = 0, sizei = concernList.size(); i < sizei; i++) { for (int j = 0, sizej = gameList.size(); j < sizej; j++) { diff --git a/app/src/main/java/com/gh/gamecenter/adapter/ConcernRecommendAdapter.java b/app/src/main/java/com/gh/gamecenter/adapter/ConcernRecommendAdapter.java index d198262cc5..fb9a5aafe9 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/ConcernRecommendAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/ConcernRecommendAdapter.java @@ -7,10 +7,6 @@ import android.view.View; import android.view.ViewGroup; import android.widget.Toast; -import com.android.volley.Response; -import com.android.volley.VolleyError; -import com.gh.base.AppController; -import com.gh.common.constant.Config; import com.gh.common.util.DataUtils; import com.gh.common.util.GameUtils; import com.gh.gamecenter.ConcernActivity; @@ -21,22 +17,20 @@ import com.gh.gamecenter.entity.GameEntity; import com.gh.gamecenter.listener.OnCallBackListener; import com.gh.gamecenter.manager.ConcernManager; import com.gh.gamecenter.manager.DataCollectionManager; -import com.gh.gamecenter.volley.extended.JsonArrayExtendedRequest; -import com.gh.gamecenter.volley.extended.JsonObjectExtendedRequest; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; +import com.gh.gamecenter.retrofit.Response; +import com.gh.gamecenter.retrofit.RetrofitManager; -import org.json.JSONArray; -import org.json.JSONObject; - -import java.lang.reflect.Type; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + /** * Created by LGT on 2016/9/20. + * */ public class ConcernRecommendAdapter extends RecyclerView.Adapter { @@ -72,46 +66,41 @@ public class ConcernRecommendAdapter extends RecyclerView.Adapter() { + RetrofitManager.getApi().getGameDigest(concernInfo.getId()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response() { @Override - public void onResponse(JSONObject response) { - if (response.length() != 0) { - Gson gson = new Gson(); - GameEntity gameEntity = gson.fromJson(response.toString(), GameEntity.class); - if (gameEntity.isNewsExists()) { - gameList.add(gameEntity); - } + public void onResponse(GameEntity response) { + if (response.isNewsExists()) { + gameList.add(response); } + addCount(); if (count == size) { initRecommendGame(); } } - }, new Response.ErrorListener() { + @Override - public void onErrorResponse(VolleyError error) { + public void onFailure(Throwable e) { addCount(); if (count == size) { initRecommendGame(); } } }); - AppController.addToRequestQueue(request); } } private void initRecommendGame() { - JsonArrayExtendedRequest recommendRequest = new JsonArrayExtendedRequest( - Config.HOST + "game/remenkapai", - new Response.Listener() { + RetrofitManager.getApi().getRemenkapai() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response>() { @Override - public void onResponse(JSONArray response) { - Type listType = new TypeToken>() {}.getType(); - Gson gson = new Gson(); - ArrayList list = gson.fromJson(response.toString(), listType); - for (GameEntity gameEntity : list) { + public void onResponse(List response) { + for (GameEntity gameEntity : response) { for (int i = 0, size = gameList.size(); i < size; i++) { if (gameEntity.getId().equals(gameList.get(i).getId())) { break; @@ -133,8 +122,7 @@ public class ConcernRecommendAdapter extends RecyclerView.Adapter> observable; if ("全部".equals(newsType)) { - url = Config.HOST + "game/" + gameId + "/news?limit=20&offset=" + offset; + observable = RetrofitManager.getApi().getGameNews(gameId, 20, offset); } else { - url = Config.HOST + "game/" + gameId + "/news?limit=20&offset=" - + offset + "&type=" + Uri.encode(newsType); + observable = RetrofitManager.getApi().getGameNews(gameId, 20, offset, newsType); } - - JsonArrayExtendedRequest request = new JsonArrayExtendedRequest(url, - new Response.Listener() { + observable.subscribeOn(Schedulers.io()) + .map(new Func1, List>() { @Override - public void onResponse(JSONArray response) { - Type listType = new TypeToken>() {}.getType(); - Gson gson = new Gson(); - List list = gson.fromJson(response.toString(), listType); + public List call(List list) { + // 去除重复数据 + return NewsUtils.removeDuplicateData(newsList, list); + } + }) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response>() { + @Override + public void onResponse(List response) { if (offset == 0){ newsList.clear(); } - int listSize = list.size(); - - // 去除重复数据 - removeDuplicateData(list); - - if (!list.isEmpty()) { - newsList.addAll(list); - notifyItemRangeInserted(newsList.size() - list.size() + 2, list.size()); - notifyItemChanged(getItemCount() - list.size() - 2); + if (response.size() != 0) { + newsList.addAll(response); + notifyItemRangeInserted(newsList.size() - response.size() + 2, response.size()); + notifyItemChanged(getItemCount() - response.size() - 2); + } else { + isRemove = true; + notifyItemChanged(getItemCount() - 1); } if (offset == 0) { game_news_list.scrollToPosition(1); } - if (listSize == 0 || (offset == 0 && listSize < 20)) { - isRemove = true; - notifyItemChanged(getItemCount() - 1); - } - isLoading = false; } - }, new Response.ErrorListener() { + @Override - public void onErrorResponse(VolleyError error) { + public void onFailure(Throwable e) { isLoading = false; isNetworkError = true; } }); - AppController.addToRequestQueue(request); - } - - private void removeDuplicateData(List list) { - if (newsList == null || newsList.isEmpty()) { - return; - } - String id; - for (int i = 0; i < list.size(); i++) { - id = list.get(i).getId(); - for (NewsEntity newsEntity : newsList) { - if (id.equals(newsEntity.getId())) { - list.remove(i); - i--; - break; - } - } - } } @Override diff --git a/app/src/main/java/com/gh/gamecenter/adapter/ImagePagerAdapter.java b/app/src/main/java/com/gh/gamecenter/adapter/ImagePagerAdapter.java index 5840cfa29b..36a6d90563 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/ImagePagerAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/ImagePagerAdapter.java @@ -10,10 +10,7 @@ import android.content.Intent; import android.view.View; import android.view.ViewGroup; -import com.android.volley.Request; import com.facebook.drawee.view.SimpleDraweeView; -import com.gh.base.AppController; -import com.gh.common.constant.Config; import com.gh.common.util.DataUtils; import com.gh.common.util.DeviceUtils; import com.gh.common.util.GameUtils; @@ -26,7 +23,8 @@ import com.gh.gamecenter.NewsDetailActivity; import com.gh.gamecenter.R; import com.gh.gamecenter.SubjectActivity; import com.gh.gamecenter.entity.SlideEntity; -import com.gh.gamecenter.volley.extended.StringExtendedRequest; +import com.gh.gamecenter.retrofit.Response; +import com.gh.gamecenter.retrofit.RetrofitManager; import org.json.JSONObject; @@ -34,6 +32,12 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import okhttp3.MediaType; +import okhttp3.RequestBody; +import okhttp3.ResponseBody; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + /** * ImagePagerAdapter * @@ -151,16 +155,18 @@ public class ImagePagerAdapter extends RecyclingPagerAdapter { map.put("user", user); map.put("device_id", TokenUtils.getDeviceId(context)); map.put("channel", channel); - String url = Config.DATA_HOST + "api/v1d0/log"; Map params = new HashMap<>(); params.put("topic", "lunbotu"); params.put("source", "GH-ASSIST-Client"); params.put("time", String.valueOf(Utils.getTime(context))); params.put("content", new JSONObject(map).toString()); - StringExtendedRequest request = new StringExtendedRequest(Request.Method.POST, url, null, null); - request.setParams(params); - request.setShouldCache(false); - AppController.addToRequestQueue(request); + + RequestBody body = RequestBody.create(MediaType.parse("application/json"), + new JSONObject(params).toString()); + RetrofitManager.getData().postLog(body) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response()); } /** diff --git a/app/src/main/java/com/gh/gamecenter/adapter/MessageDetailAdapter.java b/app/src/main/java/com/gh/gamecenter/adapter/MessageDetailAdapter.java index b7a07174ad..7c8660a6d5 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/MessageDetailAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/MessageDetailAdapter.java @@ -12,16 +12,10 @@ import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; -import com.android.volley.Request; -import com.android.volley.Response; -import com.android.volley.VolleyError; -import com.android.volley.toolbox.DiskBasedCache; -import com.gh.base.AppController; import com.gh.common.constant.Config; import com.gh.common.util.ConcernContentUtils; import com.gh.common.util.DataUtils; import com.gh.common.util.DisplayUtils; -import com.gh.common.util.GzipUtils; import com.gh.common.util.NewsUtils; import com.gh.common.util.PostCommentUtils; import com.gh.common.util.TimestampUtils; @@ -44,17 +38,15 @@ import com.gh.gamecenter.entity.CommentEntity; import com.gh.gamecenter.entity.ConcernEntity; import com.gh.gamecenter.manager.DataCollectionManager; import com.gh.gamecenter.manager.VisitManager; -import com.gh.gamecenter.volley.extended.JsonArrayExtendedRequest; -import com.gh.gamecenter.volley.extended.JsonObjectExtendedRequest; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; +import com.gh.gamecenter.retrofit.JSONObjectResponse; +import com.gh.gamecenter.retrofit.OkHttpCache; +import com.gh.gamecenter.retrofit.Response; +import com.gh.gamecenter.retrofit.RetrofitManager; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; -import java.io.File; -import java.lang.reflect.Type; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -66,6 +58,10 @@ import java.util.Map; import java.util.Timer; import java.util.TimerTask; +import retrofit2.adapter.rxjava.HttpException; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + /** * Created by khy on 2016/11/8. * 消息详情-数据适配器 @@ -136,71 +132,59 @@ public class MessageDetailAdapter extends RecyclerView.Adapter() { + RetrofitManager.getComment().getHotComment(mConcernEntity.getId(), 10, offset) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response>() { @Override - public void onResponse(JSONArray response) { - Type listType = new TypeToken>() {}.getType(); - Gson gson = new Gson(); - List list = gson.fromJson(response.toString(), listType); - - if (list.size() != 0) { + public void onResponse(List response) { + if (response.size() != 0) { mHotCommentList.clear(); - mHotCommentList.addAll(list); + mHotCommentList.addAll(response); notifyDataSetChanged(); } addNormalComment(mNormalCommentList.size()); // 考虑到断网刷新问题 } - }, new Response.ErrorListener() { + @Override - public void onErrorResponse(VolleyError error) { + public void onFailure(Throwable e) { addNormalComment(mNormalCommentList.size()); } }); - - AppController.addToRequestQueue(request); } public void addNormalComment(int offset) { - + if (isLoading) { + return; + } isLoading = true; - String commentUrl = Config.COMMENT_HOST + "article/" + mConcernEntity.getId() + - "/comment?limit=10&offset=" + offset; - - JsonArrayExtendedRequest request = new JsonArrayExtendedRequest(commentUrl, - new Response.Listener() { + RetrofitManager.getComment().getComment(mConcernEntity.getId(), 10, offset) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response>() { @Override - public void onResponse(JSONArray response) { - isLoading = false; - - Type listType = new TypeToken>() {}.getType(); - Gson gson = new Gson(); - List list = gson.fromJson(response.toString(), listType); - - if (list.size() < 10) { + public void onResponse(List response) { + if (response.size() < 10) { isOver = true; } - if (list.size() != 0) { - mNormalCommentList.addAll(list); + if (response.size() != 0) { + mNormalCommentList.addAll(response); } notifyDataSetChanged(); + + isLoading = false; } - }, new Response.ErrorListener() { + @Override - public void onErrorResponse(VolleyError error) { + public void onFailure(Throwable e) { isLoading = false; isNetworkError = true; notifyDataSetChanged(); } }); - - AppController.addToRequestQueue(request); } @@ -603,8 +587,7 @@ public class MessageDetailAdapter extends RecyclerView.Adapter { private Context context; @@ -91,68 +78,58 @@ public class SubjectAdapter extends RecyclerView.Adapter response) { + GameManager manager = new GameManager(context); + if (response.size() != 0) { + for (GameEntity entity : response) { + // 黄壮华 初始化游戏状态 修改2015/8/15 + entity.setEntryMap(DownloadManager.getInstance(context).getEntryMap(entity.getName())); + manager.addOrUpdate(entity.getApk(), entity.getId(), entity.getName()); } + subjectList.addAll(response); + notifyItemRangeInserted(subjectList.size() - response.size(), response.size()); + } else { + isRemove = true; + notifyDataSetChanged(); + } + initLocationMap(); + + if (listener != null) { + listener.loadDone(); + } + + isLoaded = true; + } + + @Override + public void onFailure(Throwable e) { + if (page == 1){ + if (listener != null) { + listener.loadError(); + } + }else { + Toast.makeText(context, "加载失败,请检查网络状态", Toast.LENGTH_SHORT).show(); + isNetworkError = true; + notifyDataSetChanged(); } } }); - AppController.addToRequestQueue(request); - } - - private void processingData(JSONArray response, int page) { - Type listType = new TypeToken>() {}.getType(); - Gson gson = new Gson(); - GameManager manager = new GameManager(context); - List gameList = gson.fromJson(response.toString(), listType); - - int listSize = gameList.size(); - - // 去除重复数据 - removeDuplicateData(gameList); - - if (!gameList.isEmpty()) { - for (GameEntity entity : gameList) { - // 黄壮华 初始化游戏状态 修改2015/8/15 - entity.setEntryMap(DownloadManager.getInstance(context).getEntryMap(entity.getName())); - manager.addOrUpdate(entity.getApk(), entity.getId(), entity.getName()); - } - subjectList.addAll(gameList); - notifyItemRangeInserted(subjectList.size() - gameList.size(), gameList.size()); - } - - initLocationMap(); - - if (listener != null) { - listener.loadDone(); - } - - if (listSize == 0 || (page == 1 && listSize < 20)) { - isRemove = true; - notifyDataSetChanged(); - } - isLoaded = true; } private void initLocationMap() { @@ -173,21 +150,23 @@ public class SubjectAdapter extends RecyclerView.Adapter gameList) { - if (subjectList == null || subjectList.isEmpty()) { - return; + private List removeDuplicateData(List sourceList, List rawList) { + if (sourceList == null || sourceList.isEmpty() + || rawList == null || rawList.isEmpty()) { + return rawList; } String id; - for (int i = 0; i < gameList.size(); i++) { - id = gameList.get(i).getId(); - for (GameEntity gameEntity : subjectList) { + for (int i = 0; i < rawList.size(); i++) { + id = rawList.get(i).getId(); + for (GameEntity gameEntity : sourceList) { if (id.equals(gameEntity.getId())) { - gameList.remove(i); + rawList.remove(i); i--; break; } } } + return rawList; } @Override diff --git a/app/src/main/java/com/gh/gamecenter/download/GameUpdateFragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/download/GameUpdateFragmentAdapter.java index 398a08b324..a53e1a8371 100644 --- a/app/src/main/java/com/gh/gamecenter/download/GameUpdateFragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/download/GameUpdateFragmentAdapter.java @@ -10,10 +10,6 @@ import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; -import com.android.volley.Response; -import com.android.volley.VolleyError; -import com.gh.base.AppController; -import com.gh.common.constant.Config; import com.gh.common.util.DataUtils; import com.gh.common.util.DialogUtils; import com.gh.common.util.DisplayUtils; @@ -35,10 +31,8 @@ import com.gh.gamecenter.eventbus.EBSkip; import com.gh.gamecenter.manager.ConcernManager; import com.gh.gamecenter.manager.DataCollectionManager; import com.gh.gamecenter.manager.PackageManager; -import com.gh.gamecenter.volley.extended.JsonObjectExtendedRequest; -import com.google.gson.Gson; - -import org.json.JSONObject; +import com.gh.gamecenter.retrofit.Response; +import com.gh.gamecenter.retrofit.RetrofitManager; import java.util.ArrayList; import java.util.Collections; @@ -48,9 +42,13 @@ import java.util.List; import java.util.Map; import de.greenrobot.event.EventBus; +import rx.Observable; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; /** * Created by LGT on 2016/8/16. + * */ public class GameUpdateFragmentAdapter extends RecyclerView.Adapter { @@ -117,45 +115,40 @@ public class GameUpdateFragmentAdapter extends RecyclerView.Adapter observable; if (gh_id == null) { - url = Config.HOST + "update/package/" + packageName; + observable = RetrofitManager.getApi().getGameUpdate(packageName); } else { - url = Config.HOST + "update/game/" + gh_id + "/package/" + packageName; + observable = RetrofitManager.getApi().getGameUpdate((String) gh_id, packageName); } - JsonObjectExtendedRequest request = new JsonObjectExtendedRequest(url, - new Response.Listener() { + observable.subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response() { @Override - public void onResponse(JSONObject response) { - if (response.length() != 0) { - Gson gson = new Gson(); - GameUpdateEntity gameUpdateEntity = gson.fromJson( - response.toString(), GameUpdateEntity.class); - - if (PackageUtils.isCanUpdate(context, gameUpdateEntity)) { - updateList.add(gameUpdateEntity); - notifyItemRangeInserted(0, 2); - PackageManager.addUpdate(gameUpdateEntity); - EventBus.getDefault().post(new EBDownloadChanged("update", - View.VISIBLE, updateList.size())); - initLocationMap(); - } - - if (updateList.isEmpty()) { - gameupdate_tv_none.setVisibility(View.VISIBLE); - } else { - gameupdate_tv_none.setVisibility(View.GONE); - } + public void onResponse(GameUpdateEntity response) { + if (PackageUtils.isCanUpdate(context, response)) { + updateList.add(response); + notifyItemRangeInserted(0, 2); + PackageManager.addUpdate(response); + EventBus.getDefault().post(new EBDownloadChanged("update", + View.VISIBLE, updateList.size())); + initLocationMap(); } + + if (updateList.isEmpty()) { + gameupdate_tv_none.setVisibility(View.VISIBLE); + } else { + gameupdate_tv_none.setVisibility(View.GONE); + } + gameupdate_ll_loading.setVisibility(View.GONE); } - }, new Response.ErrorListener() { + @Override - public void onErrorResponse(VolleyError error) { + public void onFailure(Throwable e) { gameupdate_ll_loading.setVisibility(View.GONE); } }); - AppController.addToRequestQueue(request); } private int mCount; @@ -177,39 +170,35 @@ public class GameUpdateFragmentAdapter extends RecyclerView.Adapter observable; if (gh_id == null) { - url = Config.HOST + "update/package/" + packageName; + observable = RetrofitManager.getApi().getGameUpdate(packageName); } else { - url = Config.HOST + "update/game/" + gh_id + "/package/" + packageName; + observable = RetrofitManager.getApi().getGameUpdate((String) gh_id, packageName); } - JsonObjectExtendedRequest request = new JsonObjectExtendedRequest(url, - new Response.Listener() { + observable.subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response() { @Override - public void onResponse(JSONObject response) { - if (response.length() != 0) { - Gson gson = new Gson(); - GameUpdateEntity gameUpdateEntity = gson.fromJson( - response.toString(), GameUpdateEntity.class); - if (PackageUtils.isCanUpdate(context, gameUpdateEntity)) { - PackageManager.addUpdate(gameUpdateEntity); - } + public void onResponse(GameUpdateEntity response) { + if (PackageUtils.isCanUpdate(context, response)) { + PackageManager.addUpdate(response); } + addCount(); if (mCount == count) { processingData(); } } - }, new Response.ErrorListener() { + @Override - public void onErrorResponse(VolleyError error) { + public void onFailure(Throwable e) { addCount(); if (mCount == count) { processingData(); } } }); - AppController.addToRequestQueue(request); } } else { gameupdate_ll_loading.setVisibility(View.GONE); diff --git a/app/src/main/java/com/gh/gamecenter/entity/GameDetailEntity.java b/app/src/main/java/com/gh/gamecenter/entity/GameDetailEntity.java index a91725b94a..22e5c0edca 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/GameDetailEntity.java +++ b/app/src/main/java/com/gh/gamecenter/entity/GameDetailEntity.java @@ -3,13 +3,14 @@ package com.gh.gamecenter.entity; import com.google.gson.annotations.SerializedName; import java.util.ArrayList; +import java.util.List; public class GameDetailEntity { - private ArrayList serverInfo; + private List serverInfo; private ArrayList tag; private String remind; - private ArrayList news; + private List news; private ArrayList gallery; private String des; @SerializedName("d_button_add_word") @@ -47,11 +48,11 @@ public class GameDetailEntity { this.articleTypes = articleTypes; } - public ArrayList getServerInfo() { + public List getServerInfo() { return serverInfo; } - public void setServerInfo(ArrayList serverInfo) { + public void setServerInfo(List serverInfo) { this.serverInfo = serverInfo; } @@ -71,11 +72,11 @@ public class GameDetailEntity { this.remind = remind; } - public ArrayList getNews() { + public List getNews() { return news; } - public void setNews(ArrayList news) { + public void setNews(List news) { this.news = news; } diff --git a/app/src/main/java/com/gh/gamecenter/entity/PlatformEntity.java b/app/src/main/java/com/gh/gamecenter/entity/PlatformEntity.java new file mode 100644 index 0000000000..2159c0a61c --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/entity/PlatformEntity.java @@ -0,0 +1,52 @@ +package com.gh.gamecenter.entity; + +/** + * Created by LGT on 2016/12/5. + */ +public class PlatformEntity { + + private String code; + + private String name; + + private String pic; + + private String color; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } + + @Override + public String toString() { + return code + "=" + name + "=" + pic + "=" + color; + } +} diff --git a/app/src/main/java/com/gh/gamecenter/game/Game1FragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/game/Game1FragmentAdapter.java index 80164b8408..78a0ee980f 100644 --- a/app/src/main/java/com/gh/gamecenter/game/Game1FragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/game/Game1FragmentAdapter.java @@ -16,12 +16,6 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.Toast; -import com.android.volley.NoConnectionError; -import com.android.volley.Response; -import com.android.volley.TimeoutError; -import com.android.volley.VolleyError; -import com.gh.base.AppController; -import com.gh.common.constant.Config; import com.gh.common.constant.ItemViewType; import com.gh.common.util.DataUtils; import com.gh.common.util.DisplayUtils; @@ -53,13 +47,9 @@ import com.gh.gamecenter.listener.OnCallBackListener; import com.gh.gamecenter.manager.DataCollectionManager; import com.gh.gamecenter.manager.GameManager; import com.gh.gamecenter.manager.PackageManager; -import com.gh.gamecenter.volley.extended.JsonArrayExtendedRequest; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; +import com.gh.gamecenter.retrofit.Response; +import com.gh.gamecenter.retrofit.RetrofitManager; -import org.json.JSONArray; - -import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; @@ -67,6 +57,10 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import rx.android.schedulers.AndroidSchedulers; +import rx.functions.Func1; +import rx.schedulers.Schedulers; + /** * Created by LGT on 2016/7/1. * 游戏-插件-数据适配器 @@ -147,119 +141,112 @@ public class Game1FragmentAdapter extends RecyclerView.Adapter() { + RetrofitManager.getApi().getSlide() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response>() { @Override - public void onResponse(JSONArray response) { - Type listType = new TypeToken>() {}.getType(); - Gson gson = new Gson(); - slideList = gson.fromJson(response.toString(), listType); - if (slideList != null && !slideList.isEmpty()) { + public void onResponse(List response) { + slideList = response; + if (slideList.size() != 0) { notifyItemChanged(0); } if (isFirst) { initSubjectList(); } } - }, new Response.ErrorListener() { + @Override - public void onErrorResponse(VolleyError error) { - // 无网络连接 - if (error.getClass().equals(NoConnectionError.class) - || error.getClass().equals(TimeoutError.class)) { - isSlideError = true; - showView(); - } + public void onFailure(Throwable e) { + isSlideError = true; + showView(); if (isFirst) { initSubjectList(); } } }); - AppController.addToRequestQueue(slideRequest); } private void initSubjectList() { - JsonArrayExtendedRequest request = new JsonArrayExtendedRequest( - Config.HOST + "game/chajian", - new Response.Listener() { + RetrofitManager.getApi().getChajian() + .map(new Func1, List>() { @Override - public void onResponse(JSONArray response) { - Type listType = new TypeToken>() {}.getType(); - Gson gson = new Gson(); - List list = gson.fromJson(response.toString(), listType); - if (list != null && !list.isEmpty()) { - GameManager manager = new GameManager(context); - SubjectEntity subjectEntity; - GameEntity gameEntity; - for (int j = 0; j < list.size(); j++) { - subjectEntity = list.get(j); - if (subjectEntity.getData().size() == 1 - && !TextUtils.isEmpty(subjectEntity.getData().get(0).getImage())){ - list.remove(j); - j--; - continue; - } - for (int i = 0; i < subjectEntity.getData().size(); i++) { - gameEntity = subjectEntity.getData().get(i); - if (gameEntity.getApk() != null && !gameEntity.getApk().isEmpty()) { - gameEntity.setEntryMap(DownloadManager.getInstance(context).getEntryMap(gameEntity.getName())); - manager.addOrUpdate(gameEntity.getApk(), gameEntity.getId(), gameEntity.getName()); - } else if (TextUtils.isEmpty(gameEntity.getId())) { - if (TextUtils.isEmpty(gameEntity.getType()) - || TextUtils.isEmpty(gameEntity.getLink()) - || TextUtils.isEmpty(gameEntity.getName()) - || TextUtils.isEmpty(gameEntity.getImage())) { - subjectEntity.getData().remove(i); - i--; - } - } - } + public List call(List list) { + GameManager manager = new GameManager(context); + SubjectEntity subjectEntity; + GameEntity gameEntity; + for (int j = 0; j < list.size(); j++) { + subjectEntity = list.get(j); + if (subjectEntity.getData().size() == 1 + && !TextUtils.isEmpty(subjectEntity.getData().get(0).getImage())){ + list.remove(j); + j--; + continue; } - - if (list.size() != 0) { - if (!fragment.isHidden() && !fragment.isEverpause()) { - if (pluginList.isEmpty()) { - subjectList = list; - initItemCount(); - notifyItemRangeInserted(1, getItemCount() - 2); - } else { - int start = 2 + pluginList.size(); - subjectList = list; - initItemCount(); - notifyItemRangeInserted(start, getItemCount() - start - 1); + for (int i = 0; i < subjectEntity.getData().size(); i++) { + gameEntity = subjectEntity.getData().get(i); + if (gameEntity.getApk() != null && !gameEntity.getApk().isEmpty()) { + gameEntity.setEntryMap(DownloadManager.getInstance(context).getEntryMap(gameEntity.getName())); + manager.addOrUpdate(gameEntity.getApk(), gameEntity.getId(), gameEntity.getName()); + } else if (TextUtils.isEmpty(gameEntity.getId())) { + if (TextUtils.isEmpty(gameEntity.getType()) + || TextUtils.isEmpty(gameEntity.getLink()) + || TextUtils.isEmpty(gameEntity.getName()) + || TextUtils.isEmpty(gameEntity.getImage())) { + subjectEntity.getData().remove(i); + i--; } - } else { - subjectList = list; - initItemCount(); - notifyDataSetChanged(); } - initLocationMap(); } } + return list; + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response>() { + @Override + public void onResponse(List response) { + if (response.size() != 0) { + if (!fragment.isHidden() && !fragment.isEverpause()) { + if (pluginList.isEmpty()) { + subjectList = response; + initItemCount(); + notifyItemRangeInserted(1, getItemCount() - 2); + } else { + int start = 2 + pluginList.size(); + subjectList = response; + initItemCount(); + notifyItemRangeInserted(start, getItemCount() - start - 1); + } + } else { + subjectList = response; + initItemCount(); + notifyDataSetChanged(); + } + initLocationMap(); + } - - listener.loadDone(); + if (listener != null) { + listener.loadDone(); + } isOver = true; notifyItemChanged(getItemCount() - 1); initPlugin(); } - }, new Response.ErrorListener() { + @Override - public void onErrorResponse(VolleyError error) { - // 无网络连接和访问超时 - if (error.getClass().equals(NoConnectionError.class) - || error.getClass().equals(TimeoutError.class)) { + public void onFailure(Throwable e) { + if (listener != null) { listener.loadDone(); - isListError = true; - isNetworkError = true; - showView(); } + isListError = true; + isNetworkError = true; + showView(); } }); - AppController.addToRequestQueue(request); } public void initPlugin() { diff --git a/app/src/main/java/com/gh/gamecenter/game/Game2FragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/game/Game2FragmentAdapter.java index 0c42dde804..22eeb0c80d 100644 --- a/app/src/main/java/com/gh/gamecenter/game/Game2FragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/game/Game2FragmentAdapter.java @@ -9,12 +9,6 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import com.android.volley.NoConnectionError; -import com.android.volley.Response; -import com.android.volley.TimeoutError; -import com.android.volley.VolleyError; -import com.gh.base.AppController; -import com.gh.common.constant.Config; import com.gh.common.constant.ItemViewType; import com.gh.common.util.DataUtils; import com.gh.common.util.DisplayUtils; @@ -39,21 +33,22 @@ import com.gh.gamecenter.entity.SubjectEntity; import com.gh.gamecenter.listener.OnCallBackListener; import com.gh.gamecenter.manager.DataCollectionManager; import com.gh.gamecenter.manager.GameManager; -import com.gh.gamecenter.volley.extended.JsonArrayExtendedRequest; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; +import com.gh.gamecenter.retrofit.Response; +import com.gh.gamecenter.retrofit.RetrofitManager; -import org.json.JSONArray; - -import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; +import rx.android.schedulers.AndroidSchedulers; +import rx.functions.Func1; +import rx.schedulers.Schedulers; + /** * Created by khy on 2016/6/28. + * 游戏-推荐-数据适配器 */ public class Game2FragmentAdapter extends RecyclerView.Adapter { @@ -84,69 +79,68 @@ public class Game2FragmentAdapter extends RecyclerView.Adapter() { + RetrofitManager.getApi().getTuijian() + .map(new Func1, List>() { @Override - public void onResponse(JSONArray response) { - Type listType = new TypeToken>() {}.getType(); - Gson gson = new Gson(); - List list = gson.fromJson(response.toString(), listType); - if (list != null && !list.isEmpty()) { - GameManager manager = new GameManager(context); - SubjectEntity subjectEntity; - GameEntity gameEntity; - for (int j = 0; j < list.size(); j++) { - subjectEntity = list.get(j); - if (subjectEntity.getData().size() == 1 - && !TextUtils.isEmpty(subjectEntity.getData().get(0).getImage())){ - list.remove(j); - j--; - continue; - } - for (int i = 0; i < subjectEntity.getData().size(); i++) { - gameEntity = subjectEntity.getData().get(i); - if (gameEntity.getApk() != null && !gameEntity.getApk().isEmpty()) { - gameEntity.setEntryMap(DownloadManager.getInstance(context).getEntryMap(gameEntity.getName())); - manager.addOrUpdate(gameEntity.getApk(), gameEntity.getId(), gameEntity.getName()); - } else if (TextUtils.isEmpty(gameEntity.getId())) { - if (TextUtils.isEmpty(gameEntity.getType()) - || TextUtils.isEmpty(gameEntity.getLink()) - || TextUtils.isEmpty(gameEntity.getName()) - || TextUtils.isEmpty(gameEntity.getImage())) { - subjectEntity.getData().remove(i); - i--; - } + public List call(List list) { + GameManager manager = new GameManager(context); + SubjectEntity subjectEntity; + GameEntity gameEntity; + for (int j = 0; j < list.size(); j++) { + subjectEntity = list.get(j); + if (subjectEntity.getData().size() == 1 + && !TextUtils.isEmpty(subjectEntity.getData().get(0).getImage())){ + list.remove(j); + j--; + continue; + } + for (int i = 0; i < subjectEntity.getData().size(); i++) { + gameEntity = subjectEntity.getData().get(i); + if (gameEntity.getApk() != null && !gameEntity.getApk().isEmpty()) { + gameEntity.setEntryMap(DownloadManager.getInstance(context).getEntryMap(gameEntity.getName())); + manager.addOrUpdate(gameEntity.getApk(), gameEntity.getId(), gameEntity.getName()); + } else if (TextUtils.isEmpty(gameEntity.getId())) { + if (TextUtils.isEmpty(gameEntity.getType()) + || TextUtils.isEmpty(gameEntity.getLink()) + || TextUtils.isEmpty(gameEntity.getName()) + || TextUtils.isEmpty(gameEntity.getImage())) { + subjectEntity.getData().remove(i); + i--; } } } - - if (list.size() != 0) { - if (!fragment.isHidden() && !fragment.isEverpause()) { - subjectList = list; - notifyItemRangeInserted(0, getItemCount()); - } else { - subjectList = list; - notifyDataSetChanged(); - } + } + return list; + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response>() { + @Override + public void onResponse(List response) { + if (response.size() != 0) { + if (!fragment.isHidden() && !fragment.isEverpause()) { + subjectList = response; + notifyItemRangeInserted(0, getItemCount()); + } else { + subjectList = response; + notifyDataSetChanged(); } - initLocationMap(); } - listener.loadDone(); + if (listener != null) { + listener.loadDone(); + } } - }, new Response.ErrorListener() { + @Override - public void onErrorResponse(VolleyError error) { - // 无网络连接和访问超时 - if (error.getClass().equals(NoConnectionError.class) - || error.getClass().equals(TimeoutError.class)) { + public void onFailure(Throwable e) { + if (listener != null) { listener.loadError(); } } }); - AppController.addToRequestQueue(request); } private void initLocationMap() { diff --git a/app/src/main/java/com/gh/gamecenter/game/Game3FragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/game/Game3FragmentAdapter.java index 6da3a1e527..ce81f58adb 100644 --- a/app/src/main/java/com/gh/gamecenter/game/Game3FragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/game/Game3FragmentAdapter.java @@ -8,12 +8,6 @@ import android.view.View; import android.view.ViewGroup; import android.widget.Toast; -import com.android.volley.NoConnectionError; -import com.android.volley.Response; -import com.android.volley.TimeoutError; -import com.android.volley.VolleyError; -import com.gh.base.AppController; -import com.gh.common.constant.Config; import com.gh.common.constant.ItemViewType; import com.gh.common.util.DataUtils; import com.gh.common.util.DisplayUtils; @@ -30,18 +24,18 @@ import com.gh.gamecenter.entity.GameEntity; import com.gh.gamecenter.listener.OnCallBackListener; import com.gh.gamecenter.manager.DataCollectionManager; import com.gh.gamecenter.manager.GameManager; -import com.gh.gamecenter.volley.extended.JsonArrayExtendedRequest; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; +import com.gh.gamecenter.retrofit.Response; +import com.gh.gamecenter.retrofit.RetrofitManager; -import org.json.JSONArray; - -import java.lang.reflect.Type; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import rx.android.schedulers.AndroidSchedulers; +import rx.functions.Func1; +import rx.schedulers.Schedulers; + /** * * @author 温冠超 @@ -94,102 +88,93 @@ public class Game3FragmentAdapter extends RecyclerView.Adapter() { + RetrofitManager.getApi().getDanjiyouxi(20, offset) + .map(new Func1, List>() { @Override - public void onResponse(JSONArray response) { - processingData(response, offset); - isLoading = false; + public List call(List list) { + return removeDuplicateData(gameList, list); } - - }, new Response.ErrorListener() { + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response>() { @Override - public void onErrorResponse(VolleyError error) { - isLoading = false; - // 无网络连接 - if (error.getClass().equals(NoConnectionError.class) - || error.getClass().equals(TimeoutError.class)) { - if (offset == 0) { - listener.loadError(); + public void onResponse(List response) { + if (response.size() != 0) { + GameManager manager = new GameManager(context); + for (GameEntity entity : response) { + // 黄壮华 初始化游戏状态 修改2015/8/15 + entity.setEntryMap(DownloadManager.getInstance(context).getEntryMap(entity.getName())); + manager.addOrUpdate(entity.getApk(), entity.getId(), entity.getName()); + } + if (!fragment.isHidden() && !fragment.isEverpause()) { + gameList.addAll(response); + notifyItemRangeInserted(gameList.size() - response.size(), response.size()); } else { - Toast.makeText(context, "加载失败,请检查网络状态", Toast.LENGTH_SHORT).show(); - isNetworkError = true; - notifyItemChanged(getItemCount() - 1); + gameList.addAll(response); + notifyDataSetChanged(); + } + } else { + isRemove = true; + notifyItemChanged(getItemCount() - 1); + } + + if (listener != null) { + listener.loadDone(); + } + + // 黄壮华 获取游戏位置信息 修改2015/8/15 + GameEntity gameEntity; + ArrayList list; + for (int i = 0, size = gameList.size(); i < size; i++) { + gameEntity = gameList.get(i); + if (gameEntity.getApk() != null && gameEntity.getApk().size() != 0) { + for (ApkEntity apkEntity : gameEntity.getApk()) { + list = locationMap.get(apkEntity.getPackageName()); + if (list == null) { + list = new ArrayList<>(); + locationMap.put(apkEntity.getPackageName(), list); + } + list.add(i); + } } } + + isLoading = false; } + @Override + public void onFailure(Throwable e) { + isLoading = false; + + if (offset == 0) { + listener.loadError(); + } else { + Toast.makeText(context, "加载失败,请检查网络状态", Toast.LENGTH_SHORT).show(); + isNetworkError = true; + notifyItemChanged(getItemCount() - 1); + } + } }); - AppController.addToRequestQueue(request); } - private void processingData(JSONArray response, int offset) { - Type listType = new TypeToken>() {}.getType(); - Gson gson = new Gson(); - List gameList = gson.fromJson(response.toString(), listType); - - int listSize = gameList.size(); - - // 去除重复数据 - removeDuplicateData(gameList); - - if (!gameList.isEmpty()) { - GameManager manager = new GameManager(context); - for (GameEntity entity : gameList) { - // 黄壮华 初始化游戏状态 修改2015/8/15 - entity.setEntryMap(DownloadManager.getInstance(context).getEntryMap(entity.getName())); - manager.addOrUpdate(entity.getApk(), entity.getId(), entity.getName()); - } - if (!fragment.isHidden() && !fragment.isEverpause()) { - this.gameList.addAll(gameList); - notifyItemRangeInserted(this.gameList.size() - gameList.size(), gameList.size()); - } else { - this.gameList.addAll(gameList); - notifyDataSetChanged(); - } - } - - listener.loadDone(); - - if (listSize == 0 || (offset == 0 && listSize < 20)) { - isRemove = true; - notifyItemChanged(getItemCount() - 1); - } - - // 黄壮华 获取游戏位置信息 修改2015/8/15 - GameEntity gameEntity; - ArrayList list; - for (int i = 0, size = gameList.size(); i < size; i++) { - gameEntity = gameList.get(i); - if (gameEntity.getApk() != null && gameEntity.getApk().size() != 0) { - for (ApkEntity apkEntity : gameEntity.getApk()) { - list = locationMap.get(apkEntity.getPackageName()); - if (list == null) { - list = new ArrayList<>(); - locationMap.put(apkEntity.getPackageName(), list); - } - list.add(i); - } - } - } - } - - private void removeDuplicateData(List gameList) { - if (this.gameList == null || this.gameList.isEmpty()) { - return; + private List removeDuplicateData(List sourceList, List rawList) { + if (sourceList == null || sourceList.isEmpty() + || rawList == null || rawList.isEmpty()) { + return rawList; } String id; - for (int i = 0; i < gameList.size(); i++) { - id = gameList.get(i).getId(); - for (GameEntity gameEntity : this.gameList) { + for (int i = 0; i < rawList.size(); i++) { + id = rawList.get(i).getId(); + for (GameEntity gameEntity : sourceList) { if (id.equals(gameEntity.getId())) { - gameList.remove(i); + rawList.remove(i); i--; break; } } } + return rawList; } @Override diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailAdapter.java b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailAdapter.java index 83202f29de..0e791671dd 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailAdapter.java @@ -15,18 +15,13 @@ import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; -import com.android.volley.Response; -import com.android.volley.VolleyError; import com.facebook.drawee.view.SimpleDraweeView; -import com.gh.base.AppController; -import com.gh.common.constant.Config; import com.gh.common.util.ConcernUtils; import com.gh.common.util.DataUtils; import com.gh.common.util.DialogUtils; import com.gh.common.util.DisplayUtils; import com.gh.common.util.NewsUtils; import com.gh.common.util.TokenUtils; -import com.gh.common.util.Utils; import com.gh.common.view.HorizontalItemDecoration; import com.gh.gamecenter.GameDetailActivity; import com.gh.gamecenter.GameNewsActivity; @@ -41,10 +36,9 @@ import com.gh.gamecenter.entity.TagEntity; import com.gh.gamecenter.listener.OnCallBackListener; import com.gh.gamecenter.manager.ConcernManager; import com.gh.gamecenter.manager.DataCollectionManager; -import com.gh.gamecenter.volley.extended.JsonArrayExtendedRequest; -import com.gh.gamecenter.volley.extended.JsonObjectExtendedRequest; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; +import com.gh.gamecenter.retrofit.JSONObjectResponse; +import com.gh.gamecenter.retrofit.Response; +import com.gh.gamecenter.retrofit.RetrofitManager; import org.json.JSONArray; import org.json.JSONException; @@ -56,11 +50,18 @@ import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; +import java.util.List; import java.util.Locale; import java.util.Map; +import okhttp3.ResponseBody; +import rx.android.schedulers.AndroidSchedulers; +import rx.functions.Func1; +import rx.schedulers.Schedulers; + /** * Created by LGT on 2016/9/8. + * 游戏详情-数据适配器 */ public class GameDetailAdapter extends RecyclerView.Adapter { @@ -103,74 +104,64 @@ public class GameDetailAdapter extends RecyclerView.Adapter { // 获取游戏详情 public void getGameDetail() { - JsonObjectExtendedRequest request = new JsonObjectExtendedRequest( - Config.HOST + "game/" + gameEntity.getId() + "/detail", - new Response.Listener() { + RetrofitManager.getApi().getGameDetail(gameEntity.getId()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response() { @Override - public void onResponse(JSONObject response) { - if (response.length() != 0) { - Gson gson = new Gson(); - gameDetailEntity = gson.fromJson(response.toString(), GameDetailEntity.class); + public void onResponse(GameDetailEntity response) { + gameDetailEntity = response; - getGameNews(); + getGameNews(); - getNewsServer(); + getNewsServer(); - if (gameDetailEntity.isSkinTest()) { - getSkinDigest(); - } - } else if (listener != null) { - listener.loadError(); + if (gameDetailEntity.isSkinTest()) { + getSkinDigest(); } } - }, new Response.ErrorListener() { + @Override - public void onErrorResponse(VolleyError error) { + public void onFailure(Throwable e) { if (listener != null) { listener.loadError(); } } }); - AppController.addToRequestQueue(request); } private void getSkinDigest() { - JsonObjectExtendedRequest request = new JsonObjectExtendedRequest(Config.HOST + "skin/gameInfo/" + gameEntity.getId(), - new Response.Listener() { + RetrofitManager.getApi().getGameSkin(gameEntity.getId()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new JSONObjectResponse() { @Override public void onResponse(JSONObject response) { - try { - String des = response.getString("des"); - String name = response.getString("name"); - skinMap.put("des", des); - skinMap.put("name", name); - notifyDataSetChanged(); - } catch (JSONException e) { - e.printStackTrace(); + if (response.length() != 0) { + try { + String des = response.getString("des"); + String name = response.getString("name"); + skinMap.put("des", des); + skinMap.put("name", name); + + notifyDataSetChanged(); + } catch (JSONException e) { + e.printStackTrace(); + } } - - } - }, - new Response.ErrorListener() { - @Override - public void onErrorResponse(VolleyError error) { - } }); - AppController.addToRequestQueue(request); } // 获取游戏新闻 private void getGameNews() { - JsonArrayExtendedRequest request = new JsonArrayExtendedRequest( - Config.HOST + "game/" + gameEntity.getId() + "/news?limit=3", - new Response.Listener() { + RetrofitManager.getApi().getGameNews(gameEntity.getId(), 3) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response>() { @Override - public void onResponse(JSONArray response) { - Gson gson = new Gson(); - ArrayList news = gson.fromJson(response.toString(), - new TypeToken>() {}.getType()); - gameDetailEntity.setNews(news); + public void onResponse(List response) { + gameDetailEntity.setNews(response); if (listener != null) { listener.loadDone(); @@ -178,9 +169,9 @@ public class GameDetailAdapter extends RecyclerView.Adapter { initPosition(); notifyDataSetChanged(); } - }, new Response.ErrorListener() { + @Override - public void onErrorResponse(VolleyError error) { + public void onFailure(Throwable e) { if (listener != null) { listener.loadDone(); } @@ -188,63 +179,70 @@ public class GameDetailAdapter extends RecyclerView.Adapter { notifyDataSetChanged(); } }); - AppController.addToRequestQueue(request); } - // 获取开发信息 + // 获取开服信息 private void getNewsServer() { - JsonArrayExtendedRequest request = new JsonArrayExtendedRequest( - Config.HOST + "game/" + gameEntity.getId() + "/serverInfo", - new Response.Listener() { + RetrofitManager.getApi().getGameServer(gameEntity.getId()) + .map(new Func1>() { @Override - public void onResponse(JSONArray response) { + public List call(ResponseBody responseBody) { + List serverInfo = new ArrayList<>(); try { - ArrayList serverInfo = new ArrayList<>(); - SimpleDateFormat format = new SimpleDateFormat( - "Mdd", Locale.getDefault()); - int today = Integer.valueOf(format.format(new Date())); - for (int i = 0, size = response.length(); i < size; i++) { - ServerEntity entity = new ServerEntity(); - JSONObject jsonObject2; - jsonObject2 = response.getJSONObject(i); - String server = jsonObject2.getString("server"); - if (server.length() > 4) { - server = server.substring(0, 4); + JSONArray response = new JSONArray(responseBody.string()); + if (response.length() != 0) { + SimpleDateFormat format = new SimpleDateFormat( + "Mdd", Locale.getDefault()); + int today = Integer.valueOf(format.format(new Date())); + for (int i = 0, size = response.length(); i < size; i++) { + ServerEntity entity = new ServerEntity(); + JSONObject jsonObject2; + jsonObject2 = response.getJSONObject(i); + String server = jsonObject2.getString("server"); + if (server.length() > 4) { + server = server.substring(0, 4); + } + entity.setServer(server); + entity.setTime(Long.valueOf(jsonObject2.getString("time") + "000")); + int day = Integer.valueOf(format.format(new Date(entity.getTime()))); + if (day == today + 1) { + entity.setTag("明天"); + serverInfo.add(entity); + } else if (day == today - 1) { + entity.setTag("昨天"); + serverInfo.add(entity); + } else if (day == today) { + entity.setTag("今天"); + serverInfo.add(entity); + } } - entity.setServer(server); - entity.setTime(Long.valueOf(jsonObject2.getString("time") + "000")); - int day = Integer.valueOf(format.format(new Date(entity.getTime()))); - if (day == today + 1) { - entity.setTag("明天"); - serverInfo.add(entity); - } else if (day == today - 1) { - entity.setTag("昨天"); - serverInfo.add(entity); - } else if (day == today) { - entity.setTag("今天"); - serverInfo.add(entity); - } - } - Comparator comparator = new Comparator() { - @Override - public int compare(ServerEntity lhs, ServerEntity rhs) { - return (int) (lhs.getTime() - rhs.getTime()); - } - }; - Collections.sort(serverInfo, comparator); - - gameDetailEntity.setServerInfo(serverInfo); - initPosition(); - if (position_newsserver != -1) { - notifyItemInserted(position_newsserver); + Comparator comparator = new Comparator() { + @Override + public int compare(ServerEntity lhs, ServerEntity rhs) { + return (int) (lhs.getTime() - rhs.getTime()); + } + }; + Collections.sort(serverInfo, comparator); } - } catch (JSONException e) { + } catch (Exception e) { e.printStackTrace(); } + return serverInfo; } - }, null); - AppController.addToRequestQueue(request); + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response>() { + @Override + public void onResponse(List response) { + gameDetailEntity.setServerInfo(response); + initPosition(); + if (position_newsserver != -1) { + notifyItemInserted(position_newsserver); + } + } + }); } @Override @@ -303,7 +301,7 @@ public class GameDetailAdapter extends RecyclerView.Adapter { } private void initNewsServerViewHolder(final GameDetailNewsServerViewHolder viewHolder) { - ArrayList serverInfo = gameDetailEntity.getServerInfo(); + List serverInfo = gameDetailEntity.getServerInfo(); viewHolder.gamedetail_newsserver_show.setLayoutManager(new LinearLayoutManager( context, LinearLayoutManager.HORIZONTAL, false)); viewHolder.gamedetail_newsserver_show.setAdapter( @@ -422,7 +420,7 @@ public class GameDetailAdapter extends RecyclerView.Adapter { } }); } - final ArrayList newsList = gameDetailEntity.getNews(); + final List newsList = gameDetailEntity.getNews(); int childCount = viewHolder.gamedetail_item_news_list.getChildCount(); if (childCount == 0) { for (int i = 0, size = newsList.size(); i < size; i++) { @@ -659,20 +657,9 @@ public class GameDetailAdapter extends RecyclerView.Adapter { Toast.makeText(context, "关注成功", Toast.LENGTH_SHORT).show(); - //添加关注 + // 添加关注 String uuid = TokenUtils.getDeviceId(context); - ConcernUtils.postConcernGameId(gameEntity.getId(), Config.HOST + "device/" + uuid + "/concern", - new ConcernUtils.DownJsonListener() { - @Override - public void downSucced(String str) { - Utils.log("关注提交成功==游戏详情"); - } - - @Override - public void downFailed() { - Utils.log("关注提交失败==游戏详情"); - } - }); + ConcernUtils.postConcernGameId(uuid, gameEntity.getId()); } else { Map kv2 = new HashMap<>(); kv2.put("点击", "取消关注"); @@ -696,20 +683,9 @@ public class GameDetailAdapter extends RecyclerView.Adapter { concern.setBackgroundResource(R.drawable.textview_red_style); concern.setTextColor(0xffffffff); - //取消关注 + // 取消关注 String uuid = TokenUtils.getDeviceId(context); - ConcernUtils.deleteConcernData(Config.HOST + "device/" + uuid + "/concern/" + gameEntity.getId(), - new ConcernUtils.DownJsonListener() { - @Override - public void downSucced(String str) { - Utils.log("删除提交成功==游戏详情"); - } - - @Override - public void downFailed() { - Utils.log("删除提交失败==游戏详情"); - } - }); + ConcernUtils.deleteConcernData(uuid, gameEntity.getId()); } }); } diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailNewsServerAdapter.java b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailNewsServerAdapter.java index 51c4b600de..004898cf03 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailNewsServerAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailNewsServerAdapter.java @@ -13,18 +13,20 @@ import com.gh.gamecenter.entity.ServerEntity; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.List; import java.util.Locale; /** * Created by LGT on 2016/9/18. + * */ public class GameDetailNewsServerAdapter extends RecyclerView.Adapter { private Context context; - private ArrayList serverInfo; + private List serverInfo; - public GameDetailNewsServerAdapter(Context context, ArrayList list) { + public GameDetailNewsServerAdapter(Context context, List list) { this.context = context; this.serverInfo = list; } diff --git a/app/src/main/java/com/gh/gamecenter/manager/CommentManager.java b/app/src/main/java/com/gh/gamecenter/manager/CommentManager.java index 9f7af5e9cb..a303ac0732 100644 --- a/app/src/main/java/com/gh/gamecenter/manager/CommentManager.java +++ b/app/src/main/java/com/gh/gamecenter/manager/CommentManager.java @@ -1,8 +1,9 @@ package com.gh.gamecenter.manager; import com.gh.common.constant.Config; +import com.gh.common.util.TimestampUtils; import com.gh.gamecenter.retrofit.ObservableUtil; -import com.gh.gamecenter.retrofit.RetrofitManager; +import com.gh.gamecenter.retrofit.OkHttpCache; import org.json.JSONArray; import org.json.JSONException; @@ -62,7 +63,8 @@ public class CommentManager { if (key == null) { return; } - byte[] data = RetrofitManager.getInstance().getCache(key); + key = TimestampUtils.addTimestamp(key); + byte[] data = OkHttpCache.getCache(key); if (data != null) { try { JSONArray jsonArray = new JSONArray(new String(data)); @@ -74,7 +76,7 @@ public class CommentManager { break; } } - RetrofitManager.getInstance().updateCache(key, jsonArray.toString().getBytes()); + OkHttpCache.updateCache(key, jsonArray.toString().getBytes()); } catch (JSONException e) { e.printStackTrace(); } @@ -88,8 +90,8 @@ public class CommentManager { ObservableUtil.io(new Observable.OnSubscribe() { @Override public void call(Subscriber subscriber) { - String key = Config.COMMENT_HOST + "article/" + comment_id +"/comment/num"; - byte[] data = RetrofitManager.getInstance().getCache(key); + String key = TimestampUtils.addTimestamp(Config.COMMENT_HOST + "article/" + comment_id +"/comment/num"); + byte[] data = OkHttpCache.getCache(key); if (data != null) { try { JSONArray jsonArray = new JSONArray(new String(data)); @@ -101,7 +103,7 @@ public class CommentManager { break; } } - RetrofitManager.getInstance().updateCache(key, jsonArray.toString().getBytes()); + OkHttpCache.updateCache(key, jsonArray.toString().getBytes()); } catch (JSONException e) { e.printStackTrace(); } diff --git a/app/src/main/java/com/gh/gamecenter/manager/DataCollectionManager.java b/app/src/main/java/com/gh/gamecenter/manager/DataCollectionManager.java index 8c5c15a2ed..1c6c1a8931 100644 --- a/app/src/main/java/com/gh/gamecenter/manager/DataCollectionManager.java +++ b/app/src/main/java/com/gh/gamecenter/manager/DataCollectionManager.java @@ -2,18 +2,15 @@ package com.gh.gamecenter.manager; import android.content.Context; -import com.android.volley.Request.Method; -import com.android.volley.Response; -import com.android.volley.VolleyError; -import com.gh.base.AppController; -import com.gh.common.constant.Config; import com.gh.common.util.DeviceUtils; import com.gh.common.util.PackageUtils; import com.gh.common.util.TokenUtils; import com.gh.common.util.Utils; import com.gh.gamecenter.db.DataCollectionDao; import com.gh.gamecenter.db.info.DataCollectionInfo; -import com.gh.gamecenter.volley.extended.JsonObjectExtendedRequest; +import com.gh.gamecenter.retrofit.JSONObjectResponse; +import com.gh.gamecenter.retrofit.Response; +import com.gh.gamecenter.retrofit.RetrofitManager; import org.json.JSONArray; import org.json.JSONException; @@ -25,6 +22,12 @@ import java.util.List; import java.util.Map; import java.util.UUID; +import okhttp3.MediaType; +import okhttp3.RequestBody; +import okhttp3.ResponseBody; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + public class DataCollectionManager { private static DataCollectionManager mInstance; @@ -142,13 +145,13 @@ public class DataCollectionManager { Map params = new HashMap<>(); params.put("type", type); params.put("data", new JSONObject(map).toString()); - String url = Config.DATA_HOST + "collection/upload2"; - JSONObject body = new JSONObject(params); - JsonObjectExtendedRequest request = new JsonObjectExtendedRequest( - Method.POST, url, body.toString(), - null, null); - request.setShouldCache(false); - AppController.addToRequestQueue(request); + + RequestBody body = RequestBody.create(MediaType.parse("application/json"), + new JSONObject(params).toString()); + RetrofitManager.getData().postRealData(body) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response()); } /* @@ -197,7 +200,6 @@ public class DataCollectionManager { return; } isUploading = true; - String url = Config.DATA_HOST + "collection/upload"; final List ids = new ArrayList<>(); @@ -244,30 +246,34 @@ public class DataCollectionManager { JSONObject jsonObject = new JSONObject(hashMap); params.add(jsonObject); } - JSONArray body = new JSONArray(params); - JsonObjectExtendedRequest request = new JsonObjectExtendedRequest( - Method.POST, url, body.toString(), - new Response.Listener() { + RequestBody body = RequestBody.create(MediaType.parse("application/json"), + new JSONArray(params).toString()); + RetrofitManager.getData().postData(body) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new JSONObjectResponse() { @Override public void onResponse(JSONObject response) { isUploading = false; - try { - if ("success".equals(response.getString("status"))) { - // 上传成功,删除本地数据 - dao.delete(ids); + + if (response.length() != 0) { + try { + if ("success".equals(response.getString("status"))) { + // 上传成功,删除本地数据 + dao.delete(ids); + } + } catch (JSONException e) { + e.printStackTrace(); } - } catch (JSONException e) { - e.printStackTrace(); } } - }, new Response.ErrorListener() { + @Override - public void onErrorResponse(VolleyError error) { + public void onFailure(Throwable e) { isUploading = false; } }); - AppController.addToRequestQueue(request); } } diff --git a/app/src/main/java/com/gh/gamecenter/manager/FilterManager.java b/app/src/main/java/com/gh/gamecenter/manager/FilterManager.java index 4ca4aff30a..3b025983e5 100644 --- a/app/src/main/java/com/gh/gamecenter/manager/FilterManager.java +++ b/app/src/main/java/com/gh/gamecenter/manager/FilterManager.java @@ -3,20 +3,18 @@ package com.gh.gamecenter.manager; import android.content.Context; import android.content.SharedPreferences; -import com.android.volley.Request; -import com.android.volley.Response; -import com.gh.base.AppController; import com.gh.common.constant.Config; import com.gh.gamecenter.db.FilterDao; import com.gh.gamecenter.db.info.FilterInfo; -import com.gh.gamecenter.volley.extended.JsonArrayExtendedRequest; - -import org.json.JSONArray; -import org.json.JSONException; +import com.gh.gamecenter.retrofit.Response; +import com.gh.gamecenter.retrofit.RetrofitManager; import java.util.ArrayList; import java.util.List; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + public class FilterManager { private FilterDao dao; @@ -49,27 +47,22 @@ public class FilterManager { } public void getFilterFromServer(final String today) { - long skip = dao.getCount(); - JsonArrayExtendedRequest request = new JsonArrayExtendedRequest(Request.Method.GET, - Config.HOST + "support/package/unused?skip=" + skip, new JSONArray(), - new Response.Listener() { + RetrofitManager.getApi().getPackageUnused(dao.getCount()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response>() { @Override - public void onResponse(JSONArray response) { - try { - List list = new ArrayList<>(); - for (int i = 0, size = response.length(); i < size; i++) { - list.add(new FilterInfo(response.getString(i))); - } - dao.addAll(list); - sp.edit().putString("filter_time", today).apply(); - if (list.size() == 500){ - getFilterFromServer(today); - } - } catch (JSONException e) { - e.printStackTrace(); + public void onResponse(List response) { + List list = new ArrayList<>(); + for (String packageName : response) { + list.add(new FilterInfo(packageName)); + } + dao.addAll(list); + sp.edit().putString("filter_time", today).apply(); + if (list.size() == 500){ + getFilterFromServer(today); } } - }, null); - AppController.addToRequestQueue(request); + }); } } diff --git a/app/src/main/java/com/gh/gamecenter/manager/VisitManager.java b/app/src/main/java/com/gh/gamecenter/manager/VisitManager.java index 65a9864995..0cb519b9c3 100644 --- a/app/src/main/java/com/gh/gamecenter/manager/VisitManager.java +++ b/app/src/main/java/com/gh/gamecenter/manager/VisitManager.java @@ -1,8 +1,9 @@ package com.gh.gamecenter.manager; import com.gh.common.constant.Config; +import com.gh.common.util.TimestampUtils; import com.gh.gamecenter.retrofit.ObservableUtil; -import com.gh.gamecenter.retrofit.RetrofitManager; +import com.gh.gamecenter.retrofit.OkHttpCache; import org.json.JSONArray; import org.json.JSONException; @@ -64,7 +65,8 @@ public class VisitManager { if (key == null) { return; } - byte[] data = RetrofitManager.getInstance().getCache(key); + key = TimestampUtils.addTimestamp(key); + byte[] data = OkHttpCache.getCache(key); if (data != null) { try { JSONArray jsonArray = new JSONArray(new String(data)); @@ -76,7 +78,7 @@ public class VisitManager { break; } } - RetrofitManager.getInstance().updateCache(key, jsonArray.toString().getBytes()); + OkHttpCache.updateCache(key, jsonArray.toString().getBytes()); } catch (JSONException e) { e.printStackTrace(); } diff --git a/app/src/main/java/com/gh/gamecenter/news/News1Fragment.java b/app/src/main/java/com/gh/gamecenter/news/News1Fragment.java index 8b233fe97e..e8083b3e65 100644 --- a/app/src/main/java/com/gh/gamecenter/news/News1Fragment.java +++ b/app/src/main/java/com/gh/gamecenter/news/News1Fragment.java @@ -305,8 +305,10 @@ public class News1Fragment extends BaseFragment implements SwipeRefreshLayout.On } else { gameId = installedList.get(i).getId(); } - RetrofitManager.getApi().getGameDigest(gameId, - new Response() { + RetrofitManager.getApi().getGameDigest(gameId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response() { @Override public void onResponse(GameEntity response) { if (response.getId().equals("5618b86e8ab49e17088b4575")) { diff --git a/app/src/main/java/com/gh/gamecenter/news/News1FragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/news/News1FragmentAdapter.java index 83608c163b..0d2ef4fd6e 100644 --- a/app/src/main/java/com/gh/gamecenter/news/News1FragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/news/News1FragmentAdapter.java @@ -14,6 +14,7 @@ import android.widget.Toast; import com.gh.base.AppController; import com.gh.common.constant.ItemViewType; import com.gh.common.util.ConcernContentUtils; +import com.gh.common.util.ConcernUtils; import com.gh.common.util.DataUtils; import com.gh.common.util.DisplayUtils; import com.gh.common.util.MD5Utils; @@ -54,8 +55,6 @@ import java.util.List; import java.util.Locale; import java.util.Map; -import okhttp3.MediaType; -import okhttp3.RequestBody; import retrofit2.adapter.rxjava.HttpException; import rx.Observable; import rx.Subscriber; @@ -208,7 +207,8 @@ public class News1FragmentAdapter extends RecyclerView.Adapter list, final int start) { if (list == null || list.isEmpty()) { @@ -417,23 +410,28 @@ public class News1FragmentAdapter extends RecyclerView.Adapter() { + RetrofitManager.getApi().getNewsDetail(id) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response() { @Override - public void onResponse(JSONObject response) { - if (response.length() != 0) { - Gson gson = new Gson(); - newsDetailEntity = gson.fromJson(response.toString(), NewsDetailEntity.class); - newsDetailEntity.setId(id); - newsDetailEntity.setType(type); - newsDetailEntity.setTitle(title); + public void onResponse(NewsDetailEntity response) { + newsDetailEntity = response; + newsDetailEntity.setId(id); + newsDetailEntity.setType(type); + newsDetailEntity.setTitle(title); - notifyDataSetChanged(); - } else { - listener.loadError(); - } + notifyDataSetChanged(); } - }, new Response.ErrorListener() { + @Override - public void onErrorResponse(VolleyError error) { - // 无网络连接和访问超时 - if (error.getClass().equals(NoConnectionError.class) - || error.getClass().equals(TimeoutError.class)) { - listener.loadError(); - } + public void onFailure(Throwable e) { + listener.loadError(); } }); - AppController.addToRequestQueue(request); } private void getNewsMore() { - JsonArrayExtendedRequest request = new JsonArrayExtendedRequest( - Config.HOST + "news/" + newsDetailEntity.getId() + "/suggestion", - new Response.Listener() { + RetrofitManager.getApi().getNewsSuggestion(newsDetailEntity.getId()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response>() { @Override - public void onResponse(JSONArray response) { - Type listType = new TypeToken>() { - }.getType(); - Gson gson = new Gson(); - List list = gson.fromJson(response.toString(), listType); + public void onResponse(List response) { // 去除与当前文章重复的文章 - for (int i = 0, size = list.size(); i < size; i++) { - if (newsDetailEntity.getId().equals(list.get(i).getId())) { - list.remove(i); + for (int i = 0, size = response.size(); i < size; i++) { + if (newsDetailEntity.getId().equals(response.get(i).getId())) { + response.remove(i); break; } } - if (list.size() != 0) { + if (response.size() != 0) { List more = new ArrayList<>(); // 随机三篇文章 - int[] index = RandomUtils.getRandomArray(list.size() > 3 ? 3 : list.size(), list.size()); + int[] index = RandomUtils.getRandomArray(response.size() > 3 ? 3 : response.size(), response.size()); for (int i : index) { - more.add(list.get(i)); + more.add(response.get(i)); } newsDetailEntity.setMore(more); notifyItemInserted(getItemCount() - 1); @@ -176,14 +151,12 @@ public class NewsDetailAdapter extends RecyclerView.Adapter { getNewsCommentNum(); } - }, - new Response.ErrorListener() { + @Override - public void onErrorResponse(VolleyError error) { + public void onFailure(Throwable e) { getNewsCommentNum(); } - }); - AppController.addToRequestQueue(request); + }); } @Override @@ -358,20 +331,9 @@ public class NewsDetailAdapter extends RecyclerView.Adapter { Toast.makeText(context, "关注成功", Toast.LENGTH_SHORT).show(); - //添加关注 + // 添加关注 String uuid = TokenUtils.getDeviceId(context); - ConcernUtils.postConcernGameId(gameEntity.getId(), Config.HOST + "device/" + uuid + "/concern", - new ConcernUtils.DownJsonListener() { - @Override - public void downSucced(String str) { - Utils.log("关注提交成功==游戏详情"); - } - - @Override - public void downFailed() { - Utils.log("关注提交失败==游戏详情"); - } - }); + ConcernUtils.postConcernGameId(uuid, gameEntity.getId()); } else { Map kv = new HashMap<>(); kv.put("状态", "取消关注"); @@ -406,18 +368,7 @@ public class NewsDetailAdapter extends RecyclerView.Adapter { //取消关注 String uuid = TokenUtils.getDeviceId(context); - ConcernUtils.deleteConcernData(Config.HOST + "device/" + uuid + "/concern/" + gameEntity.getId(), - new ConcernUtils.DownJsonListener() { - @Override - public void downSucced(String str) { - Utils.log("删除提交成功==游戏详情"); - } - - @Override - public void downFailed() { - Utils.log("删除提交失败==游戏详情"); - } - }); + ConcernUtils.deleteConcernData(uuid, gameEntity.getId()); } }); } diff --git a/app/src/main/java/com/gh/gamecenter/personal/ConcernFragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/personal/ConcernFragmentAdapter.java index 31ecac4707..c71886d171 100644 --- a/app/src/main/java/com/gh/gamecenter/personal/ConcernFragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/personal/ConcernFragmentAdapter.java @@ -7,10 +7,6 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import com.android.volley.Response; -import com.android.volley.VolleyError; -import com.gh.base.AppController; -import com.gh.common.constant.Config; import com.gh.common.constant.ItemViewType; import com.gh.common.util.DataUtils; import com.gh.common.util.DisplayUtils; @@ -29,16 +25,17 @@ import com.gh.gamecenter.listener.OnCallBackListener; import com.gh.gamecenter.manager.ConcernManager; import com.gh.gamecenter.manager.DataCollectionManager; import com.gh.gamecenter.manager.GameManager; -import com.gh.gamecenter.volley.extended.JsonObjectExtendedRequest; -import com.google.gson.Gson; - -import org.json.JSONObject; +import com.gh.gamecenter.retrofit.Response; +import com.gh.gamecenter.retrofit.RetrofitManager; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + /** * Created by LGT on 2016/8/15. * 已关注界面-数据适配器 @@ -85,42 +82,36 @@ public class ConcernFragmentAdapter extends RecyclerView.Adapter result = new ArrayList<>(); + final List result = new ArrayList<>(); final int size = concernList.size(); count = 0; for (int i = 0; i < concernList.size(); i++) { - JsonObjectExtendedRequest concernObjectRequest = new JsonObjectExtendedRequest( - Config.HOST + "game/" + concernList.get(i).getId() + "/digest", - new Response.Listener() { + RetrofitManager.getApi().getGameDigest(concernList.get(i).getId()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response() { @Override - public void onResponse(JSONObject response) { - if (response.length() != 0) { - result.add(response); - } + public void onResponse(GameEntity response) { + result.add(response); + addCount(); if (count == size) { processingConcernGame(result); } } - }, new Response.ErrorListener() { + @Override - public void onErrorResponse(VolleyError error) { + public void onFailure(Throwable e) { addCount(); if (count == size) { processingConcernGame(result); } } }); - AppController.addToRequestQueue(concernObjectRequest); } } - private void processingConcernGame(List data) { - List list = new ArrayList<>(); - Gson gson = new Gson(); - for (int i = 0; i < data.size(); i++) { - list.add(gson.fromJson(data.get(i).toString(), GameEntity.class)); - } + private void processingConcernGame(List list) { for (int i = 0, sizei = concernList.size(); i < sizei; i++) { for (int j = 0, sizej = list.size(); j < sizej; j++) { if (concernList.get(i).getId().equals(list.get(j).getId())) { diff --git a/app/src/main/java/com/gh/gamecenter/personal/InstallFragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/personal/InstallFragmentAdapter.java index 39143e38b1..2c2847bce8 100644 --- a/app/src/main/java/com/gh/gamecenter/personal/InstallFragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/personal/InstallFragmentAdapter.java @@ -7,10 +7,6 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import com.android.volley.Response; -import com.android.volley.VolleyError; -import com.gh.base.AppController; -import com.gh.common.constant.Config; import com.gh.common.constant.ItemViewType; import com.gh.common.util.DataUtils; import com.gh.common.util.DisplayUtils; @@ -32,10 +28,8 @@ import com.gh.gamecenter.entity.GameInfoEntity; import com.gh.gamecenter.manager.ConcernManager; import com.gh.gamecenter.manager.DataCollectionManager; import com.gh.gamecenter.manager.GameManager; -import com.gh.gamecenter.volley.extended.JsonObjectExtendedRequest; -import com.google.gson.Gson; - -import org.json.JSONObject; +import com.gh.gamecenter.retrofit.Response; +import com.gh.gamecenter.retrofit.RetrofitManager; import java.util.ArrayList; import java.util.Collections; @@ -44,6 +38,9 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + /** * Created by LGT on 2016/8/12. * 已安装界面-数据适配器 @@ -214,42 +211,36 @@ public class InstallFragmentAdapter extends RecyclerView.Adapter ids) { - final List result = new ArrayList<>(); + final List result = new ArrayList<>(); final int size = ids.size(); count = 0; for (int i = 0; i < ids.size(); i++) { - JsonObjectExtendedRequest request = new JsonObjectExtendedRequest( - Config.HOST + "game/" + ids.get(i) + "/digest", - new Response.Listener() { + RetrofitManager.getApi().getGameDigest(ids.get(i)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response() { @Override - public void onResponse(JSONObject response) { - if (response.length() != 0) { - result.add(response); - } + public void onResponse(GameEntity response) { + result.add(response); + addCount(); if (count == size) { processingData(result); } } - }, new Response.ErrorListener() { + @Override - public void onErrorResponse(VolleyError error) { + public void onFailure(Throwable e) { addCount(); if (count == size) { processingData(result); } } }); - AppController.addToRequestQueue(request); } } - private void processingData(List data) { - Gson gson = new Gson(); - List gameList = new ArrayList<>(); - for (int i = 0, size = data.size(); i < size; i++) { - gameList.add(gson.fromJson(data.get(i).toString(), GameEntity.class)); - } + private void processingData(List gameList) { if (gameList.size() != 0) { for (int i = 0, size = sortedList.size(); i < size; i++) { String id = sortedList.get(i).getId(); diff --git a/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java b/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java index c8c2b6607c..4ad3bbb760 100644 --- a/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java +++ b/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java @@ -32,11 +32,7 @@ import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; -import com.android.volley.Request; -import com.android.volley.Response; -import com.android.volley.VolleyError; import com.facebook.drawee.view.SimpleDraweeView; -import com.gh.base.AppController; import com.gh.common.constant.Config; import com.gh.common.util.DataUtils; import com.gh.common.util.DialogUtils; @@ -48,10 +44,10 @@ import com.gh.gamecenter.R; import com.gh.gamecenter.SettingActivity; import com.gh.gamecenter.adapter.FragmentAdapter; import com.gh.gamecenter.manager.DataCollectionManager; -import com.gh.gamecenter.volley.extended.StringExtendedRequest; +import com.gh.gamecenter.retrofit.Response; +import com.gh.gamecenter.retrofit.RetrofitManager; import com.tencent.stat.StatConfig; -import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; @@ -59,6 +55,13 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import okhttp3.MediaType; +import okhttp3.RequestBody; +import okhttp3.ResponseBody; +import retrofit2.adapter.rxjava.HttpException; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + /** * * @author 温冠超 @@ -389,56 +392,59 @@ public class PersonalFragment extends Fragment implements View.OnClickListener, new Thread(){ @Override public void run() { - HashMap params = new HashMap<>(); + Map params = new HashMap<>(); params.put("name", nickname); - StringExtendedRequest request = new StringExtendedRequest(Request.Method.POST, - Config.USER_HOST + "name", new JSONObject(params).toString(), - new Response.Listener() { + + RequestBody body = RequestBody.create(MediaType.parse("application/json"), + new JSONObject(params).toString()); + RetrofitManager.getUser().postName(TokenUtils.getToken(getActivity(), isCheck), body) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response() { @Override - public void onResponse(String response) { + public void onResponse(ResponseBody response) { waitDialog.dismiss(); + SharedPreferences sp = getActivity().getSharedPreferences(Config.PREFERENCE, Context.MODE_PRIVATE); sp.edit().putString("user_name", nickname).apply(); Toast.makeText(getActivity(), "修改成功", Toast.LENGTH_SHORT).show(); me_tv_top_name.setText(nickname); } - }, new Response.ErrorListener() { + @Override - public void onErrorResponse(VolleyError error) { - if (error.networkResponse != null - && error.networkResponse.statusCode == 401) { - modifyNickname(waitDialog, nickname, false); - return; - } - waitDialog.dismiss(); - if (error.networkResponse != null - && error.networkResponse.statusCode == 403) { - try { - JSONObject response = new JSONObject(new String(error.networkResponse.data)); - String detail = response.getString("detail"); - if ("too long".equals(detail)) { - Toast.makeText(getActivity(), "昵称太长", Toast.LENGTH_SHORT).show(); - } else if ("invalid".equals(detail)) { - Toast.makeText(getActivity(), "非法字符", Toast.LENGTH_SHORT).show(); - } else if ("repeat".equals(detail)) { - Toast.makeText(getActivity(), "昵称已存在", Toast.LENGTH_SHORT).show(); - } else if ("no change".equals(detail)) { - Toast.makeText(getActivity(), "昵称一致", Toast.LENGTH_SHORT).show(); - } else if ("too frequent".equals(detail)) { - Toast.makeText(getActivity(), "修改太频繁,请稍后再试", Toast.LENGTH_SHORT).show(); + public void onFailure(Throwable e) { + if (e instanceof HttpException) { + HttpException exception = (HttpException) e; + if (exception.code() == 401) { + modifyNickname(waitDialog, nickname, false); + return; + } + if (exception.code() == 403) { + try { + JSONObject response = new JSONObject(new String(exception.response().errorBody().bytes())); + String detail = response.getString("detail"); + if ("too long".equals(detail)) { + Toast.makeText(getActivity(), "昵称太长", Toast.LENGTH_SHORT).show(); + } else if ("invalid".equals(detail)) { + Toast.makeText(getActivity(), "非法字符", Toast.LENGTH_SHORT).show(); + } else if ("repeat".equals(detail)) { + Toast.makeText(getActivity(), "昵称已存在", Toast.LENGTH_SHORT).show(); + } else if ("no change".equals(detail)) { + Toast.makeText(getActivity(), "昵称一致", Toast.LENGTH_SHORT).show(); + } else if ("too frequent".equals(detail)) { + Toast.makeText(getActivity(), "修改太频繁,请稍后再试", Toast.LENGTH_SHORT).show(); + } + } catch (Exception ex) { + ex.printStackTrace(); + Toast.makeText(getActivity(), "修改失败", Toast.LENGTH_SHORT).show(); } - } catch (JSONException e) { - e.printStackTrace(); - Toast.makeText(getActivity(), "修改失败", Toast.LENGTH_SHORT).show(); } } else { Toast.makeText(getActivity(), "修改失败", Toast.LENGTH_SHORT).show(); } + waitDialog.dismiss(); } }); - request.setShouldCache(false); - request.addHeader("TOKEN", TokenUtils.getToken(getActivity(), isCheck)); - AppController.addToRequestQueue(request); } }.start(); } @@ -466,11 +472,13 @@ public class PersonalFragment extends Fragment implements View.OnClickListener, new Thread(){ @Override public void run() { - StringExtendedRequest request = new StringExtendedRequest(Request.Method.POST, - Config.USER_HOST + "device/" + TokenUtils.getDeviceId(getActivity()), - new JSONObject(params).toString(), null, null); - request.addHeader("TOKEN", TokenUtils.getToken(getActivity())); - AppController.addToRequestQueue(request); + RequestBody body = RequestBody.create(MediaType.parse("application/json"), + new JSONObject(params).toString()); + RetrofitManager.getUser().postDevice(TokenUtils.getToken(getActivity()), body, + TokenUtils.getDeviceId(getActivity())) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response()); } }.start(); } diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/ApiService.java b/app/src/main/java/com/gh/gamecenter/retrofit/ApiService.java index 7345c821e3..9702bab59d 100644 --- a/app/src/main/java/com/gh/gamecenter/retrofit/ApiService.java +++ b/app/src/main/java/com/gh/gamecenter/retrofit/ApiService.java @@ -1,8 +1,16 @@ package com.gh.gamecenter.retrofit; +import com.gh.gamecenter.entity.AppEntity; import com.gh.gamecenter.entity.ConcernEntity; +import com.gh.gamecenter.entity.GameDetailEntity; +import com.gh.gamecenter.entity.GameDigestEntity; import com.gh.gamecenter.entity.GameEntity; +import com.gh.gamecenter.entity.GameUpdateEntity; +import com.gh.gamecenter.entity.NewsDetailEntity; import com.gh.gamecenter.entity.NewsEntity; +import com.gh.gamecenter.entity.PlatformEntity; +import com.gh.gamecenter.entity.SlideEntity; +import com.gh.gamecenter.entity.SubjectEntity; import java.util.List; @@ -11,6 +19,7 @@ import okhttp3.ResponseBody; import retrofit2.http.Body; import retrofit2.http.GET; import retrofit2.http.Headers; +import retrofit2.http.POST; import retrofit2.http.PUT; import retrofit2.http.Path; import retrofit2.http.Query; @@ -18,7 +27,7 @@ import rx.Observable; /** * Created by khy on 2016/11/1. - * + * api.ghzhushou.com */ public interface ApiService { @@ -41,14 +50,119 @@ public interface ApiService { @GET("game/{game_id}/digest") // 获取游戏摘要 Observable getGameDigest(@Path("game_id") String game_id); + @GET("game/{game_id}/news_digest") // 获取游戏新闻摘要 + Observable getGameNewsDigest(@Path("game_id") String game_id); + + @GET("game/{game_id}/detail") // 获取游戏详情 + Observable getGameDetail(@Path("game_id") String game_id); + @GET("game/remenkapai") // 获取热门卡牌 Observable> getRemenkapai(); @GET("support/time/current") - Observable getTime(); + Observable getTime();// 获取服务器时间 @Headers({"Content-Type: application/json", "Accept: application/json"}) @PUT("device/{device_id}/concern") // 更新设备关注 Observable putConcern(@Path("device_id") String device_id, @Body RequestBody body); + @POST("device/{device_id}/concern") // 添加关注 + Observable postConcern(@Path("device_id") String device_id, @Body RequestBody body); + + @POST("device/{device_id}/concern/{game_id}") // 删除关注 + Observable deleteConcern(@Path("device_id") String device_id, @Path("game_id") String game_id); + + @GET("device/{device_id}/concern") // 获取设备关注数据 + Observable> getConcern(@Path("device_id") String device_id); + + @Headers({"Content-Type: application/json", "Accept: application/json"}) + @POST("stat/download") // 统计下载量 + Observable postDownload(@Body RequestBody body); + + @GET("support/package/{package_name}/game/digest") // 根据包名获取游戏摘要 + Observable> getGameDigestByPackageName(@Path("package_name") String package_name); + + @GET("update/package/{package_name}") + Observable getGameUpdate(@Path("package_name") String package_name);// 获取游戏更新 + + @GET("update/game/{gh_id}/package{package_name}") + Observable getGameUpdate(@Path("gh_id") String gh_id, + @Path("package_name") String package_name);// 获取游戏更新 + + @GET("disclaimer") + Observable getDisclaimer(); // 获取免责声明 + + @GET("search/game/default") + Observable> getSearchHints(); // 获取搜索关键字 + + @GET("support/upgrade") + Observable getUpdate(@Query("version") String version, @Query("channel") String channel); // 获取助手更新 + + @GET("news/{news_id}/detail") + Observable getNewsDetail(@Path("news_id") String news_id); // 获取新闻详情 + + @GET("news/{news_id}/digest") + Observable getNewsDigest(@Path("news_id") String news_id); // 获取新闻摘要 + + @GET("news/{news_id}/suggestion") + Observable> getNewsSuggestion(@Path("news_id") String news_id); // 获取新闻相关推荐 + + @GET("skin/gameInfo/{game_id}") + Observable getGameSkin(@Path("game_id") String game_id); // 获取游戏皮肤信息 + + @GET("game/{game_id}/news") + Observable> getGameNews(@Path("game_id") String game_id, @Query("limit") int limit, + @Query("offset") int offset, @Query("type") String type); // 获取游戏新闻 + + @GET("game/{game_id}/news") + Observable> getGameNews(@Path("game_id") String game_id, @Query("limit") int limit, + @Query("offset") int offset); // 获取游戏新闻 + + @GET("game/{game_id}/news") + Observable> getGameNews(@Path("game_id") String game_id, @Query("limit") int limit); // 获取游戏新闻 + + @GET("game/{game_id}/serverInfo") + Observable getGameServer(@Path("game_id") String game_id); // 获取游戏开服信息 + + @GET("support/setting/platform") + Observable> getGamePlatform(); // 获取游戏平台信息 + + @GET("article/{news_id}/rich-digest") + Observable getNewsRichDigest(@Path("news_id") String news_id); // 获取新闻rich摘要 + + @GET("search/news") + Observable> getSearchNews(@Query("game_id") String game_id, @Query("keyword") String keyword, + @Query("page") int page, @Query("limit") int limit); // 搜索新闻 + + @GET("search/game") + Observable> getSearchGame(@Query("keyword") String keyword); // 搜索游戏 + + @GET("index/slides") + Observable> getSlide(); // 获取首页滚动图 + + @GET("game/chajian") + Observable> getChajian(); // 获取游戏插件专题数据 + + @GET("game/tuijian") + Observable> getTuijian(); // 获取游戏推荐专题数据 + + @GET("game/danjiyouxi") + Observable> getDanjiyouxi(@Query("limit") int limit, @Query("offset") int offset); // 获取单机游戏数据 + + @GET("game/column/{column_id}") + Observable> getColumn(@Path("column_id") String column_id, @Query("page") int page); // 获取专题数据 + + @GET("support/setting/ui") + Observable getUISetting(); // 获取界面设置参数 + + @GET("support/download_status") + Observable getDownloadStatus(@Query("version") String version, @Query("channel") String channel); // 获取界面设置参数 + + @Headers({"Content-Type: application/json", "Accept: application/json"}) + @POST("support/suggestion") // 上传意见反馈 + Observable postSuggestion(@Body RequestBody body); + + @GET("support/package/unused") + Observable> getPackageUnused(@Query("skip") long skip); // 获取过滤包名 + } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/ApiServiceImpl.java b/app/src/main/java/com/gh/gamecenter/retrofit/ApiServiceImpl.java deleted file mode 100644 index 09c04111d9..0000000000 --- a/app/src/main/java/com/gh/gamecenter/retrofit/ApiServiceImpl.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.gh.gamecenter.retrofit; - -import com.gh.gamecenter.entity.ConcernEntity; -import com.gh.gamecenter.entity.GameEntity; -import com.gh.gamecenter.entity.NewsEntity; - -import java.util.List; - -import okhttp3.RequestBody; -import okhttp3.ResponseBody; -import rx.Observable; -import rx.Subscriber; -import rx.android.schedulers.AndroidSchedulers; -import rx.schedulers.Schedulers; - -/** - * Created by LGT on 2016/11/9. - * - */ -public class ApiServiceImpl { - - private ApiService apiService; - - public ApiServiceImpl(ApiService apiService) { - this.apiService = apiService; - } - - private void subscribe(Observable observable, Subscriber subscriber) { - observable.subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(subscriber); - } - - public Observable> getGuanZhuByKey(String key, int offset) { - return apiService.getGuanZhuByKey(key, offset); - } - - public Observable> getGuanZhuById(String game_id, int offset) { - return apiService.getGuanZhuById(game_id, offset); - } - - public Observable> getZiXun(int offset) { - return apiService.getZiXun(offset); - } - - public Observable> getYuanChuang(int offset) { - return apiService.getYuanChuang(offset); - } - - public Observable> getNews(String type_group, int limit, int offset) { - return apiService.getNews(type_group, limit, offset); - } - - public void getTime(StringResponse subscriber) { - subscribe(apiService.getTime(), subscriber); - } - - public void getGameDigest(String game_id, Response subscriber) { - subscribe(apiService.getGameDigest(game_id), subscriber); - } - - public Observable> getRemenkapai() { - return apiService.getRemenkapai(); - } - - public void putConcern(String device_id, RequestBody body) { - subscribe(apiService.putConcern(device_id, body), new Response()); - } - -} diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/CommentService.java b/app/src/main/java/com/gh/gamecenter/retrofit/CommentService.java index 9eb8cfff22..0c14fa6a39 100644 --- a/app/src/main/java/com/gh/gamecenter/retrofit/CommentService.java +++ b/app/src/main/java/com/gh/gamecenter/retrofit/CommentService.java @@ -1,19 +1,44 @@ package com.gh.gamecenter.retrofit; +import com.gh.gamecenter.entity.CommentEntity; import com.gh.gamecenter.entity.CommentnumEntity; import java.util.List; +import okhttp3.RequestBody; +import okhttp3.ResponseBody; +import retrofit2.http.Body; import retrofit2.http.GET; +import retrofit2.http.Header; +import retrofit2.http.Headers; +import retrofit2.http.POST; import retrofit2.http.Path; +import retrofit2.http.Query; import rx.Observable; /** * Created by LGT on 2016/11/9. + * comment.ghzhushou.com */ public interface CommentService { @GET("article/{ids}/comment/num") // 获取新闻评论数 Observable> getNewsCommentnum(@Path("ids") String ids); + @Headers({"Content-Type: application/json", "Accept: application/json"}) + @POST("article/{news_id}/comment") // 发布评论 + Observable postNewsComment(@Header("TOKEN") String token, @Path("news_id") String news_id, + @Body RequestBody body); + + @POST("comment/{comment_id}/vote") // 评论点赞 + Observable postCommentVote(@Header("TOKEN") String token, @Path("comment_id") String comment_id); + + @GET("article/{news_id}/comment?order=hot") // 获取新闻评论 + Observable> getHotComment(@Path("news_id") String news_id, @Query("limit") int limit, + @Query("offset") int offset); + + @GET("article/{news_id}/comment") // 获取新闻评论 + Observable> getComment(@Path("news_id") String news_id, @Query("limit") int limit, + @Query("offset") int offset); + } diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/CommentServiceImpl.java b/app/src/main/java/com/gh/gamecenter/retrofit/CommentServiceImpl.java deleted file mode 100644 index 167c8981eb..0000000000 --- a/app/src/main/java/com/gh/gamecenter/retrofit/CommentServiceImpl.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.gh.gamecenter.retrofit; - -import com.gh.gamecenter.entity.CommentnumEntity; - -import java.util.List; - -import rx.Observable; -import rx.Subscriber; -import rx.android.schedulers.AndroidSchedulers; -import rx.schedulers.Schedulers; - -/** - * Created by LGT on 2016/11/9. - */ -public class CommentServiceImpl { - - private CommentService commentService; - - public CommentServiceImpl(CommentService commentService) { - this.commentService = commentService; - } - - private void subscribe(Observable observable, Subscriber subscriber) { - observable.subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(subscriber); - } - - public Observable> getNewsCommentnum(String ids) { - return commentService.getNewsCommentnum(ids); - } - -} diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/DataService.java b/app/src/main/java/com/gh/gamecenter/retrofit/DataService.java index c9a9a6fa42..b5a4bb51f2 100644 --- a/app/src/main/java/com/gh/gamecenter/retrofit/DataService.java +++ b/app/src/main/java/com/gh/gamecenter/retrofit/DataService.java @@ -4,8 +4,11 @@ import com.gh.gamecenter.entity.ViewsEntity; import java.util.List; +import okhttp3.RequestBody; import okhttp3.ResponseBody; +import retrofit2.http.Body; import retrofit2.http.GET; +import retrofit2.http.Headers; import retrofit2.http.POST; import retrofit2.http.Path; import retrofit2.http.Query; @@ -13,6 +16,7 @@ import rx.Observable; /** * Created by LGT on 2016/11/9. + * data.ghzhushou.com */ public interface DataService { @@ -22,4 +26,16 @@ public interface DataService { @POST("news/stat") // 统计新闻阅读量 Observable postNewsViews(@Query("news_id") String news_id); + @Headers({"Content-Type: application/json", "Accept: application/json"}) + @POST("api/v1d0/log") // 上传log + Observable postLog(@Body RequestBody body); + + @Headers({"Content-Type: application/json", "Accept: application/json"}) + @POST("collection/upload2") // 上传实时数据 + Observable postRealData(@Body RequestBody body); + + @Headers({"Content-Type: application/json", "Accept: application/json"}) + @POST("collection/upload") // 上传数据 + Observable postData(@Body RequestBody body); + } diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/DataServiceImpl.java b/app/src/main/java/com/gh/gamecenter/retrofit/DataServiceImpl.java deleted file mode 100644 index c35df6b33e..0000000000 --- a/app/src/main/java/com/gh/gamecenter/retrofit/DataServiceImpl.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.gh.gamecenter.retrofit; - -import com.gh.gamecenter.entity.ViewsEntity; - -import java.util.List; - -import rx.Observable; -import rx.Subscriber; -import rx.android.schedulers.AndroidSchedulers; -import rx.schedulers.Schedulers; - -/** - * Created by LGT on 2016/11/9. - */ -public class DataServiceImpl { - - private DataService dataService; - - public DataServiceImpl(DataService dataService) { - this.dataService = dataService; - } - - private void subscribe(Observable observable, Subscriber subscriber) { - observable.subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(subscriber); - } - - public Observable> getNewsViews(String ids) { - return dataService.getNewsViews(ids); - } - - public void postNewsViews(String news_id, JSONObjectResponse subscriber) { - subscribe(dataService.postNewsViews(news_id), subscriber); - } - -} diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/JSONArrayResponse.java b/app/src/main/java/com/gh/gamecenter/retrofit/JSONArrayResponse.java index a1b2a13ec3..718c6b92fe 100644 --- a/app/src/main/java/com/gh/gamecenter/retrofit/JSONArrayResponse.java +++ b/app/src/main/java/com/gh/gamecenter/retrofit/JSONArrayResponse.java @@ -1,14 +1,12 @@ package com.gh.gamecenter.retrofit; import org.json.JSONArray; -import org.json.JSONException; - -import java.io.IOException; import okhttp3.ResponseBody; /** * Created by LGT on 2016/11/7. + * JSONArray */ public class JSONArrayResponse extends Response { @@ -16,7 +14,7 @@ public class JSONArrayResponse extends Response { public void onResponse(ResponseBody responseBody) { try { onResponse(new JSONArray(responseBody.string())); - } catch (IOException | JSONException e) { + } catch (Exception e) { onError(e); } } diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/JSONObjectResponse.java b/app/src/main/java/com/gh/gamecenter/retrofit/JSONObjectResponse.java index 53da18e21d..513ab71a28 100644 --- a/app/src/main/java/com/gh/gamecenter/retrofit/JSONObjectResponse.java +++ b/app/src/main/java/com/gh/gamecenter/retrofit/JSONObjectResponse.java @@ -1,14 +1,12 @@ package com.gh.gamecenter.retrofit; -import org.json.JSONException; import org.json.JSONObject; -import java.io.IOException; - import okhttp3.ResponseBody; /** * Created by LGT on 2016/11/7. + * JSONObject */ public class JSONObjectResponse extends Response { @@ -16,7 +14,7 @@ public class JSONObjectResponse extends Response { public void onResponse(ResponseBody responseBody) { try { onResponse(new JSONObject(responseBody.string())); - } catch (IOException | JSONException e) { + } catch (Exception e) { onError(e); } } diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/OkHttpCache.java b/app/src/main/java/com/gh/gamecenter/retrofit/OkHttpCache.java new file mode 100644 index 0000000000..9a46543639 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/retrofit/OkHttpCache.java @@ -0,0 +1,76 @@ +package com.gh.gamecenter.retrofit; + +import com.gh.base.AppController; +import com.gh.common.util.FileUtils; +import com.gh.common.util.TimestampUtils; + +import java.io.File; +import java.io.IOException; + +import okhttp3.internal.Util; + +/** + * Created by LGT on 2016/12/5. + * OkHttp 缓存工具 + */ +public class OkHttpCache { + + private static String cachePath; + + public static String getCachePath() { + if (cachePath == null) { + File cacheFile = new File(AppController.getInstance().getApplicationContext().getCacheDir(), "okhttp"); + cachePath = cacheFile.getAbsolutePath(); + } + return cachePath; + } + + // 根据url获取缓存数据 + public static byte[] getCache(String url) { + if (getCachePath() == null || url == null) { + return null; + } + String key = Util.md5Hex(url) + ".1"; + File cacheFile = new File(getCachePath()); + if (cacheFile.isDirectory()) { + for (File file : cacheFile.listFiles()) { + if (file.getName().equals(key)) { + return FileUtils.readFile(file); + } + } + } + return null; + } + + // 根据url保存对应的okhttp的缓存 + public static void putCache(String url, byte[] data) { + if (getCachePath() == null || url == null || data == null) { + return; + } + String key = Util.md5Hex(url) + ".1"; + FileUtils.saveFile(new File(getCachePath(), key), data); + } + + // 根据url修改对应的okhttp的缓存 + public static void updateCache(String url, byte[] data) { + if (getCachePath() == null || url == null || data == null) { + return; + } + try { + String key = Util.md5Hex(url) + ".1"; + File file = new File(getCachePath(), key); + if (file.exists()) { + file.createNewFile(); + } + FileUtils.saveFile(file, data); + // 如果url包含timestamp,去除timestamp更新缓存 + if (url.contains("timestamp")) { + url = TimestampUtils.removeTimestamp(url); + updateCache(url, data); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + +} diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/OkHttpInterceptor.java b/app/src/main/java/com/gh/gamecenter/retrofit/OkHttpInterceptor.java index a20ef18050..6357dd8a41 100644 --- a/app/src/main/java/com/gh/gamecenter/retrofit/OkHttpInterceptor.java +++ b/app/src/main/java/com/gh/gamecenter/retrofit/OkHttpInterceptor.java @@ -4,7 +4,6 @@ import com.gh.base.AppController; import com.gh.common.util.GzipUtils; import com.gh.common.util.NetworkUtils; import com.gh.common.util.TimestampUtils; -import com.gh.common.util.Utils; import java.io.IOException; @@ -17,6 +16,7 @@ import okhttp3.ResponseBody; /** * Created by LGT on 2016/11/8. + * */ public class OkHttpInterceptor implements Interceptor { @@ -39,15 +39,15 @@ public class OkHttpInterceptor implements Interceptor { } // log 打印 - Utils.log(String.format("Interceptor Sending request %s on %s%n%s", - request.url(), chain.connection(), request.headers())); +// Utils.log(String.format("Interceptor Sending request %s on %s%n%s", +// request.url(), chain.connection(), request.headers())); Response response = chain.proceed(request); // 去除timestamp拿缓存 url = response.request().url().toString(); if (response.code() == 504 && url.contains("timestamp")) { - byte[] data = RetrofitManager.getInstance().getCache(TimestampUtils.removeTimestamp(url)); + byte[] data = OkHttpCache.getCache(TimestampUtils.removeTimestamp(url)); if (data != null) { data = GzipUtils.decompressBytes(data); response = response.newBuilder() @@ -59,8 +59,8 @@ public class OkHttpInterceptor implements Interceptor { } // log 打印 - Utils.log(String.format("Interceptor Received response for %s in %n%s", - response.request().url(), response.headers())); +// Utils.log(String.format("Interceptor Received response for %s in %n%s", +// response.request().url(), response.headers())); return response; } diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/OkHttpNetworkInterceptor.java b/app/src/main/java/com/gh/gamecenter/retrofit/OkHttpNetworkInterceptor.java index a9e4f9e1a4..3eb04a791e 100644 --- a/app/src/main/java/com/gh/gamecenter/retrofit/OkHttpNetworkInterceptor.java +++ b/app/src/main/java/com/gh/gamecenter/retrofit/OkHttpNetworkInterceptor.java @@ -4,7 +4,6 @@ import com.gh.base.AppController; import com.gh.common.util.GzipUtils; import com.gh.common.util.NetworkUtils; import com.gh.common.util.TimestampUtils; -import com.gh.common.util.Utils; import java.io.IOException; @@ -18,6 +17,7 @@ import okio.BufferedSource; /** * Created by LGT on 2016/11/8. + * */ public class OkHttpNetworkInterceptor implements Interceptor { @@ -33,8 +33,8 @@ public class OkHttpNetworkInterceptor implements Interceptor { // .build(); // log 打印 - Utils.log(String.format("Interceptor Network Sending request %s on %s%n%s", - request.url(), chain.connection(), request.headers())); +// Utils.log(String.format("Interceptor Network Sending request %s on %s%n%s", +// request.url(), chain.connection(), request.headers())); Response response = chain.proceed(request); @@ -65,13 +65,13 @@ public class OkHttpNetworkInterceptor implements Interceptor { // 如果url包含timestamp,去除timestamp再存一份缓存 String url = response.request().url().toString(); if (response.code() == 200 && url.contains("timestamp")) { - RetrofitManager.getInstance().putCache(TimestampUtils.removeTimestamp(url), + OkHttpCache.putCache(TimestampUtils.removeTimestamp(url), response.peekBody(Integer.MAX_VALUE - 1).bytes()); } // log 打印 - Utils.log(String.format("Interceptor Network Received response for %s in %n%s", - response.request().url(), response.headers())); +// Utils.log(String.format("Interceptor Network Received response for %s in %n%s", +// response.request().url(), response.headers())); return response; } diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/Response.java b/app/src/main/java/com/gh/gamecenter/retrofit/Response.java index 731fcac211..98e25589a4 100644 --- a/app/src/main/java/com/gh/gamecenter/retrofit/Response.java +++ b/app/src/main/java/com/gh/gamecenter/retrofit/Response.java @@ -4,6 +4,7 @@ import rx.Subscriber; /** * Created by LGT on 2016/11/7. + * Response */ public class Response extends Subscriber { diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/RetrofitManager.java b/app/src/main/java/com/gh/gamecenter/retrofit/RetrofitManager.java index eabe52ef26..a211c193b5 100644 --- a/app/src/main/java/com/gh/gamecenter/retrofit/RetrofitManager.java +++ b/app/src/main/java/com/gh/gamecenter/retrofit/RetrofitManager.java @@ -1,22 +1,19 @@ package com.gh.gamecenter.retrofit; -import com.gh.base.AppController; import com.gh.common.constant.Config; -import com.gh.common.util.FileUtils; import java.io.File; -import java.io.IOException; import java.util.concurrent.TimeUnit; import okhttp3.Cache; import okhttp3.OkHttpClient; -import okhttp3.internal.Util; import retrofit2.Retrofit; import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; /** * Created by LGT on 2016/11/7. + * Retrofit 管理工具 */ public class RetrofitManager { @@ -33,114 +30,83 @@ public class RetrofitManager { return mInstance; } - public static ApiServiceImpl getApi() { - return getInstance().getApiServiceImpl(); + public static ApiService getApi() { + return getInstance().getApiService(); } - public static DataServiceImpl getData() { - return getInstance().getDataServiceImpl(); + public static DataService getData() { + return getInstance().getDataService(); } - public static CommentServiceImpl getComment() { - return getInstance().getCommentServiceImpl(); + public static CommentService getComment() { + return getInstance().getCommentService(); } - private ApiServiceImpl apiServiceImpl; - private DataServiceImpl dataServiceImpl; - private CommentServiceImpl commentServiceImpl; - private String cachePath; + public static UserService getUser() { + return getInstance().getUserService(); + } + + private ApiService apiService; + private DataService dataService; + private CommentService commentService; + private UserService userService; private RetrofitManager() { - File cacheFile = new File(AppController.getInstance().getApplicationContext().getCacheDir(), "okhttp"); - cachePath = cacheFile.getPath(); - Cache cache = new Cache(cacheFile, 10 * 1024 * 1024); // 10Mb + Cache cache = new Cache(new File(OkHttpCache.getCachePath()), 10 * 1024 * 1024); // 10Mb OkHttpClient okHttpClient = new OkHttpClient.Builder() .addNetworkInterceptor(new OkHttpNetworkInterceptor()) .addInterceptor(new OkHttpInterceptor()) .connectTimeout(5, TimeUnit.SECONDS) .cache(cache) .build(); - ApiService apiService = new Retrofit.Builder() + + apiService = new Retrofit.Builder() .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .baseUrl(Config.HOST) .build() .create(ApiService.class); - this.apiServiceImpl = new ApiServiceImpl(apiService); - DataService dataService = new Retrofit.Builder() + dataService = new Retrofit.Builder() .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .baseUrl(Config.DATA_HOST) .build() .create(DataService.class); - this.dataServiceImpl = new DataServiceImpl(dataService); - CommentService commentService = new Retrofit.Builder() + commentService = new Retrofit.Builder() .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .baseUrl(Config.COMMENT_HOST) .build() .create(CommentService.class); - this.commentServiceImpl = new CommentServiceImpl(commentService); + + userService = new Retrofit.Builder() + .client(okHttpClient) + .addConverterFactory(GsonConverterFactory.create()) + .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) + .baseUrl(Config.USER_HOST) + .build() + .create(UserService.class); } - public ApiServiceImpl getApiServiceImpl() { - return apiServiceImpl; + public ApiService getApiService() { + return apiService; } - public DataServiceImpl getDataServiceImpl() { - return dataServiceImpl; + public DataService getDataService() { + return dataService; } - public CommentServiceImpl getCommentServiceImpl() { - return commentServiceImpl; + public CommentService getCommentService() { + return commentService; } - // 根据url获取缓存数据 - public byte[] getCache(String url) { - if (cachePath == null || url == null) { - return null; - } - String key = Util.md5Hex(url) + ".1"; - File cacheFile = new File(cachePath); - if (cacheFile.isDirectory()) { - for (File file : cacheFile.listFiles()) { - if (file.getName().equals(key)) { - return FileUtils.readFile(file); - } - } - } - return null; - } - - // 根据url保存对应的okhttp的缓存 - public void putCache(String url, byte[] data) { - if (cachePath == null || url == null || data == null) { - return; - } - String key = Util.md5Hex(url) + ".1"; - FileUtils.saveFile(new File(cachePath, key), data); - } - - // 根据url修改对应的okhttp的缓存 - public void updateCache(String url, byte[] data) { - if (cachePath == null || url == null || data == null) { - return; - } - try { - String key = Util.md5Hex(url) + ".1"; - File file = new File(cachePath, key); - if (file.exists()) { - file.createNewFile(); - } - FileUtils.saveFile(file, data); - } catch (IOException e) { - e.printStackTrace(); - } + public UserService getUserService() { + return userService; } } diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/StringResponse.java b/app/src/main/java/com/gh/gamecenter/retrofit/StringResponse.java index c350ce949a..d6c545d146 100644 --- a/app/src/main/java/com/gh/gamecenter/retrofit/StringResponse.java +++ b/app/src/main/java/com/gh/gamecenter/retrofit/StringResponse.java @@ -6,6 +6,7 @@ import okhttp3.ResponseBody; /** * Created by LGT on 2016/11/7. + * String */ public class StringResponse extends Response { diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/UserService.java b/app/src/main/java/com/gh/gamecenter/retrofit/UserService.java new file mode 100644 index 0000000000..0ba22430ce --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/retrofit/UserService.java @@ -0,0 +1,27 @@ +package com.gh.gamecenter.retrofit; + +import okhttp3.RequestBody; +import okhttp3.ResponseBody; +import retrofit2.http.Body; +import retrofit2.http.Header; +import retrofit2.http.Headers; +import retrofit2.http.POST; +import retrofit2.http.Path; +import rx.Observable; + +/** + * Created by LGT on 2016/12/5. + * user.ghzhushou.com + */ +public interface UserService { + + @Headers({"Content-Type: application/json", "Accept: application/json"}) + @POST("name") + Observable postName(@Header("TOKEN") String token, @Body RequestBody body); // 修改昵称 + + @Headers({"Content-Type: application/json", "Accept: application/json"}) + @POST("device/{device_id}") + Observable postDevice(@Header("TOKEN") String token, @Body RequestBody body, + @Path("device_id") String device_id); // 修改设备信息 + +} diff --git a/app/src/main/java/com/gh/gamecenter/search/SearchGameDetailFragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/search/SearchGameDetailFragmentAdapter.java index 788641e9ed..d1532a0d0f 100644 --- a/app/src/main/java/com/gh/gamecenter/search/SearchGameDetailFragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/search/SearchGameDetailFragmentAdapter.java @@ -1,7 +1,6 @@ package com.gh.gamecenter.search; import android.content.Context; -import android.net.Uri; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.view.LayoutInflater; @@ -10,9 +9,6 @@ import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.inputmethod.InputMethodManager; -import com.android.volley.Response; -import com.android.volley.VolleyError; -import com.gh.base.AppController; import com.gh.common.constant.Config; import com.gh.common.util.DataUtils; import com.gh.common.util.DisplayUtils; @@ -25,18 +21,17 @@ import com.gh.gamecenter.adapter.viewholder.GameNormalViewHolder; import com.gh.gamecenter.entity.GameEntity; import com.gh.gamecenter.listener.OnCallBackListener; import com.gh.gamecenter.manager.DataCollectionManager; -import com.gh.gamecenter.volley.extended.JsonArrayExtendedRequest; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; +import com.gh.gamecenter.retrofit.Response; +import com.gh.gamecenter.retrofit.RetrofitManager; -import org.json.JSONArray; - -import java.lang.reflect.Type; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + public class SearchGameDetailFragmentAdapter extends RecyclerView.Adapter { private Context context; @@ -63,19 +58,17 @@ public class SearchGameDetailFragmentAdapter extends RecyclerView.Adapter mParams; - protected Map mHeaders; - - private String mUserAgent; - private boolean mGzipEnabled = true; - - protected final Response.Listener mSuccessListener; - - public ExtendedRequest(int method, - String url, - Response.Listener successListener, - Response.ErrorListener errorListener) { - super(method, TimestampUtils.addTimestamp(url), errorListener); - setTimeout(TIMEOUT); - mSuccessListener = successListener; - } - - @Override - protected void deliverResponse(T response) { - if (mSuccessListener != null) { - mSuccessListener.onResponse(response); - } - } - - @Override - abstract protected Response parseNetworkResponse(NetworkResponse response); - - protected String getResponseString(NetworkResponse response) throws UnsupportedEncodingException { - String responseString = null; - String charset = HttpHeaderParser.parseCharset(response.headers); - - if (HttpURLConnection.HTTP_NOT_MODIFIED == response.statusCode - || (mGzipEnabled && isGzipped(response.headers)) - || HttpURLConnection.HTTP_OK == response.statusCode) { - try { - byte[] data = GzipUtils.decompressBytes(response.data); - responseString = new String(data, charset); - } catch (IOException e) { - e.printStackTrace(); - } - } - - if (responseString == null) { - responseString = new String(response.data, charset); - } - - return responseString; - } - - private boolean isGzipped(Map headers) { - return headers != null - && !headers.isEmpty() - && headers.containsKey(HEADER_ENCODING) - && headers.get(HEADER_ENCODING).equalsIgnoreCase(ENCODING_GZIP); - } - - /** - * Sets parameters map - * - * @param params Parameters map - */ - public void setParams(Map params) { - mParams = params; - } - - /** - * Adds POST parameter - * - * @param key Parameter name - * @param value Parameter value - */ - public void addParam(String key, String value) { - if (mParams == null) { - mParams = new HashMap(); - } - mParams.put(key, value); - } - - public void addHeader(String key, String value) { - if (mHeaders == null) { - mHeaders = new HashMap(); - } - mHeaders.put(key, value); - } - - @Override - protected Map getParams() throws AuthFailureError { - return mParams; - } - - @Override - public Map getHeaders() throws AuthFailureError { - if (mHeaders == null) { - mHeaders = new HashMap(); - } - - // add user agent header - if (TextUtils.isEmpty(mUserAgent)) { - mHeaders.put(HEADER_USER_AGENT, mUserAgent); - } - - // add gzip header - if (mGzipEnabled) { - mHeaders.put(HEADER_ACCEPT_ENCODING, ENCODING_GZIP); - Utils.log(ExtendedRequest.class.getSimpleName(), - "using gzip-------------------"); - } else { - Utils.log(ExtendedRequest.class.getSimpleName(), - "not use gzip-------------------"); - } - - return mHeaders; - } - - /** - * Sets user agent to specify in request header - * - * @param userAgent - * User agent string - */ - public void setUserAgent(String userAgent) { - mUserAgent = userAgent; - } - - /** Disables GZIP compressing (enabled by default) */ - public void disableGzip() { - mGzipEnabled = false; - } - - public boolean isSetGzip() { - return mGzipEnabled; - } - - /** - * Sets request timeout - * - * @param timeout Timeout in seconds - */ - public void setTimeout(int timeout) { - setRetryPolicy(new DefaultRetryPolicy(timeout, - DefaultRetryPolicy.DEFAULT_MAX_RETRIES, - DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/volley/extended/JsonArrayExtendedRequest.java b/app/src/main/java/com/gh/gamecenter/volley/extended/JsonArrayExtendedRequest.java deleted file mode 100644 index 03a551250e..0000000000 --- a/app/src/main/java/com/gh/gamecenter/volley/extended/JsonArrayExtendedRequest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.gh.gamecenter.volley.extended; - -import com.android.volley.NetworkResponse; -import com.android.volley.ParseError; -import com.android.volley.Response; -import com.android.volley.Response.ErrorListener; -import com.android.volley.Response.Listener; -import com.android.volley.toolbox.HttpHeaderParser; -import com.gh.common.util.Utils; - -import org.json.JSONArray; -import org.json.JSONException; - -import java.io.UnsupportedEncodingException; - -/** - * - * @author 温冠超 - * @email 294299195@qq.com - * @date 2015-7-31 - */ -public class JsonArrayExtendedRequest extends JsonExtendedRequest { - - private String url; - - public JsonArrayExtendedRequest(String url, - Response.Listener listener, ErrorListener errorListener) { - super(Method.GET, url, null, listener, errorListener); - this.url = url; - } - - public JsonArrayExtendedRequest(int method, String url, - JSONArray jsonRequest, Listener listener, - ErrorListener errorListener) { - super(method, url, (jsonRequest == null) ? null : jsonRequest - .toString(), listener, errorListener); - this.url = url; - } - - @Override - protected Response parseNetworkResponse(NetworkResponse response) { - Utils.log(url + " = " + response.statusCode); - try { - String jsonString = getResponseString(response); - return Response.success(new JSONArray(jsonString), - HttpHeaderParser.parseCacheHeaders(response)); - } catch (UnsupportedEncodingException e) { - return Response.error(new ParseError(e)); - } catch (JSONException je) { - return Response.error(new ParseError(je)); - } - } - -} diff --git a/app/src/main/java/com/gh/gamecenter/volley/extended/JsonExtendedRequest.java b/app/src/main/java/com/gh/gamecenter/volley/extended/JsonExtendedRequest.java deleted file mode 100644 index dd5e9fa58c..0000000000 --- a/app/src/main/java/com/gh/gamecenter/volley/extended/JsonExtendedRequest.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.gh.gamecenter.volley.extended; - -import com.android.volley.NetworkResponse; -import com.android.volley.Response; -import com.android.volley.Response.ErrorListener; -import com.android.volley.Response.Listener; -import com.android.volley.VolleyLog; - -import java.io.UnsupportedEncodingException; - -/** - * - * @author 温冠超 - * @email 294299195@qq.com - * @date 2015-7-31 - * @param - */ -public abstract class JsonExtendedRequest extends ExtendedRequest { - - /** Default charset for JSON request. */ - protected static final String PROTOCOL_CHARSET = "utf-8"; - - /** Content type for request. */ - private static final String PROTOCOL_CONTENT_TYPE = String.format( - "application/json; charset=%s", PROTOCOL_CHARSET); - - private final Listener mListener; - private final String mRequestBody; - - public JsonExtendedRequest(int method, String url, String requestBody, - Response.Listener listener, ErrorListener errorListener) { - super(method, url, listener, errorListener); - mListener = listener; - mRequestBody = requestBody; - } - - @Override - protected void deliverResponse(T response) { - if (mListener != null) { - mListener.onResponse(response); - } - } - - @Override - abstract protected Response parseNetworkResponse(NetworkResponse response); - - @Override - public String getBodyContentType() { - return PROTOCOL_CONTENT_TYPE; - } - - @Override - public byte[] getBody() { - try { - return mRequestBody == null ? null : mRequestBody - .getBytes(PROTOCOL_CHARSET); - } catch (UnsupportedEncodingException uee) { - VolleyLog - .wtf("Unsupported Encoding while trying to get the bytes of %s using %s", - mRequestBody, PROTOCOL_CHARSET); - return null; - } - } - -} diff --git a/app/src/main/java/com/gh/gamecenter/volley/extended/JsonObjectExtendedRequest.java b/app/src/main/java/com/gh/gamecenter/volley/extended/JsonObjectExtendedRequest.java deleted file mode 100644 index 832fc86b7d..0000000000 --- a/app/src/main/java/com/gh/gamecenter/volley/extended/JsonObjectExtendedRequest.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.gh.gamecenter.volley.extended; - -import com.android.volley.NetworkResponse; -import com.android.volley.ParseError; -import com.android.volley.Response; -import com.android.volley.Response.ErrorListener; -import com.android.volley.toolbox.HttpHeaderParser; -import com.gh.common.util.Utils; - -import org.json.JSONException; -import org.json.JSONObject; - -import java.io.UnsupportedEncodingException; - -/** - * - * @author 温冠超 - * @email 294299195@qq.com - * @date 2015-7-31 - */ -public class JsonObjectExtendedRequest extends JsonExtendedRequest { - - private String url; - - public JsonObjectExtendedRequest(String url, - Response.Listener listener, ErrorListener errorListener) { - super(Method.GET, url, null, listener, errorListener); - this.url = url; - } - - public JsonObjectExtendedRequest(int method, String url, - Response.Listener listener, ErrorListener errorListener) { - super(method, url, null, listener, errorListener); - this.url = url; - } - - public JsonObjectExtendedRequest(int method, String url, - String requestBody, Response.Listener listener, - ErrorListener errorListener) { - super(method, url, requestBody, listener, errorListener); - this.url = url; - } - - @Override - protected Response parseNetworkResponse(NetworkResponse response) { - Utils.log(url + " = " + response.statusCode); - try { - String jsonString = getResponseString(response); - return Response.success(new JSONObject(jsonString), - HttpHeaderParser.parseCacheHeaders(response)); - } catch (UnsupportedEncodingException e) { - return Response.error(new ParseError(e)); - } catch (JSONException je) { - return Response.error(new ParseError(je)); - } - } -} diff --git a/app/src/main/java/com/gh/gamecenter/volley/extended/StringExtendedRequest.java b/app/src/main/java/com/gh/gamecenter/volley/extended/StringExtendedRequest.java deleted file mode 100644 index cbce6725c5..0000000000 --- a/app/src/main/java/com/gh/gamecenter/volley/extended/StringExtendedRequest.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.gh.gamecenter.volley.extended; - -import com.android.volley.AuthFailureError; -import com.android.volley.NetworkResponse; -import com.android.volley.Response; -import com.android.volley.toolbox.HttpHeaderParser; -import com.gh.common.util.Utils; - -import java.io.UnsupportedEncodingException; - -/** - * - * @author 温冠超 - * @email 294299195@qq.com - * @date 2015-7-31 - */ -public class StringExtendedRequest extends ExtendedRequest { - - /** Default charset for JSON request. */ - protected static final String PROTOCOL_CHARSET = "utf-8"; - - private String url; - private String body; - - public StringExtendedRequest(int method, String url, String body, - Response.Listener successListener, - Response.ErrorListener errorListener) { - super(method, url, successListener, errorListener); - this.url = url; - this.body = body; - } - - public StringExtendedRequest(int method, String url, - Response.Listener successListener, - Response.ErrorListener errorListener) { - super(method, url, successListener, errorListener); - this.url = url; - } - - @Override - protected Response parseNetworkResponse(NetworkResponse response) { - Utils.log(url + " = " + response.statusCode); - String parsed; - try { - parsed = getResponseString(response); - } catch (UnsupportedEncodingException e) { - parsed = new String(response.data); - } - return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response)); - } - - @Override - public byte[] getBody() throws AuthFailureError { - if (body == null) { - return super.getBody(); - } else { - try { - return body.getBytes(PROTOCOL_CHARSET); - } catch (UnsupportedEncodingException uee) { - return null; - } - } - } - -}