1
0
mirror of https://github.com/TwidereProject/Twidere-Android synced 2025-02-17 04:00:48 +01:00

improved statusnet support

This commit is contained in:
Mariotaku Lee 2016-03-01 11:07:26 +08:00
parent 9cd28623bb
commit d02518d452
8 changed files with 209 additions and 129 deletions

View File

@ -14,7 +14,7 @@ import org.mariotaku.twidere.api.twitter.model.Status;
public interface StatusNetResources {
@GET("/statusnet/config.json")
StatusNetConfig getConfig() throws TwitterException;
StatusNetConfig getStatusNetConfig() throws TwitterException;
@GET("/search.json")
ResponseList<Status> searchStatuses(@Query("q") String query, @Query Paging paging) throws TwitterException;

View File

@ -1,5 +1,6 @@
package org.mariotaku.twidere.api.statusnet.model;
import com.bluelinelabs.logansquare.annotation.JsonField;
import com.bluelinelabs.logansquare.annotation.JsonObject;
/**
@ -7,4 +8,22 @@ import com.bluelinelabs.logansquare.annotation.JsonObject;
*/
@JsonObject
public class StatusNetConfig {
@JsonField(name = "site")
Site site;
public Site getSite() {
return site;
}
@JsonObject
public static class Site {
@JsonField(name = "textlimit")
int textLimit;
public int getTextLimit() {
return textLimit;
}
}
}

View File

@ -1,51 +0,0 @@
package org.mariotaku.twidere.model;
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 16/2/26.
*/
@ParcelablePlease
@JsonObject
public class GNUSocialAccountExtra implements Parcelable, AccountExtras {
@ParcelableThisPlease
@JsonField(name = "character_limit")
int characterLimit;
public int getCharacterLimit() {
return characterLimit;
}
public void setCharacterLimit(int characterLimit) {
this.characterLimit = characterLimit;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
GNUSocialAccountExtraParcelablePlease.writeToParcel(this, dest, flags);
}
public static final Creator<GNUSocialAccountExtra> CREATOR = new Creator<GNUSocialAccountExtra>() {
public GNUSocialAccountExtra createFromParcel(Parcel source) {
GNUSocialAccountExtra target = new GNUSocialAccountExtra();
GNUSocialAccountExtraParcelablePlease.readFromParcel(target, source);
return target;
}
public GNUSocialAccountExtra[] newArray(int size) {
return new GNUSocialAccountExtra[size];
}
};
}

View File

@ -56,6 +56,9 @@ public class ParcelableCredentials extends ParcelableAccount implements Parcelab
public static final int AUTH_TYPE_BASIC = 2;
public static final int AUTH_TYPE_TWIP_O_MODE = 3;
public static final String ACCOUNT_TYPE_TWITTER = "twitter";
public static final String ACCOUNT_TYPE_STATUSNET = "statusnet";
@ParcelableThisPlease
@JsonField(name = "auth_type")
@CursorField(Accounts.AUTH_TYPE)

View File

@ -0,0 +1,51 @@
package org.mariotaku.twidere.model;
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 16/2/26.
*/
@ParcelablePlease
@JsonObject
public class StatusNetAccountExtra implements Parcelable, AccountExtras {
public static final Creator<StatusNetAccountExtra> CREATOR = new Creator<StatusNetAccountExtra>() {
public StatusNetAccountExtra createFromParcel(Parcel source) {
StatusNetAccountExtra target = new StatusNetAccountExtra();
StatusNetAccountExtraParcelablePlease.readFromParcel(target, source);
return target;
}
public StatusNetAccountExtra[] newArray(int size) {
return new StatusNetAccountExtra[size];
}
};
@ParcelableThisPlease
@JsonField(name = "text_limit")
int textLimit;
public int getTextLimit() {
return textLimit;
}
public void setTextLimit(int textLimit) {
this.textLimit = textLimit;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
StatusNetAccountExtraParcelablePlease.writeToParcel(this, dest, flags);
}
}

View File

@ -3,22 +3,17 @@ package org.mariotaku.twidere.model;
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 16/2/26.
*/
@ParcelablePlease
@JsonObject
public class TwitterAccountExtra implements Parcelable, AccountExtras {
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
TwitterAccountExtraParcelablePlease.writeToParcel(this, dest, flags);
}
public static final Creator<TwitterAccountExtra> CREATOR = new Creator<TwitterAccountExtra>() {
public TwitterAccountExtra createFromParcel(Parcel source) {
@ -31,4 +26,26 @@ public class TwitterAccountExtra implements Parcelable, AccountExtras {
return new TwitterAccountExtra[size];
}
};
@JsonField(name = "official_credentials")
@ParcelableThisPlease
boolean officialCredentials;
public boolean isOfficialCredentials() {
return officialCredentials;
}
public void setIsOfficialCredentials(boolean officialCredentials) {
this.officialCredentials = officialCredentials;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
TwitterAccountExtraParcelablePlease.writeToParcel(this, dest, flags);
}
}

View File

@ -50,6 +50,7 @@ import android.text.InputType;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
import android.util.Pair;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
@ -70,6 +71,7 @@ import org.mariotaku.twidere.BuildConfig;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.SettingsActivity;
import org.mariotaku.twidere.activity.iface.IExtendedActivity;
import org.mariotaku.twidere.api.statusnet.model.StatusNetConfig;
import org.mariotaku.twidere.api.twitter.Twitter;
import org.mariotaku.twidere.api.twitter.TwitterException;
import org.mariotaku.twidere.api.twitter.TwitterOAuth;
@ -77,14 +79,18 @@ 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.OAuthToken;
import org.mariotaku.twidere.api.twitter.model.Paging;
import org.mariotaku.twidere.api.twitter.model.User;
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.model.StatusNetAccountExtra;
import org.mariotaku.twidere.model.TwitterAccountExtra;
import org.mariotaku.twidere.provider.TwidereDataStore.Accounts;
import org.mariotaku.twidere.util.AsyncTaskUtils;
import org.mariotaku.twidere.util.ContentValuesCreator;
import org.mariotaku.twidere.util.JsonSerializer;
import org.mariotaku.twidere.util.OAuthPasswordAuthenticator;
import org.mariotaku.twidere.util.OAuthPasswordAuthenticator.AuthenticationException;
import org.mariotaku.twidere.util.OAuthPasswordAuthenticator.AuthenticityTokenException;
@ -558,6 +564,36 @@ public class SignInActivity extends BaseAppCompatActivity implements OnClickList
}
}
@Nullable
private static Pair<String, String> detectAccountType(Twitter twitter) {
try {
// Get StatusNet specific resource
StatusNetConfig config = twitter.getStatusNetConfig();
StatusNetAccountExtra extra = new StatusNetAccountExtra();
final StatusNetConfig.Site site = config.getSite();
if (site != null) {
extra.setTextLimit(site.getTextLimit());
}
return Pair.create(ParcelableCredentials.ACCOUNT_TYPE_STATUSNET,
JsonSerializer.serialize(extra, StatusNetAccountExtra.class));
} catch (TwitterException e) {
// Ignore
}
try {
// Get Twitter official only resource
Paging paging = new Paging();
paging.count(1);
twitter.getActivitiesAboutMe(paging);
TwitterAccountExtra extra = new TwitterAccountExtra();
extra.setIsOfficialCredentials(true);
return Pair.create(ParcelableCredentials.ACCOUNT_TYPE_TWITTER,
JsonSerializer.serialize(extra, TwitterAccountExtra.class));
} catch (TwitterException e) {
// Ignore
}
return Pair.create(ParcelableCredentials.ACCOUNT_TYPE_TWITTER, null);
}
public static abstract class AbstractSignInTask extends AsyncTask<Object, Runnable, SignInResponse> {
protected final WeakReference<SignInActivity> activityRef;
@ -642,7 +678,7 @@ public class SignInActivity extends BaseAppCompatActivity implements OnClickList
final int color = analyseUserProfileColor(user);
return new SignInResponse(isUserLoggedIn(context, userId), auth, user,
ParcelableCredentials.AUTH_TYPE_OAUTH, color, apiUrlFormat, sameOauthSigningUrl,
noVersionSuffix);
noVersionSuffix, detectAccountType(twitter));
} catch (final TwitterException e) {
return new SignInResponse(false, false, e);
}
@ -714,6 +750,33 @@ public class SignInActivity extends BaseAppCompatActivity implements OnClickList
}
}
private SignInResponse authOAuth() throws AuthenticationException, TwitterException {
final SignInActivity activity = activityRef.get();
if (activity == null) return new SignInResponse(false, false, null);
Endpoint endpoint = TwitterAPIFactory.getOAuthEndpoint(apiUrlFormat, "api", null, sameOAuthSigningUrl);
OAuthAuthorization auth = new OAuthAuthorization(consumerKey.getOauthToken(), consumerKey.getOauthTokenSecret());
final TwitterOAuth oauth = TwitterAPIFactory.getInstance(activity, endpoint, auth, TwitterOAuth.class);
final OAuthPasswordAuthenticator authenticator = new OAuthPasswordAuthenticator(oauth, verificationCallback, userAgent);
final OAuthToken accessToken = authenticator.getOAuthAccessToken(username, password);
final long userId = accessToken.getUserId();
if (userId <= 0) return new SignInResponse(false, false, null);
return getOAuthSignInResponse(activity, accessToken, userId,
ParcelableCredentials.AUTH_TYPE_OAUTH);
}
private SignInResponse authxAuth() throws TwitterException {
final SignInActivity activity = activityRef.get();
if (activity == null) return new SignInResponse(false, false, null);
Endpoint endpoint = TwitterAPIFactory.getOAuthEndpoint(apiUrlFormat, "api", null, sameOAuthSigningUrl);
OAuthAuthorization auth = new OAuthAuthorization(consumerKey.getOauthToken(), consumerKey.getOauthTokenSecret());
final TwitterOAuth oauth = TwitterAPIFactory.getInstance(activity, endpoint, auth, TwitterOAuth.class);
final OAuthToken accessToken = oauth.getAccessToken(username, password);
final long userId = accessToken.getUserId();
if (userId <= 0) return new SignInResponse(false, false, null);
return getOAuthSignInResponse(activity, accessToken, userId,
ParcelableCredentials.AUTH_TYPE_XAUTH);
}
private SignInResponse authBasic() throws TwitterException, AuthenticationException {
final SignInActivity activity = activityRef.get();
if (activity == null) return new SignInResponse(false, false, null);
@ -734,39 +797,11 @@ public class SignInActivity extends BaseAppCompatActivity implements OnClickList
}
final long userId = user.getId();
if (userId <= 0) return new SignInResponse(false, false, null);
if (isUserLoggedIn(activity, userId)) return new SignInResponse(true, false, null);
final int color = analyseUserProfileColor(user);
return new SignInResponse(isUserLoggedIn(activity, userId), username, password, user,
color, apiUrlFormat, noVersionSuffix);
color, apiUrlFormat, noVersionSuffix, detectAccountType(twitter));
}
static class WrongBasicCredentialException extends AuthenticationException {
}
static class WrongAPIURLFormatException extends AuthenticationException {
}
private SignInResponse authOAuth() throws AuthenticationException, TwitterException {
final SignInActivity activity = activityRef.get();
if (activity == null) return new SignInResponse(false, false, null);
Endpoint endpoint = TwitterAPIFactory.getOAuthEndpoint(apiUrlFormat, "api", null, sameOAuthSigningUrl);
OAuthAuthorization auth = new OAuthAuthorization(consumerKey.getOauthToken(), consumerKey.getOauthTokenSecret());
final TwitterOAuth oauth = TwitterAPIFactory.getInstance(activity, endpoint, auth, TwitterOAuth.class);
final OAuthPasswordAuthenticator authenticator = new OAuthPasswordAuthenticator(oauth, verificationCallback, userAgent);
final OAuthToken accessToken = authenticator.getOAuthAccessToken(username, password);
final long userId = accessToken.getUserId();
if (userId <= 0) return new SignInResponse(false, false, null);
endpoint = TwitterAPIFactory.getOAuthRestEndpoint(apiUrlFormat, sameOAuthSigningUrl, noVersionSuffix);
auth = new OAuthAuthorization(consumerKey.getOauthToken(), consumerKey.getOauthTokenSecret(), accessToken);
final Twitter twitter = TwitterAPIFactory.getInstance(activity, endpoint,
auth, Twitter.class);
final User user = twitter.verifyCredentials();
final int color = analyseUserProfileColor(user);
return new SignInResponse(isUserLoggedIn(activity, userId), auth, user, ParcelableCredentials.AUTH_TYPE_OAUTH, color,
apiUrlFormat, sameOAuthSigningUrl, noVersionSuffix);
}
private SignInResponse authTwipOMode() throws TwitterException {
final SignInActivity activity = activityRef.get();
@ -779,25 +814,27 @@ public class SignInActivity extends BaseAppCompatActivity implements OnClickList
final long userId = user.getId();
if (userId <= 0) return new SignInResponse(false, false, null);
final int color = analyseUserProfileColor(user);
return new SignInResponse(isUserLoggedIn(activity, userId), user, color, apiUrlFormat, noVersionSuffix);
return new SignInResponse(isUserLoggedIn(activity, userId), user, color, apiUrlFormat,
noVersionSuffix, detectAccountType(twitter));
}
private SignInResponse authxAuth() throws TwitterException {
final SignInActivity activity = activityRef.get();
if (activity == null) return new SignInResponse(false, false, null);
Endpoint endpoint = TwitterAPIFactory.getOAuthEndpoint(apiUrlFormat, "api", null, sameOAuthSigningUrl);
OAuthAuthorization auth = new OAuthAuthorization(consumerKey.getOauthToken(), consumerKey.getOauthTokenSecret());
final TwitterOAuth oauth = TwitterAPIFactory.getInstance(activity, endpoint, auth, TwitterOAuth.class);
final OAuthToken accessToken = oauth.getAccessToken(username, password);
final long userId = accessToken.getUserId();
if (userId <= 0) return new SignInResponse(false, false, null);
auth = new OAuthAuthorization(consumerKey.getOauthToken(), consumerKey.getOauthTokenSecret(), accessToken);
endpoint = TwitterAPIFactory.getOAuthRestEndpoint(apiUrlFormat, sameOAuthSigningUrl, noVersionSuffix);
private SignInResponse getOAuthSignInResponse(SignInActivity activity, OAuthToken accessToken,
long userId, int authType) throws TwitterException {
final OAuthAuthorization auth = new OAuthAuthorization(consumerKey.getOauthToken(), consumerKey.getOauthTokenSecret(), accessToken);
final Endpoint endpoint = TwitterAPIFactory.getOAuthRestEndpoint(apiUrlFormat, sameOAuthSigningUrl, noVersionSuffix);
final Twitter twitter = TwitterAPIFactory.getInstance(activity, endpoint, auth, Twitter.class);
final User user = twitter.verifyCredentials();
final int color = analyseUserProfileColor(user);
return new SignInResponse(isUserLoggedIn(activity, userId), auth, user, ParcelableCredentials.AUTH_TYPE_XAUTH, color, apiUrlFormat,
sameOAuthSigningUrl, noVersionSuffix);
return new SignInResponse(isUserLoggedIn(activity, userId), auth, user, authType, color,
apiUrlFormat, sameOAuthSigningUrl, noVersionSuffix, detectAccountType(twitter));
}
static class WrongBasicCredentialException extends AuthenticationException {
}
static class WrongAPIURLFormatException extends AuthenticationException {
}
class InputLoginVerificationCallback implements OAuthPasswordAuthenticator.LoginVerificationCallback {
@ -952,15 +989,20 @@ public class SignInActivity extends BaseAppCompatActivity implements OnClickList
public final int authType, color;
public final String apiUrlFormat;
public final boolean sameOauthSigningUrl, noVersionSuffix;
public final Pair<String, String> accountType;
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 alreadyLoggedIn, final boolean succeed,
final Exception exception) {
this(alreadyLoggedIn, succeed, exception, null, null, null, null, 0, 0, null, false,
false, null);
}
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) {
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, final Pair<String, String> accountType) {
this.alreadyLoggedIn = alreadyLoggedIn;
this.succeed = succeed;
this.exception = exception;
@ -973,27 +1015,32 @@ public class SignInActivity extends BaseAppCompatActivity implements OnClickList
this.apiUrlFormat = apiUrlFormat;
this.sameOauthSigningUrl = sameOauthSigningUrl;
this.noVersionSuffix = noVersionSuffix;
this.accountType = accountType;
}
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) {
final boolean noVersionSuffix, final Pair<String, String> accountType) {
this(alreadyLoggedIn, true, null, null, null, oauth, user, authType, color, apiUrlFormat,
sameOauthSigningUrl, noVersionSuffix);
sameOauthSigningUrl, noVersionSuffix, accountType);
}
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);
final String apiUrlFormat, final boolean noVersionSuffix,
final Pair<String, String> accountType) {
this(alreadyLoggedIn, true, null, basicUsername, basicPassword, null, user,
ParcelableCredentials.AUTH_TYPE_BASIC, color, apiUrlFormat, false,
noVersionSuffix, accountType);
}
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);
final String apiUrlFormat, final boolean noVersionSuffix,
final Pair<String, String> accountType) {
this(alreadyLoggedIn, true, null, null, null, null, user,
ParcelableCredentials.AUTH_TYPE_TWIP_O_MODE, color, apiUrlFormat, false,
noVersionSuffix, accountType);
}
private ContentValues toContentValues() {
@ -1018,6 +1065,10 @@ public class SignInActivity extends BaseAppCompatActivity implements OnClickList
values = null;
}
}
if (values != null && accountType != null) {
values.put(Accounts.ACCOUNT_TYPE, accountType.first);
values.put(Accounts.ACCOUNT_EXTRAS, accountType.second);
}
return values;
}
}

View File

@ -6,10 +6,6 @@
<Preference android:layout="@layout/header_hidden_settings"/>
<org.mariotaku.twidere.preference.AutoFixSwitchPreference
android:defaultValue="false"
android:key="force_using_private_apis"
android:title="@string/force_using_private_apis"/>
<org.mariotaku.twidere.preference.SeekBarDialogPreference
android:defaultValue="10"
android:key="connection_timeout"
@ -18,12 +14,6 @@
app:min="5"
app:progressTextSuffix="s"/>
<org.mariotaku.twidere.preference.AutoFixEditTextPreference
android:defaultValue="140"
android:inputType="number"
android:key="status_text_limit"
android:title="@string/status_text_limit"/>
<edu.tsinghua.hotmobi.UploadLogsPreferences android:title="@string/report_usage_statistics_now"/>
<Preference android:title="@string/settings_wizard">