From 73619da1fbf38d367ea97ba8bd8ce5aa2c96705c Mon Sep 17 00:00:00 2001 From: Mariotaku Lee Date: Tue, 26 May 2015 19:19:03 +0800 Subject: [PATCH] migrated to RestFu re-added streaming implementation --- build.gradle | 1 + gradle/wrapper/gradle-wrapper.properties | 2 +- settings.gradle | 1 + twidere.component.common/build.gradle | 8 +- .../mariotaku/simplerestapi/Converter.java | 14 - .../simplerestapi/ErrorCallback.java | 9 - .../mariotaku/simplerestapi/FileValue.java | 30 -- .../mariotaku/simplerestapi/RawCallback.java | 13 - .../mariotaku/simplerestapi/RequestInfo.java | 116 ------ .../simplerestapi/RestAPIFactory.java | 188 ---------- .../mariotaku/simplerestapi/RestCallback.java | 9 - .../mariotaku/simplerestapi/RestClient.java | 19 - .../simplerestapi/RestException.java | 40 --- .../mariotaku/simplerestapi/RestMethod.java | 18 - .../simplerestapi/RestMethodInfo.java | 339 ------------------ .../org/mariotaku/simplerestapi/Utils.java | 178 --------- .../simplerestapi/http/Authorization.java | 31 -- .../simplerestapi/http/BodyType.java | 8 - .../simplerestapi/http/ContentType.java | 122 ------- .../simplerestapi/http/Endpoint.java | 73 ---- .../simplerestapi/http/RestHttpClient.java | 15 - .../simplerestapi/http/RestHttpRequest.java | 120 ------- .../simplerestapi/http/RestHttpResponse.java | 53 --- .../simplerestapi/http/SimpleValueMap.java | 62 ---- .../simplerestapi/http/ValueMap.java | 14 - .../http/mime/BaseTypedData.java | 95 ----- .../http/mime/FileTypedData.java | 103 ------ .../http/mime/FormTypedBody.java | 79 ---- .../http/mime/MultipartTypedBody.java | 142 -------- .../http/mime/StringTypedData.java | 80 ----- .../simplerestapi/http/mime/TypedData.java | 29 -- .../io/StreamingGZIPInputStream.java | 29 -- .../mariotaku/simplerestapi/method/GET.java | 20 -- .../mariotaku/simplerestapi/method/POST.java | 20 -- .../mariotaku/simplerestapi/param/Body.java | 19 - .../mariotaku/simplerestapi/param/Extra.java | 15 - .../mariotaku/simplerestapi/param/File.java | 17 - .../mariotaku/simplerestapi/param/Form.java | 17 - .../mariotaku/simplerestapi/param/Header.java | 16 - .../mariotaku/simplerestapi/param/Part.java | 16 - .../mariotaku/simplerestapi/param/Path.java | 17 - .../mariotaku/simplerestapi/param/Query.java | 16 - .../twidere/api/twitter/TwitterException.java | 14 +- .../twidere/api/twitter/TwitterOAuth.java | 10 +- .../twidere/api/twitter/TwitterUpload.java | 11 +- .../api/twitter/TwitterUserStream.java | 32 ++ .../api/twitter/UserStreamCallback.java | 185 ++++++++++ .../twitter/api/DirectMessagesResources.java | 12 +- .../api/twitter/api/FavoritesResources.java | 15 +- .../api/FriendsFollowersResources.java | 12 +- .../api/twitter/api/HelpResources.java | 2 +- .../api/twitter/api/ListsResources.java | 12 +- .../twitter/api/PrivateActivityResources.java | 4 +- .../api/PrivateDirectMessagesResources.java | 8 +- .../api/PrivateTimelinesResources.java | 4 +- .../twitter/api/PrivateTweetResources.java | 6 +- .../twitter/api/SavedSearchesResources.java | 12 +- .../api/twitter/api/SearchResource.java | 7 +- .../twitter/api/SpamReportingResources.java | 8 +- .../api/twitter/api/TimelinesResources.java | 4 +- .../api/twitter/api/TrendsResources.java | 4 +- .../api/twitter/api/TweetResources.java | 14 +- .../api/twitter/api/UsersResources.java | 16 +- .../api/twitter/auth/BasicAuthorization.java | 8 +- .../api/twitter/auth/EmptyAuthorization.java | 8 +- .../api/twitter/auth/OAuthAuthorization.java | 10 +- .../api/twitter/auth/OAuthEndpoint.java | 2 +- .../twidere/api/twitter/auth/OAuthToken.java | 17 +- .../api/twitter/model/FriendshipUpdate.java | 2 +- .../api/twitter/model/GeoLocation.java | 2 +- .../twidere/api/twitter/model/GeoQuery.java | 2 +- .../twidere/api/twitter/model/Paging.java | 2 +- .../api/twitter/model/ProfileUpdate.java | 2 +- .../api/twitter/model/SearchQuery.java | 2 +- .../api/twitter/model/SettingsUpdate.java | 2 +- .../twitter/model/StatusDeletionNotice.java | 27 ++ .../api/twitter/model/StatusUpdate.java | 4 +- .../api/twitter/model/TwitterResponse.java | 2 +- .../api/twitter/model/UserListUpdate.java | 2 +- .../twidere/api/twitter/model/Warning.java | 26 ++ .../twitter/model/impl/CardEntityImpl.java | 2 +- .../model/impl/RateLimitStatusJSONImpl.java | 2 +- .../twitter/model/impl/ResponseListImpl.java | 2 +- .../model/impl/StatusDeletionNoticeImpl.java | 23 +- .../model/impl/TwitterResponseImpl.java | 2 +- .../api/twitter/model/impl/WarningImpl.java | 31 ++ .../api/twitter/util/CRLFLineReader.java | 79 ++++ .../api/twitter/util/InternalParseUtil.java | 2 +- .../api/twitter/util/JSONObjectType.java | 132 +++++++ .../api/twitter/util/TwitterConverter.java | 16 +- .../constant/SharedPreferenceConstants.java | 4 +- .../twidere/model/ParcelableAccount.java | 133 +------ .../twidere/model/ParcelableCredentials.java | 124 +++++++ .../twidere/model/ParcelableMediaUpdate.java | 2 + .../twidere/model/ParcelableStatus.java | 211 ++++------- .../twidere/provider/TwidereDataStore.java | 5 - .../twidere/util/ContentValuesCreator.java | 5 +- .../twidere/util/MediaPreviewUtils.java | 10 +- .../twidere/util/TwitterAPIUtils.java | 279 ++++++++++++++ twidere.extension.streaming/build.gradle | 13 +- .../extension/streaming/StreamingService.java | 120 +++---- .../streaming/util/OkHttpClientImpl.java | 284 --------------- .../streaming/util/OkHttpRestClient.java | 197 ++++++++++ .../util/TwidereHostAddressResolver.java | 14 +- .../extension/streaming/util/Utils.java | 85 +++++ twidere.wear/build.gradle | 2 +- twidere/build.gradle | 16 +- .../spice/Task/SpiceAsyUploadTask.java | 14 +- .../edu/ucdavis/earlybird/UploadTask.java | 16 +- .../activity/TwitterLinkHandlerActivity.java | 13 +- .../activity/support/APIEditorActivity.java | 23 +- .../support/AccountSelectorActivity.java | 3 +- .../support/BrowserSignInActivity.java | 10 +- .../activity/support/ImagePickerActivity.java | 16 +- .../support/QuickSearchBarActivity.java | 2 +- .../activity/support/SignInActivity.java | 208 +++++------ .../support/UserListSelectorActivity.java | 6 +- .../adapter/AccountsSpinnerAdapter.java | 2 +- .../twidere/app/TwidereApplication.java | 2 + .../support/MessagesConversationFragment.java | 2 +- .../fragment/support/StatusFragment.java | 6 +- .../StatusTranslateDialogFragment.java | 4 +- .../fragment/support/UserFragment.java | 12 +- .../fragment/support/UserListFragment.java | 4 +- .../support/UserListMembersFragment.java | 6 +- .../support/UserProfileEditorFragment.java | 17 +- .../loader/support/BaseUserListsLoader.java | 6 +- .../support/ParcelableStatusLoader.java | 3 +- .../loader/support/ParcelableUserLoader.java | 6 +- .../loader/support/SavedSearchesLoader.java | 6 +- .../support/TwitterAPIActivitiesLoader.java | 4 +- .../support/TwitterAPIStatusesLoader.java | 4 +- .../loader/support/TwitterAPIUsersLoader.java | 6 +- .../preference/DefaultAPIPreference.java | 25 +- .../TranslationDestinationPreference.java | 6 +- .../preference/TrendsLocationPreference.java | 6 +- .../service/BackgroundOperationService.java | 14 +- .../twidere/util/AsyncTwitterWrapper.java | 66 ++-- .../mariotaku/twidere/util/ErrorLogger.java | 29 +- .../util/OAuthPasswordAuthenticator.java | 20 +- .../util/RecyclerViewNavigationHelper.java | 13 +- .../util/SharedPreferencesWrapper.java | 14 +- .../twidere/util/TwitterAPIFactory.java | 137 +++++++ .../twidere/util/TwitterAPIUtils.java | 273 -------------- .../twidere/util/TwitterWrapper.java | 8 +- .../org/mariotaku/twidere/util/Utils.java | 89 +---- .../imageloader/TwidereImageDownloader.java | 25 +- .../twidere/util/net/OkHttpRestClient.java | 12 +- .../twidere/view/holder/StatusViewHolder.java | 7 +- .../layout/layout_content_pages_common.xml | 46 ++- 150 files changed, 2043 insertions(+), 3668 deletions(-) delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/Converter.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/ErrorCallback.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/FileValue.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RawCallback.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RequestInfo.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RestAPIFactory.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RestCallback.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RestClient.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RestException.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RestMethod.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RestMethodInfo.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/Utils.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/Authorization.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/BodyType.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/ContentType.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/Endpoint.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/RestHttpClient.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/RestHttpRequest.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/RestHttpResponse.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/SimpleValueMap.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/ValueMap.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/mime/BaseTypedData.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/mime/FileTypedData.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/mime/FormTypedBody.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/mime/MultipartTypedBody.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/mime/StringTypedData.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/mime/TypedData.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/io/StreamingGZIPInputStream.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/method/GET.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/method/POST.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/param/Body.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/param/Extra.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/param/File.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/param/Form.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/param/Header.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/param/Part.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/param/Path.java delete mode 100644 twidere.component.common/src/main/java/org/mariotaku/simplerestapi/param/Query.java create mode 100644 twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/TwitterUserStream.java create mode 100644 twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/UserStreamCallback.java create mode 100644 twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/StatusDeletionNotice.java create mode 100644 twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/Warning.java rename twidere.extension.streaming/src/main/java/org/mariotaku/twidere/extension/streaming/util/OkHttpClientFactory.java => twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/StatusDeletionNoticeImpl.java (56%) create mode 100644 twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/WarningImpl.java create mode 100644 twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/util/CRLFLineReader.java create mode 100644 twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/util/JSONObjectType.java create mode 100644 twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableCredentials.java create mode 100644 twidere.component.common/src/main/java/org/mariotaku/twidere/util/TwitterAPIUtils.java delete mode 100644 twidere.extension.streaming/src/main/java/org/mariotaku/twidere/extension/streaming/util/OkHttpClientImpl.java create mode 100644 twidere.extension.streaming/src/main/java/org/mariotaku/twidere/extension/streaming/util/OkHttpRestClient.java rename twidere.extension.streaming/src/main/java/org/mariotaku/twidere/extension/streaming/util/TwidereHostAddressResolverFactory.java => twidere/src/main/java/org/mariotaku/twidere/util/ErrorLogger.java (50%) create mode 100644 twidere/src/main/java/org/mariotaku/twidere/util/TwitterAPIFactory.java delete mode 100644 twidere/src/main/java/org/mariotaku/twidere/util/TwitterAPIUtils.java diff --git a/build.gradle b/build.gradle index 5f56ef435..a2b3ac0dc 100644 --- a/build.gradle +++ b/build.gradle @@ -21,6 +21,7 @@ buildscript { allprojects { repositories { jcenter() + maven { url "https://jitpack.io" } } } \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index efe477082..7ca18b7cc 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip diff --git a/settings.gradle b/settings.gradle index 8850e4395..405d6e9b2 100644 --- a/settings.gradle +++ b/settings.gradle @@ -7,5 +7,6 @@ include ':twidere.donate.nyanwp' include ':twidere.donate.nyanwp.wear' include ':twidere.component.nyan' include ':twidere.extension.twitlonger' +include ':twidere.extension.streaming' include ':twidere.extension.push.xiaomi' include ':twidere.extension.launcher.compose' \ No newline at end of file diff --git a/twidere.component.common/build.gradle b/twidere.component.common/build.gradle index dae6ab470..fd3059a10 100644 --- a/twidere.component.common/build.gradle +++ b/twidere.component.common/build.gradle @@ -37,11 +37,15 @@ android { } dependencies { - apt 'com.bluelinelabs:logansquare-compiler:1.0.6' + 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.bluelinelabs:logansquare:1.0.6' + compile 'com.bluelinelabs:logansquare:1.1.0' compile 'org.apache.commons:commons-lang3:3.4' + compile 'com.github.mariotaku:RestFu:6ef0913' + compile 'com.hannesdorfmann.parcelableplease:annotation:1.0.1' + compile 'com.fasterxml.jackson.core:jackson-databind:2.4.4' compile project(':twidere.component.querybuilder') compile fileTree(dir: 'libs', include: ['*.jar']) } diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/Converter.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/Converter.java deleted file mode 100644 index bcb58ee4d..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/Converter.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.mariotaku.simplerestapi; - -import org.mariotaku.simplerestapi.http.RestHttpResponse; - -import java.lang.reflect.Type; - -/** - * Created by mariotaku on 15/2/6. - */ -public interface Converter { - - Object convert(RestHttpResponse response, Type type) throws Exception; - -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/ErrorCallback.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/ErrorCallback.java deleted file mode 100644 index d9f7efa50..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/ErrorCallback.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.mariotaku.simplerestapi; - -/** - * Created by mariotaku on 15/2/7. - */ -public interface ErrorCallback { - - void error(Throwable t); -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/FileValue.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/FileValue.java deleted file mode 100644 index 229920ef3..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/FileValue.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.mariotaku.simplerestapi; - -import org.mariotaku.simplerestapi.http.mime.BaseTypedData; -import org.mariotaku.simplerestapi.http.mime.TypedData; -import org.mariotaku.simplerestapi.param.File; - -/** - * Created by mariotaku on 15/2/6. - */ -public final class FileValue { - private final File annotation; - private final Object value; - - @Override - public String toString() { - return "FileValue{" + - "annotation=" + annotation + - ", value=" + value + - '}'; - } - - public FileValue(File annotation, Object value) { - this.annotation = annotation; - this.value = value; - } - - public TypedData body() { - return BaseTypedData.wrap(value); - } -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RawCallback.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RawCallback.java deleted file mode 100644 index de8fab51e..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RawCallback.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.mariotaku.simplerestapi; - -import org.mariotaku.simplerestapi.http.RestHttpResponse; - -import java.io.IOException; - -/** - * Created by mariotaku on 15/2/7. - */ -public interface RawCallback extends ErrorCallback { - void result(RestHttpResponse result) throws IOException; - -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RequestInfo.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RequestInfo.java deleted file mode 100644 index 711d0c3b0..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RequestInfo.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Twidere - Twitter client for Android - * - * Copyright (C) 2012-2015 Mariotaku Lee - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.mariotaku.simplerestapi; - -import android.support.annotation.Nullable; -import android.util.Pair; - -import org.mariotaku.simplerestapi.http.mime.FormTypedBody; -import org.mariotaku.simplerestapi.http.mime.MultipartTypedBody; -import org.mariotaku.simplerestapi.http.mime.TypedData; -import org.mariotaku.simplerestapi.param.Body; - -import java.util.List; -import java.util.Map; - -/** - * Created by mariotaku on 15/5/11. - */ -public final class RequestInfo { - - - private String method; - private String path; - - private List> queries, forms, headers; - private List> parts; - private Map extras; - private FileValue file; - private Body body; - - private TypedData bodyCache; - - public RequestInfo(String method, String path, List> queries, - List> forms, List> headers, - List> parts, FileValue file, Body body, Map extras) { - this.method = method; - this.path = path; - this.queries = queries; - this.forms = forms; - this.headers = headers; - this.parts = parts; - this.extras = extras; - this.file = file; - this.body = body; - } - - public List> getQueries() { - return queries; - } - - public List> getForms() { - return forms; - } - - public List> getHeaders() { - return headers; - } - - public List> getParts() { - return parts; - } - - public Map getExtras() { - return extras; - } - - @Nullable - public TypedData getBody() { - if (bodyCache != null) return bodyCache; - if (body == null) return null; - switch (body.value()) { - case FORM: { - bodyCache = new FormTypedBody(getForms()); - break; - } - case MULTIPART: { - bodyCache = new MultipartTypedBody(getParts()); - break; - } - case FILE: { - bodyCache = file.body(); - break; - } - } - return bodyCache; - } - - public String getPath() { - return path; - } - - public String getMethod() { - return method; - } - - public interface Factory { - RequestInfo create(RestMethodInfo methodInfo); - } -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RestAPIFactory.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RestAPIFactory.java deleted file mode 100644 index 0b73061d0..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RestAPIFactory.java +++ /dev/null @@ -1,188 +0,0 @@ -package org.mariotaku.simplerestapi; - -import org.mariotaku.simplerestapi.http.Authorization; -import org.mariotaku.simplerestapi.http.Endpoint; -import org.mariotaku.simplerestapi.http.RestHttpClient; -import org.mariotaku.simplerestapi.http.RestHttpRequest; -import org.mariotaku.simplerestapi.http.RestHttpResponse; - -import java.io.IOException; -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.Proxy; - -/** - * Created by mariotaku on 15/2/6. - */ -public class RestAPIFactory { - - private Endpoint endpoint; - private Authorization authorization; - private Converter converter; - private RestHttpClient restClient; - private RestHttpRequest.Factory requestFactory; - private ExceptionFactory exceptionFactory; - private RequestInfo.Factory requestInfoFactory; - - public void setEndpoint(Endpoint endpoint) { - this.endpoint = endpoint; - } - - public void setAuthorization(Authorization authorization) { - this.authorization = authorization; - } - - public void setConverter(Converter converter) { - this.converter = converter; - } - - public void setClient(RestHttpClient restClient) { - this.restClient = restClient; - } - - public void setRequestFactory(RestHttpRequest.Factory factory) { - this.requestFactory = factory; - } - - public void setExceptionFactory(ExceptionFactory factory) { - this.exceptionFactory = factory; - } - - public RestAPIFactory() { - - } - - @SuppressWarnings("unchecked") - public T build(Class cls) { - final ClassLoader classLoader = cls.getClassLoader(); - final Class[] interfaces = new Class[]{cls}; - return (T) Proxy.newProxyInstance(classLoader, interfaces, new RestInvocationHandler(endpoint, - authorization, restClient, converter, requestInfoFactory, requestFactory, exceptionFactory)); - } - - public static RestClient getRestClient(Object obj) { - final InvocationHandler handler = Proxy.getInvocationHandler(obj); - if (!(handler instanceof RestClient)) throw new IllegalArgumentException(); - return (RestClient) handler; - } - - public void setRequestInfoFactory(RequestInfo.Factory requestInfoFactory) { - this.requestInfoFactory = requestInfoFactory; - } - - private static class RestInvocationHandler implements InvocationHandler, RestClient { - private final Endpoint endpoint; - private final Authorization authorization; - private final Converter converter; - private final RestHttpRequest.Factory requestFactory; - private final ExceptionFactory exceptionFactory; - private final RequestInfo.Factory requestInfoFactory; - - @Override - public Endpoint getEndpoint() { - return endpoint; - } - - @Override - public RestHttpClient getRestClient() { - return restClient; - } - - @Override - public Converter getConverter() { - return converter; - } - - @Override - public Authorization getAuthorization() { - return authorization; - } - - private final RestHttpClient restClient; - - public RestInvocationHandler(Endpoint endpoint, Authorization authorization, - RestHttpClient restClient, Converter converter, - RequestInfo.Factory requestInfoFactory, RestHttpRequest.Factory requestFactory, ExceptionFactory exceptionFactory) { - this.endpoint = endpoint; - this.authorization = authorization; - this.restClient = restClient; - this.converter = converter; - this.requestInfoFactory = requestInfoFactory; - this.requestFactory = requestFactory != null ? requestFactory : new RestHttpRequest.DefaultFactory(); - this.exceptionFactory = exceptionFactory != null ? exceptionFactory : new DefaultExceptionFactory(); - } - - @SuppressWarnings("TryWithIdenticalCatches") - @Override - public Object invoke(Object proxy, Method method, Object[] args) throws Exception { - final RestMethodInfo methodInfo = RestMethodInfo.get(method, args); - final RequestInfo requestInfo; - if (requestInfoFactory != null) { - requestInfo = requestInfoFactory.create(methodInfo); - } else { - requestInfo = methodInfo.toRequestInfo(); - } - final RestHttpRequest restHttpRequest = requestFactory.create(endpoint, requestInfo, authorization); - final Class[] parameterTypes = method.getParameterTypes(); - RestHttpResponse response = null; - try { - response = restClient.execute(restHttpRequest); - if (parameterTypes.length > 0) { - final Class lastParameterType = parameterTypes[parameterTypes.length - 1]; - if (RestCallback.class.isAssignableFrom(lastParameterType)) { - final Method callbackMethod = lastParameterType.getMethod("result", Object.class); - final RestCallback callback = (RestCallback) args[args.length - 1]; - final Object object = converter.convert(response, method.getGenericReturnType()); - if (callback != null) { - callbackMethod.invoke(callback, object); - } - return null; - } else if (RawCallback.class.isAssignableFrom(lastParameterType)) { - final RawCallback callback = (RawCallback) args[args.length - 1]; - callback.result(response); - return null; - } - } - return converter.convert(response, method.getGenericReturnType()); - } catch (IOException e) { - final Exception re = exceptionFactory.newException(e, response); - if (parameterTypes.length > 0) { - final Class lastParameterType = parameterTypes[parameterTypes.length - 1]; - if (ErrorCallback.class.isAssignableFrom(lastParameterType)) { - final ErrorCallback callback = (ErrorCallback) args[args.length - 1]; - if (callback != null) { - callback.error(re); - return null; - } - } - } - throw re; - } catch (InvocationTargetException e) { - throw new RuntimeException(e); - } catch (NoSuchMethodException e) { - throw new RuntimeException(e); - } catch (IllegalAccessException e) { - throw new RuntimeException(e); - } finally { - Utils.closeSilently(response); - } - } - } - - public interface ExceptionFactory { - - Exception newException(Throwable cause, RestHttpResponse response); - - } - - public static final class DefaultExceptionFactory implements ExceptionFactory { - - @Override - public Exception newException(Throwable cause, RestHttpResponse response) { - final RestException e = new RestException(cause); - e.setResponse(response); - return e; - } - } -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RestCallback.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RestCallback.java deleted file mode 100644 index e297f2e99..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RestCallback.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.mariotaku.simplerestapi; - -/** - * Created by mariotaku on 15/2/7. - */ -public interface RestCallback extends ErrorCallback { - void result(T result); - -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RestClient.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RestClient.java deleted file mode 100644 index 86a0ff779..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RestClient.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.mariotaku.simplerestapi; - -import org.mariotaku.simplerestapi.http.Authorization; -import org.mariotaku.simplerestapi.http.Endpoint; -import org.mariotaku.simplerestapi.http.RestHttpClient; - -/** - * Created by mariotaku on 15/4/19. - */ -public interface RestClient { - Endpoint getEndpoint(); - - RestHttpClient getRestClient(); - - Converter getConverter(); - - Authorization getAuthorization(); - -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RestException.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RestException.java deleted file mode 100644 index 5689db3af..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RestException.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.mariotaku.simplerestapi; - -import org.mariotaku.simplerestapi.http.RestHttpResponse; - -/** - * Created by mariotaku on 15/2/7. - */ -public class RestException extends RuntimeException { - public RestException(String message, Throwable cause) { - super(message, cause); - } - - public RestException(String message) { - super(message); - } - - public RestException() { - } - - public RestException(Throwable cause) { - super(cause); - } - - private RestHttpResponse response; - - @Override - public String toString() { - return "RestException{" + - "response=" + response + - "} " + super.toString(); - } - - public RestHttpResponse getResponse() { - return response; - } - - public void setResponse(RestHttpResponse response) { - this.response = response; - } -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RestMethod.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RestMethod.java deleted file mode 100644 index 7866c2cb0..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RestMethod.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.mariotaku.simplerestapi; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Created by mariotaku on 15/2/6. - */ -@Target(ElementType.ANNOTATION_TYPE) -@Retention(RetentionPolicy.RUNTIME) -public @interface RestMethod { - - String value(); - - boolean hasBody() default false; -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RestMethodInfo.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RestMethodInfo.java deleted file mode 100644 index a4bf4ad36..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/RestMethodInfo.java +++ /dev/null @@ -1,339 +0,0 @@ -package org.mariotaku.simplerestapi; - -import android.support.annotation.NonNull; -import android.util.Pair; - -import org.apache.commons.lang3.NotImplementedException; -import org.mariotaku.simplerestapi.http.ValueMap; -import org.mariotaku.simplerestapi.http.mime.BaseTypedData; -import org.mariotaku.simplerestapi.http.mime.TypedData; -import org.mariotaku.simplerestapi.param.Body; -import org.mariotaku.simplerestapi.param.Extra; -import org.mariotaku.simplerestapi.param.File; -import org.mariotaku.simplerestapi.param.Form; -import org.mariotaku.simplerestapi.param.Header; -import org.mariotaku.simplerestapi.param.Part; -import org.mariotaku.simplerestapi.param.Path; -import org.mariotaku.simplerestapi.param.Query; - -import java.lang.annotation.Annotation; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Created by mariotaku on 15/2/6. - */ -public final class RestMethodInfo { - - private final RestMethod method; - private final String path; - private final Body body; - - private final HashMap paths; - private final HashMap queries; - private final HashMap headers; - private final HashMap forms; - private final HashMap parts; - private final HashMap extras; - private final FileValue file; - - private ArrayList> queriesCache, formsCache, headersCache; - private ArrayList> partsCache; - private Map extrasCache; - private TypedData bodyCache; - - RestMethodInfo(final RestMethod method, String path, final Body body, final HashMap paths, final HashMap queries, - final HashMap headers, final HashMap forms, final HashMap parts, - final FileValue file, HashMap extras) { - this.method = method; - this.path = path; - this.body = body; - this.paths = paths; - this.queries = queries; - this.headers = headers; - this.forms = forms; - this.parts = parts; - this.extras = extras; - this.file = file; - } - - static RestMethodInfo get(Method method, Object[] args) { - RestMethod restMethod = null; - String pathFormat = null; - for (Annotation annotation : method.getAnnotations()) { - final Class annotationType = annotation.annotationType(); - restMethod = annotationType.getAnnotation(RestMethod.class); - if (restMethod != null) { - try { - pathFormat = (String) annotationType.getMethod("value").invoke(annotation); - } catch (Exception e) { - throw new RuntimeException(e); - } - break; - } - } - final Body body = method.getAnnotation(Body.class); - final HashMap paths = new HashMap<>(); - final HashMap queries = new HashMap<>(); - final HashMap headers = new HashMap<>(); - final HashMap forms = new HashMap<>(); - final HashMap parts = new HashMap<>(); - final HashMap extras = new HashMap<>(); - FileValue file = null; - final Annotation[][] annotations = method.getParameterAnnotations(); - for (int i = 0, j = annotations.length; i < j; i++) { - final Path path = getAnnotation(annotations[i], Path.class); - if (path != null) { - paths.put(path, args[i]); - } - final Query query = getAnnotation(annotations[i], Query.class); - if (query != null) { - queries.put(query, args[i]); - } - final Header header = getAnnotation(annotations[i], Header.class); - if (header != null) { - headers.put(header, args[i]); - } - final Form form = getAnnotation(annotations[i], Form.class); - if (form != null) { - forms.put(form, args[i]); - } - final Part part = getAnnotation(annotations[i], Part.class); - if (part != null) { - parts.put(part, args[i]); - } - final File paramFile = getAnnotation(annotations[i], File.class); - if (paramFile != null) { - if (file == null) { - file = new FileValue(paramFile, args[i]); - } else { - throw new IllegalArgumentException(); - } - } - final Extra extra = getAnnotation(annotations[i], Extra.class); - if (extra != null) { - extras.put(extra, args[i]); - } - } - checkMethod(restMethod, body, forms, parts, file); - return new RestMethodInfo(restMethod, pathFormat, body, paths, queries, headers, forms, parts, file, extras); - } - - private static String[] getValueMapKeys(String[] annotationValue, ValueMap valueMap) { - return annotationValue != null && annotationValue.length > 0 ? annotationValue : valueMap.keys(); - } - - private static void checkMethod(RestMethod restMethod, Body body, HashMap forms, HashMap parts, FileValue file) { - if (restMethod == null) - throw new NotImplementedException("Method must has annotation annotated with @RestMethod"); - if (restMethod.hasBody() && body == null) { - throw new IllegalArgumentException("@Body required for method " + restMethod.value()); - } else if (!restMethod.hasBody() && body != null) { - throw new IllegalArgumentException(restMethod.value() + " does not allow body"); - } - if (body == null) return; - switch (body.value()) { - case FILE: { - if (file == null) { - throw new NullPointerException("@File annotation is required"); - } - if (!forms.isEmpty() || !parts.isEmpty()) { - throw new IllegalArgumentException("Only arguments with @File annotation allowed"); - } - break; - } - case MULTIPART: { - if (!forms.isEmpty() || file != null) { - throw new IllegalArgumentException("Only arguments with @Part annotation allowed"); - } - break; - } - case FORM: { - if (file != null || !parts.isEmpty()) { - throw new IllegalArgumentException("Only arguments with @Form annotation allowed"); - } - break; - } - } - } - - @SuppressWarnings("unchecked") - private static T getAnnotation(Annotation[] annotations, Class annotationClass) { - for (Annotation annotation : annotations) { - if (annotationClass.isAssignableFrom(annotation.annotationType())) { - return (T) annotation; - } - } - return null; - } - - @NonNull - public Map getExtras() { - if (extrasCache != null) return extrasCache; - final Map map = new HashMap<>(); - for (Map.Entry entry : extras.entrySet()) { - final Extra extra = entry.getKey(); - final Object value = entry.getValue(); - if (value instanceof ValueMap) { - final ValueMap valueMap = (ValueMap) value; - for (String key : getValueMapKeys(extra.value(), valueMap)) { - if (valueMap.has(key)) { - map.put(key, valueMap.get(key)); - } - } - } else if (value != null) { - for (String key : extra.value()) { - map.put(key, value); - } - } - } - return extrasCache = map; - } - - @NonNull - public List> getForms() { - if (formsCache != null) return formsCache; - final ArrayList> list = new ArrayList<>(); - for (Map.Entry entry : forms.entrySet()) { - final Form form = entry.getKey(); - final Object value = entry.getValue(); - if (value == null) continue; - if (value instanceof ValueMap) { - final ValueMap valueMap = (ValueMap) value; - for (String key : getValueMapKeys(form.value(), valueMap)) { - if (valueMap.has(key)) { - list.add(Pair.create(key, String.valueOf(valueMap.get(key)))); - } - } - } else { - final char delimiter = form.arrayDelimiter(); - String valueString = Utils.toString(value, delimiter); - for (String key : form.value()) { - list.add(Pair.create(key, valueString)); - } - } - } - return formsCache = list; - } - - @NonNull - public List> getParts() { - if (partsCache != null) return partsCache; - final ArrayList> list = new ArrayList<>(); - for (Map.Entry entry : parts.entrySet()) { - final Part part = entry.getKey(); - final String[] names = part.value(); - final Object value = entry.getValue(); - if (value instanceof TypedData) { - list.add(Pair.create(names[0], (TypedData) value)); - } else if (value != null) { - list.add(Pair.create(names[0], BaseTypedData.wrap(value))); - } - } - return partsCache = list; - } - - @NonNull - public List> getHeaders() { - if (headersCache != null) return headersCache; - final ArrayList> list = new ArrayList<>(); - for (Map.Entry entry : headers.entrySet()) { - final Header header = entry.getKey(); - final Object value = entry.getValue(); - if (value instanceof ValueMap) { - final ValueMap valueMap = (ValueMap) value; - for (String key : getValueMapKeys(header.value(), valueMap)) { - if (valueMap.has(key)) { - list.add(Pair.create(key, String.valueOf(valueMap.get(key)))); - } - } - } else if (value != null) { - for (String key : header.value()) { - list.add(Pair.create(key, String.valueOf(value))); - } - } - } - return headersCache = list; - } - - public RestMethod getMethod() { - return method; - } - - @NonNull - public String getPath() { - StringBuilder sb = new StringBuilder(); - int start, end, prevEnd = -1; - while ((start = path.indexOf('{', prevEnd)) != -1 && (end = path.indexOf('}', start)) != -1) { - sb.append(path.substring(prevEnd + 1, start)); - final String key = path.substring(start + 1, end); - final String replacement = findPathReplacement(key); - if (replacement == null) - throw new IllegalArgumentException("Path key {" + key + "} not bound"); - sb.append(replacement); - prevEnd = end; - } - sb.append(path.substring(prevEnd + 1)); - return sb.toString(); - } - - @NonNull - public List> getQueries() { - if (queriesCache != null) return queriesCache; - final ArrayList> list = new ArrayList<>(); - for (Map.Entry entry : queries.entrySet()) { - final Query form = entry.getKey(); - final Object value = entry.getValue(); - if (value == null) continue; - if (value instanceof ValueMap) { - final ValueMap valueMap = (ValueMap) value; - for (String key : getValueMapKeys(form.value(), valueMap)) { - if (valueMap.has(key)) { - list.add(Pair.create(key, String.valueOf(valueMap.get(key)))); - } - } - } else { - final char delimiter = form.arrayDelimiter(); - String valueString = Utils.toString(value, delimiter); - for (String key : form.value()) { - list.add(Pair.create(key, valueString)); - } - } - } - return queriesCache = list; - } - - private String findPathReplacement(String key) { - for (Map.Entry entry : paths.entrySet()) { - final Path path = entry.getKey(); - if (key.equals(path.value())) { - if (path.encoded()) { - return String.valueOf(entry.getValue()); - } else { - return Utils.encode(String.valueOf(entry.getValue()), "UTF-8"); - } - } - } - return null; - } - - public RequestInfo toRequestInfo() { - return new RequestInfo(getMethod().value(), getPath(), getQueries(), getForms(), - getHeaders(), getParts(), getFile(), getBody(), getExtras()); - } - - public RequestInfo toRequestInfo(RequestInfo.Factory factory) { - return factory.create(this); - } - - public Body getBody() { - return body; - } - - public FileValue getFile() { - return file; - } -} \ No newline at end of file diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/Utils.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/Utils.java deleted file mode 100644 index e1bb05b66..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/Utils.java +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Twidere - Twitter client for Android - * - * Copyright (C) 2012-2015 Mariotaku Lee - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.mariotaku.simplerestapi; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; - -import java.io.Closeable; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; -import java.lang.reflect.Array; -import java.net.URLDecoder; -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.List; - -/** - * Created by mariotaku on 15/2/4. - */ -public class Utils { - public static String[] split(final String str, final String separator) { - String[] returnValue; - int index = str.indexOf(separator); - if (index == -1) { - returnValue = new String[]{str}; - } else { - final List strList = new ArrayList<>(); - int oldIndex = 0; - while (index != -1) { - final String subStr = str.substring(oldIndex, index); - strList.add(subStr); - oldIndex = index + separator.length(); - index = str.indexOf(separator, oldIndex); - } - if (oldIndex != str.length()) { - strList.add(str.substring(oldIndex)); - } - returnValue = strList.toArray(new String[strList.size()]); - } - - return returnValue; - } - - public static void closeSilently(Closeable c) { - if (c == null) return; - try { - c.close(); - } catch (IOException ignore) { - } - } - - /** - * @param value string to be encoded - * @return encoded string - * @see OAuth / TestCases - * @see Space - * encoding - OAuth | Google Groups - * @see RFC 3986 - - * Uniform Resource Identifier (URI): Generic Syntax - 2.1. - * Percent-Encoding - */ - public static String encode(final String value, String encoding) { - String encoded; - try { - encoded = URLEncoder.encode(value, encoding); - } catch (final UnsupportedEncodingException ignore) { - return null; - } - final StringBuilder buf = new StringBuilder(encoded.length()); - char focus; - for (int i = 0; i < encoded.length(); i++) { - focus = encoded.charAt(i); - if (focus == '*') { - buf.append("%2A"); - } else if (focus == '+') { - buf.append("%20"); - } else if (focus == '%' && i + 1 < encoded.length() && encoded.charAt(i + 1) == '7' - && encoded.charAt(i + 2) == 'E') { - buf.append('~'); - i += 2; - } else { - buf.append(focus); - } - } - return buf.toString(); - } - - public static void parseGetParameters(final String queryString, final List> params, - final String encoding) { - final String[] queryStrings = split(queryString, "&"); - try { - for (final String query : queryStrings) { - final String[] split = split(query, "="); - final String key = URLDecoder.decode(split[0], encoding); - if (split.length == 2) { - params.add(new ImmutablePair<>(key, URLDecoder.decode(split[1], encoding))); - } else { - params.add(new ImmutablePair<>(key, "")); - } - } - } catch (final UnsupportedEncodingException e) { - throw new RuntimeException(e); - } - } - - public static boolean copyStream(InputStream is, OutputStream os) throws IOException { - return copyStream(is, os, 8192); - } - - public static boolean copyStream(InputStream is, OutputStream os, int bufferSize) - throws IOException { - final byte[] bytes = new byte[bufferSize]; - int count; - while ((count = is.read(bytes, 0, bufferSize)) != -1) { - os.write(bytes, 0, count); - } - os.flush(); - return true; - } - - @NonNull - public static T assertNotNull(@Nullable T obj) { - if (obj == null) throw new NullPointerException(); - return obj; - } - - private static final char[] hexArray = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; - - public static String bytesToHex(byte[] bytes) { - char[] hexChars = new char[bytes.length * 2]; - for (int j = 0; j < bytes.length; j++) { - int v = bytes[j] & 0xFF; - hexChars[j * 2] = hexArray[v >>> 4]; - hexChars[j * 2 + 1] = hexArray[v & 0x0F]; - } - return new String(hexChars); - } - - @NonNull - public static String toString(@NonNull Object value, char delimiter) { - final Class valueClass = value.getClass(); - if (valueClass.isArray()) { - final StringBuilder sb = new StringBuilder(); - for (int i = 0, j = Array.getLength(value); i < j; i++) { - if (i != 0) { - sb.append(delimiter); - } - sb.append(Array.get(value, i)); - } - return sb.toString(); - } else { - return value.toString(); - } - } -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/Authorization.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/Authorization.java deleted file mode 100644 index 52f0328d0..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/Authorization.java +++ /dev/null @@ -1,31 +0,0 @@ -/* -* Twidere - Twitter client for Android -* -* Copyright (C) 2012-2015 Mariotaku Lee -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -*/ - -package org.mariotaku.simplerestapi.http; - -import org.mariotaku.simplerestapi.RequestInfo; - -/** - * Created by mariotaku on 15/2/4. - */ -public interface Authorization { - String getHeader(Endpoint endpoint, RequestInfo info); - - boolean hasAuthorization(); -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/BodyType.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/BodyType.java deleted file mode 100644 index a39fc88df..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/BodyType.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.mariotaku.simplerestapi.http; - -/** - * Created by mariotaku on 15/2/6. - */ -public enum BodyType { - FORM, MULTIPART, FILE -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/ContentType.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/ContentType.java deleted file mode 100644 index 6a27ac5f1..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/ContentType.java +++ /dev/null @@ -1,122 +0,0 @@ -package org.mariotaku.simplerestapi.http; - - -import android.util.Pair; - -import org.mariotaku.simplerestapi.Utils; - -import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.List; - -/** - * Created by mariotaku on 15/2/4. - */ -public final class ContentType { - - public static final ContentType OCTET_STREAM = ContentType.parse("application/octet-stream"); - - private final String contentType; - private final List> parameters; - - public ContentType(String contentType, Charset charset) { - this(contentType, new ArrayList>()); - addParameter("charset", charset.name()); - } - - public ContentType(String contentType) { - this(contentType, new ArrayList>()); - } - - public ContentType(String contentType, List> parameters) { - this.contentType = contentType; - this.parameters = parameters; - } - - public boolean addParameter(String name, String value) { - return parameters.add(Pair.create(name, value)); - } - - public ContentType parameter(String name, String value) { - addParameter(name, value); - return this; - } - - public String parameter(String name) { - for (Pair parameter : parameters) { - if (name.equalsIgnoreCase(parameter.first)) return parameter.second; - } - return null; - } - - @Override - public String toString() { - return "ContentType{" + - "contentType='" + contentType + '\'' + - ", parameters=" + parameters + - '}'; - } - - public Charset getCharset() { - if (parameters == null) return null; - final String charset = parameter("charset"); - if (charset != null) return Charset.forName(charset); - return null; - } - - public String getContentType() { - return contentType; - } - - public String toHeader() { - final StringBuilder sb = new StringBuilder(contentType); - for (Pair parameter : parameters) { - sb.append("; "); - sb.append(parameter.first); - sb.append("="); - sb.append(parameter.second); - } - return sb.toString(); - } - - public static ContentType parse(String string) { - final List> parameters = new ArrayList<>(); - int previousIndex = string.indexOf(';', 0); - String contentType; - if (previousIndex == -1) { - contentType = string; - } else { - contentType = string.substring(0, previousIndex); - } - while (previousIndex != -1) { - final int idx = string.indexOf(';', previousIndex + 1); - final String[] segs; - if (idx < 0) { - segs = Utils.split(string.substring(previousIndex + 1, string.length()).trim(), "="); - } else { - segs = Utils.split(string.substring(previousIndex + 1, idx).trim(), "="); - } - if (segs.length == 2) { - parameters.add(Pair.create(segs[0], segs[1])); - } - if (idx < 0) { - break; - } - previousIndex = idx; - } - return new ContentType(contentType, parameters); - } - - public ContentType charset(Charset charset) { - removeParameter("charset"); - return parameter("charset", charset.name()); - } - - private void removeParameter(String name) { - for (int i = parameters.size() - 1; i >= 0; i++) { - if (name.equals(parameters.get(i).first)) { - parameters.remove(i); - } - } - } -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/Endpoint.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/Endpoint.java deleted file mode 100644 index ce0f11b39..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/Endpoint.java +++ /dev/null @@ -1,73 +0,0 @@ -package org.mariotaku.simplerestapi.http; - -import android.util.Pair; - -import org.mariotaku.simplerestapi.RequestInfo; -import org.mariotaku.simplerestapi.Utils; - -import java.util.Arrays; -import java.util.List; - -/** - * Created by mariotaku on 15/2/6. - */ -public class Endpoint { - - private String url; - - public String getUrl() { - return url; - } - - public Endpoint(String url) { - this.url = url; - } - - public static String constructUrl(String endpoint, RequestInfo requestInfo) { - return constructUrl(endpoint, requestInfo.getPath(), requestInfo.getQueries()); - } - - public String construct(String path, List> queries) { - return constructUrl(url, path, queries); - } - - @SafeVarargs - public final String construct(String path, Pair... queries) { - return constructUrl(url, path, Arrays.asList(queries)); - } - - public static String constructUrl(String endpoint, String path, List> queries) { - if (endpoint == null) throw new NullPointerException("Endpoint is null"); - final StringBuilder urlBuilder = new StringBuilder(); - if (endpoint.charAt(endpoint.length() - 1) == '/') { - urlBuilder.append(endpoint.substring(0, endpoint.length() - 1)); - } else { - urlBuilder.append(endpoint); - } - if (path != null) { - if (path.charAt(0) != '/') { - urlBuilder.append('/'); - } - urlBuilder.append(path); - } - return constructUrl(urlBuilder.toString(), queries); - } - - public static String constructUrl(String url, List> queries) { - if (queries == null || queries.isEmpty()) return url; - final StringBuilder urlBuilder = new StringBuilder(url); - for (int i = 0, j = queries.size(); i < j; i++) { - final Pair item = queries.get(i); - urlBuilder.append(i != 0 ? '&' : '?'); - urlBuilder.append(Utils.encode(item.first, "UTF-8")); - urlBuilder.append('='); - urlBuilder.append(Utils.encode(item.second, "UTF-8")); - } - return urlBuilder.toString(); - } - - @SafeVarargs - public static String constructUrl(String url, Pair... queries) { - return constructUrl(url, Arrays.asList(queries)); - } -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/RestHttpClient.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/RestHttpClient.java deleted file mode 100644 index bcd8f89e3..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/RestHttpClient.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.mariotaku.simplerestapi.http; - -import android.support.annotation.NonNull; - -import java.io.IOException; - -/** - * Created by mariotaku on 15/2/7. - */ -public interface RestHttpClient { - - @NonNull - RestHttpResponse execute(RestHttpRequest request) throws IOException; - -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/RestHttpRequest.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/RestHttpRequest.java deleted file mode 100644 index 5787d5d79..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/RestHttpRequest.java +++ /dev/null @@ -1,120 +0,0 @@ -package org.mariotaku.simplerestapi.http; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.util.Pair; - -import org.mariotaku.simplerestapi.RequestInfo; -import org.mariotaku.simplerestapi.http.mime.TypedData; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by mariotaku on 15/2/7. - */ -public final class RestHttpRequest { - - private final String method; - private final String url; - private final List> headers; - private final TypedData body; - private final Object extra; - - public String getMethod() { - return method; - } - - public String getUrl() { - return url; - } - - public List> getHeaders() { - return headers; - } - - public TypedData getBody() { - return body; - } - - public Object getExtra() { - return extra; - } - - @Override - public String toString() { - return "RestRequest{" + - "method='" + method + '\'' + - ", url='" + url + '\'' + - ", headers=" + headers + - ", body=" + body + - '}'; - } - - public RestHttpRequest(String method, String url, List> headers, TypedData body, Object extra) { - this.method = method; - this.url = url; - this.headers = headers; - this.body = body; - this.extra = extra; - } - - public static final class Builder { - private String method; - private String url; - private List> headers; - private TypedData body; - private Object extra; - - public Builder() { - } - - public Builder method(String method) { - this.method = method; - return this; - } - - public Builder url(String url) { - this.url = url; - return this; - } - - public Builder headers(List> headers) { - this.headers = headers; - return this; - } - - public Builder body(TypedData body) { - this.body = body; - return this; - } - - public Builder extra(Object extra) { - this.extra = extra; - return this; - } - - public RestHttpRequest build() { - return new RestHttpRequest(method, url, headers, body, extra); - } - } - - public interface Factory { - RestHttpRequest create(@NonNull Endpoint endpoint, @NonNull RequestInfo info, @Nullable Authorization authorization); - } - - - public static final class DefaultFactory implements Factory { - - @Override - public RestHttpRequest create(@NonNull Endpoint endpoint, @NonNull RequestInfo requestInfo, @Nullable Authorization authorization) { - final String url = Endpoint.constructUrl(endpoint.getUrl(), requestInfo); - final ArrayList> headers = new ArrayList<>(requestInfo.getHeaders()); - - if (authorization != null && authorization.hasAuthorization()) { - headers.add(Pair.create("Authorization", authorization.getHeader(endpoint, requestInfo))); - } - return new RestHttpRequest(requestInfo.getMethod(), url, headers, requestInfo.getBody(), null); - } - } -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/RestHttpResponse.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/RestHttpResponse.java deleted file mode 100644 index d51b01057..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/RestHttpResponse.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.mariotaku.simplerestapi.http; - -import android.util.Pair; - -import org.mariotaku.simplerestapi.http.mime.TypedData; - -import java.io.Closeable; -import java.util.ArrayList; -import java.util.List; - -/** - * Created by mariotaku on 15/2/7. - */ -public abstract class RestHttpResponse implements Closeable { - public abstract int getStatus(); - - public abstract List> getHeaders(); - - public abstract TypedData getBody(); - - public String getHeader(String name) { - if (name == null) throw new NullPointerException(); - final List> headers = getHeaders(); - if (headers == null) return null; - for (Pair header : headers) { - if (header.first.equalsIgnoreCase(name)) return header.second; - } - return null; - } - - public String[] getHeaders(String name) { - if (name == null) throw new NullPointerException(); - final List> headers = getHeaders(); - if (headers == null) return new String[0]; - final ArrayList result = new ArrayList<>(); - for (Pair header : headers) { - if (name.equalsIgnoreCase(header.first)) { - result.add(header.second); - } - } - return result.toArray(new String[result.size()]); - } - - /** - * Returns true if the code is in [200..300), which means the request was - * successfully received, understood, and accepted. - */ - public boolean isSuccessful() { - final int status = getStatus(); - return status >= 200 && status < 300; - } - -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/SimpleValueMap.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/SimpleValueMap.java deleted file mode 100644 index cba7a5cd8..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/SimpleValueMap.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Twidere - Twitter client for Android - * - * Copyright (C) 2012-2015 Mariotaku Lee - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.mariotaku.simplerestapi.http; - -import java.util.HashMap; -import java.util.Map; -import java.util.Set; - -/** - * Created by mariotaku on 15/5/8. - */ -public class SimpleValueMap implements ValueMap { - - private final Map internalMap = new HashMap<>(); - - @Override - public boolean has(String key) { - return internalMap.containsKey(key); - } - - @Override - public Object get(String key) { - return internalMap.get(key); - } - - protected void put(String key, Object value) { - internalMap.put(key, value); - } - - protected void remove(String key) { - internalMap.remove(key); - } - - @Override - public String[] keys() { - final Set keySet = internalMap.keySet(); - return keySet.toArray(new String[keySet.size()]); - } - - protected void copyValue(ValueMap from, String key) { - if (from.has(key)) { - put(key, from.get(key)); - } - } -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/ValueMap.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/ValueMap.java deleted file mode 100644 index 3dc2be76e..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/ValueMap.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.mariotaku.simplerestapi.http; - -/** - * Created by mariotaku on 15/2/6. - */ -public interface ValueMap { - - boolean has(String key); - - Object get(String key); - - String[] keys(); - -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/mime/BaseTypedData.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/mime/BaseTypedData.java deleted file mode 100644 index 580c36e93..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/mime/BaseTypedData.java +++ /dev/null @@ -1,95 +0,0 @@ -package org.mariotaku.simplerestapi.http.mime; - -import android.support.annotation.NonNull; - -import org.mariotaku.simplerestapi.http.ContentType; -import org.mariotaku.simplerestapi.io.StreamingGZIPInputStream; - -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.Reader; -import java.nio.charset.Charset; - -/** - * Created by mariotaku on 15/2/7. - */ -public class BaseTypedData implements TypedData { - - private final ContentType contentType; - private final long contentLength; - private final InputStream stream; - private final String contentEncoding; - - public BaseTypedData(ContentType contentType, String contentEncoding, long contentLength, InputStream stream) throws IOException { - this.contentType = contentType; - this.contentEncoding = contentEncoding; - this.contentLength = contentLength; - if ("gzip".equals(contentEncoding)) { - this.stream = new StreamingGZIPInputStream(stream); - } else { - this.stream = stream; - } - } - - @Override - public ContentType contentType() { - return contentType; - } - - @Override - public String contentEncoding() { - return contentEncoding; - } - - @Override - public long length() { - return contentLength; - } - - @Override - public String toString() { - return "BaseTypedData{" + - "contentType=" + contentType + - ", contentLength=" + contentLength + - ", stream=" + stream + - ", contentEncoding='" + contentEncoding + '\'' + - '}'; - } - - @Override - public void writeTo(@NonNull OutputStream os) throws IOException { - final byte[] buffer = new byte[8192]; - for (int len; (len = stream.read(buffer)) != -1; ) { - os.write(buffer, 0, len); - } - - } - - @NonNull - @Override - public InputStream stream() { - return stream; - } - - @Override - public void close() throws IOException { - stream.close(); - } - - public static TypedData wrap(Object value) { - if (value instanceof TypedData) { - return (TypedData) value; - } else if (value instanceof java.io.File) { - return new FileTypedData((java.io.File) value); - } - throw new UnsupportedOperationException(); - } - - public static Reader reader(TypedData data) throws IOException { - final ContentType contentType = data.contentType(); - final Charset charset = contentType != null ? contentType.getCharset() : null; - return new InputStreamReader(data.stream(), charset != null ? charset : Charset.defaultCharset()); - } -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/mime/FileTypedData.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/mime/FileTypedData.java deleted file mode 100644 index f27bf60c4..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/mime/FileTypedData.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Twidere - Twitter client for Android - * - * Copyright (C) 2012-2015 Mariotaku Lee - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.mariotaku.simplerestapi.http.mime; - -import android.support.annotation.NonNull; - -import org.mariotaku.simplerestapi.Utils; -import org.mariotaku.simplerestapi.http.ContentType; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -/** - * Created by mariotaku on 15/5/6. - */ -public class FileTypedData implements TypedData { - - private long length = -1; - private File file; - private ContentType contentType; - private String fileName; - private InputStream stream; - - public FileTypedData(File file, ContentType contentType) { - this.file = file; - this.contentType = contentType; - } - - public FileTypedData(InputStream stream, String fileName, long length, ContentType contentType) { - this.stream = stream; - this.fileName = fileName; - this.length = length; - this.contentType = contentType; - } - - public FileTypedData(File file) { - this(file, null); - } - - @Override - public long length() { - if (length != -1) return length; - if (file == null) return -1; - return length = file.length(); - } - - @Override - public void writeTo(@NonNull OutputStream os) throws IOException { - Utils.copyStream(stream(), os); - } - - @NonNull - @Override - public InputStream stream() throws IOException { - if (stream != null) return stream; - return stream = new FileInputStream(file); - } - - @Override - public void close() throws IOException { - if (stream != null) { - stream.close(); - } - } - - @Override - public ContentType contentType() { - if (contentType == null) { - return ContentType.OCTET_STREAM; - } - return contentType; - } - - @Override - public String contentEncoding() { - return null; - } - - public String fileName() { - if (fileName != null) return fileName; - return fileName = file.getName(); - } -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/mime/FormTypedBody.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/mime/FormTypedBody.java deleted file mode 100644 index 2695354e0..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/mime/FormTypedBody.java +++ /dev/null @@ -1,79 +0,0 @@ -package org.mariotaku.simplerestapi.http.mime; - -import android.support.annotation.NonNull; -import android.util.Pair; - -import org.mariotaku.simplerestapi.Utils; -import org.mariotaku.simplerestapi.http.ContentType; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.nio.charset.Charset; -import java.util.List; - -/** - * Created by mariotaku on 15/2/6. - */ -public class FormTypedBody implements TypedData { - - private final List> forms; - private final Charset charset; - - public FormTypedBody(List> forms) { - this.forms = forms; - this.charset = Charset.forName("UTF-8"); - } - - @Override - public ContentType contentType() { - return new ContentType("application/x-www-form-urlencoded", charset); - } - - @Override - public String contentEncoding() { - return null; - } - - private byte[] bytes; - - private void toRawBytes() { - if (bytes != null) return; - final StringBuilder sb = new StringBuilder(); - for (int i = 0, j = forms.size(); i < j; i++) { - if (i != 0) { - sb.append('&'); - } - final Pair form = forms.get(i); - sb.append(Utils.encode(form.first, charset.name())); - sb.append('='); - sb.append(Utils.encode(form.second, charset.name())); - } - bytes = sb.toString().getBytes(charset); - } - - @Override - public long length() { - toRawBytes(); - return bytes.length; - } - - @Override - public void writeTo(@NonNull OutputStream os) throws IOException { - toRawBytes(); - os.write(bytes); - } - - @NonNull - @Override - public InputStream stream() { - toRawBytes(); - return new ByteArrayInputStream(bytes); - } - - @Override - public void close() throws IOException { - // No-op - } -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/mime/MultipartTypedBody.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/mime/MultipartTypedBody.java deleted file mode 100644 index cf053c615..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/mime/MultipartTypedBody.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Twidere - Twitter client for Android - * - * Copyright (C) 2012-2015 Mariotaku Lee - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.mariotaku.simplerestapi.http.mime; - -import android.support.annotation.NonNull; -import android.util.Pair; - -import org.mariotaku.simplerestapi.Utils; -import org.mariotaku.simplerestapi.http.ContentType; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -/** - * Created by mariotaku on 15/5/5. - */ -public class MultipartTypedBody implements TypedData { - private final List> parts; - private final ContentType contentType; - - - private static final byte[] COLONSPACE = {':', ' '}; - private static final byte[] CRLF = {'\r', '\n'}; - private static final byte[] DASHDASH = {'-', '-'}; - private final String boundary; - - private boolean lengthSet; - private long length; - - public MultipartTypedBody(List> parts) { - this.parts = parts; - this.contentType = ContentType.parse("multipart/form-data"); - boundary = Utils.bytesToHex(UUID.randomUUID().toString().getBytes()); - contentType.addParameter("boundary", boundary); - } - - public MultipartTypedBody() { - this(new ArrayList>()); - } - - public void add(@NonNull String name, @NonNull TypedData data) { - parts.add(Pair.create(name, data)); - } - - @Override - public ContentType contentType() { - return contentType; - } - - @Override - public String contentEncoding() { - return null; - } - - @Override - public long length() throws IOException { - if (!lengthSet) { - length = 0; - for (Pair part : parts) { - length += part.second.length(); - } - lengthSet = true; - } - return length; - } - - @Override - public void writeTo(@NonNull OutputStream os) throws IOException { - for (Pair part : parts) { - os.write(DASHDASH); - os.write(boundary.getBytes()); - os.write(CRLF); - final ContentType contentDisposition = new ContentType("form-data").parameter("name", part.first); - final ContentType contentType = part.second.contentType(); - final long contentLength = part.second.length(); - if (part.second instanceof FileTypedData) { - contentDisposition.addParameter("filename", ((FileTypedData) part.second).fileName()); - } - os.write("Content-Disposition".getBytes()); - os.write(COLONSPACE); - os.write(contentDisposition.toHeader().getBytes()); - os.write(CRLF); - if (contentType != null) { - os.write("Content-Type".getBytes()); - os.write(COLONSPACE); - os.write(contentType.toHeader().getBytes()); - os.write(CRLF); - } - if (contentLength != -1) { - os.write("Content-Length".getBytes()); - os.write(COLONSPACE); - os.write(String.valueOf(contentLength).getBytes()); - os.write(CRLF); - } - os.write(CRLF); - part.second.writeTo(os); - os.write(CRLF); - } - os.write(DASHDASH); - os.write(boundary.getBytes()); - os.write(DASHDASH); - os.write(CRLF); - } - - @NonNull - @Override - public InputStream stream() throws IOException { - final ByteArrayOutputStream os = new ByteArrayOutputStream(); - writeTo(os); - return new ByteArrayInputStream(os.toByteArray()); - } - - @Override - public void close() throws IOException { - for (Pair part : parts) { - part.second.close(); - } - } -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/mime/StringTypedData.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/mime/StringTypedData.java deleted file mode 100644 index e3f5a086d..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/mime/StringTypedData.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Twidere - Twitter client for Android - * - * Copyright (C) 2012-2015 Mariotaku Lee - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.mariotaku.simplerestapi.http.mime; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import org.mariotaku.simplerestapi.Utils; -import org.mariotaku.simplerestapi.http.ContentType; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.nio.charset.Charset; - -/** - * Created by mariotaku on 15/5/12. - */ -public class StringTypedData implements TypedData { - - private final ContentType contentType; - private final byte[] data; - private ByteArrayInputStream is; - - public StringTypedData(String string, Charset charset) { - this.contentType = ContentType.parse("text/plain").charset(charset); - this.data = string.getBytes(charset); - } - - @Nullable - @Override - public ContentType contentType() { - return contentType; - } - - @Override - public String contentEncoding() { - return null; - } - - @Override - public long length() throws IOException { - return data.length; - } - - @Override - public void writeTo(@NonNull OutputStream os) throws IOException { - os.write(data); - } - - @NonNull - @Override - public InputStream stream() throws IOException { - if (is != null) return is; - return is = new ByteArrayInputStream(data); - } - - @Override - public void close() throws IOException { - Utils.closeSilently(is); - } -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/mime/TypedData.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/mime/TypedData.java deleted file mode 100644 index 066594aaf..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/http/mime/TypedData.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.mariotaku.simplerestapi.http.mime; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import org.mariotaku.simplerestapi.http.ContentType; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -/** - * Created by mariotaku on 15/2/6. - */ -public interface TypedData { - @Nullable - ContentType contentType(); - - String contentEncoding(); - - long length() throws IOException; - - void writeTo(@NonNull OutputStream os) throws IOException; - - @NonNull - InputStream stream() throws IOException; - - void close() throws IOException; -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/io/StreamingGZIPInputStream.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/io/StreamingGZIPInputStream.java deleted file mode 100644 index 77584e1b8..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/io/StreamingGZIPInputStream.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.mariotaku.simplerestapi.io; - -import java.io.IOException; -import java.io.InputStream; -import java.util.zip.GZIPInputStream; - -public final class StreamingGZIPInputStream extends GZIPInputStream { - private final InputStream wrapped; - - public StreamingGZIPInputStream(InputStream is) throws IOException { - super(is); - wrapped = is; - } - - /** - * Overrides behavior of GZIPInputStream which assumes we have all the data available - * which is not true for streaming. We instead rely on the underlying stream to tell us - * how much data is available. - *

- * Programs should not count on this method to return the actual number - * of bytes that could be read without blocking. - * - * @return - whatever the wrapped InputStream returns - * @throws IOException if an I/O error occurs. - */ - public int available() throws IOException { - return wrapped.available(); - } -} \ No newline at end of file diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/method/GET.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/method/GET.java deleted file mode 100644 index df657fbb0..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/method/GET.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.mariotaku.simplerestapi.method; - -import org.mariotaku.simplerestapi.RestMethod; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Created by mariotaku on 15/2/7. - */ -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -@RestMethod(value = "GET", hasBody = false) -public @interface GET { - String METHOD = "GET"; - - String value(); -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/method/POST.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/method/POST.java deleted file mode 100644 index 877c02b0e..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/method/POST.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.mariotaku.simplerestapi.method; - -import org.mariotaku.simplerestapi.RestMethod; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Created by mariotaku on 15/2/7. - */ -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -@RestMethod(value = "POST", hasBody = true) -public @interface POST { - String METHOD = "POST"; - - String value(); -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/param/Body.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/param/Body.java deleted file mode 100644 index af63c8aa7..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/param/Body.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.mariotaku.simplerestapi.param; - -import org.mariotaku.simplerestapi.http.BodyType; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Created by mariotaku on 15/2/6. - */ -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -public @interface Body { - BodyType value(); - - String encoding() default ""; -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/param/Extra.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/param/Extra.java deleted file mode 100644 index 4c1449296..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/param/Extra.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.mariotaku.simplerestapi.param; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Created by mariotaku on 15/2/6. - */ -@Target(ElementType.PARAMETER) -@Retention(RetentionPolicy.RUNTIME) -public @interface Extra { - String[] value(); -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/param/File.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/param/File.java deleted file mode 100644 index 70a2f7c6f..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/param/File.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.mariotaku.simplerestapi.param; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Created by mariotaku on 15/2/6. - */ -@Target(ElementType.PARAMETER) -@Retention(RetentionPolicy.RUNTIME) -public @interface File { - String contentType() default ""; - - String encoding() default ""; -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/param/Form.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/param/Form.java deleted file mode 100644 index 56249fa00..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/param/Form.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.mariotaku.simplerestapi.param; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Created by mariotaku on 15/2/6. - */ -@Target(ElementType.PARAMETER) -@Retention(RetentionPolicy.RUNTIME) -public @interface Form { - String[] value() default {}; - - char arrayDelimiter() default ','; -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/param/Header.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/param/Header.java deleted file mode 100644 index c81fd0fb3..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/param/Header.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.mariotaku.simplerestapi.param; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Created by mariotaku on 15/2/6. - */ -@Target(ElementType.PARAMETER) -@Retention(RetentionPolicy.RUNTIME) -public @interface Header { - String[] value(); - char arrayDelimiter() default ','; -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/param/Part.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/param/Part.java deleted file mode 100644 index c0442e0fe..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/param/Part.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.mariotaku.simplerestapi.param; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Created by mariotaku on 15/2/6. - */ -@Target(ElementType.PARAMETER) -@Retention(RetentionPolicy.RUNTIME) -public @interface Part { - String[] value(); - char arrayDelimiter() default ','; -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/param/Path.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/param/Path.java deleted file mode 100644 index 148ad454f..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/param/Path.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.mariotaku.simplerestapi.param; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Created by mariotaku on 15/2/6. - */ -@Target(ElementType.PARAMETER) -@Retention(RetentionPolicy.RUNTIME) -public @interface Path { - String value(); - - boolean encoded() default false; -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/param/Query.java b/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/param/Query.java deleted file mode 100644 index c6c97475d..000000000 --- a/twidere.component.common/src/main/java/org/mariotaku/simplerestapi/param/Query.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.mariotaku.simplerestapi.param; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Created by mariotaku on 15/2/6. - */ -@Target(ElementType.PARAMETER) -@Retention(RetentionPolicy.RUNTIME) -public @interface Query { - String[] value() default {}; - char arrayDelimiter() default ','; -} diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/TwitterException.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/TwitterException.java index 7e8a018d5..aff80981e 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/TwitterException.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/TwitterException.java @@ -22,18 +22,17 @@ package org.mariotaku.twidere.api.twitter; import com.bluelinelabs.logansquare.annotation.JsonField; import com.bluelinelabs.logansquare.annotation.JsonObject; -import org.mariotaku.simplerestapi.http.RestHttpRequest; -import org.mariotaku.simplerestapi.http.RestHttpResponse; +import org.mariotaku.restfu.http.RestHttpRequest; +import org.mariotaku.restfu.http.RestHttpResponse; +import org.mariotaku.twidere.api.twitter.http.HttpResponseCode; import org.mariotaku.twidere.api.twitter.model.ErrorInfo; import org.mariotaku.twidere.api.twitter.model.RateLimitStatus; import org.mariotaku.twidere.api.twitter.model.TwitterResponse; import org.mariotaku.twidere.api.twitter.model.impl.RateLimitStatusJSONImpl; +import org.mariotaku.twidere.api.twitter.util.InternalParseUtil; import java.util.Locale; -import org.mariotaku.twidere.api.twitter.http.HttpResponseCode; -import org.mariotaku.twidere.api.twitter.util.InternalParseUtil; - /** * An exception class that will be thrown when TwitterAPI calls are failed.
* In case the Twitter server returned HTTP error code, you can get the HTTP @@ -84,13 +83,16 @@ public class TwitterException extends Exception implements TwitterResponse, Http this(message); setResponse(res); request = req; - statusCode = res != null ? res.getStatus() : -1; } public void setResponse(RestHttpResponse res) { response = res; if (res != null) { rateLimitStatus = RateLimitStatusJSONImpl.createFromResponseHeader(res); + statusCode = res.getStatus(); + } else { + rateLimitStatus = null; + statusCode = -1; } } diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/TwitterOAuth.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/TwitterOAuth.java index 746b00a01..8cb75a211 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/TwitterOAuth.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/TwitterOAuth.java @@ -20,11 +20,11 @@ package org.mariotaku.twidere.api.twitter; -import org.mariotaku.simplerestapi.http.BodyType; -import org.mariotaku.simplerestapi.method.POST; -import org.mariotaku.simplerestapi.param.Body; -import org.mariotaku.simplerestapi.param.Extra; -import org.mariotaku.simplerestapi.param.Form; +import org.mariotaku.restfu.annotation.method.POST; +import org.mariotaku.restfu.annotation.param.Body; +import org.mariotaku.restfu.annotation.param.Extra; +import org.mariotaku.restfu.annotation.param.Form; +import org.mariotaku.restfu.http.BodyType; import org.mariotaku.twidere.api.twitter.auth.OAuthToken; /** diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/TwitterUpload.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/TwitterUpload.java index a09d8d183..772504ba5 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/TwitterUpload.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/TwitterUpload.java @@ -19,16 +19,15 @@ package org.mariotaku.twidere.api.twitter; -import org.mariotaku.simplerestapi.http.BodyType; -import org.mariotaku.simplerestapi.http.mime.FileTypedData; -import org.mariotaku.simplerestapi.method.POST; -import org.mariotaku.simplerestapi.param.Body; -import org.mariotaku.simplerestapi.param.Part; +import org.mariotaku.restfu.annotation.method.POST; +import org.mariotaku.restfu.annotation.param.Body; +import org.mariotaku.restfu.annotation.param.Part; +import org.mariotaku.restfu.http.BodyType; +import org.mariotaku.restfu.http.mime.FileTypedData; import java.io.File; import org.mariotaku.twidere.api.twitter.model.MediaUploadResponse; -import org.mariotaku.twidere.api.twitter.TwitterException; @SuppressWarnings("RedundantThrows") public interface TwitterUpload { diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/TwitterUserStream.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/TwitterUserStream.java new file mode 100644 index 000000000..cb488f20e --- /dev/null +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/TwitterUserStream.java @@ -0,0 +1,32 @@ +/* + * Twidere - Twitter client for Android + * + * Copyright (C) 2012-2015 Mariotaku Lee + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.mariotaku.twidere.api.twitter; + +import org.mariotaku.restfu.annotation.method.GET; + +/** + * Created by mariotaku on 15/5/26. + */ +public interface TwitterUserStream { + + @GET("/user.json") + void getUserStream(UserStreamCallback callback); + +} diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/UserStreamCallback.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/UserStreamCallback.java new file mode 100644 index 000000000..b651a0f84 --- /dev/null +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/UserStreamCallback.java @@ -0,0 +1,185 @@ +/* + * Twidere - Twitter client for Android + * + * Copyright (C) 2012-2015 Mariotaku Lee + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.mariotaku.twidere.api.twitter; + +import com.bluelinelabs.logansquare.LoganSquare; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +import org.mariotaku.restfu.callback.RawCallback; +import org.mariotaku.restfu.http.RestHttpResponse; +import org.mariotaku.twidere.api.twitter.model.DirectMessage; +import org.mariotaku.twidere.api.twitter.model.Status; +import org.mariotaku.twidere.api.twitter.model.StatusDeletionNotice; +import org.mariotaku.twidere.api.twitter.model.User; +import org.mariotaku.twidere.api.twitter.model.UserList; +import org.mariotaku.twidere.api.twitter.model.Warning; +import org.mariotaku.twidere.api.twitter.util.CRLFLineReader; +import org.mariotaku.twidere.api.twitter.util.JSONObjectType; + +import java.io.IOException; +import java.io.InputStreamReader; + +/** + * Created by mariotaku on 15/5/26. + */ +public abstract class UserStreamCallback implements RawCallback { + + private boolean disconnected; + + @Override + public final void result(final RestHttpResponse response) throws IOException { + if (!response.isSuccessful()) { + final TwitterException cause = new TwitterException(); + cause.setResponse(response); + onException(cause); + return; + } + final ObjectMapper mapper = new ObjectMapper(LoganSquare.JSON_FACTORY); + final CRLFLineReader reader = new CRLFLineReader(new InputStreamReader(response.getBody().stream(), "UTF-8")); + for (String line; (line = reader.readLine()) != null && !disconnected; ) { + if (line.isEmpty()) continue; + JsonNode rootNode = mapper.readTree(line); + switch (JSONObjectType.determine(rootNode)) { + case SENDER: { + break; + } + case STATUS: { + onStatus(LoganSquare.mapperFor(Status.class).parse(rootNode.traverse())); + break; + } + case DIRECT_MESSAGE: { + onDirectMessage(LoganSquare.mapperFor(DirectMessage.class).parse(rootNode.traverse())); + break; + } + case DELETE: { + break; + } + case LIMIT: + break; + case STALL_WARNING: + break; + case SCRUB_GEO: + break; + case FRIENDS: + break; + case FAVORITE: { + onFavorite(parse(User.class, rootNode.get("source")), + parse(User.class, rootNode.get("target")), + parse(Status.class, rootNode.get("target_object"))); + break; + } + case UNFAVORITE: + break; + case FOLLOW: + break; + case UNFOLLOW: + break; + case USER_LIST_MEMBER_ADDED: + break; + case USER_LIST_MEMBER_DELETED: + break; + case USER_LIST_SUBSCRIBED: + break; + case USER_LIST_UNSUBSCRIBED: + break; + case USER_LIST_CREATED: + break; + case USER_LIST_UPDATED: + break; + case USER_LIST_DESTROYED: + break; + case USER_UPDATE: + break; + case USER_DELETE: + break; + case USER_SUSPEND: + break; + case BLOCK: + break; + case UNBLOCK: + break; + case DISCONNECTION: + break; + case UNKNOWN: + break; + } + } + reader.close(); + response.close(); + } + + private static T parse(final Class cls, final JsonNode json) throws IOException { + return LoganSquare.mapperFor(cls).parse(json.traverse()); + } + + @Override + public final void error(final Throwable cause) { + onException(cause); + } + + public void disconnect() { + disconnected = true; + } + + public abstract void onBlock(User source, User blockedUser); + + public abstract void onDeletionNotice(long directMessageId, long userId); + + public abstract void onDeletionNotice(StatusDeletionNotice statusDeletionNotice); + + public abstract void onDirectMessage(DirectMessage directMessage); + + public abstract void onException(Throwable ex); + + public abstract void onFavorite(User source, User target, Status favoritedStatus); + + public abstract void onFollow(User source, User followedUser); + + public abstract void onFriendList(long[] friendIds); + + public abstract void onScrubGeo(long userId, long upToStatusId); + + public abstract void onStallWarning(Warning warn); + + public abstract void onStatus(Status status); + + public abstract void onTrackLimitationNotice(int numberOfLimitedStatuses); + + public abstract void onUnblock(User source, User unblockedUser); + + public abstract void onUnfavorite(User source, User target, Status unfavoritedStatus); + + public abstract void onUserListCreation(User listOwner, UserList list); + + public abstract void onUserListDeletion(User listOwner, UserList list); + + public abstract void onUserListMemberAddition(User addedMember, User listOwner, UserList list); + + public abstract void onUserListMemberDeletion(User deletedMember, User listOwner, UserList list); + + public abstract void onUserListSubscription(User subscriber, User listOwner, UserList list); + + public abstract void onUserListUnsubscription(User subscriber, User listOwner, UserList list); + + public abstract void onUserListUpdate(User listOwner, UserList list); + + public abstract void onUserProfileUpdate(User updatedUser); +} diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/DirectMessagesResources.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/DirectMessagesResources.java index bb7420125..854375bbc 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/DirectMessagesResources.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/DirectMessagesResources.java @@ -19,12 +19,12 @@ package org.mariotaku.twidere.api.twitter.api; -import org.mariotaku.simplerestapi.http.BodyType; -import org.mariotaku.simplerestapi.method.GET; -import org.mariotaku.simplerestapi.method.POST; -import org.mariotaku.simplerestapi.param.Body; -import org.mariotaku.simplerestapi.param.Form; -import org.mariotaku.simplerestapi.param.Query; +import org.mariotaku.restfu.annotation.method.GET; +import org.mariotaku.restfu.annotation.method.POST; +import org.mariotaku.restfu.annotation.param.Body; +import org.mariotaku.restfu.annotation.param.Form; +import org.mariotaku.restfu.annotation.param.Query; +import org.mariotaku.restfu.http.BodyType; import org.mariotaku.twidere.api.twitter.model.DirectMessage; import org.mariotaku.twidere.api.twitter.model.Paging; diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/FavoritesResources.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/FavoritesResources.java index 9f859faa8..de4cce89f 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/FavoritesResources.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/FavoritesResources.java @@ -19,17 +19,16 @@ package org.mariotaku.twidere.api.twitter.api; -import org.mariotaku.simplerestapi.http.BodyType; -import org.mariotaku.simplerestapi.method.GET; -import org.mariotaku.simplerestapi.method.POST; -import org.mariotaku.simplerestapi.param.Body; -import org.mariotaku.simplerestapi.param.Form; -import org.mariotaku.simplerestapi.param.Query; - +import org.mariotaku.restfu.annotation.method.GET; +import org.mariotaku.restfu.annotation.method.POST; +import org.mariotaku.restfu.annotation.param.Body; +import org.mariotaku.restfu.annotation.param.Form; +import org.mariotaku.restfu.annotation.param.Query; +import org.mariotaku.restfu.http.BodyType; +import org.mariotaku.twidere.api.twitter.TwitterException; import org.mariotaku.twidere.api.twitter.model.Paging; import org.mariotaku.twidere.api.twitter.model.ResponseList; import org.mariotaku.twidere.api.twitter.model.Status; -import org.mariotaku.twidere.api.twitter.TwitterException; /** * @author Joern Huxhorn - jhuxhorn at googlemail.com diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/FriendsFollowersResources.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/FriendsFollowersResources.java index e625cf389..ec6ed84b2 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/FriendsFollowersResources.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/FriendsFollowersResources.java @@ -19,12 +19,12 @@ package org.mariotaku.twidere.api.twitter.api; -import org.mariotaku.simplerestapi.http.BodyType; -import org.mariotaku.simplerestapi.method.GET; -import org.mariotaku.simplerestapi.method.POST; -import org.mariotaku.simplerestapi.param.Body; -import org.mariotaku.simplerestapi.param.Form; -import org.mariotaku.simplerestapi.param.Query; +import org.mariotaku.restfu.annotation.method.GET; +import org.mariotaku.restfu.annotation.method.POST; +import org.mariotaku.restfu.annotation.param.Body; +import org.mariotaku.restfu.annotation.param.Form; +import org.mariotaku.restfu.annotation.param.Query; +import org.mariotaku.restfu.http.BodyType; import org.mariotaku.twidere.api.twitter.TwitterException; import org.mariotaku.twidere.api.twitter.model.Friendship; import org.mariotaku.twidere.api.twitter.model.FriendshipUpdate; diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/HelpResources.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/HelpResources.java index 545b3e9ee..b6ed0d129 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/HelpResources.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/HelpResources.java @@ -19,7 +19,7 @@ package org.mariotaku.twidere.api.twitter.api; -import org.mariotaku.simplerestapi.method.GET; +import org.mariotaku.restfu.annotation.method.GET; import org.mariotaku.twidere.api.twitter.TwitterException; import org.mariotaku.twidere.api.twitter.model.Language; import org.mariotaku.twidere.api.twitter.model.RateLimitStatus; diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/ListsResources.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/ListsResources.java index e53feba3b..dde729229 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/ListsResources.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/ListsResources.java @@ -19,12 +19,12 @@ package org.mariotaku.twidere.api.twitter.api; -import org.mariotaku.simplerestapi.http.BodyType; -import org.mariotaku.simplerestapi.method.GET; -import org.mariotaku.simplerestapi.method.POST; -import org.mariotaku.simplerestapi.param.Body; -import org.mariotaku.simplerestapi.param.Form; -import org.mariotaku.simplerestapi.param.Query; +import org.mariotaku.restfu.annotation.method.GET; +import org.mariotaku.restfu.annotation.method.POST; +import org.mariotaku.restfu.annotation.param.Body; +import org.mariotaku.restfu.annotation.param.Form; +import org.mariotaku.restfu.annotation.param.Query; +import org.mariotaku.restfu.http.BodyType; import org.mariotaku.twidere.api.twitter.TwitterException; import org.mariotaku.twidere.api.twitter.model.PageableResponseList; import org.mariotaku.twidere.api.twitter.model.Paging; diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/PrivateActivityResources.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/PrivateActivityResources.java index 481d81442..cba25fa3b 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/PrivateActivityResources.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/PrivateActivityResources.java @@ -19,8 +19,8 @@ package org.mariotaku.twidere.api.twitter.api; -import org.mariotaku.simplerestapi.method.GET; -import org.mariotaku.simplerestapi.param.Query; +import org.mariotaku.restfu.annotation.method.GET; +import org.mariotaku.restfu.annotation.param.Query; import org.mariotaku.twidere.api.twitter.TwitterException; import org.mariotaku.twidere.api.twitter.model.Activity; import org.mariotaku.twidere.api.twitter.model.Paging; diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/PrivateDirectMessagesResources.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/PrivateDirectMessagesResources.java index 2d62920c7..bc98a745e 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/PrivateDirectMessagesResources.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/PrivateDirectMessagesResources.java @@ -19,10 +19,10 @@ package org.mariotaku.twidere.api.twitter.api; -import org.mariotaku.simplerestapi.http.BodyType; -import org.mariotaku.simplerestapi.method.POST; -import org.mariotaku.simplerestapi.param.Body; -import org.mariotaku.simplerestapi.param.Path; +import org.mariotaku.restfu.annotation.method.POST; +import org.mariotaku.restfu.annotation.param.Body; +import org.mariotaku.restfu.annotation.param.Path; +import org.mariotaku.restfu.http.BodyType; import org.mariotaku.twidere.api.twitter.TwitterException; @SuppressWarnings("RedundantThrows") diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/PrivateTimelinesResources.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/PrivateTimelinesResources.java index 8c4a8d2dc..47c8fec2d 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/PrivateTimelinesResources.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/PrivateTimelinesResources.java @@ -19,8 +19,8 @@ package org.mariotaku.twidere.api.twitter.api; -import org.mariotaku.simplerestapi.method.GET; -import org.mariotaku.simplerestapi.param.Query; +import org.mariotaku.restfu.annotation.method.GET; +import org.mariotaku.restfu.annotation.param.Query; import org.mariotaku.twidere.api.twitter.TwitterException; import org.mariotaku.twidere.api.twitter.model.Paging; import org.mariotaku.twidere.api.twitter.model.ResponseList; diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/PrivateTweetResources.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/PrivateTweetResources.java index eaaa1c0c5..c0930ac98 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/PrivateTweetResources.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/PrivateTweetResources.java @@ -19,9 +19,9 @@ package org.mariotaku.twidere.api.twitter.api; -import org.mariotaku.simplerestapi.method.GET; -import org.mariotaku.simplerestapi.param.Path; -import org.mariotaku.simplerestapi.param.Query; +import org.mariotaku.restfu.annotation.method.GET; +import org.mariotaku.restfu.annotation.param.Path; +import org.mariotaku.restfu.annotation.param.Query; import org.mariotaku.twidere.api.twitter.TwitterException; import org.mariotaku.twidere.api.twitter.model.Paging; import org.mariotaku.twidere.api.twitter.model.ResponseList; diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/SavedSearchesResources.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/SavedSearchesResources.java index 7b3399a99..d823d01fa 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/SavedSearchesResources.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/SavedSearchesResources.java @@ -19,12 +19,12 @@ package org.mariotaku.twidere.api.twitter.api; -import org.mariotaku.simplerestapi.http.BodyType; -import org.mariotaku.simplerestapi.method.GET; -import org.mariotaku.simplerestapi.method.POST; -import org.mariotaku.simplerestapi.param.Body; -import org.mariotaku.simplerestapi.param.Form; -import org.mariotaku.simplerestapi.param.Path; +import org.mariotaku.restfu.annotation.method.GET; +import org.mariotaku.restfu.annotation.method.POST; +import org.mariotaku.restfu.annotation.param.Body; +import org.mariotaku.restfu.annotation.param.Form; +import org.mariotaku.restfu.annotation.param.Path; +import org.mariotaku.restfu.http.BodyType; import org.mariotaku.twidere.api.twitter.TwitterException; import org.mariotaku.twidere.api.twitter.model.ResponseList; import org.mariotaku.twidere.api.twitter.model.SavedSearch; diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/SearchResource.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/SearchResource.java index d84fefa0f..ba2fb52ff 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/SearchResource.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/SearchResource.java @@ -19,12 +19,11 @@ package org.mariotaku.twidere.api.twitter.api; -import org.mariotaku.simplerestapi.method.GET; -import org.mariotaku.simplerestapi.param.Query; - +import org.mariotaku.restfu.annotation.method.GET; +import org.mariotaku.restfu.annotation.param.Query; +import org.mariotaku.twidere.api.twitter.TwitterException; import org.mariotaku.twidere.api.twitter.model.QueryResult; import org.mariotaku.twidere.api.twitter.model.SearchQuery; -import org.mariotaku.twidere.api.twitter.TwitterException; @SuppressWarnings("RedundantThrows") public interface SearchResource { diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/SpamReportingResources.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/SpamReportingResources.java index b434a3a31..60d018572 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/SpamReportingResources.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/SpamReportingResources.java @@ -19,10 +19,10 @@ package org.mariotaku.twidere.api.twitter.api; -import org.mariotaku.simplerestapi.http.BodyType; -import org.mariotaku.simplerestapi.method.POST; -import org.mariotaku.simplerestapi.param.Body; -import org.mariotaku.simplerestapi.param.Form; +import org.mariotaku.restfu.annotation.method.POST; +import org.mariotaku.restfu.annotation.param.Body; +import org.mariotaku.restfu.annotation.param.Form; +import org.mariotaku.restfu.http.BodyType; import org.mariotaku.twidere.api.twitter.TwitterException; import org.mariotaku.twidere.api.twitter.model.User; diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/TimelinesResources.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/TimelinesResources.java index bb9ddfd84..24dcf4c01 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/TimelinesResources.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/TimelinesResources.java @@ -19,9 +19,9 @@ package org.mariotaku.twidere.api.twitter.api; -import org.mariotaku.simplerestapi.method.GET; -import org.mariotaku.simplerestapi.param.Query; +import org.mariotaku.restfu.annotation.method.GET; +import org.mariotaku.restfu.annotation.param.Query; import org.mariotaku.twidere.api.twitter.model.Paging; import org.mariotaku.twidere.api.twitter.model.ResponseList; import org.mariotaku.twidere.api.twitter.model.Status; diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/TrendsResources.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/TrendsResources.java index 9a8effd7c..849569d45 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/TrendsResources.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/TrendsResources.java @@ -19,8 +19,8 @@ package org.mariotaku.twidere.api.twitter.api; -import org.mariotaku.simplerestapi.method.GET; -import org.mariotaku.simplerestapi.param.Query; +import org.mariotaku.restfu.annotation.method.GET; +import org.mariotaku.restfu.annotation.param.Query; import org.mariotaku.twidere.api.twitter.TwitterException; import org.mariotaku.twidere.api.twitter.model.GeoLocation; import org.mariotaku.twidere.api.twitter.model.Location; diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/TweetResources.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/TweetResources.java index dd3c2b8fd..3f1c8925e 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/TweetResources.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/TweetResources.java @@ -19,13 +19,13 @@ package org.mariotaku.twidere.api.twitter.api; -import org.mariotaku.simplerestapi.http.BodyType; -import org.mariotaku.simplerestapi.method.GET; -import org.mariotaku.simplerestapi.method.POST; -import org.mariotaku.simplerestapi.param.Body; -import org.mariotaku.simplerestapi.param.Form; -import org.mariotaku.simplerestapi.param.Path; -import org.mariotaku.simplerestapi.param.Query; +import org.mariotaku.restfu.annotation.method.GET; +import org.mariotaku.restfu.annotation.method.POST; +import org.mariotaku.restfu.annotation.param.Body; +import org.mariotaku.restfu.annotation.param.Form; +import org.mariotaku.restfu.annotation.param.Path; +import org.mariotaku.restfu.annotation.param.Query; +import org.mariotaku.restfu.http.BodyType; import org.mariotaku.twidere.api.twitter.TwitterException; import org.mariotaku.twidere.api.twitter.model.IDs; import org.mariotaku.twidere.api.twitter.model.Paging; diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/UsersResources.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/UsersResources.java index 4f7825596..ff6089dcb 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/UsersResources.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/api/UsersResources.java @@ -19,14 +19,14 @@ package org.mariotaku.twidere.api.twitter.api; -import org.mariotaku.simplerestapi.http.BodyType; -import org.mariotaku.simplerestapi.http.mime.FileTypedData; -import org.mariotaku.simplerestapi.method.GET; -import org.mariotaku.simplerestapi.method.POST; -import org.mariotaku.simplerestapi.param.Body; -import org.mariotaku.simplerestapi.param.Form; -import org.mariotaku.simplerestapi.param.Part; -import org.mariotaku.simplerestapi.param.Query; +import org.mariotaku.restfu.annotation.method.GET; +import org.mariotaku.restfu.annotation.method.POST; +import org.mariotaku.restfu.annotation.param.Body; +import org.mariotaku.restfu.annotation.param.Form; +import org.mariotaku.restfu.annotation.param.Part; +import org.mariotaku.restfu.annotation.param.Query; +import org.mariotaku.restfu.http.BodyType; +import org.mariotaku.restfu.http.mime.FileTypedData; import org.mariotaku.twidere.api.twitter.TwitterException; import org.mariotaku.twidere.api.twitter.model.AccountSettings; import org.mariotaku.twidere.api.twitter.model.Category; diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/auth/BasicAuthorization.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/auth/BasicAuthorization.java index b5110e84c..bbc314bb8 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/auth/BasicAuthorization.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/auth/BasicAuthorization.java @@ -21,9 +21,9 @@ package org.mariotaku.twidere.api.twitter.auth; import android.util.Base64; -import org.mariotaku.simplerestapi.RequestInfo; -import org.mariotaku.simplerestapi.http.Authorization; -import org.mariotaku.simplerestapi.http.Endpoint; +import org.mariotaku.restfu.RestRequestInfo; +import org.mariotaku.restfu.http.Authorization; +import org.mariotaku.restfu.http.Endpoint; /** * Created by mariotaku on 15/4/19. @@ -39,7 +39,7 @@ public final class BasicAuthorization implements Authorization { } @Override - public String getHeader(Endpoint endpoint, RequestInfo info) { + public String getHeader(Endpoint endpoint, RestRequestInfo info) { if (!hasAuthorization()) return null; return "Basic " + Base64.encodeToString((user + ":" + password).getBytes(), Base64.NO_WRAP); } diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/auth/EmptyAuthorization.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/auth/EmptyAuthorization.java index 2fce9b87d..69f82135e 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/auth/EmptyAuthorization.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/auth/EmptyAuthorization.java @@ -19,9 +19,9 @@ package org.mariotaku.twidere.api.twitter.auth; -import org.mariotaku.simplerestapi.RequestInfo; -import org.mariotaku.simplerestapi.http.Authorization; -import org.mariotaku.simplerestapi.http.Endpoint; +import org.mariotaku.restfu.RestRequestInfo; +import org.mariotaku.restfu.http.Authorization; +import org.mariotaku.restfu.http.Endpoint; /** * Created by mariotaku on 15/4/19. @@ -29,7 +29,7 @@ import org.mariotaku.simplerestapi.http.Endpoint; public final class EmptyAuthorization implements Authorization { @Override - public String getHeader(Endpoint endpoint, RequestInfo info) { + public String getHeader(Endpoint endpoint, RestRequestInfo info) { return null; } diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/auth/OAuthAuthorization.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/auth/OAuthAuthorization.java index 432331ab2..7a5ed06f4 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/auth/OAuthAuthorization.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/auth/OAuthAuthorization.java @@ -22,10 +22,10 @@ package org.mariotaku.twidere.api.twitter.auth; import android.util.Base64; import android.util.Pair; -import org.mariotaku.simplerestapi.RequestInfo; -import org.mariotaku.simplerestapi.Utils; -import org.mariotaku.simplerestapi.http.Authorization; -import org.mariotaku.simplerestapi.http.Endpoint; +import org.mariotaku.restfu.RestRequestInfo; +import org.mariotaku.restfu.Utils; +import org.mariotaku.restfu.http.Authorization; +import org.mariotaku.restfu.http.Endpoint; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; @@ -130,7 +130,7 @@ public class OAuthAuthorization implements Authorization, OAuthSupport { } @Override - public String getHeader(Endpoint endpoint, RequestInfo request) { + public String getHeader(Endpoint endpoint, RestRequestInfo request) { if (!(endpoint instanceof OAuthEndpoint)) throw new IllegalArgumentException("OAuthEndpoint required"); final OAuthEndpoint oauthEndpoint = (OAuthEndpoint) endpoint; diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/auth/OAuthEndpoint.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/auth/OAuthEndpoint.java index fbc078db5..daf85db64 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/auth/OAuthEndpoint.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/auth/OAuthEndpoint.java @@ -19,7 +19,7 @@ package org.mariotaku.twidere.api.twitter.auth; -import org.mariotaku.simplerestapi.http.Endpoint; +import org.mariotaku.restfu.http.Endpoint; /** * Created by mariotaku on 15/2/6. diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/auth/OAuthToken.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/auth/OAuthToken.java index 4f4e70409..51a5f41fe 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/auth/OAuthToken.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/auth/OAuthToken.java @@ -19,9 +19,10 @@ package org.mariotaku.twidere.api.twitter.auth; -import org.apache.commons.lang3.tuple.Pair; -import org.mariotaku.simplerestapi.Utils; -import org.mariotaku.simplerestapi.http.ValueMap; +import android.util.Pair; + +import org.mariotaku.restfu.Utils; +import org.mariotaku.restfu.http.ValueMap; import java.nio.charset.Charset; import java.text.ParseException; @@ -63,21 +64,21 @@ public class OAuthToken implements ValueMap { List> params = new ArrayList<>(); Utils.parseGetParameters(body, params, charset.name()); for (Pair param : params) { - switch (param.getKey()) { + switch (param.first) { case "oauth_token": { - oauthToken = param.getValue(); + oauthToken = param.second; break; } case "oauth_token_secret": { - oauthTokenSecret = param.getValue(); + oauthTokenSecret = param.second; break; } case "user_id": { - userId = Long.parseLong(param.getValue()); + userId = Long.parseLong(param.second); break; } case "screen_name": { - screenName = param.getValue(); + screenName = param.second; break; } } diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/FriendshipUpdate.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/FriendshipUpdate.java index 095ecfdfd..4872c8bb9 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/FriendshipUpdate.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/FriendshipUpdate.java @@ -19,7 +19,7 @@ package org.mariotaku.twidere.api.twitter.model; -import org.mariotaku.simplerestapi.http.SimpleValueMap; +import org.mariotaku.restfu.http.SimpleValueMap; /** * Created by mariotaku on 15/5/13. diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/GeoLocation.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/GeoLocation.java index f4ee75ee4..b6dcf12db 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/GeoLocation.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/GeoLocation.java @@ -24,7 +24,7 @@ import com.bluelinelabs.logansquare.typeconverters.TypeConverter; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; -import org.mariotaku.simplerestapi.http.ValueMap; +import org.mariotaku.restfu.http.ValueMap; import org.mariotaku.twidere.api.twitter.model.impl.GeoPoint; import java.io.IOException; diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/GeoQuery.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/GeoQuery.java index dea699e19..3c28150e3 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/GeoQuery.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/GeoQuery.java @@ -19,7 +19,7 @@ package org.mariotaku.twidere.api.twitter.model; -import org.mariotaku.simplerestapi.http.ValueMap; +import org.mariotaku.restfu.http.ValueMap; /** diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/Paging.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/Paging.java index f8ad1183f..9df132606 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/Paging.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/Paging.java @@ -19,7 +19,7 @@ package org.mariotaku.twidere.api.twitter.model; -import org.mariotaku.simplerestapi.http.SimpleValueMap; +import org.mariotaku.restfu.http.SimpleValueMap; /** * Created by mariotaku on 15/2/6. diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/ProfileUpdate.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/ProfileUpdate.java index 9d53cb6e7..6493466af 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/ProfileUpdate.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/ProfileUpdate.java @@ -19,7 +19,7 @@ package org.mariotaku.twidere.api.twitter.model; -import org.mariotaku.simplerestapi.http.SimpleValueMap; +import org.mariotaku.restfu.http.SimpleValueMap; /** * Created by mariotaku on 15/1/6. diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/SearchQuery.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/SearchQuery.java index 5d2d4f484..ed44f601a 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/SearchQuery.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/SearchQuery.java @@ -21,7 +21,7 @@ package org.mariotaku.twidere.api.twitter.model; import android.support.annotation.NonNull; -import org.mariotaku.simplerestapi.http.SimpleValueMap; +import org.mariotaku.restfu.http.SimpleValueMap; /** * A data class represents search query.
diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/SettingsUpdate.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/SettingsUpdate.java index c02e74771..ce03de436 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/SettingsUpdate.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/SettingsUpdate.java @@ -19,7 +19,7 @@ package org.mariotaku.twidere.api.twitter.model; -import org.mariotaku.simplerestapi.http.SimpleValueMap; +import org.mariotaku.restfu.http.SimpleValueMap; /** * Created by mariotaku on 15/1/6. diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/StatusDeletionNotice.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/StatusDeletionNotice.java new file mode 100644 index 000000000..81d45c14e --- /dev/null +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/StatusDeletionNotice.java @@ -0,0 +1,27 @@ +/* + * Twidere - Twitter client for Android + * + * Copyright (C) 2012-2015 Mariotaku Lee + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.mariotaku.twidere.api.twitter.model; + +/** + * Created by mariotaku on 15/5/26. + */ +public interface StatusDeletionNotice { + long getStatusId(); +} diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/StatusUpdate.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/StatusUpdate.java index c11491c28..95378d354 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/StatusUpdate.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/StatusUpdate.java @@ -19,8 +19,8 @@ package org.mariotaku.twidere.api.twitter.model; -import org.mariotaku.simplerestapi.Utils; -import org.mariotaku.simplerestapi.http.SimpleValueMap; +import org.mariotaku.restfu.Utils; +import org.mariotaku.restfu.http.SimpleValueMap; public final class StatusUpdate extends SimpleValueMap { diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/TwitterResponse.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/TwitterResponse.java index e23290173..4730d8c48 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/TwitterResponse.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/TwitterResponse.java @@ -19,7 +19,7 @@ package org.mariotaku.twidere.api.twitter.model; -import org.mariotaku.simplerestapi.http.RestHttpResponse; +import org.mariotaku.restfu.http.RestHttpResponse; /** * Super interface of Twitter Response data interfaces which indicates that rate diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/UserListUpdate.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/UserListUpdate.java index 25d9e477a..552ab2ee0 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/UserListUpdate.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/UserListUpdate.java @@ -19,7 +19,7 @@ package org.mariotaku.twidere.api.twitter.model; -import org.mariotaku.simplerestapi.http.SimpleValueMap; +import org.mariotaku.restfu.http.SimpleValueMap; /** * Created by mariotaku on 15/5/8. diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/Warning.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/Warning.java new file mode 100644 index 000000000..4fd515517 --- /dev/null +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/Warning.java @@ -0,0 +1,26 @@ +/* + * Twidere - Twitter client for Android + * + * Copyright (C) 2012-2015 Mariotaku Lee + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.mariotaku.twidere.api.twitter.model; + +/** + * Created by mariotaku on 15/5/26. + */ +public interface Warning { +} diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/CardEntityImpl.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/CardEntityImpl.java index 59eac3354..107d975af 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/CardEntityImpl.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/CardEntityImpl.java @@ -26,7 +26,7 @@ import com.bluelinelabs.logansquare.typeconverters.TypeConverter; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; -import org.mariotaku.simplerestapi.http.RestHttpResponse; +import org.mariotaku.restfu.http.RestHttpResponse; import org.mariotaku.twidere.api.twitter.model.CardEntity; import org.mariotaku.twidere.api.twitter.model.RateLimitStatus; import org.mariotaku.twidere.api.twitter.model.User; diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/RateLimitStatusJSONImpl.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/RateLimitStatusJSONImpl.java index ffdf779c3..a38b515fb 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/RateLimitStatusJSONImpl.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/RateLimitStatusJSONImpl.java @@ -22,7 +22,7 @@ package org.mariotaku.twidere.api.twitter.model.impl; import com.bluelinelabs.logansquare.annotation.JsonField; import com.bluelinelabs.logansquare.annotation.JsonObject; -import org.mariotaku.simplerestapi.http.RestHttpResponse; +import org.mariotaku.restfu.http.RestHttpResponse; import org.mariotaku.twidere.api.twitter.model.RateLimitStatus; diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/ResponseListImpl.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/ResponseListImpl.java index 8f5b52329..8a3b2a3e0 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/ResponseListImpl.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/ResponseListImpl.java @@ -19,7 +19,7 @@ package org.mariotaku.twidere.api.twitter.model.impl; -import org.mariotaku.simplerestapi.http.RestHttpResponse; +import org.mariotaku.restfu.http.RestHttpResponse; import java.util.ArrayList; import java.util.Collection; diff --git a/twidere.extension.streaming/src/main/java/org/mariotaku/twidere/extension/streaming/util/OkHttpClientFactory.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/StatusDeletionNoticeImpl.java similarity index 56% rename from twidere.extension.streaming/src/main/java/org/mariotaku/twidere/extension/streaming/util/OkHttpClientFactory.java rename to twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/StatusDeletionNoticeImpl.java index 94f1b5173..2aaea02cf 100644 --- a/twidere.extension.streaming/src/main/java/org/mariotaku/twidere/extension/streaming/util/OkHttpClientFactory.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/StatusDeletionNoticeImpl.java @@ -1,5 +1,5 @@ /* - * Twidere - Twitter client for Android + * Twidere - Twitter client for Android * * Copyright (C) 2012-2015 Mariotaku Lee * @@ -17,24 +17,19 @@ * along with this program. If not, see . */ -package org.mariotaku.twidere.extension.streaming.util; +package org.mariotaku.twidere.api.twitter.model.impl; -import android.content.Context; +import com.bluelinelabs.logansquare.annotation.JsonObject; -import org.mariotaku.twidere.api.twitter.http.HttpClient; -import org.mariotaku.twidere.api.twitter.http.HttpClientConfiguration; -import org.mariotaku.twidere.api.twitter.http.HttpClientFactory; +import org.mariotaku.twidere.api.twitter.model.StatusDeletionNotice; /** - * Created by mariotaku on 15/1/22. + * Created by mariotaku on 15/5/26. */ -public class OkHttpClientFactory implements HttpClientFactory { - public OkHttpClientFactory(Context context) { - - } - +@JsonObject +public class StatusDeletionNoticeImpl implements StatusDeletionNotice { @Override - public HttpClient getInstance(HttpClientConfiguration conf) { - return new OkHttpClientImpl(conf); + public long getStatusId() { + return 0; } } diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/TwitterResponseImpl.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/TwitterResponseImpl.java index c14bf2ff1..e1c43f63d 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/TwitterResponseImpl.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/TwitterResponseImpl.java @@ -19,7 +19,7 @@ package org.mariotaku.twidere.api.twitter.model.impl; -import org.mariotaku.simplerestapi.http.RestHttpResponse; +import org.mariotaku.restfu.http.RestHttpResponse; import org.mariotaku.twidere.api.twitter.model.RateLimitStatus; import org.mariotaku.twidere.api.twitter.model.TwitterResponse; diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/WarningImpl.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/WarningImpl.java new file mode 100644 index 000000000..cda730335 --- /dev/null +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/model/impl/WarningImpl.java @@ -0,0 +1,31 @@ +/* + * Twidere - Twitter client for Android + * + * Copyright (C) 2012-2015 Mariotaku Lee + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.mariotaku.twidere.api.twitter.model.impl; + +import com.bluelinelabs.logansquare.annotation.JsonObject; + +import org.mariotaku.twidere.api.twitter.model.Warning; + +/** + * Created by mariotaku on 15/5/26. + */ +@JsonObject +public class WarningImpl implements Warning { +} diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/util/CRLFLineReader.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/util/CRLFLineReader.java new file mode 100644 index 000000000..6a5ce660a --- /dev/null +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/util/CRLFLineReader.java @@ -0,0 +1,79 @@ +/* + * Twidere - Twitter client for Android + * + * Copyright (C) 2012-2015 Mariotaku Lee + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.mariotaku.twidere.api.twitter.util; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.Reader; + +/** + * CRLFLineReader implements a readLine() method that requires + * exactly CRLF to terminate an input line. + * This is required for IMAP, which allows bare CR and LF. + * + * @since 3.0 + */ +public final class CRLFLineReader extends BufferedReader +{ + private static final char LF = '\n'; + private static final char CR = '\r'; + + /** + * Creates a CRLFLineReader that wraps an existing Reader + * input source. + * @param reader The Reader input source. + */ + public CRLFLineReader(Reader reader) + { + super(reader); + } + + /** + * Read a line of text. + * A line is considered to be terminated by carriage return followed immediately by a linefeed. + * This contrasts with BufferedReader which also allows other combinations. + * @since 3.0 + */ + @Override + public String readLine() throws IOException { + StringBuilder sb = new StringBuilder(); + int intch; + boolean prevWasCR = false; + synchronized(lock) { // make thread-safe (hopefully!) + while((intch = read()) != -1) + { + if (prevWasCR && intch == LF) { + return sb.substring(0, sb.length()-1); + } + if (intch == CR) { + prevWasCR = true; + } else { + prevWasCR = false; + } + sb.append((char) intch); + } + } + String string = sb.toString(); + if (string.length() == 0) { // immediate EOF + return null; + } + return string; + } +} \ No newline at end of file diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/util/InternalParseUtil.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/util/InternalParseUtil.java index 1f858eca5..26ecbae45 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/util/InternalParseUtil.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/util/InternalParseUtil.java @@ -19,7 +19,7 @@ package org.mariotaku.twidere.api.twitter.util; -import org.mariotaku.simplerestapi.http.RestHttpResponse; +import org.mariotaku.restfu.http.RestHttpResponse; import org.mariotaku.twidere.api.twitter.model.TwitterResponse; /** diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/util/JSONObjectType.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/util/JSONObjectType.java new file mode 100644 index 000000000..26df201e5 --- /dev/null +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/util/JSONObjectType.java @@ -0,0 +1,132 @@ +/* + * Twidere - Twitter client for Android + * + * Copyright (C) 2012-2015 Mariotaku Lee + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.mariotaku.twidere.api.twitter.util; + +import com.fasterxml.jackson.databind.JsonNode; + +/** + * @author Dan Checkoway - dcheckoway at gmail.com + * @since Twitter4J 2.1.9 + */ +public final class JSONObjectType { + public enum Type { + SENDER, + STATUS, + DIRECT_MESSAGE, + DELETE, + LIMIT, + STALL_WARNING, + SCRUB_GEO, + FRIENDS, + FAVORITE, + UNFAVORITE, + FOLLOW, + UNFOLLOW, + USER_LIST_MEMBER_ADDED, + USER_LIST_MEMBER_DELETED, + USER_LIST_SUBSCRIBED, + USER_LIST_UNSUBSCRIBED, + USER_LIST_CREATED, + USER_LIST_UPDATED, + USER_LIST_DESTROYED, + USER_UPDATE, + USER_DELETE, + USER_SUSPEND, + BLOCK, + UNBLOCK, + DISCONNECTION, + UNKNOWN + } + + + /** + * Determine the respective object type for a given JSONObject. This + * method inspects the object to figure out what type of object it + * represents. This is useful when processing JSON events of mixed type + * from a stream, in which case you may need to know what type of object + * to construct, or how to handle the event properly. + * + * @param json the JSONObject whose type should be determined + * @return the determined JSONObjectType, or null if not recognized + */ + public static Type determine(JsonNode json) { + // This code originally lived in AbstractStreamImplementation. + // I've moved it in here to expose it as a public encapsulation of + // the object type determination logic. + if (json.hasNonNull("sender")) { + return Type.SENDER; + } else if (json.hasNonNull("text")) { + return Type.STATUS; + } else if (json.hasNonNull("direct_message")) { + return Type.DIRECT_MESSAGE; + } else if (json.hasNonNull("delete")) { + return Type.DELETE; + } else if (json.hasNonNull("limit")) { + return Type.LIMIT; + } else if (json.hasNonNull("warning")) { + return Type.STALL_WARNING; + } else if (json.hasNonNull("scrub_geo")) { + return Type.SCRUB_GEO; + } else if (json.hasNonNull("friends")) { + return Type.FRIENDS; + } else if (json.hasNonNull("event")) { + String event; + event = json.get("event").asText("event"); + if ("favorite".equals(event)) { + return Type.FAVORITE; + } else if ("unfavorite".equals(event)) { + return Type.UNFAVORITE; + } else if ("follow".equals(event)) { + return Type.FOLLOW; + } else if ("unfollow".equals(event)) { + return Type.UNFOLLOW; + } else if (event.startsWith("list")) { + if ("list_member_added".equals(event)) { + return Type.USER_LIST_MEMBER_ADDED; + } else if ("list_member_removed".equals(event)) { + return Type.USER_LIST_MEMBER_DELETED; + } else if ("list_user_subscribed".equals(event)) { + return Type.USER_LIST_SUBSCRIBED; + } else if ("list_user_unsubscribed".equals(event)) { + return Type.USER_LIST_UNSUBSCRIBED; + } else if ("list_created".equals(event)) { + return Type.USER_LIST_CREATED; + } else if ("list_updated".equals(event)) { + return Type.USER_LIST_UPDATED; + } else if ("list_destroyed".equals(event)) { + return Type.USER_LIST_DESTROYED; + } + } else if ("user_update".equals(event)) { + return Type.USER_UPDATE; + } else if ("user_delete".equals(event)) { + return Type.USER_DELETE; + } else if ("user_suspend".equals(event)) { + return Type.USER_SUSPEND; + } else if ("block".equals(event)) { + return Type.BLOCK; + } else if ("unblock".equals(event)) { + return Type.UNBLOCK; + } + } else if (json.hasNonNull("disconnect")) { + return Type.DISCONNECTION; + } + return Type.UNKNOWN; + } +} \ No newline at end of file diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/util/TwitterConverter.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/util/TwitterConverter.java index 8c912f234..2bf6d85ee 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/util/TwitterConverter.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/util/TwitterConverter.java @@ -25,11 +25,11 @@ import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.JsonParser; -import org.mariotaku.simplerestapi.Converter; -import org.mariotaku.simplerestapi.Utils; -import org.mariotaku.simplerestapi.http.ContentType; -import org.mariotaku.simplerestapi.http.RestHttpResponse; -import org.mariotaku.simplerestapi.http.mime.TypedData; +import org.mariotaku.restfu.Converter; +import org.mariotaku.restfu.Utils; +import org.mariotaku.restfu.http.ContentType; +import org.mariotaku.restfu.http.RestHttpResponse; +import org.mariotaku.restfu.http.mime.TypedData; import org.mariotaku.twidere.api.twitter.TwitterException; import org.mariotaku.twidere.api.twitter.auth.OAuthToken; import org.mariotaku.twidere.api.twitter.model.AccountSettings; @@ -52,6 +52,7 @@ import org.mariotaku.twidere.api.twitter.model.ResponseList; import org.mariotaku.twidere.api.twitter.model.SavedSearch; import org.mariotaku.twidere.api.twitter.model.Status; import org.mariotaku.twidere.api.twitter.model.StatusActivitySummary; +import org.mariotaku.twidere.api.twitter.model.StatusDeletionNotice; import org.mariotaku.twidere.api.twitter.model.TimeZone; import org.mariotaku.twidere.api.twitter.model.TranslationResult; import org.mariotaku.twidere.api.twitter.model.Trend; @@ -60,6 +61,7 @@ import org.mariotaku.twidere.api.twitter.model.UrlEntity; import org.mariotaku.twidere.api.twitter.model.User; import org.mariotaku.twidere.api.twitter.model.UserList; import org.mariotaku.twidere.api.twitter.model.UserMentionEntity; +import org.mariotaku.twidere.api.twitter.model.Warning; import org.mariotaku.twidere.api.twitter.model.impl.AccountSettingsImpl; import org.mariotaku.twidere.api.twitter.model.impl.ActivityImpl; import org.mariotaku.twidere.api.twitter.model.impl.CardEntityImpl; @@ -80,6 +82,7 @@ import org.mariotaku.twidere.api.twitter.model.impl.RelationshipWrapper; import org.mariotaku.twidere.api.twitter.model.impl.ResponseListImpl; import org.mariotaku.twidere.api.twitter.model.impl.SavedSearchImpl; import org.mariotaku.twidere.api.twitter.model.impl.StatusActivitySummaryImpl; +import org.mariotaku.twidere.api.twitter.model.impl.StatusDeletionNoticeImpl; import org.mariotaku.twidere.api.twitter.model.impl.StatusImpl; import org.mariotaku.twidere.api.twitter.model.impl.TimeZoneImpl; import org.mariotaku.twidere.api.twitter.model.impl.TranslationResultImpl; @@ -91,6 +94,7 @@ import org.mariotaku.twidere.api.twitter.model.impl.UrlEntityImpl; import org.mariotaku.twidere.api.twitter.model.impl.UserImpl; import org.mariotaku.twidere.api.twitter.model.impl.UserListImpl; import org.mariotaku.twidere.api.twitter.model.impl.UserMentionEntityImpl; +import org.mariotaku.twidere.api.twitter.model.impl.WarningImpl; import org.mariotaku.twidere.api.twitter.model.impl.Wrapper; import java.io.ByteArrayOutputStream; @@ -145,6 +149,8 @@ public class TwitterConverter implements Converter { TypeConverterMapper.register(AccountSettings.class, AccountSettingsImpl.class); TypeConverterMapper.register(IDs.class, IDsImpl.class, IDsImpl.MAPPER); TypeConverterMapper.register(Activity.class, ActivityImpl.class, ActivityImpl.MAPPER); + TypeConverterMapper.register(Warning.class, WarningImpl.class); + TypeConverterMapper.register(StatusDeletionNotice.class, StatusDeletionNoticeImpl.class); LoganSquare.registerTypeConverter(Indices.class, Indices.CONVERTER); LoganSquare.registerTypeConverter(GeoLocation.class, GeoLocation.CONVERTER); diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/constant/SharedPreferenceConstants.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/constant/SharedPreferenceConstants.java index 08f4eda96..4ee094f56 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/constant/SharedPreferenceConstants.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/constant/SharedPreferenceConstants.java @@ -21,7 +21,7 @@ package org.mariotaku.twidere.constant; import org.mariotaku.twidere.TwidereConstants; import org.mariotaku.twidere.annotation.Preference; -import org.mariotaku.twidere.provider.TwidereDataStore.Accounts; +import org.mariotaku.twidere.model.ParcelableCredentials; import static org.mariotaku.twidere.annotation.Preference.Type.BOOLEAN; import static org.mariotaku.twidere.annotation.Preference.Type.INT; @@ -240,7 +240,7 @@ public interface SharedPreferenceConstants { String KEY_SAME_OAUTH_SIGNING_URL = "same_oauth_signing_url"; @Preference(type = BOOLEAN, hasDefault = true, defaultBoolean = false) String KEY_NO_VERSION_SUFFIX = "no_version_suffix"; - @Preference(type = INT, hasDefault = true, defaultInt = Accounts.AUTH_TYPE_OAUTH) + @Preference(type = INT, hasDefault = true, defaultInt = ParcelableCredentials.AUTH_TYPE_OAUTH) String KEY_AUTH_TYPE = "auth_type"; @Preference(type = STRING, hasDefault = true, defaultString = TwidereConstants.TWITTER_CONSUMER_KEY) String KEY_CONSUMER_KEY = "consumer_key"; diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableAccount.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableAccount.java index 6c5b2b0d1..10b0f8118 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableAccount.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableAccount.java @@ -29,6 +29,8 @@ import android.support.annotation.Nullable; import com.bluelinelabs.logansquare.annotation.JsonField; import com.bluelinelabs.logansquare.annotation.JsonObject; +import com.hannesdorfmann.parcelableplease.annotation.ParcelablePlease; +import com.hannesdorfmann.parcelableplease.annotation.ParcelableThisPlease; import org.mariotaku.querybuilder.Columns.Column; import org.mariotaku.querybuilder.Expression; @@ -41,6 +43,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +@ParcelablePlease(allFields = false) @JsonObject public class ParcelableAccount implements Parcelable { @@ -57,28 +60,35 @@ public class ParcelableAccount implements Parcelable { } }; - + @ParcelableThisPlease @JsonField(name = "screen_name") public String screen_name; + @ParcelableThisPlease @JsonField(name = "name") public String name; + @ParcelableThisPlease @JsonField(name = "profile_image_url") public String profile_image_url; + @ParcelableThisPlease @JsonField(name = "profile_banner_url") public String profile_banner_url; + @ParcelableThisPlease @JsonField(name = "account_id") public long account_id; + @ParcelableThisPlease @JsonField(name = "color") public int color; + @ParcelableThisPlease @JsonField(name = "is_activated") public boolean is_activated; + @ParcelableThisPlease @JsonField(name = "is_dummy") public boolean is_dummy; @@ -95,14 +105,7 @@ public class ParcelableAccount implements Parcelable { } public ParcelableAccount(final Parcel source) { - is_dummy = source.readInt() == 1; - is_activated = source.readInt() == 1; - account_id = source.readLong(); - name = source.readString(); - screen_name = source.readString(); - profile_image_url = source.readString(); - profile_banner_url = source.readString(); - color = source.readInt(); + ParcelableAccountParcelablePlease.readFromParcel(this, source); } public ParcelableAccount() { @@ -116,14 +119,7 @@ public class ParcelableAccount implements Parcelable { @Override public void writeToParcel(final Parcel out, final int flags) { - out.writeInt(is_dummy ? 1 : 0); - out.writeInt(is_activated ? 1 : 0); - out.writeLong(account_id); - out.writeString(name); - out.writeString(screen_name); - out.writeString(profile_image_url); - out.writeString(profile_banner_url); - out.writeInt(color); + ParcelableAccountParcelablePlease.writeToParcel(this, out, flags); } public static ParcelableAccount dummyAccount() { @@ -287,109 +283,6 @@ public class ParcelableAccount implements Parcelable { + ", is_activated=" + is_activated + ", is_dummy=" + is_dummy + "}"; } - @JsonObject - public static class ParcelableCredentials extends ParcelableAccount { - - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { - - @Override - public ParcelableCredentials createFromParcel(final Parcel in) { - return new ParcelableCredentials(in); - } - - @Override - public ParcelableCredentials[] newArray(final int size) { - return new ParcelableCredentials[size]; - } - }; - - - @JsonField(name = "auth_type") - public int auth_type; - - @JsonField(name = "consumer_key") - public String consumer_key; - - @JsonField(name = "consumer_secret") - public String consumer_secret; - - @JsonField(name = "basic_auth_username") - public String basic_auth_username; - - @JsonField(name = "basic_auth_password") - public String basic_auth_password; - - @JsonField(name = "oauth_token") - public String oauth_token; - - @JsonField(name = "oauth_token_secret") - public String oauth_token_secret; - - @JsonField(name = "api_url_format") - public String api_url_format; - - @JsonField(name = "same_oauth_signing_url") - public boolean same_oauth_signing_url; - - @JsonField(name = "no_version_suffix") - public boolean no_version_suffix; - - public ParcelableCredentials() { - } - - public ParcelableCredentials(final Cursor cursor, final Indices indices) { - super(cursor, indices); - auth_type = cursor.getInt(indices.auth_type); - consumer_key = cursor.getString(indices.consumer_key); - consumer_secret = cursor.getString(indices.consumer_secret); - basic_auth_username = cursor.getString(indices.basic_auth_username); - basic_auth_password = cursor.getString(indices.basic_auth_password); - oauth_token = cursor.getString(indices.oauth_token); - oauth_token_secret = cursor.getString(indices.oauth_token_secret); - api_url_format = cursor.getString(indices.api_url_format); - same_oauth_signing_url = cursor.getInt(indices.same_oauth_signing_url) == 1; - no_version_suffix = cursor.getInt(indices.no_version_suffix) == 1; - } - - public ParcelableCredentials(Parcel in) { - super(in); - auth_type = in.readInt(); - consumer_key = in.readString(); - consumer_secret = in.readString(); - basic_auth_username = in.readString(); - basic_auth_password = in.readString(); - oauth_token = in.readString(); - oauth_token_secret = in.readString(); - api_url_format = in.readString(); - same_oauth_signing_url = in.readInt() == 1; - no_version_suffix = in.readInt() == 1; - } - - - @Override - public void writeToParcel(Parcel out, int flags) { - super.writeToParcel(out, flags); - out.writeInt(auth_type); - out.writeString(consumer_key); - out.writeString(consumer_secret); - out.writeString(basic_auth_username); - out.writeString(basic_auth_password); - out.writeString(oauth_token); - out.writeString(oauth_token_secret); - out.writeString(api_url_format); - out.writeInt(same_oauth_signing_url ? 1 : 0); - out.writeInt(no_version_suffix ? 1 : 0); - } - - @Override - public String toString() { - return "AccountWithCredentials{auth_type=" + auth_type + ", consumer_key=" + consumer_key - + ", consumer_secret=" + consumer_secret + ", basic_auth_password=" + basic_auth_password - + ", oauth_token=" + oauth_token + ", oauth_token_secret=" + oauth_token_secret - + ", api_url_format=" + api_url_format + ", same_oauth_signing_url=" + same_oauth_signing_url + "}"; - } - } - public static final class Indices { public final int screen_name, name, account_id, profile_image_url, profile_banner_url, color, is_activated, diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableCredentials.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableCredentials.java new file mode 100644 index 000000000..924935032 --- /dev/null +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableCredentials.java @@ -0,0 +1,124 @@ +/* + * Twidere - Twitter client for Android + * + * Copyright (C) 2012-2015 Mariotaku Lee + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.mariotaku.twidere.model; + +import android.database.Cursor; +import android.os.Parcel; +import android.os.Parcelable; + +import com.bluelinelabs.logansquare.annotation.JsonField; +import com.bluelinelabs.logansquare.annotation.JsonObject; +import com.hannesdorfmann.parcelableplease.annotation.ParcelablePlease; +import com.hannesdorfmann.parcelableplease.annotation.ParcelableThisPlease; + +/** + * Created by mariotaku on 15/5/26. + */ +@JsonObject +@ParcelablePlease(allFields = false) +public class ParcelableCredentials extends ParcelableAccount { + + public static final Creator CREATOR = new Creator() { + + @Override + public ParcelableCredentials createFromParcel(final Parcel in) { + return new ParcelableCredentials(in); + } + + @Override + public ParcelableCredentials[] newArray(final int size) { + return new ParcelableCredentials[size]; + } + }; + + public static final int AUTH_TYPE_OAUTH = 0; + public static final int AUTH_TYPE_XAUTH = 1; + public static final int AUTH_TYPE_BASIC = 2; + public static final int AUTH_TYPE_TWIP_O_MODE = 3; + + + @ParcelableThisPlease + @JsonField(name = "auth_type") + public int auth_type; + @ParcelableThisPlease + @JsonField(name = "consumer_key") + public String consumer_key; + @ParcelableThisPlease + @JsonField(name = "consumer_secret") + public String consumer_secret; + @ParcelableThisPlease + @JsonField(name = "basic_auth_username") + public String basic_auth_username; + @ParcelableThisPlease + @JsonField(name = "basic_auth_password") + public String basic_auth_password; + @ParcelableThisPlease + @JsonField(name = "oauth_token") + public String oauth_token; + @ParcelableThisPlease + @JsonField(name = "oauth_token_secret") + public String oauth_token_secret; + @ParcelableThisPlease + @JsonField(name = "api_url_format") + public String api_url_format; + @ParcelableThisPlease + @JsonField(name = "same_oauth_signing_url") + public boolean same_oauth_signing_url; + @ParcelableThisPlease + @JsonField(name = "no_version_suffix") + public boolean no_version_suffix; + + public ParcelableCredentials() { + } + + public ParcelableCredentials(final Cursor cursor, final Indices indices) { + super(cursor, indices); + auth_type = cursor.getInt(indices.auth_type); + consumer_key = cursor.getString(indices.consumer_key); + consumer_secret = cursor.getString(indices.consumer_secret); + basic_auth_username = cursor.getString(indices.basic_auth_username); + basic_auth_password = cursor.getString(indices.basic_auth_password); + oauth_token = cursor.getString(indices.oauth_token); + oauth_token_secret = cursor.getString(indices.oauth_token_secret); + api_url_format = cursor.getString(indices.api_url_format); + same_oauth_signing_url = cursor.getInt(indices.same_oauth_signing_url) == 1; + no_version_suffix = cursor.getInt(indices.no_version_suffix) == 1; + } + + public ParcelableCredentials(Parcel in) { + super(in); + ParcelableCredentialsParcelablePlease.readFromParcel(this, in); + } + + + @Override + public void writeToParcel(Parcel out, int flags) { + super.writeToParcel(out, flags); + ParcelableCredentialsParcelablePlease.writeToParcel(this, out, flags); + } + + @Override + public String toString() { + return "AccountWithCredentials{auth_type=" + auth_type + ", consumer_key=" + consumer_key + + ", consumer_secret=" + consumer_secret + ", basic_auth_password=" + basic_auth_password + + ", oauth_token=" + oauth_token + ", oauth_token_secret=" + oauth_token_secret + + ", api_url_format=" + api_url_format + ", same_oauth_signing_url=" + same_oauth_signing_url + "}"; + } +} diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableMediaUpdate.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableMediaUpdate.java index 800233904..399f1fba5 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableMediaUpdate.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableMediaUpdate.java @@ -7,11 +7,13 @@ import android.text.TextUtils; import com.bluelinelabs.logansquare.LoganSquare; import com.bluelinelabs.logansquare.annotation.JsonField; import com.bluelinelabs.logansquare.annotation.JsonObject; +import com.hannesdorfmann.parcelableplease.annotation.ParcelablePlease; import java.io.IOException; import java.util.List; @JsonObject +@ParcelablePlease(allFields = false) public class ParcelableMediaUpdate implements Parcelable { public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableStatus.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableStatus.java index 4be2e6c2a..e524a5c87 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableStatus.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableStatus.java @@ -30,7 +30,18 @@ import android.text.TextUtils; import com.bluelinelabs.logansquare.LoganSquare; import com.bluelinelabs.logansquare.annotation.JsonField; import com.bluelinelabs.logansquare.annotation.JsonObject; +import com.hannesdorfmann.parcelableplease.annotation.ParcelablePlease; +import com.hannesdorfmann.parcelableplease.annotation.ParcelableThisPlease; +import org.mariotaku.twidere.api.twitter.model.CardEntity; +import org.mariotaku.twidere.api.twitter.model.CardEntity.BindingValue; +import org.mariotaku.twidere.api.twitter.model.CardEntity.BooleanValue; +import org.mariotaku.twidere.api.twitter.model.CardEntity.ImageValue; +import org.mariotaku.twidere.api.twitter.model.CardEntity.StringValue; +import org.mariotaku.twidere.api.twitter.model.CardEntity.UserValue; +import org.mariotaku.twidere.api.twitter.model.Place; +import org.mariotaku.twidere.api.twitter.model.Status; +import org.mariotaku.twidere.api.twitter.model.User; import org.mariotaku.twidere.provider.TwidereDataStore.Statuses; import org.mariotaku.twidere.util.HtmlEscapeHelper; import org.mariotaku.twidere.util.TwitterContentUtils; @@ -43,24 +54,16 @@ import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; -import org.mariotaku.twidere.api.twitter.model.CardEntity; -import org.mariotaku.twidere.api.twitter.model.CardEntity.BindingValue; -import org.mariotaku.twidere.api.twitter.model.CardEntity.BooleanValue; -import org.mariotaku.twidere.api.twitter.model.CardEntity.ImageValue; -import org.mariotaku.twidere.api.twitter.model.CardEntity.StringValue; -import org.mariotaku.twidere.api.twitter.model.CardEntity.UserValue; -import org.mariotaku.twidere.api.twitter.model.Place; -import org.mariotaku.twidere.api.twitter.model.Status; -import org.mariotaku.twidere.api.twitter.model.User; - -@SuppressWarnings("unused") @JsonObject +@ParcelablePlease(allFields = false) public class ParcelableStatus implements Parcelable, Comparable { public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { @Override public ParcelableStatus createFromParcel(final Parcel in) { - return new ParcelableStatus(in); + ParcelableStatus status = new ParcelableStatus(); + ParcelableStatusParcelablePlease.readFromParcel(status, in); + return status; } @Override @@ -68,8 +71,7 @@ public class ParcelableStatus implements Parcelable, Comparable REVERSE_ID_COMPARATOR = new Comparator() { @Override @@ -80,10 +82,7 @@ public class ParcelableStatus implements Parcelable, Comparable TIMESTAMP_COMPARATOR = new Comparator() { @Override @@ -94,111 +93,164 @@ public class ParcelableStatus implements Parcelable, Comparable + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.mariotaku.twidere.util; + +import android.content.Context; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.text.TextUtils; +import android.util.Pair; + +import org.mariotaku.restfu.ExceptionFactory; +import org.mariotaku.restfu.HttpRequestFactory; +import org.mariotaku.restfu.RequestInfoFactory; +import org.mariotaku.restfu.RestMethodInfo; +import org.mariotaku.restfu.RestRequestInfo; +import org.mariotaku.restfu.annotation.RestMethod; +import org.mariotaku.restfu.http.Authorization; +import org.mariotaku.restfu.http.Endpoint; +import org.mariotaku.restfu.http.FileValue; +import org.mariotaku.restfu.http.RestHttpRequest; +import org.mariotaku.restfu.http.RestHttpResponse; +import org.mariotaku.restfu.http.mime.StringTypedData; +import org.mariotaku.restfu.http.mime.TypedData; +import org.mariotaku.twidere.TwidereConstants; +import org.mariotaku.twidere.api.twitter.Twitter; +import org.mariotaku.twidere.api.twitter.TwitterException; +import org.mariotaku.twidere.api.twitter.TwitterOAuth; +import org.mariotaku.twidere.api.twitter.TwitterUpload; +import org.mariotaku.twidere.api.twitter.TwitterUserStream; +import org.mariotaku.twidere.api.twitter.auth.BasicAuthorization; +import org.mariotaku.twidere.api.twitter.auth.EmptyAuthorization; +import org.mariotaku.twidere.api.twitter.auth.OAuthAuthorization; +import org.mariotaku.twidere.api.twitter.auth.OAuthEndpoint; +import org.mariotaku.twidere.api.twitter.auth.OAuthToken; +import org.mariotaku.twidere.api.twitter.util.TwitterConverter; +import org.mariotaku.twidere.model.ConsumerKeyType; +import org.mariotaku.twidere.model.ParcelableCredentials; + +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static android.text.TextUtils.isEmpty; + +/** + * Created by mariotaku on 15/5/26. + */ +public class TwitterAPIUtils implements TwidereConstants { + + public static Endpoint getEndpoint(ParcelableCredentials credentials, Class cls) { + final String apiUrlFormat; + final boolean sameOAuthSigningUrl = credentials.same_oauth_signing_url; + final boolean noVersionSuffix = credentials.no_version_suffix; + if (!isEmpty(credentials.api_url_format)) { + apiUrlFormat = credentials.api_url_format; + } else { + apiUrlFormat = DEFAULT_TWITTER_API_URL_FORMAT; + } + final String domain, versionSuffix; + if (Twitter.class.isAssignableFrom(cls)) { + domain = "api"; + versionSuffix = noVersionSuffix ? null : "/1.1/"; + } else if (TwitterUpload.class.isAssignableFrom(cls)) { + domain = "upload"; + versionSuffix = noVersionSuffix ? null : "/1.1/"; + } else if (TwitterOAuth.class.isAssignableFrom(cls)) { + domain = "api"; + versionSuffix = "oauth"; + } else if (TwitterUserStream.class.isAssignableFrom(cls)) { + domain = "userstream"; + versionSuffix = noVersionSuffix ? null : "/1.1/"; + } else { + throw new TwitterConverter.UnsupportedTypeException(cls); + } + final String endpointUrl; + endpointUrl = getApiUrl(apiUrlFormat, domain, versionSuffix); + if (credentials.auth_type == ParcelableCredentials.AUTH_TYPE_XAUTH || credentials.auth_type == ParcelableCredentials.AUTH_TYPE_OAUTH) { + final String signEndpointUrl; + if (!sameOAuthSigningUrl) { + signEndpointUrl = getApiUrl(DEFAULT_TWITTER_API_URL_FORMAT, domain, versionSuffix); + } else { + signEndpointUrl = endpointUrl; + } + return new OAuthEndpoint(endpointUrl, signEndpointUrl); + } + return new Endpoint(endpointUrl); + } + + public static Authorization getAuthorization(ParcelableCredentials credentials) { + switch (credentials.auth_type) { + case ParcelableCredentials.AUTH_TYPE_OAUTH: + case ParcelableCredentials.AUTH_TYPE_XAUTH: { + final String consumerKey = TextUtils.isEmpty(credentials.consumer_key) ? + TWITTER_CONSUMER_KEY_LEGACY : credentials.consumer_key; + final String consumerSecret = TextUtils.isEmpty(credentials.consumer_secret) ? + TWITTER_CONSUMER_SECRET_LEGACY : credentials.consumer_secret; + final OAuthToken accessToken = new OAuthToken(credentials.oauth_token, credentials.oauth_token_secret); + return new OAuthAuthorization(consumerKey, consumerSecret, accessToken); + } + case ParcelableCredentials.AUTH_TYPE_BASIC: { + final String screenName = credentials.screen_name; + final String username = credentials.basic_auth_username; + final String loginName = username != null ? username : screenName; + final String password = credentials.basic_auth_password; + if (isEmpty(loginName) || isEmpty(password)) return null; + return new BasicAuthorization(loginName, password); + } + } + return new EmptyAuthorization(); + } + + private static void addParameter(List> params, String name, Object value) { + params.add(Pair.create(name, String.valueOf(value))); + } + + private static void addPart(List> params, String name, Object value) { + final TypedData typedData = new StringTypedData(String.valueOf(value), Charset.defaultCharset()); + params.add(Pair.create(name, typedData)); + } + + public static String getApiBaseUrl(String format, final String domain) { + if (format == null) return null; + final Matcher matcher = Pattern.compile("\\[(\\.?)DOMAIN(\\.?)\\]").matcher(format); + if (!matcher.find()) { + // For backward compatibility + format = substituteLegacyApiBaseUrl(format, domain); + if (!format.endsWith("/1.1") && !format.endsWith("/1.1/")) { + return format; + } + final String versionSuffix = "/1.1"; + final int suffixLength = versionSuffix.length(); + final int lastIndex = format.lastIndexOf(versionSuffix); + return format.substring(0, lastIndex) + format.substring(lastIndex + suffixLength); + } + if (TextUtils.isEmpty(domain)) return matcher.replaceAll(""); + return matcher.replaceAll(String.format("$1%s$2", domain)); + } + + private static String substituteLegacyApiBaseUrl(@NonNull String format, String domain) { + final int startOfHost = format.indexOf("://") + 3, endOfHost = format.indexOf('/', startOfHost); + final String host = endOfHost != -1 ? format.substring(startOfHost, endOfHost) : format.substring(startOfHost); + if (!host.equalsIgnoreCase("api.twitter.com")) return format; + return format.substring(0, startOfHost) + domain + ".twitter.com" + format.substring(endOfHost); + } + + public static String getApiUrl(final String pattern, final String domain, final String appendPath) { + final String urlBase = getApiBaseUrl(pattern, domain); + if (urlBase == null) return null; + if (appendPath == null) return urlBase.endsWith("/") ? urlBase : urlBase + "/"; + final StringBuilder sb = new StringBuilder(urlBase); + if (urlBase.endsWith("/")) { + sb.append(appendPath.startsWith("/") ? appendPath.substring(1) : appendPath); + } else { + if (appendPath.startsWith("/")) { + sb.append(appendPath); + } else { + sb.append('/'); + sb.append(appendPath); + } + } + return sb.toString(); + } + + public static String getUserAgentName(ConsumerKeyType type) { + switch (type) { + case TWITTER_FOR_ANDROID: { + return "TwitterAndroid"; + } + case TWITTER_FOR_IPHONE: { + return "Twitter-iPhone"; + } + case TWITTER_FOR_IPAD: { + return "Twitter-iPad"; + } + case TWITTER_FOR_MAC: { + return "Twitter-Mac"; + } + } + return "Twitter"; + } + + public static String getTwidereUserAgent(final Context context) { + final PackageManager pm = context.getPackageManager(); + try { + final PackageInfo pi = pm.getPackageInfo(TWIDERE_PACKAGE_NAME, 0); + return TWIDERE_APP_NAME + " " + TWIDERE_PROJECT_URL + " / " + pi.versionName; + } catch (final PackageManager.NameNotFoundException e) { + return TWIDERE_APP_NAME + " " + TWIDERE_PROJECT_URL; + } + } + + public static class TwidereRequestInfoFactory implements RequestInfoFactory { + @Override + public RestRequestInfo create(RestMethodInfo methodInfo) { + final RestMethod method = methodInfo.getMethod(); + final String path = methodInfo.getPath(); + final List> queries = new ArrayList<>(methodInfo.getQueries()); + final List> forms = new ArrayList<>(methodInfo.getForms()); + final List> headers = methodInfo.getHeaders(); + final List> parts = methodInfo.getParts(); + final FileValue file = methodInfo.getFile(); + final Map extras = methodInfo.getExtras(); + if (parts.isEmpty()) { + final List> params = method.hasBody() ? forms : queries; + addParameter(params, "include_cards", true); + addParameter(params, "cards_platform", "Android-12"); + addParameter(params, "include_entities", true); + addParameter(params, "include_my_retweet", 1); + addParameter(params, "include_rts", 1); + addParameter(params, "include_reply_count", true); + addParameter(params, "include_descendent_reply_count", true); + } else { + addPart(parts, "include_cards", true); + addPart(parts, "cards_platform", "Android-12"); + addPart(parts, "include_entities", true); + addPart(parts, "include_my_retweet", 1); + addPart(parts, "include_rts", 1); + addPart(parts, "include_reply_count", true); + addPart(parts, "include_descendent_reply_count", true); + } + return new RestRequestInfo(method.value(), path, queries, forms, headers, parts, file, + methodInfo.getBody(), extras); + } + } + + public static class TwidereHttpRequestFactory implements HttpRequestFactory { + + private final String userAgent; + + public TwidereHttpRequestFactory(final String userAgent) { + this.userAgent = userAgent; + } + + @Override + public RestHttpRequest create(@NonNull Endpoint endpoint, @NonNull RestRequestInfo info, + @Nullable Authorization authorization) { + final String restMethod = info.getMethod(); + final String url = Endpoint.constructUrl(endpoint.getUrl(), info); + final ArrayList> headers = new ArrayList<>(info.getHeaders()); + + if (authorization != null && authorization.hasAuthorization()) { + headers.add(Pair.create("Authorization", authorization.getHeader(endpoint, info))); + } + headers.add(Pair.create("User-Agent", userAgent)); + return new RestHttpRequest(restMethod, url, headers, info.getBody(), null); + } + } + + public static class TwidereExceptionFactory implements ExceptionFactory { + @Override + public Exception newException(Throwable cause, RestHttpRequest request, RestHttpResponse response) { + final TwitterException te = new TwitterException(cause); + te.setResponse(response); + return te; + } + } +} diff --git a/twidere.extension.streaming/build.gradle b/twidere.extension.streaming/build.gradle index 478fc1fc1..003774997 100644 --- a/twidere.extension.streaming/build.gradle +++ b/twidere.extension.streaming/build.gradle @@ -29,6 +29,16 @@ android { versionCode 14 versionName "1.12 (0.3.0-dev)" } + packagingOptions { + exclude 'META-INF/DEPENDENCIES' + exclude 'META-INF/LICENSE' + exclude 'META-INF/LICENSE.txt' + exclude 'META-INF/license.txt' + exclude 'META-INF/NOTICE' + exclude 'META-INF/NOTICE.txt' + exclude 'META-INF/notice.txt' + exclude 'META-INF/ASL2.0' + } buildTypes { release { minifyEnabled false @@ -42,8 +52,7 @@ android { } dependencies { - compile 'com.squareup.okhttp:okhttp:2.3.0' + compile 'com.squareup.okhttp:okhttp:2.4.0' compile project(':twidere.library.extension') - compile project(':twidere.component.twitter4j.streaming') compile fileTree(dir: 'libs', include: ['*.jar']) } diff --git a/twidere.extension.streaming/src/main/java/org/mariotaku/twidere/extension/streaming/StreamingService.java b/twidere.extension.streaming/src/main/java/org/mariotaku/twidere/extension/streaming/StreamingService.java index 80218cd94..30d96219a 100644 --- a/twidere.extension.streaming/src/main/java/org/mariotaku/twidere/extension/streaming/StreamingService.java +++ b/twidere.extension.streaming/src/main/java/org/mariotaku/twidere/extension/streaming/StreamingService.java @@ -17,45 +17,40 @@ import android.preference.PreferenceManager; import android.util.Log; import android.widget.Toast; +import org.mariotaku.restfu.http.Authorization; +import org.mariotaku.restfu.http.Endpoint; import org.mariotaku.twidere.Twidere; import org.mariotaku.twidere.TwidereSharedPreferences; -import org.mariotaku.twidere.extension.streaming.util.OkHttpClientFactory; -import org.mariotaku.twidere.extension.streaming.util.TwidereHostAddressResolverFactory; +import org.mariotaku.twidere.api.twitter.TwitterException; +import org.mariotaku.twidere.api.twitter.TwitterUserStream; +import org.mariotaku.twidere.api.twitter.UserStreamCallback; +import org.mariotaku.twidere.api.twitter.model.DirectMessage; +import org.mariotaku.twidere.api.twitter.model.Status; +import org.mariotaku.twidere.api.twitter.model.StatusDeletionNotice; +import org.mariotaku.twidere.api.twitter.model.User; +import org.mariotaku.twidere.api.twitter.model.UserList; +import org.mariotaku.twidere.api.twitter.model.Warning; import org.mariotaku.twidere.extension.streaming.util.Utils; -import org.mariotaku.twidere.library.twitter4j.streaming.BuildConfig; import org.mariotaku.twidere.model.ParcelableAccount; -import org.mariotaku.twidere.model.ParcelableAccount.ParcelableCredentials; +import org.mariotaku.twidere.model.ParcelableCredentials; import org.mariotaku.twidere.provider.TwidereDataStore.Accounts; import org.mariotaku.twidere.provider.TwidereDataStore.DirectMessages; import org.mariotaku.twidere.provider.TwidereDataStore.Mentions; import org.mariotaku.twidere.provider.TwidereDataStore.Statuses; import org.mariotaku.twidere.util.ContentValuesCreator; import org.mariotaku.twidere.util.TwidereArrayUtils; +import org.mariotaku.twidere.util.TwitterAPIUtils; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; -import twitter4j.DirectMessage; -import twitter4j.StallWarning; -import twitter4j.Status; -import twitter4j.StatusDeletionNotice; -import twitter4j.TwitterStream; -import twitter4j.TwitterStreamFactory; -import twitter4j.User; -import twitter4j.UserList; -import twitter4j.UserStreamListener; -import org.mariotaku.twidere.api.twitter.auth.AccessToken; -import twitter4j.conf.StreamConfigurationBuilder; - -import static android.text.TextUtils.isEmpty; - public class StreamingService extends Service implements Constants, PrivateConstants { private static final int NOTIFICATION_SERVICE_STARTED = 1; private static final int NOTIFICATION_REQUEST_PERMISSION = 2; - private final List> mTwitterInstances = new ArrayList<>(); + private final List> mTwitterInstances = new ArrayList<>(); private ContentResolver mResolver; private SharedPreferences mPreferences; @@ -112,8 +107,8 @@ public class StreamingService extends Service implements Constants, PrivateConst } private void clearTwitterInstances() { - for (final WeakReference reference : mTwitterInstances) { - final TwitterStream twitter = reference.get(); + for (final WeakReference reference : mTwitterInstances) { + final TwidereUserStreamCallback twitter = reference.get(); new Thread(new ShutdownStreamTwitterRunnable(twitter)).start(); } mTwitterInstances.clear(); @@ -162,6 +157,7 @@ public class StreamingService extends Service implements Constants, PrivateConst } } + private boolean setTwitterInstances(final TwidereSharedPreferences prefs) { if (prefs == null) return false; final List accountsList = ParcelableAccount.getCredentialsList(this, true); @@ -172,69 +168,52 @@ public class StreamingService extends Service implements Constants, PrivateConst clearTwitterInstances(); for (int i = 0, j = accountsList.size(); i < j; i++) { final ParcelableCredentials account = accountsList.get(i); - final String token = account.oauth_token; - final String secret = account.oauth_token_secret; + final Endpoint endpoint = TwitterAPIUtils.getEndpoint(account, TwitterUserStream.class); + final Authorization authorization = TwitterAPIUtils.getAuthorization(account); + final TwitterUserStream twitter = Utils.getInstance(this, endpoint, authorization, TwitterUserStream.class); final long account_id = account.account_id; mAccountIds[i] = account_id; - final StreamConfigurationBuilder cb = new StreamConfigurationBuilder(); - cb.setHttpClientFactory(new OkHttpClientFactory(this)); - cb.setHostAddressResolverFactory(new TwidereHostAddressResolverFactory(this)); - cb.setGZIPEnabled(prefs.getBoolean(KEY_GZIP_COMPRESSING, true)); - cb.setIncludeEntitiesEnabled(true); - if (prefs.getBoolean(KEY_IGNORE_SSL_ERROR, false)) { - cb.setIgnoreSSLError(true); - cb.setHostAddressResolverFactory(new TwidereHostAddressResolverFactory(this)); - } - final String default_consumer_key = Utils - .getNonEmptyString(prefs, KEY_CONSUMER_KEY, TWITTER_CONSUMER_KEY_2); - final String default_consumer_secret = Utils.getNonEmptyString(prefs, KEY_CONSUMER_SECRET, - TWITTER_CONSUMER_SECRET_2); - final String consumer_key = account.consumer_key, consumer_secret = account.consumer_secret; - if (!isEmpty(consumer_key) && !isEmpty(consumer_secret)) { - cb.setOAuthConsumerKey(consumer_key); - cb.setOAuthConsumerSecret(consumer_secret); - } else { - cb.setOAuthConsumerKey(default_consumer_key); - cb.setOAuthConsumerSecret(default_consumer_secret); - } - final TwitterStream twitter = new TwitterStreamFactory(cb.build()).getInstance(new AccessToken(token, - secret)); - twitter.addListener(new UserStreamListenerImpl(this, account_id)); - twitter.user(); - mTwitterInstances.add(new WeakReference<>(twitter)); + final TwidereUserStreamCallback callback = new TwidereUserStreamCallback(this, account); + mTwitterInstances.add(new WeakReference<>(callback)); + new Thread() { + @Override + public void run() { + twitter.getUserStream(callback); + Log.d(LOGTAG, "Stream disconnected"); + } + }.start(); } return true; } static class ShutdownStreamTwitterRunnable implements Runnable { - private final TwitterStream twitter; + private final TwidereUserStreamCallback twitter; - ShutdownStreamTwitterRunnable(final TwitterStream twitter) { + ShutdownStreamTwitterRunnable(final TwidereUserStreamCallback twitter) { this.twitter = twitter; } @Override public void run() { if (twitter == null) return; - twitter.shutdown(); + Log.d(LOGTAG, "Disconnecting stream"); + twitter.disconnect(); } } - static class UserStreamListenerImpl implements UserStreamListener { + static class TwidereUserStreamCallback extends UserStreamCallback { - private final long account_id; + private final Context context; private final ParcelableAccount account; private final ContentResolver resolver; - private final Context context; private boolean statusStreamStarted, mentionsStreamStarted; - public UserStreamListenerImpl(final Context context, final long account_id) { + public TwidereUserStreamCallback(final Context context, final ParcelableAccount account) { this.context = context; - this.account_id = account_id; + this.account = account; resolver = context.getContentResolver(); - account = ParcelableAccount.getAccount(context, account_id); } @Override @@ -264,21 +243,21 @@ public class StreamingService extends Service implements Constants, PrivateConst public void onDirectMessage(final DirectMessage directMessage) { if (directMessage == null || directMessage.getId() <= 0) return; for (final Uri uri : MESSAGES_URIS) { - final String where = DirectMessages.ACCOUNT_ID + " = " + account_id + " AND " + final String where = DirectMessages.ACCOUNT_ID + " = " + account.account_id + " AND " + DirectMessages.MESSAGE_ID + " = " + directMessage.getId(); resolver.delete(uri, where, null); } final User sender = directMessage.getSender(), recipient = directMessage.getRecipient(); - if (sender.getId() == account_id) { + if (sender.getId() == account.account_id) { final ContentValues values = ContentValuesCreator.createDirectMessage(directMessage, - account_id, true); + account.account_id, true); if (values != null) { resolver.insert(DirectMessages.Outbox.CONTENT_URI, values); } } - if (recipient.getId() == account_id) { + if (recipient.getId() == account.account_id) { final ContentValues values = ContentValuesCreator.createDirectMessage(directMessage, - account_id, false); + account.account_id, false); final Uri.Builder builder = DirectMessages.Inbox.CONTENT_URI.buildUpon(); builder.appendQueryParameter(Twidere.QUERY_PARAM_NOTIFY, "true"); if (values != null) { @@ -289,8 +268,12 @@ public class StreamingService extends Service implements Constants, PrivateConst } @Override - public void onException(final Exception ex) { - Log.w(LOGTAG, ex); + public void onException(final Throwable ex) { + if (ex instanceof TwitterException) { + Log.w(LOGTAG, String.format("Error %d", ((TwitterException) ex).getStatusCode()), ex); + } else { + Log.w(LOGTAG, ex); + } } @Override @@ -324,19 +307,18 @@ public class StreamingService extends Service implements Constants, PrivateConst } @Override - public void onStallWarning(final StallWarning warn) { + public void onStallWarning(final Warning warn) { } @Override public void onStatus(final Status status) { - final ContentValues values = ContentValuesCreator.createStatus(status, account_id); - if (values == null) return; + final ContentValues values = ContentValuesCreator.createStatus(status, account.account_id); if (!statusStreamStarted) { statusStreamStarted = true; values.put(Statuses.IS_GAP, true); } - final String where = Statuses.ACCOUNT_ID + " = " + account_id + " AND " + Statuses.STATUS_ID + " = " + final String where = Statuses.ACCOUNT_ID + " = " + account.account_id + " AND " + Statuses.STATUS_ID + " = " + status.getId(); resolver.delete(Statuses.CONTENT_URI, where, null); resolver.delete(Mentions.CONTENT_URI, where, null); diff --git a/twidere.extension.streaming/src/main/java/org/mariotaku/twidere/extension/streaming/util/OkHttpClientImpl.java b/twidere.extension.streaming/src/main/java/org/mariotaku/twidere/extension/streaming/util/OkHttpClientImpl.java deleted file mode 100644 index 28761d4df..000000000 --- a/twidere.extension.streaming/src/main/java/org/mariotaku/twidere/extension/streaming/util/OkHttpClientImpl.java +++ /dev/null @@ -1,284 +0,0 @@ -/* - * Twidere - Twitter client for Android - * - * Copyright (C) 2012-2015 Mariotaku Lee - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.mariotaku.twidere.extension.streaming.util; - -import android.net.SSLCertificateSocketFactory; -import android.net.Uri; - -import com.squareup.okhttp.Headers; -import com.squareup.okhttp.MediaType; -import com.squareup.okhttp.MultipartBuilder; -import com.squareup.okhttp.OkHttpClient; -import com.squareup.okhttp.Request.Builder; -import com.squareup.okhttp.RequestBody; -import com.squareup.okhttp.Response; -import com.squareup.okhttp.internal.Internal; -import com.squareup.okhttp.internal.Network; - -import org.mariotaku.twidere.TwidereConstants; - -import java.io.IOException; -import java.io.InputStream; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.net.Proxy; -import java.net.Proxy.Type; -import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.concurrent.TimeUnit; -import java.util.zip.GZIPInputStream; - -import javax.net.SocketFactory; - -import okio.BufferedSink; -import twitter4j.TwitterException; -import org.mariotaku.twidere.api.twitter.auth.Authorization; -import org.mariotaku.twidere.api.twitter.http.HostAddressResolver; -import org.mariotaku.twidere.api.twitter.http.HttpClient; -import org.mariotaku.twidere.api.twitter.http.HttpClientConfiguration; -import org.mariotaku.twidere.api.twitter.http.HttpParameter; -import org.mariotaku.twidere.api.twitter.http.HttpRequest; -import org.mariotaku.twidere.api.twitter.http.HttpResponse; -import org.mariotaku.twidere.api.twitter.http.RequestMethod; - -/** - * Created by mariotaku on 15/1/22. - */ -public class OkHttpClientImpl implements HttpClient, TwidereConstants { - - public static final MediaType APPLICATION_FORM_URLENCODED = MediaType.parse("application/x-www-form-urlencoded; charset=UTF-8"); - private final HttpClientConfiguration conf; - private final OkHttpClient client; - private final HostAddressResolver resolver; - - public OkHttpClientImpl(HttpClientConfiguration conf) { - this.conf = conf; - this.resolver = conf.getHostAddressResolverFactory().getInstance(conf); - this.client = createHttpClient(conf); - } - - @Override - public HttpResponse request(HttpRequest req) throws TwitterException { - final Builder builder = new Builder(); - for (Entry> headerEntry : req.getRequestHeaders().entrySet()) { - final String name = headerEntry.getKey(); - for (String value : headerEntry.getValue()) { - builder.addHeader(name, value); - } - } - final Authorization authorization = req.getAuthorization(); - if (authorization != null) { - final String authHeader = authorization.getAuthorizationHeader(req); - if (authHeader != null) { - builder.header("Authorization", authHeader); - } - } - try { - setupRequestBuilder(builder, req); - final Response response = client.newCall(builder.build()).execute(); - return new OkHttpResponse(conf, null, response); - } catch (IOException e) { - throw new TwitterException(e); - } - } - - @Override - public void shutdown() { - - } - - private OkHttpClient createHttpClient(HttpClientConfiguration conf) { - final OkHttpClient client = new OkHttpClient(); - final boolean ignoreSSLError = conf.isSSLErrorIgnored(); - if (ignoreSSLError) { - client.setSslSocketFactory(SSLCertificateSocketFactory.getInsecure(0, null)); - } else { - client.setSslSocketFactory(SSLCertificateSocketFactory.getDefault(0, null)); - } - client.setSocketFactory(SocketFactory.getDefault()); - client.setConnectTimeout(conf.getHttpConnectionTimeout(), TimeUnit.MILLISECONDS); - - if (conf.isProxyConfigured()) { - client.setProxy(new Proxy(Type.HTTP, InetSocketAddress.createUnresolved(conf.getHttpProxyHost(), - conf.getHttpProxyPort()))); - } -// client.setHostnameVerifier(new HostResolvedHostnameVerifier()); - Internal.instance.setNetwork(client, new Network() { - @Override - public InetAddress[] resolveInetAddresses(String host) throws UnknownHostException { - try { - return resolver.resolve(host); - } catch (IOException e) { - if (e instanceof UnknownHostException) throw (UnknownHostException) e; - throw new UnknownHostException("Unable to resolve address " + e.getMessage()); - } - } - }); - return client; - } - - private RequestBody getRequestBody(HttpParameter[] params) throws IOException { - if (params == null) return null; - if (!HttpParameter.containsFile(params)) { - return RequestBody.create(APPLICATION_FORM_URLENCODED, HttpParameter.encodeParameters(params)); - } - final MultipartBuilder builder = new MultipartBuilder(); - builder.type(MultipartBuilder.FORM); - for (final HttpParameter param : params) { - if (param.isFile()) { - RequestBody requestBody; - if (param.hasFileBody()) { - requestBody = new StreamRequestBody(MediaType.parse(param.getContentType()), param.getFileBody(), true); - } else { - requestBody = RequestBody.create(MediaType.parse(param.getContentType()), param.getFile()); - } - builder.addFormDataPart(param.getName(), param.getFileName(), requestBody); - } else { - builder.addFormDataPart(param.getName(), param.getValue()); - } - } - return builder.build(); - } - - static class StreamRequestBody extends RequestBody { - - private final MediaType contentType; - private final InputStream stream; - private final boolean closeAfterWrite; - - StreamRequestBody(MediaType contentType, InputStream stream, boolean closeAfterWrite) { - this.contentType = contentType; - this.stream = stream; - this.closeAfterWrite = closeAfterWrite; - } - - @Override - public MediaType contentType() { - return contentType; - } - - @Override - public void writeTo(BufferedSink sink) throws IOException { - int len; - byte[] buf = new byte[8192]; - while ((len = stream.read(buf)) != -1) { - sink.write(buf, 0, len); - } - if (closeAfterWrite) { - Utils.closeSilently(stream); - } - } - } - - private void setupRequestBuilder(Builder builder, HttpRequest req) throws IOException { - final Uri.Builder uriBuilder = Uri.parse(req.getURL()).buildUpon(); - final RequestMethod method = req.getMethod(); - if (method != RequestMethod.POST && method != RequestMethod.PUT) { - final HttpParameter[] parameters = req.getParameters(); - if (parameters != null) { - for (HttpParameter param : parameters) { - uriBuilder.appendQueryParameter(param.getName(), param.getValue()); - } - } - } - final Uri uri = uriBuilder.build(); - switch (req.getMethod()) { - case GET: { - builder.get(); - break; - } - case POST: { - builder.post(getRequestBody(req.getParameters())); - break; - } - case DELETE: { - builder.delete(); - break; - } - case HEAD: { - builder.head(); - break; - } - case PUT: { - builder.put(getRequestBody(req.getParameters())); - break; - } - default: { - throw new AssertionError(); - } - } - builder.url(uri.toString()); - } - - private static class OkHttpResponse extends HttpResponse { - - private final Response response; - - public OkHttpResponse(HttpClientConfiguration conf, HttpRequest request, Response response) - throws TwitterException, IOException { - super(conf); - this.response = response; - statusCode = response.code(); - if ("gzip".equals(response.header("Content-Encoding"))) { - is = new GZIPInputStream(response.body().byteStream()); - } else { - is = response.body().byteStream(); - } - if (!response.isSuccessful()) { - throw new TwitterException(response.message(), request, this); - } - } - - @Override - public void disconnect() throws IOException { - if (is != null) { - is.close(); - } - } - - @Override - public String getResponseHeader(String name) { - return response.header(name); - } - - @Override - public List getResponseHeaders(String name) { - return response.headers(name); - } - - @Override - public Map> getResponseHeaderFields() { - final Headers headers = response.headers(); - final Map> maps = new HashMap<>(); - for (final String name : headers.names()) { - final List values = new ArrayList<>(1); - for (final String value : headers.values(name)) { - values.add(value); - } - maps.put(name, values); - } - return maps; - } - } -} diff --git a/twidere.extension.streaming/src/main/java/org/mariotaku/twidere/extension/streaming/util/OkHttpRestClient.java b/twidere.extension.streaming/src/main/java/org/mariotaku/twidere/extension/streaming/util/OkHttpRestClient.java new file mode 100644 index 000000000..69dc99409 --- /dev/null +++ b/twidere.extension.streaming/src/main/java/org/mariotaku/twidere/extension/streaming/util/OkHttpRestClient.java @@ -0,0 +1,197 @@ +/* + * Twidere - Twitter client for Android + * + * Copyright (C) 2012-2015 Mariotaku Lee + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.mariotaku.twidere.extension.streaming.util; + +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.util.Pair; + +import com.squareup.okhttp.Call; +import com.squareup.okhttp.Headers; +import com.squareup.okhttp.MediaType; +import com.squareup.okhttp.OkHttpClient; +import com.squareup.okhttp.Request; +import com.squareup.okhttp.RequestBody; +import com.squareup.okhttp.Response; +import com.squareup.okhttp.ResponseBody; + +import org.mariotaku.restfu.Utils; +import org.mariotaku.restfu.http.ContentType; +import org.mariotaku.restfu.http.RestHttpClient; +import org.mariotaku.restfu.http.RestHttpRequest; +import org.mariotaku.restfu.http.RestHttpResponse; +import org.mariotaku.restfu.http.mime.TypedData; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.List; + +import okio.BufferedSink; + +/** + * Created by mariotaku on 15/5/5. + */ +public class OkHttpRestClient implements RestHttpClient { + + private final OkHttpClient client; + + public OkHttpRestClient() { + this(new OkHttpClient()); + } + + public OkHttpRestClient(OkHttpClient client) { + this.client = client; + } + + @NonNull + @Override + public RestHttpResponse execute(RestHttpRequest restHttpRequest) throws IOException { + final Request.Builder builder = new Request.Builder(); + builder.method(restHttpRequest.getMethod(), RestToOkBody.wrap(restHttpRequest.getBody())); + builder.url(restHttpRequest.getUrl()); + final List> headers = restHttpRequest.getHeaders(); + if (headers != null) { + for (Pair header : headers) { + builder.addHeader(header.first, header.second); + } + } + final Call call = client.newCall(builder.build()); + return new OkRestHttpResponse(call.execute()); + } + + private static class RestToOkBody extends RequestBody { + private final TypedData body; + + public RestToOkBody(TypedData body) { + this.body = body; + } + + @Override + public MediaType contentType() { + final ContentType contentType = body.contentType(); + if (contentType == null) return null; + return MediaType.parse(contentType.toHeader()); + } + + @Override + public void writeTo(BufferedSink sink) throws IOException { + body.writeTo(sink.outputStream()); + } + + @Nullable + public static RequestBody wrap(@Nullable TypedData body) { + if (body == null) return null; + return new RestToOkBody(body); + } + } + + private static class OkRestHttpResponse extends RestHttpResponse { + private final Response response; + private TypedData body; + + public OkRestHttpResponse(Response response) { + this.response = response; + } + + @Override + public int getStatus() { + return response.code(); + } + + @Override + public List> getHeaders() { + final Headers headers = response.headers(); + final ArrayList> headersList = new ArrayList<>(); + for (int i = 0, j = headers.size(); i < j; i++) { + headersList.add(Pair.create(headers.name(i), headers.value(i))); + } + return headersList; + } + + @Override + public String getHeader(String name) { + return response.header(name); + } + + @Override + public String[] getHeaders(String name) { + final List values = response.headers(name); + return values.toArray(new String[values.size()]); + } + + @Override + public TypedData getBody() { + if (body != null) return body; + return body = new OkToRestBody(response.body()); + } + + @Override + public void close() throws IOException { + if (body != null) { + body.close(); + body = null; + } + } + } + + private static class OkToRestBody implements TypedData { + + private final ResponseBody body; + + public OkToRestBody(ResponseBody body) { + this.body = body; + } + + @Override + public ContentType contentType() { + final MediaType mediaType = body.contentType(); + if (mediaType == null) return null; + return ContentType.parse(mediaType.toString()); + } + + @Override + public String contentEncoding() { + return null; + } + + @Override + public long length() throws IOException { + return body.contentLength(); + } + + @Override + public void writeTo(@NonNull OutputStream os) throws IOException { + Utils.copyStream(stream(), os); + } + + @NonNull + @Override + public InputStream stream() throws IOException { + return body.byteStream(); + } + + @Override + public void close() throws IOException { + body.close(); + } + } +} diff --git a/twidere.extension.streaming/src/main/java/org/mariotaku/twidere/extension/streaming/util/TwidereHostAddressResolver.java b/twidere.extension.streaming/src/main/java/org/mariotaku/twidere/extension/streaming/util/TwidereHostAddressResolver.java index cb427f541..6260fbe81 100644 --- a/twidere.extension.streaming/src/main/java/org/mariotaku/twidere/extension/streaming/util/TwidereHostAddressResolver.java +++ b/twidere.extension.streaming/src/main/java/org/mariotaku/twidere/extension/streaming/util/TwidereHostAddressResolver.java @@ -22,6 +22,8 @@ package org.mariotaku.twidere.extension.streaming.util; import android.content.Context; import android.util.Log; +import com.squareup.okhttp.internal.Network; + import org.mariotaku.twidere.Twidere; import org.mariotaku.twidere.extension.streaming.BuildConfig; @@ -30,11 +32,10 @@ import java.net.UnknownHostException; import java.util.Arrays; import java.util.LinkedHashMap; -import org.mariotaku.twidere.api.twitter.http.HostAddressResolver; - -public class TwidereHostAddressResolver implements HostAddressResolver { +public class TwidereHostAddressResolver implements Network { private static final String RESOLVER_LOGTAG = "Twidere.Streaming.Host"; + private static TwidereHostAddressResolver sInstance; private final HostCache mHostCache = new HostCache(512); private final Context mContext; @@ -44,7 +45,7 @@ public class TwidereHostAddressResolver implements HostAddressResolver { } @Override - public InetAddress[] resolve(final String host) throws UnknownHostException { + public InetAddress[] resolveInetAddresses(final String host) throws UnknownHostException { if (host == null) return null; // First, I'll try to load address cached. final InetAddress[] cached = mHostCache.get(host); @@ -59,6 +60,11 @@ public class TwidereHostAddressResolver implements HostAddressResolver { return resolved; } + public static Network getInstance(final Context context) { + if (sInstance != null) return sInstance; + return sInstance = new TwidereHostAddressResolver(context); + } + private static class HostCache extends LinkedHashMap { private static final long serialVersionUID = -9216545511009449147L; diff --git a/twidere.extension.streaming/src/main/java/org/mariotaku/twidere/extension/streaming/util/Utils.java b/twidere.extension.streaming/src/main/java/org/mariotaku/twidere/extension/streaming/util/Utils.java index 98bbbb210..1e526fb68 100644 --- a/twidere.extension.streaming/src/main/java/org/mariotaku/twidere/extension/streaming/util/Utils.java +++ b/twidere.extension.streaming/src/main/java/org/mariotaku/twidere/extension/streaming/util/Utils.java @@ -1,14 +1,34 @@ package org.mariotaku.twidere.extension.streaming.util; import android.content.Context; +import android.content.SharedPreferences; import android.database.Cursor; +import android.net.SSLCertificateSocketFactory; +import com.squareup.okhttp.OkHttpClient; +import com.squareup.okhttp.internal.Internal; + +import org.mariotaku.restfu.RestAPIFactory; +import org.mariotaku.restfu.http.Authorization; +import org.mariotaku.restfu.http.Endpoint; +import org.mariotaku.restfu.http.RestHttpClient; +import org.mariotaku.twidere.Twidere; import org.mariotaku.twidere.TwidereConstants; import org.mariotaku.twidere.TwidereSharedPreferences; +import org.mariotaku.twidere.api.twitter.auth.OAuthAuthorization; +import org.mariotaku.twidere.api.twitter.util.TwitterConverter; +import org.mariotaku.twidere.model.ConsumerKeyType; import org.mariotaku.twidere.provider.TwidereDataStore.Accounts; +import org.mariotaku.twidere.util.ParseUtils; +import org.mariotaku.twidere.util.TwitterAPIUtils; +import org.mariotaku.twidere.util.TwitterContentUtils; import java.io.Closeable; import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.Proxy; +import java.net.SocketAddress; +import java.util.concurrent.TimeUnit; import static android.text.TextUtils.isEmpty; @@ -24,6 +44,71 @@ public class Utils implements TwidereConstants { } } + + + public static RestHttpClient getDefaultHttpClient(final Context context) { + if (context == null) return null; + final SharedPreferences prefs = Twidere.getSharedPreferences(context); + return createHttpClient(context, prefs); + } + + public static T getInstance(final Context context, final Endpoint endpoint, final Authorization auth, Class cls) { + final RestAPIFactory factory = new RestAPIFactory(); + final String userAgent; + if (auth instanceof OAuthAuthorization) { + final String consumerKey = ((OAuthAuthorization) auth).getConsumerKey(); + final String consumerSecret = ((OAuthAuthorization) auth).getConsumerSecret(); + final ConsumerKeyType officialKeyType = TwitterContentUtils.getOfficialKeyType(context, consumerKey, consumerSecret); + if (officialKeyType != ConsumerKeyType.UNKNOWN) { + userAgent = TwitterAPIUtils.getUserAgentName(officialKeyType); + } else { + userAgent = TwitterAPIUtils.getTwidereUserAgent(context); + } + } else { + userAgent = TwitterAPIUtils.getTwidereUserAgent(context); + } + factory.setClient(getDefaultHttpClient(context)); + factory.setConverter(new TwitterConverter()); + factory.setEndpoint(endpoint); + factory.setAuthorization(auth); + factory.setRequestInfoFactory(new TwitterAPIUtils.TwidereRequestInfoFactory()); + factory.setHttpRequestFactory(new TwitterAPIUtils.TwidereHttpRequestFactory(userAgent)); + factory.setExceptionFactory(new TwitterAPIUtils.TwidereExceptionFactory()); + return factory.build(cls); + } + + public static RestHttpClient createHttpClient(final Context context, final SharedPreferences prefs) { + final int connectionTimeout = prefs.getInt(KEY_CONNECTION_TIMEOUT, 10); + final boolean ignoreSslError = prefs.getBoolean(KEY_IGNORE_SSL_ERROR, false); + final boolean enableProxy = prefs.getBoolean(KEY_ENABLE_PROXY, false); + + final OkHttpClient client = new OkHttpClient(); + client.setConnectTimeout(connectionTimeout, TimeUnit.SECONDS); + if (ignoreSslError) { + client.setSslSocketFactory(SSLCertificateSocketFactory.getInsecure(0, null)); + } else { + client.setSslSocketFactory(SSLCertificateSocketFactory.getDefault(0, null)); + } + if (enableProxy) { + client.setProxy(getProxy(prefs)); + } + Internal.instance.setNetwork(client, TwidereHostAddressResolver.getInstance(context)); + return new OkHttpRestClient(client); + } + + + public static Proxy getProxy(final SharedPreferences prefs) { + final String proxyHost = prefs.getString(KEY_PROXY_HOST, null); + final int proxyPort = ParseUtils.parseInt(prefs.getString(KEY_PROXY_PORT, "-1")); + if (!isEmpty(proxyHost) && proxyPort >= 0 && proxyPort < 65535) { + final SocketAddress addr = InetSocketAddress.createUnresolved(proxyHost, proxyPort); + return new Proxy(Proxy.Type.HTTP, addr); + } + return Proxy.NO_PROXY; + } + + + public static long[] getActivatedAccountIds(final Context context) { long[] accounts = new long[0]; if (context == null) return accounts; diff --git a/twidere.wear/build.gradle b/twidere.wear/build.gradle index 8718fdc8d..2acb1900a 100644 --- a/twidere.wear/build.gradle +++ b/twidere.wear/build.gradle @@ -41,5 +41,5 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.google.android.support:wearable:1.1.0' - compile 'com.google.android.gms:play-services-wearable:7.0.0' + compile 'com.google.android.gms:play-services-wearable:7.3.0' } diff --git a/twidere/build.gradle b/twidere/build.gradle index dc39b4d54..bd5154248 100644 --- a/twidere/build.gradle +++ b/twidere/build.gradle @@ -57,9 +57,7 @@ android { } repositories { - jcenter() - maven { url 'https://repo.commonsware.com.s3.amazonaws.com' } - maven { url "https://jitpack.io" } + maven { url 'http://repo.commonsware.com.s3.amazonaws.com' } } configurations { @@ -68,23 +66,23 @@ configurations { dependencies { // wearApp project(':twidere.wear') - apt 'com.bluelinelabs:logansquare-compiler:1.0.6' + apt 'com.bluelinelabs:logansquare-compiler:1.1.0' compile 'com.android.support:multidex:1.0.1' compile 'com.android.support:support-v13:22.1.1' compile 'com.android.support:appcompat-v7:22.1.1' compile 'com.android.support:cardview-v7:22.1.1' compile 'com.android.support:recyclerview-v7:22.1.1' compile 'com.sothree.slidinguppanel:library:3.0.0' - compile 'com.twitter:twitter-text:1.11.1' + compile 'com.twitter:twitter-text:1.12.1' compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.3' - compile 'com.squareup:otto:1.3.6' + compile 'com.squareup:otto:1.3.7' compile 'dnsjava:dnsjava:2.1.7' compile 'com.commonsware.cwac:merge:1.1.1' compile 'com.davemorrissey.labs:subsampling-scale-image-view:3.1.3' compile 'com.rengwuxian.materialedittext:library:2.1.3' compile 'com.pnikosis:materialish-progress:1.5' - compile 'com.squareup.okhttp:okhttp:2.3.0' - compile 'pl.droidsonroids.gif:android-gif-drawable:1.1.6' + compile 'com.squareup.okhttp:okhttp:2.4.0' + compile 'pl.droidsonroids.gif:android-gif-drawable:1.1.7' compile 'com.github.johnpersano:supertoasts:1.3.4.1@aar' compile 'com.github.mariotaku:MessageBubbleView:1.2' compile 'com.github.mariotaku:DragSortListView:0.6.1' @@ -94,7 +92,7 @@ dependencies { compile 'com.sprylab.android.texturevideoview:texturevideoview:1.0.0' compile 'com.squareup:pollexor:2.0.2' compile 'org.apache.commons:commons-lang3:3.4' - compile 'com.bluelinelabs:logansquare:1.0.6' + compile 'com.bluelinelabs:logansquare:1.1.0' compile 'ch.acra:acra:4.6.2' compile 'org.jraf:android-switch-backport:2.0.1' googleCompile 'com.google.android.gms:play-services-maps:7.3.0' diff --git a/twidere/src/main/java/edu/tsinghua/spice/Task/SpiceAsyUploadTask.java b/twidere/src/main/java/edu/tsinghua/spice/Task/SpiceAsyUploadTask.java index 667fbcec4..ff8caf0a2 100644 --- a/twidere/src/main/java/edu/tsinghua/spice/Task/SpiceAsyUploadTask.java +++ b/twidere/src/main/java/edu/tsinghua/spice/Task/SpiceAsyUploadTask.java @@ -5,13 +5,13 @@ import android.content.SharedPreferences; import android.os.AsyncTask; import android.util.Log; -import org.mariotaku.simplerestapi.http.RestHttpClient; -import org.mariotaku.simplerestapi.http.RestHttpRequest; -import org.mariotaku.simplerestapi.http.mime.FileTypedData; -import org.mariotaku.simplerestapi.http.mime.MultipartTypedBody; -import org.mariotaku.simplerestapi.method.POST; +import org.mariotaku.restfu.annotation.method.POST; +import org.mariotaku.restfu.http.RestHttpClient; +import org.mariotaku.restfu.http.RestHttpRequest; +import org.mariotaku.restfu.http.mime.FileTypedData; +import org.mariotaku.restfu.http.mime.MultipartTypedBody; import org.mariotaku.twidere.BuildConfig; -import org.mariotaku.twidere.util.TwitterAPIUtils; +import org.mariotaku.twidere.util.TwitterAPIFactory; import java.io.File; import java.io.FileInputStream; @@ -40,7 +40,7 @@ public class SpiceAsyUploadTask extends AsyncTask { public SpiceAsyUploadTask(final Context context) { this.context = context; - this.client = TwitterAPIUtils.getDefaultHttpClient(context); + this.client = TwitterAPIFactory.getDefaultHttpClient(context); } diff --git a/twidere/src/main/java/edu/ucdavis/earlybird/UploadTask.java b/twidere/src/main/java/edu/ucdavis/earlybird/UploadTask.java index 682b5c70f..3c770d4e9 100644 --- a/twidere/src/main/java/edu/ucdavis/earlybird/UploadTask.java +++ b/twidere/src/main/java/edu/ucdavis/earlybird/UploadTask.java @@ -5,13 +5,13 @@ import android.content.SharedPreferences; import android.os.AsyncTask; import android.provider.Settings.Secure; -import org.mariotaku.simplerestapi.http.RestHttpClient; -import org.mariotaku.simplerestapi.http.RestHttpRequest; -import org.mariotaku.simplerestapi.http.RestHttpResponse; -import org.mariotaku.simplerestapi.http.mime.FileTypedData; -import org.mariotaku.simplerestapi.http.mime.MultipartTypedBody; -import org.mariotaku.simplerestapi.method.POST; -import org.mariotaku.twidere.util.TwitterAPIUtils; +import org.mariotaku.restfu.annotation.method.POST; +import org.mariotaku.restfu.http.RestHttpClient; +import org.mariotaku.restfu.http.RestHttpRequest; +import org.mariotaku.restfu.http.RestHttpResponse; +import org.mariotaku.restfu.http.mime.FileTypedData; +import org.mariotaku.restfu.http.mime.MultipartTypedBody; +import org.mariotaku.twidere.util.TwitterAPIFactory; import java.io.File; import java.io.FileInputStream; @@ -37,7 +37,7 @@ public class UploadTask extends AsyncTask { public UploadTask(final Context context) { this.context = context; - this.client = TwitterAPIUtils.getDefaultHttpClient(context); + this.client = TwitterAPIFactory.getDefaultHttpClient(context); device_id = Secure.getString(context.getContentResolver(), Secure.ANDROID_ID); } diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/TwitterLinkHandlerActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/TwitterLinkHandlerActivity.java index a54e6e42e..e82e6e970 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/TwitterLinkHandlerActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/TwitterLinkHandlerActivity.java @@ -14,6 +14,7 @@ import android.text.TextUtils; import org.apache.commons.lang3.ArrayUtils; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.activity.support.ComposeActivity; +import org.mariotaku.twidere.util.ErrorLogger; import org.mariotaku.twidere.util.Utils; import java.util.List; @@ -111,6 +112,7 @@ public class TwitterLinkHandlerActivity extends Activity implements Constants { if (handledIntent != null) { startActivity(handledIntent); } else { + ErrorLogger.exception(new TwitterLinkException("Unable to handle twitter uri " + uri)); final String packageName = mPreferences.getString(KEY_FALLBACK_TWITTER_LINK_HANDLER, null); final Intent fallbackIntent = new Intent(Intent.ACTION_VIEW, uri); fallbackIntent.setPackage(packageName); @@ -239,14 +241,13 @@ public class TwitterLinkHandlerActivity extends Activity implements Constants { builder.appendQueryParameter(QUERY_PARAM_LIST_NAME, pathSegments.get(1)); return new Intent(Intent.ACTION_VIEW, builder.build()); } - default: { - final String fragment = uri.getFragment(); - if (fragment != null && fragment.startsWith("#!")) { - - } - } } return null; } + private class TwitterLinkException extends Exception { + public TwitterLinkException(final String s) { + super(s); + } + } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/APIEditorActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/APIEditorActivity.java index 3b66c7915..c4207029f 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/APIEditorActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/APIEditorActivity.java @@ -35,6 +35,7 @@ import android.widget.RadioGroup.OnCheckedChangeListener; import android.widget.Toast; import org.mariotaku.twidere.R; +import org.mariotaku.twidere.model.ParcelableCredentials; import org.mariotaku.twidere.provider.TwidereDataStore.Accounts; import static org.mariotaku.twidere.util.ParseUtils.parseString; @@ -56,12 +57,12 @@ public class APIEditorActivity extends BaseSupportDialogActivity implements OnCh @Override public void onCheckedChanged(final RadioGroup group, final int checkedId) { final int authType = getCheckedAuthType(checkedId); - final boolean isOAuth = authType == Accounts.AUTH_TYPE_OAUTH || authType == Accounts.AUTH_TYPE_XAUTH; + final boolean isOAuth = authType == ParcelableCredentials.AUTH_TYPE_OAUTH || authType == ParcelableCredentials.AUTH_TYPE_XAUTH; mEditSameOAuthSigningUrl.setVisibility(isOAuth ? View.VISIBLE : View.GONE); mEditConsumerKey.setVisibility(isOAuth ? View.VISIBLE : View.GONE); mEditConsumerSecret.setVisibility(isOAuth ? View.VISIBLE : View.GONE); if (!mEditNoVersionSuffixChanged) { - mEditNoVersionSuffix.setChecked(authType == Accounts.AUTH_TYPE_TWIP_O_MODE); + mEditNoVersionSuffix.setChecked(authType == ParcelableCredentials.AUTH_TYPE_TWIP_O_MODE); } } @@ -149,7 +150,7 @@ public class APIEditorActivity extends BaseSupportDialogActivity implements OnCh final SharedPreferences pref = getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE); final String prefApiUrlFormat = getNonEmptyString(pref, KEY_API_URL_FORMAT, DEFAULT_TWITTER_API_URL_FORMAT); - final int prefAuthType = pref.getInt(KEY_AUTH_TYPE, Accounts.AUTH_TYPE_OAUTH); + final int prefAuthType = pref.getInt(KEY_AUTH_TYPE, ParcelableCredentials.AUTH_TYPE_OAUTH); final boolean prefSameOAuthSigningUrl = pref.getBoolean(KEY_SAME_OAUTH_SIGNING_URL, false); final boolean prefNoVersionSuffix = pref.getBoolean(KEY_NO_VERSION_SUFFIX, false); final String prefConsumerKey = getNonEmptyString(pref, KEY_CONSUMER_KEY, TWITTER_CONSUMER_KEY); @@ -185,10 +186,10 @@ public class APIEditorActivity extends BaseSupportDialogActivity implements OnCh mEditConsumerKey.setText(consumerKey); mEditConsumerSecret.setText(consumerSecret); - mButtonOAuth.setChecked(authType == Accounts.AUTH_TYPE_OAUTH); - mButtonXAuth.setChecked(authType == Accounts.AUTH_TYPE_XAUTH); - mButtonBasic.setChecked(authType == Accounts.AUTH_TYPE_BASIC); - mButtonTWIPOMode.setChecked(authType == Accounts.AUTH_TYPE_TWIP_O_MODE); + mButtonOAuth.setChecked(authType == ParcelableCredentials.AUTH_TYPE_OAUTH); + mButtonXAuth.setChecked(authType == ParcelableCredentials.AUTH_TYPE_XAUTH); + mButtonBasic.setChecked(authType == ParcelableCredentials.AUTH_TYPE_BASIC); + mButtonTWIPOMode.setChecked(authType == ParcelableCredentials.AUTH_TYPE_TWIP_O_MODE); if (mEditAuthType.getCheckedRadioButtonId() == -1) { mButtonOAuth.setChecked(true); } @@ -202,16 +203,16 @@ public class APIEditorActivity extends BaseSupportDialogActivity implements OnCh private int getCheckedAuthType(final int checkedId) { switch (checkedId) { case R.id.xauth: { - return Accounts.AUTH_TYPE_XAUTH; + return ParcelableCredentials.AUTH_TYPE_XAUTH; } case R.id.basic: { - return Accounts.AUTH_TYPE_BASIC; + return ParcelableCredentials.AUTH_TYPE_BASIC; } case R.id.twip_o: { - return Accounts.AUTH_TYPE_TWIP_O_MODE; + return ParcelableCredentials.AUTH_TYPE_TWIP_O_MODE; } default: { - return Accounts.AUTH_TYPE_OAUTH; + return ParcelableCredentials.AUTH_TYPE_OAUTH; } } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/AccountSelectorActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/AccountSelectorActivity.java index a240476be..6cacdb259 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/AccountSelectorActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/AccountSelectorActivity.java @@ -38,6 +38,7 @@ import android.widget.Toast; import org.apache.commons.lang3.ArrayUtils; import org.mariotaku.twidere.R; import org.mariotaku.twidere.adapter.AccountsAdapter; +import org.mariotaku.twidere.model.ParcelableCredentials; import org.mariotaku.twidere.provider.TwidereDataStore.Accounts; public class AccountSelectorActivity extends BaseSupportDialogActivity implements LoaderCallbacks, @@ -95,7 +96,7 @@ public class AccountSelectorActivity extends BaseSupportDialogActivity implement @Override public Loader onCreateLoader(final int id, final Bundle args) { - final String where = isOAuthOnly() ? Accounts.AUTH_TYPE + " = " + Accounts.AUTH_TYPE_OAUTH : null; + final String where = isOAuthOnly() ? Accounts.AUTH_TYPE + " = " + ParcelableCredentials.AUTH_TYPE_OAUTH : null; return new CursorLoader(this, Accounts.CONTENT_URI, Accounts.COLUMNS, where, null, null); } diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/BrowserSignInActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/BrowserSignInActivity.java index b27d3e653..fd1548bd0 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/BrowserSignInActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/BrowserSignInActivity.java @@ -39,8 +39,8 @@ import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Toast; -import org.mariotaku.simplerestapi.http.Authorization; -import org.mariotaku.simplerestapi.http.Endpoint; +import org.mariotaku.restfu.http.Authorization; +import org.mariotaku.restfu.http.Endpoint; import org.mariotaku.twidere.R; import org.mariotaku.twidere.api.twitter.TwitterOAuth; import org.mariotaku.twidere.api.twitter.auth.OAuthAuthorization; @@ -49,8 +49,8 @@ import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.provider.TwidereDataStore.Accounts; import org.mariotaku.twidere.util.AsyncTaskUtils; import org.mariotaku.twidere.util.OAuthPasswordAuthenticator; +import org.mariotaku.twidere.util.TwitterAPIFactory; import org.mariotaku.twidere.util.TwitterAPIUtils; -import org.mariotaku.twidere.util.Utils; import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; @@ -238,9 +238,9 @@ public class BrowserSignInActivity extends BaseSupportDialogActivity { consumerSecret = defConsumerSecret; } try { - final Endpoint endpoint = new Endpoint(Utils.getApiUrl(DEFAULT_TWITTER_API_URL_FORMAT, "api", "oauth")); + final Endpoint endpoint = new Endpoint(TwitterAPIUtils.getApiUrl(DEFAULT_TWITTER_API_URL_FORMAT, "api", "oauth")); final Authorization auth = new OAuthAuthorization(consumerKey, consumerSecret); - final TwitterOAuth twitter = TwitterAPIUtils.getInstance(mActivity, endpoint, auth, TwitterOAuth.class); + final TwitterOAuth twitter = TwitterAPIFactory.getInstance(mActivity, endpoint, auth, TwitterOAuth.class); return twitter.getRequestToken(OAUTH_CALLBACK_OOB); } catch (final Exception e) { e.printStackTrace(); diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/ImagePickerActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/ImagePickerActivity.java index cd64b1922..3fbc7c862 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/ImagePickerActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/ImagePickerActivity.java @@ -23,18 +23,18 @@ import android.webkit.MimeTypeMap; import com.github.ooxi.jdatauri.DataUri; import com.nostra13.universalimageloader.utils.IoUtils; -import org.mariotaku.simplerestapi.http.ContentType; -import org.mariotaku.simplerestapi.http.RestHttpClient; -import org.mariotaku.simplerestapi.http.RestHttpRequest; -import org.mariotaku.simplerestapi.http.RestHttpResponse; -import org.mariotaku.simplerestapi.http.mime.TypedData; -import org.mariotaku.simplerestapi.method.GET; +import org.mariotaku.restfu.annotation.method.GET; +import org.mariotaku.restfu.http.ContentType; +import org.mariotaku.restfu.http.RestHttpClient; +import org.mariotaku.restfu.http.RestHttpRequest; +import org.mariotaku.restfu.http.RestHttpResponse; +import org.mariotaku.restfu.http.mime.TypedData; import org.mariotaku.twidere.R; import org.mariotaku.twidere.fragment.ProgressDialogFragment; import org.mariotaku.twidere.fragment.support.BaseSupportDialogFragment; import org.mariotaku.twidere.model.SingleResponse; import org.mariotaku.twidere.util.ThemeUtils; -import org.mariotaku.twidere.util.TwitterAPIUtils; +import org.mariotaku.twidere.util.TwitterAPIFactory; import java.io.ByteArrayInputStream; import java.io.File; @@ -200,7 +200,7 @@ public class ImagePickerActivity extends ThemedFragmentActivity { final String mimeType; final String scheme = uri.getScheme(); if (SCHEME_HTTP.equals(scheme) || SCHEME_HTTPS.equals(scheme)) { - final RestHttpClient client = TwitterAPIUtils.getDefaultHttpClient(mActivity); + final RestHttpClient client = TwitterAPIFactory.getDefaultHttpClient(mActivity); final RestHttpRequest.Builder builder = new RestHttpRequest.Builder(); builder.method(GET.METHOD); builder.url(uri.toString()); diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/QuickSearchBarActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/QuickSearchBarActivity.java index f01b37951..872f3c67b 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/QuickSearchBarActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/QuickSearchBarActivity.java @@ -62,7 +62,7 @@ import org.mariotaku.twidere.activity.support.QuickSearchBarActivity.SuggestionI import org.mariotaku.twidere.adapter.AccountsSpinnerAdapter; import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.model.ParcelableAccount; -import org.mariotaku.twidere.model.ParcelableAccount.ParcelableCredentials; +import org.mariotaku.twidere.model.ParcelableCredentials; import org.mariotaku.twidere.model.ParcelableUser; import org.mariotaku.twidere.model.ParcelableUser.CachedIndices; import org.mariotaku.twidere.provider.TwidereDataStore.CachedUsers; 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 183f6437a..1c84b7b6e 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 @@ -60,8 +60,8 @@ import android.widget.Toast; import com.meizu.flyme.reflect.StatusBarProxy; -import org.mariotaku.simplerestapi.http.Authorization; -import org.mariotaku.simplerestapi.http.Endpoint; +import org.mariotaku.restfu.http.Authorization; +import org.mariotaku.restfu.http.Endpoint; import org.mariotaku.twidere.R; import org.mariotaku.twidere.activity.SettingsActivity; import org.mariotaku.twidere.api.twitter.Twitter; @@ -77,9 +77,11 @@ import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.fragment.support.BaseSupportDialogFragment; import org.mariotaku.twidere.fragment.support.SupportProgressDialogFragment; import org.mariotaku.twidere.graphic.EmptyDrawable; +import org.mariotaku.twidere.model.ParcelableCredentials; import org.mariotaku.twidere.provider.TwidereDataStore.Accounts; import org.mariotaku.twidere.util.AsyncTaskUtils; import org.mariotaku.twidere.util.ContentValuesCreator; +import org.mariotaku.twidere.util.ErrorLogger; import org.mariotaku.twidere.util.OAuthPasswordAuthenticator; import org.mariotaku.twidere.util.OAuthPasswordAuthenticator.AuthenticationException; import org.mariotaku.twidere.util.OAuthPasswordAuthenticator.AuthenticityTokenException; @@ -88,8 +90,8 @@ import org.mariotaku.twidere.util.ParseUtils; import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.util.TwidereActionModeForChildListener; import org.mariotaku.twidere.util.TwidereColorUtils; +import org.mariotaku.twidere.util.TwitterAPIFactory; import org.mariotaku.twidere.util.TwitterAPIUtils; -import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.util.support.ViewSupport; import org.mariotaku.twidere.util.support.view.ViewOutlineProviderCompat; import org.mariotaku.twidere.view.iface.TintedStatusLayout; @@ -144,12 +146,12 @@ public class SignInActivity extends BaseAppCompatActivity implements OnClickList case REQUEST_EDIT_API: { if (resultCode == RESULT_OK) { mAPIUrlFormat = data.getStringExtra(Accounts.API_URL_FORMAT); - mAuthType = data.getIntExtra(Accounts.AUTH_TYPE, Accounts.AUTH_TYPE_OAUTH); + mAuthType = data.getIntExtra(Accounts.AUTH_TYPE, ParcelableCredentials.AUTH_TYPE_OAUTH); mSameOAuthSigningUrl = data.getBooleanExtra(Accounts.SAME_OAUTH_SIGNING_URL, false); mNoVersionSuffix = data.getBooleanExtra(Accounts.NO_VERSION_SUFFIX, false); mConsumerKey = data.getStringExtra(Accounts.CONSUMER_KEY); mConsumerSecret = data.getStringExtra(Accounts.CONSUMER_SECRET); - final boolean isTwipOMode = mAuthType == Accounts.AUTH_TYPE_TWIP_O_MODE; + final boolean isTwipOMode = mAuthType == ParcelableCredentials.AUTH_TYPE_TWIP_O_MODE; mUsernamePasswordContainer.setVisibility(isTwipOMode ? View.GONE : View.VISIBLE); mSignInSignUpContainer.setOrientation(isTwipOMode ? LinearLayout.VERTICAL : LinearLayout.HORIZONTAL); } @@ -246,7 +248,7 @@ public class SignInActivity extends BaseAppCompatActivity implements OnClickList break; } case MENU_OPEN_IN_BROWSER: { - if (mAuthType != Accounts.AUTH_TYPE_OAUTH || mTask != null + if (mAuthType != ParcelableCredentials.AUTH_TYPE_OAUTH || mTask != null && mTask.getStatus() == AsyncTask.Status.RUNNING) return false; saveEditedText(); final Intent intent = new Intent(this, BrowserSignInActivity.class); @@ -263,7 +265,7 @@ public class SignInActivity extends BaseAppCompatActivity implements OnClickList public boolean onPrepareOptionsMenu(final Menu menu) { final MenuItem itemBrowser = menu.findItem(MENU_OPEN_IN_BROWSER); if (itemBrowser != null) { - final boolean is_oauth = mAuthType == Accounts.AUTH_TYPE_OAUTH; + final boolean is_oauth = mAuthType == ParcelableCredentials.AUTH_TYPE_OAUTH; itemBrowser.setVisible(is_oauth); itemBrowser.setEnabled(is_oauth); } @@ -334,8 +336,8 @@ public class SignInActivity extends BaseAppCompatActivity implements OnClickList } mUsernamePasswordContainer - .setVisibility(mAuthType == Accounts.AUTH_TYPE_TWIP_O_MODE ? View.GONE : View.VISIBLE); - mSignInSignUpContainer.setOrientation(mAuthType == Accounts.AUTH_TYPE_TWIP_O_MODE ? LinearLayout.VERTICAL + .setVisibility(mAuthType == ParcelableCredentials.AUTH_TYPE_TWIP_O_MODE ? View.GONE : View.VISIBLE); + mSignInSignUpContainer.setOrientation(mAuthType == ParcelableCredentials.AUTH_TYPE_TWIP_O_MODE ? LinearLayout.VERTICAL : LinearLayout.HORIZONTAL); mEditUsername.setText(mUsername); @@ -388,7 +390,7 @@ public class SignInActivity extends BaseAppCompatActivity implements OnClickList final long apiLastChange = mPreferences.getLong(KEY_API_LAST_CHANGE, mAPIChangeTimestamp); final boolean defaultApiChanged = apiLastChange != mAPIChangeTimestamp; final String apiUrlFormat = getNonEmptyString(mPreferences, KEY_API_URL_FORMAT, DEFAULT_TWITTER_API_URL_FORMAT); - final int authType = mPreferences.getInt(KEY_AUTH_TYPE, Accounts.AUTH_TYPE_OAUTH); + final int authType = mPreferences.getInt(KEY_AUTH_TYPE, ParcelableCredentials.AUTH_TYPE_OAUTH); final boolean sameOAuthSigningUrl = mPreferences.getBoolean(KEY_SAME_OAUTH_SIGNING_URL, false); final boolean noVersionSuffix = mPreferences.getBoolean(KEY_NO_VERSION_SUFFIX, false); final String consumerKey = getNonEmptyString(mPreferences, KEY_CONSUMER_KEY, TWITTER_CONSUMER_KEY); @@ -418,7 +420,7 @@ public class SignInActivity extends BaseAppCompatActivity implements OnClickList private void setSignInButton() { mSignInButton.setEnabled(mEditPassword.getText().length() > 0 && mEditUsername.getText().length() > 0 - || mAuthType == Accounts.AUTH_TYPE_TWIP_O_MODE); + || mAuthType == ParcelableCredentials.AUTH_TYPE_TWIP_O_MODE); } void onSignInResult(final SignInResponse result) { @@ -429,41 +431,17 @@ public class SignInActivity extends BaseAppCompatActivity implements OnClickList } if (result != null) { if (result.succeed) { - final ContentValues values; - switch (result.auth_type) { - case Accounts.AUTH_TYPE_BASIC: { - values = createAccount(result.basic_username, result.basic_password, - result.user, result.color, result.api_url_format, result.no_version_suffix); - break; - } - case Accounts.AUTH_TYPE_TWIP_O_MODE: { - values = ContentValuesCreator.createAccount(result.user, result.color, - result.api_url_format, result.no_version_suffix); - break; - } - case Accounts.AUTH_TYPE_OAUTH: - case Accounts.AUTH_TYPE_XAUTH: { - values = ContentValuesCreator.createAccount(result.oauth, - result.user, result.auth_type, result.color, result.api_url_format, - result.same_oauth_signing_url, result.no_version_suffix); - break; - } - default: { - values = null; - } - } - if (values != null) { - mResolver.insert(Accounts.CONTENT_URI, values); - } + insertAccount(result); final long loggedId = result.user.getId(); final Intent intent = new Intent(this, HomeActivity.class); intent.putExtra(EXTRA_REFRESH_IDS, new long[]{loggedId}); intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); startActivity(intent); finish(); - } else if (result.already_logged_in) { + } else if (result.alreadyLoggedIn) { Toast.makeText(this, R.string.error_already_logged_in, Toast.LENGTH_SHORT).show(); } else { + ErrorLogger.exception(result.exception); if (result.exception instanceof AuthenticityTokenException) { Toast.makeText(this, R.string.wrong_api_key, Toast.LENGTH_SHORT).show(); } else if (result.exception instanceof WrongUserPassException) { @@ -478,6 +456,35 @@ public class SignInActivity extends BaseAppCompatActivity implements OnClickList setSignInButton(); } + private void insertAccount(final SignInResponse result) { + final ContentValues values; + switch (result.authType) { + case ParcelableCredentials.AUTH_TYPE_BASIC: { + values = createAccount(result.basicUsername, result.basicPassword, + result.user, result.color, result.apiUrlFormat, result.noVersionSuffix); + break; + } + case ParcelableCredentials.AUTH_TYPE_TWIP_O_MODE: { + values = ContentValuesCreator.createAccount(result.user, result.color, + result.apiUrlFormat, result.noVersionSuffix); + break; + } + case ParcelableCredentials.AUTH_TYPE_OAUTH: + case ParcelableCredentials.AUTH_TYPE_XAUTH: { + values = ContentValuesCreator.createAccount(result.oauth, + result.user, result.authType, result.color, result.apiUrlFormat, + result.sameOauthSigningUrl, result.noVersionSuffix); + break; + } + default: { + values = null; + } + } + if (values != null) { + mResolver.insert(Accounts.CONTENT_URI, values); + } + } + void onSignInStart() { mHandler.post(new Runnable() { @Override @@ -592,20 +599,20 @@ public class SignInActivity extends BaseAppCompatActivity implements OnClickList protected SignInResponse doInBackground(final Object... params) { try { final String versionSuffix = noVersionSuffix ? null : "1.1"; - final Endpoint endpoint = new Endpoint(Utils.getApiUrl(apiUrlFormat, "api", versionSuffix)); - final TwitterOAuth oauth = TwitterAPIUtils.getInstance(context, endpoint, + final Endpoint endpoint = new Endpoint(TwitterAPIUtils.getApiUrl(apiUrlFormat, "api", versionSuffix)); + final TwitterOAuth oauth = TwitterAPIFactory.getInstance(context, endpoint, new OAuthAuthorization(consumerKey.getOauthToken(), consumerKey.getOauthTokenSecret()), TwitterOAuth.class); final OAuthToken accessToken = oauth.getAccessToken(requestToken, oauthVerifier); final long userId = accessToken.getUserId(); if (userId <= 0) return new SignInResponse(false, false, null); final OAuthAuthorization auth = new OAuthAuthorization(consumerKey.getOauthToken(), consumerKey.getOauthTokenSecret(), accessToken); - final Twitter twitter = TwitterAPIUtils.getInstance(context, endpoint, + final Twitter twitter = TwitterAPIFactory.getInstance(context, endpoint, auth, Twitter.class); final User user = twitter.verifyCredentials(); - if (isUserLoggedIn(context, userId)) return new SignInResponse(true, false, null); final int color = analyseUserProfileColor(user); - return new SignInResponse(auth, user, Accounts.AUTH_TYPE_OAUTH, color, apiUrlFormat, - sameOauthSigningUrl, noVersionSuffix); + return new SignInResponse(isUserLoggedIn(context, userId), auth, user, + ParcelableCredentials.AUTH_TYPE_OAUTH, color, apiUrlFormat, sameOauthSigningUrl, + noVersionSuffix); } catch (final TwitterException e) { return new SignInResponse(false, false, e); } @@ -656,13 +663,13 @@ public class SignInActivity extends BaseAppCompatActivity implements OnClickList protected SignInResponse doInBackground(final Object... params) { try { switch (authType) { - case Accounts.AUTH_TYPE_OAUTH: + case ParcelableCredentials.AUTH_TYPE_OAUTH: return authOAuth(); - case Accounts.AUTH_TYPE_XAUTH: + case ParcelableCredentials.AUTH_TYPE_XAUTH: return authxAuth(); - case Accounts.AUTH_TYPE_BASIC: + case ParcelableCredentials.AUTH_TYPE_BASIC: return authBasic(); - case Accounts.AUTH_TYPE_TWIP_O_MODE: + case ParcelableCredentials.AUTH_TYPE_TWIP_O_MODE: return authTwipOMode(); } return authOAuth(); @@ -677,79 +684,75 @@ public class SignInActivity extends BaseAppCompatActivity implements OnClickList private SignInResponse authBasic() throws TwitterException { final String versionSuffix = noVersionSuffix ? null : "1.1"; - final Endpoint endpoint = new Endpoint(Utils.getApiUrl(apiUrlFormat, "api", versionSuffix)); + final Endpoint endpoint = new Endpoint(TwitterAPIUtils.getApiUrl(apiUrlFormat, "api", versionSuffix)); final Authorization auth = new BasicAuthorization(username, password); - final Twitter twitter = TwitterAPIUtils.getInstance(context, endpoint, auth, Twitter.class); + final Twitter twitter = TwitterAPIFactory.getInstance(context, endpoint, auth, Twitter.class); final User user = twitter.verifyCredentials(); final long userId = user.getId(); if (userId <= 0) return new SignInResponse(false, false, null); if (isUserLoggedIn(context, userId)) return new SignInResponse(true, false, null); final int color = analyseUserProfileColor(user); - return new SignInResponse(username, password, user, color, apiUrlFormat, - noVersionSuffix); + return new SignInResponse(isUserLoggedIn(context, userId), username, password, user, + color, apiUrlFormat, noVersionSuffix); } private SignInResponse authOAuth() throws AuthenticationException, TwitterException { String endpointUrl, signEndpointUrl; - endpointUrl = Utils.getApiUrl(apiUrlFormat, "api", null); + endpointUrl = TwitterAPIUtils.getApiUrl(apiUrlFormat, "api", null); if (!sameOAuthSigningUrl) { - signEndpointUrl = Utils.getApiUrl(DEFAULT_TWITTER_API_URL_FORMAT, "api", null); + signEndpointUrl = TwitterAPIUtils.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 = TwitterAPIUtils.getInstance(context, endpoint, auth, TwitterOAuth.class); + final TwitterOAuth oauth = TwitterAPIFactory.getInstance(context, endpoint, auth, TwitterOAuth.class); final OAuthPasswordAuthenticator authenticator = new OAuthPasswordAuthenticator(oauth); final OAuthToken accessToken = authenticator.getOAuthAccessToken(username, password); final long userId = accessToken.getUserId(); if (userId <= 0) return new SignInResponse(false, false, null); - if (isUserLoggedIn(context, userId)) return new SignInResponse(true, false, null); - final String versionSuffix = noVersionSuffix ? null : "1.1"; - endpointUrl = Utils.getApiUrl(apiUrlFormat, "api", versionSuffix); + endpointUrl = TwitterAPIUtils.getApiUrl(apiUrlFormat, "api", versionSuffix); if (!sameOAuthSigningUrl) { - signEndpointUrl = Utils.getApiUrl(DEFAULT_TWITTER_API_URL_FORMAT, "api", versionSuffix); + signEndpointUrl = TwitterAPIUtils.getApiUrl(DEFAULT_TWITTER_API_URL_FORMAT, "api", versionSuffix); } else { signEndpointUrl = endpointUrl; } endpoint = new OAuthEndpoint(endpointUrl, signEndpointUrl); auth = new OAuthAuthorization(consumerKey.getOauthToken(), consumerKey.getOauthTokenSecret(), accessToken); - final Twitter twitter = TwitterAPIUtils.getInstance(context, endpoint, + final Twitter twitter = TwitterAPIFactory.getInstance(context, endpoint, auth, Twitter.class); final User user = twitter.verifyCredentials(); final int color = analyseUserProfileColor(user); - return new SignInResponse(auth, user, Accounts.AUTH_TYPE_OAUTH, color, + return new SignInResponse(isUserLoggedIn(context, userId), auth, user, ParcelableCredentials.AUTH_TYPE_OAUTH, color, apiUrlFormat, sameOAuthSigningUrl, noVersionSuffix); } private SignInResponse authTwipOMode() throws TwitterException { final String versionSuffix = noVersionSuffix ? null : "1.1"; - final Endpoint endpoint = new Endpoint(Utils.getApiUrl(apiUrlFormat, "api", versionSuffix)); + final Endpoint endpoint = new Endpoint(TwitterAPIUtils.getApiUrl(apiUrlFormat, "api", versionSuffix)); final Authorization auth = new EmptyAuthorization(); - final Twitter twitter = TwitterAPIUtils.getInstance(context, endpoint, auth, Twitter.class); + final Twitter twitter = TwitterAPIFactory.getInstance(context, endpoint, auth, Twitter.class); final User user = twitter.verifyCredentials(); final long userId = user.getId(); if (userId <= 0) return new SignInResponse(false, false, null); - if (isUserLoggedIn(context, userId)) return new SignInResponse(true, false, null); final int color = analyseUserProfileColor(user); - return new SignInResponse(user, color, apiUrlFormat, noVersionSuffix); + return new SignInResponse(isUserLoggedIn(context, userId), user, color, apiUrlFormat, noVersionSuffix); } private SignInResponse authxAuth() throws TwitterException { final String versionSuffix = noVersionSuffix ? null : "1.1"; - final Endpoint endpoint = new Endpoint(Utils.getApiUrl(apiUrlFormat, "api", versionSuffix)); + final Endpoint endpoint = new Endpoint(TwitterAPIUtils.getApiUrl(apiUrlFormat, "api", versionSuffix)); OAuthAuthorization auth = new OAuthAuthorization(consumerKey.getOauthToken(), consumerKey.getOauthTokenSecret()); - final TwitterOAuth oauth = TwitterAPIUtils.getInstance(context, endpoint, auth, TwitterOAuth.class); + final TwitterOAuth oauth = TwitterAPIFactory.getInstance(context, endpoint, auth, TwitterOAuth.class); final OAuthToken accessToken = oauth.getAccessToken(username, password, TwitterOAuth.XAuthMode.CLIENT); final long userId = accessToken.getUserId(); if (userId <= 0) return new SignInResponse(false, false, null); - if (isUserLoggedIn(context, userId)) return new SignInResponse(true, false, null); auth = new OAuthAuthorization(consumerKey.getOauthToken(), consumerKey.getOauthTokenSecret(), accessToken); - final Twitter twitter = TwitterAPIUtils.getInstance(context, endpoint, auth, Twitter.class); + final Twitter twitter = TwitterAPIFactory.getInstance(context, endpoint, auth, Twitter.class); final User user = twitter.verifyCredentials(); final int color = analyseUserProfileColor(user); - return new SignInResponse(auth, user, Accounts.AUTH_TYPE_XAUTH, color, apiUrlFormat, + return new SignInResponse(isUserLoggedIn(context, userId), auth, user, ParcelableCredentials.AUTH_TYPE_XAUTH, color, apiUrlFormat, sameOAuthSigningUrl, noVersionSuffix); } @@ -757,55 +760,56 @@ public class SignInActivity extends BaseAppCompatActivity implements OnClickList static class SignInResponse { - public final boolean already_logged_in, succeed; + public final boolean alreadyLoggedIn, succeed; public final Exception exception; - public final String basic_username, basic_password; + public final String basicUsername, basicPassword; public final OAuthAuthorization oauth; public final User user; - public final int auth_type, color; - public final String api_url_format; - public final boolean same_oauth_signing_url, no_version_suffix; + public final int authType, color; + public final String apiUrlFormat; + public final boolean sameOauthSigningUrl, noVersionSuffix; - public SignInResponse(final boolean already_logged_in, final boolean succeed, final Exception exception) { - this(already_logged_in, succeed, exception, null, null, null, null, 0, 0, null, false, false); + public SignInResponse(final boolean alreadyLoggedIn, final boolean succeed, final Exception exception) { + this(alreadyLoggedIn, succeed, exception, null, null, null, null, 0, 0, null, false, false); } - public SignInResponse(final boolean already_logged_in, final boolean succeed, final Exception exception, - final String basic_username, final String basic_password, - final OAuthAuthorization oauth, final User user, final int auth_type, final int color, - final String api_url_format, final boolean same_oauth_signing_url, final boolean no_version_suffix) { - this.already_logged_in = already_logged_in; + public SignInResponse(final boolean alreadyLoggedIn, final boolean succeed, final Exception exception, + final String basicUsername, final String basicPassword, + final OAuthAuthorization oauth, final User user, final int authType, final int color, + final String apiUrlFormat, final boolean sameOauthSigningUrl, final boolean noVersionSuffix) { + this.alreadyLoggedIn = alreadyLoggedIn; this.succeed = succeed; this.exception = exception; - this.basic_username = basic_username; - this.basic_password = basic_password; + this.basicUsername = basicUsername; + this.basicPassword = basicPassword; this.oauth = oauth; this.user = user; - this.auth_type = auth_type; + this.authType = authType; this.color = color; - this.api_url_format = api_url_format; - this.same_oauth_signing_url = same_oauth_signing_url; - this.no_version_suffix = no_version_suffix; + this.apiUrlFormat = apiUrlFormat; + this.sameOauthSigningUrl = sameOauthSigningUrl; + this.noVersionSuffix = noVersionSuffix; } - public SignInResponse(final OAuthAuthorization oauth, final User user, - final int auth_type, final int color, final String api_url_format, - final boolean same_oauth_signing_url, final boolean no_version_suffix) { - this(false, true, null, null, null, oauth, user, auth_type, color, api_url_format, - same_oauth_signing_url, no_version_suffix); + public SignInResponse(final boolean alreadyLoggedIn, final OAuthAuthorization oauth, + final User user, final int authType, final int color, + final String apiUrlFormat, final boolean sameOauthSigningUrl, + final boolean noVersionSuffix) { + this(alreadyLoggedIn, true, null, null, null, oauth, user, authType, color, apiUrlFormat, + sameOauthSigningUrl, noVersionSuffix); } - public SignInResponse(final String basic_username, final String basic_password, - final User user, final int color, final String api_url_format, - final boolean no_version_suffix) { - this(false, true, null, basic_username, basic_password, null, user, Accounts.AUTH_TYPE_BASIC, color, - api_url_format, false, no_version_suffix); + public SignInResponse(final boolean alreadyLoggedIn, final String basicUsername, + final String basicPassword, final User user, final int color, + final String apiUrlFormat, final boolean noVersionSuffix) { + this(alreadyLoggedIn, true, null, basicUsername, basicPassword, null, user, ParcelableCredentials.AUTH_TYPE_BASIC, color, + apiUrlFormat, false, noVersionSuffix); } - public SignInResponse(final User user, final int color, - final String api_url_format, final boolean no_version_suffix) { - this(false, true, null, null, null, null, user, Accounts.AUTH_TYPE_TWIP_O_MODE, color, - api_url_format, false, no_version_suffix); + public SignInResponse(final boolean alreadyLoggedIn, final User user, final int color, + final String apiUrlFormat, final boolean noVersionSuffix) { + this(alreadyLoggedIn, true, null, null, null, null, user, ParcelableCredentials.AUTH_TYPE_TWIP_O_MODE, color, + apiUrlFormat, false, noVersionSuffix); } } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/UserListSelectorActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/UserListSelectorActivity.java index a902d9c84..199bfaf7a 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/UserListSelectorActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/UserListSelectorActivity.java @@ -52,7 +52,7 @@ import org.mariotaku.twidere.model.ParcelableUser; import org.mariotaku.twidere.model.ParcelableUserList; import org.mariotaku.twidere.model.SingleResponse; import org.mariotaku.twidere.util.AsyncTaskUtils; -import org.mariotaku.twidere.util.TwitterAPIUtils; +import org.mariotaku.twidere.util.TwitterAPIFactory; import java.util.ArrayList; import java.util.List; @@ -248,7 +248,7 @@ public class UserListSelectorActivity extends BaseSupportDialogActivity implemen @Override protected SingleResponse> doInBackground(final Object... params) { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mActivity, mAccountId, false); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mActivity, mAccountId, false); if (twitter == null) return SingleResponse.getInstance(); try { final ResponseList lists = twitter.getUserLists(mScreenName, true); @@ -319,7 +319,7 @@ public class UserListSelectorActivity extends BaseSupportDialogActivity implemen @Override protected SingleResponse> doInBackground(final Object... params) { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mActivity, mAccountId, false); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mActivity, mAccountId, false); if (twitter == null) return SingleResponse.getInstance(); try { final Paging paging = new Paging(); diff --git a/twidere/src/main/java/org/mariotaku/twidere/adapter/AccountsSpinnerAdapter.java b/twidere/src/main/java/org/mariotaku/twidere/adapter/AccountsSpinnerAdapter.java index 843096c04..8ce0bfef3 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/adapter/AccountsSpinnerAdapter.java +++ b/twidere/src/main/java/org/mariotaku/twidere/adapter/AccountsSpinnerAdapter.java @@ -28,7 +28,7 @@ import android.widget.TextView; import org.mariotaku.twidere.R; import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.fragment.support.MessagesConversationFragment; -import org.mariotaku.twidere.model.ParcelableAccount.ParcelableCredentials; +import org.mariotaku.twidere.model.ParcelableCredentials; import org.mariotaku.twidere.util.MediaLoaderWrapper; import java.util.Collection; diff --git a/twidere/src/main/java/org/mariotaku/twidere/app/TwidereApplication.java b/twidere/src/main/java/org/mariotaku/twidere/app/TwidereApplication.java index 536ad2f5c..e5531d358 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/app/TwidereApplication.java +++ b/twidere/src/main/java/org/mariotaku/twidere/app/TwidereApplication.java @@ -55,6 +55,7 @@ import org.mariotaku.twidere.activity.MainHondaJOJOActivity; import org.mariotaku.twidere.service.RefreshService; import org.mariotaku.twidere.util.AsyncTaskManager; import org.mariotaku.twidere.util.AsyncTwitterWrapper; +import org.mariotaku.twidere.util.ErrorLogger; import org.mariotaku.twidere.util.KeyboardShortcutsHandler; import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.MultiSelectManager; @@ -270,6 +271,7 @@ public class TwidereApplication extends MultiDexApplication implements Constants private void initBugReport() { ACRA.init(this); + ErrorLogger.setEnabled(BuildConfig.DEBUG); } private void migrateUsageStatisticsPreferences() { diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/MessagesConversationFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/MessagesConversationFragment.java index 0182e3b10..52cda4b61 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/MessagesConversationFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/MessagesConversationFragment.java @@ -87,7 +87,7 @@ import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.constant.SharedPreferenceConstants; import org.mariotaku.twidere.loader.support.UserSearchLoader; import org.mariotaku.twidere.model.ParcelableAccount; -import org.mariotaku.twidere.model.ParcelableAccount.ParcelableCredentials; +import org.mariotaku.twidere.model.ParcelableCredentials; import org.mariotaku.twidere.model.ParcelableDirectMessage; import org.mariotaku.twidere.model.ParcelableUser; import org.mariotaku.twidere.model.ParcelableUser.CachedIndices; diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusFragment.java index 7fd008971..b64f5baaf 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusFragment.java @@ -84,7 +84,7 @@ import org.mariotaku.twidere.constant.IntentConstants; import org.mariotaku.twidere.loader.support.ParcelableStatusLoader; import org.mariotaku.twidere.loader.support.StatusRepliesLoader; import org.mariotaku.twidere.model.ListResponse; -import org.mariotaku.twidere.model.ParcelableAccount.ParcelableCredentials; +import org.mariotaku.twidere.model.ParcelableCredentials; import org.mariotaku.twidere.model.ParcelableLocation; import org.mariotaku.twidere.model.ParcelableMedia; import org.mariotaku.twidere.model.ParcelableStatus; @@ -105,7 +105,7 @@ import org.mariotaku.twidere.util.StatusAdapterLinkClickHandler; import org.mariotaku.twidere.util.StatusLinkClickHandler; import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.util.TwidereLinkify; -import org.mariotaku.twidere.util.TwitterAPIUtils; +import org.mariotaku.twidere.util.TwitterAPIFactory; import org.mariotaku.twidere.util.TwitterCardUtils; import org.mariotaku.twidere.util.UserColorNameManager; import org.mariotaku.twidere.util.Utils; @@ -966,7 +966,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac ParcelableStatus status = params[0]; final long accountId = status.account_id; if (Utils.isOfficialKeyAccount(context, accountId)) { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(context, accountId, true); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(context, accountId, true); while (status.in_reply_to_status_id > 0 && !isCancelled()) { final ParcelableStatus cached = Utils.findStatusInDatabases(context, accountId, status.in_reply_to_status_id); if (cached == null) break; diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusTranslateDialogFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusTranslateDialogFragment.java index f0c979366..26eaa7765 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusTranslateDialogFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusTranslateDialogFragment.java @@ -40,7 +40,7 @@ import org.mariotaku.twidere.api.twitter.TwitterException; import org.mariotaku.twidere.api.twitter.model.TranslationResult; import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.model.SingleResponse; -import org.mariotaku.twidere.util.TwitterAPIUtils; +import org.mariotaku.twidere.util.TwitterAPIFactory; import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.view.holder.StatusViewHolder; import org.mariotaku.twidere.view.holder.StatusViewHolder.DummyStatusHolderAdapter; @@ -157,7 +157,7 @@ public class StatusTranslateDialogFragment extends BaseSupportDialogFragment imp @Override public SingleResponse loadInBackground() { final Context context = getContext(); - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(context, mAccountId, false); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(context, mAccountId, false); final SharedPreferences prefs = context.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE); if (twitter == null) return SingleResponse.getInstance(); try { diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserFragment.java index a97abb8c0..50b6d8d49 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserFragment.java @@ -107,7 +107,7 @@ import org.mariotaku.twidere.fragment.iface.SupportFragmentCallback; import org.mariotaku.twidere.graphic.ActionBarColorDrawable; import org.mariotaku.twidere.graphic.ActionIconDrawable; import org.mariotaku.twidere.loader.support.ParcelableUserLoader; -import org.mariotaku.twidere.model.ParcelableAccount.ParcelableCredentials; +import org.mariotaku.twidere.model.ParcelableCredentials; import org.mariotaku.twidere.model.ParcelableMedia; import org.mariotaku.twidere.model.ParcelableUser; import org.mariotaku.twidere.model.ParcelableUserList; @@ -129,7 +129,7 @@ import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.util.TwidereColorUtils; import org.mariotaku.twidere.util.TwidereLinkify; import org.mariotaku.twidere.util.TwidereLinkify.OnLinkClickListener; -import org.mariotaku.twidere.util.TwitterAPIUtils; +import org.mariotaku.twidere.util.TwitterAPIFactory; import org.mariotaku.twidere.util.UserColorNameManager; import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.util.menu.TwidereMenuInfo; @@ -195,6 +195,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener private ViewPager mViewPager; private TabPagerIndicator mPagerIndicator; private View mPagerOverlay; + private View mErrorOverlay; private View mUuckyFooter; private View mProfileBannerContainer; private Button mFollowButton; @@ -794,6 +795,8 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener if (activity instanceof IThemedActivity) { ViewSupport.setBackground(mPagerOverlay, ThemeUtils.getNormalWindowContentOverlay(activity, ((IThemedActivity) activity).getCurrentThemeResourceId())); + ViewSupport.setBackground(mErrorOverlay, ThemeUtils.getNormalWindowContentOverlay(activity, + ((IThemedActivity) activity).getCurrentThemeResourceId())); } setupBaseActionBar(); @@ -1110,6 +1113,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener mViewPager = (ViewPager) contentView.findViewById(R.id.view_pager); mPagerIndicator = (TabPagerIndicator) contentView.findViewById(R.id.view_pager_tabs); mPagerOverlay = contentView.findViewById(R.id.pager_window_overlay); + mErrorOverlay = contentView.findViewById(R.id.error_window_overlay); mFollowButton = (Button) headerView.findViewById(R.id.follow); mFollowProgress = (ProgressBar) headerView.findViewById(R.id.follow_progress); mUuckyFooter = headerView.findViewById(R.id.uucky_footer); @@ -1485,7 +1489,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener final ProfileBannerImageView profileBannerView = mProfileBannerView; final View profileBannerContainer = mProfileBannerContainer; final int spaceHeight = space.getHeight(); - final float factor = MathUtils.clamp(offset / (float) spaceHeight, 0, 1); + final float factor = MathUtils.clamp(spaceHeight == 0 ? 0 : (offset / (float) spaceHeight), 0, 1); // profileBannerContainer.setTranslationY(Math.max(-offset, -spaceHeight)); // profileBannerView.setTranslationY(Math.min(offset, spaceHeight) / 2); profileBannerContainer.setTranslationY(-offset); @@ -1659,7 +1663,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener @Override public SingleResponse loadInBackground() { if (account_id == user_id) return SingleResponse.getInstance(); - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(context, account_id, false); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(context, account_id, false); if (twitter == null) return SingleResponse.getInstance(); try { final Relationship relationship = twitter.showFriendship(user_id); diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListFragment.java index 73d2e86ab..ef1c27b60 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListFragment.java @@ -81,7 +81,7 @@ import org.mariotaku.twidere.util.ParseUtils; import org.mariotaku.twidere.util.SharedPreferencesWrapper; import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.util.TwidereLinkify; -import org.mariotaku.twidere.util.TwitterAPIUtils; +import org.mariotaku.twidere.util.TwitterAPIFactory; import org.mariotaku.twidere.util.UserColorNameManager; import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.view.TabPagerIndicator; @@ -558,7 +558,7 @@ public class UserListFragment extends BaseSupportFragment implements OnClickList final ParcelableUserList cache = mExtras.getParcelable(EXTRA_USER_LIST); if (cache != null) return SingleResponse.getInstance(cache); } - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(getContext(), mAccountId, true); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(getContext(), mAccountId, true); if (twitter == null) return SingleResponse.getInstance(); try { final UserList list; diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListMembersFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListMembersFragment.java index 2e82922de..ac8eeaec4 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListMembersFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListMembersFragment.java @@ -30,13 +30,13 @@ import org.mariotaku.twidere.loader.support.CursorSupportUsersLoader; import org.mariotaku.twidere.loader.support.UserListMembersLoader; import org.mariotaku.twidere.model.ParcelableUserList; import org.mariotaku.twidere.util.AsyncTaskUtils; -import org.mariotaku.twidere.util.TwitterAPIUtils; +import org.mariotaku.twidere.util.TwitterAPIFactory; import org.mariotaku.twidere.api.twitter.Twitter; import org.mariotaku.twidere.api.twitter.TwitterException; import org.mariotaku.twidere.api.twitter.model.UserList; -import static org.mariotaku.twidere.util.TwitterAPIUtils.getTwitterInstance; +import static org.mariotaku.twidere.util.TwitterAPIFactory.getTwitterInstance; public class UserListMembersFragment extends CursorSupportUsersListFragment { @@ -124,7 +124,7 @@ public class UserListMembersFragment extends CursorSupportUsersListFragment { @Override protected ParcelableUserList doInBackground(final Object... params) { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(getActivity(), accountId, true); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(getActivity(), accountId, true); if (twitter == null) return null; try { final UserList list; diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserProfileEditorFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserProfileEditorFragment.java index 2241bec49..0d68fa300 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserProfileEditorFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserProfileEditorFragment.java @@ -51,6 +51,10 @@ import com.twitter.Validator; import org.mariotaku.twidere.R; import org.mariotaku.twidere.activity.support.ColorPickerDialogActivity; import org.mariotaku.twidere.activity.support.ImagePickerActivity; +import org.mariotaku.twidere.api.twitter.Twitter; +import org.mariotaku.twidere.api.twitter.TwitterException; +import org.mariotaku.twidere.api.twitter.model.ProfileUpdate; +import org.mariotaku.twidere.api.twitter.model.User; import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.loader.support.ParcelableUserLoader; import org.mariotaku.twidere.model.ParcelableUser; @@ -62,18 +66,13 @@ import org.mariotaku.twidere.util.AsyncTwitterWrapper.UpdateProfileImageTask; import org.mariotaku.twidere.util.KeyboardShortcutsHandler; import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.ParseUtils; -import org.mariotaku.twidere.util.TwitterAPIUtils; +import org.mariotaku.twidere.util.TwitterAPIFactory; import org.mariotaku.twidere.util.TwitterValidatorMETLengthChecker; import org.mariotaku.twidere.util.TwitterWrapper; import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.view.ForegroundColorView; import org.mariotaku.twidere.view.iface.IExtendedView.OnSizeChangedListener; -import org.mariotaku.twidere.api.twitter.model.ProfileUpdate; -import org.mariotaku.twidere.api.twitter.Twitter; -import org.mariotaku.twidere.api.twitter.TwitterException; -import org.mariotaku.twidere.api.twitter.model.User; - import static android.text.TextUtils.isEmpty; public class UserProfileEditorFragment extends BaseSupportFragment implements OnSizeChangedListener, TextWatcher, @@ -130,13 +129,13 @@ public class UserProfileEditorFragment extends BaseSupportFragment implements On } case R.id.profile_image_camera: { final Intent intent = new Intent(getActivity(), ImagePickerActivity.class); - intent.setAction(ImagePickerActivity.INTENT_ACTION_PICK_IMAGE); + intent.setAction(ImagePickerActivity.INTENT_ACTION_TAKE_PHOTO); startActivityForResult(intent, REQUEST_UPLOAD_PROFILE_IMAGE); break; } case R.id.profile_image_gallery: { final Intent intent = new Intent(getActivity(), ImagePickerActivity.class); - intent.setAction(ImagePickerActivity.INTENT_ACTION_TAKE_PHOTO); + intent.setAction(ImagePickerActivity.INTENT_ACTION_PICK_IMAGE); startActivityForResult(intent, REQUEST_UPLOAD_PROFILE_IMAGE); break; } @@ -439,7 +438,7 @@ public class UserProfileEditorFragment extends BaseSupportFragment implements On @Override protected SingleResponse doInBackground(final Object... params) { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mActivity, mAccountId, true); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mActivity, mAccountId, true); try { User user = null; if (isProfileChanged()) { diff --git a/twidere/src/main/java/org/mariotaku/twidere/loader/support/BaseUserListsLoader.java b/twidere/src/main/java/org/mariotaku/twidere/loader/support/BaseUserListsLoader.java index 1100954a6..8fbd43e3f 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/loader/support/BaseUserListsLoader.java +++ b/twidere/src/main/java/org/mariotaku/twidere/loader/support/BaseUserListsLoader.java @@ -24,7 +24,7 @@ import android.support.v4.content.AsyncTaskLoader; import org.mariotaku.twidere.loader.support.iface.ICursorSupportLoader; import org.mariotaku.twidere.model.ParcelableUserList; -import org.mariotaku.twidere.util.TwitterAPIUtils; +import org.mariotaku.twidere.util.TwitterAPIFactory; import org.mariotaku.twidere.util.collection.NoDuplicatesArrayList; import java.util.Collections; @@ -36,7 +36,7 @@ import org.mariotaku.twidere.api.twitter.Twitter; import org.mariotaku.twidere.api.twitter.TwitterException; import org.mariotaku.twidere.api.twitter.model.UserList; -import static org.mariotaku.twidere.util.TwitterAPIUtils.getTwitterInstance; +import static org.mariotaku.twidere.util.TwitterAPIFactory.getTwitterInstance; public abstract class BaseUserListsLoader extends AsyncTaskLoader> implements ICursorSupportLoader { @@ -76,7 +76,7 @@ public abstract class BaseUserListsLoader extends AsyncTaskLoader loadInBackground() { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(getContext(), mAccountId, true); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(getContext(), mAccountId, true); List listLoaded = null; try { listLoaded = getUserLists(twitter); diff --git a/twidere/src/main/java/org/mariotaku/twidere/loader/support/ParcelableStatusLoader.java b/twidere/src/main/java/org/mariotaku/twidere/loader/support/ParcelableStatusLoader.java index a649c8afd..feec63e6b 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/loader/support/ParcelableStatusLoader.java +++ b/twidere/src/main/java/org/mariotaku/twidere/loader/support/ParcelableStatusLoader.java @@ -25,6 +25,7 @@ import android.support.v4.content.AsyncTaskLoader; import org.mariotaku.twidere.constant.IntentConstants; import org.mariotaku.twidere.model.ParcelableAccount; +import org.mariotaku.twidere.model.ParcelableCredentials; import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.model.SingleResponse; @@ -64,7 +65,7 @@ public class ParcelableStatusLoader extends AsyncTaskLoader response = SingleResponse.getInstance(status); final Bundle extras = response.getExtras(); extras.putParcelable(EXTRA_ACCOUNT, credentials); diff --git a/twidere/src/main/java/org/mariotaku/twidere/loader/support/ParcelableUserLoader.java b/twidere/src/main/java/org/mariotaku/twidere/loader/support/ParcelableUserLoader.java index 1b50b7229..96864ddb8 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/loader/support/ParcelableUserLoader.java +++ b/twidere/src/main/java/org/mariotaku/twidere/loader/support/ParcelableUserLoader.java @@ -34,7 +34,7 @@ import org.mariotaku.twidere.model.ParcelableUser.CachedIndices; import org.mariotaku.twidere.model.SingleResponse; import org.mariotaku.twidere.provider.TwidereDataStore.Accounts; import org.mariotaku.twidere.provider.TwidereDataStore.CachedUsers; -import org.mariotaku.twidere.util.TwitterAPIUtils; +import org.mariotaku.twidere.util.TwitterAPIFactory; import org.mariotaku.twidere.util.TwitterWrapper; import org.mariotaku.twidere.api.twitter.Twitter; @@ -42,7 +42,7 @@ import org.mariotaku.twidere.api.twitter.TwitterException; import org.mariotaku.twidere.api.twitter.model.User; import static org.mariotaku.twidere.util.ContentValuesCreator.createCachedUser; -import static org.mariotaku.twidere.util.TwitterAPIUtils.getTwitterInstance; +import static org.mariotaku.twidere.util.TwitterAPIFactory.getTwitterInstance; import static org.mariotaku.twidere.util.Utils.isMyAccount; public final class ParcelableUserLoader extends AsyncTaskLoader> implements Constants { @@ -76,7 +76,7 @@ public final class ParcelableUserLoader extends AsyncTaskLoader> { @@ -42,7 +42,7 @@ public class SavedSearchesLoader extends AsyncTaskLoader loadInBackground() { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(getContext(), mAccountId, false); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(getContext(), mAccountId, false); if (twitter == null) return null; try { return twitter.getSavedSearches(); diff --git a/twidere/src/main/java/org/mariotaku/twidere/loader/support/TwitterAPIActivitiesLoader.java b/twidere/src/main/java/org/mariotaku/twidere/loader/support/TwitterAPIActivitiesLoader.java index c4158605e..f8c7000dd 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/loader/support/TwitterAPIActivitiesLoader.java +++ b/twidere/src/main/java/org/mariotaku/twidere/loader/support/TwitterAPIActivitiesLoader.java @@ -34,7 +34,7 @@ import org.mariotaku.twidere.api.twitter.model.Activity; import org.mariotaku.twidere.api.twitter.model.Paging; import org.mariotaku.twidere.model.ParcelableActivity; import org.mariotaku.twidere.util.LoganSquareWrapper; -import org.mariotaku.twidere.util.TwitterAPIUtils; +import org.mariotaku.twidere.util.TwitterAPIFactory; import java.io.File; import java.io.FileOutputStream; @@ -143,7 +143,7 @@ public abstract class TwitterAPIActivitiesLoader extends ParcelableActivitiesLoa protected abstract List getActivities(Twitter twitter, Paging paging) throws TwitterException; protected final Twitter getTwitter() { - return TwitterAPIUtils.getTwitterInstance(mContext, mAccountIds, true, true); + return TwitterAPIFactory.getTwitterInstance(mContext, mAccountIds, true, true); } protected abstract boolean shouldFilterActivity(final SQLiteDatabase database, final ParcelableActivity activity); diff --git a/twidere/src/main/java/org/mariotaku/twidere/loader/support/TwitterAPIStatusesLoader.java b/twidere/src/main/java/org/mariotaku/twidere/loader/support/TwitterAPIStatusesLoader.java index 85291686f..f776d610c 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/loader/support/TwitterAPIStatusesLoader.java +++ b/twidere/src/main/java/org/mariotaku/twidere/loader/support/TwitterAPIStatusesLoader.java @@ -36,7 +36,7 @@ import org.mariotaku.twidere.api.twitter.model.Status; import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.util.LoganSquareWrapper; -import org.mariotaku.twidere.util.TwitterAPIUtils; +import org.mariotaku.twidere.util.TwitterAPIFactory; import org.mariotaku.twidere.util.TwitterContentUtils; import org.mariotaku.twidere.util.Utils; @@ -172,7 +172,7 @@ public abstract class TwitterAPIStatusesLoader extends ParcelableStatusesLoader @Nullable protected final Twitter getTwitter() { - return TwitterAPIUtils.getTwitterInstance(mContext, mAccountId, true, true); + return TwitterAPIFactory.getTwitterInstance(mContext, mAccountId, true, true); } protected abstract boolean shouldFilterStatus(final SQLiteDatabase database, final ParcelableStatus status); diff --git a/twidere/src/main/java/org/mariotaku/twidere/loader/support/TwitterAPIUsersLoader.java b/twidere/src/main/java/org/mariotaku/twidere/loader/support/TwitterAPIUsersLoader.java index 027589ecd..d20445129 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/loader/support/TwitterAPIUsersLoader.java +++ b/twidere/src/main/java/org/mariotaku/twidere/loader/support/TwitterAPIUsersLoader.java @@ -22,7 +22,7 @@ package org.mariotaku.twidere.loader.support; import android.content.Context; import org.mariotaku.twidere.model.ParcelableUser; -import org.mariotaku.twidere.util.TwitterAPIUtils; +import org.mariotaku.twidere.util.TwitterAPIFactory; import java.util.Collections; import java.util.List; @@ -31,7 +31,7 @@ import org.mariotaku.twidere.api.twitter.Twitter; import org.mariotaku.twidere.api.twitter.TwitterException; import org.mariotaku.twidere.api.twitter.model.User; -import static org.mariotaku.twidere.util.TwitterAPIUtils.getTwitterInstance; +import static org.mariotaku.twidere.util.TwitterAPIFactory.getTwitterInstance; public abstract class TwitterAPIUsersLoader extends ParcelableUsersLoader { @@ -50,7 +50,7 @@ public abstract class TwitterAPIUsersLoader extends ParcelableUsersLoader { final List data = getData(); final List users; try { - users = getUsers(TwitterAPIUtils.getTwitterInstance(mContext, mAccountId, true)); + users = getUsers(TwitterAPIFactory.getTwitterInstance(mContext, mAccountId, true)); if (users == null) return data; } catch (final TwitterException e) { e.printStackTrace(); diff --git a/twidere/src/main/java/org/mariotaku/twidere/preference/DefaultAPIPreference.java b/twidere/src/main/java/org/mariotaku/twidere/preference/DefaultAPIPreference.java index 777ddbf91..ed5168111 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/preference/DefaultAPIPreference.java +++ b/twidere/src/main/java/org/mariotaku/twidere/preference/DefaultAPIPreference.java @@ -38,6 +38,7 @@ import android.widget.Toast; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.R; +import org.mariotaku.twidere.model.ParcelableCredentials; import org.mariotaku.twidere.provider.TwidereDataStore.Accounts; import static android.text.TextUtils.isEmpty; @@ -69,12 +70,12 @@ public class DefaultAPIPreference extends DialogPreference implements Constants, @Override public void onCheckedChanged(final RadioGroup group, final int checkedId) { final int authType = getCheckedAuthType(checkedId); - final boolean isOAuth = authType == Accounts.AUTH_TYPE_OAUTH || authType == Accounts.AUTH_TYPE_XAUTH; + final boolean isOAuth = authType == ParcelableCredentials.AUTH_TYPE_OAUTH || authType == ParcelableCredentials.AUTH_TYPE_XAUTH; mEditSameOAuthSigningUrl.setVisibility(isOAuth ? View.VISIBLE : View.GONE); mEditConsumerKey.setVisibility(isOAuth ? View.VISIBLE : View.GONE); mEditConsumerSecret.setVisibility(isOAuth ? View.VISIBLE : View.GONE); if (!mEditNoVersionSuffixChanged) { - mEditNoVersionSuffix.setChecked(authType == Accounts.AUTH_TYPE_TWIP_O_MODE); + mEditNoVersionSuffix.setChecked(authType == ParcelableCredentials.AUTH_TYPE_TWIP_O_MODE); } } @@ -97,7 +98,7 @@ public class DefaultAPIPreference extends DialogPreference implements Constants, protected void onBindDialogView(@NonNull final View view) { final SharedPreferences pref = getSharedPreferences(); final String apiUrlFormat = getNonEmptyString(pref, KEY_API_URL_FORMAT, DEFAULT_TWITTER_API_URL_FORMAT); - final int authType = pref.getInt(KEY_AUTH_TYPE, Accounts.AUTH_TYPE_OAUTH); + final int authType = pref.getInt(KEY_AUTH_TYPE, ParcelableCredentials.AUTH_TYPE_OAUTH); final boolean sameOAuthSigningUrl = pref.getBoolean(KEY_SAME_OAUTH_SIGNING_URL, false); final boolean noVersionSuffix = pref.getBoolean(KEY_NO_VERSION_SUFFIX, false); final String consumerKey = getNonEmptyString(pref, KEY_CONSUMER_KEY, TWITTER_CONSUMER_KEY); @@ -158,7 +159,7 @@ public class DefaultAPIPreference extends DialogPreference implements Constants, final SharedPreferences pref = getSharedPreferences(); final String prefApiUrlFormat = getNonEmptyString(pref, KEY_API_URL_FORMAT, DEFAULT_TWITTER_API_URL_FORMAT); - final int prefAuthType = pref.getInt(KEY_AUTH_TYPE, Accounts.AUTH_TYPE_OAUTH); + final int prefAuthType = pref.getInt(KEY_AUTH_TYPE, ParcelableCredentials.AUTH_TYPE_OAUTH); final boolean prefSameOAuthSigningUrl = pref.getBoolean(KEY_API_URL_FORMAT, false); final String prefConsumerKey = getNonEmptyString(pref, KEY_CONSUMER_KEY, TWITTER_CONSUMER_KEY); final String prefConsumerSecret = getNonEmptyString(pref, KEY_CONSUMER_SECRET, TWITTER_CONSUMER_SECRET); @@ -189,16 +190,16 @@ public class DefaultAPIPreference extends DialogPreference implements Constants, private int getCheckedAuthType(final int checkedId) { switch (checkedId) { case R.id.xauth: { - return Accounts.AUTH_TYPE_XAUTH; + return ParcelableCredentials.AUTH_TYPE_XAUTH; } case R.id.basic: { - return Accounts.AUTH_TYPE_BASIC; + return ParcelableCredentials.AUTH_TYPE_BASIC; } case R.id.twip_o: { - return Accounts.AUTH_TYPE_TWIP_O_MODE; + return ParcelableCredentials.AUTH_TYPE_TWIP_O_MODE; } default: { - return Accounts.AUTH_TYPE_OAUTH; + return ParcelableCredentials.AUTH_TYPE_OAUTH; } } } @@ -211,10 +212,10 @@ public class DefaultAPIPreference extends DialogPreference implements Constants, mEditConsumerKey.setText(consumerKey); mEditConsumerSecret.setText(consumerSecret); - mButtonOAuth.setChecked(authType == Accounts.AUTH_TYPE_OAUTH); - mButtonxAuth.setChecked(authType == Accounts.AUTH_TYPE_XAUTH); - mButtonBasic.setChecked(authType == Accounts.AUTH_TYPE_BASIC); - mButtonTwipOMode.setChecked(authType == Accounts.AUTH_TYPE_TWIP_O_MODE); + mButtonOAuth.setChecked(authType == ParcelableCredentials.AUTH_TYPE_OAUTH); + mButtonxAuth.setChecked(authType == ParcelableCredentials.AUTH_TYPE_XAUTH); + mButtonBasic.setChecked(authType == ParcelableCredentials.AUTH_TYPE_BASIC); + mButtonTwipOMode.setChecked(authType == ParcelableCredentials.AUTH_TYPE_TWIP_O_MODE); if (mEditAuthType.getCheckedRadioButtonId() == -1) { mButtonOAuth.setChecked(true); } diff --git a/twidere/src/main/java/org/mariotaku/twidere/preference/TranslationDestinationPreference.java b/twidere/src/main/java/org/mariotaku/twidere/preference/TranslationDestinationPreference.java index 556828aaa..4b4b86c63 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/preference/TranslationDestinationPreference.java +++ b/twidere/src/main/java/org/mariotaku/twidere/preference/TranslationDestinationPreference.java @@ -39,7 +39,7 @@ import android.widget.TextView; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.R; -import org.mariotaku.twidere.util.TwitterAPIUtils; +import org.mariotaku.twidere.util.TwitterAPIFactory; import java.text.Collator; import java.util.Comparator; @@ -50,7 +50,7 @@ import org.mariotaku.twidere.api.twitter.Twitter; import org.mariotaku.twidere.api.twitter.TwitterException; import org.mariotaku.twidere.api.twitter.model.Language; -import static org.mariotaku.twidere.util.TwitterAPIUtils.getDefaultTwitterInstance; +import static org.mariotaku.twidere.util.TwitterAPIFactory.getDefaultTwitterInstance; public class TranslationDestinationPreference extends Preference implements Constants, OnClickListener { @@ -172,7 +172,7 @@ public class TranslationDestinationPreference extends Preference implements Cons @Override protected ResponseList doInBackground(final Object... args) { - final Twitter twitter = TwitterAPIUtils.getDefaultTwitterInstance(getContext(), false); + final Twitter twitter = TwitterAPIFactory.getDefaultTwitterInstance(getContext(), false); final String pref = mPreferences.getString(KEY_TRANSLATION_DESTINATION, null); if (twitter == null) return null; try { diff --git a/twidere/src/main/java/org/mariotaku/twidere/preference/TrendsLocationPreference.java b/twidere/src/main/java/org/mariotaku/twidere/preference/TrendsLocationPreference.java index 7c8e19d41..7c8f0be5c 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/preference/TrendsLocationPreference.java +++ b/twidere/src/main/java/org/mariotaku/twidere/preference/TrendsLocationPreference.java @@ -37,7 +37,7 @@ import android.widget.TextView; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.R; -import org.mariotaku.twidere.util.TwitterAPIUtils; +import org.mariotaku.twidere.util.TwitterAPIFactory; import java.text.Collator; import java.util.Comparator; @@ -48,7 +48,7 @@ import org.mariotaku.twidere.api.twitter.model.ResponseList; import org.mariotaku.twidere.api.twitter.Twitter; import org.mariotaku.twidere.api.twitter.TwitterException; -import static org.mariotaku.twidere.util.TwitterAPIUtils.getDefaultTwitterInstance; +import static org.mariotaku.twidere.util.TwitterAPIFactory.getDefaultTwitterInstance; public class TrendsLocationPreference extends Preference implements Constants, OnClickListener { @@ -172,7 +172,7 @@ public class TrendsLocationPreference extends Preference implements Constants, O @Override protected ResponseList doInBackground(final Object... args) { - final Twitter twitter = TwitterAPIUtils.getDefaultTwitterInstance(getContext(), false); + final Twitter twitter = TwitterAPIFactory.getDefaultTwitterInstance(getContext(), false); if (twitter == null) return null; try { return twitter.getAvailableTrends(); 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 1ece1c0ba..50b42279e 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/service/BackgroundOperationService.java +++ b/twidere/src/main/java/org/mariotaku/twidere/service/BackgroundOperationService.java @@ -43,8 +43,8 @@ import com.nostra13.universalimageloader.utils.IoUtils; import com.twitter.Extractor; import org.mariotaku.querybuilder.Expression; -import org.mariotaku.simplerestapi.http.ContentType; -import org.mariotaku.simplerestapi.http.mime.FileTypedData; +import org.mariotaku.restfu.http.ContentType; +import org.mariotaku.restfu.http.mime.FileTypedData; import org.mariotaku.twidere.BuildConfig; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.R; @@ -75,7 +75,7 @@ import org.mariotaku.twidere.util.ParseUtils; import org.mariotaku.twidere.util.StatusCodeMessageUtils; import org.mariotaku.twidere.util.StatusShortenerInterface; import org.mariotaku.twidere.util.TwidereValidator; -import org.mariotaku.twidere.util.TwitterAPIUtils; +import org.mariotaku.twidere.util.TwitterAPIFactory; import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.util.io.ContentLengthInputStream; import org.mariotaku.twidere.util.io.ContentLengthInputStream.ReadListener; @@ -399,8 +399,8 @@ public class BackgroundOperationService extends IntentService implements Constan private SingleResponse sendDirectMessage(final NotificationCompat.Builder builder, final long accountId, final long recipientId, final String text, final String imageUri) { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(this, accountId, true, true); - final TwitterUpload twitterUpload = TwitterAPIUtils.getTwitterInstance(this, accountId, true, true, TwitterUpload.class); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(this, accountId, true, true); + final TwitterUpload twitterUpload = TwitterAPIFactory.getTwitterInstance(this, accountId, true, true, TwitterUpload.class); if (twitter == null || twitterUpload == null) return SingleResponse.getInstance(); try { final ParcelableDirectMessage directMessage; @@ -521,8 +521,8 @@ public class BackgroundOperationService extends IntentService implements Constan } } for (final ParcelableAccount account : statusUpdate.accounts) { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(this, account.account_id, true, true); - final TwitterUpload upload = TwitterAPIUtils.getTwitterInstance(this, account.account_id, true, true, TwitterUpload.class); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(this, account.account_id, true, true); + final TwitterUpload upload = TwitterAPIFactory.getTwitterInstance(this, account.account_id, true, true, TwitterUpload.class); final StatusUpdate status = new StatusUpdate(shortenedText); status.inReplyToStatusId(statusUpdate.in_reply_to_status_id); if (statusUpdate.location != null) { diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/AsyncTwitterWrapper.java b/twidere/src/main/java/org/mariotaku/twidere/util/AsyncTwitterWrapper.java index f60f466d7..ac98da8b6 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/AsyncTwitterWrapper.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/AsyncTwitterWrapper.java @@ -529,7 +529,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper { return AsyncManager.runBackgroundTask(new TaskRunnable, Bus>() { @Override public SingleResponse doLongOperation(Object param) throws InterruptedException { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mContext, accountId, true); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, accountId, true); try { return SingleResponse.getInstance(twitter.updateFriendship(userId, update)); } catch (TwitterException e) { @@ -563,7 +563,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper { protected SingleResponse doInBackground(Long... params) { final ContentResolver cr = mContext.getContentResolver(); for (long accountId : params) { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mContext, accountId, true); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, accountId, true); if (twitter == null) continue; try { final ResponseList searches = twitter.getSavedSearches(); @@ -612,7 +612,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper { @Override protected SingleResponse doInBackground(final Object... params) { try { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mContext, mAccountId, true); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, mAccountId, true); TwitterWrapper.updateProfileBannerImage(mContext, twitter, mImageUri, mDeleteImage); // Wait for 5 seconds, see // https://dev.twitter.com/docs/api/1.1/post/account/update_profile_image @@ -650,7 +650,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper { @Override protected SingleResponse doInBackground(final Object... params) { try { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mContext, mAccountId, true); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, mAccountId, true); TwitterWrapper.updateProfileImage(mContext, twitter, mImageUri, mDeleteImage); // Wait for 5 seconds, see // https://dev.twitter.com/docs/api/1.1/post/account/update_profile_image @@ -702,7 +702,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper { @Override protected SingleResponse doInBackground(final Object... params) { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mContext, mAccountId, false); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, mAccountId, false); if (twitter == null) return SingleResponse.getInstance(); try { final User user = twitter.acceptFriendship(mUserId); @@ -749,7 +749,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper { @Override protected SingleResponse doInBackground(final Object... params) { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mContext, accountId, false); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, accountId, false); if (twitter == null || users == null) return SingleResponse.getInstance(); try { final long[] userIds = new long[users.length]; @@ -836,7 +836,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper { @Override protected SingleResponse doInBackground(final Object... params) { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mContext, account_id, false); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, account_id, false); if (twitter == null) return SingleResponse.getInstance(); try { final User user = twitter.createBlock(user_id); @@ -889,7 +889,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper { @Override protected SingleResponse doInBackground(final Object... params) { if (account_id < 0) return SingleResponse.getInstance(); - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mContext, account_id, true); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, account_id, true); if (twitter == null) return SingleResponse.getInstance(); try { final org.mariotaku.twidere.api.twitter.model.Status status = twitter.createFavorite(status_id); @@ -973,7 +973,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper { @Override protected SingleResponse doInBackground(final Object... params) { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mContext, mAccountId, false); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, mAccountId, false); if (twitter == null) return SingleResponse.getInstance(); try { final User user = twitter.createFriendship(user_id); @@ -1033,7 +1033,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper { @Override protected ListResponse doInBackground(final Object... params) { final List blocked_users = new ArrayList<>(); - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mContext, account_id, false); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, account_id, false); if (twitter != null) { for (final long user_id : user_ids) { try { @@ -1080,7 +1080,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper { @Override protected SingleResponse doInBackground(final Object... params) { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mContext, mAccountId, false); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, mAccountId, false); if (twitter == null) return SingleResponse.getInstance(); try { final User user = twitter.createMute(mUserId); @@ -1127,7 +1127,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper { @Override protected SingleResponse doInBackground(final Object... params) { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mContext, mAccountId, false); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, mAccountId, false); if (twitter == null) return null; try { return SingleResponse.getInstance(twitter.createSavedSearch(mQuery)); @@ -1162,7 +1162,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper { @Override protected SingleResponse doInBackground(final Object... params) { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mContext, accountId, false); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, accountId, false); if (twitter == null) return SingleResponse.getInstance(); try { @@ -1208,7 +1208,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper { @Override protected SingleResponse doInBackground(final Object... params) { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mContext, account_id, false); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, account_id, false); if (twitter == null || list_name == null) return SingleResponse.getInstance(); try { final UserListUpdate userListUpdate = new UserListUpdate(); @@ -1254,7 +1254,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper { @Override protected SingleResponse doInBackground(final Object... params) { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mContext, mAccountId, false); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, mAccountId, false); if (twitter == null) return SingleResponse.getInstance(); try { final long[] userIds = new long[users.length]; @@ -1321,7 +1321,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper { @Override protected SingleResponse doInBackground(final Object... params) { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mContext, mAccountId, false); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, mAccountId, false); if (twitter == null) return SingleResponse.getInstance(); try { final User user = twitter.denyFriendship(mUserId); @@ -1365,7 +1365,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper { @Override protected SingleResponse doInBackground(final Object... params) { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mContext, mAccountId, false); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, mAccountId, false); if (twitter == null) return SingleResponse.getInstance(); try { final User user = twitter.destroyBlock(mUserId); @@ -1423,7 +1423,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper { @Override protected SingleResponse doInBackground(final Object... args) { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mContext, account_id, false); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, account_id, false); if (twitter == null) return SingleResponse.getInstance(); try { final DirectMessage message = twitter.destroyDirectMessage(message_id); @@ -1481,7 +1481,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper { @Override protected SingleResponse doInBackground(final Object... args) { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mContext, accountId, false); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, accountId, false); if (twitter == null) return SingleResponse.getInstance(); try { twitter.destroyDirectMessagesConversation(accountId, userId); @@ -1526,7 +1526,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper { @Override protected SingleResponse doInBackground(final Object... params) { if (account_id < 0) return SingleResponse.getInstance(); - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mContext, account_id, true); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, account_id, true); if (twitter != null) { try { final org.mariotaku.twidere.api.twitter.model.Status status = twitter.destroyFavorite(status_id); @@ -1609,7 +1609,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper { @Override protected SingleResponse doInBackground(final Object... params) { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mContext, mAccountId, false); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, mAccountId, false); if (twitter != null) { try { final User user = twitter.destroyFriendship(user_id); @@ -1659,7 +1659,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper { @Override protected SingleResponse doInBackground(final Object... params) { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mContext, mAccountId, false); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, mAccountId, false); if (twitter == null) return SingleResponse.getInstance(); try { final User user = twitter.destroyMute(mUserId); @@ -1703,7 +1703,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper { @Override protected SingleResponse doInBackground(final Object... params) { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mContext, mAccountId, false); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, mAccountId, false); if (twitter == null) return SingleResponse.getInstance(); try { return SingleResponse.getInstance(twitter.destroySavedSearch(mSearchId)); @@ -1739,7 +1739,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper { @Override protected SingleResponse doInBackground(final Object... params) { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mContext, account_id, false); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, account_id, false); if (twitter == null) return SingleResponse.getInstance(); ParcelableStatus status = null; TwitterException exception = null; @@ -1801,7 +1801,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper { @Override protected SingleResponse doInBackground(final Object... params) { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mContext, mAccountId, false); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, mAccountId, false); if (twitter != null) { try { final ParcelableUserList list = new ParcelableUserList( @@ -1845,7 +1845,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper { @Override protected SingleResponse doInBackground(final Object... params) { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mContext, mAccountId, false); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, mAccountId, false); if (twitter != null) { try { if (mListId > 0) { @@ -1914,7 +1914,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper { int idx = 0; final int load_item_limit = mPreferences.getInt(KEY_LOAD_ITEM_LIMIT, DEFAULT_LOAD_ITEM_LIMIT); for (final long accountId : account_ids) { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mContext, accountId, true); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, accountId, true); if (twitter == null) continue; try { final Paging paging = new Paging(); @@ -2255,7 +2255,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper { int idx = 0; final int loadItemLimit = mPreferences.getInt(KEY_LOAD_ITEM_LIMIT, DEFAULT_LOAD_ITEM_LIMIT); for (final long accountId : mAccountIds) { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mContext, accountId, true); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, accountId, true); if (twitter == null) continue; try { final Paging paging = new Paging(); @@ -2302,7 +2302,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper { @Override protected ListResponse doInBackground(final Object... params) { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mContext, account_id, false); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, account_id, false); final Bundle extras = new Bundle(); extras.putLong(EXTRA_ACCOUNT_ID, account_id); if (twitter != null) { @@ -2350,7 +2350,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper { final Bundle extras = new Bundle(); extras.putLong(EXTRA_ACCOUNT_ID, account_id); final List reported_users = new ArrayList<>(); - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mContext, account_id, false); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, account_id, false); if (twitter != null) { for (final long user_id : user_ids) { try { @@ -2400,7 +2400,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper { @Override protected SingleResponse doInBackground(final Object... params) { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mContext, mAccountId, false); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, mAccountId, false); if (twitter != null) { try { final User user = twitter.reportSpam(user_id); @@ -2446,7 +2446,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper { @Override protected SingleResponse doInBackground(final Object... params) { if (account_id < 0) return SingleResponse.getInstance(); - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mContext, account_id, true); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, account_id, true); if (twitter == null) { return SingleResponse.getInstance(); } @@ -2594,7 +2594,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper { @Override protected SingleResponse doInBackground(final Object... params) { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(mContext, accountId, false); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, accountId, false); if (twitter != null) { try { final UserList list = twitter.updateUserList(listId, update); diff --git a/twidere.extension.streaming/src/main/java/org/mariotaku/twidere/extension/streaming/util/TwidereHostAddressResolverFactory.java b/twidere/src/main/java/org/mariotaku/twidere/util/ErrorLogger.java similarity index 50% rename from twidere.extension.streaming/src/main/java/org/mariotaku/twidere/extension/streaming/util/TwidereHostAddressResolverFactory.java rename to twidere/src/main/java/org/mariotaku/twidere/util/ErrorLogger.java index 2e0fa70b0..e3d501f6a 100644 --- a/twidere.extension.streaming/src/main/java/org/mariotaku/twidere/extension/streaming/util/TwidereHostAddressResolverFactory.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/ErrorLogger.java @@ -1,5 +1,5 @@ /* - * Twidere - Twitter client for Android + * Twidere - Twitter client for Android * * Copyright (C) 2012-2015 Mariotaku Lee * @@ -17,26 +17,25 @@ * along with this program. If not, see . */ -package org.mariotaku.twidere.extension.streaming.util; +package org.mariotaku.twidere.util; -import android.content.Context; - -import org.mariotaku.twidere.api.twitter.http.HostAddressResolver; -import org.mariotaku.twidere.api.twitter.http.HostAddressResolverFactory; -import org.mariotaku.twidere.api.twitter.http.HttpClientConfiguration; +import org.acra.ACRA; +import org.mariotaku.twidere.activity.TwitterLinkHandlerActivity; /** - * Created by mariotaku on 15/1/11. + * Created by mariotaku on 15/5/25. */ -public class TwidereHostAddressResolverFactory implements HostAddressResolverFactory { - private final Context context; +public class ErrorLogger { - public TwidereHostAddressResolverFactory(Context context) { - this.context = context; + private static boolean sEnabled; + + public static void setEnabled(boolean enabled) { + sEnabled = enabled; } - @Override - public HostAddressResolver getInstance(HttpClientConfiguration conf) { - return new TwidereHostAddressResolver(context); + public static void exception(final Throwable t) { + if (!sEnabled) return; + ACRA.getErrorReporter().handleSilentException(t); } + } diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/OAuthPasswordAuthenticator.java b/twidere/src/main/java/org/mariotaku/twidere/util/OAuthPasswordAuthenticator.java index ebf97e8cf..a8536ada6 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/OAuthPasswordAuthenticator.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/OAuthPasswordAuthenticator.java @@ -26,16 +26,16 @@ import android.util.Xml; import com.nostra13.universalimageloader.utils.IoUtils; import org.apache.commons.lang3.ArrayUtils; -import org.mariotaku.simplerestapi.RestAPIFactory; -import org.mariotaku.simplerestapi.RestClient; -import org.mariotaku.simplerestapi.http.Endpoint; -import org.mariotaku.simplerestapi.http.RestHttpClient; -import org.mariotaku.simplerestapi.http.RestHttpRequest; -import org.mariotaku.simplerestapi.http.RestHttpResponse; -import org.mariotaku.simplerestapi.http.mime.BaseTypedData; -import org.mariotaku.simplerestapi.http.mime.FormTypedBody; -import org.mariotaku.simplerestapi.method.GET; -import org.mariotaku.simplerestapi.method.POST; +import org.mariotaku.restfu.RestAPIFactory; +import org.mariotaku.restfu.RestClient; +import org.mariotaku.restfu.annotation.method.GET; +import org.mariotaku.restfu.annotation.method.POST; +import org.mariotaku.restfu.http.Endpoint; +import org.mariotaku.restfu.http.RestHttpClient; +import org.mariotaku.restfu.http.RestHttpRequest; +import org.mariotaku.restfu.http.RestHttpResponse; +import org.mariotaku.restfu.http.mime.BaseTypedData; +import org.mariotaku.restfu.http.mime.FormTypedBody; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.api.twitter.TwitterException; import org.mariotaku.twidere.api.twitter.TwitterOAuth; diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/RecyclerViewNavigationHelper.java b/twidere/src/main/java/org/mariotaku/twidere/util/RecyclerViewNavigationHelper.java index fea16488f..a3af9db45 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/RecyclerViewNavigationHelper.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/RecyclerViewNavigationHelper.java @@ -28,6 +28,7 @@ import android.support.v7.widget.RecyclerView.ViewHolder; import android.view.KeyEvent; import android.view.View; +import org.mariotaku.twidere.fragment.iface.RefreshScrollTopInterface; import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback; /** @@ -43,16 +44,16 @@ public class RecyclerViewNavigationHelper implements KeyboardShortcutCallback { @NonNull private final Adapter adapter; @Nullable - private final ContentListScrollListener.ContentListSupport support; + private final RefreshScrollTopInterface iface; public RecyclerViewNavigationHelper(@NonNull final RecyclerView view, @NonNull final LinearLayoutManager manager, @NonNull final Adapter adapter, - @Nullable final ContentListScrollListener.ContentListSupport support) { + @Nullable final RefreshScrollTopInterface iface) { this.view = view; this.manager = manager; this.adapter = adapter; - this.support = support; + this.iface = iface; } @Override @@ -106,10 +107,8 @@ public class RecyclerViewNavigationHelper implements KeyboardShortcutCallback { if (action == null) return false; switch (action) { case ACTION_NAVIGATION_TOP: { - view.stopScroll(); - manager.scrollToPositionWithOffset(0, 0); - if (support != null) { - support.setControlVisible(true); + if (iface != null) { + iface.scrollToStart(); } return true; } diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/SharedPreferencesWrapper.java b/twidere/src/main/java/org/mariotaku/twidere/util/SharedPreferencesWrapper.java index cde58d8bb..12b7dc90e 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/SharedPreferencesWrapper.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/SharedPreferencesWrapper.java @@ -2,7 +2,6 @@ package org.mariotaku.twidere.util; import android.content.Context; import android.content.SharedPreferences; -import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.util.Log; import org.mariotaku.twidere.BuildConfig; @@ -14,7 +13,7 @@ import java.util.HashMap; import java.util.Map; import java.util.Set; -public class SharedPreferencesWrapper implements Constants { +public class SharedPreferencesWrapper implements Constants, SharedPreferences { private final SharedPreferences mPreferences; private final HashMap mMap; @@ -34,18 +33,22 @@ public class SharedPreferencesWrapper implements Constants { } } + @Override public boolean contains(final String key) { return mPreferences.contains(key); } + @Override public SharedPreferences.Editor edit() { return mPreferences.edit(); } + @Override public Map getAll() { return mPreferences.getAll(); } + @Override public boolean getBoolean(final String key, final boolean defValue) { try { return mPreferences.getBoolean(key, defValue); @@ -62,6 +65,7 @@ public class SharedPreferencesWrapper implements Constants { return getBoolean(key, preference.defaultBoolean()); } + @Override public float getFloat(final String key, final float defValue) { try { return mPreferences.getFloat(key, defValue); @@ -72,6 +76,7 @@ public class SharedPreferencesWrapper implements Constants { } } + @Override public int getInt(final String key, final int defValue) { try { return mPreferences.getInt(key, defValue); @@ -82,6 +87,7 @@ public class SharedPreferencesWrapper implements Constants { } } + @Override public long getLong(final String key, final long defValue) { try { return mPreferences.getLong(key, defValue); @@ -96,6 +102,7 @@ public class SharedPreferencesWrapper implements Constants { return mPreferences; } + @Override public String getString(final String key, final String defValue) { try { return mPreferences.getString(key, defValue); @@ -106,6 +113,7 @@ public class SharedPreferencesWrapper implements Constants { } } + @Override public Set getStringSet(final String key, final Set defValue) { try { return mPreferences.getStringSet(key, defValue); @@ -116,10 +124,12 @@ public class SharedPreferencesWrapper implements Constants { } } + @Override public void registerOnSharedPreferenceChangeListener(final OnSharedPreferenceChangeListener listener) { mPreferences.registerOnSharedPreferenceChangeListener(listener); } + @Override public void unregisterOnSharedPreferenceChangeListener(final OnSharedPreferenceChangeListener listener) { mPreferences.unregisterOnSharedPreferenceChangeListener(listener); } diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/TwitterAPIFactory.java b/twidere/src/main/java/org/mariotaku/twidere/util/TwitterAPIFactory.java new file mode 100644 index 000000000..b2568312a --- /dev/null +++ b/twidere/src/main/java/org/mariotaku/twidere/util/TwitterAPIFactory.java @@ -0,0 +1,137 @@ +package org.mariotaku.twidere.util; + +import android.content.Context; +import android.content.SharedPreferences; +import android.net.SSLCertificateSocketFactory; +import android.support.annotation.Nullable; + +import com.squareup.okhttp.OkHttpClient; +import com.squareup.okhttp.internal.Internal; + +import org.mariotaku.restfu.RestAPIFactory; +import org.mariotaku.restfu.http.Authorization; +import org.mariotaku.restfu.http.Endpoint; +import org.mariotaku.restfu.http.RestHttpClient; +import org.mariotaku.twidere.TwidereConstants; +import org.mariotaku.twidere.api.twitter.Twitter; +import org.mariotaku.twidere.api.twitter.auth.OAuthAuthorization; +import org.mariotaku.twidere.api.twitter.util.TwitterConverter; +import org.mariotaku.twidere.app.TwidereApplication; +import org.mariotaku.twidere.model.ConsumerKeyType; +import org.mariotaku.twidere.model.ParcelableCredentials; +import org.mariotaku.twidere.util.net.OkHttpRestClient; + +import java.net.InetSocketAddress; +import java.net.Proxy; +import java.net.SocketAddress; +import java.util.concurrent.TimeUnit; + +import static android.text.TextUtils.isEmpty; + +/** + * Created by mariotaku on 15/5/7. + */ +public class TwitterAPIFactory implements TwidereConstants { + + public static Twitter getDefaultTwitterInstance(final Context context, final boolean includeEntities) { + if (context == null) return null; + return getDefaultTwitterInstance(context, includeEntities, true); + } + + public static Twitter getDefaultTwitterInstance(final Context context, final boolean includeEntities, + final boolean includeRetweets) { + if (context == null) return null; + return getTwitterInstance(context, Utils.getDefaultAccountId(context), includeEntities, includeRetweets); + } + + public static Twitter getTwitterInstance(final Context context, final long accountId, + final boolean includeEntities) { + return getTwitterInstance(context, accountId, includeEntities, true); + } + + @Nullable + public static Twitter getTwitterInstance(final Context context, final long accountId, + final boolean includeEntities, + final boolean includeRetweets) { + return getTwitterInstance(context, accountId, includeEntities, includeRetweets, Twitter.class); + } + + @Nullable + public static T getTwitterInstance(final Context context, final long accountId, + final boolean includeEntities, + final boolean includeRetweets, Class cls) { + if (context == null) return null; + final ParcelableCredentials credentials = ParcelableCredentials.getCredentials(context, accountId); + return getInstance(context, credentials, cls); + } + + public static RestHttpClient getDefaultHttpClient(final Context context) { + if (context == null) return null; + final SharedPreferencesWrapper prefs = SharedPreferencesWrapper.getInstance(context, SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE); + return createHttpClient(context, prefs); + } + + public static RestHttpClient createHttpClient(final Context context, final SharedPreferences prefs) { + final int connectionTimeout = prefs.getInt(KEY_CONNECTION_TIMEOUT, 10); + final boolean ignoreSslError = prefs.getBoolean(KEY_IGNORE_SSL_ERROR, false); + final boolean enableProxy = prefs.getBoolean(KEY_ENABLE_PROXY, false); + + final OkHttpClient client = new OkHttpClient(); + client.setConnectTimeout(connectionTimeout, TimeUnit.SECONDS); + if (ignoreSslError) { + client.setSslSocketFactory(SSLCertificateSocketFactory.getInsecure(0, null)); + } else { + client.setSslSocketFactory(SSLCertificateSocketFactory.getDefault(0, null)); + } + if (enableProxy) { + client.setProxy(getProxy(prefs)); + } + Internal.instance.setNetwork(client, TwidereApplication.getInstance(context).getNetwork()); + return new OkHttpRestClient(client); + } + + + public static Proxy getProxy(final SharedPreferences prefs) { + final String proxyHost = prefs.getString(KEY_PROXY_HOST, null); + final int proxyPort = ParseUtils.parseInt(prefs.getString(KEY_PROXY_PORT, "-1")); + if (!isEmpty(proxyHost) && proxyPort >= 0 && proxyPort < 65535) { + final SocketAddress addr = InetSocketAddress.createUnresolved(proxyHost, proxyPort); + return new Proxy(Proxy.Type.HTTP, addr); + } + return Proxy.NO_PROXY; + } + + public static T getInstance(final Context context, final Endpoint endpoint, final Authorization auth, Class cls) { + final RestAPIFactory factory = new RestAPIFactory(); + final String userAgent; + if (auth instanceof OAuthAuthorization) { + final String consumerKey = ((OAuthAuthorization) auth).getConsumerKey(); + final String consumerSecret = ((OAuthAuthorization) auth).getConsumerSecret(); + final ConsumerKeyType officialKeyType = TwitterContentUtils.getOfficialKeyType(context, consumerKey, consumerSecret); + if (officialKeyType != ConsumerKeyType.UNKNOWN) { + userAgent = TwitterAPIUtils.getUserAgentName(officialKeyType); + } else { + userAgent = TwitterAPIUtils.getTwidereUserAgent(context); + } + } else { + userAgent = TwitterAPIUtils.getTwidereUserAgent(context); + } + factory.setClient(getDefaultHttpClient(context)); + factory.setConverter(new TwitterConverter()); + factory.setEndpoint(endpoint); + factory.setAuthorization(auth); + factory.setRequestInfoFactory(new TwitterAPIUtils.TwidereRequestInfoFactory()); + factory.setHttpRequestFactory(new TwitterAPIUtils.TwidereHttpRequestFactory(userAgent)); + factory.setExceptionFactory(new TwitterAPIUtils.TwidereExceptionFactory()); + return factory.build(cls); + } + + public static T getInstance(final Context context, final Endpoint endpoint, final ParcelableCredentials credentials, Class cls) { + return TwitterAPIFactory.getInstance(context, endpoint, TwitterAPIUtils.getAuthorization(credentials), cls); + } + + static T getInstance(final Context context, final ParcelableCredentials credentials, final Class cls) { + if (credentials == null) return null; + return TwitterAPIFactory.getInstance(context, TwitterAPIUtils.getEndpoint(credentials, cls), credentials, cls); + } +} diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/TwitterAPIUtils.java b/twidere/src/main/java/org/mariotaku/twidere/util/TwitterAPIUtils.java deleted file mode 100644 index 232bcb97c..000000000 --- a/twidere/src/main/java/org/mariotaku/twidere/util/TwitterAPIUtils.java +++ /dev/null @@ -1,273 +0,0 @@ -package org.mariotaku.twidere.util; - -import android.content.Context; -import android.net.SSLCertificateSocketFactory; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.text.TextUtils; -import android.util.Pair; - -import com.squareup.okhttp.OkHttpClient; -import com.squareup.okhttp.internal.Internal; - -import org.mariotaku.simplerestapi.FileValue; -import org.mariotaku.simplerestapi.RequestInfo; -import org.mariotaku.simplerestapi.RestAPIFactory; -import org.mariotaku.simplerestapi.RestMethod; -import org.mariotaku.simplerestapi.RestMethodInfo; -import org.mariotaku.simplerestapi.http.Authorization; -import org.mariotaku.simplerestapi.http.Endpoint; -import org.mariotaku.simplerestapi.http.RestHttpClient; -import org.mariotaku.simplerestapi.http.RestHttpRequest; -import org.mariotaku.simplerestapi.http.RestHttpResponse; -import org.mariotaku.simplerestapi.http.mime.StringTypedData; -import org.mariotaku.simplerestapi.http.mime.TypedData; -import org.mariotaku.twidere.TwidereConstants; -import org.mariotaku.twidere.api.twitter.Twitter; -import org.mariotaku.twidere.api.twitter.TwitterException; -import org.mariotaku.twidere.api.twitter.TwitterOAuth; -import org.mariotaku.twidere.api.twitter.TwitterUpload; -import org.mariotaku.twidere.api.twitter.auth.BasicAuthorization; -import org.mariotaku.twidere.api.twitter.auth.EmptyAuthorization; -import org.mariotaku.twidere.api.twitter.auth.OAuthAuthorization; -import org.mariotaku.twidere.api.twitter.auth.OAuthEndpoint; -import org.mariotaku.twidere.api.twitter.auth.OAuthToken; -import org.mariotaku.twidere.api.twitter.util.TwitterConverter; -import org.mariotaku.twidere.app.TwidereApplication; -import org.mariotaku.twidere.model.ConsumerKeyType; -import org.mariotaku.twidere.model.ParcelableAccount; -import org.mariotaku.twidere.provider.TwidereDataStore; -import org.mariotaku.twidere.util.net.OkHttpRestClient; - -import java.net.InetSocketAddress; -import java.net.Proxy; -import java.net.SocketAddress; -import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -import static android.text.TextUtils.isEmpty; - -/** - * Created by mariotaku on 15/5/7. - */ -public class TwitterAPIUtils implements TwidereConstants { - - public static Twitter getDefaultTwitterInstance(final Context context, final boolean includeEntities) { - if (context == null) return null; - return getDefaultTwitterInstance(context, includeEntities, true); - } - - public static Twitter getDefaultTwitterInstance(final Context context, final boolean includeEntities, - final boolean includeRetweets) { - if (context == null) return null; - return getTwitterInstance(context, Utils.getDefaultAccountId(context), includeEntities, includeRetweets); - } - - public static Twitter getTwitterInstance(final Context context, final long accountId, - final boolean includeEntities) { - return getTwitterInstance(context, accountId, includeEntities, true); - } - - @Nullable - public static Twitter getTwitterInstance(final Context context, final long accountId, - final boolean includeEntities, - final boolean includeRetweets) { - return getTwitterInstance(context, accountId, includeEntities, includeRetweets, Twitter.class); - } - - @Nullable - public static T getTwitterInstance(final Context context, final long accountId, - final boolean includeEntities, - final boolean includeRetweets, Class cls) { - if (context == null) return null; - final ParcelableAccount.ParcelableCredentials credentials = ParcelableAccount.ParcelableCredentials.getCredentials(context, accountId); - if (credentials == null) return null; - final String apiUrlFormat; - final boolean sameOAuthSigningUrl = credentials.same_oauth_signing_url; - final boolean noVersionSuffix = credentials.no_version_suffix; - if (!isEmpty(credentials.api_url_format)) { - apiUrlFormat = credentials.api_url_format; - } else { - apiUrlFormat = DEFAULT_TWITTER_API_URL_FORMAT; - } - final String domain, versionSuffix; - if (Twitter.class.isAssignableFrom(cls)) { - domain = "api"; - versionSuffix = noVersionSuffix ? null : "/1.1/"; - } else if (TwitterUpload.class.isAssignableFrom(cls)) { - domain = "upload"; - versionSuffix = noVersionSuffix ? null : "/1.1/"; - } else if (TwitterOAuth.class.isAssignableFrom(cls)) { - domain = "api"; - versionSuffix = "oauth"; - } else { - throw new TwitterConverter.UnsupportedTypeException(cls); - } - final String endpointUrl, signEndpointUrl; - endpointUrl = Utils.getApiUrl(apiUrlFormat, domain, versionSuffix); - if (!sameOAuthSigningUrl) { - signEndpointUrl = Utils.getApiUrl(DEFAULT_TWITTER_API_URL_FORMAT, domain, versionSuffix); - } else { - signEndpointUrl = endpointUrl; - } - return getInstance(context, new OAuthEndpoint(endpointUrl, signEndpointUrl), credentials, cls); - } - - - public static Authorization getAuthorization(ParcelableAccount.ParcelableCredentials credentials) { - switch (credentials.auth_type) { - case TwidereDataStore.Accounts.AUTH_TYPE_OAUTH: - case TwidereDataStore.Accounts.AUTH_TYPE_XAUTH: { - final String consumerKey = TextUtils.isEmpty(credentials.consumer_key) ? - TWITTER_CONSUMER_KEY_LEGACY : credentials.consumer_key; - final String consumerSecret = TextUtils.isEmpty(credentials.consumer_secret) ? - TWITTER_CONSUMER_SECRET_LEGACY : credentials.consumer_secret; - final OAuthToken accessToken = new OAuthToken(credentials.oauth_token, credentials.oauth_token_secret); - return new OAuthAuthorization(consumerKey, consumerSecret, accessToken); - } - case TwidereDataStore.Accounts.AUTH_TYPE_BASIC: { - final String screenName = credentials.screen_name; - final String username = credentials.basic_auth_username; - final String loginName = username != null ? username : screenName; - final String password = credentials.basic_auth_password; - if (isEmpty(loginName) || isEmpty(password)) return null; - return new BasicAuthorization(loginName, password); - } - } - return new EmptyAuthorization(); - } - - - public static T getInstance(final Context context, final Endpoint endpoint, final ParcelableAccount.ParcelableCredentials credentials, Class cls) { - return getInstance(context, endpoint, getAuthorization(credentials), cls); - } - - public static T getInstance(final Context context, final Endpoint endpoint, final Authorization auth, Class cls) { - final RestAPIFactory factory = new RestAPIFactory(); - final String userAgent; - if (auth instanceof OAuthAuthorization) { - final String consumerKey = ((OAuthAuthorization) auth).getConsumerKey(); - final String consumerSecret = ((OAuthAuthorization) auth).getConsumerSecret(); - final ConsumerKeyType officialKeyType = TwitterContentUtils.getOfficialKeyType(context, consumerKey, consumerSecret); - if (officialKeyType != ConsumerKeyType.UNKNOWN) { - userAgent = Utils.getUserAgentName(officialKeyType); - } else { - userAgent = Utils.getTwidereUserAgent(context); - } - } else { - userAgent = Utils.getTwidereUserAgent(context); - } - factory.setClient(getDefaultHttpClient(context)); - factory.setConverter(new TwitterConverter()); - factory.setEndpoint(endpoint); - factory.setAuthorization(auth); - factory.setRequestInfoFactory(new RequestInfo.Factory() { - @Override - public RequestInfo create(RestMethodInfo methodInfo) { - final RestMethod method = methodInfo.getMethod(); - final String path = methodInfo.getPath(); - final List> queries = new ArrayList<>(methodInfo.getQueries()); - final List> forms = new ArrayList<>(methodInfo.getForms()); - final List> headers = methodInfo.getHeaders(); - final List> parts = methodInfo.getParts(); - final FileValue file = methodInfo.getFile(); - final Map extras = methodInfo.getExtras(); - if (parts.isEmpty()) { - final List> params = method.hasBody() ? forms : queries; - addParameter(params, "include_cards", true); - addParameter(params, "cards_platform", "Android-12"); - addParameter(params, "include_entities", true); - addParameter(params, "include_my_retweet", 1); - addParameter(params, "include_rts", 1); - addParameter(params, "include_reply_count", true); - addParameter(params, "include_descendent_reply_count", true); - } else { - addPart(parts, "include_cards", true); - addPart(parts, "cards_platform", "Android-12"); - addPart(parts, "include_entities", true); - addPart(parts, "include_my_retweet", 1); - addPart(parts, "include_rts", 1); - addPart(parts, "include_reply_count", true); - addPart(parts, "include_descendent_reply_count", true); - } - return new RequestInfo(method.value(), path, queries, forms, headers, parts, file, - methodInfo.getBody(), extras); - } - }); - factory.setRequestFactory(new RestHttpRequest.Factory() { - - @Override - public RestHttpRequest create(@NonNull Endpoint endpoint, @NonNull RequestInfo info, - @Nullable Authorization authorization) { - final String restMethod = info.getMethod(); - final String url = Endpoint.constructUrl(endpoint.getUrl(), info); - final ArrayList> headers = new ArrayList<>(info.getHeaders()); - - if (authorization != null && authorization.hasAuthorization()) { - headers.add(Pair.create("Authorization", authorization.getHeader(endpoint, info))); - } - headers.add(Pair.create("User-Agent", userAgent)); - return new RestHttpRequest(restMethod, url, headers, info.getBody(), null); - } - }); - factory.setExceptionFactory(new RestAPIFactory.ExceptionFactory() { - @Override - public Exception newException(Throwable cause, RestHttpResponse response) { - final TwitterException te = new TwitterException(cause); - te.setResponse(response); - return te; - } - }); - return factory.build(cls); - } - - private static void addParameter(List> params, String name, Object value) { - params.add(Pair.create(name, String.valueOf(value))); - } - - private static void addPart(List> params, String name, Object value) { - final TypedData typedData = new StringTypedData(String.valueOf(value), Charset.defaultCharset()); - params.add(Pair.create(name, typedData)); - } - - public static RestHttpClient getDefaultHttpClient(final Context context) { - if (context == null) return null; - final SharedPreferencesWrapper prefs = SharedPreferencesWrapper.getInstance(context, SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE); - //TODO set user agent - TwidereApplication.getInstance(context).getDefaultUserAgent(); - return createHttpClient(context, prefs); - } - - public static RestHttpClient createHttpClient(final Context context, final SharedPreferencesWrapper prefs) { - final int connectionTimeout = prefs.getInt(KEY_CONNECTION_TIMEOUT, 10); - final boolean ignoreSslError = prefs.getBoolean(KEY_IGNORE_SSL_ERROR, false); - final boolean enableProxy = prefs.getBoolean(KEY_ENABLE_PROXY, false); - - final OkHttpClient client = new OkHttpClient(); - client.setConnectTimeout(connectionTimeout, TimeUnit.SECONDS); - if (ignoreSslError) { - client.setSslSocketFactory(SSLCertificateSocketFactory.getInsecure(0, null)); - } else { - client.setSslSocketFactory(SSLCertificateSocketFactory.getDefault(0, null)); - } - if (enableProxy) { - client.setProxy(getProxy(prefs)); - } - Internal.instance.setNetwork(client, TwidereApplication.getInstance(context).getNetwork()); - return new OkHttpRestClient(client); - } - - - public static Proxy getProxy(final SharedPreferencesWrapper prefs) { - final String proxyHost = prefs.getString(KEY_PROXY_HOST, null); - final int proxyPort = ParseUtils.parseInt(prefs.getString(KEY_PROXY_PORT, "-1")); - if (!isEmpty(proxyHost) && proxyPort >= 0 && proxyPort < 65535) { - final SocketAddress addr = InetSocketAddress.createUnresolved(proxyHost, proxyPort); - return new Proxy(Proxy.Type.HTTP, addr); - } - return Proxy.NO_PROXY; - } -} diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/TwitterWrapper.java b/twidere/src/main/java/org/mariotaku/twidere/util/TwitterWrapper.java index c020b2e3c..dd207559a 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/TwitterWrapper.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/TwitterWrapper.java @@ -25,7 +25,7 @@ import android.support.annotation.NonNull; import android.support.v4.util.LongSparseArray; import android.util.Log; -import org.mariotaku.simplerestapi.http.mime.FileTypedData; +import org.mariotaku.restfu.http.mime.FileTypedData; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.api.twitter.Twitter; import org.mariotaku.twidere.api.twitter.TwitterException; @@ -64,7 +64,7 @@ public class TwitterWrapper implements Constants { } public static SingleResponse deleteProfileBannerImage(final Context context, final long account_id) { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(context, account_id, false); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(context, account_id, false); if (twitter == null) return new SingleResponse<>(false, null); try { twitter.removeProfileBannerImage(); @@ -163,7 +163,7 @@ public class TwitterWrapper implements Constants { public static void updateProfileBannerImage(final Context context, final long accountId, final Uri imageUri, final boolean deleteImage) throws FileNotFoundException, TwitterException { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(context, accountId, false); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(context, accountId, false); updateProfileBannerImage(context, twitter, imageUri, deleteImage); } @@ -206,7 +206,7 @@ public class TwitterWrapper implements Constants { public static User updateProfileImage(final Context context, final long accountId, final Uri imageUri, final boolean deleteImage) throws FileNotFoundException, TwitterException { - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(context, accountId, true); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(context, accountId, true); return updateProfileImage(context, twitter, imageUri, deleteImage); } diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java b/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java index 03fcfe6f3..2ab1bbe5e 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java @@ -33,7 +33,6 @@ import android.content.SharedPreferences; import android.content.UriMatcher; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; -import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.res.Resources; @@ -129,9 +128,9 @@ import org.mariotaku.querybuilder.Selectable; import org.mariotaku.querybuilder.Table; import org.mariotaku.querybuilder.Tables; import org.mariotaku.querybuilder.query.SQLSelectQuery; -import org.mariotaku.simplerestapi.RestAPIFactory; -import org.mariotaku.simplerestapi.RestClient; -import org.mariotaku.simplerestapi.http.Authorization; +import org.mariotaku.restfu.RestAPIFactory; +import org.mariotaku.restfu.RestClient; +import org.mariotaku.restfu.http.Authorization; import org.mariotaku.twidere.BuildConfig; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.R; @@ -187,9 +186,8 @@ import org.mariotaku.twidere.graphic.ActionIconDrawable; import org.mariotaku.twidere.graphic.PaddingDrawable; import org.mariotaku.twidere.menu.SupportStatusShareProvider; import org.mariotaku.twidere.model.AccountPreferences; -import org.mariotaku.twidere.model.ConsumerKeyType; import org.mariotaku.twidere.model.ParcelableAccount; -import org.mariotaku.twidere.model.ParcelableAccount.ParcelableCredentials; +import org.mariotaku.twidere.model.ParcelableCredentials; import org.mariotaku.twidere.model.ParcelableDirectMessage; import org.mariotaku.twidere.model.ParcelableLocation; import org.mariotaku.twidere.model.ParcelableMedia; @@ -1161,7 +1159,7 @@ public final class Utils implements Constants { if (context == null) throw new NullPointerException(); final ParcelableStatus cached = findStatusInDatabases(context, accountId, statusId); if (cached != null) return cached; - final Twitter twitter = TwitterAPIUtils.getTwitterInstance(context, accountId, true); + final Twitter twitter = TwitterAPIFactory.getTwitterInstance(context, accountId, true); if (twitter == null) throw new TwitterException("Account does not exist"); final Status status = twitter.showStatus(statusId); final String where = Expression.and(Expression.equals(Statuses.ACCOUNT_ID, accountId), @@ -1535,8 +1533,8 @@ public final class Utils implements Constants { public static boolean isOfficialCredentials(final Context context, final ParcelableCredentials account) { if (account == null) return false; - final boolean isOAuth = account.auth_type == Accounts.AUTH_TYPE_OAUTH - || account.auth_type == Accounts.AUTH_TYPE_XAUTH; + final boolean isOAuth = account.auth_type == ParcelableCredentials.AUTH_TYPE_OAUTH + || account.auth_type == ParcelableCredentials.AUTH_TYPE_XAUTH; final String consumerKey = account.consumer_key, consumerSecret = account.consumer_secret; return isOAuth && TwitterContentUtils.isOfficialKey(context, consumerKey, consumerSecret); } @@ -1585,49 +1583,6 @@ public final class Utils implements Constants { } - public static String getApiBaseUrl(String format, final String domain) { - if (format == null) return null; - final Matcher matcher = Pattern.compile("\\[(\\.?)DOMAIN(\\.?)\\]").matcher(format); - if (!matcher.find()) { - // For backward compatibility - format = substituteLegacyApiBaseUrl(format, domain); - if (!format.endsWith("/1.1") && !format.endsWith("/1.1/")) { - return format; - } - final String versionSuffix = "/1.1"; - final int suffixLength = versionSuffix.length(); - final int lastIndex = format.lastIndexOf(versionSuffix); - return format.substring(0, lastIndex) + format.substring(lastIndex + suffixLength); - } - if (TextUtils.isEmpty(domain)) return matcher.replaceAll(""); - return matcher.replaceAll(String.format("$1%s$2", domain)); - } - - private static String substituteLegacyApiBaseUrl(@NonNull String format, String domain) { - final int startOfHost = format.indexOf("://") + 3, endOfHost = format.indexOf('/', startOfHost); - final String host = endOfHost != -1 ? format.substring(startOfHost, endOfHost) : format.substring(startOfHost); - if (!host.equalsIgnoreCase("api.twitter.com")) return format; - return format.substring(0, startOfHost) + domain + ".twitter.com" + format.substring(endOfHost); - } - - public static String getApiUrl(final String pattern, final String domain, final String appendPath) { - final String urlBase = getApiBaseUrl(pattern, domain); - if (urlBase == null) return null; - if (appendPath == null) return urlBase.endsWith("/") ? urlBase : urlBase + "/"; - final StringBuilder sb = new StringBuilder(urlBase); - if (urlBase.endsWith("/")) { - sb.append(appendPath.startsWith("/") ? appendPath.substring(1) : appendPath); - } else { - if (appendPath.startsWith("/")) { - sb.append(appendPath); - } else { - sb.append('/'); - sb.append(appendPath); - } - } - return sb.toString(); - } - public static String getBestBannerUrl(final String baseUrl, final int width) { final String type = getBestBannerType(width); return TextUtils.isEmpty(baseUrl) ? null : baseUrl + "/" + type; @@ -3310,36 +3265,6 @@ public final class Utils implements Constants { } - - public static String getTwidereUserAgent(final Context context) { - final PackageManager pm = context.getPackageManager(); - try { - final PackageInfo pi = pm.getPackageInfo(context.getPackageName(), 0); - return TWIDERE_APP_NAME + " " + TWIDERE_PROJECT_URL + " / " + pi.versionName; - } catch (final PackageManager.NameNotFoundException e) { - throw new AssertionError(e); - } - } - - - public static String getUserAgentName(ConsumerKeyType type) { - switch (type) { - case TWITTER_FOR_ANDROID: { - return "TwitterAndroid"; - } - case TWITTER_FOR_IPHONE: { - return "Twitter-iPhone"; - } - case TWITTER_FOR_IPAD: { - return "Twitter-iPad"; - } - case TWITTER_FOR_MAC: { - return "Twitter-Mac"; - } - } - return "Twitter"; - } - public static boolean shouldForceUsingPrivateAPIs(final Context context) { if (context == null) return false; final SharedPreferences prefs = context.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE); diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/imageloader/TwidereImageDownloader.java b/twidere/src/main/java/org/mariotaku/twidere/util/imageloader/TwidereImageDownloader.java index 380edf467..b425e33a6 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/imageloader/TwidereImageDownloader.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/imageloader/TwidereImageDownloader.java @@ -32,26 +32,27 @@ import com.nostra13.universalimageloader.core.download.BaseImageDownloader; import com.squareup.pollexor.Thumbor; import com.squareup.pollexor.ThumborUrlBuilder; -import org.mariotaku.simplerestapi.RequestInfo; -import org.mariotaku.simplerestapi.http.Authorization; -import org.mariotaku.simplerestapi.http.Endpoint; -import org.mariotaku.simplerestapi.http.RestHttpClient; -import org.mariotaku.simplerestapi.http.RestHttpRequest; -import org.mariotaku.simplerestapi.http.RestHttpResponse; -import org.mariotaku.simplerestapi.http.mime.TypedData; -import org.mariotaku.simplerestapi.method.GET; +import org.mariotaku.restfu.RestRequestInfo; +import org.mariotaku.restfu.annotation.method.GET; +import org.mariotaku.restfu.http.Authorization; +import org.mariotaku.restfu.http.Endpoint; +import org.mariotaku.restfu.http.RestHttpClient; +import org.mariotaku.restfu.http.RestHttpRequest; +import org.mariotaku.restfu.http.RestHttpResponse; +import org.mariotaku.restfu.http.mime.TypedData; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.R; import org.mariotaku.twidere.api.twitter.auth.OAuthAuthorization; import org.mariotaku.twidere.api.twitter.auth.OAuthEndpoint; import org.mariotaku.twidere.constant.SharedPreferenceConstants; import org.mariotaku.twidere.model.ParcelableAccount; -import org.mariotaku.twidere.model.ParcelableAccount.ParcelableCredentials; +import org.mariotaku.twidere.model.ParcelableCredentials; import org.mariotaku.twidere.model.ParcelableMedia; import org.mariotaku.twidere.util.MediaPreviewUtils; import org.mariotaku.twidere.util.SharedPreferencesWrapper; import org.mariotaku.twidere.util.TwidereLinkify; import org.mariotaku.twidere.util.TwitterAPIUtils; +import org.mariotaku.twidere.util.TwitterAPIFactory; import org.mariotaku.twidere.util.Utils; import java.io.FileNotFoundException; @@ -84,7 +85,7 @@ public class TwidereImageDownloader extends BaseImageDownloader implements Const } public void reloadConnectivitySettings() { - mClient = TwitterAPIUtils.getDefaultHttpClient(mContext); + mClient = TwitterAPIFactory.getDefaultHttpClient(mContext); if (mUseThumbor && mPreferences.getBoolean(KEY_THUMBOR_ENABLED)) { final String address = mPreferences.getString(KEY_THUMBOR_ADDRESS, null); final String securityKey = mPreferences.getString(KEY_THUMBOR_SECURITY_KEY, null); @@ -128,7 +129,7 @@ public class TwidereImageDownloader extends BaseImageDownloader implements Const final String host = uri.getHost(); final String domain = host.substring(0, host.lastIndexOf(".twitter.com")); final String path = uri.getPath(); - sb.append(Utils.getApiUrl(apiUrlFormat, domain, path)); + sb.append(TwitterAPIUtils.getApiUrl(apiUrlFormat, domain, path)); final String query = uri.getQuery(); if (!TextUtils.isEmpty(query)) { sb.append("?"); @@ -177,7 +178,7 @@ public class TwidereImageDownloader extends BaseImageDownloader implements Const queries.add(Pair.create(name, value)); } } - final RequestInfo info = new RequestInfo(method, uri.getPath(), queries, null, + final RestRequestInfo info = new RestRequestInfo(method, uri.getPath(), queries, null, additionalHeaders, null, null, null, null); additionalHeaders.add(Pair.create("Authorization", auth.getHeader(endpoint, info))); requestUri = modifiedUri.toString(); 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 15762a406..96b18024a 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 @@ -32,12 +32,12 @@ import com.squareup.okhttp.RequestBody; import com.squareup.okhttp.Response; import com.squareup.okhttp.ResponseBody; -import org.mariotaku.simplerestapi.Utils; -import org.mariotaku.simplerestapi.http.ContentType; -import org.mariotaku.simplerestapi.http.RestHttpClient; -import org.mariotaku.simplerestapi.http.RestHttpRequest; -import org.mariotaku.simplerestapi.http.RestHttpResponse; -import org.mariotaku.simplerestapi.http.mime.TypedData; +import org.mariotaku.restfu.Utils; +import org.mariotaku.restfu.http.ContentType; +import org.mariotaku.restfu.http.RestHttpClient; +import org.mariotaku.restfu.http.RestHttpRequest; +import org.mariotaku.restfu.http.RestHttpResponse; +import org.mariotaku.restfu.http.mime.TypedData; import java.io.IOException; import java.io.InputStream; diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/holder/StatusViewHolder.java b/twidere/src/main/java/org/mariotaku/twidere/view/holder/StatusViewHolder.java index c1feb7302..e476706dc 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/view/holder/StatusViewHolder.java +++ b/twidere/src/main/java/org/mariotaku/twidere/view/holder/StatusViewHolder.java @@ -388,10 +388,11 @@ public class StatusViewHolder extends ViewHolder implements Constants, OnClickLi final int typeIconRes; if (cursor.getShort(indices.is_quote) == 1) { - quotedPrimaryNameView.setText(user_name); + quotedPrimaryNameView.setText(manager.getUserNickname(user_id, user_name, false)); quotedSecondaryNameView.setText("@" + user_screen_name); timeView.setTime(cursor.getLong(indices.quote_timestamp)); - primaryNameView.setText(cursor.getString(indices.quoted_by_user_name)); + primaryNameView.setText(manager.getUserNickname(cursor.getLong(indices.quoted_by_user_id), + cursor.getString(indices.quoted_by_user_name), false)); secondaryNameView.setText("@" + cursor.getString(indices.quoted_by_user_screen_name)); final String quote_text_unescaped = cursor.getString(indices.quote_text_unescaped); @@ -430,7 +431,7 @@ public class StatusViewHolder extends ViewHolder implements Constants, OnClickLi manager.getUserColor(cursor.getLong(indices.user_id), false)); } else { - primaryNameView.setText(user_name); + primaryNameView.setText(manager.getUserNickname(user_id, user_name, false)); secondaryNameView.setText("@" + user_screen_name); if (retweet_id > 0) { timeView.setTime(cursor.getLong(indices.retweet_timestamp)); diff --git a/twidere/src/main/res/layout/layout_content_pages_common.xml b/twidere/src/main/res/layout/layout_content_pages_common.xml index 85e892b52..00718c92d 100644 --- a/twidere/src/main/res/layout/layout_content_pages_common.xml +++ b/twidere/src/main/res/layout/layout_content_pages_common.xml @@ -58,30 +58,42 @@ android:background="?android:windowContentOverlay"/> - - + android:layout_gravity="top" + android:background="?android:windowContentOverlay"/> - - + + + + + + + \ No newline at end of file