diff --git a/twidere.component.common/build.gradle b/twidere.component.common/build.gradle index 41c053e6e..774f0ff70 100644 --- a/twidere.component.common/build.gradle +++ b/twidere.component.common/build.gradle @@ -39,11 +39,11 @@ android { dependencies { apt 'com.bluelinelabs:logansquare-compiler:1.1.0' apt 'com.hannesdorfmann.parcelableplease:processor:1.0.1' - compile 'com.android.support:support-annotations:22.1.1' - compile 'com.android.support:support-v4:22.1.1' + compile 'com.android.support:support-annotations:22.2.0' + compile 'com.android.support:support-v4:22.2.0' compile 'com.bluelinelabs:logansquare:1.1.0' compile 'org.apache.commons:commons-lang3:3.4' - compile 'com.github.mariotaku:RestFu:6ef0913' + compile 'com.github.mariotaku:RestFu:c8bd230561' compile 'com.hannesdorfmann.parcelableplease:annotation:1.0.1' compile project(':twidere.component.querybuilder') compile fileTree(dir: 'libs', include: ['*.jar']) diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/SignInActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/SignInActivity.java index e63a633b9..7a528a0fc 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/SignInActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/SignInActivity.java @@ -740,8 +740,14 @@ public class SignInActivity extends BaseAppCompatActivity implements OnClickList } private SignInResponse authxAuth() throws TwitterException { - final String versionSuffix = noVersionSuffix ? null : "1.1"; - final Endpoint endpoint = new Endpoint(TwitterAPIFactory.getApiUrl(apiUrlFormat, "api", versionSuffix)); + String endpointUrl, signEndpointUrl; + endpointUrl = TwitterAPIFactory.getApiUrl(apiUrlFormat, "api", null); + if (!sameOAuthSigningUrl) { + signEndpointUrl = TwitterAPIFactory.getApiUrl(DEFAULT_TWITTER_API_URL_FORMAT, "api", null); + } else { + signEndpointUrl = endpointUrl; + } + Endpoint endpoint = new OAuthEndpoint(endpointUrl, signEndpointUrl); OAuthAuthorization auth = new OAuthAuthorization(consumerKey.getOauthToken(), consumerKey.getOauthTokenSecret()); final TwitterOAuth oauth = TwitterAPIFactory.getInstance(context, endpoint, auth, TwitterOAuth.class); final OAuthToken accessToken = oauth.getAccessToken(username, password, TwitterOAuth.XAuthMode.CLIENT); diff --git a/twidere/src/main/java/org/mariotaku/twidere/service/BackgroundOperationService.java b/twidere/src/main/java/org/mariotaku/twidere/service/BackgroundOperationService.java index 50b42279e..ba41c54c6 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/service/BackgroundOperationService.java +++ b/twidere/src/main/java/org/mariotaku/twidere/service/BackgroundOperationService.java @@ -36,6 +36,7 @@ import android.os.Handler; import android.os.Parcelable; import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationCompat.Builder; +import android.text.TextUtils; import android.util.Log; import android.widget.Toast; @@ -50,6 +51,13 @@ import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.R; import org.mariotaku.twidere.activity.MainActivity; import org.mariotaku.twidere.activity.MainHondaJOJOActivity; +import org.mariotaku.twidere.api.twitter.Twitter; +import org.mariotaku.twidere.api.twitter.TwitterException; +import org.mariotaku.twidere.api.twitter.TwitterUpload; +import org.mariotaku.twidere.api.twitter.model.MediaUploadResponse; +import org.mariotaku.twidere.api.twitter.model.Status; +import org.mariotaku.twidere.api.twitter.model.StatusUpdate; +import org.mariotaku.twidere.api.twitter.model.UserMentionEntity; import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.model.MediaUploadResult; import org.mariotaku.twidere.model.ParcelableAccount; @@ -90,13 +98,6 @@ import java.util.List; import edu.tsinghua.spice.Utilies.SpiceProfilingUtil; import edu.tsinghua.spice.Utilies.TypeMappingUtil; -import org.mariotaku.twidere.api.twitter.model.MediaUploadResponse; -import org.mariotaku.twidere.api.twitter.model.Status; -import org.mariotaku.twidere.api.twitter.model.StatusUpdate; -import org.mariotaku.twidere.api.twitter.Twitter; -import org.mariotaku.twidere.api.twitter.TwitterException; -import org.mariotaku.twidere.api.twitter.model.UserMentionEntity; -import org.mariotaku.twidere.api.twitter.TwitterUpload; import static android.text.TextUtils.isEmpty; import static org.mariotaku.twidere.util.ContentValuesCreator.createMessageDraft; @@ -543,8 +544,13 @@ public class BackgroundOperationService extends IntentService implements Constan is = new ContentLengthInputStream(file); is.setReadListener(new StatusMediaUploadListener(this, mNotificationManager, builder, statusUpdate)); - final MediaUploadResponse uploadResp = upload.uploadMedia( - new FileTypedData(is, file.getName(), file.length(), ContentType.parse(o.outMimeType))); + final ContentType contentType; + if (TextUtils.isEmpty(o.outMimeType)) { + contentType = ContentType.parse("image/*"); + } else { + contentType = ContentType.parse(o.outMimeType); + } + final MediaUploadResponse uploadResp = upload.uploadMedia(new FileTypedData(is, file.getName(), file.length(), contentType)); mediaIds[i] = uploadResp.getId(); } } catch (final FileNotFoundException e) { diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/TwitterAPIFactory.java b/twidere/src/main/java/org/mariotaku/twidere/util/TwitterAPIFactory.java index ebd256e1c..da3956831 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/TwitterAPIFactory.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/TwitterAPIFactory.java @@ -367,7 +367,12 @@ public class TwitterAPIFactory implements TwidereConstants { public static class TwidereExceptionFactory implements ExceptionFactory { @Override public Exception newException(Throwable cause, RestHttpRequest request, RestHttpResponse response) { - final TwitterException te = new TwitterException(cause); + final TwitterException te; + if (cause != null) { + te = new TwitterException(cause); + } else { + te = new TwitterException(); + } te.setResponse(response); return te; } diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/net/OkHttpRestClient.java b/twidere/src/main/java/org/mariotaku/twidere/util/net/OkHttpRestClient.java index cb516dfef..32876de2d 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/net/OkHttpRestClient.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/net/OkHttpRestClient.java @@ -19,11 +19,13 @@ package org.mariotaku.twidere.util.net; +import android.os.Looper; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.Pair; import com.squareup.okhttp.Call; +import com.squareup.okhttp.Callback; import com.squareup.okhttp.Headers; import com.squareup.okhttp.MediaType; import com.squareup.okhttp.OkHttpClient; @@ -34,9 +36,11 @@ import com.squareup.okhttp.ResponseBody; import org.mariotaku.restfu.Utils; import org.mariotaku.restfu.http.ContentType; +import org.mariotaku.restfu.http.RestHttpCallback; import org.mariotaku.restfu.http.RestHttpClient; import org.mariotaku.restfu.http.RestHttpRequest; import org.mariotaku.restfu.http.RestHttpResponse; +import org.mariotaku.restfu.http.RestQueuedRequest; import org.mariotaku.restfu.http.mime.TypedData; import org.mariotaku.twidere.util.DebugModeUtils; @@ -67,6 +71,11 @@ public class OkHttpRestClient implements RestHttpClient { @NonNull @Override public RestHttpResponse execute(RestHttpRequest restHttpRequest) throws IOException { + final Call call = newCall(restHttpRequest); + return new OkRestHttpResponse(call.execute()); + } + + private Call newCall(final RestHttpRequest restHttpRequest) { final Request.Builder builder = new Request.Builder(); builder.method(restHttpRequest.getMethod(), RestToOkBody.wrap(restHttpRequest.getBody())); builder.url(restHttpRequest.getUrl()); @@ -76,8 +85,32 @@ public class OkHttpRestClient implements RestHttpClient { builder.addHeader(header.first, header.second); } } - final Call call = client.newCall(builder.build()); - return new OkRestHttpResponse(call.execute()); + return client.newCall(builder.build()); + } + + @Override + public RestQueuedRequest enqueue(final RestHttpRequest request, final RestHttpCallback callback) { + final Call call = newCall(request); + call.enqueue(new Callback() { + @Override + public void onFailure(final Request request, final IOException e) { + if (call.isCanceled()) { + callback.cancelled(); + return; + } + callback.exception(e); + } + + @Override + public void onResponse(final Response response) throws IOException { + if (call.isCanceled()) { + callback.cancelled(); + return; + } + callback.callback(new OkRestHttpResponse(response)); + } + }); + return new OkHttpQueuedRequest(client, call); } private static class RestToOkBody extends RequestBody { @@ -196,4 +229,35 @@ public class OkHttpRestClient implements RestHttpClient { body.close(); } } + + private static class OkHttpQueuedRequest implements RestQueuedRequest { + private final OkHttpClient client; + private final Call call; + private boolean cancelled; + + public OkHttpQueuedRequest(final OkHttpClient client, final Call call) { + this.client = client; + this.call = call; + } + + @Override + public boolean isCancelled() { + return cancelled || call.isCanceled(); + } + + @Override + public void cancel() { + cancelled = true; + if (Looper.myLooper() != Looper.getMainLooper()) { + call.cancel(); + } else { + client.getDispatcher().getExecutorService().execute(new Runnable() { + @Override + public void run() { + call.cancel(); + } + }); + } + } + } }